diff --git a/app/components/device-detail/device-detail-box.tsx b/app/components/device-detail/device-detail-box.tsx index 92c52484..547f6be0 100644 --- a/app/components/device-detail/device-detail-box.tsx +++ b/app/components/device-detail/device-detail-box.tsx @@ -29,7 +29,6 @@ import { useSearchParams, Link, } from 'react-router' -import { useBetween } from 'use-between' import SensorIcon from '../sensor-icon' import Spinner from '../spinner' import { @@ -76,8 +75,9 @@ import { useToast } from '../ui/use-toast' import EntryLogs from './entry-logs' import ShareLink from './share-link' import { type loader } from '~/routes/explore.$deviceId' -import { type SensorWithLatestMeasurement } from '~/schema' +import { type SensorWithLatestMeasurement } from '~/schema' import { getArchiveLink } from '~/utils/device' +import { useGlobalCompareMode } from './useGlobalCompareMode' export interface MeasurementProps { sensorId: string @@ -87,13 +87,6 @@ export interface MeasurementProps { max_value: string } -const useCompareMode = () => { - const [compareMode, setCompareMode] = useState(false) - return { compareMode, setCompareMode } -} - -export const useSharedCompareMode = () => useBetween(useCompareMode) - export default function DeviceDetailBox() { const navigation = useNavigation() const navigate = useNavigate() @@ -103,12 +96,12 @@ export default function DeviceDetailBox() { const sensorIds = new Set() const data = useLoaderData() - const nodeRef = useRef(null) + const nodeRef = useRef(null) // state variables const [open, setOpen] = useState(true) const [offsetPositionX, setOffsetPositionX] = useState(0) const [offsetPositionY, setOffsetPositionY] = useState(0) - const { compareMode, setCompareMode } = useSharedCompareMode() + const [compareMode, setCompareMode] = useGlobalCompareMode() const [refreshOn] = useState(false) const [refreshSecond, setRefreshSecond] = useState(59) @@ -195,7 +188,7 @@ export default function DeviceDetailBox() { <> {open && ( } defaultPosition={{ x: offsetPositionX, y: offsetPositionY }} onDrag={handleDrag} bounds="#osem" diff --git a/app/components/device-detail/graph.tsx b/app/components/device-detail/graph.tsx index 4bb31f90..fb189264 100644 --- a/app/components/device-detail/graph.tsx +++ b/app/components/device-detail/graph.tsx @@ -13,7 +13,7 @@ import { import 'chartjs-adapter-date-fns' // import { de, enGB } from "date-fns/locale"; import { Download, RefreshCcw, X } from 'lucide-react' -import { useMemo, useRef, useState, useEffect, useContext } from 'react' +import { useMemo, useRef, useState, useEffect, useContext, RefObject } from 'react' import { Scatter } from 'react-chartjs-2' import { isBrowser, isTablet } from 'react-device-detect' import Draggable, { type DraggableData } from 'react-draggable' @@ -97,7 +97,7 @@ export default function Graph({ }) const isAggregated = aggregation !== 'raw' - const nodeRef = useRef(null) + const nodeRef = useRef(null) const chartRef = useRef>(null) useEffect(() => { @@ -518,7 +518,7 @@ export default function Graph({ return ( <> } bounds="#osem" handle="#graphTop" defaultPosition={{ x: offsetPositionX, y: offsetPositionY }} diff --git a/app/components/device-detail/useGlobalCompareMode.tsx b/app/components/device-detail/useGlobalCompareMode.tsx new file mode 100644 index 00000000..30cf0470 --- /dev/null +++ b/app/components/device-detail/useGlobalCompareMode.tsx @@ -0,0 +1,30 @@ +import { useEffect, useState } from 'react' + +let globalValue = false // Shared global state +let listeners: ((value: boolean) => void)[] = [] // Listeners for updates + +export const useGlobalCompareMode = () => { + const [compareMode, setCompareMode] = useState(globalValue) + + // Function to update the global value and notify listeners + const updateValue = (newValue: boolean) => { + globalValue = newValue + listeners.forEach((listener) => listener(newValue)) + } + + // Subscribe to global state updates + const subscribe = (listener: (value: boolean) => void) => { + listeners.push(listener) + return () => { + listeners = listeners.filter((l) => l !== listener) + } + } + + // Effect to keep the local state synced with the global state + useEffect(() => { + const unsubscribe = subscribe(setCompareMode) + return unsubscribe // Clean up on unmount + }, []) + + return [compareMode, updateValue] as const +} diff --git a/app/components/error-boundary.tsx b/app/components/error-boundary.tsx index cf741d4c..7a540611 100644 --- a/app/components/error-boundary.tsx +++ b/app/components/error-boundary.tsx @@ -1,10 +1,11 @@ +import React from "react"; import { isRouteErrorResponse, useParams, useRouteError, type ErrorResponse } from "react-router"; import { getErrorMessage } from "~/utils/misc"; type StatusHandler = (info: { error: ErrorResponse; params: Record; -}) => JSX.Element | null; +}) => React.JSX.Element | null; export function GeneralErrorBoundary({ defaultStatusHandler = ({ error }) => ( @@ -17,7 +18,7 @@ export function GeneralErrorBoundary({ }: { defaultStatusHandler?: StatusHandler; statusHandlers?: Record; - unexpectedErrorHandler?: (error: unknown) => JSX.Element | null; + unexpectedErrorHandler?: (error: unknown) => React.JSX.Element | null; }) { const error = useRouteError(); const params = useParams(); diff --git a/app/components/map/layers/cluster/box-marker.tsx b/app/components/map/layers/cluster/box-marker.tsx index 0d62048e..582df870 100644 --- a/app/components/map/layers/cluster/box-marker.tsx +++ b/app/components/map/layers/cluster/box-marker.tsx @@ -1,121 +1,121 @@ -import { AnimatePresence, motion } from "framer-motion"; -import { Box, Rocket } from "lucide-react"; -import { useState } from "react"; -import { type MarkerProps, Marker, useMap } from "react-map-gl"; -import { useMatches, useNavigate, useSearchParams } from "react-router"; -import { useSharedCompareMode } from "~/components/device-detail/device-detail-box"; -import { cn } from "~/lib/utils"; -import { type Device } from "~/schema"; +import { AnimatePresence, motion } from 'framer-motion' +import { Box, Rocket } from 'lucide-react' +import { useState } from 'react' +import { type MarkerProps, Marker, useMap } from 'react-map-gl' +import { useMatches, useNavigate, useSearchParams } from 'react-router' +import { useGlobalCompareMode } from '~/components/device-detail/useGlobalCompareMode' +import { cn } from '~/lib/utils' +import { type Device } from '~/schema' interface BoxMarkerProps extends MarkerProps { - device: Device; + device: Device } const getStatusColor = (device: Device) => { - if (device.status === "active") { - if (device.exposure === "mobile") { - return "bg-blue-100"; - } - return "bg-green-300"; - } else if (device.status === "inactive") { - return "bg-gray-100"; - } else { - return "bg-gray-100 opacity-50"; - } -}; + if (device.status === 'active') { + if (device.exposure === 'mobile') { + return 'bg-blue-100' + } + return 'bg-green-300' + } else if (device.status === 'inactive') { + return 'bg-gray-100' + } else { + return 'bg-gray-100 opacity-50' + } +} export default function BoxMarker({ device, ...props }: BoxMarkerProps) { - const navigate = useNavigate(); - const matches = useMatches(); - const { osem } = useMap(); - const { compareMode, setCompareMode } = useSharedCompareMode(); + const navigate = useNavigate() + const matches = useMatches() + const { osem } = useMap() + const [compareMode, setCompareMode] = useGlobalCompareMode() - const isFullZoom = osem && osem?.getZoom() >= 14; + const isFullZoom = osem && osem?.getZoom() >= 14 - const [isHovered, setIsHovered] = useState(false); - const [searchParams] = useSearchParams(); + const [isHovered, setIsHovered] = useState(false) + const [searchParams] = useSearchParams() - // calculate zIndex based on device status and hover - const getZIndex = () => { - if (isHovered) { - return 30; - } - // priority to active devices - if (device.status === "active") { - return 20; - } - if (device.status === "inactive") { - return 10; - } + // calculate zIndex based on device status and hover + const getZIndex = () => { + if (isHovered) { + return 30 + } + // priority to active devices + if (device.status === 'active') { + return 20 + } + if (device.status === 'inactive') { + return 10 + } - return 0; - }; + return 0 + } - return ( - - - { - if (searchParams.has("sensor")) { - searchParams.delete("sensor"); - } - if (compareMode) { - void navigate( - `/explore/${matches[2].params.deviceId}/compare/${device.id}`, - ); - setCompareMode(false); - return; - } - void navigate({ - pathname: `${device.id}`, - search: searchParams.toString(), - }); - }} - onHoverStart={() => setIsHovered(true)} - onHoverEnd={() => setIsHovered(false)} - > - - {device.exposure === "mobile" ? ( - - ) : ( - - )} - {device.status === "active" ? ( -
- ) : null} - - {isFullZoom ? ( - - {device.name} - - ) : null} - - - - ); + return ( + + + { + if (searchParams.has('sensor')) { + searchParams.delete('sensor') + } + if (compareMode) { + void navigate( + `/explore/${matches[2].params.deviceId}/compare/${device.id}`, + ) + setCompareMode(false) + return + } + void navigate({ + pathname: `${device.id}`, + search: searchParams.toString(), + }) + }} + onHoverStart={() => setIsHovered(true)} + onHoverEnd={() => setIsHovered(false)} + > + + {device.exposure === 'mobile' ? ( + + ) : ( + + )} + {device.status === 'active' ? ( +
+ ) : null} + + {isFullZoom ? ( + + {device.name} + + ) : null} + + + + ) } diff --git a/app/components/map/legend.tsx b/app/components/map/legend.tsx index d17aadeb..c905f4af 100644 --- a/app/components/map/legend.tsx +++ b/app/components/map/legend.tsx @@ -1,114 +1,114 @@ -import { useRef, useState } from "react"; -import { isTablet, isBrowser } from "react-device-detect"; -import Draggable, { type DraggableData } from "react-draggable"; +import { useRef, useState } from 'react' +import { isTablet, isBrowser } from 'react-device-detect' +import Draggable, { type DraggableData } from 'react-draggable' import { - Accordion, - AccordionContent, - AccordionItem, - AccordionTrigger, -} from "@/components/ui/accordion"; + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from '@/components/ui/accordion' export type LegendValue = { - value: number; - color: string; - position: string; -}; + value: number + color: string + position: string +} interface LegendProps { - title: string; - values: LegendValue[] | null; + title: string + values: LegendValue[] | null } export default function Legend({ title, values }: LegendProps) { - const [isOpen, setIsOpen] = useState(true); + const [isOpen, setIsOpen] = useState(true) - const nodeRef = useRef(null); - // state variables - const [offsetPositionX, setOffsetPositionX] = useState(0); - const [offsetPositionY, setOffsetPositionY] = useState(0); + const nodeRef = useRef(null) + // state variables + const [offsetPositionX, setOffsetPositionX] = useState(0) + const [offsetPositionY, setOffsetPositionY] = useState(0) - function handleDrag(_e: any, data: DraggableData) { - setOffsetPositionX(data.x); - setOffsetPositionY(data.y); - } + function handleDrag(_e: any, data: DraggableData) { + setOffsetPositionX(data.x) + setOffsetPositionY(data.y) + } - if (title === "all" || title === "") { - return null; - } + if (title === 'all' || title === '') { + return null + } - return ( - - setIsOpen(!isOpen)} - className="absolute bottom-[15%] right-4 z-10 w-1/5 rounded-lg bg-white shadow" - > - - - {isOpen ? title : "Legende"} - - -
-
- {values?.map((v, i) => { - return ( -
- - - - -
-
- {v.value} -
-
- ); - })} -
-
-
- {values && ( -
v.color) - .join(", ")} )`, - }} - >
- )} -
-
-
-
-
- ); + return ( + } + defaultPosition={{ x: offsetPositionX, y: offsetPositionY }} + onDrag={handleDrag} + bounds="#osem" + handle="#legendHandle" + disabled={!isBrowser && !isTablet} + > + setIsOpen(!isOpen)} + className="absolute bottom-[15%] right-4 z-10 w-1/5 rounded-lg bg-white shadow" + > + + + {isOpen ? title : 'Legende'} + + +
+
+ {values?.map((v, i) => { + return ( +
+ + + + +
+
+ {v.value} +
+
+ ) + })} +
+
+
+ {values && ( +
v.color) + .join(', ')} )`, + }} + >
+ )} +
+
+
+
+
+ ) } diff --git a/app/components/search/search-list.tsx b/app/components/search/search-list.tsx index ab460b6a..72da7f14 100644 --- a/app/components/search/search-list.tsx +++ b/app/components/search/search-list.tsx @@ -1,170 +1,170 @@ -import { Cpu, Globe, MapPin } from "lucide-react"; -import { useState, useEffect, useCallback, useContext } from "react"; -import { useMap } from "react-map-gl"; -import { useMatches, useNavigate, useSearchParams } from "react-router"; +import { Cpu, Globe, MapPin } from 'lucide-react' +import { useState, useEffect, useCallback, useContext } from 'react' +import { useMap } from 'react-map-gl' +import { useMatches, useNavigate, useSearchParams } from 'react-router' -import { useSharedCompareMode } from "../device-detail/device-detail-box"; -import { NavbarContext } from "../header/nav-bar"; -import useKeyboardNav from "../header/nav-bar/use-keyboard-nav"; -import SearchListItem from "./search-list-item"; -import { goTo } from "~/lib/search-map-helper"; +import { NavbarContext } from '../header/nav-bar' +import useKeyboardNav from '../header/nav-bar/use-keyboard-nav' +import SearchListItem from './search-list-item' +import { goTo } from '~/lib/search-map-helper' +import { useGlobalCompareMode } from '../device-detail/useGlobalCompareMode' interface SearchListProps { - searchResultsLocation: any[]; - searchResultsDevice: any[]; + searchResultsLocation: any[] + searchResultsDevice: any[] } export default function SearchList(props: SearchListProps) { - const { osem } = useMap(); - const navigate = useNavigate(); - const { setOpen } = useContext(NavbarContext); - const { compareMode } = useSharedCompareMode(); - const matches = useMatches(); + const { osem } = useMap() + const navigate = useNavigate() + const { setOpen } = useContext(NavbarContext) + const [compareMode] = useGlobalCompareMode() + const matches = useMatches() - const { cursor, setCursor, enterPress, controlPress } = useKeyboardNav( - 0, - 0, - props.searchResultsDevice.length + props.searchResultsLocation.length, - ); + const { cursor, setCursor, enterPress, controlPress } = useKeyboardNav( + 0, + 0, + props.searchResultsDevice.length + props.searchResultsLocation.length, + ) - const length = - props.searchResultsDevice.length + props.searchResultsLocation.length; - const searchResultsAll = props.searchResultsDevice.concat( - props.searchResultsLocation, - ); - const [selected, setSelected] = useState(searchResultsAll[cursor]); - const [searchParams] = useSearchParams(); - const [navigateTo, setNavigateTo] = useState( - compareMode - ? `/explore/${matches[2].params.deviceId}/compare/${selected.deviceId}` - : selected.type === "device" - ? `/explore/${selected.deviceId + "?" + searchParams.toString()}}` - : `/explore?${searchParams.toString()}`, - ); + const length = + props.searchResultsDevice.length + props.searchResultsLocation.length + const searchResultsAll = props.searchResultsDevice.concat( + props.searchResultsLocation, + ) + const [selected, setSelected] = useState(searchResultsAll[cursor]) + const [searchParams] = useSearchParams() + const [navigateTo, setNavigateTo] = useState( + compareMode + ? `/explore/${matches[2].params.deviceId}/compare/${selected.deviceId}` + : selected.type === 'device' + ? `/explore/${selected.deviceId + '?' + searchParams.toString()}}` + : `/explore?${searchParams.toString()}`, + ) - const handleNavigate = useCallback( - (result: any) => { - return compareMode - ? `/explore/${matches[2].params.deviceId}/compare/${selected.deviceId}` - : result.type === "device" - ? `/explore/${result.deviceId + "?" + searchParams.toString()}` - : `/explore?${searchParams.toString()}`; - }, - [searchParams, compareMode, matches, selected], - ); + const handleNavigate = useCallback( + (result: any) => { + return compareMode + ? `/explore/${matches[2].params.deviceId}/compare/${selected.deviceId}` + : result.type === 'device' + ? `/explore/${result.deviceId + '?' + searchParams.toString()}` + : `/explore?${searchParams.toString()}` + }, + [searchParams, compareMode, matches, selected], + ) - const setShowSearchCallback = useCallback( - (state: boolean) => { - setOpen(state); - }, - [setOpen], - ); + const setShowSearchCallback = useCallback( + (state: boolean) => { + setOpen(state) + }, + [setOpen], + ) - const handleDigitPress = useCallback( - (event: any) => { - if ( - typeof Number(event.key) === "number" && - Number(event.key) <= length && - controlPress - ) { - event.preventDefault(); - setCursor(Number(event.key) - 1); - goTo(osem, searchResultsAll[Number(event.key) - 1]); - setTimeout(() => { - setShowSearchCallback(false); - void navigate(handleNavigate(searchResultsAll[Number(event.key) - 1])); - }, 500); - } - }, - [ - controlPress, - length, - navigate, - osem, - searchResultsAll, - setCursor, - setShowSearchCallback, - handleNavigate, - ], - ); + const handleDigitPress = useCallback( + (event: any) => { + if ( + typeof Number(event.key) === 'number' && + Number(event.key) <= length && + controlPress + ) { + event.preventDefault() + setCursor(Number(event.key) - 1) + goTo(osem, searchResultsAll[Number(event.key) - 1]) + setTimeout(() => { + setShowSearchCallback(false) + void navigate(handleNavigate(searchResultsAll[Number(event.key) - 1])) + }, 500) + } + }, + [ + controlPress, + length, + navigate, + osem, + searchResultsAll, + setCursor, + setShowSearchCallback, + handleNavigate, + ], + ) - useEffect(() => { - setSelected(searchResultsAll[cursor]); - }, [cursor, searchResultsAll]); + useEffect(() => { + setSelected(searchResultsAll[cursor]) + }, [cursor, searchResultsAll]) - useEffect(() => { - const navigate = handleNavigate(selected); - setNavigateTo(navigate); - }, [selected, handleNavigate]); + useEffect(() => { + const navigate = handleNavigate(selected) + setNavigateTo(navigate) + }, [selected, handleNavigate]) - useEffect(() => { - if (length !== 0 && enterPress) { - goTo(osem, selected); - setShowSearchCallback(false); - void navigate(navigateTo); - } - }, [ - enterPress, - osem, - navigate, - selected, - setShowSearchCallback, - navigateTo, - length, - ]); + useEffect(() => { + if (length !== 0 && enterPress) { + goTo(osem, selected) + setShowSearchCallback(false) + void navigate(navigateTo) + } + }, [ + enterPress, + osem, + navigate, + selected, + setShowSearchCallback, + navigateTo, + length, + ]) - useEffect(() => { - // attach the event listener - window.addEventListener("keydown", handleDigitPress); + useEffect(() => { + // attach the event listener + window.addEventListener('keydown', handleDigitPress) - // remove the event listener - return () => { - window.removeEventListener("keydown", handleDigitPress); - }; - }); + // remove the event listener + return () => { + window.removeEventListener('keydown', handleDigitPress) + } + }) - return ( -
- {props.searchResultsDevice.length > 0 && ( -
- )} - {props.searchResultsDevice.map((device: any, i) => ( - setCursor(i)} - onClick={() => { - goTo(osem, device); - setShowSearchCallback(false); - void navigate(navigateTo); - }} - /> - ))} - {props.searchResultsLocation.length > 0 && ( -
- )} - {props.searchResultsLocation.map((location: any, i) => { - return ( - setCursor(i + props.searchResultsDevice.length)} - onClick={() => { - goTo(osem, location); - setShowSearchCallback(false); - void navigate(navigateTo); - }} - /> - ); - })} -
- ); + return ( +
+ {props.searchResultsDevice.length > 0 && ( +
+ )} + {props.searchResultsDevice.map((device: any, i) => ( + setCursor(i)} + onClick={() => { + goTo(osem, device) + setShowSearchCallback(false) + void navigate(navigateTo) + }} + /> + ))} + {props.searchResultsLocation.length > 0 && ( +
+ )} + {props.searchResultsLocation.map((location: any, i) => { + return ( + setCursor(i + props.searchResultsDevice.length)} + onClick={() => { + goTo(osem, location) + setShowSearchCallback(false) + void navigate(navigateTo) + }} + /> + ) + })} +
+ ) } diff --git a/app/utils/forms.tsx b/app/utils/forms.tsx index 5ca2b995..0c69bb53 100644 --- a/app/utils/forms.tsx +++ b/app/utils/forms.tsx @@ -7,7 +7,7 @@ export function CheckboxField({ buttonProps, }: // errors, { - labelProps: Omit; + labelProps: Omit; buttonProps: Omit< React.ComponentPropsWithoutRef, "type" | "className" diff --git a/package-lock.json b/package-lock.json index 2cdd373c..be7c2e4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,11 +92,11 @@ "postgres": "^3.4.1", "prom-client": "^15.0.0", "qs": "^6.11.2", - "react": "^18.2.0", + "react": "19.0.0", "react-chartjs-2": "^5.2.0", "react-day-picker": "^8.10.1", "react-device-detect": "^2.2.3", - "react-dom": "^18.2.0", + "react-dom": "19.0.0", "react-draggable": "^4.4.5", "react-globe.gl": "^2.27.3", "react-hook-form": "^7.51.0", @@ -115,7 +115,6 @@ "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.6", "tiny-invariant": "^1.3.1", - "use-between": "^1.3.5", "use-supercluster": "^1.2.0", "vaul": "^1.1.1", "vite-plugin-markdown": "^2.2.0", @@ -131,8 +130,6 @@ "@playwright/test": "^1.48.2", "@react-router/dev": "^7.0.0", "@react-router/fs-routes": "^7.1.1", - "@react-router/remix-config-routes-adapter": "^0.0.0-nightly-bf7ecb711-20240911", - "@react-router/remix-routes-option-adapter": "^7.0.0", "@remix-run/eslint-config": "^2.15.2", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.13", @@ -154,8 +151,8 @@ "@types/morgan": "^1.9.9", "@types/node": "^18.19.55", "@types/node-fetch": "^2.6.4", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "19.0.7", + "@types/react-dom": "19.0.3", "@types/source-map-support": "^0.5.7", "@types/supercluster": "^7.1.3", "@vitejs/plugin-react": "^4.0.4", @@ -1811,6 +1808,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -2538,6 +2536,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^6.0.0", @@ -2557,6 +2556,7 @@ "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -2566,6 +2566,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", + "dev": true, "license": "ISC", "dependencies": { "@npmcli/git": "^4.1.0", @@ -2584,6 +2585,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, "license": "ISC", "dependencies": { "which": "^3.0.0" @@ -2639,6 +2641,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -4060,44 +4063,6 @@ } } }, - "node_modules/@react-router/remix-config-routes-adapter": { - "version": "0.0.0-nightly-bf7ecb711-20240911", - "resolved": "https://registry.npmjs.org/@react-router/remix-config-routes-adapter/-/remix-config-routes-adapter-0.0.0-nightly-bf7ecb711-20240911.tgz", - "integrity": "sha512-F4OG29Moiq60sFaP0WZnqhwdVHfzmk2vKb860eYedFrHPSH7LftWvaOry25XUirUUEZql5L8N3PgLboZuOTehA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@react-router/dev": "^0.0.0-nightly-bf7ecb711-20240911", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-router/remix-routes-option-adapter": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@react-router/remix-routes-option-adapter/-/remix-routes-option-adapter-7.1.3.tgz", - "integrity": "sha512-E9NdGHdHNdM4UGQX4F+C2CWgV+NbXCLXeiubdGz7n7O3DYjDRsgqx4esnB6QGoyVffBdocSaO/iskgTaMfFtEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@react-router/dev": "^7.1.3", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@react-spring/animated": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", @@ -5377,12 +5342,6 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" - }, "node_modules/@types/qs": { "version": "6.9.18", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", @@ -5398,23 +5357,22 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.7.tgz", + "integrity": "sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz", + "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.0.0" } }, "node_modules/@types/react-tagsinput": { @@ -6085,6 +6043,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6546,6 +6505,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/base-64": { @@ -6700,6 +6660,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -7158,6 +7119,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "dev": true, "funding": [ { "type": "github", @@ -7508,6 +7470,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -8859,6 +8822,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, "license": "MIT" }, "node_modules/ee-first": { @@ -8878,6 +8842,7 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -8989,6 +8954,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, "license": "MIT" }, "node_modules/error-ex": { @@ -10914,6 +10880,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", @@ -11310,6 +11277,7 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -11349,6 +11317,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -11358,6 +11327,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -11485,6 +11455,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/graphemer": { @@ -11589,6 +11560,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11689,6 +11661,7 @@ "version": "6.1.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" @@ -11701,6 +11674,7 @@ "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -12281,6 +12255,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12692,6 +12667,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -12794,6 +12770,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -14192,6 +14169,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -14227,6 +14205,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -14546,6 +14525,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^6.0.0", @@ -14749,6 +14729,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" @@ -14761,6 +14742,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -14770,6 +14752,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, "license": "ISC", "dependencies": { "hosted-git-info": "^6.0.0", @@ -14785,6 +14768,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "dev": true, "license": "ISC", "dependencies": { "npm-install-checks": "^6.0.0", @@ -17648,6 +17632,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pako": { @@ -17749,6 +17734,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -17765,6 +17751,7 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, "license": "ISC" }, "node_modules/path-to-regexp": { @@ -19120,6 +19107,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -19157,12 +19145,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, "license": "MIT", "dependencies": { "err-code": "^2.0.2", @@ -19376,13 +19366,10 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } @@ -19425,16 +19412,15 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.25.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.0.0" } }, "node_modules/react-draggable": { @@ -20336,6 +20322,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -20538,13 +20525,10 @@ "license": "MIT" }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" }, "node_modules/semver": { "version": "7.6.3", @@ -21586,6 +21570,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -21604,6 +21589,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -21618,12 +21604,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -21813,6 +21801,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -21829,6 +21818,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -21841,6 +21831,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -21998,6 +21989,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -23520,15 +23512,6 @@ "node": ">=6.0.0" } }, - "node_modules/use-between": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/use-between/-/use-between-1.3.5.tgz", - "integrity": "sha512-IP9eJfszZr0aah/6i/pzaM7n/QgMPwWKJ+mnWqT5O0qFhLnztPbkVC6L7zI6ygeBIMJHfmUGvsw0b28pyrEGSA==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -23701,6 +23684,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -24205,6 +24189,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -24369,6 +24354,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -24387,6 +24373,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -24404,6 +24391,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -24419,6 +24407,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -24431,18 +24420,21 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -24457,6 +24449,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -24469,6 +24462,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" diff --git a/package.json b/package.json index 7860b18e..890e6857 100644 --- a/package.json +++ b/package.json @@ -122,11 +122,11 @@ "postgres": "^3.4.1", "prom-client": "^15.0.0", "qs": "^6.11.2", - "react": "^18.2.0", + "react": "19.0.0", "react-chartjs-2": "^5.2.0", "react-day-picker": "^8.10.1", "react-device-detect": "^2.2.3", - "react-dom": "^18.2.0", + "react-dom": "19.0.0", "react-draggable": "^4.4.5", "react-globe.gl": "^2.27.3", "react-hook-form": "^7.51.0", @@ -145,7 +145,6 @@ "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.6", "tiny-invariant": "^1.3.1", - "use-between": "^1.3.5", "use-supercluster": "^1.2.0", "vaul": "^1.1.1", "vite-plugin-markdown": "^2.2.0", @@ -161,8 +160,6 @@ "@playwright/test": "^1.48.2", "@react-router/dev": "^7.0.0", "@react-router/fs-routes": "^7.1.1", - "@react-router/remix-config-routes-adapter": "^0.0.0-nightly-bf7ecb711-20240911", - "@react-router/remix-routes-option-adapter": "^7.0.0", "@remix-run/eslint-config": "^2.15.2", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.13", @@ -184,8 +181,8 @@ "@types/morgan": "^1.9.9", "@types/node": "^18.19.55", "@types/node-fetch": "^2.6.4", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "19.0.7", + "@types/react-dom": "19.0.3", "@types/source-map-support": "^0.5.7", "@types/supercluster": "^7.1.3", "@vitejs/plugin-react": "^4.0.4",