@portabletext/editor 1.34.1 → 1.35.1
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 +57 -118
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +27 -67
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/{plugin.event-listener.cjs → editor-provider.cjs} +101 -87
- package/lib/_chunks-cjs/editor-provider.cjs.map +1 -0
- package/lib/_chunks-cjs/selector.get-text-before.cjs +5 -7
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-active-style.cjs +22 -36
- package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +68 -153
- package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
- package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +57 -118
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +27 -67
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/{plugin.event-listener.js → editor-provider.js} +102 -88
- package/lib/_chunks-es/editor-provider.js.map +1 -0
- package/lib/_chunks-es/selector.get-text-before.js +5 -7
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selector.is-active-style.js +22 -36
- package/lib/_chunks-es/selector.is-active-style.js.map +1 -1
- package/lib/_chunks-es/selector.is-at-the-start-of-block.js +68 -153
- package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
- package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/behaviors/index.cjs +18 -48
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +19392 -214
- package/lib/behaviors/index.d.ts +19392 -214
- package/lib/behaviors/index.js +18 -48
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.cjs +81 -51
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +334 -59
- package/lib/index.d.ts +334 -59
- package/lib/index.js +35 -4
- package/lib/index.js.map +1 -1
- package/lib/plugins/index.cjs +200 -189
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +344 -25
- package/lib/plugins/index.d.ts +344 -25
- package/lib/plugins/index.js +198 -187
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.cjs +22 -50
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +19485 -174
- package/lib/selectors/index.d.ts +19485 -174
- package/lib/selectors/index.js +22 -50
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +19518 -7
- package/lib/utils/index.d.ts +19518 -7
- package/lib/utils/index.js.map +1 -1
- package/package.json +7 -7
- package/src/behavior-actions/behavior.action.decorator.add.ts +1 -0
- package/src/behavior-actions/behavior.action.delete.text.ts +1 -0
- package/src/behaviors/behavior.code-editor.ts +6 -6
- package/src/behaviors/behavior.core.annotations.ts +5 -4
- package/src/behaviors/behavior.core.block-objects.ts +17 -17
- package/src/behaviors/behavior.core.decorators.ts +12 -8
- package/src/behaviors/behavior.core.insert-break.ts +27 -29
- package/src/behaviors/behavior.core.lists.ts +19 -19
- package/src/behaviors/behavior.decorator-pair.ts +201 -0
- package/src/behaviors/behavior.default.ts +35 -30
- package/src/behaviors/behavior.emoji-picker.ts +12 -12
- package/src/behaviors/behavior.links.ts +7 -7
- package/src/behaviors/behavior.markdown.ts +41 -42
- package/src/behaviors/behavior.types.ts +14 -17
- package/src/behaviors/index.ts +0 -1
- package/src/converters/converter.json.ts +6 -6
- package/src/converters/converter.portable-text.deserialize.test.ts +27 -29
- package/src/converters/converter.portable-text.ts +13 -7
- package/src/converters/converter.text-html.deserialize.test.ts +16 -18
- package/src/converters/converter.text-html.serialize.test.ts +56 -57
- package/src/converters/converter.text-html.ts +14 -10
- package/src/converters/converter.text-plain.test.ts +17 -17
- package/src/converters/converter.text-plain.ts +15 -11
- package/src/converters/converter.types.ts +5 -5
- package/src/editor/Editable.tsx +26 -0
- package/src/editor/editor-machine.ts +170 -142
- package/src/editor/editor-selector.ts +3 -0
- package/src/editor/editor-snapshot.ts +13 -0
- package/src/editor-event-listener.tsx +30 -0
- package/src/index.ts +3 -3
- package/src/internal-utils/create-test-snapshot.ts +23 -0
- package/src/internal-utils/get-text-to-emphasize.ts +29 -7
- package/src/plugins/plugin.decorator-shortcut.ts +235 -0
- package/src/plugins/plugin.markdown.tsx +56 -8
- package/src/plugins/plugin.one-line.tsx +17 -17
- package/src/selectors/selector.get-active-annotations.test.ts +4 -13
- package/src/selectors/selector.get-active-list-item.ts +4 -4
- package/src/selectors/selector.get-active-style.ts +6 -6
- package/src/selectors/selector.get-anchor-block.ts +5 -5
- package/src/selectors/selector.get-anchor-child.ts +5 -5
- package/src/selectors/selector.get-anchor-span.ts +2 -2
- package/src/selectors/selector.get-anchor-text-block.ts +2 -2
- package/src/selectors/selector.get-block-offsets.ts +8 -7
- package/src/selectors/selector.get-caret-word-selection.test.ts +3 -7
- package/src/selectors/selector.get-caret-word-selection.ts +19 -16
- package/src/selectors/selector.get-next-inline-object.ts +4 -4
- package/src/selectors/selector.get-previous-inline-object.ts +4 -4
- package/src/selectors/selector.get-selected-slice.ts +7 -4
- package/src/selectors/selector.get-selected-spans.test.ts +5 -9
- package/src/selectors/selector.get-selected-spans.ts +9 -9
- package/src/selectors/selector.get-selection-end-point.ts +5 -5
- package/src/selectors/selector.get-selection-start-point.ts +5 -5
- package/src/selectors/selector.get-selection-text.test.ts +5 -7
- package/src/selectors/selector.get-selection-text.ts +2 -2
- package/src/selectors/selector.get-selection.ts +2 -2
- package/src/selectors/selector.get-text-before.ts +8 -8
- package/src/selectors/selector.get-trimmed-selection.test.ts +3 -5
- package/src/selectors/selector.get-trimmed-selection.ts +15 -13
- package/src/selectors/selector.get-value.ts +4 -4
- package/src/selectors/selector.is-active-decorator.test.ts +5 -9
- package/src/selectors/selector.is-at-the-end-of-block.ts +6 -3
- package/src/selectors/selector.is-at-the-start-of-block.ts +3 -3
- package/src/selectors/selector.is-overlapping-selection.ts +8 -6
- package/src/selectors/selector.is-selection-collapsed.ts +6 -5
- package/src/selectors/selector.is-selection-expanded.ts +2 -2
- package/src/selectors/selectors.ts +59 -59
- package/src/types/block-offset.ts +9 -0
- package/src/utils/index.ts +0 -1
- package/src/utils/util.block-offset.ts +1 -1
- package/src/utils/util.block-offsets-to-selection.ts +1 -1
- package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
- package/lib/_chunks-cjs/plugin.event-listener.cjs.map +0 -1
- package/lib/_chunks-es/plugin.event-listener.js.map +0 -1
- package/src/behaviors/behavior.markdown-emphasis.ts +0 -437
package/lib/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/utils/util.child-selection-point-to-block-offset.ts","../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/utils/util.child-selection-point-to-block-offset.ts","../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function childSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const childKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !childKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (child._key === childKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n if (isPortableTextSpan(child)) {\n offset += child.text.length\n }\n }\n }\n}\n","import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n): block is PortableTextTextBlock {\n return block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport type {EditorContext} from '../selectors'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {isTextBlock, sliceBlocks, type EditorSelectionPoint} from '.'\nimport type {EditorContext} from '../selectors'\nimport {isSpan} from './util.is-span'\n\n/**\n * @beta\n */\nexport function splitTextBlock({\n context,\n block,\n point,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: PortableTextTextBlock\n point: EditorSelectionPoint\n}): {before: PortableTextTextBlock; after: PortableTextTextBlock} | undefined {\n const firstChild = block.children.at(0)\n const lastChild = block.children.at(block.children.length - 1)\n\n if (!firstChild || !lastChild) {\n return undefined\n }\n\n const before = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: {\n path: [{_key: block._key}, 'children', {_key: firstChild._key}],\n offset: 0,\n },\n focus: point,\n },\n }).at(0)\n const after = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: point,\n focus: {\n path: [{_key: block._key}, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n },\n },\n }).at(0)\n\n if (!before || !after) {\n return undefined\n }\n\n if (!isTextBlock(context, before) || !isTextBlock(context, after)) {\n return undefined\n }\n\n return {before, after}\n}\n"],"names":["childSelectionPointToBlockOffset","value","selectionPoint","offset","blockKey","isKeyedSegment","path","_key","undefined","childKey","block","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","isTextBlock","context","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","markDefs","splitTextBlock","point","firstChild","at","lastChild","before","sliceBlocks","blocks","selection","anchor","focus","after","isSpan"],"mappings":";;;;;;AAYO,SAASA,iCAAiC;AAAA,EAC/CC;AAAAA,EACAC;AAIF,GAA4B;AAC1B,MAAIC,SAAS;AAEPC,QAAAA,WAAWC,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC,QACEC,WAAWJ,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC;AAEA,MAAA,EAAA,CAACJ,YAAY,CAACK;AAIlB,eAAWC,SAAST;AAClB,UAAIS,MAAMH,SAASH,YAIdO,wBAAwBD,KAAK;AAIvBE,mBAAAA,SAASF,MAAMG,UAAU;AAClC,cAAID,MAAML,SAASE;AACV,mBAAA;AAAA,cACLH,MAAM,CAAC;AAAA,gBAACC,MAAMG,MAAMH;AAAAA,cAAAA,CAAK;AAAA,cACzBJ,QAAQA,SAASD,eAAeC;AAAAA,YAClC;AAGEW,6BAAmBF,KAAK,MAC1BT,UAAUS,MAAMG,KAAKC;AAAAA,QAAAA;AAAAA;AAI7B;AChDgBC,SAAAA,YACdC,SACAR,OACgC;AAChC,SAAOA,MAAMS,UAAUD,QAAQE,OAAOV,MAAMW;AAC9C;ACHO,SAASC,gBAAgB;AAAA,EAC9BJ;AAAAA,EACAK;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCR;AAAAA,IACAR,OAAOc;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,IAAA;AAAA,EAAI,CAC5B;AAED,SAAI,CAACH,uBAAuB,CAACR,YAAYC,SAASO,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHV,UAAU,CAAC,GAAGU,YAAYV,UAAU,GAAGY,oBAAoBZ,QAAQ;AAAA,IACnEgB,UAAU,CACR,GAAIN,YAAYM,YAAY,CAAA,GAC5B,GAAIJ,oBAAoBI,YAAY,CAAG,CAAA;AAAA,EAE3C;AACF;AC3BO,SAASC,eAAe;AAAA,EAC7BZ;AAAAA,EACAR;AAAAA,EACAqB;AAKF,GAA8E;AAC5E,QAAMC,aAAatB,MAAMG,SAASoB,GAAG,CAAC,GAChCC,YAAYxB,MAAMG,SAASoB,GAAGvB,MAAMG,SAASG,SAAS,CAAC;AAEzD,MAAA,CAACgB,cAAc,CAACE;AAClB;AAGF,QAAMC,SAASC,YAAY;AAAA,IACzBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQ;AAAA,QACNjC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAMyB,WAAWzB;AAAAA,QAAAA,CAAK;AAAA,QAC9DJ,QAAQ;AAAA,MACV;AAAA,MACAqC,OAAOT;AAAAA,IAAAA;AAAAA,EAEV,CAAA,EAAEE,GAAG,CAAC,GACDQ,QAAQL,YAAY;AAAA,IACxBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQR;AAAAA,MACRS,OAAO;AAAA,QACLlC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAM2B,UAAU3B;AAAAA,QAAAA,CAAK;AAAA,QAC7DJ,QAAQuC,OAAOxB,SAASgB,SAAS,IAAIA,UAAUnB,KAAKC,SAAS;AAAA,MAAA;AAAA,IAC/D;AAAA,EACF,CACD,EAAEiB,GAAG,CAAC;AAEP,MAAI,EAACE,CAAAA,UAAU,CAACM,UAIZ,EAACxB,CAAAA,YAAYC,SAASiB,MAAM,KAAK,CAAClB,YAAYC,SAASuB,KAAK;AAIzD,WAAA;AAAA,MAACN;AAAAA,MAAQM;AAAAA,IAAK;AACvB;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portabletext/editor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.35.1",
|
|
4
4
|
"description": "Portable Text Editor made in React",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -79,15 +79,15 @@
|
|
|
79
79
|
"slate-react": "0.112.1",
|
|
80
80
|
"use-effect-event": "^1.0.2",
|
|
81
81
|
"xstate": "^5.19.2",
|
|
82
|
-
"@portabletext/
|
|
83
|
-
"@portabletext/
|
|
82
|
+
"@portabletext/block-tools": "1.1.9",
|
|
83
|
+
"@portabletext/patches": "1.1.3"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
86
|
"@portabletext/toolkit": "^2.0.17",
|
|
87
87
|
"@sanity/diff-match-patch": "^3.2.0",
|
|
88
88
|
"@sanity/pkg-utils": "^7.0.4",
|
|
89
|
-
"@sanity/schema": "^3.
|
|
90
|
-
"@sanity/types": "^3.
|
|
89
|
+
"@sanity/schema": "^3.76.3",
|
|
90
|
+
"@sanity/types": "^3.76.3",
|
|
91
91
|
"@testing-library/jest-dom": "^6.6.3",
|
|
92
92
|
"@testing-library/react": "^16.2.0",
|
|
93
93
|
"@types/debug": "^4.1.12",
|
|
@@ -115,8 +115,8 @@
|
|
|
115
115
|
"racejar": "1.2.0"
|
|
116
116
|
},
|
|
117
117
|
"peerDependencies": {
|
|
118
|
-
"@sanity/schema": "^3.
|
|
119
|
-
"@sanity/types": "^3.
|
|
118
|
+
"@sanity/schema": "^3.76.3",
|
|
119
|
+
"@sanity/types": "^3.76.3",
|
|
120
120
|
"react": "^16.9 || ^17 || ^18 || ^19",
|
|
121
121
|
"rxjs": "^7.8.1"
|
|
122
122
|
},
|
|
@@ -17,13 +17,13 @@ export function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {
|
|
|
17
17
|
return [
|
|
18
18
|
defineBehavior({
|
|
19
19
|
on: 'key.down',
|
|
20
|
-
guard: ({
|
|
20
|
+
guard: ({snapshot, event}) => {
|
|
21
21
|
const isMoveUpShortcut = isHotkey(
|
|
22
22
|
config.moveBlockUpShortcut,
|
|
23
23
|
event.keyboardEvent,
|
|
24
24
|
)
|
|
25
|
-
const firstBlock = selectors.getFirstBlock(
|
|
26
|
-
const selectedBlocks = selectors.getSelectedBlocks(
|
|
25
|
+
const firstBlock = selectors.getFirstBlock(snapshot)
|
|
26
|
+
const selectedBlocks = selectors.getSelectedBlocks(snapshot)
|
|
27
27
|
const blocksAbove =
|
|
28
28
|
firstBlock?.node._key !== selectedBlocks[0]?.node._key
|
|
29
29
|
|
|
@@ -43,13 +43,13 @@ export function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {
|
|
|
43
43
|
}),
|
|
44
44
|
defineBehavior({
|
|
45
45
|
on: 'key.down',
|
|
46
|
-
guard: ({
|
|
46
|
+
guard: ({snapshot, event}) => {
|
|
47
47
|
const isMoveDownShortcut = isHotkey(
|
|
48
48
|
config.moveBlockDownShortcut,
|
|
49
49
|
event.keyboardEvent,
|
|
50
50
|
)
|
|
51
|
-
const lastBlock = selectors.getLastBlock(
|
|
52
|
-
const selectedBlocks = selectors.getSelectedBlocks(
|
|
51
|
+
const lastBlock = selectors.getLastBlock(snapshot)
|
|
52
|
+
const selectedBlocks = selectors.getSelectedBlocks(snapshot)
|
|
53
53
|
const blocksBelow =
|
|
54
54
|
lastBlock?.node._key !==
|
|
55
55
|
selectedBlocks[selectedBlocks.length - 1]?.node._key
|
|
@@ -3,18 +3,19 @@ import {defineBehavior, raise} from './behavior.types'
|
|
|
3
3
|
|
|
4
4
|
const addAnnotationOnCollapsedSelection = defineBehavior({
|
|
5
5
|
on: 'annotation.add',
|
|
6
|
-
guard: ({
|
|
7
|
-
if (!selectors.isSelectionCollapsed(
|
|
6
|
+
guard: ({snapshot}) => {
|
|
7
|
+
if (!selectors.isSelectionCollapsed(snapshot)) {
|
|
8
8
|
return false
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
const caretWordSelection = selectors.getCaretWordSelection(
|
|
11
|
+
const caretWordSelection = selectors.getCaretWordSelection(snapshot)
|
|
12
12
|
|
|
13
13
|
if (
|
|
14
14
|
!caretWordSelection ||
|
|
15
15
|
!selectors.isSelectionExpanded({
|
|
16
|
+
...snapshot,
|
|
16
17
|
context: {
|
|
17
|
-
...context,
|
|
18
|
+
...snapshot.context,
|
|
18
19
|
selection: caretWordSelection,
|
|
19
20
|
},
|
|
20
21
|
})
|
|
@@ -6,10 +6,10 @@ import {defineBehavior, raise} from './behavior.types'
|
|
|
6
6
|
|
|
7
7
|
const arrowDownOnLonelyBlockObject = defineBehavior({
|
|
8
8
|
on: 'key.down',
|
|
9
|
-
guard: ({
|
|
9
|
+
guard: ({snapshot, event}) => {
|
|
10
10
|
const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)
|
|
11
|
-
const focusBlockObject = selectors.getFocusBlockObject(
|
|
12
|
-
const nextBlock = selectors.getNextBlock(
|
|
11
|
+
const focusBlockObject = selectors.getFocusBlockObject(snapshot)
|
|
12
|
+
const nextBlock = selectors.getNextBlock(snapshot)
|
|
13
13
|
|
|
14
14
|
return isArrowDown && focusBlockObject && !nextBlock
|
|
15
15
|
},
|
|
@@ -18,10 +18,10 @@ const arrowDownOnLonelyBlockObject = defineBehavior({
|
|
|
18
18
|
|
|
19
19
|
const arrowUpOnLonelyBlockObject = defineBehavior({
|
|
20
20
|
on: 'key.down',
|
|
21
|
-
guard: ({
|
|
21
|
+
guard: ({snapshot, event}) => {
|
|
22
22
|
const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)
|
|
23
|
-
const focusBlockObject = selectors.getFocusBlockObject(
|
|
24
|
-
const previousBlock = selectors.getPreviousBlock(
|
|
23
|
+
const focusBlockObject = selectors.getFocusBlockObject(snapshot)
|
|
24
|
+
const previousBlock = selectors.getPreviousBlock(snapshot)
|
|
25
25
|
|
|
26
26
|
return isArrowUp && focusBlockObject && !previousBlock
|
|
27
27
|
},
|
|
@@ -35,9 +35,9 @@ const arrowUpOnLonelyBlockObject = defineBehavior({
|
|
|
35
35
|
|
|
36
36
|
const breakingBlockObject = defineBehavior({
|
|
37
37
|
on: 'insert.break',
|
|
38
|
-
guard: ({
|
|
39
|
-
const focusBlockObject = selectors.getFocusBlockObject(
|
|
40
|
-
const collapsedSelection = selectors.isSelectionCollapsed(
|
|
38
|
+
guard: ({snapshot}) => {
|
|
39
|
+
const focusBlockObject = selectors.getFocusBlockObject(snapshot)
|
|
40
|
+
const collapsedSelection = selectors.isSelectionCollapsed(snapshot)
|
|
41
41
|
|
|
42
42
|
return collapsedSelection && focusBlockObject !== undefined
|
|
43
43
|
},
|
|
@@ -46,10 +46,10 @@ const breakingBlockObject = defineBehavior({
|
|
|
46
46
|
|
|
47
47
|
const deletingEmptyTextBlockAfterBlockObject = defineBehavior({
|
|
48
48
|
on: 'delete.backward',
|
|
49
|
-
guard: ({
|
|
50
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
51
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
52
|
-
const previousBlock = selectors.getPreviousBlock(
|
|
49
|
+
guard: ({snapshot}) => {
|
|
50
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
51
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
52
|
+
const previousBlock = selectors.getPreviousBlock(snapshot)
|
|
53
53
|
|
|
54
54
|
if (!focusTextBlock || !selectionCollapsed || !previousBlock) {
|
|
55
55
|
return false
|
|
@@ -83,10 +83,10 @@ const deletingEmptyTextBlockAfterBlockObject = defineBehavior({
|
|
|
83
83
|
|
|
84
84
|
const deletingEmptyTextBlockBeforeBlockObject = defineBehavior({
|
|
85
85
|
on: 'delete.forward',
|
|
86
|
-
guard: ({
|
|
87
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
88
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
89
|
-
const nextBlock = selectors.getNextBlock(
|
|
86
|
+
guard: ({snapshot}) => {
|
|
87
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
88
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
89
|
+
const nextBlock = selectors.getNextBlock(snapshot)
|
|
90
90
|
|
|
91
91
|
if (!focusTextBlock || !selectionCollapsed || !nextBlock) {
|
|
92
92
|
return false
|
|
@@ -4,25 +4,27 @@ import {defineBehavior, raise} from './behavior.types'
|
|
|
4
4
|
export const coreDecoratorBehaviors = {
|
|
5
5
|
strongShortcut: defineBehavior({
|
|
6
6
|
on: 'key.down',
|
|
7
|
-
guard: ({
|
|
7
|
+
guard: ({snapshot, event}) =>
|
|
8
8
|
isHotkey('mod+b', event.keyboardEvent) &&
|
|
9
|
-
context.schema.decorators.some(
|
|
9
|
+
snapshot.context.schema.decorators.some(
|
|
10
10
|
(decorator) => decorator.value === 'strong',
|
|
11
11
|
),
|
|
12
12
|
actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],
|
|
13
13
|
}),
|
|
14
14
|
emShortcut: defineBehavior({
|
|
15
15
|
on: 'key.down',
|
|
16
|
-
guard: ({
|
|
16
|
+
guard: ({snapshot, event}) =>
|
|
17
17
|
isHotkey('mod+i', event.keyboardEvent) &&
|
|
18
|
-
context.schema.decorators.some(
|
|
18
|
+
snapshot.context.schema.decorators.some(
|
|
19
|
+
(decorator) => decorator.value === 'em',
|
|
20
|
+
),
|
|
19
21
|
actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],
|
|
20
22
|
}),
|
|
21
23
|
underlineShortcut: defineBehavior({
|
|
22
24
|
on: 'key.down',
|
|
23
|
-
guard: ({
|
|
25
|
+
guard: ({snapshot, event}) =>
|
|
24
26
|
isHotkey('mod+u', event.keyboardEvent) &&
|
|
25
|
-
context.schema.decorators.some(
|
|
27
|
+
snapshot.context.schema.decorators.some(
|
|
26
28
|
(decorator) => decorator.value === 'underline',
|
|
27
29
|
),
|
|
28
30
|
actions: [
|
|
@@ -31,9 +33,11 @@ export const coreDecoratorBehaviors = {
|
|
|
31
33
|
}),
|
|
32
34
|
codeShortcut: defineBehavior({
|
|
33
35
|
on: 'key.down',
|
|
34
|
-
guard: ({
|
|
36
|
+
guard: ({snapshot, event}) =>
|
|
35
37
|
isHotkey("mod+'", event.keyboardEvent) &&
|
|
36
|
-
context.schema.decorators.some(
|
|
38
|
+
snapshot.context.schema.decorators.some(
|
|
39
|
+
(decorator) => decorator.value === 'code',
|
|
40
|
+
),
|
|
37
41
|
actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],
|
|
38
42
|
}),
|
|
39
43
|
}
|
|
@@ -3,17 +3,16 @@ import {defineBehavior, raise} from './behavior.types'
|
|
|
3
3
|
|
|
4
4
|
const breakingAtTheEndOfTextBlock = defineBehavior({
|
|
5
5
|
on: 'insert.break',
|
|
6
|
-
guard: ({
|
|
7
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
8
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
6
|
+
guard: ({snapshot}) => {
|
|
7
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
8
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
9
9
|
|
|
10
|
-
if (!context.selection || !focusTextBlock || !selectionCollapsed) {
|
|
10
|
+
if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {
|
|
11
11
|
return false
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const atTheEndOfBlock =
|
|
15
|
-
|
|
16
|
-
})
|
|
14
|
+
const atTheEndOfBlock =
|
|
15
|
+
selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)
|
|
17
16
|
|
|
18
17
|
const focusListItem = focusTextBlock.node.listItem
|
|
19
18
|
const focusLevel = focusTextBlock.node.level
|
|
@@ -25,16 +24,16 @@ const breakingAtTheEndOfTextBlock = defineBehavior({
|
|
|
25
24
|
return false
|
|
26
25
|
},
|
|
27
26
|
actions: [
|
|
28
|
-
({
|
|
27
|
+
({snapshot}, {focusListItem, focusLevel}) => [
|
|
29
28
|
raise({
|
|
30
29
|
type: 'insert.block',
|
|
31
30
|
block: {
|
|
32
|
-
_type: context.schema.block.name,
|
|
33
|
-
_key: context.keyGenerator(),
|
|
31
|
+
_type: snapshot.context.schema.block.name,
|
|
32
|
+
_key: snapshot.context.keyGenerator(),
|
|
34
33
|
children: [
|
|
35
34
|
{
|
|
36
|
-
_key: context.keyGenerator(),
|
|
37
|
-
_type: context.schema.span.name,
|
|
35
|
+
_key: snapshot.context.keyGenerator(),
|
|
36
|
+
_type: snapshot.context.schema.span.name,
|
|
38
37
|
text: '',
|
|
39
38
|
marks: [],
|
|
40
39
|
},
|
|
@@ -42,7 +41,7 @@ const breakingAtTheEndOfTextBlock = defineBehavior({
|
|
|
42
41
|
markDefs: [],
|
|
43
42
|
listItem: focusListItem,
|
|
44
43
|
level: focusLevel,
|
|
45
|
-
style: context.schema.styles[0]?.value,
|
|
44
|
+
style: snapshot.context.schema.styles[0]?.value,
|
|
46
45
|
},
|
|
47
46
|
placement: 'after',
|
|
48
47
|
}),
|
|
@@ -52,35 +51,34 @@ const breakingAtTheEndOfTextBlock = defineBehavior({
|
|
|
52
51
|
|
|
53
52
|
const breakingAtTheStartOfTextBlock = defineBehavior({
|
|
54
53
|
on: 'insert.break',
|
|
55
|
-
guard: ({
|
|
56
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
57
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
54
|
+
guard: ({snapshot}) => {
|
|
55
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
56
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
58
57
|
|
|
59
|
-
if (!context.selection || !focusTextBlock || !selectionCollapsed) {
|
|
58
|
+
if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {
|
|
60
59
|
return false
|
|
61
60
|
}
|
|
62
61
|
|
|
63
|
-
const focusSpan = selectors.getFocusSpan(
|
|
62
|
+
const focusSpan = selectors.getFocusSpan(snapshot)
|
|
64
63
|
|
|
65
64
|
const focusDecorators = focusSpan?.node.marks?.filter(
|
|
66
65
|
(mark) =>
|
|
67
|
-
context.schema.decorators.some(
|
|
66
|
+
snapshot.context.schema.decorators.some(
|
|
68
67
|
(decorator) => decorator.value === mark,
|
|
69
68
|
) ?? [],
|
|
70
69
|
)
|
|
71
70
|
const focusAnnotations =
|
|
72
71
|
focusSpan?.node.marks?.filter(
|
|
73
72
|
(mark) =>
|
|
74
|
-
!context.schema.decorators.some(
|
|
73
|
+
!snapshot.context.schema.decorators.some(
|
|
75
74
|
(decorator) => decorator.value === mark,
|
|
76
75
|
),
|
|
77
76
|
) ?? []
|
|
78
77
|
const focusListItem = focusTextBlock.node.listItem
|
|
79
78
|
const focusLevel = focusTextBlock.node.level
|
|
80
79
|
|
|
81
|
-
const atTheStartOfBlock =
|
|
82
|
-
|
|
83
|
-
})
|
|
80
|
+
const atTheStartOfBlock =
|
|
81
|
+
selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)
|
|
84
82
|
|
|
85
83
|
if (atTheStartOfBlock) {
|
|
86
84
|
return {focusAnnotations, focusDecorators, focusListItem, focusLevel}
|
|
@@ -90,25 +88,25 @@ const breakingAtTheStartOfTextBlock = defineBehavior({
|
|
|
90
88
|
},
|
|
91
89
|
actions: [
|
|
92
90
|
(
|
|
93
|
-
{
|
|
91
|
+
{snapshot},
|
|
94
92
|
{focusAnnotations, focusDecorators, focusListItem, focusLevel},
|
|
95
93
|
) => [
|
|
96
94
|
raise({
|
|
97
95
|
type: 'insert.block',
|
|
98
96
|
block: {
|
|
99
|
-
_key: context.keyGenerator(),
|
|
100
|
-
_type: context.schema.block.name,
|
|
97
|
+
_key: snapshot.context.keyGenerator(),
|
|
98
|
+
_type: snapshot.context.schema.block.name,
|
|
101
99
|
children: [
|
|
102
100
|
{
|
|
103
|
-
_key: context.keyGenerator(),
|
|
104
|
-
_type: context.schema.span.name,
|
|
101
|
+
_key: snapshot.context.keyGenerator(),
|
|
102
|
+
_type: snapshot.context.schema.span.name,
|
|
105
103
|
marks: focusAnnotations.length === 0 ? focusDecorators : [],
|
|
106
104
|
text: '',
|
|
107
105
|
},
|
|
108
106
|
],
|
|
109
107
|
listItem: focusListItem,
|
|
110
108
|
level: focusLevel,
|
|
111
|
-
style: context.schema.styles[0]?.value,
|
|
109
|
+
style: snapshot.context.schema.styles[0]?.value,
|
|
112
110
|
},
|
|
113
111
|
placement: 'before',
|
|
114
112
|
}),
|
|
@@ -8,10 +8,10 @@ const MAX_LIST_LEVEL = 10
|
|
|
8
8
|
|
|
9
9
|
const clearListOnBackspace = defineBehavior({
|
|
10
10
|
on: 'delete.backward',
|
|
11
|
-
guard: ({
|
|
12
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
13
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
14
|
-
const focusSpan = selectors.getFocusSpan(
|
|
11
|
+
guard: ({snapshot}) => {
|
|
12
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
13
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
14
|
+
const focusSpan = selectors.getFocusSpan(snapshot)
|
|
15
15
|
|
|
16
16
|
if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
|
|
17
17
|
return false
|
|
@@ -19,7 +19,7 @@ const clearListOnBackspace = defineBehavior({
|
|
|
19
19
|
|
|
20
20
|
const atTheBeginningOfBLock =
|
|
21
21
|
focusTextBlock.node.children[0]._key === focusSpan.node._key &&
|
|
22
|
-
context.selection?.focus.offset === 0
|
|
22
|
+
snapshot.context.selection?.focus.offset === 0
|
|
23
23
|
|
|
24
24
|
if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {
|
|
25
25
|
return {focusTextBlock}
|
|
@@ -40,10 +40,10 @@ const clearListOnBackspace = defineBehavior({
|
|
|
40
40
|
|
|
41
41
|
const unindentListOnBackspace = defineBehavior({
|
|
42
42
|
on: 'delete.backward',
|
|
43
|
-
guard: ({
|
|
44
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
45
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
46
|
-
const focusSpan = selectors.getFocusSpan(
|
|
43
|
+
guard: ({snapshot}) => {
|
|
44
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
45
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
46
|
+
const focusSpan = selectors.getFocusSpan(snapshot)
|
|
47
47
|
|
|
48
48
|
if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
|
|
49
49
|
return false
|
|
@@ -51,7 +51,7 @@ const unindentListOnBackspace = defineBehavior({
|
|
|
51
51
|
|
|
52
52
|
const atTheBeginningOfBLock =
|
|
53
53
|
focusTextBlock.node.children[0]._key === focusSpan.node._key &&
|
|
54
|
-
context.selection?.focus.offset === 0
|
|
54
|
+
snapshot.context.selection?.focus.offset === 0
|
|
55
55
|
|
|
56
56
|
if (
|
|
57
57
|
atTheBeginningOfBLock &&
|
|
@@ -76,9 +76,9 @@ const unindentListOnBackspace = defineBehavior({
|
|
|
76
76
|
|
|
77
77
|
const clearListOnEnter = defineBehavior({
|
|
78
78
|
on: 'insert.break',
|
|
79
|
-
guard: ({
|
|
80
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
81
|
-
const focusListBlock = selectors.getFocusListBlock(
|
|
79
|
+
guard: ({snapshot}) => {
|
|
80
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
81
|
+
const focusListBlock = selectors.getFocusListBlock(snapshot)
|
|
82
82
|
|
|
83
83
|
if (
|
|
84
84
|
!selectionCollapsed ||
|
|
@@ -103,15 +103,15 @@ const clearListOnEnter = defineBehavior({
|
|
|
103
103
|
|
|
104
104
|
const indentListOnTab = defineBehavior({
|
|
105
105
|
on: 'key.down',
|
|
106
|
-
guard: ({
|
|
106
|
+
guard: ({snapshot, event}) => {
|
|
107
107
|
const isTab = isHotkey('Tab', event.keyboardEvent)
|
|
108
108
|
|
|
109
109
|
if (!isTab) {
|
|
110
110
|
return false
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
const selectedBlocks = selectors.getSelectedBlocks(
|
|
114
|
-
const guards = createGuards(context)
|
|
113
|
+
const selectedBlocks = selectors.getSelectedBlocks(snapshot)
|
|
114
|
+
const guards = createGuards(snapshot.context)
|
|
115
115
|
const selectedListBlocks = selectedBlocks.flatMap((block) =>
|
|
116
116
|
guards.isListBlock(block.node)
|
|
117
117
|
? [
|
|
@@ -148,15 +148,15 @@ const indentListOnTab = defineBehavior({
|
|
|
148
148
|
|
|
149
149
|
const unindentListOnShiftTab = defineBehavior({
|
|
150
150
|
on: 'key.down',
|
|
151
|
-
guard: ({
|
|
151
|
+
guard: ({snapshot, event}) => {
|
|
152
152
|
const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)
|
|
153
153
|
|
|
154
154
|
if (!isShiftTab) {
|
|
155
155
|
return false
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
const selectedBlocks = selectors.getSelectedBlocks(
|
|
159
|
-
const guards = createGuards(context)
|
|
158
|
+
const selectedBlocks = selectors.getSelectedBlocks(snapshot)
|
|
159
|
+
const guards = createGuards(snapshot.context)
|
|
160
160
|
const selectedListBlocks = selectedBlocks.flatMap((block) =>
|
|
161
161
|
guards.isListBlock(block.node)
|
|
162
162
|
? [
|