From 51371db2126ef0ffcbd7edcb86d94096655f5feb Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 13:49:12 +0000 Subject: [PATCH] fix(ui): keep sidebar flyouts above the logs tab The closed logs trigger sat at z-40 in the main pane, so the settings hover card and account tooltip (rendered inside the z-10 sidebar) painted underneath it. Portal those overlays and isolate main-page stacking. --- src/app/(dashboard)/layout.tsx | 3 +- .../logs-viewer/LogsDrawer.test.tsx | 37 +++++++++++++++++++ src/components/logs-viewer/LogsDrawer.tsx | 2 +- src/components/ui/hover-card.test.tsx | 25 +++++++++++++ src/components/ui/hover-card.tsx | 22 ++++++----- src/components/ui/tooltip.test.tsx | 32 ++++++++++++++++ src/components/ui/tooltip.tsx | 20 +++++----- 7 files changed, 120 insertions(+), 21 deletions(-) create mode 100644 src/components/logs-viewer/LogsDrawer.test.tsx create mode 100644 src/components/ui/hover-card.test.tsx create mode 100644 src/components/ui/tooltip.test.tsx diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index fbd1459ac..2f586137d 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -11,7 +11,8 @@ export default function Layout({
-
+ {/* isolate keeps in-page stacking (logs tab) from covering sidebar flyouts */} +
{children}
diff --git a/src/components/logs-viewer/LogsDrawer.test.tsx b/src/components/logs-viewer/LogsDrawer.test.tsx new file mode 100644 index 000000000..15a21ff24 --- /dev/null +++ b/src/components/logs-viewer/LogsDrawer.test.tsx @@ -0,0 +1,37 @@ +import { cleanup, render, screen, waitFor } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { LogsDrawer } from './LogsDrawer'; + +vi.mock('next/navigation', () => ({ + usePathname: () => '/settings/general', +})); + +vi.mock('@/lib/observability/lokiAvailability.actions', () => ({ + getLokiAvailability: vi.fn(async () => ({ state: 'unreachable' })), +})); + +vi.mock('@/lib/loki/requests', () => ({ + getLogsLevels: vi.fn(async () => []), + getLogsQueryRange: vi.fn(async () => []), + getModules: vi.fn(async () => []), +})); + +afterEach(() => { + cleanup(); +}); + +describe('LogsDrawer', () => { + it('keeps the closed-tab trigger below overlay z-index', async () => { + render( +
+ +
+ ); + + const trigger = await waitFor(() => + screen.getByRole('button', { name: /logs/i }) + ); + expect(trigger.className).toMatch(/\bz-20\b/); + expect(trigger.className).not.toMatch(/\bz-40\b/); + }); +}); diff --git a/src/components/logs-viewer/LogsDrawer.tsx b/src/components/logs-viewer/LogsDrawer.tsx index f119f1b8b..b2072dd27 100644 --- a/src/components/logs-viewer/LogsDrawer.tsx +++ b/src/components/logs-viewer/LogsDrawer.tsx @@ -126,7 +126,7 @@ export function LogsDrawer() {