From 5acca9fce868d11cae1101a23b42545b2d5324fb Mon Sep 17 00:00:00 2001
From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
Date: Mon, 10 Aug 2026 22:56:46 -0700
Subject: [PATCH] fix(native-chat): open composer pickers upward
---
.../NativeChatSessionOptionPickers.test.tsx | 35 ++++++++++++++++++-
.../NativeChatSessionOptionPickers.tsx | 4 +--
2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.test.tsx b/src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.test.tsx
index e7d3eda0985..cc9963b94b2 100644
--- a/src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.test.tsx
+++ b/src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.test.tsx
@@ -40,7 +40,23 @@ vi.mock('@/components/ui/dropdown-menu', () => {
children: React.ReactNode
disabled?: boolean
}) =>
{children}
,
- DropdownMenuContent: ({ children }: { children: React.ReactNode }) => {children}
,
+ DropdownMenuContent: ({
+ children,
+ side,
+ collisionPadding
+ }: {
+ children: React.ReactNode
+ side?: string
+ collisionPadding?: number
+ }) => (
+
+ {children}
+
+ ),
DropdownMenuLabel: ({ children }: { children: React.ReactNode }) => {children}
,
DropdownMenuSeparator: () =>
,
DropdownMenuItem: ({
@@ -172,6 +188,23 @@ const fast: SessionOptionDescriptor = {
afterEach(() => cleanup())
describe('NativeChatSessionOptionPickers', () => {
+ it('prefers collision-aware upward placement for model and option menus', () => {
+ render(
+
+ )
+
+ const menus = screen.getAllByTestId('session-option-menu')
+ expect(menus).toHaveLength(2)
+ for (const menu of menus) {
+ expect(menu.getAttribute('data-side')).toBe('top')
+ expect(menu.getAttribute('data-collision-padding')).toBe('8')
+ }
+ })
+
it('renders model and joined option labels, and hides an empty options pill', () => {
const { rerender } = render(
descriptor.valueSource === 'dispatched')}
/>
-
+
{options.map((descriptor, index) => {
const reason = nativeChatSessionOptionDisabledReason(descriptor.disabledReason)
return (
@@ -272,7 +272,7 @@ function NativeChatSessionOptionPickersInner({
disabledReason={modelReason}
dispatched={model.valueSource === 'dispatched'}
/>
-
+
{modelReason && !model.settable ? (
{modelReason}
) : null}