Implement 10tap

This commit is contained in:
ryan 2025-06-22 14:27:36 -07:00
parent c93fddc343
commit 07a328245f
6 changed files with 959 additions and 124 deletions

View File

@ -1,20 +1,174 @@
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 EditorMenu from '@/components/EditorMenu';
import { format } from 'date-fns';
import { useEditor, EditorContent } from 'rn-text-editor';
// import { useRouter } from 'expo-router';
// import React, { useEffect, useState } from 'react';
// import { Keyboard, ScrollView, StyleSheet, TextInput } from 'react-native';
import { Appbar, useTheme } from 'react-native-paper';
// import { useSafeAreaInsets } from 'react-native-safe-area-context';
// import { EditorContent, useEditor } 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 editor = useEditor({
// enableCoreExtensions: true,
// onUpdate(props) {
// const newText = props.editor.getNativeText();
// // setEntryText(newText);
// },
// });
// 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}
// style={{
// paddingHorizontal: 15,
// }}
// 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 + 10,
// left: 10,
// right: 0,
// flexDirection: 'row',
// }}>
// <EditorMenu editor={editor} />
// {/* <View
// pointerEvents='box-none'
// style={{
// borderColor: theme.colors.primary,
// borderWidth: 1,
// borderRadius: 24,
// 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,
// },
// });
import Wrapper from '@/components/ui/Wrapper';
import { CoreBridge, RichText, TenTapStartKit, Toolbar, useEditorBridge, useEditorContent } from '@10play/tentap-editor';
import { useRouter } from 'expo-router';
import React, { useEffect, useState } from 'react';
import { Keyboard, View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
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,
@ -25,18 +179,13 @@ export default function NewEntryScreen() {
const words = entryText.trim().split(/\s+/).filter(Boolean).length;
const characters = entryText.length;
setStats({ words, characters });
console.log('Entry text updated:', entryText);
}
, [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 navigation = useRouter();
const theme = useTheme();
const entryDate = format(new Date(), 'LLL d, h:mm aaa');
const insets = useSafeAreaInsets();
const [keyboardHeight, setKeyboardHeight] = useState(0);
@ -54,6 +203,32 @@ export default function NewEntryScreen() {
};
}, []);
const editor = useEditorBridge({
autofocus: true,
avoidIosKeyboard: true,
theme: {
webviewContainer: {
paddingLeft: 15,
backgroundColor: theme.colors.surface,
},
},
bridgeExtensions: [
...TenTapStartKit,
CoreBridge.configureCSS(`
* {
font-size: 12px;
}
`), // Custom font
],
});
const content = {
html: useEditorContent(editor, { type: 'html' }),
text: useEditorContent(editor, { type: 'text' }),
};
useEffect(() => {
content && setEntryText(content.text ?? '');
}, [content]);
return (
<Wrapper>
<Appbar.Header style={{
@ -79,112 +254,23 @@ export default function NewEntryScreen() {
<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"
{/* <SafeAreaView style={{ flex: 1, backgroundColor: theme.colors.background }}> */}
<RichText editor={editor} />
<View
// horizontal={true}
// keyboardShouldPersistTaps="always"
style={{
position: 'absolute',
bottom: keyboardHeight + insets.bottom,
left: 0,
left: 10,
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');
}}
/>
<Toolbar editor={editor} hidden={false} />
</View>
</ScrollView>
</Wrapper >
{/* </SafeAreaView> */}
</Wrapper>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingHorizontal: 1,
},
editorContainer: {
paddingHorizontal: 5,
flex: 1
},
box: {
width: 60,
height: 60,
marginVertical: 20,
},
});
};

File diff suppressed because one or more lines are too long

81
components/EditorMenu.tsx Normal file
View File

@ -0,0 +1,81 @@
import React, { Fragment, useEffect, useState } from 'react';
import { View } from 'react-native';
import { Divider } from 'react-native-paper';
import { type Editor } from 'rn-text-editor';
import MenuButton from './EditorMenuButton';
interface EditorMenuProps {
editor: Editor;
}
const EditorMenu = ({ editor }: EditorMenuProps) => {
const [_, setForceUpdate] = useState(false);
useEffect(() => {
// force the ui to update when the editor updates
editor.on('update', () => {
setForceUpdate((prev) => !prev);
});
}, []);
const actions = [
{
icon: 'format-bold',
isActive: editor.isActive('bold'),
disabled: !editor.commandManager.createCan().toggleBold(),
onPress() {
if (editor.commandManager.createCan().toggleBold()) {
editor.commandManager
.createChain(undefined, true)
.toggleBold()
.run();
}
},
},
{
icon: 'format-italic',
isActive: editor.isActive('italic'),
disabled: !editor.commandManager.createCan().toggleItalic(),
onPress() {
if (editor.commandManager.createCan().toggleItalic()) {
editor.commandManager
.createChain(undefined, true)
.toggleItalic()
.run();
}
},
},
{
icon: 'format-color-highlight',
isActive: editor.isActive('highlight'),
disabled: !editor.commandManager.createCan().toggleHighlight(),
onPress() {
if (editor.commandManager.createCan().toggleHighlight()) {
editor.commandManager
.createChain(undefined, true)
.toggleHighlight()
.run();
}
},
},
];
return (
<View style={{ flexDirection: 'row', justifyContent: "space-between" }}>
<View style={{ flexDirection: "row", justifyContent: "flex-start", alignItems: "center", flex: 1 }}>
{actions.map((action, index) => (
<Fragment key={index}>
<MenuButton
key={action.icon}
icon={action.icon}
isActive={action.isActive}
disabled={action.disabled}
onPress={action.onPress}
/>
{index < actions.length - 1 && (
<Divider />
)}
</Fragment>
))}
</View>
</View>
);
};
export default EditorMenu;

View File

@ -0,0 +1,16 @@
import React from 'react';
import { IconButton, type IconButtonProps } from 'react-native-paper';
interface MenuButtonProps extends IconButtonProps {
isActive?: boolean;
}
const MenuButton = ({ isActive, ...props }: MenuButtonProps) => {
return (
<IconButton
size={18}
mode={isActive ? 'contained' : 'outlined'}
{...props}
/>
);
};
export default MenuButton;

627
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "myjourney",
"version": "1.0.0",
"dependencies": {
"@10play/tentap-editor": "0.7.0",
"@expo/ngrok": "^4.1.3",
"@expo/vector-icons": "^14.1.0",
"@react-native-async-storage/async-storage": "2.1.2",
@ -75,6 +76,101 @@
}
}
},
"node_modules/@10play/tentap-editor": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@10play/tentap-editor/-/tentap-editor-0.7.0.tgz",
"integrity": "sha512-+ruRz+3z+GKXdquaRxi5rUUoVy1YUtFZWqxzWQjnzYg4s6OiOWe/ptOkH5dEsPgRudxYNBjhIZFqdpWzLPolNw==",
"license": "MIT",
"workspaces": [
"example",
"example76",
"website"
],
"dependencies": {
"@tiptap/extension-blockquote": "^2.2.1",
"@tiptap/extension-bold": "^2.2.1",
"@tiptap/extension-bullet-list": "^2.2.1",
"@tiptap/extension-code": "^2.2.1",
"@tiptap/extension-code-block": "^2.2.1",
"@tiptap/extension-color": "^2.1.16",
"@tiptap/extension-document": "^2.2.1",
"@tiptap/extension-dropcursor": "^2.2.4",
"@tiptap/extension-hard-break": "^2.3.1",
"@tiptap/extension-heading": "^2.2.1",
"@tiptap/extension-highlight": "^2.1.16",
"@tiptap/extension-history": "^2.2.1",
"@tiptap/extension-horizontal-rule": "^2.2.1",
"@tiptap/extension-image": "^2.2.1",
"@tiptap/extension-italic": "^2.2.1",
"@tiptap/extension-link": "2.10.3",
"@tiptap/extension-list-item": "^2.2.1",
"@tiptap/extension-ordered-list": "^2.2.1",
"@tiptap/extension-placeholder": "^2.2.1",
"@tiptap/extension-strike": "^2.2.1",
"@tiptap/extension-task-item": "^2.1.16",
"@tiptap/extension-task-list": "^2.1.16",
"@tiptap/extension-text-style": "^2.1.16",
"@tiptap/extension-underline": "^2.1.16",
"@tiptap/pm": "^2.1.16",
"@tiptap/react": "^2.1.16",
"@tiptap/starter-kit": "^2.1.16",
"lodash": "^4.17.21",
"react-dom": "^18.2.0"
},
"engines": {
"node": ">= 18.0.0"
},
"peerDependencies": {
"react": "*",
"react-native": "*",
"react-native-webview": "*"
}
},
"node_modules/@10play/tentap-editor/node_modules/@tiptap/react": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.22.3.tgz",
"integrity": "sha512-Te6e6/carhUAavcJgxC03rffLAZz1or4cjnRDFNF8G4vPOqkNgQd368N47wTMjwh5mQTdMUUI3ToZIpc45Q7Tw==",
"license": "MIT",
"dependencies": {
"@tiptap/extension-bubble-menu": "^2.22.3",
"@tiptap/extension-floating-menu": "^2.22.3",
"@types/use-sync-external-store": "^0.0.6",
"fast-deep-equal": "^3",
"use-sync-external-store": "^1"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/@10play/tentap-editor/node_modules/react-dom": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.2"
},
"peerDependencies": {
"react": "^18.3.1"
}
},
"node_modules/@10play/tentap-editor/node_modules/scheduler": {
"version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
}
},
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@ -3013,6 +3109,16 @@
"node": ">=14"
}
},
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@radix-ui/react-compose-refs": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
@ -5487,6 +5593,500 @@
"node": ">=10"
}
},
"node_modules/@tiptap/core": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.22.3.tgz",
"integrity": "sha512-czyBPXZG/ZFyObZEF1kyusGf58Ai3X8TnaxlUUn3gqLLWPy0idXZg85NETCidzi/gAxWxL9j6Pcy+zwS4pbZYQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-blockquote": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.22.3.tgz",
"integrity": "sha512-HvTXvqeGaANg0owk0Xxkgyc4lJMO5CZES2Lc3JJp8u5kV+HZIwd78eJ7fbKBMtkpKb4zOk4xQsHQ/TuhghJaeA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-bold": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.22.3.tgz",
"integrity": "sha512-J3GxKwijD42eqCwU1SS7PK5aSgnp0wgQDetLz9izAD0RQBrKj5WZA13GnPoTTlzLU4qwjcPRV+6mvF+llH6b6A==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-bubble-menu": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.22.3.tgz",
"integrity": "sha512-8iQLNrRf3iBPKqI3dQnfvMxMfgp6y9TAbO803LihvzbIGqBaX264ES7fHtoyFIIeVjy2xFruVsTZCZofWTupGg==",
"license": "MIT",
"dependencies": {
"tippy.js": "^6.3.7"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-bullet-list": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.22.3.tgz",
"integrity": "sha512-SYvLIxqmuV0kTj4/3ZFlnZ1fr9Y233qX00BKuIpGnczeFsWQmzBJo8vGm3d1IlKPCQN+jTRtDdDE1aSum8Kv2w==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-code": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.22.3.tgz",
"integrity": "sha512-s+W6jHezq+n9cC40xZ3hZF6cGGSl+fBELik1b2x8+cb0WoIlqmcdWin1dgeMNrWlRZUw1aD2DNwy/PdXI5vn2g==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-code-block": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.22.3.tgz",
"integrity": "sha512-twPCBpb/ygNixlSBAXgvfo+t56Ucpb8lvPDiZn+cH8OjmmO0ayBoSfSrjKWgaEWGPcXBrFAfsBRbYHyoHj7pXg==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-color": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.22.3.tgz",
"integrity": "sha512-4GewNUnDE16cte85kG0qhMGS1NQUQ1HRObVRGP47RlrSc/6x++DOfkqYbSJ0btyfWHGBahC3QQfyQ3eCdryUxg==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/extension-text-style": "^2.7.0"
}
},
"node_modules/@tiptap/extension-document": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.22.3.tgz",
"integrity": "sha512-7MnILbhRZRyROlMUgyntzRZ/EZlqNB8fO761RNjJxR2WMb49R4yc04fz7/+f/QH/hwxoS13bKfsNUDAsDxA5Aw==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-dropcursor": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.22.3.tgz",
"integrity": "sha512-yQxSfTWjdUQS+bh6KiNLR9KIMsn1SElzycQe4XE+0eoaetapGtKqxfwkTbbQdNgQOU5wQG1KOda221mnPvkpAA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-floating-menu": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.22.3.tgz",
"integrity": "sha512-GeJRRdulxpwsshxzBkpOf/xJkLD2fa+49o+3FqRCmrm7AioC8oUcZZmzuzjLj5a3ZNGKPuJ9xxDkYWUjH4tE1g==",
"license": "MIT",
"dependencies": {
"tippy.js": "^6.3.7"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-gapcursor": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.22.3.tgz",
"integrity": "sha512-6Q8TLL4PVGcZLn27eQazCC+be8LP8uzuz5Z5e4TpIeswPAju49cerQOdEGNFKkuYv/FelWIhXNtkWFMf4eSmyw==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-hard-break": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.22.3.tgz",
"integrity": "sha512-tbEji/V4Za3UhxYwB36amYhyonwe5j66iYTNRWzgjNixjrcGDbWk6cfaF9jMAgPgIDBmmtQLJY+moKskwgpnZg==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-heading": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.22.3.tgz",
"integrity": "sha512-+MexJD+kXtNwMDbNTFa7jCFipx1DqAdT+n9GgInqebAN9bK+CWjC+SskzZNRqeMrQ0Er7QTsi6YC09M+74sevA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-highlight": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.22.3.tgz",
"integrity": "sha512-cdPSeQ3QcThhJdzkjK9a1871uPQjwmOf0WzTGW33lJyJDQHypWIRNUus56c3pGA7BgV9P59QW7Fm8rDnM8XkbA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-history": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.22.3.tgz",
"integrity": "sha512-F9sC45zPw7vbjKrwSKuSLZ0ODyc/X3bGPeCa6HYLEHKfgqsdt2v2fQLvxjpmlwO2ZMrnkBkg76KDxHfVyrZ2zQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-horizontal-rule": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.22.3.tgz",
"integrity": "sha512-3GvY798p9pCXUBbCebIdSmi1q80l7VZz/B6NN4uUMQ9iwxWopd8yaZ0O7xx2hM2UBzPEtY3M4FAhhpYUTXNFgQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-image": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.22.3.tgz",
"integrity": "sha512-JO8n5YOqOs+bckPZZ3qJFFLpRbYlu4N52n/7Do0XmxEMWaa3fLcR0Rsa1v3X4dGH2T5cKQ475dWSpJQRc+x07w==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-italic": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.22.3.tgz",
"integrity": "sha512-W/rQDo7qFL7MfwfaYEcdtbk862fOmBv30qIEwVdqElBye7BFJYKtRuWBzNbG2BwKanjwMbVc/tBXF5W1sqfT7Q==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-link": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.3.tgz",
"integrity": "sha512-8esKlkZBzEiNcpt7I8Cd6l1mWmCc/66pPbUq9LfnIniDXE3U+ahBf4m3TJltYFBGbiiTR/xqMtJyVHOpuLDtAw==",
"license": "MIT",
"dependencies": {
"linkifyjs": "^4.1.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-list-item": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.22.3.tgz",
"integrity": "sha512-B7Fze+eM1sYbGOZtDDAwAivnj1ow2wN5RqaQPC1la3wdTK4Wgp7bdzGjvUbrN6gp3zMFCEWlqP2toc/mRAHCtA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-ordered-list": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.22.3.tgz",
"integrity": "sha512-pHGkuZhV/uAAHI9vzk/lpAkbdpMT4wUR1FI17/GE3zNrogfzx0VopCQrXq4+sQVsLUW4I6Cj6VeBjm9wB6qlIw==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-paragraph": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.22.3.tgz",
"integrity": "sha512-TYvgS7CweNFo/xVxsKWSt0wnm46Y8OtsfDSjnLbSC4Pj4ZNa6PU3zpvDTW+UxYakr+8zIPvI2WgLBkyTHq6oQA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-placeholder": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.22.3.tgz",
"integrity": "sha512-kYrO2iTOtGRr6IaVsaWSWCJmQZL7wuPOl19AmTxIJaxsiOgViocuoU5k14Fd6pU06yn8jmglD+Rirrn6eW5+5g==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-strike": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.22.3.tgz",
"integrity": "sha512-I+s2Csw2cTHae2vFJiojnHK+NnQjDr6441mSlAd+e7kEly1kjZ4g7J+JMj02ajNQhr/ob8/hb5r6EdIyv2xtoA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-task-item": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-2.22.3.tgz",
"integrity": "sha512-aVfSa2dLF77bfXpAlrsfPUNdhiHJhw3VJ/pnCTxrEnBXYilDuH59AhtU6DygSNhMZWUgzI4OPqf3crF+yzrHag==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0",
"@tiptap/pm": "^2.7.0"
}
},
"node_modules/@tiptap/extension-task-list": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-2.22.3.tgz",
"integrity": "sha512-prOnD/S6mHOhzj2CLvd4Q/GJymyJMcdgTTJaI+Yk/Plup1OuH6fRlBdo67Tve0xzeQz4sfxrzp9kQ6EsEwhv0w==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-text": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.22.3.tgz",
"integrity": "sha512-07cymWkPTfq6nuum88Yf90YYArbowed8nNiu0Tw3jCvwpzf9J9TDaovT+LAKuSKtrOsnNpFB/9IqUwFxZepOGw==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-text-style": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.22.3.tgz",
"integrity": "sha512-M3FLOUPcO8fR+rM97mR2gQ54KFkdlAUQtEPKQpO1f312gtcVdBNxgq0WgqTnBY7thWLyqQSKiAsL6y88+JddSA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/extension-underline": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.22.3.tgz",
"integrity": "sha512-floLjh1UbQ2pKgdwfw7qCAJ5VojvH1uqj7xW2RCv79aWYUuJCPD6UBpaBOt/jv7gXDJJ9EeV3m2Hga49CXBrEQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.7.0"
}
},
"node_modules/@tiptap/pm": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.22.3.tgz",
"integrity": "sha512-uWPeIScnpQVCYdTnL140XgcvbT1qH288CstMJ6S0Y11lC5PclPK9CxfAipsqgWWrIK7yatxKUVCg6TzfG9zpmA==",
"license": "MIT",
"dependencies": {
"prosemirror-changeset": "^2.3.0",
"prosemirror-collab": "^1.3.1",
"prosemirror-commands": "^1.6.2",
"prosemirror-dropcursor": "^1.8.1",
"prosemirror-gapcursor": "^1.3.2",
"prosemirror-history": "^1.4.1",
"prosemirror-inputrules": "^1.4.0",
"prosemirror-keymap": "^1.2.2",
"prosemirror-markdown": "^1.13.1",
"prosemirror-menu": "^1.2.4",
"prosemirror-model": "^1.23.0",
"prosemirror-schema-basic": "^1.2.3",
"prosemirror-schema-list": "^1.4.1",
"prosemirror-state": "^1.4.3",
"prosemirror-tables": "^1.6.4",
"prosemirror-trailing-node": "^3.0.0",
"prosemirror-transform": "^1.10.2",
"prosemirror-view": "^1.37.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
}
},
"node_modules/@tiptap/pm/node_modules/@remirror/core-constants": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz",
"integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==",
"license": "MIT"
},
"node_modules/@tiptap/pm/node_modules/prosemirror-trailing-node": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz",
"integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==",
"license": "MIT",
"dependencies": {
"@remirror/core-constants": "3.0.0",
"escape-string-regexp": "^4.0.0"
},
"peerDependencies": {
"prosemirror-model": "^1.22.1",
"prosemirror-state": "^1.4.2",
"prosemirror-view": "^1.33.8"
}
},
"node_modules/@tiptap/starter-kit": {
"version": "2.22.3",
"resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.22.3.tgz",
"integrity": "sha512-GkvheaR2ORnHJ9g9R6xIT38w2uppGja/iAIrXLZ9vY1QuR+0cya/ZZ5vKU6r9C2PeyBs3aKYxRD1/j3HDhuGXw==",
"license": "MIT",
"dependencies": {
"@tiptap/core": "^2.22.3",
"@tiptap/extension-blockquote": "^2.22.3",
"@tiptap/extension-bold": "^2.22.3",
"@tiptap/extension-bullet-list": "^2.22.3",
"@tiptap/extension-code": "^2.22.3",
"@tiptap/extension-code-block": "^2.22.3",
"@tiptap/extension-document": "^2.22.3",
"@tiptap/extension-dropcursor": "^2.22.3",
"@tiptap/extension-gapcursor": "^2.22.3",
"@tiptap/extension-hard-break": "^2.22.3",
"@tiptap/extension-heading": "^2.22.3",
"@tiptap/extension-history": "^2.22.3",
"@tiptap/extension-horizontal-rule": "^2.22.3",
"@tiptap/extension-italic": "^2.22.3",
"@tiptap/extension-list-item": "^2.22.3",
"@tiptap/extension-ordered-list": "^2.22.3",
"@tiptap/extension-paragraph": "^2.22.3",
"@tiptap/extension-strike": "^2.22.3",
"@tiptap/extension-text": "^2.22.3",
"@tiptap/extension-text-style": "^2.22.3",
"@tiptap/pm": "^2.22.3"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
}
},
"node_modules/@tybys/wasm-util": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz",
@ -5681,6 +6281,12 @@
"integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
"license": "MIT"
},
"node_modules/@types/use-sync-external-store": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
"integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
"license": "MIT"
},
"node_modules/@types/yargs": {
"version": "17.0.33",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
@ -11595,6 +12201,12 @@
"uc.micro": "^2.0.0"
}
},
"node_modules/linkifyjs": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.1.tgz",
"integrity": "sha512-DRSlB9DKVW04c4SUdGvKK5FR6be45lTU9M76JnngqPeeGDqPwYc0zdUErtsNVMtxPXgUWV4HbXbnC4sNyBxkYg==",
"license": "MIT"
},
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@ -11610,6 +12222,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@ -15952,6 +16570,15 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/tippy.js": {
"version": "6.3.7",
"resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz",
"integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==",
"license": "MIT",
"dependencies": {
"@popperjs/core": "^2.9.0"
}
},
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",

View File

@ -11,6 +11,7 @@
"lint": "expo lint"
},
"dependencies": {
"@10play/tentap-editor": "0.7.0",
"@expo/ngrok": "^4.1.3",
"@expo/vector-icons": "^14.1.0",
"@react-native-async-storage/async-storage": "2.1.2",