@portabletext/editor 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -261
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-selection-collapsed.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selector.is-selection-collapsed.js.map +1 -1
- package/lib/behaviors/index.cjs +40 -38
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +23 -23
- package/lib/behaviors/index.d.ts +23 -23
- package/lib/behaviors/index.js +40 -38
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.cjs +301 -351
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +123 -753
- package/lib/index.d.ts +123 -753
- package/lib/index.js +301 -351
- package/lib/index.js.map +1 -1
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +30 -30
- package/lib/selectors/index.d.ts +30 -30
- package/lib/selectors/index.js.map +1 -1
- package/package.json +10 -10
- package/src/behaviors/behavior.code-editor.ts +2 -2
- package/src/behaviors/behavior.core.ts +2 -2
- package/src/behaviors/behavior.emoji-picker.ts +52 -41
- package/src/behaviors/behavior.links.ts +2 -2
- package/src/behaviors/behavior.markdown.ts +2 -2
- package/src/behaviors/behavior.types.ts +10 -10
- package/src/editor/PortableTextEditor.tsx +2 -0
- package/src/editor/__tests__/self-solving.test.tsx +14 -0
- package/src/editor/components/Synchronizer.tsx +6 -1
- package/src/editor/create-editor.ts +14 -3
- package/src/editor/define-schema.ts +4 -4
- package/src/editor/editor-event-listener.tsx +1 -1
- package/src/editor/editor-machine.ts +42 -52
- package/src/editor/editor-provider.tsx +3 -3
- package/src/editor/editor-selector.ts +31 -14
- package/src/editor/editor-snapshot.ts +2 -2
- package/src/editor/get-value.ts +12 -5
- package/src/editor/hooks/usePortableTextEditor.ts +1 -0
- package/src/editor/hooks/usePortableTextEditorSelection.tsx +1 -0
- package/src/selectors/selector.get-active-list-item.ts +1 -1
- package/src/selectors/selector.get-active-style.ts +1 -1
- package/src/selectors/selector.get-selected-spans.ts +1 -1
- package/src/selectors/selector.get-selection-text.ts +1 -1
- package/src/selectors/selector.get-text-before.ts +1 -1
- package/src/selectors/selector.is-active-annotation.ts +1 -1
- package/src/selectors/selector.is-active-decorator.ts +1 -1
- package/src/selectors/selector.is-active-list-item.ts +1 -1
- package/src/selectors/selector.is-active-style.ts +1 -1
- package/src/selectors/selector.is-selection-collapsed.ts +1 -1
- package/src/selectors/selector.is-selection-expanded.ts +1 -1
- package/src/selectors/selectors.ts +13 -13
- package/src/types/editor.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector.is-selection-collapsed.js","sources":["../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.is-selection-collapsed.ts"],"sourcesContent":["import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @alpha\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const key = context.selection\n ? isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @alpha\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const guards = createGuards(context)\n const focusBlock = getFocusBlock({context})\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @alpha\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const focusBlock = getFocusBlock({context})\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @alpha\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const focusBlock = getFocusBlock({context})\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @alpha\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = ({context}) => {\n const focusBlock = getFocusTextBlock({context})\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = context.selection\n ? isKeySegment(context.selection.focus.path[2])\n ? context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @alpha\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = ({context}) => {\n const focusChild = getFocusChild({context})\n\n return focusChild && isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n\n/**\n * @alpha\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const node = context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @alpha\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const node = context.value[context.value.length - 1]\n ? context.value[context.value.length - 1]\n : undefined\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @alpha\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = ({context}) => {\n if (!context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = context.selection.backward\n ? isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n const endKey = context.selection.backward\n ? isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n\n if (!startKey || !endKey) {\n return selectedBlocks\n }\n\n for (const block of context.value) {\n if (block._key === startKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n break\n }\n\n if (selectedBlocks.length > 0) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n\n return selectedBlocks\n}\n\n/**\n * @alpha\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const key = context.selection.backward\n ? isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @alpha\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const key = context.selection.backward\n ? isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @alpha\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n let previousBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionStartBlock = getSelectionStartBlock({context})\n\n if (!selectionStartBlock) {\n return undefined\n }\n\n let foundSelectionStartBlock = false\n\n for (const block of context.value) {\n if (block._key === selectionStartBlock.node._key) {\n foundSelectionStartBlock = true\n break\n }\n\n previousBlock = {node: block, path: [{_key: block._key}]}\n }\n\n if (foundSelectionStartBlock && previousBlock) {\n return previousBlock\n }\n\n return undefined\n}\n\n/**\n * @alpha\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionEndBlock = getSelectionEndBlock({context})\n\n if (!selectionEndBlock) {\n return undefined\n }\n\n let foundSelectionEndBlock = false\n\n for (const block of context.value) {\n if (block._key === selectionEndBlock.node._key) {\n foundSelectionEndBlock = true\n continue\n }\n\n if (foundSelectionEndBlock) {\n nextBlock = {node: block, path: [{_key: block._key}]}\n break\n }\n }\n\n if (foundSelectionEndBlock && nextBlock) {\n return nextBlock\n }\n\n return undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @alpha\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = ({context}) => {\n return (\n JSON.stringify(context.selection?.anchor.path) ===\n JSON.stringify(context.selection?.focus.path) &&\n context.selection?.anchor.offset === context.selection?.focus.offset\n )\n}\n"],"names":["createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","context","key","selection","isKeySegment","focus","path","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","anchor","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","isSelectionCollapsed","JSON","stringify","offset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selector.is-selection-collapsed.js","sources":["../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.is-selection-collapsed.ts"],"sourcesContent":["import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const key = context.selection\n ? isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const guards = createGuards(context)\n const focusBlock = getFocusBlock({context})\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const focusBlock = getFocusBlock({context})\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const focusBlock = getFocusBlock({context})\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = ({context}) => {\n const focusBlock = getFocusTextBlock({context})\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = context.selection\n ? isKeySegment(context.selection.focus.path[2])\n ? context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = ({context}) => {\n const focusChild = getFocusChild({context})\n\n return focusChild && isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const node = context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const node = context.value[context.value.length - 1]\n ? context.value[context.value.length - 1]\n : undefined\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = ({context}) => {\n if (!context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = context.selection.backward\n ? isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n const endKey = context.selection.backward\n ? isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n\n if (!startKey || !endKey) {\n return selectedBlocks\n }\n\n for (const block of context.value) {\n if (block._key === startKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n break\n }\n\n if (selectedBlocks.length > 0) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n\n return selectedBlocks\n}\n\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const key = context.selection.backward\n ? isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const key = context.selection.backward\n ? isKeySegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(context.selection.focus.path[0])\n ? context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n let previousBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionStartBlock = getSelectionStartBlock({context})\n\n if (!selectionStartBlock) {\n return undefined\n }\n\n let foundSelectionStartBlock = false\n\n for (const block of context.value) {\n if (block._key === selectionStartBlock.node._key) {\n foundSelectionStartBlock = true\n break\n }\n\n previousBlock = {node: block, path: [{_key: block._key}]}\n }\n\n if (foundSelectionStartBlock && previousBlock) {\n return previousBlock\n }\n\n return undefined\n}\n\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionEndBlock = getSelectionEndBlock({context})\n\n if (!selectionEndBlock) {\n return undefined\n }\n\n let foundSelectionEndBlock = false\n\n for (const block of context.value) {\n if (block._key === selectionEndBlock.node._key) {\n foundSelectionEndBlock = true\n continue\n }\n\n if (foundSelectionEndBlock) {\n nextBlock = {node: block, path: [{_key: block._key}]}\n break\n }\n }\n\n if (foundSelectionEndBlock && nextBlock) {\n return nextBlock\n }\n\n return undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = ({context}) => {\n return (\n JSON.stringify(context.selection?.anchor.path) ===\n JSON.stringify(context.selection?.focus.path) &&\n context.selection?.anchor.offset === context.selection?.focus.offset\n )\n}\n"],"names":["createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","context","key","selection","isKeySegment","focus","path","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","anchor","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","isSelectionCollapsed","JSON","stringify","offset"],"mappings":"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"}
|
package/lib/behaviors/index.cjs
CHANGED
|
@@ -56,6 +56,38 @@ function createEmojiPickerBehaviors(config) {
|
|
|
56
56
|
selectedIndex: state.context.selectedIndex
|
|
57
57
|
});
|
|
58
58
|
}), [behavior_core.defineBehavior({
|
|
59
|
+
on: "insert.text",
|
|
60
|
+
guard: ({
|
|
61
|
+
context,
|
|
62
|
+
event
|
|
63
|
+
}) => {
|
|
64
|
+
if (!emojiCharRegEx.test(event.text))
|
|
65
|
+
return {
|
|
66
|
+
emojis: []
|
|
67
|
+
};
|
|
68
|
+
const focusBlock = selector_isSelectionCollapsed.getFocusTextBlock({
|
|
69
|
+
context
|
|
70
|
+
}), emojiKeyword = `${selector_getTextBefore.getBlockTextBefore({
|
|
71
|
+
context
|
|
72
|
+
})}${event.text}`.match(incompleteEmojiRegEx)?.[1];
|
|
73
|
+
return !focusBlock || emojiKeyword === void 0 ? {
|
|
74
|
+
emojis: []
|
|
75
|
+
} : {
|
|
76
|
+
emojis: config.matchEmojis({
|
|
77
|
+
keyword: emojiKeyword
|
|
78
|
+
})
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
actions: [(_, params) => [{
|
|
82
|
+
type: "effect",
|
|
83
|
+
effect: () => {
|
|
84
|
+
emojiPickerActor.send({
|
|
85
|
+
type: "emojis found",
|
|
86
|
+
matches: params.emojis
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}]]
|
|
90
|
+
}), behavior_core.defineBehavior({
|
|
59
91
|
on: "insert.text",
|
|
60
92
|
guard: ({
|
|
61
93
|
context,
|
|
@@ -104,50 +136,21 @@ function createEmojiPickerBehaviors(config) {
|
|
|
104
136
|
type: "insert.text",
|
|
105
137
|
text: params.emoji
|
|
106
138
|
}]]
|
|
107
|
-
}), behavior_core.defineBehavior({
|
|
108
|
-
on: "insert.text",
|
|
109
|
-
guard: ({
|
|
110
|
-
context,
|
|
111
|
-
event
|
|
112
|
-
}) => {
|
|
113
|
-
if (!emojiCharRegEx.test(event.text))
|
|
114
|
-
return {
|
|
115
|
-
emojis: []
|
|
116
|
-
};
|
|
117
|
-
const focusBlock = selector_isSelectionCollapsed.getFocusTextBlock({
|
|
118
|
-
context
|
|
119
|
-
}), emojiKeyword = `${selector_getTextBefore.getBlockTextBefore({
|
|
120
|
-
context
|
|
121
|
-
})}${event.text}`.match(incompleteEmojiRegEx)?.[1];
|
|
122
|
-
return !focusBlock || emojiKeyword === void 0 ? {
|
|
123
|
-
emojis: []
|
|
124
|
-
} : {
|
|
125
|
-
emojis: config.matchEmojis({
|
|
126
|
-
keyword: emojiKeyword
|
|
127
|
-
})
|
|
128
|
-
};
|
|
129
|
-
},
|
|
130
|
-
actions: [(_, params) => [{
|
|
131
|
-
type: "effect",
|
|
132
|
-
effect: () => {
|
|
133
|
-
emojiPickerActor.send({
|
|
134
|
-
type: "emojis found",
|
|
135
|
-
matches: params.emojis
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
}]]
|
|
139
139
|
}), behavior_core.defineBehavior({
|
|
140
140
|
on: "key.down",
|
|
141
141
|
guard: ({
|
|
142
142
|
context,
|
|
143
143
|
event
|
|
144
144
|
}) => {
|
|
145
|
+
const matches = emojiPickerActor.getSnapshot().context.matches;
|
|
146
|
+
if (matches.length === 0)
|
|
147
|
+
return !1;
|
|
145
148
|
const isShift = behavior_core.isHotkey("Shift", event.keyboardEvent), isColon = event.keyboardEvent.key === ":", isEmojiChar = emojiCharRegEx.test(event.keyboardEvent.key);
|
|
146
149
|
if (isShift || isColon || isEmojiChar)
|
|
147
150
|
return !1;
|
|
148
151
|
const isArrowDown = behavior_core.isHotkey("ArrowDown", event.keyboardEvent), isArrowUp = behavior_core.isHotkey("ArrowUp", event.keyboardEvent), isEnter = behavior_core.isHotkey("Enter", event.keyboardEvent), isTab = behavior_core.isHotkey("Tab", event.keyboardEvent);
|
|
149
152
|
if (isEnter || isTab) {
|
|
150
|
-
const
|
|
153
|
+
const selectedIndex = emojiPickerActor.getSnapshot().context.selectedIndex, emoji = matches[selectedIndex] ? config.parseMatch({
|
|
151
154
|
match: matches[selectedIndex]
|
|
152
155
|
}) : void 0;
|
|
153
156
|
if (!emoji)
|
|
@@ -168,9 +171,9 @@ function createEmojiPickerBehaviors(config) {
|
|
|
168
171
|
textBeforeLength: textBefore.length
|
|
169
172
|
} : !1;
|
|
170
173
|
}
|
|
171
|
-
return isArrowDown ? {
|
|
174
|
+
return isArrowDown && matches.length > 0 ? {
|
|
172
175
|
action: "navigate down"
|
|
173
|
-
} : isArrowUp ? {
|
|
176
|
+
} : isArrowUp && matches.length > 0 ? {
|
|
174
177
|
action: "navigate up"
|
|
175
178
|
} : {
|
|
176
179
|
action: "reset"
|
|
@@ -238,7 +241,7 @@ function createEmojiPickerBehaviors(config) {
|
|
|
238
241
|
context,
|
|
239
242
|
event
|
|
240
243
|
}) => {
|
|
241
|
-
if (event.unit !== "character")
|
|
244
|
+
if (event.unit !== "character" || emojiPickerActor.getSnapshot().context.matches.length === 0)
|
|
242
245
|
return !1;
|
|
243
246
|
const focusBlock = selector_isSelectionCollapsed.getFocusTextBlock({
|
|
244
247
|
context
|
|
@@ -246,8 +249,7 @@ function createEmojiPickerBehaviors(config) {
|
|
|
246
249
|
context
|
|
247
250
|
}), emojiKeyword = textBefore.slice(0, textBefore.length - 1).match(incompleteEmojiRegEx)?.[1];
|
|
248
251
|
return !focusBlock || emojiKeyword === void 0 ? {
|
|
249
|
-
emojis: []
|
|
250
|
-
event
|
|
252
|
+
emojis: []
|
|
251
253
|
} : {
|
|
252
254
|
emojis: config.matchEmojis({
|
|
253
255
|
keyword: emojiKeyword
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @alpha\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.keyboardEvent,\n )\n const firstBlock = selectors.getFirstBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block up',\n at,\n })),\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.keyboardEvent,\n )\n const lastBlock = selectors.getLastBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block down',\n at,\n })),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @alpha\n */\nexport type EmojiPickerBehaviorsConfig<TEmojiMatch> = {\n /**\n * Match emojis by keyword.\n */\n matchEmojis: ({keyword}: {keyword: string}) => Array<TEmojiMatch>\n onMatchesChanged: ({matches}: {matches: Array<TEmojiMatch>}) => void\n onSelectedIndexChanged: ({selectedIndex}: {selectedIndex: number}) => void\n /**\n * Parse an emoji match to a string that will be inserted into the editor.\n */\n parseMatch: ({match}: {match: TEmojiMatch}) => string | undefined\n}\n\n/**\n * @alpha\n */\nexport function createEmojiPickerBehaviors<TEmojiMatch>(\n config: EmojiPickerBehaviorsConfig<TEmojiMatch>,\n) {\n const emojiPickerActor = createActor(createEmojiPickerMachine<TEmojiMatch>())\n emojiPickerActor.start()\n emojiPickerActor.subscribe((state) => {\n config.onMatchesChanged({matches: state.context.matches})\n config.onSelectedIndexChanged({selectedIndex: state.context.selectedIndex})\n })\n\n return [\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ':',\n },\n ],\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isShift = isHotkey('Shift', event.keyboardEvent)\n const isColon = event.keyboardEvent.key === ':'\n const isEmojiChar = emojiCharRegEx.test(event.keyboardEvent.key)\n\n if (isShift || isColon || isEmojiChar) {\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const isEnter = isHotkey('Enter', event.keyboardEvent)\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (isEnter || isTab) {\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n if (isArrowDown) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp) {\n return {action: 'navigate up' as const}\n }\n\n return {action: 'reset' as const}\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate up'})\n },\n },\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate down'})\n },\n },\n ]\n }\n\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'reset'})\n },\n },\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({context, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: [], event}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","import type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @alpha\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n {\n type: 'annotation.add',\n annotation,\n },\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const focusSpan = selectors.getFocusSpan({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n {\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n },\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n\nfunction looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n new URL(text)\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {getTextBlockText} from '../editor/utils/utils'\nimport {spanSelectionPointToBlockOffset} from '../editor/utils/utils.block-offset'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @alpha\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const textBefore = getBlockTextBefore({context})\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (textBefore === `${hrCharacter}${hrCharacter}`) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (!caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n {\n type: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","context","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","keyboardEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","onSelectedIndexChanged","selectedIndex","text","getSnapshot","emoji","parseMatch","match","undefined","focusBlock","textBefore","emojiKeyword","emojiStringLength","textBeforeLength","params","effect","send","anchor","offset","focus","test","emojis","matchEmojis","keyword","isShift","isColon","key","isEmojiChar","isArrowDown","isArrowUp","isEnter","isTab","action","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","data","getData","url","looksLikeUrl","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations","URL","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","selection","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","blockquoteStyle","style","props","automaticHr","hrCharacter","hrObject","horizontalRuleObject","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","hrRegExp","hrCharacters","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @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: 'key.down',\n guard: ({context, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.keyboardEvent,\n )\n const firstBlock = selectors.getFirstBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block up',\n at,\n })),\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.keyboardEvent,\n )\n const lastBlock = selectors.getLastBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block down',\n at,\n })),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @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: ({context, event}) => {\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ':',\n },\n ],\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isShift = isHotkey('Shift', event.keyboardEvent)\n const isColon = event.keyboardEvent.key === ':'\n const isEmojiChar = emojiCharRegEx.test(event.keyboardEvent.key)\n\n if (isShift || isColon || isEmojiChar) {\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const isEnter = isHotkey('Enter', event.keyboardEvent)\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (isEnter || isTab) {\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n if (isArrowDown && 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 {action: 'reset' as const}\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate up'})\n },\n },\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate down'})\n },\n },\n ]\n }\n\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'reset'})\n },\n },\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({context, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","import type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @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: 'paste',\n guard: ({context, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n {\n type: 'annotation.add',\n annotation,\n },\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const focusSpan = selectors.getFocusSpan({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n {\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n },\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n\nfunction looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n new URL(text)\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {getTextBlockText} from '../editor/utils/utils'\nimport {spanSelectionPointToBlockOffset} from '../editor/utils/utils.block-offset'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const textBefore = getBlockTextBefore({context})\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (textBefore === `${hrCharacter}${hrCharacter}`) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (!caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n {\n type: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","context","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","keyboardEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","onSelectedIndexChanged","selectedIndex","test","text","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","anchor","offset","focus","isShift","isColon","key","isEmojiChar","isArrowDown","isArrowUp","isEnter","isTab","action","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","data","getData","url","looksLikeUrl","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations","URL","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","selection","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","blockquoteStyle","style","props","automaticHr","hrCharacter","hrObject","horizontalRuleObject","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","hrRegExp","hrCharacters","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ import type {TextUnit} from 'slate'
|
|
|
13
13
|
import type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* @
|
|
16
|
+
* @beta
|
|
17
17
|
*/
|
|
18
18
|
export declare type Behavior<
|
|
19
19
|
TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],
|
|
@@ -39,7 +39,7 @@ export declare type Behavior<
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
|
-
* @
|
|
42
|
+
* @beta
|
|
43
43
|
*/
|
|
44
44
|
export declare type BehaviorActionIntend =
|
|
45
45
|
| SyntheticBehaviorEvent
|
|
@@ -133,7 +133,7 @@ export declare type BehaviorActionIntend =
|
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
/**
|
|
136
|
-
* @
|
|
136
|
+
* @beta
|
|
137
137
|
*/
|
|
138
138
|
export declare type BehaviorActionIntendSet<
|
|
139
139
|
TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],
|
|
@@ -150,12 +150,12 @@ export declare type BehaviorActionIntendSet<
|
|
|
150
150
|
) => Array<BehaviorActionIntend>
|
|
151
151
|
|
|
152
152
|
/**
|
|
153
|
-
* @
|
|
153
|
+
* @beta
|
|
154
154
|
*/
|
|
155
155
|
export declare type BehaviorEvent = SyntheticBehaviorEvent | NativeBehaviorEvent
|
|
156
156
|
|
|
157
157
|
/**
|
|
158
|
-
* @
|
|
158
|
+
* @beta
|
|
159
159
|
*/
|
|
160
160
|
export declare type BehaviorGuard<
|
|
161
161
|
TBehaviorEvent extends BehaviorEvent,
|
|
@@ -169,7 +169,7 @@ export declare type BehaviorGuard<
|
|
|
169
169
|
}) => TGuardResponse | false
|
|
170
170
|
|
|
171
171
|
/**
|
|
172
|
-
* @
|
|
172
|
+
* @beta
|
|
173
173
|
*/
|
|
174
174
|
export declare type BlockOffset = {
|
|
175
175
|
path: [KeyedSegment]
|
|
@@ -177,7 +177,7 @@ export declare type BlockOffset = {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
/**
|
|
180
|
-
* @
|
|
180
|
+
* @beta
|
|
181
181
|
*/
|
|
182
182
|
export declare type CodeEditorBehaviorsConfig = {
|
|
183
183
|
moveBlockUpShortcut: string
|
|
@@ -185,7 +185,7 @@ export declare type CodeEditorBehaviorsConfig = {
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
/**
|
|
188
|
-
* @
|
|
188
|
+
* @beta
|
|
189
189
|
*/
|
|
190
190
|
export declare const coreBehavior: {
|
|
191
191
|
softReturn: Behavior<
|
|
@@ -533,7 +533,7 @@ export declare const coreBehavior: {
|
|
|
533
533
|
}
|
|
534
534
|
|
|
535
535
|
/**
|
|
536
|
-
* @
|
|
536
|
+
* @beta
|
|
537
537
|
*/
|
|
538
538
|
export declare const coreBehaviors: Behavior<
|
|
539
539
|
| 'annotation.add'
|
|
@@ -561,7 +561,7 @@ export declare const coreBehaviors: Behavior<
|
|
|
561
561
|
>[]
|
|
562
562
|
|
|
563
563
|
/**
|
|
564
|
-
* @
|
|
564
|
+
* @beta
|
|
565
565
|
*/
|
|
566
566
|
export declare function createCodeEditorBehaviors(
|
|
567
567
|
config: CodeEditorBehaviorsConfig,
|
|
@@ -591,7 +591,7 @@ export declare function createCodeEditorBehaviors(
|
|
|
591
591
|
>[]
|
|
592
592
|
|
|
593
593
|
/**
|
|
594
|
-
* @
|
|
594
|
+
* @beta
|
|
595
595
|
*/
|
|
596
596
|
export declare function createEmojiPickerBehaviors<TEmojiMatch>(
|
|
597
597
|
config: EmojiPickerBehaviorsConfig<TEmojiMatch>,
|
|
@@ -621,7 +621,7 @@ export declare function createEmojiPickerBehaviors<TEmojiMatch>(
|
|
|
621
621
|
>[]
|
|
622
622
|
|
|
623
623
|
/**
|
|
624
|
-
* @
|
|
624
|
+
* @beta
|
|
625
625
|
*/
|
|
626
626
|
export declare function createLinkBehaviors(
|
|
627
627
|
config: LinkBehaviorsConfig,
|
|
@@ -651,7 +651,7 @@ export declare function createLinkBehaviors(
|
|
|
651
651
|
>[]
|
|
652
652
|
|
|
653
653
|
/**
|
|
654
|
-
* @
|
|
654
|
+
* @beta
|
|
655
655
|
*/
|
|
656
656
|
export declare function createMarkdownBehaviors(
|
|
657
657
|
config: MarkdownBehaviorsConfig,
|
|
@@ -681,7 +681,7 @@ export declare function createMarkdownBehaviors(
|
|
|
681
681
|
>[]
|
|
682
682
|
|
|
683
683
|
/**
|
|
684
|
-
* @
|
|
684
|
+
* @beta
|
|
685
685
|
*/
|
|
686
686
|
export declare function defineBehavior<
|
|
687
687
|
TAnyBehaviorEventType extends BehaviorEvent['type'],
|
|
@@ -689,7 +689,7 @@ export declare function defineBehavior<
|
|
|
689
689
|
>(behavior: Behavior<TAnyBehaviorEventType, TGuardResponse>): Behavior
|
|
690
690
|
|
|
691
691
|
/**
|
|
692
|
-
* @
|
|
692
|
+
* @public
|
|
693
693
|
*/
|
|
694
694
|
export declare type EditorContext = {
|
|
695
695
|
activeDecorators: Array<string>
|
|
@@ -700,25 +700,25 @@ export declare type EditorContext = {
|
|
|
700
700
|
}
|
|
701
701
|
|
|
702
702
|
/**
|
|
703
|
-
* @
|
|
703
|
+
* @public
|
|
704
704
|
*/
|
|
705
705
|
export declare type EditorSchema = PortableTextMemberSchemaTypes
|
|
706
706
|
|
|
707
|
-
/** @
|
|
707
|
+
/** @public */
|
|
708
708
|
export declare type EditorSelection = {
|
|
709
709
|
anchor: EditorSelectionPoint
|
|
710
710
|
focus: EditorSelectionPoint
|
|
711
711
|
backward?: boolean
|
|
712
712
|
} | null
|
|
713
713
|
|
|
714
|
-
/** @
|
|
714
|
+
/** @public */
|
|
715
715
|
export declare type EditorSelectionPoint = {
|
|
716
716
|
path: Path
|
|
717
717
|
offset: number
|
|
718
718
|
}
|
|
719
719
|
|
|
720
720
|
/**
|
|
721
|
-
* @
|
|
721
|
+
* @beta
|
|
722
722
|
*/
|
|
723
723
|
export declare type EmojiPickerBehaviorsConfig<TEmojiMatch> = {
|
|
724
724
|
/**
|
|
@@ -734,7 +734,7 @@ export declare type EmojiPickerBehaviorsConfig<TEmojiMatch> = {
|
|
|
734
734
|
}
|
|
735
735
|
|
|
736
736
|
/**
|
|
737
|
-
* @
|
|
737
|
+
* @beta
|
|
738
738
|
*/
|
|
739
739
|
export declare type LinkBehaviorsConfig = {
|
|
740
740
|
linkAnnotation?: (context: {schema: EditorSchema; url: string}) =>
|
|
@@ -748,7 +748,7 @@ export declare type LinkBehaviorsConfig = {
|
|
|
748
748
|
}
|
|
749
749
|
|
|
750
750
|
/**
|
|
751
|
-
* @
|
|
751
|
+
* @beta
|
|
752
752
|
*/
|
|
753
753
|
export declare type MarkdownBehaviorsConfig = {
|
|
754
754
|
horizontalRuleObject?: (context: {schema: EditorSchema}) =>
|
|
@@ -770,7 +770,7 @@ export declare type MarkdownBehaviorsConfig = {
|
|
|
770
770
|
}
|
|
771
771
|
|
|
772
772
|
/**
|
|
773
|
-
* @
|
|
773
|
+
* @beta
|
|
774
774
|
*/
|
|
775
775
|
export declare type NativeBehaviorEvent =
|
|
776
776
|
| {
|
|
@@ -821,7 +821,7 @@ export declare type PortableTextMemberSchemaTypes = {
|
|
|
821
821
|
}
|
|
822
822
|
|
|
823
823
|
/**
|
|
824
|
-
* @
|
|
824
|
+
* @beta
|
|
825
825
|
*/
|
|
826
826
|
export declare type SyntheticBehaviorEvent =
|
|
827
827
|
| {
|