@portabletext/editor 1.45.0 → 1.45.2

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 (37) hide show
  1. package/lib/_chunks-cjs/behavior.markdown.cjs +9 -9
  2. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  3. package/lib/_chunks-cjs/editor-provider.cjs +36 -39
  4. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  5. package/lib/_chunks-es/behavior.markdown.js +10 -10
  6. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  7. package/lib/_chunks-es/editor-provider.js +36 -39
  8. package/lib/_chunks-es/editor-provider.js.map +1 -1
  9. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +1 -1
  10. package/lib/behaviors/index.cjs +4 -4
  11. package/lib/behaviors/index.cjs.map +1 -1
  12. package/lib/behaviors/index.d.cts +282 -282
  13. package/lib/behaviors/index.d.ts +282 -282
  14. package/lib/behaviors/index.js +4 -4
  15. package/lib/behaviors/index.js.map +1 -1
  16. package/lib/index.d.cts +8 -8
  17. package/lib/index.d.ts +8 -8
  18. package/lib/plugins/index.cjs +4 -4
  19. package/lib/plugins/index.cjs.map +1 -1
  20. package/lib/plugins/index.d.cts +8 -8
  21. package/lib/plugins/index.d.ts +8 -8
  22. package/lib/plugins/index.js +4 -4
  23. package/lib/plugins/index.js.map +1 -1
  24. package/lib/selectors/index.d.cts +8 -8
  25. package/lib/selectors/index.d.ts +8 -8
  26. package/lib/utils/index.d.cts +8 -8
  27. package/lib/utils/index.d.ts +8 -8
  28. package/package.json +1 -1
  29. package/src/behavior-actions/behavior.action.insert.text.ts +2 -1
  30. package/src/behavior-actions/behavior.actions.ts +0 -9
  31. package/src/behaviors/behavior.abstract.delete.ts +42 -0
  32. package/src/behaviors/behavior.decorator-pair.ts +5 -4
  33. package/src/behaviors/behavior.default.ts +2 -0
  34. package/src/behaviors/behavior.emoji-picker.ts +5 -4
  35. package/src/behaviors/behavior.markdown.ts +10 -9
  36. package/src/behaviors/behavior.types.event.ts +8 -8
  37. package/src/behavior-actions/behavior.action.delete.text.ts +0 -53
@@ -111,7 +111,7 @@ function createEmojiPickerBehaviors(config) {
111
111
  type: "select"
112
112
  });
113
113
  }
114
- }, {
114
+ }, raise({
115
115
  type: "delete.text",
116
116
  at: {
117
117
  anchor: {
@@ -123,7 +123,7 @@ function createEmojiPickerBehaviors(config) {
123
123
  offset: params.textBeforeLength
124
124
  }
125
125
  }
126
- }, {
126
+ }), {
127
127
  type: "insert.text",
128
128
  text: params.emoji
129
129
  }]]
@@ -173,7 +173,7 @@ function createEmojiPickerBehaviors(config) {
173
173
  type: "select"
174
174
  });
175
175
  }
176
- }, {
176
+ }, raise({
177
177
  type: "delete.text",
178
178
  at: {
179
179
  anchor: {
@@ -185,7 +185,7 @@ function createEmojiPickerBehaviors(config) {
185
185
  offset: params.textBeforeLength
186
186
  }
187
187
  }
188
- }, {
188
+ }), {
189
189
  type: "insert.text",
190
190
  text: params.emoji
191
191
  }] : params.action === "navigate up" ? [
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/internal-utils/looks-like-url.ts","../../src/behaviors/behavior.links.ts"],"sourcesContent":["import {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @beta\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.originEvent,\n )\n const firstBlock = selectors.getFirstBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\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 raise({\n type: 'move.block up',\n at,\n }),\n ),\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.originEvent,\n )\n const lastBlock = selectors.getLastBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\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 raise({\n type: 'move.block down',\n at,\n }),\n ),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types.behavior'\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 * @beta\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 * @beta\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: ({snapshot, event}) => {\n if (event.text === ':') {\n return false\n }\n\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\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: 'insert.text',\n guard: ({snapshot, 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(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\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 at: {\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 {\n type: 'insert.text',\n text: params.emoji,\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isEscape = isHotkey('Escape', event.originEvent)\n\n if (isEscape) {\n return {action: 'reset' as const}\n }\n\n const isEnter = isHotkey('Enter', event.originEvent)\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (isEnter || isTab) {\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(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\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 const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (isArrowDown && matches.length > 0) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp && matches.length > 0) {\n return {action: 'navigate up' as const}\n }\n\n return false\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 at: {\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 {\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: ({snapshot, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[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 ]\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","export function looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n const url = new URL(text)\n\n if (!sensibleProtocols.includes(url.protocol)) {\n return false\n }\n\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n\nconst sensibleProtocols = ['http:', 'https:', 'mailto:', 'tel:']\n","import type {EditorSchema} from '../editor/define-schema'\nimport {looksLikeUrl} from '../internal-utils/looks-like-url'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\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 * @beta\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.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: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const focusSpan = selectors.getFocusSpan(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.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"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","snapshot","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","originEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","raise","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","context","onSelectedIndexChanged","selectedIndex","text","test","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","looksLikeUrl","url","URL","sensibleProtocols","includes","protocol","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","dataTransfer","getData","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations"],"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/internal-utils/looks-like-url.ts","../../src/behaviors/behavior.links.ts"],"sourcesContent":["import {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @beta\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.originEvent,\n )\n const firstBlock = selectors.getFirstBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\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 raise({\n type: 'move.block up',\n at,\n }),\n ),\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.originEvent,\n )\n const lastBlock = selectors.getLastBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\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 raise({\n type: 'move.block down',\n at,\n }),\n ),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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 * @beta\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 * @beta\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: ({snapshot, event}) => {\n if (event.text === ':') {\n return false\n }\n\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\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: 'insert.text',\n guard: ({snapshot, 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(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\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 raise({\n type: 'delete.text',\n at: {\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 {\n type: 'insert.text',\n text: params.emoji,\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isEscape = isHotkey('Escape', event.originEvent)\n\n if (isEscape) {\n return {action: 'reset' as const}\n }\n\n const isEnter = isHotkey('Enter', event.originEvent)\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (isEnter || isTab) {\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(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\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 const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (isArrowDown && matches.length > 0) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp && matches.length > 0) {\n return {action: 'navigate up' as const}\n }\n\n return false\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 raise({\n type: 'delete.text',\n at: {\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 {\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: ({snapshot, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[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 ]\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","export function looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n const url = new URL(text)\n\n if (!sensibleProtocols.includes(url.protocol)) {\n return false\n }\n\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n\nconst sensibleProtocols = ['http:', 'https:', 'mailto:', 'tel:']\n","import type {EditorSchema} from '../editor/define-schema'\nimport {looksLikeUrl} from '../internal-utils/looks-like-url'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\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 * @beta\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.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: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const focusSpan = selectors.getFocusSpan(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.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"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","snapshot","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","originEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","raise","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","context","onSelectedIndexChanged","selectedIndex","text","test","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","looksLikeUrl","url","URL","sensibleProtocols","includes","protocol","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","dataTransfer","getData","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations"],"mappings":";;;;;;AAgBO,SAASA,0BAA0BC,QAAmC;AAC3E,SAAO,CACLC,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtBC,YAAAA,mBAAmBC,SACvBP,OAAOQ,qBACPH,MAAMI,WACR,GACMC,aAAaC,cAAwBP,QAAQ,GAC7CQ,iBAAiBD,kBAA4BP,QAAQ,GACrDS,cACJH,YAAYI,KAAKC,SAASH,eAAe,CAAC,GAAGE,KAAKC;AAEpD,aAAI,CAACT,oBAAoB,CAACO,cACjB,KAGF;AAAA,QAACG,OAAOJ,eAAeK,IAAKC,CAAAA,UAAUA,MAAMC,IAAI;AAAA,MAAC;AAAA,IAC1D;AAAA,IACAC,SAAS,CACP,CAACC,GAAG;AAAA,MAACL;AAAAA,IACHA,MAAAA,MAAMC,IAAKK,CAAAA,OACTC,MAAM;AAAA,MACJC,MAAM;AAAA,MACNF;AAAAA,IAAAA,CACD,CACH,CAAC;AAAA,EAEN,CAAA,GACDrB,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtBoB,YAAAA,qBAAqBlB,SACzBP,OAAO0B,uBACPrB,MAAMI,WACR,GACMkB,YAAYhB,aAAuBP,QAAQ,GAC3CQ,iBAAiBD,kBAA4BP,QAAQ,GACrDwB,cACJD,WAAWb,KAAKC,SAChBH,eAAeA,eAAeiB,SAAS,CAAC,GAAGf,KAAKC;AAElD,aAAI,CAACU,sBAAsB,CAACG,cACnB,KAGF;AAAA,QAACZ,OAAOJ,eAAeK,IAAKC,WAAUA,MAAMC,IAAI,EAAEW,QAAQ;AAAA,MAAC;AAAA,IACpE;AAAA,IACAV,SAAS,CACP,CAACC,GAAG;AAAA,MAACL;AAAAA,IACHA,MAAAA,MAAMC,IAAKK,CAAAA,OACTC,MAAM;AAAA,MACJC,MAAM;AAAA,MACNF;AAAAA,IAAAA,CACD,CACH,CAAC;AAAA,EAAA,CAEN,CAAC;AAEN;ACtEA,MAAMS,iBAAiB,sBACjBC,uBAAuB,sBACvBC,aAAa;AAqBZ,SAASC,2BACdlC,QACA;AACMmC,QAAAA,mBAAmBC,YAAYC,0BAAuC;AAC5EF,SAAAA,iBAAiBG,MAAM,GACvBH,iBAAiBI,UAAWC,CAAU,UAAA;AACpCxC,WAAOyC,iBAAiB;AAAA,MAACC,SAASF,MAAMG,QAAQD;AAAAA,IAAAA,CAAQ,GACxD1C,OAAO4C,uBAAuB;AAAA,MAACC,eAAeL,MAAMG,QAAQE;AAAAA,IAAAA,CAAc;AAAA,EAAA,CAC3E,GAEM,CACL5C,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,UAAIA,MAAMyC,SAAS;AACV,eAAA;AAKT,UAAI,CAFgBf,eAAegB,KAAK1C,MAAMyC,IAAI;AAGzC,eAAA;AAAA,UAACE,QAAQ,CAAA;AAAA,QAAE;AAGpB,YAAMC,aAAatC,kBAA4BP,QAAQ,GAEjD8C,eAAe,GADFvC,mBAA6BP,QAAQ,CACtB,GAAGC,MAAMyC,IAAI,GAAGK,MAChDnB,oBACF,IAAI,CAAC;AAED,aAAA,CAACiB,cAAcC,iBAAiBE,SAC3B;AAAA,QAACJ,QAAQ,CAAA;AAAA,MAAA,IAKX;AAAA,QAACA,QAFOhD,OAAOqD,YAAY;AAAA,UAACC,SAASJ;AAAAA,QAAa,CAAA;AAAA,MAE3C;AAAA,IAChB;AAAA,IACA9B,SAAS,CACP,CAACC,GAAGkC,WAAW,CACb;AAAA,MACE/B,MAAM;AAAA,MACNgC,QAAQA,MAAM;AACZrB,yBAAiBsB,KAAK;AAAA,UACpBjC,MAAM;AAAA,UACNkB,SAASa,OAAOP;AAAAA,QAAAA,CACjB;AAAA,MAAA;AAAA,IACH,CACD,CACF;AAAA,EAEJ,CAAA,GACD/C,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAGxB,UAFYA,MAAMyC,SAAS;AAGtB,eAAA;AAGT,YAAMJ,UAAUP,iBAAiBuB,YAAAA,EAAcf,QAAQD,SACjDG,gBACJV,iBAAiBuB,YAAY,EAAEf,QAAQE,eACnCc,QAAQjB,QAAQG,aAAa,IAC/B7C,OAAO4D,WAAW;AAAA,QAACT,OAAOT,QAAQG,aAAa;AAAA,MAAA,CAAE,IACjDO,QAEEH,aAAatC,kBAA4BP,QAAQ,GACjDyD,aAAalD,mBAA6BP,QAAQ,GAClD8C,eAAe,GAAGW,UAAU,IAAIV,MAAMlB,UAAU,IAAI,CAAC;AAEvD,UAAA,CAACgB,cAAcC,iBAAiBE;AAC3B,eAAA;AAGHU,YAAAA,oBAAoBZ,aAAarB,SAAS;AAEhD,aAAI8B,QACK;AAAA,QACLV;AAAAA,QACAU;AAAAA,QACAG;AAAAA,QACAC,kBAAkBF,WAAWhC,SAAS;AAAA,MAAA,IAInC;AAAA,IACT;AAAA,IACAT,SAAS,CACP,MAAM,CACJ;AAAA,MACEI,MAAM;AAAA,MACNsB,MAAM;AAAA,IAAA,CACP,GAEH,CAACzB,GAAGkC,WAAW,CACb;AAAA,MACE/B,MAAM;AAAA,MACNgC,QAAQA,MAAM;AACZrB,yBAAiBsB,KAAK;AAAA,UAACjC,MAAM;AAAA,QAAA,CAAS;AAAA,MAAA;AAAA,OAG1CD,MAAM;AAAA,MACJC,MAAM;AAAA,MACNF,IAAI;AAAA,QACF0C,QAAQ;AAAA,UACN7C,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB8C,QAAQV,OAAOQ,mBAAmBR,OAAOO;AAAAA,QAC3C;AAAA,QACAI,OAAO;AAAA,UACL/C,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB8C,QAAQV,OAAOQ;AAAAA,QAAAA;AAAAA,MACjB;AAAA,IACF,CACD,GACD;AAAA,MACEvC,MAAM;AAAA,MACNsB,MAAMS,OAAOI;AAAAA,IAAAA,CACd,CACF;AAAA,EAEJ,CAAA,GACD1D,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,YAAMqC,UAAUP,iBAAiBuB,YAAY,EAAEf,QAAQD;AAEvD,UAAIA,QAAQb,WAAW;AACd,eAAA;AAGQtB,UAAAA,SAAS,UAAUF,MAAMI,WAAW;AAG5C,eAAA;AAAA,UAAC0D,QAAQ;AAAA,QAAgB;AAG5BC,YAAAA,UAAU7D,SAAS,SAASF,MAAMI,WAAW,GAC7C4D,QAAQ9D,SAAS,OAAOF,MAAMI,WAAW;AAE/C,UAAI2D,WAAWC,OAAO;AACdxB,cAAAA,gBACJV,iBAAiBuB,YAAAA,EAAcf,QAAQE,eAEnCc,QAAQjB,QAAQG,aAAa,IAC/B7C,OAAO4D,WAAW;AAAA,UAACT,OAAOT,QAAQG,aAAa;AAAA,QAAE,CAAA,IACjDO;AAEJ,YAAI,CAACO;AACI,iBAAA;AAGT,cAAMV,aAAatC,kBAA4BP,QAAQ,GACjDyD,aAAalD,mBAA6BP,QAAQ,GAClD8C,eAAeW,WAAWV,MAAMnB,oBAAoB,IAAI,CAAC;AAE3D,YAAA,CAACiB,cAAcC,iBAAiBE;AAC3B,iBAAA;AAGHU,cAAAA,oBAAoBZ,aAAarB,SAAS;AAEhD,eAAI8B,QACK;AAAA,UACLQ,QAAQ;AAAA,UACRlB;AAAAA,UACAU;AAAAA,UACAG;AAAAA,UACAC,kBAAkBF,WAAWhC;AAAAA,QAAAA,IAI1B;AAAA,MAAA;AAGHyC,YAAAA,cAAc/D,SAAS,aAAaF,MAAMI,WAAW,GACrD8D,YAAYhE,SAAS,WAAWF,MAAMI,WAAW;AAEnD6D,aAAAA,eAAe5B,QAAQb,SAAS,IAC3B;AAAA,QAACsC,QAAQ;AAAA,MAGdI,IAAAA,aAAa7B,QAAQb,SAAS,IACzB;AAAA,QAACsC,QAAQ;AAAA,MAAA,IAGX;AAAA,IACT;AAAA,IACA/C,SAAS,CACP,CAACC,GAAGkC,WACEA,OAAOY,WAAW,WACb,CACL;AAAA,MACE3C,MAAM;AAAA,MACNgC,QAAQA,MAAM;AACZrB,yBAAiBsB,KAAK;AAAA,UAACjC,MAAM;AAAA,QAAA,CAAS;AAAA,MAAA;AAAA,OAG1CD,MAAM;AAAA,MACJC,MAAM;AAAA,MACNF,IAAI;AAAA,QACF0C,QAAQ;AAAA,UACN7C,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB8C,QAAQV,OAAOQ,mBAAmBR,OAAOO;AAAAA,QAC3C;AAAA,QACAI,OAAO;AAAA,UACL/C,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB8C,QAAQV,OAAOQ;AAAAA,QAAAA;AAAAA,MACjB;AAAA,IACF,CACD,GACD;AAAA,MACEvC,MAAM;AAAA,MACNsB,MAAMS,OAAOI;AAAAA,IAAAA,CACd,IAIDJ,OAAOY,WAAW,gBACb;AAAA;AAAA;AAAA,MAGL;AAAA,QACE3C,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACEA,MAAM;AAAA,QACNgC,QAAQA,MAAM;AACZrB,2BAAiBsB,KAAK;AAAA,YAACjC,MAAM;AAAA,UAAA,CAAc;AAAA,QAAA;AAAA,MAC7C;AAAA,IACF,IAIA+B,OAAOY,WAAW,kBACb;AAAA;AAAA;AAAA,MAGL;AAAA,QACE3C,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACEA,MAAM;AAAA,QACNgC,QAAQA,MAAM;AACZrB,2BAAiBsB,KAAK;AAAA,YAACjC,MAAM;AAAA,UAAA,CAAgB;AAAA,QAAA;AAAA,MAC/C;AAAA,IACF,IAIG,CACL;AAAA,MACEA,MAAM;AAAA,MACNgC,QAAQA,MAAM;AACZrB,yBAAiBsB,KAAK;AAAA,UAACjC,MAAM;AAAA,QAAA,CAAQ;AAAA,MAAA;AAAA,IACvC,CACD,CAEJ;AAAA,EAEJ,CAAA,GACDvB,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACxBA,UAAAA,MAAMmE,SAAS,eAIHrC,iBAAiBuB,cAAcf,QAAQD,QAE3Cb,WAAW;AACd,eAAA;AAGHoB,YAAAA,aAAatC,kBAA4BP,QAAQ,GACjDyD,aAAalD,mBAA6BP,QAAQ,GAClD8C,eAAeW,WAClBY,MAAM,GAAGZ,WAAWhC,SAAS,CAAC,EAC9BsB,MAAMnB,oBAAoB,IAAI,CAAC;AAE9B,aAAA,CAACiB,cAAcC,iBAAiBE,SAC3B;AAAA,QAACJ,QAAQ,CAAA;AAAA,MAAA,IAKX;AAAA,QAACA,QAFOhD,OAAOqD,YAAY;AAAA,UAACC,SAASJ;AAAAA,QAAa,CAAA;AAAA,MAE3C;AAAA,IAChB;AAAA,IACA9B,SAAS,CACP,CAACC,GAAGkC,WAAW,CACb;AAAA,MACE/B,MAAM;AAAA,MACNgC,QAAQA,MAAM;AACZrB,yBAAiBsB,KAAK;AAAA,UACpBjC,MAAM;AAAA,UACNkB,SAASa,OAAOP;AAAAA,QAAAA,CACjB;AAAA,MAAA;AAAA,IACH,CACD,CACF;AAAA,EAAA,CAEJ,CAAC;AAEN;AAEA,SAASX,2BAA+C;AACtD,SAAOqC,MAAM;AAAA,IACXC,OAAO;AAAA,MACLhC,SAAS,CAAC;AAAA,MAIViC,QAAQ,CAAA;AAAA,IAQV;AAAA,IACAxD,SAAS;AAAA,MACP,kBAAkByD,OAAO;AAAA,QACvBnC,SAASA,CAAC;AAAA,UAACrC;AAAAA,QACTyE,OAAAA,YAAYzE,OAAO,cAAc,GAC1BA,MAAMqC;AAAAA,MAAAA,CAEhB;AAAA,MACD,iBAAiBmC,OAAO;AAAA,QACtBnC,SAAS,CAAA;AAAA,MAAA,CACV;AAAA,MACD,wBAAwBmC,OAAO;AAAA,QAC7BhC,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BgC,OAAO;AAAA,QACjChC,eAAeA,CAAC;AAAA,UAACF;AAAAA,QAAAA,MACXA,QAAQE,kBAAkBF,QAAQD,QAAQb,SAAS,IAC9C,IAEFc,QAAQE,gBAAgB;AAAA,MAAA,CAElC;AAAA,MACD,4BAA4BgC,OAAO;AAAA,QACjChC,eAAeA,CAAC;AAAA,UAACF;AAAAA,QAAAA,MACXA,QAAQE,kBAAkB,IACrBF,QAAQD,QAAQb,SAAS,IAE3Bc,QAAQE,gBAAgB;AAAA,MAElC,CAAA;AAAA,IACH;AAAA,IACAkC,QAAQ;AAAA,MACN,cAAcC,CAAC;AAAA,QAACrC;AAAAA,MAAAA,MAAaA,QAAQD,QAAQb,WAAW;AAAA,IAAA;AAAA,EAE3D,CAAA,EAAEoD,cAAc;AAAA,IACfC,IAAI;AAAA,IACJvC,SAAS;AAAA,MACPD,SAAS,CAAE;AAAA,MACXG,eAAe;AAAA,IACjB;AAAA,IACAsC,SAAS;AAAA,IACTC,QAAQ;AAAA,MACN,MAAQ;AAAA,QACNlF,IAAI;AAAA,UACF,gBAAgB;AAAA,YACdkB,SAAS;AAAA,YACTiE,QAAQ;AAAA,UAAA;AAAA,QACV;AAAA,MAEJ;AAAA,MACA,mBAAmB;AAAA,QACjBC,QAAQ;AAAA,UACNnF,OAAO;AAAA,UACPkF,QAAQ;AAAA,QACV;AAAA,QACAE,MAAM,CAAC,sBAAsB;AAAA,QAC7BrF,IAAI;AAAA,UACF,gBAAgB;AAAA,YACdkB,SAAS;AAAA,UACX;AAAA,UACA,iBAAiB;AAAA,YACfA,SAAS;AAAA,UACX;AAAA,UACA,eAAe;AAAA,YACbA,SAAS;AAAA,UACX;AAAA,UACA,OAAS;AAAA,YACPiE,QAAQ;AAAA,YACRjE,SAAS,CAAC,wBAAwB,eAAe;AAAA,UACnD;AAAA,UACA,QAAU;AAAA,YACRiE,QAAQ;AAAA,YACRjE,SAAS,CAAC,wBAAwB,eAAe;AAAA,UAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CACD;AACH;AC5aO,SAASoE,aAAa1C,MAAc;AACzC,MAAI0C,gBAAe;AACf,MAAA;AACIC,UAAAA,MAAM,IAAIC,IAAI5C,IAAI;AAExB,QAAI,CAAC6C,kBAAkBC,SAASH,IAAII,QAAQ;AACnC,aAAA;AAGTL,oBAAe;AAAA,EAAA,QACT;AAAA,EAAA;AACDA,SAAAA;AACT;AAEA,MAAMG,oBAAoB,CAAC,SAAS,UAAU,WAAW,MAAM;ACIxD,SAASG,oBAAoB9F,QAA6B;AAC/D,QAAM+F,uBAAuB9F,eAAe;AAAA,IAC1CC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtB2F,YAAAA,qBAAqBrF,qBAA+BP,QAAQ,GAC5D0C,OAAOzC,MAAMI,YAAYwF,aAAaC,QAAQ,YAAY,GAC1DT,MAAMD,aAAa1C,IAAI,IAAIA,OAAOM,QAClC+C,aACJV,QAAQrC,SACJpD,OAAOoG,iBAAiB;AAAA,QAACX;AAAAA,QAAKY,QAAQjG,SAASuC,QAAQ0D;AAAAA,MAAO,CAAA,IAC9DjD;AAEF+C,aAAAA,cAAc,CAACH,qBACV;AAAA,QAACG;AAAAA,MAAAA,IAGH;AAAA,IACT;AAAA,IACA/E,SAAS,CACP,CAACC,GAAG;AAAA,MAAC8E;AAAAA,IAAAA,MAAgB,CACnB;AAAA,MACE3E,MAAM;AAAA,MACN2E;AAAAA,IAAAA,CACD,CACF;AAAA,EAAA,CAEJ,GACKG,mBAAmBrG,eAAe;AAAA,IACtCC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtBkG,YAAAA,YAAY5F,aAAuBP,QAAQ,GAC3C4F,qBAAqBrF,qBAA+BP,QAAQ;AAE9D,UAAA,CAACmG,aAAa,CAACP;AACV,eAAA;AAGT,YAAMlD,OAAOzC,MAAMI,YAAYwF,aAAaC,QAAQ,YAAY,GAC1DT,MAAMD,aAAa1C,IAAI,IAAIA,OAAOM,QAClC+C,aACJV,QAAQrC,SACJpD,OAAOoG,iBAAiB;AAAA,QAACX;AAAAA,QAAKY,QAAQjG,SAASuC,QAAQ0D;AAAAA,MAAO,CAAA,IAC9DjD;AAEFqC,aAAAA,OAAOU,cAAcH,qBAChB;AAAA,QAACO;AAAAA,QAAWJ;AAAAA,QAAYV;AAAAA,MAAAA,IAG1B;AAAA,IACT;AAAA,IACArE,SAAS,CACP,CAACC,GAAG;AAAA,MAAC8E;AAAAA,MAAYV;AAAAA,IAAAA,MAAS,CACxB;AAAA,MACEjE,MAAM;AAAA,MACNsB,MAAM2C;AAAAA,MACNe,aAAa,CAACL,UAAU;AAAA,IAAA,CACzB,CACF;AAAA,EAAA,CAEJ;AAEqB,SAAA,CAACJ,sBAAsBO,gBAAgB;AAG/D;"}
package/lib/index.d.cts CHANGED
@@ -84,6 +84,13 @@ declare type AbstractBehaviorEvent =
84
84
  focus: BlockOffset
85
85
  }
86
86
  }
87
+ | {
88
+ type: StrictExtract<AbstractBehaviorEventType, 'delete.text'>
89
+ at: {
90
+ anchor: BlockOffset
91
+ focus: BlockOffset
92
+ }
93
+ }
87
94
  | {
88
95
  type: StrictExtract<AbstractBehaviorEventType, 'deserialize'>
89
96
  originEvent:
@@ -210,6 +217,7 @@ declare type AbstractBehaviorEventType =
210
217
  declare const abstractBehaviorEventTypes: readonly [
211
218
  'annotation.toggle',
212
219
  'decorator.toggle',
220
+ 'delete.text',
213
221
  'deserialize',
214
222
  'deserialization.success',
215
223
  'deserialization.failure',
@@ -6230,13 +6238,6 @@ declare type SyntheticBehaviorEvent =
6230
6238
  type: StrictExtract<SyntheticBehaviorEventType, 'delete.forward'>
6231
6239
  unit: TextUnit
6232
6240
  }
6233
- | {
6234
- type: StrictExtract<SyntheticBehaviorEventType, 'delete.text'>
6235
- at: {
6236
- anchor: BlockOffset
6237
- focus: BlockOffset
6238
- }
6239
- }
6240
6241
  | {
6241
6242
  type: StrictExtract<SyntheticBehaviorEventType, 'focus'>
6242
6243
  }
@@ -6310,7 +6311,6 @@ declare const syntheticBehaviorEventTypes: readonly [
6310
6311
  'delete.backward',
6311
6312
  'delete.block',
6312
6313
  'delete.forward',
6313
- 'delete.text',
6314
6314
  'focus',
6315
6315
  'history.redo',
6316
6316
  'history.undo',
package/lib/index.d.ts CHANGED
@@ -84,6 +84,13 @@ declare type AbstractBehaviorEvent =
84
84
  focus: BlockOffset
85
85
  }
86
86
  }
87
+ | {
88
+ type: StrictExtract<AbstractBehaviorEventType, 'delete.text'>
89
+ at: {
90
+ anchor: BlockOffset
91
+ focus: BlockOffset
92
+ }
93
+ }
87
94
  | {
88
95
  type: StrictExtract<AbstractBehaviorEventType, 'deserialize'>
89
96
  originEvent:
@@ -210,6 +217,7 @@ declare type AbstractBehaviorEventType =
210
217
  declare const abstractBehaviorEventTypes: readonly [
211
218
  'annotation.toggle',
212
219
  'decorator.toggle',
220
+ 'delete.text',
213
221
  'deserialize',
214
222
  'deserialization.success',
215
223
  'deserialization.failure',
@@ -6230,13 +6238,6 @@ declare type SyntheticBehaviorEvent =
6230
6238
  type: StrictExtract<SyntheticBehaviorEventType, 'delete.forward'>
6231
6239
  unit: TextUnit
6232
6240
  }
6233
- | {
6234
- type: StrictExtract<SyntheticBehaviorEventType, 'delete.text'>
6235
- at: {
6236
- anchor: BlockOffset
6237
- focus: BlockOffset
6238
- }
6239
- }
6240
6241
  | {
6241
6242
  type: StrictExtract<SyntheticBehaviorEventType, 'focus'>
6242
6243
  }
@@ -6310,7 +6311,6 @@ declare const syntheticBehaviorEventTypes: readonly [
6310
6311
  'delete.backward',
6311
6312
  'delete.block',
6312
6313
  'delete.forward',
6313
- 'delete.text',
6314
6314
  'focus',
6315
6315
  'history.redo',
6316
6316
  'history.undo',
@@ -136,15 +136,15 @@ function createDecoratorPairBehavior(config) {
136
136
  }
137
137
  },
138
138
  // Delete the suffix
139
- {
139
+ behavior_core.raise({
140
140
  type: "delete.text",
141
141
  at: suffixOffsets
142
- },
142
+ }),
143
143
  // Delete the prefix
144
- {
144
+ behavior_core.raise({
145
145
  type: "delete.text",
146
146
  at: prefixOffsets
147
- },
147
+ }),
148
148
  // Toggle the decorator off so the next inserted text isn't emphasized
149
149
  {
150
150
  type: "decorator.remove",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.core.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.decorator-pair.ts","../../src/plugins/plugin.decorator-shortcut.ts","../../src/plugins/plugin.editor-ref.tsx","../../src/plugins/plugin.event-listener.tsx","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => unregister())\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","import {coreBehaviors} from '../behaviors'\nimport {BehaviorPlugin} from './plugin.behavior'\n\n/**\n * @beta\n */\nexport function CoreBehaviorsPlugin() {\n return <BehaviorPlugin behaviors={coreBehaviors} />\n}\n","export function createPairRegex(char: string, amount: number) {\n // Negative lookbehind: Ensures that the matched sequence is not preceded by the same character\n const prePrefix = `(?<!\\\\${char})`\n\n // Repeats the character `amount` times\n const prefix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the opening pair (**, *, etc.) is not followed by a space\n const postPrefix = `(?!\\\\s)`\n\n // Captures the content inside the pair\n const content = `([^${char}\\\\n]+?)`\n\n // Negative lookbehind: Ensures that the content is not followed by a space\n const preSuffix = `(?<!\\\\s)`\n\n // Repeats the character `amount` times\n const suffix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the matched sequence is not followed by the same character\n const postSuffix = `(?!\\\\${char})`\n\n return `${prePrefix}${prefix}${postPrefix}${content}${preSuffix}${suffix}${postSuffix}`\n}\n\nconst italicRegex = new RegExp(\n `(${createPairRegex('*', 1)}|${createPairRegex('_', 1)})$`,\n)\n\nconst boldRegex = new RegExp(\n `(${createPairRegex('*', 2)}|${createPairRegex('_', 2)})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import type {EditorSchema} from '../editor/define-schema'\nimport {createPairRegex} from '../internal-utils/get-text-to-emphasize'\nimport * as selectors from '../selectors'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\nimport {defineBehavior} from './behavior.types.behavior'\n\nexport function createDecoratorPairBehavior(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n onDecorate: (offset: BlockOffset) => void\n}) {\n if (config.pair.amount < 1) {\n console.warn(\n `The amount of characters in the pair should be greater than 0`,\n )\n }\n\n const pairRegex = createPairRegex(config.pair.char, config.pair.amount)\n const regEx = new RegExp(`(${pairRegex})$`)\n\n return defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (config.pair.amount < 1) {\n return false\n }\n\n const decorator = config.decorator({schema: snapshot.context.schema})\n\n if (decorator === undefined) {\n return false\n }\n\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionStartPoint = selectors.getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? utils.spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const newText = `${textBefore}${event.text}`\n const textToDecorate = newText.match(regEx)?.at(0)\n\n if (textToDecorate === undefined) {\n return false\n }\n\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length = 4\n offset: newText.length - textToDecorate.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length + \"*\".length * 2 = 6\n offset:\n newText.length -\n textToDecorate.length +\n config.pair.char.length * config.pair.amount,\n },\n }\n\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length - 2 = 9\n offset:\n selectionStartOffset.offset +\n event.text.length -\n config.pair.char.length * config.pair.amount,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length = 11\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n // If the prefix is more than one character, then we need to check if\n // there is an inline object inside it\n if (prefixOffsets.focus.offset - prefixOffsets.anchor.offset > 1) {\n const prefixSelection = utils.blockOffsetsToSelection({\n value: snapshot.context.value,\n offsets: prefixOffsets,\n })\n const inlineObjectBeforePrefixFocus = selectors.getPreviousInlineObject(\n {\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: prefixSelection\n ? {\n anchor: prefixSelection.focus,\n focus: prefixSelection.focus,\n }\n : null,\n },\n },\n )\n const inlineObjectBeforePrefixFocusOffset =\n inlineObjectBeforePrefixFocus\n ? utils.childSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: inlineObjectBeforePrefixFocus.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n inlineObjectBeforePrefixFocusOffset &&\n inlineObjectBeforePrefixFocusOffset.offset >\n prefixOffsets.anchor.offset &&\n inlineObjectBeforePrefixFocusOffset.offset <\n prefixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n // If the suffix is more than one character, then we need to check if\n // there is an inline object inside it\n if (suffixOffsets.focus.offset - suffixOffsets.anchor.offset > 1) {\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const previousInlineObjectOffset = previousInlineObject\n ? utils.childSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: previousInlineObject.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n previousInlineObjectOffset &&\n previousInlineObjectOffset.offset > suffixOffsets.anchor.offset &&\n previousInlineObjectOffset.offset < suffixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator,\n }\n },\n actions: [\n // Insert the text as usual in its own undo step\n ({event}) => [event],\n (_, {prefixOffsets, suffixOffsets, decorator}) => [\n // Decorate the text between the prefix and suffix\n {\n type: 'decorator.add',\n decorator,\n at: {\n anchor: prefixOffsets.focus,\n focus: suffixOffsets.anchor,\n },\n },\n // Delete the suffix\n {\n type: 'delete.text',\n at: suffixOffsets,\n },\n // Delete the prefix\n {\n type: 'delete.text',\n at: prefixOffsets,\n },\n // Toggle the decorator off so the next inserted text isn't emphasized\n {\n type: 'decorator.remove',\n decorator,\n },\n {\n type: 'effect',\n effect: () => {\n config.onDecorate({\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n })\n },\n },\n ],\n ],\n })\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport {createDecoratorPairBehavior} from '../behaviors/behavior.decorator-pair'\nimport {defineBehavior} from '../behaviors/behavior.types.behavior'\nimport type {Editor} from '../editor/create-editor'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {useEditor} from '../editor/editor-provider'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\n\n/**\n * @beta\n */\nexport function DecoratorShortcutPlugin(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n}) {\n const editor = useEditor()\n\n useActorRef(decoratorPairMachine, {\n input: {\n editor,\n decorator: config.decorator,\n pair: config.pair,\n },\n })\n\n return null\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: BlockOffset\n focus: BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n }\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: createDecoratorPairBehavior({\n decorator: input.decorator,\n pair: input.pair,\n onDecorate: (offset) => {\n sendBack({type: 'emphasis.add', blockOffset: offset})\n },\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({snapshot, event}) => {\n if (!event.at) {\n return {blockOffsets: undefined}\n }\n\n const anchor = utils.spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: event.at.anchor,\n })\n const focus = utils.spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: event.at.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n (_, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n {\n type: 'history.undo',\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'delete.backward'})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst decoratorPairMachine = setup({\n types: {\n context: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n offsetAfterEmphasis?: BlockOffset\n pair: {char: string; amount: number}\n },\n input: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'decorator pair',\n context: ({input}) => ({\n decorator: input.decorator,\n editor: input.editor,\n pair: input.pair,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n decorator: context.decorator,\n editor: context.editor,\n pair: context.pair,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","import {useEffect} from 'react'\nimport {useEffectEvent} from 'use-effect-event'\nimport type {EditorEmittedEvent} from '../editor/editor-machine'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @public\n * Listen for events emitted by the editor. Must be used inside `EditorProvider`. Events available include:\n * - 'blurred'\n * - 'done loading'\n * - 'editable'\n * - 'error'\n * - 'focused'\n * - 'invalid value'\n * - 'loading'\n * - 'mutation'\n * - 'patch'\n * - 'read only'\n * - 'ready'\n * - 'selection'\n * - 'value changed'\n *\n * @example\n * Listen and log events.\n * ```tsx\n * import {EditorProvider} from '@portabletext/editor'\n * import {EventListenerPlugin} from '@portabletext/editor/plugins'\n *\n * function MyComponent() {\n * return (\n * <EditorProvider>\n * <EventListenerPlugin\n * on={(event) => {\n * console.log(event)\n * }\n * } />\n * { ... }\n * </EditorProvider>\n * )\n * }\n * ```\n * @example\n * Handle events when there is a mutation.\n * ```tsx\n * <EventListenerPlugin\n * on={(event) => {\n * if (event.type === 'mutation') {\n * console.log('Value changed:', event.snapshot)\n * }\n * }}\n * />\n * ```\n * @group Components\n */\nexport function EventListenerPlugin(props: {\n on: (event: EditorEmittedEvent) => void\n}) {\n const editor = useEditor()\n const on = useEffectEvent(props.on)\n\n useEffect(() => {\n const subscription = editor.on('*', on)\n\n return () => {\n subscription.unsubscribe()\n }\n }, [editor])\n\n return null\n}\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {useEditor} from '../editor/editor-provider'\nimport {DecoratorShortcutPlugin} from './plugin.decorator-shortcut'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * codeDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'code')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\n * strikeThroughDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strike-through')?.value,\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return (\n <>\n {props.config.boldDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {props.config.codeDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {props.config.italicDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {props.config.strikeThroughDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n </>\n )\n}\n","import {defineBehavior, raise} from '../behaviors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) =>\n snapshot.context.selection && selectors.isSelectionExpanded(snapshot)\n ? {selection: snapshot.context.selection}\n : false,\n actions: [(_, {selection}) => [{type: 'delete', at: selection}]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `split.block`s as well.\n */\n defineBehavior({\n on: 'split.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({snapshot, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(snapshot.context, event.block)\n ) {\n return false\n }\n\n return true\n },\n actions: [\n ({event}) => [\n {\n type: 'insert.block',\n block: event.block,\n placement: 'auto',\n select: 'end',\n },\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({snapshot, event}) => {\n return event.blocks\n .filter((block) => utils.isTextBlock(snapshot.context, block))\n .reduce((targetBlock, incomingBlock) => {\n return utils.mergeTextBlocks({\n context: snapshot.context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","CoreBehaviorsPlugin","Symbol","for","jsx","coreBehaviors","createPairRegex","char","amount","prePrefix","prefix","repeat","Math","max","postPrefix","content","preSuffix","suffix","postSuffix","createDecoratorPairBehavior","config","pair","console","warn","pairRegex","regEx","RegExp","defineBehavior","on","guard","snapshot","event","decorator","schema","context","undefined","focusTextBlock","selectors","selectionStartPoint","selectionStartOffset","utils","value","selectionPoint","newText","text","textToDecorate","match","at","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","prefixSelection","offsets","inlineObjectBeforePrefixFocus","selection","inlineObjectBeforePrefixFocusOffset","previousInlineObject","previousInlineObjectOffset","actions","_","type","effect","onDecorate","DecoratorShortcutPlugin","input","useActorRef","decoratorPairMachine","emphasisListener","sendBack","blockOffset","selectionListenerCallback","blockOffsets","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","EditorRefPlugin","React","forwardRef","ref","portableTextEditorRef","useRef","current","useImperativeHandle","displayName","EventListenerPlugin","useEffectEvent","subscription","unsubscribe","MarkdownPlugin","createMarkdownBehaviors","unregisterBehavior","t2","boldDecorator","jsxs","Fragment","t3","codeDecorator","t4","italicDecorator","t5","strikeThroughDecorator","t6","oneLineBehaviors","isSelectionExpanded","placement","block","select","blocks","filter","reduce","targetBlock","incomingBlock","raise","OneLinePlugin"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.core.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.decorator-pair.ts","../../src/plugins/plugin.decorator-shortcut.ts","../../src/plugins/plugin.editor-ref.tsx","../../src/plugins/plugin.event-listener.tsx","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => unregister())\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","import {coreBehaviors} from '../behaviors'\nimport {BehaviorPlugin} from './plugin.behavior'\n\n/**\n * @beta\n */\nexport function CoreBehaviorsPlugin() {\n return <BehaviorPlugin behaviors={coreBehaviors} />\n}\n","export function createPairRegex(char: string, amount: number) {\n // Negative lookbehind: Ensures that the matched sequence is not preceded by the same character\n const prePrefix = `(?<!\\\\${char})`\n\n // Repeats the character `amount` times\n const prefix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the opening pair (**, *, etc.) is not followed by a space\n const postPrefix = `(?!\\\\s)`\n\n // Captures the content inside the pair\n const content = `([^${char}\\\\n]+?)`\n\n // Negative lookbehind: Ensures that the content is not followed by a space\n const preSuffix = `(?<!\\\\s)`\n\n // Repeats the character `amount` times\n const suffix = `\\\\${char}`.repeat(Math.max(amount, 1))\n\n // Negative lookahead: Ensures that the matched sequence is not followed by the same character\n const postSuffix = `(?!\\\\${char})`\n\n return `${prePrefix}${prefix}${postPrefix}${content}${preSuffix}${suffix}${postSuffix}`\n}\n\nconst italicRegex = new RegExp(\n `(${createPairRegex('*', 1)}|${createPairRegex('_', 1)})$`,\n)\n\nconst boldRegex = new RegExp(\n `(${createPairRegex('*', 2)}|${createPairRegex('_', 2)})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import type {EditorSchema} from '../editor/define-schema'\nimport {createPairRegex} from '../internal-utils/get-text-to-emphasize'\nimport * as selectors from '../selectors'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nexport function createDecoratorPairBehavior(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n onDecorate: (offset: BlockOffset) => void\n}) {\n if (config.pair.amount < 1) {\n console.warn(\n `The amount of characters in the pair should be greater than 0`,\n )\n }\n\n const pairRegex = createPairRegex(config.pair.char, config.pair.amount)\n const regEx = new RegExp(`(${pairRegex})$`)\n\n return defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (config.pair.amount < 1) {\n return false\n }\n\n const decorator = config.decorator({schema: snapshot.context.schema})\n\n if (decorator === undefined) {\n return false\n }\n\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionStartPoint = selectors.getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? utils.spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const newText = `${textBefore}${event.text}`\n const textToDecorate = newText.match(regEx)?.at(0)\n\n if (textToDecorate === undefined) {\n return false\n }\n\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length = 4\n offset: newText.length - textToDecorate.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length + \"*\".length * 2 = 6\n offset:\n newText.length -\n textToDecorate.length +\n config.pair.char.length * config.pair.amount,\n },\n }\n\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length - 2 = 9\n offset:\n selectionStartOffset.offset +\n event.text.length -\n config.pair.char.length * config.pair.amount,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length = 11\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n // If the prefix is more than one character, then we need to check if\n // there is an inline object inside it\n if (prefixOffsets.focus.offset - prefixOffsets.anchor.offset > 1) {\n const prefixSelection = utils.blockOffsetsToSelection({\n value: snapshot.context.value,\n offsets: prefixOffsets,\n })\n const inlineObjectBeforePrefixFocus = selectors.getPreviousInlineObject(\n {\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: prefixSelection\n ? {\n anchor: prefixSelection.focus,\n focus: prefixSelection.focus,\n }\n : null,\n },\n },\n )\n const inlineObjectBeforePrefixFocusOffset =\n inlineObjectBeforePrefixFocus\n ? utils.childSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: inlineObjectBeforePrefixFocus.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n inlineObjectBeforePrefixFocusOffset &&\n inlineObjectBeforePrefixFocusOffset.offset >\n prefixOffsets.anchor.offset &&\n inlineObjectBeforePrefixFocusOffset.offset <\n prefixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n // If the suffix is more than one character, then we need to check if\n // there is an inline object inside it\n if (suffixOffsets.focus.offset - suffixOffsets.anchor.offset > 1) {\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const previousInlineObjectOffset = previousInlineObject\n ? utils.childSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: previousInlineObject.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n previousInlineObjectOffset &&\n previousInlineObjectOffset.offset > suffixOffsets.anchor.offset &&\n previousInlineObjectOffset.offset < suffixOffsets.focus.offset\n ) {\n return false\n }\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator,\n }\n },\n actions: [\n // Insert the text as usual in its own undo step\n ({event}) => [event],\n (_, {prefixOffsets, suffixOffsets, decorator}) => [\n // Decorate the text between the prefix and suffix\n {\n type: 'decorator.add',\n decorator,\n at: {\n anchor: prefixOffsets.focus,\n focus: suffixOffsets.anchor,\n },\n },\n // Delete the suffix\n raise({\n type: 'delete.text',\n at: suffixOffsets,\n }),\n // Delete the prefix\n raise({\n type: 'delete.text',\n at: prefixOffsets,\n }),\n // Toggle the decorator off so the next inserted text isn't emphasized\n {\n type: 'decorator.remove',\n decorator,\n },\n {\n type: 'effect',\n effect: () => {\n config.onDecorate({\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n })\n },\n },\n ],\n ],\n })\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport {createDecoratorPairBehavior} from '../behaviors/behavior.decorator-pair'\nimport {defineBehavior} from '../behaviors/behavior.types.behavior'\nimport type {Editor} from '../editor/create-editor'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {useEditor} from '../editor/editor-provider'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\n\n/**\n * @beta\n */\nexport function DecoratorShortcutPlugin(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n}) {\n const editor = useEditor()\n\n useActorRef(decoratorPairMachine, {\n input: {\n editor,\n decorator: config.decorator,\n pair: config.pair,\n },\n })\n\n return null\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: BlockOffset\n focus: BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n }\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: createDecoratorPairBehavior({\n decorator: input.decorator,\n pair: input.pair,\n onDecorate: (offset) => {\n sendBack({type: 'emphasis.add', blockOffset: offset})\n },\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({snapshot, event}) => {\n if (!event.at) {\n return {blockOffsets: undefined}\n }\n\n const anchor = utils.spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: event.at.anchor,\n })\n const focus = utils.spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: event.at.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n (_, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n {\n type: 'history.undo',\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'delete.backward'})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst decoratorPairMachine = setup({\n types: {\n context: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n offsetAfterEmphasis?: BlockOffset\n pair: {char: string; amount: number}\n },\n input: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'decorator pair',\n context: ({input}) => ({\n decorator: input.decorator,\n editor: input.editor,\n pair: input.pair,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n decorator: context.decorator,\n editor: context.editor,\n pair: context.pair,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","import {useEffect} from 'react'\nimport {useEffectEvent} from 'use-effect-event'\nimport type {EditorEmittedEvent} from '../editor/editor-machine'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @public\n * Listen for events emitted by the editor. Must be used inside `EditorProvider`. Events available include:\n * - 'blurred'\n * - 'done loading'\n * - 'editable'\n * - 'error'\n * - 'focused'\n * - 'invalid value'\n * - 'loading'\n * - 'mutation'\n * - 'patch'\n * - 'read only'\n * - 'ready'\n * - 'selection'\n * - 'value changed'\n *\n * @example\n * Listen and log events.\n * ```tsx\n * import {EditorProvider} from '@portabletext/editor'\n * import {EventListenerPlugin} from '@portabletext/editor/plugins'\n *\n * function MyComponent() {\n * return (\n * <EditorProvider>\n * <EventListenerPlugin\n * on={(event) => {\n * console.log(event)\n * }\n * } />\n * { ... }\n * </EditorProvider>\n * )\n * }\n * ```\n * @example\n * Handle events when there is a mutation.\n * ```tsx\n * <EventListenerPlugin\n * on={(event) => {\n * if (event.type === 'mutation') {\n * console.log('Value changed:', event.snapshot)\n * }\n * }}\n * />\n * ```\n * @group Components\n */\nexport function EventListenerPlugin(props: {\n on: (event: EditorEmittedEvent) => void\n}) {\n const editor = useEditor()\n const on = useEffectEvent(props.on)\n\n useEffect(() => {\n const subscription = editor.on('*', on)\n\n return () => {\n subscription.unsubscribe()\n }\n }, [editor])\n\n return null\n}\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {useEditor} from '../editor/editor-provider'\nimport {DecoratorShortcutPlugin} from './plugin.decorator-shortcut'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * codeDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'code')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\n * strikeThroughDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strike-through')?.value,\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return (\n <>\n {props.config.boldDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {props.config.codeDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {props.config.italicDecorator ? (\n <>\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <DecoratorShortcutPlugin\n decorator={props.config.italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {props.config.strikeThroughDecorator ? (\n <DecoratorShortcutPlugin\n decorator={props.config.strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n </>\n )\n}\n","import {defineBehavior, raise} from '../behaviors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) =>\n snapshot.context.selection && selectors.isSelectionExpanded(snapshot)\n ? {selection: snapshot.context.selection}\n : false,\n actions: [(_, {selection}) => [{type: 'delete', at: selection}]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `split.block`s as well.\n */\n defineBehavior({\n on: 'split.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({snapshot, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(snapshot.context, event.block)\n ) {\n return false\n }\n\n return true\n },\n actions: [\n ({event}) => [\n {\n type: 'insert.block',\n block: event.block,\n placement: 'auto',\n select: 'end',\n },\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({snapshot, event}) => {\n return event.blocks\n .filter((block) => utils.isTextBlock(snapshot.context, block))\n .reduce((targetBlock, incomingBlock) => {\n return utils.mergeTextBlocks({\n context: snapshot.context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","CoreBehaviorsPlugin","Symbol","for","jsx","coreBehaviors","createPairRegex","char","amount","prePrefix","prefix","repeat","Math","max","postPrefix","content","preSuffix","suffix","postSuffix","createDecoratorPairBehavior","config","pair","console","warn","pairRegex","regEx","RegExp","defineBehavior","on","guard","snapshot","event","decorator","schema","context","undefined","focusTextBlock","selectors","selectionStartPoint","selectionStartOffset","utils","value","selectionPoint","newText","text","textToDecorate","match","at","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","prefixSelection","offsets","inlineObjectBeforePrefixFocus","selection","inlineObjectBeforePrefixFocusOffset","previousInlineObject","previousInlineObjectOffset","actions","_","type","raise","effect","onDecorate","DecoratorShortcutPlugin","input","useActorRef","decoratorPairMachine","emphasisListener","sendBack","blockOffset","selectionListenerCallback","blockOffsets","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","EditorRefPlugin","React","forwardRef","ref","portableTextEditorRef","useRef","current","useImperativeHandle","displayName","EventListenerPlugin","useEffectEvent","subscription","unsubscribe","MarkdownPlugin","createMarkdownBehaviors","unregisterBehavior","t2","boldDecorator","jsxs","Fragment","t3","codeDecorator","t4","italicDecorator","t5","strikeThroughDecorator","t6","oneLineBehaviors","isSelectionExpanded","placement","block","select","blocks","filter","reduce","targetBlock","incomingBlock","OneLinePlugin"],"mappings":"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"}
@@ -65,6 +65,13 @@ declare type AbstractBehaviorEvent =
65
65
  focus: BlockOffset
66
66
  }
67
67
  }
68
+ | {
69
+ type: StrictExtract<AbstractBehaviorEventType, 'delete.text'>
70
+ at: {
71
+ anchor: BlockOffset
72
+ focus: BlockOffset
73
+ }
74
+ }
68
75
  | {
69
76
  type: StrictExtract<AbstractBehaviorEventType, 'deserialize'>
70
77
  originEvent:
@@ -191,6 +198,7 @@ declare type AbstractBehaviorEventType =
191
198
  declare const abstractBehaviorEventTypes: readonly [
192
199
  'annotation.toggle',
193
200
  'decorator.toggle',
201
+ 'delete.text',
194
202
  'deserialize',
195
203
  'deserialization.success',
196
204
  'deserialization.failure',
@@ -5311,13 +5319,6 @@ declare type SyntheticBehaviorEvent =
5311
5319
  type: StrictExtract<SyntheticBehaviorEventType, 'delete.forward'>
5312
5320
  unit: TextUnit
5313
5321
  }
5314
- | {
5315
- type: StrictExtract<SyntheticBehaviorEventType, 'delete.text'>
5316
- at: {
5317
- anchor: BlockOffset
5318
- focus: BlockOffset
5319
- }
5320
- }
5321
5322
  | {
5322
5323
  type: StrictExtract<SyntheticBehaviorEventType, 'focus'>
5323
5324
  }
@@ -5391,7 +5392,6 @@ declare const syntheticBehaviorEventTypes: readonly [
5391
5392
  'delete.backward',
5392
5393
  'delete.block',
5393
5394
  'delete.forward',
5394
- 'delete.text',
5395
5395
  'focus',
5396
5396
  'history.redo',
5397
5397
  'history.undo',
@@ -65,6 +65,13 @@ declare type AbstractBehaviorEvent =
65
65
  focus: BlockOffset
66
66
  }
67
67
  }
68
+ | {
69
+ type: StrictExtract<AbstractBehaviorEventType, 'delete.text'>
70
+ at: {
71
+ anchor: BlockOffset
72
+ focus: BlockOffset
73
+ }
74
+ }
68
75
  | {
69
76
  type: StrictExtract<AbstractBehaviorEventType, 'deserialize'>
70
77
  originEvent:
@@ -191,6 +198,7 @@ declare type AbstractBehaviorEventType =
191
198
  declare const abstractBehaviorEventTypes: readonly [
192
199
  'annotation.toggle',
193
200
  'decorator.toggle',
201
+ 'delete.text',
194
202
  'deserialize',
195
203
  'deserialization.success',
196
204
  'deserialization.failure',
@@ -5311,13 +5319,6 @@ declare type SyntheticBehaviorEvent =
5311
5319
  type: StrictExtract<SyntheticBehaviorEventType, 'delete.forward'>
5312
5320
  unit: TextUnit
5313
5321
  }
5314
- | {
5315
- type: StrictExtract<SyntheticBehaviorEventType, 'delete.text'>
5316
- at: {
5317
- anchor: BlockOffset
5318
- focus: BlockOffset
5319
- }
5320
- }
5321
5322
  | {
5322
5323
  type: StrictExtract<SyntheticBehaviorEventType, 'focus'>
5323
5324
  }
@@ -5391,7 +5392,6 @@ declare const syntheticBehaviorEventTypes: readonly [
5391
5392
  'delete.backward',
5392
5393
  'delete.block',
5393
5394
  'delete.forward',
5394
- 'delete.text',
5395
5395
  'focus',
5396
5396
  'history.redo',
5397
5397
  'history.undo',
@@ -144,15 +144,15 @@ function createDecoratorPairBehavior(config) {
144
144
  }
145
145
  },
146
146
  // Delete the suffix
147
- {
147
+ raise({
148
148
  type: "delete.text",
149
149
  at: suffixOffsets
150
- },
150
+ }),
151
151
  // Delete the prefix
152
- {
152
+ raise({
153
153
  type: "delete.text",
154
154
  at: prefixOffsets
155
- },
155
+ }),
156
156
  // Toggle the decorator off so the next inserted text isn't emphasized
157
157
  {
158
158
  type: "decorator.remove",