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

View File

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

View File

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

View File

@ -1,12 +1,5 @@
import { basename } from "path";
import {
forwardRef,
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from "react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { GoTo, Refresh } from "components/apps/FileExplorer/NavigationIcons";
import StyledAddressBar from "components/apps/FileExplorer/StyledAddressBar";
import useAddressBarContextMenu from "components/apps/FileExplorer/useAddressBarContextMenu";
@ -38,10 +31,10 @@ export const ADDRESS_INPUT_PROPS = {
HTMLInputElement
>;
const AddressBar = forwardRef<HTMLInputElement, AddressBarProps>(
({ id }, ref) => {
const addressBarRef =
ref as React.MutableRefObject<HTMLInputElement | null>;
const AddressBar: FCWithRef<HTMLInputElement, AddressBarProps> = ({
id,
ref: addressBarRef,
}) => {
const actionButtonRef = useRef<HTMLButtonElement | null>(null);
const {
open,
@ -58,6 +51,7 @@ const AddressBar = forwardRef<HTMLInputElement, AddressBarProps>(
() =>
addressBar !== displayName &&
addressBar !== url &&
addressBarRef &&
document.activeElement === addressBarRef.current,
[addressBar, addressBarRef, displayName, url]
);
@ -75,7 +69,7 @@ const AddressBar = forwardRef<HTMLInputElement, AddressBarProps>(
}
}
addressBarRef.current?.blur();
addressBarRef?.current?.blur();
}, [
addressBar,
addressBarRef,
@ -88,7 +82,7 @@ const AddressBar = forwardRef<HTMLInputElement, AddressBarProps>(
]);
useEffect(() => {
if (addressBarRef.current) {
if (addressBarRef?.current) {
if (addressBar === url) {
addressBarRef.current.select();
} else if (addressBar === displayName) {
@ -142,7 +136,6 @@ const AddressBar = forwardRef<HTMLInputElement, AddressBarProps>(
</Button>
</StyledAddressBar>
);
}
);
};
export default AddressBar;

View File

@ -1,12 +1,5 @@
import { basename, dirname } from "path";
import {
forwardRef,
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from "react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import AddressBar from "components/apps/FileExplorer/AddressBar";
import {
Back,
@ -36,8 +29,11 @@ type NavigationProps = {
const CONTEXT_MENU_OFFSET = 3;
const Navigation = forwardRef<HTMLInputElement, NavigationProps>(
({ hideSearch, id }, inputRef) => {
const Navigation: FCWithRef<HTMLInputElement, NavigationProps> = ({
hideSearch,
id,
ref: inputRef,
}) => {
const {
url: changeUrl,
processes: {
@ -157,7 +153,6 @@ const Navigation = forwardRef<HTMLInputElement, NavigationProps>(
{!hideSearch && !removeSearch && <SearchBar id={id} />}
</StyledNavigation>
);
}
);
};
export default Navigation;

View File

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

View File

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

View File

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

View File

@ -91,7 +91,7 @@ export const NostrProvider: FC<{ relayUrls: string[] }> = ({
}, [connectToRelays, disconnectToRelays, knownRelays, relayUrls]);
return (
<NostrContext.Provider
<NostrContext
value={useMemo(
() => ({
connectToRelays,
@ -102,6 +102,6 @@ export const NostrProvider: FC<{ relayUrls: string[] }> = ({
)}
>
{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";
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 ScrollBars from "styles/common/ScrollBars";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
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 StyledFileManager from "components/system/Files/Views/List/StyledFileManager";
import TaskbarPanel from "components/system/Taskbar/TaskbarPanel";

View File

@ -1,6 +1,6 @@
import { useTheme } from "styled-components";
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 Sidebar from "components/system/StartMenu/Sidebar";
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 { 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";
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 { TASKBAR_HEIGHT } from "utils/constants";

View File

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

View File

@ -86,7 +86,7 @@ const ResultEntry: FC<ResultEntryProps> = ({
const isDirectory = stats?.isDirectory() || (!extension && !isYTUrl);
const isNostrUrl = info?.url ? info.url.startsWith("nostr:") : false;
const { onContextMenuCapture } = useResultsContextMenu(info?.url);
const abortController = useRef<AbortController>();
const abortController = useRef<AbortController>(undefined);
useEffect(() => {
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 { SINGLE_LINE_HEIGHT_ADDITION } from "components/system/Taskbar/Search";
import TaskbarPanel from "components/system/Taskbar/TaskbarPanel";

View File

@ -1,7 +1,7 @@
import { basename, extname } from "path";
import { useTheme } from "styled-components";
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 {
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 { 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 { memo } from "react";
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 StyledTaskbarEntry from "components/system/Taskbar/TaskbarEntry/StyledTaskbarEntry";
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 { TRANSITIONS_IN_SECONDS } from "utils/constants";

View File

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

View File

@ -1,6 +1,6 @@
import { memo, useCallback, useMemo, useState } from "react";
import dynamic from "next/dynamic";
import { AnimatePresence } from "framer-motion";
import { AnimatePresence } from "motion/react";
import StyledTaskbarEntry from "components/system/Taskbar/TaskbarEntry/StyledTaskbarEntry";
import useTaskbarTransition from "components/system/Taskbar/TaskbarEntry/useTaskbarTransition";
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 { TRANSITIONS_IN_SECONDS } from "utils/constants";

View File

@ -1,6 +1,6 @@
import { memo, useCallback, useState } from "react";
import dynamic from "next/dynamic";
import { AnimatePresence } from "framer-motion";
import { AnimatePresence } from "motion/react";
import Clock from "components/system/Taskbar/Clock";
import SearchButton from "components/system/Taskbar/Search/SearchButton";
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 { viewHeight } from "utils/functions";

View File

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

View File

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

View File

@ -1,5 +1,5 @@
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 { TASKBAR_HEIGHT, TRANSITIONS_IN_SECONDS } from "utils/constants";
import { viewHeight, viewWidth } from "utils/functions";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -57,7 +57,6 @@
"fflate": "^0.8.2",
"file-type": "^19.6.0",
"fix-webm-duration": "^1.0.6",
"framer-motion": "^11.13.1",
"gif.js": "^0.2.0",
"idb": "^8.0.0",
"ini": "^5.0.0",
@ -65,17 +64,18 @@
"libheif-js": "^1.18.2",
"mediainfo.js": "^0.3.3",
"minimist": "^1.2.8",
"motion": "12.0.0-alpha.2",
"multiformats": "^13.3.1",
"music-metadata-browser": "^2.5.11",
"next": "^15.0.3",
"next": "^15.0.4",
"nostr-tools": "^1.17.0",
"opentype.js": "^1.3.4",
"playlist-parser": "^0.0.12",
"prettier": "^3.4.2",
"print-js": "^1.6.0",
"quickjs-emscripten": "^0.31.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-rnd": "10.4.13",
"resedit": "^2.0.3",
"rtf.js": "^3.0.9",
@ -86,8 +86,8 @@
"devDependencies": {
"7z-wasm": "^1.1.0",
"@axe-core/playwright": "^4.10.1",
"@next/bundle-analyzer": "^15.0.3",
"@next/eslint-plugin-next": "^15.0.3",
"@next/bundle-analyzer": "^15.0.4",
"@next/eslint-plugin-next": "^15.0.4",
"@playwright/test": "1.49.0",
"@types/canvas-confetti": "^1.6.4",
"@types/dom-chromium-ai": "^0.0.4",
@ -100,7 +100,8 @@
"@types/node": "^22.10.1",
"@types/offscreencanvas": "^2019.7.3",
"@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/video.js": "^7.3.58",
"@types/wicg-file-system-access": "^2023.10.5",
@ -111,7 +112,7 @@
"eruda": "^3.4.1",
"eslint": "^8.57.0",
"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-plugin-deprecation": "^3.0.0",
"eslint-plugin-import": "^2.31.0",
@ -121,10 +122,10 @@
"eslint-plugin-playwright": "^2.1.0",
"eslint-plugin-promise": "^7.2.1",
"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-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-typescript-sort-keys": "^3.3.0",
"eslint-plugin-unicorn": "^56.0.1",
@ -137,7 +138,7 @@
"lint-staged": "^15.2.10",
"lunr": "^2.3.9",
"monaco-editor": "^0.52.0",
"pdfjs-dist": "^4.9.124",
"pdfjs-dist": "^4.9.155",
"playwright-core": "1.49.0",
"postcss": "^8.4.49",
"postcss-styled-syntax": "^0.7.0",
@ -146,7 +147,7 @@
"stylelint": "^16.11.0",
"stylelint-config-standard": "^36.0.1",
"stylelint-order": "^6.0.4",
"terser": "^5.36.0",
"terser": "^5.37.0",
"tinymce": "^6.8.3",
"ts-prune": "^0.10.3",
"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 { SUPPORTED_ICON_PIXEL_RATIOS } from "utils/constants";
import {
@ -30,7 +30,7 @@ const StyledIcon = styled.img.attrs<StyledIconProps>(
({ $eager = false, $height, $width }) => ({
decoding: "async",
draggable: false,
fetchpriority: $eager ? "high" : undefined,
fetchPriority: $eager ? "high" : undefined,
height: $height,
loading: $eager ? "eager" : "lazy",
width: $width,
@ -49,12 +49,11 @@ const StyledIcon = styled.img.attrs<StyledIconProps>(
visibility: ${({ $loaded }) => ($loaded ? "visible" : "hidden")};
`;
const Icon = forwardRef<
const Icon: FCWithRef<
HTMLImageElement,
IconProps & React.ImgHTMLAttributes<HTMLImageElement>
>((props, ref) => {
> = ({ displaySize = 0, imgSize = 0, ref, src = "", ...componentProps }) => {
const [loaded, setLoaded] = useState(false);
const { displaySize = 0, imgSize = 0, src = "", ...componentProps } = props;
const isDynamic = isDynamicIcon(src);
const imgSrc = useMemo(
() =>
@ -149,6 +148,6 @@ const Icon = forwardRef<
{RenderedIcon}
</picture>
);
});
};
export default memo(Icon);

View File

@ -1,2 +1,2 @@
// 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_ELEMENT = {
fetchpriority: "high",
fetchPriority: "high",
} as React.HTMLAttributes<HTMLElement>;
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>
) => 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" {
export const bufferToURI: (data: Buffer) => string;
}

240
yarn.lock
View File

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