diff --git a/README.md b/README.md index 76c46a918..ade701b59 100644 --- a/README.md +++ b/README.md @@ -53,16 +53,16 @@ All of this is customizable, extensible, and easy to set up! - [**@yoopta/paragraph**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/paragraph/README.md) - [**@yoopta/accordion**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/accordion/README.md) - - **@yoopta/blockquote** - - **@yoopta/code** - - **@yoopta/embed** - - **@yoopta/image** - - **@yoopta/link** - - **@yoopta/file** - - **@yoopta/callout** - - **@yoopta/video** + - [**@yoopta/blockquote**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/blockquote/README.md) + - [**@yoopta/code**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/code/README.md) + - [**@yoopta/embed**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/embed/README.md) + - [**@yoopta/image**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/image/README.md) + - [**@yoopta/link**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/link/README.md) + - [**@yoopta/file**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/file/README.md) + - [**@yoopta/callout**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/callout/README.md) + - [**@yoopta/video**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/video/README.md) - [**@yoopta/lists**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/lists/README.md) - - **@yoopta/headings** + - [**@yoopta/headings**](https://github.com/Darginec05/Yoopta-Editor/blob/master/packages/plugins/headings/README.md) - Tools @@ -288,16 +288,16 @@ Find below useful examples of utilising the Yoopta-Editor in your projects. Thes Okay, let's go! -- [With basic example](https://yoopta-editor.vercel.app/examples/withBaseFullSetup) -- [With custom toolbar (Notion and Medium example)](https://yoopta-editor.vercel.app/examples/withCustomToolbar) -- [With Notion Action Menu](https://yoopta-editor.vercel.app/examples/withNotionActionMenu) -- [With dark theme](https://yoopta-editor.vercel.app/examples/withDarkTheme) -- [With media plugins](https://yoopta-editor.vercel.app/examples/withMedia) -- [With extended plugins](https://yoopta-editor.vercel.app/examples/withExtendedPlugin) -- [With readonly](https://yoopta-editor.vercel.app/examples/withReadOnly) -- [With custom HTML attributes](https://yoopta-editor.vercel.app/examples/withCustomHTMLAttributes) -- [With custom mark](https://yoopta-editor.vercel.app/examples/withCustomMark) -- [With chat slack](https://yoopta-editor.vercel.app/examples/withChatSlack) +- [With basic example](https://yoopta.dev/examples/withBaseFullSetup) +- [With custom toolbar (Notion and Medium example)](https://yoopta.dev/examples/withCustomToolbar) +- [With Notion Action Menu](https://yoopta.dev/examples/withNotionActionMenu) +- [With dark theme](https://yoopta.dev/examples/withDarkTheme) +- [With media plugins](https://yoopta.dev/examples/withMedia) +- [With extended plugins](https://yoopta.dev/examples/withExtendedPlugin) +- [With readonly](https://yoopta.dev/examples/withReadOnly) +- [With custom HTML attributes](https://yoopta.dev/examples/withCustomHTMLAttributes) +- [With custom mark](https://yoopta.dev/examples/withCustomMark) +- [With chat slack](https://yoopta.dev/examples/withChatSlack) - ...and check other examples in the sidebar list ## Give us ⭐️ star diff --git a/packages/core/editor/README.md b/packages/core/editor/README.md index 84a083be2..58d56ffe2 100644 --- a/packages/core/editor/README.md +++ b/packages/core/editor/README.md @@ -73,185 +73,57 @@ type Props = { }; ``` -### API from editor instance +### Editor API ```tsx -type YooEditor = { - /** - * Unique identifier for the editor instance. - */ +export type YooEditor = { id: string; - - /** - * Inserts a single block of data into the editor. - */ + readOnly: boolean; insertBlock: (data: YooptaBlockData, options?: YooptaEditorTransformOptions) => void; - - /** - * Inserts multiple blocks of data into the editor at once. - */ insertBlocks: (blocks: YooptaBlockData[], options?: YooptaEditorTransformOptions) => void; - - /** - * Splits the current block at the cursor's position. - */ splitBlock: (options?: YooptaEditorTransformOptions) => void; - - /** - * Updates a block with new data based on its id. - */ updateBlock: (id: string, data: Partial) => void; - - /** - * Deletes block from the editor children. - */ deleteBlock: (options?: DeleteBlockOptions) => void; - - /** - * Deletes blocks from paths or blockIds - * - */ deleteBlocks: (options?: DeleteBlocksOptions) => void; - - /** - * Duplicates a block within the editor. - */ duplicateBlock: (options?: DuplicateBlockOptions) => void; - - /** - * Retrieves a block's data based on provided options. - */ - getBlock: (options?: YooptaEditorTransformOptions) => void; - - /** - * Toggles a block's type in the editor. - */ - toggleBlock: (toBlockType?: string, options?: ToggleBlockOptions) => void; - - /** - * Increases the depth of a block, typically used for nested structures like lists. - */ + toggleBlock: (toBlockType: string, options?: ToggleBlockOptions) => void; increaseBlockDepth: (options?: YooptaEditorTransformOptions) => void; - - /** - * Decreases the depth of a block. - */ decreaseBlockDepth: (options?: YooptaEditorTransformOptions) => void; - - /** - * Applies any staged changes to the editor. - */ applyChanges: () => void; - - /** - * Moves a block to a different position within the editor. - */ moveBlock: (blockId: string, to: YooptaBlockPath) => void; - - /** - * Focuses on a block based on its id. - */ focusBlock: (id: string, options?: FocusBlockOptions) => void; - - /** - * Current selection path in the editor. - */ + getBlock: (options: GetBlockOptions) => YooptaBlockData | null; selection: YooptaBlockPath | null; - - /** - * Array of currently selected block indices. - */ selectedBlocks: number[] | null; - - /** - * Holds the structured data representing the editor's content. - */ children: Record; - - /** - * Retrieves the entire editor's value. - */ getEditorValue: () => TNodes; - - /** - * Sets the editor's content. - */ setEditorValue: (value: YooptaContentValue) => void; - - /** - * Sets the selection path in the editor. - */ setSelection: (path: YooptaBlockPath | null, options?: SetSelectionOptions) => void; - - /** - * Sets or clears the selection for a block. - */ setBlockSelected: (path: number[] | null, options?: BlockSelectedOptions) => void; - - /** - * Map of individual block editors. - */ blockEditorsMap: YooptaPluginsEditorMap; - - /** - * Definitions of all blocks in the editor. - */ blocks: YooptaBlocks; - - /** - * Formatting options available in the editor. - */ formats: YooptaFormats; - - /** - * Keyboard shortcuts configured for the editor. - */ shortcuts: Record; - - /** - * Registered plugins. - */ plugins: Record>; - /** - * Subscribes to an event. - */ + // events handlers on: (event: YooEditorEvents, fn: (payload: any) => void) => void; - - /** - * Subscribes once to an event. - */ once: (event: YooEditorEvents, fn: (payload: any) => void) => void; - - /** - * Unsubscribes from an event. - */ off: (event: YooEditorEvents, fn: (payload: any) => void) => void; - - /** - * Emits an event. - */ emit: (event: YooEditorEvents, payload: any) => void; - /** - * Indicates if the editor is read-only. - */ - readOnly: boolean; - - /** - * Returns whether the editor is focused. - */ + // focus handlers isFocused: () => boolean; - - /** - * Blurs the editor, removing focus. - */ blur: (options?: EditorBlurOptions) => void; - - /** - * Focuses the editor. - */ focus: () => void; + + // parser handlers + getHTML: (content: YooptaContentValue) => string; + getMarkdown: (content: YooptaContentValue) => string; + getPlainText: (content: YooptaContentValue) => string; + + // ref to editor element + refElement: HTMLElement | null; }; ``` diff --git a/packages/core/editor/src/UI/Portal/Portal.tsx b/packages/core/editor/src/UI/Portal/Portal.tsx index 1f5e0c73f..b5a83096f 100644 --- a/packages/core/editor/src/UI/Portal/Portal.tsx +++ b/packages/core/editor/src/UI/Portal/Portal.tsx @@ -14,7 +14,10 @@ const Portal = (props: Props) => { useEffect(() => { setIsMounted(true); - const editorEl = document.querySelector(`[data-yoopta-editor-id="${editor.id}"]`) as HTMLElement; + const editorEl = editor.refElement; + + if (!editorEl) return; + const overlays = editorEl.querySelector('.yoopta-overlays'); if (!overlays) { rootEl.current = document.createElement('div'); @@ -32,7 +35,7 @@ const Portal = (props: Props) => { if (!isMounted) return null; return ( - + {props.children} ); diff --git a/packages/core/editor/src/components/Editor/Editor.tsx b/packages/core/editor/src/components/Editor/Editor.tsx index b885f3bd2..080fce96e 100644 --- a/packages/core/editor/src/components/Editor/Editor.tsx +++ b/packages/core/editor/src/components/Editor/Editor.tsx @@ -55,8 +55,7 @@ const Editor = ({ }: Props) => { const editor = useYooptaEditor(); const isReadOnly = useYooptaReadOnly(); - const yooptaEditorRef = useRef(null); - const selectionBox = useRectangeSelectionBox({ editor, yooptaEditorRef, root: selectionBoxRoot }); + const selectionBox = useRectangeSelectionBox({ editor, root: selectionBoxRoot }); let state = useRef(DEFAULT_STATE).current; @@ -73,11 +72,11 @@ const Editor = ({ }, [editor.selectedBlocks, isReadOnly]); const handleEmptyZoneClick = (e: React.MouseEvent) => { - const editorRef = yooptaEditorRef.current; - if (!editorRef) return; + const editorEl = editor.refElement; + if (!editorEl) return; - const { bottom } = editorRef.getBoundingClientRect(); - const paddingBottom = parseInt(getComputedStyle(editorRef).paddingBottom, 10); + const { bottom } = editorEl.getBoundingClientRect(); + const paddingBottom = parseInt(getComputedStyle(editorEl).paddingBottom, 10); const paddingBottomAreaTop = bottom - paddingBottom; const defaultBlock = buildBlockData({ id: generateId() }); @@ -151,7 +150,7 @@ const Editor = ({ }; const onBlur = (event: React.FocusEvent) => { - const isInsideEditor = yooptaEditorRef.current?.contains(event.relatedTarget as Node); + const isInsideEditor = editor.refElement?.contains(event.relatedTarget as Node); if (isInsideEditor || isReadOnly) return; resetSelectionState(); @@ -392,10 +391,9 @@ const Editor = ({ return (
(editor.refElement = ref)} className={className ? `yoopta-editor ${className}` : 'yoopta-editor'} style={editorStyles} - ref={yooptaEditorRef} onMouseDown={onMouseDown} onBlur={onBlur} > diff --git a/packages/core/editor/src/components/SelectionBox/SelectionBox.tsx b/packages/core/editor/src/components/SelectionBox/SelectionBox.tsx index b3e25d624..6f1097961 100644 --- a/packages/core/editor/src/components/SelectionBox/SelectionBox.tsx +++ b/packages/core/editor/src/components/SelectionBox/SelectionBox.tsx @@ -3,7 +3,6 @@ import { YooEditor } from '../../editor/types'; export type RectangeSelectionProps = { editor: YooEditor; - yooptaEditorRef: React.RefObject; root?: HTMLElement | React.MutableRefObject | false; }; diff --git a/packages/core/editor/src/components/SelectionBox/hooks.ts b/packages/core/editor/src/components/SelectionBox/hooks.ts index 25a8ebdde..e3d403b8e 100644 --- a/packages/core/editor/src/components/SelectionBox/hooks.ts +++ b/packages/core/editor/src/components/SelectionBox/hooks.ts @@ -1,10 +1,12 @@ import { useEffect, useState } from 'react'; +import { YooEditor } from '../../editor/types'; import { RectangeSelectionProps, RectangeSelectionState } from './SelectionBox'; -const findBlocksUnderSelection = (editorId, origin, coords) => { +const findBlocksUnderSelection = (editor: YooEditor, origin, coords) => { const blocksUnderSelection: number[] = []; + const blocks = editor.refElement?.querySelectorAll(`[data-yoopta-block]`); - const blocks = document.querySelectorAll(`[data-yoopta-editor-id="${editorId}"] [data-yoopta-block]`); + if (!blocks) return blocksUnderSelection; blocks.forEach((blockEl, i) => { if (!blockEl) return; @@ -36,11 +38,7 @@ type RectangeSelectionReturn = RectangeSelectionState & { // [TODO] - Fix selection when multiple editors // Maybe move to a separate npm package? -export const useRectangeSelectionBox = ({ - editor, - yooptaEditorRef, - root, -}: RectangeSelectionProps): RectangeSelectionReturn => { +export const useRectangeSelectionBox = ({ editor, root }: RectangeSelectionProps): RectangeSelectionReturn => { const [state, setState] = useState({ origin: [0, 0], coords: [0, 0], @@ -50,7 +48,7 @@ export const useRectangeSelectionBox = ({ const onMouseDown = (event) => { if (editor.readOnly || root === false) return; - const isInsideEditor = yooptaEditorRef.current?.contains(event.target as Node); + const isInsideEditor = editor.refElement?.contains(event.target as Node); if ( !isInsideEditor && @@ -86,7 +84,7 @@ export const useRectangeSelectionBox = ({ coords: [event.pageX, event.pageY - window.pageYOffset], })); - const blocksUnderSelection = findBlocksUnderSelection(editor.id, state.origin, [ + const blocksUnderSelection = findBlocksUnderSelection(editor, state.origin, [ event.pageX, event.pageY - window.pageYOffset, ]); @@ -119,7 +117,7 @@ export const useRectangeSelectionBox = ({ throw new Error('Root element should be a DOM element or a ref object. Please check the `selectionBoxRoot` prop'); } - if (yooptaEditorRef.current?.contains(elementMouseEl)) { + if (editor.refElement?.contains(elementMouseEl)) { throw new Error('Root element should not be a child of the editor. Please check the `selectionBoxRoot` prop'); } diff --git a/packages/core/editor/src/contexts/YooptaContext/YooptaContext.tsx b/packages/core/editor/src/contexts/YooptaContext/YooptaContext.tsx index c8467098b..33c8995bf 100644 --- a/packages/core/editor/src/contexts/YooptaContext/YooptaContext.tsx +++ b/packages/core/editor/src/contexts/YooptaContext/YooptaContext.tsx @@ -54,6 +54,8 @@ const DEFAULT_HANDLERS: YooptaEditorContext = { getHTML: () => '', getMarkdown: () => '', getPlainText: () => '', + + refElement: null, }, }; diff --git a/packages/core/editor/src/editor/index.tsx b/packages/core/editor/src/editor/index.tsx index 0ac56f60a..5c0ec4ae8 100644 --- a/packages/core/editor/src/editor/index.tsx +++ b/packages/core/editor/src/editor/index.tsx @@ -82,6 +82,8 @@ export const createYooptaEditor = (): YooEditor => { getHTML: (content: YooptaContentValue) => getHTML(editor, content), getMarkdown: (content: YooptaContentValue) => getMarkdown(editor, content), getPlainText: (content: YooptaContentValue) => getPlainText(editor, content), + + refElement: null, }; return editor; diff --git a/packages/core/editor/src/editor/types.ts b/packages/core/editor/src/editor/types.ts index 6a7df098f..aa81b0d30 100644 --- a/packages/core/editor/src/editor/types.ts +++ b/packages/core/editor/src/editor/types.ts @@ -73,6 +73,7 @@ export type YooEditorEvents = 'change' | 'focus' | 'blur' | 'block:copy'; // [TODO] - Fix generic and default types export type YooEditor = { id: string; + readOnly: boolean; insertBlock: (data: YooptaBlockData, options?: YooptaEditorTransformOptions) => void; insertBlocks: (blocks: YooptaBlockData[], options?: YooptaEditorTransformOptions) => void; splitBlock: (options?: YooptaEditorTransformOptions) => void; @@ -99,11 +100,12 @@ export type YooEditor = { formats: YooptaFormats; shortcuts: Record; plugins: Record>; + + // events handlers on: (event: YooEditorEvents, fn: (payload: any) => void) => void; once: (event: YooEditorEvents, fn: (payload: any) => void) => void; off: (event: YooEditorEvents, fn: (payload: any) => void) => void; emit: (event: YooEditorEvents, payload: any) => void; - readOnly: boolean; // focus handlers isFocused: () => boolean; @@ -114,6 +116,9 @@ export type YooEditor = { getHTML: (content: YooptaContentValue) => string; getMarkdown: (content: YooptaContentValue) => string; getPlainText: (content: YooptaContentValue) => string; + + // ref to editor element + refElement: HTMLElement | null; }; // types for slate values diff --git a/packages/core/starter-kit/README.md b/packages/core/starter-kit/README.md index 3b7384a39..884598227 100644 --- a/packages/core/starter-kit/README.md +++ b/packages/core/starter-kit/README.md @@ -16,18 +16,18 @@ import StarterKit from '@yoopta/starter-kit'; const Editor = () => { const [value, setValue] = useState(); - const selectionRef = useRef(null); + const selectionBoxRoot = useRef(null); return (
setValue(data)} style={{ width: 650 }} - selectionRef={selectionRef} + selectionBoxRoot={selectionBoxRoot} placeholder="Start typing here..." media={{ imageUpload: async (file) => { @@ -76,7 +76,7 @@ type StarterKitProps = { className?: string; placeholder?: string; style?: CSSProperties; - selectionRef?: React.RefObject | false; + selectionBoxRoot?: React.RefObject | false; media?: MediaUploadsFn; }; ``` diff --git a/packages/core/starter-kit/src/components/StarterKit/StarterKit.tsx b/packages/core/starter-kit/src/components/StarterKit/StarterKit.tsx index 7cb172f38..e3c9aa7e9 100644 --- a/packages/core/starter-kit/src/components/StarterKit/StarterKit.tsx +++ b/packages/core/starter-kit/src/components/StarterKit/StarterKit.tsx @@ -1,4 +1,4 @@ -import { CSSProperties, useEffect, useMemo, useRef } from 'react'; +import { CSSProperties, useEffect, useMemo } from 'react'; import YooptaEditor, { createYooptaEditor, YooptaContentValue } from '@yoopta/editor'; import { TOOLS } from '../../utilts/tools'; @@ -17,7 +17,7 @@ export type StarterKitProps = { className?: string; placeholder?: string; style?: CSSProperties; - selectionRef?: React.RefObject | false; + selectionBoxRoot?: React.RefObject | false; media?: MediaUploadsFn; }; @@ -37,7 +37,7 @@ function StarterKit({ className, placeholder, media, - selectionRef = false, + selectionBoxRoot = false, }: StarterKitProps) { const editor = useMemo(() => createYooptaEditor(), []); @@ -54,7 +54,7 @@ function StarterKit({ { const editor: YooEditor = useMemo(() => createYooptaEditor(), []); const selectionRef = useRef(null); const [readOnly, setReadOnly] = useState(false); - const [value, setValue] = useState(); + const [value, setValue] = useState(); return (
@@ -38,12 +38,13 @@ const BasicExample = () => { style={{ width: 750 }} value={value} /> - {/* - setValue(data)} style={{ width: 650 }} - selectionRef={selectionRef} + selectionBoxRoot={selectionRef} placeholder="Start typing here..." media={{ imageUpload: async (file: File) => { diff --git a/packages/plugins/code/src/ui/Select.tsx b/packages/plugins/code/src/ui/Select.tsx index 22ac22f65..f78601b47 100644 --- a/packages/plugins/code/src/ui/Select.tsx +++ b/packages/plugins/code/src/ui/Select.tsx @@ -23,7 +23,7 @@ const SelectContent = ({ children }) => { const editor = useYooptaEditor(); return ( - + { }; useEffect(() => { - const yooptaEditorRef = document.querySelector(`[data-yoopta-editor-id="${editor.id}"]`); updateActionMenuPosition(); const handleActionMenuKeyUp = (event: KeyboardEvent) => { const slate = findSlateBySelectionPath(editor, { at: editor.selection }); - const isInsideEditor = yooptaEditorRef?.contains(event.target as Node); + const isInsideEditor = editor.refElement?.contains(event.target as Node); if (!slate || !slate.selection || !isInsideEditor) return; @@ -236,7 +235,7 @@ const ActionMenuList = ({ items, render }: ActionMenuToolProps) => { const block = findPluginBlockBySelectionPath(editor, { at: editor.selection }); if (!block) return; - const slateEditorRef = yooptaEditorRef?.querySelector(`#yoopta-slate-editor-${block.id}`) as HTMLElement; + const slateEditorRef = editor.refElement?.querySelector(`#yoopta-slate-editor-${block.id}`) as HTMLElement; if (!slateEditorRef) return; slateEditorRef.addEventListener('keydown', handleActionMenuKeyDown); diff --git a/packages/tools/toolbar/src/components/Toolbar.tsx b/packages/tools/toolbar/src/components/Toolbar.tsx index e41fcba87..705f38ca9 100644 --- a/packages/tools/toolbar/src/components/Toolbar.tsx +++ b/packages/tools/toolbar/src/components/Toolbar.tsx @@ -36,7 +36,6 @@ const Toolbar = ({ render }: ToolbarToolProps) => { const text = domRange.toString().trim(); const pluginWithCustomEditor = document.querySelectorAll('[data-custom-editor]'); - const yooptaEditorEl = document.querySelector(`[data-yoopta-editor-id="${editor.id}"]`); const ancestor = domRange?.commonAncestorContainer; let isInsideCustomEditor = false; @@ -47,7 +46,7 @@ const Toolbar = ({ render }: ToolbarToolProps) => { } } - if (!yooptaEditorEl?.contains(ancestor) || isInsideCustomEditor) { + if (!editor.refElement?.contains(ancestor) || isInsideCustomEditor) { return setIsToolbarOpen(false); } diff --git a/web/next-example/src/components/ui/sheet.tsx b/web/next-example/src/components/ui/sheet.tsx index 898c7b837..3cc659580 100644 --- a/web/next-example/src/components/ui/sheet.tsx +++ b/web/next-example/src/components/ui/sheet.tsx @@ -145,10 +145,10 @@ const Sheet = ({ items, path, title, description }: SheetProps) => { {title || 'Yoopta examples'} {description || ( - Found issue? + Wanna more examples?
React.JSX.Element> = { withExports, withCustomRenders, withExtendedPlugin, - WithStarterKit, + withStarterKit, withDarkTheme, withMediaAndVoids, withReadOnly, @@ -142,7 +142,7 @@ const EXAMPLE_MAP: Record = { title: 'Custom Renders (next/image, next/link, etc.)', description: '', }, - WithStarterKit: { + withStarterKit: { title: 'Using Starter Kit with full setup', description: '', }, diff --git a/yarn.lock b/yarn.lock index 69969a673..509733662 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3798,167 +3798,6 @@ js-yaml "^3.10.0" tslib "^2.4.0" -"@yoopta/accordion@*", "@yoopta/accordion@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/accordion/-/accordion-4.6.4.tgz#7e822d15cd9fb035495a34fb6e69f26f546677c4" - integrity sha512-Ihm691wirRaD28IPTyrEl/WEv9kb5r3U/s4zaqMte87u0ugEeO26axs27GKu4mBtW3boBHYKzSenY35ihSQ5kg== - dependencies: - lucide-react "^0.378.0" - -"@yoopta/action-menu-list@*", "@yoopta/action-menu-list@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/action-menu-list/-/action-menu-list-4.6.4.tgz#b3d702a5f7016960cf24e31feb89a360840f6521" - integrity sha512-mAa34H5ld1o4s/CopZ3vRYlMyLPnwVRwkcahbpFyvKop01GQ1wiCBjiOz1scYKnLoX9oBPv0yR8C3Ux9Zdztaw== - dependencies: - "@floating-ui/react" "^0.26.9" - "@radix-ui/react-icons" "^1.3.0" - -"@yoopta/blockquote@*", "@yoopta/blockquote@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/blockquote/-/blockquote-4.6.4.tgz#05ba800592d72cb2ab497036f425ed3ae27cecea" - integrity sha512-PcYDyVDwSFyG5p2kKUUPWIi1c2uqVSSk7jd/Me3TrYCKMVrXVC0bYC/MTQAylZ6VI9I9HKwA45DZ4qy4KU5oGQ== - -"@yoopta/callout@*", "@yoopta/callout@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/callout/-/callout-4.6.4.tgz#9098ee62a0512b5967f52c394597310478a348e0" - integrity sha512-nsuJx6PX+TSHrKhn67WEEaE1sRhWchQP2WTBwzRDZwAvBWt6ZvFfDh3+gzsVO8+a7LHMwXIQv+bAo/13U5OAjQ== - -"@yoopta/code@*", "@yoopta/code@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/code/-/code-4.6.4.tgz#f1465940b4b4171f78bcbf4e3b5a338bae364050" - integrity sha512-Z/9LLHW3IZa44uBtw/QnysX2DT6eqdvYmiCgYoYs/Pj4rrXBnd/A+CIG44ixKoVMo7TRSiqjvhBl8hvBqRBrAw== - dependencies: - "@codemirror/lang-angular" "^0.1.3" - "@codemirror/lang-cpp" "^6.0.2" - "@codemirror/lang-css" "^6.2.1" - "@codemirror/lang-html" "^6.4.8" - "@codemirror/lang-java" "^6.0.1" - "@codemirror/lang-javascript" "^6.2.2" - "@codemirror/lang-json" "^6.0.1" - "@codemirror/lang-markdown" "^6.2.4" - "@codemirror/lang-php" "^6.0.1" - "@codemirror/lang-python" "^6.1.4" - "@codemirror/lang-rust" "^6.0.1" - "@codemirror/lang-sql" "^6.6.1" - "@codemirror/lang-vue" "^0.1.3" - "@codemirror/lang-xml" "^6.1.0" - "@codemirror/lang-yaml" "^6.0.0" - "@codemirror/theme-one-dark" "^6.1.2" - "@radix-ui/react-select" "^2.0.0" - "@uiw/codemirror-extensions-basic-setup" "^4.21.24" - "@uiw/codemirror-theme-basic" "^4.21.24" - "@uiw/codemirror-theme-copilot" "^4.21.24" - "@uiw/codemirror-theme-dracula" "^4.21.24" - "@uiw/codemirror-theme-github" "^4.21.24" - "@uiw/codemirror-theme-material" "^4.21.24" - "@uiw/codemirror-theme-monokai-dimmed" "^4.21.24" - "@uiw/codemirror-theme-okaidia" "^4.21.24" - "@uiw/codemirror-theme-sublime" "^4.21.24" - "@uiw/codemirror-theme-vscode" "^4.21.24" - "@uiw/react-codemirror" "^4.21.25" - codemirror "^6.0.1" - copy-to-clipboard "^3.3.3" - -"@yoopta/editor@*", "@yoopta/editor@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/editor/-/editor-4.6.4.tgz#9cf851f0ff32d9c56d53a722706680005b929502" - integrity sha512-66BgsCxTf533QEBJOpg2dO9pWnZMuYz6Z8+6xQWLsvkabhLH++RZFvib2aj+drtF3WQOjkvahuDw/FKchOUhAg== - dependencies: - "@dnd-kit/core" "^6.1.0" - "@dnd-kit/sortable" "^8.0.0" - "@floating-ui/react" "^0.26.9" - "@radix-ui/react-icons" "^1.3.0" - copy-to-clipboard "^3.3.3" - eventemitter3 "^5.0.1" - immer "^10.0.3" - is-hotkey "^0.2.0" - lodash.clonedeep "^4.5.0" - slate-history "^0.100.0" - -"@yoopta/embed@*", "@yoopta/embed@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/embed/-/embed-4.6.4.tgz#56f2c9eba4b5dceeec32d2bb9cb533cdd4918fc8" - integrity sha512-qgPD7MXz7OVMwdg7zeiA2o4tqBDLC1KuAsaS5ZJNrkt+vPg6abKL+Erz+tfCo+eEnVfnVlC9dHfFzsbdt9kXJw== - dependencies: - "@floating-ui/react" "^0.26.9" - "@radix-ui/react-icons" "^1.3.0" - re-resizable "^6.9.11" - -"@yoopta/exports@*", "@yoopta/exports@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/exports/-/exports-4.6.4.tgz#261a6b0f7b0d084669504460c72ef0e358869f73" - integrity sha512-9qPu7R3g+lPm46fN3dyPipLAHbk6+uVH8FOO5LNEsAG2eSAIzy7B96UYH135JJxE7P5PxoXDkBXtjK2QOHjUZg== - dependencies: - marked "^13.0.0" - -"@yoopta/file@*", "@yoopta/file@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/file/-/file-4.6.4.tgz#d43edf26552a5223d88f497db93cb93f68b0c5c2" - integrity sha512-QnQeVPBDQcskaIYKNAITblColiba4fMKNgoFd7d+Q1XrAfuegJvdcMNjjTLTUvB7Ob8vfm1FHcIDTEQwl0YDyg== - dependencies: - "@floating-ui/react" "^0.26.9" - "@radix-ui/react-icons" "^1.3.0" - -"@yoopta/headings@*", "@yoopta/headings@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/headings/-/headings-4.6.4.tgz#8c24b7fe7522479ab57eb4a8a5ce2f914d94d984" - integrity sha512-svd3N68Z+Krwjo9ZUYkCFM7l1QUO/PTwxWkBhjQ9Eqr5qDriCiA3SxagW/Qbm6VuucSY+WAhV3wP1fK6Kn76xA== - -"@yoopta/image@*", "@yoopta/image@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/image/-/image-4.6.4.tgz#8a986583a6936397055ed1820d39b957b3bf1075" - integrity sha512-//1m63th5NnSObrBhvQxh3vSbUAKwHcfywFfVcavFjfNgTLvIMY+qv3WthQI/0Aq3gZ0ZWm41QexiuQT3NnOWg== - dependencies: - "@floating-ui/react" "^0.26.9" - "@radix-ui/react-icons" "^1.3.0" - re-resizable "^6.9.11" - -"@yoopta/link-tool@*", "@yoopta/link-tool@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/link-tool/-/link-tool-4.6.4.tgz#3f867bcdfdc947188b53389b269cbe01ac5c9004" - integrity sha512-66Dm4RlceaHuh+cL1IKred5royFmUSaVP+keMtmfKxz96kPuqFZlYRF9WU2iXUAW0DMv+tXeK6oFzsrnXKG9ew== - -"@yoopta/link@*", "@yoopta/link@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/link/-/link-4.6.4.tgz#6a30dc5ae3c80a1a5980355233ef3309f6f60b46" - integrity sha512-NziIYDIAue7IoNsLdOo2ISrzfAltpKQwb6xRK8duQ3PKTQ0RhpkOeBt+MA480UXg2eDDgJmg+brprS95yaVmJg== - dependencies: - lucide-react "^0.379.0" - -"@yoopta/lists@*", "@yoopta/lists@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/lists/-/lists-4.6.4.tgz#1f9d08276fe84cf9d6d399b0247b754577bca0c4" - integrity sha512-jwEql3JdOHMRqOW+26bCTFC+tbSeU5lv0g3wR7w303E0j/7ZljG3vvapmQUBZqYME609e3X8MilNz9GSgzdJYg== - -"@yoopta/marks@*", "@yoopta/marks@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/marks/-/marks-4.6.4.tgz#b0443d4fb74e62f19086d90894996a49af315910" - integrity sha512-ycWhUsZXaEhGVeHVdy+G40HlRJHHA/UUFjt+cXhuo5Pp3pU2OHURDJyzYVtG/PoOt0R5U3MHqI8D4znw5/DimQ== - -"@yoopta/paragraph@*", "@yoopta/paragraph@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/paragraph/-/paragraph-4.6.4.tgz#00584880f2898bcc1541a4b2ccd126aec3a91d9f" - integrity sha512-7IBpWd6mRI5Frwkd5ptWiNGF/oUBqWjDyAoqh3893REAodEcXwMoxp9XzTqoftiOZVR+yyZxSNaHeoFpoJy44g== - -"@yoopta/toolbar@*", "@yoopta/toolbar@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/toolbar/-/toolbar-4.6.4.tgz#bc9ad9828424ce697bb5475dfc2e1b24bab7400f" - integrity sha512-3V+L1F/eCGM3wQy6f0Oul4MbmYrJhiTae9esmA85O9GqUVh/62OyKmQXYJ475GTEEXBfWvSJ/Zy+l9XXy/DLnw== - dependencies: - "@floating-ui/react" "^0.26.9" - "@radix-ui/react-icons" "^1.3.0" - "@radix-ui/react-toolbar" "^1.0.4" - lodash.throttle "^4.1.1" - -"@yoopta/video@*", "@yoopta/video@latest": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@yoopta/video/-/video-4.6.4.tgz#e5d205d95c4be31e99493ea063ef733c69309f0c" - integrity sha512-iQ1OT4VWcdDpyUAQp/o0wcSGPut6ZiFK8g35mNllhHtGb69jiSX6XzYLTSkFcQV7vghw4CelItR5CUniELMHZA== - dependencies: - "@floating-ui/react" "^0.26.9" - "@radix-ui/react-icons" "^1.3.0" - re-resizable "^6.9.11" - "@zkochan/js-yaml@0.0.6": version "0.0.6" resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826"