@@ -19,6 +19,7 @@ import {
1919 ChipModalTabs ,
2020 Code ,
2121 cn ,
22+ DetailsPanel ,
2223 DropdownMenu ,
2324 DropdownMenuContent ,
2425 DropdownMenuItem ,
@@ -804,79 +805,64 @@ export const LogDetails = memo(function LogDetails({
804805 } , [ isOpen , onClose , hasPrev , hasNext , onNavigatePrev , onNavigateNext ] )
805806
806807 return (
807- < >
808- { /* Resize Handle - positioned outside the panel */ }
809- { isOpen && (
810- < div
811- className = 'absolute top-0 bottom-0 z-[var(--z-dropdown)] w-[8px] cursor-ew-resize'
812- style = { { right : `calc(${ effectiveWidth } - 4px)` } }
813- onMouseDown = { handleMouseDown }
814- role = 'separator'
815- aria-label = 'Resize log details panel'
816- aria-orientation = 'vertical'
817- />
818- ) }
819-
820- < div
821- className = { cn (
822- 'absolute top-0 right-0 bottom-0 z-[var(--z-dropdown)] overflow-hidden border-l bg-[var(--bg)] shadow-md transition-transform duration-200 ease-out' ,
823- isOpen ? 'translate-x-0' : 'translate-x-full'
824- ) }
825- style = { { width : effectiveWidth } }
826- aria-label = 'Log details sidebar'
827- >
828- { log && (
829- < div className = 'flex h-full flex-col px-3.5 pt-3' >
830- { /* Header */ }
831- < div className = 'flex items-center justify-between' >
832- < h2 className = 'text-[var(--text-primary)] text-sm' > Log Details</ h2 >
833- < div className = 'flex items-center gap-[1px]' >
834- { log . status === 'failed' &&
835- ( log . workflow ?. id || log . workflowId ) &&
836- log . trigger !== 'mothership' && (
837- < Tooltip . Root >
838- < Tooltip . Trigger asChild >
839- < Button
840- variant = 'ghost'
841- iconPadding = 'sm'
842- onClick = { ( ) => onRetryExecution ?.( ) }
843- disabled = { isRetryPending }
844- aria-label = 'Retry execution'
845- >
846- < Redo className = 'size-[14px]' />
847- </ Button >
848- </ Tooltip . Trigger >
849- < Tooltip . Content side = 'bottom' > Retry</ Tooltip . Content >
850- </ Tooltip . Root >
851- ) }
852- < Button
853- variant = 'ghost'
854- iconPadding = 'sm'
855- onClick = { ( ) => hasPrev && onNavigatePrev ?.( ) }
856- disabled = { ! hasPrev }
857- aria-label = 'Previous log'
858- >
859- < ChevronUp className = 'size-[14px]' />
860- </ Button >
861- < Button
862- variant = 'ghost'
863- iconPadding = 'sm'
864- onClick = { ( ) => hasNext && onNavigateNext ?.( ) }
865- disabled = { ! hasNext }
866- aria-label = 'Next log'
867- >
868- < ChevronUp className = 'size-[14px] rotate-180' />
869- </ Button >
870- < Button variant = 'ghost' iconPadding = 'sm' onClick = { onClose } aria-label = 'Close' >
871- < X className = 'size-[14px]' />
872- </ Button >
873- </ div >
808+ < DetailsPanel
809+ open = { isOpen }
810+ width = { effectiveWidth }
811+ onResizeStart = { handleMouseDown }
812+ resizeLabel = 'Resize log details panel'
813+ aria-label = 'Log details sidebar'
814+ >
815+ { log && (
816+ < div className = 'flex h-full flex-col px-3.5 pt-3' >
817+ { /* Header */ }
818+ < div className = 'flex items-center justify-between' >
819+ < h2 className = 'text-[var(--text-primary)] text-sm' > Log Details</ h2 >
820+ < div className = 'flex items-center gap-[1px]' >
821+ { log . status === 'failed' &&
822+ ( log . workflow ?. id || log . workflowId ) &&
823+ log . trigger !== 'mothership' && (
824+ < Tooltip . Root >
825+ < Tooltip . Trigger asChild >
826+ < Button
827+ variant = 'ghost'
828+ iconPadding = 'sm'
829+ onClick = { ( ) => onRetryExecution ?.( ) }
830+ disabled = { isRetryPending }
831+ aria-label = 'Retry execution'
832+ >
833+ < Redo className = 'size-[14px]' />
834+ </ Button >
835+ </ Tooltip . Trigger >
836+ < Tooltip . Content side = 'bottom' > Retry</ Tooltip . Content >
837+ </ Tooltip . Root >
838+ ) }
839+ < Button
840+ variant = 'ghost'
841+ iconPadding = 'sm'
842+ onClick = { ( ) => hasPrev && onNavigatePrev ?.( ) }
843+ disabled = { ! hasPrev }
844+ aria-label = 'Previous log'
845+ >
846+ < ChevronUp className = 'size-[14px]' />
847+ </ Button >
848+ < Button
849+ variant = 'ghost'
850+ iconPadding = 'sm'
851+ onClick = { ( ) => hasNext && onNavigateNext ?.( ) }
852+ disabled = { ! hasNext }
853+ aria-label = 'Next log'
854+ >
855+ < ChevronUp className = 'size-[14px] rotate-180' />
856+ </ Button >
857+ < Button variant = 'ghost' iconPadding = 'sm' onClick = { onClose } aria-label = 'Close' >
858+ < X className = 'size-[14px]' />
859+ </ Button >
874860 </ div >
875-
876- < LogDetailsContent log = { log } onActiveTabChange = { handleActiveTabChange } />
877861 </ div >
878- ) }
879- </ div >
880- </ >
862+
863+ < LogDetailsContent log = { log } onActiveTabChange = { handleActiveTabChange } />
864+ </ div >
865+ ) }
866+ </ DetailsPanel >
881867 )
882868} )
0 commit comments