Refactor right-side stack panel to simplify open state management and remove pinning functionality
This commit is contained in:
+12
-18
@@ -176,9 +176,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
// Settings open state
|
// Settings open state
|
||||||
// (top bar removed; stack browser moved to right-side panel)
|
// (top bar removed; stack browser moved to right-side panel)
|
||||||
|
|
||||||
// Right-side stack panel pinned state (false = auto-hide, true = pinned open)
|
// Right-side stack panel open state (toggled by button)
|
||||||
const [stackPanelPinned, setStackPanelPinned] = useState(false);
|
|
||||||
// Local open state toggled by small button (replaces hover-to-open)
|
|
||||||
const [stackPanelOpen, setStackPanelOpen] = useState(false);
|
const [stackPanelOpen, setStackPanelOpen] = useState(false);
|
||||||
|
|
||||||
const [fullscreenHoverIdx, setFullscreenHoverIdx] = useState<number | null>(null);
|
const [fullscreenHoverIdx, setFullscreenHoverIdx] = useState<number | null>(null);
|
||||||
@@ -2995,7 +2993,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
{/* Right-side stack panel is implemented in the main content flex container below */}
|
{/* Right-side stack panel is implemented in the main content flex container below */}
|
||||||
|
|
||||||
{/* Floating right-edge toggle — always visible so users can open the panel */}
|
{/* Floating right-edge toggle — always visible so users can open the panel */}
|
||||||
{! (stackPanelPinned || stackPanelOpen) && (
|
{!stackPanelOpen && (
|
||||||
<button
|
<button
|
||||||
onClick={() => setStackPanelOpen(true)}
|
onClick={() => setStackPanelOpen(true)}
|
||||||
aria-pressed={false}
|
aria-pressed={false}
|
||||||
@@ -3006,17 +3004,20 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
top: '50%',
|
top: '50%',
|
||||||
transform: 'translateY(-50%)',
|
transform: 'translateY(-50%)',
|
||||||
zIndex: 2500,
|
zIndex: 2500,
|
||||||
width: 40,
|
width: 24,
|
||||||
height: 64,
|
height: 24,
|
||||||
|
padding: 0,
|
||||||
background: '#1976d2',
|
background: '#1976d2',
|
||||||
color: '#fff',
|
color: '#fff',
|
||||||
border: 'none',
|
border: 'none',
|
||||||
borderRadius: 8,
|
borderRadius: 4,
|
||||||
cursor: 'pointer',
|
cursor: 'pointer',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
boxShadow: '0 2px 8px rgba(0,0,0,0.3)'
|
boxShadow: '0 1px 4px rgba(0,0,0,0.25)',
|
||||||
|
lineHeight: 1,
|
||||||
|
fontSize: 12,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
▶
|
▶
|
||||||
@@ -3409,7 +3410,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Right-side panel occupies layout space when visible or pinned */}
|
{/* Right-side panel occupies layout space when visible or pinned */}
|
||||||
<div style={{ width: stackPanelPinned || stackPanelOpen ? 320 : 28, transition: 'width 220ms ease', display: 'flex', flexDirection: 'column', pointerEvents: 'auto' }}>
|
<div style={{ width: stackPanelOpen ? 320 : 28, transition: 'width 220ms ease', display: 'flex', flexDirection: 'column', pointerEvents: 'auto' }}>
|
||||||
{/* Reuse the existing right-side panel markup but ensure pointerEvents are enabled inside */}
|
{/* Reuse the existing right-side panel markup but ensure pointerEvents are enabled inside */}
|
||||||
<div style={{ pointerEvents: 'auto', width: '100%', height: '100%' }}>
|
<div style={{ pointerEvents: 'auto', width: '100%', height: '100%' }}>
|
||||||
{/* Panel (same content as before) */}
|
{/* Panel (same content as before) */}
|
||||||
@@ -3432,17 +3433,10 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '8px 12px', borderBottom: '1px solid #2b2f31' }}>
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '8px 12px', borderBottom: '1px solid #2b2f31' }}>
|
||||||
<div style={{ fontWeight: 700 }}>Stacks</div>
|
<div style={{ fontWeight: 700 }}>Stacks</div>
|
||||||
<div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
|
<div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
|
||||||
<button
|
|
||||||
title={stackPanelPinned ? 'Unpin panel' : 'Pin panel'}
|
|
||||||
onClick={() => setStackPanelPinned(p => !p)}
|
|
||||||
style={{ background: stackPanelPinned ? '#1976d2' : '#333', color: '#fff', border: 'none', padding: '6px 8px', borderRadius: 4, cursor: 'pointer' }}
|
|
||||||
>
|
|
||||||
{stackPanelPinned ? 'Pinned' : 'Pin'}
|
|
||||||
</button>
|
|
||||||
<button
|
<button
|
||||||
title="Close"
|
title="Close"
|
||||||
onClick={() => { setStackPanelPinned(false); setStackPanelOpen(false); }}
|
onClick={() => { setStackPanelOpen(false); }}
|
||||||
style={{ background: 'transparent', color: '#fff', border: 'none', cursor: 'pointer', fontSize: 18 }}
|
style={{ background: 'transparent', color: '#fff', border: 'none', cursor: 'pointer', fontSize: 16 }}
|
||||||
>
|
>
|
||||||
×
|
×
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
Reference in New Issue
Block a user