"use client" /** * UtilityBarSlot — persistent shell row for global utility actions * (Search, Ask Leo, Notifications, Settings, Help, Profile, and — in the * "utility-bar" shell layout variant — the product switcher too). * * Three shell layout variants, driven by `useShellLayout()`: * - "sidebar-classic": not mounted — actions live in the sidebar. * - "utility-sidebar": mounted inside `[data-app-shell-workspace]`, * spanning the secondary rail + main canvas only. * - "utility-bar": mounted as a full-width row ABOVE the sidebar+workspace * row. Product switcher renders in the bar's left cluster. * * At mobile / high-zoom (`useUtilityBarCompact`), Search, Ask Leo, Help, and * Settings collapse into a single More menu; Notifications + profile stay visible. */ import * as React from "react" import { Link, useLocation } from "react-router-dom" import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { Kbd, KbdGroup } from "@/components/ui/kbd" import { useModKeyLabel } from "@/hooks/use-mod-key-label" import { useIsMobile } from "@/hooks/use-mobile" import { useSidebarReflowZoom } from "@/hooks/use-sidebar-reflow-zoom" import { requestOpenCommandMenu } from "@/components/command-menu" import { AskLeoShortcutKbds, useAskLeo } from "@/components/ask-leo-context" import { AskLeoToggle } from "@/components/ask-leo-sidebar" import { NotificationBell } from "@/components/notification-bell" import { UtilityUserMenu } from "@/components/utility-user-menu" import { UtilityBarProductSwitcher } from "@/components/utility-bar-product-switcher" import { useProduct } from "@/contexts/product-context" import { useShellLayout, isFullWidthUtilityBar } from "@/contexts/shell-layout-context" import { getSecondaryNavForProduct } from "@/lib/mock/navigation" import { cn } from "@/lib/utils" import { utilityBarActionButtonClass } from "@/components/utility-bar-chrome" const SUPPRESS_UTILITY_BAR_PATHS: ReadonlyArray = ["/builder/onboarding"] function useUtilityBarCompact() { const isMobile = useIsMobile() const reflowZoom = useSidebarReflowZoom() return isMobile || reflowZoom } export function UtilityBarSlot() { const location = useLocation() const { variant } = useShellLayout() const fullWidth = isFullWidthUtilityBar(variant) const compact = useUtilityBarCompact() if (SUPPRESS_UTILITY_BAR_PATHS.some(path => location.pathname.startsWith(path))) return null return ( ) } function UtilityBarMoreMenu() { const mod = useModKeyLabel() const { product } = useProduct() const [settings] = getSecondaryNavForProduct(product) const { toggle: toggleAskLeo, open: askLeoOpen } = useAskLeo() return (