3
3
$createParagraphNode ,
4
4
$getSelection ,
5
5
$isDecoratorNode ,
6
- COMMAND_PRIORITY_LOW , KEY_ARROW_DOWN_COMMAND ,
6
+ COMMAND_PRIORITY_LOW , KEY_ARROW_DOWN_COMMAND , KEY_ARROW_UP_COMMAND ,
7
7
KEY_BACKSPACE_COMMAND ,
8
8
KEY_DELETE_COMMAND ,
9
9
KEY_ENTER_COMMAND , KEY_TAB_COMMAND ,
@@ -43,7 +43,7 @@ function deleteSingleSelectedNode(editor: LexicalEditor) {
43
43
}
44
44
45
45
/**
46
- * Insert a new empty node after the selection if the selection contains a single
46
+ * Insert a new empty node before/ after the selection if the selection contains a single
47
47
* selected node (like image, media etc...).
48
48
*/
49
49
function insertAfterSingleSelectedNode ( editor : LexicalEditor , event : KeyboardEvent | null ) : boolean {
@@ -67,6 +67,37 @@ function insertAfterSingleSelectedNode(editor: LexicalEditor, event: KeyboardEve
67
67
return false ;
68
68
}
69
69
70
+ function focusAdjacentOrInsertForSingleSelectNode ( editor : LexicalEditor , event : KeyboardEvent | null , after : boolean = true ) : boolean {
71
+ const selectionNodes = getLastSelection ( editor ) ?. getNodes ( ) || [ ] ;
72
+ if ( ! isSingleSelectedNode ( selectionNodes ) ) {
73
+ return false ;
74
+ }
75
+
76
+ event ?. preventDefault ( ) ;
77
+
78
+ const node = selectionNodes [ 0 ] ;
79
+ const nearestBlock = $getNearestNodeBlockParent ( node ) || node ;
80
+ let target = after ? nearestBlock . getNextSibling ( ) : nearestBlock . getPreviousSibling ( ) ;
81
+
82
+ requestAnimationFrame ( ( ) => {
83
+ editor . update ( ( ) => {
84
+ if ( ! target ) {
85
+ target = $createParagraphNode ( ) ;
86
+ if ( after ) {
87
+ nearestBlock . insertAfter ( target )
88
+ } else {
89
+ nearestBlock . insertBefore ( target ) ;
90
+ }
91
+ }
92
+
93
+ target . selectStart ( ) ;
94
+ } ) ;
95
+ } ) ;
96
+
97
+
98
+ return true ;
99
+ }
100
+
70
101
/**
71
102
* Insert a new node after a details node, if inside a details node that's
72
103
* the last element, and if the cursor is at the last block within the details node.
@@ -199,15 +230,21 @@ export function registerKeyboardHandling(context: EditorUiContext): () => void {
199
230
return handleInsetOnTab ( context . editor , event ) ;
200
231
} , COMMAND_PRIORITY_LOW ) ;
201
232
233
+ const unregisterUp = context . editor . registerCommand ( KEY_ARROW_UP_COMMAND , ( event ) : boolean => {
234
+ return focusAdjacentOrInsertForSingleSelectNode ( context . editor , event , false ) ;
235
+ } , COMMAND_PRIORITY_LOW ) ;
236
+
202
237
const unregisterDown = context . editor . registerCommand ( KEY_ARROW_DOWN_COMMAND , ( event ) : boolean => {
203
- return insertAfterDetails ( context . editor , event ) ;
238
+ return insertAfterDetails ( context . editor , event )
239
+ || focusAdjacentOrInsertForSingleSelectNode ( context . editor , event , true )
204
240
} , COMMAND_PRIORITY_LOW ) ;
205
241
206
242
return ( ) => {
207
243
unregisterBackspace ( ) ;
208
244
unregisterDelete ( ) ;
209
245
unregisterEnter ( ) ;
210
246
unregisterTab ( ) ;
247
+ unregisterUp ( ) ;
211
248
unregisterDown ( ) ;
212
249
} ;
213
250
}
0 commit comments