@portabletext/editor 1.15.3 → 1.16.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.
Files changed (70) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +25 -25
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/selector.get-text-before.cjs +14 -14
  4. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  5. package/lib/_chunks-cjs/{selectors.cjs → selector.is-selection-collapsed.cjs} +8 -8
  6. package/lib/_chunks-cjs/selector.is-selection-collapsed.cjs.map +1 -0
  7. package/lib/_chunks-es/behavior.core.js +7 -7
  8. package/lib/_chunks-es/behavior.core.js.map +1 -1
  9. package/lib/_chunks-es/selector.get-text-before.js +14 -14
  10. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  11. package/lib/_chunks-es/{selectors.js → selector.is-selection-collapsed.js} +8 -8
  12. package/lib/_chunks-es/selector.is-selection-collapsed.js.map +1 -0
  13. package/lib/behaviors/index.cjs +23 -23
  14. package/lib/behaviors/index.cjs.map +1 -1
  15. package/lib/behaviors/index.d.cts +1 -0
  16. package/lib/behaviors/index.d.ts +1 -0
  17. package/lib/behaviors/index.js +8 -8
  18. package/lib/behaviors/index.js.map +1 -1
  19. package/lib/index.cjs +855 -515
  20. package/lib/index.cjs.map +1 -1
  21. package/lib/index.d.cts +4126 -4834
  22. package/lib/index.d.ts +4126 -4834
  23. package/lib/index.js +852 -514
  24. package/lib/index.js.map +1 -1
  25. package/lib/selectors/index.cjs +166 -16
  26. package/lib/selectors/index.cjs.map +1 -1
  27. package/lib/selectors/index.d.cts +54 -5
  28. package/lib/selectors/index.d.ts +54 -5
  29. package/lib/selectors/index.js +154 -3
  30. package/lib/selectors/index.js.map +1 -1
  31. package/package.json +11 -11
  32. package/src/behaviors/behavior.code-editor.ts +5 -9
  33. package/src/behaviors/behavior.core.block-objects.ts +13 -19
  34. package/src/behaviors/behavior.core.lists.ts +11 -17
  35. package/src/behaviors/behavior.links.ts +4 -4
  36. package/src/behaviors/behavior.markdown.ts +16 -21
  37. package/src/editor/Editable.tsx +11 -4
  38. package/src/editor/PortableTextEditor.tsx +2 -3
  39. package/src/editor/{hooks/useSyncValue.test.tsx → __tests__/sync-value.test.tsx} +42 -23
  40. package/src/editor/components/Synchronizer.tsx +53 -80
  41. package/src/editor/editor-machine.ts +129 -80
  42. package/src/editor/editor-provider.tsx +0 -3
  43. package/src/editor/editor-selector.ts +5 -0
  44. package/src/editor/editor-snapshot.ts +1 -0
  45. package/src/editor/get-active-decorators.ts +20 -0
  46. package/src/editor/mutation-machine.ts +100 -0
  47. package/src/editor/plugins/__tests__/withPortableTextMarkModel.test.tsx +21 -15
  48. package/src/editor/plugins/createWithMaxBlocks.ts +1 -1
  49. package/src/editor/plugins/createWithPatches.ts +0 -4
  50. package/src/editor/plugins/createWithPlaceholderBlock.ts +1 -1
  51. package/src/editor/plugins/createWithPortableTextSelections.ts +4 -1
  52. package/src/editor/plugins/createWithUndoRedo.ts +3 -3
  53. package/src/editor/sync-machine.ts +657 -0
  54. package/src/editor/withSyncRangeDecorations.ts +17 -5
  55. package/src/selectors/_exports/index.ts +1 -0
  56. package/src/selectors/index.ts +9 -1
  57. package/src/selectors/selector.get-active-style.ts +37 -0
  58. package/src/selectors/selector.get-selected-spans.ts +136 -0
  59. package/src/selectors/selector.is-active-annotation.ts +49 -0
  60. package/src/selectors/selector.is-active-decorator.ts +21 -0
  61. package/src/selectors/selector.is-active-list-item.ts +13 -0
  62. package/src/selectors/selector.is-active-style.ts +13 -0
  63. package/src/selectors/selector.is-selection-collapsed.ts +12 -0
  64. package/src/selectors/selector.is-selection-expanded.ts +9 -0
  65. package/src/selectors/selectors.ts +0 -11
  66. package/src/utils/weakMaps.ts +0 -3
  67. package/src/utils/withChanges.ts +1 -8
  68. package/lib/_chunks-cjs/selectors.cjs.map +0 -1
  69. package/lib/_chunks-es/selectors.js.map +0 -1
  70. package/src/editor/hooks/useSyncValue.ts +0 -426
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {\n getFirstBlock,\n getLastBlock,\n getSelectedBlocks,\n} from '../selectors/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 = getFirstBlock({context})\n const selectedBlocks = 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 = getLastBlock({context})\n const selectedBlocks = 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 {getFocusSpan, selectionIsCollapsed} from '../selectors/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 = selectionIsCollapsed({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 = getFocusSpan({context})\n const selectionCollapsed = selectionIsCollapsed({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 {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {\n getFocusBlock,\n getFocusSpan,\n getFocusTextBlock,\n selectionIsCollapsed,\n} from '../selectors/selectors'\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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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 = getFocusTextBlock({context})\n const selectionCollapsed = selectionIsCollapsed({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 = 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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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","getFirstBlock","selectedBlocks","getSelectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","getLastBlock","blocksBelow","length","reverse","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","selectionIsCollapsed","text","data","getData","url","looksLikeUrl","undefined","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","getFocusSpan","annotations","URL","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","getFocusTextBlock","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","getFocusBlock","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.cjs","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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"}
@@ -662,6 +662,7 @@ export declare function defineBehavior<
662
662
  * @alpha
663
663
  */
664
664
  export declare type EditorContext = {
665
+ activeDecorators: Array<string>
665
666
  keyGenerator: () => string
666
667
  schema: EditorSchema
667
668
  selection: EditorSelection
@@ -662,6 +662,7 @@ export declare function defineBehavior<
662
662
  * @alpha
663
663
  */
664
664
  export declare type EditorContext = {
665
+ activeDecorators: Array<string>
665
666
  keyGenerator: () => string
666
667
  schema: EditorSchema
667
668
  selection: EditorSelection
@@ -1,4 +1,4 @@
1
- import { getFirstBlock, getSelectedBlocks, getLastBlock, selectionIsCollapsed, getFocusSpan, getFocusTextBlock, getFocusBlock } from "../_chunks-es/selectors.js";
1
+ import { getFirstBlock, getSelectedBlocks, getLastBlock, isSelectionCollapsed, getFocusSpan, getFocusTextBlock, getFocusBlock } from "../_chunks-es/selector.is-selection-collapsed.js";
2
2
  import { defineBehavior, isHotkey, spanSelectionPointToBlockOffset, getTextBlockText } from "../_chunks-es/behavior.core.js";
3
3
  import { coreBehavior, coreBehaviors } from "../_chunks-es/behavior.core.js";
4
4
  import { isPortableTextTextBlock } from "@sanity/types";
@@ -58,7 +58,7 @@ function createLinkBehaviors(config) {
58
58
  event
59
59
  }) => {
60
60
  var _a;
61
- const selectionCollapsed = selectionIsCollapsed({
61
+ const selectionCollapsed = isSelectionCollapsed({
62
62
  context
63
63
  }), text = event.data.getData("text/plain"), url = looksLikeUrl(text) ? text : void 0, annotation = url !== void 0 ? (_a = config.linkAnnotation) == null ? void 0 : _a.call(config, {
64
64
  url,
@@ -83,7 +83,7 @@ function createLinkBehaviors(config) {
83
83
  var _a;
84
84
  const focusSpan = getFocusSpan({
85
85
  context
86
- }), selectionCollapsed = selectionIsCollapsed({
86
+ }), selectionCollapsed = isSelectionCollapsed({
87
87
  context
88
88
  });
89
89
  if (!focusSpan || !selectionCollapsed)
@@ -135,7 +135,7 @@ function createMarkdownBehaviors(config) {
135
135
  var _a, _b, _c;
136
136
  if (event.text !== " ")
137
137
  return !1;
138
- const selectionCollapsed = selectionIsCollapsed({
138
+ const selectionCollapsed = isSelectionCollapsed({
139
139
  context
140
140
  }), focusTextBlock = getFocusTextBlock({
141
141
  context
@@ -200,7 +200,7 @@ function createMarkdownBehaviors(config) {
200
200
  return !1;
201
201
  const hrObject = (_a = config.horizontalRuleObject) == null ? void 0 : _a.call(config, context), focusBlock = getFocusTextBlock({
202
202
  context
203
- }), selectionCollapsed = selectionIsCollapsed({
203
+ }), selectionCollapsed = isSelectionCollapsed({
204
204
  context
205
205
  });
206
206
  if (!hrObject || !focusBlock || !selectionCollapsed)
@@ -290,7 +290,7 @@ function createMarkdownBehaviors(config) {
290
290
  var _a, _b, _c;
291
291
  if (event.text !== " ")
292
292
  return !1;
293
- const selectionCollapsed = selectionIsCollapsed({
293
+ const selectionCollapsed = isSelectionCollapsed({
294
294
  context
295
295
  }), focusTextBlock = getFocusTextBlock({
296
296
  context
@@ -356,7 +356,7 @@ function createMarkdownBehaviors(config) {
356
356
  context
357
357
  }) => {
358
358
  var _a, _b;
359
- const selectionCollapsed = selectionIsCollapsed({
359
+ const selectionCollapsed = isSelectionCollapsed({
360
360
  context
361
361
  }), focusTextBlock = getFocusTextBlock({
362
362
  context
@@ -388,7 +388,7 @@ function createMarkdownBehaviors(config) {
388
388
  var _a, _b, _c, _d, _e;
389
389
  if (event.text !== " ")
390
390
  return !1;
391
- const selectionCollapsed = selectionIsCollapsed({
391
+ const selectionCollapsed = isSelectionCollapsed({
392
392
  context
393
393
  }), focusTextBlock = getFocusTextBlock({
394
394
  context
@@ -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 {\n getFirstBlock,\n getLastBlock,\n getSelectedBlocks,\n} from '../selectors/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 = getFirstBlock({context})\n const selectedBlocks = 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 = getLastBlock({context})\n const selectedBlocks = 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 {getFocusSpan, selectionIsCollapsed} from '../selectors/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 = selectionIsCollapsed({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 = getFocusSpan({context})\n const selectionCollapsed = selectionIsCollapsed({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 {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {\n getFocusBlock,\n getFocusSpan,\n getFocusTextBlock,\n selectionIsCollapsed,\n} from '../selectors/selectors'\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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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 = getFocusTextBlock({context})\n const selectionCollapsed = selectionIsCollapsed({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 = 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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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 = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = 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","getFirstBlock","selectedBlocks","getSelectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","getLastBlock","blocksBelow","length","reverse","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","selectionIsCollapsed","text","data","getData","url","looksLikeUrl","undefined","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","getFocusSpan","annotations","URL","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","getFocusTextBlock","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","getFocusBlock","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.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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"}