@portabletext/editor 1.16.4 → 1.17.0
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.
- package/README.md +1 -1
- package/lib/_chunks-cjs/behavior.core.cjs +5 -12
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs +3 -10
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-selection-collapsed.cjs +1 -4
- package/lib/_chunks-cjs/selector.is-selection-collapsed.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +5 -12
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/selector.get-text-before.js +3 -10
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selector.is-selection-collapsed.js +1 -4
- package/lib/_chunks-es/selector.is-selection-collapsed.js.map +1 -1
- package/lib/behaviors/index.cjs +319 -37
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +46 -0
- package/lib/behaviors/index.d.ts +46 -0
- package/lib/behaviors/index.js +321 -38
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.cjs +532 -881
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +532 -881
- package/lib/index.js.map +1 -1
- package/lib/selectors/index.cjs +7 -19
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.js +7 -19
- package/lib/selectors/index.js.map +1 -1
- package/package.json +3 -3
- package/src/behaviors/behavior.emoji-picker.ts +410 -0
- package/src/behaviors/index.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @alpha\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.keyboardEvent,\n )\n const firstBlock = selectors.getFirstBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block up',\n at,\n })),\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.keyboardEvent,\n )\n const lastBlock = selectors.getLastBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block down',\n at,\n })),\n ],\n }),\n ]\n}\n","import type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @alpha\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n {\n type: 'annotation.add',\n annotation,\n },\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const focusSpan = selectors.getFocusSpan({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n {\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n },\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n\nfunction looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n new URL(text)\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {getTextBlockText} from '../editor/utils/utils'\nimport {spanSelectionPointToBlockOffset} from '../editor/utils/utils.block-offset'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\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\n/**\n * @alpha\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!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?.(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 {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, 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?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const textBefore = getBlockTextBefore({context})\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 (textBefore === `${hrCharacter}${hrCharacter}`) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\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 (!caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: 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}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(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 {\n type: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(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?.(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}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","context","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","keyboardEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","text","data","getData","url","looksLikeUrl","undefined","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations","URL","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","style","props","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","hrRegExp","hrCharacters","match","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @alpha\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.keyboardEvent,\n )\n const firstBlock = selectors.getFirstBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block up',\n at,\n })),\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.keyboardEvent,\n )\n const lastBlock = selectors.getLastBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block down',\n at,\n })),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @alpha\n */\nexport type EmojiPickerBehaviorsConfig<TEmojiMatch> = {\n /**\n * Match emojis by keyword.\n */\n matchEmojis: ({keyword}: {keyword: string}) => Array<TEmojiMatch>\n onMatchesChanged: ({matches}: {matches: Array<TEmojiMatch>}) => void\n onSelectedIndexChanged: ({selectedIndex}: {selectedIndex: number}) => void\n /**\n * Parse an emoji match to a string that will be inserted into the editor.\n */\n parseMatch: ({match}: {match: TEmojiMatch}) => string | undefined\n}\n\n/**\n * @alpha\n */\nexport function createEmojiPickerBehaviors<TEmojiMatch>(\n config: EmojiPickerBehaviorsConfig<TEmojiMatch>,\n) {\n const emojiPickerActor = createActor(createEmojiPickerMachine<TEmojiMatch>())\n emojiPickerActor.start()\n emojiPickerActor.subscribe((state) => {\n config.onMatchesChanged({matches: state.context.matches})\n config.onSelectedIndexChanged({selectedIndex: state.context.selectedIndex})\n })\n\n return [\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ':',\n },\n ],\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isShift = isHotkey('Shift', event.keyboardEvent)\n const isColon = event.keyboardEvent.key === ':'\n const isEmojiChar = emojiCharRegEx.test(event.keyboardEvent.key)\n\n if (isShift || isColon || isEmojiChar) {\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const isEnter = isHotkey('Enter', event.keyboardEvent)\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (isEnter || isTab) {\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n if (isArrowDown) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp) {\n return {action: 'navigate up' as const}\n }\n\n return {action: 'reset' as const}\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate up'})\n },\n },\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate down'})\n },\n },\n ]\n }\n\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'reset'})\n },\n },\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({context, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: [], event}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","import type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @alpha\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n {\n type: 'annotation.add',\n annotation,\n },\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const focusSpan = selectors.getFocusSpan({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n {\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n },\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n\nfunction looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n new URL(text)\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {getTextBlockText} from '../editor/utils/utils'\nimport {spanSelectionPointToBlockOffset} from '../editor/utils/utils.block-offset'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\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\n/**\n * @alpha\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!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?.(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 {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, 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?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const textBefore = getBlockTextBefore({context})\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 (textBefore === `${hrCharacter}${hrCharacter}`) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\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 (!caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: 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}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(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 {\n type: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(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?.(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}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","context","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","keyboardEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","onSelectedIndexChanged","selectedIndex","text","getSnapshot","emoji","parseMatch","match","undefined","focusBlock","textBefore","emojiKeyword","emojiStringLength","textBeforeLength","params","effect","send","anchor","offset","focus","test","emojis","matchEmojis","keyword","isShift","isColon","key","isEmojiChar","isArrowDown","isArrowUp","isEnter","isTab","action","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","data","getData","url","looksLikeUrl","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations","URL","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","selection","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","blockquoteStyle","style","props","automaticHr","hrCharacter","hrObject","horizontalRuleObject","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","hrRegExp","hrCharacters","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|