@portabletext/editor 1.45.4 → 1.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/_chunks-cjs/behavior.core.cjs +20 -0
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +25 -25
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/editor-provider.cjs +37 -3
- package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +20 -0
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +26 -26
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/editor-provider.js +37 -3
- package/lib/_chunks-es/editor-provider.js.map +1 -1
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +1 -1
- package/lib/behaviors/index.cjs +37 -53
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +26 -1
- package/lib/behaviors/index.d.ts +26 -1
- package/lib/behaviors/index.js +38 -54
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.d.cts +7 -1
- package/lib/index.d.ts +7 -1
- package/lib/plugins/index.cjs +23 -29
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +7 -1
- package/lib/plugins/index.d.ts +7 -1
- package/lib/plugins/index.js +24 -30
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.d.cts +7 -1
- package/lib/selectors/index.d.ts +7 -1
- package/lib/utils/index.d.cts +7 -1
- package/lib/utils/index.d.ts +7 -1
- package/package.json +1 -1
- package/src/behaviors/behavior.decorator-pair.ts +16 -19
- package/src/behaviors/behavior.emoji-picker.ts +26 -45
- package/src/behaviors/behavior.links.ts +5 -4
- package/src/behaviors/behavior.markdown.ts +37 -34
- package/src/behaviors/behavior.perform-event.ts +53 -2
- package/src/behaviors/behavior.types.action.ts +38 -7
- package/src/behaviors/index.ts +3 -0
- package/src/editor/editor-machine.ts +2 -2
- package/src/plugins/plugin.decorator-shortcut.ts +6 -8
- package/src/plugins/plugin.one-line.tsx +4 -4
|
@@ -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 {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;"}
|
|
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 {effect, execute, noop} 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 execute({\n type: 'insert.text',\n text: ':',\n }),\n ],\n (_, params) => [\n effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\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 execute({\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 effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\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 execute({\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 noop(),\n effect(() => {\n emojiPickerActor.send({type: 'navigate up'})\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 noop(),\n effect(() => {\n emojiPickerActor.send({type: 'navigate down'})\n }),\n ]\n }\n\n return [\n effect(() => {\n emojiPickerActor.send({type: 'reset'})\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 {execute} from './behavior.types.action'\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 execute({\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 execute({\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","execute","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","noop","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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"}
|
package/lib/index.d.cts
CHANGED
|
@@ -301,7 +301,13 @@ declare type Behavior<
|
|
|
301
301
|
* @beta
|
|
302
302
|
*/
|
|
303
303
|
declare type BehaviorAction =
|
|
304
|
-
|
|
|
304
|
+
| {
|
|
305
|
+
type: 'execute'
|
|
306
|
+
event:
|
|
307
|
+
| AbstractBehaviorEvent
|
|
308
|
+
| SyntheticBehaviorEvent
|
|
309
|
+
| CustomBehaviorEvent
|
|
310
|
+
}
|
|
305
311
|
| {
|
|
306
312
|
type: 'raise'
|
|
307
313
|
event:
|
package/lib/index.d.ts
CHANGED
|
@@ -301,7 +301,13 @@ declare type Behavior<
|
|
|
301
301
|
* @beta
|
|
302
302
|
*/
|
|
303
303
|
declare type BehaviorAction =
|
|
304
|
-
|
|
|
304
|
+
| {
|
|
305
|
+
type: 'execute'
|
|
306
|
+
event:
|
|
307
|
+
| AbstractBehaviorEvent
|
|
308
|
+
| SyntheticBehaviorEvent
|
|
309
|
+
| CustomBehaviorEvent
|
|
310
|
+
}
|
|
305
311
|
| {
|
|
306
312
|
type: 'raise'
|
|
307
313
|
event:
|
package/lib/plugins/index.cjs
CHANGED
|
@@ -120,45 +120,42 @@ function createDecoratorPairBehavior(config) {
|
|
|
120
120
|
// Insert the text as usual in its own undo step
|
|
121
121
|
({
|
|
122
122
|
event
|
|
123
|
-
}) => [event],
|
|
123
|
+
}) => [behavior_core.execute(event)],
|
|
124
124
|
(_, {
|
|
125
125
|
prefixOffsets,
|
|
126
126
|
suffixOffsets,
|
|
127
127
|
decorator
|
|
128
128
|
}) => [
|
|
129
129
|
// Decorate the text between the prefix and suffix
|
|
130
|
-
{
|
|
130
|
+
behavior_core.execute({
|
|
131
131
|
type: "decorator.add",
|
|
132
132
|
decorator,
|
|
133
133
|
at: {
|
|
134
134
|
anchor: prefixOffsets.focus,
|
|
135
135
|
focus: suffixOffsets.anchor
|
|
136
136
|
}
|
|
137
|
-
},
|
|
137
|
+
}),
|
|
138
138
|
// Delete the suffix
|
|
139
|
-
behavior_core.
|
|
139
|
+
behavior_core.execute({
|
|
140
140
|
type: "delete.text",
|
|
141
141
|
at: suffixOffsets
|
|
142
142
|
}),
|
|
143
143
|
// Delete the prefix
|
|
144
|
-
behavior_core.
|
|
144
|
+
behavior_core.execute({
|
|
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
|
+
behavior_core.execute({
|
|
150
150
|
type: "decorator.remove",
|
|
151
151
|
decorator
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
152
|
+
}),
|
|
153
|
+
behavior_core.effect(() => {
|
|
154
|
+
config.onDecorate({
|
|
155
|
+
...suffixOffsets.anchor,
|
|
156
|
+
offset: suffixOffsets.anchor.offset - (prefixOffsets.focus.offset - prefixOffsets.anchor.offset)
|
|
157
|
+
});
|
|
158
|
+
})
|
|
162
159
|
]
|
|
163
160
|
]
|
|
164
161
|
});
|
|
@@ -236,16 +233,13 @@ const emphasisListener = ({
|
|
|
236
233
|
}) => input.editor.registerBehavior({
|
|
237
234
|
behavior: behavior_core.defineBehavior({
|
|
238
235
|
on: "delete.backward",
|
|
239
|
-
actions: [() => [{
|
|
236
|
+
actions: [() => [behavior_core.execute({
|
|
240
237
|
type: "history.undo"
|
|
241
|
-
}, {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
}]]
|
|
238
|
+
}), behavior_core.effect(() => {
|
|
239
|
+
sendBack({
|
|
240
|
+
type: "delete.backward"
|
|
241
|
+
});
|
|
242
|
+
})]]
|
|
249
243
|
})
|
|
250
244
|
}), decoratorPairMachine = xstate.setup({
|
|
251
245
|
types: {
|
|
@@ -411,10 +405,10 @@ const oneLineBehaviors = [
|
|
|
411
405
|
} : !1,
|
|
412
406
|
actions: [(_, {
|
|
413
407
|
selection
|
|
414
|
-
}) => [{
|
|
408
|
+
}) => [behavior_core.execute({
|
|
415
409
|
type: "delete",
|
|
416
410
|
at: selection
|
|
417
|
-
}]]
|
|
411
|
+
})]]
|
|
418
412
|
}),
|
|
419
413
|
/**
|
|
420
414
|
* All other cases of `insert.break` should be aborted.
|
|
@@ -458,12 +452,12 @@ const oneLineBehaviors = [
|
|
|
458
452
|
}) => !(!selector_isOverlappingSelection.getFocusTextBlock(snapshot) || !util_mergeTextBlocks.isTextBlock(snapshot.context, event.block)),
|
|
459
453
|
actions: [({
|
|
460
454
|
event
|
|
461
|
-
}) => [{
|
|
455
|
+
}) => [behavior_core.execute({
|
|
462
456
|
type: "insert.block",
|
|
463
457
|
block: event.block,
|
|
464
458
|
placement: "auto",
|
|
465
459
|
select: "end"
|
|
466
|
-
}]]
|
|
460
|
+
})]]
|
|
467
461
|
}),
|
|
468
462
|
/**
|
|
469
463
|
* Fallback Behavior to avoid `insert.block` in case the Behaviors above all
|
|
@@ -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 {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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"}
|
|
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 {effect, execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nexport function createDecoratorPairBehavior(config: {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n pair: {char: string; amount: number}\n onDecorate: (offset: BlockOffset) => void\n}) {\n if (config.pair.amount < 1) {\n console.warn(\n `The amount of characters in the pair should be greater than 0`,\n )\n }\n\n const pairRegex = createPairRegex(config.pair.char, config.pair.amount)\n const regEx = new RegExp(`(${pairRegex})$`)\n\n return defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (config.pair.amount < 1) {\n return false\n }\n\n const decorator = config.decorator({schema: snapshot.context.schema})\n\n if (decorator === undefined) {\n return false\n }\n\n const focusTextBlock = 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}) => [execute(event)],\n (_, {prefixOffsets, suffixOffsets, decorator}) => [\n // Decorate the text between the prefix and suffix\n execute({\n type: 'decorator.add',\n decorator,\n at: {\n anchor: prefixOffsets.focus,\n focus: suffixOffsets.anchor,\n },\n }),\n // Delete the suffix\n execute({\n type: 'delete.text',\n at: suffixOffsets,\n }),\n // Delete the prefix\n execute({\n type: 'delete.text',\n at: prefixOffsets,\n }),\n // Toggle the decorator off so the next inserted text isn't emphasized\n execute({\n type: 'decorator.remove',\n decorator,\n }),\n effect(() => {\n config.onDecorate({\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n })\n }),\n ],\n ],\n })\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport {createDecoratorPairBehavior} from '../behaviors/behavior.decorator-pair'\nimport {effect, execute} from '../behaviors/behavior.types.action'\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 execute({\n type: 'history.undo',\n }),\n effect(() => {\n sendBack({type: 'delete.backward'})\n }),\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst decoratorPairMachine = setup({\n types: {\n context: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n offsetAfterEmphasis?: BlockOffset\n pair: {char: string; amount: number}\n },\n input: {} as {\n decorator: ({schema}: {schema: EditorSchema}) => string | undefined\n editor: Editor\n pair: {char: string; amount: number}\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'decorator pair',\n context: ({input}) => ({\n decorator: input.decorator,\n editor: input.editor,\n pair: input.pair,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n decorator: context.decorator,\n editor: context.editor,\n pair: context.pair,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import React from 'react'\nimport type {Editor} from '../editor/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, execute, 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}) => [execute({type: 'delete', at: selection})]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{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 execute({\n type: 'insert.block',\n block: event.block,\n placement: 'auto',\n select: 'end',\n }),\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{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","execute","_","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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"}
|
package/lib/plugins/index.d.cts
CHANGED
|
@@ -256,7 +256,13 @@ declare type Behavior<
|
|
|
256
256
|
* @beta
|
|
257
257
|
*/
|
|
258
258
|
declare type BehaviorAction =
|
|
259
|
-
|
|
|
259
|
+
| {
|
|
260
|
+
type: 'execute'
|
|
261
|
+
event:
|
|
262
|
+
| AbstractBehaviorEvent
|
|
263
|
+
| SyntheticBehaviorEvent
|
|
264
|
+
| CustomBehaviorEvent
|
|
265
|
+
}
|
|
260
266
|
| {
|
|
261
267
|
type: 'raise'
|
|
262
268
|
event:
|
package/lib/plugins/index.d.ts
CHANGED
|
@@ -256,7 +256,13 @@ declare type Behavior<
|
|
|
256
256
|
* @beta
|
|
257
257
|
*/
|
|
258
258
|
declare type BehaviorAction =
|
|
259
|
-
|
|
|
259
|
+
| {
|
|
260
|
+
type: 'execute'
|
|
261
|
+
event:
|
|
262
|
+
| AbstractBehaviorEvent
|
|
263
|
+
| SyntheticBehaviorEvent
|
|
264
|
+
| CustomBehaviorEvent
|
|
265
|
+
}
|
|
260
266
|
| {
|
|
261
267
|
type: 'raise'
|
|
262
268
|
event:
|