Upgrade to React 19, Next.js 15 & Motion 12

This commit is contained in:
Dustin Brett 2024-12-07 13:22:47 -08:00
parent e0a7939e50
commit f19b22ba51
72 changed files with 448 additions and 453 deletions

View File

@ -40,8 +40,8 @@ const useBoxedWine = ({
const { processes: { [id]: { libs = [] } = {} } = {} } = useProcesses(); const { processes: { [id]: { libs = [] } = {} } = {} } = useProcesses();
const { readFile } = useFileSystem(); const { readFile } = useFileSystem();
const mountEmFs = useEmscriptenMount(); const mountEmFs = useEmscriptenMount();
const loadedUrl = useRef<string>(); const loadedUrl = useRef("");
const blankCanvasCheckerTimer = useRef<number | undefined>(); const blankCanvasCheckerTimer = useRef(0);
const loadEmulator = useCallback(async (): Promise<void> => { const loadEmulator = useCallback(async (): Promise<void> => {
let dynamicConfig = {}; let dynamicConfig = {};
let appPayload = url ? await readFile(url) : Buffer.from(""); let appPayload = url ? await readFile(url) : Buffer.from("");
@ -75,7 +75,7 @@ const useBoxedWine = ({
blankCanvasCheckerTimer.current = window.setInterval(() => { blankCanvasCheckerTimer.current = window.setInterval(() => {
if (isCanvasDrawn(containerRef.current?.querySelector("canvas"))) { if (isCanvasDrawn(containerRef.current?.querySelector("canvas"))) {
clearInterval(blankCanvasCheckerTimer.current); clearInterval(blankCanvasCheckerTimer.current);
blankCanvasCheckerTimer.current = undefined; blankCanvasCheckerTimer.current = 0;
containerRef.current?.querySelector("ol")?.remove(); containerRef.current?.querySelector("ol")?.remove();
} }
}, 100); }, 100);

View File

@ -26,7 +26,7 @@ const useDXBall = ({ id, setLoading }: ContainerHookProps): void => {
processes: { [id]: process }, processes: { [id]: process },
} = useProcesses(); } = useProcesses();
const { closing, libs = [] } = process || {}; const { closing, libs = [] } = process || {};
const records = useRef<string>(); const records = useRef("");
const libLoadingRef = useRef(true); const libLoadingRef = useRef(true);
useEffect(() => { useEffect(() => {

View File

@ -32,7 +32,7 @@ const useEmulator = ({
processes: { [id]: { closing = false, libs = [] } = {} } = {}, processes: { [id]: { closing = false, libs = [] } = {} } = {},
} = useProcesses(); } = useProcesses();
const { prependFileToTitle } = useTitle(id); const { prependFileToTitle } = useTitle(id);
const emulatorRef = useRef<Emulator>(); const emulatorRef = useRef<Emulator>(undefined);
const loadedUrlRef = useRef<string>(""); const loadedUrlRef = useRef<string>("");
const loadRom = useCallback(async () => { const loadRom = useCallback(async () => {
if (!url) return; if (!url) return;

View File

@ -1,12 +1,5 @@
import { basename } from "path"; import { basename } from "path";
import { import { useCallback, useEffect, useMemo, useRef, useState } from "react";
forwardRef,
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from "react";
import { GoTo, Refresh } from "components/apps/FileExplorer/NavigationIcons"; import { GoTo, Refresh } from "components/apps/FileExplorer/NavigationIcons";
import StyledAddressBar from "components/apps/FileExplorer/StyledAddressBar"; import StyledAddressBar from "components/apps/FileExplorer/StyledAddressBar";
import useAddressBarContextMenu from "components/apps/FileExplorer/useAddressBarContextMenu"; import useAddressBarContextMenu from "components/apps/FileExplorer/useAddressBarContextMenu";
@ -38,111 +31,111 @@ export const ADDRESS_INPUT_PROPS = {
HTMLInputElement HTMLInputElement
>; >;
const AddressBar = forwardRef<HTMLInputElement, AddressBarProps>( const AddressBar: FCWithRef<HTMLInputElement, AddressBarProps> = ({
({ id }, ref) => { id,
const addressBarRef = ref: addressBarRef,
ref as React.MutableRefObject<HTMLInputElement | null>; }) => {
const actionButtonRef = useRef<HTMLButtonElement | null>(null); const actionButtonRef = useRef<HTMLButtonElement | null>(null);
const { const {
open, open,
url: changeUrl, url: changeUrl,
processes: { processes: {
[id]: { icon, url = "" }, [id]: { icon, url = "" },
}, },
} = useProcesses(); } = useProcesses();
const displayName = useMemo(() => basename(url) || ROOT_NAME, [url]); const displayName = useMemo(() => basename(url) || ROOT_NAME, [url]);
const [addressBar, setAddressBar] = useState(displayName); const [addressBar, setAddressBar] = useState(displayName);
const { exists, stat, updateFolder } = useFileSystem(); const { exists, stat, updateFolder } = useFileSystem();
const { updateRecentFiles } = useSession(); const { updateRecentFiles } = useSession();
const inputing = useMemo( const inputing = useMemo(
() => () =>
addressBar !== displayName && addressBar !== displayName &&
addressBar !== url && addressBar !== url &&
document.activeElement === addressBarRef.current, addressBarRef &&
[addressBar, addressBarRef, displayName, url] document.activeElement === addressBarRef.current,
); [addressBar, addressBarRef, displayName, url]
const goToAddress = useCallback(async () => { );
if (addressBar && (await exists(addressBar))) { const goToAddress = useCallback(async () => {
if ((await stat(addressBar)).isDirectory()) changeUrl(id, addressBar); if (addressBar && (await exists(addressBar))) {
else { if ((await stat(addressBar)).isDirectory()) changeUrl(id, addressBar);
const openPid = getProcessByFileExtension(getExtension(addressBar)); else {
const openPid = getProcessByFileExtension(getExtension(addressBar));
open(openPid || "OpenWith", { url: addressBar }); open(openPid || "OpenWith", { url: addressBar });
if (openPid) { if (openPid) {
updateRecentFiles(addressBar, openPid); updateRecentFiles(addressBar, openPid);
}
} }
} }
}
addressBarRef.current?.blur(); addressBarRef?.current?.blur();
}, [ }, [
addressBar, addressBar,
addressBarRef, addressBarRef,
changeUrl, changeUrl,
exists, exists,
id, id,
open, open,
stat, stat,
updateRecentFiles, updateRecentFiles,
]); ]);
useEffect(() => { useEffect(() => {
if (addressBarRef.current) { if (addressBarRef?.current) {
if (addressBar === url) { if (addressBar === url) {
addressBarRef.current.select(); addressBarRef.current.select();
} else if (addressBar === displayName) { } else if (addressBar === displayName) {
window.getSelection()?.removeAllRanges(); window.getSelection()?.removeAllRanges();
} else if (document.activeElement !== addressBarRef.current) { } else if (document.activeElement !== addressBarRef.current) {
setAddressBar(displayName); setAddressBar(displayName);
}
} }
}, [addressBar, addressBarRef, displayName, url]); }
}, [addressBar, addressBarRef, displayName, url]);
return ( return (
<StyledAddressBar> <StyledAddressBar>
<Icon alt={displayName} imgSize={16} src={icon} /> <Icon alt={displayName} imgSize={16} src={icon} />
<input <input
ref={addressBarRef} ref={addressBarRef}
className={inputing ? "inputing" : ""} className={inputing ? "inputing" : ""}
onBlurCapture={({ relatedTarget }) => { onBlurCapture={({ relatedTarget }) => {
if (actionButtonRef.current !== relatedTarget) { if (actionButtonRef.current !== relatedTarget) {
setAddressBar(displayName);
}
}}
onChange={({ target }) => setAddressBar(target.value)}
onFocusCapture={() => setAddressBar(url)}
onKeyDown={({ key }) => {
if (key === "Enter") goToAddress();
}}
value={addressBar}
{...ADDRESS_INPUT_PROPS}
{...useAddressBarContextMenu(url)}
/>
<Button
ref={actionButtonRef}
className="action"
onClick={() => {
setAddressBar(displayName); setAddressBar(displayName);
if (inputing) goToAddress();
else updateFolder(url);
}}
onFocusCapture={() =>
setTimeout(
() => setAddressBar(displayName),
TRANSITIONS_IN_MILLISECONDS.DOUBLE_CLICK / 2
)
} }
{...label( }}
inputing ? `Go to "${addressBar}"` : `Refresh "${displayName}" (F5)` onChange={({ target }) => setAddressBar(target.value)}
)} onFocusCapture={() => setAddressBar(url)}
> onKeyDown={({ key }) => {
{inputing ? <GoTo /> : <Refresh />} if (key === "Enter") goToAddress();
</Button> }}
</StyledAddressBar> value={addressBar}
); {...ADDRESS_INPUT_PROPS}
} {...useAddressBarContextMenu(url)}
); />
<Button
ref={actionButtonRef}
className="action"
onClick={() => {
setAddressBar(displayName);
if (inputing) goToAddress();
else updateFolder(url);
}}
onFocusCapture={() =>
setTimeout(
() => setAddressBar(displayName),
TRANSITIONS_IN_MILLISECONDS.DOUBLE_CLICK / 2
)
}
{...label(
inputing ? `Go to "${addressBar}"` : `Refresh "${displayName}" (F5)`
)}
>
{inputing ? <GoTo /> : <Refresh />}
</Button>
</StyledAddressBar>
);
};
export default AddressBar; export default AddressBar;

View File

@ -1,12 +1,5 @@
import { basename, dirname } from "path"; import { basename, dirname } from "path";
import { import { useCallback, useEffect, useMemo, useRef, useState } from "react";
forwardRef,
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from "react";
import AddressBar from "components/apps/FileExplorer/AddressBar"; import AddressBar from "components/apps/FileExplorer/AddressBar";
import { import {
Back, Back,
@ -36,128 +29,130 @@ type NavigationProps = {
const CONTEXT_MENU_OFFSET = 3; const CONTEXT_MENU_OFFSET = 3;
const Navigation = forwardRef<HTMLInputElement, NavigationProps>( const Navigation: FCWithRef<HTMLInputElement, NavigationProps> = ({
({ hideSearch, id }, inputRef) => { hideSearch,
const { id,
url: changeUrl, ref: inputRef,
processes: { }) => {
[id]: { url = "" }, const {
}, url: changeUrl,
} = useProcesses(); processes: {
const upTo = url === "/" ? "" : basename(dirname(url)); [id]: { url = "" },
const { contextMenu, menu, setMenu } = useMenu(); },
const { canGoBack, canGoForward, history, moveHistory, position } = } = useProcesses();
useHistory(url, id); const upTo = url === "/" ? "" : basename(dirname(url));
const recentItemsMenu = useMemo( const { contextMenu, menu, setMenu } = useMenu();
() => const { canGoBack, canGoForward, history, moveHistory, position } =
history useHistory(url, id);
.map((historyUrl, index) => ({ const recentItemsMenu = useMemo(
action: () => moveHistory(index - position), () =>
checked: position === index, history
label: basename(historyUrl) || ROOT_NAME, .map((historyUrl, index) => ({
primary: position === index, action: () => moveHistory(index - position),
})) checked: position === index,
.reverse(), label: basename(historyUrl) || ROOT_NAME,
[history, moveHistory, position] primary: position === index,
); }))
const { onContextMenuCapture } = useMemo( .reverse(),
() => contextMenu?.(() => recentItemsMenu), [history, moveHistory, position]
[contextMenu, recentItemsMenu] );
); const { onContextMenuCapture } = useMemo(
const [isRecentMenuOpen, setIsRecentMenuOpen] = useState(false); () => contextMenu?.(() => recentItemsMenu),
const navRef = useRef<HTMLElement | null>(null); [contextMenu, recentItemsMenu]
const [removeSearch, setRemoveSearch] = useState(false); );
const resizeCallback = useCallback<ResizeObserverCallback>( const [isRecentMenuOpen, setIsRecentMenuOpen] = useState(false);
([{ contentRect }]) => { const navRef = useRef<HTMLElement | null>(null);
const tooSmallForSearch = contentRect.width < 260; const [removeSearch, setRemoveSearch] = useState(false);
const resizeCallback = useCallback<ResizeObserverCallback>(
([{ contentRect }]) => {
const tooSmallForSearch = contentRect.width < 260;
if (removeSearch && !tooSmallForSearch) { if (removeSearch && !tooSmallForSearch) {
setRemoveSearch(false); setRemoveSearch(false);
} else if (!removeSearch && tooSmallForSearch) { } else if (!removeSearch && tooSmallForSearch) {
setRemoveSearch(true); setRemoveSearch(true);
} }
}, },
[removeSearch] [removeSearch]
); );
useEffect(() => { useEffect(() => {
setIsRecentMenuOpen(recentItemsMenu === menu.items); setIsRecentMenuOpen(recentItemsMenu === menu.items);
}, [menu.items, recentItemsMenu]); }, [menu.items, recentItemsMenu]);
useResizeObserver(navRef.current, resizeCallback); useResizeObserver(navRef.current, resizeCallback);
return ( return (
<StyledNavigation <StyledNavigation
ref={navRef} ref={navRef}
{...useTitlebarContextMenu(id)} {...useTitlebarContextMenu(id)}
onDragOver={haltEvent} onDragOver={haltEvent}
onDrop={haltEvent} onDrop={haltEvent}
>
<Button
disabled={!canGoBack}
onClick={() => moveHistory(-1)}
{...label(
canGoBack
? `Back to ${basename(history[position - 1]) || ROOT_NAME}`
: "Back"
)}
> >
<Button <Back />
disabled={!canGoBack} </Button>
onClick={() => moveHistory(-1)} <Button
{...label( disabled={!canGoForward}
canGoBack onClick={() => moveHistory(+1)}
? `Back to ${basename(history[position - 1]) || ROOT_NAME}` {...label(
: "Back" canGoForward
)} ? `Forward to ${basename(history[position + 1]) || ROOT_NAME}`
> : "Forward"
<Back /> )}
</Button> >
<Button <Forward />
disabled={!canGoForward} </Button>
onClick={() => moveHistory(+1)} <Button
{...label( disabled={history.length === 1}
canGoForward onClick={(event) => {
? `Forward to ${basename(history[position + 1]) || ROOT_NAME}` event.preventDefault();
: "Forward"
)}
>
<Forward />
</Button>
<Button
disabled={history.length === 1}
onClick={(event) => {
event.preventDefault();
if (isRecentMenuOpen) setMenu(Object.create(null) as MenuState); if (isRecentMenuOpen) setMenu(Object.create(null) as MenuState);
else { else {
const { const {
height = 0, height = 0,
y = 0, y = 0,
x = 0, x = 0,
} = navRef.current?.getBoundingClientRect() || {}; } = navRef.current?.getBoundingClientRect() || {};
onContextMenuCapture( onContextMenuCapture(
(x || y) && height (x || y) && height
? ({ ? ({
pageX: x, pageX: x,
pageY: y + height - CONTEXT_MENU_OFFSET, pageY: y + height - CONTEXT_MENU_OFFSET,
} as CaptureTriggerEvent) } as CaptureTriggerEvent)
: event : event
); );
} }
}} }}
{...label("Recent locations")} {...label("Recent locations")}
> >
<Down /> <Down />
</Button> </Button>
<Button <Button
disabled={url === "/"} disabled={url === "/"}
onClick={() => changeUrl(id, dirname(url))} onClick={() => changeUrl(id, dirname(url))}
{...label( {...label(
url === "/" url === "/"
? "Up one level" ? "Up one level"
: `Up to "${upTo === "" ? ROOT_NAME : upTo}"` : `Up to "${upTo === "" ? ROOT_NAME : upTo}"`
)} )}
> >
<Up /> <Up />
</Button> </Button>
<AddressBar ref={inputRef} id={id} /> <AddressBar ref={inputRef} id={id} />
{!hideSearch && !removeSearch && <SearchBar id={id} />} {!hideSearch && !removeSearch && <SearchBar id={id} />}
</StyledNavigation> </StyledNavigation>
); );
} };
);
export default Navigation; export default Navigation;

View File

@ -45,7 +45,7 @@ const addJsDosConfig = async (
const useDosCI = ( const useDosCI = (
id: string, id: string,
url: string, url: string,
containerRef: React.MutableRefObject<HTMLDivElement | null>, containerRef: React.RefObject<HTMLDivElement | null>,
dosInstance?: DosInstance dosInstance?: DosInstance
): CommandInterface | undefined => { ): CommandInterface | undefined => {
const { appendFileToTitle } = useTitle(id); const { appendFileToTitle } = useTitle(id);

View File

@ -62,7 +62,7 @@ export const HistoryProvider = memo<FC>(({ children }) => {
}, [seenEventIds, writeFile]); }, [seenEventIds, writeFile]);
return ( return (
<HistoryContext.Provider <HistoryContext
value={useMemo( value={useMemo(
() => ({ () => ({
outgoingEvents, outgoingEvents,
@ -78,6 +78,6 @@ export const HistoryProvider = memo<FC>(({ children }) => {
)} )}
> >
{children} {children}
</HistoryContext.Provider> </HistoryContext>
); );
}); });

View File

@ -126,7 +126,7 @@ export const MessageProvider = memo<FC<MessageProviderProps>>(
}, [chatEvents, outgoingEvents, setOutgoingEvents]); }, [chatEvents, outgoingEvents, setOutgoingEvents]);
return ( return (
<MessageContext.Provider <MessageContext
value={useMemo( value={useMemo(
() => ({ () => ({
events, events,
@ -137,7 +137,7 @@ export const MessageProvider = memo<FC<MessageProviderProps>>(
)} )}
> >
{children} {children}
</MessageContext.Provider> </MessageContext>
); );
} }
); );

View File

@ -91,7 +91,7 @@ export const NostrProvider: FC<{ relayUrls: string[] }> = ({
}, [connectToRelays, disconnectToRelays, knownRelays, relayUrls]); }, [connectToRelays, disconnectToRelays, knownRelays, relayUrls]);
return ( return (
<NostrContext.Provider <NostrContext
value={useMemo( value={useMemo(
() => ({ () => ({
connectToRelays, connectToRelays,
@ -102,6 +102,6 @@ export const NostrProvider: FC<{ relayUrls: string[] }> = ({
)} )}
> >
{children} {children}
</NostrContext.Provider> </NostrContext>
); );
}; };

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
const StyledChatContainer = styled(motion.div)` const StyledChatContainer = styled(motion.div)`

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
import ScrollBars from "styles/common/ScrollBars"; import ScrollBars from "styles/common/ScrollBars";

View File

@ -1,4 +1,4 @@
import { type MotionProps } from "framer-motion"; import { type MotionProps } from "motion/react";
import { import {
HOME, HOME,
MILLISECONDS_IN_MINUTE, MILLISECONDS_IN_MINUTE,

View File

@ -1,6 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { type Event } from "nostr-tools"; import { type Event } from "nostr-tools";
import { AnimatePresence } from "framer-motion"; import { AnimatePresence } from "motion/react";
import ChatLog from "components/apps/Messenger/ChatLog"; import ChatLog from "components/apps/Messenger/ChatLog";
import Contact from "components/apps/Messenger/Contact"; import Contact from "components/apps/Messenger/Contact";
import GetMoreMessages from "components/apps/Messenger/GetMoreMessages"; import GetMoreMessages from "components/apps/Messenger/GetMoreMessages";

View File

@ -10,7 +10,7 @@ import { useSession } from "contexts/session";
import { canvasToBuffer } from "utils/functions"; import { canvasToBuffer } from "utils/functions";
const useCanvasContextMenu = ( const useCanvasContextMenu = (
canvasRef: React.RefObject<HTMLCanvasElement>, canvasRef: React.RefObject<HTMLCanvasElement | null>,
prompt: string, prompt: string,
isImageReady: boolean isImageReady: boolean
): ContextMenuCapture => { ): ContextMenuCapture => {

View File

@ -97,10 +97,10 @@ declare global {
const useCommandInterpreter = ( const useCommandInterpreter = (
id: string, id: string,
cd: React.MutableRefObject<string>, cd: React.RefObject<string>,
terminal?: Terminal, terminal?: Terminal,
localEcho?: LocalEcho localEcho?: LocalEcho
): React.MutableRefObject<CommandInterpreter> => { ): React.RefObject<CommandInterpreter> => {
const { const {
createPath, createPath,
deletePath, deletePath,

View File

@ -8,7 +8,7 @@ const SET_SCREEN_TXT = "screen-set-size-text";
const useV86ScreenSize = ( const useV86ScreenSize = (
id: string, id: string,
screenContainer: React.MutableRefObject<HTMLDivElement | null>, screenContainer: React.RefObject<HTMLDivElement | null>,
emulator?: V86Starter emulator?: V86Starter
): void => { ): void => {
const { updateWindowSize } = useWindowSize(id); const { updateWindowSize } = useWindowSize(id);

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
type StyledWebampProps = { type StyledWebampProps = {

View File

@ -55,7 +55,7 @@ const useWebamp = (id: string): Webamp => {
title, title,
} = useProcesses(); } = useProcesses();
const { closing, componentWindow } = process || {}; const { closing, componentWindow } = process || {};
const webampCI = useRef<WebampCI>(); const webampCI = useRef<WebampCI>(undefined);
const { const {
createPath, createPath,
deletePath, deletePath,
@ -66,8 +66,8 @@ const useWebamp = (id: string): Webamp => {
writeFile, writeFile,
} = useFileSystem(); } = useFileSystem();
const { onDrop } = useFileDrop({ id }); const { onDrop } = useFileDrop({ id });
const metadataProviderRef = useRef<number>(); const metadataProviderRef = useRef(0);
const windowPositionDebounceRef = useRef<number>(); const windowPositionDebounceRef = useRef(0);
const subscriptions = useRef<(() => void)[]>([]); const subscriptions = useRef<(() => void)[]>([]);
const onWillClose = useCallback( const onWillClose = useCallback(
(cancel?: () => void): void => { (cancel?: () => void): void => {

View File

@ -1,6 +1,6 @@
import { StyleSheetManager, ThemeProvider } from "styled-components"; import { StyleSheetManager, ThemeProvider } from "styled-components";
import { memo } from "react"; import { memo } from "react";
import { type FeatureBundle, LazyMotion } from "framer-motion"; import { type FeatureBundle, LazyMotion } from "motion/react";
import { useSession } from "contexts/session"; import { useSession } from "contexts/session";
import GlobalStyle from "styles/GlobalStyle"; import GlobalStyle from "styles/GlobalStyle";
import themes from "styles/themes"; import themes from "styles/themes";

View File

@ -6,7 +6,7 @@ import useFileDrop from "components/system/Files/FileManager/useFileDrop";
import { useProcesses } from "contexts/process"; import { useProcesses } from "contexts/process";
export type ContainerHookProps = { export type ContainerHookProps = {
containerRef: React.MutableRefObject<HTMLDivElement | null>; containerRef: React.RefObject<HTMLDivElement | null>;
id: string; id: string;
loading: boolean; loading: boolean;
setLoading: React.Dispatch<React.SetStateAction<boolean>>; setLoading: React.Dispatch<React.SetStateAction<boolean>>;

View File

@ -1,4 +1,4 @@
import { AnimatePresence } from "framer-motion"; import { AnimatePresence } from "motion/react";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import { memo } from "react"; import { memo } from "react";
import { useProcesses } from "contexts/process"; import { useProcesses } from "contexts/process";

View File

@ -49,7 +49,7 @@ import {
const slideshowFiles: string[] = []; const slideshowFiles: string[] = [];
const useWallpaper = ( const useWallpaper = (
desktopRef: React.MutableRefObject<HTMLElement | null> desktopRef: React.RefObject<HTMLElement | null>
): void => { ): void => {
const { exists, lstat, readFile, readdir, updateFolder, writeFile } = const { exists, lstat, readFile, readdir, updateFolder, writeFile } =
useFileSystem(); useFileSystem();
@ -66,7 +66,7 @@ const useWallpaper = (
undefined, undefined,
vantaWireframe ? "Wireframe" : "" vantaWireframe ? "Wireframe" : ""
); );
const wallpaperTimerRef = useRef<number>(); const wallpaperTimerRef = useRef(0);
const failedOffscreenContext = useRef(false); const failedOffscreenContext = useRef(false);
const resetWallpaper = useCallback( const resetWallpaper = useCallback(
(keepCanvas?: boolean): void => { (keepCanvas?: boolean): void => {

View File

@ -110,7 +110,9 @@ const OpenWith: FC<ComponentProcessProps> = ({ id }) => {
return ( return (
<StyledOpenWith <StyledOpenWith
ref={(element) => element?.focus(PREVENT_SCROLL)} ref={(element) => {
element?.focus(PREVENT_SCROLL);
}}
onContextMenu={haltEvent} onContextMenu={haltEvent}
{...closeOnEscape} {...closeOnEscape}
> >

View File

@ -55,7 +55,7 @@ const GeneralTab: FC<TabProps> = ({ icon, id, isShortcut, pid, url }) => {
const isDirectory = useMemo(() => stats?.isDirectory(), [stats]); const isDirectory = useMemo(() => stats?.isDirectory(), [stats]);
const entrySize = folderSize || (isDirectory ? 0 : stats?.size); const entrySize = folderSize || (isDirectory ? 0 : stats?.size);
const checkedFileCounts = useRef(false); const checkedFileCounts = useRef(false);
const abortControllerRef = useRef<AbortController>(); const abortControllerRef = useRef<AbortController>(undefined);
const [folderIcon, setFolderIcon] = useState(FOLDER_ICON); const [folderIcon, setFolderIcon] = useState(FOLDER_ICON);
const okAction = useCallback(async (): Promise<void> => { const okAction = useCallback(async (): Promise<void> => {
if (inputRef.current && url && inputRef.current.value !== basename(url)) { if (inputRef.current && url && inputRef.current.value !== basename(url)) {

View File

@ -44,7 +44,7 @@ const Properties: FC<ComponentProcessProps> = ({ id }) => {
stats?.isDirectory() stats?.isDirectory()
); );
const { prependFileToTitle } = useTitle(id); const { prependFileToTitle } = useTitle(id);
const getIconAbortController = useRef<AbortController>(); const getIconAbortController = useRef<AbortController>(undefined);
const propertiesRef = useRef<HTMLDivElement>(null); const propertiesRef = useRef<HTMLDivElement>(null);
const closeOnEscape = useCloseOnEscape(id); const closeOnEscape = useCloseOnEscape(id);
const [currentTab, setCurrentTab] = useState<"general" | "details">( const [currentTab, setCurrentTab] = useState<"general" | "details">(

View File

@ -30,7 +30,7 @@ const Transfer: FC<ComponentProcessProps> = ({ id }) => {
const [currentTransfer, setCurrentTransfer] = useState<[string, File]>(); const [currentTransfer, setCurrentTransfer] = useState<[string, File]>();
const [cd = "", { name = "" } = {}] = currentTransfer || []; const [cd = "", { name = "" } = {}] = currentTransfer || [];
const [progress, setProgress] = useState<number>(0); const [progress, setProgress] = useState<number>(0);
const currentOperation = useRef<Operation | undefined>(); const currentOperation = useRef<Operation>(undefined);
const actionName = useMemo(() => { const actionName = useMemo(() => {
if (closing || !process) return currentOperation.current; if (closing || !process) return currentOperation.current;

View File

@ -32,8 +32,7 @@ const useTransferDialog = (): Dialog => {
const { argument, open } = useProcesses(); const { argument, open } = useProcesses();
const processesRef = useProcessesRef(); const processesRef = useProcessesRef();
const { readFile } = useFileSystem(); const { readFile } = useFileSystem();
const getTransferIdCallbackRef = const getTransferIdCallbackRef = useRef<(url: string) => string>(undefined);
useRef<(url: string) => string | undefined>();
useEffect(() => { useEffect(() => {
getTransferIdCallbackRef.current = (url: string) => getTransferIdCallbackRef.current = (url: string) =>

View File

@ -9,7 +9,7 @@ import {
useState, useState,
} from "react"; } from "react";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import ColumnRow from "components/system/Files/FileEntry/ColumnRow"; import ColumnRow from "components/system/Files/FileEntry/ColumnRow";
import { type Columns } from "components/system/Files/FileManager/Columns/constants"; import { type Columns } from "components/system/Files/FileManager/Columns/constants";
import StyledFigure from "components/system/Files/FileEntry/StyledFigure"; import StyledFigure from "components/system/Files/FileEntry/StyledFigure";
@ -80,7 +80,7 @@ type FileEntryProps = {
columns?: Columns; columns?: Columns;
fileActions: FileActions; fileActions: FileActions;
fileManagerId?: string; fileManagerId?: string;
fileManagerRef: React.MutableRefObject<HTMLOListElement | null>; fileManagerRef: React.RefObject<HTMLOListElement | null>;
focusFunctions: FocusEntryFunctions; focusFunctions: FocusEntryFunctions;
focusedEntries: string[]; focusedEntries: string[];
hasNewFolderIcon?: boolean; hasNewFolderIcon?: boolean;
@ -233,7 +233,7 @@ const FileEntry: FC<FileEntryProps> = ({
const iconRef = useRef<HTMLImageElement | null>(null); const iconRef = useRef<HTMLImageElement | null>(null);
const isIconCached = useRef(false); const isIconCached = useRef(false);
const isDynamicIconLoaded = useRef(false); const isDynamicIconLoaded = useRef(false);
const getIconAbortController = useRef<AbortController>(); const getIconAbortController = useRef<AbortController>(undefined);
const createTooltip = useCallback(async (): Promise<string> => { const createTooltip = useCallback(async (): Promise<string> => {
if (isDirectory) return ""; if (isDirectory) return "";

View File

@ -22,7 +22,7 @@ type Selection = {
}; };
const useSelection = ( const useSelection = (
containerRef: React.MutableRefObject<HTMLElement | null>, containerRef: React.RefObject<HTMLElement | null>,
focusedEntries: string[], focusedEntries: string[],
{ blurEntry }: FocusEntryFunctions, { blurEntry }: FocusEntryFunctions,
isDesktop?: boolean isDesktop?: boolean

View File

@ -34,7 +34,7 @@ const FILE_MANAGER_TOP_PADDING = 5;
const useDraggableEntries = ( const useDraggableEntries = (
focusedEntries: string[], focusedEntries: string[],
{ focusEntry }: FocusEntryFunctions, { focusEntry }: FocusEntryFunctions,
fileManagerRef: React.MutableRefObject<HTMLOListElement | null>, fileManagerRef: React.RefObject<HTMLOListElement | null>,
isSelecting: boolean, isSelecting: boolean,
allowMoving?: boolean allowMoving?: boolean
): DraggableEntry => { ): DraggableEntry => {
@ -42,7 +42,7 @@ const useDraggableEntries = (
const { exists } = useFileSystem(); const { exists } = useFileSystem();
const { iconPositions, sortOrders, setIconPositions, setSortOrder } = const { iconPositions, sortOrders, setIconPositions, setSortOrder } =
useSession(); useSession();
const dragImageRef = useRef<HTMLImageElement | null>(); const dragImageRef = useRef<HTMLImageElement>(null);
const adjustedCaptureOffsetRef = useRef(false); const adjustedCaptureOffsetRef = useRef(false);
const capturedImageOffset = useRef({ x: 0, y: 0 }); const capturedImageOffset = useRef({ x: 0, y: 0 });
const dragPositionRef = useRef<DragPosition>( const dragPositionRef = useRef<DragPosition>(

View File

@ -6,7 +6,7 @@ type EmscriptenMounter = (FS?: EmscriptenFS, fsName?: string) => Promise<void>;
const useEmscriptenMount = (): EmscriptenMounter => { const useEmscriptenMount = (): EmscriptenMounter => {
const { mountEmscriptenFs, unMapFs, updateFolder } = useFileSystem(); const { mountEmscriptenFs, unMapFs, updateFolder } = useFileSystem();
const mountName = useRef<string>(); const mountName = useRef("");
useEffect( useEffect(
() => () => { () => () => {

View File

@ -24,7 +24,7 @@ const useFileKeyboardShortcuts = (
{ blurEntry, focusEntry }: FocusEntryFunctions, { blurEntry, focusEntry }: FocusEntryFunctions,
{ newPath, pasteToFolder }: FolderActions, { newPath, pasteToFolder }: FolderActions,
updateFiles: (newFile?: string, oldFile?: string) => void, updateFiles: (newFile?: string, oldFile?: string) => void,
fileManagerRef: React.MutableRefObject<HTMLOListElement | null>, fileManagerRef: React.RefObject<HTMLOListElement | null>,
id?: string, id?: string,
view?: FileManagerViewNames view?: FileManagerViewNames
): KeyboardShortcutEntry => { ): KeyboardShortcutEntry => {

View File

@ -23,7 +23,7 @@ type FocusableEntries = FocusEntryFunctions & {
}; };
const useFocusableEntries = ( const useFocusableEntries = (
fileManagerRef: React.MutableRefObject<HTMLOListElement | null> fileManagerRef: React.RefObject<HTMLOListElement | null>
): FocusableEntries => { ): FocusableEntries => {
const [focusedEntries, setFocusedEntries] = useState<string[]>([]); const [focusedEntries, setFocusedEntries] = useState<string[]>([]);
const blurEntry = useCallback( const blurEntry = useCallback(

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
type StyledMenuProps = { type StyledMenuProps = {

View File

@ -1,4 +1,4 @@
import { type MotionProps } from "framer-motion"; import { type MotionProps } from "motion/react";
import { TRANSITIONS_IN_SECONDS } from "utils/constants"; import { TRANSITIONS_IN_SECONDS } from "utils/constants";
const menuTransition: MotionProps = { const menuTransition: MotionProps = {

View File

@ -39,7 +39,7 @@ const Sidebar: FC<SidebarProps> = ({ height }) => {
const { open } = useProcesses(); const { open } = useProcesses();
const { setHaltSession } = useSession(); const { setHaltSession } = useSession();
const [collapsed, setCollapsed] = useState(true); const [collapsed, setCollapsed] = useState(true);
const expandTimer = useRef<number>(); const expandTimer = useRef(0);
const sidebarRef = useRef<HTMLElement>(null); const sidebarRef = useRef<HTMLElement>(null);
const clearTimer = (): void => { const clearTimer = (): void => {
if (expandTimer.current) clearTimeout(expandTimer.current); if (expandTimer.current) clearTimeout(expandTimer.current);

View File

@ -1,5 +1,5 @@
import styled from "styled-components"; import styled from "styled-components";
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import StyledFileEntry from "components/system/Files/Views/List/StyledFileEntry"; import StyledFileEntry from "components/system/Files/Views/List/StyledFileEntry";
import StyledFileManager from "components/system/Files/Views/List/StyledFileManager"; import StyledFileManager from "components/system/Files/Views/List/StyledFileManager";
import TaskbarPanel from "components/system/Taskbar/TaskbarPanel"; import TaskbarPanel from "components/system/Taskbar/TaskbarPanel";

View File

@ -1,6 +1,6 @@
import { useTheme } from "styled-components"; import { useTheme } from "styled-components";
import { useCallback, useMemo, useRef, useState } from "react"; import { useCallback, useMemo, useRef, useState } from "react";
import { type Variant } from "framer-motion"; import { type Variant } from "motion/react";
import FileManager from "components/system/Files/FileManager"; import FileManager from "components/system/Files/FileManager";
import Sidebar from "components/system/StartMenu/Sidebar"; import Sidebar from "components/system/StartMenu/Sidebar";
import StyledStartMenu from "components/system/StartMenu/StyledStartMenu"; import StyledStartMenu from "components/system/StartMenu/StyledStartMenu";

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
import { TASKBAR_HEIGHT } from "utils/constants"; import { TASKBAR_HEIGHT } from "utils/constants";

View File

@ -1,4 +1,4 @@
import { type MotionProps } from "framer-motion"; import { type MotionProps } from "motion/react";
import { TRANSITIONS_IN_SECONDS } from "utils/constants"; import { TRANSITIONS_IN_SECONDS } from "utils/constants";
const useAITransition = (width: number, widthOffset = 0.75): MotionProps => ({ const useAITransition = (width: number, widthOffset = 0.75): MotionProps => ({

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
import { TASKBAR_HEIGHT } from "utils/constants"; import { TASKBAR_HEIGHT } from "utils/constants";

View File

@ -87,7 +87,7 @@ const Clock: FC<ClockProps> = ({
), ),
[clockSource] [clockSource]
); );
const offScreenClockCanvas = useRef<OffscreenCanvas>(); const offScreenClockCanvas = useRef<OffscreenCanvas>(undefined);
const supportsOffscreenCanvas = useMemo( const supportsOffscreenCanvas = useMemo(
() => typeof window !== "undefined" && "OffscreenCanvas" in window, () => typeof window !== "undefined" && "OffscreenCanvas" in window,
[] []

View File

@ -86,7 +86,7 @@ const ResultEntry: FC<ResultEntryProps> = ({
const isDirectory = stats?.isDirectory() || (!extension && !isYTUrl); const isDirectory = stats?.isDirectory() || (!extension && !isYTUrl);
const isNostrUrl = info?.url ? info.url.startsWith("nostr:") : false; const isNostrUrl = info?.url ? info.url.startsWith("nostr:") : false;
const { onContextMenuCapture } = useResultsContextMenu(info?.url); const { onContextMenuCapture } = useResultsContextMenu(info?.url);
const abortController = useRef<AbortController>(); const abortController = useRef<AbortController>(undefined);
useEffect(() => { useEffect(() => {
const activeEntry = details || hovered; const activeEntry = details || hovered;

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
import { SINGLE_LINE_HEIGHT_ADDITION } from "components/system/Taskbar/Search"; import { SINGLE_LINE_HEIGHT_ADDITION } from "components/system/Taskbar/Search";
import TaskbarPanel from "components/system/Taskbar/TaskbarPanel"; import TaskbarPanel from "components/system/Taskbar/TaskbarPanel";

View File

@ -1,7 +1,7 @@
import { basename, extname } from "path"; import { basename, extname } from "path";
import { useTheme } from "styled-components"; import { useTheme } from "styled-components";
import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import { Search as SearchIcon } from "components/apps/FileExplorer/NavigationIcons"; import { Search as SearchIcon } from "components/apps/FileExplorer/NavigationIcons";
import { import {
getCachedShortcut, getCachedShortcut,

View File

@ -1,4 +1,4 @@
import { type MotionProps } from "framer-motion"; import { type MotionProps } from "motion/react";
import { useTheme } from "styled-components"; import { useTheme } from "styled-components";
import { TRANSITIONS_IN_SECONDS } from "utils/constants"; import { TRANSITIONS_IN_SECONDS } from "utils/constants";

View File

@ -1,4 +1,4 @@
import { AnimatePresence } from "framer-motion"; import { AnimatePresence } from "motion/react";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import { memo } from "react"; import { memo } from "react";
import StyledTaskbarEntries from "components/system/Taskbar/TaskbarEntries/StyledTaskbarEntries"; import StyledTaskbarEntries from "components/system/Taskbar/TaskbarEntries/StyledTaskbarEntries";

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
import StyledTaskbarEntry from "components/system/Taskbar/TaskbarEntry/StyledTaskbarEntry"; import StyledTaskbarEntry from "components/system/Taskbar/TaskbarEntry/StyledTaskbarEntry";
import { PEEK_MAX_WIDTH, TASKBAR_HEIGHT } from "utils/constants"; import { PEEK_MAX_WIDTH, TASKBAR_HEIGHT } from "utils/constants";

View File

@ -1,4 +1,4 @@
import { type MotionProps } from "framer-motion"; import { type MotionProps } from "motion/react";
import { useTheme } from "styled-components"; import { useTheme } from "styled-components";
import { TRANSITIONS_IN_SECONDS } from "utils/constants"; import { TRANSITIONS_IN_SECONDS } from "utils/constants";

View File

@ -11,7 +11,7 @@ const FPS = 15;
const renderFrame = async ( const renderFrame = async (
previewElement: HTMLElement, previewElement: HTMLElement,
animate: React.MutableRefObject<boolean>, animate: React.RefObject<boolean>,
callback: (url: string) => void callback: (url: string) => void
): Promise<void> => { ): Promise<void> => {
if (!animate.current) return; if (!animate.current) return;
@ -73,7 +73,7 @@ const useWindowPeek = (id: string): string => {
processes: { [id]: process }, processes: { [id]: process },
} = useProcesses(); } = useProcesses();
const { peekElement, componentWindow } = process || {}; const { peekElement, componentWindow } = process || {};
const previewTimer = useRef<number>(); const previewTimer = useRef(0);
const [imageSrc, setImageSrc] = useState(""); const [imageSrc, setImageSrc] = useState("");
const animate = useRef(true); const animate = useRef(true);
@ -94,7 +94,7 @@ const useWindowPeek = (id: string): string => {
return () => { return () => {
if (previewTimer.current) { if (previewTimer.current) {
clearTimeout(previewTimer.current); clearTimeout(previewTimer.current);
previewTimer.current = undefined; previewTimer.current = 0;
} }
animate.current = false; animate.current = false;
}; };

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
import Button from "styles/common/Button"; import Button from "styles/common/Button";

View File

@ -1,6 +1,6 @@
import { memo, useCallback, useMemo, useState } from "react"; import { memo, useCallback, useMemo, useState } from "react";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import { AnimatePresence } from "framer-motion"; import { AnimatePresence } from "motion/react";
import StyledTaskbarEntry from "components/system/Taskbar/TaskbarEntry/StyledTaskbarEntry"; import StyledTaskbarEntry from "components/system/Taskbar/TaskbarEntry/StyledTaskbarEntry";
import useTaskbarTransition from "components/system/Taskbar/TaskbarEntry/useTaskbarTransition"; import useTaskbarTransition from "components/system/Taskbar/TaskbarEntry/useTaskbarTransition";
import useTitlebarContextMenu from "components/system/Window/Titlebar/useTitlebarContextMenu"; import useTitlebarContextMenu from "components/system/Window/Titlebar/useTitlebarContextMenu";

View File

@ -1,4 +1,4 @@
import { type MotionProps } from "framer-motion"; import { type MotionProps } from "motion/react";
import { useTheme } from "styled-components"; import { useTheme } from "styled-components";
import { TRANSITIONS_IN_SECONDS } from "utils/constants"; import { TRANSITIONS_IN_SECONDS } from "utils/constants";

View File

@ -1,6 +1,6 @@
import { memo, useCallback, useState } from "react"; import { memo, useCallback, useState } from "react";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import { AnimatePresence } from "framer-motion"; import { AnimatePresence } from "motion/react";
import Clock from "components/system/Taskbar/Clock"; import Clock from "components/system/Taskbar/Clock";
import SearchButton from "components/system/Taskbar/Search/SearchButton"; import SearchButton from "components/system/Taskbar/Search/SearchButton";
import StartButton from "components/system/Taskbar/StartButton"; import StartButton from "components/system/Taskbar/StartButton";

View File

@ -1,4 +1,4 @@
import { type MotionProps } from "framer-motion"; import { type MotionProps } from "motion/react";
import { TASKBAR_HEIGHT, TRANSITIONS_IN_SECONDS } from "utils/constants"; import { TASKBAR_HEIGHT, TRANSITIONS_IN_SECONDS } from "utils/constants";
import { viewHeight } from "utils/functions"; import { viewHeight } from "utils/functions";

View File

@ -1,7 +1,7 @@
import { useEffect, useRef } from "react"; import { useEffect, useRef } from "react";
import { useProcesses } from "contexts/process"; import { useProcesses } from "contexts/process";
const useMinMaxRef = (id: string): React.MutableRefObject<boolean> => { const useMinMaxRef = (id: string): React.RefObject<boolean> => {
const { processes } = useProcesses(); const { processes } = useProcesses();
const { maximized = false, minimized = false } = processes[id] || {}; const { maximized = false, minimized = false } = processes[id] || {};
const blockAutoPositionRef = useRef(false); const blockAutoPositionRef = useRef(false);

View File

@ -1,4 +1,4 @@
import { m as motion } from "framer-motion"; import { m as motion } from "motion/react";
import styled from "styled-components"; import styled from "styled-components";
type StyledWindowProps = { type StyledWindowProps = {

View File

@ -46,8 +46,8 @@ const Titlebar: FC<TitlebarProps> = ({ id }) => {
const { menu, setMenu } = useMenu(); const { menu, setMenu } = useMenu();
const titlebarContextMenu = useTitlebarContextMenu(id); const titlebarContextMenu = useTitlebarContextMenu(id);
const touchStartTimeRef = useRef<number>(0); const touchStartTimeRef = useRef<number>(0);
const touchStartPositionRef = useRef<DOMRect>(); const touchStartPositionRef = useRef<DOMRect>(undefined);
const touchesRef = useRef<TouchList>(); const touchesRef = useRef<TouchList>(undefined);
const onTouchEnd = useCallback<React.TouchEventHandler<HTMLButtonElement>>( const onTouchEnd = useCallback<React.TouchEventHandler<HTMLButtonElement>>(
(event) => { (event) => {
const { x, y } = componentWindow?.getBoundingClientRect() || {}; const { x, y } = componentWindow?.getBoundingClientRect() || {};

View File

@ -1,5 +1,5 @@
import { useEffect, useLayoutEffect, useState } from "react"; import { useEffect, useLayoutEffect, useState } from "react";
import { type MotionProps, type Variant } from "framer-motion"; import { type MotionProps, type Variant } from "motion/react";
import { useProcesses } from "contexts/process"; import { useProcesses } from "contexts/process";
import { TASKBAR_HEIGHT, TRANSITIONS_IN_SECONDS } from "utils/constants"; import { TASKBAR_HEIGHT, TRANSITIONS_IN_SECONDS } from "utils/constants";
import { viewHeight, viewWidth } from "utils/functions"; import { viewHeight, viewWidth } from "utils/functions";

View File

@ -11,10 +11,10 @@ const contextFactory = <T,>(
return { return {
Provider: memo<FC>(({ children }) => ( Provider: memo<FC>(({ children }) => (
<Context.Provider value={useContextState()}> <Context value={useContextState()}>
{children} {children}
{ContextComponent} {ContextComponent}
</Context.Provider> </Context>
)), )),
useContext: () => useContext(Context), useContext: () => useContext(Context),
}; };

View File

@ -89,7 +89,7 @@ const runQueuedFsCalls = (fs: FSModule): void => {
const useAsyncFs = (): AsyncFSModule => { const useAsyncFs = (): AsyncFSModule => {
const [fs, setFs] = useState<FSModule>(); const [fs, setFs] = useState<FSModule>();
const fsRef = useRef<FSModule>(); const fsRef = useRef<FSModule>(undefined);
const [rootFs, setRootFs] = useState<RootFileSystem>(); const [rootFs, setRootFs] = useState<RootFileSystem>();
const asyncFs: AsyncFS = useMemo( const asyncFs: AsyncFS = useMemo(
() => ({ () => ({

View File

@ -53,7 +53,7 @@ type MenuContextState = {
const useMenuContextState = (): MenuContextState => { const useMenuContextState = (): MenuContextState => {
const [menu, setMenu] = useState<MenuState>(Object.create(null) as MenuState); const [menu, setMenu] = useState<MenuState>(Object.create(null) as MenuState);
const touchTimer = useRef<number>(0); const touchTimer = useRef<number>(0);
const touchEvent = useRef<React.TouchEvent>(); const touchEvent = useRef<React.TouchEvent>(undefined);
const contextMenu = useCallback( const contextMenu = useCallback(
( (
getItems: (event?: CaptureTriggerEvent) => MenuItem[] getItems: (event?: CaptureTriggerEvent) => MenuItem[]

View File

@ -7,7 +7,7 @@ const useDoubleClick = (
handler: React.MouseEventHandler, handler: React.MouseEventHandler,
singleClick = false singleClick = false
): { onClick: React.MouseEventHandler } => { ): { onClick: React.MouseEventHandler } => {
const timer = useRef<number | undefined>(); const timer = useRef(0);
const moveCount = useRef(0); const moveCount = useRef(0);
const onClick: React.MouseEventHandler = useCallback( const onClick: React.MouseEventHandler = useCallback(
(event) => { (event) => {
@ -18,7 +18,7 @@ const useDoubleClick = (
const clearTimer = (): void => { const clearTimer = (): void => {
if (timer.current) { if (timer.current) {
clearTimeout(timer.current); clearTimeout(timer.current);
timer.current = undefined; timer.current = 0;
} }
}; };
const clearWhenPointerMoved = (): void => { const clearWhenPointerMoved = (): void => {
@ -26,7 +26,7 @@ const useDoubleClick = (
clearTimer(); clearTimer();
} }
if (timer.current === undefined) { if (timer.current === 0) {
event.target.removeEventListener( event.target.removeEventListener(
"pointermove", "pointermove",
clearWhenPointerMoved clearWhenPointerMoved
@ -39,7 +39,7 @@ const useDoubleClick = (
if (singleClick) { if (singleClick) {
runHandler(); runHandler();
} else if (timer.current === undefined) { } else if (timer.current === 0) {
timer.current = window.setTimeout( timer.current = window.setTimeout(
clearTimer, clearTimer,
TRANSITIONS_IN_MILLISECONDS.DOUBLE_CLICK TRANSITIONS_IN_MILLISECONDS.DOUBLE_CLICK

View File

@ -2,8 +2,8 @@ import { useRef, useState, useEffect } from "react";
import { DEFAULT_INTERSECTION_OPTIONS } from "utils/constants"; import { DEFAULT_INTERSECTION_OPTIONS } from "utils/constants";
export const useIsVisible = ( export const useIsVisible = (
elementRef: React.MutableRefObject<HTMLElement | null>, elementRef: React.RefObject<HTMLElement | null>,
parentSelector?: string | React.MutableRefObject<HTMLElement | null>, parentSelector?: string | React.RefObject<HTMLElement | null>,
alwaysVisible = false alwaysVisible = false
): boolean => { ): boolean => {
const watching = useRef(false); const watching = useRef(false);

View File

@ -2,7 +2,7 @@ import { useEffect, useRef } from "react";
import { useProcesses } from "contexts/process"; import { useProcesses } from "contexts/process";
import { type Processes } from "contexts/process/types"; import { type Processes } from "contexts/process/types";
export const useProcessesRef = (): React.MutableRefObject<Processes> => { export const useProcessesRef = (): React.RefObject<Processes> => {
const { processes } = useProcesses(); const { processes } = useProcesses();
const processesRef = useRef<Processes>({} as Processes); const processesRef = useRef<Processes>({} as Processes);

View File

@ -4,8 +4,8 @@ const useWorker = <T>(
workerInit?: (info?: string) => Worker, workerInit?: (info?: string) => Worker,
onMessage?: (message: MessageEvent<T>) => void, onMessage?: (message: MessageEvent<T>) => void,
workerInfo?: string workerInfo?: string
): React.MutableRefObject<Worker | undefined> => { ): React.RefObject<Worker | undefined> => {
const worker = useRef<Worker>(); const worker = useRef<Worker>(undefined);
useEffect(() => { useEffect(() => {
if (workerInit && !worker.current) { if (workerInit && !worker.current) {

View File

@ -57,7 +57,6 @@
"fflate": "^0.8.2", "fflate": "^0.8.2",
"file-type": "^19.6.0", "file-type": "^19.6.0",
"fix-webm-duration": "^1.0.6", "fix-webm-duration": "^1.0.6",
"framer-motion": "^11.13.1",
"gif.js": "^0.2.0", "gif.js": "^0.2.0",
"idb": "^8.0.0", "idb": "^8.0.0",
"ini": "^5.0.0", "ini": "^5.0.0",
@ -65,17 +64,18 @@
"libheif-js": "^1.18.2", "libheif-js": "^1.18.2",
"mediainfo.js": "^0.3.3", "mediainfo.js": "^0.3.3",
"minimist": "^1.2.8", "minimist": "^1.2.8",
"motion": "12.0.0-alpha.2",
"multiformats": "^13.3.1", "multiformats": "^13.3.1",
"music-metadata-browser": "^2.5.11", "music-metadata-browser": "^2.5.11",
"next": "^15.0.3", "next": "^15.0.4",
"nostr-tools": "^1.17.0", "nostr-tools": "^1.17.0",
"opentype.js": "^1.3.4", "opentype.js": "^1.3.4",
"playlist-parser": "^0.0.12", "playlist-parser": "^0.0.12",
"prettier": "^3.4.2", "prettier": "^3.4.2",
"print-js": "^1.6.0", "print-js": "^1.6.0",
"quickjs-emscripten": "^0.31.0", "quickjs-emscripten": "^0.31.0",
"react": "^18.3.1", "react": "^19.0.0",
"react-dom": "^18.3.1", "react-dom": "^19.0.0",
"react-rnd": "10.4.13", "react-rnd": "10.4.13",
"resedit": "^2.0.3", "resedit": "^2.0.3",
"rtf.js": "^3.0.9", "rtf.js": "^3.0.9",
@ -86,8 +86,8 @@
"devDependencies": { "devDependencies": {
"7z-wasm": "^1.1.0", "7z-wasm": "^1.1.0",
"@axe-core/playwright": "^4.10.1", "@axe-core/playwright": "^4.10.1",
"@next/bundle-analyzer": "^15.0.3", "@next/bundle-analyzer": "^15.0.4",
"@next/eslint-plugin-next": "^15.0.3", "@next/eslint-plugin-next": "^15.0.4",
"@playwright/test": "1.49.0", "@playwright/test": "1.49.0",
"@types/canvas-confetti": "^1.6.4", "@types/canvas-confetti": "^1.6.4",
"@types/dom-chromium-ai": "^0.0.4", "@types/dom-chromium-ai": "^0.0.4",
@ -100,7 +100,8 @@
"@types/node": "^22.10.1", "@types/node": "^22.10.1",
"@types/offscreencanvas": "^2019.7.3", "@types/offscreencanvas": "^2019.7.3",
"@types/opentype.js": "^1.3.8", "@types/opentype.js": "^1.3.8",
"@types/react": "^18.3.12", "@types/react": "^19.0.1",
"@types/react-dom": "^19.0.1",
"@types/ua-parser-js": "^0.7.39", "@types/ua-parser-js": "^0.7.39",
"@types/video.js": "^7.3.58", "@types/video.js": "^7.3.58",
"@types/wicg-file-system-access": "^2023.10.5", "@types/wicg-file-system-access": "^2023.10.5",
@ -111,7 +112,7 @@
"eruda": "^3.4.1", "eruda": "^3.4.1",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb": "^19.0.4",
"eslint-config-next": "^15.0.3", "eslint-config-next": "^15.0.4",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-deprecation": "^3.0.0", "eslint-plugin-deprecation": "^3.0.0",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
@ -121,10 +122,10 @@
"eslint-plugin-playwright": "^2.1.0", "eslint-plugin-playwright": "^2.1.0",
"eslint-plugin-promise": "^7.2.1", "eslint-plugin-promise": "^7.2.1",
"eslint-plugin-react": "^7.37.2", "eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-hooks-addons": "^0.4.1", "eslint-plugin-react-hooks-addons": "^0.4.1",
"eslint-plugin-regexp": "^2.7.0", "eslint-plugin-regexp": "^2.7.0",
"eslint-plugin-sonarjs": "^3.0.0", "eslint-plugin-sonarjs": "^3.0.1",
"eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-sort-keys-fix": "^1.1.2",
"eslint-plugin-typescript-sort-keys": "^3.3.0", "eslint-plugin-typescript-sort-keys": "^3.3.0",
"eslint-plugin-unicorn": "^56.0.1", "eslint-plugin-unicorn": "^56.0.1",
@ -137,7 +138,7 @@
"lint-staged": "^15.2.10", "lint-staged": "^15.2.10",
"lunr": "^2.3.9", "lunr": "^2.3.9",
"monaco-editor": "^0.52.0", "monaco-editor": "^0.52.0",
"pdfjs-dist": "^4.9.124", "pdfjs-dist": "^4.9.155",
"playwright-core": "1.49.0", "playwright-core": "1.49.0",
"postcss": "^8.4.49", "postcss": "^8.4.49",
"postcss-styled-syntax": "^0.7.0", "postcss-styled-syntax": "^0.7.0",
@ -146,7 +147,7 @@
"stylelint": "^16.11.0", "stylelint": "^16.11.0",
"stylelint-config-standard": "^36.0.1", "stylelint-config-standard": "^36.0.1",
"stylelint-order": "^6.0.4", "stylelint-order": "^6.0.4",
"terser": "^5.36.0", "terser": "^5.37.0",
"tinymce": "^6.8.3", "tinymce": "^6.8.3",
"ts-prune": "^0.10.3", "ts-prune": "^0.10.3",
"typescript": "^5.7.2", "typescript": "^5.7.2",

View File

@ -1,4 +1,4 @@
import { forwardRef, memo, useEffect, useMemo, useState } from "react"; import { memo, useEffect, useMemo, useState } from "react";
import styled from "styled-components"; import styled from "styled-components";
import { SUPPORTED_ICON_PIXEL_RATIOS } from "utils/constants"; import { SUPPORTED_ICON_PIXEL_RATIOS } from "utils/constants";
import { import {
@ -30,7 +30,7 @@ const StyledIcon = styled.img.attrs<StyledIconProps>(
({ $eager = false, $height, $width }) => ({ ({ $eager = false, $height, $width }) => ({
decoding: "async", decoding: "async",
draggable: false, draggable: false,
fetchpriority: $eager ? "high" : undefined, fetchPriority: $eager ? "high" : undefined,
height: $height, height: $height,
loading: $eager ? "eager" : "lazy", loading: $eager ? "eager" : "lazy",
width: $width, width: $width,
@ -49,12 +49,11 @@ const StyledIcon = styled.img.attrs<StyledIconProps>(
visibility: ${({ $loaded }) => ($loaded ? "visible" : "hidden")}; visibility: ${({ $loaded }) => ($loaded ? "visible" : "hidden")};
`; `;
const Icon = forwardRef< const Icon: FCWithRef<
HTMLImageElement, HTMLImageElement,
IconProps & React.ImgHTMLAttributes<HTMLImageElement> IconProps & React.ImgHTMLAttributes<HTMLImageElement>
>((props, ref) => { > = ({ displaySize = 0, imgSize = 0, ref, src = "", ...componentProps }) => {
const [loaded, setLoaded] = useState(false); const [loaded, setLoaded] = useState(false);
const { displaySize = 0, imgSize = 0, src = "", ...componentProps } = props;
const isDynamic = isDynamicIcon(src); const isDynamic = isDynamicIcon(src);
const imgSrc = useMemo( const imgSrc = useMemo(
() => () =>
@ -149,6 +148,6 @@ const Icon = forwardRef<
{RenderedIcon} {RenderedIcon}
</picture> </picture>
); );
}); };
export default memo(Icon); export default memo(Icon);

View File

@ -1,2 +1,2 @@
// eslint-disable-next-line no-restricted-exports // eslint-disable-next-line no-restricted-exports
export { domAnimation as default } from "framer-motion"; export { domAnimation as default } from "motion/react";

View File

@ -362,7 +362,7 @@ export const BASE_ZIP_CONFIG: AsyncZipOptions = {
export const HIGH_PRIORITY_REQUEST = { priority: "high" } as RequestInit; export const HIGH_PRIORITY_REQUEST = { priority: "high" } as RequestInit;
export const HIGH_PRIORITY_ELEMENT = { export const HIGH_PRIORITY_ELEMENT = {
fetchpriority: "high", fetchPriority: "high",
} as React.HTMLAttributes<HTMLElement>; } as React.HTMLAttributes<HTMLElement>;
export const DISBALE_AUTO_INPUT_FEATURES = { export const DISBALE_AUTO_INPUT_FEATURES = {

4
utils/types.d.ts vendored
View File

@ -2,6 +2,10 @@ type FC<T = Record<string, unknown>> = (
props: React.PropsWithChildren<T> props: React.PropsWithChildren<T>
) => React.JSX.Element | null; ) => React.JSX.Element | null;
type FCWithRef<R = HTMLElement, T = Record<string, unknown>> = (
props: React.PropsWithChildren<T> & { ref?: React.RefObject<R | null> }
) => React.JSX.Element | null;
declare module "utif" { declare module "utif" {
export const bufferToURI: (data: Buffer) => string; export const bufferToURI: (data: Buffer) => string;
} }

240
yarn.lock
View File

@ -1115,10 +1115,10 @@
"@babel/types" "^7.4.4" "@babel/types" "^7.4.4"
esutils "^2.0.2" esutils "^2.0.2"
"@babel/preset-react@7.25.9": "@babel/preset-react@7.26.3":
version "7.25.9" version "7.26.3"
resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.26.3.tgz#7c5e028d623b4683c1f83a0bd4713b9100560caa"
integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9"
"@babel/helper-validator-option" "^7.25.9" "@babel/helper-validator-option" "^7.25.9"
@ -1801,64 +1801,64 @@
"@napi-rs/canvas-linux-x64-musl" "0.1.65" "@napi-rs/canvas-linux-x64-musl" "0.1.65"
"@napi-rs/canvas-win32-x64-msvc" "0.1.65" "@napi-rs/canvas-win32-x64-msvc" "0.1.65"
"@next/bundle-analyzer@^15.0.3": "@next/bundle-analyzer@^15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-15.0.3.tgz#58615521d2ae649687d0c7592b9d11a2aa92c19b" resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-15.0.4.tgz#0bd2690f41679dbe3d85e0380539de3900514bad"
integrity sha512-x7ZNvpoQPO0C5ZG//qVp21Qs3v6+C8LBJmdu9DKj4/NmjlnwoQ7dqRZ/nKZcwVhkFT7BHf+Qd5FaeHq9IDJvDQ== integrity sha512-0If3/mxqUWYC0lAdV5cChGA1Xs1BENjaLyJkdqpI2df86HqprcDZagiB2IU1xc5ph7xZHRdi5mT2cY7VkyibTQ==
dependencies: dependencies:
webpack-bundle-analyzer "4.10.1" webpack-bundle-analyzer "4.10.1"
"@next/env@15.0.3": "@next/env@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/env/-/env-15.0.3.tgz#a2e9bf274743c52b74d30f415f3eba750d51313a" resolved "https://registry.yarnpkg.com/@next/env/-/env-15.0.4.tgz#97da0fe3bae2f2b2968c4c925d7936660f5b3836"
integrity sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA== integrity sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==
"@next/eslint-plugin-next@15.0.3", "@next/eslint-plugin-next@^15.0.3": "@next/eslint-plugin-next@15.0.4", "@next/eslint-plugin-next@^15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.3.tgz#ce953098036d462f6901e423cc6445fc165b78c4" resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.4.tgz#8bca5d39e39d172d64d9c36af55c1b49ef60b684"
integrity sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw== integrity sha512-rbsF17XGzHtR7SDWzWpavSfum3/UdnF8bAaisnKwP//si3KWPTedVUsflAdjyK1zW3rweBjbALfKcavFneLGvg==
dependencies: dependencies:
fast-glob "3.3.1" fast-glob "3.3.1"
"@next/swc-darwin-arm64@15.0.3": "@next/swc-darwin-arm64@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz#4c40c506cf3d4d87da0204f4cccf39e6bdc46a71" resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.4.tgz#66087f397564d6ece4c5493536d30bc2b158a80e"
integrity sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw== integrity sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w==
"@next/swc-darwin-x64@15.0.3": "@next/swc-darwin-x64@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz#8e06cacae3dae279744f9fbe88dea679ec2c1ca3" resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.4.tgz#6eb098e183dfed72d8f3c4b281a323ad17d72446"
integrity sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw== integrity sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA==
"@next/swc-linux-arm64-gnu@15.0.3": "@next/swc-linux-arm64-gnu@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz#c144ad1f21091b9c6e1e330ecc2d56188763191d" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.4.tgz#3c082ad1a4c8060a5c56127fdefb82a149d3b94e"
integrity sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw== integrity sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA==
"@next/swc-linux-arm64-musl@15.0.3": "@next/swc-linux-arm64-musl@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz#3ccb71c6703bf421332f177d1bb0e10528bc73a2" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.4.tgz#c4e18c89ea4dab6b150b889643ec19896aebc1eb"
integrity sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA== integrity sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw==
"@next/swc-linux-x64-gnu@15.0.3": "@next/swc-linux-x64-gnu@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz#b90aa9b07001b4000427c35ab347a9273cbeebb3" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.4.tgz#f81c3952a60f3075b48e0b5a862f4deecd550c2d"
integrity sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w== integrity sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw==
"@next/swc-linux-x64-musl@15.0.3": "@next/swc-linux-x64-musl@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz#0ac9724fb44718fc97bfea971ac3fe17e486590e" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.4.tgz#f14c9730599985538d4d01d6da825b4e41fea0c1"
integrity sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA== integrity sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw==
"@next/swc-win32-arm64-msvc@15.0.3": "@next/swc-win32-arm64-msvc@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz#932437d4cf27814e963ba8ae5f033b4421fab9ca" resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.4.tgz#14297572feedcd5b14388be8a7ea8c50accb4c96"
integrity sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ== integrity sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ==
"@next/swc-win32-x64-msvc@15.0.3": "@next/swc-win32-x64-msvc@15.0.4":
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz#940a6f7b370cdde0cc67eabe945d9e6d97e0be9f" resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.4.tgz#d25953baffb92721f0fb96c8be71d7efb37a57b7"
integrity sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA== integrity sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw==
"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
version "5.1.1-v1" version "5.1.1-v1"
@ -2204,6 +2204,13 @@
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
"@types/react-dom@^19.0.1":
version "19.0.1"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.0.1.tgz#b1032c4c3215018e4028a85a71441560216e51c6"
integrity sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==
dependencies:
"@types/react" "*"
"@types/react-redux@^7.1.20": "@types/react-redux@^7.1.20":
version "7.1.33" version "7.1.33"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15"
@ -2222,12 +2229,11 @@
"@types/prop-types" "*" "@types/prop-types" "*"
csstype "^3.0.2" csstype "^3.0.2"
"@types/react@^18.3.12": "@types/react@^19.0.1":
version "18.3.12" version "19.0.1"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.1.tgz#a000d5b78f473732a08cecbead0f3751e550b3df"
integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== integrity sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==
dependencies: dependencies:
"@types/prop-types" "*"
csstype "^3.0.2" csstype "^3.0.2"
"@types/semver@^7.3.12": "@types/semver@^7.3.12":
@ -4249,12 +4255,12 @@ eslint-config-airbnb@^19.0.4:
object.assign "^4.1.2" object.assign "^4.1.2"
object.entries "^1.1.5" object.entries "^1.1.5"
eslint-config-next@^15.0.3: eslint-config-next@^15.0.4:
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-15.0.3.tgz#b483585260d5e55050d4ab87e053c88089ae12ee" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-15.0.4.tgz#c868c11f90dd60830c9c94cbb9a89f021eb3eeb9"
integrity sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg== integrity sha512-97mLaAhbJKVQYXUBBrenRtEUAA6bNDPxWfaFEd6mEhKfpajP4wJrW4l7BUlHuYWxR8oQa9W014qBJpumpJQwWA==
dependencies: dependencies:
"@next/eslint-plugin-next" "15.0.3" "@next/eslint-plugin-next" "15.0.4"
"@rushstack/eslint-patch" "^1.10.3" "@rushstack/eslint-patch" "^1.10.3"
"@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0"
"@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0"
@ -4419,6 +4425,11 @@ eslint-plugin-react-hooks@^5.0.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101"
integrity sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw== integrity sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==
eslint-plugin-react-hooks@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854"
integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==
eslint-plugin-react@^7.35.0: eslint-plugin-react@^7.35.0:
version "7.37.1" version "7.37.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd"
@ -4480,17 +4491,17 @@ eslint-plugin-regexp@^2.7.0:
regexp-ast-analysis "^0.7.1" regexp-ast-analysis "^0.7.1"
scslre "^0.3.0" scslre "^0.3.0"
eslint-plugin-sonarjs@^3.0.0: eslint-plugin-sonarjs@^3.0.1:
version "3.0.0" version "3.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.0.tgz#c1b665a35f56d72b61738223026d7a87f5507ccd" resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.1.tgz#ad2e71d261de9a004c5a97f566c007cd4d561d8f"
integrity sha512-gUu9m942ddTcLULvwJi2MllOjrsK39VgpA7vaSkZ+oNXbYes4R8DsxOobx+I5gJg2537/h4kWJNkfr/pw7be5w== integrity sha512-RT6VgdPqizbMLmTryIc3fB169hRjvDFlqieSZEEswGtApPb4Dn9BndmN9qyfBV/By0hbseIX8zQWKBz5E7lyiQ==
dependencies: dependencies:
"@babel/core" "7.26.0" "@babel/core" "7.26.0"
"@babel/eslint-parser" "7.25.9" "@babel/eslint-parser" "7.25.9"
"@babel/plugin-proposal-decorators" "7.25.9" "@babel/plugin-proposal-decorators" "7.25.9"
"@babel/preset-env" "7.26.0" "@babel/preset-env" "7.26.0"
"@babel/preset-flow" "7.25.9" "@babel/preset-flow" "7.25.9"
"@babel/preset-react" "7.25.9" "@babel/preset-react" "7.26.3"
"@eslint-community/regexpp" "4.12.1" "@eslint-community/regexpp" "4.12.1"
builtin-modules "3.3.0" builtin-modules "3.3.0"
bytes "3.1.2" bytes "3.1.2"
@ -4499,7 +4510,7 @@ eslint-plugin-sonarjs@^3.0.0:
minimatch "9.0.5" minimatch "9.0.5"
scslre "0.3.0" scslre "0.3.0"
semver "7.6.3" semver "7.6.3"
typescript "5.7.2" typescript "^5"
eslint-plugin-sort-keys-fix@^1.1.2: eslint-plugin-sort-keys-fix@^1.1.2:
version "1.1.2" version "1.1.2"
@ -4925,13 +4936,11 @@ frac@~1.1.2:
resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
framer-motion@^11.13.1: framer-motion@^12.0.0-alpha.2:
version "11.13.1" version "12.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.13.1.tgz#f15ca61c2b77067f4c7bc75833adae711fbef1fe" resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-12.0.0-alpha.2.tgz#feff37066ac169dd9e24ec2c86ce98cb20e88056"
integrity sha512-F40tpGTHByhn9h3zdBQPcEro+pSLtzARcocbNqAyfBI+u9S+KZuHH/7O9+z+GEkoF3eqFxfvVw0eBDytohwqmQ== integrity sha512-s603YLhCoX3GKaPDZnywwoFdd1T6gDFCfevVRek+TCpbvazUkITh+YZ3a6kqTvn4Aj7qQWT3vAmzWIjl/LsCFA==
dependencies: dependencies:
motion-dom "^11.13.0"
motion-utils "^11.13.0"
tslib "^2.4.0" tslib "^2.4.0"
fs-monkey@^1.0.0, fs-monkey@^1.0.3: fs-monkey@^1.0.0, fs-monkey@^1.0.3:
@ -6634,15 +6643,13 @@ monaco-editor@^0.52.0:
resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.52.0.tgz#d47c02b191eae208d68878d679b3ee7456031be7" resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.52.0.tgz#d47c02b191eae208d68878d679b3ee7456031be7"
integrity sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw== integrity sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==
motion-dom@^11.13.0: motion@12.0.0-alpha.2:
version "11.13.0" version "12.0.0-alpha.2"
resolved "https://registry.yarnpkg.com/motion-dom/-/motion-dom-11.13.0.tgz#a8f86b3aedb55598a8e3dd4114f1c3347153baf2" resolved "https://registry.yarnpkg.com/motion/-/motion-12.0.0-alpha.2.tgz#07ce9a5bfcbbbac851227b8a3e2309af32d8c5b9"
integrity sha512-Oc1MLGJQ6nrvXccXA89lXtOqFyBmvHtaDcTRGT66o8Czl7nuA8BeHAd9MQV1pQKX0d2RHFBFaw5g3k23hQJt0w== integrity sha512-pslRUURjyS1Xb6lSdyc4LzOKhaCRj0PIqstb5dDIB/RxNO3MqSMU43o1rGtZs5h8DgRzRSPHE+E7yhh2NpwI8A==
dependencies:
motion-utils@^11.13.0: framer-motion "^12.0.0-alpha.2"
version "11.13.0" tslib "^2.4.0"
resolved "https://registry.yarnpkg.com/motion-utils/-/motion-utils-11.13.0.tgz#e65fab5e26a1da3b18b4b4d1f3d0067977ccfd4a"
integrity sha512-lq6TzXkH5c/ysJQBxgLXgM01qwBH1b4goTPh57VvZWJbVJZF/0SB31UWEn4EIqbVPf3au88n2rvK17SpDTja1A==
mrmime@^2.0.0: mrmime@^2.0.0:
version "2.0.0" version "2.0.0"
@ -6737,12 +6744,12 @@ negotiator@0.6.3:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
next@^15.0.3: next@^15.0.4:
version "15.0.3" version "15.0.4"
resolved "https://registry.yarnpkg.com/next/-/next-15.0.3.tgz#804f5b772e7570ef1f088542a59860914d3288e9" resolved "https://registry.yarnpkg.com/next/-/next-15.0.4.tgz#7ddad7299204f16c132d7e524cf903f1a513588e"
integrity sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw== integrity sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==
dependencies: dependencies:
"@next/env" "15.0.3" "@next/env" "15.0.4"
"@swc/counter" "0.1.3" "@swc/counter" "0.1.3"
"@swc/helpers" "0.5.13" "@swc/helpers" "0.5.13"
busboy "1.6.0" busboy "1.6.0"
@ -6750,14 +6757,14 @@ next@^15.0.3:
postcss "8.4.31" postcss "8.4.31"
styled-jsx "5.1.6" styled-jsx "5.1.6"
optionalDependencies: optionalDependencies:
"@next/swc-darwin-arm64" "15.0.3" "@next/swc-darwin-arm64" "15.0.4"
"@next/swc-darwin-x64" "15.0.3" "@next/swc-darwin-x64" "15.0.4"
"@next/swc-linux-arm64-gnu" "15.0.3" "@next/swc-linux-arm64-gnu" "15.0.4"
"@next/swc-linux-arm64-musl" "15.0.3" "@next/swc-linux-arm64-musl" "15.0.4"
"@next/swc-linux-x64-gnu" "15.0.3" "@next/swc-linux-x64-gnu" "15.0.4"
"@next/swc-linux-x64-musl" "15.0.3" "@next/swc-linux-x64-musl" "15.0.4"
"@next/swc-win32-arm64-msvc" "15.0.3" "@next/swc-win32-arm64-msvc" "15.0.4"
"@next/swc-win32-x64-msvc" "15.0.3" "@next/swc-win32-x64-msvc" "15.0.4"
sharp "^0.33.5" sharp "^0.33.5"
no-case@^3.0.4: no-case@^3.0.4:
@ -7075,10 +7082,10 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pdfjs-dist@^4.9.124: pdfjs-dist@^4.9.155:
version "4.9.124" version "4.9.155"
resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.9.124.tgz#e82b409c515247688b1f8b93cde28ef41d0f691c" resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.9.155.tgz#80c9fc7f5411a4cf00751cdea242ffd8b0f23a96"
integrity sha512-yAoM7C+IYIG23dAZHE2KqtE5exEj067Ef6oblb+AHiqLwTJSQOMB+e8ftBA3pp1+6TyE4xeofoHcu9t7XaOE0g== integrity sha512-epRZn6DQQKCOEqbmFsxkiMBm1MHaNrnr6T4VBNP0bsDvdJdmrWcZbS5cgJXW68P0d3uJTlFhF6Wms2tlSgPYig==
optionalDependencies: optionalDependencies:
"@napi-rs/canvas" "^0.1.64" "@napi-rs/canvas" "^0.1.64"
@ -7379,13 +7386,12 @@ react-dom@^17.0.1:
object-assign "^4.1.1" object-assign "^4.1.1"
scheduler "^0.20.2" scheduler "^0.20.2"
react-dom@^18.3.1: react-dom@^19.0.0:
version "18.3.1" version "19.0.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57"
integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==
dependencies: dependencies:
loose-envify "^1.1.0" scheduler "^0.25.0"
scheduler "^0.23.2"
react-draggable@4.4.6: react-draggable@4.4.6:
version "4.4.6" version "4.4.6"
@ -7439,12 +7445,10 @@ react@^17.0.1:
loose-envify "^1.1.0" loose-envify "^1.1.0"
object-assign "^4.1.1" object-assign "^4.1.1"
react@^18.3.1: react@^19.0.0:
version "18.3.1" version "19.0.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd"
integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==
dependencies:
loose-envify "^1.1.0"
read-pkg-up@^7.0.1: read-pkg-up@^7.0.1:
version "7.0.1" version "7.0.1"
@ -7850,12 +7854,10 @@ scheduler@^0.20.2:
loose-envify "^1.1.0" loose-envify "^1.1.0"
object-assign "^4.1.1" object-assign "^4.1.1"
scheduler@^0.23.2: scheduler@^0.25.0:
version "0.23.2" version "0.25.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015"
integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==
dependencies:
loose-envify "^1.1.0"
scslre@0.3.0, scslre@^0.3.0: scslre@0.3.0, scslre@^0.3.0:
version "0.3.0" version "0.3.0"
@ -8545,10 +8547,10 @@ terser@^5.15.1:
commander "^2.20.0" commander "^2.20.0"
source-map-support "~0.5.20" source-map-support "~0.5.20"
terser@^5.36.0: terser@^5.37.0:
version "5.36.0" version "5.37.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3"
integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==
dependencies: dependencies:
"@jridgewell/source-map" "^0.3.3" "@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2" acorn "^8.8.2"
@ -8837,7 +8839,7 @@ typedarray.prototype.slice@^1.0.3:
typed-array-buffer "^1.0.2" typed-array-buffer "^1.0.2"
typed-array-byte-offset "^1.0.2" typed-array-byte-offset "^1.0.2"
typescript@5.7.2, typescript@^5.7.2: typescript@^5, typescript@^5.7.2:
version "5.7.2" version "5.7.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6"
integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==