@@ -23,7 +23,7 @@ import { useStore } from '../data/store';
2323import ContextMenu , { type MenuItem } from '../edit/ContextMenu' ;
2424import SlideView from '../slide/SlideView' ;
2525import Thumb from './Thumb' ;
26- import { IconClose } from './icons' ;
26+ import { IconClose , IconTrash } from './icons' ;
2727import { useScrolled } from './deckHooks' ;
2828import { STAGE_LAYOUT_TRANSITION } from './stageLayout' ;
2929
@@ -160,6 +160,7 @@ function SortableThumb({
160160 onOpen,
161161 onKeyDown,
162162 onMenu,
163+ onDelete,
163164} : {
164165 slide : SlideData ;
165166 index : number ;
@@ -173,6 +174,7 @@ function SortableThumb({
173174 onOpen ?: ( ) => void ;
174175 onKeyDown ?: ( event : React . KeyboardEvent < HTMLButtonElement > ) => void ;
175176 onMenu : ( event : React . MouseEvent ) => void ;
177+ onDelete ?: ( ) => void ;
176178} ) {
177179 const {
178180 attributes,
@@ -187,34 +189,50 @@ function SortableThumb({
187189 const label = grid
188190 ? `Slide ${ index + 1 } ${ name ? ' — ' + name : '' } . Double-click to open.`
189191 : `Go to slide ${ index + 1 } ${ name ? ' — ' + name : '' } ` ;
192+ const showTrash = ! ! ( onDelete && grid && selected ) ;
193+ const dragStyle = {
194+ transform : CSS . Transform . toString ( transform ) ,
195+ transition,
196+ opacity : isDragging ? 0.55 : 1 ,
197+ } ;
190198
191199 return (
192- < button
193- ref = { ( node ) => {
194- setNodeRef ( node ) ;
195- thumbRef ?.( node ) ;
196- } }
197- type = "button"
198- style = { {
199- transform : CSS . Transform . toString ( transform ) ,
200- transition,
201- opacity : isDragging ? 0.55 : 1 ,
202- } }
203- className = { thumbClass ( grid , active , selected ) }
204- aria-label = { label }
205- aria-current = { active ? 'true' : undefined }
206- { ...attributes }
207- { ...listeners }
208- tabIndex = { tabIndex }
209- role = { grid ? 'option' : undefined }
210- aria-selected = { grid ? selected : undefined }
211- onClick = { onPick }
212- onDoubleClick = { onOpen }
213- onKeyDown = { onKeyDown }
214- onContextMenu = { onMenu }
215- >
216- < ThumbBody slide = { slide } index = { index } grid = { grid } />
217- </ button >
200+ < div ref = { setNodeRef } className = "noir-thumb-shell" style = { dragStyle } >
201+ < button
202+ ref = { thumbRef }
203+ type = "button"
204+ className = { thumbClass ( grid , active , selected ) }
205+ aria-label = { label }
206+ aria-current = { active ? 'true' : undefined }
207+ { ...attributes }
208+ { ...listeners }
209+ tabIndex = { tabIndex }
210+ role = { grid ? 'option' : undefined }
211+ aria-selected = { grid ? selected : undefined }
212+ onClick = { onPick }
213+ onDoubleClick = { onOpen }
214+ onKeyDown = { onKeyDown }
215+ onContextMenu = { onMenu }
216+ >
217+ < ThumbBody slide = { slide } index = { index } grid = { grid } />
218+ </ button >
219+ { showTrash && (
220+ < button
221+ type = "button"
222+ className = "noir-thumb-trash"
223+ data-tip = "Delete"
224+ aria-label = { `Delete slide ${ index + 1 } ` }
225+ onPointerDown = { ( event ) => event . stopPropagation ( ) }
226+ onClick = { ( event ) => {
227+ event . preventDefault ( ) ;
228+ event . stopPropagation ( ) ;
229+ onDelete ( ) ;
230+ } }
231+ >
232+ < IconTrash />
233+ </ button >
234+ ) }
235+ </ div >
218236 ) ;
219237}
220238
@@ -223,6 +241,7 @@ export default function SlideBrowser({
223241 current,
224242 browse,
225243 mutable = false ,
244+ canDelete = false ,
226245 navLabel,
227246 onGo,
228247 onClose,
@@ -231,6 +250,8 @@ export default function SlideBrowser({
231250 current : number ;
232251 browse : BrowseMode ;
233252 mutable ?: boolean ;
253+ /** Editor-only: trash on the selected grid thumb. Hidden in present/published. */
254+ canDelete ?: boolean ;
234255 navLabel ?: ( index : number ) => string | undefined ;
235256 onGo : ( index : number ) => void ;
236257 onClose : ( ) => void ;
@@ -388,6 +409,9 @@ export default function SlideBrowser({
388409 onOpen = { onOpen }
389410 onKeyDown = { onKeyDown }
390411 onMenu = { ( event ) => onMenu ( event , slide . id ) }
412+ onDelete = {
413+ canDelete && grid ? ( ) => deleteSlide ( slide . id ) : undefined
414+ }
391415 />
392416 ) ;
393417 } ) ;
0 commit comments