diff --git a/Cargo.lock b/Cargo.lock index 64ad910be..314b5d6b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9035,7 +9035,7 @@ dependencies = [ [[package]] name = "sd-core" -version = "0.2.15" +version = "0.3.0" dependencies = [ "aovec", "async-channel", @@ -9292,7 +9292,7 @@ dependencies = [ [[package]] name = "sd-desktop" -version = "0.2.15" +version = "0.3.0" dependencies = [ "axum", "directories 5.0.1", diff --git a/apps/desktop/crates/macos/src-swift/window.swift b/apps/desktop/crates/macos/src-swift/window.swift index b969965a5..e5f50f871 100644 --- a/apps/desktop/crates/macos/src-swift/window.swift +++ b/apps/desktop/crates/macos/src-swift/window.swift @@ -1,4 +1,5 @@ import AppKit +import SwiftRs @objc public enum AppThemeType: Int { @@ -7,6 +8,34 @@ public enum AppThemeType: Int { case dark = 1 } +var activity: NSObjectProtocol? + +@_cdecl("disable_app_nap") +public func disableAppNap(reason: SRString) -> Bool { + // Check if App Nap is already disabled + guard activity == nil else { + return false + } + + activity = ProcessInfo.processInfo.beginActivity( + options: .userInitiatedAllowingIdleSystemSleep, + reason: reason.toString() + ) + return true +} + +@_cdecl("enable_app_nap") +public func enableAppNap() -> Bool { + // Check if App Nap is already enabled + guard let pinfo = activity else { + return false + } + + ProcessInfo.processInfo.endActivity(pinfo) + activity = nil + return true +} + @_cdecl("lock_app_theme") public func lockAppTheme(themeType: AppThemeType) { var theme: NSAppearance? diff --git a/apps/desktop/crates/macos/src/lib.rs b/apps/desktop/crates/macos/src/lib.rs index 7986de5b0..9a1e07d92 100644 --- a/apps/desktop/crates/macos/src/lib.rs +++ b/apps/desktop/crates/macos/src/lib.rs @@ -9,10 +9,10 @@ pub enum AppThemeType { Dark = 1 as Int, } +swift!(pub fn disable_app_nap(reason: &SRString) -> Bool); +swift!(pub fn enable_app_nap() -> Bool); swift!(pub fn lock_app_theme(theme_type: Int)); swift!(pub fn set_titlebar_style(window: &NSObject, is_fullscreen: Bool)); -// swift!(pub fn setup_disk_watcher(window: &NSObject, transparent: Bool, large: Bool)); -// swift!(pub fn disk_event_callback(mounted: Bool, path: &SRString)); swift!(pub fn reload_webview(webview: &NSObject)); #[repr(C)] @@ -30,20 +30,3 @@ pub fn open_file_paths_with(file_urls: &[String], with_url: &str) { let file_url = file_urls.join("\0"); unsafe { open_file_path_with(&file_url.as_str().into(), &with_url.into()) } } - -// main!(|_| { -// unsafe { setup_disk_watcher() }; -// print!("Waiting for disk events... "); -// Ok(()) -// }); - -// #[no_mangle] -// pub extern "C" fn disk_event_callback(mounted: Bool, path: *const SRString) { -// let mounted_str = if mounted { "mounted" } else { "unmounted" }; - -// // Convert the raw pointer to a reference -// let path_ref = unsafe { &*path }; -// let path_str = path_ref.to_string(); // Assuming SRString has a to_string method - -// println!("Disk at path {} was {}", path_str, mounted_str); -// } diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index b40b814e5..78fa14c34 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sd-desktop" -version = "0.2.15" +version = "0.3.0" description = "The universal file manager." authors = ["Spacedrive Technology Inc "] default-run = "sd-desktop" diff --git a/apps/desktop/src-tauri/src/main.rs b/apps/desktop/src-tauri/src/main.rs index 92f13eec5..0491784c2 100644 --- a/apps/desktop/src-tauri/src/main.rs +++ b/apps/desktop/src-tauri/src/main.rs @@ -289,7 +289,10 @@ async fn main() -> tauri::Result<()> { sd_desktop_macos::set_titlebar_style( &window.ns_window().expect("NSWindows must exist on macOS"), false, - ) + ); + sd_desktop_macos::disable_app_nap( + &"File indexer needs to run unimpeded".into(), + ); }; } }); diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index bec72554e..bb3efbb7a 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,6 @@ { "$schema": "https://github.com/tauri-apps/tauri/raw/tauri-v2.0.0-beta.17/core/tauri-config-schema/schema.json", "productName": "Spacedrive", - "version": "0.2.13", "identifier": "com.spacedrive.desktop", "build": { "beforeDevCommand": "pnpm dev", diff --git a/apps/mobile/src/App.tsx b/apps/mobile/src/App.tsx index ac5f5232b..54e45cb5d 100644 --- a/apps/mobile/src/App.tsx +++ b/apps/mobile/src/App.tsx @@ -4,6 +4,19 @@ import { NavigationContainer, useNavigationContainerRef } from '@react-navigation/native'; +import { + ClientContextProvider, + LibraryContextProvider, + P2PContextProvider, + RspcProvider, + initPlausible, + useBridgeQuery, + useClientContext, + useInvalidateQuery, + usePlausibleEvent, + usePlausiblePageViewMonitor, + usePlausiblePingMonitor +} from '@sd/client'; import { QueryClient } from '@tanstack/react-query'; import dayjs from 'dayjs'; import advancedFormat from 'dayjs/plugin/advancedFormat'; @@ -17,19 +30,6 @@ import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { MenuProvider } from 'react-native-popup-menu'; import { SafeAreaProvider } from 'react-native-safe-area-context'; import { useSnapshot } from 'valtio'; -import { - ClientContextProvider, - initPlausible, - LibraryContextProvider, - P2PContextProvider, - RspcProvider, - useBridgeQuery, - useClientContext, - useInvalidateQuery, - usePlausibleEvent, - usePlausiblePageViewMonitor, - usePlausiblePingMonitor -} from '@sd/client'; import { GlobalModals } from './components/modal/GlobalModals'; import { Toast, toastConfig } from './components/primitive/Toast'; @@ -55,13 +55,17 @@ function AppNavigation() { const plausibleEvent = usePlausibleEvent(); const buildInfo = useBridgeQuery(['buildInfo']); - initPlausible({ platformType: 'mobile', buildInfo: buildInfo?.data }); - const navRef = useNavigationContainerRef(); const routeNameRef = useRef(); const [currentPath, setCurrentPath] = useState('/'); + useEffect(() => { + if (buildInfo?.data) { + initPlausible({ platformType: 'mobile', buildInfo: buildInfo.data }); + } + }, [buildInfo]); + usePlausiblePageViewMonitor({ currentPath }); usePlausiblePingMonitor({ currentPath }); @@ -73,9 +77,11 @@ function AppNavigation() { return () => clearInterval(interval); }, [plausibleEvent]); - if (library === null && libraries.data) { - currentLibraryStore.id = libraries.data[0]?.uuid ?? null; - } + useEffect(() => { + if (library === null && libraries.data) { + currentLibraryStore.id = libraries.data[0]?.uuid ?? null; + } + }, [library, libraries]); return ( { const navigation = useNavigation['navigation']>(); return ( - + Library diff --git a/apps/mobile/src/components/browse/BrowseLocations.tsx b/apps/mobile/src/components/browse/BrowseLocations.tsx index 819a50e22..991404cab 100644 --- a/apps/mobile/src/components/browse/BrowseLocations.tsx +++ b/apps/mobile/src/components/browse/BrowseLocations.tsx @@ -1,14 +1,15 @@ import { useNavigation } from '@react-navigation/native'; import { useLibraryQuery } from '@sd/client'; -import { DotsThree, Plus } from 'phosphor-react-native'; -import { useRef } from 'react'; -import { Text, View } from 'react-native'; +import { useRef, useState } from 'react'; +import { FlatList, Text, View } from 'react-native'; import { ModalRef } from '~/components/layout/Modal'; -import { tw } from '~/lib/tailwind'; +import { tw, twStyle } from '~/lib/tailwind'; import { BrowseStackScreenProps } from '~/navigation/tabs/BrowseStack'; import { SettingsStackScreenProps } from '~/navigation/tabs/SettingsStack'; +import { Plus } from 'phosphor-react-native'; import Empty from '../layout/Empty'; +import Fade from '../layout/Fade'; import { LocationItem } from '../locations/LocationItem'; import ImportModal from '../modal/ImportModal'; import { Button } from '../primitive/Button'; @@ -20,54 +21,64 @@ const BrowseLocations = () => { >(); const modalRef = useRef(null); - + const [showAll, setShowAll] = useState(false); const result = useLibraryQuery(['locations.list'], { keepPreviousData: true }); const locations = result.data; return ( - - + + Locations - - {locations?.length === 0 ? ( - - ) : ( - <> - {locations?.slice(0, 3).map((location) => ( + + + } + numColumns={showAll ? 3 : 1} + horizontal={showAll ? false : true} + contentContainerStyle={twStyle(locations?.length === 0 && 'w-full','px-5')} + key={showAll ? '_locations' : 'alllocationcols'} + keyExtractor={(item) => item.id.toString()} + scrollEnabled={showAll ? false : true} + showsHorizontalScrollIndicator={false} + renderItem={({ item }) => { + return ( navigation.navigate('SettingsStack', { screen: 'EditLocationSettings', - params: { id: location.id }, + params: { id: item.id }, initial: false }) } - onPress={() => navigation.navigate('Location', { id: location.id })} - /> - ))} - - )} + onPress={() => navigation.navigate('Location', { id: item.id })} + /> + )} + } + /> + diff --git a/apps/mobile/src/components/browse/BrowseTags.tsx b/apps/mobile/src/components/browse/BrowseTags.tsx index 4fc8369ae..a1360362d 100644 --- a/apps/mobile/src/components/browse/BrowseTags.tsx +++ b/apps/mobile/src/components/browse/BrowseTags.tsx @@ -1,13 +1,14 @@ import { useNavigation } from '@react-navigation/native'; import { useLibraryQuery } from '@sd/client'; -import { DotsThree, Plus } from 'phosphor-react-native'; -import React, { useRef } from 'react'; -import { Text, View } from 'react-native'; +import { Plus } from 'phosphor-react-native'; +import React, { useRef, useState } from 'react'; +import { FlatList, Text, View } from 'react-native'; import { ModalRef } from '~/components/layout/Modal'; -import { tw } from '~/lib/tailwind'; +import { tw, twStyle } from '~/lib/tailwind'; import { BrowseStackScreenProps } from '~/navigation/tabs/BrowseStack'; import Empty from '../layout/Empty'; +import Fade from '../layout/Fade'; import CreateTagModal from '../modal/tag/CreateTagModal'; import { Button } from '../primitive/Button'; import { TagItem } from '../tags/TagItem'; @@ -19,47 +20,58 @@ const BrowseTags = () => { const tagData = tags.data; const modalRef = useRef(null); + const [showAll, setShowAll] = useState(false); return ( - - + + Tags - - {tagData?.length === 0 ? ( - - ) : ( - tagData - ?.slice(0, 3) - .map((tag) => ( + + + } + numColumns={showAll ? 3 : 1} + contentContainerStyle={twStyle(tagData?.length === 0 && 'w-full','px-5')} + horizontal={showAll ? false : true} + key={showAll ? '_tags' : 'alltagcols'} + keyExtractor={(item) => item.id.toString()} + scrollEnabled={showAll ? false : true} + showsHorizontalScrollIndicator={false} + renderItem={({ item }) => ( - navigation.navigate('Tag', { id: tag.id, color: tag.color! }) - } - /> - )) - )} + style={twStyle(showAll && 'max-w-[31%] flex-1')} + key={item.id} + tag={item} + onPress={() => + navigation.navigate('Tag', { id: item.id, color: item.color! }) + } + /> + )} + /> + diff --git a/apps/mobile/src/components/drawer/DrawerContent.tsx b/apps/mobile/src/components/drawer/DrawerContent.tsx index 02817e080..b46099351 100644 --- a/apps/mobile/src/components/drawer/DrawerContent.tsx +++ b/apps/mobile/src/components/drawer/DrawerContent.tsx @@ -1,11 +1,11 @@ import { DrawerContentScrollView } from '@react-navigation/drawer'; import { DrawerContentComponentProps } from '@react-navigation/drawer/lib/typescript/src/types'; import { AppLogo } from '@sd/assets/images'; +import { JobManagerContextProvider, useLibraryQuery } from '@sd/client'; import { Image } from 'expo-image'; import { CheckCircle } from 'phosphor-react-native'; import { useRef } from 'react'; import { Platform, Pressable, Text, View } from 'react-native'; -import { JobManagerContextProvider, useLibraryQuery } from '@sd/client'; import Layout from '~/constants/Layout'; import { tw, twStyle } from '~/lib/tailwind'; diff --git a/apps/mobile/src/components/drawer/DrawerLocations.tsx b/apps/mobile/src/components/drawer/DrawerLocations.tsx index 28a367cb5..2af0da0f6 100644 --- a/apps/mobile/src/components/drawer/DrawerLocations.tsx +++ b/apps/mobile/src/components/drawer/DrawerLocations.tsx @@ -1,14 +1,14 @@ import { DrawerNavigationHelpers } from '@react-navigation/drawer/lib/typescript/src/types'; import { useNavigation } from '@react-navigation/native'; -import { useRef } from 'react'; -import { Pressable, Text, View } from 'react-native'; import { + Location, arraysEqual, humanizeSize, - Location, useLibraryQuery, useOnlineLocations } from '@sd/client'; +import { useRef } from 'react'; +import { Pressable, Text, View } from 'react-native'; import { ModalRef } from '~/components/layout/Modal'; import { tw, twStyle } from '~/lib/tailwind'; @@ -49,8 +49,8 @@ const DrawerLocationItem: React.FC = ({ {location.name ?? ''} - - + + {`${humanizeSize(location.size_in_bytes)}`} diff --git a/apps/mobile/src/components/explorer/FileRow.tsx b/apps/mobile/src/components/explorer/FileRow.tsx index d376c0177..25ac79a5f 100644 --- a/apps/mobile/src/components/explorer/FileRow.tsx +++ b/apps/mobile/src/components/explorer/FileRow.tsx @@ -27,7 +27,7 @@ const FileRow = ({ data }: FileRowProps) => { height: getExplorerStore().listItemSize })} > - + diff --git a/apps/mobile/src/components/explorer/menu/SortByMenu.tsx b/apps/mobile/src/components/explorer/menu/SortByMenu.tsx index d5b1cdc4d..8abd4322d 100644 --- a/apps/mobile/src/components/explorer/menu/SortByMenu.tsx +++ b/apps/mobile/src/components/explorer/menu/SortByMenu.tsx @@ -25,6 +25,7 @@ const SortByMenu = () => { return ( } > @@ -40,6 +41,7 @@ const SortByMenu = () => { ))} diff --git a/apps/mobile/src/components/job/JobContainer.tsx b/apps/mobile/src/components/job/JobContainer.tsx index 9e7532cc0..5cceda639 100644 --- a/apps/mobile/src/components/job/JobContainer.tsx +++ b/apps/mobile/src/components/job/JobContainer.tsx @@ -1,8 +1,8 @@ +import { TextItems } from '@sd/client'; import { Image } from 'expo-image'; import { Icon } from 'phosphor-react-native'; import { Fragment } from 'react'; import { Text, View, ViewStyle } from 'react-native'; -import { TextItems } from '@sd/client'; import { styled, tw, twStyle } from '~/lib/tailwind'; type JobContainerProps = { @@ -25,7 +25,7 @@ export default function JobContainer(props: JobContainerProps) { - + ); }; @@ -158,8 +160,23 @@ const toastErrorSuccess = ( }; }; -function Options({ activeJob, group }: { activeJob?: JobReport; group: JobGroup }) { - // const queryClient = useQueryClient(); +interface OptionsProps { + activeJob?: JobReport; + group: JobGroup; + showChildJobs: boolean; + setShowChildJobs: React.Dispatch> +} + +function Options({ activeJob, group, setShowChildJobs, showChildJobs }: OptionsProps) { + + const rspc = useRspcLibraryContext(); + + const clearJob = useLibraryMutation( + ['jobs.clear'], { + onSuccess: () => { + rspc.queryClient.invalidateQueries(['jobs.reports']); + } + }) const resumeJob = useLibraryMutation( ['jobs.resume'], @@ -179,32 +196,45 @@ function Options({ activeJob, group }: { activeJob?: JobReport; group: JobGroup [group.jobs] ); - // const clearJob = useLibraryMutation( - // ['jobs.clear'], - // toastErrorSuccess('failed_to_remove_job', undefined, () => { - // queryClient.invalidateQueries(['jobs.reports']); - // }) - // ); + const clearJobHandler = () => { + group.jobs.forEach((job) => { + clearJob.mutate(job.id); + //only one toast for all jobs + if (job.id === group.id) + toast.success('Job has been removed'); + }); + }; return ( <> {/* Resume */} {(group.status === 'Queued' || group.status === 'Paused' || isJobPaused) && ( - )} {/* TODO: This should remove the job from panel */} {!activeJob !== undefined ? ( - + + } + > + setShowChildJobs(!showChildJobs)} + text="Expand" icon={Eye}/> + + ) : ( - - diff --git a/apps/mobile/src/components/layout/Empty.tsx b/apps/mobile/src/components/layout/Empty.tsx index fec6b282a..2c7ce7ab4 100644 --- a/apps/mobile/src/components/layout/Empty.tsx +++ b/apps/mobile/src/components/layout/Empty.tsx @@ -7,14 +7,14 @@ import { Icon, IconName } from '../icons/Icon'; interface Props { description: string; //description of empty state - icon: IconName; //Spacedrive icon + icon?: IconName; //Spacedrive icon style?: ClassInput; //Tailwind classes iconSize?: number; //Size of the icon - textSize?: ClassInput; //Size of the text + textStyle?: ClassInput; //Size of the text includeHeaderHeight?: boolean; //Height of the header } -const Empty = ({ description, icon, style, includeHeaderHeight = false, textSize = 'text-sm', iconSize = 38 }: Props) => { +const Empty = ({ description, icon, style, includeHeaderHeight = false, textStyle, iconSize = 38 }: Props) => { const headerHeight = useSafeAreaInsets().top; return ( - - + {icon && } + {description} diff --git a/apps/mobile/src/components/layout/Modal.tsx b/apps/mobile/src/components/layout/Modal.tsx index 6d2b60524..ecdc86872 100644 --- a/apps/mobile/src/components/layout/Modal.tsx +++ b/apps/mobile/src/components/layout/Modal.tsx @@ -6,10 +6,10 @@ import { BottomSheetHandleProps, BottomSheetModal, BottomSheetModalProps, - BottomSheetScrollView + BottomSheetScrollView, } from '@gorhom/bottom-sheet'; import { X } from 'phosphor-react-native'; -import { forwardRef, ReactNode } from 'react'; +import { ReactNode, forwardRef } from 'react'; import { Platform, Pressable, Text, View } from 'react-native'; import useForwardedRef from '~/hooks/useForwardedRef'; import { tw, twStyle } from '~/lib/tailwind'; diff --git a/apps/mobile/src/components/locations/GridLocation.tsx b/apps/mobile/src/components/locations/GridLocation.tsx index ed40b9c25..bfc5239ef 100644 --- a/apps/mobile/src/components/locations/GridLocation.tsx +++ b/apps/mobile/src/components/locations/GridLocation.tsx @@ -1,6 +1,6 @@ +import { Location, arraysEqual, humanizeSize, useOnlineLocations } from '@sd/client'; import { DotsThreeOutlineVertical } from 'phosphor-react-native'; import { Pressable, Text, View } from 'react-native'; -import { arraysEqual, humanizeSize, Location, useOnlineLocations } from '@sd/client'; import { tw, twStyle } from '~/lib/tailwind'; import FolderIcon from '../icons/FolderIcon'; @@ -16,11 +16,11 @@ const GridLocation: React.FC = ({ location, modalRef }: GridL const onlineLocations = useOnlineLocations(); const online = onlineLocations.some((l) => arraysEqual(location.pub_id, l)); return ( - + - + = ({ location, modalRef }: GridL {location.path} - + + {`${humanizeSize(location.size_in_bytes)}`} + ); }; diff --git a/apps/mobile/src/components/locations/ListLocation.tsx b/apps/mobile/src/components/locations/ListLocation.tsx index 90fc66b8b..66b242a18 100644 --- a/apps/mobile/src/components/locations/ListLocation.tsx +++ b/apps/mobile/src/components/locations/ListLocation.tsx @@ -61,10 +61,10 @@ const ListLocation = ({ location }: ListLocationProps) => { - - + + {`${humanizeSize(location.size_in_bytes)}`} diff --git a/apps/mobile/src/components/locations/LocationItem.tsx b/apps/mobile/src/components/locations/LocationItem.tsx index fae5729db..a9f476724 100644 --- a/apps/mobile/src/components/locations/LocationItem.tsx +++ b/apps/mobile/src/components/locations/LocationItem.tsx @@ -1,8 +1,9 @@ +import { Location } from '@sd/client'; import { useRef } from 'react'; import { Pressable } from 'react-native'; -import { Location } from '@sd/client'; import { twStyle } from '~/lib/tailwind'; +import { ClassInput } from 'twrnc'; import { ModalRef } from '../layout/Modal'; import { LocationModal } from '../modal/location/LocationModal'; import GridLocation from './GridLocation'; @@ -13,19 +14,21 @@ type LocationItemProps = { onPress: () => void; viewStyle?: 'grid' | 'list'; editLocation: () => void; + style?: ClassInput; }; export const LocationItem = ({ location, onPress, editLocation, - viewStyle = 'grid' + viewStyle = 'grid', + style }: LocationItemProps) => { const modalRef = useRef(null); return ( <> {viewStyle === 'grid' ? ( diff --git a/apps/mobile/src/components/modal/AddTagModal.tsx b/apps/mobile/src/components/modal/AddTagModal.tsx index 1beee726a..e45d16502 100644 --- a/apps/mobile/src/components/modal/AddTagModal.tsx +++ b/apps/mobile/src/components/modal/AddTagModal.tsx @@ -1,4 +1,4 @@ -import { Tag, getItemObject, useLibraryMutation, useLibraryQuery, useRspcContext } from "@sd/client"; +import { Tag, getItemObject, useLibraryMutation, useLibraryQuery, useRspcLibraryContext } from "@sd/client"; import { CaretLeft, Plus } from "phosphor-react-native"; import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react"; import { FlatList, NativeScrollEvent, Pressable, Text, View } from "react-native"; @@ -24,7 +24,7 @@ const AddTagModal = forwardRef((_, ref) => { const [startedScrolling, setStartedScrolling] = useState(false); const [reachedBottom, setReachedBottom] = useState(true); // needs to be set to true for initial rendering fade to be correct - const rspc = useRspcContext(); + const rspc = useRspcLibraryContext(); const tagsQuery = useLibraryQuery(['tags.list']); const tagsObjectQuery = useLibraryQuery(['tags.getForObject', objectData?.id ?? -1]); const mutation = useLibraryMutation(['tags.assign'], { diff --git a/apps/mobile/src/components/modal/ImportModal.tsx b/apps/mobile/src/components/modal/ImportModal.tsx index 70e98a93f..4f14da020 100644 --- a/apps/mobile/src/components/modal/ImportModal.tsx +++ b/apps/mobile/src/components/modal/ImportModal.tsx @@ -1,14 +1,15 @@ import * as RNFS from '@dr.pogodin/react-native-fs'; +import { useLibraryMutation, useRspcLibraryContext } from '@sd/client'; import { forwardRef, useCallback } from 'react'; import { Alert, Platform, Text, View } from 'react-native'; import DocumentPicker from 'react-native-document-picker'; -import { useLibraryMutation, useRspcLibraryContext } from '@sd/client'; import { Modal, ModalRef } from '~/components/layout/Modal'; import { Button } from '~/components/primitive/Button'; import useForwardedRef from '~/hooks/useForwardedRef'; import { tw } from '~/lib/tailwind'; import { Icon } from '../icons/Icon'; +import { toast } from '../primitive/Toast'; // import * as ML from 'expo-media-library'; @@ -22,17 +23,29 @@ const ImportModal = forwardRef((_, ref) => { const createLocation = useLibraryMutation('locations.create', { onError: (error, variables) => { + modalRef.current?.close(); + //custom message handling + if (error.message.startsWith("location already exists")) { + return toast.error('This location has already been added'); + } else if (error.message.startsWith("nested location currently")) { + return toast.error('Nested locations are currently not supported'); + } switch (error.message) { case 'NEED_RELINK': if (!variables.dry_run) relinkLocation.mutate(variables.path); + toast.info('Please relink the location'); break; case 'ADD_LIBRARY': addLocationToLibrary.mutate(variables); break; default: + toast.error(error.message); throw new Error('Unimplemented custom remote error handling'); } }, + onSuccess: () => { + toast.success('Location added successfully'); + }, onSettled: () => { rspc.queryClient.invalidateQueries(['locations.list']); modalRef.current?.close(); diff --git a/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx b/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx index 9dc6a59fd..8d221305e 100644 --- a/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx +++ b/apps/mobile/src/components/modal/confirmModals/DeleteLocationModal.tsx @@ -1,6 +1,7 @@ -import { useRef } from 'react'; import { useLibraryMutation, usePlausibleEvent, useRspcLibraryContext } from '@sd/client'; +import { useRef } from 'react'; import { ConfirmModal, ModalRef } from '~/components/layout/Modal'; +import { toast } from '~/components/primitive/Toast'; type Props = { locationId: number; @@ -20,6 +21,10 @@ const DeleteLocationModal = ({ trigger, onSubmit, locationId, triggerStyle }: Pr onSuccess: () => { submitPlausibleEvent({ event: { type: 'locationDelete' } }); onSubmit?.(); + toast.success('Location deleted successfully'); + }, + onError: (error) => { + toast.error(error.message); }, onSettled: () => { modalRef.current?.close(); diff --git a/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx b/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx index 54eb5e8cf..8d68272cc 100644 --- a/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx +++ b/apps/mobile/src/components/modal/confirmModals/DeleteTagModal.tsx @@ -1,6 +1,7 @@ -import { useRef } from 'react'; import { useLibraryMutation, usePlausibleEvent, useRspcLibraryContext } from '@sd/client'; +import { useRef } from 'react'; import { ConfirmModal, ModalRef } from '~/components/layout/Modal'; +import { toast } from '~/components/primitive/Toast'; type Props = { tagId: number; @@ -19,6 +20,7 @@ const DeleteTagModal = ({ trigger, onSubmit, tagId, triggerStyle }: Props) => { submitPlausibleEvent({ event: { type: 'tagDelete' } }); onSubmit?.(); rspc.queryClient.invalidateQueries(['tags.list']); + toast.success('Tag deleted successfully'); }, onSettled: () => { modalRef.current?.close(); diff --git a/apps/mobile/src/components/modal/inspector/ActionsModal.tsx b/apps/mobile/src/components/modal/inspector/ActionsModal.tsx index b0dcd79ee..f310ad2c9 100644 --- a/apps/mobile/src/components/modal/inspector/ActionsModal.tsx +++ b/apps/mobile/src/components/modal/inspector/ActionsModal.tsx @@ -3,7 +3,8 @@ import { getItemObject, humanizeSize, useLibraryMutation, - useLibraryQuery + useLibraryQuery, + useRspcContext } from '@sd/client'; import dayjs from 'dayjs'; import { @@ -28,6 +29,7 @@ import { tw, twStyle } from '~/lib/tailwind'; import { useActionsModalStore } from '~/stores/modalStore'; import FileInfoModal from './FileInfoModal'; +import RenameModal from './RenameModal'; type ActionsContainerProps = PropsWithChildren<{ style?: ViewStyle; @@ -65,8 +67,10 @@ const ActionDivider = () => ; export const ActionsModal = () => { const fileInfoRef = useRef(null); + const renameRef = useRef(null); const { modalRef, data } = useActionsModalStore(); + const rspc = useRspcContext(); const objectData = data && getItemObject(data); const filePath = data && getIndexedItemFilePath(data); @@ -77,6 +81,13 @@ export const ActionsModal = () => { enabled: filePath != null }); + const deleteFile = useLibraryMutation('files.deleteFiles', { + onSuccess: () => { + rspc.queryClient.invalidateQueries(['search.paths']) + modalRef.current?.dismiss(); + } + }); + async function handleOpen() { const absolutePath = queriedFullPath.data; if (!absolutePath) return; @@ -141,7 +152,9 @@ export const ActionsModal = () => { /> - + { + renameRef.current?.present(); + }} icon={Pencil} title="Rename" /> @@ -154,11 +167,19 @@ export const ActionsModal = () => { - + { + if (filePath && filePath.location_id) { + await deleteFile.mutateAsync({ + location_id: filePath.location_id, + file_path_ids: [filePath.id] + }); + } + }} /> )} + ); diff --git a/apps/mobile/src/components/modal/inspector/RenameModal.tsx b/apps/mobile/src/components/modal/inspector/RenameModal.tsx new file mode 100644 index 000000000..4bc7f100b --- /dev/null +++ b/apps/mobile/src/components/modal/inspector/RenameModal.tsx @@ -0,0 +1,90 @@ +import { getIndexedItemFilePath, useLibraryMutation, useRspcLibraryContext } from '@sd/client'; +import React, { forwardRef, useEffect, useRef, useState } from 'react'; +import { Text, View } from 'react-native'; +import { TextInput } from 'react-native-gesture-handler'; +import { Modal, ModalRef } from '~/components/layout/Modal'; +import { Button } from '~/components/primitive/Button'; +import { ModalInput } from '~/components/primitive/Input'; +import { toast } from '~/components/primitive/Toast'; +import useForwardedRef from '~/hooks/useForwardedRef'; +import { tw } from '~/lib/tailwind'; +import { useActionsModalStore } from '~/stores/modalStore'; + +interface Props { + objectName: string; +} + +const RenameModal = forwardRef((props, ref) => { + const modalRef = useForwardedRef(ref); + const [newName, setNewName] = useState(''); + const rspc = useRspcLibraryContext(); + const { data } = useActionsModalStore(); + const inputRef = useRef(null); + + const filePathData = data && getIndexedItemFilePath(data); + + const renameFile = useLibraryMutation(['files.renameFile'], { + onSuccess: () => { + modalRef.current?.dismiss(); + rspc.queryClient.invalidateQueries(['search.paths']); + }, + onError: () => { + toast.error('Failed to rename object'); + } + }); + + // set input value to object name on initial render + useEffect(() => { + setNewName(props.objectName); + }, [props.objectName]); + + const textRenameHandler = async () => { + switch (data?.type) { + case 'Path': + case 'Object': { + if (!filePathData) throw new Error('Failed to get file path object'); + + const { id, location_id } = filePathData; + + if (!location_id) throw new Error('Missing location id'); + + await renameFile.mutateAsync({ + location_id: location_id, + kind: { + One: { + from_file_path_id: id, + to: newName + } + } + }); + break; + } + } + }; + + return ( + setNewName(props.objectName)} + enableContentPanningGesture={false} + enablePanDownToClose={false} + snapPoints={['20']} + > + + inputRef.current?.setSelection(0, newName.length)} + value={newName} + onChangeText={(t) => setNewName(t)} + /> + + + + ); +}); + +export default RenameModal; diff --git a/apps/mobile/src/components/modal/job/JobManagerModal.tsx b/apps/mobile/src/components/modal/job/JobManagerModal.tsx index 7d996b313..2c759e2a1 100644 --- a/apps/mobile/src/components/modal/job/JobManagerModal.tsx +++ b/apps/mobile/src/components/modal/job/JobManagerModal.tsx @@ -1,40 +1,51 @@ -import { forwardRef } from 'react'; -import { FlatList, Text, View } from 'react-native'; +import { BottomSheetFlatList } from '@gorhom/bottom-sheet'; import { useJobProgress, useLibraryQuery } from '@sd/client'; +import { forwardRef, useEffect } from 'react'; import JobGroup from '~/components/job/JobGroup'; +import Empty from '~/components/layout/Empty'; import { Modal, ModalRef } from '~/components/layout/Modal'; +import useForwardedRef from '~/hooks/useForwardedRef'; import { tw } from '~/lib/tailwind'; -// TODO: -// - When there is no job, make modal height smaller -// - Add clear all jobs button +//TODO: Handle data fetching better when modal is opened export const JobManagerModal = forwardRef((_, ref) => { - // const queryClient = useQueryClient(); - + // const rspc = useRspcLibraryContext(); const jobGroups = useLibraryQuery(['jobs.reports']); const progress = useJobProgress(jobGroups.data); + const modalRef = useForwardedRef(ref); + + //TODO: Add clear all jobs button // const clearAllJobs = useLibraryMutation(['jobs.clearAll'], { // onError: () => { - // // TODO: Show error toast + // toast.error('Failed to clear all jobs.'); // }, // onSuccess: () => { // queryClient.invalidateQueries(['jobs.reports ']); // } // }); + useEffect(() => { + if (jobGroups.data?.length === 0) { + modalRef.current?.snapToPosition('20'); + } + }, [jobGroups, modalRef]); + return ( - - + i.id} contentContainerStyle={tw`mt-4`} renderItem={({ item }) => } ListEmptyComponent={ - - No jobs. - + } /> diff --git a/apps/mobile/src/components/modal/tag/CreateTagModal.tsx b/apps/mobile/src/components/modal/tag/CreateTagModal.tsx index d92fc40cf..ff4f9fdd0 100644 --- a/apps/mobile/src/components/modal/tag/CreateTagModal.tsx +++ b/apps/mobile/src/components/modal/tag/CreateTagModal.tsx @@ -1,16 +1,17 @@ -import { forwardRef, useEffect, useState } from 'react'; -import { Pressable, Text, View } from 'react-native'; -import ColorPicker from 'react-native-wheel-color-picker'; import { ToastDefautlColor, useLibraryMutation, usePlausibleEvent, useRspcLibraryContext } from '@sd/client'; +import { forwardRef, useEffect, useState } from 'react'; +import { Pressable, Text, View } from 'react-native'; +import ColorPicker from 'react-native-wheel-color-picker'; import { FadeInAnimation } from '~/components/animation/layout'; import { Modal, ModalRef } from '~/components/layout/Modal'; import { Button } from '~/components/primitive/Button'; import { ModalInput } from '~/components/primitive/Input'; +import { toast } from '~/components/primitive/Toast'; import useForwardedRef from '~/hooks/useForwardedRef'; import { useKeyboard } from '~/hooks/useKeyboard'; import { tw, twStyle } from '~/lib/tailwind'; @@ -36,8 +37,12 @@ const CreateTagModal = forwardRef((_, ref) => { rspc.queryClient.invalidateQueries(['tags.list']); + toast.success('Tag created successfully'); submitPlausibleEvent({ event: { type: 'tagCreate' } }); }, + onError: (error) => { + toast.error(error.message); + }, onSettled: () => { // Close modal modalRef.current?.dismiss(); @@ -57,7 +62,7 @@ const CreateTagModal = forwardRef((_, ref) => { return ( { // Resets form onDismiss @@ -94,7 +99,7 @@ const CreateTagModal = forwardRef((_, ref) => { diff --git a/apps/mobile/src/components/overview/Locations.tsx b/apps/mobile/src/components/overview/Locations.tsx index 62984ac07..fb24ca639 100644 --- a/apps/mobile/src/components/overview/Locations.tsx +++ b/apps/mobile/src/components/overview/Locations.tsx @@ -1,8 +1,8 @@ import { useNavigation } from '@react-navigation/native'; +import { useLibraryQuery } from '@sd/client'; import React, { useRef } from 'react'; import { Pressable, Text, View } from 'react-native'; import { FlatList } from 'react-native-gesture-handler'; -import { useLibraryQuery } from '@sd/client'; import { tw, twStyle } from '~/lib/tailwind'; import { OverviewStackScreenProps } from '~/navigation/tabs/OverviewStack'; @@ -25,10 +25,11 @@ const Locations = () => { <> + location.id.toString()} ItemSeparatorComponent={() => } @@ -73,6 +74,7 @@ const Locations = () => { )} /> + diff --git a/apps/mobile/src/components/overview/OverviewStats.tsx b/apps/mobile/src/components/overview/OverviewStats.tsx index da1719629..d72eba4e7 100644 --- a/apps/mobile/src/components/overview/OverviewStats.tsx +++ b/apps/mobile/src/components/overview/OverviewStats.tsx @@ -37,7 +37,7 @@ const StatItem = ({ title, bytes, isLoading, style }: StatItemProps) => { hidden: isLoading })} > - {title} + {title} {count} {unit} @@ -104,7 +104,7 @@ const OverviewStats = ({ stats }: Props) => { }; return ( - + Statistics diff --git a/apps/mobile/src/components/primitive/Button.tsx b/apps/mobile/src/components/primitive/Button.tsx index 37eabd611..7e0cbd893 100644 --- a/apps/mobile/src/components/primitive/Button.tsx +++ b/apps/mobile/src/components/primitive/Button.tsx @@ -8,11 +8,11 @@ const button = cva(['items-center justify-center rounded-md border shadow-sm'], variants: { variant: { danger: ['border-red-800 bg-red-600 shadow-none'], - gray: ['border-app-lightborder bg-app-button shadow-none'], + gray: ['border-app-box bg-app shadow-none'], darkgray: ['border-app-box bg-app shadow-none'], accent: ['border-accent-deep bg-accent shadow-md shadow-app-shade/10'], - outline: ['border-sidebar-line/60 bg-black shadow-none'], - transparent: ['border-0 bg-black shadow-none'], + outline: ['border border-app-inputborder bg-transparent shadow-none'], + transparent: ['border-0 bg-transparent shadow-none'], dashed: ['border border-dashed border-app-line bg-transparent shadow-none'] }, size: { diff --git a/apps/mobile/src/components/primitive/Input.tsx b/apps/mobile/src/components/primitive/Input.tsx index 023b5c21b..abe5b453f 100644 --- a/apps/mobile/src/components/primitive/Input.tsx +++ b/apps/mobile/src/components/primitive/Input.tsx @@ -1,7 +1,7 @@ import { BottomSheetTextInput } from '@gorhom/bottom-sheet'; import { cva, VariantProps } from 'class-variance-authority'; import { Eye, EyeSlash } from 'phosphor-react-native'; -import { useState } from 'react'; +import { forwardRef, useState } from 'react'; import { Pressable, TextInputProps as RNTextInputProps, TextInput, View } from 'react-native'; import { tw, twStyle } from '~/lib/tailwind'; @@ -23,28 +23,32 @@ const input = cva(['rounded-md border text-sm leading-tight shadow-sm'], { type InputProps = VariantProps & RNTextInputProps; -export const Input = ({ variant, size, ...props }: InputProps) => { - const { style, ...otherProps } = props; +export const Input = forwardRef((props, ref) => { + const { style, variant, size, ...otherProps } = props; return ( ); -}; +}) // To use in modals (for keyboard handling) -export const ModalInput = ({ variant, size, ...props }: InputProps) => { - const { style, ...otherProps } = props; +export const ModalInput = forwardRef((props, ref) => { + const { style, variant, size, ...otherProps } = props; return ( ); -}; +}) // Same as Input but configured with password props & show/hide password button diff --git a/apps/mobile/src/components/primitive/Menu.tsx b/apps/mobile/src/components/primitive/Menu.tsx index 3f906f5c2..7f16d870a 100644 --- a/apps/mobile/src/components/primitive/Menu.tsx +++ b/apps/mobile/src/components/primitive/Menu.tsx @@ -14,13 +14,14 @@ type MenuProps = { trigger: React.ReactNode; children: React.ReactNode[] | React.ReactNode; triggerStyle?: ClassInput; + containerStyle?: ClassInput; }; // TODO: Still looks a bit off... export const Menu = (props: MenuProps) => ( {props.trigger} - + {props.children} @@ -28,24 +29,25 @@ export const Menu = (props: MenuProps) => ( type MenuItemProps = { icon?: Icon; + textStyle?: ClassInput; + iconStyle?: ClassInput; + style?: ClassInput; } & MenuOptionProps; -export const MenuItem = ({ icon, ...props }: MenuItemProps) => { +export const MenuItem = ({ icon, textStyle, iconStyle, style, ...props }: MenuItemProps) => { const Icon = icon; return ( - + {Icon && ( - - - + )} ); diff --git a/apps/mobile/src/components/primitive/Toast.tsx b/apps/mobile/src/components/primitive/Toast.tsx index a22fc0d83..d0da33b3c 100644 --- a/apps/mobile/src/components/primitive/Toast.tsx +++ b/apps/mobile/src/components/primitive/Toast.tsx @@ -1,30 +1,41 @@ /* eslint-disable no-restricted-imports */ +import { CheckCircle, Info, WarningCircle } from 'phosphor-react-native'; import { Text, View } from 'react-native'; import Toast, { ToastConfig } from 'react-native-toast-message'; import { tw } from '~/lib/tailwind'; -const baseStyles = 'w-[340px] flex-row overflow-hidden rounded-md border p-3 shadow-lg'; +const baseStyles = 'max-w-[340px] flex-row gap-1 items-center justify-center overflow-hidden rounded-md border p-3 shadow-lg bg-app-input border-app-inputborder'; +const containerStyle = 'flex-row items-start gap-1.5' const toastConfig: ToastConfig = { success: ({ text1, ...rest }) => ( - - + + + + {text1} + ), error: ({ text1, ...rest }) => ( - - + + + + {text1} + ), info: ({ text1, ...rest }) => ( - - + + + + {text1} + ) }; diff --git a/apps/mobile/src/components/tags/GridTag.tsx b/apps/mobile/src/components/tags/GridTag.tsx index 98fb764fb..a2598126d 100644 --- a/apps/mobile/src/components/tags/GridTag.tsx +++ b/apps/mobile/src/components/tags/GridTag.tsx @@ -16,7 +16,7 @@ const GridTag = ({ tag, modalRef }: GridTagProps) => { diff --git a/apps/mobile/src/components/tags/TagItem.tsx b/apps/mobile/src/components/tags/TagItem.tsx index e131fe501..7aba00a01 100644 --- a/apps/mobile/src/components/tags/TagItem.tsx +++ b/apps/mobile/src/components/tags/TagItem.tsx @@ -1,8 +1,9 @@ +import { Tag } from '@sd/client'; import { useRef } from 'react'; import { Pressable } from 'react-native'; -import { Tag } from '@sd/client'; import { twStyle } from '~/lib/tailwind'; +import { ClassInput } from 'twrnc'; import { ModalRef } from '../layout/Modal'; import { TagModal } from '../modal/tag/TagModal'; import GridTag from './GridTag'; @@ -12,14 +13,15 @@ type TagItemProps = { tag: Tag; onPress: () => void; viewStyle?: 'grid' | 'list'; + style?: ClassInput; }; -export const TagItem = ({ tag, onPress, viewStyle = 'grid' }: TagItemProps) => { +export const TagItem = ({ tag, onPress, style, viewStyle = 'grid' }: TagItemProps) => { const modalRef = useRef(null); return ( <> diff --git a/apps/mobile/src/constants/style/Colors.js b/apps/mobile/src/constants/style/Colors.js index ae080949b..715b96f56 100644 --- a/apps/mobile/src/constants/style/Colors.js +++ b/apps/mobile/src/constants/style/Colors.js @@ -79,7 +79,7 @@ module.exports = { // shadow shade: `hsla(${DARK_HUE}, 15%, 0%, ${ALPHA})`, // menu - menu: `hsla(${DARK_HUE}, 25%, 5%, ${ALPHA})` + menu: `hsla(${DARK_HUE}, 10%, 5%, ${ALPHA})` }, sidebar: { box: `hsla(${DARK_HUE}, 15%, 16%, ${ALPHA})`, diff --git a/apps/mobile/src/hooks/useFiltersSearch.ts b/apps/mobile/src/hooks/useFiltersSearch.ts index 37c17608f..4c953df85 100644 --- a/apps/mobile/src/hooks/useFiltersSearch.ts +++ b/apps/mobile/src/hooks/useFiltersSearch.ts @@ -17,7 +17,6 @@ export function useFiltersSearch(search: string) { const locations = useLibraryQuery(['locations.list'], { keepPreviousData: true, - enabled: (name || ext) ? true : false, }); const filterFactory = (key: SearchFilters, value: Filters[keyof Filters]) => { @@ -60,7 +59,7 @@ export function useFiltersSearch(search: string) { const filters = [] as SearchFilterArgs[]; //It's a global search if no locations have been selected - if (searchStore.filters.locations.length === 0 || !name || !ext) { + if (searchStore.filters.locations.length === 0) { const locationIds = locations.data?.map((l) => l.id); if (locationIds) filters.push({ filePath: { locations: { in: locationIds } } }); } diff --git a/apps/mobile/src/screens/browse/Browse.tsx b/apps/mobile/src/screens/browse/Browse.tsx index e7a3b39b2..23b867f43 100644 --- a/apps/mobile/src/screens/browse/Browse.tsx +++ b/apps/mobile/src/screens/browse/Browse.tsx @@ -1,4 +1,3 @@ -import BrowseCategories from '~/components/browse/BrowseCategories'; import BrowseLocations from '~/components/browse/BrowseLocations'; import BrowseTags from '~/components/browse/BrowseTags'; import ScreenContainer from '~/components/layout/ScreenContainer'; @@ -6,7 +5,7 @@ import ScreenContainer from '~/components/layout/ScreenContainer'; export default function BrowseScreen() { return ( - + {/* */} diff --git a/apps/mobile/src/screens/browse/Location.tsx b/apps/mobile/src/screens/browse/Location.tsx index fe02529d0..e8984552d 100644 --- a/apps/mobile/src/screens/browse/Location.tsx +++ b/apps/mobile/src/screens/browse/Location.tsx @@ -1,4 +1,4 @@ -import { useLibraryQuery, usePathsExplorerQuery } from '@sd/client'; +import { useLibraryQuery, useLibrarySubscription, usePathsExplorerQuery } from '@sd/client'; import { useEffect, useMemo } from 'react'; import Explorer from '~/components/explorer/Explorer'; import Empty from '~/components/layout/Empty'; @@ -19,6 +19,13 @@ export default function LocationScreen({ navigation, route }: BrowseStackScreenP .pop(); }, [path]) + // makes sure that the location shows newest/modified objects + // when a location is opened + useLibrarySubscription( + ['locations.quickRescan', { sub_path: path ?? '', location_id: id }], + { onData() {} } + ); + const paths = usePathsExplorerQuery({ arg: { filters: [ @@ -70,7 +77,6 @@ export default function LocationScreen({ navigation, route }: BrowseStackScreenP includeHeaderHeight icon={'FolderNoSpace'} style={tw`flex-1 items-center justify-center border-0`} - textSize="text-md" iconSize={100} description={'No files found'} />} diff --git a/apps/mobile/src/screens/browse/Locations.tsx b/apps/mobile/src/screens/browse/Locations.tsx index 0afe969f8..7dc4327e2 100644 --- a/apps/mobile/src/screens/browse/Locations.tsx +++ b/apps/mobile/src/screens/browse/Locations.tsx @@ -60,7 +60,6 @@ export default function LocationsScreen({ viewStyle }: Props) { diff --git a/apps/mobile/src/screens/browse/Tag.tsx b/apps/mobile/src/screens/browse/Tag.tsx index 012beb9ca..0854c8217 100644 --- a/apps/mobile/src/screens/browse/Tag.tsx +++ b/apps/mobile/src/screens/browse/Tag.tsx @@ -38,7 +38,6 @@ export default function TagScreen({ navigation, route }: BrowseStackScreenProps< includeHeaderHeight icon={'Tags'} style={tw`flex-1 items-center justify-center border-0`} - textSize="text-md" iconSize={100} description={'No items assigned to this tag'} />} {...objects} />; diff --git a/apps/mobile/src/screens/browse/Tags.tsx b/apps/mobile/src/screens/browse/Tags.tsx index c154b7a54..fa89b6d57 100644 --- a/apps/mobile/src/screens/browse/Tags.tsx +++ b/apps/mobile/src/screens/browse/Tags.tsx @@ -65,7 +65,6 @@ export default function TagsScreen({ viewStyle = 'list' }: Props) { diff --git a/apps/mobile/src/screens/search/Search.tsx b/apps/mobile/src/screens/search/Search.tsx index 485c4624a..ef70a107e 100644 --- a/apps/mobile/src/screens/search/Search.tsx +++ b/apps/mobile/src/screens/search/Search.tsx @@ -1,5 +1,5 @@ import { useIsFocused } from '@react-navigation/native'; -import { usePathsExplorerQuery } from '@sd/client'; +import { useLibraryQuery, usePathsExplorerQuery } from '@sd/client'; import { ArrowLeft, DotsThree, FunnelSimple } from 'phosphor-react-native'; import { Suspense, useDeferredValue, useState } from 'react'; import { ActivityIndicator, Platform, Pressable, TextInput, View } from 'react-native'; @@ -23,6 +23,8 @@ const SearchScreen = ({ navigation }: SearchStackScreenProps<'Search'>) => { const deferredSearch = useDeferredValue(search); const order = useSortBy(); + const locations = useLibraryQuery(['locations.list']).data ?? []; + const objects = usePathsExplorerQuery({ order, arg: { @@ -43,6 +45,13 @@ const SearchScreen = ({ navigation }: SearchStackScreenProps<'Search'>) => { const noObjects = objects.items?.length === 0 || !objects.items; const noSearch = deferredSearch.length === 0 && appliedFiltersLength === 0; + const searchIcon = + locations.length > 0 && noObjects && noSearch ? 'FolderNoSpace' : + noSearch && noObjects ? 'Search' : 'FolderNoSpace'; + + const searchDescription = locations.length === 0 ? 'You have not added any locations to search' : noObjects + || noSearch ? 'No files found' : 'No results found for this search'; + return ( ) => { emptyComponent={ + /> } tabHeight={false} /> diff --git a/apps/mobile/tests/add-tag.yml b/apps/mobile/tests/add-tag.yml index 893545b0e..9eb1236f6 100644 --- a/apps/mobile/tests/add-tag.yml +++ b/apps/mobile/tests/add-tag.yml @@ -5,10 +5,10 @@ appId: com.spacedrive.app id: 'browse-tab' - waitForAnimationToEnd - tapOn: - id: 'navigate-tags-screen' -- tapOn: - id: 'create-tag-modal' + id: 'create-tag-button' - inputText: 'MyTag' - tapOn: text: 'Create' +- tapOn: + id: 'show-all-tags-button' - assertVisible: 'MyTag' diff --git a/core/Cargo.toml b/core/Cargo.toml index 027e0adf9..e8d513484 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sd-core" -version = "0.2.15" +version = "0.3.0" description = "Virtual distributed filesystem engine that powers Spacedrive." authors = ["Spacedrive Technology Inc "] rust-version = "1.78" diff --git a/core/crates/heavy-lifting/src/indexer/tasks/saver.rs b/core/crates/heavy-lifting/src/indexer/tasks/saver.rs index 3c97b01ad..d9fbef278 100644 --- a/core/crates/heavy-lifting/src/indexer/tasks/saver.rs +++ b/core/crates/heavy-lifting/src/indexer/tasks/saver.rs @@ -195,18 +195,9 @@ impl Task for SaveTask { size_in_bytes_bytes ), sync_db_entry!(inode_to_db(entry.metadata.inode), inode), - { - let v = entry.metadata.created_at.into(); - sync_db_entry!(v, date_created) - }, - { - let v = entry.metadata.modified_at.into(); - sync_db_entry!(v, date_modified) - }, - { - let v = Utc::now().into(); - sync_db_entry!(v, date_indexed) - }, + sync_db_entry!(entry.metadata.created_at.into(), date_created), + sync_db_entry!(entry.metadata.modified_at.into(), date_modified), + sync_db_entry!(Utc::now().into(), date_indexed), sync_db_entry!(entry.metadata.hidden, hidden), ] .into_iter() diff --git a/core/crates/sync/README.md b/core/crates/sync/README.md new file mode 100644 index 000000000..73791e4d7 --- /dev/null +++ b/core/crates/sync/README.md @@ -0,0 +1,103 @@ +# `sd-core-sync` + +Spacedrive's sync system. Consumes types and helpers from `sd-sync`. + +## Using Sync + +### Creating Records + +Prepare a sync id by creating or obtaining its value, +and then wrapping it in the model's `SyncId` struct, +available at `prisma_sync::{model}::SyncId`. + +Next, prepare the sync operations using some varaints of the `sync_entry` macros. +`sync_entry` and `option_sync_entry` take the value first, and then the path to the field's prisma module. +`sync_db_entry` and `option_sync_db_entry` take the same inputs, but additionally produce a prisma operation in a tuple with the sync operation, intended to be put into a `Vec` and unzipped. + +Finally, use `sync.shared/relation_create` depending on if you're creating a standalone record or a relation between two records, and then write it to the database with `write_ops`. + +```rs +let (sync_params, db_params): (Vec<_>, Vec<_>) = [ + sync_db_entry!(self.name, tag::name), + sync_db_entry!(self.color, tag::color), + sync_db_entry!(false, tag::is_hidden), + sync_db_entry!(date_created, tag::date_created), +] +.into_iter() +.unzip(); + +sync.write_ops( + db, + ( + sync.shared_create( + prisma_sync::tag::SyncId { pub_id }, + sync_params, + ), + db.tag().create(pub_id, db_params), + ), +) +``` + +### Updating Records + +This follows a similar process to creation, but with `sync.shared/relation_create`. + +```rs +let (sync_params, db_params): (Vec<_>, Vec<_>) = [ + sync_db_entry!(name, tag::name), + sync_db_entry!(color, tag::color), +] +.into_iter() +.unzip(); + +sync.write_ops( + db, + ( + sync.shared_update(prisma_sync::tag::SyncId { pub_id }, k, v), + db.tag().update(tag::id::equals(id), db_params); + ) +) +``` + +### Deleting Records + +This only requires a sync ID. + +```rs +sync.write_op( + db, + sync.shared_delete(prisma_sync::tag::SyncId { pub_id }), + db.tag().delete(tag::id::equals(id)); +) +``` + +### Relation Records + +Relations require sync IDs for both the item and the group being related together. +Apart from that they're basically the same as shared operations. + +```rs +let (sync_params, db_params): (Vec<_>, Vec<_>) = [ + sync_db_entry!(date_created, tag_on_object::date_created) +] +.into_iter() +.unzip(); + +sync.write_ops( + db, + ( + sync.relation_create( + prisma_sync::tag_on_object::SyncId { + tag: prisma_sync::tag::SyncId { pub_id: tag_pub_id }, + object: prisma_sync::object::SyncId { pub_id: object_pub_id }, + }, + sync_params + ), + db.tag_on_object().create( + object::id::equals(object_id), + tag::id::equals(tag_id), + db_params + ) + ) +) +``` diff --git a/core/src/api/tags.rs b/core/src/api/tags.rs index 73c9c90ca..84d1e7f30 100644 --- a/core/src/api/tags.rs +++ b/core/src/api/tags.rs @@ -4,7 +4,7 @@ use sd_prisma::{ prisma::{file_path, object, tag, tag_on_object}, prisma_sync, }; -use sd_sync::OperationFactory; +use sd_sync::{option_sync_db_entry, option_sync_entry, sync_entry, OperationFactory}; use sd_utils::{msgpack, uuid_to_bytes}; use std::collections::BTreeMap; @@ -88,6 +88,22 @@ pub(crate) fn mount() -> AlphaRouter { .procedure("create", { R.with2(library()) .mutation(|(_, library), args: TagCreateArgs| async move { + // Check if tag with the same name already exists + let existing_tag = library + .db + .tag() + .find_many(vec![tag::name::equals(Some(args.name.clone()))]) + .select(tag::select!({ id })) + .exec() + .await?; + + if !existing_tag.is_empty() { + return Err(rspc::Error::new( + ErrorCode::Conflict, + "Tag with the same name already exists".to_string(), + )); + } + let created_tag = args.exec(&library).await?; invalidate_query!(library, "tags.list"); @@ -308,29 +324,30 @@ pub(crate) fn mount() -> AlphaRouter { .exec() .await?; + let (sync_params, db_params): (Vec<_>, Vec<_>) = [ + option_sync_db_entry!(args.name, tag::name), + option_sync_db_entry!(args.color, tag::color), + ] + .into_iter() + .flatten() + .unzip(); + sync.write_ops( db, ( - [ - args.name.as_ref().map(|v| (tag::name::NAME, msgpack!(v))), - args.color.as_ref().map(|v| (tag::color::NAME, msgpack!(v))), - ] - .into_iter() - .flatten() - .map(|(k, v)| { - sync.shared_update( - prisma_sync::tag::SyncId { - pub_id: tag.pub_id.clone(), - }, - k, - v, - ) - }) - .collect(), - db.tag().update( - tag::id::equals(args.id), - vec![tag::name::set(args.name), tag::color::set(args.color)], - ), + sync_params + .into_iter() + .map(|(k, v)| { + sync.shared_update( + prisma_sync::tag::SyncId { + pub_id: tag.pub_id.clone(), + }, + k, + v, + ) + }) + .collect(), + db.tag().update(tag::id::equals(args.id), db_params), ), ) .await?; diff --git a/core/src/object/tag/mod.rs b/core/src/object/tag/mod.rs index 240c5c4f2..c6a228c1e 100644 --- a/core/src/object/tag/mod.rs +++ b/core/src/object/tag/mod.rs @@ -26,6 +26,15 @@ impl TagCreateArgs { let pub_id = Uuid::new_v4().as_bytes().to_vec(); let date_created: DateTime = Utc::now().into(); + let (sync_params, db_params): (Vec<_>, Vec<_>) = [ + sync_db_entry!(self.name, tag::name), + sync_db_entry!(self.color, tag::color), + sync_db_entry!(false, tag::is_hidden), + sync_db_entry!(date_created, tag::date_created), + ] + .into_iter() + .unzip(); + sync.write_ops( db, ( @@ -33,25 +42,9 @@ impl TagCreateArgs { prisma_sync::tag::SyncId { pub_id: pub_id.clone(), }, - [ - (tag::name::NAME, msgpack!(&self.name)), - (tag::color::NAME, msgpack!(&self.color)), - (tag::is_hidden::NAME, msgpack!(false)), - ( - tag::date_created::NAME, - msgpack!(&date_created.to_rfc3339()), - ), - ], - ), - db.tag().create( - pub_id, - vec![ - tag::name::set(Some(self.name)), - tag::color::set(Some(self.color)), - tag::is_hidden::set(Some(false)), - tag::date_created::set(Some(date_created)), - ], + sync_params, ), + db.tag().create(pub_id, db_params), ), ) .await diff --git a/crates/sync/README.md b/crates/sync/README.md deleted file mode 100644 index 1098b660d..000000000 --- a/crates/sync/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# crdt-rs - -Just @brendonovich experimenting with CRDT stuff. diff --git a/interface/app/$libraryId/Layout/Sidebar/sections/Locations/ContextMenu.tsx b/interface/app/$libraryId/Layout/Sidebar/sections/Locations/ContextMenu.tsx index 3688adc4b..589ed0c9a 100644 --- a/interface/app/$libraryId/Layout/Sidebar/sections/Locations/ContextMenu.tsx +++ b/interface/app/$libraryId/Layout/Sidebar/sections/Locations/ContextMenu.tsx @@ -42,6 +42,7 @@ export const ContextMenu = ({ /> )); } + } catch (error) { toast.error(t('error_message', { error })); } @@ -66,7 +67,10 @@ export const ContextMenu = ({ dialogManager.create((dp) => ( navigate('settings/library/locations')} + onSuccess={() => { + toast.success(t('location_deleted_successfully')); + navigate('settings/library/locations'); + }} locationId={locationId} /> )); diff --git a/interface/app/$libraryId/peer/$id.tsx b/interface/app/$libraryId/peer/$id.tsx index b950f8224..62c76486e 100644 --- a/interface/app/$libraryId/peer/$id.tsx +++ b/interface/app/$libraryId/peer/$id.tsx @@ -3,18 +3,14 @@ import { NodeIdParamsSchema } from '~/app/route-schemas'; import { Icon } from '~/components'; import { useRouteTitle, useZodRouteParams } from '~/hooks'; import { hardwareModelToIcon } from '~/util/hardware'; - import { TopBarPortal } from '../TopBar/Portal'; +import StarfieldEffect from './StarfieldEffect'; // Import the StarfieldEffect component export const Component = () => { const { id: _nodeId } = useZodRouteParams(NodeIdParamsSchema); - // we encode/decode because nodeId has special characters and I'm not willing to change that rn const nodeId = decodeURIComponent(_nodeId); - const peers = usePeers(); - const peer = peers.get(nodeId); - const title = useRouteTitle(peer?.metadata?.name || 'Peer'); return ( @@ -39,8 +35,12 @@ export const Component = () => { {peer?.metadata.operating_system?.toString()}

{nodeId}

-
- Drop files here to send with Spacedrop + +
+ +
+ Drop files here to send with Spacedrop +
)} diff --git a/interface/app/$libraryId/peer/StarfieldEffect.tsx b/interface/app/$libraryId/peer/StarfieldEffect.tsx new file mode 100644 index 000000000..515ee2a21 --- /dev/null +++ b/interface/app/$libraryId/peer/StarfieldEffect.tsx @@ -0,0 +1,254 @@ +import React, { useEffect, useRef } from 'react'; + +const StarfieldEffect: React.FC = () => { + const canvasRef = useRef(null); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + const resizeCanvas = () => { + const scale = window.devicePixelRatio || 1; + const width = canvas.parentElement?.clientWidth || 800; + const height = canvas.parentElement?.clientHeight || 300; + canvas.width = width * scale; + canvas.height = height * scale; + canvas.style.width = `${width}px`; + canvas.style.height = `${height}px`; + ctx.scale(scale, scale); + }; + + resizeCanvas(); + window.addEventListener('resize', resizeCanvas); + + canvas.style.position = 'absolute'; + canvas.oncontextmenu = e => e.preventDefault(); + + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const pix = imageData.data; + + const center = { x: canvas.width / 2, y: canvas.height / 2 }; + + let mouseActive = false; + let mouseDown = false; + let mousePos = { x: center.x, y: center.y }; + + let starSpeed = 20; + const starSpeedMin = starSpeed; + const starSpeedMax = 100; + const starDistance = 5000; + + let fov = 320; + const fovMin = 210; + const fovMax = fov; + + const starHolderCount = 8000; // Increased star count + const starHolder: any[] = []; + const starBgHolder: any[] = []; + + const backgroundColor = { r: 28, g: 29, b: 37, a: 255 }; + + const clearImageData = () => { + for (let i = 0, l = pix.length; i < l; i += 4) { + pix[i] = backgroundColor.r; + pix[i + 1] = backgroundColor.g; + pix[i + 2] = backgroundColor.b; + pix[i + 3] = backgroundColor.a; + } + }; + + const setPixel = (x: number, y: number, r: number, g: number, b: number, a: number) => { + const i = (x + y * canvas.width) * 4; + pix[i] = r; + pix[i + 1] = g; + pix[i + 2] = b; + pix[i + 3] = a; + }; + + const setPixelAdditive = (x: number, y: number, r: number, g: number, b: number, a: number) => { + const i = (x + y * canvas.width) * 4; + pix[i] += r; + pix[i + 1] += g; + pix[i + 2] += b; + pix[i + 3] = a; + }; + + const drawLine = (x1: number, y1: number, x2: number, y2: number, r: number, g: number, b: number, a: number) => { + const dx = Math.abs(x2 - x1); + const dy = Math.abs(y2 - y1); + const sx = x1 < x2 ? 1 : -1; + const sy = y1 < y2 ? 1 : -1; + let err = dx - dy; + let lx = x1; + let ly = y1; + + const continueLoop = true + while (continueLoop) { + if (lx > 0 && lx < canvas.width && ly > 0 && ly < canvas.height) { + setPixel(lx, ly, r, g, b, a); + } + if (lx === x2 && ly === y2) break; + const e2 = 2 * err; + if (e2 > -dx) { + err -= dy; + lx += sx; + } + if (e2 < dy) { + err += dx; + ly += sy; + } + } + }; + + const addParticle = (x: number, y: number, z: number, ox: number, oy: number, oz: number) => { + const particle = { x, y, z, ox, oy, x2d: 0, y2d: 0, color: { r: 0, g: 0, b: 0, a: 0 }, oColor: { r: 0, g: 0, b: 0, a: 0 }, w: 0, distance: 0, distanceTotal: 0 }; + return particle; + }; + + const addParticles = () => { + let x, y, z, colorValue, particle; + for (let i = 0; i < starHolderCount / 3; i++) { + x = Math.random() * 24000 - 12000; + y = Math.random() * 4500 - 2250; + z = Math.round(Math.random() * starDistance); + colorValue = 185; // Adjusted color + particle = addParticle(x, y, z, x, y, z); + particle.color = { r: 171, g: 172, b: 185, a: 255 }; + starBgHolder.push(particle); + } + for (let i = 0; i < starHolderCount; i++) { + x = Math.random() * 10000 - 5000; + y = Math.random() * 10000 - 5000; + z = Math.round(Math.random() * starDistance); + colorValue = 185; // Adjusted color + particle = addParticle(x, y, z, x, y, z); + particle.color = { r: 171, g: 172, b: 185, a: 255 }; + particle.oColor = { r: 171, g: 172, b: 185, a: 255 }; + particle.w = 1; + particle.distance = starDistance - z; + particle.distanceTotal = Math.round(starDistance + fov - particle.w); + starHolder.push(particle); + } + }; + + const animloop = () => { + requestAnimationFrame(animloop); + render(); + }; + + const render = () => { + clearImageData(); + let star, scale; + + if (mouseActive) { + starSpeed += 2; + if (starSpeed > starSpeedMax) starSpeed = starSpeedMax; + } else { + starSpeed -= 1; + if (starSpeed < starSpeedMin) starSpeed = starSpeedMin; + } + + fov += mouseActive ? -1 : 0.5; + fov = Math.max(fovMin, Math.min(fovMax, fov)); + + const warpSpeedValue = starSpeed * (starSpeed / (starSpeedMax / 2)); + + for (const bgStar of starBgHolder) { + star = bgStar; + scale = fov / (fov + star.z); + star.x2d = star.x * scale + center.x; + star.y2d = star.y * scale + center.y; + if (star.x2d > 0 && star.x2d < canvas.width && star.y2d > 0 && star.y2d < canvas.height) { + setPixel(star.x2d | 0, star.y2d | 0, star.color.r, star.color.g, star.color.b, 255); + } + } + + for (const mainStar of starHolder) { + star = mainStar; + star.z -= starSpeed; + star.distance += starSpeed; + if (star.z < -fov + star.w) { + star.z = starDistance; + star.distance = 0; + } + + const distancePercent = star.distance / star.distanceTotal; + star.color.r = Math.floor(star.oColor.r * distancePercent); + star.color.g = Math.floor(star.oColor.g * distancePercent); + star.color.b = Math.floor(star.oColor.b * distancePercent); + + scale = fov / (fov + star.z); + star.x2d = star.x * scale + center.x; + star.y2d = star.y * scale + center.y; + + if (star.x2d > 0 && star.x2d < canvas.width && star.y2d > 0 && star.y2d < canvas.height) { + setPixelAdditive(star.x2d | 0, star.y2d | 0, star.color.r, star.color.g, star.color.b, 255); + } + + if (starSpeed !== starSpeedMin) { + const nz = star.z + warpSpeedValue; + scale = fov / (fov + nz); + const x2d = star.x * scale + center.x; + const y2d = star.y * scale + center.y; + if (x2d > 0 && x2d < canvas.width && y2d > 0 && y2d < canvas.height) { + drawLine(star.x2d | 0, star.y2d | 0, x2d | 0, y2d | 0, star.color.r, star.color.g, star.color.b, 255); + } + } + } + + ctx.putImageData(imageData, 0, 0); + + center.x += (mousePos.x - center.x) * 0.015; + if (!mouseActive) { + center.x += (canvas.width / 2 - center.x) * 0.015; + } + }; + + const getMousePos = (event: MouseEvent) => { + const rect = canvas.getBoundingClientRect(); + return { x: event.clientX - rect.left, y: event.clientY - rect.top }; + }; + + const mouseMoveHandler = (event: MouseEvent) => { + mousePos = getMousePos(event); + }; + + const mouseEnterHandler = () => { + mouseActive = true; + }; + + const mouseLeaveHandler = () => { + mouseActive = false; + mouseDown = false; + }; + + canvas.addEventListener('mousemove', mouseMoveHandler); + canvas.addEventListener('mousedown', () => { mouseDown = true; }); + canvas.addEventListener('mouseup', () => { mouseDown = false; }); + canvas.addEventListener('mouseenter', mouseEnterHandler); + canvas.addEventListener('mouseleave', mouseLeaveHandler); + + addParticles(); + animloop(); + + return () => { + canvas.removeEventListener('mousemove', mouseMoveHandler); + canvas.removeEventListener('mousedown', () => { mouseDown = true; }); + canvas.removeEventListener('mouseup', () => { mouseDown = false; }); + canvas.removeEventListener('mouseenter', mouseEnterHandler); + canvas.removeEventListener('mouseleave', mouseLeaveHandler); + window.removeEventListener('resize', resizeCanvas); + }; + }, []); + + return ( + + Drop files here to send with Spacedrop + + ); +}; + +export default StarfieldEffect; diff --git a/interface/locales/en/common.json b/interface/locales/en/common.json index 55cad6df4..8cd4b92dc 100644 --- a/interface/locales/en/common.json +++ b/interface/locales/en/common.json @@ -388,7 +388,9 @@ "local_locations": "Local Locations", "local_node": "Local Node", "location": "Location", + "location_added_successfully": "Location added successfully.", "location_connected_tooltip": "Location is being watched for changes", + "location_deleted_successfully": "Location deleted successfully.", "location_disconnected_tooltip": "Location is not being watched for changes", "location_display_name_info": "The name of this Location, this is what will be displayed in the sidebar. Will not rename the actual folder on disk.", "location_empty_notice_message": "No files found here", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d102aeed..0f94df447 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,7 +58,7 @@ importers: version: 5.4.2 vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) .github/actions/publish-artifacts: dependencies: @@ -89,7 +89,7 @@ importers: version: 0.0.0-main-dc31e5b2 '@oscartbeaumont-sd/rspc-tauri': specifier: '=0.0.0-main-dc31e5b2' - version: 0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.11) + version: 0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.12) '@remix-run/router': specifier: '=1.13.1' version: 1.13.1(patch_hash=wdk5klbkacqsve2yzdckjvtjz4) @@ -107,10 +107,10 @@ importers: version: 0.7.3(typescript@5.4.2)(zod@3.22.4) '@tanstack/react-query': specifier: ^4.36.1 - version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0) + version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) '@tauri-apps/api': specifier: next - version: 2.0.0-beta.11 + version: 2.0.0-beta.12 '@tauri-apps/plugin-dialog': specifier: 2.0.0-beta.3 version: 2.0.0-beta.3 @@ -147,7 +147,7 @@ importers: version: 2.16.0 '@tauri-apps/cli': specifier: next - version: 2.0.0-beta.16 + version: 2.0.0-beta.18 '@types/react': specifier: ^18.2.67 version: 18.2.67 @@ -162,10 +162,10 @@ importers: version: 5.4.2 vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) apps/landing: dependencies: @@ -183,10 +183,10 @@ importers: version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-three/drei': specifier: ^9.88.13 - version: 9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0) + version: 9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0) '@react-three/fiber': specifier: ^8.15.11 - version: 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0) + version: 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0) '@sd/assets': specifier: workspace:* version: link:../../packages/assets @@ -553,7 +553,7 @@ importers: version: 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.4.2) '@storybook/react-vite': specifier: ^8.0.1 - version: 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) '@storybook/testing-library': specifier: ^0.2.2 version: 0.2.2 @@ -602,7 +602,7 @@ importers: version: 5.4.2 vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) apps/web: dependencies: @@ -617,7 +617,7 @@ importers: version: link:../../interface '@tanstack/react-query': specifier: ^4.36.1 - version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0) + version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) html-to-image: specifier: ^1.11.11 version: 1.11.11 @@ -675,10 +675,10 @@ importers: version: 5.4.2 vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) interface: dependencies: @@ -735,10 +735,10 @@ importers: version: 7.107.0 '@tanstack/react-query': specifier: ^4.36.1 - version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0) + version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) '@tanstack/react-query-devtools': specifier: ^4.36.1 - version: 4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/react-table': specifier: ^8.10.7 version: 8.13.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -801,7 +801,7 @@ importers: version: 4.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-i18next: specifier: ^13.5.0 - version: 13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0) + version: 13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) react-json-view: specifier: ^1.21.3 version: 1.21.3(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -886,10 +886,10 @@ importers: version: 5.4.2 vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + version: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) vite-plugin-svgr: specifier: ^3.3.0 - version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) packages/assets: {} @@ -900,13 +900,13 @@ importers: version: 0.0.0-main-dc31e5b2 '@oscartbeaumont-sd/rspc-react': specifier: '=0.0.0-main-dc31e5b2' - version: 0.0.0-main-dc31e5b2(@oscartbeaumont-sd/rspc-client@0.0.0-main-dc31e5b2)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 0.0.0-main-dc31e5b2(@oscartbeaumont-sd/rspc-client@0.0.0-main-dc31e5b2)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react@18.2.0) '@solid-primitives/deep': specifier: ^0.2.4 version: 0.2.7(solid-js@1.8.15) '@tanstack/react-query': specifier: ^4.36.1 - version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0) + version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) '@tanstack/solid-query': specifier: ^5.17.9 version: 5.28.5(solid-js@1.8.15) @@ -962,7 +962,7 @@ importers: version: 7.3.1(eslint@8.57.0)(typescript@5.4.2) '@vitejs/plugin-react-swc': specifier: ^3.6.0 - version: 3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -998,19 +998,19 @@ importers: version: 3.2.0 vite-plugin-html: specifier: ^3.2.2 - version: 3.2.2(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 3.2.2(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) vite-plugin-i18next-loader: specifier: ^2.0.12 - version: 2.0.12(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 2.0.12(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) vite-plugin-inspect: specifier: ^0.8.3 - version: 0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) vite-plugin-solid: specifier: ^2.10.2 - version: 2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) vite-plugin-svgr: specifier: ^3.3.0 - version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + version: 3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) packages/ui: dependencies: @@ -3560,9 +3560,6 @@ packages: '@radix-ui/number@1.0.1': resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - '@radix-ui/primitive@1.0.0': - resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} - '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} @@ -3605,11 +3602,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.0.0': - resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - '@radix-ui/react-compose-refs@1.0.1': resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: @@ -3663,12 +3655,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.0.2': - resolution: {integrity: sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - '@radix-ui/react-dismissable-layer@1.0.4': resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: @@ -3843,12 +3829,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@1.0.1': - resolution: {integrity: sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - '@radix-ui/react-primitive@1.0.3': resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: @@ -3927,11 +3907,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.0.1': - resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - '@radix-ui/react-slot@1.0.2': resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: @@ -3993,11 +3968,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.0.0': - resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - '@radix-ui/react-use-callback-ref@1.0.1': resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: @@ -4016,11 +3986,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.0.2': - resolution: {integrity: sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - '@radix-ui/react-use-escape-keydown@1.0.3': resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: @@ -5114,68 +5079,72 @@ packages: resolution: {integrity: sha512-wJRY+fBUm3KpqZDHMIz5HRv+1vlnvRJ/dFxiyY3NlINTx2qXqDou5qWYcP1CuZXsd39InWVPV3FAZvno/kGCkA==} engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - '@tauri-apps/cli-darwin-arm64@2.0.0-beta.16': - resolution: {integrity: sha512-5Gif4AvpJmnyLj3HO3AEl1RVrr4ast6mDQiXoLwe75bfWq1pj9VwsS5SuSrUKtB8YBSnnclcJwkqwa6soY/xkg==} + '@tauri-apps/api@2.0.0-beta.12': + resolution: {integrity: sha512-77OvAnsExtiprnjQcvmDyZGfnIvMF/zVL5+8Vkl1R8o8E3iDtvEJZpbbH1F4dPtNa3gr4byp/5dm8hAa1+r3AA==} + engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + + '@tauri-apps/cli-darwin-arm64@2.0.0-beta.18': + resolution: {integrity: sha512-Jq49VH/UpHVkWw+qqymY1xWLMu7FF+4r5C4qVZvgm5Mkgulgf63jyCkrejdlXvOJQNm5MAHTyn2hnX6ZDeWVxA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.0.0-beta.16': - resolution: {integrity: sha512-6Cia8lGSroyoXKvfRI+Dv8Xinr27lptDzGZnd8mT9V0xPg73xcWxPKiTkuxPmLQTrQKVAurfsX3DwwgK8m9kSw==} + '@tauri-apps/cli-darwin-x64@2.0.0-beta.18': + resolution: {integrity: sha512-50UZNSPfMveKv8jH674S8r+844Ew3WFyastZU+/Q2pPCzqBU4ejdVVLT/37oZo8ip3VpLR3+TBfSn0dmdKrgUw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.16': - resolution: {integrity: sha512-1mQ0flIt0wrX4QLPwd8f1QFsuFjLPQtWuiObK63K0/YZmDS2yzKT6jnGqNCJsSiyXE2/36gKSyWh6OVpX8U7xg==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.18': + resolution: {integrity: sha512-2AI8j2LwryQ+HYMvLNx9EDRWMRwWhK/7RKdOkxgXEbLXc6AKzwVZLH6QddQvjcq8nBR6zk5wnvBjxo1DcQEBSA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.16': - resolution: {integrity: sha512-CjgwOvaslvy06m36faZ40noQaBu37gcXtD0HlCgAMofDZz7fUWQJn3xE7r8fegXmY0oMKZ9ah8dgwd5KSk+L+Q==} + '@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.18': + resolution: {integrity: sha512-HcPWBF/rJkBgzQhuUwxY8v/+44EamEqqj6rNO6j59d070e/80Uaild6a7A2LKNtvskm7zK436oDfWCyOBF/QQA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.16': - resolution: {integrity: sha512-JMtryDJckutFzNpwFgh98o9Z4Vw1pwImYmJIDLpCPSqYIfd+mrBgPZFTaGl11ZsQnllqt4FNXlYR8T+ey7ZpfQ==} + '@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.18': + resolution: {integrity: sha512-JkQ4rMtuhPFotMKsVhbRF18f3EiHsdnu7QiOy3i9idFnAv1moo7tU46ntRJtXr8FRTEHywMnnzlNo4Tg5fbZSw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.16': - resolution: {integrity: sha512-3dQGCKsbjaIzk4UM7Jf5FzBJpBJ1OfwBOwkVv2M4O7EDLNZi9brDR+I41eqyFhTabEcHJoLhtURLbD25dJuiug==} + '@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.18': + resolution: {integrity: sha512-H0whpcVNrVx3apDz2Kp+OgNcJFkTxijqEABYtHS7vXHnhmb6DNdUlKudSW0NwK8SmHJREm0KJftEszrJOoJwaw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-musl@2.0.0-beta.16': - resolution: {integrity: sha512-t+wdk/VCn8l9y1fhRQPfvZyz3Or7QEPTxXNobbUzbtckFsf/LqTxjaajOBmSGnZpoTDFvwVOmalDaylILxuM5g==} + '@tauri-apps/cli-linux-x64-musl@2.0.0-beta.18': + resolution: {integrity: sha512-pti+ttp3Kn7s0Xu4Dc+Z6idLWaQqZel8UqLlvHY21Tf/G4TgMBoyonIWRfQMRoy4DcW/8Oml5F4ZY6IdTC9dgg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.16': - resolution: {integrity: sha512-ouP0iiRMTNaKyz6c06LucMR5P585r2XJ3/GlzNWtUfP4EaP8mZAENB0ro9VZl10++7Z658MdWxSAf4+Qmkj0jQ==} + '@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.18': + resolution: {integrity: sha512-hcc2YsFTbwoctuf+mC3DSy1FVMifH02+6I8kjXXXj2DE4FguP6TwbH43oY+GB6zI3bNdRRhqaZ83GfPTLR55pw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.16': - resolution: {integrity: sha512-BiBkv3IesPNGXVaampxpB+ub0tz2sGu+6OLzxSm1QTp+2ZSw/qeXi/icvJl5azmOyee4ZWBBiuBzdVY88QH+Vw==} + '@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.18': + resolution: {integrity: sha512-8wPZ9L87m0vXNKuMWaYN7nz23Nx95yMEAFCZLrVgpvWahh+LyUho7TrHUQqzE3pGtlkhWDA64hqvuH8Sg75Jwg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.16': - resolution: {integrity: sha512-rrJeC7eAT6diQpnI3aaflhvtKyTryywbhHLG/c1QyPhdxA7Or6nflo5KzWLd6q3GQqKRbvz5dDtxwFn+XLo+rQ==} + '@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.18': + resolution: {integrity: sha512-x31LCiExR1cS/xXNs1AJEDEM7dtoE3tYWy6u7Kcl1bQBWZV5AAEofRhO1iztWCNdOm2Ddvc/Ugb8Q2khAu7+iw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@2.0.0-beta.16': - resolution: {integrity: sha512-ELaPqTekAVfTU4lFf7k/Z422DKXk/uDWi7ppI8TuQOqcXjrxlXMvv/Y1eC2tem9vMeuOIU0Jg53pOhOu0w8JIQ==} + '@tauri-apps/cli@2.0.0-beta.18': + resolution: {integrity: sha512-VcuvIyKsGVygUX1sIZmyCinzfudhcgzkFY8c9UBTbpf2/dtJADqqKEirsTXa/XPvWK64weyHFpr+i1uL7zopsg==} engines: {node: '>= 10'} hasBin: true @@ -15817,13 +15786,13 @@ snapshots: '@types/yargs': 17.0.32 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.4.2) - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) optionalDependencies: typescript: 5.4.2 @@ -16238,16 +16207,10 @@ snapshots: '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) react: 18.2.0 - '@oscartbeaumont-sd/rspc-react@0.0.0-main-dc31e5b2(@oscartbeaumont-sd/rspc-client@0.0.0-main-dc31e5b2)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@oscartbeaumont-sd/rspc-tauri@0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.12)': dependencies: '@oscartbeaumont-sd/rspc-client': 0.0.0-main-dc31e5b2 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 - - '@oscartbeaumont-sd/rspc-tauri@0.0.0-main-dc31e5b2(patch_hash=3ozd223mr7o4cioyf7af7qd56a)(@tauri-apps/api@2.0.0-beta.11)': - dependencies: - '@oscartbeaumont-sd/rspc-client': 0.0.0-main-dc31e5b2 - '@tauri-apps/api': 2.0.0-beta.11 + '@tauri-apps/api': 2.0.0-beta.12 '@phosphor-icons/core@2.0.8': {} @@ -16315,10 +16278,6 @@ snapshots: dependencies: '@babel/runtime': 7.24.0 - '@radix-ui/primitive@1.0.0': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive@1.0.1': dependencies: '@babel/runtime': 7.24.0 @@ -16363,11 +16322,6 @@ snapshots: '@types/react': 18.2.67 '@types/react-dom': 18.2.22 - '@radix-ui/react-compose-refs@1.0.0(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - react: 18.2.0 - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.0 @@ -16427,17 +16381,6 @@ snapshots: optionalDependencies: '@types/react': 18.2.67 - '@radix-ui/react-dismissable-layer@1.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.2(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.0 @@ -16529,7 +16472,7 @@ snapshots: '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.67)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.67)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.67)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.67)(react@18.2.0) '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.67)(react@18.2.0) @@ -16641,13 +16584,6 @@ snapshots: '@types/react': 18.2.67 '@types/react-dom': 18.2.22 - '@radix-ui/react-primitive@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-slot': 1.0.1(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.0 @@ -16756,12 +16692,6 @@ snapshots: '@types/react': 18.2.67 '@types/react-dom': 18.2.22 - '@radix-ui/react-slot@1.0.1(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - react: 18.2.0 - '@radix-ui/react-slot@1.0.2(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.0 @@ -16845,11 +16775,6 @@ snapshots: '@types/react': 18.2.67 '@types/react-dom': 18.2.22 - '@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - react: 18.2.0 - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.0 @@ -16865,12 +16790,6 @@ snapshots: optionalDependencies: '@types/react': 18.2.67 - '@radix-ui/react-use-escape-keydown@1.0.2(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - react: 18.2.0 - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.0 @@ -17458,13 +17377,6 @@ snapshots: nullthrows: 1.1.1 react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0) - '@react-native/virtualized-lists@0.73.4(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))': - dependencies: - invariant: 2.2.4 - nullthrows: 1.1.1 - react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0) - optional: true - '@react-navigation/bottom-tabs@6.5.20(@react-navigation/native@6.1.17(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.8.2(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native-screens@3.29.0(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)': dependencies: '@react-navigation/elements': 1.3.30(@react-navigation/native@6.1.17(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.8.2(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) @@ -17569,13 +17481,13 @@ snapshots: '@react-spring/types': 9.7.3 react: 18.2.0 - '@react-spring/three@9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0)': + '@react-spring/three@9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0)': dependencies: '@react-spring/animated': 9.6.1(react@18.2.0) '@react-spring/core': 9.6.1(react@18.2.0) '@react-spring/shared': 9.6.1(react@18.2.0) '@react-spring/types': 9.6.1 - '@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0) + '@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0) react: 18.2.0 three: 0.161.0 @@ -17592,12 +17504,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@react-three/drei@9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0)': + '@react-three/drei@9.102.6(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(@types/react@18.2.67)(@types/three@0.162.0)(immer@10.0.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.161.0)': dependencies: '@babel/runtime': 7.24.0 '@mediapipe/tasks-vision': 0.10.8 - '@react-spring/three': 9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0) - '@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0) + '@react-spring/three': 9.6.1(@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0))(react@18.2.0)(three@0.161.0) + '@react-three/fiber': 8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0) '@use-gesture/react': 10.3.0(react@18.2.0) camera-controls: 2.8.3(three@0.161.0) cross-env: 7.0.3 @@ -17625,7 +17537,7 @@ snapshots: - '@types/three' - immer - '@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)))(expo@50.0.13(@babel/core@7.24.0))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)(three@0.161.0)': + '@react-three/fiber@8.15.19(expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))))(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))))(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0)(three@0.161.0)': dependencies: '@babel/runtime': 7.24.0 '@types/react-reconciler': 0.26.7 @@ -17641,11 +17553,11 @@ snapshots: three: 0.161.0 zustand: 3.7.2(react@18.2.0) optionalDependencies: - expo: 50.0.13(@babel/core@7.24.0) - expo-asset: 9.0.2(expo@50.0.13(@babel/core@7.24.0)) - expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0)) + expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))) + expo-asset: 9.0.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))) + expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))) react-dom: 18.2.0(react@18.2.0) - react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0) + react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0) '@redux-devtools/extension@3.3.0(redux@5.0.1)': dependencies: @@ -18089,7 +18001,7 @@ snapshots: - encoding - supports-color - '@storybook/builder-vite@8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))': + '@storybook/builder-vite@8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))': dependencies: '@storybook/channels': 8.0.1 '@storybook/client-logger': 8.0.1 @@ -18108,7 +18020,7 @@ snapshots: fs-extra: 11.2.0 magic-string: 0.30.8 ts-dedent: 2.2.0 - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: @@ -18406,11 +18318,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@storybook/react-vite@8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))': + '@storybook/react-vite@8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) '@rollup/pluginutils': 5.1.0(rollup@4.13.0) - '@storybook/builder-vite': 8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + '@storybook/builder-vite': 8.0.1(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) '@storybook/node-logger': 8.0.1 '@storybook/react': 8.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.4.2) find-up: 5.0.0 @@ -18420,7 +18332,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) resolve: 1.22.8 tsconfig-paths: 4.2.0 - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -18706,10 +18618,10 @@ snapshots: '@tanstack/query-core@5.28.4': {} - '@tanstack/react-query-devtools@4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-query-devtools@4.36.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/match-sorter-utils': 8.11.8 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0) + '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) superjson: 1.13.3 @@ -18724,15 +18636,6 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0) - '@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/query-core': 4.36.1 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - optionalDependencies: - react-dom: 18.2.0(react@18.2.0) - react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0) - '@tanstack/react-table@8.13.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/table-core': 8.13.2 @@ -18763,48 +18666,50 @@ snapshots: '@tauri-apps/api@2.0.0-beta.11': {} - '@tauri-apps/cli-darwin-arm64@2.0.0-beta.16': + '@tauri-apps/api@2.0.0-beta.12': {} + + '@tauri-apps/cli-darwin-arm64@2.0.0-beta.18': optional: true - '@tauri-apps/cli-darwin-x64@2.0.0-beta.16': + '@tauri-apps/cli-darwin-x64@2.0.0-beta.18': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.16': + '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.18': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.16': + '@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.18': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.16': + '@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.18': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.16': + '@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.18': optional: true - '@tauri-apps/cli-linux-x64-musl@2.0.0-beta.16': + '@tauri-apps/cli-linux-x64-musl@2.0.0-beta.18': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.16': + '@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.18': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.16': + '@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.18': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.16': + '@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.18': optional: true - '@tauri-apps/cli@2.0.0-beta.16': + '@tauri-apps/cli@2.0.0-beta.18': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.0.0-beta.16 - '@tauri-apps/cli-darwin-x64': 2.0.0-beta.16 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-beta.16 - '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-beta.16 - '@tauri-apps/cli-linux-arm64-musl': 2.0.0-beta.16 - '@tauri-apps/cli-linux-x64-gnu': 2.0.0-beta.16 - '@tauri-apps/cli-linux-x64-musl': 2.0.0-beta.16 - '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-beta.16 - '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-beta.16 - '@tauri-apps/cli-win32-x64-msvc': 2.0.0-beta.16 + '@tauri-apps/cli-darwin-arm64': 2.0.0-beta.18 + '@tauri-apps/cli-darwin-x64': 2.0.0-beta.18 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-beta.18 + '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-beta.18 + '@tauri-apps/cli-linux-arm64-musl': 2.0.0-beta.18 + '@tauri-apps/cli-linux-x64-gnu': 2.0.0-beta.18 + '@tauri-apps/cli-linux-x64-musl': 2.0.0-beta.18 + '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-beta.18 + '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-beta.18 + '@tauri-apps/cli-win32-x64-msvc': 2.0.0-beta.18 '@tauri-apps/plugin-dialog@2.0.0-beta.3': dependencies: @@ -19504,10 +19409,10 @@ snapshots: '@virtual-grid/shared@2.0.1': {} - '@vitejs/plugin-react-swc@3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2))': + '@vitejs/plugin-react-swc@3.6.0(@swc/helpers@0.5.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2))': dependencies: '@swc/core': 1.4.8(@swc/helpers@0.5.2) - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) transitivePeerDependencies: - '@swc/helpers' @@ -22202,19 +22107,6 @@ snapshots: - expo - supports-color - expo-asset@9.0.2(expo@50.0.13(@babel/core@7.24.0)): - dependencies: - '@react-native/assets-registry': 0.73.1 - blueimp-md5: 2.19.0 - expo-constants: 15.4.5(expo@50.0.13(@babel/core@7.24.0)) - expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0)) - invariant: 2.2.4 - md5-file: 3.2.3 - transitivePeerDependencies: - - expo - - supports-color - optional: true - expo-av@13.10.5(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))): dependencies: expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))) @@ -22236,34 +22128,15 @@ snapshots: transitivePeerDependencies: - supports-color - expo-constants@15.4.5(expo@50.0.13(@babel/core@7.24.0)): - dependencies: - '@expo/config': 8.5.4 - expo: 50.0.13(@babel/core@7.24.0) - transitivePeerDependencies: - - supports-color - optional: true - expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))): dependencies: expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))) - expo-file-system@16.0.8(expo@50.0.13(@babel/core@7.24.0)): - dependencies: - expo: 50.0.13(@babel/core@7.24.0) - optional: true - expo-font@11.10.3(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))): dependencies: expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))) fontfaceobserver: 2.3.0 - expo-font@11.10.3(expo@50.0.13(@babel/core@7.24.0)): - dependencies: - expo: 50.0.13(@babel/core@7.24.0) - fontfaceobserver: 2.3.0 - optional: true - expo-haptics@12.8.1(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))): dependencies: expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))) @@ -22277,11 +22150,6 @@ snapshots: dependencies: expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))) - expo-keep-awake@12.8.2(expo@50.0.13(@babel/core@7.24.0)): - dependencies: - expo: 50.0.13(@babel/core@7.24.0) - optional: true - expo-linking@6.2.2(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))): dependencies: expo-constants: 15.4.5(expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))) @@ -22320,33 +22188,6 @@ snapshots: expo-status-bar@1.11.1: {} - expo@50.0.13(@babel/core@7.24.0): - dependencies: - '@babel/runtime': 7.24.0 - '@expo/cli': 0.17.8(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)))(expo-modules-autolinking@1.10.3) - '@expo/config': 8.5.4 - '@expo/config-plugins': 7.8.4 - '@expo/metro-config': 0.17.6(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))) - '@expo/vector-icons': 14.0.0 - babel-preset-expo: 10.0.1(@babel/core@7.24.0) - expo-asset: 9.0.2(expo@50.0.13(@babel/core@7.24.0)) - expo-file-system: 16.0.8(expo@50.0.13(@babel/core@7.24.0)) - expo-font: 11.10.3(expo@50.0.13(@babel/core@7.24.0)) - expo-keep-awake: 12.8.2(expo@50.0.13(@babel/core@7.24.0)) - expo-modules-autolinking: 1.10.3 - expo-modules-core: 1.11.12 - fbemitter: 3.0.0 - whatwg-url-without-unicode: 8.0.0-3 - transitivePeerDependencies: - - '@babel/core' - - '@react-native/babel-preset' - - bluebird - - bufferutil - - encoding - - supports-color - - utf-8-validate - optional: true - expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))): dependencies: '@babel/runtime': 7.24.0 @@ -26368,7 +26209,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-i18next@13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0))(react@18.2.0): + react-i18next@13.5.0(i18next@23.10.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.0 html-parse-stringify: 3.0.1 @@ -26376,7 +26217,7 @@ snapshots: react: 18.2.0 optionalDependencies: react-dom: 18.2.0(react@18.2.0) - react-native: 0.73.4(@babel/core@7.24.0)(react@18.2.0) + react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0))(react@18.2.0) react-intersection-observer@9.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: @@ -26629,56 +26470,6 @@ snapshots: - supports-color - utf-8-validate - react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0): - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 12.3.2 - '@react-native-community/cli-platform-android': 12.3.2 - '@react-native-community/cli-platform-ios': 12.3.2 - '@react-native/assets-registry': 0.73.1 - '@react-native/codegen': 0.73.3(@babel/preset-env@7.24.0(@babel/core@7.24.0)) - '@react-native/community-cli-plugin': 0.73.16(@babel/core@7.24.0)(@babel/preset-env@7.24.0(@babel/core@7.24.0)) - '@react-native/gradle-plugin': 0.73.4 - '@react-native/js-polyfills': 0.73.1 - '@react-native/normalize-colors': 0.73.2 - '@react-native/virtualized-lists': 0.73.4(react-native@0.73.4(@babel/core@7.24.0)(react@18.2.0)) - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - base64-js: 1.5.1 - chalk: 4.1.2 - deprecated-react-native-prop-types: 5.0.0 - event-target-shim: 5.0.1 - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-runtime: 0.80.6 - metro-source-map: 0.80.6 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 26.6.2 - promise: 8.3.0 - react: 18.2.0 - react-devtools-core: 4.28.5 - react-refresh: 0.14.0 - react-shallow-renderer: 16.15.0(react@18.2.0) - regenerator-runtime: 0.13.11 - scheduler: 0.24.0-canary-efb381bbf-20230505 - stacktrace-parser: 0.1.10 - whatwg-fetch: 3.6.20 - ws: 6.2.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate - optional: true - react-reconciler@0.27.0(react@18.2.0): dependencies: loose-envify: 1.4.0 @@ -28708,7 +28499,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-plugin-html@3.2.2(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)): + vite-plugin-html@3.2.2(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -28722,9 +28513,9 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) - vite-plugin-i18next-loader@2.0.12(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)): + vite-plugin-i18next-loader@2.0.12(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)): dependencies: dot-prop: 8.0.2 glob-all: 3.3.1 @@ -28732,9 +28523,9 @@ snapshots: marked: 12.0.1 marked-terminal: 7.0.0(marked@12.0.1) ts-deepmerge: 7.0.0 - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) - vite-plugin-inspect@0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)): + vite-plugin-inspect@0.8.3(rollup@4.13.0)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)): dependencies: '@antfu/utils': 0.7.7 '@rollup/pluginutils': 5.1.0(rollup@4.13.0) @@ -28745,12 +28536,12 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.0.0 sirv: 2.0.4 - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) transitivePeerDependencies: - rollup - supports-color - vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)): + vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)): dependencies: '@babel/core': 7.24.0 '@types/babel__core': 7.20.5 @@ -28758,36 +28549,36 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.8.15 solid-refresh: 0.6.3(solid-js@1.8.15) - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) - vitefu: 0.2.5(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) + vitefu: 0.2.5(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)) optionalDependencies: '@testing-library/jest-dom': 6.4.2 transitivePeerDependencies: - supports-color - vite-plugin-svgr@3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)): + vite-plugin-svgr@3.3.0(rollup@4.13.0)(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.13.0) '@svgr/core': 8.1.0(typescript@5.4.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.2)) - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)): + vite-tsconfig-paths@4.3.2(typescript@5.4.2)(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)): dependencies: debug: 4.3.4(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.2) optionalDependencies: - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) transitivePeerDependencies: - supports-color - typescript - vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2): + vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2): dependencies: esbuild: 0.19.12 postcss: 8.4.36 @@ -28795,12 +28586,13 @@ snapshots: optionalDependencies: '@types/node': 20.11.29 fsevents: 2.3.3 + lightningcss: 1.19.0 sass: 1.72.0 terser: 5.29.2 - vitefu@0.2.5(vite@5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2)): + vitefu@0.2.5(vite@5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2)): optionalDependencies: - vite: 5.1.6(@types/node@20.11.29)(sass@1.72.0)(terser@5.29.2) + vite: 5.1.6(@types/node@20.11.29)(lightningcss@1.19.0)(sass@1.72.0)(terser@5.29.2) vlq@1.0.1: {}