diff --git a/apps/mobile/app/components/sheets/toc/index.tsx b/apps/mobile/app/components/sheets/toc/index.tsx new file mode 100644 index 000000000..2e6dbf25d --- /dev/null +++ b/apps/mobile/app/components/sheets/toc/index.tsx @@ -0,0 +1,125 @@ +import { useThemeColors } from "@notesnook/theme"; +import React from "react"; +import { View } from "react-native"; +import { PressableButton } from "../../ui/pressable"; +import Paragraph from "../../ui/typography/paragraph"; +import { SIZE } from "../../../utils/size"; +import { presentSheet } from "../../../services/event-manager"; +import Heading from "../../ui/typography/heading"; +import Icon from "react-native-vector-icons/MaterialCommunityIcons"; +import { + editorController, + editorState +} from "../../../screens/editor/tiptap/utils"; +import { FlatList } from "react-native-actions-sheet"; + +type TableOfContentsItem = { + level: number; + title: string; + id: string; + top: number; + isFocused?: boolean; +}; + +interface TableOfContentsProps { + toc: TableOfContentsItem[]; + close?: (ctx?: string | undefined) => void; +} + +const TableOfContentsItem: React.FC<{ + item: TableOfContentsItem; + close?: (ctx?: string | undefined) => void; +}> = ({ item, close }) => { + const { colors } = useThemeColors(); + + return ( + { + editorController.current.commands.scrollIntoViewById(item.id); + close?.(); + }} + > + + + + {item?.title || "New note"} + + + + ); +}; + +const TableOfContents = ({ toc, close }: TableOfContentsProps) => { + return ( + + + Table of contents + + + { + return { + ...item, + isFocused: + (editorState().scrollPosition || 0) > item.top && + (editorState().scrollPosition || 0) < toc[index + 1]?.top + }; + })} + renderItem={({ item }) => ( + + )} + keyExtractor={(item) => item.id} + /> + + ); +}; + +TableOfContents.present = (toc: TableOfContentsItem[]) => { + presentSheet({ + component: (ref, close, update) => ( + + ) + }); +}; + +export default TableOfContents; diff --git a/apps/mobile/app/screens/editor/index.tsx b/apps/mobile/app/screens/editor/index.tsx index dfea6db9e..85f3447e4 100755 --- a/apps/mobile/app/screens/editor/index.tsx +++ b/apps/mobile/app/screens/editor/index.tsx @@ -34,6 +34,7 @@ import { Platform, ScrollView, TextInput, + TouchableOpacity, View, ViewStyle, useWindowDimensions @@ -61,7 +62,6 @@ import { useTabStore } from "./tiptap/use-tab-store"; import { editorController, editorState } from "./tiptap/utils"; import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets"; import { useThemeColors } from "@notesnook/theme"; -import { VaultDialog } from "../../components/dialogs/vault"; import { Button } from "../../components/ui/button"; import Heading from "../../components/ui/typography/heading"; import Seperator from "../../components/ui/seperator"; @@ -70,6 +70,10 @@ import { useDBItem } from "../../hooks/use-db-item"; import Input from "../../components/ui/input"; import BiometicService from "../../services/biometrics"; import { eOnLoadNote, eUnlockNote } from "../../utils/events"; +import Menu, { + MenuItem, + MenuDivider +} from "react-native-reanimated-material-menu"; const style: ViewStyle = { height: "100%", diff --git a/apps/mobile/app/screens/editor/tiptap/commands.ts b/apps/mobile/app/screens/editor/tiptap/commands.ts index 70ec06ef8..0efe31c0a 100644 --- a/apps/mobile/app/screens/editor/tiptap/commands.ts +++ b/apps/mobile/app/screens/editor/tiptap/commands.ts @@ -310,6 +310,20 @@ const image = toBlobURL("${image.dataurl}", "${image.hash}"); keyboardShown = async (keyboardShown: boolean) => { return this.doAsync(`globalThis['keyboardShown']=${keyboardShown};`); }; + + getTableOfContents = async () => { + const tabId = useTabStore.getState().currentTab; + return this.doAsync(` + response = editorControllers[${tabId}]?.getTableOfContents() || []; + `); + }; + + scrollIntoViewById = async (id: string) => { + const tabId = useTabStore.getState().currentTab; + return this.doAsync(` + response = editorControllers[${tabId}]?.scrollIntoView("${id}") || []; + `); + }; //todo add replace image function } diff --git a/apps/mobile/app/screens/editor/tiptap/editor-events.ts b/apps/mobile/app/screens/editor/tiptap/editor-events.ts index 35b10729f..79a3fb29b 100644 --- a/apps/mobile/app/screens/editor/tiptap/editor-events.ts +++ b/apps/mobile/app/screens/editor/tiptap/editor-events.ts @@ -39,5 +39,6 @@ export const EventTypes = { copyToClipboard: "editor-events:copy-to-clipboard", tabsChanged: "editor-events:tabs-changed", showTabs: "editor-events:show-tabs", - tabFocused: "editor-events:tab-focused" + tabFocused: "editor-events:tab-focused", + toc: "editor-events:toc" }; diff --git a/apps/mobile/app/screens/editor/tiptap/types.ts b/apps/mobile/app/screens/editor/tiptap/types.ts index 05033edc7..4fb34d23c 100644 --- a/apps/mobile/app/screens/editor/tiptap/types.ts +++ b/apps/mobile/app/screens/editor/tiptap/types.ts @@ -35,6 +35,7 @@ export type EditorState = { ready: boolean; saveCount: 0; isAwaitingResult: boolean; + scrollPosition: number; }; export type Settings = { diff --git a/apps/mobile/app/screens/editor/tiptap/use-editor-events.ts b/apps/mobile/app/screens/editor/tiptap/use-editor-events.ts index 62a590fd9..beca2fc57 100644 --- a/apps/mobile/app/screens/editor/tiptap/use-editor-events.ts +++ b/apps/mobile/app/screens/editor/tiptap/use-editor-events.ts @@ -68,6 +68,7 @@ import { EventTypes } from "./editor-events"; import { EditorMessage, EditorProps, useEditorType } from "./types"; import { useTabStore } from "./use-tab-store"; import { EditorEvents, editorState } from "./utils"; +import TableOfContents from "../../../components/sheets/toc"; const publishNote = async () => { const user = useUserStore.getState().user; @@ -445,6 +446,9 @@ export const useEditorEvents = ( case EventTypes.properties: showActionsheet(); break; + case EventTypes.scroll: + editorState().scrollPosition = editorMessage.value; + break; case EventTypes.fullscreen: editorState().isFullscreen = true; eSendEvent(eOpenFullscreenEditor); @@ -476,6 +480,9 @@ export const useEditorEvents = ( // console.log("Tabs updated"); break; } + case EventTypes.toc: + TableOfContents.present(editorMessage.value); + break; case EventTypes.showTabs: { EditorTabs.present(); break; diff --git a/apps/mobile/package-lock.json b/apps/mobile/package-lock.json index b1f5094fb..b8010a35a 100644 --- a/apps/mobile/package-lock.json +++ b/apps/mobile/package-lock.json @@ -22120,6 +22120,7 @@ }, "../../packages/editor/node_modules/js-tokens": { "version": "4.0.0", + "dev": true, "license": "MIT" }, "../../packages/editor/node_modules/json-parse-even-better-errors": { @@ -22175,6 +22176,7 @@ }, "../../packages/editor/node_modules/loose-envify": { "version": "1.4.0", + "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -22281,6 +22283,7 @@ }, "../../packages/editor/node_modules/object-assign": { "version": "4.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -22706,6 +22709,7 @@ }, "../../packages/editor/node_modules/react": { "version": "17.0.2", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -22725,6 +22729,7 @@ }, "../../packages/editor/node_modules/react-dom": { "version": "17.0.2", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -22856,6 +22861,7 @@ }, "../../packages/editor/node_modules/scheduler": { "version": "0.20.2", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -30120,6 +30126,7 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -30133,6 +30140,7 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -30279,6 +30287,7 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -30289,6 +30298,7 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -30334,6 +30344,7 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -30370,6 +30381,7 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" @@ -30393,6 +30405,7 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -30406,6 +30419,7 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -30419,6 +30433,7 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -30429,6 +30444,7 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -30452,6 +30468,7 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -30512,6 +30529,7 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -30525,6 +30543,7 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -30551,6 +30570,7 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -30578,6 +30598,7 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -30635,6 +30656,7 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.5", @@ -30649,6 +30671,7 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.5", @@ -30712,6 +30735,7 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", @@ -30726,6 +30750,7 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -30739,6 +30764,7 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -30767,6 +30793,7 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -30823,6 +30850,7 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -30850,6 +30878,7 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -30877,6 +30906,7 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.22.5", @@ -30906,6 +30936,7 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", @@ -30922,6 +30953,7 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.22.5", @@ -30950,6 +30982,7 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -30963,6 +30996,7 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -30977,6 +31011,7 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -31004,6 +31039,7 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.5", @@ -31035,6 +31071,7 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -31049,6 +31086,7 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -31091,6 +31129,7 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -31190,6 +31229,7 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -31281,6 +31321,7 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -31310,6 +31351,7 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -31323,6 +31365,7 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", @@ -31351,6 +31394,7 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", @@ -31365,6 +31409,7 @@ }, "node_modules/@babel/preset-env": { "version": "7.22.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.5", @@ -31457,6 +31502,7 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.0", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -31479,6 +31525,7 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -34087,6 +34134,7 @@ }, "node_modules/@types/eslint": { "version": "8.40.2", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*", @@ -34095,6 +34143,7 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.4", + "dev": true, "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -34103,6 +34152,7 @@ }, "node_modules/@types/estree": { "version": "1.0.1", + "dev": true, "license": "MIT" }, "node_modules/@types/graceful-fs": { @@ -34551,6 +34601,7 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -34559,18 +34610,22 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", @@ -34580,10 +34635,12 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -34594,6 +34651,7 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -34601,6 +34659,7 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", + "dev": true, "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -34608,10 +34667,12 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -34626,6 +34687,7 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -34637,6 +34699,7 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -34647,6 +34710,7 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -34659,6 +34723,7 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -34716,10 +34781,12 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", + "dev": true, "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { @@ -34775,6 +34842,7 @@ }, "node_modules/acorn-import-assertions": { "version": "1.9.0", + "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -35876,6 +35944,7 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.3", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0" @@ -36937,6 +37006,7 @@ }, "node_modules/enhanced-resolve": { "version": "5.15.0", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -37049,6 +37119,7 @@ }, "node_modules/es-module-lexer": { "version": "1.3.0", + "dev": true, "license": "MIT" }, "node_modules/es-set-tostringtag": { @@ -37379,6 +37450,7 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -37390,6 +37462,7 @@ }, "node_modules/eslint-scope/node_modules/estraverse": { "version": "4.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -37575,6 +37648,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -37585,6 +37659,7 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -37592,6 +37667,7 @@ }, "node_modules/esutils": { "version": "2.0.3", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -38644,6 +38720,7 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/global": { @@ -40881,6 +40958,7 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -41147,6 +41225,7 @@ }, "node_modules/loader-runner": { "version": "4.3.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" @@ -43769,6 +43848,7 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -43818,28 +43898,6 @@ } } }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/react-freeze": { "version": "1.0.3", "license": "MIT", @@ -44526,6 +44584,7 @@ }, "node_modules/react-test-renderer": { "version": "18.2.0", + "dev": true, "license": "MIT", "dependencies": { "react-is": "^18.2.0", @@ -44538,10 +44597,12 @@ }, "node_modules/react-test-renderer/node_modules/react-is": { "version": "18.2.0", + "dev": true, "license": "MIT" }, "node_modules/react-test-renderer/node_modules/scheduler": { "version": "0.23.0", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -45376,6 +45437,7 @@ }, "node_modules/serialize-javascript": { "version": "6.0.1", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -46430,6 +46492,7 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.9", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -46462,6 +46525,7 @@ }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -46474,6 +46538,7 @@ }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -47227,6 +47292,7 @@ }, "node_modules/watchpack": { "version": "2.4.0", + "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -47249,6 +47315,7 @@ }, "node_modules/webpack": { "version": "5.88.2", + "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -47363,6 +47430,7 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", + "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -47656,12 +47724,10 @@ }, "dependencies": { "@ammarahmed/notifee-react-native": { - "version": "7.4.4", - "requires": {} + "version": "7.4.4" }, "@ammarahmed/react-native-eventsource": { - "version": "1.1.0", - "requires": {} + "version": "1.1.0" }, "@ammarahmed/react-native-share-extension": { "version": "2.5.6", @@ -49246,12 +49312,14 @@ }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -49328,10 +49396,11 @@ }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "requires": {} + "dev": true }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -49358,6 +49427,7 @@ }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -49376,6 +49446,7 @@ }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -49388,24 +49459,28 @@ }, "@babel/plugin-syntax-import-assertions": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-import-attributes": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -49418,6 +49493,7 @@ }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -49454,12 +49530,14 @@ }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -49472,6 +49550,7 @@ }, "@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -49485,6 +49564,7 @@ }, "@babel/plugin-transform-async-generator-functions": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -49514,6 +49594,7 @@ }, "@babel/plugin-transform-class-properties": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -49521,6 +49602,7 @@ }, "@babel/plugin-transform-class-static-block": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -49556,6 +49638,7 @@ }, "@babel/plugin-transform-dotall-regex": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -49563,12 +49646,14 @@ }, "@babel/plugin-transform-duplicate-keys": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-dynamic-import": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -49583,6 +49668,7 @@ }, "@babel/plugin-transform-export-namespace-from": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -49611,6 +49697,7 @@ }, "@babel/plugin-transform-json-strings": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -49624,6 +49711,7 @@ }, "@babel/plugin-transform-logical-assignment-operators": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -49637,6 +49725,7 @@ }, "@babel/plugin-transform-modules-amd": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -49652,6 +49741,7 @@ }, "@babel/plugin-transform-modules-systemjs": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.22.5", @@ -49661,6 +49751,7 @@ }, "@babel/plugin-transform-modules-umd": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -49675,12 +49766,14 @@ }, "@babel/plugin-transform-new-target": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -49688,6 +49781,7 @@ }, "@babel/plugin-transform-numeric-separator": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -49701,6 +49795,7 @@ }, "@babel/plugin-transform-object-rest-spread": { "version": "7.22.5", + "dev": true, "requires": { "@babel/compat-data": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.5", @@ -49718,6 +49813,7 @@ }, "@babel/plugin-transform-optional-catch-binding": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -49725,6 +49821,7 @@ }, "@babel/plugin-transform-optional-chaining": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -49746,6 +49843,7 @@ }, "@babel/plugin-transform-private-property-in-object": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.5", @@ -49796,6 +49894,7 @@ }, "@babel/plugin-transform-reserved-words": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -49843,6 +49942,7 @@ }, "@babel/plugin-transform-typeof-symbol": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -49858,12 +49958,14 @@ }, "@babel/plugin-transform-unicode-escapes": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-property-regex": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -49878,6 +49980,7 @@ }, "@babel/plugin-transform-unicode-sets-regex": { "version": "7.22.5", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -49885,6 +49988,7 @@ }, "@babel/preset-env": { "version": "7.22.5", + "dev": true, "requires": { "@babel/compat-data": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.5", @@ -49969,7 +50073,8 @@ }, "dependencies": { "semver": { - "version": "6.3.0" + "version": "6.3.0", + "dev": true } } }, @@ -49983,6 +50088,7 @@ }, "@babel/preset-modules": { "version": "0.1.5", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -50110,8 +50216,7 @@ } }, "@bam.tech/react-native-image-resizer": { - "version": "3.0.5", - "requires": {} + "version": "3.0.5" }, "@bcoe/v8-coverage": { "version": "0.2.3", @@ -50208,8 +50313,7 @@ "version": "18.2.0" }, "ws": { - "version": "8.13.0", - "requires": {} + "version": "8.13.0" } } }, @@ -51309,8 +51413,7 @@ }, "dependencies": { "ws": { - "version": "7.5.9", - "requires": {} + "version": "7.5.9" } } }, @@ -53714,8 +53817,7 @@ }, "ws": { "version": "8.13.0", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "4.0.0", @@ -53892,8 +53994,7 @@ }, "dependencies": { "ws": { - "version": "7.5.9", - "requires": {} + "version": "7.5.9" } } }, @@ -56297,8 +56398,7 @@ }, "ws": { "version": "8.13.0", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "4.0.0", @@ -56531,8 +56631,7 @@ }, "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", - "dev": true, - "requires": {} + "dev": true }, "@emotion/utils": { "version": "1.2.1", @@ -56730,8 +56829,7 @@ }, "dependencies": { "ws": { - "version": "7.5.9", - "requires": {} + "version": "7.5.9" } } }, @@ -59135,8 +59233,7 @@ }, "ws": { "version": "8.13.0", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "4.0.0", @@ -59544,8 +59641,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "webidl-conversions": { "version": "3.0.1", @@ -59726,8 +59822,7 @@ }, "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", - "dev": true, - "requires": {} + "dev": true }, "@emotion/utils": { "version": "1.2.1", @@ -60192,8 +60287,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "webidl-conversions": { "version": "3.0.1", @@ -60918,72 +61012,55 @@ } }, "@tiptap/core": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-blockquote": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-bold": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-bullet-list": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-character-count": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-code": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-code-block": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-color": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-document": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-dropcursor": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-font-family": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-gapcursor": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-hard-break": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-heading": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-history": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-horizontal-rule": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-italic": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-link": { "version": "2.1.12", @@ -60992,76 +61069,58 @@ } }, "@tiptap/extension-list-item": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-list-keymap": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-ordered-list": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-paragraph": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-placeholder": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-strike": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-subscript": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-superscript": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table-cell": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table-header": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table-row": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-task-item": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-task-list": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-text": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-text-align": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-text-style": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-underline": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/pm": { "version": "2.1.12", @@ -61716,7 +61775,8 @@ } }, "js-tokens": { - "version": "4.0.0" + "version": "4.0.0", + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -61751,6 +61811,7 @@ }, "loose-envify": { "version": "1.4.0", + "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } @@ -61809,7 +61870,8 @@ } }, "object-assign": { - "version": "4.1.1" + "version": "4.1.1", + "dev": true }, "object.omit": { "version": "3.0.0", @@ -61958,8 +62020,7 @@ } }, "prosemirror-codemark": { - "version": "0.4.2", - "requires": {} + "version": "0.4.2" }, "prosemirror-collab": { "version": "1.3.0", @@ -62101,22 +62162,22 @@ } }, "re-resizable": { - "version": "6.9.9", - "requires": {} + "version": "6.9.9" }, "react": { "version": "17.0.2", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "react-colorful": { - "version": "5.6.1", - "requires": {} + "version": "5.6.1" }, "react-dom": { "version": "17.0.2", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -62196,6 +62257,7 @@ }, "scheduler": { "version": "0.20.2", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -62368,8 +62430,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "util-deprecate": { "version": "1.0.2" @@ -63795,13 +63856,11 @@ }, "@csstools/postcss-unset-value": { "version": "1.0.2", - "dev": true, - "requires": {} + "dev": true }, "@csstools/selector-specificity": { "version": "2.1.1", - "dev": true, - "requires": {} + "dev": true }, "@emotion/babel-plugin": { "version": "11.11.0", @@ -63891,8 +63950,7 @@ "version": "0.8.1" }, "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "requires": {} + "version": "1.0.1" }, "@emotion/utils": { "version": "1.2.1" @@ -64800,8 +64858,7 @@ }, "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", - "dev": true, - "requires": {} + "dev": true }, "@emotion/utils": { "version": "1.2.1", @@ -64999,8 +65056,7 @@ }, "dependencies": { "ws": { - "version": "7.5.9", - "requires": {} + "version": "7.5.9" } } }, @@ -67404,8 +67460,7 @@ }, "ws": { "version": "8.13.0", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "4.0.0", @@ -67813,8 +67868,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "webidl-conversions": { "version": "3.0.1", @@ -67995,8 +68049,7 @@ }, "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", - "dev": true, - "requires": {} + "dev": true }, "@emotion/utils": { "version": "1.2.1", @@ -68461,8 +68514,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "webidl-conversions": { "version": "3.0.1", @@ -69187,72 +69239,55 @@ } }, "@tiptap/core": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-blockquote": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-bold": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-bullet-list": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-character-count": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-code": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-code-block": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-color": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-document": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-dropcursor": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-font-family": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-gapcursor": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-hard-break": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-heading": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-history": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-horizontal-rule": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-italic": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-link": { "version": "2.1.12", @@ -69261,76 +69296,58 @@ } }, "@tiptap/extension-list-item": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-list-keymap": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-ordered-list": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-paragraph": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-placeholder": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-strike": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-subscript": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-superscript": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table-cell": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table-header": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-table-row": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-task-item": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-task-list": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-text": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-text-align": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-text-style": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/extension-underline": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "@tiptap/pm": { "version": "2.1.12", @@ -69985,7 +70002,8 @@ } }, "js-tokens": { - "version": "4.0.0" + "version": "4.0.0", + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -70020,6 +70038,7 @@ }, "loose-envify": { "version": "1.4.0", + "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } @@ -70078,7 +70097,8 @@ } }, "object-assign": { - "version": "4.1.1" + "version": "4.1.1", + "dev": true }, "object.omit": { "version": "3.0.0", @@ -70227,8 +70247,7 @@ } }, "prosemirror-codemark": { - "version": "0.4.2", - "requires": {} + "version": "0.4.2" }, "prosemirror-collab": { "version": "1.3.0", @@ -70370,22 +70389,22 @@ } }, "re-resizable": { - "version": "6.9.9", - "requires": {} + "version": "6.9.9" }, "react": { "version": "17.0.2", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "react-colorful": { - "version": "5.6.1", - "requires": {} + "version": "5.6.1" }, "react-dom": { "version": "17.0.2", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -70465,6 +70484,7 @@ }, "scheduler": { "version": "0.20.2", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -70637,8 +70657,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "util-deprecate": { "version": "1.0.2" @@ -71190,8 +71209,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "webidl-conversions": { "version": "3.0.1", @@ -72006,13 +72024,11 @@ }, "acorn-import-assertions": { "version": "1.8.0", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", - "dev": true, - "requires": {} + "dev": true }, "acorn-node": { "version": "1.8.2", @@ -72293,8 +72309,7 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -72349,8 +72364,7 @@ }, "babel-plugin-named-asset-import": { "version": "0.3.8", - "dev": true, - "requires": {} + "dev": true }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", @@ -72900,8 +72914,7 @@ }, "css-declaration-sorter": { "version": "6.3.1", - "dev": true, - "requires": {} + "dev": true }, "css-has-pseudo": { "version": "3.0.4", @@ -72981,8 +72994,7 @@ }, "css-prefers-color-scheme": { "version": "6.0.3", - "dev": true, - "requires": {} + "dev": true }, "css-select": { "version": "4.3.0", @@ -73071,8 +73083,7 @@ }, "cssnano-utils": { "version": "3.1.0", - "dev": true, - "requires": {} + "dev": true }, "csso": { "version": "4.2.0", @@ -73892,8 +73903,7 @@ }, "eslint-plugin-react-hooks": { "version": "4.6.0", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-testing-library": { "version": "5.10.2", @@ -74379,8 +74389,7 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true, - "requires": {} + "dev": true }, "chalk": { "version": "4.1.2", @@ -74864,8 +74873,7 @@ }, "icss-utils": { "version": "5.1.0", - "dev": true, - "requires": {} + "dev": true }, "idb": { "version": "7.1.1", @@ -75927,8 +75935,7 @@ }, "jest-pnp-resolver": { "version": "1.2.3", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "27.5.1", @@ -76803,8 +76810,7 @@ } }, "mdi-react": { - "version": "9.1.0", - "requires": {} + "version": "9.1.0" }, "mdn-data": { "version": "2.0.4", @@ -77333,8 +77339,7 @@ }, "postcss-browser-comments": { "version": "4.0.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-calc": { "version": "8.2.4", @@ -77420,23 +77425,19 @@ }, "postcss-discard-comments": { "version": "5.1.2", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-duplicates": { "version": "5.1.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-empty": { "version": "5.1.1", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-overridden": { "version": "5.1.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-double-position-gradients": { "version": "3.1.2", @@ -77455,8 +77456,7 @@ }, "postcss-flexbugs-fixes": { "version": "5.0.2", - "dev": true, - "requires": {} + "dev": true }, "postcss-focus-visible": { "version": "6.0.4", @@ -77474,13 +77474,11 @@ }, "postcss-font-variant": { "version": "5.0.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-gap-properties": { "version": "3.0.5", - "dev": true, - "requires": {} + "dev": true }, "postcss-image-set-function": { "version": "4.0.7", @@ -77500,8 +77498,7 @@ }, "postcss-initial": { "version": "4.0.1", - "dev": true, - "requires": {} + "dev": true }, "postcss-js": { "version": "4.0.1", @@ -77557,13 +77554,11 @@ }, "postcss-logical": { "version": "5.0.4", - "dev": true, - "requires": {} + "dev": true }, "postcss-media-minmax": { "version": "5.0.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-merge-longhand": { "version": "5.1.7", @@ -77617,8 +77612,7 @@ }, "postcss-modules-extract-imports": { "version": "3.0.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -77669,8 +77663,7 @@ }, "postcss-normalize-charset": { "version": "5.1.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -77732,8 +77725,7 @@ }, "postcss-opacity-percentage": { "version": "1.1.3", - "dev": true, - "requires": {} + "dev": true }, "postcss-ordered-values": { "version": "5.1.3", @@ -77752,8 +77744,7 @@ }, "postcss-page-break": { "version": "3.0.4", - "dev": true, - "requires": {} + "dev": true }, "postcss-place": { "version": "7.0.5", @@ -77841,8 +77832,7 @@ }, "postcss-replace-overflow-wrap": { "version": "4.0.0", - "dev": true, - "requires": {} + "dev": true }, "postcss-selector-not": { "version": "6.0.1", @@ -78559,8 +78549,7 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -78918,8 +78907,7 @@ }, "style-loader": { "version": "3.3.1", - "dev": true, - "requires": {} + "dev": true }, "style-value-types": { "version": "5.0.0", @@ -79591,8 +79579,7 @@ }, "ws": { "version": "8.12.1", - "dev": true, - "requires": {} + "dev": true } } }, @@ -79969,8 +79956,7 @@ }, "ws": { "version": "7.5.9", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "3.0.0", @@ -80017,8 +80003,7 @@ "dev": true }, "zustand": { - "version": "3.7.2", - "requires": {} + "version": "3.7.2" } } }, @@ -80570,8 +80555,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "webidl-conversions": { "version": "3.0.1", @@ -81248,8 +81232,7 @@ }, "use-sync-external-store": { "version": "1.2.0", - "dev": true, - "requires": {} + "dev": true }, "webidl-conversions": { "version": "3.0.1", @@ -81754,12 +81737,10 @@ } }, "@react-native-clipboard/clipboard": { - "version": "1.11.2", - "requires": {} + "version": "1.11.2" }, "@react-native-community/checkbox": { - "version": "0.5.15", - "requires": {} + "version": "0.5.15" }, "@react-native-community/cli": { "version": "11.3.2", @@ -81949,8 +81930,7 @@ }, "dependencies": { "ws": { - "version": "7.5.9", - "requires": {} + "version": "7.5.9" } } }, @@ -81995,16 +81975,13 @@ } }, "@react-native-community/netinfo": { - "version": "9.3.10", - "requires": {} + "version": "9.3.10" }, "@react-native-community/toolbar-android": { - "version": "0.2.1", - "requires": {} + "version": "0.2.1" }, "@react-native-masked-view/masked-view": { - "version": "0.2.9", - "requires": {} + "version": "0.2.9" }, "@react-native/assets-registry": { "version": "0.72.0" @@ -82082,8 +82059,7 @@ } }, "@react-navigation/elements": { - "version": "1.3.17", - "requires": {} + "version": "1.3.17" }, "@react-navigation/native": { "version": "6.1.6", @@ -82168,12 +82144,10 @@ "version": "0.3.0" }, "@trpc/client": { - "version": "10.38.3", - "requires": {} + "version": "10.38.3" }, "@trpc/react-query": { - "version": "10.38.3", - "requires": {} + "version": "10.38.3" }, "@trpc/server": { "version": "10.38.3" @@ -82217,6 +82191,7 @@ }, "@types/eslint": { "version": "8.40.2", + "dev": true, "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -82224,13 +82199,15 @@ }, "@types/eslint-scope": { "version": "3.7.4", + "dev": true, "requires": { "@types/eslint": "*", "@types/estree": "*" } }, "@types/estree": { - "version": "1.0.1" + "version": "1.0.1", + "dev": true }, "@types/graceful-fs": { "version": "4.1.6", @@ -82516,22 +82493,27 @@ }, "@webassemblyjs/ast": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6" + "version": "1.11.6", + "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.6" + "version": "1.11.6", + "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6" + "version": "1.11.6", + "dev": true }, "@webassemblyjs/helper-numbers": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -82539,10 +82521,12 @@ } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6" + "version": "1.11.6", + "dev": true }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -82552,21 +82536,25 @@ }, "@webassemblyjs/ieee754": { "version": "1.11.6", + "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { "version": "1.11.6", + "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.6" + "version": "1.11.6", + "dev": true }, "@webassemblyjs/wasm-edit": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -82580,6 +82568,7 @@ }, "@webassemblyjs/wasm-gen": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -82590,6 +82579,7 @@ }, "@webassemblyjs/wasm-opt": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -82599,6 +82589,7 @@ }, "@webassemblyjs/wasm-parser": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -82610,6 +82601,7 @@ }, "@webassemblyjs/wast-printer": { "version": "1.11.6", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -82617,28 +82609,27 @@ }, "@webpack-cli/configtest": { "version": "2.1.1", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "2.0.2", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/serve": { "version": "2.0.5", - "dev": true, - "requires": {} + "dev": true }, "@xmldom/xmldom": { "version": "0.8.10", "dev": true }, "@xtuc/ieee754": { - "version": "1.2.0" + "version": "1.2.0", + "dev": true }, "@xtuc/long": { - "version": "4.2.2" + "version": "4.2.2", + "dev": true }, "@yarnpkg/lockfile": { "version": "1.1.0", @@ -82671,12 +82662,11 @@ }, "acorn-import-assertions": { "version": "1.9.0", - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", - "dev": true, - "requires": {} + "dev": true }, "ajv": { "version": "8.12.0", @@ -82688,8 +82678,7 @@ } }, "ajv-keywords": { - "version": "3.5.2", - "requires": {} + "version": "3.5.2" }, "anser": { "version": "1.4.10" @@ -82891,8 +82880,7 @@ } }, "babel-core": { - "version": "7.0.0-bridge.0", - "requires": {} + "version": "7.0.0-bridge.0" }, "babel-jest": { "version": "29.6.2", @@ -83338,7 +83326,8 @@ } }, "chrome-trace-event": { - "version": "1.0.3" + "version": "1.0.3", + "dev": true }, "ci-info": { "version": "3.8.0" @@ -83834,8 +83823,7 @@ }, "ws": { "version": "7.5.9", - "dev": true, - "requires": {} + "dev": true }, "yallist": { "version": "4.0.0", @@ -84006,6 +83994,7 @@ }, "enhanced-resolve": { "version": "5.15.0", + "dev": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -84079,7 +84068,8 @@ } }, "es-module-lexer": { - "version": "1.3.0" + "version": "1.3.0", + "dev": true }, "es-set-tostringtag": { "version": "2.0.1", @@ -84229,8 +84219,7 @@ }, "eslint-config-prettier": { "version": "8.8.0", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-eslint-comments": { "version": "3.2.0", @@ -84313,8 +84302,7 @@ }, "eslint-plugin-react-hooks": { "version": "4.6.0", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-react-native": { "version": "4.0.0", @@ -84341,13 +84329,15 @@ }, "eslint-scope": { "version": "5.1.1", + "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "dependencies": { "estraverse": { - "version": "4.3.0" + "version": "4.3.0", + "dev": true } } }, @@ -84382,15 +84372,18 @@ }, "esrecurse": { "version": "4.3.0", + "dev": true, "requires": { "estraverse": "^5.2.0" } }, "estraverse": { - "version": "5.3.0" + "version": "5.3.0", + "dev": true }, "esutils": { - "version": "2.0.3" + "version": "2.0.3", + "dev": true }, "etag": { "version": "1.8.1" @@ -85091,7 +85084,8 @@ } }, "glob-to-regexp": { - "version": "0.4.1" + "version": "0.4.1", + "dev": true }, "global": { "version": "4.4.0", @@ -85846,8 +85840,7 @@ }, "dedent": { "version": "1.5.1", - "dev": true, - "requires": {} + "dev": true }, "pretty-format": { "version": "29.6.2", @@ -86158,8 +86151,7 @@ }, "jest-pnp-resolver": { "version": "1.2.3", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "29.4.3", @@ -86493,7 +86485,8 @@ "version": "1.0.2" }, "json-parse-even-better-errors": { - "version": "2.3.1" + "version": "2.3.1", + "dev": true }, "json-schema-traverse": { "version": "1.0.0" @@ -86662,7 +86655,8 @@ } }, "loader-runner": { - "version": "4.3.0" + "version": "4.3.0", + "dev": true }, "loader-utils": { "version": "2.0.4", @@ -86974,8 +86968,7 @@ } }, "ws": { - "version": "7.5.9", - "requires": {} + "version": "7.5.9" } } }, @@ -87187,8 +87180,7 @@ } }, "ws": { - "version": "7.5.9", - "requires": {} + "version": "7.5.9" }, "y18n": { "version": "4.0.3" @@ -88312,6 +88304,7 @@ }, "randombytes": { "version": "2.1.0", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -88333,35 +88326,12 @@ }, "dependencies": { "ws": { - "version": "7.5.9", - "requires": {} - } - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "dependencies": { - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0" - } + "version": "7.5.9" } } }, "react-freeze": { - "version": "1.0.3", - "requires": {} + "version": "1.0.3" }, "react-is": { "version": "16.13.1" @@ -88413,13 +88383,11 @@ } }, "react-native-actions-sheet": { - "version": "0.9.0-alpha.24", - "requires": {} + "version": "0.9.0-alpha.24" }, "react-native-actions-shortcuts": { "version": "1.0.1", - "dev": true, - "requires": {} + "dev": true }, "react-native-background-actions": { "version": "2.6.7", @@ -88429,8 +88397,7 @@ }, "react-native-begin-background-task": { "version": "git+ssh://git@github.com/blockfirm/react-native-begin-background-task.git#c2aa793249db6cc6298a812905f955a99b864e78", - "from": "react-native-begin-background-task@https://github.com/blockfirm/react-native-begin-background-task.git", - "requires": {} + "from": "react-native-begin-background-task@https://github.com/blockfirm/react-native-begin-background-task.git" }, "react-native-blob-util": { "version": "0.18.3", @@ -88491,16 +88458,14 @@ }, "react-native-check-version": { "version": "git+ssh://git@github.com/flexible-agency/react-native-check-version.git#030a2be31d7d2cdce95c78c4528a29e377c9e6ac", - "from": "react-native-check-version@https://github.com/flexible-agency/react-native-check-version", - "requires": {} + "from": "react-native-check-version@https://github.com/flexible-agency/react-native-check-version" }, "react-native-cli-bump-version": { "version": "1.5.0", "dev": true }, "react-native-config": { - "version": "1.5.1", - "requires": {} + "version": "1.5.1" }, "react-native-date-picker": { "version": "4.2.6", @@ -88509,8 +88474,7 @@ } }, "react-native-device-info": { - "version": "8.7.1", - "requires": {} + "version": "8.7.1" }, "react-native-document-picker": { "version": "7.1.3", @@ -88531,13 +88495,11 @@ "from": "react-native-exit-app@https://github.com/ammarahm-ed/react-native-exit-app.git" }, "react-native-file-viewer": { - "version": "2.1.5", - "requires": {} + "version": "2.1.5" }, "react-native-fingerprint-scanner": { "version": "git+ssh://git@github.com/ammarahm-ed/react-native-fingerprint-scanner.git#7beac32968684b13948f141d84b48e700c838591", - "from": "react-native-fingerprint-scanner@https://github.com/ammarahm-ed/react-native-fingerprint-scanner.git", - "requires": {} + "from": "react-native-fingerprint-scanner@https://github.com/ammarahm-ed/react-native-fingerprint-scanner.git" }, "react-native-gesture-handler": { "version": "2.12.0", @@ -88556,8 +88518,7 @@ } }, "react-native-gzip": { - "version": "1.1.0", - "requires": {} + "version": "1.1.0" }, "react-native-html-to-pdf-lite": { "version": "0.9.1" @@ -88569,12 +88530,10 @@ } }, "react-native-image-pan-zoom": { - "version": "2.1.12", - "requires": {} + "version": "2.1.12" }, "react-native-image-picker": { - "version": "4.1.2", - "requires": {} + "version": "4.1.2" }, "react-native-image-zoom-viewer": { "version": "3.0.1", @@ -88586,8 +88545,7 @@ "version": "4.3.3" }, "react-native-iphone-x-helper": { - "version": "1.3.1", - "requires": {} + "version": "1.3.1" }, "react-native-keyboard-aware-scroll-view": { "version": "0.9.5", @@ -88602,8 +88560,7 @@ "react-native-mmkv-storage": { "version": "0.10.0-alpha.11", "resolved": "https://registry.npmjs.org/react-native-mmkv-storage/-/react-native-mmkv-storage-0.10.0-alpha.11.tgz", - "integrity": "sha512-rr5i7v9aOgMHZ3a7LjpwCrHd2ULdCX2Q+n+zlDOEgfXV0P+4EloptE39Z4iOQhQPyr3b/s3q9gj+4sS1QCPkHw==", - "requires": {} + "integrity": "sha512-rr5i7v9aOgMHZ3a7LjpwCrHd2ULdCX2Q+n+zlDOEgfXV0P+4EloptE39Z4iOQhQPyr3b/s3q9gj+4sS1QCPkHw==" }, "react-native-modal-datetime-picker": { "version": "14.0.0", @@ -88615,13 +88572,11 @@ "version": "2.0.2" }, "react-native-notification-sounds": { - "version": "0.5.5", - "requires": {} + "version": "0.5.5" }, "react-native-orientation": { "version": "git+ssh://git@github.com/yamill/react-native-orientation.git#b45830cce0837fa668838554e023979497673c82", - "from": "react-native-orientation@https://github.com/yamill/react-native-orientation.git", - "requires": {} + "from": "react-native-orientation@https://github.com/yamill/react-native-orientation.git" }, "react-native-pdf": { "version": "6.6.2", @@ -88642,8 +88597,7 @@ }, "react-native-privacy-snapshot": { "version": "git+ssh://git@github.com/standardnotes/react-native-privacy-snapshot.git#653e904c90fc6f2b578da59138f2bfe5d7f942fe", - "from": "react-native-privacy-snapshot@https://github.com/standardnotes/react-native-privacy-snapshot.git", - "requires": {} + "from": "react-native-privacy-snapshot@https://github.com/standardnotes/react-native-privacy-snapshot.git" }, "react-native-progress": { "version": "5.0.0", @@ -88661,8 +88615,7 @@ "react-native-quick-sqlite": { "version": "8.0.6", "resolved": "https://registry.npmjs.org/react-native-quick-sqlite/-/react-native-quick-sqlite-8.0.6.tgz", - "integrity": "sha512-XtwXnfZ1a6zRzAHoWFyVJsP3p8etx3/xww1oFKGdiOSj054PdYIeup9A53rtQ6ENyg+aqSKOgmxoN/PetulGOQ==", - "requires": {} + "integrity": "sha512-XtwXnfZ1a6zRzAHoWFyVJsP3p8etx3/xww1oFKGdiOSj054PdYIeup9A53rtQ6ENyg+aqSKOgmxoN/PetulGOQ==" }, "react-native-reanimated": { "version": "3.3.0", @@ -88680,20 +88633,16 @@ }, "react-native-reanimated-material-menu": { "version": "git+ssh://git@github.com/ammarahm-ed/react-native-reanimated-material-menu.git#b1b19ba9e87333c76eb8abc3dc8377fe3ddd8bfc", - "from": "react-native-reanimated-material-menu@github:ammarahm-ed/react-native-reanimated-material-menu", - "requires": {} + "from": "react-native-reanimated-material-menu@github:ammarahm-ed/react-native-reanimated-material-menu" }, "react-native-reanimated-progress-bar": { - "version": "1.0.1", - "requires": {} + "version": "1.0.1" }, "react-native-safe-area-context": { - "version": "4.6.3", - "requires": {} + "version": "4.6.3" }, "react-native-scoped-storage": { - "version": "1.9.5", - "requires": {} + "version": "1.9.5" }, "react-native-screens": { "version": "3.21.1", @@ -88719,8 +88668,7 @@ } }, "react-native-swiper-flatlist": { - "version": "3.2.2", - "requires": {} + "version": "3.2.2" }, "react-native-tooltips": { "version": "1.0.3" @@ -88773,8 +88721,7 @@ } }, "react-native-zip-archive": { - "version": "6.0.9", - "requires": {} + "version": "6.0.9" }, "react-refresh": { "version": "0.14.0" @@ -88788,6 +88735,7 @@ }, "react-test-renderer": { "version": "18.2.0", + "dev": true, "requires": { "react-is": "^18.2.0", "react-shallow-renderer": "^16.15.0", @@ -88795,10 +88743,12 @@ }, "dependencies": { "react-is": { - "version": "18.2.0" + "version": "18.2.0", + "dev": true }, "scheduler": { "version": "0.23.0", + "dev": true, "requires": { "loose-envify": "^1.1.0" } @@ -89340,6 +89290,7 @@ }, "serialize-javascript": { "version": "6.0.1", + "dev": true, "requires": { "randombytes": "^2.1.0" } @@ -90051,6 +90002,7 @@ }, "terser-webpack-plugin": { "version": "5.3.9", + "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -90061,6 +90013,7 @@ "dependencies": { "jest-worker": { "version": "27.5.1", + "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -90069,6 +90022,7 @@ }, "supports-color": { "version": "8.1.1", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -90447,8 +90401,7 @@ "version": "3.1.1" }, "use-latest-callback": { - "version": "0.1.6", - "requires": {} + "version": "0.1.6" }, "use-subscription": { "version": "1.8.0", @@ -90457,8 +90410,7 @@ } }, "use-sync-external-store": { - "version": "1.2.0", - "requires": {} + "version": "1.2.0" }, "utf8-byte-length": { "version": "1.0.4", @@ -90508,6 +90460,7 @@ }, "watchpack": { "version": "2.4.0", + "dev": true, "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -90524,6 +90477,7 @@ }, "webpack": { "version": "5.88.2", + "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -90589,7 +90543,8 @@ } }, "webpack-sources": { - "version": "3.2.3" + "version": "3.2.3", + "dev": true }, "whatwg-fetch": { "version": "3.6.2" @@ -90765,8 +90720,7 @@ "version": "0.1.0" }, "zustand": { - "version": "3.7.2", - "requires": {} + "version": "3.7.2" } } } diff --git a/packages/editor-mobile/package-lock.json b/packages/editor-mobile/package-lock.json index 923a9f396..ad3c61e95 100644 --- a/packages/editor-mobile/package-lock.json +++ b/packages/editor-mobile/package-lock.json @@ -14,6 +14,7 @@ "@mdi/react": "^1.6.0", "@notesnook/editor": "file:../editor", "@notesnook/theme": "file:../theme", + "@szhsin/react-menu": "^4.1.0", "buffer": "^6.0.3", "framer-motion": "^10.16.8", "mdi-react": "9.1.0", @@ -4108,6 +4109,19 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@szhsin/react-menu": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@szhsin/react-menu/-/react-menu-4.1.0.tgz", + "integrity": "sha512-lYYGUxqJxM2b/jD2Cn5a9RVOvHl9VBMX8qOnHZuX1w08cO2jslykpz5P75D7WnqudLnXsJ4k4+tI+q2U8XIFYw==", + "dependencies": { + "prop-types": "^15.7.2", + "react-transition-state": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4360,7 +4374,7 @@ "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true + "devOptional": true }, "node_modules/@types/q": { "version": "1.5.8", @@ -4384,7 +4398,7 @@ "version": "18.2.39", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4419,7 +4433,7 @@ "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true + "devOptional": true }, "node_modules/@types/semver": { "version": "7.5.6", @@ -9715,7 +9729,7 @@ "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "dev": true, + "devOptional": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -15727,6 +15741,15 @@ } } }, + "node_modules/react-transition-state": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-transition-state/-/react-transition-state-2.1.1.tgz", + "integrity": "sha512-kQx5g1FVu9knoz1T1WkapjUgFz08qQ/g1OmuWGi3/AoEFfS0kStxrPlZx81urjCXdz2d+1DqLpU6TyLW/Ro04Q==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -17776,6 +17799,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/packages/editor-mobile/package.json b/packages/editor-mobile/package.json index ce8f742cc..2dd483cff 100644 --- a/packages/editor-mobile/package.json +++ b/packages/editor-mobile/package.json @@ -8,6 +8,7 @@ "@mdi/react": "^1.6.0", "@notesnook/editor": "file:../editor", "@notesnook/theme": "file:../theme", + "@szhsin/react-menu": "^4.1.0", "buffer": "^6.0.3", "framer-motion": "^10.16.8", "mdi-react": "9.1.0", diff --git a/packages/editor-mobile/src/components/editor.tsx b/packages/editor-mobile/src/components/editor.tsx index c96b11195..d7843cad1 100644 --- a/packages/editor-mobile/src/components/editor.tsx +++ b/packages/editor-mobile/src/components/editor.tsx @@ -20,6 +20,7 @@ along with this program. If not, see . import { Editor, getFontById, + getTableOfContents, PortalProvider, Toolbar, usePermissionHandler, @@ -49,7 +50,6 @@ import Header from "./header"; import StatusBar from "./statusbar"; import Tags from "./tags"; import Title from "./title"; -import FingerprintIcon from "mdi-react/FingerprintIcon"; globalThis.toBlobURL = toBlobURL; @@ -160,7 +160,14 @@ const Tiptap = ({ settings }: { settings: Settings }) => { }); }, []); - const controller = useEditorController(update); + const controller = useEditorController({ + update, + getTableOfContents: () => { + return !containerRef.current + ? [] + : getTableOfContents(containerRef.current); + } + }); const controllerRef = useRef(controller); globalThis.editorControllers[tab.id] = controller; diff --git a/packages/editor-mobile/src/components/header.tsx b/packages/editor-mobile/src/components/header.tsx index fa45b4f77..2b1034aa3 100644 --- a/packages/editor-mobile/src/components/header.tsx +++ b/packages/editor-mobile/src/components/header.tsx @@ -17,32 +17,73 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +import { + ControlledMenu, + // applyStatics + MenuItem as MenuItemInner, + SubMenu as SubMenuInner, + MenuDivider +} from "@szhsin/react-menu"; import ArrowBackIcon from "mdi-react/ArrowBackIcon"; import ArrowULeftTopIcon from "mdi-react/ArrowULeftTopIcon"; import ArrowURightTopIcon from "mdi-react/ArrowURightTopIcon"; import CrownIcon from "mdi-react/CrownIcon"; import DotsHorizontalIcon from "mdi-react/DotsHorizontalIcon"; +import DotsVerticalIcon from "mdi-react/DotsVerticalIcon"; import FullscreenIcon from "mdi-react/FullscreenIcon"; import MagnifyIcon from "mdi-react/MagnifyIcon"; -import React from "react"; +import React, { useRef, useState } from "react"; import { useSafeArea } from "../hooks/useSafeArea"; import { useTabContext, useTabStore } from "../hooks/useTabStore"; import { EventTypes, Settings } from "../utils"; import styles from "./styles.module.css"; +import TableOfContentsIcon from "mdi-react/TableOfContentsIcon"; +const menuClassName = ({ state }: any) => + state === "opening" + ? styles.menuOpening + : state === "closing" + ? styles.menuClosing + : styles.menu; + +const menuItemClassName = ({ hover, disabled }: any) => + disabled + ? styles.menuItemDisabled + : hover + ? styles.menuItemHover + : styles.menuItem; + +const submenuItemClassName = (modifiers: any) => + `${styles.submenuItem} ${menuItemClassName(modifiers)}`; + +const MenuItem = (props: any) => ( + +); + +const SubMenu = (props: any) => ( + +); const Button = ({ onPress, children, style, - preventDefault = true + preventDefault = true, + fwdRef }: { onPress: () => void; children: React.ReactNode; style: React.CSSProperties; preventDefault?: boolean; + fwdRef?: any; }) => { return ( + + { + setOpen(false); + }} + autoFocus={false} + onItemClick={(e) => { + switch (e.value) { + case "toc": + post( + EventTypes.toc, + editorControllers[tab.id]?.getTableOfContents(), + tab.id, + tab.noteId + ); + break; + case "properties": + logger("info", "post properties..."); + post(EventTypes.properties, undefined, tab.id, tab.noteId); + break; + default: + break; + } + }} + > + + + Table of contents + + + + Note Properties + + )} diff --git a/packages/editor-mobile/src/components/statusbar.tsx b/packages/editor-mobile/src/components/statusbar.tsx index f5c4c260d..0e8dda0b0 100644 --- a/packages/editor-mobile/src/components/statusbar.tsx +++ b/packages/editor-mobile/src/components/statusbar.tsx @@ -53,6 +53,7 @@ function StatusBar({ container }: { container: RefObject }) { const onScroll = React.useCallback((event: Event) => { const currentOffset = (event.target as HTMLElement)?.scrollTop; + post("editor-event:scroll", currentOffset); if (currentOffset < 200) { if (stickyRef.current) { stickyRef.current = false; diff --git a/packages/editor-mobile/src/components/styles.module.css b/packages/editor-mobile/src/components/styles.module.css index 0e065c16d..495034ae4 100644 --- a/packages/editor-mobile/src/components/styles.module.css +++ b/packages/editor-mobile/src/components/styles.module.css @@ -31,3 +31,76 @@ .container::-webkit-scrollbar { display: none; } + + +@keyframes menuShow { + from { + opacity: 0; + } +} + +@keyframes menuHide { + to { + opacity: 0; + } +} + +.menu { + -webkit-font-smoothing: antialiased; + box-sizing: border-box; + z-index: 999; + list-style: none; + user-select: none; + padding: 6px; + font-family: sans-serif; + font-size: 0.95em; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 20px 1px rgba(0, 0, 0, 0.1); + border-radius: 6px; + background-color: var(--nn_secondary_background); + min-width: 12rem; +} + +.menuOpening { + composes: menu; + animation: menuShow 0.15s ease-out; +} + +.menuClosing { + composes: menu; + animation: menuHide 0.2s ease-out forwards; +} + +.menuItem { + cursor: pointer; + border-radius: 6px; + padding: 0.375rem 0.625rem; + color: var(--nn_primary_paragraph); + font-family: 'Open Sans'; + padding: 12px 6px; + +} + +.menuItemHover { + composes: menuItem; + color: #fff; + background-color: var(--nn_primary_hover); +} + +.menuItemDisabled { + composes: menuItem; + cursor: default; + color: #aaa; +} + +.menu:focus, +.menuItem:focus { + outline: none; +} + +.menuDivider { + height: 1px; + margin: 0.1rem 0.1rem; + background-color: var(--nn_primary_border); + +} diff --git a/packages/editor-mobile/src/hooks/useEditorController.ts b/packages/editor-mobile/src/hooks/useEditorController.ts index ba5fe464f..0e1f5fa95 100644 --- a/packages/editor-mobile/src/hooks/useEditorController.ts +++ b/packages/editor-mobile/src/hooks/useEditorController.ts @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -import { Editor } from "@notesnook/editor"; +import { Editor, scrollIntoViewById } from "@notesnook/editor"; import { ThemeDefinition, useThemeColors, @@ -106,9 +106,17 @@ export type EditorController = { updateTab: () => void; loading: boolean; setLoading: (value: boolean) => void; + getTableOfContents: () => any[]; + scrollIntoView: (id: string) => void; }; -export function useEditorController(update: () => void): EditorController { +export function useEditorController({ + update, + getTableOfContents +}: { + update: () => void; + getTableOfContents: () => any[]; +}): EditorController { const tab = useTabContext(); const [loading, setLoading] = useState(true); const setTheme = useThemeEngineStore((store) => store.setTheme); @@ -317,6 +325,8 @@ export function useEditorController(update: () => void): EditorController { }; return { + getTableOfContents: getTableOfContents, + scrollIntoView: (id: string) => scrollIntoViewById(id), contentChange, selectionChange, titleChange, diff --git a/packages/editor-mobile/src/utils/index.ts b/packages/editor-mobile/src/utils/index.ts index c2856e7f3..663d67174 100644 --- a/packages/editor-mobile/src/utils/index.ts +++ b/packages/editor-mobile/src/utils/index.ts @@ -173,7 +173,8 @@ export const EventTypes = { copyToClipboard: "editor-events:copy-to-clipboard", tabsChanged: "editor-events:tabs-changed", showTabs: "editor-events:show-tabs", - tabFocused: "editor-events:tab-focused" + tabFocused: "editor-events:tab-focused", + toc: "editor-events:toc" } as const; export function isReactNative(): boolean { diff --git a/packages/editor/src/extensions/block-id/blockid.ts b/packages/editor/src/extensions/block-id/blockid.ts new file mode 100644 index 000000000..20ec968a0 --- /dev/null +++ b/packages/editor/src/extensions/block-id/blockid.ts @@ -0,0 +1,77 @@ +import { Node } from "@tiptap/core"; +import { Plugin } from "@tiptap/pm/state"; +import { nanoid } from "nanoid"; +import { getChangedNodes } from "../../utils/prosemirror"; + +const types: { [name: string]: boolean } = { + heading: true, + paragraph: true +}; + +export const BlockId = Node.create({ + name: "blockId", + + addGlobalAttributes() { + return [ + { + types: Object.keys(types), + attributes: { + blockId: { + default: null, + keepOnSplit: false, + parseHTML: (element) => { + const id = element.getAttribute("data-block-id"); + return id || null; + }, + renderHTML: (attributes) => { + return { + "data-block-id": attributes?.blockId + }; + } + } + } + } + ]; + }, + addProseMirrorPlugins() { + return [ + new Plugin({ + appendTransaction: (_transactions, oldState, newState) => { + // no changes + if (newState.doc === oldState.doc) { + return; + } + const tr = newState.tr; + + const blockIds = new Set(); + const blocksWithoutBlockId: any[] = []; + + for (const tr of _transactions) { + blocksWithoutBlockId.push( + ...getChangedNodes(tr, { + descend: false, + predicate: (n) => { + const shouldInclude = + n.isBlock && + (!n.attrs.blockId || blockIds.has(n.attrs.blockId)); + + if (n.attrs.blockId) blockIds.add(n.attrs.blockId); + return shouldInclude; + } + }) + ); + } + + for (const { node, pos } of blocksWithoutBlockId) { + const id = nanoid(8); + tr.setNodeMarkup(pos, undefined, { + ...node.attrs, + blockId: id + }); + } + return tr; + } + }) + ]; + } +}); diff --git a/packages/editor/src/extensions/block-id/index.ts b/packages/editor/src/extensions/block-id/index.ts new file mode 100644 index 000000000..4c49771a6 --- /dev/null +++ b/packages/editor/src/extensions/block-id/index.ts @@ -0,0 +1,5 @@ +import { BlockId } from "./blockid"; + +export * from "./blockid"; + +export default BlockId; diff --git a/packages/editor/src/index.ts b/packages/editor/src/index.ts index c144c9f3c..ad0746baa 100644 --- a/packages/editor/src/index.ts +++ b/packages/editor/src/index.ts @@ -79,6 +79,7 @@ import Clipboard, { ClipboardOptions } from "./extensions/clipboard"; import Blockquote from "./extensions/blockquote"; import { Quirks } from "./extensions/quirks"; import { LIST_NODE_TYPES } from "./utils/node-types"; +import BlockId from "./extensions/block-id"; declare global { // eslint-disable-next-line no-var @@ -210,6 +211,7 @@ const useTiptap = ( ]; } }), + BlockId, Blockquote, CharacterCount, Underline, @@ -347,6 +349,7 @@ export * from "./toolbar"; export * from "./types"; export * from "./utils/word-counter"; export * from "./utils/font"; +export * from "./utils/toc"; export { useTiptap, Toolbar, diff --git a/packages/editor/src/utils/toc.ts b/packages/editor/src/utils/toc.ts new file mode 100644 index 000000000..c57ed9306 --- /dev/null +++ b/packages/editor/src/utils/toc.ts @@ -0,0 +1,35 @@ +export function getTableOfContents(content: HTMLElement) { + const headings = content.querySelectorAll("h1, h2, h3, h4, h5, h6"); + const tableOfContents: { + level: number; + title: string | null; + id: string | null; + top: number; + }[] = []; + + for (let i = 0; i < headings.length; i++) { + const heading = headings[i]; + const level = parseInt(heading.tagName[1]); + const title = heading.textContent; + const id = heading.getAttribute("data-block-id"); + tableOfContents.push({ + level, + title, + id, + top: (heading as HTMLElement).offsetTop + }); + } + + return tableOfContents; +} + +export function scrollIntoViewById(id: string) { + const element = document.querySelector(`[data-block-id="${id}"]`); + if (element) { + element.scrollIntoView({ + behavior: "smooth", + block: "center", + inline: "nearest" + }); + } +}