Feature/ add video 5 (#49)

* add all the new buttons

preliminarily, new trim scrubber

ironout the positioning bugs of the Area Scrubber

styling of area scrubber is now perfect

trim area and trim duration toggle button works perfect now

* repeat button and events works now

* optimized the trimscrubber and trimduration button, fix data plumbing bug of trimdata
This commit is contained in:
wil authored and GitHub committed 2024-10-14 22:21:31 -04:00
1 parent 5a28aecaf6
commit cee1ee6e9f
14 files changed
+680 -230

No files matched your search

@@ -14,7 +14,6 @@ import { ButtonSubmitAdd } from "./ButtonSumbitAdd";
import { DialogAddMediaStatuses } from "./enums";
import { LoadingScreens } from "./LoadingScreens";
// import { useRenderCounter } from "~/hooks/useRenderCounter";
import { ApiResponse } from "~/Classes/ApiManager/ApiManager";
import { MediaFile } from "~/Classes/ApiManager/models/MediaFile";
@@ -97,7 +96,7 @@ export const DialogAddVideo = ({
onFileStaged={(file) => {
setStates((curr) => ({ ...curr, file }));
}}
trimData={trimData}
trimDataSignal={trimData}
onTrimChange={(newTrimData: TrimData) => {
trimData.value = newTrimData;
}}
@@ -1,5 +1,5 @@
import { useCallback, useState } from "react";
import { Signal } from "@preact/signals-react";
import { useCallback, useState, useRef } from "react";
import { signal, Signal } from "@preact/signals-react";
import { FileUploader } from "../FileUploader";
import { VideoControls } from "./VideoControls";
@@ -14,15 +14,14 @@ export const QuickTrimVideoUploader = ({
file,
onFileStaged,
onTrimChange,
trimData,
trimDataSignal,
}: {
file: File | null;
onFileStaged: (newFile: File | null) => void;
onTrimChange: (trimData: TrimData) => void;
trimData?: Signal<TrimData | undefined>;
trimDataSignal: Signal<TrimData | undefined>;
}) => {
const [vidEl, setVidEl] = useState<HTMLVideoElement | undefined>(undefined);
const videoRefCallback = useCallback(
(node: HTMLVideoElement) => {
if (node !== null) {
@@ -62,10 +61,14 @@ export const QuickTrimVideoUploader = ({
src={URL.createObjectURL(file)}
/>
</div>
<div className="flex w-full items-center justify-center bg-gray-100">
<VideoControls vidEl={vidEl} className="w-fit" />
<div className="my-1 flex w-full items-center justify-center gap-2 bg-gray-100">
<VideoControls
className="w-fit"
vidEl={vidEl}
trimDataSignal={trimDataSignal}
/>
<TrimmerPlaybar
trimData={trimData?.value}
trimDataSignal={trimDataSignal}
vidEl={vidEl}
className="grow"
onTrimChange={onTrimChange}
@@ -0,0 +1,30 @@
import { faStopwatch } from "@fortawesome/pro-solid-svg-icons";
import { Button, Tooltip } from "~/components/ui";
export const ButtonTrimDuration = ({
trimDurationMs,
onChange,
}: {
trimDurationMs: number;
onChange: (newTrimDuration: number) => void;
}) => {
const handleOnClick = () => {
if (trimDurationMs === 6000) {
onChange(3000);
return;
}
if (trimDurationMs === 3000) {
onChange(1000);
return;
}
onChange(6000);
return;
};
return (
<Tooltip tip="Change max trim time">
<Button className="h-8" icon={faStopwatch} onClick={handleOnClick}>
<span className="-ml-1 mt-0.5 w-4">{trimDurationMs / 1000}s</span>
</Button>
</Tooltip>
);
};
@@ -92,7 +92,7 @@ export const PlayProgressCursor = ({
className={twMerge(
verticalPositionStyles,
buttonStyles,
"size-5 -translate-x-1/2 rounded-full",
"z-20 size-5 -translate-x-1/2 rounded-full",
isScrubbing && "cursor-grabbing",
)}
onMouseDown={handleScrubbingCurrentTime}
@@ -0,0 +1,171 @@
import { useCallback, useEffect, useState, useRef } from "react";
import { twMerge } from "tailwind-merge";
import { faGripDots } from "@fortawesome/pro-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { formatSecondsToHHMMSSCS, ONE_MIN } from "./utilities";
import { Tooltip } from "~/components/ui";
export const TrimAreaScrubber = ({
className,
onChange,
trimStartMs,
trimDurationMs,
totalDurationMs,
}: {
className?: string;
onChange: (newPosMs: number) => void;
trimStartMs: number;
trimDurationMs: number;
totalDurationMs: number;
}) => {
const trimPosPercent = (trimStartMs / totalDurationMs) * 100;
const [state, setState] = useState<{
isScrubbing: boolean;
scrubPosPercent: number;
}>({
isScrubbing: false,
scrubPosPercent: trimPosPercent,
});
const { isScrubbing, scrubPosPercent } = state;
const containerRef = useRef<HTMLElement | null>(null);
const scrubberRef = useRef<HTMLDivElement | null>(null);
const mountCallback = useCallback((node: HTMLDivElement) => {
if (node) {
scrubberRef.current = node;
containerRef.current = node.parentElement;
}
}, []);
const scrubPosPercentRef = useRef(scrubPosPercent);
const handleScrubbing = useCallback(
(e: React.MouseEvent<HTMLDivElement>) => {
e.stopPropagation();
e.preventDefault();
if (containerRef.current === null || scrubberRef.current === null) {
return;
}
const calcPosition = makeTrimPositionCalculator({
parentEl: containerRef.current,
mouseOffset:
e.clientX -
scrubberRef.current.offsetLeft -
containerRef.current.offsetLeft,
trimDurationMs: trimDurationMs,
totalDurationMs: totalDurationMs,
});
setState({
isScrubbing: true,
scrubPosPercent: calcPosition(e),
});
const handleMouseMove = (e: MouseEvent) => {
e.stopPropagation();
e.preventDefault();
setState({
isScrubbing: true,
scrubPosPercent: calcPosition(e),
});
};
const handleMouseUp = (e: MouseEvent) => {
e.stopPropagation();
e.preventDefault();
setState((prev) => {
scrubPosPercentRef.current = prev.scrubPosPercent;
return {
...prev,
isScrubbing: false,
};
});
window.removeEventListener("mousemove", handleMouseMove);
window.removeEventListener("mouseup", handleMouseUp);
};
window.addEventListener("mousemove", handleMouseMove);
window.addEventListener("mouseup", handleMouseUp);
},
[trimDurationMs, totalDurationMs],
);
useEffect(() => {
if (!isScrubbing) {
const newTrimMs = (scrubPosPercentRef.current / 100) * totalDurationMs;
onChange(newTrimMs);
}
}, [isScrubbing]);
// this determines if trimmer is its taking value
//from parent's control or user's mouse movement
const positionPercent = isScrubbing ? scrubPosPercent : trimPosPercent;
const leftOffset = `${positionPercent}%`;
// the rest are values that dervied from that position
const trimStartTime = formatSecondsToHHMMSSCS(
(positionPercent / 100) * totalDurationMs,
);
const displayedTrimStartTime =
totalDurationMs >= ONE_MIN * 60
? trimStartTime.substring(3, 8)
: totalDurationMs >= ONE_MIN
? trimStartTime.substring(0, 5)
: trimStartTime.substring(3, 8);
const tip = `Trim ${Math.round(trimDurationMs / 1000)}s from ${displayedTrimStartTime}`;
return (
<Tooltip tip={tip} forceShow={isScrubbing}>
<div
ref={mountCallback}
className={twMerge(
"absolute top-0 -translate-y-1",
"z-10 h-9 w-4 items-center justify-center",
"rounded-b-md border-x-2 border-b-2 border-white shadow-md",
isScrubbing ? "cursor-grabbing" : "cursor-grab",
className,
)}
onMouseDown={handleScrubbing}
style={{
width: `${(trimDurationMs / totalDurationMs) * 100}%`,
left: leftOffset,
}}
>
<FontAwesomeIcon
icon={faGripDots}
className="w-full -translate-x-[2px] -translate-y-2 rounded-t-md border-x-2 border-white bg-white"
/>
</div>
</Tooltip>
);
};
function makeTrimPositionCalculator({
parentEl,
mouseOffset,
trimDurationMs,
totalDurationMs,
}: {
parentEl: HTMLElement;
mouseOffset: number;
trimDurationMs: number;
totalDurationMs: number;
}) {
const parentWidth = parentEl.getBoundingClientRect().width;
const maxMs =
totalDurationMs - trimDurationMs > 0 ? totalDurationMs - trimDurationMs : 0;
const maxPercent = Math.floor((maxMs / totalDurationMs) * 10000) / 100;
return (currE: MouseEvent | React.MouseEvent<HTMLDivElement>) => {
const result =
((currE.clientX - mouseOffset - parentEl.offsetLeft) / parentWidth) * 100;
if (result < 0) {
return 0;
}
if (result > maxPercent) {
return maxPercent;
}
return result;
};
}
@@ -1,15 +1,11 @@
import { useCallback, useEffect, useState } from "react";
import { useEffect, useState } from "react";
import { twMerge } from "tailwind-merge";
import {
faBracketCurly,
faBracketCurlyRight,
} from "@fortawesome/pro-solid-svg-icons";
import { MAX_TRIM_DURATION } from "./utilities";
import { ButtonTrimDuration } from "./ButtonTrimDuration";
import { TrimmingPlaybarLoading } from "./TrimmerPlaybarLoading";
import { PlayProgressCursor } from "./PlayProgressCursor";
import { TrimScrubber } from "./TrimScrubber";
import { TrimAreaScrubber } from "./TrimAreaScrubber";
import { TrimData } from "./utilities";
export const TrimmerPlaybarCore = ({
@@ -28,18 +24,24 @@ export const TrimmerPlaybarCore = ({
currentTimeMs: number | undefined;
trimStartMs: number | undefined;
trimEndMs: number | undefined;
trimDurationMs: number;
}>({
durationMs: undefined,
currentTimeMs: undefined,
trimStartMs: undefined,
trimEndMs: undefined,
trimDurationMs: 6000,
});
const { durationMs, currentTimeMs, trimStartMs, trimEndMs, trimDurationMs } =
states;
const { durationMs, currentTimeMs, trimStartMs, trimEndMs } = states;
const handleChangeTrimDuration = (newTrimDurationMs: number) => {
setStates((curr) => ({ ...curr, trimDurationMs: newTrimDurationMs }));
};
const setTrimStartMs = useCallback((newTrimMs: number) => {
const setTrimStartMs = (newTrimMs: number) => {
setStates((prev) => {
if (prev.trimEndMs === undefined) {
if (prev.trimEndMs === undefined || prev.durationMs === undefined) {
if (import.meta.env.DEV) {
console.warn("Logical Error in Trim Start Setting");
}
@@ -49,30 +51,42 @@ export const TrimmerPlaybarCore = ({
...prev,
trimStartMs: newTrimMs,
trimEndMs:
prev.trimEndMs - newTrimMs >= MAX_TRIM_DURATION
? newTrimMs + MAX_TRIM_DURATION
: prev.trimEndMs,
trimDurationMs >= prev.durationMs
? prev.durationMs
: newTrimMs + trimDurationMs,
};
});
}, []);
const setTrimEndMs = useCallback((newTrimMs: number) => {
};
useEffect(() => {
setStates((prev) => {
if (prev.trimStartMs === undefined) {
if (import.meta.env.DEV) {
console.warn("Logical Error in Trim End Setting");
}
if (prev.trimStartMs === undefined || prev.durationMs === undefined) {
// video is not ready, no data
return prev;
}
// normal case
if (prev.trimStartMs + trimDurationMs <= prev.durationMs) {
return {
...prev,
trimEndMs: prev.trimStartMs + trimDurationMs,
};
}
// not enough duration to fit
if (trimDurationMs >= prev.durationMs) {
return {
...prev,
trimStartMs: 0,
trimEndMs: prev.durationMs,
};
}
// shimmy the area to left
return {
...prev,
trimEndMs: newTrimMs,
trimStartMs:
newTrimMs - prev.trimStartMs >= MAX_TRIM_DURATION
? newTrimMs - MAX_TRIM_DURATION
: prev.trimStartMs,
trimStartMs: prev.durationMs - trimDurationMs,
trimEndMs: prev.durationMs,
};
});
}, []);
}, [trimDurationMs]);
useEffect(() => {
if (trimStartMs !== undefined && trimEndMs !== undefined) {
@@ -89,8 +103,8 @@ export const TrimmerPlaybarCore = ({
trimStartMs: trimData?.trimStartMs ?? 0,
trimEndMs: trimData?.trimEndMs
? trimData.trimEndMs
: vidEl.duration * 1000 >= MAX_TRIM_DURATION
? MAX_TRIM_DURATION
: vidEl.duration * 1000 >= trimDurationMs
? trimDurationMs
: vidEl.duration * 1000,
}));
};
@@ -120,35 +134,30 @@ export const TrimmerPlaybarCore = ({
}
return (
<div
className={twMerge(
"relative mx-4 h-10 w-full border-l border-r border-dotted border-l-ui-border border-r-ui-border",
className,
)}
>
<div className="mt-3 h-4 w-full bg-secondary-300" />
<PlayProgressCursor
vidEl={vidEl}
currentTimePercent={(currentTimeMs / durationMs) * 100}
/>
<TrimScrubber
// trim start scrubber
icon={faBracketCurly}
className="-translate-x-full"
trimPosMs={trimStartMs}
maxTrimPosMs={trimEndMs}
minTrimPosMs={0}
totalDurationMs={durationMs}
onChange={setTrimStartMs}
/>
<TrimScrubber
// trim end scrubber
icon={faBracketCurlyRight}
trimPosMs={trimEndMs}
maxTrimPosMs={durationMs}
minTrimPosMs={trimStartMs}
totalDurationMs={durationMs}
onChange={setTrimEndMs}
<div className="mx-2 flex grow items-center gap-2">
<div
className={twMerge(
"relative h-10 w-full border-l border-r border-dotted border-l-ui-border border-r-ui-border",
className,
)}
>
<div className="mt-3 h-4 w-full bg-secondary-300" />
<PlayProgressCursor
vidEl={vidEl}
currentTimePercent={(currentTimeMs / durationMs) * 100}
/>
<TrimAreaScrubber
trimStartMs={trimStartMs}
trimDurationMs={
durationMs > trimDurationMs ? trimDurationMs : durationMs
}
totalDurationMs={durationMs}
onChange={setTrimStartMs}
/>
</div>
<ButtonTrimDuration
trimDurationMs={trimDurationMs}
onChange={handleChangeTrimDuration}
/>
</div>
);
@@ -1,16 +1,17 @@
import { Signal } from "@preact/signals-react";
import { TrimmerPlaybarCore } from "./TrimmerPlaybarCore";
import { TrimmingPlaybarLoading } from "./TrimmerPlaybarLoading";
import { TrimData } from "./utilities";
export type { TrimData };
export const TrimmerPlaybar = ({
vidEl,
trimData,
trimDataSignal,
className,
onTrimChange,
}: {
vidEl: HTMLVideoElement | undefined;
className?: string;
trimData?: TrimData;
trimDataSignal: Signal<TrimData | undefined>;
onTrimChange: (trimData: TrimData) => void;
}) => {
if (!vidEl) {
@@ -20,7 +21,7 @@ export const TrimmerPlaybar = ({
<TrimmerPlaybarCore
vidEl={vidEl}
className={className}
trimData={trimData}
trimData={trimDataSignal.value}
onTrimChange={onTrimChange}
/>
);
@@ -1,6 +1,7 @@
export const buttonStyles = "border border-ui-border bg-ui-panel cursor-grab";
export const verticalPositionStyles = "absolute top-1/2 -translate-y-1/2";
export const MAX_TRIM_DURATION = 6000;
export const ONE_MIN = 1000 * 60;
export enum MouseState {
IDLE = "idle",
DRAGGING = "dragging",
@@ -10,10 +11,15 @@ export type TrimData = {
trimEndMs: number;
};
export function formatSecondsToHHMMSSCS(seconds: number) {
//example of the ISO String: 1970-01-01T00:01:40.774Z
const isoString = new Date(Math.round(seconds * 1000)).toISOString();
if (seconds > 3600)
export function formatSecondsToHHMMSSCS(msArg: number) {
//example of the ISO String: 1970-01-01T 00:01:40.77 4Z
// index count=01234567890 12345678901 23
const milisecond = isNaN(msArg) ? 0 : msArg;
if (isNaN(milisecond) && import.meta.env.DEV) {
console.warn("formatSecondsToHHMMSSCS recieved a NaN");
}
const isoString = new Date(Math.round(milisecond)).toISOString();
if (milisecond >= ONE_MIN * 60)
return isoString.substring(11, 19) + "." + isoString.substring(20, 22);
else return isoString.substring(14, 19) + "." + isoString.substring(20, 22);
}
@@ -3,7 +3,7 @@ import { useEffect, useState } from "react";
import { faVolumeSlash, faVolume } from "@fortawesome/pro-solid-svg-icons";
import { Button } from "~/components/ui";
import { Tooltip } from "~/components/ui";
export function ButtonMute({ vidEl }: { vidEl: HTMLVideoElement }) {
const [isMuted, setIsMuted] = useState<boolean>(vidEl.muted || false);
@@ -26,11 +26,13 @@ export function ButtonMute({ vidEl }: { vidEl: HTMLVideoElement }) {
}, [vidEl]);
return (
<Button
className="w-10"
icon={isMuted ? faVolumeSlash : faVolume}
variant="secondary"
onClick={toggleMute}
/>
<Tooltip tip={isMuted ? "Unmute" : "Mute"}>
<Button
className="size-8"
icon={isMuted ? faVolumeSlash : faVolume}
variant="secondary"
onClick={toggleMute}
/>
</Tooltip>
);
}
@@ -46,7 +46,7 @@ export function ButtonPlaypause({ vidEl }: { vidEl: HTMLVideoElement }) {
return (
<Button
className="w-10"
className="h-8 w-12"
icon={getIcon()}
variant={playpause === PlayPauseStatus.PLAYING ? "secondary" : "primary"}
onClick={togglePlaypause}
@@ -0,0 +1,75 @@
import { useCallback, useEffect, useState, useRef } from "react";
import { Signal } from "@preact/signals-react";
import { faRepeat } from "@fortawesome/pro-solid-svg-icons";
import { Button, Tooltip } from "~/components/ui";
import { TrimData } from "../TrimmerPlaybar";
export const ButtonRepeat = ({
vidEl,
trimDataSignal,
}: {
vidEl: HTMLVideoElement | undefined;
trimDataSignal: Signal<TrimData | undefined>;
}) => {
const [isRepeatOn, setIsRepeatOn] = useState<boolean>(true);
const resetVideoToTrimStart = useCallback(
(vidEl: HTMLVideoElement, trimData: TrimData) => {
if (
vidEl.currentTime < trimData.trimStartMs / 1000 ||
vidEl.currentTime > trimData.trimEndMs / 1000
) {
vidEl.currentTime = (trimData.trimStartMs + 1) / 1000;
}
},
[],
);
const handleOnClick = useCallback(() => {
setIsRepeatOn((curr) => {
if (!curr && vidEl && trimDataSignal.value) {
resetVideoToTrimStart(vidEl, trimDataSignal.value);
}
return !curr;
});
}, []);
// helper function for listeners need to be defined for reference for removal
const handleOnTimeupdate = useCallback(() => {
if (isRepeatOn && trimDataSignal.value && vidEl) {
resetVideoToTrimStart(vidEl, trimDataSignal.value);
}
}, [isRepeatOn, vidEl]);
// record previous vidEl and its listener incase of re-render
const prevVidEl = useRef<HTMLVideoElement | undefined>(undefined);
const prevhandleOnTimeupdate = useRef(handleOnTimeupdate);
useEffect(() => {
// if vidEl changed, remove old listender and attach new listenHandler
if (vidEl && prevVidEl.current !== vidEl) {
prevVidEl.current?.removeEventListener(
"timeupdate",
prevhandleOnTimeupdate.current,
);
vidEl.addEventListener("timeupdate", handleOnTimeupdate);
}
// remove and reattached listener if the listenHandler has changed
if (vidEl && handleOnTimeupdate !== prevhandleOnTimeupdate.current) {
vidEl.removeEventListener("timeupdate", prevhandleOnTimeupdate.current);
vidEl.addEventListener("timeupdate", handleOnTimeupdate);
}
// remove listener on dismount
return () => {
vidEl?.removeEventListener("timeupdate", handleOnTimeupdate);
};
}, [vidEl, handleOnTimeupdate]);
return (
<Tooltip tip={isRepeatOn ? "Turn off repeat" : "Repeat in trim"}>
<Button
className="size-8"
icon={faRepeat}
variant={isRepeatOn ? "primary" : "secondary"}
onClick={handleOnClick}
/>
</Tooltip>
);
};
@@ -1,17 +1,22 @@
import { useEffect, useRef, useState } from "react";
import { Signal } from "@preact/signals-react";
import { twMerge } from "tailwind-merge";
import { Spinner } from "~/components/ui";
import { VIDEO_STATE_STATUSES } from "./enum";
import { TrimData } from "../TrimmerPlaybar";
import { ButtonPlaypause } from "./ButtonPlayPause";
import { ButtonMute } from "./ButtonMute";
import { LabelTimeDuration } from "./LabelTimeDuration";
import { Spinner } from "~/components/ui";
import { ButtonRepeat } from "./ButtonRepeat";
export const VideoControls = ({
vidEl,
trimDataSignal,
className,
}: {
vidEl: HTMLVideoElement | undefined;
trimDataSignal: Signal<TrimData | undefined>;
className?: string;
}) => {
const prevVidEl = useRef<HTMLVideoElement | undefined>(undefined);
@@ -54,9 +59,9 @@ export const VideoControls = ({
return (
<div className={wrapperClass}>
<ButtonPlaypause vidEl={vidEl} />
<ButtonRepeat trimDataSignal={trimDataSignal} vidEl={vidEl} />
<ButtonMute vidEl={vidEl} />
<LabelTimeDuration vidEl={vidEl} />
<div className="grow"></div>
</div>
);
}
+4 -1
View File
@@ -48,7 +48,10 @@ export const Button = ({
);
const className = twMerge(
"text-sm font-medium rounded-lg px-3 py-2 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 transition-all duration-150 flex gap-2 items-center justify-center",
"text-sm font-medium rounded-lg px-3 py-2 shadow-sm",
"flex gap-2 items-center justify-center",
"transition-all duration-150",
"focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2",
getVariantClassNames(propsVariant),
propsClassName,
disabledClass,
+290 -144
View File
@@ -28,7 +28,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz"
integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.5":
"@babel/core@^7.24.5":
version "7.25.2"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz"
integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
@@ -222,9 +222,119 @@
resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
"@esbuild/aix-ppc64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
"@esbuild/android-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
"@esbuild/android-arm@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
"@esbuild/android-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
"@esbuild/darwin-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
"@esbuild/darwin-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
"@esbuild/freebsd-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
"@esbuild/freebsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
"@esbuild/linux-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
"@esbuild/linux-arm@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
"@esbuild/linux-ia32@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
"@esbuild/linux-loong64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
"@esbuild/linux-mips64el@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
"@esbuild/linux-ppc64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
"@esbuild/linux-riscv64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
"@esbuild/linux-s390x@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
"@esbuild/linux-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
"@esbuild/netbsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
"@esbuild/openbsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
"@esbuild/sunos-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
"@esbuild/win32-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
"@esbuild/win32-ia32@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
"@esbuild/win32-x64@0.21.5":
version "0.21.5"
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
@@ -263,7 +373,7 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/js@^9.9.0", "@eslint/js@9.9.1":
"@eslint/js@9.9.1", "@eslint/js@^9.9.0":
version "9.9.1"
resolved "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz"
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
@@ -314,7 +424,7 @@
resolved "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.6.0/fontawesome-common-types-6.6.0.tgz"
integrity sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==
"@fortawesome/fontawesome-svg-core@^6.6.0", "@fortawesome/fontawesome-svg-core@~1 || ~6":
"@fortawesome/fontawesome-svg-core@^6.6.0":
version "6.6.0"
resolved "https://npm.fontawesome.com/@fortawesome/fontawesome-svg-core/-/6.6.0/fontawesome-svg-core-6.6.0.tgz"
integrity sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==
@@ -412,7 +522,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -734,10 +844,85 @@
resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz"
integrity sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==
"@rollup/rollup-win32-x64-msvc@4.21.1":
version "4.21.1"
resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz"
integrity sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==
"@rollup/rollup-android-arm-eabi@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54"
integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==
"@rollup/rollup-android-arm64@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e"
integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==
"@rollup/rollup-darwin-arm64@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz#627007221b24b8cc3063703eee0b9177edf49c1f"
integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==
"@rollup/rollup-darwin-x64@4.24.0":
version "4.24.0"
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz"
integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==
"@rollup/rollup-linux-arm-gnueabihf@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb"
integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==
"@rollup/rollup-linux-arm-musleabihf@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3"
integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==
"@rollup/rollup-linux-arm64-gnu@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496"
integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==
"@rollup/rollup-linux-arm64-musl@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065"
integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==
"@rollup/rollup-linux-powerpc64le-gnu@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d"
integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==
"@rollup/rollup-linux-riscv64-gnu@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983"
integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==
"@rollup/rollup-linux-s390x-gnu@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58"
integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==
"@rollup/rollup-linux-x64-gnu@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b"
integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==
"@rollup/rollup-linux-x64-musl@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127"
integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==
"@rollup/rollup-win32-arm64-msvc@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5"
integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==
"@rollup/rollup-win32-ia32-msvc@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2"
integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==
"@rollup/rollup-win32-x64-msvc@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818"
integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==
"@sigstore/bundle@^2.3.2":
version "2.3.2"
@@ -860,12 +1045,12 @@
resolved "https://registry.npmjs.org/@types/deep-equal/-/deep-equal-1.0.4.tgz"
integrity sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==
"@types/estree@1.0.5":
version "1.0.5"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
"@types/estree@1.0.6":
version "1.0.6"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz"
integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
"@types/node@^18.0.0 || >=20.0.0", "@types/node@>=13.7.0":
"@types/node@>=13.7.0":
version "22.5.5"
resolved "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz"
integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==
@@ -912,7 +1097,7 @@
natural-compare "^1.4.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@8.3.0":
"@typescript-eslint/parser@8.3.0":
version "8.3.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz"
integrity sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==
@@ -1004,7 +1189,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.12.0:
acorn@^8.12.0:
version "8.12.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz"
integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
@@ -1051,14 +1236,7 @@ ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.0.0:
version "4.3.0"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
ansi-styles@^4.1.0:
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
@@ -1225,12 +1403,7 @@ bin-links@^4.0.4:
read-cmd-shim "^4.0.0"
write-file-atomic "^5.0.0"
binary-extensions@^2.0.0:
version "2.3.0"
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
binary-extensions@^2.3.0:
binary-extensions@^2.0.0, binary-extensions@^2.3.0:
version "2.3.0"
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
@@ -1257,7 +1430,7 @@ braces@^3.0.3, braces@~3.0.2:
dependencies:
fill-range "^7.1.1"
browserslist@^4.23.1, browserslist@^4.23.3, "browserslist@>= 4.21.0":
browserslist@^4.23.1, browserslist@^4.23.3:
version "4.23.3"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz"
integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
@@ -1407,16 +1580,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
commander@^4.0.0:
version "4.1.1"
resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz"
@@ -1497,7 +1670,7 @@ data-view-byte-offset@^1.0.0:
es-errors "^1.3.0"
is-data-view "^1.0.1"
debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4:
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.6"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz"
integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
@@ -1827,12 +2000,7 @@ eslint-scope@^8.0.2:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-visitor-keys@^3.3.0:
version "3.4.3"
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint-visitor-keys@^3.4.3:
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
@@ -1842,7 +2010,7 @@ eslint-visitor-keys@^4.0.0:
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz"
integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9.9.0, eslint@>=7:
eslint@^9.9.0:
version "9.9.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz"
integrity sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==
@@ -2029,6 +2197,8 @@ fs-extra@^11.1.0:
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"
integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
dependencies:
minipass "^3.0.0"
@@ -2039,6 +2209,11 @@ fs-minipass@^3.0.0, fs-minipass@^3.0.3:
dependencies:
minipass "^7.0.3"
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
@@ -2084,7 +2259,7 @@ get-symbol-description@^1.0.2:
es-errors "^1.3.0"
get-intrinsic "^1.2.4"
glob-parent@^5.1.2:
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -2098,13 +2273,6 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
glob@^10.2.2, glob@^10.3.10, glob@^10.4.5:
version "10.4.5"
resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz"
@@ -2152,12 +2320,7 @@ gopd@^1.0.1:
dependencies:
get-intrinsic "^1.1.3"
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.11"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
graceful-fs@^4.2.11, graceful-fs@^4.2.6:
graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.6:
version "4.2.11"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -2549,6 +2712,8 @@ isexe@^2.0.0:
isexe@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz"
integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==
iterator.prototype@^1.1.2:
version "1.1.2"
@@ -2570,7 +2735,7 @@ jackspeak@^3.1.2:
optionalDependencies:
"@pkgjs/parseargs" "^0.11.0"
jiti@*, jiti@^1.21.0:
jiti@^1.21.0:
version "1.21.6"
resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz"
integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==
@@ -2934,17 +3099,21 @@ minipass-sized@^1.0.3:
minipass@^3.0.0:
version "3.3.6"
resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz"
integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
dependencies:
yallist "^4.0.0"
minipass@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.1, minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minipass@^5.0.0:
version "5.0.0"
minizlib@^2.1.1, minizlib@^2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz"
@@ -2958,16 +3127,16 @@ mkdirp@^1.0.3:
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
ms@^2.1.2:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
ms@2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
ms@^2.1.2:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
mute-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz"
@@ -3384,10 +3553,10 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
picocolors@^1.0.0, picocolors@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz"
integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz"
integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
@@ -3445,15 +3614,7 @@ postcss-nested@^6.0.1:
dependencies:
postcss-selector-parser "^6.1.1"
postcss-selector-parser@^6.0.10:
version "6.1.2"
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1:
postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1:
version "6.1.2"
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
@@ -3466,14 +3627,14 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.41, postcss@>=8.0.9:
version "8.4.41"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz"
integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==
postcss@^8.4.23, postcss@^8.4.41, postcss@^8.4.43:
version "8.4.47"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz"
integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
dependencies:
nanoid "^3.3.7"
picocolors "^1.0.1"
source-map-js "^1.2.0"
picocolors "^1.1.0"
source-map-js "^1.2.1"
prelude-ls@^1.2.1:
version "1.2.1"
@@ -3485,7 +3646,7 @@ prettier-plugin-tailwindcss@^0.6.6:
resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.6.tgz"
integrity sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==
prettier@^3.0, prettier@^3.3.3:
prettier@^3.3.3:
version "3.3.3"
resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz"
integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==
@@ -3577,7 +3738,7 @@ react-colorful@^5.6.1:
resolved "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz"
integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==
"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.0.0, react-dom@^18.3.1, "react-dom@>= 16.8.0", react-dom@>=16.4.0, react-dom@>=16.8, react-dom@>=16.8.0:
react-dom@^18.3.1:
version "18.3.1"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz"
integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
@@ -3601,7 +3762,7 @@ react-easy-crop@^5.0.8:
normalize-wheel "^1.0.1"
tslib "^2.0.1"
react-is@^16.13.1, react-is@^16.7.0, "react-is@>= 16.8.0":
react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -3626,7 +3787,7 @@ react-router@6.26.1:
dependencies:
"@remix-run/router" "1.19.1"
"react@^16.14.0 || 17.x || 18.x", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", react@^18, react@^18.0.0, react@^18.3.1, "react@>= 16.8.0", react@>=16.3, react@>=16.4.0, react@>=16.8, react@>=16.8.0:
react@^18.3.1:
version "18.3.1"
resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz"
integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
@@ -3695,16 +3856,7 @@ resolve-from@^4.0.0:
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve@^1.1.7:
version "1.22.8"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
resolve@^1.22.2:
resolve@^1.1.7, resolve@^1.22.2:
version "1.22.8"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
@@ -3733,28 +3885,28 @@ reusify@^1.0.4:
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rollup@^4.20.0:
version "4.21.1"
resolved "https://registry.npmjs.org/rollup/-/rollup-4.21.1.tgz"
integrity sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==
version "4.24.0"
resolved "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz"
integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==
dependencies:
"@types/estree" "1.0.5"
"@types/estree" "1.0.6"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.21.1"
"@rollup/rollup-android-arm64" "4.21.1"
"@rollup/rollup-darwin-arm64" "4.21.1"
"@rollup/rollup-darwin-x64" "4.21.1"
"@rollup/rollup-linux-arm-gnueabihf" "4.21.1"
"@rollup/rollup-linux-arm-musleabihf" "4.21.1"
"@rollup/rollup-linux-arm64-gnu" "4.21.1"
"@rollup/rollup-linux-arm64-musl" "4.21.1"
"@rollup/rollup-linux-powerpc64le-gnu" "4.21.1"
"@rollup/rollup-linux-riscv64-gnu" "4.21.1"
"@rollup/rollup-linux-s390x-gnu" "4.21.1"
"@rollup/rollup-linux-x64-gnu" "4.21.1"
"@rollup/rollup-linux-x64-musl" "4.21.1"
"@rollup/rollup-win32-arm64-msvc" "4.21.1"
"@rollup/rollup-win32-ia32-msvc" "4.21.1"
"@rollup/rollup-win32-x64-msvc" "4.21.1"
"@rollup/rollup-android-arm-eabi" "4.24.0"
"@rollup/rollup-android-arm64" "4.24.0"
"@rollup/rollup-darwin-arm64" "4.24.0"
"@rollup/rollup-darwin-x64" "4.24.0"
"@rollup/rollup-linux-arm-gnueabihf" "4.24.0"
"@rollup/rollup-linux-arm-musleabihf" "4.24.0"
"@rollup/rollup-linux-arm64-gnu" "4.24.0"
"@rollup/rollup-linux-arm64-musl" "4.24.0"
"@rollup/rollup-linux-powerpc64le-gnu" "4.24.0"
"@rollup/rollup-linux-riscv64-gnu" "4.24.0"
"@rollup/rollup-linux-s390x-gnu" "4.24.0"
"@rollup/rollup-linux-x64-gnu" "4.24.0"
"@rollup/rollup-linux-x64-musl" "4.24.0"
"@rollup/rollup-win32-arm64-msvc" "4.24.0"
"@rollup/rollup-win32-ia32-msvc" "4.24.0"
"@rollup/rollup-win32-x64-msvc" "4.24.0"
fsevents "~2.3.2"
run-parallel@^1.1.9:
@@ -3800,12 +3952,7 @@ semver@^6.3.1:
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.1.1, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.6.3:
version "7.6.3"
resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
semver@^7.6.0:
semver@^7.1.1, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.6.0, semver@^7.6.3:
version "7.6.3"
resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
@@ -3898,10 +4045,10 @@ socks@^2.8.3:
ip-address "^9.0.5"
smart-buffer "^4.2.0"
source-map-js@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
spdx-correct@^3.0.0:
version "3.2.0"
@@ -3918,6 +4065,8 @@ spdx-exceptions@^2.1.0:
spdx-expression-parse@^3.0.0:
version "3.0.1"
resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
dependencies:
spdx-exceptions "^2.1.0"
spdx-license-ids "^3.0.0"
@@ -3931,7 +4080,9 @@ spdx-expression-parse@^4.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
version "3.0.18"
version "3.0.20"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89"
integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==
sprintf-js@^1.1.3:
version "1.1.3"
@@ -4059,7 +4210,7 @@ strip-json-comments@^3.1.1:
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
styled-components@^5.3.0, "styled-components@>= 2":
styled-components@^5.3.0:
version "5.3.11"
resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz"
integrity sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==
@@ -4162,12 +4313,7 @@ tar@^6.1.11, tar@^6.2.1:
mkdirp "^1.0.3"
yallist "^4.0.0"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
text-table@~0.2.0:
text-table@^0.2.0, text-table@~0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
@@ -4297,7 +4443,7 @@ typescript-eslint@^8.0.1:
"@typescript-eslint/parser" "8.3.0"
"@typescript-eslint/utils" "8.3.0"
typescript@^5.0.0, typescript@^5.5.3, typescript@>=4.2.0:
typescript@^5.5.3:
version "5.5.4"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz"
integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
@@ -4398,13 +4544,13 @@ vite-tsconfig-paths@^5.0.1:
globrex "^0.1.2"
tsconfck "^3.0.3"
vite@*, "vite@^4.2.0 || ^5.0.0", vite@^5.0.0, vite@^5.4.1:
version "5.4.2"
resolved "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz"
integrity sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==
vite@^5.4.1:
version "5.4.8"
resolved "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz"
integrity sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==
dependencies:
esbuild "^0.21.3"
postcss "^8.4.41"
postcss "^8.4.43"
rollup "^4.20.0"
optionalDependencies:
fsevents "~2.3.3"