@@ -122,15 +122,22 @@ const DocTitleInput = ({ doc }: DocTitleProps) => {
122122 if ( isTopRoot ) {
123123 const sanitizedTitle = updateDocTitle ( doc , inputText ) ;
124124 setTitleDisplay ( sanitizedTitle ) ;
125+ return sanitizedTitle ;
125126 } else {
126- const sanitizedTitle = updateDocTitle (
127- doc ,
128- emoji ? `${ emoji } ${ inputText } ` : inputText ,
129- ) ;
127+ const { emoji : pastedEmoji } = getEmojiAndTitle ( inputText ) ;
128+ const textPreservingPastedEmoji = pastedEmoji
129+ ? `\u200B${ inputText } `
130+ : inputText ;
131+ const finalTitle = emoji
132+ ? `${ emoji } ${ textPreservingPastedEmoji } `
133+ : textPreservingPastedEmoji ;
134+
135+ const sanitizedTitle = updateDocTitle ( doc , finalTitle ) ;
130136 const { titleWithoutEmoji : sanitizedTitleWithoutEmoji } =
131137 getEmojiAndTitle ( sanitizedTitle ) ;
132138
133139 setTitleDisplay ( sanitizedTitleWithoutEmoji ) ;
140+ return sanitizedTitleWithoutEmoji ;
134141 }
135142 } ,
136143 [ updateDocTitle , doc , emoji , isTopRoot ] ,
@@ -139,7 +146,10 @@ const DocTitleInput = ({ doc }: DocTitleProps) => {
139146 const handleKeyDown = ( e : React . KeyboardEvent ) => {
140147 if ( e . key === 'Enter' ) {
141148 e . preventDefault ( ) ;
142- handleTitleSubmit ( e . currentTarget . textContent || '' ) ;
149+ const nextDisplay = handleTitleSubmit ( e . currentTarget . textContent || '' ) ;
150+ if ( typeof nextDisplay === 'string' ) {
151+ e . currentTarget . textContent = nextDisplay ;
152+ }
143153 }
144154 } ;
145155
@@ -168,9 +178,15 @@ const DocTitleInput = ({ doc }: DocTitleProps) => {
168178 suppressContentEditableWarning = { true }
169179 aria-label = { `${ t ( 'Document title' ) } ` }
170180 aria-multiline = { false }
171- onBlurCapture = { ( event ) =>
172- handleTitleSubmit ( event . target . textContent || '' )
173- }
181+ onBlurCapture = { ( event ) => {
182+ const nextDisplay = handleTitleSubmit (
183+ event . target . textContent || '' ,
184+ ) ;
185+ // Immediately reflect sanitized display in the editable field
186+ if ( typeof nextDisplay === 'string' ) {
187+ event . target . textContent = nextDisplay ;
188+ }
189+ } }
174190 $color = { colorsTokens [ 'greyscale-1000' ] }
175191 $padding = { { right : 'big' } }
176192 $css = { css `
0 commit comments