Compare commits

..

4 Commits

Author SHA1 Message Date
c93fddc343 Incremental work on rich text 2025-06-21 22:58:33 -07:00
2636746da3 Rich text attempt 1 2025-06-21 20:26:51 -07:00
6a117db0ae Layout changes, beginning of new entry page 2025-06-21 17:11:36 -07:00
25a7b4da7b Add bar on top of pages 2025-06-21 15:44:47 -07:00
10 changed files with 879 additions and 125 deletions

View File

@ -1,8 +1,7 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="Theme.EdgeToEdge.Light"> <style name="AppTheme" parent="Theme.EdgeToEdge">
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item> <item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="enforceNavigationBarContrast">false</item>
</style> </style>
<style name="Theme.App.SplashScreen" parent="Theme.SplashScreen"> <style name="Theme.App.SplashScreen" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/splashscreen_background</item> <item name="windowSplashScreenBackground">@color/splashscreen_background</item>

View File

@ -36,8 +36,8 @@ module.exports = {
"react-native-edge-to-edge", "react-native-edge-to-edge",
{ {
"android": { "android": {
"parentTheme": "Light", // "parentTheme": "Light",
"enforceNavigationBarContrast": false // "enforceNavigationBarContrast": false
} }
} }
], ],

View File

@ -8,54 +8,55 @@ import TabBarBackground from '@/components/ui/TabBarBackground';
import { lightTheme, darkTheme } from '@/constants/Colors'; import { lightTheme, darkTheme } from '@/constants/Colors';
import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
import { ThemedView } from '@/components/ThemedView'; import { ThemedView } from '@/components/ThemedView';
import { IconButton } from 'react-native-paper';
import { useNavigation } from '@react-navigation/native';
import { ThemedText } from '@/components/ThemedText';
export default function TabLayout() { export default function TabLayout() {
const colorScheme = useColorScheme(); const colorScheme = useColorScheme();
const theme = colorScheme === 'dark' ? darkTheme : lightTheme; const theme = colorScheme === 'dark' ? darkTheme : lightTheme;
const insets = useSafeAreaInsets(); const insets = useSafeAreaInsets();
const navigation = useNavigation();
return ( return (
<View style={{ flex: 1 }}>
<View
// Top status bar background
style={{
position: 'absolute',
top: 0,
left: 0,
right: 0,
height: insets.top,
backgroundColor: theme.colors.primary, // Or any custom color
zIndex: 1000,
}}
/>
<View
// Bottom navigation bar background
style={{
position: 'absolute',
bottom: 0,
left: 0,
right: 0,
height: insets.bottom,
backgroundColor: theme.colors.primary, // Or any custom color
zIndex: 1000,
}}
/>
<SafeAreaView style={{ flex: 1, paddingBottom: 5 }} edges={['top', 'left', 'right']}> <SafeAreaView style={{ flex: 1, paddingBottom: 5 }} edges={['top', 'left', 'right']}>
<ThemedView style={{ flex: 1 }}> <ThemedView style={{ flex: 1 }}>
<View style={{
backgroundColor: theme.colors.onPrimary,
position: 'absolute',
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
top: 20,
left: 20,
right: 20,
borderRadius: 12,
zIndex: 1000,
}}>
<IconButton icon="menu" size={24} onPress={() => {
navigation.dispatch({ type: 'OPEN_DRAWER' });
}} />
<ThemedText
style={{ fontSize: 15, color: theme.colors.primary, letterSpacing: 2, fontWeight: 'bold' }}
>JOURNEY</ThemedText>
<IconButton icon="magnify" size={24} onPress={() => {
console.log('Search pressed');
}} />
</View>
<Tabs <Tabs
screenOptions={{ screenOptions={{
tabBarActiveTintColor: theme.colors.primary, tabBarActiveTintColor: theme.colors.primary,
headerShown: false, headerShown: false,
tabBarLabelPosition: 'below-icon', tabBarLabelPosition: 'below-icon',
tabBarButton: HapticTab, tabBarButton: HapticTab,
tabBarBackground: TabBarBackground,
tabBarStyle: Platform.select({ tabBarStyle: Platform.select({
ios: { ios: {
// Use a transparent background on iOS to show the blur effect // Use a transparent background on iOS to show the blur effect
position: 'absolute', position: 'absolute',
}, },
default: {}, default: {
},
}), }),
}}> }}>
<Tabs.Screen <Tabs.Screen
@ -96,6 +97,5 @@ export default function TabLayout() {
</Tabs> </Tabs>
</ThemedView> </ThemedView>
</SafeAreaView> </SafeAreaView>
</View>
); );
} }

View File

@ -5,14 +5,15 @@ import { HelloWave } from '@/components/HelloWave';
import ParallaxScrollView from '@/components/ParallaxScrollView'; import ParallaxScrollView from '@/components/ParallaxScrollView';
import { ThemedText } from '@/components/ThemedText'; import { ThemedText } from '@/components/ThemedText';
import { ThemedView } from '@/components/ThemedView'; import { ThemedView } from '@/components/ThemedView';
import { List, Text, useTheme } from 'react-native-paper'; import { FAB, IconButton, List, Text, useTheme } from 'react-native-paper';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import { DATA_DIRECTORY_URI_KEY } from '@/constants/Settings'; import { DATA_DIRECTORY_URI_KEY } from '@/constants/Settings';
import { useNavigation } from 'expo-router';
export default function HomeScreen() { export default function HomeScreen() {
const [dataDirectoryUri, setDirectoryUri] = useState<string | null>(null); const [dataDirectoryUri, setDirectoryUri] = useState<string | null>(null);
const navigation = useNavigation();
useEffect(() => { useEffect(() => {
const loadDirectoryUri = async () => { const loadDirectoryUri = async () => {
try { try {
@ -30,17 +31,15 @@ export default function HomeScreen() {
const theme = useTheme(); const theme = useTheme();
return (
<ThemedView style={{ flex: 1, padding: 16 }}>
<ThemedText type="title">
My Journey
</ThemedText>
<ThemedText>{theme.colors.primary}</ThemedText>
</ThemedView>
);
}
const styles = StyleSheet.create({ const styles = StyleSheet.create({
fab: {
position: 'absolute',
margin: 16,
right: 0,
bottom: 0,
backgroundColor: theme.colors.primary, // Use your theme's primary color
},
stepContainer: { stepContainer: {
gap: 8, gap: 8,
marginBottom: 8, marginBottom: 8,
@ -52,4 +51,26 @@ const styles = StyleSheet.create({
left: 20, left: 20,
position: 'absolute', position: 'absolute',
}, },
}); });
return (
<ThemedView style={{ flex: 1, padding: 16 }}>
<View style={{
backgroundColor: theme.colors.primary,
position: 'absolute',
top: 0,
left: 0,
right: 0,
height: 100,
zIndex: 1000,
}} />
<ThemedText>Directory: {dataDirectoryUri} </ThemedText>
<FAB icon="plus" color={theme.colors.onPrimary} style={styles.fab} onPress={() => {
console.log('New entry pressed');
navigation.navigate('NewEntry' as never);
}} />
</ThemedView>
);
}

190
app/NewEntry.tsx Normal file
View File

@ -0,0 +1,190 @@
import React, { useEffect, useRef, useState } from 'react';
import { StyleSheet, ScrollView, View, TextInput, KeyboardAvoidingView, Platform, Keyboard } from 'react-native';
import { Button, Text, useTheme, Appbar, IconButton, Chip, Surface } from 'react-native-paper';
import { ThemedView } from '@/components/ThemedView';
import { ThemedText } from '@/components/ThemedText';
import { useRouter } from 'expo-router';
import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
import { StatusBar } from 'expo-status-bar';
import Wrapper from '@/components/ui/Wrapper';
import { format } from 'date-fns';
import { useEditor, EditorContent } from 'rn-text-editor';
export default function NewEntryScreen() {
const navigation = useRouter();
const theme = useTheme();
const entryDate = format(new Date(), 'LLL d, h:mm aaa');
const [entryText, setEntryText] = useState<string>('');
const [stats, setStats] = useState<{ words: number; characters: number }>({
words: 0,
characters: 0,
});
useEffect(() => {
const words = entryText.trim().split(/\s+/).filter(Boolean).length;
const characters = entryText.length;
setStats({ words, characters });
}
, [entryText]);
const inputRef = React.useRef<TextInput>(null) as React.RefObject<TextInput>;
const editor = useEditor({
enableCoreExtensions: true,
onUpdate(props) {
const newText = props.editor.getNativeText();
setEntryText(newText);
}, // Add these properties to improve compatibility
});
const insets = useSafeAreaInsets();
const [keyboardHeight, setKeyboardHeight] = useState(0);
useEffect(() => {
const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
setKeyboardHeight(Keyboard.metrics()?.height || 0);
});
const keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', () => {
setKeyboardHeight(0);
});
return () => {
keyboardDidShowListener.remove();
keyboardDidHideListener.remove();
};
}, []);
return (
<Wrapper>
<Appbar.Header style={{
backgroundColor: theme.colors.primary,
borderBottomWidth: 2,
borderBottomColor: theme.colors.backdrop,
}}>
{
stats['characters'] === 0 ?
<Appbar.BackAction onPress={() => {
navigation.back();
}} />
:
<Appbar.Action icon="check" onPress={() => {
navigation.back();
}} />
}
<Appbar.Content title={entryDate}
titleStyle={{
fontSize: 16, fontWeight: 'bold',
}}
/>
<Appbar.Action icon="calendar" onPress={() => { }} />
<Appbar.Action icon="tag" onPress={() => { }} />
</Appbar.Header>
<Text
style={{
fontSize: 10,
backgroundColor: theme.colors.accent,
color: theme.colors.onTertiary,
paddingVertical: 2,
textAlign: 'center',
}}>
{stats.words} words · {stats.characters} characters
</Text>
<EditorContent
editor={editor}
placeholder="Write something..."
inputRef={inputRef}
autoFocus
/>
{/*
<TextInput
ref={inputRef}
style={{
flex: 1,
fontSize: 14,
color: theme.colors.onSurface,
backgroundColor: theme.colors.surface,
padding: 10,
textAlignVertical: 'top',
}}
cursorColor={theme.colors.primary}
multiline
autoFocus
autoCapitalize='none'
placeholder="Write your entry here..."
value={entryText}
onChangeText={setEntryText}
/> */}
<ScrollView
horizontal={true}
keyboardShouldPersistTaps="always"
style={{
position: 'absolute',
bottom: keyboardHeight + insets.bottom,
left: 0,
right: 0,
flexDirection: 'row',
}}>
<View
pointerEvents='box-none'
style={{
borderColor: theme.colors.primary,
borderWidth: 1,
borderRadius: 24,
margin: 5,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-around',
backgroundColor: theme.colors.surface,
shadowColor: '#000',
shadowOffset: {
width: 0,
height: 2,
},
shadowOpacity: 0.1,
shadowRadius: 8,
elevation: 4,
}}>
< IconButton
icon="format-bold"
size={24} accessible={false}
onPress={() => {
console.log('Bold button pressed'); inputRef.current?.focus();
}}
/>
<IconButton
icon="format-italic"
size={24}
onPress={() => {
console.log('Italic button pressed');
}}
/>
<IconButton
icon="format-underline"
size={24}
onPress={() => {
console.log('Underline button pressed');
}}
/>
</View>
</ScrollView>
</Wrapper >
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingHorizontal: 1,
},
editorContainer: {
paddingHorizontal: 5,
flex: 1
},
box: {
width: 60,
height: 60,
marginVertical: 20,
},
});

View File

@ -1,10 +1,10 @@
import { createDrawerNavigator } from '@react-navigation/drawer'; import { createDrawerNavigator } from '@react-navigation/drawer';
import { createNativeStackNavigator } from '@react-navigation/native-stack'; import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { useFonts } from 'expo-font'; import { useFonts } from 'expo-font';
import { Stack } from 'expo-router';
import { StatusBar } from 'expo-status-bar'; import { StatusBar } from 'expo-status-bar';
import 'react-native-reanimated'; import 'react-native-reanimated';
import { PaperProvider } from 'react-native-paper'; import { IconButton, PaperProvider } from 'react-native-paper';
import * as NavigationBar from 'expo-navigation-bar'; import * as NavigationBar from 'expo-navigation-bar';
import { Platform, useColorScheme } from 'react-native'; import { Platform, useColorScheme } from 'react-native';
@ -14,22 +14,126 @@ import { IconSymbol } from '@/components/ui/IconSymbol';
import { TouchableOpacity, View } from 'react-native'; import { TouchableOpacity, View } from 'react-native';
import NullComponent from '@/components/NullComponent'; import NullComponent from '@/components/NullComponent';
import { useEffect } from 'react'; import { useEffect } from 'react';
import NewEntryScreen from './NewEntry';
import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
// Import your tab screens directly
import HomeScreen from './HomeScreen';
import CalendarScreen from './(tabs)/calendar';
import MediaScreen from './(tabs)/media';
import AtlasScreen from './(tabs)/atlas';
import TodayScreen from './(tabs)/today';
import { ThemedView } from '@/components/ThemedView';
import { useNavigation } from 'expo-router';
import { ThemedText } from '@/components/ThemedText';
import Wrapper from '@/components/ui/Wrapper';
const Drawer = createDrawerNavigator(); const Drawer = createDrawerNavigator();
const RootStack = createNativeStackNavigator(); const RootStack = createNativeStackNavigator();
const Tab = createBottomTabNavigator();
function TabsNavigator() { function TabsNavigator() {
const colorScheme = useColorScheme();
const theme = colorScheme === 'dark' ? darkTheme : lightTheme;
const navigation = useNavigation();
const insets = useSafeAreaInsets();
return ( return (
<Stack> <Wrapper>
<Stack.Screen name="(tabs)" options={{ headerShown: false }} /> <SafeAreaView
<Stack.Screen name="+not-found" /> edges={['top', 'left', 'right']}
</Stack> style={{
flex: 1,
}}>
<View style={{
backgroundColor: theme.colors.onPrimary,
position: 'absolute',
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
top: insets.top + 20,
left: 20,
right: 20,
borderRadius: 12,
zIndex: 1000,
}}>
<IconButton icon="menu" size={24} onPress={() => {
navigation.dispatch({ type: 'OPEN_DRAWER' });
}} />
<ThemedText
style={{ fontSize: 15, color: theme.colors.primary, letterSpacing: 2, fontWeight: 'bold' }}
>JOURNEY</ThemedText>
<IconButton icon="magnify" size={24} onPress={() => {
console.log('Search pressed');
}} />
</View><Tab.Navigator
screenOptions={{
tabBarActiveTintColor: theme.colors.primary,
headerShown: false,
tabBarStyle: Platform.select({
ios: {
position: 'absolute',
},
default: {},
}),
}}
>
<Tab.Screen
name="Journey"
component={HomeScreen}
options={{
tabBarIcon: ({ color, size }) => (
<IconSymbol name="book" size={size} color={color} />
),
}}
/>
<Tab.Screen
name="Calendar"
component={CalendarScreen}
options={{
tabBarIcon: ({ color, size }) => (
<IconSymbol name="calendar-today" size={size} color={color} />
),
}}
/>
<Tab.Screen
name="Media"
component={MediaScreen}
options={{
tabBarIcon: ({ color, size }) => (
<IconSymbol name="photo" size={size} color={color} />
),
}}
/>
<Tab.Screen
name="Atlas"
component={AtlasScreen}
options={{
tabBarIcon: ({ color, size }) => (
<IconSymbol name="map" size={size} color={color} />
),
}}
/>
<Tab.Screen
name="Today"
component={TodayScreen}
options={{
tabBarIcon: ({ color, size }) => (
<IconSymbol name="today" size={size} color={color} />
),
}}
/>
</Tab.Navigator>
</SafeAreaView>
</Wrapper>
); );
} }
function DrawerNavigator() { function DrawerNavigator() {
const colorScheme = useColorScheme(); const colorScheme = useColorScheme();
const theme = colorScheme === 'dark' ? darkTheme : lightTheme; const theme = colorScheme === 'dark' ? darkTheme : lightTheme;
return ( return (
<Drawer.Navigator> <Drawer.Navigator>
<Drawer.Screen <Drawer.Screen
@ -53,23 +157,23 @@ function DrawerNavigator() {
<Drawer.Screen <Drawer.Screen
name="SettingsDrawerItem" name="SettingsDrawerItem"
component={NullComponent} component={NullComponent}
options={({ navigation }) => ({ options={{
title: 'Settings', title: 'Settings',
headerShown: false, headerShown: false,
drawerLabel: 'Settings', drawerLabel: 'Settings',
drawerIcon: ({ color }) => ( drawerIcon: ({ color }) => (
<IconSymbol name="settings" size={24} color={color} /> <IconSymbol name="settings" size={24} color={color} />
), ),
})} }}
listeners={({ navigation }) => ({ listeners={({ navigation }) => ({
drawerItemPress: (e) => { drawerItemPress: (e) => {
e.preventDefault(); e.preventDefault();
// Navigate to the Settings screen in the root stack
navigation.getParent()?.navigate('Settings'); navigation.getParent()?.navigate('Settings');
navigation.dispatch({ type: 'CLOSE_DRAWER' }); navigation.dispatch({ type: 'CLOSE_DRAWER' });
}, },
})} })}
/></Drawer.Group> />
</Drawer.Group>
</Drawer.Navigator> </Drawer.Navigator>
); );
} }
@ -87,19 +191,18 @@ export default function RootLayout() {
} }
}, [colorScheme]); }, [colorScheme]);
if (!loaded) { if (!loaded) {
return null; return null;
} }
return ( return (
<PaperProvider theme={theme}> <PaperProvider theme={theme}>
<RootStack.Navigator> <RootStack.Navigator>
<RootStack.Screen <RootStack.Screen
name="Main" name="Main"
component={DrawerNavigator} component={DrawerNavigator}
options={{ headerShown: false }} options={{ headerShown: false }}
/> />
<RootStack.Screen <RootStack.Screen
name="Settings" name="Settings"
@ -122,6 +225,13 @@ export default function RootLayout() {
), ),
})} })}
/> />
<RootStack.Screen
name="NewEntry"
component={NewEntryScreen}
options={{
headerShown: false,
}}
/>
</RootStack.Navigator> </RootStack.Navigator>
<StatusBar style={theme.dark ? 'light' : 'dark'} /> <StatusBar style={theme.dark ? 'light' : 'dark'} />
</PaperProvider> </PaperProvider>

24
components/ui/Wrapper.tsx Normal file
View File

@ -0,0 +1,24 @@
import { View } from "react-native";
import { ThemedView } from "../ThemedView";
import { SafeAreaView, useSafeAreaInsets } from "react-native-safe-area-context";
import { useTheme } from "react-native-paper";
export default function Wrapper({ children }: { children: React.ReactNode }) {
const insets = useSafeAreaInsets();
const theme = useTheme();
return (
<ThemedView style={{ flex: 1 }}>
<View style={{
backgroundColor: theme.colors.primary,
position: 'absolute',
top: 0,
left: 0,
right: 0,
height: insets.top,
zIndex: 1000,
}} />
{children}
</ThemedView >
);
}

View File

@ -22,7 +22,7 @@ export const lightTheme = {
...MD3LightTheme.colors, ...MD3LightTheme.colors,
...brandColors, ...brandColors,
// Additional custom colors // Additional custom colors
accent: '#5856D6', accent: '#278CA2',
warning: '#FF9500', warning: '#FF9500',
success: '#34C759', success: '#34C759',
info: '#007AFF', info: '#007AFF',
@ -49,7 +49,7 @@ export const darkTheme = {
onSurface: '#FFFFFF', onSurface: '#FFFFFF',
onError: '#000000', onError: '#000000',
// Additional custom colors // Additional custom colors
accent: '#5E5CE6', accent: '#278CA2',
warning: '#FF9F0A', warning: '#FF9F0A',
success: '#30D158', success: '#30D158',
info: '#0A84FF', info: '#0A84FF',

407
package-lock.json generated
View File

@ -18,6 +18,7 @@
"@react-navigation/drawer": "^7.4.2", "@react-navigation/drawer": "^7.4.2",
"@react-navigation/elements": "^2.3.8", "@react-navigation/elements": "^2.3.8",
"@react-navigation/native": "^7.1.6", "@react-navigation/native": "^7.1.6",
"date-fns": "^4.1.0",
"expo": "~53.0.11", "expo": "~53.0.11",
"expo-blur": "~14.1.5", "expo-blur": "~14.1.5",
"expo-constants": "~17.1.6", "expo-constants": "~17.1.6",
@ -34,18 +35,22 @@
"expo-symbols": "~0.4.5", "expo-symbols": "~0.4.5",
"expo-system-ui": "~5.0.8", "expo-system-ui": "~5.0.8",
"expo-web-browser": "~14.1.6", "expo-web-browser": "~14.1.6",
"marked": "^15.0.12",
"react": "19.0.0", "react": "19.0.0",
"react-dom": "19.0.0", "react-dom": "19.0.0",
"react-native": "0.79.3", "react-native": "0.79.3",
"react-native-edge-to-edge": "1.6.0", "react-native-edge-to-edge": "1.6.0",
"react-native-gesture-handler": "~2.24.0", "react-native-gesture-handler": "~2.24.0",
"react-native-paper": "^5.14.5", "react-native-paper": "^5.14.5",
"react-native-pell-rich-editor": "^1.9.0",
"react-native-reanimated": "~3.17.4", "react-native-reanimated": "~3.17.4",
"react-native-safe-area-context": "5.4.0", "react-native-safe-area-context": "5.4.0",
"react-native-screens": "~4.11.1", "react-native-screens": "~4.11.1",
"react-native-vector-icons": "^10.2.0", "react-native-vector-icons": "^10.2.0",
"react-native-web": "~0.20.0", "react-native-web": "~0.20.0",
"react-native-webview": "13.13.5" "react-native-webview": "13.13.5",
"rn-text-editor": "^0.2.0",
"turndown": "^7.2.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.25.2", "@babel/core": "^7.25.2",
@ -2931,6 +2936,12 @@
"@jridgewell/sourcemap-codec": "^1.4.14" "@jridgewell/sourcemap-codec": "^1.4.14"
} }
}, },
"node_modules/@mixmark-io/domino": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz",
"integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==",
"license": "BSD-2-Clause"
},
"node_modules/@napi-rs/wasm-runtime": { "node_modules/@napi-rs/wasm-runtime": {
"version": "0.2.11", "version": "0.2.11",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz",
@ -5391,6 +5402,12 @@
"nanoid": "^3.3.11" "nanoid": "^3.3.11"
} }
}, },
"node_modules/@remirror/core-constants": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz",
"integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==",
"license": "MIT"
},
"node_modules/@rtsao/scc": { "node_modules/@rtsao/scc": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@ -5608,6 +5625,28 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/linkify-it": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
"integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
"license": "MIT"
},
"node_modules/@types/markdown-it": {
"version": "14.1.2",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
"integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
"license": "MIT",
"dependencies": {
"@types/linkify-it": "^5",
"@types/mdurl": "^2"
}
},
"node_modules/@types/mdurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
"integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
"license": "MIT"
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "24.0.3", "version": "24.0.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz",
@ -7702,6 +7741,12 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/crelt": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
"license": "MIT"
},
"node_modules/cross-fetch": { "node_modules/cross-fetch": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz",
@ -7804,6 +7849,16 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/date-fns": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
"integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/kossnocorp"
}
},
"node_modules/dayjs": { "node_modules/dayjs": {
"version": "1.11.13", "version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
@ -8093,6 +8148,18 @@
"once": "^1.4.0" "once": "^1.4.0"
} }
}, },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/env-editor": { "node_modules/env-editor": {
"version": "0.4.2", "version": "0.4.2",
"resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
@ -11519,6 +11586,15 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/linkify-it": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
"integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
"license": "MIT",
"dependencies": {
"uc.micro": "^2.0.0"
}
},
"node_modules/locate-path": { "node_modules/locate-path": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@ -11852,6 +11928,35 @@
"tmpl": "1.0.5" "tmpl": "1.0.5"
} }
}, },
"node_modules/markdown-it": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
"integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1",
"entities": "^4.4.0",
"linkify-it": "^5.0.0",
"mdurl": "^2.0.0",
"punycode.js": "^2.3.1",
"uc.micro": "^2.1.0"
},
"bin": {
"markdown-it": "bin/markdown-it.mjs"
}
},
"node_modules/marked": {
"version": "15.0.12",
"resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
"integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/marky": { "node_modules/marky": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
@ -11868,6 +11973,12 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/mdurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
"integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
"license": "MIT"
},
"node_modules/media-typer": { "node_modules/media-typer": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -12900,6 +13011,12 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/orderedmap": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz",
"integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==",
"license": "MIT"
},
"node_modules/own-keys": { "node_modules/own-keys": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
@ -13279,6 +13396,211 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/prosemirror-changeset": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz",
"integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==",
"license": "MIT",
"dependencies": {
"prosemirror-transform": "^1.0.0"
}
},
"node_modules/prosemirror-collab": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz",
"integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==",
"license": "MIT",
"dependencies": {
"prosemirror-state": "^1.0.0"
}
},
"node_modules/prosemirror-commands": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz",
"integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.0.0",
"prosemirror-state": "^1.0.0",
"prosemirror-transform": "^1.10.2"
}
},
"node_modules/prosemirror-dropcursor": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz",
"integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==",
"license": "MIT",
"dependencies": {
"prosemirror-state": "^1.0.0",
"prosemirror-transform": "^1.1.0",
"prosemirror-view": "^1.1.0"
}
},
"node_modules/prosemirror-gapcursor": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz",
"integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==",
"license": "MIT",
"dependencies": {
"prosemirror-keymap": "^1.0.0",
"prosemirror-model": "^1.0.0",
"prosemirror-state": "^1.0.0",
"prosemirror-view": "^1.0.0"
}
},
"node_modules/prosemirror-history": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz",
"integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==",
"license": "MIT",
"dependencies": {
"prosemirror-state": "^1.2.2",
"prosemirror-transform": "^1.0.0",
"prosemirror-view": "^1.31.0",
"rope-sequence": "^1.3.0"
}
},
"node_modules/prosemirror-inputrules": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz",
"integrity": "sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==",
"license": "MIT",
"dependencies": {
"prosemirror-state": "^1.0.0",
"prosemirror-transform": "^1.0.0"
}
},
"node_modules/prosemirror-keymap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz",
"integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==",
"license": "MIT",
"dependencies": {
"prosemirror-state": "^1.0.0",
"w3c-keyname": "^2.2.0"
}
},
"node_modules/prosemirror-markdown": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz",
"integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==",
"license": "MIT",
"dependencies": {
"@types/markdown-it": "^14.0.0",
"markdown-it": "^14.0.0",
"prosemirror-model": "^1.25.0"
}
},
"node_modules/prosemirror-menu": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz",
"integrity": "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==",
"license": "MIT",
"dependencies": {
"crelt": "^1.0.0",
"prosemirror-commands": "^1.0.0",
"prosemirror-history": "^1.0.0",
"prosemirror-state": "^1.0.0"
}
},
"node_modules/prosemirror-model": {
"version": "1.25.1",
"resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.1.tgz",
"integrity": "sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==",
"license": "MIT",
"dependencies": {
"orderedmap": "^2.0.0"
}
},
"node_modules/prosemirror-schema-basic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz",
"integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.25.0"
}
},
"node_modules/prosemirror-schema-list": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz",
"integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.0.0",
"prosemirror-state": "^1.0.0",
"prosemirror-transform": "^1.7.3"
}
},
"node_modules/prosemirror-state": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz",
"integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.0.0",
"prosemirror-transform": "^1.0.0",
"prosemirror-view": "^1.27.0"
}
},
"node_modules/prosemirror-tables": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.7.1.tgz",
"integrity": "sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==",
"license": "MIT",
"dependencies": {
"prosemirror-keymap": "^1.2.2",
"prosemirror-model": "^1.25.0",
"prosemirror-state": "^1.4.3",
"prosemirror-transform": "^1.10.3",
"prosemirror-view": "^1.39.1"
}
},
"node_modules/prosemirror-trailing-node": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.9.tgz",
"integrity": "sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==",
"license": "MIT",
"dependencies": {
"@remirror/core-constants": "^2.0.2",
"escape-string-regexp": "^4.0.0"
},
"peerDependencies": {
"prosemirror-model": "^1.22.1",
"prosemirror-state": "^1.4.2",
"prosemirror-view": "^1.33.8"
}
},
"node_modules/prosemirror-transform": {
"version": "1.10.4",
"resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz",
"integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.21.0"
}
},
"node_modules/prosemirror-utils": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/prosemirror-utils/-/prosemirror-utils-1.2.2.tgz",
"integrity": "sha512-7a2MPf99oCW8/587rQYI1/snX71Ban40+apr1hLkY8TmU9YXd7JeR6QsmktcTisJURO3WRjxIia4lTMsYgZVOw==",
"license": "Apache-2.0",
"peerDependencies": {
"prosemirror-model": "^1.19.2",
"prosemirror-state": "^1.4.3"
}
},
"node_modules/prosemirror-view": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.40.0.tgz",
"integrity": "sha512-2G3svX0Cr1sJjkD/DYWSe3cfV5VPVTBOxI9XQEGWJDFEpsZb/gh4MV29ctv+OJx2RFX4BLt09i+6zaGM/ldkCw==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.20.0",
"prosemirror-state": "^1.0.0",
"prosemirror-transform": "^1.1.0"
}
},
"node_modules/pump": { "node_modules/pump": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
@ -13298,6 +13620,15 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/punycode.js": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
"integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/qrcode-terminal": { "node_modules/qrcode-terminal": {
"version": "0.11.0", "version": "0.11.0",
"resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz",
@ -13661,6 +13992,16 @@
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/react-native-pell-rich-editor": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/react-native-pell-rich-editor/-/react-native-pell-rich-editor-1.9.0.tgz",
"integrity": "sha512-BKzlu++FySzPXrb5bczD8b/ZZJtfzcD4z7FvW7TrH+4OENEQtaIiEMfmb5N09Kv3YVJcfm8fut8Y+GLNAcCQHA==",
"license": "MIT",
"peerDependencies": {
"react-native": ">=0.50.0",
"react-native-webview": ">=7.5.2"
}
},
"node_modules/react-native-reanimated": { "node_modules/react-native-reanimated": {
"version": "3.17.5", "version": "3.17.5",
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.17.5.tgz", "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.17.5.tgz",
@ -14247,6 +14588,49 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/rn-text-editor": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/rn-text-editor/-/rn-text-editor-0.2.0.tgz",
"integrity": "sha512-8CKvcpaaZg8RWbymD/3/MIVWlQta8YMAYHuG2hYJCBJpBhBO+NlMERt2pVvQ4bzcwZ+AqQxJk8azxLACfRNEnA==",
"license": "MIT",
"workspaces": [
"example"
],
"dependencies": {
"prosemirror-changeset": "^2.2.1",
"prosemirror-collab": "^1.3.1",
"prosemirror-commands": "^1.5.2",
"prosemirror-dropcursor": "^1.8.1",
"prosemirror-gapcursor": "^1.3.2",
"prosemirror-history": "^1.3.2",
"prosemirror-inputrules": "^1.3.0",
"prosemirror-keymap": "^1.2.2",
"prosemirror-markdown": "^1.12.0",
"prosemirror-menu": "^1.2.4",
"prosemirror-model": "^1.19.4",
"prosemirror-schema-basic": "^1.2.2",
"prosemirror-schema-list": "^1.3.0",
"prosemirror-state": "^1.4.3",
"prosemirror-tables": "^1.3.5",
"prosemirror-trailing-node": "^2.0.7",
"prosemirror-transform": "^1.8.0",
"prosemirror-utils": "^1.2.1-0",
"prosemirror-view": "^1.32.7"
},
"engines": {
"node": ">= 18.0.0"
},
"peerDependencies": {
"react": "*",
"react-native": "*"
}
},
"node_modules/rope-sequence": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
"integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
"license": "MIT"
},
"node_modules/run-parallel": { "node_modules/run-parallel": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@ -15654,6 +16038,15 @@
"license": "0BSD", "license": "0BSD",
"optional": true "optional": true
}, },
"node_modules/turndown": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz",
"integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==",
"license": "MIT",
"dependencies": {
"@mixmark-io/domino": "^2.2.0"
}
},
"node_modules/type-check": { "node_modules/type-check": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@ -15817,6 +16210,12 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/uc.micro": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
"integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
"license": "MIT"
},
"node_modules/unbox-primitive": { "node_modules/unbox-primitive": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
@ -16063,6 +16462,12 @@
"integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/w3c-keyname": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
"integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
"license": "MIT"
},
"node_modules/walker": { "node_modules/walker": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",

View File

@ -13,6 +13,7 @@
"dependencies": { "dependencies": {
"@expo/ngrok": "^4.1.3", "@expo/ngrok": "^4.1.3",
"@expo/vector-icons": "^14.1.0", "@expo/vector-icons": "^14.1.0",
"@react-native-async-storage/async-storage": "2.1.2",
"@react-native-documents/picker": "^10.1.3", "@react-native-documents/picker": "^10.1.3",
"@react-native-masked-view/masked-view": "0.3.2", "@react-native-masked-view/masked-view": "0.3.2",
"@react-native-vector-icons/material-design-icons": "^12.0.1", "@react-native-vector-icons/material-design-icons": "^12.0.1",
@ -20,43 +21,47 @@
"@react-navigation/drawer": "^7.4.2", "@react-navigation/drawer": "^7.4.2",
"@react-navigation/elements": "^2.3.8", "@react-navigation/elements": "^2.3.8",
"@react-navigation/native": "^7.1.6", "@react-navigation/native": "^7.1.6",
"date-fns": "^4.1.0",
"expo": "~53.0.11", "expo": "~53.0.11",
"expo-blur": "~14.1.5", "expo-blur": "~14.1.5",
"expo-constants": "~17.1.6", "expo-constants": "~17.1.6",
"expo-dev-client": "~5.2.0", "expo-dev-client": "~5.2.0",
"expo-file-system": "~18.1.10",
"expo-font": "~13.3.1", "expo-font": "~13.3.1",
"expo-haptics": "~14.1.4", "expo-haptics": "~14.1.4",
"expo-image": "~2.3.0", "expo-image": "~2.3.0",
"expo-linking": "~7.1.5", "expo-linking": "~7.1.5",
"expo-navigation-bar": "~4.2.6",
"expo-router": "~5.1.0", "expo-router": "~5.1.0",
"expo-splash-screen": "~0.30.9", "expo-splash-screen": "~0.30.9",
"expo-status-bar": "~2.2.3", "expo-status-bar": "~2.2.3",
"expo-symbols": "~0.4.5", "expo-symbols": "~0.4.5",
"expo-system-ui": "~5.0.8", "expo-system-ui": "~5.0.8",
"expo-web-browser": "~14.1.6", "expo-web-browser": "~14.1.6",
"marked": "^15.0.12",
"react": "19.0.0", "react": "19.0.0",
"react-dom": "19.0.0", "react-dom": "19.0.0",
"react-native": "0.79.3", "react-native": "0.79.3",
"react-native-edge-to-edge": "1.6.0",
"react-native-gesture-handler": "~2.24.0", "react-native-gesture-handler": "~2.24.0",
"react-native-paper": "^5.14.5", "react-native-paper": "^5.14.5",
"react-native-pell-rich-editor": "^1.9.0",
"react-native-reanimated": "~3.17.4", "react-native-reanimated": "~3.17.4",
"react-native-safe-area-context": "5.4.0", "react-native-safe-area-context": "5.4.0",
"react-native-screens": "~4.11.1", "react-native-screens": "~4.11.1",
"react-native-vector-icons": "^10.2.0", "react-native-vector-icons": "^10.2.0",
"react-native-web": "~0.20.0", "react-native-web": "~0.20.0",
"react-native-webview": "13.13.5", "react-native-webview": "13.13.5",
"expo-file-system": "~18.1.10", "rn-text-editor": "^0.2.0",
"@react-native-async-storage/async-storage": "2.1.2", "turndown": "^7.2.0"
"expo-navigation-bar": "~4.2.6",
"react-native-edge-to-edge": "1.6.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.25.2", "@babel/core": "^7.25.2",
"@react-native-community/cli": "latest",
"@types/react": "~19.0.10", "@types/react": "~19.0.10",
"eslint": "^9.25.0", "eslint": "^9.25.0",
"eslint-config-expo": "~9.2.0", "eslint-config-expo": "~9.2.0",
"typescript": "~5.8.3", "typescript": "~5.8.3"
"@react-native-community/cli": "latest"
}, },
"private": true "private": true
} }