@@ -8,6 +8,7 @@ import { getState, setState } from "./core/state.js";
88import { setLocale } from "./core/i18n.js" ;
99import { marked } from "marked" ;
1010import * as docCache from "./core/doc-cache.js" ;
11+ import { getCursorOffset , restoreCursor } from "./components/editor.js" ;
1112
1213let _syncId = 0 ;
1314let _lastReceivedSyncId = - 1 ;
@@ -152,7 +153,7 @@ export function initBridge() {
152153 // Undo/redo is routed through CM5's undo stack so both editors stay in sync.
153154 // Unhandled modifier shortcuts are forwarded to Phoenix's keybinding manager.
154155 const _mdEditorHandledKeys = new Set ( [ "b" , "i" , "k" , "u" , "z" , "y" , "a" , "c" , "v" , "x" ] ) ; // Ctrl/Cmd + key
155- const _mdEditorHandledShiftKeys = new Set ( [ "x" , "X" , "z" ] ) ; // Ctrl/Cmd + Shift + key
156+ const _mdEditorHandledShiftKeys = new Set ( [ "x" , "X" , "z" , "Z" ] ) ; // Ctrl/Cmd + Shift + key
156157
157158 document . addEventListener ( "keydown" , ( e ) => {
158159 if ( e . key === "Escape" ) {
@@ -196,14 +197,14 @@ export function initBridge() {
196197 const isMod = _isMac ? e . metaKey : e . ctrlKey ;
197198 if ( ! isMod ) return ;
198199
199- if ( e . key === "z" && ! e . shiftKey ) {
200+ if ( ( e . key === "z" || e . key === "Z" ) && ! e . shiftKey ) {
200201 e . preventDefault ( ) ;
201202 e . stopImmediatePropagation ( ) ;
202203 sendToParent ( "mdviewrUndo" , { } ) ;
203204 return ;
204205 }
205206
206- if ( ( e . key === "z" && e . shiftKey ) || e . key === "y" ) {
207+ if ( ( ( e . key === "z" || e . key === "Z" ) && e . shiftKey ) || e . key === "y" ) {
207208 e . preventDefault ( ) ;
208209 e . stopImmediatePropagation ( ) ;
209210 sendToParent ( "mdviewrRedo" , { } ) ;
@@ -378,17 +379,27 @@ function handleUpdateContent(data) {
378379 if ( entry ) {
379380 entry . mdSrc = markdown ;
380381 entry . parseResult = parseResult ;
381- // Don't replace innerHTML — let file:rendered handle it
382- // since the editor may be active
383382 }
384383 }
385384
386385 setState ( {
387386 currentContent : markdown ,
388387 parseResult : parseResult
389388 } ) ;
389+
390+ // In edit mode, save/restore cursor around re-render
391+ const content = document . getElementById ( "viewer-content" ) ;
392+ let savedCursorOffset = null ;
393+ if ( getState ( ) . editMode && content && document . activeElement === content ) {
394+ savedCursorOffset = getCursorOffset ( content ) ;
395+ }
396+
390397 emit ( "file:rendered" , parseResult ) ;
391398
399+ if ( savedCursorOffset !== null && content ) {
400+ restoreCursor ( content , savedCursorOffset ) ;
401+ }
402+
392403 _suppressContentChange = false ;
393404}
394405
0 commit comments