diff --git a/__tests__/components/drops/view/item/content/media/MediaDisplayImage.test.tsx b/__tests__/components/drops/view/item/content/media/MediaDisplayImage.test.tsx index 36c42543ce..4e1d166681 100644 --- a/__tests__/components/drops/view/item/content/media/MediaDisplayImage.test.tsx +++ b/__tests__/components/drops/view/item/content/media/MediaDisplayImage.test.tsx @@ -3,7 +3,7 @@ import { fireEvent, render } from "@testing-library/react"; jest.mock("@/helpers/image.helpers", () => ({ getScaledImageUri: jest.fn(() => "scaled-url"), - ImageScale: { AUTOx600: "AUTOx600" }, + ImageScale: { AUTOx1080: "AUTOx1080" }, })); jest.mock("@/hooks/useInView", () => ({ @@ -51,7 +51,7 @@ describe("MediaDisplayImage", () => { } expect(img).toBeInTheDocument(); - expect(getScaledImageUri).toHaveBeenCalledWith("test.jpg", "AUTOx600"); + expect(getScaledImageUri).toHaveBeenCalledWith("test.jpg", "AUTOx1080"); expect(img.src).toContain("scaled-url"); fireEvent.load(img); diff --git a/components/drops/media/MediaTypeBadge.tsx b/components/drops/media/MediaTypeBadge.tsx new file mode 100644 index 0000000000..031f25f6d3 --- /dev/null +++ b/components/drops/media/MediaTypeBadge.tsx @@ -0,0 +1,89 @@ +"use client"; + +import { getMediaTypeInfo, type MediaCategory } from "@/helpers/file.helpers"; +import { useControlledTooltip } from "@/hooks/useControlledTooltip"; +import { Tooltip } from "react-tooltip"; + +const FORMAT_ICONS: Record = { + image: { + viewBox: "0 0 512 512", + path: "M0 96C0 60.7 28.7 32 64 32l384 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96zM323.8 202.5c-4.5-6.6-11.9-10.5-19.8-10.5s-15.4 3.9-19.8 10.5l-87 127.6L170.7 297c-4.6-5.7-11.5-9-18.7-9s-14.2 3.3-18.7 9l-64 80c-5.8 7.2-6.9 17.1-2.9 25.4s12.4 13.6 21.6 13.6l96 0 32 0 208 0c8.9 0 17.1-4.9 21.2-12.8s3.6-17.4-1.4-24.7l-120-176zM112 192a48 48 0 1 0 0-96 48 48 0 1 0 0 96z", + }, + video: { + viewBox: "0 0 576 512", + path: "M0 128C0 92.7 28.7 64 64 64l256 0c35.3 0 64 28.7 64 64l0 256c0 35.3-28.7 64-64 64L64 448c-35.3 0-64-28.7-64-64L0 128zM559.1 99.8c10.4 5.6 16.9 16.4 16.9 28.2l0 256c0 11.8-6.5 22.6-16.9 28.2s-23 5-32.9-1.6l-96-64L416 336l0-48 0-64 0-48 14.2-9.5 96-64c9.8-6.5 22.4-7.2 32.9-1.6z", + }, + interactive: { + viewBox: "45 15 170 230", + path: "M195.4,107.9c-2.6,0-5,0.4-7.4,1.2c-0.2-0.1-0.5-0.2-0.8-0.3c-4.4-7.1-12-11.4-20.4-11.4c-2.9,0-5.7,0.5-8.4,1.4c-4.4-7.4-12.1-11.9-20.8-11.9c-1.6,0-3.1,0.1-4.6,0.4V73.9c0-14-10.7-24.9-24.4-24.9c-13.8,0-25,11.2-25,24.9v65.8l-3.9-3.9c-4.5-4.4-10.7-6.9-17.5-6.9c-6.9,0-13.6,2.6-17.9,6.9c-9.4,9.4-12.5,25.7-1.5,36.7l56.2,55.9c1.3,1.3,2.8,2.4,4.4,3.4c10.5,8.6,23.1,14.2,49.7,14.2c61.8,0,66.9-36.2,66.9-73.3v-40C220.1,118.8,209.4,107.9,195.4,107.9L195.4,107.9z M210.3,172.8c0,36-4.2,63.5-57.1,63.5c-24,0-34.5-4.7-43.7-12.2l-0.6-0.4c-1.1-0.7-2-1.4-2.9-2.2l-56.2-55.8c-7.3-7.3-3.5-17.8,1.5-22.8c2.5-2.5,6.7-4,10.9-4c4.2,0,8,1.4,10.6,4l20.6,20.5V73.8c0-8.3,6.8-15.1,15.2-15.1c8.2,0,14.6,6.6,14.6,15.1v28.5l0.1-0.1v29.3c0,2.7,2.2,4.9,4.9,4.9c2.7,0,4.9-2.2,4.9-4.9V97.4c1.4-0.4,2.9-0.7,4.5-0.7c6.3,0,11.6,3.9,13.8,10.2l0.6,1.8v32.1c0,2.7,2.2,4.9,4.9,4.9c2.7,0,4.9-2.2,4.9-4.9V108c1.6-0.5,3.3-0.9,4.9-0.9c6.3,0,11.6,3.9,13.8,10.2l0.3,1v32.1c0,2.7,2.2,4.9,4.9,4.9c2.7,0,4.9-2.2,4.9-4.9v-31.8c1.6-0.6,3.2-1,5.2-1c8.2,0,14.4,6.5,14.4,15.1V172.8L210.3,172.8z M68.4,120.1c0.9,0.7,1.9,1,2.9,1c1.5,0,3-0.7,4-2c1.6-2.2,1.2-5.3-1-6.9C61.1,102.4,53.5,87.4,53.5,71c0-28.3,23-51.2,51.2-51.2S156,42.8,156,71c0,3.4-0.3,6.9-1,10.2c-0.5,2.6,1.2,5.3,3.9,5.8c2.6,0.5,5.3-1.2,5.8-3.9c0.8-4,1.2-8.1,1.2-12.1c0-33.6-27.4-61-61-61S43.7,37.4,43.7,71.1C43.7,90.3,52.9,108.6,68.4,120.1L68.4,120.1z", + }, +}; + +interface MediaTypeBadgeProps { + readonly mimeType: string | undefined; + readonly dropId: string; + readonly size?: "sm" | "md" | "lg"; +} + +const SIZE_CLASSES = { + sm: "tw-size-6", + md: "tw-size-8", + lg: "tw-size-10", +}; + +const ICON_SIZE_CLASSES = { + sm: "tw-size-3", + md: "tw-size-4", + lg: "tw-size-5", +}; + +export default function MediaTypeBadge({ + mimeType, + dropId, + size = "sm", +}: MediaTypeBadgeProps) { + const mediaInfo = getMediaTypeInfo(mimeType); + const tooltipId = `format-badge-${dropId}`; + const { isOpen, setIsOpen, triggerProps } = useControlledTooltip(); + + return ( +
+
+ + + +
+ +
+ ); +} diff --git a/components/drops/view/item/content/media/MediaDisplay.tsx b/components/drops/view/item/content/media/MediaDisplay.tsx index 99a843c7c0..d0d0596a0d 100644 --- a/components/drops/view/item/content/media/MediaDisplay.tsx +++ b/components/drops/view/item/content/media/MediaDisplay.tsx @@ -1,11 +1,11 @@ -import dynamic from "next/dynamic"; import { assertUnreachable } from "@/helpers/AllowlistToolHelpers"; +import dynamic from "next/dynamic"; -import MediaDisplayImage from "./MediaDisplayImage"; +import SandboxedExternalIframe from "@/components/common/SandboxedExternalIframe"; import { ImageScale } from "@/helpers/image.helpers"; -import MediaDisplayVideo from "./MediaDisplayVideo"; import MediaDisplayAudio from "./MediaDisplayAudio"; -import SandboxedExternalIframe from "@/components/common/SandboxedExternalIframe"; +import MediaDisplayImage from "./MediaDisplayImage"; +import MediaDisplayVideo from "./MediaDisplayVideo"; enum MediaType { IMAGE = "IMAGE", @@ -33,7 +33,7 @@ export default function MediaDisplay({ media_mime_type, media_url, disableMediaInteraction = false, - imageScale = ImageScale.AUTOx600, + imageScale = ImageScale.AUTOx1080, previewImageUrl, }: { readonly media_mime_type: string; diff --git a/components/drops/view/item/content/media/MediaDisplayImage.tsx b/components/drops/view/item/content/media/MediaDisplayImage.tsx index f95d7e0183..6fa8e2d2bd 100644 --- a/components/drops/view/item/content/media/MediaDisplayImage.tsx +++ b/components/drops/view/item/content/media/MediaDisplayImage.tsx @@ -1,16 +1,16 @@ "use client"; -import React, { useState, useCallback } from "react"; import { FallbackImage } from "@/components/common/FallbackImage"; import { getScaledImageUri, ImageScale } from "@/helpers/image.helpers"; import { useInView } from "@/hooks/useInView"; +import React, { useCallback, useState } from "react"; interface Props { readonly src: string; readonly imageScale?: ImageScale | undefined; } -function MediaDisplayImage({ src, imageScale = ImageScale.AUTOx600 }: Props) { +function MediaDisplayImage({ src, imageScale = ImageScale.AUTOx1080 }: Props) { const [ref, inView] = useInView(); const [isLoading, setIsLoading] = useState(true); @@ -32,10 +32,11 @@ function MediaDisplayImage({ src, imageScale = ImageScale.AUTOx600 }: Props) { return (
+ className="tw-relative tw-mx-[1px] tw-flex tw-h-full tw-w-full tw-items-center tw-justify-center" + > {isLoading && (
)} @@ -44,9 +45,10 @@ function MediaDisplayImage({ src, imageScale = ImageScale.AUTOx600 }: Props) { primarySrc={getScaledImageUri(src, imageScale)} fallbackSrc={src} alt="Media content" + optimize={false} fill sizes="(max-width: 768px) 100vw, 600px" - className={`tw-object-contain tw-max-w-full ${ + className={`tw-max-w-full tw-object-contain ${ isLoading ? "tw-opacity-0" : "tw-opacity-100" }`} onLoad={handleImageLoad} diff --git a/components/home/carousel/CarouselActiveItemDetails.tsx b/components/home/carousel/CarouselActiveItemDetails.tsx index 1a83e5ba0d..25f98bcdeb 100644 --- a/components/home/carousel/CarouselActiveItemDetails.tsx +++ b/components/home/carousel/CarouselActiveItemDetails.tsx @@ -1,5 +1,6 @@ "use client"; +import MediaTypeBadge from "@/components/drops/media/MediaTypeBadge"; import { parseIpfsUrl } from "@/helpers/Helpers"; import { getScaledImageUri, ImageScale } from "@/helpers/image.helpers"; import type { ExtendedDrop } from "@/helpers/waves/drop.helpers"; @@ -34,16 +35,20 @@ export default function CarouselActiveItemDetails({ drop.metadata.find((m) => m.data_key === "description")?.data_value ?? ""; const detailsId = `carousel-details-${drop.id}`; const author = drop.author; + const media = drop.parts[0]?.media[0]; return (
- - {title} - +
+ + + {title} + +
{
- - {title} - +
+ + + {title} + +
{
- - {title} - +
+ + + {title} + +
= ({ {/* Title and Description */}
- +
+ + +
diff --git a/components/the-memes/TheMemes.tsx b/components/the-memes/TheMemes.tsx index eab44f6d7f..0e7d384695 100644 --- a/components/the-memes/TheMemes.tsx +++ b/components/the-memes/TheMemes.tsx @@ -72,7 +72,12 @@ export default function TheMemesComponent() { const { connectedProfile } = useContext(AuthContext); const [selectedSeason, setSelectedSeason] = useState(null); - const [initialSeasonId, setInitialSeasonId] = useState(null); + const [seasonId, setSeasonId] = useState(null); + + const handleSeasonChange = (season: MemeSeason | null) => { + setSelectedSeason(season); + setSeasonId(season?.id ?? null); + }; const [routerLoaded, setRouterLoaded] = useState(false); @@ -127,7 +132,7 @@ export default function TheMemesComponent() { setSort(initialSort); setSortDir(initialSortDir); - setInitialSeasonId(initialSznId); + setSeasonId(initialSznId); setVolumeType(initialVolume); setRouterLoaded(true); }, [searchParams]); @@ -135,8 +140,8 @@ export default function TheMemesComponent() { const getNftsNextPage = () => { const mySort = getApiSort(sort, volumeType); let seasonFilter = ""; - if (selectedSeason) { - seasonFilter = `&season=${selectedSeason.id}`; + if (seasonId) { + seasonFilter = `&season=${seasonId}`; } return `${publicEnv.API_ENDPOINT}/api/memes_extended_data?page_size=48&sort_direction=${sortDir}&sort=${mySort}${seasonFilter}`; }; @@ -156,6 +161,8 @@ export default function TheMemesComponent() { >(new Map()); useEffect(() => { + if (!routerLoaded) return; + let sortParam: string; if (sort === MemesSort.VOLUME) { @@ -176,11 +183,11 @@ export default function TheMemesComponent() { } let queryString = `sort=${sortParam}&sort_dir=${sortDir.toLowerCase()}`; - if (selectedSeason) { - queryString += `&szn=${selectedSeason.id}`; + if (seasonId) { + queryString += `&szn=${seasonId}`; } router.push(`the-memes?${queryString}`); - }, [sort, sortDir, selectedSeason, volumeType, router]); + }, [sort, sortDir, seasonId, volumeType, router, routerLoaded]); useEffect(() => { const memesMap = new Map< @@ -246,7 +253,7 @@ export default function TheMemesComponent() { setNftsNextPage(getNftsNextPage()); setFetching(true); } - }, [sort, sortDir, volumeType, selectedSeason, routerLoaded]); + }, [sort, sortDir, volumeType, seasonId, routerLoaded]); useEffect(() => { if (fetching && routerLoaded && nftsNextPage) { @@ -429,8 +436,8 @@ export default function TheMemesComponent() {
@@ -449,8 +456,8 @@ export default function TheMemesComponent() {
diff --git a/components/waves/drop/MemesSingleWaveDropInfoPanel.tsx b/components/waves/drop/MemesSingleWaveDropInfoPanel.tsx index 4673c5dc16..5e7aed1e5e 100644 --- a/components/waves/drop/MemesSingleWaveDropInfoPanel.tsx +++ b/components/waves/drop/MemesSingleWaveDropInfoPanel.tsx @@ -154,7 +154,7 @@ export const MemesSingleWaveDropInfoPanel = ({ )}
- + {manualOutcomes.length > 0 && ( <> · diff --git a/components/waves/drop/SingleWaveDropPosition.tsx b/components/waves/drop/SingleWaveDropPosition.tsx index faab2893ff..65bcbbc3ad 100644 --- a/components/waves/drop/SingleWaveDropPosition.tsx +++ b/components/waves/drop/SingleWaveDropPosition.tsx @@ -9,6 +9,7 @@ interface SingleWaveDropPositionProps { readonly drop?: ExtendedDrop | undefined; readonly isFinalWinner?: boolean | undefined; readonly variant?: "default" | "simple" | undefined; + readonly size?: "sm" | "md" | undefined; } const TrophyOnlyBadge: FC<{ rank: number }> = ({ rank }) => { @@ -52,7 +53,7 @@ const TrophyOnlyBadge: FC<{ rank: number }> = ({ rank }) => { ); }; -const SimpleRankDisplay: FC<{ rank: number }> = ({ rank }) => { +const SimpleRankDisplay: FC<{ rank: number; size?: "sm" | "md" }> = ({ rank, size = "sm" }) => { let color = ""; switch (rank) { case 1: @@ -81,10 +82,13 @@ const SimpleRankDisplay: FC<{ rank: number }> = ({ rank }) => { } }; + const iconSize = size === "md" ? "tw-w-4 tw-h-4" : "tw-w-3.5 tw-h-3.5"; + const textSize = size === "md" ? "tw-text-md" : "tw-text-sm"; + return (
- - {formatRank(rank)} + + {formatRank(rank)}
); }; @@ -94,11 +98,12 @@ export const SingleWaveDropPosition: FC = ({ drop, isFinalWinner = false, variant = "default", + size = "sm", }) => { if (!rank) return null; if (variant === "simple") { - return ; + return ; } const isWinner = isFinalWinner || drop?.winning_context; diff --git a/components/waves/drop/WaveDropMetaRow.tsx b/components/waves/drop/WaveDropMetaRow.tsx index ed8a18c01d..a633271f45 100644 --- a/components/waves/drop/WaveDropMetaRow.tsx +++ b/components/waves/drop/WaveDropMetaRow.tsx @@ -1,26 +1,35 @@ -import { type ReactNode } from "react"; +import MediaTypeBadge from "@/components/drops/media/MediaTypeBadge"; import { ApiDropType } from "@/generated/models/ApiDropType"; import type { ExtendedDrop } from "@/helpers/waves/drop.helpers"; -import { SingleWaveDropInfoAuthorSection } from "./SingleWaveDropInfoAuthorSection"; +import { type ReactNode } from "react"; import WaveDropTime from "../drops/time/WaveDropTime"; +import { SingleWaveDropInfoAuthorSection } from "./SingleWaveDropInfoAuthorSection"; import { SingleWaveDropPosition } from "./SingleWaveDropPosition"; import { WinnerBadge } from "./WinnerBadge"; interface WaveDropMetaRowProps { readonly drop: ExtendedDrop; readonly isWinner: boolean; + readonly mimeType?: string | undefined; readonly children?: ReactNode | undefined; } export const WaveDropMetaRow = ({ drop, isWinner, + mimeType, children, }: WaveDropMetaRowProps) => ( -
+
{"\u00b7"} + {mimeType && ( + <> + {"\u00b7"} + + + )} {isWinner && ( <> {"\u00b7"} diff --git a/components/waves/leaderboard/gallery/WaveLeaderboardGalleryItem.tsx b/components/waves/leaderboard/gallery/WaveLeaderboardGalleryItem.tsx index f9f1a56e3e..0eb0cbeeb3 100644 --- a/components/waves/leaderboard/gallery/WaveLeaderboardGalleryItem.tsx +++ b/components/waves/leaderboard/gallery/WaveLeaderboardGalleryItem.tsx @@ -1,29 +1,30 @@ "use client"; -import { useState, useEffect, useRef, memo, useMemo } from "react"; +import MediaTypeBadge from "@/components/drops/media/MediaTypeBadge"; +import MediaDisplay from "@/components/drops/view/item/content/media/MediaDisplay"; +import UserProfileTooltipWrapper from "@/components/utils/tooltip/UserProfileTooltipWrapper"; +import { MobileVotingModal, VotingModal } from "@/components/voting"; +import VotingModalButton from "@/components/voting/VotingModalButton"; +import WinnerDropBadge from "@/components/waves/drops/winner/WinnerDropBadge"; +import type { ApiWaveCreditType } from "@/generated/models/ApiWaveCreditType"; +import { formatNumberWithCommas } from "@/helpers/Helpers"; +import { ImageScale } from "@/helpers/image.helpers"; import { ExtendedDrop, getDropPreviewImageUrl, } from "@/helpers/waves/drop.helpers"; -import MediaDisplay from "@/components/drops/view/item/content/media/MediaDisplay"; -import WaveLeaderboardGalleryItemVotes from "./WaveLeaderboardGalleryItemVotes"; -import { formatNumberWithCommas } from "@/helpers/Helpers"; -import Link from "next/link"; -import WinnerDropBadge from "@/components/waves/drops/winner/WinnerDropBadge"; -import { VotingModal, MobileVotingModal } from "@/components/voting"; -import VotingModalButton from "@/components/voting/VotingModalButton"; -import useIsMobileScreen from "@/hooks/isMobileScreen"; -import { useDropInteractionRules } from "@/hooks/drops/useDropInteractionRules"; -import useDeviceInfo from "@/hooks/useDeviceInfo"; -import UserProfileTooltipWrapper from "@/components/utils/tooltip/UserProfileTooltipWrapper"; -import type { WaveDropsLeaderboardSort } from "@/hooks/useWaveDropsLeaderboard"; import { - WAVE_VOTING_LABELS, WAVE_VOTE_STATS_LABELS, + WAVE_VOTING_LABELS, } from "@/helpers/waves/waves.constants"; -import type { ApiWaveCreditType } from "@/generated/models/ApiWaveCreditType"; -import { ImageScale } from "@/helpers/image.helpers"; +import { useDropInteractionRules } from "@/hooks/drops/useDropInteractionRules"; +import useIsMobileScreen from "@/hooks/isMobileScreen"; +import useDeviceInfo from "@/hooks/useDeviceInfo"; import { useMediaQuery } from "@/hooks/useMediaQuery"; +import type { WaveDropsLeaderboardSort } from "@/hooks/useWaveDropsLeaderboard"; +import Link from "next/link"; +import { memo, useEffect, useMemo, useRef, useState } from "react"; +import WaveLeaderboardGalleryItemVotes from "./WaveLeaderboardGalleryItemVotes"; interface WaveLeaderboardGalleryItemProps { readonly drop: ExtendedDrop; @@ -43,7 +44,7 @@ export const WaveLeaderboardGalleryItem = memo( const { canShowVote } = useDropInteractionRules(drop); const mediaImageScale = isTabletOrSmaller ? ImageScale.AUTOx450 - : ImageScale.AUTOx600; + : ImageScale.AUTOx1080; const previewImageUrl = useMemo( () => getDropPreviewImageUrl(drop.metadata), @@ -141,12 +142,12 @@ export const WaveLeaderboardGalleryItem = memo( return (
-
-
-
- {drop.title && ( -

- {drop.title} -

- )} +
+
+
+
+ + {drop.title && ( +

+ {drop.title} +

+ )} +
{drop.author?.handle && ( ( e.stopPropagation()} href={`/${drop.author?.handle}`} - className="tw-text-xs tw-text-iron-400 tw-mt-0.5 tw-no-underline desktop-hover:hover:tw-underline desktop-hover:hover:tw-text-iron-300 tw-transition-colors tw-duration-150" + className="tw-mt-0.5 tw-text-xs tw-text-iron-400 tw-no-underline tw-transition-colors tw-duration-150 desktop-hover:hover:tw-text-iron-300 desktop-hover:hover:tw-underline" > {drop.author?.handle} @@ -188,12 +196,12 @@ export const WaveLeaderboardGalleryItem = memo( /> )}
-
+
-
+
(
-
+
{hasUserVoted && ( - + {WAVE_VOTE_STATS_LABELS.YOUR_VOTES}:{" "} {isNegativeVote && "-"} @@ -226,7 +234,7 @@ export const WaveLeaderboardGalleryItem = memo( )} {canShowVote && ( -
+
= ({ = ({ {/* File type indicators */}
- {UI_FORMAT_CATEGORIES.map((format) => ( + {SUBMISSION_UI_FORMAT_CATEGORIES.map((format) => ( ))}
diff --git a/components/waves/memes/file-upload/utils/constants.ts b/components/waves/memes/file-upload/utils/constants.ts index 7ec453c800..c6236bf462 100644 --- a/components/waves/memes/file-upload/utils/constants.ts +++ b/components/waves/memes/file-upload/utils/constants.ts @@ -1,25 +1,9 @@ /** * Constants for the file upload system - * - * Central location for all configuration values and constants. */ -/** - * Simplified format categories for UI display - */ -export const UI_FORMAT_CATEGORIES = ["PNG", "JPG", "GIF", "VIDEO", "GLB"]; - -/** - * Maximum file size allowed (100MB) - */ export const FILE_SIZE_LIMIT: number = 200 * 1024 * 1024; -/** - * Accept string for file input element - */ -export const FILE_INPUT_ACCEPT: string = - "image/png,image/jpeg,image/jpg,image/gif,video/mp4,video/quicktime,.mov,model/gltf-binary,model/gltf+json,application/octet-stream,.glb,.gltf"; - /** * Maximum number of processing attempts before giving up */ diff --git a/components/waves/memes/file-upload/utils/fileValidation.ts b/components/waves/memes/file-upload/utils/fileValidation.ts index 46f2562b56..58535485cb 100644 --- a/components/waves/memes/file-upload/utils/fileValidation.ts +++ b/components/waves/memes/file-upload/utils/fileValidation.ts @@ -10,6 +10,10 @@ import type { FileValidationResult, VideoCompatibilityResult, } from "../reducers/types"; +import { + SUBMISSION_IMAGE_MIME_TYPES, + SUBMISSION_INTERACTIVE_MIME_TYPES, +} from "@/constants/submission-media.constants"; /** * Comprehensive file validation with proper typing @@ -17,7 +21,6 @@ import type { * @returns Validation result with validity and optional error */ export const validateFile = (file: File): FileValidationResult => { - // Check if file exists if (!file) { return { valid: false, @@ -25,19 +28,10 @@ export const validateFile = (file: File): FileValidationResult => { }; } - // Check file type with support for generic video types - const isImageType = - file.type.startsWith("image/") && - (file.type === "image/png" || - file.type === "image/jpeg" || - file.type === "image/jpg" || - file.type === "image/gif"); - + const isImageType = SUBMISSION_IMAGE_MIME_TYPES.includes(file.type); const isVideoType = file.type.startsWith("video/"); - const isModelType = - file.type === "model/gltf-binary" || - file.type === "model/gltf+json" || + SUBMISSION_INTERACTIVE_MIME_TYPES.includes(file.type) || (file.type === "application/octet-stream" && (file.name.toLowerCase().endsWith(".glb") || file.name.toLowerCase().endsWith(".gltf"))) || @@ -47,11 +41,10 @@ export const validateFile = (file: File): FileValidationResult => { if (!isImageType && !isVideoType && !isModelType) { return { valid: false, - error: `File type not supported. Please upload PNG, JPG, video, or GLB files.`, + error: `File type not supported. Please upload PNG, JPG, GIF, video, or GLB files.`, }; } - // Check file size if (file.size > FILE_SIZE_LIMIT) { const sizeMB = Math.round(FILE_SIZE_LIMIT / (1024 * 1024)); return { diff --git a/components/waves/small-leaderboard/WaveSmallLeaderboardItemContent.tsx b/components/waves/small-leaderboard/WaveSmallLeaderboardItemContent.tsx index 1811c027b9..934482da6a 100644 --- a/components/waves/small-leaderboard/WaveSmallLeaderboardItemContent.tsx +++ b/components/waves/small-leaderboard/WaveSmallLeaderboardItemContent.tsx @@ -1,5 +1,6 @@ "use client"; +import MediaTypeBadge from "@/components/drops/media/MediaTypeBadge"; import { ExtendedDrop, getDropPreviewImageUrl, @@ -72,6 +73,13 @@ export const WaveSmallLeaderboardItemContent: React.FC< )}
+ {haveMedia && ( + + )} {isStorm && ( <> t.mimeType); + +export const SUBMISSION_IMAGE_MIME_TYPES = SUBMISSION_MEDIA_TYPES + .filter((t) => t.category === "image") + .map((t) => t.mimeType); + +export const SUBMISSION_VIDEO_MIME_TYPES = SUBMISSION_MEDIA_TYPES + .filter((t) => t.category === "video") + .map((t) => t.mimeType); + +export const SUBMISSION_INTERACTIVE_MIME_TYPES = SUBMISSION_MEDIA_TYPES + .filter((t) => t.category === "interactive") + .map((t) => t.mimeType); + +export const SUBMISSION_FILE_INPUT_ACCEPT = + "image/png,image/jpeg,image/jpg,image/gif,video/mp4,video/quicktime,.mov,model/gltf-binary,model/gltf+json,application/octet-stream,.glb,.gltf"; + +export const SUBMISSION_UI_FORMAT_CATEGORIES = ["PNG", "JPG", "GIF", "VIDEO", "GLB"]; + +export const CATEGORY_STYLES: Record = { + image: { + text: "rgba(16, 185, 129, 0.7)", + bg: "rgba(16, 185, 129, 0.08)", + border: "rgba(16, 185, 129, 0.2)", + }, + video: { + text: "rgba(167, 139, 250, 0.7)", + bg: "rgba(167, 139, 250, 0.08)", + border: "rgba(167, 139, 250, 0.2)", + }, + interactive: { + text: "rgba(56, 189, 248, 0.7)", + bg: "rgba(56, 189, 248, 0.08)", + border: "rgba(56, 189, 248, 0.2)", + }, +}; + +export interface SubmissionMediaTypeInfo { + category: SubmissionMediaCategory; + format: string; + label: string; + styles: { text: string; bg: string; border: string }; +} + +const DEFAULT_STYLES = { text: "rgba(113, 113, 122, 0.7)", bg: "rgba(113, 113, 122, 0.08)", border: "rgba(113, 113, 122, 0.2)" }; + +export const getSubmissionMediaTypeInfo = (mimeType: string | undefined): SubmissionMediaTypeInfo => { + if (!mimeType) { + return { category: "image", format: "UNKNOWN", label: "Unknown", styles: DEFAULT_STYLES }; + } + + const found = SUBMISSION_MEDIA_TYPES.find((t) => t.mimeType === mimeType); + if (found) { + return { + category: found.category, + format: found.format, + label: found.label, + styles: CATEGORY_STYLES[found.category], + }; + } + + if (mimeType.startsWith("image/")) { + const format = mimeType.split("/")[1]?.toUpperCase() ?? "UNKNOWN"; + return { category: "image", format, label: `Image - ${format}`, styles: CATEGORY_STYLES.image }; + } + + if (mimeType.startsWith("video/")) { + const format = mimeType.split("/")[1]?.toUpperCase() ?? "UNKNOWN"; + return { category: "video", format, label: `Video - ${format}`, styles: CATEGORY_STYLES.video }; + } + + if (mimeType === "application/octet-stream") { + return { category: "interactive", format: "GLB", label: "Interactive - GLB", styles: CATEGORY_STYLES.interactive }; + } + + return { category: "image", format: "UNKNOWN", label: "Unknown", styles: DEFAULT_STYLES }; +}; diff --git a/helpers/file.helpers.ts b/helpers/file.helpers.ts index e243d70a28..274e1df5ae 100644 --- a/helpers/file.helpers.ts +++ b/helpers/file.helpers.ts @@ -1,3 +1,9 @@ +export { + getSubmissionMediaTypeInfo as getMediaTypeInfo, + type SubmissionMediaCategory as MediaCategory, + type SubmissionMediaTypeInfo as MediaTypeInfo, +} from "@/constants/submission-media.constants"; + export const getFileInfoFromUrl = ( url: string | undefined ): { name: string; extension: string } | null => { diff --git a/hooks/useControlledTooltip.ts b/hooks/useControlledTooltip.ts new file mode 100644 index 0000000000..05be3aef2c --- /dev/null +++ b/hooks/useControlledTooltip.ts @@ -0,0 +1,43 @@ +import type { KeyboardEvent } from "react"; +import { useCallback, useEffect, useState } from "react"; + +export function useControlledTooltip() { + const [isOpen, setIsOpen] = useState(false); + + useEffect(() => { + if (!isOpen) return; + + const handleScroll = () => setIsOpen(false); + window.addEventListener("scroll", handleScroll, { + passive: true, + capture: true, + }); + return () => + window.removeEventListener("scroll", handleScroll, { capture: true }); + }, [isOpen]); + + const open = useCallback(() => setIsOpen(true), []); + const close = useCallback(() => setIsOpen(false), []); + + const handleKeyDown = useCallback((e: KeyboardEvent) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + setIsOpen(true); + } else if (e.key === "Escape") { + setIsOpen(false); + } + }, []); + + return { + isOpen, + setIsOpen, + triggerProps: { + tabIndex: 0, + onMouseEnter: open, + onMouseLeave: close, + onFocus: open, + onBlur: close, + onKeyDown: handleKeyDown, + }, + }; +} diff --git a/package-lock.json b/package-lock.json index 9e33094288..86818088c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -344,7 +344,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -980,7 +979,6 @@ "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.4.1.tgz", "integrity": "sha512-0ap4FzPJItaeg3QiiS1WguPNHY2aD67fQ9wr7DojCRzTFuNXQPvFB6lBkqlrVeQyJ9jCw0KV/LXv25oXjDcsyA==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -1064,7 +1062,6 @@ "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.3.6.tgz", "integrity": "sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@noble/hashes": "1.4.0", "clsx": "1.2.1", @@ -1916,7 +1913,6 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", - "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -1966,7 +1962,6 @@ "resolved": "https://registry.npmjs.org/@gemini-wallet/core/-/core-0.3.2.tgz", "integrity": "sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==", "license": "MIT", - "peer": true, "dependencies": { "@metamask/rpc-errors": "7.0.2", "eventemitter3": "5.0.1" @@ -3861,6 +3856,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -4623,7 +4619,6 @@ "version": "0.33.1", "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.33.1.tgz", "integrity": "sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@metamask/onboarding": "^1.0.1", @@ -4689,7 +4684,6 @@ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", - "peer": true, "dependencies": { "node-fetch": "^2.7.0" } @@ -4861,7 +4855,6 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.9.tgz", "integrity": "sha512-zDntUTReRbAThIfSp3dQZ9kKqI+LjgLp5YZN5c1bgNRDuoeLySAoZg46Bg1a+uV8TMgIRziHocglKGNzr6l+bQ==", "license": "MIT", - "peer": true, "dependencies": { "file-type": "21.1.0", "iterare": "1.2.1", @@ -5078,7 +5071,6 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", - "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -5251,7 +5243,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -5273,7 +5264,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz", "integrity": "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==", "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.19.0 || >=20.6.0" }, @@ -5286,7 +5276,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -5302,7 +5291,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.208.0.tgz", "integrity": "sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/api-logs": "0.208.0", "import-in-the-middle": "^2.0.0", @@ -5690,7 +5678,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -5707,7 +5694,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", @@ -5725,7 +5711,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=14" } @@ -6398,7 +6383,6 @@ "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright": "1.57.0" }, @@ -6414,7 +6398,6 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -8515,7 +8498,6 @@ "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-3.0.3.tgz", "integrity": "sha512-CEEhCDmkvztd1zbgADsEQhmj9GyWOOGeW1hZD+gtwbBSF5YN1uofS/pex5MIh/VIqKRj+A2UnYWI1V+9+q/lyQ==", "license": "MIT", - "peer": true, "dependencies": { "@solana/accounts": "3.0.3", "@solana/addresses": "3.0.3", @@ -9118,7 +9100,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.11.tgz", "integrity": "sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -9129,7 +9110,6 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.11.tgz", "integrity": "sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==", "license": "MIT", - "peer": true, "dependencies": { "@tanstack/query-core": "5.90.11" }, @@ -9342,7 +9322,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9412,6 +9393,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -9422,6 +9404,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -9767,7 +9750,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -9826,7 +9808,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.3.tgz", "integrity": "sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -9836,7 +9817,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -9962,7 +9942,6 @@ "integrity": "sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.48.0", @@ -10003,7 +9982,6 @@ "integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.0", "@typescript-eslint/types": "8.48.0", @@ -10636,6 +10614,7 @@ "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.20.0" }, @@ -10730,7 +10709,6 @@ "integrity": "sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==", "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", "license": "Apache-2.0", - "peer": true, "dependencies": { "@reown/appkit": "1.7.8", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -11838,7 +11816,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -12343,6 +12320,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -12352,25 +12330,29 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -12381,13 +12363,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -12400,6 +12384,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "license": "MIT", + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -12409,6 +12394,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -12417,13 +12403,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -12440,6 +12428,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -12453,6 +12442,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -12465,6 +12455,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -12479,6 +12470,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -12494,13 +12486,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/abab": { "version": "2.0.6", @@ -12536,7 +12530,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -12569,6 +12562,7 @@ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.13.0" }, @@ -12651,6 +12645,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", + "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -12668,6 +12663,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -12683,7 +12679,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -13120,7 +13117,6 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", - "peer": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -13210,7 +13206,6 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -13491,7 +13486,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -13574,7 +13568,6 @@ "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -13856,7 +13849,6 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", - "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -13947,6 +13939,7 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.0" } @@ -15181,7 +15174,8 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -15320,7 +15314,6 @@ "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.16.tgz", "integrity": "sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==", "license": "MIT", - "peer": true, "dependencies": { "@ecies/ciphers": "^0.2.4", "@noble/ciphers": "^1.3.0", @@ -15368,8 +15361,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/emoji-regex": { "version": "10.6.0", @@ -15470,6 +15462,7 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "license": "MIT", + "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -15628,7 +15621,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -15804,7 +15798,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -16006,7 +15999,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -16779,8 +16771,7 @@ "version": "6.4.9", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/eventemitter3": { "version": "5.0.1", @@ -16983,7 +16974,8 @@ "url": "https://opencollective.com/fastify" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/fastest-stable-stringify": { "version": "2.0.2", @@ -17603,7 +17595,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/glob/node_modules/minimatch": { "version": "10.1.1", @@ -17721,9 +17714,9 @@ "license": "MIT" }, "node_modules/h3": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", - "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", @@ -17731,9 +17724,9 @@ "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.2", + "node-mock-http": "^1.0.4", "radix3": "^1.1.2", - "ufo": "^1.6.1", + "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, @@ -17985,9 +17978,9 @@ } }, "node_modules/hono": { - "version": "4.10.7", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.7.tgz", - "integrity": "sha512-icXIITfw/07Q88nLSkB9aiUrd8rYzSweK681Kjo/TSggaGbOX4RRyxxm71v+3PC8C/j+4rlxGeoTRxQDkaJkUw==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", + "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -19107,6 +19100,7 @@ "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", "license": "MIT", + "peer": true, "funding": { "type": "GitHub Sponsors ❤", "url": "https://github.com/sponsors/dmonad" @@ -23031,6 +23025,7 @@ "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.114.tgz", "integrity": "sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==", "license": "MIT", + "peer": true, "dependencies": { "isomorphic.js": "^0.2.4" }, @@ -23129,6 +23124,7 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.11.5" }, @@ -23231,6 +23227,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -24511,7 +24508,6 @@ "resolved": "https://registry.npmjs.org/next/-/next-16.1.3.tgz", "integrity": "sha512-gthG3TRD+E3/mA0uDQb9lqBmx1zVosq5kIwxNN6+MRNd085GzD+9VXMPUs+GGZCbZ+GDZdODUq4Pm7CTXK6ipw==", "license": "MIT", - "peer": true, "dependencies": { "@next/env": "16.1.3", "@swc/helpers": "0.5.15", @@ -24715,9 +24711,9 @@ "license": "MIT" }, "node_modules/node-mock-http": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.3.tgz", - "integrity": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", "license": "MIT" }, "node_modules/node-releases": { @@ -25857,7 +25853,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -25901,7 +25896,6 @@ "resolved": "https://registry.npmjs.org/porto/-/porto-0.2.35.tgz", "integrity": "sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==", "license": "MIT", - "peer": true, "dependencies": { "hono": "^4.10.3", "idb-keyval": "^6.2.1", @@ -26062,7 +26056,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -26095,7 +26088,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -26256,7 +26248,6 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -26352,6 +26343,7 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -26367,6 +26359,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -26379,7 +26372,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/prismjs": { "version": "1.30.0", @@ -26450,7 +26444,6 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -26795,6 +26788,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -26804,7 +26798,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -26855,7 +26848,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -26919,7 +26911,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", - "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -27112,7 +27103,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -27173,8 +27163,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -27202,8 +27191,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", @@ -27385,6 +27373,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27545,7 +27534,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -27687,7 +27675,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -27796,7 +27783,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -27864,6 +27850,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -27900,6 +27887,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -27911,7 +27899,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/screenfull": { "version": "5.2.0", @@ -27978,6 +27967,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -28331,7 +28321,6 @@ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", "license": "MIT", - "peer": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -29107,7 +29096,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -29173,7 +29161,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -29225,6 +29212,7 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -29238,6 +29226,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -29256,6 +29245,7 @@ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -29290,6 +29280,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -29304,6 +29295,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -29318,13 +29310,15 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -29430,8 +29424,7 @@ "version": "0.163.0", "resolved": "https://registry.npmjs.org/three/-/three-0.163.0.tgz", "integrity": "sha512-HlMgCb2TF/dTLRtknBnjUTsR8FsDqBY43itYop2+Zg822I+Kd0Ua2vs8CvfBVefXkBdNDrLMoRTGCIIpfCuDew==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/throttle-debounce": { "version": "3.0.1", @@ -29847,8 +29840,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", @@ -29856,7 +29848,6 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -29878,7 +29869,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -29895,7 +29885,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -29912,7 +29901,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -29929,7 +29917,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -29946,7 +29933,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -29963,7 +29949,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -29980,7 +29965,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -29997,7 +29981,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30014,7 +29997,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30031,7 +30013,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30048,7 +30029,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30065,7 +30045,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30082,7 +30061,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30099,7 +30077,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30116,7 +30093,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30133,7 +30109,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30150,7 +30125,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30167,7 +30141,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30184,7 +30157,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30201,7 +30173,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30218,7 +30189,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30235,7 +30205,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30252,7 +30221,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30269,7 +30237,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30286,7 +30253,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30303,7 +30269,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -30472,7 +30437,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -30532,9 +30496,9 @@ } }, "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, "node_modules/uglify-js": { @@ -30638,9 +30602,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -31003,7 +30967,6 @@ "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -31063,7 +31026,6 @@ "resolved": "https://registry.npmjs.org/valtio/-/valtio-2.1.7.tgz", "integrity": "sha512-DwJhCDpujuQuKdJ2H84VbTjEJJteaSmqsuUltsfbfdbotVfNeTE4K/qc/Wi57I9x8/2ed4JNdjEna7O6PfavRg==", "license": "MIT", - "peer": true, "dependencies": { "proxy-compare": "^3.0.1" }, @@ -31122,7 +31084,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", @@ -31265,7 +31226,6 @@ "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.19.5.tgz", "integrity": "sha512-RQUfKMv6U+EcSNNGiPbdkDtJwtuFxZWLmvDiQmjjBgkuPulUwDJsKhi7gjynzJdsx2yDqhHCXkKsbbfbIsHfcQ==", "license": "MIT", - "peer": true, "dependencies": { "@wagmi/connectors": "6.2.0", "@wagmi/core": "2.22.1", @@ -31321,7 +31281,6 @@ "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.22.1.tgz", "integrity": "sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==", "license": "MIT", - "peer": true, "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", @@ -31349,7 +31308,6 @@ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -31417,6 +31375,7 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -31461,6 +31420,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz", "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -31524,6 +31484,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -31537,6 +31498,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } @@ -31759,7 +31721,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -31912,7 +31873,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" }