Files
Francesco Sansalvadore 156f904018 feat: floating mobile toolbar (#43444)
- move navigation components to `apps/studio/components/layouts/Navigation`
- add [FloatingMobileToolbar](https://github.com/supabase/supabase/pull/43444/changes#diff-3dffe47fd51ca851d612d8728e03b2dc344ec213d4f3a46a824d3fa32a7cc851) as quick access to tools such as search, assistant, inline editor, etc - behind feature flag and feature preview (true by default as it's a bit
annoying to have to enable it all the time as previews are stored in
local-storage)
- fix sidebar panels closing on viewport resizing (regression from previous pr)

https://github.com/user-attachments/assets/d6881e3b-5128-4306-bb82-3ca39c755dba

<img width="986" height="697" alt="Screenshot 2026-03-12 at 12 40 11"
src="https://github.com/user-attachments/assets/da8511e2-7d01-4237-b814-596031c747c5"
/>
2026-03-13 12:13:07 +00:00

63 lines
1.8 KiB
TypeScript

import { CommandMenuInnerContent } from 'components/interfaces/App/CommandMenu/CommandMenu'
import type { ReactNode } from 'react'
import { sidebarManagerState, useSidebarManagerSnapshot } from 'state/sidebar-manager-state'
import { CommandWrapper, MobileSheetNav } from 'ui-patterns'
import {
SIDEBAR_KEYS,
type TYPEOF_SIDEBAR_KEYS,
} from '../../ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
import type { MobileSheetContentType } from './MobileSheetContext'
import { useMobileSheet } from './MobileSheetContext'
function isSidebarId(content: unknown): content is TYPEOF_SIDEBAR_KEYS {
return (
typeof content === 'string' &&
Object.values(SIDEBAR_KEYS).includes(content as TYPEOF_SIDEBAR_KEYS)
)
}
function getSheetChildren(
content: MobileSheetContentType,
activeSidebar: { id: string; component?: () => ReactNode } | null
): ReactNode {
if (content === null) return null
if (content === 'search') {
return (
<CommandWrapper className="h-full flex flex-col bg-background">
<CommandMenuInnerContent />
</CommandWrapper>
)
}
if (isSidebarId(content) && activeSidebar?.id === content) {
return activeSidebar.component?.() ?? null
}
if (!isSidebarId(content)) return content
return null
}
const StudioMobileSheetNav = () => {
const { content, setContent } = useMobileSheet()
const { activeSidebar } = useSidebarManagerSnapshot()
const sheetChildren = getSheetChildren(content, activeSidebar ?? null)
const handleOpenChange = (open: boolean) => {
if (!open) {
setContent(null)
sidebarManagerState.closeActive()
}
}
return (
<MobileSheetNav
open={content !== null}
onOpenChange={handleOpenChange}
shouldCloseOnViewportResize={!activeSidebar}
>
{sheetChildren}
</MobileSheetNav>
)
}
export { StudioMobileSheetNav }