# Business operations dashboard

A shadcn/ui block from the [@watermelon](https://ui.watermelon.sh) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/watermelon/business-operations-dashboard).

- Page, with a live preview: https://shadcn.exchange/r/watermelon/business-operations-dashboard
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/watermelon/business-operations-dashboard-light-dc64943324051517.png
- Registry item: https://registry.watermelon.sh/r/business-operations-dashboard.json
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://registry.watermelon.sh/r/business-operations-dashboard.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `@tabler/icons-react`, `class-variance-authority`, `lucide-react`
- Registry items: `avatar`, `badge`, `breadcrumb`, `button`, `card`, `collapsible`, `dialog`, `dropdown-menu`, `input`, `label`, `popover`, `separator`, `sheet`, `sidebar`, `skeleton`, `tabs`, `textarea`, `tooltip`

## Files

### `src/components/dashboards/business-operations-dashboard/components/app-sidebar.tsx`

```tsx
"use client"

import * as React from "react"
import {
  IconBuildingSkyscraper,
  IconDots,
  IconSearch,
  IconPlus,
} from "@tabler/icons-react"

import { NavMain } from "./nav-main"
import { NavProjects } from "./nav-projects"
import { NavUser } from "./nav-user"
import { Button } from "@/components/ui/button"
import {
  Sidebar,
  SidebarContent,
  SidebarFooter,
  SidebarHeader,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarTrigger,
} from "@/components/ui/sidebar"
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,  
} from "@/components/ui/dropdown-menu"
import { data } from "../data"
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
  return (
    <Sidebar collapsible="icon" variant="inset" {...props}>
      <SidebarHeader>
        <SidebarMenu>
          <SidebarMenuItem>
            <SidebarMenuButton size="lg" className="hover:bg-transparent px-1 group-data-[collapsible=icon]:flex group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:justify-center active:bg-transparent transition-all">
              <div className="flex items-center w-full">
                <div className="flex aspect-square size-8 items-center justify-center rounded-md bg-sidebar-primary text-sidebar-primary-foreground">
                  <IconBuildingSkyscraper className="size-4" />
                </div>
                <div className="flex flex-1 items-center gap-2 group-data-[collapsible=icon]:hidden px-2 min-w-0">
                  <span className="font-semibold truncate text-[15px] tracking-tight">Ocean Labs</span>
                  <DropdownMenu>
                    <DropdownMenuTrigger asChild>
                      <Button variant="ghost" size="icon" className="size-5 text-muted-foreground hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors ml-0.5 cursor-pointer">
                        <IconDots className="size-3" />
                      </Button>
                    </DropdownMenuTrigger>
                    <DropdownMenuContent align="start" className="w-56">
                      <DropdownMenuLabel className="text-xs text-muted-foreground">Workspaces</DropdownMenuLabel>
                      <DropdownMenuItem className="gap-2 p-2">
                        <div className="flex size-6 items-center justify-center rounded-sm border bg-background">
                          <IconBuildingSkyscraper className="size-4 shrink-0" />
                        </div>
                        Ocean Labs
                      </DropdownMenuItem>
                      <DropdownMenuItem className="gap-2 p-2">
                        <div className="flex size-6 items-center justify-center rounded-sm border bg-background">
                          <IconBuildingSkyscraper className="size-4 shrink-0 text-muted-foreground" />
                        </div>
                        Personal Projects
                      </DropdownMenuItem>
                      <DropdownMenuSeparator />
                      <DropdownMenuItem className="gap-2 p-2">
                        <IconPlus className="size-4" />
                        Add Workspace
                      </DropdownMenuItem>
                    </DropdownMenuContent>
                  </DropdownMenu>
                </div>
                <SidebarTrigger className="ml-auto text-neutral-500 group-data-[collapsible=icon]:hidden transition-colors duration-200 hover:bg-neutral-100 dark:hover:bg-neutral-800 cursor-pointer" />
              </div>
            </SidebarMenuButton>
          </SidebarMenuItem>
        </SidebarMenu>
        <div className="pb-2 group-data-[collapsible=icon]:px-0 group-data-[collapsible=icon]:mt-2">
          <div className="relative">
            <IconSearch className="absolute left-2 top-2.5 size-4 text-muted-foreground group-data-[collapsible=icon]:left-1/2 group-data-[collapsible=icon]:top-1/2 group-data-[collapsible=icon]:-translate-x-1/2 group-data-[collapsible=icon]:-translate-y-1/2 group-data-[collapsible=icon]:size-4" />
            <input
              placeholder="Search anything..."
              className="w-full bg-white dark:bg-neutral-800/50 rounded-md py-2 pl-8 pr-4 text-sm focus:outline-hidden border border-sidebar-border group-data-[collapsible=icon]:w-8 group-data-[collapsible=icon]:h-8 group-data-[collapsible=icon]:px-0 group-data-[collapsible=icon]:mx-auto group-data-[collapsible=icon]:placeholder:text-transparent transition-all hover:border-neutral-300 dark:hover:border-neutral-700 hover:shadow-sm focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-neutral-400 dark:focus-visible:border-neutral-600 text-foreground"
            />
          </div>
        </div>
      </SidebarHeader>
      <SidebarContent>
        <NavMain items={data.navMain} />
        <NavMain items={data.settings} />
        <NavProjects projects={data.favorites} label="Favorites" />
      </SidebarContent>
      <SidebarFooter>
        <NavUser user={data.user} />
      </SidebarFooter>
    </Sidebar>
  )
}
```

### `src/components/dashboards/business-operations-dashboard/components/invoice-card.tsx`

```tsx
import { IconDots } from "@tabler/icons-react"
import { Card, CardContent } from "@/components/ui/card"
import { Button } from "@/components/ui/button"
import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuLabel,
    DropdownMenuSeparator,
    DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"

export interface Invoice {
    id: string
    amount: string
    status: "unpaid" | "paid" | "draft"
    date: string
    title: string
    gradient: string
}

export function InvoiceCard({ invoice }: { invoice: Invoice }) {
    return (
        <Card className="group shadow-xs border-border rounded-lg p-4 transition-colors duration-300 hover:shadow-lg hover:shadow-neutral-200 dark:hover:shadow-neutral-900 cursor-pointer bg-background">
            <CardContent className="p-0 flex flex-col gap-2">
                {/* Top Row */}
                <div className="flex items-center justify-between mb-1">
                    <div className={`size-11 rounded-full bg-linear-to-br transition-shadow duration-300 group-hover:shadow-md ${invoice.gradient}`} />
                    <DropdownMenu>
                        <DropdownMenuTrigger asChild>
                            <Button variant="ghost" size="icon" className="size-8 text-neutral-500 opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity" onClick={(e) => e.stopPropagation()}>
                                <IconDots className="size-4" />
                            </Button>
                        </DropdownMenuTrigger>
                        <DropdownMenuContent align="end" className="w-40" onClick={(e) => e.stopPropagation()}>
                            <DropdownMenuLabel>Actions</DropdownMenuLabel>
                            <DropdownMenuSeparator />
                            <DropdownMenuItem>Edit Invoice</DropdownMenuItem>
                            <DropdownMenuItem>Copy Link</DropdownMenuItem>
                            <DropdownMenuItem>Download PDF</DropdownMenuItem>
                            <DropdownMenuSeparator />
                            <DropdownMenuItem variant="destructive">Archive</DropdownMenuItem>
                        </DropdownMenuContent>
                    </DropdownMenu>
                </div>

                {/* Second Row */}
                <div className="flex items-center justify-between font-mono">
                    <span className="text-lg font-bold">{invoice.amount}</span>
                    <span className="text-sm text-muted-foreground font-medium">#{invoice.id}</span>
                </div>

                {/* Third Row */}
                <div>
                    <p className="text-sm text-muted-foreground line-clamp-2 leading-relaxed">
                        Ein flexibles Abonnementmodell für {invoice.title.toLowerCase()}...
                    </p>
                </div>

                {/* Bottom Row */}
                <div className="flex items-center gap-2">
                    <span className="text-sm font-medium text-muted-foreground tracking-tight">Due date: {invoice.date}</span>
                </div>
            </CardContent>
        </Card>
    )
}
```

### `src/components/dashboards/business-operations-dashboard/components/nav-main.tsx`

```tsx
"use client"

import {
  SidebarGroup,
  SidebarGroupLabel,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
} from "@/components/ui/sidebar"

export function NavMain({
  items,
  label,
}: {
  items: {
    title: string
    url: string
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    icon?: any
    isDisabled?: boolean
    isActive?: boolean
  }[]
  label?: string
}) {
  return (
    <SidebarGroup>
      {label && <SidebarGroupLabel>{label}</SidebarGroupLabel>}
      <SidebarMenu>
        {items.map((item) => (
          <SidebarMenuItem key={item.title}>
            <SidebarMenuButton
              asChild
              tooltip={item.title}
              isActive={item.isActive}
              className="h-9 hover:bg-indigo-600/5 hover:text-indigo-600 font-medium text-sidebar-foreground/70 tracking-tight data-[active=true]:bg-indigo-600/5 dark:data-[active=true]:bg-indigo-600/20 dark:data-[active=true]:text-indigo-400 dark:hover:text-indigo-400 dark:hover:bg-indigo-600/20 data-[active=true]:text-indigo-600 transition-colors duration-200"
            >
              <a href={item.isDisabled ? "#" : item.url} onClick={(e) => {
                if (item.isDisabled) {
                  e.preventDefault();
                }
              }}>
                {item.icon && <item.icon className="size-4" />}
                <span>{item.title}</span>
              </a>
            </SidebarMenuButton>
          </SidebarMenuItem>
        ))}
      </SidebarMenu>
    </SidebarGroup>
  )
}
```

### `src/components/dashboards/business-operations-dashboard/components/nav-projects.tsx`

```tsx
"use client"

import {
  SidebarGroup,
  SidebarGroupLabel,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
} from "@/components/ui/sidebar" 

export function NavProjects({
  projects,
  label,
}: {
  projects: {
    name: string
    url: string
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    icon: any
    color?: string
    isDisabled?: boolean
  }[]
  label?: string
}) {

  return (
    <SidebarGroup>
      {label && <SidebarGroupLabel>{label}</SidebarGroupLabel>}
      <SidebarMenu>
        {projects.map((item) => (
          <SidebarMenuItem key={item.name}>
            <SidebarMenuButton asChild tooltip={item.name} className=" hover:bg-indigo-600/5 hover:text-indigo-600  text-sidebar-foreground/70 tracking-tight data-[active=true]:bg-indigo-600/5 data-[active=true]:text-indigo-600 dark:data-[active=true]:bg-indigo-600/20 dark:data-[active=true]:text-indigo-400 dark:hover:text-indigo-400 dark:hover:bg-indigo-600/20 transition-colors duration-200">
              <a href={item.isDisabled ? "#" : item.url} onClick={(e) => {
                if (item.isDisabled) {
                  e.preventDefault();
                }
              }}>
                <item.icon className={item.color} />
                <span>{item.name}</span>
              </a>
            </SidebarMenuButton>
          </SidebarMenuItem>
        ))}
      </SidebarMenu>
    </SidebarGroup>
  )
}
```

### `src/components/dashboards/business-operations-dashboard/components/nav-user.tsx`

```tsx
"use client"

import {
  BadgeCheck,
  Bell,
  CreditCard,
  LogOut,
  Sparkles,
} from "lucide-react"

import {
  Avatar,
  AvatarFallback,
  AvatarImage,
} from "@/components/ui/avatar"
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import {
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  useSidebar,
} from "@/components/ui/sidebar"
import { IconDots } from "@tabler/icons-react"

export function NavUser({
  user,
}: {
  user: {
    name: string
    email: string
    avatar: string
  }
}) {
  const { isMobile } = useSidebar()

  return (
    <SidebarMenu>
      <SidebarMenuItem>
        <DropdownMenu>
          <DropdownMenuTrigger asChild>
            <SidebarMenuButton
              size="lg"
              className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground bg-sidebar-accent/50 border border-sidebar-border hover:bg-transparent p-1.5 h-9 group-data-[collapsible=icon]:size-9 group-data-[collapsible=icon]:p-0 group-data-[collapsible=icon]:justify-center transition-colors duration-200"
            >
              <Avatar className="size-6 rounded-sm group-data-[collapsible=icon]:size-6">
                <AvatarImage src={user.avatar} alt={user.name} />
                <AvatarFallback className="rounded-sm text-xs bg-indigo-500 text-white">LS</AvatarFallback>
              </Avatar>
              <div className="grid flex-1 text-left text-sm leading-tight group-data-[collapsible=icon]:hidden">
                <div className="flex items-center gap-2">
                  <span className="truncate font-semibold">{user.name}</span>
                  <span className="flex h-4 items-center rounded bg-indigo-500/10 px-1 text-[9px] font-bold text-indigo-500">PRO</span>
                </div>
              </div>
              <IconDots className="ml-auto size-4 text-neutral-500 group-data-[collapsible=icon]:hidden" />
            </SidebarMenuButton>
          </DropdownMenuTrigger>
          <DropdownMenuContent
            className="w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg"
            side={isMobile ? "bottom" : "right"}
            align="end"
            sideOffset={4}
          >
            <DropdownMenuLabel className="p-0 font-normal">
              <div className="flex items-center gap-2 px-1 py-1.5 text-left text-sm">
                <Avatar className="h-8 w-8 rounded-lg">
                  <AvatarImage src={user.avatar} alt={user.name} />
                  <AvatarFallback className="rounded-lg">CN</AvatarFallback>
                </Avatar>
                <div className="grid flex-1 text-left text-sm leading-tight">
                  <span className="truncate font-medium">{user.name}</span>
                  <span className="truncate text-xs">{user.email}</span>
                </div>
              </div>
            </DropdownMenuLabel>
            <DropdownMenuSeparator />
            <DropdownMenuGroup>
              <DropdownMenuItem>
                <Sparkles />
                Upgrade to Pro
              </DropdownMenuItem>
            </DropdownMenuGroup>
            <DropdownMenuSeparator />
            <DropdownMenuGroup>
              <DropdownMenuItem>
                <BadgeCheck />
                Account
              </DropdownMenuItem>
              <DropdownMenuItem>
                <CreditCard />
                Billing
              </DropdownMenuItem>
              <DropdownMenuItem>
                <Bell />
                Notifications
              </DropdownMenuItem>
            </DropdownMenuGroup>
            <DropdownMenuSeparator />
            <DropdownMenuItem>
              <LogOut />
              Log out
            </DropdownMenuItem>
          </DropdownMenuContent>
        </DropdownMenu>
      </SidebarMenuItem>
    </SidebarMenu>
  )
}
```

### `src/components/dashboards/business-operations-dashboard/components/team-switcher.tsx`

```tsx
"use client"

import * as React from "react"
import { ChevronsUpDown, Plus } from "lucide-react"

import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import {
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  useSidebar,
} from "@/components/ui/sidebar"

export function TeamSwitcher({
  teams,
}: {
  teams: {
    name: string
    logo: React.ElementType
    plan: string
  }[]
}) {
  const { isMobile } = useSidebar()
  const [activeTeam, setActiveTeam] = React.useState(teams[0])

  if (!activeTeam) {
    return null
  }

  return (
    <SidebarMenu>
      <SidebarMenuItem>
        <DropdownMenu>
          <DropdownMenuTrigger asChild>
            <SidebarMenuButton
              size="lg"
              className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
            >
              <div className="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg">
                <activeTeam.logo className="size-4" />
              </div>
              <div className="grid flex-1 text-left text-sm leading-tight">
                <span className="truncate font-medium">{activeTeam.name}</span>
                <span className="truncate text-xs">{activeTeam.plan}</span>
              </div>
              <ChevronsUpDown className="ml-auto" />
            </SidebarMenuButton>
          </DropdownMenuTrigger>
          <DropdownMenuContent
            className="w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg"
            align="start"
            side={isMobile ? "bottom" : "right"}
            sideOffset={4}
          >
            <DropdownMenuLabel className="text-muted-foreground text-xs">
              Teams
            </DropdownMenuLabel>
            {teams.map((team, index) => (
              <DropdownMenuItem
                key={team.name}
                onClick={() => setActiveTeam(team)}
                className="gap-2 p-2"
              >
                <div className="flex size-6 items-center justify-center rounded-md border">
                  <team.logo className="size-3.5 shrink-0" />
                </div>
                {team.name}
                <DropdownMenuShortcut>⌘{index + 1}</DropdownMenuShortcut>
              </DropdownMenuItem>
            ))}
            <DropdownMenuSeparator />
            <DropdownMenuItem className="gap-2 p-2">
              <div className="flex size-6 items-center justify-center rounded-md border bg-transparent">
                <Plus className="size-4" />
              </div>
              <div className="text-muted-foreground font-medium">Add team</div>
            </DropdownMenuItem>
          </DropdownMenuContent>
        </DropdownMenu>
      </SidebarMenuItem>
    </SidebarMenu>
  )
}
```

### `src/components/dashboards/business-operations-dashboard/dashboardLayout.tsx`

```tsx
import { AppSidebar } from "./components/app-sidebar"
import {
  SidebarInset,
  SidebarProvider,
} from "@/components/ui/sidebar"

export const DashboardLayout = ({ children }: { children: React.ReactNode }) => {
  return (
    <SidebarProvider className="h-svh overflow-hidden">
      <AppSidebar />
      <SidebarInset className="border overflow-hidden min-h-0">
        {children}
      </SidebarInset>
    </SidebarProvider>
  )
}
```

### `src/components/dashboards/business-operations-dashboard/data.ts`

```ts
import {
    IconLayoutDashboard,
    IconCheckbox,
    IconUsers,
    IconFileInvoice,
    IconChartBar,
    IconSettings,
    IconUserPlus,
    IconCircleFilled,
} from "@tabler/icons-react"
import { type Invoice } from "./components/invoice-card"

export const data = {
    user: {
        name: "Lily Senate",
        email: "lily@kansas.inc",
        avatar: "/avatars/lily.jpg",
    },
    navMain: [
        {
            title: "Dashboard",
            url: "#",
            icon: IconLayoutDashboard,
            isDisabled: true,
        },
        {
            title: "Tasks",
            url: "#",
            icon: IconCheckbox,
            isDisabled: true,
        },
        {
            title: "Customers",
            url: "#",
            icon: IconUsers,
            isDisabled: true,
        },
        {
            title: "Invoices",
            url: "/dashboard/invoices",
            icon: IconFileInvoice,
            isActive: true,
            isDisabled: true,
        },
        {
            title: "Reports",
            url: "#",
            icon: IconChartBar,
            isDisabled: true,
        },
    ],
    settings: [
        {
            title: "Settings",
            url: "#",
            icon: IconSettings,
            isDisabled: true,
        },
        {
            title: "Invite users",
            url: "#",
            icon: IconUserPlus,
            isDisabled: true,
        },
    ],
    favorites: [
        {
            name: "Neo Gen",
            url: "#",
            icon: IconCircleFilled,
            color: "text-blue-500",
            isDisabled: true,
        },
        {
            name: "Stacks.com",
            url: "https://www.google.com/search?q=Stacks.com",
            icon: IconCircleFilled,
            color: "text-orange-500",
            isDisabled: true,
        },
        {
            name: "Aether AI",
            url: "#",
            icon: IconCircleFilled,
            color: "text-teal-500",
            isDisabled: true,
        },
        {
            name: "CloudChat",
            url: "#",
            icon: IconCircleFilled,
            color: "text-purple-500",
            isDisabled: true,
        },
    ],
}

export const invoices: Invoice[] = [
    // Unpaid
    { id: "INV-S0030", amount: "€12,450.00", status: "unpaid", date: "March 5, 2027", title: "Product Design Service", gradient: "from-blue-400 to-purple-500" },
    { id: "INV-S0078", amount: "€15,300.00", status: "unpaid", date: "August 14, 2027", title: "Brand Identity", gradient: "from-orange-400 to-rose-500" },
    { id: "INV-S0045", amount: "€8,750.00", status: "unpaid", date: "October 22, 2027", title: "UI/UX Audit", gradient: "from-cyan-400 to-blue-600" },
    { id: "INV-S0067", amount: "€2,300.00", status: "unpaid", date: "May 19, 2027", title: "Icon Set", gradient: "from-teal-400 to-yellow-500" },
    { id: "INV-S0035", amount: "€9,900.00", status: "unpaid", date: "October 1, 2027", title: "Design Systems", gradient: "from-pink-400 to-indigo-500" },

    // Paid
    { id: "INV-S0132", amount: "€17,650.00", status: "paid", date: "September 3, 2027", title: "SAAS Platform", gradient: "from-violet-500 to-fuchsia-500" },
    { id: "INV-S0101", amount: "€3,600.00", status: "paid", date: "December 30, 2027", title: "Consulting", gradient: "from-blue-300 to-emerald-400" },
    { id: "INV-S0123", amount: "€19,200.00", status: "paid", date: "February 18, 2027", title: "Full Scale Design", gradient: "from-indigo-400 to-cyan-400" },
    { id: "INV-S0094", amount: "€11,100.00", status: "paid", date: "June 27, 2027", title: "Design Support", gradient: "from-rose-300 to-pink-500" },
    { id: "INV-S0115", amount: "€16,750.00", status: "paid", date: "November 30, 2027", title: "User Research", gradient: "from-blue-500 to-indigo-600" },

    // Draft
    { id: "INV-S0056", amount: "€1,500.00", status: "draft", date: "January 25, 2027", title: "Maintenance", gradient: "from-orange-500 to-yellow-400" },
    { id: "INV-S0089", amount: "€5,800.00", status: "draft", date: "April 9, 2027", title: "App Redesign", gradient: "from-purple-400 to-pink-400" },
    { id: "INV-S0110", amount: "€14,900.00", status: "draft", date: "November 11, 2027", title: "Marketing Web", gradient: "from-blue-400 to-emerald-400" },
    { id: "INV-S0120", amount: "€4,400.00", status: "draft", date: "July 15, 2027", title: "Landing Page", gradient: "from-indigo-400 to-purple-500" },
    { id: "INV-S0108", amount: "€7,250.00", status: "draft", date: "December 12, 2027", title: "Illustration", gradient: "from-blue-900 to-indigo-950" },
]
```

### `src/components/dashboards/business-operations-dashboard/demo.tsx`

```tsx
"use client";

import { DashboardLayout } from "./dashboardLayout";
import InvoicesPageView from "./invoicesPageView";

export default function BusinessOperationsDashboardDemo() {
    return (
        <DashboardLayout>
            <InvoicesPageView />
        </DashboardLayout>
    );
}
```

### `src/components/dashboards/business-operations-dashboard/invoicesPageView.tsx`

```tsx
"use client"

import {
    IconPlus,
    IconSearch,
    IconLayoutGrid,
    IconFilter,
    IconLayoutSidebar,
    IconCalendarEvent,
    IconFileInvoice,
    IconDots,
    IconClockFilled,
    IconCircleCheckFilled,
    IconFileStarFilled,
} from "@tabler/icons-react"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Textarea } from "@/components/ui/textarea"
import {
    Tabs,
    TabsContent,
    TabsList,
    TabsTrigger,
} from "@/components/ui/tabs"
import {
    Dialog,
    DialogContent,
    DialogDescription,
    DialogFooter,
    DialogHeader,
    DialogTitle,
    DialogTrigger,
} from "@/components/ui/dialog"
import {
    Popover,
    PopoverContent,
    PopoverTrigger,
} from "@/components/ui/popover"
import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuLabel,
    DropdownMenuSeparator,
    DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { SidebarTrigger, useSidebar } from "@/components/ui/sidebar"
import { InvoiceCard } from "./components/invoice-card"
import { Separator } from '@/components/ui/separator'
import { invoices } from "./data"

export default function InvoicesPageView() {
    const { state, isMobile } = useSidebar()
    return (
        <div className="flex flex-col h-full bg-neutral-50/50 dark:bg-neutral-950/50 rounded-xl overflow-hidden min-h-0">
            {/* Header */}
            <header className="flex h-14 shrink-0 items-center justify-between px-5 border-b bg-background rounded-t-xl">
                <div className="flex items-center gap-2">
                    {(state === "collapsed" || isMobile) &&
                        <>
                            <SidebarTrigger className="-ml-1" />
                            <div className="w-[1px] h-4 bg-border mx-1" />
                        </>
                    }
                    <div className="flex items-center gap-2 h-4">
                        <div className="flex items-center gap-1.5">
                            <IconFileInvoice className="size-4 text-muted-foreground" />
                            <h1 className="text-[15px] font-semibold">Invoices</h1>
                            <DropdownMenu>
                                <DropdownMenuTrigger asChild>
                                    <Button variant="ghost" size="icon" className="size-6 text-muted-foreground/50 hover:text-muted-foreground hover:bg-neutral-100 dark:hover:bg-neutral-800 rounded-md transition-colors">
                                        <IconDots className="size-3.5" />
                                    </Button>
                                </DropdownMenuTrigger>
                                <DropdownMenuContent align="start" className="w-56">
                                    <DropdownMenuLabel>Page Settings</DropdownMenuLabel>
                                    <DropdownMenuSeparator />
                                    <DropdownMenuItem>Rename Page</DropdownMenuItem>
                                    <DropdownMenuItem>Duplicate Page</DropdownMenuItem>
                                    <DropdownMenuItem>Export as JSON</DropdownMenuItem>
                                    <DropdownMenuSeparator />
                                    <DropdownMenuItem variant="destructive">Delete Page</DropdownMenuItem>
                                </DropdownMenuContent>
                            </DropdownMenu>
                        </div>
                    </div>
                </div>
                <Dialog>
                    <DialogTrigger asChild>
                        <Button className="group h-8 bg-indigo-600 hover:bg-indigo-700 transition-colors duration-200 hover:shadow-md hover:shadow-indigo-500/20 text-white text-xs px-3 gap-2 rounded-md shrink-0 focus-visible:ring-2 focus-visible:ring-indigo-500 focus-visible:ring-offset-2">
                            <IconPlus className="size-3.5" />
                            <span className="hidden sm:inline">Create Invoice</span>
                        </Button>
                    </DialogTrigger>
                    <DialogContent className="sm:max-w-[425px]">
                        <DialogHeader>
                            <DialogTitle>Create New Invoice</DialogTitle>
                            <DialogDescription>
                                Fill in the details to create a new invoice for your client.
                            </DialogDescription>
                        </DialogHeader>
                        <div className="grid gap-4 py-4">
                            <div className="grid gap-2">
                                <Label htmlFor="client">Client Name</Label>
                                <Input id="client" placeholder="e.g. Acme Corp" className="focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-neutral-400 dark:focus-visible:border-neutral-600 text-foreground" />
                            </div>
                            <div className="grid grid-cols-2 gap-4">
                                <div className="grid gap-2">
                                    <Label htmlFor="amount">Amount</Label>
                                    <Input id="amount" type="number" placeholder="0.00" className="focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-neutral-400 dark:focus-visible:border-neutral-600 text-foreground" />
                                </div>
                                <div className="grid gap-2">
                                    <Label htmlFor="due-date">Due Date</Label>
                                    <Input id="due-date" type="date" className="focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-neutral-400 dark:focus-visible:border-neutral-600 text-foreground" />
                                </div>
                            </div>
                            <div className="grid gap-2">
                                <Label htmlFor="notes">Notes</Label>
                                <Textarea id="notes" placeholder="Optional notes for the client..." className="focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-neutral-400 dark:focus-visible:border-neutral-600 text-foreground" />
                            </div>
                        </div>
                        <DialogFooter>
                            <Button type="submit" className="bg-indigo-600 hover:bg-indigo-700 text-white">Save Invoice</Button>
                        </DialogFooter>
                    </DialogContent>
                </Dialog>
            </header>

            {/* Toolbar */}
            <Tabs defaultValue="board" className="flex-1 flex flex-col min-h-0 gap-0">
                <div className="flex flex-col lg:flex-row lg:items-center justify-between px-5 py-3 gap-4 border-b bg-background">
                    <div className="flex items-center gap-3 w-full overflow-x-auto scrollbar-hide">
                        <TabsList className="bg-transparent p-1 gap-2">
                            <TabsTrigger value="board" className="gap-2 h-9 transition-colors duration-200 data-[state=active]:bg-neutral-100 dark:data-[state=active]:bg-neutral-800 data-[state=active]:shadow-none! data-[state=active]:border-neutral-300/80 dark:data-[state=active]:border-neutral-700/50 text-foreground">
                                <IconLayoutGrid className="size-4" />
                                Board
                            </TabsTrigger>
                            <TabsTrigger disabled value="overview" className="gap-2 h-9 transition-colors duration-200 data-[state=active]:bg-neutral-100 dark:data-[state=active]:bg-neutral-800 data-[state=active]:shadow-none! data-[state=active]:border-neutral-300/80 dark:data-[state=active]:border-neutral-700/50 text-foreground">
                                <IconCalendarEvent className="size-4" />
                                Overview
                            </TabsTrigger>
                            <TabsTrigger disabled value="list" className="gap-2 h-9 transition-colors duration-200 data-[state=active]:bg-neutral-100 dark:data-[state=active]:bg-neutral-800 data-[state=active]:shadow-none! data-[state=active]:border-neutral-300/80 dark:data-[state=active]:border-neutral-700/50 text-foreground">
                                <IconLayoutSidebar className="size-4" />
                                List
                            </TabsTrigger>
                        </TabsList>

                        <Separator
                            orientation="vertical"
                            className=" data-[orientation=vertical]:h-6"
                        />
                        <DropdownMenu>
                            <DropdownMenuTrigger asChild>
                                <Button size="sm" className="text-muted-foreground gap-1.5 bg-background border hover:bg-neutral-50 dark:hover:bg-neutral-900 transition-colors duration-200 h-9 shrink-0 cursor-pointer">
                                    <IconPlus className="size-4" />
                                    <span className="hidden sm:inline">Add View</span>
                                </Button>
                            </DropdownMenuTrigger>
                            <DropdownMenuContent align="start" className="w-48">
                                <DropdownMenuLabel>Views</DropdownMenuLabel>
                                <DropdownMenuSeparator />
                                <DropdownMenuItem>Grid View</DropdownMenuItem>
                                <DropdownMenuItem>List View</DropdownMenuItem>
                                <DropdownMenuItem>Kanban View</DropdownMenuItem>
                            </DropdownMenuContent>
                        </DropdownMenu>
                    </div>
                    <div className="flex items-center gap-2 w-full lg:w-auto">
                        <div className="relative flex-1 lg:w-64">
                            <IconSearch className="absolute left-2.5 top-2.5 size-4 text-muted-foreground" />
                            <Input placeholder="Search invoice..." className="pl-9 bg-muted/50 shadow-none border w-full focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-neutral-400 dark:focus-visible:border-neutral-600 text-foreground" />
                        </div>
                        <Separator
                            orientation="vertical"
                            className=" data-[orientation=vertical]:h-6"
                        />
                        <Popover>
                            <PopoverTrigger asChild>
                                <Button variant="outline" size="sm" className="gap-2 h-9 transition-colors duration-200 hover:bg-neutral-50 dark:hover:bg-neutral-900 shadow-xs cursor-pointer">
                                    <IconLayoutGrid className="size-4" />
                                    View
                                </Button>
                            </PopoverTrigger>
                            <PopoverContent className="w-56 p-2">
                                <div className="grid gap-1">
                                    <Button variant="ghost" size="sm" className="justify-start font-normal h-8">Board View</Button>
                                    <Button variant="ghost" size="sm" className="justify-start font-normal h-8">Table View</Button>
                                    <Button variant="ghost" size="sm" className="justify-start font-normal h-8">List View</Button>
                                </div>
                            </PopoverContent>
                        </Popover>

                        <Popover>
                            <PopoverTrigger asChild>
                                <Button variant="outline" size="sm" className="gap-2 h-9 transition-colors duration-200 hover:bg-neutral-50 dark:hover:bg-neutral-900 shadow-xs cursor-pointer">
                                    <IconFilter className="size-4" />
                                    Filter
                                </Button>
                            </PopoverTrigger>
                            <PopoverContent className="w-64 p-3">
                                <div className="space-y-3">
                                    <h4 className="font-medium text-sm leading-none">Filter Invoices</h4>
                                    <div className="grid gap-2">
                                        <Label htmlFor="status-filter" className="text-xs">Status</Label>
                                        <Input id="status-filter" placeholder="Filter by status..." className="h-8 text-xs focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-neutral-400 dark:focus-visible:border-neutral-600 text-foreground" />
                                    </div>
                                    <div className="flex justify-end gap-2 pt-2">
                                        <Button variant="outline" size="sm" className="h-7 text-xs">Reset</Button>
                                        <Button size="sm" className="h-7 text-xs bg-indigo-600 hover:bg-indigo-700 text-white">Apply</Button>
                                    </div>
                                </div>
                            </PopoverContent>
                        </Popover>
                    </div>
                </div>
                <TabsContent value="board" className="flex-1 flex flex-col min-h-0 m-0 data-[state=inactive]:hidden overflow-hidden">
                    <div className="flex-1 overflow-hidden p-4 md:p-6 md:pb-0  flex flex-col">
                        <div className="flex w-full gap-4 md:gap-6 flex-1 items-stretch min-h-0 overflow-x-auto md:overflow-visible scrollbar-hide snap-x snap-mandatory pb-4">
                            {/* Unpaid Column */}
                            <div className="flex flex-col gap-4 flex-1 min-w-[300px] md:min-w-0 min-h-0 snap-center">
                                <div className="flex items-center justify-between bg-orange-500/10 dark:bg-orange-500/20 px-3 py-2 rounded-lg shrink-0">
                                    <div className="flex items-center gap-2 text-orange-600 dark:text-orange-400">
                                        <IconClockFilled
                                            className="size-5 " />
                                        <span className="font-semibold font-mono text-sm tracking-tight ">Unpaid</span>
                                    </div>
                                    <div className="flex items-center gap-2">
                                        <span className="text-xs font-medium text-neutral-500 font-mono">12</span>
                                        <DropdownMenu>
                                            <DropdownMenuTrigger asChild>
                                                <Button variant="ghost" size="icon" className="size-6 text-neutral-500 hover:bg-orange-200/50 dark:hover:bg-orange-500/20 transition-colors cursor-pointer">
                                                    <IconDots className="size-3.5" />
                                                </Button>
                                            </DropdownMenuTrigger>
                                            <DropdownMenuContent align="end" className="w-48">
                                                <DropdownMenuLabel>Column Actions</DropdownMenuLabel>
                                                <DropdownMenuSeparator />
                                                <DropdownMenuItem>Select All</DropdownMenuItem>
                                                <DropdownMenuItem>Archive All</DropdownMenuItem>
                                                <DropdownMenuSeparator />
                                                <DropdownMenuItem variant="destructive">Delete Column</DropdownMenuItem>
                                            </DropdownMenuContent>
                                        </DropdownMenu>
                                    </div>
                                </div>
                                <div className="flex-1 overflow-y-auto scrollbar-hide">
                                    <div className="flex flex-col gap-4">
                                        {invoices.filter(i => i.status === "unpaid").map(invoice => (
                                            <InvoiceCard key={invoice.id} invoice={invoice} />
                                        ))}
                                    </div>
                                </div>
                            </div>

                            <Separator orientation="vertical" className='hidden md:block data-[orientation=vertical]:h-full data-[orientation=vertical]:bg-border' />

                            {/* Paid Column */}
                            <div className="flex flex-col gap-4 flex-1 min-w-[300px] md:min-w-0 min-h-0 snap-center">
                                <div className="flex items-center justify-between bg-emerald-500/10 dark:bg-emerald-500/20 px-3 py-2 rounded-lg shrink-0">
                                    <div className="flex items-center gap-2 text-emerald-600 dark:text-emerald-400">
                                        <IconCircleCheckFilled className="size-5" />
                                        <span className="font-semibold font-mono text-sm tracking-tight">Paid</span>
                                    </div>
                                    <div className="flex items-center gap-2">
                                        <span className="text-xs font-medium text-neutral-500 font-mono">12</span>
                                        <DropdownMenu>
                                            <DropdownMenuTrigger asChild>
                                                <Button variant="ghost" size="icon" className="size-6 text-neutral-500 hover:bg-emerald-200/50 dark:hover:bg-emerald-500/20 transition-colors cursor-pointer">
                                                    <IconDots className="size-3.5" />
                                                </Button>
                                            </DropdownMenuTrigger>
                                            <DropdownMenuContent align="end" className="w-48">
                                                <DropdownMenuLabel>Column Actions</DropdownMenuLabel>
                                                <DropdownMenuSeparator />
                                                <DropdownMenuItem>Select All</DropdownMenuItem>
                                                <DropdownMenuItem>Archive All</DropdownMenuItem>
                                                <DropdownMenuSeparator />
                                                <DropdownMenuItem variant="destructive">Delete Column</DropdownMenuItem>
                                            </DropdownMenuContent>
                                        </DropdownMenu>
                                    </div>
                                </div>
                                <div className="flex-1 overflow-y-auto scrollbar-hide">
                                    <div className="flex flex-col gap-4">
                                        {invoices.filter(i => i.status === "paid").map(invoice => (
                                            <InvoiceCard key={invoice.id} invoice={invoice} />
                                        ))}
                                    </div>
                                </div>
                            </div>

                            <Separator orientation="vertical" className='hidden md:block data-[orientation=vertical]:h-auto  data-[orientation=vertical]:bg-border' />

                            {/* Draft Column */}
                            <div className="flex flex-col gap-4 flex-1 min-w-[300px] md:min-w-0 min-h-0 snap-center">
                                <div className="flex items-center justify-between bg-neutral-500/10 dark:bg-neutral-800 px-3 py-2 rounded-lg shrink-0">
                                    <div className="flex items-center gap-2">
                                        <IconFileStarFilled className="size-5 text-neutral-600 dark:text-neutral-400" />
                                        <span className="font-semibold text-neutral-950 dark:text-neutral-50 font-mono text-sm tracking-tight">Draft</span>
                                    </div>
                                    <div className="flex items-center gap-2">
                                        <span className="text-xs font-medium text-neutral-500 font-mono">12</span>
                                        <DropdownMenu>
                                            <DropdownMenuTrigger asChild>
                                                <Button variant="ghost" size="icon" className="size-6 text-neutral-500 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors cursor-pointer">
                                                    <IconDots className="size-3.5" />
                                                </Button>
                                            </DropdownMenuTrigger>
                                            <DropdownMenuContent align="end" className="w-48">
                                                <DropdownMenuLabel>Column Actions</DropdownMenuLabel>
                                                <DropdownMenuSeparator />
                                                <DropdownMenuItem>Select All</DropdownMenuItem>
                                                <DropdownMenuItem>Archive All</DropdownMenuItem>
                                                <DropdownMenuSeparator />
                                                <DropdownMenuItem variant="destructive">Delete Column</DropdownMenuItem>
                                            </DropdownMenuContent>
                                        </DropdownMenu>
                                    </div>
                                </div>
                                <div className="flex-1 overflow-y-auto scrollbar-hide">
                                    <div className="flex flex-col gap-4">
                                        {invoices.filter(i => i.status === "draft").map(invoice => (
                                            <InvoiceCard key={invoice.id} invoice={invoice} />
                                        ))}
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </TabsContent>
            </Tabs>
        </div>
    )
}
```
