From 3a3949b0040fea2a903d8d8f4237cb8f5a2c5d79 Mon Sep 17 00:00:00 2001 From: Pistonight Date: Tue, 28 Jan 2025 22:28:59 -0800 Subject: [PATCH] update item-assets to work with any size --- packages/item-assets/.gitignore | 3 + packages/item-assets/README.md | 36 ++ packages/item-assets/Taskfile.yml | 45 +- packages/item-assets/generator/canvas.rs | 22 +- .../item-assets/generator/sprite_sheet.rs | 25 +- packages/item-assets/index.html | 12 + packages/item-assets/package.json | 3 + packages/item-assets/src/ActorSprite.tsx | 123 +++-- packages/item-assets/src/ModifierSprite.tsx | 25 +- packages/item-assets/test/TestApp.tsx | 157 +++++++ packages/item-assets/test/main.tsx | 11 + packages/item-assets/tsconfig.app.json | 4 + packages/item-assets/tsconfig.json | 7 +- packages/item-assets/tsconfig.node.json | 4 + packages/item-assets/vite.config.ts | 6 + packages/mono-dev | 2 +- pnpm-lock.yaml | 420 +++++++++++++++++- pnpm-workspace.yaml | 3 + 18 files changed, 810 insertions(+), 98 deletions(-) create mode 100644 packages/item-assets/README.md create mode 100644 packages/item-assets/index.html create mode 100644 packages/item-assets/test/TestApp.tsx create mode 100644 packages/item-assets/test/main.tsx create mode 100644 packages/item-assets/tsconfig.app.json create mode 100644 packages/item-assets/tsconfig.node.json create mode 100644 packages/item-assets/vite.config.ts diff --git a/packages/item-assets/.gitignore b/packages/item-assets/.gitignore index 06ead15..51020e6 100644 --- a/packages/item-assets/.gitignore +++ b/packages/item-assets/.gitignore @@ -3,5 +3,8 @@ /data /icons /target +/dist *.webp *.png +pnpm-lock.yaml +package-lock.json diff --git a/packages/item-assets/README.md b/packages/item-assets/README.md new file mode 100644 index 0000000..c6506ba --- /dev/null +++ b/packages/item-assets/README.md @@ -0,0 +1,36 @@ +# botw-item-assets + +React components for item images in BOTW. + +**NOTE: The library is not usable out of the box, as this repository +does not contain the assets** + +## Usage + +See [ActorSprite.tsx](./src/ActorSprite.tsx) and [ModifierSprite.tsx](./src/ModifierSprite.tsx) + +## Install (into a mono-dev repo) + +1. Add this repo as submodule +2. Check `package.json` and add the packages to `pnpm-workspace.yaml` catalog. +3. Currently, only pulling assets from private Google Cloud is supported: + ```bash + task pull-build-priv + task build-sprites + ``` + +Add the dependency to another package: + +```json +{ + "dependencies": { + "botw-item-assets": "workspace:*" + } +} +``` + +Import + +```typescript +import { ActorSprite } from "botw-item-assets"; +``` diff --git a/packages/item-assets/Taskfile.yml b/packages/item-assets/Taskfile.yml index 0e2b5ab..207f141 100644 --- a/packages/item-assets/Taskfile.yml +++ b/packages/item-assets/Taskfile.yml @@ -9,42 +9,57 @@ includes: internal: true tasks: - pull-priv: - desc: Pull private assets for building the package. Requires gcloud access - cmds: - - rm -rf icons src/assets - - $(which mkdir) -p src/assets - - gcloud storage cp -r gs://ist-private/icons . - clean: desc: Clean the build output cmds: - rm -rf src/generated src/special + dev: + desc: Run test page dev server + cmds: + - task: ecma:vite-dev + build: - desc: Build the sprite sheets + desc: Build the generated data and sprites + cmds: + - task: build-data + - task: build-sprites + + build-data: cmds: - $(which mkdir) -p src/generated - python scripts/generate.py - - cargo run --release + - task: ecma:prettier-fix + + build-sprites: + cmds: + - cargo run --release # It's insanely slow without --release - cp -R icons/SP/Item src/special + - task: ecma:prettier-fix + + pull-build-priv: + desc: Pull private assets for building the package. Requires gcloud access + cmds: + - rm -rf icons src/assets + - $(which mkdir) -p src/assets + - gcloud storage cp -r gs://ist-private/icons . - pull: - desc: Pull the assets for development + pull-priv: + desc: Pull built assets for the package. Requires gcloud access cmds: - - cmd: echo "this command is not yet available" - silent: true + - rm -rf src/generated/sprites + - gcloud storage cp -r gs://ist-private/sprites src/generated push: desc: Push the generated assets. Requires gcloud access cmds: - - gcloud storage cp src/sprites/*.webp gs://ist-private/sprites + - gcloud storage cp src/generated/sprites/*.webp gs://ist-private/sprites check: cmds: - task: cargo:clippy-all - task: cargo:fmt-check - - task: ecma:tsc-check + - task: ecma:tsc-check-build - task: ecma:eslint-check - task: ecma:prettier-check diff --git a/packages/item-assets/generator/canvas.rs b/packages/item-assets/generator/canvas.rs index 06e02e5..4fac42c 100644 --- a/packages/item-assets/generator/canvas.rs +++ b/packages/item-assets/generator/canvas.rs @@ -53,21 +53,31 @@ impl Canvas { } } - pub fn load_image(&mut self, position: usize, image: &DynamicImage) -> anyhow::Result<()> { + pub fn load_image( + &mut self, + position: usize, + image: &DynamicImage, + use_padding: bool, + ) -> anyhow::Result<()> { if position >= self.sprite_per_side as usize * self.sprite_per_side as usize { bail!("position out of bounds"); } + let outer_res = self.scale_to + self.padding * 2; + let (scale_to, padding) = if use_padding { + (self.scale_to, self.padding) + } else { + (outer_res, 0) + }; let resized = DynamicImage::ImageRgba8(imageops::resize( image, - self.scale_to, - self.scale_to, + scale_to, + scale_to, FilterType::Lanczos3, )); - let outer_res = self.scale_to + self.padding * 2; let y = (position / self.sprite_per_side as usize) * (outer_res as usize); - let y = y as u32 + self.padding; + let y = y as u32 + padding; let x = (position % self.sprite_per_side as usize) * (outer_res as usize); - let x = x as u32 + self.padding; + let x = x as u32 + padding; imageops::overlay(&mut self.image, &resized, x as i64, y as i64); Ok(()) diff --git a/packages/item-assets/generator/sprite_sheet.rs b/packages/item-assets/generator/sprite_sheet.rs index d483bfc..fd4117b 100644 --- a/packages/item-assets/generator/sprite_sheet.rs +++ b/packages/item-assets/generator/sprite_sheet.rs @@ -61,8 +61,9 @@ impl SpriteSheet { if w != h { Err(Error::NotSquare(path.display().to_string(), w, h))?; } + let use_padding = should_use_padding(path.to_string_lossy().as_ref()); for canvas in &mut self.canvases { - canvas.load_image(position, &image)?; + canvas.load_image(position, &image, use_padding)?; } Ok(()) @@ -80,6 +81,28 @@ impl SpriteSheet { } } +fn should_use_padding(path: &str) -> bool { + // frames from animated images don't use the padding, to maintain + // the same size as the animated image + if path.contains("Obj_DungeonClearSeal") { + return false; + } + if path.contains("Obj_WarpDLC") { + return false; + } + if path.contains("Obj_DLC_HeroSeal") { + return false; + } + if path.contains("Obj_DLC_HeroSoul") { + return false; + } + if path.contains("Obj_HeroSoul") { + return false; + } + + true +} + /// The data of a sprite sheet #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[repr(transparent)] diff --git a/packages/item-assets/index.html b/packages/item-assets/index.html new file mode 100644 index 0000000..3718c58 --- /dev/null +++ b/packages/item-assets/index.html @@ -0,0 +1,12 @@ + + + + + + Item Asset Test + + +
+ + + diff --git a/packages/item-assets/package.json b/packages/item-assets/package.json index 494b0f6..0ee7d11 100644 --- a/packages/item-assets/package.json +++ b/packages/item-assets/package.json @@ -12,8 +12,11 @@ }, "devDependencies": { "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "catalog:", "eslint": "catalog:", "mono-dev": "workspace:*", + "react-dom": "catalog:", "typescript": "catalog:", "vite": "catalog:" } diff --git a/packages/item-assets/src/ActorSprite.tsx b/packages/item-assets/src/ActorSprite.tsx index 6bc24c5..1ca7ec2 100644 --- a/packages/item-assets/src/ActorSprite.tsx +++ b/packages/item-assets/src/ActorSprite.tsx @@ -8,6 +8,9 @@ export type ActorSpriteProps = { /** Name of the Actor to display */ actor: string; + /** Optional size of the sprite, default is 64 */ + size?: number; + /** * Name of the Cook effect if any (as in msyt translation files) * @@ -60,26 +63,11 @@ const useChunkClasses = makeStaticStyles(ActorChunkClasses); const useStyles = makeStyles({ sprite: { backgroundRepeat: "no-repeat", - width: "64px", - height: "64px", display: "block", }, - cheap: { - backgroundSize: "1024px", // for some reason 200% doesn't work - }, spriteSoulImage: { position: "relative", }, - animatedSimple: { - backgroundSize: "64px", - }, - soulOffset: { - top: "-11.4px", - }, - soulOffsetDLC: { - top: "-19px", - left: "0px", - }, blank: { filter: "grayscale(100%)", opacity: 0.8, @@ -88,20 +76,10 @@ const useStyles = makeStyles({ opacity: 0.5, }, damageContainer: { + // Only the damage overlay should have overflow hidden, + // since animated sprites can overlay by design overflow: "hidden", }, - damage: { - width: "1024px", - height: "1024px", - backgroundColor: "rgba(255, 0, 0, 0.6)", - }, - damageCheap: { - transformOrigin: "top left", - scale: 2, - width: "512px", - height: "512px", - backgroundColor: "rgba(255, 0, 0, 0.6)", - }, damageAnimation: { animationIterationCount: "infinite", animationDuration: "1s", @@ -127,6 +105,7 @@ const useStyles = makeStyles({ const SpriteImpl: React.FC = ({ actor, + size, effect, cheap, disableAnimation, @@ -138,28 +117,26 @@ const SpriteImpl: React.FC = ({ useChunkClasses(); const styles = useStyles(); + size = size || 64; + let baseClass = mergeClasses(styles.sprite, blank && styles.blank); disableAnimation = disableAnimation || cheap; // Handle simple animated images - Travel Medallion, 5 orbs // if not animated, it's in the sprite sheet - if (!disableAnimation) { - if ( - /Obj_(WarpDLC|DungeonClearSeal|HeroSeal_(Gerudo|Goron|Rito|Zora))/.test( - actor, - ) - ) { - return ( -
- ); - } + const isSimpleAnimated = + /Obj_(WarpDLC|DungeonClearSeal|HeroSeal_(Gerudo|Goron|Rito|Zora))/.test( + actor, + ); + if (!disableAnimation && isSimpleAnimated) { + return ( +
+ ); } const iconActor = mapActor(actor, !!deactive, !!powered, effect); @@ -170,25 +147,27 @@ const SpriteImpl: React.FC = ({ // Special handling for Champion Abilities: // - Active ones are larger and needs to be offseted // - Deactive ones has animation - if (isChampionAbility(iconActor)) { + const isAbility = isChampionAbility(actor); + if (isAbility) { const dlc = iconActor.includes("DLC"); // active - either animated or not, with offset if (!deactive) { const ext = disableAnimation ? "png" : "webp"; + const topOffset = ((dlc ? -19 : -11.4) / 64) * size; return (
); @@ -198,19 +177,23 @@ const SpriteImpl: React.FC = ({ return (
); } } + // don't show badly damaged effect for images that would be animated (but disabled) + badlyDamaged = badlyDamaged && !isSimpleAnimated && !isAbility; + const [chunk, position] = ActorMetadata[iconActor]; - const backgroundPosition = getBackgroundPosition(position); + const backgroundPosition = getBackgroundPosition(position, size); + const spriteSize = cheap ? 32 : 64; + + const chunkClass = `chunk${chunk}x${spriteSize}`; - const chunkClass = `chunk${chunk}x${cheap ? "32" : "64"}`; + const damageOverlayScale = size / spriteSize; return (
= ({ className={mergeClasses( `sprite-${chunkClass}`, baseClass, - cheap && styles.cheap, badlyDamaged && styles.damageContainer, )} - style={{ backgroundPosition }} + style={{ + backgroundPosition, + backgroundSize: NUM * size, + width: size, + height: size, + }} > {badlyDamaged && (
)} @@ -296,12 +287,11 @@ const mapActor = ( return actor; }; -const getBackgroundPosition = (position: number) => { - const NUM = 16; - const SIZE = 64; +const NUM = 16; // number of sprites in a row/column +const getBackgroundPosition = (position: number, size: number) => { const x = position % NUM; const y = Math.floor(position / NUM); - return `-${x * SIZE}px -${y * SIZE}px`; + return `-${x * size}px -${y * size}px`; }; const isChampionAbility = (actor: string) => { @@ -309,3 +299,12 @@ const isChampionAbility = (actor: string) => { actor, ); }; + +const getSpecialActorStyle = (actor: string, size: number) => { + return { + width: size, + height: size, + backgroundImage: `url(${new URL(`./special/${actor}.webp`, import.meta.url).href})`, + backgroundSize: size, + }; +}; diff --git a/packages/item-assets/src/ModifierSprite.tsx b/packages/item-assets/src/ModifierSprite.tsx index b995d6e..857e170 100644 --- a/packages/item-assets/src/ModifierSprite.tsx +++ b/packages/item-assets/src/ModifierSprite.tsx @@ -9,6 +9,9 @@ import { export type ModifierSpriteProps = { /** Name of the special status to show */ status: string; + + /** Optional size of the sprite, default is 20 */ + size?: number; }; const useChunkClasses = makeStaticStyles(ModifierChunkClasses); @@ -16,37 +19,39 @@ const useChunkClasses = makeStaticStyles(ModifierChunkClasses); const useStyles = makeStyles({ sprite: { backgroundRepeat: "no-repeat", - backgroundSize: "160px 160px", // 20px * 8 - width: "20px", - height: "20px", display: "block", }, }); -const SpriteImpl: React.FC = ({ status }) => { +const SpriteImpl: React.FC = ({ size, status }) => { + size = size || 20; useChunkClasses(); const styles = useStyles(); if (!ModifierMetadata[status]) { return null; } const [_, position] = ModifierMetadata[status]; - const backgroundPosition = getBackgroundPosition(position); + const backgroundPosition = getBackgroundPosition(position, size); return (
); }; export const ModifierSprite = memo(SpriteImpl); -const getBackgroundPosition = (position: number) => { - const NUM = 8; - const SIZE = 20; +const NUM = 8; +const getBackgroundPosition = (position: number, size: number) => { const x = position % NUM; const y = Math.floor(position / NUM); - return `-${x * SIZE}px -${y * SIZE}px`; + return `-${x * size}px -${y * size}px`; }; diff --git a/packages/item-assets/test/TestApp.tsx b/packages/item-assets/test/TestApp.tsx new file mode 100644 index 0000000..09db3f0 --- /dev/null +++ b/packages/item-assets/test/TestApp.tsx @@ -0,0 +1,157 @@ +import { PropsWithChildren } from "react"; +import { ActorSprite, ModifierSprite } from "../src"; + +export const App: React.FC = () => { + const actors = [ + "Weapon_Sword_070", + "Weapon_Sword_502", + "Obj_DungeonClearSeal", + "Obj_HeroSoul_Gerudo", + "Obj_DLC_HeroSoul_Gerudo", + "Obj_WarpDLC", + ]; + const sizes = [16, 32, 48, 64, 96]; + const modifiers = [ + "AddGuard", + "AddLife", + "RapidFire", + "DNE", + "ClimbSpeedUp", + ]; + const modifierSizes = [10, 20, 32, 40, 64]; + + return ( +
+ {actors.map((actor) => + sizes.map((size) => ( + + )), + )} + {modifiers.map((modifier) => + modifierSizes.map((size) => ( + + + + )), + )} +
+ ); +}; + +type ActorMatrixProps = { + actor: string; + size: number; +}; + +const ActorMatrix: React.FC = ({ actor, size }) => { + return ( + <> +
+ {actor} {size}px +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + ); +}; + +const Container: React.FC> = ({ + size, + children, +}) => { + return ( +
+ {children} +
+ ); +}; diff --git a/packages/item-assets/test/main.tsx b/packages/item-assets/test/main.tsx new file mode 100644 index 0000000..1ea23da --- /dev/null +++ b/packages/item-assets/test/main.tsx @@ -0,0 +1,11 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; + +import { App } from "./TestApp.tsx"; + +const root = createRoot(document.getElementById("-root-") as HTMLElement); +root.render( + + + , +); diff --git a/packages/item-assets/tsconfig.app.json b/packages/item-assets/tsconfig.app.json new file mode 100644 index 0000000..d3516ef --- /dev/null +++ b/packages/item-assets/tsconfig.app.json @@ -0,0 +1,4 @@ +{ + "extends": "../mono-dev/tsconfig/vite.json", + "include": ["src", "test"] +} diff --git a/packages/item-assets/tsconfig.json b/packages/item-assets/tsconfig.json index 641668c..f6df6c7 100644 --- a/packages/item-assets/tsconfig.json +++ b/packages/item-assets/tsconfig.json @@ -1,4 +1,7 @@ { - "extends": "../mono-dev/tsconfig/vite.json", - "include": ["src"] + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] } diff --git a/packages/item-assets/tsconfig.node.json b/packages/item-assets/tsconfig.node.json new file mode 100644 index 0000000..3c5c48c --- /dev/null +++ b/packages/item-assets/tsconfig.node.json @@ -0,0 +1,4 @@ +{ + "extends": "../mono-dev/tsconfig/node.json", + "include": ["vite.config.ts"] +} diff --git a/packages/item-assets/vite.config.ts b/packages/item-assets/vite.config.ts new file mode 100644 index 0000000..1bffa9d --- /dev/null +++ b/packages/item-assets/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], +}); diff --git a/packages/mono-dev b/packages/mono-dev index 8e35630..6484ece 160000 --- a/packages/mono-dev +++ b/packages/mono-dev @@ -1 +1 @@ -Subproject commit 8e356305575b1e3be870186cbf9e55ef3aa9f2ee +Subproject commit 6484ece59929a4235a86dfb93b059cc3d3b02c56 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08d4c46..3ca1e6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,9 @@ settings: catalogs: default: + '@griffel/react': + specifier: ^1.5.29 + version: 1.5.29 '@modyfi/vite-plugin-yaml': specifier: ^1.1.0 version: 1.1.0 @@ -15,12 +18,21 @@ catalogs: '@types/react': specifier: ^18.3.17 version: 18.3.18 + '@types/react-dom': + specifier: ^18.3.5 + version: 18.3.5 + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4 eslint: specifier: ^9 version: 9.18.0 react: specifier: ^18.3.1 version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1 typescript: specifier: ^5.7.2 version: 5.7.3 @@ -62,7 +74,7 @@ importers: packages/item-assets: dependencies: '@griffel/react': - specifier: ^1.5.29 + specifier: 'catalog:' version: 1.5.29(react@18.3.1) react: specifier: 'catalog:' @@ -71,12 +83,21 @@ importers: '@types/react': specifier: 'catalog:' version: 18.3.18 + '@types/react-dom': + specifier: 'catalog:' + version: 18.3.5(@types/react@18.3.18) + '@vitejs/plugin-react': + specifier: 'catalog:' + version: 4.3.4(vite@5.4.14) eslint: specifier: 'catalog:' version: 9.18.0 mono-dev: specifier: workspace:* version: link:../mono-dev + react-dom: + specifier: 'catalog:' + version: 18.3.1(react@18.3.1) typescript: specifier: 'catalog:' version: 5.7.3 @@ -152,10 +173,93 @@ importers: packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.7': + resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.7': + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.26.7': resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.7': + resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.7': + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} + engines: {node: '>=6.9.0'} + '@catppuccin/palette@1.7.1': resolution: {integrity: sha512-aRc1tbzrevOTV7nFTT9SRdF26w/MIwT4Jwt4fDMc9itRZUDXCuEDBLyz4TQMlqO9ZP8mf5Hu4Jr6D03NLFc6Gw==} @@ -368,6 +472,24 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@modyfi/vite-plugin-yaml@1.1.0': resolution: {integrity: sha512-L26xfzkSo1yamODCAtk/ipVlL6OEw2bcJ92zunyHu8zxi7+meV0zefA9xscRMDCsMY8xL3C3wi3DhMiPxcbxbw==} peerDependencies: @@ -498,6 +620,18 @@ packages: cpu: [x64] os: [win32] + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -510,6 +644,11 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.0.0 + '@types/react@18.3.18': resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} @@ -560,6 +699,12 @@ packages: resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -638,6 +783,11 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} @@ -654,6 +804,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + caniuse-lite@1.0.30001695: + resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -668,6 +821,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -722,6 +878,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + electron-to-chromium@1.5.88: + resolution: {integrity: sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==} + es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -758,6 +917,10 @@ packages: engines: {node: '>=12'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -902,6 +1065,10 @@ packages: resolution: {integrity: sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==} engines: {node: '>=10'} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-current-package@1.0.1: resolution: {integrity: sha512-c/Rw5ByDQ+zg+Lh/emBWv0bDpugEFdmXPR6/srIemVtIvol0XbT0JAr8Db0cX+Jj/xY9wj1wdjeq2qNB35Tayg==} @@ -925,6 +1092,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -1127,6 +1298,11 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -1176,6 +1352,9 @@ packages: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1209,6 +1388,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1317,6 +1499,11 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + react-i18next@15.4.0: resolution: {integrity: sha512-Py6UkX3zV08RTvL6ZANRoBh9sL/ne6rQq79XlkHEdd82cZr2H9usbWpUNVadJntIZP2pu3M2rL1CN+5rQYfYFw==} peerDependencies: @@ -1333,6 +1520,10 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -1383,6 +1574,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -1567,6 +1761,12 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1639,6 +1839,9 @@ packages: worktank@2.7.3: resolution: {integrity: sha512-M0fesnpttBPdvNYBdzRvLDsacN0na9RYWFxwmM/x1+/6mufjduv9/9vBObK8EXDqxRMX/SOYJabpo0UCYYBUdQ==} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -1663,10 +1866,125 @@ packages: snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.5': {} + + '@babel/core@7.26.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.7': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 + + '@babel/parser@7.26.7': + dependencies: + '@babel/types': 7.26.7 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/runtime@7.26.7': dependencies: regenerator-runtime: 0.14.1 + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + + '@babel/traverse@7.26.7': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.7': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@catppuccin/palette@1.7.1': {} '@emotion/hash@0.9.2': {} @@ -1816,6 +2134,23 @@ snapshots: '@iarna/toml@2.2.5': {} + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@modyfi/vite-plugin-yaml@1.1.0(rollup@4.31.0)(vite@5.4.14)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.31.0) @@ -1935,6 +2270,27 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.31.0': optional: true + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.7 + '@types/estree@1.0.6': {} '@types/file-saver@2.0.7': {} @@ -1943,6 +2299,10 @@ snapshots: '@types/prop-types@15.7.14': {} + '@types/react-dom@18.3.5(@types/react@18.3.18)': + dependencies: + '@types/react': 18.3.18 + '@types/react@18.3.18': dependencies: '@types/prop-types': 15.7.14 @@ -2025,6 +2385,17 @@ snapshots: '@typescript-eslint/types': 8.21.0 eslint-visitor-keys: 4.2.0 + '@vitejs/plugin-react@4.3.4(vite@5.4.14)': + dependencies: + '@babel/core': 7.26.7 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.7) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.14 + transitivePeerDependencies: + - supports-color + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -2131,6 +2502,13 @@ snapshots: dependencies: fill-range: 7.1.1 + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001695 + electron-to-chromium: 1.5.88 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 @@ -2150,6 +2528,8 @@ snapshots: callsites@3.1.0: {} + caniuse-lite@1.0.30001695: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -2163,6 +2543,8 @@ snapshots: concat-map@0.0.1: {} + convert-source-map@2.0.0: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2221,6 +2603,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + electron-to-chromium@1.5.88: {} + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -2345,6 +2729,8 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + escalade@3.2.0: {} + escape-string-regexp@4.0.0: {} eslint-plugin-react-hooks@5.1.0(eslint@9.18.0): @@ -2526,6 +2912,8 @@ snapshots: fuse.js@7.0.0: {} + gensync@1.0.0-beta.2: {} + get-current-package@1.0.1: dependencies: find-up-json: 2.0.5 @@ -2562,6 +2950,8 @@ snapshots: dependencies: is-glob: 4.0.3 + globals@11.12.0: {} + globals@14.0.0: {} globals@15.14.0: {} @@ -2757,6 +3147,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -2799,6 +3191,10 @@ snapshots: lru-cache@11.0.2: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + math-intrinsics@1.1.0: {} merge2@1.4.1: {} @@ -2824,6 +3220,8 @@ snapshots: natural-compare@1.4.0: {} + node-releases@2.0.19: {} + object-assign@4.1.1: {} object-inspect@1.13.3: {} @@ -2933,6 +3331,12 @@ snapshots: queue-microtask@1.2.3: {} + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + react-i18next@15.4.0(i18next@24.2.2(typescript@5.7.3))(react@18.3.1): dependencies: '@babel/runtime': 7.26.7 @@ -2942,6 +3346,8 @@ snapshots: react-is@16.13.1: {} + react-refresh@0.14.2: {} + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -3030,6 +3436,10 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + semver@6.3.1: {} semver@7.6.3: {} @@ -3283,6 +3693,12 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -3352,6 +3768,8 @@ snapshots: promise-make-naked: 2.1.2 webworker-shim: 1.1.1 + yallist@3.1.1: {} + yocto-queue@0.1.0: {} zeptomatch-escape@1.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1b06d02..1bf2d40 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,8 +10,11 @@ catalog: "@modyfi/vite-plugin-yaml": ^1.1.0 "@pistonite/pure": ^0.0.18 "@types/react": ^18.3.17 + "@types/react-dom": ^18.3.5 + "@vitejs/plugin-react": ^4.3.4 eslint: ^9 react: ^18.3.1 + react-dom: ^18.3.1 typescript: ^5.7.2 vite: ^5.4.14