@@ -63,6 +63,7 @@ export function SlideRenderer({
6363 const isDraggingRef = useRef ( false )
6464 const isResizingRef = useRef ( false )
6565 const [ editingTextElementId , setEditingTextElementId ] = useState < string | null > ( null )
66+ const [ draftTextLinesMap , setDraftTextLinesMap ] = useState < Record < string , TextLine [ ] > > ( { } )
6667 const backgroundImageUrl = slide . backgroundImage ? resourceMap [ slide . backgroundImage ] : null
6768 const scaledWidth = slide . width * scale
6869 const scaledHeight = slide . height * scale
@@ -113,16 +114,19 @@ export function SlideRenderer({
113114 useEffect ( ( ) => {
114115 if ( ! isEditMode ) {
115116 setEditingTextElementId ( null )
117+ setDraftTextLinesMap ( { } )
116118 }
117119 } , [ isEditMode , slide . id ] )
118120
119121 useEffect ( ( ) => {
120122 if ( ! selectedElementId ) {
121123 setEditingTextElementId ( null )
124+ setDraftTextLinesMap ( { } )
122125 return
123126 }
124127 if ( editingTextElementId && selectedElementId !== editingTextElementId ) {
125128 setEditingTextElementId ( null )
129+ setDraftTextLinesMap ( { } )
126130 }
127131 } , [ editingTextElementId , selectedElementId ] )
128132
@@ -309,6 +313,9 @@ export function SlideRenderer({
309313 { slide . elements . map ( element => {
310314 if ( elementRenderStates [ element . id ] === false ) return null
311315 const bounds = resolveElementBounds ( element )
316+ const renderedElement = element . type === 'text' && draftTextLinesMap [ element . id ]
317+ ? { ...element , textLines : draftTextLinesMap [ element . id ] }
318+ : element
312319 return (
313320 < div
314321 key = { element . id }
@@ -345,7 +352,7 @@ export function SlideRenderer({
345352 } }
346353 >
347354 < ElementRenderer
348- element = { element }
355+ element = { renderedElement }
349356 scale = { 1 }
350357 resourceMap = { resourceMap }
351358 slideIndex = { slideIndex }
@@ -356,9 +363,27 @@ export function SlideRenderer({
356363 < EditableTextOverlay
357364 element = { element }
358365 onCancel = { ( ) => {
366+ setDraftTextLinesMap ( prev => {
367+ if ( ! prev [ element . id ] ) return prev
368+ const next = { ...prev }
369+ delete next [ element . id ]
370+ return next
371+ } )
359372 setEditingTextElementId ( null )
360373 } }
374+ onLiveChange = { nextTextLines => {
375+ setDraftTextLinesMap ( prev => ( {
376+ ...prev ,
377+ [ element . id ] : nextTextLines
378+ } ) )
379+ } }
361380 onCommit = { nextTextLines => {
381+ setDraftTextLinesMap ( prev => {
382+ if ( ! prev [ element . id ] ) return prev
383+ const next = { ...prev }
384+ delete next [ element . id ]
385+ return next
386+ } )
362387 onEditTextUpdate ?.( element . id , nextTextLines )
363388 setEditingTextElementId ( null )
364389 } }
0 commit comments