diff --git a/.eslintrc.js b/.eslintrc.js index 5065a58c4b..983f7ae31e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,7 @@ +const typeScriptExtensions = [".ts", ".cts", ".mts", ".tsx"]; + +const allExtensions = [...typeScriptExtensions, ".js", ".jsx"]; + module.exports = { root: true, extends: [ @@ -8,6 +12,18 @@ module.exports = { ], parser: "@typescript-eslint/parser", plugins: ["import", "@typescript-eslint"], + settings: { + "import/extensions": allExtensions, + "import/external-module-folders": ["node_modules", "node_modules/@types"], + "import/parsers": { + "@typescript-eslint/parser": typeScriptExtensions, + }, + "import/resolver": { + node: { + extensions: allExtensions, + }, + }, + }, rules: { curly: 1, "import/no-extraneous-dependencies": [ @@ -23,5 +39,19 @@ module.exports = { "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/ban-ts-comment": "off", + "import/no-cycle": "error", + // doesn't work: + // "import/no-restricted-paths": [ + // "error", + // { + // zones: [ + // { + // target: "./src/**/*", + // from: "./types/**/*", + // message: "Import from this module to types is not allowed.", + // }, + // ], + // }, + // ], }, }; diff --git a/packages/core/src/api/README.md b/packages/core/src/api/README.md new file mode 100644 index 0000000000..2f7465ed67 --- /dev/null +++ b/packages/core/src/api/README.md @@ -0,0 +1,8 @@ +### @blocknote/core/src/api + +Implements the BlockNote API surface + +- `blockManipulation`: API to insert / update / remove blocks +- `exporters`: exporting to HTML / markdown / other formats +- `nodeConversions`: internal API for converting between BlockNote Schema (Blocks) and Prosemirror (Nodes) +- `parsers`: importing from HTML / markdown / other formats \ No newline at end of file diff --git a/packages/core/src/api/blockManipulation/blockManipulation.test.ts b/packages/core/src/api/blockManipulation/blockManipulation.test.ts index 3f8acaa97b..f7d0521e2a 100644 --- a/packages/core/src/api/blockManipulation/blockManipulation.test.ts +++ b/packages/core/src/api/blockManipulation/blockManipulation.test.ts @@ -1,11 +1,11 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { Block, PartialBlock } from "../../extensions/Blocks/api/blocks/types"; import { DefaultBlockSchema, DefaultInlineContentSchema, DefaultStyleSchema, -} from "../../extensions/Blocks/api/defaultBlocks"; +} from "../../blocks/defaultBlocks"; +import { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { Block, PartialBlock } from "../../schema/blocks/types"; let editor: BlockNoteEditor; diff --git a/packages/core/src/api/blockManipulation/blockManipulation.ts b/packages/core/src/api/blockManipulation/blockManipulation.ts index 1054e0e35b..6f528b9b14 100644 --- a/packages/core/src/api/blockManipulation/blockManipulation.ts +++ b/packages/core/src/api/blockManipulation/blockManipulation.ts @@ -1,16 +1,16 @@ import { Editor } from "@tiptap/core"; import { Node } from "prosemirror-model"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { BlockIdentifier, BlockSchema, + InlineContentSchema, PartialBlock, -} from "../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../extensions/Blocks/api/styles/types"; + StyleSchema, +} from "../../schema"; import { blockToNode } from "../nodeConversions/nodeConversions"; -import { getNodeById } from "../util/nodeUtil"; +import { getNodeById } from "../nodeUtil"; export function insertBlocks< BSchema extends BlockSchema, diff --git a/packages/core/src/api/exporters/copyExtension.ts b/packages/core/src/api/exporters/copyExtension.ts index 4b580b1f86..0326e24b5c 100644 --- a/packages/core/src/api/exporters/copyExtension.ts +++ b/packages/core/src/api/exporters/copyExtension.ts @@ -1,10 +1,8 @@ import { Extension } from "@tiptap/core"; import { Plugin } from "prosemirror-state"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { BlockSchema } from "../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../extensions/Blocks/api/styles/types"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; import { createExternalHTMLExporter } from "./html/externalHTMLExporter"; import { createInternalHTMLSerializer } from "./html/internalHTMLSerializer"; import { cleanHTMLToMarkdown } from "./markdown/markdownExporter"; diff --git a/packages/core/src/api/exporters/html/externalHTMLExporter.ts b/packages/core/src/api/exporters/html/externalHTMLExporter.ts index 8d62dd587c..43b591b610 100644 --- a/packages/core/src/api/exporters/html/externalHTMLExporter.ts +++ b/packages/core/src/api/exporters/html/externalHTMLExporter.ts @@ -3,13 +3,13 @@ import rehypeParse from "rehype-parse"; import rehypeStringify from "rehype-stringify"; import { unified } from "unified"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { BlockSchema, + InlineContentSchema, PartialBlock, -} from "../../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../../extensions/Blocks/api/styles/types"; + StyleSchema, +} from "../../../schema"; import { blockToNode } from "../../nodeConversions/nodeConversions"; import { serializeNodeInner, diff --git a/packages/core/src/api/exporters/html/htmlConversion.test.ts b/packages/core/src/api/exporters/html/htmlConversion.test.ts index cf018e6c10..6671037f19 100644 --- a/packages/core/src/api/exporters/html/htmlConversion.test.ts +++ b/packages/core/src/api/exporters/html/htmlConversion.test.ts @@ -1,17 +1,14 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { addIdsToBlocks, partialBlocksToBlocksForTesting } from "../../.."; -import { - BlockSchema, - PartialBlock, -} from "../../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../../extensions/Blocks/api/styles/types"; -import { customBlocksTestCases } from "../../testCases/cases/customBlocks"; -import { customInlineContentTestCases } from "../../testCases/cases/customInlineContent"; -import { customStylesTestCases } from "../../testCases/cases/customStyles"; -import { defaultSchemaTestCases } from "../../testCases/cases/defaultSchema"; +import { BlockSchema, PartialBlock } from "../../../schema/blocks/types"; +import { InlineContentSchema } from "../../../schema/inlineContent/types"; +import { StyleSchema } from "../../../schema/styles/types"; +import { customBlocksTestCases } from "../../testUtil/cases/customBlocks"; +import { customInlineContentTestCases } from "../../testUtil/cases/customInlineContent"; +import { customStylesTestCases } from "../../testUtil/cases/customStyles"; +import { defaultSchemaTestCases } from "../../testUtil/cases/defaultSchema"; import { createExternalHTMLExporter } from "./externalHTMLExporter"; import { createInternalHTMLSerializer } from "./internalHTMLSerializer"; diff --git a/packages/core/src/api/exporters/html/internalHTMLSerializer.ts b/packages/core/src/api/exporters/html/internalHTMLSerializer.ts index 77785dd0ac..a635819caa 100644 --- a/packages/core/src/api/exporters/html/internalHTMLSerializer.ts +++ b/packages/core/src/api/exporters/html/internalHTMLSerializer.ts @@ -1,11 +1,11 @@ import { DOMSerializer, Fragment, Node, Schema } from "prosemirror-model"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { BlockSchema, + InlineContentSchema, PartialBlock, -} from "../../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../../extensions/Blocks/api/styles/types"; + StyleSchema, +} from "../../../schema"; import { blockToNode } from "../../nodeConversions/nodeConversions"; import { serializeNodeInner, diff --git a/packages/core/src/api/exporters/html/util/sharedHTMLConversion.ts b/packages/core/src/api/exporters/html/util/sharedHTMLConversion.ts index 03f45db17f..4c89a45ebe 100644 --- a/packages/core/src/api/exporters/html/util/sharedHTMLConversion.ts +++ b/packages/core/src/api/exporters/html/util/sharedHTMLConversion.ts @@ -1,9 +1,11 @@ import { DOMSerializer, Fragment, Node } from "prosemirror-model"; -import { BlockNoteEditor } from "../../../../BlockNoteEditor"; -import { BlockSchema } from "../../../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../../../extensions/Blocks/api/styles/types"; +import type { BlockNoteEditor } from "../../../../editor/BlockNoteEditor"; +import { + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "../../../../schema"; import { nodeToBlock } from "../../../nodeConversions/nodeConversions"; function doc(options: { document?: Document }) { diff --git a/packages/core/src/api/exporters/markdown/markdownExporter.test.ts b/packages/core/src/api/exporters/markdown/markdownExporter.test.ts index 11cafad595..a4f391bc11 100644 --- a/packages/core/src/api/exporters/markdown/markdownExporter.test.ts +++ b/packages/core/src/api/exporters/markdown/markdownExporter.test.ts @@ -1,18 +1,15 @@ import fs from "node:fs"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; -import { - BlockSchema, - PartialBlock, -} from "../../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../../extensions/Blocks/api/styles/types"; -import { partialBlocksToBlocksForTesting } from "../../nodeConversions/testUtil"; -import { customBlocksTestCases } from "../../testCases/cases/customBlocks"; -import { customInlineContentTestCases } from "../../testCases/cases/customInlineContent"; -import { customStylesTestCases } from "../../testCases/cases/customStyles"; -import { defaultSchemaTestCases } from "../../testCases/cases/defaultSchema"; +import { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; +import { BlockSchema, PartialBlock } from "../../../schema/blocks/types"; +import { InlineContentSchema } from "../../../schema/inlineContent/types"; +import { StyleSchema } from "../../../schema/styles/types"; +import { partialBlocksToBlocksForTesting } from "../../testUtil/partialBlockTestUtil"; +import { customBlocksTestCases } from "../../testUtil/cases/customBlocks"; +import { customInlineContentTestCases } from "../../testUtil/cases/customInlineContent"; +import { customStylesTestCases } from "../../testUtil/cases/customStyles"; +import { defaultSchemaTestCases } from "../../testUtil/cases/defaultSchema"; async function convertToMarkdownAndCompareSnapshots< B extends BlockSchema, diff --git a/packages/core/src/api/exporters/markdown/markdownExporter.ts b/packages/core/src/api/exporters/markdown/markdownExporter.ts index 0c39d0d2e9..841ff6381e 100644 --- a/packages/core/src/api/exporters/markdown/markdownExporter.ts +++ b/packages/core/src/api/exporters/markdown/markdownExporter.ts @@ -4,14 +4,14 @@ import rehypeRemark from "rehype-remark"; import remarkGfm from "remark-gfm"; import remarkStringify from "remark-stringify"; import { unified } from "unified"; +import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { Block, - BlockNoteEditor, BlockSchema, InlineContentSchema, StyleSchema, - createExternalHTMLExporter, -} from "../../.."; +} from "../../../schema"; +import { createExternalHTMLExporter } from "../html/externalHTMLExporter"; import { removeUnderlines } from "./removeUnderlinesRehypePlugin"; export function cleanHTMLToMarkdown(cleanHTMLString: string) { diff --git a/packages/core/src/extensions/Blocks/helpers/getBlockInfoFromPos.ts b/packages/core/src/api/getBlockInfoFromPos.ts similarity index 100% rename from packages/core/src/extensions/Blocks/helpers/getBlockInfoFromPos.ts rename to packages/core/src/api/getBlockInfoFromPos.ts diff --git a/packages/core/src/api/nodeConversions/nodeConversions.test.ts b/packages/core/src/api/nodeConversions/nodeConversions.test.ts index be1d1cfaf2..68d583dd55 100644 --- a/packages/core/src/api/nodeConversions/nodeConversions.test.ts +++ b/packages/core/src/api/nodeConversions/nodeConversions.test.ts @@ -1,12 +1,12 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { PartialBlock } from "../../extensions/Blocks/api/blocks/types"; -import { customInlineContentTestCases } from "../testCases/cases/customInlineContent"; -import { customStylesTestCases } from "../testCases/cases/customStyles"; -import { defaultSchemaTestCases } from "../testCases/cases/defaultSchema"; +import { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { PartialBlock } from "../../schema/blocks/types"; +import { customInlineContentTestCases } from "../testUtil/cases/customInlineContent"; +import { customStylesTestCases } from "../testUtil/cases/customStyles"; +import { defaultSchemaTestCases } from "../testUtil/cases/defaultSchema"; import { blockToNode, nodeToBlock } from "./nodeConversions"; -import { addIdsToBlock, partialBlockToBlockForTesting } from "./testUtil"; +import { addIdsToBlock, partialBlockToBlockForTesting } from "../testUtil/partialBlockTestUtil"; function validateConversion( block: PartialBlock, diff --git a/packages/core/src/api/nodeConversions/nodeConversions.ts b/packages/core/src/api/nodeConversions/nodeConversions.ts index 391fbe1e5d..3f82377c5a 100644 --- a/packages/core/src/api/nodeConversions/nodeConversions.ts +++ b/packages/core/src/api/nodeConversions/nodeConversions.ts @@ -1,30 +1,32 @@ -import { Mark } from "@tiptap/pm/model"; -import { Node, Schema } from "prosemirror-model"; -import { +import { Mark, Node, Schema } from "@tiptap/pm/model"; + +import UniqueID from "../../extensions/UniqueID/UniqueID"; +import type { Block, BlockSchema, - PartialBlock, - PartialTableContent, - TableContent, -} from "../../extensions/Blocks/api/blocks/types"; -import { CustomInlineContentConfig, CustomInlineContentFromConfig, InlineContent, InlineContentFromConfig, InlineContentSchema, + PartialBlock, PartialCustomInlineContentFromConfig, PartialInlineContent, PartialLink, + PartialTableContent, + StyleSchema, StyledText, + Styles, + TableContent, +} from "../../schema"; +import { getBlockInfo } from "../getBlockInfoFromPos"; + +import { isLinkInlineContent, isPartialLinkInlineContent, isStyledTextInlineContent, -} from "../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema, Styles } from "../../extensions/Blocks/api/styles/types"; -import { getBlockInfo } from "../../extensions/Blocks/helpers/getBlockInfoFromPos"; -import UniqueID from "../../extensions/UniqueID/UniqueID"; -import { UnreachableCaseError } from "../../shared/utils"; +} from "../../schema/inlineContent/types"; +import { UnreachableCaseError } from "../../util/typescript"; /** * Convert a StyledText inline element to a diff --git a/packages/core/src/api/util/nodeUtil.ts b/packages/core/src/api/nodeUtil.ts similarity index 100% rename from packages/core/src/api/util/nodeUtil.ts rename to packages/core/src/api/nodeUtil.ts diff --git a/packages/core/src/api/parsers/html/parseHTML.ts b/packages/core/src/api/parsers/html/parseHTML.ts index 11aca3f787..dad025f9dc 100644 --- a/packages/core/src/api/parsers/html/parseHTML.ts +++ b/packages/core/src/api/parsers/html/parseHTML.ts @@ -1,9 +1,13 @@ import { DOMParser, Schema } from "prosemirror-model"; -import { Block, BlockSchema, nodeToBlock } from "../../.."; -import { InlineContentSchema } from "../../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../../extensions/Blocks/api/styles/types"; -import { nestedListsToBlockNoteStructure } from "./util/nestedLists"; +import { + Block, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "../../../schema"; +import { nodeToBlock } from "../../nodeConversions/nodeConversions"; +import { nestedListsToBlockNoteStructure } from "./util/nestedLists"; export async function HTMLToBlocks< BSchema extends BlockSchema, I extends InlineContentSchema, diff --git a/packages/core/src/api/parsers/markdown/parseMarkdown.ts b/packages/core/src/api/parsers/markdown/parseMarkdown.ts index 0bf367f166..6e4fab74e2 100644 --- a/packages/core/src/api/parsers/markdown/parseMarkdown.ts +++ b/packages/core/src/api/parsers/markdown/parseMarkdown.ts @@ -4,7 +4,12 @@ import remarkGfm from "remark-gfm"; import remarkParse from "remark-parse"; import remarkRehype, { defaultHandlers } from "remark-rehype"; import { unified } from "unified"; -import { Block, BlockSchema, InlineContentSchema, StyleSchema } from "../../.."; +import { + Block, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "../../../schema"; import { HTMLToBlocks } from "../html/parseHTML"; // modified version of https://github.com/syntax-tree/mdast-util-to-hast/blob/main/lib/handlers/code.js diff --git a/packages/core/src/api/parsers/pasteExtension.ts b/packages/core/src/api/parsers/pasteExtension.ts index f0dec4f86d..0b0a027405 100644 --- a/packages/core/src/api/parsers/pasteExtension.ts +++ b/packages/core/src/api/parsers/pasteExtension.ts @@ -1,10 +1,8 @@ import { Extension } from "@tiptap/core"; import { Plugin } from "prosemirror-state"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { BlockSchema } from "../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../extensions/Blocks/api/styles/types"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; import { nestedListsToBlockNoteStructure } from "./html/util/nestedLists"; const acceptedMIMETypes = [ diff --git a/packages/core/src/api/testCases/index.ts b/packages/core/src/api/testCases/index.ts deleted file mode 100644 index 90e1f06005..0000000000 --- a/packages/core/src/api/testCases/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { - BlockSchema, - PartialBlock, -} from "../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../extensions/Blocks/api/styles/types"; - -export type EditorTestCases< - B extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema -> = { - name: string; - createEditor: () => BlockNoteEditor; - documents: Array<{ - name: string; - blocks: PartialBlock[]; - }>; -}; diff --git a/packages/core/src/api/testCases/cases/customBlocks.ts b/packages/core/src/api/testUtil/cases/customBlocks.ts similarity index 90% rename from packages/core/src/api/testCases/cases/customBlocks.ts rename to packages/core/src/api/testUtil/cases/customBlocks.ts index 1c435a5254..4c278ea408 100644 --- a/packages/core/src/api/testCases/cases/customBlocks.ts +++ b/packages/core/src/api/testUtil/cases/customBlocks.ts @@ -1,22 +1,19 @@ -import { EditorTestCases } from ".."; +import { EditorTestCases } from "../index"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; -import { createBlockSpec } from "../../../extensions/Blocks/api/blocks/createSpec"; -import { - BlockSchemaFromSpecs, - BlockSpecs, -} from "../../../extensions/Blocks/api/blocks/types"; +import { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { DefaultInlineContentSchema, DefaultStyleSchema, defaultBlockSpecs, -} from "../../../extensions/Blocks/api/defaultBlocks"; -import { defaultProps } from "../../../extensions/Blocks/api/defaultProps"; +} from "../../../blocks/defaultBlocks"; +import { defaultProps } from "../../../blocks/defaultProps"; import { imagePropSchema, renderImage, -} from "../../../extensions/Blocks/nodes/BlockContent/ImageBlockContent/ImageBlockContent"; -import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../extensions/Blocks/nodes/BlockContent/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +} from "../../../blocks/ImageBlockContent/ImageBlockContent"; +import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +import { createBlockSpec } from "../../../schema/blocks/createSpec"; +import { BlockSchemaFromSpecs, BlockSpecs } from "../../../schema/blocks/types"; // This is a modified version of the default image block that does not implement // a `serialize` function. It's used to test if the custom serializer by default diff --git a/packages/core/src/api/testCases/cases/customInlineContent.ts b/packages/core/src/api/testUtil/cases/customInlineContent.ts similarity index 81% rename from packages/core/src/api/testCases/cases/customInlineContent.ts rename to packages/core/src/api/testUtil/cases/customInlineContent.ts index e1d725ef08..737cab3db9 100644 --- a/packages/core/src/api/testCases/cases/customInlineContent.ts +++ b/packages/core/src/api/testUtil/cases/customInlineContent.ts @@ -1,17 +1,17 @@ -import { EditorTestCases } from ".."; +import { EditorTestCases } from "../index"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { DefaultBlockSchema, DefaultStyleSchema, defaultInlineContentSpecs, -} from "../../../extensions/Blocks/api/defaultBlocks"; -import { createInlineContentSpec } from "../../../extensions/Blocks/api/inlineContent/createSpec"; +} from "../../../blocks/defaultBlocks"; +import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +import { createInlineContentSpec } from "../../../schema/inlineContent/createSpec"; import { InlineContentSchemaFromSpecs, InlineContentSpecs, -} from "../../../extensions/Blocks/api/inlineContent/types"; -import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../extensions/Blocks/nodes/BlockContent/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +} from "../../../schema/inlineContent/types"; const mention = createInlineContentSpec( { diff --git a/packages/core/src/api/testCases/cases/customStyles.ts b/packages/core/src/api/testUtil/cases/customStyles.ts similarity index 78% rename from packages/core/src/api/testCases/cases/customStyles.ts rename to packages/core/src/api/testUtil/cases/customStyles.ts index e7a4390e63..cd19064a99 100644 --- a/packages/core/src/api/testCases/cases/customStyles.ts +++ b/packages/core/src/api/testUtil/cases/customStyles.ts @@ -1,17 +1,14 @@ -import { EditorTestCases } from ".."; +import { EditorTestCases } from "../index"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { DefaultBlockSchema, DefaultInlineContentSchema, defaultStyleSpecs, -} from "../../../extensions/Blocks/api/defaultBlocks"; -import { createStyleSpec } from "../../../extensions/Blocks/api/styles/createSpec"; -import { - StyleSchemaFromSpecs, - StyleSpecs, -} from "../../../extensions/Blocks/api/styles/types"; -import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../extensions/Blocks/nodes/BlockContent/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +} from "../../../blocks/defaultBlocks"; +import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +import { createStyleSpec } from "../../../schema/styles/createSpec"; +import { StyleSchemaFromSpecs, StyleSpecs } from "../../../schema/styles/types"; const small = createStyleSpec( { diff --git a/packages/core/src/api/testCases/cases/defaultSchema.ts b/packages/core/src/api/testUtil/cases/defaultSchema.ts similarity index 96% rename from packages/core/src/api/testCases/cases/defaultSchema.ts rename to packages/core/src/api/testUtil/cases/defaultSchema.ts index 87aa6b01b1..0b9f1f2f5c 100644 --- a/packages/core/src/api/testCases/cases/defaultSchema.ts +++ b/packages/core/src/api/testUtil/cases/defaultSchema.ts @@ -1,12 +1,12 @@ -import { EditorTestCases } from ".."; +import { EditorTestCases } from "../index"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import { BlockNoteEditor } from "../../../editor/BlockNoteEditor"; import { DefaultBlockSchema, DefaultInlineContentSchema, DefaultStyleSchema, -} from "../../../extensions/Blocks/api/defaultBlocks"; -import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../extensions/Blocks/nodes/BlockContent/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +} from "../../../blocks/defaultBlocks"; +import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; export const defaultSchemaTestCases: EditorTestCases< DefaultBlockSchema, diff --git a/packages/core/src/api/testUtil/index.ts b/packages/core/src/api/testUtil/index.ts new file mode 100644 index 0000000000..d3269f3e86 --- /dev/null +++ b/packages/core/src/api/testUtil/index.ts @@ -0,0 +1,17 @@ +import { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { BlockSchema, PartialBlock } from "../../schema/blocks/types"; +import { InlineContentSchema } from "../../schema/inlineContent/types"; +import { StyleSchema } from "../../schema/styles/types"; + +export type EditorTestCases< + B extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema +> = { + name: string; + createEditor: () => BlockNoteEditor; + documents: Array<{ + name: string; + blocks: PartialBlock[]; + }>; +}; diff --git a/packages/core/src/api/nodeConversions/testUtil.ts b/packages/core/src/api/testUtil/partialBlockTestUtil.ts similarity index 94% rename from packages/core/src/api/nodeConversions/testUtil.ts rename to packages/core/src/api/testUtil/partialBlockTestUtil.ts index 3398e19d2d..6d91a204f3 100644 --- a/packages/core/src/api/nodeConversions/testUtil.ts +++ b/packages/core/src/api/testUtil/partialBlockTestUtil.ts @@ -1,9 +1,10 @@ +import UniqueID from "../../extensions/UniqueID/UniqueID"; import { Block, BlockSchema, PartialBlock, TableContent, -} from "../../extensions/Blocks/api/blocks/types"; +} from "../../schema/blocks/types"; import { InlineContent, InlineContentSchema, @@ -11,9 +12,8 @@ import { StyledText, isPartialLinkInlineContent, isStyledTextInlineContent, -} from "../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../extensions/Blocks/api/styles/types"; -import UniqueID from "../../extensions/UniqueID/UniqueID"; +} from "../../schema/inlineContent/types"; +import { StyleSchema } from "../../schema/styles/types"; function textShorthandToStyledText( content: string | StyledText[] = "" diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts b/packages/core/src/blocks/HeadingBlockContent/HeadingBlockContent.ts similarity index 95% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts rename to packages/core/src/blocks/HeadingBlockContent/HeadingBlockContent.ts index 50a0b74197..9b38c720f7 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts +++ b/packages/core/src/blocks/HeadingBlockContent/HeadingBlockContent.ts @@ -1,11 +1,11 @@ import { InputRule } from "@tiptap/core"; import { + PropSchema, createBlockSpecFromStronglyTypedTiptapNode, createStronglyTypedTiptapNode, -} from "../../../api/blocks/internal"; -import { PropSchema } from "../../../api/blocks/types"; -import { defaultProps } from "../../../api/defaultProps"; +} from "../../schema"; import { createDefaultBlockDOMOutputSpec } from "../defaultBlockHelpers"; +import { defaultProps } from "../defaultProps"; export const headingPropSchema = { ...defaultProps, diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ImageBlockContent/ImageBlockContent.ts b/packages/core/src/blocks/ImageBlockContent/ImageBlockContent.ts similarity index 96% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/ImageBlockContent/ImageBlockContent.ts rename to packages/core/src/blocks/ImageBlockContent/ImageBlockContent.ts index eb296183f5..deecfe6a76 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ImageBlockContent/ImageBlockContent.ts +++ b/packages/core/src/blocks/ImageBlockContent/ImageBlockContent.ts @@ -1,18 +1,16 @@ -import { BlockNoteEditor } from "../../../../../BlockNoteEditor"; -import { imageToolbarPluginKey } from "../../../../ImageToolbar/ImageToolbarPlugin"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { imageToolbarPluginKey } from "../../extensions/ImageToolbar/ImageToolbarPlugin"; -import { - CustomBlockConfig, - createBlockSpec, -} from "../../../api/blocks/createSpec"; import { BlockFromConfig, BlockSchemaWithBlock, + CustomBlockConfig, + InlineContentSchema, PropSchema, -} from "../../../api/blocks/types"; -import { defaultProps } from "../../../api/defaultProps"; -import { InlineContentSchema } from "../../../api/inlineContent/types"; -import { StyleSchema } from "../../../api/styles/types"; + StyleSchema, + createBlockSpec, +} from "../../schema"; +import { defaultProps } from "../defaultProps"; export const imagePropSchema = { textAlignment: defaultProps.textAlignment, diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.ts b/packages/core/src/blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.ts similarity index 100% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.ts rename to packages/core/src/blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.ts diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts b/packages/core/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts similarity index 95% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts rename to packages/core/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts index 602510ade1..c6daafbcce 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +++ b/packages/core/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts @@ -1,11 +1,11 @@ import { InputRule } from "@tiptap/core"; import { + PropSchema, createBlockSpecFromStronglyTypedTiptapNode, createStronglyTypedTiptapNode, -} from "../../../../api/blocks/internal"; -import { PropSchema } from "../../../../api/blocks/types"; -import { defaultProps } from "../../../../api/defaultProps"; +} from "../../../schema"; import { createDefaultBlockDOMOutputSpec } from "../../defaultBlockHelpers"; +import { defaultProps } from "../../defaultProps"; import { handleEnter } from "../ListItemKeyboardShortcuts"; export const bulletListItemPropSchema = { diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts b/packages/core/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts similarity index 94% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts rename to packages/core/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts index 01f7474eab..b51c6b5294 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts +++ b/packages/core/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts @@ -1,5 +1,5 @@ import { Editor } from "@tiptap/core"; -import { getBlockInfoFromPos } from "../../../helpers/getBlockInfoFromPos"; +import { getBlockInfoFromPos } from "../../api/getBlockInfoFromPos"; export const handleEnter = (editor: Editor) => { const { node, contentType } = getBlockInfoFromPos( diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts b/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts similarity index 97% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts rename to packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts index 95c7dd4e9e..5ee327fbbc 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +++ b/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts @@ -1,5 +1,5 @@ import { Plugin, PluginKey } from "prosemirror-state"; -import { getBlockInfoFromPos } from "../../../../helpers/getBlockInfoFromPos"; +import { getBlockInfoFromPos } from "../../../api/getBlockInfoFromPos"; // ProseMirror Plugin which automatically assigns indices to ordered list items per nesting level. const PLUGIN_KEY = new PluginKey(`numbered-list-indexing`); diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts b/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts similarity index 95% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts rename to packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts index e8db16998f..7e8752a27e 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +++ b/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts @@ -1,11 +1,11 @@ import { InputRule } from "@tiptap/core"; import { + PropSchema, createBlockSpecFromStronglyTypedTiptapNode, createStronglyTypedTiptapNode, -} from "../../../../api/blocks/internal"; -import { PropSchema } from "../../../../api/blocks/types"; -import { defaultProps } from "../../../../api/defaultProps"; +} from "../../../schema"; import { createDefaultBlockDOMOutputSpec } from "../../defaultBlockHelpers"; +import { defaultProps } from "../../defaultProps"; import { handleEnter } from "../ListItemKeyboardShortcuts"; import { NumberedListIndexingPlugin } from "./NumberedListIndexingPlugin"; diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts b/packages/core/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts similarity index 90% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts rename to packages/core/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts index 8c826f413e..fcb532a8af 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts +++ b/packages/core/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts @@ -1,9 +1,9 @@ import { createBlockSpecFromStronglyTypedTiptapNode, createStronglyTypedTiptapNode, -} from "../../../api/blocks/internal"; -import { defaultProps } from "../../../api/defaultProps"; +} from "../../schema"; import { createDefaultBlockDOMOutputSpec } from "../defaultBlockHelpers"; +import { defaultProps } from "../defaultProps"; export const paragraphPropSchema = { ...defaultProps, diff --git a/packages/core/src/blocks/README.md b/packages/core/src/blocks/README.md new file mode 100644 index 0000000000..b5a8581591 --- /dev/null +++ b/packages/core/src/blocks/README.md @@ -0,0 +1,3 @@ +### @blocknote/core/src/blocks + +The default built-in blocks that ship with BlockNote \ No newline at end of file diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/TableBlockContent/TableBlockContent.ts b/packages/core/src/blocks/TableBlockContent/TableBlockContent.ts similarity index 94% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/TableBlockContent/TableBlockContent.ts rename to packages/core/src/blocks/TableBlockContent/TableBlockContent.ts index eb173f5889..d2bb8c0217 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/TableBlockContent/TableBlockContent.ts +++ b/packages/core/src/blocks/TableBlockContent/TableBlockContent.ts @@ -5,9 +5,9 @@ import { TableRow } from "@tiptap/extension-table-row"; import { createBlockSpecFromStronglyTypedTiptapNode, createStronglyTypedTiptapNode, -} from "../../../api/blocks/internal"; -import { defaultProps } from "../../../api/defaultProps"; +} from "../../schema"; import { createDefaultBlockDOMOutputSpec } from "../defaultBlockHelpers"; +import { defaultProps } from "../defaultProps"; import { TableExtension } from "./TableExtension"; export const tablePropSchema = { diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/TableBlockContent/TableExtension.ts b/packages/core/src/blocks/TableBlockContent/TableExtension.ts similarity index 100% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/TableBlockContent/TableExtension.ts rename to packages/core/src/blocks/TableBlockContent/TableExtension.ts diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/defaultBlockHelpers.ts b/packages/core/src/blocks/defaultBlockHelpers.ts similarity index 87% rename from packages/core/src/extensions/Blocks/nodes/BlockContent/defaultBlockHelpers.ts rename to packages/core/src/blocks/defaultBlockHelpers.ts index b5ade2c570..710ca57aa0 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/defaultBlockHelpers.ts +++ b/packages/core/src/blocks/defaultBlockHelpers.ts @@ -1,9 +1,12 @@ -import { BlockNoteEditor } from "../../../../BlockNoteEditor"; -import { blockToNode } from "../../../../api/nodeConversions/nodeConversions"; -import { mergeCSSClasses } from "../../../../shared/utils"; -import { Block, BlockSchema } from "../../api/blocks/types"; -import { InlineContentSchema } from "../../api/inlineContent/types"; -import { StyleSchema } from "../../api/styles/types"; +import { blockToNode } from "../api/nodeConversions/nodeConversions"; +import type { BlockNoteEditor } from "../editor/BlockNoteEditor"; +import type { + Block, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "../schema"; +import { mergeCSSClasses } from "../util/browser"; // Function that creates a ProseMirror `DOMOutputSpec` for a default block. // Since all default blocks have the same structure (`blockContent` div with a diff --git a/packages/core/src/extensions/Blocks/api/defaultBlocks.ts b/packages/core/src/blocks/defaultBlocks.ts similarity index 59% rename from packages/core/src/extensions/Blocks/api/defaultBlocks.ts rename to packages/core/src/blocks/defaultBlocks.ts index dd15f12f74..36ebc50f7d 100644 --- a/packages/core/src/extensions/Blocks/api/defaultBlocks.ts +++ b/packages/core/src/blocks/defaultBlocks.ts @@ -3,23 +3,23 @@ import Code from "@tiptap/extension-code"; import Italic from "@tiptap/extension-italic"; import Strike from "@tiptap/extension-strike"; import Underline from "@tiptap/extension-underline"; -import { BackgroundColor } from "../../BackgroundColor/BackgroundColorMark"; -import { TextColor } from "../../TextColor/TextColorMark"; -import { Heading } from "../nodes/BlockContent/HeadingBlockContent/HeadingBlockContent"; -import { Image } from "../nodes/BlockContent/ImageBlockContent/ImageBlockContent"; -import { BulletListItem } from "../nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent"; -import { NumberedListItem } from "../nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent"; -import { Paragraph } from "../nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent"; -import { Table } from "../nodes/BlockContent/TableBlockContent/TableBlockContent"; -import { getBlockSchemaFromSpecs } from "./blocks/internal"; -import { BlockSpecs } from "./blocks/types"; -import { getInlineContentSchemaFromSpecs } from "./inlineContent/internal"; -import { InlineContentSpecs } from "./inlineContent/types"; +import { BackgroundColor } from "../extensions/BackgroundColor/BackgroundColorMark"; +import { TextColor } from "../extensions/TextColor/TextColorMark"; import { + BlockSpecs, + InlineContentSpecs, + StyleSpecs, createStyleSpecFromTipTapMark, + getBlockSchemaFromSpecs, + getInlineContentSchemaFromSpecs, getStyleSchemaFromSpecs, -} from "./styles/internal"; -import { StyleSpecs } from "./styles/types"; +} from "../schema"; +import { Heading } from "./HeadingBlockContent/HeadingBlockContent"; +import { Image } from "./ImageBlockContent/ImageBlockContent"; +import { BulletListItem } from "./ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent"; +import { NumberedListItem } from "./ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent"; +import { Paragraph } from "./ParagraphBlockContent/ParagraphBlockContent"; +import { Table } from "./TableBlockContent/TableBlockContent"; export const defaultBlockSpecs = { paragraph: Paragraph, diff --git a/packages/core/src/extensions/Blocks/api/defaultProps.ts b/packages/core/src/blocks/defaultProps.ts similarity index 77% rename from packages/core/src/extensions/Blocks/api/defaultProps.ts rename to packages/core/src/blocks/defaultProps.ts index 43f36d7a6b..da9add88dd 100644 --- a/packages/core/src/extensions/Blocks/api/defaultProps.ts +++ b/packages/core/src/blocks/defaultProps.ts @@ -1,4 +1,7 @@ -import { Props, PropSchema } from "./blocks/types"; +import type { Props, PropSchema } from "../schema"; + +// TODO: this system should probably be moved / refactored. +// The dependency from schema on this file doesn't make sense export const defaultProps = { backgroundColor: { diff --git a/packages/core/src/extensions/Blocks/nodes/Block.css b/packages/core/src/editor/Block.css similarity index 100% rename from packages/core/src/extensions/Blocks/nodes/Block.css rename to packages/core/src/editor/Block.css diff --git a/packages/core/src/BlockNoteEditor.test.ts b/packages/core/src/editor/BlockNoteEditor.test.ts similarity index 80% rename from packages/core/src/BlockNoteEditor.test.ts rename to packages/core/src/editor/BlockNoteEditor.test.ts index f295c76fab..b4c1e26558 100644 --- a/packages/core/src/BlockNoteEditor.test.ts +++ b/packages/core/src/editor/BlockNoteEditor.test.ts @@ -1,6 +1,6 @@ import { expect, it } from "vitest"; import { BlockNoteEditor } from "./BlockNoteEditor"; -import { getBlockInfoFromPos } from "./extensions/Blocks/helpers/getBlockInfoFromPos"; +import { getBlockInfoFromPos } from "../api/getBlockInfoFromPos"; /** * @vitest-environment jsdom diff --git a/packages/core/src/BlockNoteEditor.ts b/packages/core/src/editor/BlockNoteEditor.ts similarity index 94% rename from packages/core/src/BlockNoteEditor.ts rename to packages/core/src/editor/BlockNoteEditor.ts index 6cda27b315..c888a0f670 100644 --- a/packages/core/src/BlockNoteEditor.ts +++ b/packages/core/src/editor/BlockNoteEditor.ts @@ -3,28 +3,22 @@ import { Node } from "prosemirror-model"; // import "./blocknote.css"; import { Editor as TiptapEditor } from "@tiptap/core/dist/packages/core/src/Editor"; import * as Y from "yjs"; -import { getBlockNoteExtensions } from "./BlockNoteExtensions"; import { insertBlocks, removeBlocks, replaceBlocks, updateBlock, -} from "./api/blockManipulation/blockManipulation"; +} from "../api/blockManipulation/blockManipulation"; +import { createExternalHTMLExporter } from "../api/exporters/html/externalHTMLExporter"; +import { blocksToMarkdown } from "../api/exporters/markdown/markdownExporter"; +import { getBlockInfoFromPos } from "../api/getBlockInfoFromPos"; import { blockToNode, nodeToBlock, -} from "./api/nodeConversions/nodeConversions"; -import { getNodeById } from "./api/util/nodeUtil"; -import { - Block, - BlockIdentifier, - BlockNoteDOMAttributes, - BlockSchema, - BlockSchemaFromSpecs, - BlockSchemaWithBlock, - BlockSpecs, - PartialBlock, -} from "./extensions/Blocks/api/blocks/types"; +} from "../api/nodeConversions/nodeConversions"; +import { getNodeById } from "../api/nodeUtil"; +import { HTMLToBlocks } from "../api/parsers/html/parseHTML"; +import { markdownToBlocks } from "../api/parsers/markdown/parseMarkdown"; import { DefaultBlockSchema, DefaultInlineContentSchema, @@ -33,44 +27,50 @@ import { defaultBlockSpecs, defaultInlineContentSpecs, defaultStyleSpecs, -} from "./extensions/Blocks/api/defaultBlocks"; -import { Selection } from "./extensions/Blocks/api/selectionTypes"; +} from "../blocks/defaultBlocks"; +import { FormattingToolbarProsemirrorPlugin } from "../extensions/FormattingToolbar/FormattingToolbarPlugin"; +import { HyperlinkToolbarProsemirrorPlugin } from "../extensions/HyperlinkToolbar/HyperlinkToolbarPlugin"; +import { ImageToolbarProsemirrorPlugin } from "../extensions/ImageToolbar/ImageToolbarPlugin"; +import { SideMenuProsemirrorPlugin } from "../extensions/SideMenu/SideMenuPlugin"; +import { BaseSlashMenuItem } from "../extensions/SlashMenu/BaseSlashMenuItem"; +import { SlashMenuProsemirrorPlugin } from "../extensions/SlashMenu/SlashMenuPlugin"; +import { getDefaultSlashMenuItems } from "../extensions/SlashMenu/defaultSlashMenuItems"; +import { TableHandlesProsemirrorPlugin } from "../extensions/TableHandles/TableHandlesPlugin"; +import { UniqueID } from "../extensions/UniqueID/UniqueID"; import { + Block, + BlockIdentifier, + BlockNoteDOMAttributes, + BlockSchema, + BlockSchemaFromSpecs, + BlockSchemaWithBlock, + BlockSpecs, + InlineContentSchema, + InlineContentSchemaFromSpecs, + InlineContentSpecs, + PartialBlock, StyleSchema, StyleSchemaFromSpecs, StyleSpecs, Styles, -} from "./extensions/Blocks/api/styles/types"; -import { getBlockInfoFromPos } from "./extensions/Blocks/helpers/getBlockInfoFromPos"; + getBlockSchemaFromSpecs, + getInlineContentSchemaFromSpecs, + getStyleSchemaFromSpecs, +} from "../schema"; +import { mergeCSSClasses } from "../util/browser"; +import { UnreachableCaseError } from "../util/typescript"; -import "prosemirror-tables/style/tables.css"; +import { getBlockNoteExtensions } from "./BlockNoteExtensions"; +import { TextCursorPosition } from "./cursorPositionTypes"; -import { createExternalHTMLExporter } from "./api/exporters/html/externalHTMLExporter"; -import { blocksToMarkdown } from "./api/exporters/markdown/markdownExporter"; -import { HTMLToBlocks } from "./api/parsers/html/parseHTML"; -import { markdownToBlocks } from "./api/parsers/markdown/parseMarkdown"; -import "./editor.css"; -import { getBlockSchemaFromSpecs } from "./extensions/Blocks/api/blocks/internal"; -import { TextCursorPosition } from "./extensions/Blocks/api/cursorPositionTypes"; -import { getInlineContentSchemaFromSpecs } from "./extensions/Blocks/api/inlineContent/internal"; -import { - InlineContentSchema, - InlineContentSchemaFromSpecs, - InlineContentSpecs, -} from "./extensions/Blocks/api/inlineContent/types"; -import { getStyleSchemaFromSpecs } from "./extensions/Blocks/api/styles/internal"; -import { FormattingToolbarProsemirrorPlugin } from "./extensions/FormattingToolbar/FormattingToolbarPlugin"; -import { HyperlinkToolbarProsemirrorPlugin } from "./extensions/HyperlinkToolbar/HyperlinkToolbarPlugin"; -import { ImageToolbarProsemirrorPlugin } from "./extensions/ImageToolbar/ImageToolbarPlugin"; -import { SideMenuProsemirrorPlugin } from "./extensions/SideMenu/SideMenuPlugin"; -import { BaseSlashMenuItem } from "./extensions/SlashMenu/BaseSlashMenuItem"; -import { SlashMenuProsemirrorPlugin } from "./extensions/SlashMenu/SlashMenuPlugin"; -import { getDefaultSlashMenuItems } from "./extensions/SlashMenu/defaultSlashMenuItems"; -import { TableHandlesProsemirrorPlugin } from "./extensions/TableHandles/TableHandlesPlugin"; -import { UniqueID } from "./extensions/UniqueID/UniqueID"; -import { UnreachableCaseError, mergeCSSClasses } from "./shared/utils"; +import { Selection } from "./selectionTypes"; import { transformPasted } from "./transformPasted"; +// CSS +import "prosemirror-tables/style/tables.css"; +import "./Block.css"; +import "./editor.css"; + export type BlockNoteEditorOptions< BSpecs extends BlockSpecs, ISpecs extends InlineContentSpecs, diff --git a/packages/core/src/BlockNoteExtensions.ts b/packages/core/src/editor/BlockNoteExtensions.ts similarity index 83% rename from packages/core/src/BlockNoteExtensions.ts rename to packages/core/src/editor/BlockNoteExtensions.ts index e7c52358fd..ec2277e5b9 100644 --- a/packages/core/src/BlockNoteExtensions.ts +++ b/packages/core/src/editor/BlockNoteExtensions.ts @@ -1,6 +1,6 @@ import { Extensions, extensions } from "@tiptap/core"; -import { BlockNoteEditor } from "./BlockNoteEditor"; +import type { BlockNoteEditor } from "./BlockNoteEditor"; import Collaboration from "@tiptap/extension-collaboration"; import CollaborationCursor from "@tiptap/extension-collaboration-cursor"; @@ -11,25 +11,24 @@ import { History } from "@tiptap/extension-history"; import { Link } from "@tiptap/extension-link"; import { Text } from "@tiptap/extension-text"; import * as Y from "yjs"; -import { createCopyToClipboardExtension } from "./api/exporters/copyExtension"; -import { createPasteFromClipboardExtension } from "./api/parsers/pasteExtension"; -import { BackgroundColorExtension } from "./extensions/BackgroundColor/BackgroundColorExtension"; -import { BlockContainer, BlockGroup, Doc } from "./extensions/Blocks"; +import { createCopyToClipboardExtension } from "../api/exporters/copyExtension"; +import { createPasteFromClipboardExtension } from "../api/parsers/pasteExtension"; +import { BackgroundColorExtension } from "../extensions/BackgroundColor/BackgroundColorExtension"; +import { Placeholder } from "../extensions/Placeholder/PlaceholderExtension"; +import { TextAlignmentExtension } from "../extensions/TextAlignment/TextAlignmentExtension"; +import { TextColorExtension } from "../extensions/TextColor/TextColorExtension"; +import { TrailingNode } from "../extensions/TrailingNode/TrailingNodeExtension"; +import UniqueID from "../extensions/UniqueID/UniqueID"; +import { BlockContainer, BlockGroup, Doc } from "../pm-nodes"; import { BlockNoteDOMAttributes, BlockSchema, BlockSpecs, -} from "./extensions/Blocks/api/blocks/types"; -import { InlineContentSchema, InlineContentSpecs, -} from "./extensions/Blocks/api/inlineContent/types"; -import { StyleSchema, StyleSpecs } from "./extensions/Blocks/api/styles/types"; -import { Placeholder } from "./extensions/Placeholder/PlaceholderExtension"; -import { TextAlignmentExtension } from "./extensions/TextAlignment/TextAlignmentExtension"; -import { TextColorExtension } from "./extensions/TextColor/TextColorExtension"; -import { TrailingNode } from "./extensions/TrailingNode/TrailingNodeExtension"; -import UniqueID from "./extensions/UniqueID/UniqueID"; + StyleSchema, + StyleSpecs, +} from "../schema"; /** * Get all the Tiptap extensions BlockNote is configured with by default diff --git a/packages/core/src/editor/README.md b/packages/core/src/editor/README.md new file mode 100644 index 0000000000..f87722a4e9 --- /dev/null +++ b/packages/core/src/editor/README.md @@ -0,0 +1,3 @@ +### @blocknote/core/src/editor + +Contains main functions to set up the editor \ No newline at end of file diff --git a/packages/core/src/extensions/Blocks/api/cursorPositionTypes.ts b/packages/core/src/editor/cursorPositionTypes.ts similarity index 61% rename from packages/core/src/extensions/Blocks/api/cursorPositionTypes.ts rename to packages/core/src/editor/cursorPositionTypes.ts index ce21cda6f4..b7fa932475 100644 --- a/packages/core/src/extensions/Blocks/api/cursorPositionTypes.ts +++ b/packages/core/src/editor/cursorPositionTypes.ts @@ -1,6 +1,9 @@ -import { Block, BlockSchema } from "./blocks/types"; -import { InlineContentSchema } from "./inlineContent/types"; -import { StyleSchema } from "./styles/types"; +import { + Block, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "../schema"; export type TextCursorPosition< BSchema extends BlockSchema, diff --git a/packages/core/src/editor.css b/packages/core/src/editor/editor.css similarity index 98% rename from packages/core/src/editor.css rename to packages/core/src/editor/editor.css index 2dac0db661..9e5761a45b 100644 --- a/packages/core/src/editor.css +++ b/packages/core/src/editor/editor.css @@ -1,4 +1,4 @@ -@import url("./assets/fonts-inter.css"); +@import url("../assets/fonts-inter.css"); .bn-editor { outline: none; diff --git a/packages/core/src/editor/selectionTypes.ts b/packages/core/src/editor/selectionTypes.ts new file mode 100644 index 0000000000..aef65b5f08 --- /dev/null +++ b/packages/core/src/editor/selectionTypes.ts @@ -0,0 +1,14 @@ +import { + Block, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "../schema"; + +export type Selection< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema +> = { + blocks: Block[]; +}; diff --git a/packages/core/src/transformPasted.ts b/packages/core/src/editor/transformPasted.ts similarity index 100% rename from packages/core/src/transformPasted.ts rename to packages/core/src/editor/transformPasted.ts diff --git a/packages/core/src/shared/BaseUiElementTypes.ts b/packages/core/src/extensions-shared/BaseUiElementTypes.ts similarity index 100% rename from packages/core/src/shared/BaseUiElementTypes.ts rename to packages/core/src/extensions-shared/BaseUiElementTypes.ts diff --git a/packages/core/src/extensions-shared/README.md b/packages/core/src/extensions-shared/README.md new file mode 100644 index 0000000000..89c300fd7d --- /dev/null +++ b/packages/core/src/extensions-shared/README.md @@ -0,0 +1,3 @@ +### @blocknote/core/src/extensions-shared + +Helper functions / base plugins for @blocknote/core/src/extensions \ No newline at end of file diff --git a/packages/core/src/shared/plugins/suggestion/SuggestionItem.ts b/packages/core/src/extensions-shared/suggestion/SuggestionItem.ts similarity index 100% rename from packages/core/src/shared/plugins/suggestion/SuggestionItem.ts rename to packages/core/src/extensions-shared/suggestion/SuggestionItem.ts diff --git a/packages/core/src/shared/plugins/suggestion/SuggestionPlugin.ts b/packages/core/src/extensions-shared/suggestion/SuggestionPlugin.ts similarity index 97% rename from packages/core/src/shared/plugins/suggestion/SuggestionPlugin.ts rename to packages/core/src/extensions-shared/suggestion/SuggestionPlugin.ts index 480d935db3..23ff2ad1b6 100644 --- a/packages/core/src/shared/plugins/suggestion/SuggestionPlugin.ts +++ b/packages/core/src/extensions-shared/suggestion/SuggestionPlugin.ts @@ -1,13 +1,13 @@ +import { findParentNode } from "@tiptap/core"; import { EditorState, Plugin, PluginKey } from "prosemirror-state"; import { Decoration, DecorationSet, EditorView } from "prosemirror-view"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; -import { BlockSchema } from "../../../extensions/Blocks/api/blocks/types"; -import { InlineContentSchema } from "../../../extensions/Blocks/api/inlineContent/types"; -import { StyleSchema } from "../../../extensions/Blocks/api/styles/types"; -import { findBlock } from "../../../extensions/Blocks/helpers/findBlock"; -import { BaseUiElementState } from "../../BaseUiElementTypes"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; +import { BaseUiElementState } from "../BaseUiElementTypes"; import { SuggestionItem } from "./SuggestionItem"; +const findBlock = findParentNode((node) => node.type.name === "blockContainer"); + export type SuggestionsMenuState = BaseUiElementState & { // The suggested items to display. diff --git a/packages/core/src/extensions/BackgroundColor/BackgroundColorExtension.ts b/packages/core/src/extensions/BackgroundColor/BackgroundColorExtension.ts index 3f24ecdfea..3f74150ec0 100644 --- a/packages/core/src/extensions/BackgroundColor/BackgroundColorExtension.ts +++ b/packages/core/src/extensions/BackgroundColor/BackgroundColorExtension.ts @@ -1,5 +1,5 @@ import { Extension } from "@tiptap/core"; -import { defaultProps } from "../Blocks/api/defaultProps"; +import { defaultProps } from "../../blocks/defaultProps"; export const BackgroundColorExtension = Extension.create({ name: "blockBackgroundColor", diff --git a/packages/core/src/extensions/BackgroundColor/BackgroundColorMark.ts b/packages/core/src/extensions/BackgroundColor/BackgroundColorMark.ts index df4b257588..647705acdc 100644 --- a/packages/core/src/extensions/BackgroundColor/BackgroundColorMark.ts +++ b/packages/core/src/extensions/BackgroundColor/BackgroundColorMark.ts @@ -1,5 +1,5 @@ import { Mark } from "@tiptap/core"; -import { createStyleSpecFromTipTapMark } from "../Blocks/api/styles/internal"; +import { createStyleSpecFromTipTapMark } from "../../schema"; const BackgroundColorMark = Mark.create({ name: "backgroundColor", diff --git a/packages/core/src/extensions/Blocks/api/selectionTypes.ts b/packages/core/src/extensions/Blocks/api/selectionTypes.ts deleted file mode 100644 index 61d8086ed4..0000000000 --- a/packages/core/src/extensions/Blocks/api/selectionTypes.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Block, BlockSchema } from "./blocks/types"; -import { InlineContentSchema } from "./inlineContent/types"; -import { StyleSchema } from "./styles/types"; - -export type Selection< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema -> = { - blocks: Block[]; -}; diff --git a/packages/core/src/extensions/Blocks/helpers/findBlock.ts b/packages/core/src/extensions/Blocks/helpers/findBlock.ts deleted file mode 100644 index 8aa24cc90c..0000000000 --- a/packages/core/src/extensions/Blocks/helpers/findBlock.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { findParentNode } from "@tiptap/core"; - -export const findBlock = findParentNode( - (node) => node.type.name === "blockContainer" -); diff --git a/packages/core/src/extensions/Blocks/index.ts b/packages/core/src/extensions/Blocks/index.ts deleted file mode 100644 index 4df0534a64..0000000000 --- a/packages/core/src/extensions/Blocks/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Node } from "@tiptap/core"; -export { BlockContainer } from "./nodes/BlockContainer"; -export { BlockGroup } from "./nodes/BlockGroup"; -export const Doc = Node.create({ - name: "doc", - topNode: true, - content: "blockGroup", -}); diff --git a/packages/core/src/extensions/Blocks/nodes/BlockAttributes.ts b/packages/core/src/extensions/Blocks/nodes/BlockAttributes.ts deleted file mode 100644 index 4109c7bb6e..0000000000 --- a/packages/core/src/extensions/Blocks/nodes/BlockAttributes.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Object containing all possible block attributes. -const BlockAttributes: Record = { - blockColor: "data-block-color", - blockStyle: "data-block-style", - id: "data-id", - depth: "data-depth", - depthChange: "data-depth-change", -}; - -export default BlockAttributes; diff --git a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts index 645d90b59b..0dcdf50262 100644 --- a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +++ b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts @@ -2,15 +2,13 @@ import { isNodeSelection, posToDOMRect } from "@tiptap/core"; import { EditorState, Plugin, PluginKey } from "prosemirror-state"; import { EditorView } from "prosemirror-view"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { BaseUiElementCallbacks, BaseUiElementState, -} from "../../shared/BaseUiElementTypes"; -import { EventEmitter } from "../../shared/EventEmitter"; -import { BlockSchema } from "../Blocks/api/blocks/types"; -import { InlineContentSchema } from "../Blocks/api/inlineContent/types"; -import { StyleSchema } from "../Blocks/api/styles/types"; +} from "../../extensions-shared/BaseUiElementTypes"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; +import { EventEmitter } from "../../util/EventEmitter"; export type FormattingToolbarCallbacks = BaseUiElementCallbacks; diff --git a/packages/core/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts b/packages/core/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts index abdd1f4cab..30aa623af3 100644 --- a/packages/core/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts +++ b/packages/core/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts @@ -2,12 +2,10 @@ import { getMarkRange, posToDOMRect, Range } from "@tiptap/core"; import { EditorView } from "@tiptap/pm/view"; import { Mark } from "prosemirror-model"; import { Plugin, PluginKey } from "prosemirror-state"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { BaseUiElementState } from "../../shared/BaseUiElementTypes"; -import { EventEmitter } from "../../shared/EventEmitter"; -import { BlockSchema } from "../Blocks/api/blocks/types"; -import { InlineContentSchema } from "../Blocks/api/inlineContent/types"; -import { StyleSchema } from "../Blocks/api/styles/types"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { BaseUiElementState } from "../../extensions-shared/BaseUiElementTypes"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; +import { EventEmitter } from "../../util/EventEmitter"; export type HyperlinkToolbarState = BaseUiElementState & { // The hovered hyperlink's URL, and the text it's displayed with in the diff --git a/packages/core/src/extensions/ImageToolbar/ImageToolbarPlugin.ts b/packages/core/src/extensions/ImageToolbar/ImageToolbarPlugin.ts index 9ecb162d3a..98fe041755 100644 --- a/packages/core/src/extensions/ImageToolbar/ImageToolbarPlugin.ts +++ b/packages/core/src/extensions/ImageToolbar/ImageToolbarPlugin.ts @@ -1,15 +1,18 @@ import { EditorState, Plugin, PluginKey } from "prosemirror-state"; import { EditorView } from "prosemirror-view"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; +import { EventEmitter } from "../../util/EventEmitter"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { + BlockSchema, + InlineContentSchema, + SpecificBlock, + StyleSchema, +} from "../../schema"; import { BaseUiElementCallbacks, BaseUiElementState, -} from "../../shared/BaseUiElementTypes"; -import { EventEmitter } from "../../shared/EventEmitter"; -import { BlockSchema, SpecificBlock } from "../Blocks/api/blocks/types"; -import { InlineContentSchema } from "../Blocks/api/inlineContent/types"; -import { StyleSchema } from "../Blocks/api/styles/types"; +} from "../../extensions-shared/BaseUiElementTypes"; export type ImageToolbarCallbacks = BaseUiElementCallbacks; export type ImageToolbarState< diff --git a/packages/core/src/extensions/Blocks/NonEditableBlockPlugin.ts b/packages/core/src/extensions/NonEditableBlocks/NonEditableBlockPlugin.ts similarity index 100% rename from packages/core/src/extensions/Blocks/NonEditableBlockPlugin.ts rename to packages/core/src/extensions/NonEditableBlocks/NonEditableBlockPlugin.ts diff --git a/packages/core/src/extensions/Blocks/PreviousBlockTypePlugin.ts b/packages/core/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.ts similarity index 100% rename from packages/core/src/extensions/Blocks/PreviousBlockTypePlugin.ts rename to packages/core/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.ts diff --git a/packages/core/src/extensions/README.md b/packages/core/src/extensions/README.md new file mode 100644 index 0000000000..9272867e4f --- /dev/null +++ b/packages/core/src/extensions/README.md @@ -0,0 +1,3 @@ +### @blocknote/core/src/extensions + +All extra extensions for TipTap / Prosemirror needed to implement the Prosemirror UX and editor behavior. \ No newline at end of file diff --git a/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts b/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts index ed87b5df07..9332b15c36 100644 --- a/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts +++ b/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts @@ -2,16 +2,19 @@ import { PluginView } from "@tiptap/pm/state"; import { Node } from "prosemirror-model"; import { NodeSelection, Plugin, PluginKey, Selection } from "prosemirror-state"; import { EditorView } from "prosemirror-view"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; import { createExternalHTMLExporter } from "../../api/exporters/html/externalHTMLExporter"; import { createInternalHTMLSerializer } from "../../api/exporters/html/internalHTMLSerializer"; import { cleanHTMLToMarkdown } from "../../api/exporters/markdown/markdownExporter"; -import { BaseUiElementState } from "../../shared/BaseUiElementTypes"; -import { EventEmitter } from "../../shared/EventEmitter"; -import { Block, BlockSchema } from "../Blocks/api/blocks/types"; -import { InlineContentSchema } from "../Blocks/api/inlineContent/types"; -import { StyleSchema } from "../Blocks/api/styles/types"; -import { getBlockInfoFromPos } from "../Blocks/helpers/getBlockInfoFromPos"; +import { getBlockInfoFromPos } from "../../api/getBlockInfoFromPos"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { BaseUiElementState } from "../../extensions-shared/BaseUiElementTypes"; +import { + Block, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "../../schema"; +import { EventEmitter } from "../../util/EventEmitter"; import { slashMenuPluginKey } from "../SlashMenu/SlashMenuPlugin"; import { MultipleNodeSelection } from "./MultipleNodeSelection"; diff --git a/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts b/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts index 6bcfd8c361..42d42bebbd 100644 --- a/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts +++ b/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts @@ -1,8 +1,6 @@ -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { SuggestionItem } from "../../shared/plugins/suggestion/SuggestionItem"; -import { BlockSchema } from "../Blocks/api/blocks/types"; -import { InlineContentSchema } from "../Blocks/api/inlineContent/types"; -import { StyleSchema } from "../Blocks/api/styles/types"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { SuggestionItem } from "../../extensions-shared/suggestion/SuggestionItem"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; export type BaseSlashMenuItem< BSchema extends BlockSchema, diff --git a/packages/core/src/extensions/SlashMenu/SlashMenuPlugin.ts b/packages/core/src/extensions/SlashMenu/SlashMenuPlugin.ts index 67aec3cdb0..c58a32cbce 100644 --- a/packages/core/src/extensions/SlashMenu/SlashMenuPlugin.ts +++ b/packages/core/src/extensions/SlashMenu/SlashMenuPlugin.ts @@ -1,14 +1,12 @@ import { Plugin, PluginKey } from "prosemirror-state"; -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { EventEmitter } from "../../shared/EventEmitter"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { SuggestionsMenuState, setupSuggestionsMenu, -} from "../../shared/plugins/suggestion/SuggestionPlugin"; -import { BlockSchema } from "../Blocks/api/blocks/types"; -import { InlineContentSchema } from "../Blocks/api/inlineContent/types"; -import { StyleSchema } from "../Blocks/api/styles/types"; +} from "../../extensions-shared/suggestion/SuggestionPlugin"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; +import { EventEmitter } from "../../util/EventEmitter"; import { BaseSlashMenuItem } from "./BaseSlashMenuItem"; export const slashMenuPluginKey = new PluginKey("SlashMenuPlugin"); diff --git a/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.ts b/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.ts index c5f8d29e2c..b6b3aa0115 100644 --- a/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.ts +++ b/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.ts @@ -1,11 +1,13 @@ -import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { Block, BlockSchema, PartialBlock } from "../Blocks/api/blocks/types"; -import { defaultBlockSchema } from "../Blocks/api/defaultBlocks"; +import { defaultBlockSchema } from "../../blocks/defaultBlocks"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { + Block, + BlockSchema, InlineContentSchema, + PartialBlock, + StyleSchema, isStyledTextInlineContent, -} from "../Blocks/api/inlineContent/types"; -import { StyleSchema } from "../Blocks/api/styles/types"; +} from "../../schema"; import { imageToolbarPluginKey } from "../ImageToolbar/ImageToolbarPlugin"; import { BaseSlashMenuItem } from "./BaseSlashMenuItem"; diff --git a/packages/core/src/extensions/TableHandles/TableHandlesPlugin.ts b/packages/core/src/extensions/TableHandles/TableHandlesPlugin.ts index f600bbf4d4..9a8f03615e 100644 --- a/packages/core/src/extensions/TableHandles/TableHandlesPlugin.ts +++ b/packages/core/src/extensions/TableHandles/TableHandlesPlugin.ts @@ -1,19 +1,19 @@ import { Plugin, PluginKey, PluginView } from "prosemirror-state"; import { Decoration, DecorationSet, EditorView } from "prosemirror-view"; +import { EventEmitter } from "../../util/EventEmitter"; +import { nodeToBlock } from "../../api/nodeConversions/nodeConversions"; +import { DefaultBlockSchema } from "../../blocks/defaultBlocks"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { Block, BlockFromConfigNoChildren, - BlockNoteEditor, BlockSchemaWithBlock, - DefaultBlockSchema, InlineContentSchema, PartialBlock, SpecificBlock, StyleSchema, - getDraggableBlockFromCoords, - nodeToBlock, -} from "../.."; -import { EventEmitter } from "../../shared/EventEmitter"; +} from "../../schema"; +import { getDraggableBlockFromCoords } from "../SideMenu/SideMenuPlugin"; let dragImageElement: HTMLElement | undefined; diff --git a/packages/core/src/extensions/TextColor/TextColorExtension.ts b/packages/core/src/extensions/TextColor/TextColorExtension.ts index 09a5d894f4..6fe0d0f810 100644 --- a/packages/core/src/extensions/TextColor/TextColorExtension.ts +++ b/packages/core/src/extensions/TextColor/TextColorExtension.ts @@ -1,5 +1,5 @@ import { Extension } from "@tiptap/core"; -import { defaultProps } from "../Blocks/api/defaultProps"; +import { defaultProps } from "../../blocks/defaultProps"; export const TextColorExtension = Extension.create({ name: "blockTextColor", diff --git a/packages/core/src/extensions/TextColor/TextColorMark.ts b/packages/core/src/extensions/TextColor/TextColorMark.ts index c18ab0b374..c4538f0c94 100644 --- a/packages/core/src/extensions/TextColor/TextColorMark.ts +++ b/packages/core/src/extensions/TextColor/TextColorMark.ts @@ -1,5 +1,5 @@ import { Mark } from "@tiptap/core"; -import { createStyleSpecFromTipTapMark } from "../Blocks/api/styles/internal"; +import { createStyleSpecFromTipTapMark } from "../../schema"; const TextColorMark = Mark.create({ name: "textColor", diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 41637442bb..9678ae5a55 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,22 +1,15 @@ -export * from "./BlockNoteEditor"; -export * from "./BlockNoteExtensions"; export * from "./api/exporters/html/externalHTMLExporter"; export * from "./api/exporters/html/internalHTMLSerializer"; -export * from "./api/testCases/index"; -export * from "./extensions/Blocks/api/blocks/createSpec"; -export * from "./extensions/Blocks/api/blocks/internal"; -export * from "./extensions/Blocks/api/blocks/types"; -export * from "./extensions/Blocks/api/defaultBlocks"; -export * from "./extensions/Blocks/api/defaultProps"; -export * from "./extensions/Blocks/api/inlineContent/createSpec"; -export * from "./extensions/Blocks/api/inlineContent/internal"; -export * from "./extensions/Blocks/api/inlineContent/types"; -export * from "./extensions/Blocks/api/selectionTypes"; -export * from "./extensions/Blocks/api/styles/createSpec"; -export * from "./extensions/Blocks/api/styles/internal"; -export * from "./extensions/Blocks/api/styles/types"; -export * as blockStyles from "./extensions/Blocks/nodes/Block.css"; -export * from "./extensions/Blocks/nodes/BlockContent/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +export * from "./api/testUtil"; +export * from "./blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY"; +export * from "./blocks/defaultBlocks"; +export * from "./blocks/defaultProps"; +export * from "./editor/BlockNoteEditor"; +export * from "./editor/BlockNoteExtensions"; +export * from "./editor/selectionTypes"; +export * from "./extensions-shared/BaseUiElementTypes"; +export type { SuggestionItem } from "./extensions-shared/suggestion/SuggestionItem"; +export * from "./extensions-shared/suggestion/SuggestionPlugin"; export * from "./extensions/FormattingToolbar/FormattingToolbarPlugin"; export * from "./extensions/HyperlinkToolbar/HyperlinkToolbarPlugin"; export * from "./extensions/ImageToolbar/ImageToolbarPlugin"; @@ -25,11 +18,11 @@ export * from "./extensions/SlashMenu/BaseSlashMenuItem"; export * from "./extensions/SlashMenu/SlashMenuPlugin"; export { getDefaultSlashMenuItems } from "./extensions/SlashMenu/defaultSlashMenuItems"; export * from "./extensions/TableHandles/TableHandlesPlugin"; -export * from "./shared/BaseUiElementTypes"; -export type { SuggestionItem } from "./shared/plugins/suggestion/SuggestionItem"; -export * from "./shared/plugins/suggestion/SuggestionPlugin"; -export * from "./shared/utils"; +export * from "./schema"; +export * from "./util/browser"; +export * from "./util/string"; // for testing from react (TODO: move): export * from "./api/nodeConversions/nodeConversions"; -export * from "./api/nodeConversions/testUtil"; +export * from "./api/testUtil/partialBlockTestUtil"; export * from "./extensions/UniqueID/UniqueID"; +export { UnreachableCaseError } from "./util/typescript"; diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContainer.ts b/packages/core/src/pm-nodes/BlockContainer.ts similarity index 96% rename from packages/core/src/extensions/Blocks/nodes/BlockContainer.ts rename to packages/core/src/pm-nodes/BlockContainer.ts index bba83b4308..016ac4444e 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContainer.ts +++ b/packages/core/src/pm-nodes/BlockContainer.ts @@ -2,24 +2,33 @@ import { Node } from "@tiptap/core"; import { Fragment, Node as PMNode, Slice } from "prosemirror-model"; import { NodeSelection, TextSelection } from "prosemirror-state"; -import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import { getBlockInfoFromPos } from "../api/getBlockInfoFromPos"; import { blockToNode, inlineContentToNodes, tableContentToNodes, -} from "../../../api/nodeConversions/nodeConversions"; -import { UnreachableCaseError, mergeCSSClasses } from "../../../shared/utils"; -import { NonEditableBlockPlugin } from "../NonEditableBlockPlugin"; -import { PreviousBlockTypePlugin } from "../PreviousBlockTypePlugin"; +} from "../api/nodeConversions/nodeConversions"; +import type { BlockNoteEditor } from "../editor/BlockNoteEditor"; +import { NonEditableBlockPlugin } from "../extensions/NonEditableBlocks/NonEditableBlockPlugin"; +import { PreviousBlockTypePlugin } from "../extensions/PreviousBlockType/PreviousBlockTypePlugin"; import { BlockNoteDOMAttributes, BlockSchema, + InlineContentSchema, PartialBlock, -} from "../api/blocks/types"; -import { InlineContentSchema } from "../api/inlineContent/types"; -import { StyleSchema } from "../api/styles/types"; -import { getBlockInfoFromPos } from "../helpers/getBlockInfoFromPos"; -import BlockAttributes from "./BlockAttributes"; + StyleSchema, +} from "../schema"; +import { mergeCSSClasses } from "../util/browser"; +import { UnreachableCaseError } from "../util/typescript"; + +// Object containing all possible block attributes. +const BlockAttributes: Record = { + blockColor: "data-block-color", + blockStyle: "data-block-style", + id: "data-id", + depth: "data-depth", + depthChange: "data-depth-change", +}; declare module "@tiptap/core" { interface Commands { diff --git a/packages/core/src/extensions/Blocks/nodes/BlockGroup.ts b/packages/core/src/pm-nodes/BlockGroup.ts similarity index 91% rename from packages/core/src/extensions/Blocks/nodes/BlockGroup.ts rename to packages/core/src/pm-nodes/BlockGroup.ts index 88f4a3025c..ab2f771c21 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockGroup.ts +++ b/packages/core/src/pm-nodes/BlockGroup.ts @@ -1,6 +1,6 @@ import { Node } from "@tiptap/core"; -import { mergeCSSClasses } from "../../../shared/utils"; -import { BlockNoteDOMAttributes } from "../api/blocks/types"; +import { BlockNoteDOMAttributes } from "../schema"; +import { mergeCSSClasses } from "../util/browser"; export const BlockGroup = Node.create<{ domAttributes?: BlockNoteDOMAttributes; diff --git a/packages/core/src/pm-nodes/Doc.ts b/packages/core/src/pm-nodes/Doc.ts new file mode 100644 index 0000000000..69d086b5d4 --- /dev/null +++ b/packages/core/src/pm-nodes/Doc.ts @@ -0,0 +1,7 @@ +import {Node} from "@tiptap/core"; + +export const Doc = Node.create({ + name: "doc", + topNode: true, + content: "blockGroup", +}); diff --git a/packages/core/ARCHITECTURE.md b/packages/core/src/pm-nodes/README.md similarity index 93% rename from packages/core/ARCHITECTURE.md rename to packages/core/src/pm-nodes/README.md index ee07f25ea3..83ea63c6f4 100644 --- a/packages/core/ARCHITECTURE.md +++ b/packages/core/src/pm-nodes/README.md @@ -1,3 +1,8 @@ +### @blocknote/core/src/pm-nodes + +Defines the prosemirror nodes and base node structure. See below: + + # Node structure We use a Prosemirror document structure where every element is a `block` with 1 `content` element and one optional group of children (`blockgroup`). diff --git a/packages/core/src/pm-nodes/index.ts b/packages/core/src/pm-nodes/index.ts new file mode 100644 index 0000000000..bcda2eecc7 --- /dev/null +++ b/packages/core/src/pm-nodes/index.ts @@ -0,0 +1,3 @@ +export { BlockContainer } from "./BlockContainer"; +export { BlockGroup } from "./BlockGroup"; +export { Doc } from "./Doc"; \ No newline at end of file diff --git a/packages/core/src/schema/README.md b/packages/core/src/schema/README.md new file mode 100644 index 0000000000..0aaf329fa1 --- /dev/null +++ b/packages/core/src/schema/README.md @@ -0,0 +1,3 @@ +### @blocknote/core/src/schema + +The BlockNote Schema consists of Blocks, InlineContent and Styles. \ No newline at end of file diff --git a/packages/core/src/extensions/Blocks/api/blocks/createSpec.ts b/packages/core/src/schema/blocks/createSpec.ts similarity index 98% rename from packages/core/src/extensions/Blocks/api/blocks/createSpec.ts rename to packages/core/src/schema/blocks/createSpec.ts index de292f228a..eee2ac6788 100644 --- a/packages/core/src/extensions/Blocks/api/blocks/createSpec.ts +++ b/packages/core/src/schema/blocks/createSpec.ts @@ -1,5 +1,5 @@ import { ParseRule } from "@tiptap/pm/model"; -import { BlockNoteEditor } from "../../../../BlockNoteEditor"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { InlineContentSchema } from "../inlineContent/types"; import { StyleSchema } from "../styles/types"; import { diff --git a/packages/core/src/extensions/Blocks/api/blocks/internal.ts b/packages/core/src/schema/blocks/internal.ts similarity index 94% rename from packages/core/src/extensions/Blocks/api/blocks/internal.ts rename to packages/core/src/schema/blocks/internal.ts index 302f23ab8f..7ab8b1d4c5 100644 --- a/packages/core/src/extensions/Blocks/api/blocks/internal.ts +++ b/packages/core/src/schema/blocks/internal.ts @@ -6,11 +6,13 @@ import { Node, NodeConfig, } from "@tiptap/core"; -import { BlockNoteEditor } from "../../../../BlockNoteEditor"; -import { mergeCSSClasses } from "../../../../shared/utils"; -import { defaultBlockToHTML } from "../../nodes/BlockContent/defaultBlockHelpers"; -import { inheritedProps } from "../defaultProps"; +import { defaultBlockToHTML } from "../../blocks/defaultBlockHelpers"; +import { inheritedProps } from "../../blocks/defaultProps"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { mergeCSSClasses } from "../../util/browser"; +import { camelToDataKebab } from "../../util/string"; import { InlineContentSchema } from "../inlineContent/types"; +import { PropSchema, Props } from "../propTypes"; import { StyleSchema } from "../styles/types"; import { BlockConfig, @@ -18,16 +20,10 @@ import { BlockSchemaWithBlock, BlockSpec, BlockSpecs, - Props, - PropSchema, SpecificBlock, TiptapBlockImplementation, } from "./types"; -export function camelToDataKebab(str: string): string { - return "data-" + str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); -} - // Function that uses the 'propSchema' of a blockConfig to create a TipTap // node's `addAttributes` property. // TODO: extract function diff --git a/packages/core/src/extensions/Blocks/api/blocks/types.ts b/packages/core/src/schema/blocks/types.ts similarity index 81% rename from packages/core/src/extensions/Blocks/api/blocks/types.ts rename to packages/core/src/schema/blocks/types.ts index 29b4acfe79..65b231c3a9 100644 --- a/packages/core/src/extensions/Blocks/api/blocks/types.ts +++ b/packages/core/src/schema/blocks/types.ts @@ -1,12 +1,13 @@ /** Define the main block types **/ import { Extension, Node } from "@tiptap/core"; -import { BlockNoteEditor } from "../../../../BlockNoteEditor"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { InlineContent, InlineContentSchema, PartialInlineContent, } from "../inlineContent/types"; +import { PropSchema, Props } from "../propTypes"; import { StyleSchema } from "../styles/types"; export type BlockNoteDOMElement = @@ -20,39 +21,6 @@ export type BlockNoteDOMAttributes = Partial<{ [DOMElement in BlockNoteDOMElement]: Record; }>; -// Defines a single prop spec, which includes the default value the prop should -// take and possible values it can take. -export type PropSpec = { - values?: readonly PType[]; - default: PType; -}; - -// Defines multiple block prop specs. The key of each prop is the name of the -// prop, while the value is a corresponding prop spec. This should be included -// in a block config or schema. From a prop schema, we can derive both the props' -// internal implementation (as TipTap node attributes) and the type information -// for the external API. -export type PropSchema = Record>; - -// Defines Props objects for use in Block objects in the external API. Converts -// each prop spec into a union type of its possible values, or a string if no -// values are specified. -export type Props = { - [PName in keyof PSchema]: PSchema[PName]["default"] extends boolean - ? PSchema[PName]["values"] extends readonly boolean[] - ? PSchema[PName]["values"][number] - : boolean - : PSchema[PName]["default"] extends number - ? PSchema[PName]["values"] extends readonly number[] - ? PSchema[PName]["values"][number] - : number - : PSchema[PName]["default"] extends string - ? PSchema[PName]["values"] extends readonly string[] - ? PSchema[PName]["values"][number] - : string - : never; -}; - // BlockConfig contains the "schema" info about a Block type // i.e. what props it supports, what content it supports, etc. export type BlockConfig = { diff --git a/packages/core/src/schema/index.ts b/packages/core/src/schema/index.ts new file mode 100644 index 0000000000..29b85a42cc --- /dev/null +++ b/packages/core/src/schema/index.ts @@ -0,0 +1,10 @@ +export * from "./blocks/createSpec"; +export * from "./blocks/internal"; +export * from "./blocks/types"; +export * from "./inlineContent/createSpec"; +export * from "./inlineContent/internal"; +export * from "./inlineContent/types"; +export * from "./propTypes"; +export * from "./styles/createSpec"; +export * from "./styles/internal"; +export * from "./styles/types"; diff --git a/packages/core/src/extensions/Blocks/api/inlineContent/createSpec.ts b/packages/core/src/schema/inlineContent/createSpec.ts similarity index 96% rename from packages/core/src/extensions/Blocks/api/inlineContent/createSpec.ts rename to packages/core/src/schema/inlineContent/createSpec.ts index 3528f080fb..693fdc7b9e 100644 --- a/packages/core/src/extensions/Blocks/api/inlineContent/createSpec.ts +++ b/packages/core/src/schema/inlineContent/createSpec.ts @@ -1,8 +1,8 @@ import { Node } from "@tiptap/core"; import { ParseRule } from "@tiptap/pm/model"; -import { nodeToCustomInlineContent } from "../../../../api/nodeConversions/nodeConversions"; +import { nodeToCustomInlineContent } from "../../api/nodeConversions/nodeConversions"; import { propsToAttributes } from "../blocks/internal"; -import { Props } from "../blocks/types"; +import { Props } from "../propTypes"; import { StyleSchema } from "../styles/types"; import { addInlineContentAttributes, diff --git a/packages/core/src/extensions/Blocks/api/inlineContent/internal.ts b/packages/core/src/schema/inlineContent/internal.ts similarity index 96% rename from packages/core/src/extensions/Blocks/api/inlineContent/internal.ts rename to packages/core/src/schema/inlineContent/internal.ts index 1e0106f520..c1b70a28c0 100644 --- a/packages/core/src/extensions/Blocks/api/inlineContent/internal.ts +++ b/packages/core/src/schema/inlineContent/internal.ts @@ -1,6 +1,7 @@ import { KeyboardShortcutCommand, Node } from "@tiptap/core"; -import { camelToDataKebab } from "../blocks/internal"; -import { PropSchema, Props } from "../blocks/types"; + +import { camelToDataKebab } from "../../util/string"; +import { PropSchema, Props } from "../propTypes"; import { CustomInlineContentConfig, InlineContentConfig, diff --git a/packages/core/src/extensions/Blocks/api/inlineContent/types.ts b/packages/core/src/schema/inlineContent/types.ts similarity index 98% rename from packages/core/src/extensions/Blocks/api/inlineContent/types.ts rename to packages/core/src/schema/inlineContent/types.ts index b50622816d..eb4c852ab3 100644 --- a/packages/core/src/extensions/Blocks/api/inlineContent/types.ts +++ b/packages/core/src/schema/inlineContent/types.ts @@ -1,5 +1,5 @@ import { Node } from "@tiptap/core"; -import { PropSchema, Props } from "../blocks/types"; +import { PropSchema, Props } from "../propTypes"; import { StyleSchema, Styles } from "../styles/types"; export type CustomInlineContentConfig = { diff --git a/packages/core/src/schema/propTypes.ts b/packages/core/src/schema/propTypes.ts new file mode 100644 index 0000000000..2bf3e6dfc4 --- /dev/null +++ b/packages/core/src/schema/propTypes.ts @@ -0,0 +1,32 @@ +// Defines a single prop spec, which includes the default value the prop should +// take and possible values it can take. +export type PropSpec = { + values?: readonly PType[]; + default: PType; +}; + +// Defines multiple block prop specs. The key of each prop is the name of the +// prop, while the value is a corresponding prop spec. This should be included +// in a block config or schema. From a prop schema, we can derive both the props' +// internal implementation (as TipTap node attributes) and the type information +// for the external API. +export type PropSchema = Record>; + +// Defines Props objects for use in Block objects in the external API. Converts +// each prop spec into a union type of its possible values, or a string if no +// values are specified. +export type Props = { + [PName in keyof PSchema]: PSchema[PName]["default"] extends boolean + ? PSchema[PName]["values"] extends readonly boolean[] + ? PSchema[PName]["values"][number] + : boolean + : PSchema[PName]["default"] extends number + ? PSchema[PName]["values"] extends readonly number[] + ? PSchema[PName]["values"][number] + : number + : PSchema[PName]["default"] extends string + ? PSchema[PName]["values"] extends readonly string[] + ? PSchema[PName]["values"][number] + : string + : never; +}; diff --git a/packages/core/src/extensions/Blocks/api/styles/createSpec.ts b/packages/core/src/schema/styles/createSpec.ts similarity index 97% rename from packages/core/src/extensions/Blocks/api/styles/createSpec.ts rename to packages/core/src/schema/styles/createSpec.ts index 49015a30df..37d7424d28 100644 --- a/packages/core/src/extensions/Blocks/api/styles/createSpec.ts +++ b/packages/core/src/schema/styles/createSpec.ts @@ -1,12 +1,12 @@ import { Mark } from "@tiptap/core"; import { ParseRule } from "@tiptap/pm/model"; -import { UnreachableCaseError } from "../../../../shared/utils"; import { addStyleAttributes, createInternalStyleSpec, stylePropsToAttributes, } from "./internal"; import { StyleConfig, StyleSpec } from "./types"; +import {UnreachableCaseError} from "../../util/typescript"; export type CustomStyleImplementation = { render: T["propSchema"] extends "boolean" diff --git a/packages/core/src/extensions/Blocks/api/styles/internal.ts b/packages/core/src/schema/styles/internal.ts similarity index 100% rename from packages/core/src/extensions/Blocks/api/styles/internal.ts rename to packages/core/src/schema/styles/internal.ts diff --git a/packages/core/src/extensions/Blocks/api/styles/types.ts b/packages/core/src/schema/styles/types.ts similarity index 100% rename from packages/core/src/extensions/Blocks/api/styles/types.ts rename to packages/core/src/schema/styles/types.ts diff --git a/packages/core/src/shared/EditorElement.ts b/packages/core/src/shared/EditorElement.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/core/src/shared/EventEmitter.ts b/packages/core/src/util/EventEmitter.ts similarity index 100% rename from packages/core/src/shared/EventEmitter.ts rename to packages/core/src/util/EventEmitter.ts diff --git a/packages/core/src/util/README.md b/packages/core/src/util/README.md new file mode 100644 index 0000000000..4fe456fd0e --- /dev/null +++ b/packages/core/src/util/README.md @@ -0,0 +1,3 @@ +### @blocknote/core/src/@util + +Contains generic utility files with helper functions / classes. \ No newline at end of file diff --git a/packages/core/src/shared/utils.ts b/packages/core/src/util/browser.ts similarity index 56% rename from packages/core/src/shared/utils.ts rename to packages/core/src/util/browser.ts index e421f9f5aa..d32090c334 100644 --- a/packages/core/src/shared/utils.ts +++ b/packages/core/src/util/browser.ts @@ -1,7 +1,8 @@ export const isAppleOS = () => - /Mac/.test(navigator.platform) || - (/AppleWebKit/.test(navigator.userAgent) && - /Mobile\/\w+/.test(navigator.userAgent)); + typeof navigator !== "undefined" && + (/Mac/.test(navigator.platform) || + (/AppleWebKit/.test(navigator.userAgent) && + /Mobile\/\w+/.test(navigator.userAgent))); export function formatKeyboardShortcut(shortcut: string) { if (isAppleOS()) { @@ -15,8 +16,3 @@ export function mergeCSSClasses(...classes: string[]) { return classes.filter((c) => c).join(" "); } -export class UnreachableCaseError extends Error { - constructor(val: never) { - super(`Unreachable case: ${val}`); - } -} diff --git a/packages/core/src/util/string.ts b/packages/core/src/util/string.ts new file mode 100644 index 0000000000..d08881ca37 --- /dev/null +++ b/packages/core/src/util/string.ts @@ -0,0 +1,3 @@ +export function camelToDataKebab(str: string): string { + return "data-" + str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); +} diff --git a/packages/core/src/util/typescript.ts b/packages/core/src/util/typescript.ts new file mode 100644 index 0000000000..93b94f8b51 --- /dev/null +++ b/packages/core/src/util/typescript.ts @@ -0,0 +1,5 @@ +export class UnreachableCaseError extends Error { + constructor(val: never) { + super(`Unreachable case: ${val}`); + } +} \ No newline at end of file diff --git a/packages/react/src/SharedComponents/ColorPicker/components/ColorIcon.tsx b/packages/react/src/components-shared/ColorPicker/ColorIcon.tsx similarity index 100% rename from packages/react/src/SharedComponents/ColorPicker/components/ColorIcon.tsx rename to packages/react/src/components-shared/ColorPicker/ColorIcon.tsx diff --git a/packages/react/src/SharedComponents/ColorPicker/components/ColorPicker.tsx b/packages/react/src/components-shared/ColorPicker/ColorPicker.tsx similarity index 100% rename from packages/react/src/SharedComponents/ColorPicker/components/ColorPicker.tsx rename to packages/react/src/components-shared/ColorPicker/ColorPicker.tsx diff --git a/packages/react/src/SharedComponents/Toolbar/components/Toolbar.tsx b/packages/react/src/components-shared/Toolbar/Toolbar.tsx similarity index 100% rename from packages/react/src/SharedComponents/Toolbar/components/Toolbar.tsx rename to packages/react/src/components-shared/Toolbar/Toolbar.tsx diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarButton.tsx b/packages/react/src/components-shared/Toolbar/ToolbarButton.tsx similarity index 96% rename from packages/react/src/SharedComponents/Toolbar/components/ToolbarButton.tsx rename to packages/react/src/components-shared/Toolbar/ToolbarButton.tsx index ef55f69c1b..d964859c29 100644 --- a/packages/react/src/SharedComponents/Toolbar/components/ToolbarButton.tsx +++ b/packages/react/src/components-shared/Toolbar/ToolbarButton.tsx @@ -1,7 +1,7 @@ import { ActionIcon, Button } from "@mantine/core"; import Tippy from "@tippyjs/react"; import { ForwardedRef, forwardRef, MouseEvent } from "react"; -import { TooltipContent } from "../../Tooltip/components/TooltipContent"; +import { TooltipContent } from "../Tooltip/TooltipContent"; import { IconType } from "react-icons"; export type ToolbarButtonProps = { diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdown.tsx b/packages/react/src/components-shared/Toolbar/ToolbarDropdown.tsx similarity index 93% rename from packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdown.tsx rename to packages/react/src/components-shared/Toolbar/ToolbarDropdown.tsx index 176c72faa3..890d4734dd 100644 --- a/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdown.tsx +++ b/packages/react/src/components-shared/Toolbar/ToolbarDropdown.tsx @@ -4,7 +4,7 @@ import { ToolbarDropdownItemProps, } from "./ToolbarDropdownItem"; import { ToolbarDropdownTarget } from "./ToolbarDropdownTarget"; -import { usePreventMenuOverflow } from "../../../hooks/usePreventMenuOverflow"; +import { usePreventMenuOverflow } from "../../hooks/usePreventMenuOverflow"; export type ToolbarDropdownProps = { items: ToolbarDropdownItemProps[]; diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdownItem.tsx b/packages/react/src/components-shared/Toolbar/ToolbarDropdownItem.tsx similarity index 100% rename from packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdownItem.tsx rename to packages/react/src/components-shared/Toolbar/ToolbarDropdownItem.tsx diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdownTarget.tsx b/packages/react/src/components-shared/Toolbar/ToolbarDropdownTarget.tsx similarity index 100% rename from packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdownTarget.tsx rename to packages/react/src/components-shared/Toolbar/ToolbarDropdownTarget.tsx diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarInputDropdown.tsx b/packages/react/src/components-shared/Toolbar/ToolbarInputDropdown.tsx similarity index 100% rename from packages/react/src/SharedComponents/Toolbar/components/ToolbarInputDropdown.tsx rename to packages/react/src/components-shared/Toolbar/ToolbarInputDropdown.tsx diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarInputDropdownButton.tsx b/packages/react/src/components-shared/Toolbar/ToolbarInputDropdownButton.tsx similarity index 100% rename from packages/react/src/SharedComponents/Toolbar/components/ToolbarInputDropdownButton.tsx rename to packages/react/src/components-shared/Toolbar/ToolbarInputDropdownButton.tsx diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarInputDropdownItem.tsx b/packages/react/src/components-shared/Toolbar/ToolbarInputDropdownItem.tsx similarity index 100% rename from packages/react/src/SharedComponents/Toolbar/components/ToolbarInputDropdownItem.tsx rename to packages/react/src/components-shared/Toolbar/ToolbarInputDropdownItem.tsx diff --git a/packages/react/src/SharedComponents/Tooltip/components/TooltipContent.tsx b/packages/react/src/components-shared/Tooltip/TooltipContent.tsx similarity index 100% rename from packages/react/src/SharedComponents/Tooltip/components/TooltipContent.tsx rename to packages/react/src/components-shared/Tooltip/TooltipContent.tsx diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/ColorStyleButton.tsx similarity index 90% rename from packages/react/src/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx rename to packages/react/src/components/FormattingToolbar/DefaultButtons/ColorStyleButton.tsx index 65c5c068a8..3fad508d24 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/ColorStyleButton.tsx @@ -7,9 +7,9 @@ import { import { Menu } from "@mantine/core"; import { useCallback, useMemo, useState } from "react"; -import { ColorIcon } from "../../../SharedComponents/ColorPicker/components/ColorIcon"; -import { ColorPicker } from "../../../SharedComponents/ColorPicker/components/ColorPicker"; -import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; +import { ColorIcon } from "../../../components-shared/ColorPicker/ColorIcon"; +import { ColorPicker } from "../../../components-shared/ColorPicker/ColorPicker"; +import { ToolbarButton } from "../../../components-shared/Toolbar/ToolbarButton"; import { useEditorChange } from "../../../hooks/useEditorChange"; import { usePreventMenuOverflow } from "../../../hooks/usePreventMenuOverflow"; import { useSelectedBlocks } from "../../../hooks/useSelectedBlocks"; diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/CreateLinkButton.tsx similarity index 79% rename from packages/react/src/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx rename to packages/react/src/components/FormattingToolbar/DefaultButtons/CreateLinkButton.tsx index 188a3bf32c..df3cdb0a90 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/CreateLinkButton.tsx @@ -2,12 +2,12 @@ import { useCallback, useMemo, useState } from "react"; import { BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { RiLink } from "react-icons/ri"; -import { ToolbarInputDropdownButton } from "../../../SharedComponents/Toolbar/components/ToolbarInputDropdownButton"; -import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; -import { EditHyperlinkMenu } from "../../../HyperlinkToolbar/components/EditHyperlinkMenu/components/EditHyperlinkMenu"; +import { ToolbarInputDropdownButton } from "../../../components-shared/Toolbar/ToolbarInputDropdownButton"; +import { ToolbarButton } from "../../../components-shared/Toolbar/ToolbarButton"; +import { EditHyperlinkMenu } from "../../HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu"; import { useSelectedBlocks } from "../../../hooks/useSelectedBlocks"; import { useEditorChange } from "../../../hooks/useEditorChange"; -import { formatKeyboardShortcut } from "../../../utils"; +import { formatKeyboardShortcut } from "@blocknote/core"; export const CreateLinkButton = (props: { editor: BlockNoteEditor; diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/ImageCaptionButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/ImageCaptionButton.tsx similarity index 87% rename from packages/react/src/FormattingToolbar/components/DefaultButtons/ImageCaptionButton.tsx rename to packages/react/src/components/FormattingToolbar/DefaultButtons/ImageCaptionButton.tsx index cf2dd29e2b..509e54e0a1 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/ImageCaptionButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/ImageCaptionButton.tsx @@ -9,10 +9,10 @@ import { } from "react"; import { RiText } from "react-icons/ri"; -import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; -import { ToolbarInputDropdown } from "../../../SharedComponents/Toolbar/components/ToolbarInputDropdown"; -import { ToolbarInputDropdownButton } from "../../../SharedComponents/Toolbar/components/ToolbarInputDropdownButton"; -import { ToolbarInputDropdownItem } from "../../../SharedComponents/Toolbar/components/ToolbarInputDropdownItem"; +import { ToolbarButton } from "../../../components-shared/Toolbar/ToolbarButton"; +import { ToolbarInputDropdown } from "../../../components-shared/Toolbar/ToolbarInputDropdown"; +import { ToolbarInputDropdownButton } from "../../../components-shared/Toolbar/ToolbarInputDropdownButton"; +import { ToolbarInputDropdownItem } from "../../../components-shared/Toolbar/ToolbarInputDropdownItem"; import { useSelectedBlocks } from "../../../hooks/useSelectedBlocks"; export const ImageCaptionButton = (props: { diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/NestBlockButtons.tsx similarity index 90% rename from packages/react/src/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx rename to packages/react/src/components/FormattingToolbar/DefaultButtons/NestBlockButtons.tsx index 68a12d2ddd..57f72124c3 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/NestBlockButtons.tsx @@ -2,9 +2,9 @@ import { useCallback, useState } from "react"; import { BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { RiIndentDecrease, RiIndentIncrease } from "react-icons/ri"; -import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; +import { ToolbarButton } from "../../../components-shared/Toolbar/ToolbarButton"; import { useEditorChange } from "../../../hooks/useEditorChange"; -import { formatKeyboardShortcut } from "../../../utils"; +import { formatKeyboardShortcut } from "@blocknote/core"; export const NestBlockButton = (props: { editor: BlockNoteEditor; diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/ReplaceImageButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/ReplaceImageButton.tsx similarity index 86% rename from packages/react/src/FormattingToolbar/components/DefaultButtons/ReplaceImageButton.tsx rename to packages/react/src/components/FormattingToolbar/DefaultButtons/ReplaceImageButton.tsx index 2169e3ff7e..c684b03770 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/ReplaceImageButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/ReplaceImageButton.tsx @@ -3,8 +3,8 @@ import Tippy from "@tippyjs/react"; import { useEffect, useState } from "react"; import { RiImageEditFill } from "react-icons/ri"; -import { DefaultImageToolbar } from "../../../ImageToolbar/components/DefaultImageToolbar"; -import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; +import { DefaultImageToolbar } from "../../ImageToolbar/DefaultImageToolbar"; +import { ToolbarButton } from "../../../components-shared/Toolbar/ToolbarButton"; import { useSelectedBlocks } from "../../../hooks/useSelectedBlocks"; export const ReplaceImageButton = (props: { diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/TextAlignButton.tsx similarity index 95% rename from packages/react/src/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx rename to packages/react/src/components/FormattingToolbar/DefaultButtons/TextAlignButton.tsx index c56c8ecc30..145711e522 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/TextAlignButton.tsx @@ -13,7 +13,7 @@ import { RiAlignRight, } from "react-icons/ri"; -import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; +import { ToolbarButton } from "../../../components-shared/Toolbar/ToolbarButton"; import { useSelectedBlocks } from "../../../hooks/useSelectedBlocks"; type TextAlignment = DefaultProps["textAlignment"]; diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/ToggledStyleButton.tsx similarity index 93% rename from packages/react/src/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx rename to packages/react/src/components/FormattingToolbar/DefaultButtons/ToggledStyleButton.tsx index 95895d32db..53a51ca958 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/ToggledStyleButton.tsx @@ -13,10 +13,10 @@ import { } from "react-icons/ri"; import { StyleSchema } from "@blocknote/core"; -import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; +import { ToolbarButton } from "../../../components-shared/Toolbar/ToolbarButton"; import { useEditorChange } from "../../../hooks/useEditorChange"; import { useSelectedBlocks } from "../../../hooks/useSelectedBlocks"; -import { formatKeyboardShortcut } from "../../../utils"; +import { formatKeyboardShortcut } from "@blocknote/core"; const shortcuts = { bold: "Mod+B", diff --git a/packages/react/src/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx b/packages/react/src/components/FormattingToolbar/DefaultDropdowns/BlockTypeDropdown.tsx similarity index 95% rename from packages/react/src/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx rename to packages/react/src/components/FormattingToolbar/DefaultDropdowns/BlockTypeDropdown.tsx index 4d15de5be6..613c3cf513 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultDropdowns/BlockTypeDropdown.tsx @@ -10,10 +10,10 @@ import { RiText, } from "react-icons/ri"; -import { ToolbarDropdown } from "../../../SharedComponents/Toolbar/components/ToolbarDropdown"; -import { ToolbarDropdownItemProps } from "../../../SharedComponents/Toolbar/components/ToolbarDropdownItem"; import { useEditorChange } from "../../../hooks/useEditorChange"; import { useSelectedBlocks } from "../../../hooks/useSelectedBlocks"; +import { ToolbarDropdown } from "../../../components-shared/Toolbar/ToolbarDropdown"; +import type { ToolbarDropdownItemProps } from "../../../components-shared/Toolbar/ToolbarDropdownItem"; export type BlockTypeDropdownItem = { name: string; diff --git a/packages/react/src/FormattingToolbar/components/DefaultFormattingToolbar.tsx b/packages/react/src/components/FormattingToolbar/DefaultFormattingToolbar.tsx similarity index 92% rename from packages/react/src/FormattingToolbar/components/DefaultFormattingToolbar.tsx rename to packages/react/src/components/FormattingToolbar/DefaultFormattingToolbar.tsx index 7843311293..ca0cffbc06 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultFormattingToolbar.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultFormattingToolbar.tsx @@ -1,21 +1,21 @@ import { BlockSchema } from "@blocknote/core"; -import { FormattingToolbarProps } from "./FormattingToolbarPositioner"; -import { Toolbar } from "../../SharedComponents/Toolbar/components/Toolbar"; -import { - BlockTypeDropdown, - BlockTypeDropdownItem, -} from "./DefaultDropdowns/BlockTypeDropdown"; -import { ToggledStyleButton } from "./DefaultButtons/ToggledStyleButton"; -import { TextAlignButton } from "./DefaultButtons/TextAlignButton"; +import { Toolbar } from "../../components-shared/Toolbar/Toolbar"; import { ColorStyleButton } from "./DefaultButtons/ColorStyleButton"; +import { CreateLinkButton } from "./DefaultButtons/CreateLinkButton"; +import { ImageCaptionButton } from "./DefaultButtons/ImageCaptionButton"; import { NestBlockButton, UnnestBlockButton, } from "./DefaultButtons/NestBlockButtons"; -import { CreateLinkButton } from "./DefaultButtons/CreateLinkButton"; import { ReplaceImageButton } from "./DefaultButtons/ReplaceImageButton"; -import { ImageCaptionButton } from "./DefaultButtons/ImageCaptionButton"; +import { TextAlignButton } from "./DefaultButtons/TextAlignButton"; +import { ToggledStyleButton } from "./DefaultButtons/ToggledStyleButton"; +import { + BlockTypeDropdown, + BlockTypeDropdownItem, +} from "./DefaultDropdowns/BlockTypeDropdown"; +import type { FormattingToolbarProps } from "./FormattingToolbarPositioner"; export const DefaultFormattingToolbar = ( props: FormattingToolbarProps & { diff --git a/packages/react/src/FormattingToolbar/components/FormattingToolbarPositioner.tsx b/packages/react/src/components/FormattingToolbar/FormattingToolbarPositioner.tsx similarity index 100% rename from packages/react/src/FormattingToolbar/components/FormattingToolbarPositioner.tsx rename to packages/react/src/components/FormattingToolbar/FormattingToolbarPositioner.tsx diff --git a/packages/react/src/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx b/packages/react/src/components/HyperlinkToolbar/DefaultHyperlinkToolbar.tsx similarity index 88% rename from packages/react/src/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx rename to packages/react/src/components/HyperlinkToolbar/DefaultHyperlinkToolbar.tsx index 269de59419..4e9e72f1ce 100644 --- a/packages/react/src/HyperlinkToolbar/components/DefaultHyperlinkToolbar.tsx +++ b/packages/react/src/components/HyperlinkToolbar/DefaultHyperlinkToolbar.tsx @@ -3,10 +3,10 @@ import { useRef, useState } from "react"; import { RiExternalLinkFill, RiLinkUnlink } from "react-icons/ri"; import { StyleSchema } from "@blocknote/core"; -import { Toolbar } from "../../SharedComponents/Toolbar/components/Toolbar"; -import { ToolbarButton } from "../../SharedComponents/Toolbar/components/ToolbarButton"; +import { Toolbar } from "../../components-shared/Toolbar/Toolbar"; +import { ToolbarButton } from "../../components-shared/Toolbar/ToolbarButton"; import { EditHyperlinkMenu } from "./EditHyperlinkMenu/components/EditHyperlinkMenu"; -import { HyperlinkToolbarProps } from "./HyperlinkToolbarPositioner"; +import type { HyperlinkToolbarProps } from "./HyperlinkToolbarPositioner"; export const DefaultHyperlinkToolbar = < BSchema extends BlockSchema, diff --git a/packages/react/src/HyperlinkToolbar/components/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx b/packages/react/src/components/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx similarity index 90% rename from packages/react/src/HyperlinkToolbar/components/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx rename to packages/react/src/components/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx index 96a936206b..82ecb898dd 100644 --- a/packages/react/src/HyperlinkToolbar/components/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx +++ b/packages/react/src/components/HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu.tsx @@ -8,8 +8,8 @@ import { useState, } from "react"; import { RiLink, RiText } from "react-icons/ri"; -import { ToolbarInputDropdown } from "../../../../SharedComponents/Toolbar/components/ToolbarInputDropdown"; -import { ToolbarInputDropdownItem } from "../../../../SharedComponents/Toolbar/components/ToolbarInputDropdownItem"; +import { ToolbarInputDropdown } from "../../../../components-shared/Toolbar/ToolbarInputDropdown"; +import { ToolbarInputDropdownItem } from "../../../../components-shared/Toolbar/ToolbarInputDropdownItem"; export type EditHyperlinkMenuProps = { url: string; diff --git a/packages/react/src/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx b/packages/react/src/components/HyperlinkToolbar/HyperlinkToolbarPositioner.tsx similarity index 100% rename from packages/react/src/HyperlinkToolbar/components/HyperlinkToolbarPositioner.tsx rename to packages/react/src/components/HyperlinkToolbar/HyperlinkToolbarPositioner.tsx diff --git a/packages/react/src/ImageToolbar/components/DefaultImageToolbar.tsx b/packages/react/src/components/ImageToolbar/DefaultImageToolbar.tsx similarity index 96% rename from packages/react/src/ImageToolbar/components/DefaultImageToolbar.tsx rename to packages/react/src/components/ImageToolbar/DefaultImageToolbar.tsx index 49260e289a..ad639076b6 100644 --- a/packages/react/src/ImageToolbar/components/DefaultImageToolbar.tsx +++ b/packages/react/src/components/ImageToolbar/DefaultImageToolbar.tsx @@ -15,8 +15,8 @@ import { useEffect, useState, } from "react"; -import { Toolbar } from "../../SharedComponents/Toolbar/components/Toolbar"; -import { ImageToolbarProps } from "./ImageToolbarPositioner"; +import { Toolbar } from "../../components-shared/Toolbar/Toolbar"; +import type { ImageToolbarProps } from "./ImageToolbarPositioner"; export const DefaultImageToolbar = ( props: ImageToolbarProps diff --git a/packages/react/src/ImageToolbar/components/ImageToolbarPositioner.tsx b/packages/react/src/components/ImageToolbar/ImageToolbarPositioner.tsx similarity index 100% rename from packages/react/src/ImageToolbar/components/ImageToolbarPositioner.tsx rename to packages/react/src/components/ImageToolbar/ImageToolbarPositioner.tsx diff --git a/packages/react/src/SideMenu/components/DefaultButtons/AddBlockButton.tsx b/packages/react/src/components/SideMenu/DefaultButtons/AddBlockButton.tsx similarity index 87% rename from packages/react/src/SideMenu/components/DefaultButtons/AddBlockButton.tsx rename to packages/react/src/components/SideMenu/DefaultButtons/AddBlockButton.tsx index 0dadb3aac2..ea7fba393f 100644 --- a/packages/react/src/SideMenu/components/DefaultButtons/AddBlockButton.tsx +++ b/packages/react/src/components/SideMenu/DefaultButtons/AddBlockButton.tsx @@ -1,7 +1,7 @@ import { BlockSchema } from "@blocknote/core"; import { AiOutlinePlus } from "react-icons/ai"; import { SideMenuButton } from "../SideMenuButton"; -import { SideMenuProps } from "../SideMenuPositioner"; +import type { SideMenuProps } from "../SideMenuPositioner"; export const AddBlockButton = ( props: SideMenuProps diff --git a/packages/react/src/SideMenu/components/DefaultButtons/DragHandle.tsx b/packages/react/src/components/SideMenu/DefaultButtons/DragHandle.tsx similarity index 94% rename from packages/react/src/SideMenu/components/DefaultButtons/DragHandle.tsx rename to packages/react/src/components/SideMenu/DefaultButtons/DragHandle.tsx index 908b2a653c..7570405c33 100644 --- a/packages/react/src/SideMenu/components/DefaultButtons/DragHandle.tsx +++ b/packages/react/src/components/SideMenu/DefaultButtons/DragHandle.tsx @@ -3,7 +3,7 @@ import { Menu } from "@mantine/core"; import { MdDragIndicator } from "react-icons/md"; import { DefaultDragHandleMenu } from "../DragHandleMenu/DefaultDragHandleMenu"; import { SideMenuButton } from "../SideMenuButton"; -import { SideMenuProps } from "../SideMenuPositioner"; +import type { SideMenuProps } from "../SideMenuPositioner"; export const DragHandle = ( props: SideMenuProps diff --git a/packages/react/src/SideMenu/components/DefaultSideMenu.tsx b/packages/react/src/components/SideMenu/DefaultSideMenu.tsx similarity index 90% rename from packages/react/src/SideMenu/components/DefaultSideMenu.tsx rename to packages/react/src/components/SideMenu/DefaultSideMenu.tsx index 1ae3fcb99e..9bdf66991e 100644 --- a/packages/react/src/SideMenu/components/DefaultSideMenu.tsx +++ b/packages/react/src/components/SideMenu/DefaultSideMenu.tsx @@ -4,7 +4,7 @@ import { StyleSchema } from "@blocknote/core"; import { AddBlockButton } from "./DefaultButtons/AddBlockButton"; import { DragHandle } from "./DefaultButtons/DragHandle"; import { SideMenu } from "./SideMenu"; -import { SideMenuProps } from "./SideMenuPositioner"; +import type { SideMenuProps } from "./SideMenuPositioner"; export const DefaultSideMenu = < BSchema extends BlockSchema, diff --git a/packages/react/src/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx b/packages/react/src/components/SideMenu/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx similarity index 95% rename from packages/react/src/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx rename to packages/react/src/components/SideMenu/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx index e198ebf46e..7800df7b97 100644 --- a/packages/react/src/SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx +++ b/packages/react/src/components/SideMenu/DragHandleMenu/DefaultButtons/BlockColorsButton.tsx @@ -3,9 +3,9 @@ import { Box, Menu } from "@mantine/core"; import { ReactNode, useCallback, useRef, useState } from "react"; import { HiChevronRight } from "react-icons/hi"; -import { ColorPicker } from "../../../../SharedComponents/ColorPicker/components/ColorPicker"; import { usePreventMenuOverflow } from "../../../../hooks/usePreventMenuOverflow"; -import { DragHandleMenuProps } from "../DragHandleMenu"; +import { ColorPicker } from "../../../../components-shared/ColorPicker/ColorPicker"; +import type { DragHandleMenuProps } from "../DragHandleMenu"; import { DragHandleMenuItem } from "../DragHandleMenuItem"; export const BlockColorsButton = ( diff --git a/packages/react/src/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx b/packages/react/src/components/SideMenu/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx similarity index 87% rename from packages/react/src/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx rename to packages/react/src/components/SideMenu/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx index 1b05fff510..1be12bd629 100644 --- a/packages/react/src/SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx +++ b/packages/react/src/components/SideMenu/DragHandleMenu/DefaultButtons/RemoveBlockButton.tsx @@ -1,7 +1,7 @@ import { BlockSchema } from "@blocknote/core"; import { ReactNode } from "react"; -import { DragHandleMenuProps } from "../DragHandleMenu"; +import type { DragHandleMenuProps } from "../DragHandleMenu"; import { DragHandleMenuItem } from "../DragHandleMenuItem"; export const RemoveBlockButton = ( diff --git a/packages/react/src/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx b/packages/react/src/components/SideMenu/DragHandleMenu/DefaultDragHandleMenu.tsx similarity index 100% rename from packages/react/src/SideMenu/components/DragHandleMenu/DefaultDragHandleMenu.tsx rename to packages/react/src/components/SideMenu/DragHandleMenu/DefaultDragHandleMenu.tsx diff --git a/packages/react/src/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx b/packages/react/src/components/SideMenu/DragHandleMenu/DragHandleMenu.tsx similarity index 100% rename from packages/react/src/SideMenu/components/DragHandleMenu/DragHandleMenu.tsx rename to packages/react/src/components/SideMenu/DragHandleMenu/DragHandleMenu.tsx diff --git a/packages/react/src/SideMenu/components/DragHandleMenu/DragHandleMenuItem.tsx b/packages/react/src/components/SideMenu/DragHandleMenu/DragHandleMenuItem.tsx similarity index 100% rename from packages/react/src/SideMenu/components/DragHandleMenu/DragHandleMenuItem.tsx rename to packages/react/src/components/SideMenu/DragHandleMenu/DragHandleMenuItem.tsx diff --git a/packages/react/src/SideMenu/components/SideMenu.tsx b/packages/react/src/components/SideMenu/SideMenu.tsx similarity index 100% rename from packages/react/src/SideMenu/components/SideMenu.tsx rename to packages/react/src/components/SideMenu/SideMenu.tsx diff --git a/packages/react/src/SideMenu/components/SideMenuButton.tsx b/packages/react/src/components/SideMenu/SideMenuButton.tsx similarity index 100% rename from packages/react/src/SideMenu/components/SideMenuButton.tsx rename to packages/react/src/components/SideMenu/SideMenuButton.tsx diff --git a/packages/react/src/SideMenu/components/SideMenuPositioner.tsx b/packages/react/src/components/SideMenu/SideMenuPositioner.tsx similarity index 100% rename from packages/react/src/SideMenu/components/SideMenuPositioner.tsx rename to packages/react/src/components/SideMenu/SideMenuPositioner.tsx diff --git a/packages/react/src/SlashMenu/components/DefaultSlashMenu.tsx b/packages/react/src/components/SlashMenu/DefaultSlashMenu.tsx similarity index 96% rename from packages/react/src/SlashMenu/components/DefaultSlashMenu.tsx rename to packages/react/src/components/SlashMenu/DefaultSlashMenu.tsx index 7c890768b2..15f154e421 100644 --- a/packages/react/src/SlashMenu/components/DefaultSlashMenu.tsx +++ b/packages/react/src/components/SlashMenu/DefaultSlashMenu.tsx @@ -4,7 +4,7 @@ import groupBy from "lodash.groupby"; import { BlockSchema } from "@blocknote/core"; import { SlashMenuItem } from "./SlashMenuItem"; -import { SlashMenuProps } from "./SlashMenuPositioner"; +import type { SlashMenuProps } from "./SlashMenuPositioner"; export function DefaultSlashMenu( props: SlashMenuProps diff --git a/packages/react/src/SlashMenu/components/SlashMenuItem.tsx b/packages/react/src/components/SlashMenu/SlashMenuItem.tsx similarity index 100% rename from packages/react/src/SlashMenu/components/SlashMenuItem.tsx rename to packages/react/src/components/SlashMenu/SlashMenuItem.tsx diff --git a/packages/react/src/SlashMenu/components/SlashMenuPositioner.tsx b/packages/react/src/components/SlashMenu/SlashMenuPositioner.tsx similarity index 97% rename from packages/react/src/SlashMenu/components/SlashMenuPositioner.tsx rename to packages/react/src/components/SlashMenu/SlashMenuPositioner.tsx index 6c084ad245..fa3a5247a0 100644 --- a/packages/react/src/SlashMenu/components/SlashMenuPositioner.tsx +++ b/packages/react/src/components/SlashMenu/SlashMenuPositioner.tsx @@ -9,7 +9,7 @@ import Tippy from "@tippyjs/react"; import { FC, useEffect, useMemo, useRef, useState } from "react"; import { usePreventMenuOverflow } from "../../hooks/usePreventMenuOverflow"; -import { ReactSlashMenuItem } from "../ReactSlashMenuItem"; +import { ReactSlashMenuItem } from "../../slashMenuItems/ReactSlashMenuItem"; import { DefaultSlashMenu } from "./DefaultSlashMenu"; export type SlashMenuProps = diff --git a/packages/react/src/TableHandles/components/DefaultTableHandle.tsx b/packages/react/src/components/TableHandles/DefaultTableHandle.tsx similarity index 90% rename from packages/react/src/TableHandles/components/DefaultTableHandle.tsx rename to packages/react/src/components/TableHandles/DefaultTableHandle.tsx index e7e98d4f1b..ead2db25dd 100644 --- a/packages/react/src/TableHandles/components/DefaultTableHandle.tsx +++ b/packages/react/src/components/TableHandles/DefaultTableHandle.tsx @@ -1,7 +1,7 @@ import { BlockSchemaWithBlock, DefaultBlockSchema } from "@blocknote/core"; import { MdDragIndicator } from "react-icons/md"; import { TableHandle } from "./TableHandle"; -import { TableHandleProps } from "./TableHandlePositioner"; +import type { TableHandleProps } from "./TableHandlePositioner"; export const DefaultTableHandle = < BSchema extends BlockSchemaWithBlock<"table", DefaultBlockSchema["table"]> diff --git a/packages/react/src/TableHandles/components/TableHandle.tsx b/packages/react/src/components/TableHandles/TableHandle.tsx similarity index 96% rename from packages/react/src/TableHandles/components/TableHandle.tsx rename to packages/react/src/components/TableHandles/TableHandle.tsx index aca6b9fbe5..8b0213adbc 100644 --- a/packages/react/src/TableHandles/components/TableHandle.tsx +++ b/packages/react/src/components/TableHandles/TableHandle.tsx @@ -2,7 +2,7 @@ import { BlockSchemaWithBlock, DefaultBlockSchema } from "@blocknote/core"; import { Menu, createStyles } from "@mantine/core"; import { ReactNode, useState } from "react"; import { DefaultTableHandleMenu } from "./TableHandleMenu/DefaultTableHandleMenu"; -import { TableHandleProps } from "./TableHandlePositioner"; +import type { TableHandleProps } from "./TableHandlePositioner"; export const TableHandle = < BSchema extends BlockSchemaWithBlock<"table", DefaultBlockSchema["table"]> diff --git a/packages/react/src/TableHandles/components/TableHandleMenu/DefaultButtons/AddButton.tsx b/packages/react/src/components/TableHandles/TableHandleMenu/DefaultButtons/AddButton.tsx similarity index 100% rename from packages/react/src/TableHandles/components/TableHandleMenu/DefaultButtons/AddButton.tsx rename to packages/react/src/components/TableHandles/TableHandleMenu/DefaultButtons/AddButton.tsx diff --git a/packages/react/src/TableHandles/components/TableHandleMenu/DefaultButtons/DeleteButton.tsx b/packages/react/src/components/TableHandles/TableHandleMenu/DefaultButtons/DeleteButton.tsx similarity index 100% rename from packages/react/src/TableHandles/components/TableHandleMenu/DefaultButtons/DeleteButton.tsx rename to packages/react/src/components/TableHandles/TableHandleMenu/DefaultButtons/DeleteButton.tsx diff --git a/packages/react/src/TableHandles/components/TableHandleMenu/DefaultTableHandleMenu.tsx b/packages/react/src/components/TableHandles/TableHandleMenu/DefaultTableHandleMenu.tsx similarity index 100% rename from packages/react/src/TableHandles/components/TableHandleMenu/DefaultTableHandleMenu.tsx rename to packages/react/src/components/TableHandles/TableHandleMenu/DefaultTableHandleMenu.tsx diff --git a/packages/react/src/TableHandles/components/TableHandleMenu/TableHandleMenu.tsx b/packages/react/src/components/TableHandles/TableHandleMenu/TableHandleMenu.tsx similarity index 100% rename from packages/react/src/TableHandles/components/TableHandleMenu/TableHandleMenu.tsx rename to packages/react/src/components/TableHandles/TableHandleMenu/TableHandleMenu.tsx diff --git a/packages/react/src/TableHandles/components/TableHandleMenu/TableHandleMenuItem.tsx b/packages/react/src/components/TableHandles/TableHandleMenu/TableHandleMenuItem.tsx similarity index 100% rename from packages/react/src/TableHandles/components/TableHandleMenu/TableHandleMenuItem.tsx rename to packages/react/src/components/TableHandles/TableHandleMenu/TableHandleMenuItem.tsx diff --git a/packages/react/src/TableHandles/components/TableHandlePositioner.tsx b/packages/react/src/components/TableHandles/TableHandlePositioner.tsx similarity index 98% rename from packages/react/src/TableHandles/components/TableHandlePositioner.tsx rename to packages/react/src/components/TableHandles/TableHandlePositioner.tsx index 95e2ea70e4..fd2ac9b7e0 100644 --- a/packages/react/src/TableHandles/components/TableHandlePositioner.tsx +++ b/packages/react/src/components/TableHandles/TableHandlePositioner.tsx @@ -10,7 +10,7 @@ import { } from "@blocknote/core"; import Tippy, { tippy } from "@tippyjs/react"; import { DragEvent, FC, useEffect, useMemo, useRef, useState } from "react"; -import { DragHandleMenuProps } from "../../SideMenu/components/DragHandleMenu/DragHandleMenu"; +import { DragHandleMenuProps } from "../SideMenu/DragHandleMenu/DragHandleMenu"; import { DefaultTableHandle } from "./DefaultTableHandle"; export type TableHandleProps< diff --git a/packages/react/src/BlockNoteTheme.ts b/packages/react/src/editor/BlockNoteTheme.ts similarity index 100% rename from packages/react/src/BlockNoteTheme.ts rename to packages/react/src/editor/BlockNoteTheme.ts diff --git a/packages/react/src/BlockNoteView.tsx b/packages/react/src/editor/BlockNoteView.tsx similarity index 83% rename from packages/react/src/BlockNoteView.tsx rename to packages/react/src/editor/BlockNoteView.tsx index c65cbc9b26..30606ae4ac 100644 --- a/packages/react/src/BlockNoteView.tsx +++ b/packages/react/src/editor/BlockNoteView.tsx @@ -10,12 +10,12 @@ import { EditorContent } from "@tiptap/react"; import { HTMLAttributes, ReactNode, useMemo } from "react"; import usePrefersColorScheme from "use-prefers-color-scheme"; import { Theme, blockNoteToMantineTheme } from "./BlockNoteTheme"; -import { FormattingToolbarPositioner } from "./FormattingToolbar/components/FormattingToolbarPositioner"; -import { HyperlinkToolbarPositioner } from "./HyperlinkToolbar/components/HyperlinkToolbarPositioner"; -import { ImageToolbarPositioner } from "./ImageToolbar/components/ImageToolbarPositioner"; -import { SideMenuPositioner } from "./SideMenu/components/SideMenuPositioner"; -import { SlashMenuPositioner } from "./SlashMenu/components/SlashMenuPositioner"; -import { TableHandlesPositioner } from "./TableHandles/components/TableHandlePositioner"; +import { FormattingToolbarPositioner } from "../components/FormattingToolbar/FormattingToolbarPositioner"; +import { HyperlinkToolbarPositioner } from "../components/HyperlinkToolbar/HyperlinkToolbarPositioner"; +import { ImageToolbarPositioner } from "../components/ImageToolbar/ImageToolbarPositioner"; +import { SideMenuPositioner } from "../components/SideMenu/SideMenuPositioner"; +import { SlashMenuPositioner } from "../components/SlashMenu/SlashMenuPositioner"; +import { TableHandlesPositioner } from "../components/TableHandles/TableHandlePositioner"; import { darkDefaultTheme, lightDefaultTheme } from "./defaultThemes"; // Renders the editor as well as all menus & toolbars using default styles. diff --git a/packages/react/src/Editor/EditorContent.tsx b/packages/react/src/editor/EditorContent.tsx similarity index 100% rename from packages/react/src/Editor/EditorContent.tsx rename to packages/react/src/editor/EditorContent.tsx diff --git a/packages/react/src/defaultThemes.ts b/packages/react/src/editor/defaultThemes.ts similarity index 98% rename from packages/react/src/defaultThemes.ts rename to packages/react/src/editor/defaultThemes.ts index 1a08ac5ed5..919b33586e 100644 --- a/packages/react/src/defaultThemes.ts +++ b/packages/react/src/editor/defaultThemes.ts @@ -1,4 +1,4 @@ -import { Theme } from "./index"; +import { Theme } from "./BlockNoteTheme"; export const defaultColorScheme = [ "#FFFFFF", diff --git a/packages/react/src/hooks/useBlockNote.ts b/packages/react/src/hooks/useBlockNote.ts index 6d467987fc..2cf1f213e8 100644 --- a/packages/react/src/hooks/useBlockNote.ts +++ b/packages/react/src/hooks/useBlockNote.ts @@ -13,7 +13,7 @@ import { getBlockSchemaFromSpecs, } from "@blocknote/core"; import { DependencyList, useMemo, useRef } from "react"; -import { getDefaultReactSlashMenuItems } from "../SlashMenu/defaultReactSlashMenuItems"; +import { getDefaultReactSlashMenuItems } from "../slashMenuItems/defaultReactSlashMenuItems"; const initEditor = < BSpecs extends BlockSpecs, diff --git a/packages/react/src/hooks/useEditorChange.ts b/packages/react/src/hooks/useEditorChange.ts index 207c8fcd83..517f980205 100644 --- a/packages/react/src/hooks/useEditorChange.ts +++ b/packages/react/src/hooks/useEditorChange.ts @@ -1,4 +1,4 @@ -import { BlockNoteEditor } from "@blocknote/core"; +import type { BlockNoteEditor } from "@blocknote/core"; import { useEditorContentChange } from "./useEditorContentChange"; import { useEditorSelectionChange } from "./useEditorSelectionChange"; diff --git a/packages/react/src/hooks/useEditorContentChange.ts b/packages/react/src/hooks/useEditorContentChange.ts index ab98072142..2922258a60 100644 --- a/packages/react/src/hooks/useEditorContentChange.ts +++ b/packages/react/src/hooks/useEditorContentChange.ts @@ -1,4 +1,4 @@ -import { BlockNoteEditor } from "@blocknote/core"; +import type { BlockNoteEditor } from "@blocknote/core"; import { useEffect } from "react"; export function useEditorContentChange( diff --git a/packages/react/src/hooks/useEditorSelectionChange.ts b/packages/react/src/hooks/useEditorSelectionChange.ts index 000f12b060..dab5c227cf 100644 --- a/packages/react/src/hooks/useEditorSelectionChange.ts +++ b/packages/react/src/hooks/useEditorSelectionChange.ts @@ -1,4 +1,4 @@ -import { BlockNoteEditor } from "@blocknote/core"; +import type { BlockNoteEditor } from "@blocknote/core"; import { useEffect } from "react"; export function useEditorSelectionChange( diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 2748d2cd74..cce489d53c 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,44 +1,44 @@ // TODO: review directories -export * from "./BlockNoteTheme"; -export * from "./BlockNoteView"; -export * from "./defaultThemes"; - -export * from "./FormattingToolbar/components/DefaultButtons/ColorStyleButton"; -export * from "./FormattingToolbar/components/DefaultButtons/CreateLinkButton"; -export * from "./FormattingToolbar/components/DefaultButtons/NestBlockButtons"; -export * from "./FormattingToolbar/components/DefaultButtons/TextAlignButton"; -export * from "./FormattingToolbar/components/DefaultButtons/ToggledStyleButton"; -export * from "./FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown"; -export * from "./FormattingToolbar/components/DefaultFormattingToolbar"; -export * from "./FormattingToolbar/components/FormattingToolbarPositioner"; - -export * from "./HyperlinkToolbar/components/HyperlinkToolbarPositioner"; - -export * from "./SideMenu/components/DefaultButtons/AddBlockButton"; -export * from "./SideMenu/components/DefaultButtons/DragHandle"; -export * from "./SideMenu/components/DefaultSideMenu"; -export * from "./SideMenu/components/SideMenu"; -export * from "./SideMenu/components/SideMenuButton"; -export * from "./SideMenu/components/SideMenuPositioner"; - -export * from "./SideMenu/components/DragHandleMenu/DefaultButtons/BlockColorsButton"; -export * from "./SideMenu/components/DragHandleMenu/DefaultButtons/RemoveBlockButton"; -export * from "./SideMenu/components/DragHandleMenu/DefaultDragHandleMenu"; -export * from "./SideMenu/components/DragHandleMenu/DragHandleMenu"; -export * from "./SideMenu/components/DragHandleMenu/DragHandleMenuItem"; - -export * from "./SlashMenu/ReactSlashMenuItem"; -export * from "./SlashMenu/components/DefaultSlashMenu"; -export * from "./SlashMenu/components/SlashMenuItem"; -export * from "./SlashMenu/components/SlashMenuPositioner"; -export * from "./SlashMenu/defaultReactSlashMenuItems"; - -export * from "./ImageToolbar/components/DefaultImageToolbar"; -export * from "./ImageToolbar/components/ImageToolbarPositioner"; - -export * from "./SharedComponents/Toolbar/components/Toolbar"; -export * from "./SharedComponents/Toolbar/components/ToolbarButton"; -export * from "./SharedComponents/Toolbar/components/ToolbarDropdown"; +export * from "./editor/BlockNoteTheme"; +export * from "./editor/BlockNoteView"; +export * from "./editor/defaultThemes"; + +export * from "./components/FormattingToolbar/DefaultButtons/ColorStyleButton"; +export * from "./components/FormattingToolbar/DefaultButtons/CreateLinkButton"; +export * from "./components/FormattingToolbar/DefaultButtons/NestBlockButtons"; +export * from "./components/FormattingToolbar/DefaultButtons/TextAlignButton"; +export * from "./components/FormattingToolbar/DefaultButtons/ToggledStyleButton"; +export * from "./components/FormattingToolbar/DefaultDropdowns/BlockTypeDropdown"; +export * from "./components/FormattingToolbar/DefaultFormattingToolbar"; +export * from "./components/FormattingToolbar/FormattingToolbarPositioner"; + +export * from "./components/HyperlinkToolbar/HyperlinkToolbarPositioner"; + +export * from "./components/SideMenu/DefaultButtons/AddBlockButton"; +export * from "./components/SideMenu/DefaultButtons/DragHandle"; +export * from "./components/SideMenu/DefaultSideMenu"; +export * from "./components/SideMenu/SideMenu"; +export * from "./components/SideMenu/SideMenuButton"; +export * from "./components/SideMenu/SideMenuPositioner"; + +export * from "./components/SideMenu/DragHandleMenu/DefaultButtons/BlockColorsButton"; +export * from "./components/SideMenu/DragHandleMenu/DefaultButtons/RemoveBlockButton"; +export * from "./components/SideMenu/DragHandleMenu/DefaultDragHandleMenu"; +export * from "./components/SideMenu/DragHandleMenu/DragHandleMenu"; +export * from "./components/SideMenu/DragHandleMenu/DragHandleMenuItem"; + +export * from "./slashMenuItems/ReactSlashMenuItem"; +export * from "./components/SlashMenu/DefaultSlashMenu"; +export * from "./components/SlashMenu/SlashMenuItem"; +export * from "./components/SlashMenu/SlashMenuPositioner"; +export * from "./slashMenuItems/defaultReactSlashMenuItems"; + +export * from "./components/ImageToolbar/DefaultImageToolbar"; +export * from "./components/ImageToolbar/ImageToolbarPositioner"; + +export * from "./components-shared/Toolbar/Toolbar"; +export * from "./components-shared/Toolbar/ToolbarButton"; +export * from "./components-shared/Toolbar/ToolbarDropdown"; export * from "./hooks/useActiveStyles"; export * from "./hooks/useBlockNote"; @@ -48,6 +48,6 @@ export * from "./hooks/useEditorForceUpdate"; export * from "./hooks/useEditorSelectionChange"; export * from "./hooks/useSelectedBlocks"; -export * from "./ReactBlockSpec"; -export * from "./ReactInlineContentSpec"; -export * from "./ReactStyleSpec"; +export * from "./schema/ReactBlockSpec"; +export * from "./schema/ReactInlineContentSpec"; +export * from "./schema/ReactStyleSpec"; diff --git a/packages/react/src/ReactRenderUtil.ts b/packages/react/src/schema/@util/ReactRenderUtil.ts similarity index 100% rename from packages/react/src/ReactRenderUtil.ts rename to packages/react/src/schema/@util/ReactRenderUtil.ts diff --git a/packages/react/src/ReactBlockSpec.tsx b/packages/react/src/schema/ReactBlockSpec.tsx similarity index 99% rename from packages/react/src/ReactBlockSpec.tsx rename to packages/react/src/schema/ReactBlockSpec.tsx index 634c707eb7..77e7e398d1 100644 --- a/packages/react/src/ReactBlockSpec.tsx +++ b/packages/react/src/schema/ReactBlockSpec.tsx @@ -24,7 +24,7 @@ import { ReactNodeViewRenderer, } from "@tiptap/react"; import { FC } from "react"; -import { renderToDOMSpec } from "./ReactRenderUtil"; +import { renderToDOMSpec } from "./@util/ReactRenderUtil"; // this file is mostly analogoues to `customBlocks.ts`, but for React blocks diff --git a/packages/react/src/ReactInlineContentSpec.tsx b/packages/react/src/schema/ReactInlineContentSpec.tsx similarity index 98% rename from packages/react/src/ReactInlineContentSpec.tsx rename to packages/react/src/schema/ReactInlineContentSpec.tsx index e5a40056c4..f8f8318ed1 100644 --- a/packages/react/src/ReactInlineContentSpec.tsx +++ b/packages/react/src/schema/ReactInlineContentSpec.tsx @@ -22,7 +22,7 @@ import { } from "@tiptap/react"; // import { useReactNodeView } from "@tiptap/react/dist/packages/react/src/useReactNodeView"; import { FC } from "react"; -import { renderToDOMSpec } from "./ReactRenderUtil"; +import { renderToDOMSpec } from "./@util/ReactRenderUtil"; // this file is mostly analogoues to `customBlocks.ts`, but for React blocks diff --git a/packages/react/src/ReactStyleSpec.tsx b/packages/react/src/schema/ReactStyleSpec.tsx similarity index 96% rename from packages/react/src/ReactStyleSpec.tsx rename to packages/react/src/schema/ReactStyleSpec.tsx index 5711c6c561..63f3242a06 100644 --- a/packages/react/src/ReactStyleSpec.tsx +++ b/packages/react/src/schema/ReactStyleSpec.tsx @@ -7,7 +7,7 @@ import { } from "@blocknote/core"; import { Mark } from "@tiptap/react"; import { FC } from "react"; -import { renderToDOMSpec } from "./ReactRenderUtil"; +import { renderToDOMSpec } from "./@util/ReactRenderUtil"; // this file is mostly analogoues to `customBlocks.ts`, but for React blocks diff --git a/packages/react/src/SlashMenu/ReactSlashMenuItem.ts b/packages/react/src/slashMenuItems/ReactSlashMenuItem.ts similarity index 100% rename from packages/react/src/SlashMenu/ReactSlashMenuItem.ts rename to packages/react/src/slashMenuItems/ReactSlashMenuItem.ts diff --git a/packages/react/src/SlashMenu/defaultReactSlashMenuItems.tsx b/packages/react/src/slashMenuItems/defaultReactSlashMenuItems.tsx similarity index 97% rename from packages/react/src/SlashMenu/defaultReactSlashMenuItems.tsx rename to packages/react/src/slashMenuItems/defaultReactSlashMenuItems.tsx index 66411dda62..d252b8b605 100644 --- a/packages/react/src/SlashMenu/defaultReactSlashMenuItems.tsx +++ b/packages/react/src/slashMenuItems/defaultReactSlashMenuItems.tsx @@ -17,7 +17,7 @@ import { RiTable2, RiText, } from "react-icons/ri"; -import { formatKeyboardShortcut } from "../utils"; +import { formatKeyboardShortcut } from "@blocknote/core"; import { ReactSlashMenuItem } from "./ReactSlashMenuItem"; const extraFields: Record< diff --git a/packages/react/src/test/testCases/customReactBlocks.tsx b/packages/react/src/test/testCases/customReactBlocks.tsx index 8dd528f74d..c93beab64d 100644 --- a/packages/react/src/test/testCases/customReactBlocks.tsx +++ b/packages/react/src/test/testCases/customReactBlocks.tsx @@ -9,7 +9,7 @@ import { defaultProps, uploadToTmpFilesDotOrg_DEV_ONLY, } from "@blocknote/core"; -import { createReactBlockSpec } from "../../ReactBlockSpec"; +import { createReactBlockSpec } from "../../schema/ReactBlockSpec"; const ReactCustomParagraph = createReactBlockSpec( { diff --git a/packages/react/src/test/testCases/customReactInlineContent.tsx b/packages/react/src/test/testCases/customReactInlineContent.tsx index f9a90dff65..f211c45236 100644 --- a/packages/react/src/test/testCases/customReactInlineContent.tsx +++ b/packages/react/src/test/testCases/customReactInlineContent.tsx @@ -8,7 +8,7 @@ import { defaultInlineContentSpecs, uploadToTmpFilesDotOrg_DEV_ONLY, } from "@blocknote/core"; -import { createReactInlineContentSpec } from "../../ReactInlineContentSpec"; +import { createReactInlineContentSpec } from "../../schema/ReactInlineContentSpec"; const mention = createReactInlineContentSpec( { diff --git a/packages/react/src/test/testCases/customReactStyles.tsx b/packages/react/src/test/testCases/customReactStyles.tsx index ea7126d6ce..0992b791a4 100644 --- a/packages/react/src/test/testCases/customReactStyles.tsx +++ b/packages/react/src/test/testCases/customReactStyles.tsx @@ -8,7 +8,7 @@ import { defaultStyleSpecs, uploadToTmpFilesDotOrg_DEV_ONLY, } from "@blocknote/core"; -import { createReactStyleSpec } from "../../ReactStyleSpec"; +import { createReactStyleSpec } from "../../schema/ReactStyleSpec"; const small = createReactStyleSpec( { diff --git a/packages/react/src/utils.ts b/packages/react/src/utils.ts deleted file mode 100644 index e1f633eb61..0000000000 --- a/packages/react/src/utils.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const isAppleOS = () => - typeof navigator !== "undefined" && - (/Mac/.test(navigator.platform) || - (/AppleWebKit/.test(navigator.userAgent) && - /Mobile\/\w+/.test(navigator.userAgent))); - -export function formatKeyboardShortcut(shortcut: string) { - if (isAppleOS()) { - return shortcut.replace("Mod", "⌘"); - } else { - return shortcut.replace("Mod", "Ctrl"); - } -}