From ddd1dbc09f68bfd403c08b96de78e80ea1ef6282 Mon Sep 17 00:00:00 2001 From: Francesco Sansalvadore Date: Mon, 10 Nov 2025 11:43:50 +0100 Subject: [PATCH] Studio: add CommandMenu trigger in top nav (#40011) * add CommandMenuTriggerInput in top nav in studio * uniform command trigger in top nav --- .../components/interfaces/UserDropdown.tsx | 4 ---- .../layouts/AppLayout/AssistantButton.tsx | 5 ++-- .../layouts/AppLayout/InlineEditorButton.tsx | 5 ++-- .../LayoutHeader/LayoutHeader.tsx | 23 +++++++++++++++++-- apps/studio/lib/profile.tsx | 2 +- .../src/CommandMenu/api/CommandMenu.tsx | 16 ++++++++----- .../KeyboardShortcut/KeyboardShortcut.tsx | 6 ++--- 7 files changed, 41 insertions(+), 20 deletions(-) diff --git a/apps/studio/components/interfaces/UserDropdown.tsx b/apps/studio/components/interfaces/UserDropdown.tsx index 293aaf12b59..9a742ee85c5 100644 --- a/apps/studio/components/interfaces/UserDropdown.tsx +++ b/apps/studio/components/interfaces/UserDropdown.tsx @@ -101,10 +101,6 @@ export function UserDropdown() { Feature previews - - - Command menu - diff --git a/apps/studio/components/layouts/AppLayout/AssistantButton.tsx b/apps/studio/components/layouts/AppLayout/AssistantButton.tsx index 8f550e23786..11067fa1e15 100644 --- a/apps/studio/components/layouts/AppLayout/AssistantButton.tsx +++ b/apps/studio/components/layouts/AppLayout/AssistantButton.tsx @@ -29,10 +29,11 @@ export const AssistantButton = () => { }} tooltip={{ content: { + className: 'p-1 pl-2.5', text: ( -
+
AI Assistant - {isAIAssistantHotkeyEnabled && } + {isAIAssistantHotkeyEnabled && }
), }, diff --git a/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx b/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx index db0a6d6bffa..da3404e969b 100644 --- a/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx +++ b/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx @@ -12,7 +12,7 @@ const InlineEditorKeyboardTooltip = () => { true ) - return hotkeyEnabled ? : null + return hotkeyEnabled ? : null } export const InlineEditorButton = () => { @@ -35,8 +35,9 @@ export const InlineEditorButton = () => { onClick={handleClick} tooltip={{ content: { + className: 'p-1 pl-2.5', text: ( -
+
SQL Editor
diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx index b8e99afb3e4..dc1e1fca80e 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx @@ -28,6 +28,7 @@ import { HomeIcon } from './HomeIcon' import { LocalVersionPopover } from './LocalVersionPopover' import MergeRequestButton from './MergeRequestButton' import { AdvisorButton } from 'components/layouts/AppLayout/AdvisorButton' +import { CommandMenuTriggerInput } from 'ui-patterns' const LayoutHeaderDivider = ({ className, ...props }: React.HTMLProps) => ( @@ -208,7 +209,16 @@ export const LayoutHeader = ({ <> -
+
+ @@ -225,7 +235,16 @@ export const LayoutHeader = ({ ) : ( <> -
+
+ {!!projectRef && ( diff --git a/apps/studio/lib/profile.tsx b/apps/studio/lib/profile.tsx index 87de9d80683..1970d60ad2d 100644 --- a/apps/studio/lib/profile.tsx +++ b/apps/studio/lib/profile.tsx @@ -130,7 +130,7 @@ export function useProfileNameAndPicture(): { const { data: identitiesData, isLoading: isLoadingIdentities } = useProfileIdentitiesQuery() const username = profile?.username - const isGitHubProfile = profile?.auth0_id.startsWith('github') + const isGitHubProfile = profile?.auth0_id?.startsWith('github') const gitHubUsername = isGitHubProfile ? identitiesData?.identities.find((x) => x.provider === 'github')?.identity_data?.user_name diff --git a/packages/ui-patterns/src/CommandMenu/api/CommandMenu.tsx b/packages/ui-patterns/src/CommandMenu/api/CommandMenu.tsx index ed3f4848439..99fa8fa7f5f 100644 --- a/packages/ui-patterns/src/CommandMenu/api/CommandMenu.tsx +++ b/packages/ui-patterns/src/CommandMenu/api/CommandMenu.tsx @@ -157,7 +157,7 @@ function CommandMenuTrigger({ children }: PropsWithChildren) { 'inline-flex items-center justify-center', 'whitespace-nowrap', 'rounded-md border border-input bg-background', - 'text-sm font-medium', + 'text-sm', 'hover:bg-accent hover:text-accent-foreground', 'ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50', @@ -185,15 +185,19 @@ function CommandMenuTriggerInput({ 'pl-1.5 md:pl-2 pr-1', 'flex items-center justify-between', 'bg-surface-100/75 text-foreground-lighter border', - 'hover:bg-opacity-100 hover:border-strong', - 'focus-visible:!outline-4 focus-visible:outline-offset-1 focus-visible:outline-brand-600', + 'hover:bg-opacity-100 hover:border-stronger', + 'focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-border-strong focus-visible:ring-offset-1 focus-visible:ring-offset-background', 'transition', className )} > -
- -

{placeholder}

+
+ +

{placeholder}

{ {keysWithMetaAndShift.map((key) => (