@portabletext/editor 2.14.3 → 2.14.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/plugins/plugin.behavior.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.decorator-pair.ts","../../src/plugins/plugin.decorator-shortcut.ts","../../src/plugins/plugin.editor-ref.tsx","../../src/plugins/plugin.event-listener.tsx","../../src/behaviors/behavior.markdown.ts","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors/behavior.types.behavior'\nimport {useEditor} from '../editor/use-editor'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => {\n unregister()\n })\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","export function createPairRegex(char: string, amount: number) {\n // Negative lookbehind: Ensures that the matched sequence is not preceded by the same character\n const prePrefix = `(?<!\\\\${char})`\n\n // Repeats the character `amount` times\n const prefix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the opening pair (**, *, etc.) is not followed by a space\n const postPrefix = `(?!\\\\s)`\n\n // Captures the content inside the pair\n const content = `([^${char}\\\\n]+?)`\n\n // Negative lookbehind: Ensures that the content is not followed by a space\n const preSuffix = `(?<!\\\\s)`\n\n // Repeats the character `amount` times\n const suffix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the matched sequence is not followed by the same character\n const postSuffix = `(?!\\\\${char})`\n\n return `${prePrefix}${prefix}${postPrefix}${content}${preSuffix}${suffix}${postSuffix}`\n}\n\nconst italicRegex = new RegExp(\n `(${createPairRegex('*', 1)}|${createPairRegex('_', 1)})$`,\n)\n\nconst boldRegex = new RegExp(\n `(${createPairRegex('*', 2)}|${createPairRegex('_', 2)})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import type {EditorSchema} from '../editor/editor-schema'\nimport {createPairRegex} from '../internal-utils/get-text-to-emphasize'\nimport {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'\nimport {getPreviousInlineObject} from '../selectors/selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from '../selectors/selector.get-selection-start-point'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport type {BlockOffset} from '../types/block-offset'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {blockOffsetsToSelection} from '../utils/util.block-offsets-to-selection'\nimport {childSelectionPointToBlockOffset} from '../utils/util.child-selection-point-to-block-offset'\nimport {effect, execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nexport function createDecoratorPairBehavior(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n onDecorate: (offset: BlockOffset) => void\n}) {\n if (config.pair.amount < 1) {\n console.warn(\n `The amount of characters in the pair should be greater than 0`,\n )\n }\n\n const pairRegex = createPairRegex(config.pair.char, config.pair.amount)\n const regEx = new RegExp(`(${pairRegex})$`)\n\n return defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (config.pair.amount < 1) {\n return false\n }\n\n const decorator = config.decorator({schema: snapshot.context.schema})\n\n if (decorator === undefined) {\n return false\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n context: {\n schema: snapshot.context.schema,\n value: snapshot.context.value,\n },\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = getBlockTextBefore(snapshot)\n const newText = `${textBefore}${event.text}`\n const textToDecorate = newText.match(regEx)?.at(0)\n\n if (textToDecorate === undefined) {\n return false\n }\n\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length = 4\n offset: newText.length - textToDecorate.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length + \"*\".length * 2 = 6\n offset:\n newText.length -\n textToDecorate.length +\n config.pair.char.length * config.pair.amount,\n },\n }\n\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length - 2 = 9\n offset:\n selectionStartOffset.offset +\n event.text.length -\n config.pair.char.length * config.pair.amount,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length = 11\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n // If the prefix is more than one character, then we need to check if\n // there is an inline object inside it\n if (prefixOffsets.focus.offset - prefixOffsets.anchor.offset > 1) {\n const prefixSelection = blockOffsetsToSelection({\n context: snapshot.context,\n offsets: prefixOffsets,\n })\n const inlineObjectBeforePrefixFocus = getPreviousInlineObject({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: prefixSelection\n ? {\n anchor: prefixSelection.focus,\n focus: prefixSelection.focus,\n }\n : null,\n },\n })\n const inlineObjectBeforePrefixFocusOffset =\n inlineObjectBeforePrefixFocus\n ? childSelectionPointToBlockOffset({\n context: {\n schema: snapshot.context.schema,\n value: snapshot.context.value,\n },\n selectionPoint: {\n path: inlineObjectBeforePrefixFocus.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n inlineObjectBeforePrefixFocusOffset &&\n inlineObjectBeforePrefixFocusOffset.offset >\n prefixOffsets.anchor.offset &&\n inlineObjectBeforePrefixFocusOffset.offset <\n prefixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n // If the suffix is more than one character, then we need to check if\n // there is an inline object inside it\n if (suffixOffsets.focus.offset - suffixOffsets.anchor.offset > 1) {\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const previousInlineObjectOffset = previousInlineObject\n ? childSelectionPointToBlockOffset({\n context: {\n schema: snapshot.context.schema,\n value: snapshot.context.value,\n },\n selectionPoint: {\n path: previousInlineObject.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n previousInlineObjectOffset &&\n previousInlineObjectOffset.offset > suffixOffsets.anchor.offset &&\n previousInlineObjectOffset.offset < suffixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator,\n }\n },\n actions: [\n // Insert the text as usual in its own undo step\n ({event}) => [execute(event)],\n (_, {prefixOffsets, suffixOffsets, decorator}) => [\n // Decorate the text between the prefix and suffix\n execute({\n type: 'decorator.add',\n decorator,\n at: {\n anchor: prefixOffsets.focus,\n focus: suffixOffsets.anchor,\n },\n }),\n // Delete the suffix\n execute({\n type: 'delete.text',\n at: suffixOffsets,\n }),\n // Delete the prefix\n execute({\n type: 'delete.text',\n at: prefixOffsets,\n }),\n // Toggle the decorator off so the next inserted text isn't emphasized\n execute({\n type: 'decorator.remove',\n decorator,\n }),\n effect(() => {\n config.onDecorate({\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n })\n }),\n ],\n ],\n })\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport {createDecoratorPairBehavior} from '../behaviors/behavior.decorator-pair'\nimport {effect, execute, forward} from '../behaviors/behavior.types.action'\nimport {defineBehavior} from '../behaviors/behavior.types.behavior'\nimport type {Editor} from '../editor'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport {useEditor} from '../editor/use-editor'\nimport type {BlockOffset} from '../types/block-offset'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\n\n/**\n * @beta\n * @deprecated Install the plugin from `@portabletext/plugin-character-pair-decorator`\n */\nexport function DecoratorShortcutPlugin(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n}) {\n const editor = useEditor()\n\n useActorRef(decoratorPairMachine, {\n input: {\n editor,\n decorator: config.decorator,\n pair: config.pair,\n },\n })\n\n return null\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: BlockOffset\n focus: BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n }\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: createDecoratorPairBehavior({\n decorator: input.decorator,\n pair: input.pair,\n onDecorate: (offset) => {\n sendBack({type: 'emphasis.add', blockOffset: offset})\n },\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({snapshot, event}) => {\n if (!event.at) {\n return {blockOffsets: undefined}\n }\n\n const anchor = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: event.at.anchor,\n })\n const focus = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: event.at.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n ({event}, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n forward(event),\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n execute({\n type: 'history.undo',\n }),\n effect(() => {\n sendBack({type: 'delete.backward'})\n }),\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst decoratorPairMachine = setup({\n types: {\n context: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n offsetAfterEmphasis?: BlockOffset\n pair: {char: string; amount: number}\n },\n input: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'decorator pair',\n context: ({input}) => ({\n decorator: input.decorator,\n editor: input.editor,\n pair: input.pair,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n decorator: context.decorator,\n editor: context.editor,\n pair: context.pair,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import React from 'react'\nimport type {Editor} from '../editor'\nimport {useEditor} from '../editor/use-editor'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","import {useEffect} from 'react'\nimport type {EditorEmittedEvent} from '../editor/relay-machine'\nimport {useEditor} from '../editor/use-editor'\n\n/**\n * @public\n * Listen for events emitted by the editor. Must be used inside `EditorProvider`. Events available include:\n * - 'blurred'\n * - 'done loading'\n * - 'editable'\n * - 'error'\n * - 'focused'\n * - 'invalid value'\n * - 'loading'\n * - 'mutation'\n * - 'patch'\n * - 'read only'\n * - 'ready'\n * - 'selection'\n * - 'value changed'\n *\n * @example\n * Listen and log events.\n * ```tsx\n * import {EditorProvider} from '@portabletext/editor'\n * import {EventListenerPlugin} from '@portabletext/editor/plugins'\n *\n * function MyComponent() {\n * return (\n * <EditorProvider>\n * <EventListenerPlugin\n * on={(event) => {\n * console.log(event)\n * }\n * } />\n * { ... }\n * </EditorProvider>\n * )\n * }\n * ```\n * @example\n * Handle events when there is a mutation.\n * ```tsx\n * <EventListenerPlugin\n * on={(event) => {\n * if (event.type === 'mutation') {\n * console.log('Value changed:', event.snapshot)\n * }\n * }}\n * />\n * ```\n * @group Components\n */\nexport function EventListenerPlugin(props: {\n on: (event: EditorEmittedEvent) => void\n}) {\n const editor = useEditor()\n\n useEffect(() => {\n const subscription = editor.on('*', props.on)\n\n return () => {\n subscription.unsubscribe()\n }\n }, [editor, props.on])\n\n return null\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport {getFocusBlock} from '../selectors/selector.get-focus-block'\nimport {getFocusSpan} from '../selectors/selector.get-focus-span'\nimport {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'\nimport {getPreviousInlineObject} from '../selectors/selector.get-previous-inline-object'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {isSelectionCollapsed} from '../selectors/selector.is-selection-collapsed'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ' ',\n }),\n ],\n (_, {focusTextBlock, style}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n }),\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = getFocusTextBlock(snapshot)\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const textBefore = getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n execute({\n type: 'insert.text',\n text: hrCharacter,\n }),\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n execute({\n type: 'insert.block',\n placement: 'before',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n }),\n execute({\n type: 'delete.text',\n at: hrBlockOffsets,\n }),\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n execute({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock}) =>\n isTextBlock(snapshot.context, focusBlock.node)\n ? [\n execute({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusBlock.node.children,\n },\n placement: 'after',\n }),\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n execute({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, level}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n }),\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n execute({\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n }),\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(snapshot.context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n execute({\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport {useEditor} from '../editor/use-editor'\nimport {DecoratorShortcutPlugin} from './plugin.decorator-shortcut'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * codeDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'code')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\n * strikeThroughDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strike-through')?.value,\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n * @deprecated Install the plugin from `@portabletext/plugin-markdown-shortcuts`\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return (\n <>\n {props.config.boldDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {props.config.codeDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {props.config.italicDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {props.config.strikeThroughDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n </>\n )\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport {execute, raise} from '../behaviors/behavior.types.action'\nimport {defineBehavior} from '../behaviors/behavior.types.behavior'\nimport {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'\nimport {isSelectionExpanded} from '../selectors/selector.is-selection-expanded'\nimport {mergeTextBlocks} from '../utils/util.merge-text-blocks'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) =>\n snapshot.context.selection && isSelectionExpanded(snapshot)\n ? {selection: snapshot.context.selection}\n : false,\n actions: [(_, {selection}) => [execute({type: 'delete', at: selection})]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({snapshot, event}) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n\n if (!focusTextBlock || !isTextBlock(snapshot.context, event.block)) {\n return false\n }\n\n return true\n },\n actions: [\n ({event}) => [\n execute({\n type: 'insert.block',\n block: event.block,\n placement: 'auto',\n select: 'end',\n }),\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({snapshot, event}) => {\n const textBlocks = event.blocks.filter((block) =>\n isTextBlock(snapshot.context, block),\n )\n\n if (textBlocks.length === 0) {\n return false\n }\n\n return textBlocks.reduce((targetBlock, incomingBlock) => {\n return mergeTextBlocks({\n context: snapshot.context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.blocks` in case the Behavior above\n * ends up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.blocks',\n actions: [],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n *\n * @deprecated Install the plugin from `@portabletext/plugin-one-line`\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","createPairRegex","char","amount","prePrefix","prefix","repeat","Math","max","postPrefix","content","preSuffix","suffix","postSuffix","createDecoratorPairBehavior","config","pair","console","warn","pairRegex","regEx","RegExp","defineBehavior","on","guard","snapshot","event","decorator","schema","context","undefined","focusTextBlock","getFocusTextBlock","selectionStartPoint","getSelectionStartPoint","selectionStartOffset","spanSelectionPointToBlockOffset","value","selectionPoint","newText","getBlockTextBefore","text","textToDecorate","match","at","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","prefixSelection","blockOffsetsToSelection","offsets","inlineObjectBeforePrefixFocus","getPreviousInlineObject","selection","inlineObjectBeforePrefixFocusOffset","childSelectionPointToBlockOffset","previousInlineObject","previousInlineObjectOffset","actions","execute","_","type","effect","onDecorate","DecoratorShortcutPlugin","input","useActorRef","decoratorPairMachine","emphasisListener","sendBack","blockOffset","selectionListenerCallback","blockOffsets","forward","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","EditorRefPlugin","React","forwardRef","ref","portableTextEditorRef","useRef","Symbol","for","current","useImperativeHandle","displayName","EventListenerPlugin","subscription","unsubscribe","createMarkdownBehaviors","automaticBlockquoteOnSpace","selectionCollapsed","isSelectionCollapsed","focusSpan","getFocusSpan","_key","node","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","style","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","block","_type","name","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","getFocusBlock","isTextBlock","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList","MarkdownPlugin","unregisterBehavior","t2","boldDecorator","t3","codeDecorator","t4","italicDecorator","t5","strikeThroughDecorator","t6","oneLineBehaviors","isSelectionExpanded","select","textBlocks","blocks","filter","reduce","targetBlock","incomingBlock","mergeTextBlocks","raise","OneLinePlugin"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/plugins/plugin.behavior.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.decorator-pair.ts","../../src/plugins/plugin.decorator-shortcut.ts","../../src/plugins/plugin.editor-ref.tsx","../../src/plugins/plugin.event-listener.tsx","../../src/behaviors/behavior.markdown.ts","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors/behavior.types.behavior'\nimport {useEditor} from '../editor/use-editor'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => {\n unregister()\n })\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","export function createPairRegex(char: string, amount: number) {\n // Negative lookbehind: Ensures that the matched sequence is not preceded by the same character\n const prePrefix = `(?<!\\\\${char})`\n\n // Repeats the character `amount` times\n const prefix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the opening pair (**, *, etc.) is not followed by a space\n const postPrefix = `(?!\\\\s)`\n\n // Captures the content inside the pair\n const content = `([^${char}\\\\n]+?)`\n\n // Negative lookbehind: Ensures that the content is not followed by a space\n const preSuffix = `(?<!\\\\s)`\n\n // Repeats the character `amount` times\n const suffix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the matched sequence is not followed by the same character\n const postSuffix = `(?!\\\\${char})`\n\n return `${prePrefix}${prefix}${postPrefix}${content}${preSuffix}${suffix}${postSuffix}`\n}\n\nconst italicRegex = new RegExp(\n `(${createPairRegex('*', 1)}|${createPairRegex('_', 1)})$`,\n)\n\nconst boldRegex = new RegExp(\n `(${createPairRegex('*', 2)}|${createPairRegex('_', 2)})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import type {EditorSchema} from '../editor/editor-schema'\nimport {createPairRegex} from '../internal-utils/get-text-to-emphasize'\nimport {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'\nimport {getPreviousInlineObject} from '../selectors/selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from '../selectors/selector.get-selection-start-point'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport type {BlockOffset} from '../types/block-offset'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {blockOffsetsToSelection} from '../utils/util.block-offsets-to-selection'\nimport {childSelectionPointToBlockOffset} from '../utils/util.child-selection-point-to-block-offset'\nimport {effect, execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nexport function createDecoratorPairBehavior(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n onDecorate: (offset: BlockOffset) => void\n}) {\n if (config.pair.amount < 1) {\n console.warn(\n `The amount of characters in the pair should be greater than 0`,\n )\n }\n\n const pairRegex = createPairRegex(config.pair.char, config.pair.amount)\n const regEx = new RegExp(`(${pairRegex})$`)\n\n return defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (config.pair.amount < 1) {\n return false\n }\n\n const decorator = config.decorator({schema: snapshot.context.schema})\n\n if (decorator === undefined) {\n return false\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n context: {\n schema: snapshot.context.schema,\n value: snapshot.context.value,\n },\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = getBlockTextBefore(snapshot)\n const newText = `${textBefore}${event.text}`\n const textToDecorate = newText.match(regEx)?.at(0)\n\n if (textToDecorate === undefined) {\n return false\n }\n\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length = 4\n offset: newText.length - textToDecorate.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length + \"*\".length * 2 = 6\n offset:\n newText.length -\n textToDecorate.length +\n config.pair.char.length * config.pair.amount,\n },\n }\n\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length - 2 = 9\n offset:\n selectionStartOffset.offset +\n event.text.length -\n config.pair.char.length * config.pair.amount,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length = 11\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n // If the prefix is more than one character, then we need to check if\n // there is an inline object inside it\n if (prefixOffsets.focus.offset - prefixOffsets.anchor.offset > 1) {\n const prefixSelection = blockOffsetsToSelection({\n context: snapshot.context,\n offsets: prefixOffsets,\n })\n const inlineObjectBeforePrefixFocus = getPreviousInlineObject({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: prefixSelection\n ? {\n anchor: prefixSelection.focus,\n focus: prefixSelection.focus,\n }\n : null,\n },\n })\n const inlineObjectBeforePrefixFocusOffset =\n inlineObjectBeforePrefixFocus\n ? childSelectionPointToBlockOffset({\n context: {\n schema: snapshot.context.schema,\n value: snapshot.context.value,\n },\n selectionPoint: {\n path: inlineObjectBeforePrefixFocus.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n inlineObjectBeforePrefixFocusOffset &&\n inlineObjectBeforePrefixFocusOffset.offset >\n prefixOffsets.anchor.offset &&\n inlineObjectBeforePrefixFocusOffset.offset <\n prefixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n // If the suffix is more than one character, then we need to check if\n // there is an inline object inside it\n if (suffixOffsets.focus.offset - suffixOffsets.anchor.offset > 1) {\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const previousInlineObjectOffset = previousInlineObject\n ? childSelectionPointToBlockOffset({\n context: {\n schema: snapshot.context.schema,\n value: snapshot.context.value,\n },\n selectionPoint: {\n path: previousInlineObject.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n previousInlineObjectOffset &&\n previousInlineObjectOffset.offset > suffixOffsets.anchor.offset &&\n previousInlineObjectOffset.offset < suffixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator,\n }\n },\n actions: [\n // Insert the text as usual in its own undo step\n ({event}) => [execute(event)],\n (_, {prefixOffsets, suffixOffsets, decorator}) => [\n // Decorate the text between the prefix and suffix\n execute({\n type: 'decorator.add',\n decorator,\n at: {\n anchor: prefixOffsets.focus,\n focus: suffixOffsets.anchor,\n },\n }),\n // Delete the suffix\n execute({\n type: 'delete.text',\n at: suffixOffsets,\n }),\n // Delete the prefix\n execute({\n type: 'delete.text',\n at: prefixOffsets,\n }),\n // Toggle the decorator off so the next inserted text isn't emphasized\n execute({\n type: 'decorator.remove',\n decorator,\n }),\n effect(() => {\n config.onDecorate({\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n })\n }),\n ],\n ],\n })\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport {createDecoratorPairBehavior} from '../behaviors/behavior.decorator-pair'\nimport {effect, execute, forward} from '../behaviors/behavior.types.action'\nimport {defineBehavior} from '../behaviors/behavior.types.behavior'\nimport type {Editor} from '../editor'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport {useEditor} from '../editor/use-editor'\nimport type {BlockOffset} from '../types/block-offset'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\n\n/**\n * @beta\n * @deprecated Install the plugin from `@portabletext/plugin-character-pair-decorator`\n */\nexport function DecoratorShortcutPlugin(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n}) {\n const editor = useEditor()\n\n useActorRef(decoratorPairMachine, {\n input: {\n editor,\n decorator: config.decorator,\n pair: config.pair,\n },\n })\n\n return null\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: BlockOffset\n focus: BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n }\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: createDecoratorPairBehavior({\n decorator: input.decorator,\n pair: input.pair,\n onDecorate: (offset) => {\n sendBack({type: 'emphasis.add', blockOffset: offset})\n },\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({snapshot, event}) => {\n if (!event.at) {\n return {blockOffsets: undefined}\n }\n\n const anchor = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: event.at.anchor,\n })\n const focus = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: event.at.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n ({event}, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n forward(event),\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n execute({\n type: 'history.undo',\n }),\n effect(() => {\n sendBack({type: 'delete.backward'})\n }),\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst decoratorPairMachine = setup({\n types: {\n context: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n offsetAfterEmphasis?: BlockOffset\n pair: {char: string; amount: number}\n },\n input: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'decorator pair',\n context: ({input}) => ({\n decorator: input.decorator,\n editor: input.editor,\n pair: input.pair,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n decorator: context.decorator,\n editor: context.editor,\n pair: context.pair,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import React from 'react'\nimport type {Editor} from '../editor'\nimport {useEditor} from '../editor/use-editor'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","import {useEffect} from 'react'\nimport type {EditorEmittedEvent} from '../editor/relay-machine'\nimport {useEditor} from '../editor/use-editor'\n\n/**\n * @public\n * Listen for events emitted by the editor. Must be used inside `EditorProvider`. Events available include:\n * - 'blurred'\n * - 'done loading'\n * - 'editable'\n * - 'error'\n * - 'focused'\n * - 'invalid value'\n * - 'loading'\n * - 'mutation'\n * - 'patch'\n * - 'read only'\n * - 'ready'\n * - 'selection'\n * - 'value changed'\n *\n * @example\n * Listen and log events.\n * ```tsx\n * import {EditorProvider} from '@portabletext/editor'\n * import {EventListenerPlugin} from '@portabletext/editor/plugins'\n *\n * function MyComponent() {\n * return (\n * <EditorProvider>\n * <EventListenerPlugin\n * on={(event) => {\n * console.log(event)\n * }\n * } />\n * { ... }\n * </EditorProvider>\n * )\n * }\n * ```\n * @example\n * Handle events when there is a mutation.\n * ```tsx\n * <EventListenerPlugin\n * on={(event) => {\n * if (event.type === 'mutation') {\n * console.log('Value changed:', event.snapshot)\n * }\n * }}\n * />\n * ```\n * @group Components\n */\nexport function EventListenerPlugin(props: {\n on: (event: EditorEmittedEvent) => void\n}) {\n const editor = useEditor()\n\n useEffect(() => {\n const subscription = editor.on('*', props.on)\n\n return () => {\n subscription.unsubscribe()\n }\n }, [editor, props.on])\n\n return null\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport {getFocusBlock} from '../selectors/selector.get-focus-block'\nimport {getFocusSpan} from '../selectors/selector.get-focus-span'\nimport {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'\nimport {getPreviousInlineObject} from '../selectors/selector.get-previous-inline-object'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {isSelectionCollapsed} from '../selectors/selector.is-selection-collapsed'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ' ',\n }),\n ],\n (_, {focusTextBlock, style}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n }),\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = getFocusTextBlock(snapshot)\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const textBefore = getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n execute({\n type: 'insert.text',\n text: hrCharacter,\n }),\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n execute({\n type: 'insert.block',\n placement: 'before',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n }),\n execute({\n type: 'delete.text',\n at: hrBlockOffsets,\n }),\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n execute({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock}) =>\n isTextBlock(snapshot.context, focusBlock.node)\n ? [\n execute({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusBlock.node.children,\n },\n placement: 'after',\n }),\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n execute({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, level}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n }),\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n execute({\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n }),\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = isSelectionCollapsed(snapshot)\n const focusTextBlock = getFocusTextBlock(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(snapshot.context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n execute({\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport {useEditor} from '../editor/use-editor'\nimport {DecoratorShortcutPlugin} from './plugin.decorator-shortcut'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * codeDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'code')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\n * strikeThroughDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strike-through')?.value,\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n * @deprecated Install the plugin from `@portabletext/plugin-markdown-shortcuts`\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return (\n <>\n {props.config.boldDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {props.config.codeDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {props.config.italicDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {props.config.strikeThroughDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n </>\n )\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport {execute, raise} from '../behaviors/behavior.types.action'\nimport {defineBehavior} from '../behaviors/behavior.types.behavior'\nimport {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'\nimport {isSelectionExpanded} from '../selectors/selector.is-selection-expanded'\nimport {mergeTextBlocks} from '../utils/util.merge-text-blocks'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) =>\n snapshot.context.selection && isSelectionExpanded(snapshot)\n ? {selection: snapshot.context.selection}\n : false,\n actions: [(_, {selection}) => [execute({type: 'delete', at: selection})]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({snapshot, event}) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n\n if (!focusTextBlock || !isTextBlock(snapshot.context, event.block)) {\n return false\n }\n\n return true\n },\n actions: [\n ({event}) => [\n execute({\n type: 'insert.block',\n block: event.block,\n placement: 'auto',\n select: 'end',\n }),\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({snapshot, event}) => {\n const textBlocks = event.blocks.filter((block) =>\n isTextBlock(snapshot.context, block),\n )\n\n if (textBlocks.length === 0) {\n return false\n }\n\n return textBlocks.reduce((targetBlock, incomingBlock) => {\n return mergeTextBlocks({\n context: snapshot.context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.blocks` in case the Behavior above\n * ends up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.blocks',\n actions: [],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n *\n * @deprecated Install the plugin from `@portabletext/plugin-one-line`\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","createPairRegex","char","amount","prePrefix","prefix","repeat","Math","max","postPrefix","content","preSuffix","suffix","postSuffix","createDecoratorPairBehavior","config","pair","console","warn","pairRegex","regEx","RegExp","defineBehavior","on","guard","snapshot","event","decorator","schema","context","undefined","focusTextBlock","getFocusTextBlock","selectionStartPoint","getSelectionStartPoint","selectionStartOffset","spanSelectionPointToBlockOffset","value","selectionPoint","newText","getBlockTextBefore","text","textToDecorate","match","at","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","prefixSelection","blockOffsetsToSelection","offsets","inlineObjectBeforePrefixFocus","getPreviousInlineObject","selection","inlineObjectBeforePrefixFocusOffset","childSelectionPointToBlockOffset","previousInlineObject","previousInlineObjectOffset","actions","execute","_","type","effect","onDecorate","DecoratorShortcutPlugin","input","useActorRef","decoratorPairMachine","emphasisListener","sendBack","blockOffset","selectionListenerCallback","blockOffsets","forward","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","EditorRefPlugin","React","forwardRef","ref","portableTextEditorRef","useRef","Symbol","for","current","useImperativeHandle","displayName","EventListenerPlugin","subscription","unsubscribe","createMarkdownBehaviors","automaticBlockquoteOnSpace","selectionCollapsed","isSelectionCollapsed","focusSpan","getFocusSpan","_key","node","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","style","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","block","_type","name","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","getFocusBlock","isTextBlock","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList","MarkdownPlugin","unregisterBehavior","t2","boldDecorator","t3","codeDecorator","t4","italicDecorator","t5","strikeThroughDecorator","t6","oneLineBehaviors","isSelectionExpanded","select","textBlocks","blocks","filter","reduce","targetBlock","incomingBlock","mergeTextBlocks","raise","OneLinePlugin"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "2.14.3",
3
+ "version": "2.14.4",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "sanity",
@@ -80,7 +80,7 @@
80
80
  "immer": "^10.1.3",
81
81
  "lodash": "^4.17.21",
82
82
  "lodash.startcase": "^4.4.0",
83
- "react-compiler-runtime": "19.1.0-rc.3",
83
+ "react-compiler-runtime": "1.0.0",
84
84
  "slate": "0.118.1",
85
85
  "slate-dom": "^0.118.1",
86
86
  "slate-react": "0.117.4",
@@ -104,16 +104,16 @@
104
104
  "@vitejs/plugin-react": "^4.7.0",
105
105
  "@vitest/browser": "^3.2.4",
106
106
  "@vitest/coverage-istanbul": "^3.2.4",
107
- "babel-plugin-react-compiler": "19.1.0-rc.3",
108
- "eslint": "^9.36.0",
107
+ "babel-plugin-react-compiler": "1.0.0",
108
+ "eslint": "^9.38.0",
109
109
  "eslint-formatter-gha": "^1.6.0",
110
- "eslint-plugin-react-hooks": "6.0.0-rc.2",
110
+ "eslint-plugin-react-hooks": "7.0.0",
111
111
  "jsdom": "^27.0.0",
112
112
  "react": "^19.2.0",
113
113
  "react-dom": "^19.2.0",
114
114
  "rxjs": "^7.8.2",
115
115
  "typescript": "5.9.3",
116
- "typescript-eslint": "^8.44.1",
116
+ "typescript-eslint": "^8.46.1",
117
117
  "vite": "^7.1.7",
118
118
  "vitest": "^3.2.4",
119
119
  "vitest-browser-react": "^1.0.1",
@@ -142,52 +142,89 @@ export function createWithUndoRedo(
142
142
  return
143
143
  }
144
144
 
145
- const {operations, history} = editor
146
- const {undos} = history
147
- const step = undos[undos.length - 1]
148
- const lastOp =
149
- step && step.operations && step.operations[step.operations.length - 1]
150
- const overwrite = shouldOverwrite(op, lastOp)
151
- const save = isSaving(editor)
152
-
145
+ const savingUndoSteps = isSaving(editor)
153
146
  const currentUndoStepId = getCurrentUndoStepId(editor)
154
147
 
155
- let merge =
156
- currentUndoStepId === previousUndoStepId || isNormalizingNode(editor)
157
-
158
- if (save) {
159
- if (!step) {
160
- merge = false
161
- } else if (operations.length === 0) {
162
- merge =
163
- currentUndoStepId === undefined && previousUndoStepId === undefined
164
- ? shouldMerge(op, lastOp) || overwrite
165
- : merge
166
- }
148
+ if (!savingUndoSteps) {
149
+ // If we are bypassing saving undo steps, then we can just move along.
167
150
 
168
- if (step && merge) {
169
- step.operations.push(op)
170
- } else {
171
- const newStep = {
172
- operations: [
173
- ...(editor.selection === null
174
- ? []
175
- : [createSelectOperation(editor)]),
176
- op,
177
- ],
178
- timestamp: new Date(),
179
- }
180
- undos.push(newStep)
181
- debug('Created new undo step', step)
182
- }
151
+ previousUndoStepId = currentUndoStepId
183
152
 
184
- while (undos.length > UNDO_STEP_LIMIT) {
185
- undos.shift()
186
- }
153
+ apply(op)
187
154
 
188
- if (shouldClear(op)) {
189
- history.redos = []
190
- }
155
+ return
156
+ }
157
+
158
+ if (op.type !== 'set_selection') {
159
+ // Clear the repo steps if any actual changes are made
160
+ editor.history.redos = []
161
+ }
162
+
163
+ const step = editor.history.undos.at(editor.history.undos.length - 1)
164
+
165
+ if (!step) {
166
+ // If the undo stack is empty, then we can just create a new step and
167
+ // move along.
168
+
169
+ editor.history.undos.push({
170
+ operations: [
171
+ ...(editor.selection === null
172
+ ? []
173
+ : [createSelectOperation(editor)]),
174
+ op,
175
+ ],
176
+ timestamp: new Date(),
177
+ })
178
+
179
+ apply(op)
180
+
181
+ previousUndoStepId = currentUndoStepId
182
+
183
+ return
184
+ }
185
+
186
+ const selectingWithoutUndoStepId =
187
+ op.type === 'set_selection' &&
188
+ currentUndoStepId === undefined &&
189
+ previousUndoStepId !== undefined
190
+ const selectingWithDifferentUndoStepId =
191
+ op.type === 'set_selection' &&
192
+ currentUndoStepId !== undefined &&
193
+ previousUndoStepId !== undefined &&
194
+ previousUndoStepId !== currentUndoStepId
195
+
196
+ const lastOp = step.operations.at(-1)
197
+ const mergeOpIntoPreviousStep =
198
+ editor.operations.length > 0
199
+ ? currentUndoStepId === previousUndoStepId ||
200
+ isNormalizingNode(editor)
201
+ : selectingWithoutUndoStepId ||
202
+ selectingWithDifferentUndoStepId ||
203
+ (currentUndoStepId === undefined &&
204
+ previousUndoStepId === undefined)
205
+ ? shouldMerge(op, lastOp) ||
206
+ (lastOp?.type === 'set_selection' && op.type === 'set_selection')
207
+ : currentUndoStepId === previousUndoStepId ||
208
+ isNormalizingNode(editor)
209
+
210
+ if (mergeOpIntoPreviousStep) {
211
+ step.operations.push(op)
212
+ } else {
213
+ editor.history.undos.push({
214
+ operations: [
215
+ ...(editor.selection === null
216
+ ? []
217
+ : [createSelectOperation(editor)]),
218
+ op,
219
+ ],
220
+ timestamp: new Date(),
221
+ })
222
+ }
223
+
224
+ // Make sure we don't exceed the maximum number of undo steps we want
225
+ // to store.
226
+ while (editor.history.undos.length > UNDO_STEP_LIMIT) {
227
+ editor.history.undos.shift()
191
228
  }
192
229
 
193
230
  previousUndoStepId = currentUndoStepId
@@ -195,7 +232,6 @@ export function createWithUndoRedo(
195
232
  apply(op)
196
233
  }
197
234
 
198
- // Plugin return
199
235
  return editor
200
236
  }
201
237
  }
@@ -563,25 +599,6 @@ const shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {
563
599
  return false
564
600
  }
565
601
 
566
- const shouldOverwrite = (
567
- op: Operation,
568
- prev: Operation | undefined,
569
- ): boolean => {
570
- if (prev && op.type === 'set_selection' && prev.type === 'set_selection') {
571
- return true
572
- }
573
-
574
- return false
575
- }
576
-
577
- const shouldClear = (op: Operation): boolean => {
578
- if (op.type === 'set_selection') {
579
- return false
580
- }
581
-
582
- return true
583
- }
584
-
585
602
  export function withoutSaving(editor: Editor, fn: () => void): void {
586
603
  const prev = isSaving(editor)
587
604
  SAVING.set(editor, false)