workspace panel drag commented

This commit is contained in:
2026-02-19 12:34:05 +00:00
parent ebe2321f8f
commit 4dde3aec66
2 changed files with 24 additions and 34 deletions
@@ -1,5 +1,4 @@
import { useCallback } from 'react'; import { ArrowLeftRight } from 'lucide-react';
import { ArrowLeftRight, GripVertical } from 'lucide-react';
import type { LayoutPanel, AppRegistry, PanelComponents } from './types'; import type { LayoutPanel, AppRegistry, PanelComponents } from './types';
import { useWorkspace } from './WorkspaceContext'; import { useWorkspace } from './WorkspaceContext';
import { Card } from '../Card'; import { Card } from '../Card';
@@ -98,34 +97,23 @@ const SwapSourceIndicator = ({ panelId }: { panelId: string }) => {
); );
}; };
const DragHandle = ({ panelId }: { panelId: string }) => { // TODO: drag-to-reposition needs work (visual feedback, edge cases)
const { setDragSourceId, dragSourceId } = useWorkspace(); // const DragHandle = ({ panelId }: { panelId: string }) => {
// const { setDragSourceId, dragSourceId } = useWorkspace();
const onPointerDown = useCallback( // const onPointerDown = useCallback((ev: React.PointerEvent) => { ev.preventDefault(); setDragSourceId(panelId); }, [panelId, setDragSourceId]);
(ev: React.PointerEvent) => { // if (dragSourceId) return null;
ev.preventDefault(); // return (
setDragSourceId(panelId); // <div className="absolute top-2 right-2 z-10 p-1.5 rounded-md bg-duck-dark/5 text-duck-dark/30 opacity-0 group-hover/panel:opacity-100 hover:!bg-duck-dark/10 hover:!text-duck-dark/60 transition-all cursor-grab" onPointerDown={onPointerDown}>
}, // <GripVertical className="h-5 w-5" />
[panelId, setDragSourceId], // </div>
); // );
// };
if (dragSourceId) return null; //
// const DragSourceDimmer = ({ panelId }: { panelId: string }) => {
return ( // const { dragSourceId } = useWorkspace();
<div // if (dragSourceId !== panelId) return null;
className="absolute top-2 right-2 z-10 p-1.5 rounded-md bg-duck-dark/5 text-duck-dark/30 opacity-0 group-hover/panel:opacity-100 hover:!bg-duck-dark/10 hover:!text-duck-dark/60 transition-all cursor-grab" // return <div className="absolute inset-0 z-20 rounded-lg bg-duck-dark/10 pointer-events-none" />;
onPointerDown={onPointerDown} // };
>
<GripVertical className="h-5 w-5" />
</div>
);
};
const DragSourceDimmer = ({ panelId }: { panelId: string }) => {
const { dragSourceId } = useWorkspace();
if (dragSourceId !== panelId) return null;
return <div className="absolute inset-0 z-20 rounded-lg bg-duck-dark/10 pointer-events-none" />;
};
export const PanelSlot = ({ panel, registry, components, interactive, isLastPanel, onSetApp, onSplit, onRemove }: PanelSlotProps) => { export const PanelSlot = ({ panel, registry, components, interactive, isLastPanel, onSetApp, onSplit, onRemove }: PanelSlotProps) => {
const PanelComponent = components?.[panel.id]; const PanelComponent = components?.[panel.id];
@@ -144,8 +132,9 @@ export const PanelSlot = ({ panel, registry, components, interactive, isLastPane
<> <>
<SwapOverlay panelId={panel.id} /> <SwapOverlay panelId={panel.id} />
<SwapSourceIndicator panelId={panel.id} /> <SwapSourceIndicator panelId={panel.id} />
<DragHandle panelId={panel.id} /> {/* TODO: re-enable when drag-to-reposition is polished */}
<DragSourceDimmer panelId={panel.id} /> {/* <DragHandle panelId={panel.id} /> */}
{/* <DragSourceDimmer panelId={panel.id} /> */}
</> </>
) : null; ) : null;
@@ -4,7 +4,8 @@ import type { DropPosition } from './layout-utils';
import { splitPanel, removePanel, setApp, updateSizes, swapPanels, movePanel, countPanels } from './layout-utils'; import { splitPanel, removePanel, setApp, updateSizes, swapPanels, movePanel, countPanels } from './layout-utils';
import { WorkspaceProvider } from './WorkspaceContext'; import { WorkspaceProvider } from './WorkspaceContext';
import { WorkspaceRenderer } from './WorkspaceRenderer'; import { WorkspaceRenderer } from './WorkspaceRenderer';
import { DragOverlay } from './DragOverlay'; // TODO: re-enable when drag-to-reposition is polished
// import { DragOverlay } from './DragOverlay';
type WorkspaceViewProps = { type WorkspaceViewProps = {
workspace: WorkspaceDefinition | null; workspace: WorkspaceDefinition | null;
@@ -104,7 +105,7 @@ export const WorkspaceView = ({ workspace, layout, onLayoutChange, registry }: W
onRemove={handleRemove} onRemove={handleRemove}
onResized={handleResized} onResized={handleResized}
/> />
<DragOverlay /> {/* <DragOverlay /> */}
</WorkspaceProvider> </WorkspaceProvider>
); );
}; };