From 3d7ee42ca89208e323a1398025d115cbe4ffa519 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 15 Apr 2025 00:18:49 +0200 Subject: [PATCH] [FEAT] update to the new archidata 0.28.0, and update namespace kar-> atriasoft --- Dockerfile | 2 +- back/README.md | 4 +- back/pom.xml | 18 +- back/release_karideo_back/propertyies.txt | 18 +- .../karideo/GenerateApi.java | 4 +- .../karideo/WebLauncher.java | 57 +- .../karideo/WebLauncherLocal.java | 6 +- .../{kar => atriasoft}/karideo/api/Front.java | 6 +- .../karideo/api/HealthCheck.java | 8 +- .../karideo/api/MediaResource.java | 54 +- .../karideo/api/SeasonResource.java | 39 +- .../karideo/api/SeriesResource.java | 39 +- .../karideo/api/TypeResource.java | 37 +- .../api/UserMediaAdvancementResource.java | 21 +- .../karideo/api/UserResource.java | 8 +- .../filter/KarideoAuthenticationFilter.java | 4 +- .../karideo/internal/Log.java | 2 +- .../karideo/migration/Initialization.java | 46 +- .../karideo/migration/Migration20230810.java | 6 +- .../karideo/migration/Migration20231015.java | 4 +- .../karideo/migration/Migration20231126.java | 4 +- .../karideo/migration/Migration20240226.java | 4 +- .../karideo/migration/Migration20240611.java | 4 +- .../karideo/migration/Migration20250214.java | 20 +- .../karideo/migration/Migration20250414.java | 24 + .../migration/model/CoverConversion.java | 4 +- .../migration/model/MediaConversion.java | 2 +- .../migration/model/OIDConversion.java | 2 +- .../karideo/model/Media.java | 41 +- .../karideo/model/Season.java | 23 +- .../karideo/model/Series.java | 23 +- .../karideo/model/Type.java | 22 +- .../karideo/model/UserKarideo.java | 6 +- .../karideo/model/UserMediaAdvancement.java | 18 +- .../karideo/util/ConfigVariable.java | 2 +- back/src/org/kar/karideo/CacheFilter.java__ | 20 - .../{kar => atriasoft}/karideo/Common.java | 9 +- .../karideo/ConfigureDb.java | 22 +- .../karideo/StepwiseExtension.java | 2 +- .../{kar => atriasoft}/karideo/TestBase.java | 6 +- .../karideo/TestHealthCheck.java | 27 +- .../karideo/WebLauncherTest.java | 4 +- front/index.html | 1 + front/package.json | 72 +- front/pnpm-lock.yaml | 3104 ++++++++--------- front/public/icons/icon-192x192.png | Bin 0 -> 11999 bytes front/public/icons/icon-512x512.png | Bin 0 -> 41616 bytes front/public/manifest.json | 21 + front/src/back-api/api/data-resource.ts | 24 +- front/src/back-api/api/media-resource.ts | 6 +- front/src/back-api/api/season-resource.ts | 9 +- front/src/back-api/api/series-resource.ts | 9 +- front/src/back-api/api/type-resource.ts | 9 +- .../api/user-media-advancement-resource.ts | 6 +- front/src/back-api/model/data.ts | 37 +- .../model/generic-data-soft-delete.ts | 25 +- front/src/back-api/model/generic-data.ts | 25 +- front/src/back-api/model/generic-timing.ts | 25 +- front/src/back-api/model/health-result.ts | 15 - front/src/back-api/model/index.ts | 2 + front/src/back-api/model/jwt-header.ts | 17 - front/src/back-api/model/jwt-payload.ts | 22 - front/src/back-api/model/jwt-token.ts | 22 +- .../model/media-informations-delta.ts | 15 - front/src/back-api/model/media.ts | 87 +- .../model/oid-generic-data-soft-delete.ts | 25 +- front/src/back-api/model/oid-generic-data.ts | 25 +- .../src/back-api/model/rest-error-response.ts | 4 +- front/src/back-api/model/rest-input-error.ts | 24 + front/src/back-api/model/season.ts | 55 +- front/src/back-api/model/series.ts | 55 +- front/src/back-api/model/type.ts | 47 +- front/src/back-api/model/user-karideo.ts | 15 +- .../back-api/model/user-media-advancement.ts | 59 +- front/src/back-api/model/user-out.ts | 17 - front/src/back-api/model/user.ts | 37 +- front/src/back-api/rest-tools.ts | 164 +- front/src/components/Cover.tsx | 6 +- front/src/components/TopBar/TopBar.tsx | 219 +- front/src/components/VideoPlayer.tsx | 453 +-- .../src/components/media/DisplayMediaFull.tsx | 3 +- front/src/components/popup/MediaEditPopUp.tsx | 17 +- .../src/components/popup/SeasonEditPopUp.tsx | 12 +- .../src/components/popup/SeriesEditPopUp.tsx | 12 +- front/src/components/popup/TypeEditPopUp.tsx | 12 +- front/src/environment.ts | 1 - front/src/scene/home/AddPage.tsx | 16 +- front/src/scene/sso/SSOPage.tsx | 117 +- front/src/service/Advancement.ts | 65 +- front/src/service/Media.ts | 2 +- front/src/service/Season.ts | 2 +- front/src/service/Series.ts | 2 +- front/src/service/Type.ts | 2 +- front/src/service/session.ts | 259 +- front/src/theme/theme.ts | 10 +- front/src/utils/http.ts | 10 - front/src/utils/sso.ts | 6 +- 97 files changed, 3144 insertions(+), 2834 deletions(-) rename back/src/org/{kar => atriasoft}/karideo/GenerateApi.java (81%) rename back/src/org/{kar => atriasoft}/karideo/WebLauncher.java (74%) rename back/src/org/{kar => atriasoft}/karideo/WebLauncherLocal.java (91%) rename back/src/org/{kar => atriasoft}/karideo/api/Front.java (56%) rename back/src/org/{kar => atriasoft}/karideo/api/HealthCheck.java (82%) rename back/src/org/{kar => atriasoft}/karideo/api/MediaResource.java (87%) rename back/src/org/{kar => atriasoft}/karideo/api/SeasonResource.java (78%) rename back/src/org/{kar => atriasoft}/karideo/api/SeriesResource.java (78%) rename back/src/org/{kar => atriasoft}/karideo/api/TypeResource.java (79%) rename back/src/org/{kar => atriasoft}/karideo/api/UserMediaAdvancementResource.java (87%) rename back/src/org/{kar => atriasoft}/karideo/api/UserResource.java (92%) rename back/src/org/{kar => atriasoft}/karideo/filter/KarideoAuthenticationFilter.java (82%) rename back/src/org/{kar => atriasoft}/karideo/internal/Log.java (97%) rename back/src/org/{kar => atriasoft}/karideo/migration/Initialization.java (71%) rename back/src/org/{kar => atriasoft}/karideo/migration/Migration20230810.java (72%) rename back/src/org/{kar => atriasoft}/karideo/migration/Migration20231015.java (87%) rename back/src/org/{kar => atriasoft}/karideo/migration/Migration20231126.java (99%) rename back/src/org/{kar => atriasoft}/karideo/migration/Migration20240226.java (82%) rename back/src/org/{kar => atriasoft}/karideo/migration/Migration20240611.java (85%) rename back/src/org/{kar => atriasoft}/karideo/migration/Migration20250214.java (89%) create mode 100644 back/src/org/atriasoft/karideo/migration/Migration20250414.java rename back/src/org/{kar => atriasoft}/karideo/migration/model/CoverConversion.java (73%) rename back/src/org/{kar => atriasoft}/karideo/migration/model/MediaConversion.java (81%) rename back/src/org/{kar => atriasoft}/karideo/migration/model/OIDConversion.java (79%) rename back/src/org/{kar => atriasoft}/karideo/model/Media.java (60%) rename back/src/org/{kar => atriasoft}/karideo/model/Season.java (52%) rename back/src/org/{kar => atriasoft}/karideo/model/Series.java (52%) rename back/src/org/{kar => atriasoft}/karideo/model/Type.java (50%) rename back/src/org/{kar => atriasoft}/karideo/model/UserKarideo.java (60%) rename back/src/org/{kar => atriasoft}/karideo/model/UserMediaAdvancement.java (62%) rename back/src/org/{kar => atriasoft}/karideo/util/ConfigVariable.java (87%) delete mode 100644 back/src/org/kar/karideo/CacheFilter.java__ rename back/test/src/test/{kar => atriasoft}/karideo/Common.java (57%) rename back/test/src/test/{kar => atriasoft}/karideo/ConfigureDb.java (88%) rename back/test/src/test/{kar => atriasoft}/karideo/StepwiseExtension.java (98%) rename back/test/src/test/{kar => atriasoft}/karideo/TestBase.java (90%) rename back/test/src/test/{kar => atriasoft}/karideo/TestHealthCheck.java (70%) rename back/test/src/test/{kar => atriasoft}/karideo/WebLauncherTest.java (75%) create mode 100644 front/public/icons/icon-192x192.png create mode 100644 front/public/icons/icon-512x512.png create mode 100644 front/public/manifest.json create mode 100644 front/src/back-api/model/rest-input-error.ts delete mode 100644 front/src/utils/http.ts diff --git a/Dockerfile b/Dockerfile index 0747509..8a2024d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -98,4 +98,4 @@ EXPOSE 80 HEALTHCHECK --start-period=10s --start-interval=2s --interval=30s --timeout=5s --retries=10 \ CMD wget --no-verbose --tries=1 --spider http://localhost:80/api/health_check || exit 1 -CMD ["java", "-Xms64M", "-Xmx1G", "-cp", "/application/application.jar", "org.kar.karideo.WebLauncher"] +CMD ["java", "-Xms64M", "-Xmx1G", "-cp", "/application/application.jar", "org.atriasoft.karideo.WebLauncher"] diff --git a/back/README.md b/back/README.md index 93e303c..25bc94b 100644 --- a/back/README.md +++ b/back/README.md @@ -11,7 +11,7 @@ mvn package // download all dependency in out/maven/dependency mvn dependency:copy-dependencies -java -cp out/maven/kar-karideo-0.1.0.jar org.kar.karideo.WebLauncher +java -cp out/maven/kar-karideo-0.1.0.jar org.atriasoft.karideo.WebLauncher // create a single package jar @@ -19,7 +19,7 @@ mvn clean compile assembly:single -java -cp out/maven/karideo-0.1.0-jar-with-dependencies.jar org.kar.karideo.WebLauncher +java -cp out/maven/karideo-0.1.0-jar-with-dependencies.jar org.atriasoft.karideo.WebLauncher diff --git a/back/pom.xml b/back/pom.xml index fbf908d..6863232 100644 --- a/back/pom.xml +++ b/back/pom.xml @@ -1,7 +1,7 @@ 4.0.0 - org.kar + org.atriasoft karideo 0.3.0 @@ -10,17 +10,11 @@ 23 3.1.1 - - - gitea - https://gitea.atria-soft.org/api/packages/kangaroo-and-rabbit/maven - - - kangaroo-and-rabbit + org.atria-soft archidata - 0.24.0 + 0.28.0 @@ -112,7 +106,7 @@ java - org.kar.karideo.WebLauncher + org.atriasoft.karideo.WebLauncher @@ -121,7 +115,7 @@ java - org.kar.karideo.WebLauncherLocal + org.atriasoft.karideo.WebLauncherLocal @@ -130,7 +124,7 @@ java - org.kar.karideo.GenerateApi + org.atriasoft.karideo.GenerateApi diff --git a/back/release_karideo_back/propertyies.txt b/back/release_karideo_back/propertyies.txt index b9d43f2..ea3ab45 100644 --- a/back/release_karideo_back/propertyies.txt +++ b/back/release_karideo_back/propertyies.txt @@ -1,9 +1,9 @@ -org.kar.karideo.dataTmpFolder=/application/data/tmp -org.kar.karideo.dataTmpFolder=/application/data/media -org.kar.karideo.rest.oauth=http://192.168.1.156:21080/oauth/api/ -org.kar.karideo.db.host=1992.156.1.156 -org.kar.karideo.db.port=20306 -org.kar.karideo.db.login=root -org.kar.karideo.db.port=klkhj456gkgtkhjgvkujfhjgkjhgsdfhb3467465fgdhdesfgh -org.kar.karideo.db.name=karideo -org.kar.karideo.address=http://0.0.0.0:18080/karideo/api/ +org.atriasoft.karideo.dataTmpFolder=/application/data/tmp +org.atriasoft.karideo.dataTmpFolder=/application/data/media +org.atriasoft.karideo.rest.oauth=http://192.168.1.156:21080/oauth/api/ +org.atriasoft.karideo.db.host=1992.156.1.156 +org.atriasoft.karideo.db.port=20306 +org.atriasoft.karideo.db.login=root +org.atriasoft.karideo.db.port=klkhj456gkgtkhjgvkujfhjgkjhgsdfhb3467465fgdhdesfgh +org.atriasoft.karideo.db.name=karideo +org.atriasoft.karideo.address=http://0.0.0.0:18080/karideo/api/ diff --git a/back/src/org/kar/karideo/GenerateApi.java b/back/src/org/atriasoft/karideo/GenerateApi.java similarity index 81% rename from back/src/org/kar/karideo/GenerateApi.java rename to back/src/org/atriasoft/karideo/GenerateApi.java index 1e68c7d..c3a8f84 100644 --- a/back/src/org/kar/karideo/GenerateApi.java +++ b/back/src/org/atriasoft/karideo/GenerateApi.java @@ -1,6 +1,6 @@ -package org.kar.karideo; +package org.atriasoft.karideo; -import org.kar.karideo.migration.Initialization; +import org.atriasoft.karideo.migration.Initialization; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/src/org/kar/karideo/WebLauncher.java b/back/src/org/atriasoft/karideo/WebLauncher.java similarity index 74% rename from back/src/org/kar/karideo/WebLauncher.java rename to back/src/org/atriasoft/karideo/WebLauncher.java index 4653ea0..332ba8e 100755 --- a/back/src/org/kar/karideo/WebLauncher.java +++ b/back/src/org/atriasoft/karideo/WebLauncher.java @@ -1,38 +1,40 @@ -package org.kar.karideo; +package org.atriasoft.karideo; import java.net.URI; import java.util.logging.LogManager; +import org.atriasoft.archidata.UpdateJwtPublicKey; +import org.atriasoft.archidata.api.DataResource; +import org.atriasoft.archidata.catcher.GenericCatcher; +import org.atriasoft.archidata.db.DbConfig; +import org.atriasoft.archidata.filter.CORSFilter; +import org.atriasoft.archidata.filter.OptionFilter; +import org.atriasoft.archidata.migration.MigrationEngine; +import org.atriasoft.archidata.tools.ConfigBaseVariable; +import org.atriasoft.archidata.tools.ContextGenericTools; +import org.atriasoft.karideo.api.Front; +import org.atriasoft.karideo.api.HealthCheck; +import org.atriasoft.karideo.api.MediaResource; +import org.atriasoft.karideo.api.SeasonResource; +import org.atriasoft.karideo.api.SeriesResource; +import org.atriasoft.karideo.api.TypeResource; +import org.atriasoft.karideo.api.UserMediaAdvancementResource; +import org.atriasoft.karideo.api.UserResource; +import org.atriasoft.karideo.filter.KarideoAuthenticationFilter; +import org.atriasoft.karideo.migration.Initialization; +import org.atriasoft.karideo.migration.Migration20230810; +import org.atriasoft.karideo.migration.Migration20231015; +import org.atriasoft.karideo.migration.Migration20231126; +import org.atriasoft.karideo.migration.Migration20240226; +import org.atriasoft.karideo.migration.Migration20240611; +import org.atriasoft.karideo.migration.Migration20250214; +import org.atriasoft.karideo.migration.Migration20250414; import org.glassfish.grizzly.http.server.HttpServer; import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; -import org.kar.archidata.UpdateJwtPublicKey; -import org.kar.archidata.api.DataResource; -import org.kar.archidata.catcher.GenericCatcher; -import org.kar.archidata.db.DbConfig; -import org.kar.archidata.filter.CORSFilter; -import org.kar.archidata.filter.OptionFilter; -import org.kar.archidata.migration.MigrationEngine; -import org.kar.archidata.tools.ConfigBaseVariable; -import org.kar.archidata.tools.ContextGenericTools; -import org.kar.karideo.api.Front; -import org.kar.karideo.api.HealthCheck; -import org.kar.karideo.api.MediaResource; -import org.kar.karideo.api.SeasonResource; -import org.kar.karideo.api.SeriesResource; -import org.kar.karideo.api.TypeResource; -import org.kar.karideo.api.UserMediaAdvancementResource; -import org.kar.karideo.api.UserResource; -import org.kar.karideo.filter.KarideoAuthenticationFilter; -import org.kar.karideo.migration.Initialization; -import org.kar.karideo.migration.Migration20230810; -import org.kar.karideo.migration.Migration20231015; -import org.kar.karideo.migration.Migration20231126; -import org.kar.karideo.migration.Migration20240226; -import org.kar.karideo.migration.Migration20240611; -import org.kar.karideo.migration.Migration20250214; +import org.glassfish.jersey.server.validation.ValidationFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.bridge.SLF4JBridgeHandler; @@ -64,6 +66,7 @@ public class WebLauncher { migrationEngine.add(new Migration20240226()); migrationEngine.add(new Migration20240611()); migrationEngine.add(new Migration20250214()); + migrationEngine.add(new Migration20250414()); WebLauncher.LOGGER.info("Migrate the DB [START]"); migrationEngine.migrateWaitAdmin(new DbConfig()); WebLauncher.LOGGER.info("Migrate the DB [STOP]"); @@ -116,6 +119,8 @@ public class WebLauncher { ContextGenericTools.addJsr310(rc); // add jackson to be discover when we are ins stand-alone server rc.register(JacksonFeature.class); + // enable jersey specific validations (@Valid) + rc.register(ValidationFeature.class); // enable this to show low level request // rc.property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, Level.WARNING.getName()); diff --git a/back/src/org/kar/karideo/WebLauncherLocal.java b/back/src/org/atriasoft/karideo/WebLauncherLocal.java similarity index 91% rename from back/src/org/kar/karideo/WebLauncherLocal.java rename to back/src/org/atriasoft/karideo/WebLauncherLocal.java index a6c3827..cf20607 100755 --- a/back/src/org/kar/karideo/WebLauncherLocal.java +++ b/back/src/org/atriasoft/karideo/WebLauncherLocal.java @@ -1,10 +1,10 @@ -package org.kar.karideo; +package org.atriasoft.karideo; import java.util.logging.LogManager; -import org.kar.archidata.tools.ConfigBaseVariable; -import org.kar.karideo.migration.Initialization; +import org.atriasoft.archidata.tools.ConfigBaseVariable; +import org.atriasoft.karideo.migration.Initialization; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.bridge.SLF4JBridgeHandler; diff --git a/back/src/org/kar/karideo/api/Front.java b/back/src/org/atriasoft/karideo/api/Front.java similarity index 56% rename from back/src/org/kar/karideo/api/Front.java rename to back/src/org/atriasoft/karideo/api/Front.java index dd28177..a531e5f 100644 --- a/back/src/org/kar/karideo/api/Front.java +++ b/back/src/org/atriasoft/karideo/api/Front.java @@ -1,10 +1,10 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; -import org.kar.archidata.api.FrontGeneric; +import org.atriasoft.archidata.api.FrontGeneric; import jakarta.ws.rs.Path; -import org.kar.karideo.util.ConfigVariable; +import org.atriasoft.karideo.util.ConfigVariable; @Path("/front") public class Front extends FrontGeneric { diff --git a/back/src/org/kar/karideo/api/HealthCheck.java b/back/src/org/atriasoft/karideo/api/HealthCheck.java similarity index 82% rename from back/src/org/kar/karideo/api/HealthCheck.java rename to back/src/org/atriasoft/karideo/api/HealthCheck.java index 1b3e8fb..480ecbe 100644 --- a/back/src/org/kar/karideo/api/HealthCheck.java +++ b/back/src/org/atriasoft/karideo/api/HealthCheck.java @@ -1,8 +1,8 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; -import org.kar.archidata.exception.FailException; -import org.kar.archidata.tools.ConfigBaseVariable; -import org.kar.archidata.tools.JWTWrapper; +import org.atriasoft.archidata.exception.FailException; +import org.atriasoft.archidata.tools.ConfigBaseVariable; +import org.atriasoft.archidata.tools.JWTWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/src/org/kar/karideo/api/MediaResource.java b/back/src/org/atriasoft/karideo/api/MediaResource.java similarity index 87% rename from back/src/org/kar/karideo/api/MediaResource.java rename to back/src/org/atriasoft/karideo/api/MediaResource.java index 15ea728..c2fea58 100644 --- a/back/src/org/kar/karideo/api/MediaResource.java +++ b/back/src/org/atriasoft/karideo/api/MediaResource.java @@ -1,37 +1,38 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import java.util.List; -import java.util.UUID; +import org.atriasoft.archidata.annotation.apiGenerator.ApiAsyncType; +import org.atriasoft.archidata.annotation.apiGenerator.ApiTypeScriptProgress; +import org.atriasoft.archidata.api.DataResource; +import org.atriasoft.archidata.dataAccess.DBAccess; +import org.atriasoft.archidata.dataAccess.DataAccess; +import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnDataJson; +import org.atriasoft.archidata.exception.FailException; +import org.atriasoft.archidata.exception.InputException; +import org.atriasoft.archidata.model.Data; +import org.atriasoft.archidata.tools.DataTools; +import org.atriasoft.karideo.model.Media; +import org.atriasoft.karideo.model.Season; +import org.atriasoft.karideo.model.Series; +import org.atriasoft.karideo.model.Type; +import org.bson.types.ObjectId; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; -import org.kar.archidata.annotation.AsyncType; -import org.kar.archidata.annotation.TypeScriptProgress; -import org.kar.archidata.api.DataResource; -import org.kar.archidata.dataAccess.DBAccess; -import org.kar.archidata.dataAccess.DataAccess; -import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson; -import org.kar.archidata.exception.FailException; -import org.kar.archidata.exception.InputException; -import org.kar.archidata.model.Data; -import org.kar.archidata.tools.DataTools; -import org.kar.karideo.model.Media; -import org.kar.karideo.model.Season; -import org.kar.karideo.model.Series; -import org.kar.karideo.model.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.security.RolesAllowed; +import jakarta.validation.Valid; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; -import jakarta.ws.rs.PATCH; import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; @@ -57,14 +58,15 @@ public class MediaResource { return DataAccess.get(Media.class, id); } - @PATCH + @PUT @Path("{id}") @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Modify a specific Media", tags = "GLOBAL") - public Media patch(@PathParam("id") final Long id, @AsyncType(Media.class) final String jsonRequest) throws Exception { - LOGGER.info("update video {} ==> '{}'", id, jsonRequest); - DataAccess.updateWithJson(Media.class, id, jsonRequest); + public Media patch(@PathParam("id") final Long id, @Valid final Media media) throws Exception { + LOGGER.info("update video {} ==> '{}'", id, media); + media.id = id; + DataAccess.update(media, id); return DataAccess.get(Media.class, id); } @@ -88,7 +90,7 @@ public class MediaResource { @RolesAllowed("ADMIN") @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Operation(description = "Create a new Media", tags = "GLOBAL") - @TypeScriptProgress + @ApiTypeScriptProgress public Media uploadMedia( // // @AsyncType(Long.class) @FormDataParam("universeId") String universeId, // // @AsyncType(Long.class) @FormDataParam("typeId") String typeId, // @@ -174,7 +176,7 @@ public class MediaResource { DataResource.removeTemporaryFile(tmpUID); throw new InputException("seriesId", "seriesId does not exist ..."); } - if (seriesNode.parentId != typeNode.id) { + if (seriesNode.parentId.equals(typeNode.id)) { DataResource.removeTemporaryFile(tmpUID); throw new InputException("seriesId", "seriesId object have not the correct parent..."); } @@ -233,9 +235,9 @@ public class MediaResource { @Path("{id}/cover") @RolesAllowed("ADMIN") @Consumes({ MediaType.MULTIPART_FORM_DATA }) - @AsyncType(Media.class) + @ApiAsyncType(Media.class) @Operation(description = "Upload a new season cover media", tags = "GLOBAL") - @TypeScriptProgress + @ApiTypeScriptProgress public Media uploadCover( // @PathParam("id") final Long id, // @FormDataParam("file") final InputStream fileInputStream, // @@ -253,7 +255,7 @@ public class MediaResource { @Operation(description = "Remove a specific cover of a media", tags = "GLOBAL") public Media removeCover( // @PathParam("id") final Long id, // - @PathParam("coverId") final UUID coverId // + @PathParam("coverId") final ObjectId coverId // ) throws Exception { try (DBAccess dbIo = DBAccess.createInterface()) { AddOnDataJson.removeLink(dbIo, Media.class, "id", id, "covers", coverId); diff --git a/back/src/org/kar/karideo/api/SeasonResource.java b/back/src/org/atriasoft/karideo/api/SeasonResource.java similarity index 78% rename from back/src/org/kar/karideo/api/SeasonResource.java rename to back/src/org/atriasoft/karideo/api/SeasonResource.java index 773c04f..79f838d 100644 --- a/back/src/org/kar/karideo/api/SeasonResource.java +++ b/back/src/org/atriasoft/karideo/api/SeasonResource.java @@ -1,31 +1,31 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; import java.io.InputStream; import java.util.List; -import java.util.UUID; +import org.atriasoft.archidata.annotation.apiGenerator.ApiTypeScriptProgress; +import org.atriasoft.archidata.dataAccess.DBAccess; +import org.atriasoft.archidata.dataAccess.DataAccess; +import org.atriasoft.archidata.dataAccess.QueryAnd; +import org.atriasoft.archidata.dataAccess.QueryCondition; +import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnDataJson; +import org.atriasoft.archidata.dataAccess.options.Condition; +import org.atriasoft.archidata.tools.DataTools; +import org.atriasoft.karideo.model.Season; +import org.bson.types.ObjectId; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; -import org.kar.archidata.annotation.AsyncType; -import org.kar.archidata.annotation.TypeScriptProgress; -import org.kar.archidata.dataAccess.DBAccess; -import org.kar.archidata.dataAccess.DataAccess; -import org.kar.archidata.dataAccess.QueryAnd; -import org.kar.archidata.dataAccess.QueryCondition; -import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson; -import org.kar.archidata.dataAccess.options.Condition; -import org.kar.archidata.tools.DataTools; -import org.kar.karideo.model.Season; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.security.RolesAllowed; +import jakarta.validation.Valid; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; -import jakarta.ws.rs.PATCH; import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; @@ -58,17 +58,18 @@ public class SeasonResource { @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Create a new season", tags = "GLOBAL") - public Season post(final Season jsonRequest) throws Exception { + public Season post(@Valid final Season jsonRequest) throws Exception { return DataAccess.insert(jsonRequest); } - @PATCH + @PUT @Path("{id}") @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Modify a specific season", tags = "GLOBAL") - public Season patch(@PathParam("id") final Long id, @AsyncType(Season.class) final String jsonRequest) throws Exception { - DataAccess.updateWithJson(Season.class, id, jsonRequest); + public Season patch(@PathParam("id") final Long id, @Valid final Season season) throws Exception { + season.id = id; + DataAccess.update(season, id); return DataAccess.get(Season.class, id); } @@ -85,7 +86,7 @@ public class SeasonResource { @RolesAllowed("ADMIN") @Consumes(MediaType.MULTIPART_FORM_DATA) @Operation(description = "Upload a new season cover season", tags = "GLOBAL") - @TypeScriptProgress + @ApiTypeScriptProgress public Season uploadCover(@PathParam("id") final Long id, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { try (DBAccess dbIo = DBAccess.createInterface()) { @@ -98,7 +99,7 @@ public class SeasonResource { @Path("{id}/cover/{coverId}") @RolesAllowed("ADMIN") @Operation(description = "Remove a specific cover of a season", tags = "GLOBAL") - public Season removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { + public Season removeCover(@PathParam("id") final Long id, @PathParam("coverId") final ObjectId coverId) throws Exception { try (DBAccess dbIo = DBAccess.createInterface()) { AddOnDataJson.removeLink(dbIo, Season.class, "id", id, "covers", coverId); return dbIo.get(Season.class, id); diff --git a/back/src/org/kar/karideo/api/SeriesResource.java b/back/src/org/atriasoft/karideo/api/SeriesResource.java similarity index 78% rename from back/src/org/kar/karideo/api/SeriesResource.java rename to back/src/org/atriasoft/karideo/api/SeriesResource.java index 53ee895..4201647 100644 --- a/back/src/org/kar/karideo/api/SeriesResource.java +++ b/back/src/org/atriasoft/karideo/api/SeriesResource.java @@ -1,31 +1,31 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; import java.io.InputStream; import java.util.List; -import java.util.UUID; +import org.atriasoft.archidata.annotation.apiGenerator.ApiTypeScriptProgress; +import org.atriasoft.archidata.dataAccess.DBAccess; +import org.atriasoft.archidata.dataAccess.DataAccess; +import org.atriasoft.archidata.dataAccess.QueryAnd; +import org.atriasoft.archidata.dataAccess.QueryCondition; +import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnDataJson; +import org.atriasoft.archidata.dataAccess.options.Condition; +import org.atriasoft.archidata.tools.DataTools; +import org.atriasoft.karideo.model.Series; +import org.bson.types.ObjectId; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; -import org.kar.archidata.annotation.AsyncType; -import org.kar.archidata.annotation.TypeScriptProgress; -import org.kar.archidata.dataAccess.DBAccess; -import org.kar.archidata.dataAccess.DataAccess; -import org.kar.archidata.dataAccess.QueryAnd; -import org.kar.archidata.dataAccess.QueryCondition; -import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson; -import org.kar.archidata.dataAccess.options.Condition; -import org.kar.archidata.tools.DataTools; -import org.kar.karideo.model.Series; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.security.RolesAllowed; +import jakarta.validation.Valid; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; -import jakarta.ws.rs.PATCH; import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; @@ -61,17 +61,18 @@ public class SeriesResource { @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Create a new Series", tags = "GLOBAL") - public Series post(final Series jsonRequest) throws Exception { + public Series post(@Valid final Series jsonRequest) throws Exception { return DataAccess.insert(jsonRequest); } - @PATCH + @PUT @Path("{id}") @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Modify a specific Series", tags = "GLOBAL") - public Series patch(@PathParam("id") final Long id, @AsyncType(Series.class) final String jsonRequest) throws Exception { - DataAccess.updateWithJson(Series.class, id, jsonRequest); + public Series patch(@PathParam("id") final Long id, @Valid final Series series) throws Exception { + series.id = id; + DataAccess.update(series, id); return DataAccess.get(Series.class, id); } @@ -88,7 +89,7 @@ public class SeriesResource { @RolesAllowed("ADMIN") @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Operation(description = "Upload a new season cover Series", tags = "GLOBAL") - @TypeScriptProgress + @ApiTypeScriptProgress public Series uploadCover(@PathParam("id") final Long id, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { try (DBAccess dbIo = DBAccess.createInterface()) { @@ -101,7 +102,7 @@ public class SeriesResource { @Path("{id}/cover/{coverId}") @RolesAllowed("ADMIN") @Operation(description = "Remove a specific Series of a season", tags = "GLOBAL") - public Series removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { + public Series removeCover(@PathParam("id") final Long id, @PathParam("coverId") final ObjectId coverId) throws Exception { try (DBAccess dbIo = DBAccess.createInterface()) { AddOnDataJson.removeLink(dbIo, Series.class, "id", id, "covers", coverId); return dbIo.get(Series.class, id); diff --git a/back/src/org/kar/karideo/api/TypeResource.java b/back/src/org/atriasoft/karideo/api/TypeResource.java similarity index 79% rename from back/src/org/kar/karideo/api/TypeResource.java rename to back/src/org/atriasoft/karideo/api/TypeResource.java index dc5c495..efd1371 100644 --- a/back/src/org/kar/karideo/api/TypeResource.java +++ b/back/src/org/atriasoft/karideo/api/TypeResource.java @@ -1,30 +1,30 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; import java.io.InputStream; import java.util.List; -import java.util.UUID; +import org.atriasoft.archidata.annotation.apiGenerator.ApiTypeScriptProgress; +import org.atriasoft.archidata.dataAccess.DBAccess; +import org.atriasoft.archidata.dataAccess.DataAccess; +import org.atriasoft.archidata.dataAccess.QueryCondition; +import org.atriasoft.archidata.dataAccess.addOnSQL.AddOnDataJson; +import org.atriasoft.archidata.dataAccess.options.Condition; +import org.atriasoft.archidata.tools.DataTools; +import org.atriasoft.karideo.model.Type; +import org.bson.types.ObjectId; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; -import org.kar.archidata.annotation.AsyncType; -import org.kar.archidata.annotation.TypeScriptProgress; -import org.kar.archidata.dataAccess.DBAccess; -import org.kar.archidata.dataAccess.DataAccess; -import org.kar.archidata.dataAccess.QueryCondition; -import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson; -import org.kar.archidata.dataAccess.options.Condition; -import org.kar.archidata.tools.DataTools; -import org.kar.karideo.model.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.security.RolesAllowed; +import jakarta.validation.Valid; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; -import jakarta.ws.rs.PATCH; import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; @@ -61,17 +61,18 @@ public class TypeResource { @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Create a new Type", tags = "GLOBAL") - public Type post(final Type jsonRequest) throws Exception { + public Type post(@Valid final Type jsonRequest) throws Exception { return DataAccess.insert(jsonRequest); } - @PATCH + @PUT @Path("{id}") @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Modify a specific Type", tags = "GLOBAL") - public Type patch(@PathParam("id") final Long id, @AsyncType(Type.class) final String jsonRequest) throws Exception { - DataAccess.updateWithJson(Type.class, id, jsonRequest); + public Type patch(@PathParam("id") final Long id, @Valid final Type type) throws Exception { + type.id = id; + DataAccess.update(type, id); return DataAccess.get(Type.class, id); } @@ -88,7 +89,7 @@ public class TypeResource { @RolesAllowed("ADMIN") @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Operation(description = "Upload a new season cover Type", tags = "GLOBAL") - @TypeScriptProgress + @ApiTypeScriptProgress public Type uploadCover(@PathParam("id") final Long id, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { try (DBAccess dbIo = DBAccess.createInterface()) { @@ -101,7 +102,7 @@ public class TypeResource { @Path("{id}/cover/{coverId}") @RolesAllowed("ADMIN") @Operation(description = "Remove a specific cover of a type", tags = "GLOBAL") - public Type removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { + public Type removeCover(@PathParam("id") final Long id, @PathParam("coverId") final ObjectId coverId) throws Exception { try (DBAccess dbIo = DBAccess.createInterface()) { AddOnDataJson.removeLink(dbIo, Type.class, "id", id, "covers", coverId); diff --git a/back/src/org/kar/karideo/api/UserMediaAdvancementResource.java b/back/src/org/atriasoft/karideo/api/UserMediaAdvancementResource.java similarity index 87% rename from back/src/org/kar/karideo/api/UserMediaAdvancementResource.java rename to back/src/org/atriasoft/karideo/api/UserMediaAdvancementResource.java index 82c0f6f..7e34232 100644 --- a/back/src/org/kar/karideo/api/UserMediaAdvancementResource.java +++ b/back/src/org/atriasoft/karideo/api/UserMediaAdvancementResource.java @@ -1,22 +1,23 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; import java.util.List; -import org.kar.archidata.dataAccess.DataAccess; -import org.kar.archidata.dataAccess.QueryAnd; -import org.kar.archidata.dataAccess.QueryCondition; -import org.kar.archidata.dataAccess.options.Condition; -import org.kar.archidata.filter.GenericContext; -import org.kar.karideo.model.UserMediaAdvancement; +import org.atriasoft.archidata.dataAccess.DataAccess; +import org.atriasoft.archidata.dataAccess.QueryAnd; +import org.atriasoft.archidata.dataAccess.QueryCondition; +import org.atriasoft.archidata.dataAccess.options.Condition; +import org.atriasoft.archidata.filter.GenericContext; +import org.atriasoft.karideo.model.UserMediaAdvancement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.security.RolesAllowed; +import jakarta.validation.Valid; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; -import jakarta.ws.rs.PATCH; +import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; @@ -69,12 +70,12 @@ public class UserMediaAdvancementResource { public record MediaInformationsDelta(int time, float percent, boolean addCount) { } - @PATCH + @PUT @Path("{id}") @RolesAllowed("USER") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Modify a user advancement", tags = "GLOBAL") - public UserMediaAdvancement patch(@Context final SecurityContext sc, @PathParam("id") final Long id, final MediaInformationsDelta data) throws Exception { + public UserMediaAdvancement patch(@Context final SecurityContext sc, @PathParam("id") final Long id, @Valid final MediaInformationsDelta data) throws Exception { final UserMediaAdvancement elem = get(sc, id); if (elem == null) { // insert element diff --git a/back/src/org/kar/karideo/api/UserResource.java b/back/src/org/atriasoft/karideo/api/UserResource.java similarity index 92% rename from back/src/org/kar/karideo/api/UserResource.java rename to back/src/org/atriasoft/karideo/api/UserResource.java index 609a449..30ac749 100755 --- a/back/src/org/kar/karideo/api/UserResource.java +++ b/back/src/org/atriasoft/karideo/api/UserResource.java @@ -1,10 +1,10 @@ -package org.kar.karideo.api; +package org.atriasoft.karideo.api; import java.util.List; -import org.kar.archidata.dataAccess.DataAccess; -import org.kar.archidata.filter.GenericContext; -import org.kar.karideo.model.UserKarideo; +import org.atriasoft.archidata.dataAccess.DataAccess; +import org.atriasoft.archidata.filter.GenericContext; +import org.atriasoft.karideo.model.UserKarideo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/src/org/kar/karideo/filter/KarideoAuthenticationFilter.java b/back/src/org/atriasoft/karideo/filter/KarideoAuthenticationFilter.java similarity index 82% rename from back/src/org/kar/karideo/filter/KarideoAuthenticationFilter.java rename to back/src/org/atriasoft/karideo/filter/KarideoAuthenticationFilter.java index 79fdcad..749e134 100644 --- a/back/src/org/kar/karideo/filter/KarideoAuthenticationFilter.java +++ b/back/src/org/atriasoft/karideo/filter/KarideoAuthenticationFilter.java @@ -1,6 +1,6 @@ -package org.kar.karideo.filter; +package org.atriasoft.karideo.filter; -import org.kar.archidata.filter.AuthenticationFilter; +import org.atriasoft.archidata.filter.AuthenticationFilter; import jakarta.ws.rs.Priorities; import jakarta.ws.rs.ext.Provider; diff --git a/back/src/org/kar/karideo/internal/Log.java b/back/src/org/atriasoft/karideo/internal/Log.java similarity index 97% rename from back/src/org/kar/karideo/internal/Log.java rename to back/src/org/atriasoft/karideo/internal/Log.java index 71d6346..457781e 100644 --- a/back/src/org/kar/karideo/internal/Log.java +++ b/back/src/org/atriasoft/karideo/internal/Log.java @@ -1,4 +1,4 @@ -package org.kar.karideo.internal; +package org.atriasoft.karideo.internal; //import io.scenarium.logger.LogLevel; //import io.scenarium.logger.Logger; diff --git a/back/src/org/kar/karideo/migration/Initialization.java b/back/src/org/atriasoft/karideo/migration/Initialization.java similarity index 71% rename from back/src/org/kar/karideo/migration/Initialization.java rename to back/src/org/atriasoft/karideo/migration/Initialization.java index ddd978d..1fa2453 100644 --- a/back/src/org/kar/karideo/migration/Initialization.java +++ b/back/src/org/atriasoft/karideo/migration/Initialization.java @@ -1,28 +1,29 @@ -package org.kar.karideo.migration; +package org.atriasoft.karideo.migration; import java.util.List; -import org.kar.archidata.api.DataResource; -import org.kar.archidata.dataAccess.DBAccess; -import org.kar.archidata.externalRestApi.AnalyzeApi; -import org.kar.archidata.externalRestApi.TsGenerateApi; -import org.kar.archidata.migration.MigrationSqlStep; -import org.kar.archidata.model.Data; -import org.kar.archidata.model.User; -import org.kar.archidata.model.token.JwtToken; -import org.kar.karideo.api.Front; -import org.kar.karideo.api.HealthCheck; -import org.kar.karideo.api.MediaResource; -import org.kar.karideo.api.SeasonResource; -import org.kar.karideo.api.SeriesResource; -import org.kar.karideo.api.TypeResource; -import org.kar.karideo.api.UserMediaAdvancementResource; -import org.kar.karideo.api.UserResource; -import org.kar.karideo.model.Media; -import org.kar.karideo.model.Season; -import org.kar.karideo.model.Series; -import org.kar.karideo.model.Type; -import org.kar.karideo.model.UserMediaAdvancement; +import org.atriasoft.archidata.api.DataResource; +import org.atriasoft.archidata.dataAccess.DBAccess; +import org.atriasoft.archidata.externalRestApi.AnalyzeApi; +import org.atriasoft.archidata.externalRestApi.TsGenerateApi; +import org.atriasoft.archidata.filter.PartRight; +import org.atriasoft.archidata.migration.MigrationSqlStep; +import org.atriasoft.archidata.model.Data; +import org.atriasoft.archidata.model.User; +import org.atriasoft.archidata.model.token.JwtToken; +import org.atriasoft.karideo.api.Front; +import org.atriasoft.karideo.api.HealthCheck; +import org.atriasoft.karideo.api.MediaResource; +import org.atriasoft.karideo.api.SeasonResource; +import org.atriasoft.karideo.api.SeriesResource; +import org.atriasoft.karideo.api.TypeResource; +import org.atriasoft.karideo.api.UserMediaAdvancementResource; +import org.atriasoft.karideo.api.UserResource; +import org.atriasoft.karideo.model.Media; +import org.atriasoft.karideo.model.Season; +import org.atriasoft.karideo.model.Series; +import org.atriasoft.karideo.model.Type; +import org.atriasoft.karideo.model.UserMediaAdvancement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,6 +46,7 @@ public class Initialization extends MigrationSqlStep { final AnalyzeApi api = new AnalyzeApi(); api.addAllApi(listOfResources); api.addModel(JwtToken.class); + api.addModel(PartRight.class); TsGenerateApi.generateApi(api, "../front/src/back-api/"); LOGGER.info("Generate APIs (DONE)"); } diff --git a/back/src/org/kar/karideo/migration/Migration20230810.java b/back/src/org/atriasoft/karideo/migration/Migration20230810.java similarity index 72% rename from back/src/org/kar/karideo/migration/Migration20230810.java rename to back/src/org/atriasoft/karideo/migration/Migration20230810.java index 892af80..a0f51bd 100644 --- a/back/src/org/kar/karideo/migration/Migration20230810.java +++ b/back/src/org/atriasoft/karideo/migration/Migration20230810.java @@ -1,7 +1,7 @@ -package org.kar.karideo.migration; +package org.atriasoft.karideo.migration; -import org.kar.archidata.migration.MigrationSqlStep; -import org.kar.karideo.model.UserMediaAdvancement; +import org.atriasoft.archidata.migration.MigrationSqlStep; +import org.atriasoft.karideo.model.UserMediaAdvancement; public class Migration20230810 extends MigrationSqlStep { diff --git a/back/src/org/kar/karideo/migration/Migration20231015.java b/back/src/org/atriasoft/karideo/migration/Migration20231015.java similarity index 87% rename from back/src/org/kar/karideo/migration/Migration20231015.java rename to back/src/org/atriasoft/karideo/migration/Migration20231015.java index c7a7868..ff5a55d 100644 --- a/back/src/org/kar/karideo/migration/Migration20231015.java +++ b/back/src/org/atriasoft/karideo/migration/Migration20231015.java @@ -1,8 +1,8 @@ -package org.kar.karideo.migration; +package org.atriasoft.karideo.migration; import java.util.List; -import org.kar.archidata.migration.MigrationSqlStep; +import org.atriasoft.archidata.migration.MigrationSqlStep; public class Migration20231015 extends MigrationSqlStep { diff --git a/back/src/org/kar/karideo/migration/Migration20231126.java b/back/src/org/atriasoft/karideo/migration/Migration20231126.java similarity index 99% rename from back/src/org/kar/karideo/migration/Migration20231126.java rename to back/src/org/atriasoft/karideo/migration/Migration20231126.java index 4c54bb2..28b9df0 100644 --- a/back/src/org/kar/karideo/migration/Migration20231126.java +++ b/back/src/org/atriasoft/karideo/migration/Migration20231126.java @@ -1,6 +1,6 @@ -package org.kar.karideo.migration; +package org.atriasoft.karideo.migration; -import org.kar.archidata.migration.MigrationSqlStep; +import org.atriasoft.archidata.migration.MigrationSqlStep; public class Migration20231126 extends MigrationSqlStep { diff --git a/back/src/org/kar/karideo/migration/Migration20240226.java b/back/src/org/atriasoft/karideo/migration/Migration20240226.java similarity index 82% rename from back/src/org/kar/karideo/migration/Migration20240226.java rename to back/src/org/atriasoft/karideo/migration/Migration20240226.java index ee1e280..086fac4 100644 --- a/back/src/org/kar/karideo/migration/Migration20240226.java +++ b/back/src/org/atriasoft/karideo/migration/Migration20240226.java @@ -1,6 +1,6 @@ -package org.kar.karideo.migration; +package org.atriasoft.karideo.migration; -import org.kar.archidata.migration.MigrationSqlStep; +import org.atriasoft.archidata.migration.MigrationSqlStep; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/src/org/kar/karideo/migration/Migration20240611.java b/back/src/org/atriasoft/karideo/migration/Migration20240611.java similarity index 85% rename from back/src/org/kar/karideo/migration/Migration20240611.java rename to back/src/org/atriasoft/karideo/migration/Migration20240611.java index 6ebd66a..da7ee2c 100644 --- a/back/src/org/kar/karideo/migration/Migration20240611.java +++ b/back/src/org/atriasoft/karideo/migration/Migration20240611.java @@ -1,6 +1,6 @@ -package org.kar.karideo.migration; +package org.atriasoft.karideo.migration; -import org.kar.archidata.migration.MigrationSqlStep; +import org.atriasoft.archidata.migration.MigrationSqlStep; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/src/org/kar/karideo/migration/Migration20250214.java b/back/src/org/atriasoft/karideo/migration/Migration20250214.java similarity index 89% rename from back/src/org/kar/karideo/migration/Migration20250214.java rename to back/src/org/atriasoft/karideo/migration/Migration20250214.java index 9fe1dee..8c2d515 100644 --- a/back/src/org/kar/karideo/migration/Migration20250214.java +++ b/back/src/org/atriasoft/karideo/migration/Migration20250214.java @@ -1,4 +1,4 @@ -package org.kar.karideo.migration; +package org.atriasoft.karideo.migration; import java.io.FileWriter; import java.io.IOException; @@ -11,15 +11,15 @@ import java.util.List; import java.util.UUID; import org.bson.types.ObjectId; -import org.kar.archidata.api.DataResource; -import org.kar.archidata.dataAccess.DBAccess; -import org.kar.archidata.dataAccess.options.AccessDeletedItems; -import org.kar.archidata.dataAccess.options.OverrideTableName; -import org.kar.archidata.migration.MigrationSqlStep; -import org.kar.archidata.tools.ConfigBaseVariable; -import org.kar.karideo.migration.model.CoverConversion; -import org.kar.karideo.migration.model.MediaConversion; -import org.kar.karideo.migration.model.OIDConversion; +import org.atriasoft.archidata.api.DataResource; +import org.atriasoft.archidata.dataAccess.DBAccess; +import org.atriasoft.archidata.dataAccess.options.AccessDeletedItems; +import org.atriasoft.archidata.dataAccess.options.OverrideTableName; +import org.atriasoft.archidata.migration.MigrationSqlStep; +import org.atriasoft.archidata.tools.ConfigBaseVariable; +import org.atriasoft.karideo.migration.model.CoverConversion; +import org.atriasoft.karideo.migration.model.MediaConversion; +import org.atriasoft.karideo.migration.model.OIDConversion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/src/org/atriasoft/karideo/migration/Migration20250414.java b/back/src/org/atriasoft/karideo/migration/Migration20250414.java new file mode 100644 index 0000000..d175bcf --- /dev/null +++ b/back/src/org/atriasoft/karideo/migration/Migration20250414.java @@ -0,0 +1,24 @@ +package org.atriasoft.karideo.migration; + +import org.atriasoft.archidata.migration.MigrationSqlStep; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Migration20250414 extends MigrationSqlStep { + private static final Logger LOGGER = LoggerFactory.getLogger(Migration20240226.class); + + public static final int KARSO_INITIALISATION_ID = 1; + + @Override + public String getName() { + return "migration-2025-04-14: update to archidata 0.28.0"; + } + + @Override + public void generateStep() throws Exception { + addAction(""" + ALTER TABLE `media` ADD `datePublication` timestamp(3) NULL; + """); + } + +} diff --git a/back/src/org/kar/karideo/migration/model/CoverConversion.java b/back/src/org/atriasoft/karideo/migration/model/CoverConversion.java similarity index 73% rename from back/src/org/kar/karideo/migration/model/CoverConversion.java rename to back/src/org/atriasoft/karideo/migration/model/CoverConversion.java index 2182f2a..bd5a4b5 100644 --- a/back/src/org/kar/karideo/migration/model/CoverConversion.java +++ b/back/src/org/atriasoft/karideo/migration/model/CoverConversion.java @@ -1,10 +1,10 @@ -package org.kar.karideo.migration.model; +package org.atriasoft.karideo.migration.model; import java.util.List; import java.util.UUID; import org.bson.types.ObjectId; -import org.kar.archidata.annotation.DataJson; +import org.atriasoft.archidata.annotation.DataJson; import jakarta.persistence.Id; diff --git a/back/src/org/kar/karideo/migration/model/MediaConversion.java b/back/src/org/atriasoft/karideo/migration/model/MediaConversion.java similarity index 81% rename from back/src/org/kar/karideo/migration/model/MediaConversion.java rename to back/src/org/atriasoft/karideo/migration/model/MediaConversion.java index aaf9968..2b8a0b6 100644 --- a/back/src/org/kar/karideo/migration/model/MediaConversion.java +++ b/back/src/org/atriasoft/karideo/migration/model/MediaConversion.java @@ -1,4 +1,4 @@ -package org.kar.karideo.migration.model; +package org.atriasoft.karideo.migration.model; import java.util.UUID; diff --git a/back/src/org/kar/karideo/migration/model/OIDConversion.java b/back/src/org/atriasoft/karideo/migration/model/OIDConversion.java similarity index 79% rename from back/src/org/kar/karideo/migration/model/OIDConversion.java rename to back/src/org/atriasoft/karideo/migration/model/OIDConversion.java index c6a283c..f31b44f 100644 --- a/back/src/org/kar/karideo/migration/model/OIDConversion.java +++ b/back/src/org/atriasoft/karideo/migration/model/OIDConversion.java @@ -1,4 +1,4 @@ -package org.kar.karideo.migration.model; +package org.atriasoft.karideo.migration.model; import java.util.UUID; diff --git a/back/src/org/kar/karideo/model/Media.java b/back/src/org/atriasoft/karideo/model/Media.java similarity index 60% rename from back/src/org/kar/karideo/model/Media.java rename to back/src/org/atriasoft/karideo/model/Media.java index c821a6a..715030e 100644 --- a/back/src/org/kar/karideo/model/Media.java +++ b/back/src/org/atriasoft/karideo/model/Media.java @@ -1,12 +1,16 @@ -package org.kar.karideo.model; +package org.atriasoft.karideo.model; +import java.util.Date; import java.util.List; -import java.util.UUID; +import org.atriasoft.archidata.annotation.DataJson; +import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode; +import org.atriasoft.archidata.annotation.checker.CheckForeignKey; +import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty; +import org.atriasoft.archidata.model.Data; +import org.atriasoft.archidata.model.GenericDataSoftDelete; import org.bson.types.ObjectId; -import org.kar.archidata.annotation.DataJson; -import org.kar.archidata.model.Data; -import org.kar.archidata.model.GenericDataSoftDelete; +import org.hibernate.validator.constraints.UniqueElements; import com.fasterxml.jackson.annotation.JsonInclude; @@ -17,51 +21,58 @@ import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import jakarta.validation.constraints.PositiveOrZero; +import jakarta.validation.constraints.Size; @Entity @Table(name = "media") @JsonInclude(JsonInclude.Include.NON_NULL) +@ApiGenerationMode(create = true, update = true) public class Media extends GenericDataSoftDelete { @Schema(description = "Name of the media (this represent the title)") @Column(nullable = false, length = 0) + @Size(min = 0, max = 256) public String name; @Schema(description = "Description of the media") @Column(length = 0) + @Size(min = 0, max = 8192) public String description; @Schema(description = "Foreign Key Id of the data") @ManyToOne(fetch = FetchType.LAZY, targetEntity = Data.class) @Column(nullable = false) + @CheckForeignKey(target = Data.class) public ObjectId dataId; - @ManyToOne(fetch = FetchType.LAZY, targetEntity = Data.class) - @Column(nullable = false) - @Nullable - public UUID dataIdOld; @Schema(description = "Type of the media") @ManyToOne(fetch = FetchType.LAZY, targetEntity = Type.class) + @CheckForeignKey(target = Type.class) public Long typeId; @Schema(description = "Series reference of the media") @ManyToOne(fetch = FetchType.LAZY, targetEntity = Series.class) + @CheckForeignKey(target = Series.class) public Long seriesId; @Schema(description = "Season reference of the media") @ManyToOne(fetch = FetchType.LAZY, targetEntity = Season.class) + @CheckForeignKey(target = Season.class) public Long seasonId; @Schema(description = "Episode Id") + @PositiveOrZero public Integer episode; - // ") - public Integer date; @Schema(description = "Creation years of the media") - public Integer time; + public Date datePublication; @Schema(description = "Limitation Age of the media") + @PositiveOrZero public Integer ageLimit; @Schema(description = "List of Id of the specific covers") - @DataJson(targetEntity = Data.class) + @DataJson() @Nullable - public List covers = null; + @CollectionNotEmpty + @UniqueElements + public List<@CheckForeignKey(target = Data.class) ObjectId> covers = null; @Override public String toString() { return "Media [name=" + this.name + ", description=" + this.description + ", dataId=" + this.dataId + ", typeId=" + this.typeId + ", seriesId=" + this.seriesId + ", seasonId=" + this.seasonId - + ", episode=" + this.episode + ", date=" + this.date + ", time=" + this.time + ", ageLimit=" + this.ageLimit + ", covers=" + this.covers + "]"; + + ", episode=" + this.episode + ", date=" + this.datePublication + ", ageLimit=" + this.ageLimit + ", covers=" + this.covers + "]"; } } diff --git a/back/src/org/kar/karideo/model/Season.java b/back/src/org/atriasoft/karideo/model/Season.java similarity index 52% rename from back/src/org/kar/karideo/model/Season.java rename to back/src/org/atriasoft/karideo/model/Season.java index a5c0c8f..05fd23a 100644 --- a/back/src/org/kar/karideo/model/Season.java +++ b/back/src/org/atriasoft/karideo/model/Season.java @@ -1,11 +1,16 @@ -package org.kar.karideo.model; +package org.atriasoft.karideo.model; import java.util.List; +import org.atriasoft.archidata.annotation.DataIfNotExists; +import org.atriasoft.archidata.annotation.DataJson; +import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode; +import org.atriasoft.archidata.annotation.checker.CheckForeignKey; +import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty; +import org.atriasoft.archidata.model.Data; +import org.atriasoft.archidata.model.GenericDataSoftDelete; import org.bson.types.ObjectId; -import org.kar.archidata.annotation.DataIfNotExists; -import org.kar.archidata.annotation.DataJson; -import org.kar.archidata.model.GenericDataSoftDelete; +import org.hibernate.validator.constraints.UniqueElements; import com.fasterxml.jackson.annotation.JsonInclude; @@ -15,23 +20,31 @@ import jakarta.persistence.Column; import jakarta.persistence.FetchType; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; @Table(name = "season") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) +@ApiGenerationMode(create = true, update = true) public class Season extends GenericDataSoftDelete { @Column(nullable = false, length = 0) @Schema(description = "Name of the media (this represent the title)") + @Size(min = 0, max = 256) public String name; @Column(length = 0) @Schema(description = "Description of the media") + @Size(min = 0, max = 8192) public String description; @Column(nullable = false) @Schema(description = "series parent ID") @ManyToOne(fetch = FetchType.LAZY, targetEntity = Series.class) + @CheckForeignKey(target = Series.class) public Long parentId; @Schema(description = "List of Id of the specific covers") @DataJson() @Nullable - public List covers = null; + @CollectionNotEmpty + @UniqueElements + public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null; } \ No newline at end of file diff --git a/back/src/org/kar/karideo/model/Series.java b/back/src/org/atriasoft/karideo/model/Series.java similarity index 52% rename from back/src/org/kar/karideo/model/Series.java rename to back/src/org/atriasoft/karideo/model/Series.java index 41a6584..88b2e68 100644 --- a/back/src/org/kar/karideo/model/Series.java +++ b/back/src/org/atriasoft/karideo/model/Series.java @@ -1,11 +1,16 @@ -package org.kar.karideo.model; +package org.atriasoft.karideo.model; import java.util.List; +import org.atriasoft.archidata.annotation.DataIfNotExists; +import org.atriasoft.archidata.annotation.DataJson; +import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode; +import org.atriasoft.archidata.annotation.checker.CheckForeignKey; +import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty; +import org.atriasoft.archidata.model.Data; +import org.atriasoft.archidata.model.GenericDataSoftDelete; import org.bson.types.ObjectId; -import org.kar.archidata.annotation.DataIfNotExists; -import org.kar.archidata.annotation.DataJson; -import org.kar.archidata.model.GenericDataSoftDelete; +import org.hibernate.validator.constraints.UniqueElements; import com.fasterxml.jackson.annotation.JsonInclude; @@ -15,23 +20,31 @@ import jakarta.persistence.Column; import jakarta.persistence.FetchType; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; @Table(name = "series") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) +@ApiGenerationMode(create = true, update = true) public class Series extends GenericDataSoftDelete { @Column(nullable = false, length = 0) + @Size(min = 0, max = 256) @Schema(description = "Name of the media (this represent the title)") public String name; @Column(length = 0) @Schema(description = "Description of the media") + @Size(min = 0, max = 8192) public String description; @Column(nullable = false) @Schema(description = "series parent ID") @ManyToOne(fetch = FetchType.LAZY, targetEntity = Type.class) + @CheckForeignKey(target = Type.class) public Long parentId; @Schema(description = "List of Id of the specific covers") @DataJson() @Nullable - public List covers = null; + @CollectionNotEmpty + @UniqueElements + public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null; } diff --git a/back/src/org/kar/karideo/model/Type.java b/back/src/org/atriasoft/karideo/model/Type.java similarity index 50% rename from back/src/org/kar/karideo/model/Type.java rename to back/src/org/atriasoft/karideo/model/Type.java index 17418d0..fe6f029 100644 --- a/back/src/org/kar/karideo/model/Type.java +++ b/back/src/org/atriasoft/karideo/model/Type.java @@ -1,11 +1,16 @@ -package org.kar.karideo.model; +package org.atriasoft.karideo.model; import java.util.List; +import org.atriasoft.archidata.annotation.DataIfNotExists; +import org.atriasoft.archidata.annotation.DataJson; +import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode; +import org.atriasoft.archidata.annotation.checker.CheckForeignKey; +import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty; +import org.atriasoft.archidata.model.Data; +import org.atriasoft.archidata.model.GenericDataSoftDelete; import org.bson.types.ObjectId; -import org.kar.archidata.annotation.DataIfNotExists; -import org.kar.archidata.annotation.DataJson; -import org.kar.archidata.model.GenericDataSoftDelete; +import org.hibernate.validator.constraints.UniqueElements; import com.fasterxml.jackson.annotation.JsonInclude; @@ -13,21 +18,28 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; @Table(name = "type") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) +@ApiGenerationMode(create = true, update = true) public class Type extends GenericDataSoftDelete { @Column(nullable = false, length = 0) + @Size(min = 0, max = 256) @Schema(description = "Name of the media (this represent the title)") public String name; @Column(length = 0) @Schema(description = "Description of the media") + @Size(min = 0, max = 8192) public String description; @Schema(description = "List of Id of the specific covers") @DataJson() @Nullable - public List covers = null; + @CollectionNotEmpty + @UniqueElements + public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null; public Type() {} diff --git a/back/src/org/kar/karideo/model/UserKarideo.java b/back/src/org/atriasoft/karideo/model/UserKarideo.java similarity index 60% rename from back/src/org/kar/karideo/model/UserKarideo.java rename to back/src/org/atriasoft/karideo/model/UserKarideo.java index d3f5b5b..1266f7a 100644 --- a/back/src/org/kar/karideo/model/UserKarideo.java +++ b/back/src/org/atriasoft/karideo/model/UserKarideo.java @@ -1,7 +1,7 @@ -package org.kar.karideo.model; +package org.atriasoft.karideo.model; -import org.kar.archidata.annotation.DataIfNotExists; -import org.kar.archidata.model.User; +import org.atriasoft.archidata.annotation.DataIfNotExists; +import org.atriasoft.archidata.model.User; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/back/src/org/kar/karideo/model/UserMediaAdvancement.java b/back/src/org/atriasoft/karideo/model/UserMediaAdvancement.java similarity index 62% rename from back/src/org/kar/karideo/model/UserMediaAdvancement.java rename to back/src/org/atriasoft/karideo/model/UserMediaAdvancement.java index 3c46606..f20545c 100644 --- a/back/src/org/kar/karideo/model/UserMediaAdvancement.java +++ b/back/src/org/atriasoft/karideo/model/UserMediaAdvancement.java @@ -1,8 +1,11 @@ -package org.kar.karideo.model; +package org.atriasoft.karideo.model; -import org.kar.archidata.annotation.DataIfNotExists; -import org.kar.archidata.annotation.DataNotRead; -import org.kar.archidata.model.GenericDataSoftDelete; +import org.atriasoft.archidata.annotation.DataIfNotExists; +import org.atriasoft.archidata.annotation.DataNotRead; +import org.atriasoft.archidata.annotation.apiGenerator.ApiAccessLimitation; +import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode; +import org.atriasoft.archidata.annotation.checker.CheckForeignKey; +import org.atriasoft.archidata.model.GenericDataSoftDelete; import com.fasterxml.jackson.annotation.JsonInclude; @@ -12,28 +15,35 @@ import jakarta.persistence.Column; import jakarta.persistence.FetchType; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import jakarta.validation.constraints.PositiveOrZero; @Table(name = "userMediaAdvancement") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) +@ApiGenerationMode(create = true, update = true) public class UserMediaAdvancement extends GenericDataSoftDelete { @DataNotRead @Column(nullable = false) @Schema(description = "Foreign Key Id of the user") @ManyToOne(fetch = FetchType.LAZY, targetEntity = UserKarideo.class) @Nullable + @ApiAccessLimitation(updatable = false, creatable = false) public Long userId; @Column(nullable = false) @Schema(description = "Id of the media") @ManyToOne(fetch = FetchType.LAZY, targetEntity = Media.class) + @CheckForeignKey(target = Media.class) public Long mediaId; @Column(nullable = false) @Schema(description = "Percent of advancement in the media") + @PositiveOrZero public Float percent; @Column(nullable = false) @Schema(description = "Number of second of advancement in the media") + @PositiveOrZero public Integer time; @Column(nullable = false) @Schema(description = "Number of time this media has been read") + @PositiveOrZero public Integer count; } diff --git a/back/src/org/kar/karideo/util/ConfigVariable.java b/back/src/org/atriasoft/karideo/util/ConfigVariable.java similarity index 87% rename from back/src/org/kar/karideo/util/ConfigVariable.java rename to back/src/org/atriasoft/karideo/util/ConfigVariable.java index 6a727cb..28452c3 100644 --- a/back/src/org/kar/karideo/util/ConfigVariable.java +++ b/back/src/org/atriasoft/karideo/util/ConfigVariable.java @@ -1,4 +1,4 @@ -package org.kar.karideo.util; +package org.atriasoft.karideo.util; public class ConfigVariable { public static final String BASE_NAME = "ORG_KARIDEO_"; diff --git a/back/src/org/kar/karideo/CacheFilter.java__ b/back/src/org/kar/karideo/CacheFilter.java__ deleted file mode 100644 index 4269fc6..0000000 --- a/back/src/org/kar/karideo/CacheFilter.java__ +++ /dev/null @@ -1,20 +0,0 @@ -package org.kar.karideo; - -public class CacheFilter { - @Override - public List create(AbstractMethod am) { - if (am.isAnnotationPresent(CacheMaxAge.class)) { - CacheMaxAge maxAge = am.getAnnotation(CacheMaxAge.class); - return newCacheFilter("max-age: " + maxAge.unit().toSeconds(maxAge.time())); - } else if (am.isAnnotationPresent(NoCache.class)) { - return newCacheFilter("no-cache"); - } else { - return Collections.emptyList(); - } - } - - private List newCacheFilter(String content) { - return Collections - . singletonList(new CacheResponseFilter(content)); - } -} diff --git a/back/test/src/test/kar/karideo/Common.java b/back/test/src/test/atriasoft/karideo/Common.java similarity index 57% rename from back/test/src/test/kar/karideo/Common.java rename to back/test/src/test/atriasoft/karideo/Common.java index 8b45de9..da99432 100644 --- a/back/test/src/test/kar/karideo/Common.java +++ b/back/test/src/test/atriasoft/karideo/Common.java @@ -1,10 +1,11 @@ -package test.kar.karideo; +package test.atriasoft.karideo; import java.util.Map; -import org.kar.archidata.tools.JWTWrapper; +import org.atriasoft.archidata.filter.PartRight; +import org.atriasoft.archidata.tools.JWTWrapper; public class Common { - static String USER_TOKEN = JWTWrapper.createJwtTestToken(16512, "test_user_login", "KarAuth", "karideo", Map.of("karideo", Map.of("USER", Boolean.TRUE))); - static String ADMIN_TOKEN = JWTWrapper.createJwtTestToken(16512, "test_admin_login", "KarAuth", "karideo", Map.of("karideo", Map.of("USER", Boolean.TRUE, "ADMIN", Boolean.TRUE))); + static String USER_TOKEN = JWTWrapper.createJwtTestToken(16512, "test_user_login", "KarAuth", "karideo", Map.of("karideo", Map.of("USER", PartRight.READ))); + static String ADMIN_TOKEN = JWTWrapper.createJwtTestToken(16512, "test_admin_login", "KarAuth", "karideo", Map.of("karideo", Map.of("USER", PartRight.READ_WRITE, "ADMIN", PartRight.READ_WRITE))); } diff --git a/back/test/src/test/kar/karideo/ConfigureDb.java b/back/test/src/test/atriasoft/karideo/ConfigureDb.java similarity index 88% rename from back/test/src/test/kar/karideo/ConfigureDb.java rename to back/test/src/test/atriasoft/karideo/ConfigureDb.java index b116ed9..40b526f 100644 --- a/back/test/src/test/kar/karideo/ConfigureDb.java +++ b/back/test/src/test/atriasoft/karideo/ConfigureDb.java @@ -1,18 +1,18 @@ -package test.kar.karideo; +package test.atriasoft.karideo; import java.io.IOException; import java.util.List; -import org.kar.archidata.dataAccess.DBAccess; -import org.kar.archidata.db.DbConfig; -import org.kar.archidata.db.DbIoFactory; -import org.kar.archidata.exception.DataAccessException; -import org.kar.archidata.tools.ConfigBaseVariable; -import org.kar.karideo.model.Media; -import org.kar.karideo.model.Season; -import org.kar.karideo.model.Series; -import org.kar.karideo.model.Type; -import org.kar.karideo.model.UserKarideo; +import org.atriasoft.archidata.dataAccess.DBAccess; +import org.atriasoft.archidata.db.DbConfig; +import org.atriasoft.archidata.db.DbIoFactory; +import org.atriasoft.archidata.exception.DataAccessException; +import org.atriasoft.archidata.tools.ConfigBaseVariable; +import org.atriasoft.karideo.model.Media; +import org.atriasoft.karideo.model.Season; +import org.atriasoft.karideo.model.Series; +import org.atriasoft.karideo.model.Type; +import org.atriasoft.karideo.model.UserKarideo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/test/src/test/kar/karideo/StepwiseExtension.java b/back/test/src/test/atriasoft/karideo/StepwiseExtension.java similarity index 98% rename from back/test/src/test/kar/karideo/StepwiseExtension.java rename to back/test/src/test/atriasoft/karideo/StepwiseExtension.java index 66eb7cb..8890268 100644 --- a/back/test/src/test/kar/karideo/StepwiseExtension.java +++ b/back/test/src/test/atriasoft/karideo/StepwiseExtension.java @@ -1,4 +1,4 @@ -package test.kar.karideo; +package test.atriasoft.karideo; import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; diff --git a/back/test/src/test/kar/karideo/TestBase.java b/back/test/src/test/atriasoft/karideo/TestBase.java similarity index 90% rename from back/test/src/test/kar/karideo/TestBase.java rename to back/test/src/test/atriasoft/karideo/TestBase.java index 2331adb..6307edb 100644 --- a/back/test/src/test/kar/karideo/TestBase.java +++ b/back/test/src/test/atriasoft/karideo/TestBase.java @@ -1,4 +1,4 @@ -package test.kar.karideo; +package test.atriasoft.karideo; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -6,8 +6,8 @@ import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; -import org.kar.archidata.tools.ConfigBaseVariable; -import org.kar.archidata.tools.RESTApi; +import org.atriasoft.archidata.tools.ConfigBaseVariable; +import org.atriasoft.archidata.tools.RESTApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/back/test/src/test/kar/karideo/TestHealthCheck.java b/back/test/src/test/atriasoft/karideo/TestHealthCheck.java similarity index 70% rename from back/test/src/test/kar/karideo/TestHealthCheck.java rename to back/test/src/test/atriasoft/karideo/TestHealthCheck.java index 23d5deb..f15faf7 100644 --- a/back/test/src/test/kar/karideo/TestHealthCheck.java +++ b/back/test/src/test/atriasoft/karideo/TestHealthCheck.java @@ -1,6 +1,4 @@ -package test.kar.karideo; - -import java.io.IOException; +package test.atriasoft.karideo; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; @@ -10,10 +8,10 @@ import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; -import org.kar.archidata.exception.RESTErrorResponseException; -import org.kar.archidata.tools.ConfigBaseVariable; -import org.kar.archidata.tools.RESTApi; -import org.kar.karideo.api.HealthCheck.HealthResult; +import org.atriasoft.archidata.exception.RESTErrorResponseException; +import org.atriasoft.archidata.tools.ConfigBaseVariable; +import org.atriasoft.archidata.tools.RESTApi; +import org.atriasoft.karideo.api.HealthCheck.HealthResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,29 +25,22 @@ public class TestHealthCheck { @BeforeAll public static void configureWebServer() throws Exception { + ConfigureDb.configure(); LOGGER.info("configure server ..."); webInterface = new WebLauncherTest(); - LOGGER.info("Create DB"); - try { - webInterface.migrateDB(); - } catch (final Exception ex) { - ex.printStackTrace(); - LOGGER.error("Detect an error: {}", ex.getMessage()); - } LOGGER.info("Start REST (BEGIN)"); webInterface.process(); LOGGER.info("Start REST (DONE)"); api = new RESTApi(ConfigBaseVariable.apiAdress); + api.setToken(Common.ADMIN_TOKEN); } @AfterAll - public static void stopWebServer() throws InterruptedException, IOException { + public static void stopWebServer() throws Exception { LOGGER.info("Kill the web server"); webInterface.stop(); webInterface = null; - LOGGER.info("Remove the test db"); - // DBEntry.closeAllForceMode(); - ConfigBaseVariable.clearAllValue(); + ConfigureDb.clear(); } @Order(1) diff --git a/back/test/src/test/kar/karideo/WebLauncherTest.java b/back/test/src/test/atriasoft/karideo/WebLauncherTest.java similarity index 75% rename from back/test/src/test/kar/karideo/WebLauncherTest.java rename to back/test/src/test/atriasoft/karideo/WebLauncherTest.java index 43789e3..dd78d36 100755 --- a/back/test/src/test/kar/karideo/WebLauncherTest.java +++ b/back/test/src/test/atriasoft/karideo/WebLauncherTest.java @@ -1,7 +1,7 @@ -package test.kar.karideo; +package test.atriasoft.karideo; -import org.kar.karideo.WebLauncher; +import org.atriasoft.karideo.WebLauncher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/front/index.html b/front/index.html index 9634717..7426d26 100644 --- a/front/index.html +++ b/front/index.html @@ -2,6 +2,7 @@ + Karideo diff --git a/front/package.json b/front/package.json index 252a639..84b115f 100644 --- a/front/package.json +++ b/front/package.json @@ -29,64 +29,66 @@ "*.{ts,tsx,js,jsx,json}": "prettier --write" }, "dependencies": { + "react-speech-recognition": "4.0.0", + "regenerator-runtime": "0.14.1", "@locator/babel-jsx": "0.4.4", "@trivago/prettier-plugin-sort-imports": "5.2.2", - "@chakra-ui/cli": "3.8.1", - "@chakra-ui/react": "3.8.1", + "@chakra-ui/cli": "3.16.0", + "@chakra-ui/react": "3.16.0", "@emotion/react": "11.14.0", "allotment": "1.20.3", "css-mediaquery": "0.1.2", "dayjs": "1.11.13", "history": "5.3.0", - "next-themes": "^0.4.4", - "react": "19.0.0", - "react-dom": "19.0.0", + "next-themes": "^0.4.6", + "react": "19.1.0", + "react-dom": "19.1.0", "react-error-boundary": "5.0.0", "react-icons": "5.5.0", - "react-router-dom": "7.2.0", - "react-select": "5.10.0", + "react-router-dom": "7.5.0", + "react-select": "5.10.1", "react-use": "17.6.0", "zod": "3.24.2", "zustand": "5.0.3" }, "devDependencies": { "@chakra-ui/styled-system": "^2.12.0", - "@playwright/test": "1.50.1", - "@storybook/addon-actions": "8.5.8", - "@storybook/addon-essentials": "8.5.8", - "@storybook/addon-links": "8.5.8", - "@storybook/addon-mdx-gfm": "8.5.8", - "@storybook/react": "8.5.8", - "@storybook/react-vite": "8.5.8", - "@storybook/theming": "8.5.8", + "@playwright/test": "1.51.1", + "@storybook/addon-actions": "8.6.12", + "@storybook/addon-essentials": "8.6.12", + "@storybook/addon-links": "8.6.12", + "@storybook/addon-mdx-gfm": "8.6.12", + "@storybook/react": "8.6.12", + "@storybook/react-vite": "8.6.12", + "@storybook/theming": "8.6.12", "@testing-library/jest-dom": "6.6.3", - "@testing-library/react": "16.2.0", + "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", "@trivago/prettier-plugin-sort-imports": "5.2.2", "@types/jest": "29.5.14", - "@types/node": "22.13.5", - "@types/react": "19.0.10", - "@types/react-dom": "19.0.4", - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", + "@types/node": "22.14.1", + "@types/react": "19.1.2", + "@types/react-dom": "19.1.2", + "@typescript-eslint/eslint-plugin": "8.30.1", + "@typescript-eslint/parser": "8.30.1", "@vitejs/plugin-react": "4.3.4", - "eslint": "9.21.0", + "eslint": "9.24.0", "eslint-plugin-import": "2.31.0", - "eslint-plugin-react": "7.37.4", - "eslint-plugin-react-hooks": "5.1.0", - "eslint-plugin-storybook": "0.11.3", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-storybook": "0.12.0", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", - "knip": "5.44.5", - "lint-staged": "15.4.3", - "npm-check-updates": "^17.1.15", - "prettier": "3.5.2", - "puppeteer": "24.2.1", - "react-is": "19.0.0", - "storybook": "8.5.8", + "knip": "5.50.3", + "lint-staged": "15.5.1", + "npm-check-updates": "^17.1.18", + "prettier": "3.5.3", + "puppeteer": "24.6.1", + "react-is": "19.1.0", + "storybook": "8.6.12", "ts-node": "10.9.2", - "typescript": "5.7.3", - "vite": "6.1.1", - "vitest": "3.0.6" + "typescript": "5.8.3", + "vite": "6.2.6", + "vitest": "3.1.1" } } diff --git a/front/pnpm-lock.yaml b/front/pnpm-lock.yaml index c749768..cdcf74e 100644 --- a/front/pnpm-lock.yaml +++ b/front/pnpm-lock.yaml @@ -9,23 +9,23 @@ importers: .: dependencies: '@chakra-ui/cli': - specifier: 3.8.1 - version: 3.8.1(@chakra-ui/react@3.8.1(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + specifier: 3.16.0 + version: 3.16.0(@chakra-ui/react@3.16.0(@emotion/react@11.14.0(@types/react@19.1.2)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) '@chakra-ui/react': - specifier: 3.8.1 - version: 3.8.1(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 3.16.0 + version: 3.16.0(@emotion/react@11.14.0(@types/react@19.1.2)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@emotion/react': specifier: 11.14.0 - version: 11.14.0(@types/react@19.0.10)(react@19.0.0) + version: 11.14.0(@types/react@19.1.2)(react@19.1.0) '@locator/babel-jsx': specifier: 0.4.4 - version: 0.4.4(@babel/core@7.26.8)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + version: 0.4.4(@babel/core@7.26.8)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) '@trivago/prettier-plugin-sort-imports': specifier: 5.2.2 - version: 5.2.2(prettier@3.5.2) + version: 5.2.2(prettier@3.5.3) allotment: specifier: 1.20.3 - version: 1.20.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.20.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) css-mediaquery: specifier: 0.1.2 version: 0.1.2 @@ -36,69 +36,75 @@ importers: specifier: 5.3.0 version: 5.3.0 next-themes: - specifier: ^0.4.4 - version: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: - specifier: 19.0.0 - version: 19.0.0 + specifier: 19.1.0 + version: 19.1.0 react-dom: - specifier: 19.0.0 - version: 19.0.0(react@19.0.0) + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) react-error-boundary: specifier: 5.0.0 - version: 5.0.0(react@19.0.0) + version: 5.0.0(react@19.1.0) react-icons: specifier: 5.5.0 - version: 5.5.0(react@19.0.0) + version: 5.5.0(react@19.1.0) react-router-dom: - specifier: 7.2.0 - version: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 7.5.0 + version: 7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react-select: - specifier: 5.10.0 - version: 5.10.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 5.10.1 + version: 5.10.1(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-speech-recognition: + specifier: 4.0.0 + version: 4.0.0(react@19.1.0) react-use: specifier: 17.6.0 - version: 17.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 17.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + regenerator-runtime: + specifier: 0.14.1 + version: 0.14.1 zod: specifier: 3.24.2 version: 3.24.2 zustand: specifier: 5.0.3 - version: 5.0.3(@types/react@19.0.10)(react@19.0.0) + version: 5.0.3(@types/react@19.1.2)(react@19.1.0) devDependencies: '@chakra-ui/styled-system': specifier: ^2.12.0 - version: 2.12.0(react@19.0.0) + version: 2.12.0(react@19.1.0) '@playwright/test': - specifier: 1.50.1 - version: 1.50.1 + specifier: 1.51.1 + version: 1.51.1 '@storybook/addon-actions': - specifier: 8.5.8 - version: 8.5.8(storybook@8.5.8(prettier@3.5.2)) + specifier: 8.6.12 + version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/addon-essentials': - specifier: 8.5.8 - version: 8.5.8(@types/react@19.0.10)(storybook@8.5.8(prettier@3.5.2)) + specifier: 8.6.12 + version: 8.6.12(@types/react@19.1.2)(storybook@8.6.12(prettier@3.5.3)) '@storybook/addon-links': - specifier: 8.5.8 - version: 8.5.8(react@19.0.0)(storybook@8.5.8(prettier@3.5.2)) + specifier: 8.6.12 + version: 8.6.12(react@19.1.0)(storybook@8.6.12(prettier@3.5.3)) '@storybook/addon-mdx-gfm': - specifier: 8.5.8 - version: 8.5.8(storybook@8.5.8(prettier@3.5.2)) + specifier: 8.6.12 + version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/react': - specifier: 8.5.8 - version: 8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2))(typescript@5.7.3) + specifier: 8.6.12 + version: 8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-vite': - specifier: 8.5.8 - version: 8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.34.6)(storybook@8.5.8(prettier@3.5.2))(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0)) + specifier: 8.6.12 + version: 8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.34.6)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0)) '@storybook/theming': - specifier: 8.5.8 - version: 8.5.8(storybook@8.5.8(prettier@3.5.2)) + specifier: 8.6.12 + version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@testing-library/jest-dom': specifier: 6.6.3 version: 6.6.3 '@testing-library/react': - specifier: 16.2.0 - version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 16.3.0 + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@testing-library/user-event': specifier: 14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) @@ -106,77 +112,77 @@ importers: specifier: 29.5.14 version: 29.5.14 '@types/node': - specifier: 22.13.5 - version: 22.13.5 + specifier: 22.14.1 + version: 22.14.1 '@types/react': - specifier: 19.0.10 - version: 19.0.10 + specifier: 19.1.2 + version: 19.1.2 '@types/react-dom': - specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.10) + specifier: 19.1.2 + version: 19.1.2(@types/react@19.1.2) '@typescript-eslint/eslint-plugin': - specifier: 8.24.1 - version: 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + specifier: 8.30.1 + version: 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: 8.24.1 - version: 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + specifier: 8.30.1 + version: 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) '@vitejs/plugin-react': specifier: 4.3.4 - version: 4.3.4(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0)) + version: 4.3.4(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0)) eslint: - specifier: 9.21.0 - version: 9.21.0(jiti@2.4.2) + specifier: 9.24.0 + version: 9.24.0(jiti@2.4.2) eslint-plugin-import: specifier: 2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2)) + version: 2.31.0(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react: - specifier: 7.37.4 - version: 7.37.4(eslint@9.21.0(jiti@2.4.2)) + specifier: 7.37.5 + version: 7.37.5(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react-hooks: - specifier: 5.1.0 - version: 5.1.0(eslint@9.21.0(jiti@2.4.2)) + specifier: 5.2.0 + version: 5.2.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-storybook: - specifier: 0.11.3 - version: 0.11.3(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + specifier: 0.12.0 + version: 0.12.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + version: 29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 knip: - specifier: 5.44.5 - version: 5.44.5(@types/node@22.13.5)(typescript@5.7.3) + specifier: 5.50.3 + version: 5.50.3(@types/node@22.14.1)(typescript@5.8.3) lint-staged: - specifier: 15.4.3 - version: 15.4.3 + specifier: 15.5.1 + version: 15.5.1 npm-check-updates: - specifier: ^17.1.15 - version: 17.1.15 + specifier: ^17.1.18 + version: 17.1.18 prettier: - specifier: 3.5.2 - version: 3.5.2 + specifier: 3.5.3 + version: 3.5.3 puppeteer: - specifier: 24.2.1 - version: 24.2.1(typescript@5.7.3) + specifier: 24.6.1 + version: 24.6.1(typescript@5.8.3) react-is: - specifier: 19.0.0 - version: 19.0.0 + specifier: 19.1.0 + version: 19.1.0 storybook: - specifier: 8.5.8 - version: 8.5.8(prettier@3.5.2) + specifier: 8.6.12 + version: 8.6.12(prettier@3.5.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@22.13.5)(typescript@5.7.3) + version: 10.9.2(@types/node@22.14.1)(typescript@5.8.3) typescript: - specifier: 5.7.3 - version: 5.7.3 + specifier: 5.8.3 + version: 5.8.3 vite: - specifier: 6.1.1 - version: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + specifier: 6.2.6 + version: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) vitest: - specifier: 3.0.6 - version: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@20.0.3)(yaml@2.7.0) + specifier: 3.1.1 + version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(jsdom@20.0.3)(yaml@2.7.0) packages: @@ -191,8 +197,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@ark-ui/react@4.9.1': - resolution: {integrity: sha512-grnfoSUrGxN0VMgtf4yvpMgin2T4ERINqYm3x/XKny+q2iIO76PD7yjNP7IW+CDmNxy3QPOidcvRiCyy6x0LGA==} + '@ark-ui/react@5.5.0': + resolution: {integrity: sha512-zLERNKOrf77K0OMOLoo5+jZQn9uXxYck56gBzx/zhW2SjFe0M2lE6VyaIiwgKGIqbGre59gD9/tyTsqO6bqARQ==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' @@ -845,14 +851,14 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@chakra-ui/cli@3.8.1': - resolution: {integrity: sha512-k4U6Ik9GFh3ntroVhlxRZzuQWiGXDFfMCa0js8qp7sfWoT7Vqyxc2uTiUB/+x3mGFhK7oaMYM5jTBkAs12rYcw==} + '@chakra-ui/cli@3.16.0': + resolution: {integrity: sha512-hQVsWWhGzgUF+KZGquVqhxlSoq28Dlv5w6+UheAOS9rXow0UKBzlvD/utUfMQeUcTp6P0rE54epV5tSQT13hDw==} hasBin: true peerDependencies: '@chakra-ui/react': '>=3.0.0-next.0' - '@chakra-ui/react@3.8.1': - resolution: {integrity: sha512-U1SIjSENiJ62tVKGq/fLDcQWSnzjVAsKCqNNIfg5RtPOP4y7j0k//n9HPsmGVLrBEJb5JGSTsudfFen0t/dHBQ==} + '@chakra-ui/react@3.16.0': + resolution: {integrity: sha512-NZLGQgIPr/hLeyBoQyUqzaru+RGrs4Zy1kGpnBNGnL2UrCLZryHvax/pdfqId8cJjhWPGxokJUTVcTTMPnN3Gg==} peerDependencies: '@emotion/react': '>=11' react: '>=18' @@ -866,11 +872,11 @@ packages: peerDependencies: react: '>=16.8.0' - '@clack/core@0.4.1': - resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} + '@clack/core@0.4.2': + resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==} - '@clack/prompts@0.9.1': - resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} + '@clack/prompts@0.10.1': + resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -920,290 +926,152 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1218,20 +1086,24 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.0': + resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.12.0': resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.21.0': - resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + '@eslint/js@9.24.0': + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -1245,9 +1117,6 @@ packages: '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - '@floating-ui/dom@1.6.12': - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} - '@floating-ui/dom@1.6.13': resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} @@ -1410,26 +1279,14 @@ packages: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - '@nodelib/fs.scandir@4.0.1': - resolution: {integrity: sha512-vAkI715yhnmiPupY+dq+xenu5Tdf2TBQ66jLvBIcCddtz+5Q8LbMKaf9CIJJreez8fQ8fgaY+RaywQx8RJIWpw==} - engines: {node: '>=18.18.0'} - '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - '@nodelib/fs.stat@4.0.0': - resolution: {integrity: sha512-ctr6bByzksKRCV0bavi8WoQevU6plSp2IkllIsEqaiKe2mwNNnaluhnRhcsgGZHrrHk57B3lf95MkLMO3STYcg==} - engines: {node: '>=18.18.0'} - '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nodelib/fs.walk@3.0.1': - resolution: {integrity: sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw==} - engines: {node: '>=18.18.0'} - '@pandacss/is-valid-prop@0.41.0': resolution: {integrity: sha512-BE6h6CsJk14ugIRrsazJtN3fcg+KDFRat1Bs93YFKH6jd4DOb1yUyVvC70jKqPVvg70zEcV8acZ7VdcU5TLu+w==} @@ -1437,13 +1294,13 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.50.1': - resolution: {integrity: sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==} + '@playwright/test@1.51.1': + resolution: {integrity: sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==} engines: {node: '>=18'} hasBin: true - '@puppeteer/browsers@2.7.1': - resolution: {integrity: sha512-MK7rtm8JjaxPN7Mf1JdZIZKPD2Z+W7osvrC1vjpvfOX1K0awDIHYbNi89f7eotp7eMUn2shWnt03HwVbriXtKQ==} + '@puppeteer/browsers@2.10.0': + resolution: {integrity: sha512-HdHF4rny4JCvIcm7V1dpvpctIGqM3/Me255CB44vW7hDG1zYMmcBMjpNqZEDxdCfXGLkx5kP0+Jz5DUS+ukqtA==} engines: {node: '>=18'} hasBin: true @@ -1567,113 +1424,105 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@snyk/github-codeowners@1.1.0': - resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} - engines: {node: '>=8.10'} - hasBin: true - - '@storybook/addon-actions@8.5.8': - resolution: {integrity: sha512-7J0NAz+WDw1NmvmKIh0Qr5cxgVRDPFC5fmngbDNxedk147TkwrgmqOypgEi/SAksHbTWxJclbimoqdcsNtWffA==} + '@storybook/addon-actions@8.6.12': + resolution: {integrity: sha512-B5kfiRvi35oJ0NIo53CGH66H471A3XTzrfaa6SxXEJsgxxSeKScG5YeXcCvLiZfvANRQ7QDsmzPUgg0o3hdMXw==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-backgrounds@8.5.8': - resolution: {integrity: sha512-TsQFagQ95+d7H3/+qUZKI2B0SEK8iu6CV13cyry9Dm59nn2bBylFrwx4I3xDQUOWMiSF6QIRjCYzxKQ/jJ5OEg==} + '@storybook/addon-backgrounds@8.6.12': + resolution: {integrity: sha512-lmIAma9BiiCTbJ8YfdZkXjpnAIrOUcgboLkt1f6XJ78vNEMnLNzD9gnh7Tssz1qrqvm34v9daDjIb+ggdiKp3Q==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-controls@8.5.8': - resolution: {integrity: sha512-3iifI8mBGPsiPmV9eAYk+tK9i+xuWhVsa+sXz01xTZ/0yoOREpp972hka86mtCqdDTOJIpzh1LmxvB218OssvQ==} + '@storybook/addon-controls@8.6.12': + resolution: {integrity: sha512-9VSRPJWQVb9wLp21uvpxDGNctYptyUX0gbvxIWOHMH3R2DslSoq41lsC/oQ4l4zSHVdL+nq8sCTkhBxIsjKqdQ==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-docs@8.5.8': - resolution: {integrity: sha512-zKVUqE0UGiq1gZtY2TX57SYB4RIsdlbTDxKW2JZ9HhZGLvZ5Qb7AvdiKTZxfOepGhuw3UcNXH/zCFkFCTJifMw==} + '@storybook/addon-docs@8.6.12': + resolution: {integrity: sha512-kEezQjAf/p3SpDzLABgg4fbT48B6dkT2LiZCKTRmCrJVtuReaAr4R9MMM6Jsph6XjbIj/SvOWf3CMeOPXOs9sg==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-essentials@8.5.8': - resolution: {integrity: sha512-sCNvMZqL6dywnyHuZBrWl4f6QXsvpJHOioL3wJJKaaRMZmctbFmS0u6J8TQjmgZhQfyRzuJuhr1gJg9oeqp6AA==} + '@storybook/addon-essentials@8.6.12': + resolution: {integrity: sha512-Y/7e8KFlttaNfv7q2zoHMPdX6hPXHdsuQMAjYl5NG9HOAJREu4XBy4KZpbcozRe4ApZ78rYsN/MO1EuA+bNMIA==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-highlight@8.5.8': - resolution: {integrity: sha512-kkldtFrY0oQJY/vfNLkV66hVgtp66OO8T68KoZFsmUz4a3iYgzDS8WF+Av2/9jthktFvMchjFr8NKOno9YBGIg==} + '@storybook/addon-highlight@8.6.12': + resolution: {integrity: sha512-9FITVxdoycZ+eXuAZL9ElWyML/0fPPn9UgnnAkrU7zkMi+Segq/Tx7y+WWanC5zfWZrXAuG6WTOYEXeWQdm//w==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-links@8.5.8': - resolution: {integrity: sha512-nLfcWhqDCTaEB/zPjzdN+FtsJ3WnvrRE7Uq+UZHF/HDqt7EXicUYCnbzHIF6ReyNBFklr48O/RhotDu9cyUDlw==} + '@storybook/addon-links@8.6.12': + resolution: {integrity: sha512-AfKujFHoAxhxq4yu+6NwylltS9lf5MPs1eLLXvOlwo3l7Y/c68OdxJ7j68vLQhs9H173WVYjKyjbjFxJWf/YYg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.8 + storybook: ^8.6.12 peerDependenciesMeta: react: optional: true - '@storybook/addon-mdx-gfm@8.5.8': - resolution: {integrity: sha512-jUq2CsZnSqIHpbMfsV4P+H+UTdvekYAb1paB5xRFEEj53WFKKAnc51VCY3yJ/Jwn/NuicDOXHM/GHLp/+1cr/w==} + '@storybook/addon-mdx-gfm@8.6.12': + resolution: {integrity: sha512-OKI5+O8xyK8axGPFwkl38NGJ6Rjf7kyhiBPxw5NuHOjOnU/FL4Pw3QmY47TT96TVws27vP3gF5+FX8lj3Dd3rQ==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-measure@8.5.8': - resolution: {integrity: sha512-xf84ByTRkFPoNSck6Z5OJ0kXTYAYgmg/0Ke0eCY/CNgwh7lfjYQBrcjuKiYZ6jyRUMLdysXzIfF9/2MeFqLfIg==} + '@storybook/addon-measure@8.6.12': + resolution: {integrity: sha512-tACmwqqOvutaQSduw8SMb62wICaT1rWaHtMN3vtWXuxgDPSdJQxLP+wdVyRYMAgpxhLyIO7YRf++Hfha9RHgFg==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-outline@8.5.8': - resolution: {integrity: sha512-NAC9VWZFg2gwvduzJRVAtxPeQfJjB8xfDDgcGjgLOCSQkZDDOmGVdLXf78pykMQKyuu/0YZ989KufAac6kRG5g==} + '@storybook/addon-outline@8.6.12': + resolution: {integrity: sha512-1ylwm+n1s40S91No0v9T4tCjZORu3GbnjINlyjYTDLLhQHyBQd3nWR1Y1eewU4xH4cW9SnSLcMQFS/82xHqU6A==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-toolbars@8.5.8': - resolution: {integrity: sha512-AfGdMNBp+vOjyiFKlOyUFLIU0kN1QF4PhVBqd0vYkWAk2w9n6a/ZlG0TcJGe7K5+bcvmZDAerYMKbDMSeg9bAw==} + '@storybook/addon-toolbars@8.6.12': + resolution: {integrity: sha512-HEcSzo1DyFtIu5/ikVOmh5h85C1IvK9iFKSzBR6ice33zBOaehVJK+Z5f487MOXxPsZ63uvWUytwPyViGInj+g==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/addon-viewport@8.5.8': - resolution: {integrity: sha512-SdoRb4bH99Knj2R+rTcMQQxHrtcIO1GLzTFitAefxBE1OUkq8FNLHMHd0Ip/sCQGLW/5F03U70R2uh7SkhBBYA==} + '@storybook/addon-viewport@8.6.12': + resolution: {integrity: sha512-EXK2LArAnABsPP0leJKy78L/lbMWow+EIJfytEP5fHaW4EhMR6h7Hzaqzre6U0IMMr/jVFa1ci+m0PJ0eQc2bw==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/blocks@8.5.8': - resolution: {integrity: sha512-O6tJDJM83fDm3ZP1+lTf24l7HOTzSRXkkMDD7zB/JHixzlj9p6wI4UQc2lplLadDCa5ya1IwyE7zUDN/0UfC5Q==} + '@storybook/blocks@8.6.12': + resolution: {integrity: sha512-DohlTq6HM1jDbHYiXL4ZvZ00VkhpUp5uftzj/CZDLY1fYHRjqtaTwWm2/OpceivMA8zDitLcq5atEZN+f+siTg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^8.5.8 + storybook: ^8.6.12 peerDependenciesMeta: react: optional: true react-dom: optional: true - '@storybook/builder-vite@8.5.8': - resolution: {integrity: sha512-nm07wXP4MN7HlWqLRomSFHibwrwiY7V4kTohgsXSjTUod0J+xY+XvmkM4YRK2QYcUgVesG+Q2q3Q5NHof07sfg==} + '@storybook/builder-vite@8.6.12': + resolution: {integrity: sha512-Gju21ud/3Qw4v2vLNaa5SuJECsI9ICNRr2G0UyCCzRvCHg8jpA9lDReu2NqhLDyFIuDG+ZYT38gcaHEUoNQ8KQ==} peerDependencies: - storybook: ^8.5.8 + storybook: ^8.6.12 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - '@storybook/components@8.5.8': - resolution: {integrity: sha512-PPEMqWPXn7rX+qISaOOv9CDSuuvG538f0+4M5Ppq2LwpjXecgOG5ktqJF0ZqxmTytT+RpEaJmgjGW0dMAKZswA==} + '@storybook/components@8.6.12': + resolution: {integrity: sha512-FiaE8xvCdvKC2arYusgtlDNZ77b8ysr8njAYQZwwaIHjy27TbR2tEpLDCmUwSbANNmivtc/xGEiDDwcNppMWlQ==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/core@8.5.8': - resolution: {integrity: sha512-OT02DQhkGpBgn5P+nZOZmbzxqubC4liVqbhpjp/HOGi5cOA3+fCJzDJeSDTu+pPh7dZnopC4XnR+5dWjtOJHdA==} + '@storybook/core@8.6.12': + resolution: {integrity: sha512-t+ZuDzAlsXKa6tLxNZT81gEAt4GNwsKP/Id2wluhmUWD/lwYW0uum1JiPUuanw8xD6TdakCW/7ULZc7aQUBLCQ==} peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: prettier: optional: true - '@storybook/csf-plugin@8.5.8': - resolution: {integrity: sha512-9p+TFutbvtPYEmg14UsvqBDWKP/p/+OkIdi+gkwCMw0yiJF/+7ErMHDB0vr5SpJpU7SFQmfpY2c/LaglEtaniw==} + '@storybook/csf-plugin@8.6.12': + resolution: {integrity: sha512-6s8CnP1aoKPb3XtC0jRLUp8M5vTA8RhGAwQDKUsFpCC7g89JR9CaKs9FY2ZSzsNbjR15uASi7b3K8BzeYumYQg==} peerDependencies: - storybook: ^8.5.8 - - '@storybook/csf@0.1.12': - resolution: {integrity: sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==} + storybook: ^8.6.12 '@storybook/csf@0.1.13': resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} @@ -1688,44 +1537,44 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - '@storybook/manager-api@8.5.8': - resolution: {integrity: sha512-ik3yikvYxAJMDFg0s3Pm7hZWucAlkFaaO7e2RlfOctaJFdaEi3evR4RS7GdmS38uKBEk31RC7x+nnIJkqEC59A==} + '@storybook/manager-api@8.6.12': + resolution: {integrity: sha512-O0SpISeJLNTQvhSBOsWzzkCgs8vCjOq1578rwqHlC6jWWm4QmtfdyXqnv7rR1Hk08kQ+Dzqh0uhwHx0nfwy4nQ==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/preview-api@8.5.8': - resolution: {integrity: sha512-HJoz2o28VVprnU5OG6JO6CHrD3ah6qVPWixbnmyUKd0hOYF5dayK5ptmeLyUpYX56Eb2KoYcuVaeQqAby4RkNw==} + '@storybook/preview-api@8.6.12': + resolution: {integrity: sha512-84FE3Hrs0AYKHqpDZOwx1S/ffOfxBdL65lhCoeI8GoWwCkzwa9zEP3kvXBo/BnEDO7nAfxvMhjASTZXbKRJh5Q==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/react-dom-shim@8.5.8': - resolution: {integrity: sha512-UT/kGJHPW+HLNCTmI1rV1to+dUZuXKUTaRv2wZ2BUq2/gjIuePyqQZYVQeb0LkZbuH2uviLrPfXpS5d3/RSUJw==} + '@storybook/react-dom-shim@8.6.12': + resolution: {integrity: sha512-51QvoimkBzYs8s3rCYnY5h0cFqLz/Mh0vRcughwYaXckWzDBV8l67WBO5Xf5nBsukCbWyqBVPpEQLww8s7mrLA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.8 + storybook: ^8.6.12 - '@storybook/react-vite@8.5.8': - resolution: {integrity: sha512-Fa3WjqMsY/52p8IHX52IofbvQpoh88cFA/SQ8Q6RUGCNvUVYG/l025pBYbm+PhAkKDQXTirRul9CwA66gGR9zA==} + '@storybook/react-vite@8.6.12': + resolution: {integrity: sha512-UA2Kule99oyFgHdhcuhrRwCKyWu/yMbqbl9U7NwowFHNwWWFjVMMir/AmfShb/H1C1DQ3LqOad6/QwJyPLjP8g==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.5.8 + '@storybook/test': 8.6.12 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.8 + storybook: ^8.6.12 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: '@storybook/test': optional: true - '@storybook/react@8.5.8': - resolution: {integrity: sha512-QYgKpInR2FLiJHsRoGKCzNhKTRNjOssbLZVd3B0ZABUee+AjkwE0Pey7x2XaNAcp9PxSjQXEPGu+DlaP4BWw2Q==} + '@storybook/react@8.6.12': + resolution: {integrity: sha512-NzxlHLA5DkDgZM/dMwTYinuzRs6rsUPmlqP+NIv6YaciQ4NGnTYyOC7R/SqI6HHFm8ZZ5eMYvpfiFmhZ9rU+rQ==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.5.8 + '@storybook/test': 8.6.12 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.8 + storybook: ^8.6.12 typescript: '>= 4.2.x' peerDependenciesMeta: '@storybook/test': @@ -1733,8 +1582,8 @@ packages: typescript: optional: true - '@storybook/theming@8.5.8': - resolution: {integrity: sha512-/Rm6BV778sCT+3Ok861VYmw9BlEV5zcCq2zg5TOVuk8HqZw7H7VHtubVsjukEuhveYCs+oF+i2tv/II6jh6jdg==} + '@storybook/theming@8.6.12': + resolution: {integrity: sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 @@ -1749,8 +1598,8 @@ packages: resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.2.0': - resolution: {integrity: sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==} + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -1880,14 +1729,14 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.13.5': - resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} + '@types/node@22.14.1': + resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/react-dom@19.0.4': - resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + '@types/react-dom@19.1.2': + resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} peerDependencies: '@types/react': ^19.0.0 @@ -1896,8 +1745,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@19.0.10': - resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + '@types/react@19.1.2': + resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} @@ -1923,80 +1772,80 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.24.1': - resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} + '@typescript-eslint/eslint-plugin@8.30.1': + resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.24.1': - resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} + '@typescript-eslint/parser@8.30.1': + resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.24.0': - resolution: {integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==} + '@typescript-eslint/scope-manager@8.28.0': + resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.24.1': - resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} + '@typescript-eslint/scope-manager@8.30.1': + resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.24.1': - resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} + '@typescript-eslint/type-utils@8.30.1': + resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.24.0': - resolution: {integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==} + '@typescript-eslint/types@8.28.0': + resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.24.1': - resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} + '@typescript-eslint/types@8.30.1': + resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.24.0': - resolution: {integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==} + '@typescript-eslint/typescript-estree@8.28.0': + resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.24.1': - resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} + '@typescript-eslint/typescript-estree@8.30.1': + resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.24.0': - resolution: {integrity: sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==} + '@typescript-eslint/utils@8.28.0': + resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.24.1': - resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} + '@typescript-eslint/utils@8.30.1': + resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.24.0': - resolution: {integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==} + '@typescript-eslint/visitor-keys@8.28.0': + resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.24.1': - resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} + '@typescript-eslint/visitor-keys@8.30.1': + resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@visulima/boxen@1.0.29': - resolution: {integrity: sha512-z+JkZVhUTKfAdM1vjILnWwAd75NFFZH0/4Y2ByYnXNroZq5fB9Qv316lyA4LI9DZgoFhxgwf9Z+HWw8tagLvWw==} + '@visulima/boxen@1.0.30': + resolution: {integrity: sha512-izo776RvDFeipY7tJspA0wFrcq/Ih0Qhe/zu6v7O4OlURy2ViFmy+2ZSUYTHSSwKrmVeZWrUUJSpaepZPLPMMQ==} engines: {node: '>=18.0.0 <=23.x'} os: [darwin, linux, win32] @@ -2006,11 +1855,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitest/expect@3.0.6': - resolution: {integrity: sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==} + '@vitest/expect@3.1.1': + resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} - '@vitest/mocker@3.0.6': - resolution: {integrity: sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==} + '@vitest/mocker@3.1.1': + resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -2020,224 +1869,233 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.6': - resolution: {integrity: sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==} + '@vitest/pretty-format@3.1.1': + resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} - '@vitest/runner@3.0.6': - resolution: {integrity: sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==} + '@vitest/runner@3.1.1': + resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} - '@vitest/snapshot@3.0.6': - resolution: {integrity: sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==} + '@vitest/snapshot@3.1.1': + resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} - '@vitest/spy@3.0.6': - resolution: {integrity: sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==} + '@vitest/spy@3.1.1': + resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} - '@vitest/utils@3.0.6': - resolution: {integrity: sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==} + '@vitest/utils@3.1.1': + resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} '@xobotyi/scrollbar-width@1.9.5': resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - '@zag-js/accordion@0.82.1': - resolution: {integrity: sha512-DWaElpm6RhntW8zVPMfd+s461FuXi6rv4pDPpXb4xCAJ0KTkBzS6PFxoBLL+11Mjv9XioaBoJatIGOCF8GAtTA==} + '@zag-js/accordion@1.8.2': + resolution: {integrity: sha512-JszESCOvftl3dG6lEPjZp2p3+0VN0fwMnW+1jhWwMEe5MZ0y0IrcXww2dxet1ln+w5ViRdOTeDR07idbDKYAYg==} - '@zag-js/anatomy@0.82.1': - resolution: {integrity: sha512-wpgU7LyU9St3o/ft8Nkundi7MkW37vN1hYc2E7VA/R6mun0qiANsEf83ymIlAYnovLC6WUlBso9xwqejr6wRCg==} + '@zag-js/anatomy@1.8.2': + resolution: {integrity: sha512-F88Q+Bo1KOFZPHLffOqiuemkgZJbtspQuyOJcWb0bL7Lc1pYC4DIpIj26bcXT8xICDNcwR877hI0Wko//ZgTVA==} - '@zag-js/aria-hidden@0.82.1': - resolution: {integrity: sha512-KSz9oMY9rn1N3k3tFTKHlU66eQf8XZ/gy/ex27J0ykZoaYJplWQerSZvVakbILeh+rtpvdiTNaSgrCAwYwvAPA==} + '@zag-js/aria-hidden@1.8.2': + resolution: {integrity: sha512-/SV23qfCWMbGdsNZ2pgmVqOv6a4yd/2+FAIRy/6bjZ8axBzhm7NvfDhqjZciN4JuMch82uafeTBZ7pObk/fU1g==} - '@zag-js/auto-resize@0.82.1': - resolution: {integrity: sha512-adOB7Y4p4i6b8GJv4V6qhlK1YRj4Ejs5I+eWFd8Rx535uQIcxEEVtpEAD5SRYg5PNk1ikaT+GCoHnTadGj6PuA==} + '@zag-js/auto-resize@1.8.2': + resolution: {integrity: sha512-Z+94iR/vbPixiifjF+pmOa1UtuM5TTnJqM7D+Ol3WenRrm+Urp4JWAcyaf76NRVWK51KwMwWLljeA6J0H3V6gQ==} - '@zag-js/avatar@0.82.1': - resolution: {integrity: sha512-XjRvDRmBxwy5OtIzlQOpf7zNk4g0b/uA7qZve5Hz0R7yWOu+NFlbFv0GsvRfgyYMCT5J0xBu271EG9FJq3QKyw==} + '@zag-js/avatar@1.8.2': + resolution: {integrity: sha512-PWhYVvXyOt+kdi2Vd6GfqGQQruh1TNylw6TzNbhPt3B6Fj6uNvQqfEsh6yNErfnCeaa4b/Q+48rM4b/t3DzM0g==} - '@zag-js/carousel@0.82.1': - resolution: {integrity: sha512-MO9+9oedxdKynxgvLLzXs+VQSOhu+GvsCLV4fBt7nMBMGIRHtRSzXHRNRkO0aqbsO/nKQ8TFH7GYzI1NqT/y4A==} + '@zag-js/carousel@1.8.2': + resolution: {integrity: sha512-ViPcVQFQfw8ry3i4m2HYixTfN5Km979TWtMnDKdDM3csXLOQJvfCIHtZ/08wWn1302zaDMQe72+p9jDqzqntMg==} - '@zag-js/checkbox@0.82.1': - resolution: {integrity: sha512-yD/h8ao/JTljEo+zthpKzTy/f9fqOlJ7Nd6psPoSKZy2MRGD0TDUbOjravb3icVgjTLCiaPVWMWdonny08Me6A==} + '@zag-js/checkbox@1.8.2': + resolution: {integrity: sha512-KWVKo2Cofs9bjKf9QN9d9UJ6jQFuKfTPT4smDIqhXo4MIFa5eOd6yxvwbgvLvBlvvr9I6Amm9T4e9XxFbyrHdA==} - '@zag-js/clipboard@0.82.1': - resolution: {integrity: sha512-r1r3vwozs+lyNgccR3OfmYAydP0cJbIHGsgDKGuempinqv6xIoptHOkFgWNd6Kxz/3MnxP+BMEy6fZzECXkhdQ==} + '@zag-js/clipboard@1.8.2': + resolution: {integrity: sha512-KwyFxLDPkEwjiI6zxRKG1gQk1q+lL1HN6nvGCMKRxoDtYVaY9VRxQ6mVNg2VUIecM8uuhRnkM1WHGrSTUcaFcQ==} - '@zag-js/collapsible@0.82.1': - resolution: {integrity: sha512-TuggUoXRVBOwACksi63TsN2rOukzUpe6oVMUvp9MaQaDbg9gpw0JzLTrdAaHfE+bhgXAb3EjN6wcZjq8zBctZQ==} + '@zag-js/collapsible@1.8.2': + resolution: {integrity: sha512-rtvR4WaMnjv0cW6f+wYqIKkRGhckqlY7nVYBUjGqIzlKq0VNzRgugS8qWpoqdupQJ9wyjusb/GXLOudqpdl1lw==} - '@zag-js/collection@0.82.1': - resolution: {integrity: sha512-uteM+xWZlWhRQe5biA5QWyva9PdzXONs+bpycUtZt8MakQgPmhW2whY9r1aW5NFVb/ScTwGAIGB3Eyc6Npz7Wg==} + '@zag-js/collection@1.8.2': + resolution: {integrity: sha512-GQ6bMscyX3R5wXct6pIMFNd9vm/Ofux7bAwdavp1RrYu/iMKRg/tLbJIOYMQ9VXpjbiOB+6f2GVtHAM0eYLb6A==} - '@zag-js/color-picker@0.82.1': - resolution: {integrity: sha512-/MShDVBFNnXResLzeyWyKApeHuB9rmUeJo3WD/Bl6rTwjmvVCKRYguIe1SQviOokMLjuAyh0YWXdKMQw0HvMqQ==} + '@zag-js/color-picker@1.8.2': + resolution: {integrity: sha512-WFuU5T99GPtqiD1MBZlurBjNMpHZQmbzaTgO6mdKQv3IKa2+I2jqXlnTnJbjTRmsF2DhAo45mEyGOvLwlTfTNA==} - '@zag-js/color-utils@0.82.1': - resolution: {integrity: sha512-BMSYcBeypGX0wCLszU2jxWBRUmd5/wPDJ59Y3Zwl9yNld0gtMnuBLSUeokMcG0UVQ/BxkyrWu3VDkKTUYKprqQ==} + '@zag-js/color-utils@1.8.2': + resolution: {integrity: sha512-6oB+oxCSQoJu8sw1POQNzFLRN1wFDR5b+DSincqBR1QoKLr5K4iYmwJZ7UySvDF8uZATaShvB/qVVxniUpZ17w==} - '@zag-js/combobox@0.82.1': - resolution: {integrity: sha512-Me3a0Sw4dTtmBRmbLGO/C1LJ4btZwbd5RLYnf8RPhEnqGJ5Z05i+ffWEe+SNBvpQO14njqBcF6P8VypVD/Ro1A==} + '@zag-js/combobox@1.8.2': + resolution: {integrity: sha512-jQo1cDtsUlBMPmBv/P7pUBHpxu19L+Pd5zXWOcdYXXMyFQg/KrW+PLS84G3yk2UCoH7ywKY25wFdMcOrqrTdUw==} - '@zag-js/core@0.82.1': - resolution: {integrity: sha512-Ux0fkt1PumcqLwExcEozCMEfKBxtd2JlnitXo4hR3lJW5q9G52FkgWDyPSrhblyTkX+7RgxViZTMnHxaXs99jg==} + '@zag-js/core@1.8.2': + resolution: {integrity: sha512-vZDvvXuoxKnVXqBS6H6ZGbfxRWaQ9DStVS/a+tLdP0pz05NJwyJIPSWOOHZo9XPDiN4j1mRaTVcSvNpuOSEDTw==} - '@zag-js/date-picker@0.82.1': - resolution: {integrity: sha512-f+4CV29+hcQ3Yw9hh0yyVRANONIUEWIrPS1fpnrrUNtIC0Y7f1Ajx+x089X9VxgQhwreK1sEwpnrL2vIqy+9+A==} + '@zag-js/date-picker@1.8.2': + resolution: {integrity: sha512-SnZgQOxUajnuQUDIcq73Gxy+fifm3/F0H4tokE8LAbbkcf5kr/Pyin+2amhiXBkbDiUbeCttx34TlD4HXwmjyQ==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/date-utils@0.82.1': - resolution: {integrity: sha512-z9sHtgV4fvtXsqLaTD4/o+D+H5wumLYhIw/Bj3yC41gR5oa4Wo9QifRT9DBfvuokmXsrnRZ8k32hUtWoYb6M/A==} + '@zag-js/date-utils@1.8.2': + resolution: {integrity: sha512-KFMcZMb7xC7XypH1VDQIiYv4dpxB+1JEG2QX7zbYos+QKd41A8tNtaDnfJX+iePVsJV156gqiOrtogNvz4rJ8A==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/dialog@0.82.1': - resolution: {integrity: sha512-oqi+6Y/rx6ZKxg3s9r6bIuo33x+5+UDhvrlk31kE3LWgU1KJjVV0VEkFMK9B1SJTY7IizhlWMyDx+JXJ+jOy5Q==} + '@zag-js/dialog@1.8.2': + resolution: {integrity: sha512-1XJIb0/YNBV5LgcRQ7ZwS/GvJiIy1e/iaZvYea6RRAInxcNH6KFon9U1Hm1Lfdz9GryCMs32WDhlFcYQoeGlKw==} - '@zag-js/dismissable@0.82.1': - resolution: {integrity: sha512-vs+zkORzaeNzX4Wsy4OkW1AVce7l4Tc6DHZq8gqNB5SvhK+5wEPl6EmacQRvZyoCxi2m6xpaI98UkLCmVJKU+Q==} + '@zag-js/dismissable@1.8.2': + resolution: {integrity: sha512-YGQB60pr/jbldJlt0LtToriJEMX8ds8uxienPModMgzEPo7yEDf30VMo4Ix8Sm38E6CJBOcm87vKHrrD8aEfnw==} - '@zag-js/dom-query@0.82.1': - resolution: {integrity: sha512-KFtbqDUykQur587hyrGi8LL8GfTS2mqBpIT0kL3E+S63Mq7U84i+hGf3VyNuInMB5ONpkNEk5JN4G9/HWQ6pAQ==} + '@zag-js/dom-query@1.8.1': + resolution: {integrity: sha512-+2DYAW9riWnAAf7etTkaVqpaTHjYSHYGExJtBmZ6KurmYsc7Uw46mAcIImakZhrg69AI0cpL4b2YJHMQz8GGZA==} - '@zag-js/editable@0.82.1': - resolution: {integrity: sha512-V5i3kYSHFJYj8914nBf4VKKtm6m59gG482vm20As4EnLcwGFrOBbm4HXUgsKq0wYSLy/lTtvMrUT8Iqudye2gw==} + '@zag-js/dom-query@1.8.2': + resolution: {integrity: sha512-bn6Pxga19PJzpDb+Oh326kn1sgVfO97mxRzRFqzrKz9NuANGlCblmv2NTYmhfppqE1nt9QyLLhyQ2BLbzwouLg==} - '@zag-js/element-rect@0.82.1': - resolution: {integrity: sha512-xXUjmeIUdxkxic5bepp6fVqN9Qs+54PXCAUl6g/DtJecQVmVooIfa3SLSULhany4aR4mlGojp5TJxvSpUBA58Q==} + '@zag-js/editable@1.8.2': + resolution: {integrity: sha512-NFg5qp2IzE0nvDFf+UyFIIHGFBCyB5r74YIVBb0oJnVcIzrYa1+HA2ZrNMzTnjpZdx7B5lE/99VAsvk2Mb+GtA==} - '@zag-js/element-size@0.82.1': - resolution: {integrity: sha512-k1rOE6NhoULI9d5pt2qVUxWCQVEf3OTPH8UDnbsdf11xn+hMCzRYd9lekUdVGrcHHGvEK+W6iAfWZnlwsJsmow==} + '@zag-js/file-upload@1.8.2': + resolution: {integrity: sha512-b+xt9W5CqFG0NCB4F6C29FcFPlV0q5LC7m7mj7iMhk+dRkWPVhxr9o5SFPtjXLZlncFNgHfMkBU7Ktx5JY8CSA==} - '@zag-js/file-upload@0.82.1': - resolution: {integrity: sha512-6cgJsy9bf2DB0v+CVq1L4g4aCePTpfWsV4C0HC+82K+OSPomiIPsQS87wo4+eAcy3z+80Qh+uglZCFAwkW8W+g==} + '@zag-js/file-utils@1.8.1': + resolution: {integrity: sha512-IdulHjOzPeZWNURY1rM/FbltdnXIOjUsOA7wWAped6oMMtDmWlrfpKtFs2emnXd04mZLnZN9yBO5WtHI7TTWeg==} - '@zag-js/file-utils@0.82.1': - resolution: {integrity: sha512-/u86hMd+E5UCrrY9akDAExkO7sgPA1lXzWC9gSX4LSxHATk7Vo4o5+4LiE1MX4WZRytOhtxAycJzNDVpqzmppQ==} + '@zag-js/file-utils@1.8.2': + resolution: {integrity: sha512-VBn2PeVtfj4c4snVcvp9oVFFiOVwJQ1OvS44CXv2xl9u4hRnDVSHalNmdj5jOqspNmTy9xNCKQWPK73ef26msQ==} - '@zag-js/focus-trap@0.82.1': - resolution: {integrity: sha512-z5OzmR8O3n2043Lwhp1qcizNHXvzc/Xteb3hWmxbX9hR3k0wHJeMXMj3GTDO0FBixRt+d8iHEmt3/8CkI72mqw==} + '@zag-js/focus-trap@1.8.2': + resolution: {integrity: sha512-GzKdicdiVjlOOsNzmmRAZVccs902PXnoyO+qkzXlIsr8+RPRgtPlZthIp6wtr4CJ2vLOMByvrEt7wCNSIoDzxA==} - '@zag-js/focus-visible@0.82.1': - resolution: {integrity: sha512-b87FqZO6e9RmTY4msEzwZ3hZ8pRuPd2vbR2b6SlXr6ohtmGKlGgBGO4kmarZN/ClE+7VOnOEqIicatRBEgX9bw==} + '@zag-js/focus-visible@1.8.2': + resolution: {integrity: sha512-YXkB4ClgEf/gTRGUrTDThvxfThpey41dDKcuQIPTA6F76ji4jLQiDYLnw4KDxLW8uLL21jZgctO5FFdIMoxJeg==} - '@zag-js/highlight-word@0.82.1': - resolution: {integrity: sha512-lS5r3V0l7Z53QyNwkxulYp5QYA9mFkU+3XsZqfM6cBjh+wmGE1xeIwknAmFtYvuYNK37AwT7pp5z0Rm1Ep6WVQ==} + '@zag-js/highlight-word@1.8.2': + resolution: {integrity: sha512-yI65t4bFxTUkZbHuntRCdBPOEQdpO8G4nkoY8WznBetQ1LLhqOd+7KXelzq+Vot2RbXzop54xEBvgKeTQbGOgg==} - '@zag-js/hover-card@0.82.1': - resolution: {integrity: sha512-fp9t/PNXODwxXR1X+VzgYeSpgoJ+M3W/qvuA2stgPI4kEinwKEssSlP2sH6gTmQVZKL8SV1jiNQinVh00NE85g==} + '@zag-js/hover-card@1.8.2': + resolution: {integrity: sha512-GwYGsojbVpyhOCz+XUnEtxA9ZmUlnfPrnE71j/Gc2+oLtOFwvnhINtBTZPCUXO5ec95uG9QFwxc63x1upB/PIA==} - '@zag-js/i18n-utils@0.82.1': - resolution: {integrity: sha512-YcTIqka6+/YoH2VRBMnv3CvTjHdUo/NG2nMenAB9Wq0MLTn+TAtcsujenz7ckJcgayVhFAchWNhwK9+/cs1dAw==} + '@zag-js/i18n-utils@1.8.1': + resolution: {integrity: sha512-Epj/VOsJppsHlo2YwGV718CsZEneH9OVZtD8LB7j/zGXjQr/LALErCQQVOJXlBO6Ky2G/ZE/vK4LyO5GIjkTKw==} - '@zag-js/interact-outside@0.82.1': - resolution: {integrity: sha512-WcWJB5kM41fDM6YMGC3ZEPVn1q3Nrm+cAFkllRJrRY4+bUKXmtN8bqDaRKghP+dG5CXz66SiM6xBvDE4nqtK5Q==} + '@zag-js/i18n-utils@1.8.2': + resolution: {integrity: sha512-Zhiw2U14kkYRPru/5nWYei0l0eiQOkTu2VDCc/mn9jd7+zDEIYNp3b1CvMQ3/ES21i1HH6uBuKKujuktH/f6Iw==} - '@zag-js/live-region@0.82.1': - resolution: {integrity: sha512-BmSXc41y1uOra/UV1lt8BurWkuwne/+c371IJCK6l+MWsO0ufq1lrjfx4cyFf5yhVcPRkhv/b/0i+7RxfDSK1A==} + '@zag-js/interact-outside@1.8.2': + resolution: {integrity: sha512-7N0v/vdsJO5a7AjwWofZ99AP5/hzFfCShSgEfg4GpRk7gPOdFanm7U3Zy9LtVvM9gwRncqGwjo4yd6O5G7SCnA==} - '@zag-js/menu@0.82.1': - resolution: {integrity: sha512-faAlQZYeWHcGH8nIxBYh7HHfVjSKsHV8yUsbhMD0XkePWM6eB+dPRd/Fc3DeT8ieM8+sUODnTHEuxar0i48v4w==} + '@zag-js/live-region@1.8.2': + resolution: {integrity: sha512-QkowjTQj9C6ZFSCB+E7QNU5yjWMA58cAR5TcWgdLLKAP+SJwaTdtptpyFq71VH+jT85sNvvBZVya1aWZrbGopg==} - '@zag-js/number-input@0.82.1': - resolution: {integrity: sha512-QIQlxlxM78+TkEhPEGlTbkBR3G2ngm5vhc3BFw4sG6ABMyre8TiIH37EqQB7EGKyAcuz6QwPk3AervHMFKe4YQ==} + '@zag-js/menu@1.8.2': + resolution: {integrity: sha512-kEz1FJ0kgkutN1XDpS27GAkk1T/v3fUctBHrj0Wvt7TvQfPyzudyjmj35UEP5e8AglJAoQt2Am93YPSQ2deJwg==} - '@zag-js/pagination@0.82.1': - resolution: {integrity: sha512-1Rsd3cSnlewefNB1RBI0ymK5wlgiBcK42H1IrJIhly6+SXDAhp0Oc45ofsCzpfhkQ4be+A9Cb30ayc6J4ZU2kA==} + '@zag-js/number-input@1.8.2': + resolution: {integrity: sha512-oyxXI/FDDj40BMkkLHDu84me3TgLIZizQhMj51R3ZM5Qg5BucYbamQKDgcGbb2CI6BUPo+6jklO0QZmy8/2cTQ==} - '@zag-js/pin-input@0.82.1': - resolution: {integrity: sha512-P7UN7rIt03YHt05SuK+kZ9mhl4AfvCvaSGB/9KzEq5r6p1D3lc4+0LVkkOvL2EEB8vbGY/y5BNcvaF2jPQPH5Q==} + '@zag-js/pagination@1.8.2': + resolution: {integrity: sha512-+Ummfw6r0Ll4oFVRvoVhPSvox8y2vvIocjGip0e6ze8zaUuHgUYzNkcK7OalZ3pZkh9y0+9MlnqtsQwxZhMJPw==} - '@zag-js/popover@0.82.1': - resolution: {integrity: sha512-zZ8H/jcjaXcLRX4dBcmandexeKV/5cBOt4AUVEnd3/X5NFFkA2Njz8rpQFcNRZl814NxG4RCchIu8kmonmUKCA==} + '@zag-js/pin-input@1.8.2': + resolution: {integrity: sha512-TME6Maud8Z78ZxFru7WvBGf5EQAuMoPQfdTMpd8os24srtO+HwiFN1wbeBsV/6BmbOeA9gFuB4K8O8rqNn3uqg==} - '@zag-js/popper@0.82.1': - resolution: {integrity: sha512-vQTmVUs6aLGqKmWb+FnLDntsulvd/sCvgndeTmwOHRW8PBwPb86aDnvNrNosBSS+Kk9p6CMJwWZ6CuPWR5Kf7Q==} + '@zag-js/popover@1.8.2': + resolution: {integrity: sha512-c3uk6t5MG3xluf2LR1adOGnCsKchfRqzB7K9/fyBvWXBFyFiV5DWXdc2NpnzvB0Z5fQVJMrBiMnpvmzqbVovAA==} - '@zag-js/presence@0.82.1': - resolution: {integrity: sha512-eZeAkq2s7NYCiNVMvkWL2Or458hZj71u7ygCt6skA18sO1ZksY+qIFqj99leCov+fesz06Hf8bxZz5029t/Wjg==} + '@zag-js/popper@1.8.2': + resolution: {integrity: sha512-OfZS5KKQZsaENZG1SliM8/shtAKmKrprJuWpn3/kzcOAO/obNZfApld4oa1N5FoePLLTY96qVfdC5W9xygKRDQ==} - '@zag-js/progress@0.82.1': - resolution: {integrity: sha512-Fy1EjUda7o7e/yTKbZgKKayGOsHxkjLG+x0AakHmbR/k2VKbM4QuFHB9RJLlqNd9a+m/BzS1kEKWzCJ7/mXL9Q==} + '@zag-js/presence@1.8.2': + resolution: {integrity: sha512-aT9PPQAY28HeAxiSeIhnOmlkI+tw0ippxtUWenxQ6B3yyU/ZOGVqc4f7eY418z65lF2yziYvUkZgOdWc6E4kZA==} - '@zag-js/qr-code@0.82.1': - resolution: {integrity: sha512-E1N1o1dPVuhWkcrg6urut2aaCqrc16OeE9VJh1mAGIUknF3p0QScH+ql7J/n9r8WOa21xyF6HLKhnWVPRQmHGg==} + '@zag-js/progress@1.8.2': + resolution: {integrity: sha512-QUzPe5Xj0zSexKJ1+JCmQnJ+pZ5EeRjMLWSn4cdeUJtzEuPosBLCzJtMzl+uZ/mTg2YVgPC7l6wV6nfMYrco/g==} - '@zag-js/radio-group@0.82.1': - resolution: {integrity: sha512-YTqP4Ok2YEmEXCEiNW2tufZ6svt4sh7KHqrHZq81vPAJMKKhVosP6LnZvmt4dVn6tKJ0OU8idwFVtPM5jSAWoA==} + '@zag-js/qr-code@1.8.2': + resolution: {integrity: sha512-W47UwF5jBL3NraobAOC9aYFpMFiXhDzgZ6O3f4Zhd3eDx6BnUvebZ+GOfE71EmJ0fu43mF6o3ial8H4nxj2myQ==} - '@zag-js/rating-group@0.82.1': - resolution: {integrity: sha512-ULl0OA207b6Ilsr2QWt4dbx58hA/NnyCmHpvv1pAYSlH3K0Es5b25B80Cc5jM/3NK3yqoY81OkS9U8lxmpWo+A==} + '@zag-js/radio-group@1.8.2': + resolution: {integrity: sha512-WY0QT4XkqgXD1N1VZG11gTnu7rGaPYizZIq/m1NS0ls6b/tTnwdlrPL2bgBzlJtyuuCeQJXh5pTypCiNoAZurg==} - '@zag-js/react@0.82.1': - resolution: {integrity: sha512-CZivUTFQ4TdRKTN+9wpWAo0lEZlMnbjJPVn2VJVpcz+eRNUeoVzevkNY/OzAqdV3mp+VtdNabQn1fAz8ngViPQ==} + '@zag-js/rating-group@1.8.2': + resolution: {integrity: sha512-azCMgF7FAyvDJ+fcAYzFQHhZpeydPW6h7JvYIvLsz/K609D1HJT85gtCzG+drgBhE4tRyvFdYKDkTCvOpVnkGA==} + + '@zag-js/react@1.8.2': + resolution: {integrity: sha512-Fz9WR6wZQOAxCLSTSmUnGL+VH2/HVxvdlOKOHoUrJ0+9QOmlGrZf+mxpJuGgqUW3RyMzzpHfly8TKZkqHRYd3g==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' - '@zag-js/rect-utils@0.82.1': - resolution: {integrity: sha512-gXmvj1wK9FeToOCzvoZ5gycqUNRzfeqd84uwJeG9zA8SVdoyEnoAji8IAynneq8t3LbiNUcu37wjTw0dcWM6ig==} + '@zag-js/rect-utils@1.8.2': + resolution: {integrity: sha512-RWgPe+MOtOJaWjvlGD1Cf1snmD+hem1mfxXqM3XTCZCjuAlqAzHSCyuBUDia96nU0YGgAxYuloQLh8HFLJcVPA==} - '@zag-js/remove-scroll@0.82.1': - resolution: {integrity: sha512-68cvXvqgNOlucbnGKRyephk8Qg8wb4xpjgUdmF9xQwICdY/uhW2p4ZGJ4471TDCDIlpoBrJPYsWqV2oWH3QNfA==} + '@zag-js/remove-scroll@1.8.2': + resolution: {integrity: sha512-zJvLCKcb1yWEdWCP+cDhnYTY1MyoNzuiYOwWTh2YiktQYC0zpd2KDbd+jdhSWIpbIdV22UMuy4sDfFpx6i/mqA==} - '@zag-js/scroll-snap@0.82.1': - resolution: {integrity: sha512-HL3MkBpWx4Cw0+h1UP/PnvLP3Z1T+F5mkeS8HWmiP+KPzhtFiEBRrve+xk7h7BMXifteg2UZy53ZiZfJeGsd3w==} + '@zag-js/scroll-snap@1.8.2': + resolution: {integrity: sha512-kyM4ZsRvq5WuJJZVr1TQ1xjuso0ANhySMtILH1kC9EFGIOwZegnIpZt5K1rf5NBFmBrcBjUl+lEKwySRNFauhw==} - '@zag-js/select@0.82.1': - resolution: {integrity: sha512-cc6D8Iz+Ewnx9L0J63QGqC2bbiwzCEcJVE/j4OZDcy4Qk3lqr3qA09uuJbQxAi7yvIeB44DIEt9ryTZPkZbgiw==} + '@zag-js/select@1.8.2': + resolution: {integrity: sha512-ZsBU7kGp8TX4gNavmiTWz9cB+6KgqHXxSwgARnaYUBsYhpdDG2SYfzgyfGAYcAv4ejNTFEfvNk89h+Kpz4CeOg==} - '@zag-js/signature-pad@0.82.1': - resolution: {integrity: sha512-s8ae88OpAafkpuqimO9beUiVTn3FG+bnWeWnYQOLtNYMCNHzQbVZp9QBNbOoUpNcDT14mx9rfZe98BqfiMohFw==} + '@zag-js/signature-pad@1.8.2': + resolution: {integrity: sha512-Jl3kRbxo3fkey9uqdVDyGROlECa3MpOXaMWDzO58vodrOjjLnZPO1VPF4xvjG5LUsEOGx54R97Tpc2hS3t93Pw==} - '@zag-js/slider@0.82.1': - resolution: {integrity: sha512-qXVvXbDRq6Cla036M9OH6plO7ubefM7k65NJQKjtITDua+VliKQLXj9BrdPLT9K96wWntW+D/TiZXE+JNbR4ow==} + '@zag-js/slider@1.8.2': + resolution: {integrity: sha512-+tncZezgA4FVHV6M7a6lV3cPJUa5OsP7ouXkYGw7Z3cvOoFLaL+bxaCe/UHouRTKqoZj4ImR83x85xcIj50e1g==} - '@zag-js/splitter@0.82.1': - resolution: {integrity: sha512-eMNncj+pcepYTf+51s4ysDS/tjtKXswpwsSQR0AeNqCE3SW3TGzHOM0+uheyjgv9EmDGDrr3Imdo0PCkq3bqug==} + '@zag-js/splitter@1.8.2': + resolution: {integrity: sha512-jcr382kBA/pRrQu04PVqB2U4Tn32wBCbJMX4UC/tmuVTP5RwQrA4WaDs21CelfntI0qEbzCMxFfYvbU7+ma7iw==} - '@zag-js/steps@0.82.1': - resolution: {integrity: sha512-N/LVOPbpQGtqpnNsdgZsQytpvXVoJ9Uldo8G38Q7892wwhVx63L0qLaiOK+SkU7kUTueOh109HezZ67nq3sadw==} + '@zag-js/steps@1.8.2': + resolution: {integrity: sha512-iCwaiT6q0GyhZCnHH9bwmQfYGqVmN5ObF+efV2eYDVsuICKe/PlEHL7H3gRClJR6x6FehXmYYI/gCI/PLzsuHg==} - '@zag-js/store@0.82.1': - resolution: {integrity: sha512-uWlVivLZBCuAEXrXOITM1srwfBtAnT8kBYVPElrT5aSO9gkV1YC/g+YdFRol7KKOg12qO561CPKReVfilmtAKg==} + '@zag-js/store@1.8.2': + resolution: {integrity: sha512-Q/sg8L5B3lbX1MWFJNhE5bcPzJrwhRcgDGtvKf8KDKcbcirhF5HiXUbbE4jvav52QVQYKru+WnOJ8WVj5Bi3tA==} - '@zag-js/switch@0.82.1': - resolution: {integrity: sha512-lIZsOs5nG9TkPs75+OK5THprEO0u3NAiLnEJ489KEFautVX/GMwAWvGHNFS7CcCpLZv+EpVKAPAdmGfEphrzhA==} + '@zag-js/switch@1.8.2': + resolution: {integrity: sha512-WYgtfzponocm4rrJcG4CNy1xsOwOXZ1yE9NBNKvew2Cj5yZLpTQLcjJBlWR5VjZ3Tgx+3D/F2nmBYzVFtU8zyw==} - '@zag-js/tabs@0.82.1': - resolution: {integrity: sha512-1uwNRvy8LyUTCAWjL1kD7BexOZ0sHrZ4OnUwDNuaWbqxUjtzoe+ftvcLXvmwFMmrns7o1SVnjqkgSVKuE4mcDA==} + '@zag-js/tabs@1.8.2': + resolution: {integrity: sha512-aM7gx9aj1DcyTV6T5H7okMHWBhi/0jdjhUhFRWWSdYxiYvpveBhVK+Tvg9Nq9GBqXZEgg8E1hxuLgPQUZv7QBQ==} - '@zag-js/tags-input@0.82.1': - resolution: {integrity: sha512-1mY8nCNMQgMwWBV5zX0bUcIgstqKjvFOAuYhGLIxbQPbgX7lP8Kr3nuhABh0oC0KnWaKfOMlItir2k795G4KMQ==} + '@zag-js/tags-input@1.8.2': + resolution: {integrity: sha512-9DF2pXz6a6lX5IiCwg8ug0TSLZ3FILIHUaX9WNBSx7afDlCMH36UgKhyfs2Xhl9gliVC/6a0Tr2sX5VDEYCe7g==} - '@zag-js/time-picker@0.82.1': - resolution: {integrity: sha512-nWKx3yyHFBUBPOTDFhi3du4wWlQe8wY0EoeWLQN6bpJSF4qo/BosTZJkUHm//FgUdwdhQBFOAsrlrJ0vL4qvNA==} + '@zag-js/time-picker@1.8.2': + resolution: {integrity: sha512-RdAPrRBeuiCL7m4PdEZOR6YzfQfOeNElgjEAVLZgUTu4WEhLt/XVdjaOuUQtiuLW4ukT72wNVWi0S+NBCHerIw==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/timer@0.82.1': - resolution: {integrity: sha512-uG4xCrYHgDZJgvW+71ROQX0xIkqMup37ZpNSLS2f5eD5DO1n/9NYLztA1YyeCJyv1aEDsZreeJLJvNDElgXA2A==} + '@zag-js/timer@1.8.2': + resolution: {integrity: sha512-EUqVacZyrKuvzDFHRZLYjDzNwMyr/5cQCu4m1Da4nv7hvqivDvofU2HUUf7mi7isuYuRaRAZ6sFQqknmvfbKQQ==} - '@zag-js/toast@0.82.1': - resolution: {integrity: sha512-4dL99zHXQg8j7ReJAR9zLAp5lNKMS4Nm+THnJaKsA0TF5QkELGnsZz47oKhFY0aQn46paxMLVagLqQ0+2i6D1w==} + '@zag-js/toast@1.8.2': + resolution: {integrity: sha512-ew+lfy8y5j4HWj5Ir9RoSfQKlbZnmGnn1r8GHMBhQXegWVGWAb04n4sp7t/e656iBif9HpLm3+/SUwOdCPIiJg==} - '@zag-js/toggle-group@0.82.1': - resolution: {integrity: sha512-8YaYKFz3ciiQhlTFScrvqH3Ke6UMDQLSgMEsCcERBYatd6TxkJwlFiBzpksIDsZpmloBrylyItJvqmzj9jt6Ig==} + '@zag-js/toggle-group@1.8.2': + resolution: {integrity: sha512-kBvFQtUJ70PpqJ6aA9uLCXLvSTiUMhzX3GkJbmTxffu2BdVKUF5OEKW3x9VpYdPeekBnayCXoGdW7WEOkgpYGw==} - '@zag-js/tooltip@0.82.1': - resolution: {integrity: sha512-ewF/1h2INDJlzYnoIigcWFWim56ezhfl7YGKgqLBdxBoRvZHyhRIfR8bbddVZk4k144gXsMVMeXwS6VEt6D0eQ==} + '@zag-js/toggle@1.8.2': + resolution: {integrity: sha512-2EebV04Hv25ex1jQVa1Cjb4A85qcC6kvABn4qR6wZooxf5Ua72C9sdiEjrAvMhDGAWaa37JuxlyYs+sZG1l0Lw==} - '@zag-js/tour@0.82.1': - resolution: {integrity: sha512-Oo4ZA3vG2sYEotfrWVXfIV1KW0Z+s91U+2YPtM2sOLnhetEVXxj/AwAruZfvS6WOcTI7D9UBrrQolY94fdZeOA==} + '@zag-js/tooltip@1.8.2': + resolution: {integrity: sha512-FqDq4H3PFnEJt96JCr4dap3Pkcq2D0Gb/G5G5gG3QAs7kOIHL2Jpq1CGCxE3EpmQOFee1HwyokC6R4Q4kot1Nw==} - '@zag-js/tree-view@0.82.1': - resolution: {integrity: sha512-xvYwaL49ffC8nnb+ENgNtkSZE1jMh8tm1E777AqBqnrhJZ28+FA9Sk8YDuWIWhNOV/r4n97jTXqj4SAGCrlAMQ==} + '@zag-js/tour@1.8.2': + resolution: {integrity: sha512-67Qw+dYY8ayf1x0ggvU0U0MoS0I/nhVe9JRpabPjYc09123DgGsDA4sdbj6VfCeFW6j3kffn5VEmTm8C3yV8gA==} - '@zag-js/types@0.82.1': - resolution: {integrity: sha512-Nr/CU/z/SZWDL92P2u9VDZL9JUxY8L1P7dGI0CmDKHlEHk1+vzqg3UnVkUKkZ5eVMNLtloHbrux5X9Gmkl39WQ==} + '@zag-js/tree-view@1.8.2': + resolution: {integrity: sha512-l/JmKjkz/BM59HVscazl8BMJj+suXl+FNRQVZqhyijzlb2PrB5xtgiQNV9XLNM2qHBCub9820Y1YMLyEP5YiwQ==} - '@zag-js/utils@0.82.1': - resolution: {integrity: sha512-JUGdEjstrzB0G2AJqzQiURIl6UZ1ONYgby/pqBKX57LO5LxasQXk9oNZh8+ZAvePNC/lKqqTtyyI02YQB4XwkA==} + '@zag-js/types@1.8.1': + resolution: {integrity: sha512-gJU3UlRccL2N4ukG4xEtetAr/fiuFBxpG5IKZ/Pr0zz8Z17LpdhK7ozyn9SU7y9W6YOcngByAgNgz+nRzmu5aQ==} + + '@zag-js/types@1.8.2': + resolution: {integrity: sha512-J+94HhFAPOBchNdGcmvqjB8nbQFgKHcqGoPl5vNTKlcoibN0yFjn4XFZoQU6uCf8sPhNg6NUNTkluR5YjybyJA==} + + '@zag-js/utils@1.8.2': + resolution: {integrity: sha512-7HnRAQ7+pR00c4BQChulTdf6G1gJ0NqV4mMKd9UXk4/E7GLYinUdBNAZ3jZCdHDrio3+2zIlNvpzkO3G4pVjlw==} abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} @@ -2268,10 +2126,6 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2507,8 +2361,8 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bundle-n-require@1.1.1: - resolution: {integrity: sha512-EB2wFjXF106LQLe/CYnKCMCdLeTW47AtcEtUfiqAOgr2a08k0+YgRklur2aLfEYHlhz6baMskZ8L2U92Hh0vyA==} + bundle-n-require@1.1.2: + resolution: {integrity: sha512-bEk2jakVK1ytnZ9R2AAiZEeK/GxPUM8jvcRxHZXifZDMcjkI4EG/GlsJ2YGSVYT9y/p/gA9/0yDY8rCGsSU6Tg==} cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -2518,6 +2372,10 @@ packages: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -2526,6 +2384,10 @@ packages: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2579,8 +2441,8 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chromium-bidi@1.3.0: - resolution: {integrity: sha512-G3x1bkST13kmbL7+dT/oRkNH/7C4UqG+0YQpmySrzXspyOhYgDNc6lhSGpj3cuexvH25WTENhTYq2Tt9JRXtbw==} + chromium-bidi@3.0.0: + resolution: {integrity: sha512-ZOGRDAhBMX1uxL2Cm2TDuhImbrsEz5A/tTcVU6RpXEWaTNUNwsHW6njUXizh51Ir6iqHbKAfhA2XK33uBcLo5A==} peerDependencies: devtools-protocol: '*' @@ -2594,10 +2456,6 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -2833,8 +2691,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - devtools-protocol@0.0.1402036: - resolution: {integrity: sha512-JwAYQgEvm3yD45CHB+RmF5kMbWtXBaOGwuxa87sZogHcLCv8c/IqnThaoQ1y60d7pXWjSKWQphPEc+1rAScVdg==} + devtools-protocol@0.0.1425554: + resolution: {integrity: sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==} didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -2962,13 +2820,8 @@ packages: peerDependencies: esbuild: '>=0.12 <1' - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} engines: {node: '>=18'} hasBin: true @@ -3027,27 +2880,26 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-storybook@0.11.3: - resolution: {integrity: sha512-gDBnBZiyk4ZG7OMSJRaHBcuJ8TMCXgMIQ3HB/XvtN0SvSio2ZOIeYD3yGj39g/DbyCe/Bg02j/ip9tWlDEs82A==} + eslint-plugin-storybook@0.12.0: + resolution: {integrity: sha512-Lg5I0+npTgiYgZ4KSvGWGDFZi3eOCNJPaWX0c9rTEEXC5wvooOClsP9ZtbI4hhFKyKgYR877KiJxbRTSJq9gWA==} engines: {node: '>= 18'} peerDependencies: eslint: '>=8' - typescript: '>=4.8.4 <5.8.0' - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -3058,8 +2910,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.21.0: - resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3114,8 +2966,8 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} expect@29.7.0: @@ -3249,6 +3101,10 @@ packages: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -3834,8 +3690,8 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - knip@5.44.5: - resolution: {integrity: sha512-qXHVRsipmxZNKVb5IWUVHwQtr96Dfo3vnWszRgwMI2VhsW9EBi7b/2YlELrrqfPr0lwVnwhUUuNgYwvke+PdGA==} + knip@5.50.3: + resolution: {integrity: sha512-0A4G7UPucGTCpNh5vHSfL0+tVQIuKfJKdg8sAq6EC3COKbAchEbM+TeN4w32OrnJW9CesHs71lqftlggMVfW2A==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -3857,8 +3713,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.4.3: - resolution: {integrity: sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==} + lint-staged@15.5.1: + resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -4153,8 +4009,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next-themes@0.4.4: - resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==} + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc @@ -4181,8 +4037,8 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-check-updates@17.1.15: - resolution: {integrity: sha512-miATvKu5rjec/1wxc5TGDjpsucgtCHwRVZorZpDkS6NzdWXfnUWlN4abZddWb7XSijAuBNzzYglIdTm9SbgMVg==} + npm-check-updates@17.1.18: + resolution: {integrity: sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw==} engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} hasBin: true @@ -4217,8 +4073,8 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} object.fromentries@2.0.8: @@ -4276,10 +4132,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -4385,13 +4237,13 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - playwright-core@1.50.1: - resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} + playwright-core@1.51.1: + resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} engines: {node: '>=18'} hasBin: true - playwright@1.50.1: - resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} + playwright@1.51.1: + resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} engines: {node: '>=18'} hasBin: true @@ -4444,6 +4296,10 @@ packages: resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4453,8 +4309,8 @@ packages: engines: {node: '>=14'} hasBin: true - prettier@3.5.2: - resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -4508,12 +4364,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.2.1: - resolution: {integrity: sha512-bCypUh3WXzETafv1TCFAjIUnI8BiQ/d+XvEfEXDLcIMm9CAvROqnBmbt79yBjwasoDZsgfXnUmIJU7Y27AalVQ==} + puppeteer-core@24.6.1: + resolution: {integrity: sha512-sMCxsY+OPWO2fecBrhIeCeJbWWXJ6UaN997sTid6whY0YT9XM0RnxEwLeUibluIS5/fRmuxe1efjb5RMBsky7g==} engines: {node: '>=18'} - puppeteer@24.2.1: - resolution: {integrity: sha512-Euno62ou0cd0dTkOYTNioSOsFF4VpSnz4ldD38hi9ov9xCNtr8DbhmoJRUx+V9OuPgecueZbKOohRrnrhkbg3Q==} + puppeteer@24.6.1: + resolution: {integrity: sha512-/4ocGfu8LNvDbWUqJZV2VmwEWpbOdJa69y2Jivd213tV0ekAtUh/bgT1hhW63SDN/CtrEucOPwoomZ+9M+eBEg==} engines: {node: '>=18'} hasBin: true @@ -4535,10 +4391,10 @@ packages: resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} engines: {node: '>=16.14.0'} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: - react: ^19.0.0 + react: ^19.1.0 react-error-boundary@5.0.0: resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} @@ -4559,22 +4415,22 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.0.0: - resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + react-is@19.1.0: + resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-router-dom@7.2.0: - resolution: {integrity: sha512-cU7lTxETGtQRQbafJubvZKHEn5izNABxZhBY0Jlzdv0gqQhCPQt2J8aN5ZPjS6mQOXn5NnirWNh+FpE8TTYN0Q==} + react-router-dom@7.5.0: + resolution: {integrity: sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.2.0: - resolution: {integrity: sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ==} + react-router@7.5.0: + resolution: {integrity: sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -4583,12 +4439,17 @@ packages: react-dom: optional: true - react-select@5.10.0: - resolution: {integrity: sha512-k96gw+i6N3ExgDwPIg0lUPmexl1ygPe6u5BdQFNBhkpbwroIgCNXdubtIzHfThYXYYTubwOBafoMnn7ruEP1xA==} + react-select@5.10.1: + resolution: {integrity: sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-speech-recognition@4.0.0: + resolution: {integrity: sha512-hz1OsRhjAW70rOMVXN84PR+1L2I1j8xS1TXpwpd4vlDaRY9i/LbAaxEklqscgObECTTuyxNeGBdVdcq/pX3bqQ==} + peerDependencies: + react: '>=16.8.0' + react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -4607,8 +4468,8 @@ packages: react: '*' react-dom: '*' - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -4743,8 +4604,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} @@ -4907,11 +4768,11 @@ packages: stacktrace-js@2.0.2: resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.8.1: + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} - storybook@8.5.8: - resolution: {integrity: sha512-k3QDa7z4a656oO3Mx929KNm+xIdEI2nIDCKatVl1mA6vt+ge+uwoiG+ro182J9LOEppR5XXD2mQQi4u1xNsy6A==} + storybook@8.6.12: + resolution: {integrity: sha512-Z/nWYEHBTLK1ZBtAWdhxC0l5zf7ioJ7G4+zYqtTdYeb67gTnxNj80gehf8o8QY9L2zA2+eyMRGLC2V5fI7Z3Tw==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -5012,9 +4873,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - summary@2.1.0: - resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -5183,8 +5041,8 @@ packages: typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true @@ -5192,8 +5050,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -5291,13 +5149,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.6: - resolution: {integrity: sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==} + vite-node@3.1.1: + resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.1.1: - resolution: {integrity: sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==} + vite@6.2.6: + resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -5336,16 +5194,16 @@ packages: yaml: optional: true - vitest@3.0.6: - resolution: {integrity: sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==} + vitest@3.1.1: + resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.6 - '@vitest/ui': 3.0.6 + '@vitest/browser': 3.1.1 + '@vitest/ui': 3.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5458,6 +5316,18 @@ packages: utf-8-validate: optional: true + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -5541,62 +5411,64 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@ark-ui/react@4.9.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@ark-ui/react@5.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@internationalized/date': 3.7.0 - '@zag-js/accordion': 0.82.1 - '@zag-js/anatomy': 0.82.1 - '@zag-js/auto-resize': 0.82.1 - '@zag-js/avatar': 0.82.1 - '@zag-js/carousel': 0.82.1 - '@zag-js/checkbox': 0.82.1 - '@zag-js/clipboard': 0.82.1 - '@zag-js/collapsible': 0.82.1 - '@zag-js/collection': 0.82.1 - '@zag-js/color-picker': 0.82.1 - '@zag-js/color-utils': 0.82.1 - '@zag-js/combobox': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/date-picker': 0.82.1(@internationalized/date@3.7.0) - '@zag-js/date-utils': 0.82.1(@internationalized/date@3.7.0) - '@zag-js/dialog': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/editable': 0.82.1 - '@zag-js/file-upload': 0.82.1 - '@zag-js/file-utils': 0.82.1 - '@zag-js/focus-trap': 0.82.1 - '@zag-js/highlight-word': 0.82.1 - '@zag-js/hover-card': 0.82.1 - '@zag-js/i18n-utils': 0.82.1 - '@zag-js/menu': 0.82.1 - '@zag-js/number-input': 0.82.1 - '@zag-js/pagination': 0.82.1 - '@zag-js/pin-input': 0.82.1 - '@zag-js/popover': 0.82.1 - '@zag-js/presence': 0.82.1 - '@zag-js/progress': 0.82.1 - '@zag-js/qr-code': 0.82.1 - '@zag-js/radio-group': 0.82.1 - '@zag-js/rating-group': 0.82.1 - '@zag-js/react': 0.82.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@zag-js/select': 0.82.1 - '@zag-js/signature-pad': 0.82.1 - '@zag-js/slider': 0.82.1 - '@zag-js/splitter': 0.82.1 - '@zag-js/steps': 0.82.1 - '@zag-js/switch': 0.82.1 - '@zag-js/tabs': 0.82.1 - '@zag-js/tags-input': 0.82.1 - '@zag-js/time-picker': 0.82.1(@internationalized/date@3.7.0) - '@zag-js/timer': 0.82.1 - '@zag-js/toast': 0.82.1 - '@zag-js/toggle-group': 0.82.1 - '@zag-js/tooltip': 0.82.1 - '@zag-js/tour': 0.82.1 - '@zag-js/tree-view': 0.82.1 - '@zag-js/types': 0.82.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@zag-js/accordion': 1.8.2 + '@zag-js/anatomy': 1.8.2 + '@zag-js/auto-resize': 1.8.2 + '@zag-js/avatar': 1.8.2 + '@zag-js/carousel': 1.8.2 + '@zag-js/checkbox': 1.8.2 + '@zag-js/clipboard': 1.8.2 + '@zag-js/collapsible': 1.8.2 + '@zag-js/collection': 1.8.2 + '@zag-js/color-picker': 1.8.2 + '@zag-js/color-utils': 1.8.2 + '@zag-js/combobox': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/date-picker': 1.8.2(@internationalized/date@3.7.0) + '@zag-js/date-utils': 1.8.2(@internationalized/date@3.7.0) + '@zag-js/dialog': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/editable': 1.8.2 + '@zag-js/file-upload': 1.8.2 + '@zag-js/file-utils': 1.8.1 + '@zag-js/focus-trap': 1.8.2 + '@zag-js/highlight-word': 1.8.2 + '@zag-js/hover-card': 1.8.2 + '@zag-js/i18n-utils': 1.8.2 + '@zag-js/menu': 1.8.2 + '@zag-js/number-input': 1.8.2 + '@zag-js/pagination': 1.8.2 + '@zag-js/pin-input': 1.8.2 + '@zag-js/popover': 1.8.2 + '@zag-js/presence': 1.8.2 + '@zag-js/progress': 1.8.2 + '@zag-js/qr-code': 1.8.2 + '@zag-js/radio-group': 1.8.2 + '@zag-js/rating-group': 1.8.2 + '@zag-js/react': 1.8.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@zag-js/select': 1.8.2 + '@zag-js/signature-pad': 1.8.2 + '@zag-js/slider': 1.8.2 + '@zag-js/splitter': 1.8.2 + '@zag-js/steps': 1.8.2 + '@zag-js/switch': 1.8.2 + '@zag-js/tabs': 1.8.2 + '@zag-js/tags-input': 1.8.2 + '@zag-js/time-picker': 1.8.2(@internationalized/date@3.7.0) + '@zag-js/timer': 1.8.2 + '@zag-js/toast': 1.8.2 + '@zag-js/toggle': 1.8.2 + '@zag-js/toggle-group': 1.8.2 + '@zag-js/tooltip': 1.8.2 + '@zag-js/tour': 1.8.2 + '@zag-js/tree-view': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) '@babel/code-frame@7.26.2': dependencies: @@ -5645,7 +5517,7 @@ snapshots: '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.26.8 + '@babel/types': 7.26.9 '@babel/helper-compilation-targets@7.26.5': dependencies: @@ -5688,8 +5560,8 @@ snapshots: '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.26.8 - '@babel/types': 7.26.8 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -5711,7 +5583,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.26.8 + '@babel/types': 7.26.9 '@babel/helper-plugin-utils@7.26.5': {} @@ -5720,7 +5592,7 @@ snapshots: '@babel/core': 7.26.8 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -5729,14 +5601,14 @@ snapshots: '@babel/core': 7.26.8 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.26.8 - '@babel/types': 7.26.8 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -5748,9 +5620,9 @@ snapshots: '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.26.8 - '@babel/traverse': 7.26.8 - '@babel/types': 7.26.8 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -5771,7 +5643,7 @@ snapshots: dependencies: '@babel/core': 7.26.8 '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -5798,7 +5670,7 @@ snapshots: dependencies: '@babel/core': 7.26.8 '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -5912,7 +5784,7 @@ snapshots: '@babel/core': 7.26.8 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.8) - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -5958,7 +5830,7 @@ snapshots: '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.8) - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -5967,7 +5839,7 @@ snapshots: dependencies: '@babel/core': 7.26.8 '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.26.8 + '@babel/template': 7.26.9 '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.8)': dependencies: @@ -6019,7 +5891,7 @@ snapshots: '@babel/core': 7.26.8 '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -6065,7 +5937,7 @@ snapshots: '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8) '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.8 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -6182,7 +6054,7 @@ snapshots: '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.8) - '@babel/types': 7.26.8 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -6350,7 +6222,7 @@ snapshots: dependencies: '@babel/core': 7.26.8 '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.26.8 + '@babel/types': 7.26.9 esutils: 2.0.3 '@babel/preset-react@7.26.3(@babel/core@7.26.8)': @@ -6428,15 +6300,15 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@chakra-ui/cli@3.8.1(@chakra-ui/react@3.8.1(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))': + '@chakra-ui/cli@3.16.0(@chakra-ui/react@3.16.0(@emotion/react@11.14.0(@types/react@19.1.2)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': dependencies: - '@chakra-ui/react': 3.8.1(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@clack/prompts': 0.9.1 + '@chakra-ui/react': 3.16.0(@emotion/react@11.14.0(@types/react@19.1.2)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@clack/prompts': 0.10.1 '@pandacss/is-valid-prop': 0.41.0 '@types/cli-table': 0.3.4 '@types/debug': 4.1.12 - '@visulima/boxen': 1.0.29 - bundle-n-require: 1.1.1 + '@visulima/boxen': 1.0.30 + bundle-n-require: 1.1.2 chokidar: 3.6.0 cli-table: 0.3.11 commander: 12.1.0 @@ -6453,41 +6325,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@chakra-ui/react@3.8.1(@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@chakra-ui/react@3.16.0(@emotion/react@11.14.0(@types/react@19.1.2)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@ark-ui/react': 4.9.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@ark-ui/react': 5.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) + '@emotion/react': 11.14.0(@types/react@19.1.2)(react@19.1.0) '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) '@emotion/utils': 1.4.2 '@pandacss/is-valid-prop': 0.41.0 csstype: 3.1.3 fast-safe-stringify: 2.1.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@chakra-ui/styled-system@2.12.0(react@19.0.0)': + '@chakra-ui/styled-system@2.12.0(react@19.1.0)': dependencies: - '@chakra-ui/utils': 2.2.2(react@19.0.0) + '@chakra-ui/utils': 2.2.2(react@19.1.0) csstype: 3.1.3 transitivePeerDependencies: - react - '@chakra-ui/utils@2.2.2(react@19.0.0)': + '@chakra-ui/utils@2.2.2(react@19.1.0)': dependencies: '@types/lodash.mergewith': 4.6.9 lodash.mergewith: 4.6.2 - react: 19.0.0 + react: 19.1.0 - '@clack/core@0.4.1': + '@clack/core@0.4.2': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/prompts@0.9.1': + '@clack/prompts@0.10.1': dependencies: - '@clack/core': 0.4.1 + '@clack/core': 0.4.2 picocolors: 1.1.1 sisteransi: 1.0.5 @@ -6527,19 +6399,19 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0)': + '@emotion/react@11.14.0(@types/react@19.1.2)(react@19.1.0)': dependencies: '@babel/runtime': 7.26.7 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 - react: 19.0.0 + react: 19.1.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.1.2 transitivePeerDependencies: - supports-color @@ -6555,166 +6427,97 @@ snapshots: '@emotion/unitless@0.10.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.0)': dependencies: - react: 19.0.0 + react: 19.1.0 '@emotion/utils@1.4.2': {} '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.20.2': + '@esbuild/aix-ppc64@0.25.1': optional: true - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/android-arm64@0.25.1': optional: true - '@esbuild/android-arm64@0.20.2': + '@esbuild/android-arm@0.25.1': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-x64@0.25.1': optional: true - '@esbuild/android-arm@0.20.2': + '@esbuild/darwin-arm64@0.25.1': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/darwin-x64@0.25.1': optional: true - '@esbuild/android-x64@0.20.2': + '@esbuild/freebsd-arm64@0.25.1': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.1': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@esbuild/linux-arm64@0.25.1': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/linux-arm@0.25.1': optional: true - '@esbuild/darwin-x64@0.20.2': + '@esbuild/linux-ia32@0.25.1': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/linux-loong64@0.25.1': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@esbuild/linux-mips64el@0.25.1': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/linux-ppc64@0.25.1': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@esbuild/linux-riscv64@0.25.1': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/linux-s390x@0.25.1': optional: true - '@esbuild/linux-arm64@0.20.2': + '@esbuild/linux-x64@0.25.1': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.1': optional: true - '@esbuild/linux-arm@0.20.2': + '@esbuild/netbsd-x64@0.25.1': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/openbsd-arm64@0.25.1': optional: true - '@esbuild/linux-ia32@0.20.2': + '@esbuild/openbsd-x64@0.25.1': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/sunos-x64@0.25.1': optional: true - '@esbuild/linux-loong64@0.20.2': + '@esbuild/win32-arm64@0.25.1': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/win32-ia32@0.25.1': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/win32-x64@0.25.1': optional: true - '@esbuild/linux-mips64el@0.24.2': - optional: true - - '@esbuild/linux-ppc64@0.20.2': - optional: true - - '@esbuild/linux-ppc64@0.24.2': - optional: true - - '@esbuild/linux-riscv64@0.20.2': - optional: true - - '@esbuild/linux-riscv64@0.24.2': - optional: true - - '@esbuild/linux-s390x@0.20.2': - optional: true - - '@esbuild/linux-s390x@0.24.2': - optional: true - - '@esbuild/linux-x64@0.20.2': - optional: true - - '@esbuild/linux-x64@0.24.2': - optional: true - - '@esbuild/netbsd-arm64@0.24.2': - optional: true - - '@esbuild/netbsd-x64@0.20.2': - optional: true - - '@esbuild/netbsd-x64@0.24.2': - optional: true - - '@esbuild/openbsd-arm64@0.24.2': - optional: true - - '@esbuild/openbsd-x64@0.20.2': - optional: true - - '@esbuild/openbsd-x64@0.24.2': - optional: true - - '@esbuild/sunos-x64@0.20.2': - optional: true - - '@esbuild/sunos-x64@0.24.2': - optional: true - - '@esbuild/win32-arm64@0.20.2': - optional: true - - '@esbuild/win32-arm64@0.24.2': - optional: true - - '@esbuild/win32-ia32@0.20.2': - optional: true - - '@esbuild/win32-ia32@0.24.2': - optional: true - - '@esbuild/win32-x64@0.20.2': - optional: true - - '@esbuild/win32-x64@0.24.2': - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.24.0(jiti@2.4.2))': dependencies: - eslint: 9.21.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 @@ -6722,11 +6525,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/config-helpers@0.2.0': {} + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -6740,7 +6545,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.21.0': {} + '@eslint/js@9.24.0': {} '@eslint/object-schema@2.1.6': {} @@ -6753,11 +6558,6 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.12': - dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.13': dependencies: '@floating-ui/core': 1.6.9 @@ -6808,27 +6608,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -6853,7 +6653,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -6871,7 +6671,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.13.5 + '@types/node': 22.14.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6893,7 +6693,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.13.5 + '@types/node': 22.14.1 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -6963,18 +6763,18 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.13.5 + '@types/node': 22.14.1 '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0))': dependencies: glob: 10.4.5 magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.7.3) - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + react-docgen-typescript: 2.2.2(typescript@5.8.3) + vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -7000,7 +6800,7 @@ snapshots: '@juggle/resize-observer@3.4.0': {} - '@locator/babel-jsx@0.4.4(@babel/core@7.26.8)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3))': + '@locator/babel-jsx@0.4.4(@babel/core@7.26.8)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))': dependencies: '@babel/parser': 7.26.8 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.8) @@ -7009,19 +6809,19 @@ snapshots: '@babel/preset-typescript': 7.26.0(@babel/core@7.26.8) '@babel/traverse': 7.26.8 '@babel/types': 7.26.8 - '@locator/runtime': 0.4.4(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + '@locator/runtime': 0.4.4(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) '@locator/shared': 0.4.4 transitivePeerDependencies: - '@babel/core' - supports-color - ts-node - '@locator/runtime@0.4.4(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3))': + '@locator/runtime@0.4.4(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))': dependencies: '@floating-ui/dom': 1.6.13 '@locator/shared': 0.4.4 solid-js: 1.9.5 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) transitivePeerDependencies: - ts-node @@ -7029,46 +6829,34 @@ snapshots: dependencies: semver: 7.7.1 - '@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0)': + '@mdx-js/react@3.1.0(@types/react@19.1.2)(react@19.1.0)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.0.10 - react: 19.0.0 + '@types/react': 19.1.2 + react: 19.1.0 '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.scandir@4.0.1': - dependencies: - '@nodelib/fs.stat': 4.0.0 - run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} - '@nodelib/fs.stat@4.0.0': {} - '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 - '@nodelib/fs.walk@3.0.1': - dependencies: - '@nodelib/fs.scandir': 4.0.1 - fastq: 1.19.0 - '@pandacss/is-valid-prop@0.41.0': {} '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.50.1': + '@playwright/test@1.51.1': dependencies: - playwright: 1.50.1 + playwright: 1.51.1 - '@puppeteer/browsers@2.7.1': + '@puppeteer/browsers@2.10.0': dependencies: debug: 4.4.0 extract-zip: 2.0.1 @@ -7160,220 +6948,209 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@snyk/github-codeowners@1.1.0': - dependencies: - commander: 4.1.1 - ignore: 5.3.2 - p-map: 4.0.0 - - '@storybook/addon-actions@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-actions@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) uuid: 9.0.1 - '@storybook/addon-backgrounds@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-backgrounds@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-controls@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@8.5.8(@types/react@19.0.10)(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-docs@8.6.12(@types/react@19.1.2)(storybook@8.6.12(prettier@3.5.3))': dependencies: - '@mdx-js/react': 3.1.0(@types/react@19.0.10)(react@19.0.0) - '@storybook/blocks': 8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2)) - '@storybook/csf-plugin': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/react-dom-shim': 8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2)) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - storybook: 8.5.8(prettier@3.5.2) + '@mdx-js/react': 3.1.0(@types/react@19.1.2)(react@19.1.0) + '@storybook/blocks': 8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3)) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.5.8(@types/react@19.0.10)(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-essentials@8.6.12(@types/react@19.1.2)(storybook@8.6.12(prettier@3.5.3))': dependencies: - '@storybook/addon-actions': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-backgrounds': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-controls': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-docs': 8.5.8(@types/react@19.0.10)(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-highlight': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-measure': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-outline': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-toolbars': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/addon-viewport': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - storybook: 8.5.8(prettier@3.5.2) + '@storybook/addon-actions': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-backgrounds': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-controls': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-docs': 8.6.12(@types/react@19.1.2)(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-highlight': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-measure': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-outline': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-toolbars': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/addon-viewport': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-highlight@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-highlight@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) - '@storybook/addon-links@8.5.8(react@19.0.0)(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-links@8.6.12(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))': dependencies: - '@storybook/csf': 0.1.12 '@storybook/global': 5.0.0 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: - react: 19.0.0 + react: 19.1.0 - '@storybook/addon-mdx-gfm@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-mdx-gfm@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: remark-gfm: 4.0.1 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - '@storybook/addon-measure@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-measure@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) tiny-invariant: 1.3.3 - '@storybook/addon-outline@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-outline@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-toolbars@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-toolbars@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) - '@storybook/addon-viewport@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/addon-viewport@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: memoizerific: 1.11.3 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) - '@storybook/blocks@8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2))': + '@storybook/blocks@8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))': dependencies: - '@storybook/csf': 0.1.12 - '@storybook/icons': 1.3.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - storybook: 8.5.8(prettier@3.5.2) + '@storybook/icons': 1.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@storybook/builder-vite@8.5.8(storybook@8.5.8(prettier@3.5.2))(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0))': + '@storybook/builder-vite@8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@storybook/csf-plugin': 8.5.8(storybook@8.5.8(prettier@3.5.2)) + '@storybook/csf-plugin': 8.6.12(storybook@8.6.12(prettier@3.5.3)) browser-assert: 1.2.1 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) - '@storybook/components@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/components@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) - '@storybook/core@8.5.8(prettier@3.5.2)': + '@storybook/core@8.6.12(prettier@3.5.3)(storybook@8.6.12(prettier@3.5.3))': dependencies: - '@storybook/csf': 0.1.12 + '@storybook/theming': 8.6.12(storybook@8.6.12(prettier@3.5.3)) better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.24.2 - esbuild-register: 3.6.0(esbuild@0.24.2) + esbuild: 0.25.1 + esbuild-register: 3.6.0(esbuild@0.25.1) jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.9 semver: 7.7.1 util: 0.12.5 - ws: 8.18.0 + ws: 8.18.1 optionalDependencies: - prettier: 3.5.2 + prettier: 3.5.3 transitivePeerDependencies: - bufferutil + - storybook - supports-color - utf-8-validate - '@storybook/csf-plugin@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/csf-plugin@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) unplugin: 1.16.1 - '@storybook/csf@0.1.12': - dependencies: - type-fest: 2.19.0 - '@storybook/csf@0.1.13': dependencies: type-fest: 2.19.0 '@storybook/global@5.0.0': {} - '@storybook/icons@1.3.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@storybook/icons@1.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@storybook/manager-api@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/manager-api@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) - '@storybook/preview-api@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/preview-api@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) - '@storybook/react-dom-shim@8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2))': + '@storybook/react-dom-shim@8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))': dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - storybook: 8.5.8(prettier@3.5.2) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 8.6.12(prettier@3.5.3) - '@storybook/react-vite@8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.34.6)(storybook@8.5.8(prettier@3.5.2))(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0))': + '@storybook/react-vite@8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.34.6)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0)) '@rollup/pluginutils': 5.1.4(rollup@4.34.6) - '@storybook/builder-vite': 8.5.8(storybook@8.5.8(prettier@3.5.2))(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0)) - '@storybook/react': 8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2))(typescript@5.7.3) + '@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0)) + '@storybook/react': 8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3) find-up: 5.0.0 magic-string: 0.30.17 - react: 19.0.0 + react: 19.1.0 react-docgen: 7.1.1 - react-dom: 19.0.0(react@19.0.0) + react-dom: 19.1.0(react@19.1.0) resolve: 1.22.10 - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) tsconfig-paths: 4.2.0 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react@8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2))(typescript@5.7.3)': + '@storybook/react@8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.5.8(storybook@8.5.8(prettier@3.5.2)) + '@storybook/components': 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/preview-api': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - '@storybook/react-dom-shim': 8.5.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.8(prettier@3.5.2)) - '@storybook/theming': 8.5.8(storybook@8.5.8(prettier@3.5.2)) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - storybook: 8.5.8(prettier@3.5.2) + '@storybook/manager-api': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/preview-api': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3)) + '@storybook/theming': 8.6.12(storybook@8.6.12(prettier@3.5.3)) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 8.6.12(prettier@3.5.3) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 - '@storybook/theming@8.5.8(storybook@8.5.8(prettier@3.5.2))': + '@storybook/theming@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: - storybook: 8.5.8(prettier@3.5.2) + storybook: 8.6.12(prettier@3.5.3) '@swc/helpers@0.5.15': dependencies: @@ -7400,15 +7177,15 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.26.7 '@testing-library/dom': 10.4.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: @@ -7418,7 +7195,7 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.5.2)': + '@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.5.3)': dependencies: '@babel/generator': 7.26.8 '@babel/parser': 7.26.8 @@ -7426,7 +7203,7 @@ snapshots: '@babel/types': 7.26.8 javascript-natural-sort: 0.7.1 lodash: 4.17.21 - prettier: 3.5.2 + prettier: 3.5.3 transitivePeerDependencies: - supports-color @@ -7477,7 +7254,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.13.5 + '@types/node': 22.14.1 '@types/istanbul-lib-coverage@2.0.6': {} @@ -7498,7 +7275,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.13.5 + '@types/node': 22.14.1 '@types/tough-cookie': 4.0.5 parse5: 7.2.1 @@ -7520,21 +7297,21 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.13.5': + '@types/node@22.14.1': dependencies: - undici-types: 6.20.0 + undici-types: 6.21.0 '@types/parse-json@4.0.2': {} - '@types/react-dom@19.0.4(@types/react@19.0.10)': + '@types/react-dom@19.1.2(@types/react@19.1.2)': dependencies: - '@types/react': 19.0.10 + '@types/react': 19.1.2 - '@types/react-transition-group@4.4.12(@types/react@19.0.10)': + '@types/react-transition-group@4.4.12(@types/react@19.1.2)': dependencies: - '@types/react': 19.0.10 + '@types/react': 19.1.2 - '@types/react@19.0.10': + '@types/react@19.1.2': dependencies: csstype: 3.1.3 @@ -7556,634 +7333,653 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.13.5 + '@types/node': 22.14.1 optional: true - '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/type-utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.1 - eslint: 9.21.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 + eslint: 9.24.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.1 + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 debug: 4.4.0 - eslint: 9.21.0(jiti@2.4.2) - typescript: 5.7.3 + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.24.0': + '@typescript-eslint/scope-manager@8.28.0': dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/scope-manager@8.24.1': + '@typescript-eslint/scope-manager@8.30.1': dependencies: - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/visitor-keys': 8.24.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 - '@typescript-eslint/type-utils@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.0 - eslint: 9.21.0(jiti@2.4.2) - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + eslint: 9.24.0(jiti@2.4.2) + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.24.0': {} + '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/types@8.24.1': {} + '@typescript-eslint/types@8.30.1': {} - '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.24.1(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/visitor-keys': 8.24.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.24.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - eslint: 9.21.0(jiti@2.4.2) - typescript: 5.7.3 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - eslint: 9.21.0(jiti@2.4.2) - typescript: 5.7.3 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.24.0': + '@typescript-eslint/visitor-keys@8.28.0': dependencies: - '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.24.1': + '@typescript-eslint/visitor-keys@8.30.1': dependencies: - '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/types': 8.30.1 eslint-visitor-keys: 4.2.0 - '@visulima/boxen@1.0.29': {} + '@visulima/boxen@1.0.30': {} - '@vitejs/plugin-react@4.3.4(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.8 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.8) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.8) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.0.6': + '@vitest/expect@3.1.1': dependencies: - '@vitest/spy': 3.0.6 - '@vitest/utils': 3.0.6 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.6(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0))': + '@vitest/mocker@3.1.1(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.0.6 + '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) - '@vitest/pretty-format@3.0.6': + '@vitest/pretty-format@3.1.1': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.6': + '@vitest/runner@3.1.1': dependencies: - '@vitest/utils': 3.0.6 + '@vitest/utils': 3.1.1 pathe: 2.0.3 - '@vitest/snapshot@3.0.6': + '@vitest/snapshot@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.6 + '@vitest/pretty-format': 3.1.1 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.6': + '@vitest/spy@3.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.6': + '@vitest/utils@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.6 + '@vitest/pretty-format': 3.1.1 loupe: 3.1.3 tinyrainbow: 2.0.0 '@xobotyi/scrollbar-width@1.9.5': {} - '@zag-js/accordion@0.82.1': + '@zag-js/accordion@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/anatomy@0.82.1': {} + '@zag-js/anatomy@1.8.2': {} - '@zag-js/aria-hidden@0.82.1': {} + '@zag-js/aria-hidden@1.8.2': {} - '@zag-js/auto-resize@0.82.1': + '@zag-js/auto-resize@1.8.2': dependencies: - '@zag-js/dom-query': 0.82.1 + '@zag-js/dom-query': 1.8.2 - '@zag-js/avatar@0.82.1': + '@zag-js/avatar@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/carousel@0.82.1': + '@zag-js/carousel@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/scroll-snap': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/scroll-snap': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/checkbox@0.82.1': + '@zag-js/checkbox@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/focus-visible': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/focus-visible': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/clipboard@0.82.1': + '@zag-js/clipboard@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/collapsible@0.82.1': + '@zag-js/collapsible@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/collection@0.82.1': + '@zag-js/collection@1.8.2': dependencies: - '@zag-js/utils': 0.82.1 + '@zag-js/utils': 1.8.2 - '@zag-js/color-picker@0.82.1': + '@zag-js/color-picker@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/color-utils': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/color-utils': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/color-utils@0.82.1': + '@zag-js/color-utils@1.8.2': dependencies: - '@zag-js/utils': 0.82.1 + '@zag-js/utils': 1.8.2 - '@zag-js/combobox@0.82.1': + '@zag-js/combobox@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/aria-hidden': 0.82.1 - '@zag-js/collection': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/aria-hidden': 1.8.2 + '@zag-js/collection': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/core@0.82.1': + '@zag-js/core@1.8.2': dependencies: - '@zag-js/store': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/dom-query': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/date-picker@0.82.1(@internationalized/date@3.7.0)': + '@zag-js/date-picker@1.8.2(@internationalized/date@3.7.0)': dependencies: '@internationalized/date': 3.7.0 - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/date-utils': 0.82.1(@internationalized/date@3.7.0) - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/live-region': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/date-utils': 1.8.2(@internationalized/date@3.7.0) + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/live-region': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/date-utils@0.82.1(@internationalized/date@3.7.0)': + '@zag-js/date-utils@1.8.2(@internationalized/date@3.7.0)': dependencies: '@internationalized/date': 3.7.0 - '@zag-js/dialog@0.82.1': + '@zag-js/dialog@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/aria-hidden': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/focus-trap': 0.82.1 - '@zag-js/remove-scroll': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/aria-hidden': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/focus-trap': 1.8.2 + '@zag-js/remove-scroll': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/dismissable@0.82.1': + '@zag-js/dismissable@1.8.2': dependencies: - '@zag-js/dom-query': 0.82.1 - '@zag-js/interact-outside': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/dom-query': 1.8.2 + '@zag-js/interact-outside': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/dom-query@0.82.1': + '@zag-js/dom-query@1.8.1': dependencies: - '@zag-js/types': 0.82.1 + '@zag-js/types': 1.8.1 - '@zag-js/editable@0.82.1': + '@zag-js/dom-query@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/interact-outside': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/types': 1.8.2 - '@zag-js/element-rect@0.82.1': {} - - '@zag-js/element-size@0.82.1': {} - - '@zag-js/file-upload@0.82.1': + '@zag-js/editable@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/file-utils': 0.82.1 - '@zag-js/i18n-utils': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/interact-outside': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/file-utils@0.82.1': + '@zag-js/file-upload@1.8.2': dependencies: - '@zag-js/i18n-utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/file-utils': 1.8.2 + '@zag-js/i18n-utils': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/focus-trap@0.82.1': + '@zag-js/file-utils@1.8.1': dependencies: - '@zag-js/dom-query': 0.82.1 + '@zag-js/i18n-utils': 1.8.1 - '@zag-js/focus-visible@0.82.1': + '@zag-js/file-utils@1.8.2': dependencies: - '@zag-js/dom-query': 0.82.1 + '@zag-js/i18n-utils': 1.8.2 - '@zag-js/highlight-word@0.82.1': {} - - '@zag-js/hover-card@0.82.1': + '@zag-js/focus-trap@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/dom-query': 1.8.2 - '@zag-js/i18n-utils@0.82.1': + '@zag-js/focus-visible@1.8.2': dependencies: - '@zag-js/dom-query': 0.82.1 + '@zag-js/dom-query': 1.8.2 - '@zag-js/interact-outside@0.82.1': + '@zag-js/highlight-word@1.8.2': {} + + '@zag-js/hover-card@1.8.2': dependencies: - '@zag-js/dom-query': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/live-region@0.82.1': {} - - '@zag-js/menu@0.82.1': + '@zag-js/i18n-utils@1.8.1': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/rect-utils': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/dom-query': 1.8.1 - '@zag-js/number-input@0.82.1': + '@zag-js/i18n-utils@1.8.2': + dependencies: + '@zag-js/dom-query': 1.8.2 + + '@zag-js/interact-outside@1.8.2': + dependencies: + '@zag-js/dom-query': 1.8.2 + '@zag-js/utils': 1.8.2 + + '@zag-js/live-region@1.8.2': {} + + '@zag-js/menu@1.8.2': + dependencies: + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/rect-utils': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 + + '@zag-js/number-input@1.8.2': dependencies: '@internationalized/number': 3.6.0 - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/pagination@0.82.1': + '@zag-js/pagination@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/pin-input@0.82.1': + '@zag-js/pin-input@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/popover@0.82.1': + '@zag-js/popover@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/aria-hidden': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/focus-trap': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/remove-scroll': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/aria-hidden': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/focus-trap': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/remove-scroll': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/popper@0.82.1': + '@zag-js/popper@1.8.2': dependencies: - '@floating-ui/dom': 1.6.12 - '@zag-js/dom-query': 0.82.1 - '@zag-js/utils': 0.82.1 + '@floating-ui/dom': 1.6.13 + '@zag-js/dom-query': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/presence@0.82.1': + '@zag-js/presence@1.8.2': dependencies: - '@zag-js/core': 0.82.1 - '@zag-js/types': 0.82.1 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 - '@zag-js/progress@0.82.1': + '@zag-js/progress@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/qr-code@0.82.1': + '@zag-js/qr-code@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 proxy-memoize: 3.0.1 uqr: 0.1.2 - '@zag-js/radio-group@0.82.1': + '@zag-js/radio-group@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/element-rect': 0.82.1 - '@zag-js/focus-visible': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/focus-visible': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/rating-group@0.82.1': + '@zag-js/rating-group@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/react@0.82.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@zag-js/react@1.8.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@zag-js/core': 0.82.1 - '@zag-js/store': 0.82.1 - '@zag-js/types': 0.82.1 - proxy-compare: 3.0.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@zag-js/core': 1.8.2 + '@zag-js/store': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - '@zag-js/rect-utils@0.82.1': {} + '@zag-js/rect-utils@1.8.2': {} - '@zag-js/remove-scroll@0.82.1': + '@zag-js/remove-scroll@1.8.2': dependencies: - '@zag-js/dom-query': 0.82.1 + '@zag-js/dom-query': 1.8.2 - '@zag-js/scroll-snap@0.82.1': + '@zag-js/scroll-snap@1.8.2': dependencies: - '@zag-js/dom-query': 0.82.1 + '@zag-js/dom-query': 1.8.2 - '@zag-js/select@0.82.1': + '@zag-js/select@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/collection': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/collection': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/signature-pad@0.82.1': + '@zag-js/signature-pad@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 perfect-freehand: 1.2.2 - '@zag-js/slider@0.82.1': + '@zag-js/slider@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/element-size': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/splitter@0.82.1': + '@zag-js/splitter@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/steps@0.82.1': + '@zag-js/steps@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/store@0.82.1': + '@zag-js/store@1.8.2': dependencies: proxy-compare: 3.0.1 - '@zag-js/switch@0.82.1': + '@zag-js/switch@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/focus-visible': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/focus-visible': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/tabs@0.82.1': + '@zag-js/tabs@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/element-rect': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/tags-input@0.82.1': + '@zag-js/tags-input@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/auto-resize': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/interact-outside': 0.82.1 - '@zag-js/live-region': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/auto-resize': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/interact-outside': 1.8.2 + '@zag-js/live-region': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/time-picker@0.82.1(@internationalized/date@3.7.0)': + '@zag-js/time-picker@1.8.2(@internationalized/date@3.7.0)': dependencies: '@internationalized/date': 3.7.0 - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/timer@0.82.1': + '@zag-js/timer@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/toast@0.82.1': + '@zag-js/toast@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/toggle-group@0.82.1': + '@zag-js/toggle-group@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/tooltip@0.82.1': + '@zag-js/toggle@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/focus-visible': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/tour@0.82.1': + '@zag-js/tooltip@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dismissable': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/focus-trap': 0.82.1 - '@zag-js/interact-outside': 0.82.1 - '@zag-js/popper': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/focus-visible': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/store': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/tree-view@0.82.1': + '@zag-js/tour@1.8.2': dependencies: - '@zag-js/anatomy': 0.82.1 - '@zag-js/collection': 0.82.1 - '@zag-js/core': 0.82.1 - '@zag-js/dom-query': 0.82.1 - '@zag-js/types': 0.82.1 - '@zag-js/utils': 0.82.1 + '@zag-js/anatomy': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dismissable': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/focus-trap': 1.8.2 + '@zag-js/interact-outside': 1.8.2 + '@zag-js/popper': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 - '@zag-js/types@0.82.1': + '@zag-js/tree-view@1.8.2': + dependencies: + '@zag-js/anatomy': 1.8.2 + '@zag-js/collection': 1.8.2 + '@zag-js/core': 1.8.2 + '@zag-js/dom-query': 1.8.2 + '@zag-js/types': 1.8.2 + '@zag-js/utils': 1.8.2 + + '@zag-js/types@1.8.1': dependencies: csstype: 3.1.3 - '@zag-js/utils@0.82.1': {} + '@zag-js/types@1.8.2': + dependencies: + csstype: 3.1.3 + + '@zag-js/utils@1.8.2': {} abab@2.0.6: {} @@ -8210,11 +8006,6 @@ snapshots: agent-base@7.1.3: {} - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -8222,16 +8013,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - allotment@1.20.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + allotment@1.20.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: classnames: 2.5.1 eventemitter3: 5.0.1 lodash.clamp: 4.0.3 lodash.debounce: 4.0.8 lodash.isequal: 4.5.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - use-resize-observer: 9.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + use-resize-observer: 9.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) ansi-escapes@4.3.2: dependencies: @@ -8385,8 +8176,8 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.26.8 - '@babel/types': 7.26.8 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 @@ -8514,9 +8305,9 @@ snapshots: buffer-from@1.1.2: {} - bundle-n-require@1.1.1: + bundle-n-require@1.1.2: dependencies: - esbuild: 0.20.2 + esbuild: 0.25.1 node-eval: 2.0.0 cac@6.7.14: {} @@ -8526,6 +8317,11 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.1 @@ -8538,6 +8334,11 @@ snapshots: call-bind-apply-helpers: 1.0.1 get-intrinsic: 1.2.7 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -8588,9 +8389,9 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chromium-bidi@1.3.0(devtools-protocol@0.0.1402036): + chromium-bidi@3.0.0(devtools-protocol@0.0.1425554): dependencies: - devtools-protocol: 0.0.1402036 + devtools-protocol: 0.0.1425554 mitt: 3.0.1 zod: 3.24.2 @@ -8600,8 +8401,6 @@ snapshots: classnames@2.5.1: {} - clean-stack@2.2.0: {} - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -8672,22 +8471,22 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@9.0.0(typescript@5.7.3): + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.3 - create-jest@29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -8818,7 +8617,7 @@ snapshots: dependencies: dequal: 2.0.3 - devtools-protocol@0.0.1402036: {} + devtools-protocol@0.0.1425554: {} didyoumean@1.2.2: {} @@ -8996,66 +8795,40 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-register@3.6.0(esbuild@0.24.2): + esbuild-register@3.6.0(esbuild@0.25.1): dependencies: debug: 4.4.0 - esbuild: 0.24.2 + esbuild: 0.25.1 transitivePeerDependencies: - supports-color - esbuild@0.20.2: + esbuild@0.25.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - - esbuild@0.24.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 escalade@3.2.0: {} @@ -9081,17 +8854,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.21.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.24.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.21.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -9100,9 +8873,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.21.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.21.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.24.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -9114,17 +8887,17 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-react-hooks@5.1.0(eslint@9.21.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.24.0(jiti@2.4.2)): dependencies: - eslint: 9.21.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) - eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.24.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -9132,12 +8905,12 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.21.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 @@ -9146,17 +8919,17 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@0.11.3(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3): + eslint-plugin-storybook@0.12.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@storybook/csf': 0.1.13 - '@typescript-eslint/utils': 8.24.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.21.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.24.0(jiti@2.4.2) ts-dedent: 2.2.0 - typescript: 5.7.3 transitivePeerDependencies: - supports-color + - typescript - eslint-scope@8.2.0: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -9165,14 +8938,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.21.0(jiti@2.4.2): + eslint@9.24.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.0 '@eslint/core': 0.12.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.21.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.24.0 '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -9184,7 +8958,7 @@ snapshots: cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 + eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 esquery: 1.6.0 @@ -9260,7 +9034,7 @@ snapshots: exit@0.1.2: {} - expect-type@1.1.0: {} + expect-type@1.2.1: {} expect@29.7.0: dependencies: @@ -9407,6 +9181,19 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-package-type@0.1.0: {} get-proto@1.0.1: @@ -9813,7 +9600,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3(babel-plugin-macros@3.1.0) @@ -9833,16 +9620,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -9852,7 +9639,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: '@babel/core': 7.26.8 '@jest/test-sequencer': 29.7.0 @@ -9877,8 +9664,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.13.5 - ts-node: 10.9.2(@types/node@22.13.5)(typescript@5.7.3) + '@types/node': 22.14.1 + ts-node: 10.9.2(@types/node@22.14.1)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -9908,7 +9695,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 22.13.5 + '@types/node': 22.14.1 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -9922,7 +9709,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -9932,7 +9719,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.13.5 + '@types/node': 22.14.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9971,7 +9758,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -10006,7 +9793,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -10034,7 +9821,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -10080,7 +9867,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -10099,7 +9886,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 22.14.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -10108,17 +9895,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.13.5 + '@types/node': 22.14.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)): + jest@29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.13.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@22.14.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10210,11 +9997,10 @@ snapshots: kleur@3.0.3: {} - knip@5.44.5(@types/node@22.13.5)(typescript@5.7.3): + knip@5.50.3(@types/node@22.14.1)(typescript@5.8.3): dependencies: - '@nodelib/fs.walk': 3.0.1 - '@snyk/github-codeowners': 1.1.0 - '@types/node': 22.13.5 + '@nodelib/fs.walk': 1.2.8 + '@types/node': 22.14.1 easy-table: 1.2.0 enhanced-resolve: 5.18.1 fast-glob: 3.3.3 @@ -10226,8 +10012,7 @@ snapshots: pretty-ms: 9.2.0 smol-toml: 1.3.1 strip-json-comments: 5.0.1 - summary: 2.1.0 - typescript: 5.7.3 + typescript: 5.8.3 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) @@ -10242,7 +10027,7 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@15.4.3: + lint-staged@15.5.1: dependencies: chalk: 5.4.1 commander: 13.1.0 @@ -10684,15 +10469,15 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nano-css@5.6.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + nano-css@5.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 inline-style-prefixer: 7.0.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 stylis: 4.3.6 @@ -10703,10 +10488,10 @@ snapshots: netmask@2.0.2: {} - next-themes@0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) node-domexception@1.0.0: {} @@ -10726,7 +10511,7 @@ snapshots: normalize-path@3.0.0: {} - npm-check-updates@17.1.15: {} + npm-check-updates@17.1.18: {} npm-run-path@4.0.1: dependencies: @@ -10755,9 +10540,10 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.8: + object.entries@1.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -10834,10 +10620,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - p-try@2.2.0: {} pac-proxy-agent@7.1.0: @@ -10922,11 +10704,11 @@ snapshots: dependencies: find-up: 4.1.0 - playwright-core@1.50.1: {} + playwright-core@1.51.1: {} - playwright@1.50.1: + playwright@1.51.1: dependencies: - playwright-core: 1.50.1 + playwright-core: 1.51.1 optionalDependencies: fsevents: 2.3.2 @@ -10948,13 +10730,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.2 - postcss-load-config@4.0.2(postcss@8.5.2)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)): + postcss-load-config@4.0.2(postcss@8.5.2)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.5.2 - ts-node: 10.9.2(@types/node@22.13.5)(typescript@5.7.3) + ts-node: 10.9.2(@types/node@22.14.1)(typescript@5.8.3) postcss-nested@6.2.0(postcss@8.5.2): dependencies: @@ -10974,11 +10756,17 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier@3.3.3: {} - prettier@3.5.2: {} + prettier@3.5.3: {} pretty-format@27.5.1: dependencies: @@ -11043,27 +10831,27 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.2.1: + puppeteer-core@24.6.1: dependencies: - '@puppeteer/browsers': 2.7.1 - chromium-bidi: 1.3.0(devtools-protocol@0.0.1402036) + '@puppeteer/browsers': 2.10.0 + chromium-bidi: 3.0.0(devtools-protocol@0.0.1425554) debug: 4.4.0 - devtools-protocol: 0.0.1402036 + devtools-protocol: 0.0.1425554 typed-query-selector: 2.12.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bare-buffer - bufferutil - supports-color - utf-8-validate - puppeteer@24.2.1(typescript@5.7.3): + puppeteer@24.6.1(typescript@5.8.3): dependencies: - '@puppeteer/browsers': 2.7.1 - chromium-bidi: 1.3.0(devtools-protocol@0.0.1402036) - cosmiconfig: 9.0.0(typescript@5.7.3) - devtools-protocol: 0.0.1402036 - puppeteer-core: 24.2.1 + '@puppeteer/browsers': 2.10.0 + chromium-bidi: 3.0.0(devtools-protocol@0.0.1425554) + cosmiconfig: 9.0.0(typescript@5.8.3) + devtools-protocol: 0.0.1425554 + puppeteer-core: 24.6.1 typed-query-selector: 2.12.0 transitivePeerDependencies: - bare-buffer @@ -11078,15 +10866,15 @@ snapshots: queue-microtask@1.2.3: {} - react-docgen-typescript@2.2.2(typescript@5.7.3): + react-docgen-typescript@2.2.2(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 react-docgen@7.1.1: dependencies: '@babel/core': 7.26.8 - '@babel/traverse': 7.26.8 - '@babel/types': 7.26.8 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 '@types/doctrine': 0.0.9 @@ -11097,19 +10885,19 @@ snapshots: transitivePeerDependencies: - supports-color - react-dom@19.0.0(react@19.0.0): + react-dom@19.1.0(react@19.1.0): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + react: 19.1.0 + scheduler: 0.26.0 - react-error-boundary@5.0.0(react@19.0.0): + react-error-boundary@5.0.0(react@19.1.0): dependencies: '@babel/runtime': 7.26.7 - react: 19.0.0 + react: 19.1.0 - react-icons@5.5.0(react@19.0.0): + react-icons@5.5.0(react@19.1.0): dependencies: - react: 19.0.0 + react: 19.1.0 react-is@16.13.1: {} @@ -11117,58 +10905,62 @@ snapshots: react-is@18.3.1: {} - react-is@19.0.0: {} + react-is@19.1.0: {} react-refresh@0.14.2: {} - react-router-dom@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-router-dom@7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-router: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-router: 7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-router@7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-router@7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@types/cookie': 0.6.0 cookie: 1.0.2 - react: 19.0.0 + react: 19.1.0 set-cookie-parser: 2.7.1 turbo-stream: 2.4.0 optionalDependencies: - react-dom: 19.0.0(react@19.0.0) + react-dom: 19.1.0(react@19.1.0) - react-select@5.10.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-select@5.10.1(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@babel/runtime': 7.26.7 '@emotion/cache': 11.14.0 - '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) + '@emotion/react': 11.14.0(@types/react@19.1.2)(react@19.1.0) '@floating-ui/dom': 1.6.13 - '@types/react-transition-group': 4.4.12(@types/react@19.0.10) + '@types/react-transition-group': 4.4.12(@types/react@19.1.2) memoize-one: 6.0.0 prop-types: 15.8.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.10)(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-transition-group: 4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + use-isomorphic-layout-effect: 1.2.0(@types/react@19.1.2)(react@19.1.0) transitivePeerDependencies: - '@types/react' - supports-color - react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-speech-recognition@4.0.0(react@19.1.0): + dependencies: + react: 19.1.0 + + react-transition-group@4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@babel/runtime': 7.26.7 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) - react-universal-interface@0.6.2(react@19.0.0)(tslib@2.8.1): + react-universal-interface@0.6.2(react@19.1.0)(tslib@2.8.1): dependencies: - react: 19.0.0 + react: 19.1.0 tslib: 2.8.1 - react-use@17.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-use@17.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -11176,10 +10968,10 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-universal-interface: 0.6.2(react@19.0.0)(tslib@2.8.1) + nano-css: 5.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-universal-interface: 0.6.2(react@19.1.0)(tslib@2.8.1) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 @@ -11187,7 +10979,7 @@ snapshots: ts-easing: 0.2.0 tslib: 2.8.1 - react@19.0.0: {} + react@19.1.0: {} read-cache@1.0.0: dependencies: @@ -11378,7 +11170,7 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.25.0: {} + scheduler@0.26.0: {} screenfull@5.2.0: {} @@ -11539,13 +11331,13 @@ snapshots: stack-generator: 2.0.10 stacktrace-gps: 3.1.2 - std-env@3.8.0: {} + std-env@3.8.1: {} - storybook@8.5.8(prettier@3.5.2): + storybook@8.6.12(prettier@3.5.3): dependencies: - '@storybook/core': 8.5.8(prettier@3.5.2) + '@storybook/core': 8.6.12(prettier@3.5.3)(storybook@8.6.12(prettier@3.5.3)) optionalDependencies: - prettier: 3.5.2 + prettier: 3.5.3 transitivePeerDependencies: - bufferutil - supports-color @@ -11669,8 +11461,6 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 - summary@2.1.0: {} - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -11683,7 +11473,7 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -11702,7 +11492,7 @@ snapshots: postcss: 8.5.2 postcss-import: 15.1.0(postcss@8.5.2) postcss-js: 4.0.1(postcss@8.5.2) - postcss-load-config: 4.0.2(postcss@8.5.2)(ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3)) + postcss-load-config: 4.0.2(postcss@8.5.2)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.2) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -11781,9 +11571,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.0.1(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.8.3): dependencies: - typescript: 5.7.3 + typescript: 5.8.3 ts-dedent@2.2.0: {} @@ -11791,21 +11581,21 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@22.13.5)(typescript@5.7.3): + ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.5 + '@types/node': 22.14.1 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.7.3 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -11871,7 +11661,7 @@ snapshots: typed-query-selector@2.12.0: {} - typescript@5.7.3: {} + typescript@5.8.3: {} unbox-primitive@1.1.0: dependencies: @@ -11880,7 +11670,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.20.0: {} + undici-types@6.21.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -11948,17 +11738,17 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-isomorphic-layout-effect@1.2.0(@types/react@19.0.10)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@19.1.2)(react@19.1.0): dependencies: - react: 19.0.0 + react: 19.1.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.1.2 - use-resize-observer@9.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + use-resize-observer@9.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@juggle/resize-observer': 3.4.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) util-deprecate@1.0.2: {} @@ -11990,13 +11780,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.6(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0): + vite-node@3.1.1(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -12011,42 +11801,42 @@ snapshots: - tsx - yaml - vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0): + vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0): dependencies: - esbuild: 0.24.2 - postcss: 8.5.2 + esbuild: 0.25.1 + postcss: 8.5.3 rollup: 4.34.6 optionalDependencies: - '@types/node': 22.13.5 + '@types/node': 22.14.1 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.7.0 - vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@20.0.3)(yaml@2.7.0): + vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(jsdom@20.0.3)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.0.6 - '@vitest/mocker': 3.0.6(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.6 - '@vitest/runner': 3.0.6 - '@vitest/snapshot': 3.0.6 - '@vitest/spy': 3.0.6 - '@vitest/utils': 3.0.6 + '@vitest/expect': 3.1.1 + '@vitest/mocker': 3.1.1(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0)) + '@vitest/pretty-format': 3.1.1 + '@vitest/runner': 3.1.1 + '@vitest/snapshot': 3.1.1 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 chai: 5.2.0 debug: 4.4.0 - expect-type: 1.1.0 + expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.0 + std-env: 3.8.1 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) - vite-node: 3.0.6(@types/node@22.13.5)(jiti@2.4.2)(yaml@2.7.0) + vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) + vite-node: 3.1.1(@types/node@22.14.1)(jiti@2.4.2)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.13.5 + '@types/node': 22.14.1 jsdom: 20.0.3 transitivePeerDependencies: - jiti @@ -12170,6 +11960,8 @@ snapshots: ws@8.18.0: {} + ws@8.18.1: {} + xml-name-validator@4.0.0: {} xmlchars@2.2.0: {} @@ -12209,9 +12001,9 @@ snapshots: zod@3.24.2: {} - zustand@5.0.3(@types/react@19.0.10)(react@19.0.0): + zustand@5.0.3(@types/react@19.1.2)(react@19.1.0): optionalDependencies: - '@types/react': 19.0.10 - react: 19.0.0 + '@types/react': 19.1.2 + react: 19.1.0 zwitch@2.0.4: {} diff --git a/front/public/icons/icon-192x192.png b/front/public/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..af070ea70379c272c6d192ebf8faadff14e6dead GIT binary patch literal 11999 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 literal 0 HcmV?d00001 diff --git a/front/public/manifest.json b/front/public/manifest.json new file mode 100644 index 0000000..fb3cb10 --- /dev/null +++ b/front/public/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Karusic", + "short_name": "Karusic", + "description": "(K)angaroo (A)nd (R)abbit m(usic) is a music streaming", + "start_url": "/karusic/", + "display": "standalone", + "background_color": "#000000", + "theme_color": "#FFFFFF", + "icons": [ + { + "src": "/karusic/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/karusic/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/front/src/back-api/api/data-resource.ts b/front/src/back-api/api/data-resource.ts index 7b32bb2..1ce6821 100644 --- a/front/src/back-api/api/data-resource.ts +++ b/front/src/back-api/api/data-resource.ts @@ -22,7 +22,7 @@ export namespace DataResource { restConfig, queries, params, - data, + headers, }: { restConfig: RESTConfig, queries: { @@ -32,7 +32,9 @@ export namespace DataResource { name: string, oid: ObjectId, }, - data: string, + headers?: { + Range?: string, + }, }): Promise { return RESTRequestJson({ restModel: { @@ -42,7 +44,7 @@ export namespace DataResource { restConfig, params, queries, - data, + headers, }); }; /** @@ -52,7 +54,7 @@ export namespace DataResource { restConfig, queries, params, - data, + headers, }: { restConfig: RESTConfig, queries: { @@ -61,7 +63,9 @@ export namespace DataResource { params: { oid: ObjectId, }, - data: string, + headers?: { + Range: string, + }, }): Promise { return RESTRequestJson({ restModel: { @@ -71,7 +75,7 @@ export namespace DataResource { restConfig, params, queries, - data, + headers, }); }; /** @@ -81,7 +85,7 @@ export namespace DataResource { restConfig, queries, params, - data, + headers, }: { restConfig: RESTConfig, queries: { @@ -90,7 +94,9 @@ export namespace DataResource { params: { oid: ObjectId, }, - data: string, + headers?: { + Range: string, + }, }): Promise { return RESTRequestJson({ restModel: { @@ -100,7 +106,7 @@ export namespace DataResource { restConfig, params, queries, - data, + headers, }); }; /** diff --git a/front/src/back-api/api/media-resource.ts b/front/src/back-api/api/media-resource.ts index a4dbcc5..f3d8c17 100644 --- a/front/src/back-api/api/media-resource.ts +++ b/front/src/back-api/api/media-resource.ts @@ -14,7 +14,7 @@ import { z as zod } from "zod" import { Long, Media, - MediaWrite, + MediaUpdate, UUID, ZodMedia, isMedia, @@ -87,12 +87,12 @@ export namespace MediaResource { params: { id: Long, }, - data: MediaWrite, + data: MediaUpdate, }): Promise { return RESTRequestJson({ restModel: { endPoint: "/media/{id}", - requestType: HTTPRequestModel.PATCH, + requestType: HTTPRequestModel.PUT, contentType: HTTPMimeType.JSON, accept: HTTPMimeType.JSON, }, diff --git a/front/src/back-api/api/season-resource.ts b/front/src/back-api/api/season-resource.ts index 78ecc70..6f49008 100644 --- a/front/src/back-api/api/season-resource.ts +++ b/front/src/back-api/api/season-resource.ts @@ -14,7 +14,8 @@ import { z as zod } from "zod" import { Long, Season, - SeasonWrite, + SeasonCreate, + SeasonUpdate, UUID, ZodSeason, isSeason, @@ -88,12 +89,12 @@ export namespace SeasonResource { params: { id: Long, }, - data: SeasonWrite, + data: SeasonUpdate, }): Promise { return RESTRequestJson({ restModel: { endPoint: "/season/{id}", - requestType: HTTPRequestModel.PATCH, + requestType: HTTPRequestModel.PUT, contentType: HTTPMimeType.JSON, accept: HTTPMimeType.JSON, }, @@ -110,7 +111,7 @@ export namespace SeasonResource { data, }: { restConfig: RESTConfig, - data: SeasonWrite, + data: SeasonCreate, }): Promise { return RESTRequestJson({ restModel: { diff --git a/front/src/back-api/api/series-resource.ts b/front/src/back-api/api/series-resource.ts index 18c90c6..07e75c4 100644 --- a/front/src/back-api/api/series-resource.ts +++ b/front/src/back-api/api/series-resource.ts @@ -14,7 +14,8 @@ import { z as zod } from "zod" import { Long, Series, - SeriesWrite, + SeriesCreate, + SeriesUpdate, UUID, ZodSeries, isSeries, @@ -88,12 +89,12 @@ export namespace SeriesResource { params: { id: Long, }, - data: SeriesWrite, + data: SeriesUpdate, }): Promise { return RESTRequestJson({ restModel: { endPoint: "/series/{id}", - requestType: HTTPRequestModel.PATCH, + requestType: HTTPRequestModel.PUT, contentType: HTTPMimeType.JSON, accept: HTTPMimeType.JSON, }, @@ -110,7 +111,7 @@ export namespace SeriesResource { data, }: { restConfig: RESTConfig, - data: SeriesWrite, + data: SeriesCreate, }): Promise { return RESTRequestJson({ restModel: { diff --git a/front/src/back-api/api/type-resource.ts b/front/src/back-api/api/type-resource.ts index 8b3da6e..6347546 100644 --- a/front/src/back-api/api/type-resource.ts +++ b/front/src/back-api/api/type-resource.ts @@ -14,7 +14,8 @@ import { z as zod } from "zod" import { Long, Type, - TypeWrite, + TypeCreate, + TypeUpdate, UUID, ZodType, isType, @@ -88,12 +89,12 @@ export namespace TypeResource { params: { id: Long, }, - data: TypeWrite, + data: TypeUpdate, }): Promise { return RESTRequestJson({ restModel: { endPoint: "/type/{id}", - requestType: HTTPRequestModel.PATCH, + requestType: HTTPRequestModel.PUT, contentType: HTTPMimeType.JSON, accept: HTTPMimeType.JSON, }, @@ -110,7 +111,7 @@ export namespace TypeResource { data, }: { restConfig: RESTConfig, - data: TypeWrite, + data: TypeCreate, }): Promise { return RESTRequestJson({ restModel: { diff --git a/front/src/back-api/api/user-media-advancement-resource.ts b/front/src/back-api/api/user-media-advancement-resource.ts index fd66801..954b41d 100644 --- a/front/src/back-api/api/user-media-advancement-resource.ts +++ b/front/src/back-api/api/user-media-advancement-resource.ts @@ -12,7 +12,7 @@ import { import { z as zod } from "zod" import { Long, - MediaInformationsDeltaWrite, + MediaInformationsDelta, UserMediaAdvancement, ZodUserMediaAdvancement, isUserMediaAdvancement, @@ -85,12 +85,12 @@ export namespace UserMediaAdvancementResource { params: { id: Long, }, - data: MediaInformationsDeltaWrite, + data: MediaInformationsDelta, }): Promise { return RESTRequestJson({ restModel: { endPoint: "/advancement/{id}", - requestType: HTTPRequestModel.PATCH, + requestType: HTTPRequestModel.PUT, contentType: HTTPMimeType.JSON, accept: HTTPMimeType.JSON, }, diff --git a/front/src/back-api/model/data.ts b/front/src/back-api/model/data.ts index be379d2..c962501 100644 --- a/front/src/back-api/model/data.ts +++ b/front/src/back-api/model/data.ts @@ -3,23 +3,23 @@ */ import { z as zod } from "zod"; -import {ZodLong} from "./long"; import {ZodObjectId} from "./object-id"; -import {ZodOIDGenericDataSoftDelete, ZodOIDGenericDataSoftDeleteWrite } from "./oid-generic-data-soft-delete"; +import {ZodLong} from "./long"; +import {ZodOIDGenericDataSoftDelete, ZodOIDGenericDataSoftDeleteUpdate , ZodOIDGenericDataSoftDeleteCreate } from "./oid-generic-data-soft-delete"; export const ZodData = ZodOIDGenericDataSoftDelete.extend({ /** * Sha512 of the data */ - sha512: zod.string().max(512), + sha512: zod.string().max(512).readonly(), /** * Mime -type of the media */ - mimeType: zod.string().max(512), + mimeType: zod.string().max(512).readonly(), /** * Size in Byte of the data */ - size: ZodLong, + size: ZodLong.readonly(), /** * Unique ObjectID of the object */ @@ -38,30 +38,3 @@ export function isData(data: any): data is Data { return false; } } -export const ZodDataWrite = ZodOIDGenericDataSoftDeleteWrite.extend({ - /** - * Sha512 of the data - */ - sha512: zod.string().max(512).optional(), - /** - * Mime -type of the media - */ - mimeType: zod.string().max(512).optional(), - /** - * Size in Byte of the data - */ - size: ZodLong.optional(), - -}); - -export type DataWrite = zod.infer; - -export function isDataWrite(data: any): data is DataWrite { - try { - ZodDataWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodDataWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/generic-data-soft-delete.ts b/front/src/back-api/model/generic-data-soft-delete.ts index 741eee0..a9e6438 100644 --- a/front/src/back-api/model/generic-data-soft-delete.ts +++ b/front/src/back-api/model/generic-data-soft-delete.ts @@ -3,7 +3,7 @@ */ import { z as zod } from "zod"; -import {ZodGenericData, ZodGenericDataWrite } from "./generic-data"; +import {ZodGenericData, ZodGenericDataUpdate , ZodGenericDataCreate } from "./generic-data"; export const ZodGenericDataSoftDelete = ZodGenericData.extend({ /** @@ -24,16 +24,29 @@ export function isGenericDataSoftDelete(data: any): data is GenericDataSoftDelet return false; } } -export const ZodGenericDataSoftDeleteWrite = ZodGenericDataWrite; +export const ZodGenericDataSoftDeleteUpdate = ZodGenericDataUpdate; -export type GenericDataSoftDeleteWrite = zod.infer; +export type GenericDataSoftDeleteUpdate = zod.infer; -export function isGenericDataSoftDeleteWrite(data: any): data is GenericDataSoftDeleteWrite { +export function isGenericDataSoftDeleteUpdate(data: any): data is GenericDataSoftDeleteUpdate { try { - ZodGenericDataSoftDeleteWrite.parse(data); + ZodGenericDataSoftDeleteUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodGenericDataSoftDeleteWrite' error=${e}`); + console.log(`Fail to parse data type='ZodGenericDataSoftDeleteUpdate' error=${e}`); + return false; + } +} +export const ZodGenericDataSoftDeleteCreate = ZodGenericDataCreate; + +export type GenericDataSoftDeleteCreate = zod.infer; + +export function isGenericDataSoftDeleteCreate(data: any): data is GenericDataSoftDeleteCreate { + try { + ZodGenericDataSoftDeleteCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodGenericDataSoftDeleteCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/generic-data.ts b/front/src/back-api/model/generic-data.ts index 898b37a..aaf52a6 100644 --- a/front/src/back-api/model/generic-data.ts +++ b/front/src/back-api/model/generic-data.ts @@ -3,8 +3,8 @@ */ import { z as zod } from "zod"; +import {ZodGenericTiming, ZodGenericTimingUpdate , ZodGenericTimingCreate } from "./generic-timing"; import {ZodLong} from "./long"; -import {ZodGenericTiming, ZodGenericTimingWrite } from "./generic-timing"; export const ZodGenericData = ZodGenericTiming.extend({ /** @@ -25,16 +25,29 @@ export function isGenericData(data: any): data is GenericData { return false; } } -export const ZodGenericDataWrite = ZodGenericTimingWrite; +export const ZodGenericDataUpdate = ZodGenericTimingUpdate; -export type GenericDataWrite = zod.infer; +export type GenericDataUpdate = zod.infer; -export function isGenericDataWrite(data: any): data is GenericDataWrite { +export function isGenericDataUpdate(data: any): data is GenericDataUpdate { try { - ZodGenericDataWrite.parse(data); + ZodGenericDataUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodGenericDataWrite' error=${e}`); + console.log(`Fail to parse data type='ZodGenericDataUpdate' error=${e}`); + return false; + } +} +export const ZodGenericDataCreate = ZodGenericTimingCreate; + +export type GenericDataCreate = zod.infer; + +export function isGenericDataCreate(data: any): data is GenericDataCreate { + try { + ZodGenericDataCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodGenericDataCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/generic-timing.ts b/front/src/back-api/model/generic-timing.ts index d1e28d7..9d5b1e1 100644 --- a/front/src/back-api/model/generic-timing.ts +++ b/front/src/back-api/model/generic-timing.ts @@ -28,18 +28,33 @@ export function isGenericTiming(data: any): data is GenericTiming { return false; } } -export const ZodGenericTimingWrite = zod.object({ +export const ZodGenericTimingUpdate = zod.object({ }); -export type GenericTimingWrite = zod.infer; +export type GenericTimingUpdate = zod.infer; -export function isGenericTimingWrite(data: any): data is GenericTimingWrite { +export function isGenericTimingUpdate(data: any): data is GenericTimingUpdate { try { - ZodGenericTimingWrite.parse(data); + ZodGenericTimingUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodGenericTimingWrite' error=${e}`); + console.log(`Fail to parse data type='ZodGenericTimingUpdate' error=${e}`); + return false; + } +} +export const ZodGenericTimingCreate = zod.object({ + +}); + +export type GenericTimingCreate = zod.infer; + +export function isGenericTimingCreate(data: any): data is GenericTimingCreate { + try { + ZodGenericTimingCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodGenericTimingCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/health-result.ts b/front/src/back-api/model/health-result.ts index 2b265d6..12dd22c 100644 --- a/front/src/back-api/model/health-result.ts +++ b/front/src/back-api/model/health-result.ts @@ -19,18 +19,3 @@ export function isHealthResult(data: any): data is HealthResult { return false; } } -export const ZodHealthResultWrite = zod.object({ - -}); - -export type HealthResultWrite = zod.infer; - -export function isHealthResultWrite(data: any): data is HealthResultWrite { - try { - ZodHealthResultWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodHealthResultWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/index.ts b/front/src/back-api/model/index.ts index 252035d..5189c97 100644 --- a/front/src/back-api/model/index.ts +++ b/front/src/back-api/model/index.ts @@ -18,7 +18,9 @@ export * from "./media-informations-delta" export * from "./object-id" export * from "./oid-generic-data" export * from "./oid-generic-data-soft-delete" +export * from "./part-right" export * from "./rest-error-response" +export * from "./rest-input-error" export * from "./season" export * from "./series" export * from "./timestamp" diff --git a/front/src/back-api/model/jwt-header.ts b/front/src/back-api/model/jwt-header.ts index a89fe30..8ce3551 100644 --- a/front/src/back-api/model/jwt-header.ts +++ b/front/src/back-api/model/jwt-header.ts @@ -21,20 +21,3 @@ export function isJwtHeader(data: any): data is JwtHeader { return false; } } -export const ZodJwtHeaderWrite = zod.object({ - typ: zod.string().max(128).optional(), - alg: zod.string().max(128).optional(), - -}); - -export type JwtHeaderWrite = zod.infer; - -export function isJwtHeaderWrite(data: any): data is JwtHeaderWrite { - try { - ZodJwtHeaderWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodJwtHeaderWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/jwt-payload.ts b/front/src/back-api/model/jwt-payload.ts index 27b88e1..5ebcdaf 100644 --- a/front/src/back-api/model/jwt-payload.ts +++ b/front/src/back-api/model/jwt-payload.ts @@ -27,25 +27,3 @@ export function isJwtPayload(data: any): data is JwtPayload { return false; } } -export const ZodJwtPayloadWrite = zod.object({ - sub: zod.string().optional(), - application: zod.string().optional(), - iss: zod.string().optional(), - right: zod.record(zod.string(), zod.record(zod.string(), ZodLong)).optional(), - login: zod.string().optional(), - exp: ZodLong.optional(), - iat: ZodLong.optional(), - -}); - -export type JwtPayloadWrite = zod.infer; - -export function isJwtPayloadWrite(data: any): data is JwtPayloadWrite { - try { - ZodJwtPayloadWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodJwtPayloadWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/jwt-token.ts b/front/src/back-api/model/jwt-token.ts index af74806..5f9c974 100644 --- a/front/src/back-api/model/jwt-token.ts +++ b/front/src/back-api/model/jwt-token.ts @@ -3,8 +3,8 @@ */ import { z as zod } from "zod"; -import {ZodJwtHeader, ZodJwtHeaderWrite } from "./jwt-header"; -import {ZodJwtPayload, ZodJwtPayloadWrite } from "./jwt-payload"; +import {ZodJwtHeader} from "./jwt-header"; +import {ZodJwtPayload} from "./jwt-payload"; export const ZodJwtToken = zod.object({ header: ZodJwtHeader, @@ -24,21 +24,3 @@ export function isJwtToken(data: any): data is JwtToken { return false; } } -export const ZodJwtTokenWrite = zod.object({ - header: ZodJwtHeader.optional(), - payload: ZodJwtPayload.optional(), - signature: zod.string().optional(), - -}); - -export type JwtTokenWrite = zod.infer; - -export function isJwtTokenWrite(data: any): data is JwtTokenWrite { - try { - ZodJwtTokenWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodJwtTokenWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/media-informations-delta.ts b/front/src/back-api/model/media-informations-delta.ts index 5658b4e..5aa27d5 100644 --- a/front/src/back-api/model/media-informations-delta.ts +++ b/front/src/back-api/model/media-informations-delta.ts @@ -19,18 +19,3 @@ export function isMediaInformationsDelta(data: any): data is MediaInformationsDe return false; } } -export const ZodMediaInformationsDeltaWrite = zod.object({ - -}); - -export type MediaInformationsDeltaWrite = zod.infer; - -export function isMediaInformationsDeltaWrite(data: any): data is MediaInformationsDeltaWrite { - try { - ZodMediaInformationsDeltaWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodMediaInformationsDeltaWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/media.ts b/front/src/back-api/model/media.ts index 6bacd0b..d0a5991 100644 --- a/front/src/back-api/model/media.ts +++ b/front/src/back-api/model/media.ts @@ -4,25 +4,24 @@ import { z as zod } from "zod"; import {ZodObjectId} from "./object-id"; -import {ZodUUID} from "./uuid"; import {ZodLong} from "./long"; import {ZodInteger} from "./integer"; -import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteWrite } from "./generic-data-soft-delete"; +import {ZodIsoDate} from "./iso-date"; +import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteUpdate , ZodGenericDataSoftDeleteCreate } from "./generic-data-soft-delete"; export const ZodMedia = ZodGenericDataSoftDelete.extend({ /** * Name of the media (this represent the title) */ - name: zod.string(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().optional(), + description: zod.string().max(8192).optional(), /** * Foreign Key Id of the data */ dataId: ZodObjectId, - dataIdOld: ZodUUID.optional(), /** * Type of the media */ @@ -39,11 +38,10 @@ export const ZodMedia = ZodGenericDataSoftDelete.extend({ * Episode Id */ episode: ZodInteger.optional(), - date: ZodInteger.optional(), /** * Creation years of the media */ - time: ZodInteger.optional(), + datePublication: ZodIsoDate.optional(), /** * Limitation Age of the media */ @@ -66,20 +64,19 @@ export function isMedia(data: any): data is Media { return false; } } -export const ZodMediaWrite = ZodGenericDataSoftDeleteWrite.extend({ +export const ZodMediaUpdate = ZodGenericDataSoftDeleteUpdate.extend({ /** * Name of the media (this represent the title) */ - name: zod.string().optional(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().nullable().optional(), + description: zod.string().max(8192).nullable().optional(), /** * Foreign Key Id of the data */ - dataId: ZodObjectId.optional(), - dataIdOld: ZodUUID.nullable().optional(), + dataId: ZodObjectId, /** * Type of the media */ @@ -96,11 +93,10 @@ export const ZodMediaWrite = ZodGenericDataSoftDeleteWrite.extend({ * Episode Id */ episode: ZodInteger.nullable().optional(), - date: ZodInteger.nullable().optional(), /** * Creation years of the media */ - time: ZodInteger.nullable().optional(), + datePublication: ZodIsoDate.nullable().optional(), /** * Limitation Age of the media */ @@ -112,14 +108,69 @@ export const ZodMediaWrite = ZodGenericDataSoftDeleteWrite.extend({ }); -export type MediaWrite = zod.infer; +export type MediaUpdate = zod.infer; -export function isMediaWrite(data: any): data is MediaWrite { +export function isMediaUpdate(data: any): data is MediaUpdate { try { - ZodMediaWrite.parse(data); + ZodMediaUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodMediaWrite' error=${e}`); + console.log(`Fail to parse data type='ZodMediaUpdate' error=${e}`); + return false; + } +} +export const ZodMediaCreate = ZodGenericDataSoftDeleteCreate.extend({ + /** + * Name of the media (this represent the title) + */ + name: zod.string().max(256), + /** + * Description of the media + */ + description: zod.string().max(8192).nullable().optional(), + /** + * Foreign Key Id of the data + */ + dataId: ZodObjectId, + /** + * Type of the media + */ + typeId: ZodLong.nullable().optional(), + /** + * Series reference of the media + */ + seriesId: ZodLong.nullable().optional(), + /** + * Season reference of the media + */ + seasonId: ZodLong.nullable().optional(), + /** + * Episode Id + */ + episode: ZodInteger.nullable().optional(), + /** + * Creation years of the media + */ + datePublication: ZodIsoDate.nullable().optional(), + /** + * Limitation Age of the media + */ + ageLimit: ZodInteger.nullable().optional(), + /** + * List of Id of the specific covers + */ + covers: zod.array(ZodObjectId).nullable().optional(), + +}); + +export type MediaCreate = zod.infer; + +export function isMediaCreate(data: any): data is MediaCreate { + try { + ZodMediaCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodMediaCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/oid-generic-data-soft-delete.ts b/front/src/back-api/model/oid-generic-data-soft-delete.ts index 7bf9a18..ccaf260 100644 --- a/front/src/back-api/model/oid-generic-data-soft-delete.ts +++ b/front/src/back-api/model/oid-generic-data-soft-delete.ts @@ -4,7 +4,7 @@ import { z as zod } from "zod"; import {ZodObjectId} from "./object-id"; -import {ZodOIDGenericData, ZodOIDGenericDataWrite } from "./oid-generic-data"; +import {ZodOIDGenericData, ZodOIDGenericDataUpdate , ZodOIDGenericDataCreate } from "./oid-generic-data"; export const ZodOIDGenericDataSoftDelete = ZodOIDGenericData.extend({ /** @@ -29,16 +29,29 @@ export function isOIDGenericDataSoftDelete(data: any): data is OIDGenericDataSof return false; } } -export const ZodOIDGenericDataSoftDeleteWrite = ZodOIDGenericDataWrite; +export const ZodOIDGenericDataSoftDeleteUpdate = ZodOIDGenericDataUpdate; -export type OIDGenericDataSoftDeleteWrite = zod.infer; +export type OIDGenericDataSoftDeleteUpdate = zod.infer; -export function isOIDGenericDataSoftDeleteWrite(data: any): data is OIDGenericDataSoftDeleteWrite { +export function isOIDGenericDataSoftDeleteUpdate(data: any): data is OIDGenericDataSoftDeleteUpdate { try { - ZodOIDGenericDataSoftDeleteWrite.parse(data); + ZodOIDGenericDataSoftDeleteUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodOIDGenericDataSoftDeleteWrite' error=${e}`); + console.log(`Fail to parse data type='ZodOIDGenericDataSoftDeleteUpdate' error=${e}`); + return false; + } +} +export const ZodOIDGenericDataSoftDeleteCreate = ZodOIDGenericDataCreate; + +export type OIDGenericDataSoftDeleteCreate = zod.infer; + +export function isOIDGenericDataSoftDeleteCreate(data: any): data is OIDGenericDataSoftDeleteCreate { + try { + ZodOIDGenericDataSoftDeleteCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodOIDGenericDataSoftDeleteCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/oid-generic-data.ts b/front/src/back-api/model/oid-generic-data.ts index 35479a6..36a8faa 100644 --- a/front/src/back-api/model/oid-generic-data.ts +++ b/front/src/back-api/model/oid-generic-data.ts @@ -4,7 +4,7 @@ import { z as zod } from "zod"; import {ZodObjectId} from "./object-id"; -import {ZodGenericTiming, ZodGenericTimingWrite } from "./generic-timing"; +import {ZodGenericTiming, ZodGenericTimingUpdate , ZodGenericTimingCreate } from "./generic-timing"; export const ZodOIDGenericData = ZodGenericTiming.extend({ /** @@ -25,16 +25,29 @@ export function isOIDGenericData(data: any): data is OIDGenericData { return false; } } -export const ZodOIDGenericDataWrite = ZodGenericTimingWrite; +export const ZodOIDGenericDataUpdate = ZodGenericTimingUpdate; -export type OIDGenericDataWrite = zod.infer; +export type OIDGenericDataUpdate = zod.infer; -export function isOIDGenericDataWrite(data: any): data is OIDGenericDataWrite { +export function isOIDGenericDataUpdate(data: any): data is OIDGenericDataUpdate { try { - ZodOIDGenericDataWrite.parse(data); + ZodOIDGenericDataUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodOIDGenericDataWrite' error=${e}`); + console.log(`Fail to parse data type='ZodOIDGenericDataUpdate' error=${e}`); + return false; + } +} +export const ZodOIDGenericDataCreate = ZodGenericTimingCreate; + +export type OIDGenericDataCreate = zod.infer; + +export function isOIDGenericDataCreate(data: any): data is OIDGenericDataCreate { + try { + ZodOIDGenericDataCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodOIDGenericDataCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/rest-error-response.ts b/front/src/back-api/model/rest-error-response.ts index 4ee9576..d83aaa0 100644 --- a/front/src/back-api/model/rest-error-response.ts +++ b/front/src/back-api/model/rest-error-response.ts @@ -3,8 +3,9 @@ */ import { z as zod } from "zod"; -import {ZodObjectId} from "./object-id"; import {ZodInteger} from "./integer"; +import {ZodObjectId} from "./object-id"; +import {ZodRestInputError} from "./rest-input-error"; export const ZodRestErrorResponse = zod.object({ oid: ZodObjectId.optional(), @@ -13,6 +14,7 @@ export const ZodRestErrorResponse = zod.object({ time: zod.string(), status: ZodInteger, statusMessage: zod.string(), + inputError: zod.array(ZodRestInputError).optional(), }); diff --git a/front/src/back-api/model/rest-input-error.ts b/front/src/back-api/model/rest-input-error.ts new file mode 100644 index 0000000..9b77edb --- /dev/null +++ b/front/src/back-api/model/rest-input-error.ts @@ -0,0 +1,24 @@ +/** + * Interface of the server (auto-generated code) + */ +import { z as zod } from "zod"; + + +export const ZodRestInputError = zod.object({ + argument: zod.string().optional(), + path: zod.string().optional(), + message: zod.string(), + +}); + +export type RestInputError = zod.infer; + +export function isRestInputError(data: any): data is RestInputError { + try { + ZodRestInputError.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodRestInputError' error=${e}`); + return false; + } +} diff --git a/front/src/back-api/model/season.ts b/front/src/back-api/model/season.ts index 1b8f511..8a3c83b 100644 --- a/front/src/back-api/model/season.ts +++ b/front/src/back-api/model/season.ts @@ -3,19 +3,19 @@ */ import { z as zod } from "zod"; -import {ZodLong} from "./long"; import {ZodObjectId} from "./object-id"; -import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteWrite } from "./generic-data-soft-delete"; +import {ZodLong} from "./long"; +import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteUpdate , ZodGenericDataSoftDeleteCreate } from "./generic-data-soft-delete"; export const ZodSeason = ZodGenericDataSoftDelete.extend({ /** * Name of the media (this represent the title) */ - name: zod.string(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().optional(), + description: zod.string().max(8192).optional(), /** * series parent ID */ @@ -38,19 +38,19 @@ export function isSeason(data: any): data is Season { return false; } } -export const ZodSeasonWrite = ZodGenericDataSoftDeleteWrite.extend({ +export const ZodSeasonUpdate = ZodGenericDataSoftDeleteUpdate.extend({ /** * Name of the media (this represent the title) */ - name: zod.string().optional(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().nullable().optional(), + description: zod.string().max(8192).nullable().optional(), /** * series parent ID */ - parentId: ZodLong.optional(), + parentId: ZodLong, /** * List of Id of the specific covers */ @@ -58,14 +58,45 @@ export const ZodSeasonWrite = ZodGenericDataSoftDeleteWrite.extend({ }); -export type SeasonWrite = zod.infer; +export type SeasonUpdate = zod.infer; -export function isSeasonWrite(data: any): data is SeasonWrite { +export function isSeasonUpdate(data: any): data is SeasonUpdate { try { - ZodSeasonWrite.parse(data); + ZodSeasonUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodSeasonWrite' error=${e}`); + console.log(`Fail to parse data type='ZodSeasonUpdate' error=${e}`); + return false; + } +} +export const ZodSeasonCreate = ZodGenericDataSoftDeleteCreate.extend({ + /** + * Name of the media (this represent the title) + */ + name: zod.string().max(256), + /** + * Description of the media + */ + description: zod.string().max(8192).nullable().optional(), + /** + * series parent ID + */ + parentId: ZodLong, + /** + * List of Id of the specific covers + */ + covers: zod.array(ZodObjectId).nullable().optional(), + +}); + +export type SeasonCreate = zod.infer; + +export function isSeasonCreate(data: any): data is SeasonCreate { + try { + ZodSeasonCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodSeasonCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/series.ts b/front/src/back-api/model/series.ts index 3840b76..dd04f48 100644 --- a/front/src/back-api/model/series.ts +++ b/front/src/back-api/model/series.ts @@ -3,19 +3,19 @@ */ import { z as zod } from "zod"; -import {ZodLong} from "./long"; import {ZodObjectId} from "./object-id"; -import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteWrite } from "./generic-data-soft-delete"; +import {ZodLong} from "./long"; +import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteUpdate , ZodGenericDataSoftDeleteCreate } from "./generic-data-soft-delete"; export const ZodSeries = ZodGenericDataSoftDelete.extend({ /** * Name of the media (this represent the title) */ - name: zod.string(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().optional(), + description: zod.string().max(8192).optional(), /** * series parent ID */ @@ -38,19 +38,19 @@ export function isSeries(data: any): data is Series { return false; } } -export const ZodSeriesWrite = ZodGenericDataSoftDeleteWrite.extend({ +export const ZodSeriesUpdate = ZodGenericDataSoftDeleteUpdate.extend({ /** * Name of the media (this represent the title) */ - name: zod.string().optional(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().nullable().optional(), + description: zod.string().max(8192).nullable().optional(), /** * series parent ID */ - parentId: ZodLong.optional(), + parentId: ZodLong, /** * List of Id of the specific covers */ @@ -58,14 +58,45 @@ export const ZodSeriesWrite = ZodGenericDataSoftDeleteWrite.extend({ }); -export type SeriesWrite = zod.infer; +export type SeriesUpdate = zod.infer; -export function isSeriesWrite(data: any): data is SeriesWrite { +export function isSeriesUpdate(data: any): data is SeriesUpdate { try { - ZodSeriesWrite.parse(data); + ZodSeriesUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodSeriesWrite' error=${e}`); + console.log(`Fail to parse data type='ZodSeriesUpdate' error=${e}`); + return false; + } +} +export const ZodSeriesCreate = ZodGenericDataSoftDeleteCreate.extend({ + /** + * Name of the media (this represent the title) + */ + name: zod.string().max(256), + /** + * Description of the media + */ + description: zod.string().max(8192).nullable().optional(), + /** + * series parent ID + */ + parentId: ZodLong, + /** + * List of Id of the specific covers + */ + covers: zod.array(ZodObjectId).nullable().optional(), + +}); + +export type SeriesCreate = zod.infer; + +export function isSeriesCreate(data: any): data is SeriesCreate { + try { + ZodSeriesCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodSeriesCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/type.ts b/front/src/back-api/model/type.ts index daa43f6..b045c9b 100644 --- a/front/src/back-api/model/type.ts +++ b/front/src/back-api/model/type.ts @@ -4,17 +4,17 @@ import { z as zod } from "zod"; import {ZodObjectId} from "./object-id"; -import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteWrite } from "./generic-data-soft-delete"; +import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteUpdate , ZodGenericDataSoftDeleteCreate } from "./generic-data-soft-delete"; export const ZodType = ZodGenericDataSoftDelete.extend({ /** * Name of the media (this represent the title) */ - name: zod.string(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().optional(), + description: zod.string().max(8192).optional(), /** * List of Id of the specific covers */ @@ -33,15 +33,15 @@ export function isType(data: any): data is Type { return false; } } -export const ZodTypeWrite = ZodGenericDataSoftDeleteWrite.extend({ +export const ZodTypeUpdate = ZodGenericDataSoftDeleteUpdate.extend({ /** * Name of the media (this represent the title) */ - name: zod.string().optional(), + name: zod.string().max(256), /** * Description of the media */ - description: zod.string().nullable().optional(), + description: zod.string().max(8192).nullable().optional(), /** * List of Id of the specific covers */ @@ -49,14 +49,41 @@ export const ZodTypeWrite = ZodGenericDataSoftDeleteWrite.extend({ }); -export type TypeWrite = zod.infer; +export type TypeUpdate = zod.infer; -export function isTypeWrite(data: any): data is TypeWrite { +export function isTypeUpdate(data: any): data is TypeUpdate { try { - ZodTypeWrite.parse(data); + ZodTypeUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodTypeWrite' error=${e}`); + console.log(`Fail to parse data type='ZodTypeUpdate' error=${e}`); + return false; + } +} +export const ZodTypeCreate = ZodGenericDataSoftDeleteCreate.extend({ + /** + * Name of the media (this represent the title) + */ + name: zod.string().max(256), + /** + * Description of the media + */ + description: zod.string().max(8192).nullable().optional(), + /** + * List of Id of the specific covers + */ + covers: zod.array(ZodObjectId).nullable().optional(), + +}); + +export type TypeCreate = zod.infer; + +export function isTypeCreate(data: any): data is TypeCreate { + try { + ZodTypeCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodTypeCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/user-karideo.ts b/front/src/back-api/model/user-karideo.ts index f8f8995..1bbe45a 100644 --- a/front/src/back-api/model/user-karideo.ts +++ b/front/src/back-api/model/user-karideo.ts @@ -3,7 +3,7 @@ */ import { z as zod } from "zod"; -import {ZodUser, ZodUserWrite } from "./user"; +import {ZodUser, ZodUserUpdate , ZodUserCreate } from "./user"; export const ZodUserKarideo = ZodUser; @@ -18,16 +18,3 @@ export function isUserKarideo(data: any): data is UserKarideo { return false; } } -export const ZodUserKarideoWrite = ZodUserWrite; - -export type UserKarideoWrite = zod.infer; - -export function isUserKarideoWrite(data: any): data is UserKarideoWrite { - try { - ZodUserKarideoWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodUserKarideoWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/user-media-advancement.ts b/front/src/back-api/model/user-media-advancement.ts index 8f4fa60..561df96 100644 --- a/front/src/back-api/model/user-media-advancement.ts +++ b/front/src/back-api/model/user-media-advancement.ts @@ -4,15 +4,15 @@ import { z as zod } from "zod"; import {ZodLong} from "./long"; -import {ZodFloat} from "./float"; import {ZodInteger} from "./integer"; -import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteWrite } from "./generic-data-soft-delete"; +import {ZodFloat} from "./float"; +import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteUpdate , ZodGenericDataSoftDeleteCreate } from "./generic-data-soft-delete"; export const ZodUserMediaAdvancement = ZodGenericDataSoftDelete.extend({ /** * Foreign Key Id of the user */ - userId: ZodLong.optional(), + userId: ZodLong.readonly().optional(), /** * Id of the media */ @@ -43,38 +43,65 @@ export function isUserMediaAdvancement(data: any): data is UserMediaAdvancement return false; } } -export const ZodUserMediaAdvancementWrite = ZodGenericDataSoftDeleteWrite.extend({ - /** - * Foreign Key Id of the user - */ - userId: ZodLong.nullable().optional(), +export const ZodUserMediaAdvancementUpdate = ZodGenericDataSoftDeleteUpdate.extend({ /** * Id of the media */ - mediaId: ZodLong.optional(), + mediaId: ZodLong, /** * Percent of advancement in the media */ - percent: ZodFloat.optional(), + percent: ZodFloat, /** * Number of second of advancement in the media */ - time: ZodInteger.optional(), + time: ZodInteger, /** * Number of time this media has been read */ - count: ZodInteger.optional(), + count: ZodInteger, }); -export type UserMediaAdvancementWrite = zod.infer; +export type UserMediaAdvancementUpdate = zod.infer; -export function isUserMediaAdvancementWrite(data: any): data is UserMediaAdvancementWrite { +export function isUserMediaAdvancementUpdate(data: any): data is UserMediaAdvancementUpdate { try { - ZodUserMediaAdvancementWrite.parse(data); + ZodUserMediaAdvancementUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodUserMediaAdvancementWrite' error=${e}`); + console.log(`Fail to parse data type='ZodUserMediaAdvancementUpdate' error=${e}`); + return false; + } +} +export const ZodUserMediaAdvancementCreate = ZodGenericDataSoftDeleteCreate.extend({ + /** + * Id of the media + */ + mediaId: ZodLong, + /** + * Percent of advancement in the media + */ + percent: ZodFloat, + /** + * Number of second of advancement in the media + */ + time: ZodInteger, + /** + * Number of time this media has been read + */ + count: ZodInteger, + +}); + +export type UserMediaAdvancementCreate = zod.infer; + +export function isUserMediaAdvancementCreate(data: any): data is UserMediaAdvancementCreate { + try { + ZodUserMediaAdvancementCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodUserMediaAdvancementCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/model/user-out.ts b/front/src/back-api/model/user-out.ts index afb77eb..20a784f 100644 --- a/front/src/back-api/model/user-out.ts +++ b/front/src/back-api/model/user-out.ts @@ -22,20 +22,3 @@ export function isUserOut(data: any): data is UserOut { return false; } } -export const ZodUserOutWrite = zod.object({ - id: ZodLong, - login: zod.string().nullable().optional(), - -}); - -export type UserOutWrite = zod.infer; - -export function isUserOutWrite(data: any): data is UserOutWrite { - try { - ZodUserOutWrite.parse(data); - return true; - } catch (e: any) { - console.log(`Fail to parse data type='ZodUserOutWrite' error=${e}`); - return false; - } -} diff --git a/front/src/back-api/model/user.ts b/front/src/back-api/model/user.ts index 0fc33b8..6bcc73c 100644 --- a/front/src/back-api/model/user.ts +++ b/front/src/back-api/model/user.ts @@ -5,7 +5,7 @@ import { z as zod } from "zod"; import {ZodTimestamp} from "./timestamp"; import {ZodUUID} from "./uuid"; -import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteWrite } from "./generic-data-soft-delete"; +import {ZodGenericDataSoftDelete, ZodGenericDataSoftDeleteUpdate , ZodGenericDataSoftDeleteCreate } from "./generic-data-soft-delete"; export const ZodUser = ZodGenericDataSoftDelete.extend({ login: zod.string().min(3).max(128), @@ -30,8 +30,8 @@ export function isUser(data: any): data is User { return false; } } -export const ZodUserWrite = ZodGenericDataSoftDeleteWrite.extend({ - login: zod.string().min(3).max(128).optional(), +export const ZodUserUpdate = ZodGenericDataSoftDeleteUpdate.extend({ + login: zod.string().min(3).max(128), lastConnection: ZodTimestamp.nullable().optional(), blocked: zod.boolean().nullable().optional(), blockedReason: zod.string().max(512).nullable().optional(), @@ -42,14 +42,37 @@ export const ZodUserWrite = ZodGenericDataSoftDeleteWrite.extend({ }); -export type UserWrite = zod.infer; +export type UserUpdate = zod.infer; -export function isUserWrite(data: any): data is UserWrite { +export function isUserUpdate(data: any): data is UserUpdate { try { - ZodUserWrite.parse(data); + ZodUserUpdate.parse(data); return true; } catch (e: any) { - console.log(`Fail to parse data type='ZodUserWrite' error=${e}`); + console.log(`Fail to parse data type='ZodUserUpdate' error=${e}`); + return false; + } +} +export const ZodUserCreate = ZodGenericDataSoftDeleteCreate.extend({ + login: zod.string().min(3).max(128), + lastConnection: ZodTimestamp.nullable().optional(), + blocked: zod.boolean().nullable().optional(), + blockedReason: zod.string().max(512).nullable().optional(), + /** + * List of Id of the specific covers + */ + covers: zod.array(ZodUUID).nullable().optional(), + +}); + +export type UserCreate = zod.infer; + +export function isUserCreate(data: any): data is UserCreate { + try { + ZodUserCreate.parse(data); + return true; + } catch (e: any) { + console.log(`Fail to parse data type='ZodUserCreate' error=${e}`); return false; } } diff --git a/front/src/back-api/rest-tools.ts b/front/src/back-api/rest-tools.ts index d269ed7..7c12d0d 100644 --- a/front/src/back-api/rest-tools.ts +++ b/front/src/back-api/rest-tools.ts @@ -3,30 +3,29 @@ * @copyright 2024, Edouard DUPIN, all right reserved * @license MPL-2 */ - -import { RestErrorResponse, isRestErrorResponse } from "./model"; +import { RestErrorResponse, isRestErrorResponse } from './model'; export enum HTTPRequestModel { - ARCHIVE = "ARCHIVE", - DELETE = "DELETE", - HEAD = "HEAD", - GET = "GET", - OPTION = "OPTION", - PATCH = "PATCH", - POST = "POST", - PUT = "PUT", - RESTORE = "RESTORE", + ARCHIVE = 'ARCHIVE', + DELETE = 'DELETE', + HEAD = 'HEAD', + GET = 'GET', + OPTION = 'OPTION', + PATCH = 'PATCH', + POST = 'POST', + PUT = 'PUT', + RESTORE = 'RESTORE', } export enum HTTPMimeType { - ALL = "*/*", - CSV = "text/csv", - IMAGE = "image/*", - IMAGE_JPEG = "image/jpeg", - IMAGE_PNG = "image/png", - JSON = "application/json", - MULTIPART = "multipart/form-data", - OCTET_STREAM = "application/octet-stream", - TEXT_PLAIN = "text/plain", + ALL = '*/*', + CSV = 'text/csv', + IMAGE = 'image/*', + IMAGE_JPEG = 'image/jpeg', + IMAGE_PNG = 'image/png', + JSON = 'application/json', + MULTIPART = 'multipart/form-data', + OCTET_STREAM = 'application/octet-stream', + TEXT_PLAIN = 'text/plain', } export interface RESTConfig { @@ -54,6 +53,14 @@ export interface ModelResponseHttp { data: any; } +export type ErrorRestApiCallback = (response: Response) => void; + +let errorApiGlobalCallback: ErrorRestApiCallback | undefined = undefined; + +export const setErrorApiGlobalCallback = (callback: ErrorRestApiCallback) => { + errorApiGlobalCallback = callback; +}; + function isNullOrUndefined(data: any): data is undefined | null { return data === undefined || data === null; } @@ -78,6 +85,7 @@ export interface RESTRequestType { data?: any; params?: object; queries?: object; + headers?: any; callbacks?: RESTCallbacks; } @@ -87,15 +95,15 @@ function replaceAll(input, searchValue, replaceValue) { function removeTrailingSlashes(input: string): string { if (isNullOrUndefined(input)) { - return "undefined"; + return 'undefined'; } - return input.replace(/\/+$/, ""); + return input.replace(/\/+$/, ''); } function removeLeadingSlashes(input: string): string { if (isNullOrUndefined(input)) { - return ""; + return ''; } - return input.replace(/^\/+/, ""); + return input.replace(/^\/+/, ''); } export function RESTUrl({ @@ -133,9 +141,9 @@ export function RESTUrl({ } } if (restConfig.token !== undefined && restModel.tokenInUrl === true) { - searchParams.append("Authorization", `Bearer ${restConfig.token}`); + searchParams.append('Authorization', `Bearer ${restConfig.token}`); } - return generateUrl + "?" + searchParams.toString(); + return generateUrl + '?' + searchParams.toString(); } export function fetchProgress( @@ -159,7 +167,7 @@ export function fetchProgress( return new Promise((resolve, reject) => { // Stream the upload progress if (progressUpload) { - xhr.io?.upload.addEventListener("progress", (dataEvent) => { + xhr.io?.upload.addEventListener('progress', (dataEvent) => { if (dataEvent.lengthComputable) { progressUpload(dataEvent.loaded, dataEvent.total); } @@ -167,7 +175,7 @@ export function fetchProgress( } // Stream the download progress if (progressDownload) { - xhr.io?.addEventListener("progress", (dataEvent) => { + xhr.io?.addEventListener('progress', (dataEvent) => { if (dataEvent.lengthComputable) { progressDownload(dataEvent.loaded, dataEvent.total); } @@ -187,19 +195,19 @@ export function fetchProgress( }; } // Check if we have an internal Fail: - xhr.io?.addEventListener("error", () => { + xhr.io?.addEventListener('error', () => { xhr.io = undefined; - reject(new TypeError("Failed to fetch")); + reject(new TypeError('Failed to fetch')); }); // Capture the end of the stream - xhr.io?.addEventListener("loadend", () => { + xhr.io?.addEventListener('loadend', () => { if (xhr.io?.readyState !== XMLHttpRequest.DONE) { return; } if (xhr.io?.status === 0) { //the stream has been aborted - reject(new TypeError("Fetch has been aborted")); + reject(new TypeError('Fetch has been aborted')); return; } // Stream is ended, transform in a generic response: @@ -209,17 +217,17 @@ export function fetchProgress( }); const headersArray = replaceAll( xhr.io.getAllResponseHeaders().trim(), - "\r\n", - "\n" - ).split("\n"); + '\r\n', + '\n' + ).split('\n'); headersArray.forEach(function (header) { - const firstColonIndex = header.indexOf(":"); + const firstColonIndex = header.indexOf(':'); if (firstColonIndex !== -1) { const key = header.substring(0, firstColonIndex).trim(); const value = header.substring(firstColonIndex + 1).trim(); response.headers.set(key, value); } else { - response.headers.set(header, ""); + response.headers.set(header, ''); } }); xhr.io = undefined; @@ -241,27 +249,29 @@ export function RESTRequest({ data, params, queries, + headers = {}, callbacks, }: RESTRequestType): Promise { // Create the URL PATH: let generateUrl = RESTUrl({ restModel, restConfig, data, params, queries }); - let headers: any = {}; if (restConfig.token !== undefined && restModel.tokenInUrl !== true) { - headers["Authorization"] = `Bearer ${restConfig.token}`; + headers['Authorization'] = `Bearer ${restConfig.token}`; } if (restModel.accept !== undefined) { - headers["Accept"] = restModel.accept; + headers['Accept'] = restModel.accept; } - if (restModel.requestType !== HTTPRequestModel.GET && - restModel.requestType !== HTTPRequestModel.ARCHIVE && - restModel.requestType !== HTTPRequestModel.RESTORE + if ( + restModel.requestType !== HTTPRequestModel.GET && + restModel.requestType !== HTTPRequestModel.ARCHIVE && + restModel.requestType !== HTTPRequestModel.RESTORE ) { // if Get we have not a content type, the body is empty - if (restModel.contentType !== HTTPMimeType.MULTIPART && - restModel.contentType !== undefined - ) { + if ( + restModel.contentType !== HTTPMimeType.MULTIPART && + restModel.contentType !== undefined + ) { // special case of multi-part ==> no content type otherwise the browser does not set the ";bundary=--****" - headers["Content-Type"] = restModel.contentType; + headers['Content-Type'] = restModel.contentType; } } let body = data; @@ -302,19 +312,27 @@ export function RESTRequest({ } action .then((response: Response) => { + if ( + errorApiGlobalCallback && + 400 <= response.status && + response.status <= 499 + ) { + // Detect an error and trigger the generic error callback: + errorApiGlobalCallback(response); + } if (response.status >= 200 && response.status <= 299) { - const contentType = response.headers.get("Content-Type"); + const contentType = response.headers.get('Content-Type'); if ( !isNullOrUndefined(restModel.accept) && restModel.accept !== contentType ) { reject({ - name: "Model accept type incompatible", + name: 'Model accept type incompatible', time: Date().toString(), status: 901, message: `REST Content type are not compatible: ${restModel.accept} != ${contentType}`, - statusMessage: "Fetch error", - error: "rest-tools.ts Wrong type in the message return type", + statusMessage: 'Fetch error', + error: 'rest-tools.ts Wrong type in the message return type', } as RestErrorResponse); } else if (contentType === HTTPMimeType.JSON) { response @@ -324,12 +342,12 @@ export function RESTRequest({ }) .catch((reason: Error) => { reject({ - name: "API serialization error", + name: 'API serialization error', time: Date().toString(), status: 902, message: `REST parse json fail: ${reason}`, - statusMessage: "Fetch parse error", - error: "rest-tools.ts Wrong message model to parse", + statusMessage: 'Fetch parse error', + error: 'rest-tools.ts Wrong message model to parse', } as RestErrorResponse); }); } else { @@ -349,22 +367,22 @@ export function RESTRequest({ .text() .then((dataError: string) => { reject({ - name: "API serialization error", + name: 'API serialization error', time: Date().toString(), status: 903, message: `REST parse error json with wrong type fail. ${dataError}`, - statusMessage: "Fetch parse error", - error: "rest-tools.ts Wrong message model to parse", + statusMessage: 'Fetch parse error', + error: 'rest-tools.ts Wrong message model to parse', } as RestErrorResponse); }) .catch((reason: any) => { reject({ - name: "API serialization error", + name: 'API serialization error', time: Date().toString(), status: response.status, message: `unmanaged error model: ??? with error: ${reason}`, - statusMessage: "Fetch ERROR parse error", - error: "rest-tools.ts Wrong message model to parse", + statusMessage: 'Fetch ERROR parse error', + error: 'rest-tools.ts Wrong message model to parse', } as RestErrorResponse); }); } @@ -374,22 +392,22 @@ export function RESTRequest({ .text() .then((dataError: string) => { reject({ - name: "API serialization error", + name: 'API serialization error', time: Date().toString(), status: response.status, message: `unmanaged error model: ${dataError} with error: ${reason}`, - statusMessage: "Fetch ERROR TEXT parse error", - error: "rest-tools.ts Wrong message model to parse", + statusMessage: 'Fetch ERROR TEXT parse error', + error: 'rest-tools.ts Wrong message model to parse', } as RestErrorResponse); }) .catch((reason: any) => { reject({ - name: "API serialization error", + name: 'API serialization error', time: Date().toString(), status: response.status, message: `unmanaged error model: ??? with error: ${reason}`, - statusMessage: "Fetch ERROR TEXT FAIL", - error: "rest-tools.ts Wrong message model to parse", + statusMessage: 'Fetch ERROR TEXT FAIL', + error: 'rest-tools.ts Wrong message model to parse', } as RestErrorResponse); }); }); @@ -400,12 +418,12 @@ export function RESTRequest({ reject(error); } else { reject({ - name: "Request fail", + name: 'Request fail', time: Date(), status: 999, message: error, - statusMessage: "Fetch catch error", - error: "rest-tools.ts detect an error in the fetch request", + statusMessage: 'Fetch catch error', + error: 'rest-tools.ts detect an error in the fetch request', }); } }); @@ -426,12 +444,12 @@ export function RESTRequestJson( resolve(value.data); } else { reject({ - name: "Model check fail", + name: 'Model check fail', time: Date().toString(), status: 950, - error: "REST Fail to verify the data", - statusMessage: "API cast ERROR", - message: "api.ts Check type as fail", + error: 'REST Fail to verify the data', + statusMessage: 'API cast ERROR', + message: 'api.ts Check type as fail', } as RestErrorResponse); } }) diff --git a/front/src/components/Cover.tsx b/front/src/components/Cover.tsx index 3ac4b88..2f77ab0 100644 --- a/front/src/components/Cover.tsx +++ b/front/src/components/Cover.tsx @@ -8,7 +8,7 @@ import { DataUrlAccess } from '@/utils/data-url-access'; import { Icon } from './Icon'; export type CoversProps = Omit & { - data?: ObjectId[]; + data?: readonly ObjectId[]; size?: BoxProps['width']; iconEmpty?: ReactElement; slideshow?: boolean; @@ -70,7 +70,9 @@ export const Covers = ({ src={url} maxWidth={size} maxHeight={size} - boxSize={size} + //boxSize={size} + width="100%" + height="100%" onClick={onClick} /> ); diff --git a/front/src/components/TopBar/TopBar.tsx b/front/src/components/TopBar/TopBar.tsx index 61c6e72..95b25f7 100644 --- a/front/src/components/TopBar/TopBar.tsx +++ b/front/src/components/TopBar/TopBar.tsx @@ -1,26 +1,62 @@ import { ReactNode } from 'react'; - - -import { Box, Button, ConditionalValue, Flex, HStack, IconButton, Span, Text, useDisclosure } from '@chakra-ui/react'; -import { LuAlignJustify, LuArrowBigLeft, LuCircleUserRound, LuKeySquare, LuLogIn, LuLogOut, LuMoon, LuSettings, LuSun } from 'react-icons/lu'; -import { MdHelp, MdHome, MdMore, MdOutlinePlaylistPlay, MdOutlineUploadFile, MdSupervisedUserCircle } from 'react-icons/md'; +import { + Box, + Button, + ConditionalValue, + Flex, + HStack, + IconButton, + Span, + Text, + useBreakpointValue, + useDisclosure, +} from '@chakra-ui/react'; +import { + LuAlignJustify, + LuArrowBigLeft, + LuCircleUserRound, + LuKeySquare, + LuLogIn, + LuLogOut, + LuMoon, + LuSettings, + LuSun, +} from 'react-icons/lu'; +import { + MdHelp, + MdHome, + MdMore, + MdOutlinePlaylistPlay, + MdOutlineUploadFile, + MdRestartAlt, + MdSupervisedUserCircle, +} from 'react-icons/md'; import { useNavigate } from 'react-router-dom'; - - import { useColorMode, useColorModeValue } from '@/components/ui/color-mode'; -import { DrawerBody, DrawerContent, DrawerHeader, DrawerRoot } from '@/components/ui/drawer'; -import { MenuContent, MenuItem, MenuRoot, MenuTrigger } from '@/components/ui/menu'; +import { + DrawerBody, + DrawerContent, + DrawerHeader, + DrawerRoot, +} from '@/components/ui/drawer'; +import { + MenuContent, + MenuItem, + MenuRoot, + MenuTrigger, +} from '@/components/ui/menu'; import { environment } from '@/environment'; import { useServiceContext } from '@/service/ServiceContext'; import { useSessionService } from '@/service/session'; import { colors } from '@/theme/colors'; -import { requestOpenSite, requestSignIn, requestSignOut, requestSignUp } from '@/utils/sso'; - - - - +import { + requestOpenSite, + requestSignIn, + requestSignOut, + requestSignUp, +} from '@/utils/sso'; export const TOP_BAR_HEIGHT = '50px'; @@ -37,6 +73,8 @@ export const BUTTON_TOP_BAR_PROPERTY = { export type TopBarProps = { children?: ReactNode; title?: string; + titleLink?: string; + titleIcon?: ReactNode; }; const ButtonMenuLeft = ({ @@ -74,15 +112,25 @@ const ButtonMenuLeft = ({ ); }; -export const TopBar = ({ title, children }: TopBarProps) => { +export const TopBar = ({ + title, + titleLink, + titleIcon, + children, +}: TopBarProps) => { const navigate = useNavigate(); const { colorMode, toggleColorMode } = useColorMode(); const { session } = useServiceContext(); - const { clearToken } = useSessionService(); + const { clearToken, isConnected } = useSessionService(); const backColor = useColorModeValue('back.100', 'back.800'); const drawerDisclose = useDisclosure(); - const onChangeTheme = () => { - drawerDisclose.onOpen(); + const isVisible = useBreakpointValue({ base: false, md: true }); + const onOpenLeftMenu = () => { + if (!isConnected) { + onForceReload(); + } else { + drawerDisclose.onOpen(); + } }; const onSignIn = (): void => { clearToken(); @@ -99,8 +147,13 @@ export const TopBar = ({ title, children }: TopBarProps) => { const onKarso = (): void => { requestOpenSite(); }; + const onForceReload = (): void => { + // @ts-expect-error + window.location.reload(true); + }; return ( { boxShadow={'0px 2px 4px ' + colors.back[900]} zIndex={200} > - {session?.isConnected ? - - - :( - - - {environment.applName} - ) - } {title && ( - navigate(titleLink) : undefined} > - {title} - + + {titleIcon} + {title} + + )} {children} @@ -205,6 +257,13 @@ export const TopBar = ({ title, children }: TopBarProps) => { Karso (SSO) + + force reload + {colorMode === 'light' ? ( { )} - {session?.isConnected && - - - - - - {environment.applName} - - - - - } - /> - } - /> - } - /> - - - - } + {session?.isConnected && ( + + + + + + {environment.applName} + + + + + } + /> + } + /> + } + /> + + + + )} ); -}; \ No newline at end of file +}; diff --git a/front/src/components/VideoPlayer.tsx b/front/src/components/VideoPlayer.tsx index 6ff2fe6..dadeae0 100644 --- a/front/src/components/VideoPlayer.tsx +++ b/front/src/components/VideoPlayer.tsx @@ -1,6 +1,14 @@ import { useEffect, useRef, useState } from 'react'; -import { Box, chakra, Flex, IconButton, SliderTrack, Spacer, Text, useBreakpointValue } from '@chakra-ui/react'; +import { + Box, + Flex, + IconButton, + SliderTrack, + Spacer, + Text, + useBreakpointValue, +} from '@chakra-ui/react'; import { MdFastForward, MdFastRewind, @@ -16,7 +24,7 @@ import { MdRepeat, MdRepeatOne, MdStop, - MdTrendingFlat + MdTrendingFlat, } from 'react-icons/md'; import { useColorModeValue } from '@/components/ui/color-mode'; @@ -70,15 +78,15 @@ export const VideoPlayer = ({}: AudioPlayerProps) => { const [isRunning, setIsRunning] = useState(true); useEffect(() => { if (!isRunning || time <= 0) { - console.log(`exit timer`); - setIsRunning(false); + console.log(`exit timer`); + setIsRunning(false); return; } const timer = setInterval(() => { setTime((prevTime) => { console.log(`current time : ${prevTime}`); return prevTime - 1; - }); + }); }, 1000); return () => clearInterval(timer); @@ -97,9 +105,9 @@ export const VideoPlayer = ({}: AudioPlayerProps) => { setIsRunning(true); } }; - window.addEventListener("mousemove", resetTimerLocal); + window.addEventListener('mousemove', resetTimerLocal); return () => { - window.removeEventListener("mousemove", resetTimerLocal); + window.removeEventListener('mousemove', resetTimerLocal); }; }, [playMediaList, setTime, setIsRunning]); @@ -121,30 +129,33 @@ export const VideoPlayer = ({}: AudioPlayerProps) => { useEffect(() => { setMediaSource( dataMedia && dataMedia?.dataId - ? DataUrlAccess.getUrl(dataMedia?.dataId) + ? DataUrlAccess.getUrl(dataMedia?.dataId, 'plop.mkv') : '' ); }, [dataMedia, setMediaSource]); + console.log(`mediaSource = ${mediaSource}`); const backColor = useColorModeValue('back.100', 'back.800'); - const configButton = isMobile ? { - borderRadius: 'full', - backgroundColor: 'transparent', - _hover: { - bgColor: 'brand.500', - }, - width: '35px', - height: '35px', - padding: '2px', - } : { - borderRadius: 'full', - backgroundColor: 'transparent', - _hover: { - bgColor: 'brand.500', - }, - width: '50px', - height: '50px', - padding: '5px', - }; + const configButton = isMobile + ? { + borderRadius: 'full', + backgroundColor: 'transparent', + _hover: { + bgColor: 'brand.500', + }, + width: '35px', + height: '35px', + padding: '2px', + } + : { + borderRadius: 'full', + backgroundColor: 'transparent', + _hover: { + bgColor: 'brand.500', + }, + width: '50px', + height: '50px', + padding: '5px', + }; useEffect(() => { if (!videoRef || !videoRef.current) { @@ -237,6 +248,7 @@ export const VideoPlayer = ({}: AudioPlayerProps) => { * Call when meta-data is updated */ function onChangeMetadata(): void { + console.log(`onChangeMetadata: ${videoRef.current?.duration}`); const seconds = videoRef.current?.duration; if (seconds !== undefined) { setDuration(seconds); @@ -246,14 +258,16 @@ export const VideoPlayer = ({}: AudioPlayerProps) => { if (!videoRef || !videoRef.current) { return; } - //console.log(`onTimeUpdate ${videoRef.current.currentTime}`); + console.log(`onTimeUpdate ${videoRef.current.currentTime}`); setTimeProgress(videoRef.current.currentTime); }; const onDurationChange = (event) => {}; const onChangeStateToPlay = () => { + console.log(`onChangeStateToPlay ...`); setIsPlaying(true); }; const onChangeStateToPause = () => { + console.log(`onChangeStateToPause ...`); setIsPlaying(false); }; const marks = () => { @@ -292,208 +306,227 @@ export const VideoPlayer = ({}: AudioPlayerProps) => { setIsPiP(false); } } catch (error) { - console.error("Erreur avec Picture-in-Picture:", error); + console.error('Erreur avec Picture-in-Picture:', error); } } }; const [isFullScreen, setIsFullScreen] = useState(false); useEffect(() => { const handleFullScreenChange = () => { - console.log(`changeFullScreen: ${!!document.fullscreenElement}`) + console.log(`changeFullScreen: ${!!document.fullscreenElement}`); setIsFullScreen(!!document.fullscreenElement); }; - document.addEventListener("fullscreenchange", handleFullScreenChange); + document.addEventListener('fullscreenchange', handleFullScreenChange); return () => { - document.removeEventListener("fullscreenchange", handleFullScreenChange); + document.removeEventListener('fullscreenchange', handleFullScreenChange); }; }, []); return ( <> {!isNullOrUndefined(MediaOffset) && ( <> - - + - - - {isPlaying ? ( - - ) : ( - - )} - - - - - - {' '} - - - - - - - - - - - - {playModeIcon[playingMode]} - - - {!!document.fullscreenElement ? - : - } - - {isPiPSupported && !isMobile && - - {isPiP ? : } - - } - - } - - + )} ); diff --git a/front/src/components/media/DisplayMediaFull.tsx b/front/src/components/media/DisplayMediaFull.tsx index 60d43ad..e291c8e 100644 --- a/front/src/components/media/DisplayMediaFull.tsx +++ b/front/src/components/media/DisplayMediaFull.tsx @@ -45,7 +45,7 @@ export const DisplayMediaFull = ({ overflowX="hidden" onClick={onClick} > - + + {media.id} {media.name} {media.episode && ` [${media.episode}]`} {/* {dataSeason && ( diff --git a/front/src/components/popup/MediaEditPopUp.tsx b/front/src/components/popup/MediaEditPopUp.tsx index 171ceaf..15a46ae 100644 --- a/front/src/components/popup/MediaEditPopUp.tsx +++ b/front/src/components/popup/MediaEditPopUp.tsx @@ -4,7 +4,7 @@ import { Button, Tabs, Text, useDisclosure } from '@chakra-ui/react'; import { MdAdminPanelSettings, MdDeleteForever, MdEdit } from 'react-icons/md'; import { useNavigate, useParams } from 'react-router-dom'; -import { MediaResource, MediaWrite } from '@/back-api'; +import { MediaResource, MediaUpdate, ZodMediaUpdate } from '@/back-api'; import { FormGroupShow } from '@/components/form/FormGroup'; import { FormInput } from '@/components/form/FormInput'; import { FormNumber } from '@/components/form/FormNumber'; @@ -63,19 +63,24 @@ export const MediaEditPopUp = ({}: MediaEditPopUpProps) => { }; const initialRef = useRef(null); const finalRef = useRef(null); - const form = useFormidable({ + const form = useFormidable({ initialValues: dataMedia, deltaConfig: { omit: ['covers'] }, }); - const onSave = async (dataDelta: MediaWrite) => { + const onSave = async (data: MediaUpdate) => { if (isNullOrUndefined(mediaIdInt)) { return; } - console.log(`onSave = ${JSON.stringify(dataDelta, null, 2)}`); + console.log(`onSave = ${JSON.stringify(data, null, 2)}`); + const { episode, ...rest } = data; + let episodeNumber: undefined | number = undefined; + if (episode !== undefined && episode !== null) { + episodeNumber = parseInt(`${episode}`, 10); + } store.update( MediaResource.patch({ restConfig: session.getRestConfig(), - data: dataDelta, + data: ZodMediaUpdate.parse({ episode: episodeNumber, ...rest }), params: { id: mediaIdInt, }, @@ -146,7 +151,7 @@ export const MediaEditPopUp = ({}: MediaEditPopUpProps) => { > {/* */} - + Edit Media {/* */} diff --git a/front/src/components/popup/SeasonEditPopUp.tsx b/front/src/components/popup/SeasonEditPopUp.tsx index dbfa11b..925447d 100644 --- a/front/src/components/popup/SeasonEditPopUp.tsx +++ b/front/src/components/popup/SeasonEditPopUp.tsx @@ -9,7 +9,7 @@ import { } from 'react-icons/md'; import { useNavigate, useParams } from 'react-router-dom'; -import { SeasonResource, SeasonWrite } from '@/back-api'; +import { SeasonResource, SeasonUpdate, ZodSeasonUpdate } from '@/back-api'; import { FormCovers } from '@/components/form/FormCovers'; import { FormGroupShow } from '@/components/form/FormGroup'; import { FormInput } from '@/components/form/FormInput'; @@ -66,19 +66,19 @@ export const SeasonEditPopUp = ({}: SeasonEditPopUpProps) => { }; const initialRef = useRef(null); const finalRef = useRef(null); - const form = useFormidable({ + const form = useFormidable({ initialValues: dataSeason, deltaConfig: { omit: ['covers'] }, }); - const onSave = async (deltaData: SeasonWrite) => { + const onSave = async (data: SeasonUpdate) => { if (isNullOrUndefined(seasonIdInt)) { return; } - console.log(`onSave = ${JSON.stringify(deltaData, null, 2)}`); + console.log(`onSave = ${JSON.stringify(data, null, 2)}`); store.update( SeasonResource.patch({ restConfig: session.getRestConfig(), - data: deltaData, + data: ZodSeasonUpdate.parse(data), params: { id: seasonIdInt, }, @@ -150,7 +150,7 @@ export const SeasonEditPopUp = ({}: SeasonEditPopUpProps) => { data-testid="Season-edit-pop-up" > - + Edit Season {/* */} diff --git a/front/src/components/popup/SeriesEditPopUp.tsx b/front/src/components/popup/SeriesEditPopUp.tsx index 05cd06f..73ce7ee 100644 --- a/front/src/components/popup/SeriesEditPopUp.tsx +++ b/front/src/components/popup/SeriesEditPopUp.tsx @@ -9,7 +9,7 @@ import { } from 'react-icons/md'; import { useNavigate, useParams } from 'react-router-dom'; -import { SeriesResource, SeriesWrite } from '@/back-api'; +import { SeriesResource, SeriesUpdate, ZodSeriesUpdate } from '@/back-api'; import { FormCovers } from '@/components/form/FormCovers'; import { FormInput } from '@/components/form/FormInput'; import { FormTextarea } from '@/components/form/FormTextarea'; @@ -62,19 +62,19 @@ export const SeriesEditPopUp = ({}: SeriesEditPopUpProps) => { }; const initialRef = useRef(null); const finalRef = useRef(null); - const form = useFormidable({ + const form = useFormidable({ initialValues: dataSeries, deltaConfig: { omit: ['covers'] }, }); - const onSave = async (dataDelta: SeriesWrite) => { + const onSave = async (data: SeriesUpdate) => { if (isNullOrUndefined(seriesIdInt)) { return; } - console.log(`onSave = ${JSON.stringify(dataDelta, null, 2)}`); + console.log(`onSave = ${JSON.stringify(data, null, 2)}`); store.update( SeriesResource.patch({ restConfig: session.getRestConfig(), - data: dataDelta, + data: ZodSeriesUpdate.parse(data), params: { id: seriesIdInt, }, @@ -146,7 +146,7 @@ export const SeriesEditPopUp = ({}: SeriesEditPopUpProps) => { > {/* */} - + Edit Series {/* */} diff --git a/front/src/components/popup/TypeEditPopUp.tsx b/front/src/components/popup/TypeEditPopUp.tsx index 1499ac1..93667de 100644 --- a/front/src/components/popup/TypeEditPopUp.tsx +++ b/front/src/components/popup/TypeEditPopUp.tsx @@ -9,7 +9,7 @@ import { } from 'react-icons/md'; import { useNavigate, useParams } from 'react-router-dom'; -import { TypeResource, TypeWrite } from '@/back-api'; +import { TypeResource, TypeUpdate, ZodTypeUpdate } from '@/back-api'; import { FormCovers } from '@/components/form/FormCovers'; import { FormInput } from '@/components/form/FormInput'; import { FormTextarea } from '@/components/form/FormTextarea'; @@ -65,19 +65,19 @@ export const TypeEditPopUp = ({}: TypeEditPopUpProps) => { }; const initialRef = useRef(null); const finalRef = useRef(null); - const form = useFormidable({ + const form = useFormidable({ initialValues: dataType, deltaConfig: { omit: ['covers'] }, }); - const onSave = async (dataDelta: TypeWrite) => { + const onSave = async (data: TypeUpdate) => { if (isNullOrUndefined(typeIdInt)) { return; } - console.log(`onSave = ${JSON.stringify(dataDelta, null, 2)}`); + console.log(`onSave = ${JSON.stringify(data, null, 2)}`); store.update( TypeResource.patch({ restConfig: session.getRestConfig(), - data: dataDelta, + data: ZodTypeUpdate.parse(data), params: { id: typeIdInt, }, @@ -148,7 +148,7 @@ export const TypeEditPopUp = ({}: TypeEditPopUpProps) => { > {/* */} - + Edit Type {/* */} diff --git a/front/src/environment.ts b/front/src/environment.ts index fc7221e..68c5d1b 100644 --- a/front/src/environment.ts +++ b/front/src/environment.ts @@ -60,7 +60,6 @@ export const environment = isDevelopmentEnvironment() ? environment_local : environment_back_prod; - /** * get the current REST api URL. Depend on the VITE_API_BASE_URL env variable. * @returns The URL with http(s)://*** diff --git a/front/src/scene/home/AddPage.tsx b/front/src/scene/home/AddPage.tsx index 4e4c4ff..1c25b30 100644 --- a/front/src/scene/home/AddPage.tsx +++ b/front/src/scene/home/AddPage.tsx @@ -408,7 +408,7 @@ export const AddPage = () => { episode: `${parsedElement[index].episode}`, }; console.log(`data= ${JSON.stringify(data, null, 2)}`); - console.error('Not_ implemented'); + console.error('Not_implemented'); storeMedia .update( MediaResource.uploadMedia({ @@ -468,6 +468,18 @@ export const AddPage = () => { ); }; const addNewSeries = (data: string): Promise => { + if (form.values['typeId'] === undefined) { + return new Promise((_resolve, reject) => { + reject({ + name: 'form value is empty [typeId] ...', + time: Date().toString(), + status: 950, + error: 'REST Fail to verify the data', + statusMessage: 'catch ERROR', + message: 'form value is empty [typeId] ...', + } as RestErrorResponse); + }); + } return storeSeries.update( SeriesResource.post({ restConfig: session.getRestConfig(), @@ -763,7 +775,7 @@ export const MediaDetectionDetail = ({ data }: { data: InspectionType }) => { - {data.media.date} + {data.media.datePublication} diff --git a/front/src/scene/sso/SSOPage.tsx b/front/src/scene/sso/SSOPage.tsx index 4a7572d..7c6c524 100644 --- a/front/src/scene/sso/SSOPage.tsx +++ b/front/src/scene/sso/SSOPage.tsx @@ -1,47 +1,58 @@ import { useEffect } from 'react'; -import { Center, Heading, Image, Text } from '@chakra-ui/react'; +import { Center, Flex, Heading, Image, Text } from '@chakra-ui/react'; +import { MdFactCheck, MdWarning } from 'react-icons/md'; import { useNavigate, useParams } from 'react-router-dom'; +import { useEffectOnce } from 'react-use'; import avatar_generic from '@/assets/images/avatar_generic.svg'; +import { Icon } from '@/components'; import { PageLayoutInfoCenter } from '@/components/Layout/PageLayoutInfoCenter'; import { TopBar } from '@/components/TopBar/TopBar'; -import { isDevelopmentEnvironment } from '@/environment'; +import { toaster } from '@/components/ui/toaster'; import { useSessionService } from '@/service/session'; import { b64_to_utf8 } from '@/utils/sso'; export const SSOPage = () => { const { data, keepConnected, token } = useParams(); - console.log(`- data: ${data}`); - console.log(`- keepConnected: ${keepConnected}`); - console.log(`- token: ${token}`); + //const { data, keepConnected, token } = useState(); + // console.log(`- data: ${data}`); + // console.log(`- keepConnected: ${keepConnected}`); + // console.log(`- token: ${token}`); const navigate = useNavigate(); - const { isConnected, setToken, login, clearToken } = useSessionService(); - useEffect(() => { - if (token) { - setToken(token); - } else { - clearToken(); + const { isConnected, errorSession, setToken, login } = useSessionService(); + useEffectOnce(() => { + if (token === undefined || token === '') { + return; } - }, [token, setToken, clearToken]); - const delay = isDevelopmentEnvironment() ? 2000 : 2000; + try { + setToken(token); + } catch (e) { + toaster.create({ + title: 'Connection Fail', + description: `invalid token data model.`, + type: 'error', + }); + navigate('/'); + } + }); + const delay = 1000; useEffect(() => { if (isConnected) { - const destination = data ? b64_to_utf8(data) : '/'; - console.log(`program redirect to: ${destination} (${delay}ms)`); + toaster.create({ + title: 'Connection Succeed', + description: `Welcome back: ${login}.`, + type: 'success', + }); + const destination = data ? b64_to_utf8(data) : '/home'; + const destinationFinal = destination === '' ? '/home' : destination; + console.log(`program redirect to: '${destinationFinal}' (${delay}ms)`); setTimeout(() => { - navigate(`/${destination}`); + // note: check if the "navigate" is in the dependence of the use effect!!! + navigate(`/${destinationFinal}`, { replace: true }); }, delay); } - }, [isConnected]); - /* - const [searchParams] = useSearchParams(); - console.log(`data: ${searchParams.get('data')}`); - console.log(`keepConnected: ${searchParams.get('keepConnected')}`); - console.log(`token: ${searchParams.get('token')}`); - const dataFromParam = useGetCreateActionParams(); - console.log(`data group: ${JSON.stringify(dataFromParam, null, 2)}`); - */ + }, [isConnected, login, navigate]); return ( <> @@ -53,20 +64,52 @@ export const SSOPage = () => {
- {!isConnected && ( - - ERROR: connection fail ! - + {!isConnected && errorSession !== undefined && ( + <> + + + + + + ERROR: {errorSession.message} + + + {errorSession.description && ( + + {errorSession.description} + + )} + + )} + {!isConnected && errorSession === undefined && ( + + + + + + ERROR: Not connected ! + + )} {isConnected && ( - <> - - Connected: Redirect soon! - - - Welcome back: {login} - - + + + + + Connected: Redirect soon! + + + + + Welcome back: {login} + + + )} diff --git a/front/src/service/Advancement.ts b/front/src/service/Advancement.ts index c494224..98f00ed 100644 --- a/front/src/service/Advancement.ts +++ b/front/src/service/Advancement.ts @@ -22,7 +22,7 @@ export const useAdvancementServiceWrapped = ( { restApiName: 'Advancement', primaryKey: 'id', - available: session.token !== undefined, + available: false, //session.token !== undefined, getsCall: () => { return UserMediaAdvancementResource.gets({ restConfig: session.getRestConfig(), @@ -47,40 +47,43 @@ export type updateTimeProps = { time: number; total: number; addCount: boolean; -} +}; -export const useAdvancementUpdateTime = (id: number, - config: Omit, 'queryFunction'> - = {}) => { +export const useAdvancementUpdateTime = ( + id: number, + config: Omit< + useQueryCallProps, + 'queryFunction' + > = {} +) => { const { store } = useAdvancementService(); const { onSuccess, ...restConfig } = config; const { getRestConfig } = useSessionService(); - const { call, ...rest } = useQueryCall< - UserMediaAdvancement, - updateTimeProps - >({ - queryFunction: (inputData) => { - const data = { - time: inputData.time, - percent: inputData.time / inputData.total, - addCount: inputData.addCount - }; - return UserMediaAdvancementResource.patch({ - restConfig: getRestConfig(), - params: { - id - }, - data - }); - }, - onSuccess: (response) => { - if (onSuccess) { - onSuccess(response); - } - store.updateRaw(response); - }, - ...restConfig, - }); + const { call, ...rest } = useQueryCall( + { + queryFunction: (inputData) => { + const data = { + time: inputData.time, + percent: inputData.time / inputData.total, + addCount: inputData.addCount, + }; + return UserMediaAdvancementResource.patch({ + restConfig: getRestConfig(), + params: { + id, + }, + data, + }); + }, + onSuccess: (response) => { + if (onSuccess) { + onSuccess(response); + } + store.updateRaw(response); + }, + ...restConfig, + } + ); return { updateTime: call, ...rest }; }; diff --git a/front/src/service/Media.ts b/front/src/service/Media.ts index 22691bc..fa3a5d2 100644 --- a/front/src/service/Media.ts +++ b/front/src/service/Media.ts @@ -24,7 +24,7 @@ export const useMediaServiceWrapped = ( { restApiName: 'Media', primaryKey: 'id', - available: session.token !== undefined, + available: session.isConnected, getsCall: () => { return MediaResource.gets({ restConfig: session.getRestConfig(), diff --git a/front/src/service/Season.ts b/front/src/service/Season.ts index 2c86fe4..07a76f1 100644 --- a/front/src/service/Season.ts +++ b/front/src/service/Season.ts @@ -25,7 +25,7 @@ export const useSeasonServiceWrapped = ( { restApiName: 'Season', primaryKey: 'id', - available: session.token !== undefined, + available: session.isConnected, getsCall: () => { return SeasonResource.gets({ restConfig: session.getRestConfig(), diff --git a/front/src/service/Series.ts b/front/src/service/Series.ts index 326dc5b..67f8a21 100644 --- a/front/src/service/Series.ts +++ b/front/src/service/Series.ts @@ -26,7 +26,7 @@ export const useSeriesServiceWrapped = ( { restApiName: 'Series', primaryKey: 'id', - available: session.token !== undefined, + available: session.isConnected, getsCall: () => { return SeriesResource.gets({ restConfig: session.getRestConfig(), diff --git a/front/src/service/Type.ts b/front/src/service/Type.ts index 46fe200..f7c7d1a 100644 --- a/front/src/service/Type.ts +++ b/front/src/service/Type.ts @@ -25,7 +25,7 @@ export const useTypeServiceWrapped = ( { restApiName: 'Type', primaryKey: 'id', - available: session.token !== undefined, + available: session.isConnected, getsCall: () => { return TypeResource.gets({ restConfig: session.getRestConfig(), diff --git a/front/src/service/session.ts b/front/src/service/session.ts index 40e125c..5d9c13c 100644 --- a/front/src/service/session.ts +++ b/front/src/service/session.ts @@ -1,21 +1,33 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; -import { JwtPayload, RESTConfig } from '@/back-api'; +import { createListCollection } from '@chakra-ui/react'; + +import { + JwtToken, + RESTConfig, + RestErrorResponse, + UserResource, + setErrorApiGlobalCallback, +} from '@/back-api'; import { PartRight } from '@/back-api/model/part-right'; +import { toaster } from '@/components/ui/toaster'; import { environment, getApiUrl } from '@/environment'; import { useServiceContext } from '@/service/ServiceContext'; import { isBrowser } from '@/utils/layout'; import { parseToken } from '@/utils/sso'; -import { createListCollection } from '@chakra-ui/react'; -const TOKEN_KEY = 'karideo-token-key-storage'; +const TOKEN_KEY = 'karusic-token-key-storage'; export const USERS_COLLECTION = createListCollection({ items: [ - { label: "admin", value: "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIiwiYXBwbGljYXRpb24iOiJrYXJ1c2ljIiwiaXNzIjoiS2FyQXV0aCIsInJpZ2h0Ijp7ImthcnVzaWMiOnsiQURNSU4iOnRydWUsIlVTRVIiOnRydWV9fSwibG9naW4iOiJIZWVyb1l1aSIsImV4cCI6MTcyNDIwNjc5NCwiaWF0IjoxNzI0MTY2ODM0fQ.TEST_SIGNATURE_FOR_LOCAL_TEST_AND_TEST_E2E" }, - { label: "NO_USER", value: "svelte" }, + { + label: 'admin', + value: + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIiwiYXBwbGljYXRpb24iOiJrYXJ1c2ljIiwiaXNzIjoiS2FyQXV0aCIsInJpZ2h0Ijp7ImthcnVzaWMiOnsiQURNSU4iOnRydWUsIlVTRVIiOnRydWV9fSwibG9naW4iOiJIZWVyb1l1aSIsImV4cCI6MTcyNDIwNjc5NCwiaWF0IjoxNzI0MTY2ODM0fQ.TEST_SIGNATURE_FOR_LOCAL_TEST_AND_TEST_E2E', + }, + { label: 'NO_USER', value: 'svelte' }, ], -}) +}); export const USERS = { admin: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIiwiYXBwbGljYXRpb24iOiJrYXJ1c2ljIiwiaXNzIjoiS2FyQXV0aCIsInJpZ2h0Ijp7ImthcnVzaWMiOnsiQURNSU4iOnRydWUsIlVTRVIiOnRydWV9fSwibG9naW4iOiJIZWVyb1l1aSIsImV4cCI6MTcyNDIwNjc5NCwiaWF0IjoxNzI0MTY2ODM0fQ.TEST_SIGNATURE_FOR_LOCAL_TEST_AND_TEST_E2E', @@ -34,9 +46,43 @@ export function getRestConfig(): RESTConfig { }; } +const getDeltaPrint = (date: Date): string => { + const now = new Date(); + let deltaSeconds = Math.floor((date.getTime() - now.getTime()) / 1000); + const isPast = deltaSeconds < 0; + + deltaSeconds = Math.abs(deltaSeconds); + + const days = Math.floor(deltaSeconds / 86400); + deltaSeconds %= 86400; + + const hours = Math.floor(deltaSeconds / 3600); + deltaSeconds %= 3600; + + const minutes = Math.floor(deltaSeconds / 60); + const seconds = deltaSeconds % 60; + + const result = [days > 0 ? `${days}j` : '', `${hours}h${minutes}:${seconds}s`] + .filter(Boolean) + .join(' '); + + return `${result}${isPast ? ' ago' : ''}`; +}; + +const isInThePast = (date: Date): boolean => { + const now = new Date(); + return date.getTime() < now.getTime(); +}; + +export type SessionErrorType = { + message: string; + description?: string; +}; + export type SessionServiceProps = { token?: string; isConnected: boolean; + errorSession?: SessionErrorType; setToken: (token: string) => void; clearToken: () => void; login?: string; @@ -51,102 +97,165 @@ export const useSessionService = (): SessionServiceProps => { }; export const useSessionServiceWrapped = (): SessionServiceProps => { - const [token, setToken] = useState( + // Load the token from the system (init) + const [tokenStorage, setTokenStorage] = useState( isBrowser ? (localStorage.getItem(TOKEN_KEY) ?? undefined) : undefined ); - const [config, setConfig] = useState(undefined); + // Token that is ready to use + const [tokenStr, setTokenStr] = useState(''); + const [errorSession, setErrorSession] = useState< + SessionErrorType | undefined + >(undefined); + const [token, setToken] = useState(undefined); - const updateRight = useCallback(() => { + const getRestConfigLocal = useCallback((): RESTConfig => { + return { + server: getApiUrl(), + token: tokenStr, + }; + }, [tokenStr]); - console.log('Detect a new token...'); - setConfig(undefined); - if (token === undefined) { - console.log(` ==> No User`); - localStorage.removeItem(TOKEN_KEY); - } else { - const dataParsedToken = parseToken(token)?.payload; - console.log(`Get right: ${JSON.stringify(dataParsedToken, null, 2)}`); - setConfig(dataParsedToken); - console.log(' ==> Login ... (try to keep right)'); - if (isBrowser) { - localStorage.setItem(TOKEN_KEY, token); + const updateRight = useEffect(() => { + //console.log('Detect a new token...'); + if (isBrowser) { + //console.log('update internal property'); + if (tokenStorage === undefined) { + //console.log(` ==> No User`); + setToken(undefined); + setTokenStr(''); + localStorage.removeItem(TOKEN_KEY); + } else { + //console.log(' ==> Login ... (try to keep right)'); + let tokenParsed: JwtToken | undefined = undefined; + try { + tokenParsed = parseToken(tokenStorage); + } catch (e) { + setErrorSession({ + message: 'Fail to parse the token', + }); + return; + } + //console.log(`get new token: ${JSON.stringify(tokenParsed, null, 2)}`); + const exp = new Date(tokenParsed.payload.exp * 1000); + if (isInThePast(exp)) { + //console.log(`token expired at: exp: ${exp.toISOString()}: delta=${getDeltaPrint(exp)}`); + const iat = new Date(tokenParsed.payload.iat * 1000); + //console.log(`iat: ${iat.toISOString()}: delta=${getDeltaPrint(iat)}`); + setErrorSession({ + message: 'The inserted token has expired', + description: `It expired at ${exp.toISOString()}\nSince: ${getDeltaPrint(exp)}`, + }); + return; + } + // Validate token on the server: + UserResource.getMe({ + restConfig: { + server: getApiUrl(), + token: tokenStorage, + }, + }) + .then((_response) => { + // if the login work well, then the token does not fail with authentication + //console.log('Authentication finished: ...'); + setTokenStr(tokenStorage); + setToken(tokenParsed); + localStorage.setItem(TOKEN_KEY, tokenStorage); + }) + .catch((error: RestErrorResponse) => { + setErrorSession({ + message: 'The server reject the token.', + description: `name: ${error.name}\nmessage: "${error.message}"`, + }); + setTokenStr(''); + setToken(undefined); + localStorage.removeItem(TOKEN_KEY); + }); } } - }, [localStorage, parseToken, token]); + }, [ + localStorage, + parseToken, + setErrorSession, + setToken, + setTokenStr, + tokenStorage, + ]); + const setTokenLocal = useCallback( - (token: string) => { - setToken(token); - updateRight(); + (token?: string) => { + if (token ? token.startsWith('__') : false) { + token = undefined; + } + localStorage.removeItem(TOKEN_KEY); + setTokenStorage(token); + setTokenStr(''); + setToken(undefined); + setErrorSession(undefined); }, [updateRight, setToken] ); const clearToken = useCallback(() => { - console.log('Clear Token'); + localStorage.removeItem(TOKEN_KEY); + setTokenLocal(undefined); setToken(undefined); - updateRight(); }, [updateRight, setToken]); - const hasReadRight = useCallback( - (group: RightGroup) => { - if (token === undefined) { - return false; - } - const right = config?.right[environment.applName]; - if (right === undefined) { - return false; - } - return [PartRight.READ, PartRight.READ_WRITE].includes( - right?.[group] ?? 0 - ); - }, - [config] - ); - const hasWriteRight = useCallback( - (group: RightGroup) => { - if (token === undefined) { - return false; - } - const right = config?.right[environment.applName]; - if (right === undefined) { - return false; - } - return [PartRight.READ, PartRight.READ_WRITE].includes( - right?.[group] ?? 0 - ); - }, - [config] - ); - - const getRestConfig = useCallback((): RESTConfig => { - return { - server: getApiUrl(), - token: token ?? '', - }; - }, [token]); useEffect(() => { - updateRight(); - }, [updateRight]); + setErrorApiGlobalCallback((response: Response) => { + if (response.status == 401) { + toaster.create({ + title: 'API request rejected', + description: `API Authentication rejected by server.`, + type: 'error', + }); + clearToken(); + } + }); + }, [clearToken]); + + const hasReadRight = useCallback( + (part: RightGroup) => { + //console.log(`right = ${JSON.stringify(token?.payload?.right?.[environment.applName], null, 2)}`); + const right = token?.payload?.right?.[environment.applName]; + if (right === undefined) { + return false; + } + return [PartRight.READ, PartRight.READ_WRITE].includes(right[part]); + }, + [token] + ); + const hasWriteRight = useCallback( + (part: RightGroup) => { + const right = token?.payload?.right?.[environment.applName]; + if (right === undefined) { + return false; + } + return [PartRight.READ, PartRight.READ_WRITE].includes(right[part]); + }, + [token] + ); return { - token, + token: tokenStr, isConnected: token !== undefined, + errorSession, setToken: setTokenLocal, clearToken, - login: config?.login, + login: token?.payload?.login, hasReadRight, hasWriteRight, - getRestConfig, + getRestConfig: getRestConfigLocal, }; }; -export const useHasRight = (group: RightGroup) => { +export const useHasRight = (part: RightGroup) => { const { token, hasReadRight, hasWriteRight } = useSessionService(); const isReadable = useMemo(() => { - console.log(`get is read for: ${group} ==> ${hasReadRight(group)}`); - return hasReadRight(group); - }, [token, hasReadRight, group]); + //console.log(`get is read for: ${part} ==> ${hasReadRight(part)}`); + return hasReadRight(part); + }, [token, hasReadRight, part]); const isWritable = useMemo(() => { - return hasWriteRight(group); - }, [token, hasWriteRight, group]); + return hasWriteRight(part); + }, [token, hasWriteRight, part]); return { isReadable, isWritable }; }; diff --git a/front/src/theme/theme.ts b/front/src/theme/theme.ts index 44ae56c..bfa57e5 100644 --- a/front/src/theme/theme.ts +++ b/front/src/theme/theme.ts @@ -9,12 +9,20 @@ import { colors } from './colors'; const baseTheme: SystemConfig = { globalCss: { + ':root': { + // permit to "firefox" not reload the page when scroll on top + overscrollBehavior: 'contain', + }, body: { + // permit to "chromium" not reload the page when scroll on top + overscrollBehavior: 'contain', + // Prevents text selection + userSelect: 'none', + // Other ... overflowY: 'none', bg: { _light: 'back.50', _dark: 'back.700' }, color: { _light: 'text.900', _dark: 'text.50' }, fontFamily: 'Roboto, Helvetica, Arial, "sans-serif"', - userSelect: 'none' /* Prevents text selection */, }, svg: { width: '32px', diff --git a/front/src/utils/http.ts b/front/src/utils/http.ts deleted file mode 100644 index cd3d741..0000000 --- a/front/src/utils/http.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { RESTConfig } from '@/back-api'; -import { getApiUrl } from '@/environment'; -import { getUserToken } from '@/service/session'; - -export function getRestConfig(): RESTConfig { - return { - server: getApiUrl(), - token: getUserToken() ?? '', - }; -} diff --git a/front/src/utils/sso.ts b/front/src/utils/sso.ts index 3adca48..ba814ac 100644 --- a/front/src/utils/sso.ts +++ b/front/src/utils/sso.ts @@ -108,14 +108,14 @@ export function requestSignIn(name?: string): void { console.log( `Request sign-in: '${environment.ssoSignIn}' + '${hashLocalData(name)}'` ); - window.location.href = environment.ssoSignIn + hashLocalData(name) + "/"; + window.location.href = environment.ssoSignIn + hashLocalData(name) + '/'; } /** * Request SSO Disconnect */ export function requestSignOut(name?: string): void { const url = environment.ssoSignOut + hashLocalData(name); - console.log(`Request just to the SSO: ${url}`) + console.log(`Request just to the SSO: ${url}`); // unlog from the SSO window.location.href = url; } @@ -124,7 +124,7 @@ export function requestSignOut(name?: string): void { */ export function requestSignUp(name?: string): void { const url = environment.ssoSignUp + hashLocalData(name); - console.log(`Request just to the SSO: ${url}`) + console.log(`Request just to the SSO: ${url}`); // unlog from the SSO window.location.href = url; }