diff --git a/__tests__/AddNoteRichEditor.test.tsx b/__tests__/AddNoteRichEditor.test.tsx index 00b630e..14c4fca 100644 --- a/__tests__/AddNoteRichEditor.test.tsx +++ b/__tests__/AddNoteRichEditor.test.tsx @@ -54,7 +54,12 @@ describe("AddNoteScreen", () => { beforeEach(() => { setNoteContentMock = jest.fn(); React.useState = jest.fn(() => ['', setNoteContentMock]); - wrapper = shallow(); + const routeMock = { + params: { + untitledNumber: 1 // or any other value that makes sense for your tests + } + }; + wrapper = shallow(); }); afterEach(() => { @@ -68,10 +73,15 @@ describe("AddNoteScreen", () => { it('calls setNoteContent when the Rich Text Editor content changes', () => { // Set up the mock function const setNoteContentMock = jest.fn(); + const routeMock = { + params: { + untitledNumber: 1 // or any other value that makes sense for your tests + } + }; // Shallow render the AddNoteScreen component and pass the mock function as a prop // Ensure that this matches how your actual component receives the setNoteContent prop - const wrapper = shallow(); + const wrapper = shallow(); // Simulate the content change on the Rich Text Editor component // The selector needs to match the test ID or the component name/class diff --git a/__tests__/AddNoteScreen.test.tsx b/__tests__/AddNoteScreen.test.tsx index 5691997..34dcda5 100644 --- a/__tests__/AddNoteScreen.test.tsx +++ b/__tests__/AddNoteScreen.test.tsx @@ -44,7 +44,12 @@ describe("AddNoteScreen", () => { beforeEach(() => { setNoteContentMock = jest.fn(); React.useState = jest.fn(() => ['', setNoteContentMock]); - wrapper = shallow(); + const routeMock = { + params: { + untitledNumber: 1 // or any other value that makes sense for your tests + } + }; + wrapper = shallow(); }); afterEach(() => { @@ -58,10 +63,15 @@ describe("AddNoteScreen", () => { it('calls setNoteContent when the Rich Text Editor content changes', () => { // Set up the mock function const setNoteContentMock = jest.fn(); + const routeMock = { + params: { + untitledNumber: 1 // or any other value that makes sense for your tests + } + }; // Shallow render the AddNoteScreen component and pass the mock function as a prop // Ensure that this matches how your actual component receives the setNoteContent prop - const wrapper = shallow(); + const wrapper = shallow(); // Simulate the content change on the Rich Text Editor component // The selector needs to match the test ID or the component name/class diff --git a/__tests__/DifferentPlatformTimes.test.tsx b/__tests__/DifferentPlatformTimes.test.tsx index cedebbe..0be00a5 100644 --- a/__tests__/DifferentPlatformTimes.test.tsx +++ b/__tests__/DifferentPlatformTimes.test.tsx @@ -38,7 +38,12 @@ jest.mock('react-native/Libraries/Utilities/Platform', () => ({ describe("AddNoteScreen", () => { it("renders without crashing", () => { - const wrapper = shallow(); + const routeMock = { + params: { + untitledNumber: 1 // or any other value that makes sense for your tests + } + }; + const wrapper = shallow(); expect(wrapper).toMatchSnapshot(); }); }); diff --git a/__tests__/InsertImageNoteScreen.test.tsx b/__tests__/InsertImageNoteScreen.test.tsx index bf40a82..b0224e1 100644 --- a/__tests__/InsertImageNoteScreen.test.tsx +++ b/__tests__/InsertImageNoteScreen.test.tsx @@ -15,7 +15,12 @@ jest.mock('../lib/components/ThemeProvider', () => ({ describe("AddNoteScreen", () => { it("adds image to editor", () => { - const wrapper = shallow(); + const routeMock = { + params: { + untitledNumber: 1 // or any other value that makes sense for your tests + } + }; + const wrapper = shallow(); // Mock richTextRef const richTextRef = { current: { insertImage: jest.fn() } }; diff --git a/__tests__/SetTime.test.tsx b/__tests__/SetTime.test.tsx index d8e161e..cb33528 100644 --- a/__tests__/SetTime.test.tsx +++ b/__tests__/SetTime.test.tsx @@ -36,7 +36,12 @@ beforeAll(() => { describe("AddNoteScreen", () => { it("renders without crashing", () => { - const wrapper = shallow(); + const routeMock = { + params: { + untitledNumber: 1 // or any other value that makes sense for your tests + } + }; + const wrapper = shallow(); expect(wrapper).toMatchSnapshot(); }); }); diff --git a/app.json b/app.json index 239b953..8330b32 100644 --- a/app.json +++ b/app.json @@ -43,7 +43,6 @@ }, "updates": { "url": "https://u.expo.dev/801029ef-db83-4668-a97a-5adcc4c333e2" - }, "extra": { diff --git a/lib/components/loadingImage.tsx b/lib/components/loadingImage.tsx index 78fa207..bc42840 100644 --- a/lib/components/loadingImage.tsx +++ b/lib/components/loadingImage.tsx @@ -122,4 +122,4 @@ const styles = StyleSheet.create({ position: "absolute", alignSelf: "center", }, -}); +}); \ No newline at end of file diff --git a/lib/components/photoScroller.tsx b/lib/components/photoScroller.tsx index 80bfabc..1b3a068 100644 --- a/lib/components/photoScroller.tsx +++ b/lib/components/photoScroller.tsx @@ -102,7 +102,7 @@ const PhotoScroller = forwardRef( }); setNewMedia([...newMedia, newMediaItem]); if (insertImageToEditor) { - insertImageToEditor(uploadedUrl, 'Captured Image'); + insertImageToEditor(uploadedUrl); } } else if ( uri.endsWith(".MOV") || diff --git a/lib/screens/AddNoteScreen.tsx b/lib/screens/AddNoteScreen.tsx index 9f62378..79276da 100644 --- a/lib/screens/AddNoteScreen.tsx +++ b/lib/screens/AddNoteScreen.tsx @@ -38,6 +38,8 @@ const user = User.getInstance(); const AddNoteScreen: React.FC = ({ navigation, route }) => { const [titleText, setTitleText] = useState(""); + const [isSaveButtonEnabled, setIsSaveButtonEnabled] = useState(true); + const [untitledNumber, setUntitledNumber] = useState("0"); const [bodyText, setBodyText] = useState(""); const [newMedia, setNewMedia] = useState([]); const [newAudio, setNewAudio] = useState([]); @@ -56,13 +58,14 @@ const AddNoteScreen: React.FC = ({ navigation, route }) => { const [initialLoad, setInitialLoad] = useState(true); const [promptedMissingTitle, setPromptedMissingTitle] = useState(false); const [isUpdating, setIsUpdating] = useState(false); - const [location, setLocation] = useState<{ + const [isLocationIconPressed, setIsLocationIconPressed] = useState(false); + let [location, setLocation] = useState<{ latitude: number; longitude: number; } | null>(null); const { theme } = useTheme(); - + useEffect(() => { const keyboardDidShowListener = Keyboard.addListener( "keyboardDidShow", @@ -94,6 +97,15 @@ const AddNoteScreen: React.FC = ({ navigation, route }) => { checkLocationPermission(); }, []); + useEffect(() => { + const { untitledNumber } = route.params; + if (untitledNumber) { + setUntitledNumber(untitledNumber.toString()); + } + }, [route.params]); + + const [isLocationShown, setIsLocationShown] = useState(true); + const grabLocation = async () => { try { const userLocation = await Location.getCurrentPositionAsync({}); @@ -194,6 +206,60 @@ const AddNoteScreen: React.FC = ({ navigation, route }) => { }); }; + const [latitude, setLatitude] = useState( + location?.latitude?.toString() || "" + ); + const [longitude, setLongitude] = useState( + location?.longitude?.toString() || "" + ); + + async function getLocation() { + try { + let { status } = await Location.requestForegroundPermissionsAsync(); + if (status !== "granted") { + console.log("Permission to access location was denied"); + return null; + } + return await Location.getCurrentPositionAsync({}); + } catch (error) { + console.error("Error getting location:", error); + return null; + } + } + + const toggleLocationVisibility = async () => { + if (isLocationShown) { + // Hide Location + setLocation({ + latitude: 0, + longitude: 0, + }); + setLatitude("0"); + setLongitude("0"); + } else { + // Show Location + try { + let userLocation = await getLocation(); + + if (userLocation?.coords?.latitude !== undefined && userLocation?.coords?.longitude !== undefined) { + setLocation({ + latitude: userLocation.coords.latitude, + longitude: userLocation.coords.longitude, + }); + + setLatitude(userLocation.coords.latitude.toString()); + setLongitude(userLocation.coords.longitude.toString()); + } else { + console.log("Location data is not available."); + } + } catch (error) { + console.error("Error setting location:", error); + } + } + setIsLocationShown((prev) => !prev); + setIsLocationIconPressed((prev) => !prev); + }; + const checkLocationPermission = async () => { try { let { status } = await Location.getForegroundPermissionsAsync(); @@ -234,18 +300,23 @@ const AddNoteScreen: React.FC = ({ navigation, route }) => { const saveNote = async () => { const locationPermissionGranted = await checkLocationPermission(); - if (titleText === "") { - if (!promptedMissingTitle) { - setPromptedMissingTitle(true); - Alert.alert( - "Title is empty", - "Please enter a title to save the note, or press back again to confirm not saving the note.", - ); - return; - } else { - navigation.goBack(); - return; - } + setIsSaveButtonEnabled(false); + let finalTitle = titleText.trim(); + if (finalTitle === "") { + finalTitle = `Untitled ${untitledNumber}`; + } + + if (finalTitle.trim() === "") { + Alert.alert( + "Empty Title", + "Please enter a title to save the note or delete the note.", + [ + { text: "Delete Note", onPress: () => navigation.goBack() }, + { text: "OK", onPress: () => console.log("OK Pressed") } + ], + { cancelable: false } + ); + return; } if (!locationPermissionGranted) { return; @@ -254,26 +325,21 @@ const AddNoteScreen: React.FC = ({ navigation, route }) => { setIsUpdating(true); try { - const userLocation = await Location.getCurrentPositionAsync({}); const userID = await user.getId(); - let latitude, longitude; - - if (Platform.OS === 'ios') { - latitude = location?.latitude.toString(); - longitude = location?.longitude.toString(); - } else if (Platform.OS === 'android') { - latitude = userLocation.coords.latitude.toString(); - longitude = userLocation.coords.longitude.toString(); - } - + const userLocation = await Location.getCurrentPositionAsync({}); + const latitudeToSave = location ? location.latitude.toString() : userLocation.coords.latitude.toString(); + const longitudeToSave = location ? location.longitude.toString() : userLocation.coords.longitude.toString(); + + setTime(new Date()); // force a fresh time date grab on note save + const newNote = { - title: titleText, + title: finalTitle, text: bodyText, media: newMedia, audio: newAudio, creator: userID, - latitude: latitude, - longitude: longitude, + latitude: latitudeToSave, + longitude: longitudeToSave, published: isPublished, tags: tags, time: time, @@ -291,6 +357,7 @@ const AddNoteScreen: React.FC = ({ navigation, route }) => { setIsUpdating(false); } } + setIsSaveButtonEnabled(true); }; return ( @@ -298,7 +365,7 @@ const AddNoteScreen: React.FC = ({ navigation, route }) => { - + = ({ navigation, route }) => { setViewMedia(false); setViewAudio(false); setIsTagging(false); - setIsLocation(!isLocation); + //setIsLocation(!isLocation); + toggleLocationVisibility(); setIsTime(false); + }} > - + { diff --git a/lib/screens/EditNoteScreen.tsx b/lib/screens/EditNoteScreen.tsx index d9ad82f..2e8d710 100644 --- a/lib/screens/EditNoteScreen.tsx +++ b/lib/screens/EditNoteScreen.tsx @@ -29,6 +29,8 @@ import NotePageStyles from "../../styles/pages/NoteStyles"; import ToastMessage from 'react-native-toast-message'; import { useTheme } from "../components/ThemeProvider"; import LoadingModal from "../components/LoadingModal"; +import * as Location from 'expo-location'; + const user = User.getInstance(); @@ -54,10 +56,14 @@ const EditNoteScreen: React.FC = ({ const [keyboardOpen, setKeyboard] = useState(false); const [keyboardHeight, setKeyboardHeight] = useState(0); const [isLocation, setIsLocation] = useState(false); + let [isLocationShown, setIsLocationShown] = useState( + note.latitude === "0" && note.longitude === "0" ); + let [isLocationIconPressed, setIsLocationIconPressed] = useState( + note.latitude === "0" && note.longitude === "0" ); const richTextRef = useRef(null); const [isTime, setIsTime] = useState(false); const [isUpdating, setIsUpdating] = useState(false); - const [location, setLocation] = useState<{ + let [location, setLocation] = useState<{ latitude: number; longitude: number; } | null>( @@ -68,6 +74,8 @@ const EditNoteScreen: React.FC = ({ } : null ); + console.log(note.latitude); + console.log(note.longitude); const { height, width } = useWindowDimensions(); const { theme } = useTheme(); @@ -115,6 +123,13 @@ const EditNoteScreen: React.FC = ({ } }; + const [latitude, setLatitude] = useState( + location?.latitude?.toString() || "" + ); + const [longitude, setLongitude] = useState( + location?.longitude?.toString() || "" + ); + const photoScrollerRef = useRef<{ goBig(index: number): void } | null>( null ); @@ -125,6 +140,20 @@ const EditNoteScreen: React.FC = ({ } }; + async function getLocation() { + try { + let { status } = await Location.requestForegroundPermissionsAsync(); + if (status !== "granted") { + console.log("Permission to access location was denied"); + return null; + } + return await Location.getCurrentPositionAsync({}); + } catch (error) { + console.error("Error getting location:", error); + return null; + } + } + const handleShareButtonPress = () => { setIsPublished(!isPublished); // Toggle the share status ToastMessage.show({ @@ -198,19 +227,55 @@ const EditNoteScreen: React.FC = ({ console.error("Error adding video with thumbnail: ", error); } } + const toggleLocationVisibility = async () => { + if (isLocationShown) { + // Hide Location + setLocation({ + latitude: 0, + longitude: 0, + }); + setLatitude("0"); + setLongitude("0"); + } else { + // Show Location + try { + let userLocation = await getLocation(); + + if (userLocation?.coords?.latitude !== undefined && userLocation?.coords?.longitude !== undefined) { + setLocation({ + latitude: userLocation.coords.latitude, + longitude: userLocation.coords.longitude, + }); + + setLatitude(userLocation.coords.latitude.toString()); + setLongitude(userLocation.coords.longitude.toString()); + } else { + console.log("Location data is not available."); + } + } catch (error) { + console.error("Error setting location:", error); + } + } + setIsLocationShown((prev) => !prev); + setIsLocationIconPressed((prev) => !prev); + }; const handleSaveNote = async () => { setIsUpdating(true); try { - const editedNote = { + let userLocation = await getLocation(); + const finalLatitude = !isLocationShown ? userLocation?.coords.latitude.toString() || "" : "0"; + const finalLongitude = !isLocationShown ? userLocation?.coords.longitude.toString() || "" : "0"; + + const editedNote: Note = { id: note.id, title: title, text: text, creator: (await user.getId()) || "", - media: media, - latitude: location?.latitude.toString() || "", - longitude: location?.longitude.toString() || "", + media, + latitude: finalLatitude, + longitude: finalLongitude, audio: newAudio, published: isPublished, time: time, @@ -271,8 +336,8 @@ const EditNoteScreen: React.FC = ({ setViewAudio(!viewAudio)}> - setIsLocation(!isLocation)}> - + toggleLocationVisibility()}> + setIsTime(!isTime)}> diff --git a/lib/screens/HomeScreen.tsx b/lib/screens/HomeScreen.tsx index 2280741..8d5ffaa 100644 --- a/lib/screens/HomeScreen.tsx +++ b/lib/screens/HomeScreen.tsx @@ -20,8 +20,9 @@ import { SwipeListView } from "react-native-swipe-list-view"; import NoteSkeleton from "../components/noteSkeleton"; import LoadingImage from "../components/loadingImage"; import { formatToLocalDateString } from "../components/time"; -import { ThemeProvider, useTheme } from '../components/ThemeProvider'; +import { useTheme } from '../components/ThemeProvider'; import Constants from "expo-constants"; +import ToastMessage from 'react-native-toast-message'; import DropDownPicker from 'react-native-dropdown-picker'; import NoteDetailModal from "./mapPage/NoteDetailModal"; @@ -146,6 +147,21 @@ const HomeScreen: React.FC = ({ navigation, route }) => { setUpdateCounter(updateCounter + 1); }; + const findNextUntitledNumber = (notes : Note[]) => { + let maxNumber = 0; + notes.forEach((note) => { + const match = note.title.match(/^Untitled (\d+)$/); + if (match) { + const number = parseInt(match[1]); + if (number > maxNumber) { + maxNumber = number; + } + } + }); + return maxNumber + 1; + }; + + const styles = StyleSheet.create({ container: { paddingTop: Constants.statusBarHeight - 20, @@ -454,6 +470,9 @@ const HomeScreen: React.FC = ({ navigation, route }) => { imageURI={ImageURI} type={ImageType} isImage={true} + useCustomDimensions={true} + customWidth={100} + customHeight={100} /> ) : ( @@ -571,7 +590,10 @@ const HomeScreen: React.FC = ({ navigation, route }) => { {rendering ? : renderList(notes)} navigation.navigate("AddNote", { refreshPage })} + onPress={() => { + const untitledNumber = findNextUntitledNumber(notes); + navigation.navigate("AddNote", { untitledNumber, refreshPage }); + }} > diff --git a/package.json b/package.json index 8774aac..2f3a590 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ ] }, "dependencies": { + "@10play/tentap-editor": "^0.4.55", "@gapur/react-native-accordion": "^1.0.7", "@react-native-async-storage/async-storage": "1.18.2", "@react-native-community/datetimepicker": "7.2.0", @@ -72,7 +73,7 @@ "react-native-uuid": "^2.0.1", "react-native-vector-icons": "^10.0.0", "react-native-video": "^5.2.1", - "react-native-webview": "13.2.2", + "react-native-webview": "^13.8.4", "rn-placeholder": "^3.0.3" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index e830123..ca92c5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,40 @@ resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.4.tgz#9606eb651955499525d068ce0ad8bea596286ce2" integrity sha512-W3ezhHGfO0MS1PtGloaTpg0PbaT8aZSmmaerL7idtU5F7oCI+uu25k+MsMS31BVFlp4aMkHSrNRxiD72IlK8TA== +"@10play/tentap-editor@^0.4.55": + version "0.4.55" + resolved "https://registry.yarnpkg.com/@10play/tentap-editor/-/tentap-editor-0.4.55.tgz#cdec1b808caf1d903f1f5fa4eb462ba9181061a9" + integrity sha512-5dEIYHvkWkfg00nTYiUcJoibRU5EpjQyfE1I0wcdOgJrW2W6YQiuYc5sN/uJjOklDexI777qYzHmZ4lvYQ3mbw== + 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-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.1.16" + "@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" + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -2164,6 +2198,11 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@popperjs/core@^2.9.0": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + "@react-native-async-storage/async-storage@1.18.2": version "1.18.2" resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.18.2.tgz#ec8fd487a0b6c9500b43ece4b8779d1561f12e91" @@ -2742,6 +2781,11 @@ color "^4.2.3" warn-once "^0.1.0" +"@remirror/core-constants@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.2.tgz#f05eccdc69e3a65e7d524b52548f567904a11a1a" + integrity sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== + "@segment/loosely-validate-event@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz#87dfc979e5b4e7b82c5f1d8b722dfd5d77644681" @@ -2827,6 +2871,219 @@ "@testing-library/dom" "^9.0.0" "@types/react-dom" "^18.0.0" +"@tiptap/core@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.2.4.tgz#6f957678eb733e70b9282fb5098d284a77bd09a3" + integrity sha512-cRrI8IlLIhCE1hacBQzXIC8dsRvGq6a4lYWQK/BaHuZg21CG7szp3Vd8Ix+ra1f5v0xPOT+Hy+QFNQooRMKMCw== + +"@tiptap/extension-blockquote@^2.2.1", "@tiptap/extension-blockquote@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.2.4.tgz#d733bea016986c0017e308a2540378c9551c7f10" + integrity sha512-FrfPnn0VgVrUwWLwja1afX99JGLp6PE9ThVcmri+tLwUZQvTTVcCvHoCdOakav3/nge1+aV4iE3tQdyq1tWI9Q== + +"@tiptap/extension-bold@^2.2.1", "@tiptap/extension-bold@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.2.4.tgz#3690eea1ebef49f8d30043fdcfc7bf2866a9b887" + integrity sha512-v3tTLc8YESFZPOGj5ByFr8VbmQ/PTo49T1vsK50VubxIN/5r9cXlKH8kb3dZlZxCxJa3FrXNO/M8rdGBSWQvSg== + +"@tiptap/extension-bubble-menu@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.2.4.tgz#2477901c78a18c629f7ae828394ff1f91a500c60" + integrity sha512-Nx1fS9jcFlhxaTDYlnayz2UulhK6CMaePc36+7PQIVI+u20RhgTCRNr25zKNemvsiM0RPZZVUjlHkxC0l5as1Q== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-bullet-list@^2.2.1", "@tiptap/extension-bullet-list@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.2.4.tgz#1763ae7686bc3f209c1662d571e738280d190ff8" + integrity sha512-z/MPmW8bhRougMuorl6MAQBXeK4rhlP+jBWlNwT+CT8h5IkXqPnDbM1sZeagp2nYfVV6Yc4RWpzimqHHtGnYTA== + +"@tiptap/extension-code-block@^2.2.1", "@tiptap/extension-code-block@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.2.4.tgz#6d72f3e458cf417a4be6b9cc1f9409ad89f55b78" + integrity sha512-h6WV9TmaBEZmvqe1ezMR83DhCPUap6P2mSR5pwVk0WVq6rvZjfgU0iF3EetBJOeDgPlz7cNe2NMDfVb1nGTM/g== + +"@tiptap/extension-code@^2.2.1", "@tiptap/extension-code@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.2.4.tgz#ba77dc56daac75bdf83a2aaecff896e9301c2cdf" + integrity sha512-JB4SJ2mUU/9qXFUf+K5K9szvovnN9AIcCb0f0UlcVBuddKHSqCl3wO3QJgYt44BfQTLMNuyzr+zVqfFd6BNt/g== + +"@tiptap/extension-color@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-color/-/extension-color-2.2.4.tgz#c6de7a471c6021466ea8c2e891a7935562804707" + integrity sha512-R3caThbG25gQz5b1+3PoJnVmuMF0lnqxPJ86l2ZWRAuqRSSEOJDYMGY5rlnPkAVW23Ej2FOuDFVxV/18pFHo3w== + +"@tiptap/extension-document@^2.2.1", "@tiptap/extension-document@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.2.4.tgz#d46c1fdd1ea5b7191112fae4e9f8a63a46309afc" + integrity sha512-z+05xGK0OFoXV1GL+/8bzcZuWMdMA3+EKwk5c+iziG60VZcvGTF7jBRsZidlu9Oaj0cDwWHCeeo6L9SgSh6i2A== + +"@tiptap/extension-dropcursor@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.2.4.tgz#df39861159a022029f733924e9a3977a76dfed17" + integrity sha512-IHwkEKmqpqXyJi16h7871NrcIqeyN7I6XRE2qdqi+MhGigVWI8nWHoYbjRKa7K/1uhs5zeRYyDlq5EuZyL6mgA== + +"@tiptap/extension-floating-menu@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.2.4.tgz#a97becec8cedfa1fb282a7a52caed35a80098581" + integrity sha512-U25l7PEzOmlAPugNRl8t8lqyhQZS6W/+3f92+FdwW9qXju3i62iX/3OGCC3Gv+vybmQ4fbZmMjvl+VDfenNi3A== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-gapcursor@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.2.4.tgz#607b2682376c5ced086258f8329eb080e8047627" + integrity sha512-Y6htT/RDSqkQ1UwG2Ia+rNVRvxrKPOs3RbqKHPaWr3vbFWwhHyKhMCvi/FqfI3d5pViVHOZQ7jhb5hT/a0BmNw== + +"@tiptap/extension-hard-break@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.2.4.tgz#2be463b2f23fc8f57004f3481829aa0b236c17f6" + integrity sha512-FPvS57GcqHIeLbPKGJa3gnH30Xw+YB1PXXnAWG2MpnMtc2Vtj1l5xaYYBZB+ADdXLAlU0YMbKhFLQO4+pg1Isg== + +"@tiptap/extension-heading@^2.2.1", "@tiptap/extension-heading@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.2.4.tgz#a90469a879713dc074ce45e3d7d8cf7a02ae6a1f" + integrity sha512-gkq7Ns2FcrOCRq7Q+VRYt5saMt2R9g4REAtWy/jEevJ5UV5vA2AiGnYDmxwAkHutoYU0sAUkjqx37wE0wpamNw== + +"@tiptap/extension-highlight@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.2.4.tgz#f94c3bf794ddd7f0ac8613243b0c95e4c6ff8b0f" + integrity sha512-GGl6ehKQ0Q0gGgUQhkWg2XYPfhVU5c0JD3NHzV4OrBP6JAtFeMYeSLdfYzFcmoYnGafvSZaJ3NukUvnDHZGzRg== + +"@tiptap/extension-history@^2.2.1", "@tiptap/extension-history@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.2.4.tgz#2d37ccfce9a8b7997bb4d46ebb19e986c5eb6f39" + integrity sha512-FDM32XYF5NU4mzh+fJ8w2CyUqv0l2Nl15sd6fOhQkVxSj8t57z+DUXc9ZR3zkH+1RAagYJo/2Gu3e99KpMr0tg== + +"@tiptap/extension-horizontal-rule@^2.2.1", "@tiptap/extension-horizontal-rule@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.2.4.tgz#e1fc33a05d337c2871180f569a7af1774c74658a" + integrity sha512-iCRHjFQQHApWg3R4fkKkJQhWEOdu1Fdc4YEAukdOXPSg3fg36IwjvsMXjt9SYBtVZ+iio3rORCZGXyMvgCH9uw== + +"@tiptap/extension-image@^2.2.1": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.2.4.tgz#55c267e9ff77e2bf3c514896331ad91d18da08c3" + integrity sha512-xOnqZpnP/fAfmK5AKmXplVQdXBtY5AoZ9B+qllH129aLABaDRzl3e14ZRHC8ahQawOmCe6AOCCXYUBXDOlY5Jg== + +"@tiptap/extension-italic@^2.2.1", "@tiptap/extension-italic@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.2.4.tgz#67403ec3aed630062c7063b7e9e7699d07db683e" + integrity sha512-qIhGNvWnsQswSgEMRA8jQQjxfkOGNAuNWKEVQX9DPoqAUgknT41hQcAMP8L2+OdACpb2jbVMOO5Cy5Dof2L8/w== + +"@tiptap/extension-link@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.2.4.tgz#1cb4c89e15f1fdfb1b7f3f6f26c62f7d51a6c3cb" + integrity sha512-Qsx0cFZm4dxbkToXs5TcXbSoUdicv8db1gV1DYIZdETqjBm4wFjlzCUP7hPHFlvNfeSy1BzAMRt+RpeuiwvxWQ== + dependencies: + linkifyjs "^4.1.0" + +"@tiptap/extension-list-item@^2.2.1", "@tiptap/extension-list-item@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.2.4.tgz#2412dd92e51c3cbc4f2abc3c38ec2ab8348c1af9" + integrity sha512-lPLKGKsHpM9ClUa8n7GEUn8pG6HCYU0vFruIy3l2t6jZdHkrgBnYtVGMZ13K8UDnj/hlAlccxku0D0P4mA1Vrg== + +"@tiptap/extension-ordered-list@^2.2.1", "@tiptap/extension-ordered-list@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.2.4.tgz#dfa6c6869a3d16fe5b2a10749ffe5b999346efd2" + integrity sha512-TpFy140O9Af1JciXt+xwqYUXxcJ6YG8zi/B5UDJujp+FH5sCmlYYBBnWxiFMhVaj6yEmA2eafu1qUkic/1X5Aw== + +"@tiptap/extension-paragraph@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.2.4.tgz#9126fafbf984e324bfb3fab34deb689def7eb98d" + integrity sha512-m1KwyvTNJxsq7StbspbcOhxO4Wk4YpElDbqOouWi+H4c8azdpI5Pn96ZqhFeE9bSyjByg6OcB/wqoJsLbeFWdQ== + +"@tiptap/extension-placeholder@^2.2.1": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-placeholder/-/extension-placeholder-2.2.4.tgz#d75572f6fb0cb3bbbedfa2ced49c55285ae8fdd5" + integrity sha512-UL4Fn9T33SoS7vdI3NnSxBJVeGUIgCIutgXZZ5J8CkcRoDIeS78z492z+6J+qGctHwTd0xUL5NzNJI82HfiTdg== + +"@tiptap/extension-strike@^2.2.1", "@tiptap/extension-strike@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.2.4.tgz#f987a6fe7b85e3179b413792ae3f33dd9c086e01" + integrity sha512-/a2EwQgA+PpG17V2tVRspcrIY0SN3blwcgM7lxdW4aucGkqSKnf7+91dkhQEwCZ//o8kv9mBCyRoCUcGy6S5Xg== + +"@tiptap/extension-task-item@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.2.4.tgz#303a561a315c13cc983ab1c4283e256c2cde000d" + integrity sha512-Ixzv7bPcgrWelSD0Jy6yAlHxmGWpD5lPt6Ey4POYy7u98duyUFOBMHLcsV24ipQsRacuB+htgmuqOrkiL+hg7w== + +"@tiptap/extension-task-list@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-task-list/-/extension-task-list-2.2.4.tgz#138ebeeb8f0bedd58926094d0e0f52ab36dd7548" + integrity sha512-URh1Yzj/YZBOMkobK4/U8s1QYwIIqHm4b0YadLPPZx9IzTjyV/2bvIakphCmBtxWxeTXW5TbO9eNod3qatq21w== + +"@tiptap/extension-text-style@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text-style/-/extension-text-style-2.2.4.tgz#078f7fc1712e1b0ac7b6597156b8a9bf12a5eaab" + integrity sha512-8Mcxy+HUHPUgK7bOv34m8zhbhzPm6f1/hgbgwz9m+Oel7MNPElsMXtxxygbwtr7Hbj6S4NBoBl/Ir4BkziYRbQ== + +"@tiptap/extension-text@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.2.4.tgz#aa101c568aa78a4ddc06a944eefcd3ac944987d4" + integrity sha512-NlKHMPnRJXB+0AGtDlU0P2Pg+SdesA2lMMd7JzDUgJgL7pX2jOb8eUqSeOjFKuSzFSqYfH6C3o6mQiNhuQMv+g== + +"@tiptap/extension-underline@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-2.2.4.tgz#7be1a616e16452dd17a9c6fd03e40636bc676972" + integrity sha512-jCHgIJMwtXlGHVy/j3L8/QvglHCikkHJw7YS5yf8E/8HlPh1tZfVy/IxdgacDOpUN30X+UPJZQDdVKymafgwdA== + +"@tiptap/pm@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.2.4.tgz#701975e3221ac40b1bfba52d89e1345024212411" + integrity sha512-Po0klR165zgtinhVp1nwMubjyKx6gAY9kH3IzcniYLCkqhPgiqnAcCr61TBpp4hfK8YURBS4ihvCB1dyfCyY8A== + 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-view "^1.32.7" + +"@tiptap/react@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/react/-/react-2.2.4.tgz#bfb6a484a26d85df7a6f9636b98c38f4e83de4c0" + integrity sha512-HkYmMZWcETPZn3KpzdDg/ns2TKeFh54TvtCEInA4ljYtWGLoZc/A+KaiEtMIgVs+Mo1XwrhuoNGjL9c0OK2HJw== + dependencies: + "@tiptap/extension-bubble-menu" "^2.2.4" + "@tiptap/extension-floating-menu" "^2.2.4" + +"@tiptap/starter-kit@^2.1.16": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.2.4.tgz#7d9c35fc423bb0bb6a9b2e660c41a080d8caa7e7" + integrity sha512-Kbk7qUfIZg3+bNa3e/wBeDQt4jJB46uQgM+xy5NSY6H8NZP6gdmmap3aIrn9S/W/hGpxJl4RcXAeaT0CQji9XA== + dependencies: + "@tiptap/core" "^2.2.4" + "@tiptap/extension-blockquote" "^2.2.4" + "@tiptap/extension-bold" "^2.2.4" + "@tiptap/extension-bullet-list" "^2.2.4" + "@tiptap/extension-code" "^2.2.4" + "@tiptap/extension-code-block" "^2.2.4" + "@tiptap/extension-document" "^2.2.4" + "@tiptap/extension-dropcursor" "^2.2.4" + "@tiptap/extension-gapcursor" "^2.2.4" + "@tiptap/extension-hard-break" "^2.2.4" + "@tiptap/extension-heading" "^2.2.4" + "@tiptap/extension-history" "^2.2.4" + "@tiptap/extension-horizontal-rule" "^2.2.4" + "@tiptap/extension-italic" "^2.2.4" + "@tiptap/extension-list-item" "^2.2.4" + "@tiptap/extension-ordered-list" "^2.2.4" + "@tiptap/extension-paragraph" "^2.2.4" + "@tiptap/extension-strike" "^2.2.4" + "@tiptap/extension-text" "^2.2.4" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -4266,6 +4523,11 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" +crelt@^1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== + cross-fetch@^3.1.5: version "3.1.8" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" @@ -7274,6 +7536,18 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + +linkifyjs@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.3.tgz#0edbc346428a7390a23ea2e5939f76112c9ae07f" + integrity sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -7416,6 +7690,18 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +markdown-it@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + 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" + marky@^1.2.2: version "1.2.5" resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.5.tgz#55796b688cbd72390d2d399eaaf1832c9413e3c0" @@ -7451,6 +7737,11 @@ md5hex@^1.0.0: resolved "https://registry.yarnpkg.com/md5hex/-/md5hex-1.0.0.tgz#ed74b477a2ee9369f75efee2f08d5915e52a42e8" integrity sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ== +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -8408,6 +8699,11 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +orderedmap@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" + integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -8755,6 +9051,159 @@ prop-types@*, prop-types@^15.5.7, prop-types@^15.6.2, prop-types@^15.7.2, prop-t object-assign "^4.1.1" react-is "^16.13.1" +prosemirror-changeset@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz#dae94b63aec618fac7bb9061648e6e2a79988383" + integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== + dependencies: + prosemirror-transform "^1.0.0" + +prosemirror-collab@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz#0e8c91e76e009b53457eb3b3051fb68dad029a33" + integrity sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ== + dependencies: + prosemirror-state "^1.0.0" + +prosemirror-commands@^1.0.0, prosemirror-commands@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz#e94aeea52286f658cd984270de9b4c3fff580852" + integrity sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-dropcursor@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz#49b9fb2f583e0d0f4021ff87db825faa2be2832d" + integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" + +prosemirror-gapcursor@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz#5fa336b83789c6199a7341c9493587e249215cb4" + integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== + dependencies: + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" + +prosemirror-history@^1.0.0, prosemirror-history@^1.3.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.4.0.tgz#1edbce630aaf21b808e5a5cd798a09976ecb1827" + integrity sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ== + dependencies: + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.31.0" + rope-sequence "^1.3.0" + +prosemirror-inputrules@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz#ef1519bb2cb0d1e0cec74bad1a97f1c1555068bb" + integrity sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz#14a54763a29c7b2704f561088ccf3384d14eb77e" + integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== + dependencies: + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" + +prosemirror-markdown@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz#d2de09d37897abf7adb6293d925ff132dac5b0a6" + integrity sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ== + dependencies: + markdown-it "^14.0.0" + prosemirror-model "^1.0.0" + +prosemirror-menu@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz#3cfdc7c06d10f9fbd1bce29082c498bd11a0a79a" + integrity sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA== + dependencies: + crelt "^1.0.0" + prosemirror-commands "^1.0.0" + prosemirror-history "^1.0.0" + prosemirror-state "^1.0.0" + +prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.19.0, prosemirror-model@^1.19.4, prosemirror-model@^1.8.1: + version "1.19.4" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.4.tgz#e45e84480c97dd3922095dbe579e1c98c86c0704" + integrity sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ== + dependencies: + orderedmap "^2.0.0" + +prosemirror-schema-basic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz#6695f5175e4628aab179bf62e5568628b9cfe6c7" + integrity sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw== + dependencies: + prosemirror-model "^1.19.0" + +prosemirror-schema-list@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz#05374702cf35a3ba5e7ec31079e355a488d52519" + integrity sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.7.3" + +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.3.tgz#94aecf3ffd54ec37e87aa7179d13508da181a080" + integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.27.0" + +prosemirror-tables@^1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz#9d296bd432d2bc7dca90f14e5c3b5c5f61277f7a" + integrity sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA== + dependencies: + prosemirror-keymap "^1.1.2" + prosemirror-model "^1.8.1" + prosemirror-state "^1.3.1" + prosemirror-transform "^1.2.1" + prosemirror-view "^1.13.3" + +prosemirror-trailing-node@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz#233ddcbda72de06f9b5d758d2a65a8cac482ea10" + integrity sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA== + dependencies: + "@remirror/core-constants" "^2.0.2" + escape-string-regexp "^4.0.0" + +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.3, prosemirror-transform@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz#a47c64a3c373c1bd0ff46e95be3210c8dda0cd11" + integrity sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A== + dependencies: + prosemirror-model "^1.0.0" + +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.32.7: + version "1.33.3" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.33.3.tgz#e93564b3aa4beac6ad0244e9b368563d0cc25727" + integrity sha512-P4Ao/bc4OrU/2yLIf8dL4lJaEtjLR3QjIvQHgJYp2jUS7kYM4bSR6okbBjkqzOs/FwUon6UGjTLdKMnPL1MZqw== + dependencies: + prosemirror-model "^1.16.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -8773,6 +9222,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + punycode@^2.1.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -8880,7 +9334,7 @@ react-devtools-core@^4.27.2, react-devtools-core@^4.27.7: shell-quote "^1.6.1" ws "^7" -react-dom@18.2.0: +react-dom@18.2.0, react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -9048,10 +9502,10 @@ react-native-video@^5.2.1: prop-types "^15.7.2" shaka-player "^2.5.9" -react-native-webview@13.2.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.2.2.tgz#06b04db8e1f4ed57a9dc92f4094aa0e41271b89b" - integrity sha512-uT70y2GUqQzaj2RwRb/QuKRdXeDjXM6oN3DdPqYQlOOMFTCT8r62fybyjVVRoik8io+KLa5KnmuSoS5B2O1BmA== +react-native-webview@^13.8.4: + version "13.8.4" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.8.4.tgz#03b2870090ad6c326a6460ba2f50e5243eb65a94" + integrity sha512-dFoM9EfkAb++ZzycZyKRnjZtNUn85cf6bWp1iBlkgyNml7ULzR1gfaPT3qESoA3K1RfTmf5Xhw0M2In2A3a3wg== dependencies: escape-string-regexp "2.0.0" invariant "2.2.4" @@ -9431,6 +9885,11 @@ rn-placeholder@^3.0.3: resolved "https://registry.yarnpkg.com/rn-placeholder/-/rn-placeholder-3.0.3.tgz#98f635b263ee003af2a984eed32d86ade308df35" integrity sha512-EmVeLT8zDcTPilQZ2OHO/IiYUy2gApKGgbshDZBX0C4qxsn0cFATwgwOwyz8O7Vwg1Hul97Ci95hu7d6Js6XMQ== +rope-sequence@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" + integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== + rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -10200,6 +10659,13 @@ tinycolor2@^1.4.1: resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== +tippy.js@^6.3.7: + version "6.3.7" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== + dependencies: + "@popperjs/core" "^2.9.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10385,6 +10851,11 @@ ua-parser-js@^1.0.35: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + uglify-es@^3.1.9: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" @@ -10571,6 +11042,11 @@ vlq@^1.0.0: resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== +w3c-keyname@^2.2.0: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073"