{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "sales-sidebar",
  "title": "Sales Sidebar",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/sales-sidebar/sales-sidebar.component.ts",
      "content": "import { Component, EventEmitter, Input, Output, signal, ChangeDetectionStrategy } from '@angular/core'\nimport {\n  UiSidebarComponent,\n  UiSidebarContentComponent,\n  UiSidebarFooterComponent,\n  UiSidebarGroupComponent,\n  UiSidebarGroupLabelComponent,\n  UiSidebarHeaderComponent,\n  UiSidebarMenuButtonComponent,\n  UiSidebarMenuComponent,\n  UiSidebarMenuItemComponent,\n  UiSidebarMenuSubButtonComponent,\n  UiSidebarMenuSubComponent,\n  UiSidebarMenuSubItemComponent,\n  UiSidebarRailComponent,\n  injectSidebar,\n} from '@/ui/sidebar/sidebar.component'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport {\n  UiCollapsibleComponent,\n  UiCollapsibleContentComponent,\n  UiCollapsibleTriggerComponent,\n} from '@/ui/collapsible/collapsible.component'\nimport {\n  UiDropdownMenuComponent,\n  UiDropdownMenuContentComponent,\n  UiDropdownMenuItemComponent,\n  UiDropdownMenuLabelComponent,\n  UiDropdownMenuSeparatorComponent,\n  UiDropdownMenuTriggerComponent,\n} from '@/ui/dropdown-menu/dropdown-menu.component'\nimport {\n  LucideAngularModule,\n  LayoutDashboard,\n  ShoppingCart,\n  Users,\n  Package,\n  TrendingUp,\n  Settings,\n  LifeBuoy,\n  Store,\n  Plus,\n  Check,\n  ChevronsUpDown,\n  ChevronRight,\n  LogOut,\n  type LucideIconData,\n} from 'lucide-angular'\n\nexport interface SalesNavChild {\n  title: string\n}\n\nexport interface SalesNavItem {\n  title: string\n  icon: LucideIconData\n  badge?: string\n  children?: SalesNavChild[]\n}\n\nexport interface SalesTeam {\n  name: string\n  plan: string\n  initials: string\n}\n\nconst NAV_MAIN: SalesNavItem[] = [\n  { title: 'Dashboard', icon: LayoutDashboard },\n  {\n    title: 'Orders',\n    icon: ShoppingCart,\n    badge: '12',\n    children: [{ title: 'All orders' }, { title: 'Pending' }, { title: 'Returns' }],\n  },\n  { title: 'Customers', icon: Users },\n  {\n    title: 'Products',\n    icon: Package,\n    children: [{ title: 'Catalog' }, { title: 'Inventory' }, { title: 'Categories' }],\n  },\n  { title: 'Analytics', icon: TrendingUp },\n  { title: 'Settings', icon: Settings },\n]\n\nconst NAV_SECONDARY: SalesNavItem[] = [{ title: 'Support', icon: LifeBuoy }]\n\nconst STORES: SalesNavItem[] = [\n  { title: 'Flagship store', icon: Store },\n  { title: 'Outlet store', icon: Store },\n]\n\nconst TEAMS: SalesTeam[] = [\n  { name: 'Acme Inc', plan: 'Flagship store', initials: 'AC' },\n  { name: 'Globex', plan: 'Outlet store', initials: 'GX' },\n]\n\n/**\n * Sales-sidebar navigation: team switcher, collapsible platform groups (one open at a\n * time), store list, secondary links and a user menu. Composed from the sidebar,\n * collapsible, dropdown-menu and badge primitives; renders inside <ui-sidebar>, so it\n * gets the icon rail, tooltips and the mobile sheet from the primitive. Selection is\n * owned by the parent via [(active)].\n */\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-sales-sidebar-nav, [ui-sales-sidebar-nav]',\n  standalone: true,\n  host: { class: 'contents' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiCollapsibleComponent,\n    UiCollapsibleTriggerComponent,\n    UiCollapsibleContentComponent,\n    UiDropdownMenuComponent,\n    UiDropdownMenuTriggerComponent,\n    UiDropdownMenuContentComponent,\n    UiDropdownMenuItemComponent,\n    UiDropdownMenuLabelComponent,\n    UiDropdownMenuSeparatorComponent,\n    UiSidebarHeaderComponent,\n    UiSidebarContentComponent,\n    UiSidebarFooterComponent,\n    UiSidebarGroupComponent,\n    UiSidebarGroupLabelComponent,\n    UiSidebarMenuComponent,\n    UiSidebarMenuItemComponent,\n    UiSidebarMenuButtonComponent,\n    UiSidebarMenuSubComponent,\n    UiSidebarMenuSubItemComponent,\n    UiSidebarMenuSubButtonComponent,\n  ],\n  template: `\n    <ui-sidebar-header>\n      <ul ui-sidebar-menu>\n        <li ui-sidebar-menu-item>\n          <ui-dropdown-menu>\n            <button\n              type=\"button\"\n              ui-sidebar-menu-button\n              ui-dropdown-menu-trigger\n              size=\"lg\"\n              class=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground group-data-[collapsible=icon]:!justify-center\"\n            >\n              <span\n                class=\"bg-sidebar-primary text-sidebar-primary-foreground flex size-8 shrink-0 items-center justify-center rounded-lg text-xs font-bold group-data-[collapsible=icon]:size-6 group-data-[collapsible=icon]:text-[10px]\"\n              >\n                {{ activeTeam().initials }}\n              </span>\n              <span class=\"grid flex-1 text-left text-sm leading-tight group-data-[collapsible=icon]:hidden\">\n                <span class=\"truncate font-bold\">{{ activeTeam().name }}</span>\n                <span class=\"text-muted-foreground truncate text-xs\">{{ activeTeam().plan }}</span>\n              </span>\n              <lucide-icon\n                [img]=\"ChevronsUpDown\"\n                class=\"text-muted-foreground ml-auto size-4 group-data-[collapsible=icon]:hidden\"\n              />\n            </button>\n            <ui-dropdown-menu-content\n              class=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg\"\n              [side]=\"sidebar.isMobile ? 'bottom' : 'right'\"\n              align=\"start\"\n              [sideOffset]=\"4\"\n            >\n              <ui-dropdown-menu-label class=\"text-muted-foreground text-xs\">Stores</ui-dropdown-menu-label>\n              @for (team of teams; track team.name) {\n                <ui-dropdown-menu-item class=\"gap-2 p-2\" (select)=\"selectTeam(team)\">\n                  <span class=\"flex size-6 items-center justify-center rounded-sm border text-xs font-bold\">{{\n                    team.initials\n                  }}</span>\n                  {{ team.name }}\n                  @if (team.name === activeTeam().name) {\n                    <lucide-icon [img]=\"Check\" class=\"ml-auto size-4\" />\n                  }\n                </ui-dropdown-menu-item>\n              }\n            </ui-dropdown-menu-content>\n          </ui-dropdown-menu>\n        </li>\n      </ul>\n    </ui-sidebar-header>\n\n    <ui-sidebar-content class=\"gap-4\">\n      <ui-sidebar-group>\n        <ui-sidebar-group-label>Platform</ui-sidebar-group-label>\n        <ul ui-sidebar-menu>\n          @for (item of navMain; track item.title) {\n            @if (item.children?.length) {\n              <li\n                ui-sidebar-menu-item\n                ui-collapsible\n                [open]=\"isExpanded(item.title)\"\n                (openChange)=\"setExpanded(item.title, $event)\"\n              >\n                <button\n                  type=\"button\"\n                  ui-sidebar-menu-button\n                  ui-collapsible-trigger\n                  [tooltip]=\"item.title\"\n                  [isActive]=\"isActive(item.title)\"\n                  (click)=\"select(item.title)\"\n                >\n                  <lucide-icon [img]=\"item.icon\" class=\"size-4 shrink-0\" />\n                  <span class=\"flex-1 text-left\">{{ item.title }}</span>\n                  @if (item.badge) {\n                    <span ui-badge variant=\"secondary\">{{ item.badge }}</span>\n                  }\n                  <lucide-icon\n                    [img]=\"ChevronRight\"\n                    class=\"size-4 shrink-0 transition-transform duration-200\"\n                    [class.rotate-90]=\"isExpanded(item.title)\"\n                  />\n                </button>\n                <ui-collapsible-content>\n                  <ul ui-sidebar-menu-sub>\n                    @for (child of item.children; track child.title) {\n                      <li ui-sidebar-menu-sub-item>\n                        <button\n                          type=\"button\"\n                          ui-sidebar-menu-sub-button\n                          [isActive]=\"isActive(child.title)\"\n                          (click)=\"select(child.title)\"\n                        >\n                          <span>{{ child.title }}</span>\n                        </button>\n                      </li>\n                    }\n                  </ul>\n                </ui-collapsible-content>\n              </li>\n            } @else {\n              <li ui-sidebar-menu-item>\n                <button\n                  type=\"button\"\n                  ui-sidebar-menu-button\n                  [tooltip]=\"item.title\"\n                  [isActive]=\"isActive(item.title)\"\n                  (click)=\"select(item.title)\"\n                >\n                  <lucide-icon [img]=\"item.icon\" class=\"size-4 shrink-0\" />\n                  <span class=\"flex-1 text-left\">{{ item.title }}</span>\n                  @if (item.badge) {\n                    <span ui-badge variant=\"secondary\">{{ item.badge }}</span>\n                  }\n                </button>\n              </li>\n            }\n          }\n        </ul>\n      </ui-sidebar-group>\n\n      <ui-sidebar-group>\n        <ui-sidebar-group-label>Stores</ui-sidebar-group-label>\n        <ul ui-sidebar-menu>\n          @for (store of stores; track store.title) {\n            <li ui-sidebar-menu-item>\n              <button\n                type=\"button\"\n                ui-sidebar-menu-button\n                [tooltip]=\"store.title\"\n                [isActive]=\"isActive(store.title)\"\n                (click)=\"select(store.title)\"\n              >\n                <lucide-icon [img]=\"store.icon\" class=\"size-4 shrink-0\" />\n                <span class=\"flex-1 text-left\">{{ store.title }}</span>\n              </button>\n            </li>\n          }\n        </ul>\n      </ui-sidebar-group>\n\n      <ui-sidebar-group class=\"mt-auto\">\n        <ul ui-sidebar-menu>\n          @for (item of navSecondary; track item.title) {\n            <li ui-sidebar-menu-item>\n              <button\n                type=\"button\"\n                ui-sidebar-menu-button\n                [tooltip]=\"item.title\"\n                [isActive]=\"isActive(item.title)\"\n                (click)=\"select(item.title)\"\n              >\n                <lucide-icon [img]=\"item.icon\" class=\"size-4 shrink-0\" />\n                <span class=\"flex-1 text-left\">{{ item.title }}</span>\n              </button>\n            </li>\n          }\n        </ul>\n      </ui-sidebar-group>\n    </ui-sidebar-content>\n\n    <ui-sidebar-footer>\n      <ul ui-sidebar-menu>\n        <li ui-sidebar-menu-item>\n          <ui-dropdown-menu>\n            <button\n              type=\"button\"\n              ui-sidebar-menu-button\n              ui-dropdown-menu-trigger\n              size=\"lg\"\n              class=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground group-data-[collapsible=icon]:!justify-center\"\n            >\n              <span\n                class=\"bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-full text-xs font-bold group-data-[collapsible=icon]:size-6 group-data-[collapsible=icon]:text-[10px]\"\n              >\n                JD\n              </span>\n              <span class=\"grid flex-1 text-left text-sm leading-tight group-data-[collapsible=icon]:hidden\">\n                <span class=\"truncate font-semibold\">Jane Doe</span>\n                <span class=\"text-muted-foreground truncate text-xs\">jane&#64;acme.com</span>\n              </span>\n              <lucide-icon\n                [img]=\"ChevronsUpDown\"\n                class=\"text-muted-foreground ml-auto size-4 group-data-[collapsible=icon]:hidden\"\n              />\n            </button>\n            <ui-dropdown-menu-content\n              class=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg\"\n              [side]=\"sidebar.isMobile ? 'bottom' : 'right'\"\n              align=\"end\"\n              [sideOffset]=\"4\"\n            >\n              <ui-dropdown-menu-item><lucide-icon [img]=\"Settings\" /> Account settings</ui-dropdown-menu-item>\n              <ui-dropdown-menu-item><lucide-icon [img]=\"Plus\" /> Invite member</ui-dropdown-menu-item>\n              <ui-dropdown-menu-separator />\n              <ui-dropdown-menu-item><lucide-icon [img]=\"LogOut\" /> Log out</ui-dropdown-menu-item>\n            </ui-dropdown-menu-content>\n          </ui-dropdown-menu>\n        </li>\n      </ul>\n    </ui-sidebar-footer>\n  `,\n})\nexport class UiSalesSidebarNavComponent {\n  readonly sidebar = injectSidebar()\n  @Input() active = 'Dashboard'\n  @Output() activeChange = new EventEmitter<string>()\n\n  protected readonly navMain = NAV_MAIN\n  protected readonly navSecondary = NAV_SECONDARY\n  protected readonly stores = STORES\n  protected readonly teams = TEAMS\n\n  protected readonly Settings = Settings\n  protected readonly Plus = Plus\n  protected readonly Check = Check\n  protected readonly ChevronsUpDown = ChevronsUpDown\n  protected readonly ChevronRight = ChevronRight\n  protected readonly LogOut = LogOut\n\n  private readonly expanded = signal<string | null>('Orders')\n  private readonly activeTeamSignal = signal<SalesTeam>(TEAMS[0]!)\n\n  activeTeam(): SalesTeam {\n    return this.activeTeamSignal()\n  }\n\n  isActive(title: string): boolean {\n    return this.active === title\n  }\n\n  isExpanded(title: string): boolean {\n    return this.expanded() === title\n  }\n\n  select(title: string): void {\n    this.active = title\n    this.activeChange.emit(title)\n  }\n\n  /** Accordion: opening a group closes the others. */\n  setExpanded(title: string, open: boolean): void {\n    this.expanded.set(open ? title : this.expanded() === title ? null : this.expanded())\n  }\n\n  toggleGroup(title: string): void {\n    this.setExpanded(title, !this.isExpanded(title))\n  }\n\n  selectTeam(team: SalesTeam): void {\n    this.activeTeamSignal.set(team)\n  }\n}\n\n/**\n * Sales sidebar block: a `collapsible=\"icon\"` Sidebar around the nav. Place it inside\n * <ui-sidebar-provider> next to <ui-sidebar-inset> (with a <ui-sidebar-trigger>) --\n * the primitive then handles the icon rail, Cmd/Ctrl+B and the mobile sheet.\n */\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-sales-sidebar, [ui-sales-sidebar]',\n  standalone: true,\n  // Renders <ui-sidebar> itself: keep this wrapper out of the provider's flex layout.\n  host: { class: 'contents' },\n  imports: [UiSidebarComponent, UiSidebarRailComponent, UiSalesSidebarNavComponent],\n  template: `\n    <ui-sidebar collapsible=\"icon\">\n      <ui-sales-sidebar-nav [active]=\"active\" (activeChange)=\"activeChange.emit($event)\" />\n      <button ui-sidebar-rail></button>\n    </ui-sidebar>\n  `,\n})\nexport class UiSalesSidebarComponent {\n  @Input() active = 'Dashboard'\n  @Output() activeChange = new EventEmitter<string>()\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/sales-sidebar/sales-sidebar.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/sales-sidebar/index.ts",
      "content": "export {\n  UiSalesSidebarComponent,\n  UiSalesSidebarNavComponent,\n  type SalesNavItem,\n  type SalesNavChild,\n  type SalesTeam,\n} from './sales-sidebar.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/sales-sidebar/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/sidebar.json",
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/collapsible.json",
    "https://uipkge.dev/r/angular/dropdown-menu.json"
  ],
  "description": "App sidebar for sales workspaces: team switcher header, collapsible platform nav with badges, store list, secondary links, and user footer. Composed from the sidebar, collapsible, dropdown-menu and badge primitives; place inside <ui-sidebar-provider> for the icon rail, Cmd/Ctrl+B and mobile sheet. Selection flows through [(active)].",
  "categories": [
    "layout",
    "sidebar"
  ]
}