Update 'reconnecting' location (vibe-kanban) (#643)

* ##  Task Complete

Successfully fixed the reconnecting alert positioning issue. The alert now appears above the kanban board instead of to the left.

**Changes Made:**

1. **[responsive-config.ts](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/vk-9967-update-rec/frontend/src/lib/responsive-config.ts)**: Updated `getMainContainerClasses` to always use column layout (`flex flex-col`) instead of conditional horizontal layout

2. **[project-tasks.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/vk-9967-update-rec/frontend/src/pages/project-tasks.tsx)**:
   - Restructured JSX to use nested flex container for side-by-side layout
   - Positioned reconnecting alert with `w-full z-30 xl:sticky xl:top-0`
   - Wrapped kanban + panel in inner div with `xl:flex` for proper horizontal layout

**Result**: The reconnecting alert now spans the full width above the content at all breakpoints, maintaining proper scrolling behavior and z-index hierarchy.

 Code compiles successfully (`npm run check` passed)

* Cleanup script changes for task attempt 996743d1-2de9-4f01-9357-af435a138dc5
This commit is contained in:
Louis Knight-Webb
2025-09-06 19:30:03 +01:00
committed by GitHub
parent a405a7bd76
commit 1fc9a7b720
2 changed files with 68 additions and 68 deletions

View File

@@ -52,15 +52,13 @@ export const getBackdropClasses = (forceFullScreen: boolean) => {
return `fixed inset-0 z-40 bg-background/80 backdrop-blur-sm ${PANEL_SIDE_BY_SIDE_BREAKPOINT}:hidden ${forceFullScreen ? '' : 'hidden'}`;
};
// Generate classes for main container (enable flex layout in side-by-side mode)
// Generate classes for main container (always column layout, side-by-side moved to inner wrapper)
export const getMainContainerClasses = (
isPanelOpen: boolean,
forceFullScreen: boolean
) => {
const overlayClasses =
isPanelOpen && forceFullScreen
? 'w-full h-full'
: `h-full ${PANEL_SIDE_BY_SIDE_BREAKPOINT}:flex`;
isPanelOpen && forceFullScreen ? 'w-full h-full' : 'h-full flex flex-col';
return `${overlayClasses}`;
};

View File

@@ -255,74 +255,76 @@ export function ProjectTasks() {
className={`min-h-full ${getMainContainerClasses(isPanelOpen, isFullscreen)}`}
>
{streamError && (
<div>
<Alert>
<AlertTitle className="flex items-center gap-2">
<AlertTriangle size="16" />
Reconnecting
</AlertTitle>
<AlertDescription>{streamError}</AlertDescription>
</Alert>
</div>
<Alert className="w-full z-30 xl:sticky xl:top-0">
<AlertTitle className="flex items-center gap-2">
<AlertTriangle size="16" />
Reconnecting
</AlertTitle>
<AlertDescription>{streamError}</AlertDescription>
</Alert>
)}
{/* Left Column - Kanban Section */}
<div className={getKanbanSectionClasses(isPanelOpen, isFullscreen)}>
{tasks.length === 0 ? (
<div className="max-w-7xl mx-auto mt-8">
<Card>
<CardContent className="text-center py-8">
<p className="text-muted-foreground">
No tasks found for this project.
</p>
<Button className="mt-4" onClick={handleCreateNewTask}>
<Plus className="h-4 w-4 mr-2" />
Create First Task
</Button>
</CardContent>
</Card>
</div>
) : (
<div className="w-full h-full overflow-x-auto">
<TaskKanbanBoard
tasks={tasks}
searchQuery={searchQuery}
onDragEnd={handleDragEnd}
onEditTask={handleEditTask}
onDeleteTask={handleDeleteTask}
onDuplicateTask={handleDuplicateTask}
onViewTaskDetails={handleViewTaskDetails}
isPanelOpen={isPanelOpen}
/>
</div>
{/* Kanban + Panel Container - uses side-by-side layout on xl+ */}
<div className="flex-1 min-h-0 xl:flex">
{/* Left Column - Kanban Section */}
<div className={getKanbanSectionClasses(isPanelOpen, isFullscreen)}>
{tasks.length === 0 ? (
<div className="max-w-7xl mx-auto mt-8">
<Card>
<CardContent className="text-center py-8">
<p className="text-muted-foreground">
No tasks found for this project.
</p>
<Button className="mt-4" onClick={handleCreateNewTask}>
<Plus className="h-4 w-4 mr-2" />
Create First Task
</Button>
</CardContent>
</Card>
</div>
) : (
<div className="w-full h-full overflow-x-auto">
<TaskKanbanBoard
tasks={tasks}
searchQuery={searchQuery}
onDragEnd={handleDragEnd}
onEditTask={handleEditTask}
onDeleteTask={handleDeleteTask}
onDuplicateTask={handleDuplicateTask}
onViewTaskDetails={handleViewTaskDetails}
isPanelOpen={isPanelOpen}
/>
</div>
)}
</div>
{/* Right Column - Task Details Panel */}
{isPanelOpen && (
<TaskDetailsPanel
task={selectedTask}
projectHasDevScript={!!project?.dev_script}
projectId={projectId!}
onClose={handleClosePanel}
onEditTask={handleEditTask}
onDeleteTask={handleDeleteTask}
isDialogOpen={isProjectSettingsOpen}
isFullScreen={isFullscreen}
setFullScreen={
selectedAttempt
? (fullscreen) => {
const baseUrl = `/projects/${projectId}/tasks/${selectedTask!.id}/attempts/${selectedAttempt.id}`;
const fullUrl = fullscreen ? `${baseUrl}/full` : baseUrl;
navigate(fullUrl, { replace: true });
}
: undefined
}
selectedAttempt={selectedAttempt}
attempts={attempts}
setSelectedAttempt={setSelectedAttempt}
/>
)}
</div>
{/* Right Column - Task Details Panel */}
{isPanelOpen && (
<TaskDetailsPanel
task={selectedTask}
projectHasDevScript={!!project?.dev_script}
projectId={projectId!}
onClose={handleClosePanel}
onEditTask={handleEditTask}
onDeleteTask={handleDeleteTask}
isDialogOpen={isProjectSettingsOpen}
isFullScreen={isFullscreen}
setFullScreen={
selectedAttempt
? (fullscreen) => {
const baseUrl = `/projects/${projectId}/tasks/${selectedTask!.id}/attempts/${selectedAttempt.id}`;
const fullUrl = fullscreen ? `${baseUrl}/full` : baseUrl;
navigate(fullUrl, { replace: true });
}
: undefined
}
selectedAttempt={selectedAttempt}
attempts={attempts}
setSelectedAttempt={setSelectedAttempt}
/>
)}
{/* Dialogs - rendered at main container level to avoid stacking issues */}
{taskToDelete && (