@handled-ai/design-system 0.9.8 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const badgeVariants: (props?: ({
6
- variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "ghost" | null | undefined;
6
+ variant?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link" | null | undefined;
7
7
  } & class_variance_authority_types.ClassProp) | undefined) => string;
8
8
  declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
9
9
  asChild?: boolean;
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "ghost" | null | undefined;
6
+ variant?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link" | null | undefined;
7
7
  size?: "default" | "sm" | "lg" | "icon" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
@@ -11,6 +11,8 @@ interface SidebarNavItem {
11
11
  }
12
12
  interface SidebarNavSection {
13
13
  title?: string;
14
+ /** Optional icon shown to the left of the section title (expanded sidebars only). */
15
+ titleIconUrl?: string;
14
16
  items: SidebarNavItem[];
15
17
  moreItems?: SidebarNavItem[];
16
18
  }
@@ -234,7 +234,18 @@ function NavSection({
234
234
  onClick: () => setIsExpanded(!isExpanded),
235
235
  className: "flex w-full items-center justify-between mb-1 px-3 group cursor-pointer",
236
236
  children: [
237
- /* @__PURE__ */ jsx("span", { className: "text-xs font-bold tracking-widest text-sidebar-foreground/50 uppercase", children: section.title }),
237
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 min-w-0", children: [
238
+ section.titleIconUrl && /* @__PURE__ */ jsx(
239
+ "img",
240
+ {
241
+ src: section.titleIconUrl,
242
+ alt: "",
243
+ "aria-hidden": "true",
244
+ className: "h-3.5 w-3.5 shrink-0 object-contain opacity-70"
245
+ }
246
+ ),
247
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-bold tracking-widest text-sidebar-foreground/50 uppercase truncate", children: section.title })
248
+ ] }),
238
249
  /* @__PURE__ */ jsx(
239
250
  ChevronDown,
240
251
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/quick-action-sidebar-nav.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n Activity,\n BarChart2,\n Building,\n ChevronDown,\n Code,\n Inbox,\n Link as LinkIcon,\n LogOut,\n MessageSquare,\n MoreHorizontal,\n MoreVertical,\n PanelLeftClose,\n PanelLeftOpen,\n Plus,\n Search,\n Settings,\n Users,\n} from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Avatar, AvatarFallback } from \"./avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\nimport { QuickActionModal, type QuickActionTaskDraft, type QuickActionTemplate } from \"./quick-action-modal\"\n\nexport interface SidebarNavItem {\n id: string\n label: string\n icon: React.ComponentType<{ className?: string }>\n children?: SidebarNavItem[]\n}\n\nexport interface SidebarNavSection {\n title?: string\n items: SidebarNavItem[]\n moreItems?: SidebarNavItem[]\n}\n\nexport interface SidebarUserProfile {\n name: string\n email: string\n initials?: string\n}\n\nexport interface UserMenuItem {\n id: string\n label: string\n icon: React.ComponentType<{ className?: string }>\n destructive?: boolean\n}\n\nexport type ActiveVariant = \"default\" | \"gradient\"\n\ninterface QuickActionSidebarNavProps extends React.ComponentProps<\"aside\"> {\n brandLabel?: string\n brandSubtitle?: string\n brandImage?: string\n hideQuickAction?: boolean\n navSections?: SidebarNavSection[]\n activeItemId?: string\n activeVariant?: ActiveVariant\n onNavigate?: (itemId: string) => void\n user?: SidebarUserProfile\n userMenuItems?: UserMenuItem[]\n onUserMenuAction?: (itemId: string) => void\n onCreateTask?: (draft: QuickActionTaskDraft) => void\n defaultCollapsed?: boolean\n quickActionTemplates?: QuickActionTemplate[]\n quickActionTitle?: string\n quickActionDescription?: string\n}\n\nconst DEFAULT_NAV_SECTIONS: SidebarNavSection[] = [\n {\n items: [\n { id: \"home\", label: \"Home\", icon: Inbox },\n { id: \"inbox\", label: \"Inbox\", icon: Inbox },\n ],\n },\n {\n title: \"Focus\",\n items: [\n { id: \"inbox\", label: \"Unibox\", icon: Inbox },\n { id: \"accounts\", label: \"My Accounts\", icon: Building },\n { id: \"activity\", label: \"Activity\", icon: Activity },\n { id: \"dashboard\", label: \"Insights\", icon: BarChart2 },\n ],\n moreItems: [\n { id: \"search\", label: \"Search\", icon: Search },\n ],\n },\n {\n title: \"Assistant\",\n items: [\n { id: \"new-chat\", label: \"New chat\", icon: Plus },\n { id: \"chats\", label: \"Chats\", icon: MessageSquare },\n ],\n },\n {\n title: \"Your Teams\",\n items: [\n { id: \"team-a\", label: \"Team A\", icon: Users },\n { id: \"team-b\", label: \"Team B\", icon: Users },\n ],\n moreItems: [\n { id: \"more-teams\", label: \"More\", icon: MoreHorizontal },\n ],\n },\n]\n\nconst DEFAULT_USER: SidebarUserProfile = {\n name: \"John Doe\",\n email: \"jdoe@acmeco.com\",\n initials: \"JD\",\n}\n\nconst DEFAULT_USER_MENU: UserMenuItem[] = [\n { id: \"settings\", label: \"Settings\", icon: Settings },\n { id: \"dev\", label: \"Dev\", icon: Code },\n { id: \"integrations\", label: \"Integrations\", icon: LinkIcon },\n { id: \"sign-out\", label: \"Sign out\", icon: LogOut, destructive: true },\n]\n\nfunction NavItemRow({\n item,\n isActive,\n isCollapsed,\n activeVariant = \"default\",\n onClick,\n onNavigate,\n activeItemId,\n expandedItems,\n onToggleExpand,\n depth = 0,\n}: {\n item: SidebarNavItem\n isActive: boolean\n isCollapsed: boolean\n activeVariant?: ActiveVariant\n onClick?: () => void\n onNavigate?: (id: string) => void\n activeItemId?: string\n expandedItems?: Record<string, boolean>\n onToggleExpand?: (itemId: string) => void\n depth?: number\n}) {\n const activeClasses =\n activeVariant === \"gradient\"\n ? \"bg-gradient-to-r from-primary/10 to-transparent text-primary\"\n : \"bg-sidebar-accent text-sidebar-accent-foreground\"\n\n const iconActiveClasses =\n activeVariant === \"gradient\" ? \"text-primary\" : \"\"\n\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expandedItems?.[item.id] ?? false\n\n const content = (\n <div>\n <div className=\"flex items-center\">\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"flex flex-1 items-center gap-3 rounded-lg text-sm font-medium transition-colors\",\n isCollapsed ? \"justify-center p-2\" : \"px-3 py-2\",\n isActive\n ? activeClasses\n : \"text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent\",\n )}\n style={depth > 0 && !isCollapsed ? { paddingLeft: `${0.75 + depth * 1}rem` } : undefined}\n >\n <item.icon className={cn(\"shrink-0\", isCollapsed ? \"w-5 h-5\" : \"w-4 h-4\", isActive && iconActiveClasses)} />\n {!isCollapsed && <span className=\"flex-1 truncate text-left\">{item.label}</span>}\n </button>\n {hasChildren && !isCollapsed && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onToggleExpand?.(item.id)\n }}\n className=\"p-1 mr-1 rounded text-sidebar-foreground/40 hover:text-sidebar-foreground hover:bg-sidebar-accent transition-colors\"\n >\n <ChevronDown\n className={cn(\n \"w-3.5 h-3.5 transition-transform duration-200\",\n !isExpanded && \"-rotate-90\",\n )}\n />\n </button>\n )}\n </div>\n {hasChildren && !isCollapsed && isExpanded && (\n <div className=\"space-y-0.5\">\n {item.children!.map((child) => (\n <NavItemRow\n key={child.id}\n item={child}\n isActive={activeItemId === child.id}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n activeItemId={activeItemId}\n onClick={() => onNavigate?.(child.id)}\n onNavigate={onNavigate}\n expandedItems={expandedItems}\n onToggleExpand={onToggleExpand}\n depth={depth + 1}\n />\n ))}\n </div>\n )}\n </div>\n )\n\n if (isCollapsed) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg text-sm font-medium transition-colors\",\n \"justify-center p-2\",\n isActive\n ? activeClasses\n : \"text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent\",\n )}\n >\n <item.icon className={cn(\"shrink-0 w-5 h-5\", isActive && iconActiveClasses)} />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{item.label}</TooltipContent>\n </Tooltip>\n )\n }\n\n return content\n}\n\nfunction NavSection({\n section,\n activeItemId,\n isCollapsed,\n activeVariant = \"default\",\n onNavigate,\n}: {\n section: SidebarNavSection\n activeItemId?: string\n isCollapsed: boolean\n activeVariant?: ActiveVariant\n onNavigate?: (id: string) => void\n}) {\n const [isExpanded, setIsExpanded] = React.useState(true)\n const [expandedItems, setExpandedItems] = React.useState<Record<string, boolean>>({})\n const hasTitle = !isCollapsed && section.title\n\n const handleToggleExpand = React.useCallback((itemId: string) => {\n setExpandedItems((prev) => ({ ...prev, [itemId]: !prev[itemId] }))\n }, [])\n\n return (\n <div className=\"px-3 py-2\">\n {hasTitle && (\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center justify-between mb-1 px-3 group cursor-pointer\"\n >\n <span className=\"text-xs font-bold tracking-widest text-sidebar-foreground/50 uppercase\">\n {section.title}\n </span>\n <ChevronDown\n className={cn(\n \"w-3 h-3 text-sidebar-foreground/40 transition-transform duration-200\",\n !isExpanded && \"-rotate-90\",\n )}\n />\n </button>\n )}\n {(isExpanded || isCollapsed || !section.title) && (\n <div className=\"space-y-0.5\">\n {section.items.map((item) => (\n <NavItemRow\n key={item.id}\n item={item}\n isActive={activeItemId === item.id}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n activeItemId={activeItemId}\n onClick={() => onNavigate?.(item.id)}\n onNavigate={onNavigate}\n expandedItems={expandedItems}\n onToggleExpand={handleToggleExpand}\n />\n ))}\n {!isCollapsed && section.moreItems && section.moreItems.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"flex items-center gap-3 w-full px-3 py-2 rounded-lg text-sm font-medium text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent transition-colors outline-none\">\n <MoreHorizontal className=\"shrink-0 w-4 h-4\" />\n <span className=\"flex-1 text-left\">More</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"bottom\" className=\"w-48\">\n {section.moreItems.map((item) => (\n <DropdownMenuItem\n key={item.id}\n onClick={() => onNavigate?.(item.id)}\n className=\"cursor-pointer\"\n >\n <item.icon className=\"mr-2 w-4 h-4 text-muted-foreground\" />\n <span>{item.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {isCollapsed &&\n section.moreItems?.map((item) => (\n <NavItemRow\n key={item.id}\n item={item}\n isActive={activeItemId === item.id}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n onClick={() => onNavigate?.(item.id)}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport function QuickActionSidebarNav({\n className,\n brandLabel = \"ACME CO\",\n brandSubtitle = \"Placeholder\",\n brandImage,\n hideQuickAction,\n navSections = DEFAULT_NAV_SECTIONS,\n activeItemId = \"inbox\",\n activeVariant = \"default\",\n onNavigate,\n user = DEFAULT_USER,\n userMenuItems = DEFAULT_USER_MENU,\n onUserMenuAction,\n onCreateTask,\n defaultCollapsed = false,\n quickActionTemplates,\n quickActionTitle,\n quickActionDescription,\n ...props\n}: QuickActionSidebarNavProps) {\n const [isQuickActionOpen, setIsQuickActionOpen] = React.useState(false)\n const [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed)\n\n const initials =\n user.initials ??\n (user.name\n ? user.name.charAt(0).toUpperCase()\n : user.email\n ? user.email.charAt(0).toUpperCase()\n : \"U\")\n\n return (\n <TooltipProvider delayDuration={0}>\n <aside\n className={cn(\n \"flex h-full flex-col overflow-hidden bg-sidebar text-sidebar-foreground border-r border-sidebar-border transition-all duration-200\",\n isCollapsed ? \"w-16\" : \"w-64\",\n className,\n )}\n {...props}\n >\n {/* Header */}\n <div\n className={cn(\n \"relative flex shrink-0 items-center border-b border-sidebar-border\",\n isCollapsed ? \"justify-center h-16 px-2\" : \"px-6 py-4\",\n )}\n >\n {!isCollapsed && (\n <div className=\"flex items-center gap-2.5 pr-8\">\n {brandImage ? (\n <img src={brandImage} alt={brandLabel} className=\"h-10 object-contain\" />\n ) : (\n <>\n <div className=\"flex h-6 w-6 items-center justify-center rounded-full bg-sidebar-foreground text-sidebar\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-3.5 h-3.5\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-sm font-bold tracking-tight\">\n {brandLabel}\n </span>\n {brandSubtitle && (\n <span className=\"text-[10px] font-medium text-sidebar-foreground/50 uppercase tracking-wide\">\n {brandSubtitle}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={() => setIsCollapsed(!isCollapsed)}\n className={cn(\n \"p-1.5 rounded-md text-sidebar-foreground/50 hover:text-sidebar-foreground hover:bg-sidebar-accent transition-colors\",\n isCollapsed ? \"\" : \"absolute right-5 top-1/2 -translate-y-1/2\",\n )}\n title={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n >\n {isCollapsed ? (\n <PanelLeftOpen className=\"w-4 h-4\" />\n ) : (\n <PanelLeftClose className=\"w-4 h-4\" />\n )}\n </button>\n </div>\n\n {/* Navigation */}\n <div className=\"flex-1 overflow-y-auto overflow-x-hidden py-3 space-y-1\">\n {navSections.map((section, idx) => (\n <React.Fragment key={section.title ?? idx}>\n {idx > 0 && <div className=\"mx-4 my-2 border-t border-sidebar-border\" />}\n <NavSection\n section={section}\n activeItemId={activeItemId}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n onNavigate={onNavigate}\n />\n </React.Fragment>\n ))}\n </div>\n\n {!hideQuickAction && (\n <div className={cn(\"px-3 pb-3\", isCollapsed ? \"hidden\" : \"block\")}>\n <button\n type=\"button\"\n onClick={() => setIsQuickActionOpen(true)}\n className=\"w-full flex items-center justify-between px-3 py-2.5 rounded-lg border border-sidebar-border bg-sidebar-primary text-sidebar-primary-foreground hover:bg-sidebar-primary/90 transition-colors group shadow-sm\"\n >\n <div className=\"flex items-center gap-2\">\n <svg\n className=\"w-4 h-4 text-sidebar-primary-foreground/80 group-hover:text-sidebar-primary-foreground transition-colors\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n <span className=\"text-sm font-medium\">Quick Action</span>\n </div>\n <kbd className=\"hidden sm:inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[11px] font-mono rounded bg-sidebar-primary-foreground/20 text-sidebar-primary-foreground\">\n <span className=\"text-xs\">&#8984;</span>K\n </kbd>\n </button>\n </div>\n )}\n\n {isCollapsed && !hideQuickAction && (\n <div className=\"px-2 pb-3\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setIsQuickActionOpen(true)}\n className=\"flex w-full items-center justify-center rounded-lg bg-sidebar-primary p-2.5 text-sidebar-primary-foreground shadow-sm transition-colors hover:bg-sidebar-primary/90\"\n title=\"Quick Action (⌘K)\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">Quick Action (⌘K)</TooltipContent>\n </Tooltip>\n </div>\n )}\n\n {/* User Profile Footer */}\n <div className=\"p-3 border-t border-sidebar-border shrink-0\">\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(\n \"flex items-center w-full rounded-lg hover:bg-sidebar-accent transition-colors outline-none\",\n isCollapsed ? \"justify-center p-1\" : \"p-2 gap-3\",\n )}\n >\n <Avatar className=\"h-8 w-8 rounded-md\">\n <AvatarFallback className=\"rounded-md bg-primary/10 text-primary text-xs font-medium\">\n {initials}\n </AvatarFallback>\n </Avatar>\n\n {!isCollapsed && (\n <div className=\"flex flex-col items-start flex-1 truncate\">\n <span className=\"text-sm font-medium leading-none truncate\">\n {user.name}\n </span>\n <span className=\"text-xs text-sidebar-foreground/50 truncate mt-0.5\">\n {user.email}\n </span>\n </div>\n )}\n\n {!isCollapsed && (\n <MoreVertical className=\"w-4 h-4 text-sidebar-foreground/50 shrink-0\" />\n )}\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"end\" side=\"right\" sideOffset={8} className=\"w-56\">\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{user.name}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{user.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {userMenuItems.map((item, idx) => {\n const showSepBefore = item.destructive && idx > 0\n return (\n <React.Fragment key={item.id}>\n {showSepBefore && <DropdownMenuSeparator />}\n <DropdownMenuItem\n onClick={() => onUserMenuAction?.(item.id)}\n className={cn(\n \"cursor-pointer\",\n item.destructive && \"text-destructive focus:text-destructive\",\n )}\n >\n <item.icon className=\"mr-2 h-4 w-4\" />\n <span>{item.label}</span>\n </DropdownMenuItem>\n </React.Fragment>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </aside>\n\n {!hideQuickAction && (\n <QuickActionModal\n open={isQuickActionOpen}\n onOpenChange={setIsQuickActionOpen}\n onCreateTask={onCreateTask}\n templates={quickActionTemplates}\n title={quickActionTitle}\n description={quickActionDescription}\n />\n )}\n </TooltipProvider>\n )\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../src/components/quick-action-sidebar-nav.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n Activity,\n BarChart2,\n Building,\n ChevronDown,\n Code,\n Inbox,\n Link as LinkIcon,\n LogOut,\n MessageSquare,\n MoreHorizontal,\n MoreVertical,\n PanelLeftClose,\n PanelLeftOpen,\n Plus,\n Search,\n Settings,\n Users,\n} from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Avatar, AvatarFallback } from \"./avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\nimport { QuickActionModal, type QuickActionTaskDraft, type QuickActionTemplate } from \"./quick-action-modal\"\n\nexport interface SidebarNavItem {\n id: string\n label: string\n icon: React.ComponentType<{ className?: string }>\n children?: SidebarNavItem[]\n}\n\nexport interface SidebarNavSection {\n title?: string\n /** Optional icon shown to the left of the section title (expanded sidebars only). */\n titleIconUrl?: string\n items: SidebarNavItem[]\n moreItems?: SidebarNavItem[]\n}\n\nexport interface SidebarUserProfile {\n name: string\n email: string\n initials?: string\n}\n\nexport interface UserMenuItem {\n id: string\n label: string\n icon: React.ComponentType<{ className?: string }>\n destructive?: boolean\n}\n\nexport type ActiveVariant = \"default\" | \"gradient\"\n\ninterface QuickActionSidebarNavProps extends React.ComponentProps<\"aside\"> {\n brandLabel?: string\n brandSubtitle?: string\n brandImage?: string\n hideQuickAction?: boolean\n navSections?: SidebarNavSection[]\n activeItemId?: string\n activeVariant?: ActiveVariant\n onNavigate?: (itemId: string) => void\n user?: SidebarUserProfile\n userMenuItems?: UserMenuItem[]\n onUserMenuAction?: (itemId: string) => void\n onCreateTask?: (draft: QuickActionTaskDraft) => void\n defaultCollapsed?: boolean\n quickActionTemplates?: QuickActionTemplate[]\n quickActionTitle?: string\n quickActionDescription?: string\n}\n\nconst DEFAULT_NAV_SECTIONS: SidebarNavSection[] = [\n {\n items: [\n { id: \"home\", label: \"Home\", icon: Inbox },\n { id: \"inbox\", label: \"Inbox\", icon: Inbox },\n ],\n },\n {\n title: \"Focus\",\n items: [\n { id: \"inbox\", label: \"Unibox\", icon: Inbox },\n { id: \"accounts\", label: \"My Accounts\", icon: Building },\n { id: \"activity\", label: \"Activity\", icon: Activity },\n { id: \"dashboard\", label: \"Insights\", icon: BarChart2 },\n ],\n moreItems: [\n { id: \"search\", label: \"Search\", icon: Search },\n ],\n },\n {\n title: \"Assistant\",\n items: [\n { id: \"new-chat\", label: \"New chat\", icon: Plus },\n { id: \"chats\", label: \"Chats\", icon: MessageSquare },\n ],\n },\n {\n title: \"Your Teams\",\n items: [\n { id: \"team-a\", label: \"Team A\", icon: Users },\n { id: \"team-b\", label: \"Team B\", icon: Users },\n ],\n moreItems: [\n { id: \"more-teams\", label: \"More\", icon: MoreHorizontal },\n ],\n },\n]\n\nconst DEFAULT_USER: SidebarUserProfile = {\n name: \"John Doe\",\n email: \"jdoe@acmeco.com\",\n initials: \"JD\",\n}\n\nconst DEFAULT_USER_MENU: UserMenuItem[] = [\n { id: \"settings\", label: \"Settings\", icon: Settings },\n { id: \"dev\", label: \"Dev\", icon: Code },\n { id: \"integrations\", label: \"Integrations\", icon: LinkIcon },\n { id: \"sign-out\", label: \"Sign out\", icon: LogOut, destructive: true },\n]\n\nfunction NavItemRow({\n item,\n isActive,\n isCollapsed,\n activeVariant = \"default\",\n onClick,\n onNavigate,\n activeItemId,\n expandedItems,\n onToggleExpand,\n depth = 0,\n}: {\n item: SidebarNavItem\n isActive: boolean\n isCollapsed: boolean\n activeVariant?: ActiveVariant\n onClick?: () => void\n onNavigate?: (id: string) => void\n activeItemId?: string\n expandedItems?: Record<string, boolean>\n onToggleExpand?: (itemId: string) => void\n depth?: number\n}) {\n const activeClasses =\n activeVariant === \"gradient\"\n ? \"bg-gradient-to-r from-primary/10 to-transparent text-primary\"\n : \"bg-sidebar-accent text-sidebar-accent-foreground\"\n\n const iconActiveClasses =\n activeVariant === \"gradient\" ? \"text-primary\" : \"\"\n\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expandedItems?.[item.id] ?? false\n\n const content = (\n <div>\n <div className=\"flex items-center\">\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"flex flex-1 items-center gap-3 rounded-lg text-sm font-medium transition-colors\",\n isCollapsed ? \"justify-center p-2\" : \"px-3 py-2\",\n isActive\n ? activeClasses\n : \"text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent\",\n )}\n style={depth > 0 && !isCollapsed ? { paddingLeft: `${0.75 + depth * 1}rem` } : undefined}\n >\n <item.icon className={cn(\"shrink-0\", isCollapsed ? \"w-5 h-5\" : \"w-4 h-4\", isActive && iconActiveClasses)} />\n {!isCollapsed && <span className=\"flex-1 truncate text-left\">{item.label}</span>}\n </button>\n {hasChildren && !isCollapsed && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onToggleExpand?.(item.id)\n }}\n className=\"p-1 mr-1 rounded text-sidebar-foreground/40 hover:text-sidebar-foreground hover:bg-sidebar-accent transition-colors\"\n >\n <ChevronDown\n className={cn(\n \"w-3.5 h-3.5 transition-transform duration-200\",\n !isExpanded && \"-rotate-90\",\n )}\n />\n </button>\n )}\n </div>\n {hasChildren && !isCollapsed && isExpanded && (\n <div className=\"space-y-0.5\">\n {item.children!.map((child) => (\n <NavItemRow\n key={child.id}\n item={child}\n isActive={activeItemId === child.id}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n activeItemId={activeItemId}\n onClick={() => onNavigate?.(child.id)}\n onNavigate={onNavigate}\n expandedItems={expandedItems}\n onToggleExpand={onToggleExpand}\n depth={depth + 1}\n />\n ))}\n </div>\n )}\n </div>\n )\n\n if (isCollapsed) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg text-sm font-medium transition-colors\",\n \"justify-center p-2\",\n isActive\n ? activeClasses\n : \"text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent\",\n )}\n >\n <item.icon className={cn(\"shrink-0 w-5 h-5\", isActive && iconActiveClasses)} />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{item.label}</TooltipContent>\n </Tooltip>\n )\n }\n\n return content\n}\n\nfunction NavSection({\n section,\n activeItemId,\n isCollapsed,\n activeVariant = \"default\",\n onNavigate,\n}: {\n section: SidebarNavSection\n activeItemId?: string\n isCollapsed: boolean\n activeVariant?: ActiveVariant\n onNavigate?: (id: string) => void\n}) {\n const [isExpanded, setIsExpanded] = React.useState(true)\n const [expandedItems, setExpandedItems] = React.useState<Record<string, boolean>>({})\n const hasTitle = !isCollapsed && section.title\n\n const handleToggleExpand = React.useCallback((itemId: string) => {\n setExpandedItems((prev) => ({ ...prev, [itemId]: !prev[itemId] }))\n }, [])\n\n return (\n <div className=\"px-3 py-2\">\n {hasTitle && (\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center justify-between mb-1 px-3 group cursor-pointer\"\n >\n <span className=\"flex items-center gap-1.5 min-w-0\">\n {section.titleIconUrl && (\n <img\n src={section.titleIconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 shrink-0 object-contain opacity-70\"\n />\n )}\n <span className=\"text-xs font-bold tracking-widest text-sidebar-foreground/50 uppercase truncate\">\n {section.title}\n </span>\n </span>\n <ChevronDown\n className={cn(\n \"w-3 h-3 text-sidebar-foreground/40 transition-transform duration-200\",\n !isExpanded && \"-rotate-90\",\n )}\n />\n </button>\n )}\n {(isExpanded || isCollapsed || !section.title) && (\n <div className=\"space-y-0.5\">\n {section.items.map((item) => (\n <NavItemRow\n key={item.id}\n item={item}\n isActive={activeItemId === item.id}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n activeItemId={activeItemId}\n onClick={() => onNavigate?.(item.id)}\n onNavigate={onNavigate}\n expandedItems={expandedItems}\n onToggleExpand={handleToggleExpand}\n />\n ))}\n {!isCollapsed && section.moreItems && section.moreItems.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"flex items-center gap-3 w-full px-3 py-2 rounded-lg text-sm font-medium text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent transition-colors outline-none\">\n <MoreHorizontal className=\"shrink-0 w-4 h-4\" />\n <span className=\"flex-1 text-left\">More</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"bottom\" className=\"w-48\">\n {section.moreItems.map((item) => (\n <DropdownMenuItem\n key={item.id}\n onClick={() => onNavigate?.(item.id)}\n className=\"cursor-pointer\"\n >\n <item.icon className=\"mr-2 w-4 h-4 text-muted-foreground\" />\n <span>{item.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {isCollapsed &&\n section.moreItems?.map((item) => (\n <NavItemRow\n key={item.id}\n item={item}\n isActive={activeItemId === item.id}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n onClick={() => onNavigate?.(item.id)}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport function QuickActionSidebarNav({\n className,\n brandLabel = \"ACME CO\",\n brandSubtitle = \"Placeholder\",\n brandImage,\n hideQuickAction,\n navSections = DEFAULT_NAV_SECTIONS,\n activeItemId = \"inbox\",\n activeVariant = \"default\",\n onNavigate,\n user = DEFAULT_USER,\n userMenuItems = DEFAULT_USER_MENU,\n onUserMenuAction,\n onCreateTask,\n defaultCollapsed = false,\n quickActionTemplates,\n quickActionTitle,\n quickActionDescription,\n ...props\n}: QuickActionSidebarNavProps) {\n const [isQuickActionOpen, setIsQuickActionOpen] = React.useState(false)\n const [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed)\n\n const initials =\n user.initials ??\n (user.name\n ? user.name.charAt(0).toUpperCase()\n : user.email\n ? user.email.charAt(0).toUpperCase()\n : \"U\")\n\n return (\n <TooltipProvider delayDuration={0}>\n <aside\n className={cn(\n \"flex h-full flex-col overflow-hidden bg-sidebar text-sidebar-foreground border-r border-sidebar-border transition-all duration-200\",\n isCollapsed ? \"w-16\" : \"w-64\",\n className,\n )}\n {...props}\n >\n {/* Header */}\n <div\n className={cn(\n \"relative flex shrink-0 items-center border-b border-sidebar-border\",\n isCollapsed ? \"justify-center h-16 px-2\" : \"px-6 py-4\",\n )}\n >\n {!isCollapsed && (\n <div className=\"flex items-center gap-2.5 pr-8\">\n {brandImage ? (\n <img src={brandImage} alt={brandLabel} className=\"h-10 object-contain\" />\n ) : (\n <>\n <div className=\"flex h-6 w-6 items-center justify-center rounded-full bg-sidebar-foreground text-sidebar\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-3.5 h-3.5\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-sm font-bold tracking-tight\">\n {brandLabel}\n </span>\n {brandSubtitle && (\n <span className=\"text-[10px] font-medium text-sidebar-foreground/50 uppercase tracking-wide\">\n {brandSubtitle}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={() => setIsCollapsed(!isCollapsed)}\n className={cn(\n \"p-1.5 rounded-md text-sidebar-foreground/50 hover:text-sidebar-foreground hover:bg-sidebar-accent transition-colors\",\n isCollapsed ? \"\" : \"absolute right-5 top-1/2 -translate-y-1/2\",\n )}\n title={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n >\n {isCollapsed ? (\n <PanelLeftOpen className=\"w-4 h-4\" />\n ) : (\n <PanelLeftClose className=\"w-4 h-4\" />\n )}\n </button>\n </div>\n\n {/* Navigation */}\n <div className=\"flex-1 overflow-y-auto overflow-x-hidden py-3 space-y-1\">\n {navSections.map((section, idx) => (\n <React.Fragment key={section.title ?? idx}>\n {idx > 0 && <div className=\"mx-4 my-2 border-t border-sidebar-border\" />}\n <NavSection\n section={section}\n activeItemId={activeItemId}\n isCollapsed={isCollapsed}\n activeVariant={activeVariant}\n onNavigate={onNavigate}\n />\n </React.Fragment>\n ))}\n </div>\n\n {!hideQuickAction && (\n <div className={cn(\"px-3 pb-3\", isCollapsed ? \"hidden\" : \"block\")}>\n <button\n type=\"button\"\n onClick={() => setIsQuickActionOpen(true)}\n className=\"w-full flex items-center justify-between px-3 py-2.5 rounded-lg border border-sidebar-border bg-sidebar-primary text-sidebar-primary-foreground hover:bg-sidebar-primary/90 transition-colors group shadow-sm\"\n >\n <div className=\"flex items-center gap-2\">\n <svg\n className=\"w-4 h-4 text-sidebar-primary-foreground/80 group-hover:text-sidebar-primary-foreground transition-colors\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n <span className=\"text-sm font-medium\">Quick Action</span>\n </div>\n <kbd className=\"hidden sm:inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[11px] font-mono rounded bg-sidebar-primary-foreground/20 text-sidebar-primary-foreground\">\n <span className=\"text-xs\">&#8984;</span>K\n </kbd>\n </button>\n </div>\n )}\n\n {isCollapsed && !hideQuickAction && (\n <div className=\"px-2 pb-3\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setIsQuickActionOpen(true)}\n className=\"flex w-full items-center justify-center rounded-lg bg-sidebar-primary p-2.5 text-sidebar-primary-foreground shadow-sm transition-colors hover:bg-sidebar-primary/90\"\n title=\"Quick Action (⌘K)\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">Quick Action (⌘K)</TooltipContent>\n </Tooltip>\n </div>\n )}\n\n {/* User Profile Footer */}\n <div className=\"p-3 border-t border-sidebar-border shrink-0\">\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(\n \"flex items-center w-full rounded-lg hover:bg-sidebar-accent transition-colors outline-none\",\n isCollapsed ? \"justify-center p-1\" : \"p-2 gap-3\",\n )}\n >\n <Avatar className=\"h-8 w-8 rounded-md\">\n <AvatarFallback className=\"rounded-md bg-primary/10 text-primary text-xs font-medium\">\n {initials}\n </AvatarFallback>\n </Avatar>\n\n {!isCollapsed && (\n <div className=\"flex flex-col items-start flex-1 truncate\">\n <span className=\"text-sm font-medium leading-none truncate\">\n {user.name}\n </span>\n <span className=\"text-xs text-sidebar-foreground/50 truncate mt-0.5\">\n {user.email}\n </span>\n </div>\n )}\n\n {!isCollapsed && (\n <MoreVertical className=\"w-4 h-4 text-sidebar-foreground/50 shrink-0\" />\n )}\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"end\" side=\"right\" sideOffset={8} className=\"w-56\">\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{user.name}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{user.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {userMenuItems.map((item, idx) => {\n const showSepBefore = item.destructive && idx > 0\n return (\n <React.Fragment key={item.id}>\n {showSepBefore && <DropdownMenuSeparator />}\n <DropdownMenuItem\n onClick={() => onUserMenuAction?.(item.id)}\n className={cn(\n \"cursor-pointer\",\n item.destructive && \"text-destructive focus:text-destructive\",\n )}\n >\n <item.icon className=\"mr-2 h-4 w-4\" />\n <span>{item.label}</span>\n </DropdownMenuItem>\n </React.Fragment>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </aside>\n\n {!hideQuickAction && (\n <QuickActionModal\n open={isQuickActionOpen}\n onOpenChange={setIsQuickActionOpen}\n onCreateTask={onCreateTask}\n templates={quickActionTemplates}\n title={quickActionTitle}\n description={quickActionDescription}\n />\n )}\n </TooltipProvider>\n )\n}\n"],"mappings":"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","names":["_a"]}
@@ -5,7 +5,7 @@ import { Tabs as Tabs$1 } from 'radix-ui';
5
5
 
6
6
  declare function Tabs({ className, orientation, ...props }: React.ComponentProps<typeof Tabs$1.Root>): React.JSX.Element;
7
7
  declare const tabsListVariants: (props?: ({
8
- variant?: "line" | "default" | null | undefined;
8
+ variant?: "default" | "line" | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
10
  declare function TabsList({ className, variant, ...props }: React.ComponentProps<typeof Tabs$1.List> & VariantProps<typeof tabsListVariants>): React.JSX.Element;
11
11
  declare function TabsTrigger({ className, ...props }: React.ComponentProps<typeof Tabs$1.Trigger>): React.JSX.Element;
@@ -76,6 +76,23 @@ interface InboxViewConfig {
76
76
  approvedStatus?: string;
77
77
  dismissedStatus?: string;
78
78
  };
79
+ /**
80
+ * Override the copy used in the detail panel "Signal brief" section.
81
+ * Useful when the prototype represents an internal ops inbox rather than
82
+ * an outbound sales signal — the default heading and intro line are
83
+ * written for the latter.
84
+ */
85
+ signalBriefCopy?: {
86
+ /** Section heading (default: "Signal brief"). Pass an empty string to hide. */
87
+ heading?: string;
88
+ /**
89
+ * Introductory line rendered above the per-item `whyNow` text.
90
+ * Receives the `QueueItem` so the caller can interpolate the company
91
+ * name or other fields. Pass `null` (or a function returning `null`)
92
+ * to suppress the intro line entirely.
93
+ */
94
+ intro?: string | ((item: QueueItem) => string | null) | null;
95
+ };
79
96
  }
80
97
  interface InsightsCustomTab {
81
98
  id: string;
@@ -41,8 +41,9 @@ interface DetailViewProps {
41
41
  approvedStatus?: string;
42
42
  dismissedStatus?: string;
43
43
  };
44
+ signalBriefCopy?: InboxViewConfig["signalBriefCopy"];
44
45
  }
45
- declare function DetailView({ item, sections, getSignalScore, buildSuggestedActions, buildSourceItems, getTimelineEvents, accountContacts, emailSignature, iconMap, onOpenEntityPanel, onOpenRecentActivity, onSuggestedActionFeedback: _onSuggestedActionFeedback, signalLabels, }: DetailViewProps): React.JSX.Element;
46
- declare function PrototypeInboxView({ items, filterCategories, detailSections, accountContacts, buildAccountContacts, emailSignature, buildSuggestedActions: buildSuggestedActionsProp, buildSourceItems: buildSourceItemsProp, getSignalScore: getSignalScoreProp, getTimelineEvents, iconMap, hideToolbarActions, hideHoverActions, onSuggestedActionFeedback, headerActions, onOpenEntityPanel, onOpenRecentActivity, onItemSelect, defaultViewMode, buildEntityChips, quickFilterTabs, hideAccountsButton, accountDetailsLabel, signalLabels, }: PrototypeInboxViewProps): React.JSX.Element;
46
+ declare function DetailView({ item, sections, getSignalScore, buildSuggestedActions, buildSourceItems, getTimelineEvents, accountContacts, emailSignature, iconMap, onOpenEntityPanel, onOpenRecentActivity, onSuggestedActionFeedback: _onSuggestedActionFeedback, signalLabels, signalBriefCopy, }: DetailViewProps): React.JSX.Element;
47
+ declare function PrototypeInboxView({ items, filterCategories, detailSections, accountContacts, buildAccountContacts, emailSignature, buildSuggestedActions: buildSuggestedActionsProp, buildSourceItems: buildSourceItemsProp, getSignalScore: getSignalScoreProp, getTimelineEvents, iconMap, hideToolbarActions, hideHoverActions, onSuggestedActionFeedback, headerActions, onOpenEntityPanel, onOpenRecentActivity, onItemSelect, defaultViewMode, buildEntityChips, quickFilterTabs, hideAccountsButton, accountDetailsLabel, signalLabels, signalBriefCopy, }: PrototypeInboxViewProps): React.JSX.Element;
47
48
 
48
49
  export { DetailView, type DetailViewProps, PrototypeInboxView, type PrototypeInboxViewProps };
@@ -85,7 +85,8 @@ function DetailView({
85
85
  onOpenEntityPanel,
86
86
  onOpenRecentActivity,
87
87
  onSuggestedActionFeedback: _onSuggestedActionFeedback,
88
- signalLabels
88
+ signalLabels,
89
+ signalBriefCopy
89
90
  }) {
90
91
  const [evidenceExpanded, setEvidenceExpanded] = React.useState(false);
91
92
  const [showTimeline, setShowTimeline] = React.useState(false);
@@ -181,7 +182,7 @@ function DetailView({
181
182
  )
182
183
  ] }),
183
184
  sections.signalBrief && (() => {
184
- var _a;
185
+ var _a, _b;
185
186
  const pct = signalData.score;
186
187
  const scoreColor = pct >= 70 ? "text-emerald-600" : pct >= 40 ? "text-amber-600" : "text-red-600";
187
188
  const barColor = pct >= 70 ? "bg-emerald-500" : pct >= 40 ? "bg-amber-500" : "bg-red-500";
@@ -206,13 +207,12 @@ function DetailView({
206
207
  /* @__PURE__ */ jsx(Citation, { number: 5, source: sourceItems[3] })
207
208
  ] })
208
209
  ] : signalData.evidence.map((ev, i) => /* @__PURE__ */ jsx("span", { children: ev }, i));
210
+ const briefHeading = (_a = signalBriefCopy == null ? void 0 : signalBriefCopy.heading) != null ? _a : "Signal brief";
211
+ const introOpt = signalBriefCopy == null ? void 0 : signalBriefCopy.intro;
212
+ const briefIntro = introOpt === null ? null : typeof introOpt === "function" ? introOpt(item) : introOpt != null ? introOpt : `We detected signals that suggest a potential opportunity with ${item.company}.`;
209
213
  return /* @__PURE__ */ jsxs("div", { className: "mb-8", children: [
210
- /* @__PURE__ */ jsx("h3", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wider mb-3", children: "Signal brief" }),
211
- /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground leading-relaxed mb-2", children: [
212
- "We detected signals that suggest a potential opportunity with ",
213
- item.company,
214
- "."
215
- ] }),
214
+ briefHeading ? /* @__PURE__ */ jsx("h3", { className: "text-xs font-bold text-muted-foreground uppercase tracking-wider mb-3", children: briefHeading }) : null,
215
+ briefIntro ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed mb-2", children: briefIntro }) : null,
216
216
  /* @__PURE__ */ jsx("p", { className: "text-sm text-foreground/90 leading-relaxed mb-4", children: signalData.whyNow }),
217
217
  /* @__PURE__ */ jsxs("div", { className: "mb-5 rounded-md border border-border bg-muted/20 p-3", children: [
218
218
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-1.5", children: [
@@ -253,7 +253,7 @@ function DetailView({
253
253
  ScoreBreakdown,
254
254
  {
255
255
  factors: signalData.factors,
256
- onFactorFeedback: (_a = signalData.onFactorFeedback) != null ? _a : ((key, type, detail) => console.log("Signal factor feedback:", { company: item.company, factor: key, type, detail }))
256
+ onFactorFeedback: (_b = signalData.onFactorFeedback) != null ? _b : ((key, type, detail) => console.log("Signal factor feedback:", { company: item.company, factor: key, type, detail }))
257
257
  }
258
258
  ),
259
259
  /* @__PURE__ */ jsx(SignalApproval.Actions, {})
@@ -332,7 +332,8 @@ function PrototypeInboxView({
332
332
  quickFilterTabs,
333
333
  hideAccountsButton,
334
334
  accountDetailsLabel,
335
- signalLabels
335
+ signalLabels,
336
+ signalBriefCopy
336
337
  }) {
337
338
  var _a;
338
339
  const [inboxViewMode, setInboxViewMode] = React.useState(
@@ -512,7 +513,8 @@ function PrototypeInboxView({
512
513
  onOpenEntityPanel,
513
514
  onOpenRecentActivity,
514
515
  onSuggestedActionFeedback,
515
- signalLabels
516
+ signalLabels,
517
+ signalBriefCopy
516
518
  };
517
519
  return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col", children: [
518
520
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border bg-background px-4 py-3 shrink-0", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/prototype/prototype-inbox-view.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ArrowLeft,\n ChevronDown,\n ChevronRight,\n Filter,\n FileText,\n Clock,\n CheckSquare,\n Eye,\n Plus,\n\n Building,\n LayoutList,\n Columns2,\n Square,\n Tag,\n} from \"lucide-react\"\n\nimport { Button } from \"../components/button\"\nimport { Badge } from \"../components/badge\"\nimport { Input } from \"../components/input\"\nimport { ViewModeToggle } from \"../components/view-mode-toggle\"\nimport {\n InboxToolbar,\n type AssigneeFilter,\n type InboxFilterCategory,\n} from \"../components/inbox-toolbar\"\nimport { GroupedListView, type GroupedListGroup } from \"../components/item-list\"\nimport { SignalApproval } from \"../components/signal-feedback-inline\"\nimport { ScoreBreakdown } from \"../components/score-breakdown\"\nimport { Citation, type SourceDef } from \"../components/detail-view\"\nimport {\n SuggestedActions,\n type SuggestedAction,\n type SuggestedContact,\n} from \"../components/suggested-actions\"\nimport { TimelineActivity, type TimelineEvent } from \"../components/timeline-activity\"\nimport type {\n QueueItem,\n InboxViewConfig,\n InboxDetailSections,\n SignalScoreData,\n} from \"./prototype-config\"\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface PrototypeInboxViewProps extends InboxViewConfig {\n /** Extra ReactNode rendered at the end of the header bar (e.g. exit button). */\n headerActions?: React.ReactNode\n onOpenEntityPanel?: () => void\n onOpenRecentActivity?: () => void\n onNavigateToInbox?: () => void\n onItemSelect?: (item: QueueItem) => void\n defaultViewMode?: \"list\" | \"split\"\n}\n\n// ---------------------------------------------------------------------------\n// Default detail sections\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_DETAIL_SECTIONS: InboxDetailSections = {\n signalBrief: true,\n suggestedActions: true,\n timeline: true,\n}\n\nconst DEFAULT_SIGNAL_SCORE: SignalScoreData = {\n score: 65,\n factors: [\n { key: \"trigger\", label: \"Trigger strength\", score: 70, why: \"Moderate signal detected based on account activity\" },\n { key: \"fit\", label: \"Company fit\", score: 65, why: \"Reasonable fit based on company profile\" },\n { key: \"timing\", label: \"Timing\", score: 58, why: \"Within general evaluation window\" },\n ],\n whyNow: \"Moderate signals detected that warrant review and potential outreach.\",\n evidence: [\n \"Activity patterns suggest potential opportunity\",\n \"Company profile aligns with target segment\",\n ],\n confidence: 72,\n}\n\n// ---------------------------------------------------------------------------\n// Detail View\n// ---------------------------------------------------------------------------\n\nexport interface DetailViewProps {\n item: QueueItem\n sections: InboxDetailSections\n getSignalScore: (company: string) => SignalScoreData\n buildSuggestedActions: (item: QueueItem) => SuggestedAction[]\n buildSourceItems: (item: QueueItem) => SourceDef[]\n getTimelineEvents?: (item: QueueItem) => TimelineEvent[]\n accountContacts: SuggestedContact[]\n emailSignature: string | React.ReactNode\n iconMap: Record<string, string>\n onOpenEntityPanel?: () => void\n onOpenRecentActivity?: () => void\n onSuggestedActionFeedback?: (actionId: number | string, feedback: string, actionTitle?: string) => void\n signalLabels?: { approveButton?: string; dismissButton?: string; approvedStatus?: string; dismissedStatus?: string }\n}\n\nexport function DetailView({\n item,\n sections,\n getSignalScore,\n buildSuggestedActions,\n buildSourceItems,\n getTimelineEvents,\n accountContacts,\n emailSignature,\n iconMap,\n onOpenEntityPanel,\n onOpenRecentActivity,\n onSuggestedActionFeedback: _onSuggestedActionFeedback,\n signalLabels,\n}: DetailViewProps) {\n const [evidenceExpanded, setEvidenceExpanded] = React.useState(false)\n const [showTimeline, setShowTimeline] = React.useState(false)\n const [extraActions, setExtraActions] = React.useState<SuggestedAction[]>([])\n\n React.useEffect(() => {\n setShowTimeline(false)\n setEvidenceExpanded(false)\n setExtraActions([])\n }, [item.id])\n\n const signalData = React.useMemo(\n () => getSignalScore(item.company),\n [getSignalScore, item.company],\n )\n\n const suggestedActions = React.useMemo(\n () => [...buildSuggestedActions(item), ...extraActions],\n [buildSuggestedActions, item, extraActions],\n )\n const sourceItems = React.useMemo(() => buildSourceItems(item), [buildSourceItems, item])\n const timelineEvents = React.useMemo(\n () => getTimelineEvents?.(item) ?? [],\n [getTimelineEvents, item],\n )\n\n const handleDuplicate = React.useCallback(\n (id: number | string) => {\n const base = suggestedActions.find((a) => a.id === id)\n if (!base || base.type !== \"email\") return\n const clone: SuggestedAction = {\n ...base,\n id: `${base.id}-dup-${Date.now()}`,\n emailMeta: base.emailMeta ? { ...base.emailMeta, to: undefined } : undefined,\n }\n setExtraActions((prev) => [...prev, clone])\n },\n [suggestedActions],\n )\n\n return (\n <SignalApproval.Root\n companyName={item.company}\n opportunityUrl={`https://acme.lightning.force.com/lightning/r/Opportunity/006${item.id}/view`}\n labels={signalLabels}\n onApprove={() => {\n console.log(\"Approved signal:\", { taskId: item.id, company: item.company })\n }}\n onApproveFeedback={(reasons, detail) => {\n signalData.onApproveFeedback?.(reasons, detail)\n console.log(\"Approval feedback:\", { taskId: item.id, company: item.company, reasons, detail })\n }}\n onDismiss={(reasons, detail) => {\n signalData.onDismissFeedback?.(reasons, detail)\n console.log(\"Dismissed signal:\", { taskId: item.id, reasons, detail })\n }}\n >\n <div className=\"mx-auto w-full max-w-3xl p-6 pb-12 md:p-8\">\n <div className=\"pb-8\">\n {/* Header */}\n <div className=\"mb-4 flex items-center gap-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n Back\n </button>\n <span className=\"text-muted-foreground/40\">&middot;</span>\n <span className=\"text-xs text-muted-foreground\">{item.company}</span>\n </div>\n\n <h1 className=\"mb-3 text-2xl font-bold tracking-tight text-foreground\">{item.title}</h1>\n\n <div className=\"mb-6 flex flex-wrap items-center gap-2\">\n {item.statusColor === \"red\" && (\n <div className=\"inline-flex items-center gap-1 rounded-md bg-red-50 px-2.5 py-1 text-xs font-semibold text-red-700\">\n <span className=\"text-[10px] font-bold\">!</span> Urgent\n </div>\n )}\n <div className=\"inline-flex items-center gap-1 rounded-md bg-muted px-2.5 py-1 text-xs font-medium text-muted-foreground\">\n {item.tag1}\n </div>\n <button\n type=\"button\"\n onClick={onOpenEntityPanel}\n className=\"ml-1 inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-muted/30 px-2 py-1 transition-colors hover:bg-muted/50\"\n >\n <div className=\"flex h-4 w-4 items-center justify-center rounded bg-muted-foreground/10 text-[9px] font-semibold text-muted-foreground\">\n {item.company.substring(0, 1)}\n </div>\n <span className=\"text-xs font-medium text-foreground\">{item.company}</span>\n <ChevronRight className=\"h-3 w-3 text-muted-foreground/50\" />\n </button>\n </div>\n\n {/* Signal Brief */}\n {sections.signalBrief && (() => {\n const pct = signalData.score\n const scoreColor = pct >= 70 ? \"text-emerald-600\" : pct >= 40 ? \"text-amber-600\" : \"text-red-600\"\n const barColor = pct >= 70 ? \"bg-emerald-500\" : pct >= 40 ? \"bg-amber-500\" : \"bg-red-500\"\n const scoreLabel = pct >= 70 ? \"HIGH\" : pct >= 40 ? \"MEDIUM\" : \"LOW\"\n\n const evidenceWithCitations: React.ReactNode[] =\n sourceItems.length >= 4\n ? [\n <>\n There are <span className=\"font-medium text-foreground\">3 unusual signals</span> including a large balance\n outflow and reduced login frequency\n <Citation number={1} source={sourceItems[0]} />\n <Citation number={2} source={sourceItems[1]} />\n <Citation number={3} source={sourceItems[2]} />\n </>,\n <>\n Scott mentioned in <span className=\"font-medium text-foreground\">#treasury-questions</span> that they are actively\n looking for treasury management options\n <Citation number={4} source={sourceItems[2]} />\n </>,\n <>\n You have a recent email thread regarding optimization options that hasn&apos;t been replied to\n <Citation number={5} source={sourceItems[3]} />\n </>,\n ]\n : signalData.evidence.map((ev, i) => (\n <span key={i}>{ev}</span>\n ))\n\n return (\n <div className=\"mb-8\">\n <h3 className=\"text-xs font-bold text-muted-foreground uppercase tracking-wider mb-3\">Signal brief</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mb-2\">\n We detected signals that suggest a potential opportunity with {item.company}.\n </p>\n <p className=\"text-sm text-foreground/90 leading-relaxed mb-4\">\n {signalData.whyNow}\n </p>\n\n <div className=\"mb-5 rounded-md border border-border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[10px] font-bold text-muted-foreground uppercase tracking-wider\">Signal Score</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold text-foreground\">{signalData.score}/100</span>\n <span className={`text-[10px] font-bold uppercase ${scoreColor}`}>{scoreLabel}</span>\n </div>\n </div>\n <div className=\"h-1.5 bg-muted rounded-full overflow-hidden mb-2\">\n <div\n className={`h-full rounded-full transition-all duration-500 ${barColor}`}\n style={{ width: `${signalData.score}%` }}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => setEvidenceExpanded((prev) => !prev)}\n className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronDown className={`h-3 w-3 transition-transform duration-200 ${evidenceExpanded ? \"rotate-180\" : \"\"}`} />\n View more\n </button>\n\n {evidenceExpanded && (\n <div className=\"mt-3 space-y-3\">\n <ul className=\"space-y-2\">\n {evidenceWithCitations.map((ev, index) => (\n <li key={index} className=\"flex items-start gap-2 text-sm\">\n <div className=\"w-1.5 h-1.5 bg-primary rounded-full mt-2 flex-shrink-0\" />\n <span className=\"text-muted-foreground leading-relaxed\">{ev}</span>\n </li>\n ))}\n </ul>\n <ScoreBreakdown\n factors={signalData.factors}\n onFactorFeedback={signalData.onFactorFeedback ?? ((key, type, detail) =>\n console.log(\"Signal factor feedback:\", { company: item.company, factor: key, type, detail })\n )}\n />\n <SignalApproval.Actions />\n </div>\n )}\n </div>\n\n {!evidenceExpanded && <SignalApproval.Actions />}\n </div>\n )\n })()}\n\n {/* Activity Timeline */}\n {sections.timeline && timelineEvents.length > 0 && (\n <div className=\"mb-8\">\n <button\n type=\"button\"\n onClick={() => setShowTimeline((prev) => !prev)}\n className=\"group/timeline flex w-full items-center justify-between gap-2 py-2 rounded-md transition-colors hover:bg-muted/40 -mx-2 px-2 cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-xs font-bold text-muted-foreground uppercase tracking-wider group-hover/timeline:text-foreground transition-colors\">Activity timeline</h3>\n {!showTimeline && (\n <span className=\"text-[11px] text-muted-foreground/60\">&middot; Last activity 1d ago</span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[11px] font-medium text-muted-foreground\">{timelineEvents.length} events</span>\n <ChevronDown className={`h-3.5 w-3.5 text-muted-foreground transition-transform duration-200 ${showTimeline ? \"rotate-180\" : \"\"}`} />\n </div>\n </button>\n {showTimeline && (\n <div className=\"mt-3\">\n <TimelineActivity events={timelineEvents} />\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Suggested Actions */}\n {sections.suggestedActions && (\n <SignalApproval.Gate>\n <SuggestedActions\n actions={suggestedActions}\n accountContacts={accountContacts}\n signature={emailSignature}\n iconMap={iconMap}\n onDismiss={(id) => console.log(\"Dismiss action:\", id)}\n onSend={(id) => console.log(\"Send action:\", id)}\n onSaveDraft={(id) => console.log(\"Save draft:\", id)}\n onDuplicate={handleDuplicate}\n onOpenAccountDetails={onOpenEntityPanel}\n onOpenRecentActivity={onOpenRecentActivity}\n onMarkComplete={(id) => console.log(\"Mark complete:\", id)}\n onDispatchAgent={(id) => console.log(\"Dispatch agent:\", id)}\n />\n </SignalApproval.Gate>\n )}\n </div>\n </SignalApproval.Root>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\nexport function PrototypeInboxView({\n items,\n filterCategories,\n detailSections,\n accountContacts = [],\n buildAccountContacts,\n emailSignature = \"\",\n buildSuggestedActions: buildSuggestedActionsProp,\n buildSourceItems: buildSourceItemsProp,\n getSignalScore: getSignalScoreProp,\n getTimelineEvents,\n iconMap = {},\n hideToolbarActions,\n hideHoverActions,\n onSuggestedActionFeedback,\n headerActions,\n onOpenEntityPanel,\n onOpenRecentActivity,\n onItemSelect,\n defaultViewMode,\n buildEntityChips,\n quickFilterTabs,\n hideAccountsButton,\n accountDetailsLabel,\n signalLabels,\n}: PrototypeInboxViewProps) {\n const [inboxViewMode, setInboxViewMode] = React.useState<\"inbox\" | \"list\" | \"detail\">(\n defaultViewMode === \"list\" ? \"list\" : defaultViewMode === \"split\" ? \"inbox\" : \"inbox\"\n )\n const [previousViewMode, setPreviousViewMode] = React.useState<\"inbox\" | \"list\">(\"inbox\")\n const [selectedTask, setSelectedTask] = React.useState(items[0])\n const [inboxAssignee, setInboxAssignee] = React.useState<AssigneeFilter>(\"me\")\n const [inboxFilters, setInboxFilters] = React.useState<Record<string, string>>({})\n const [activeQuickFilter, setActiveQuickFilter] = React.useState<string>(\"all\")\n const [splitViewSearch, setSplitViewSearch] = React.useState(\"\")\n\n const sections = React.useMemo(\n () => ({ ...DEFAULT_DETAIL_SECTIONS, ...detailSections }),\n [detailSections],\n )\n\n const resolvedFilterCategories: InboxFilterCategory[] = React.useMemo(\n () =>\n filterCategories ?? [\n {\n id: \"category\",\n label: \"Category\",\n icon: <Tag className=\"h-3.5 w-3.5 text-muted-foreground\" />,\n options: [...new Set(items.map((i) => i.tag1))],\n },\n {\n id: \"account\",\n label: \"Account\",\n icon: <Building className=\"h-3.5 w-3.5 text-muted-foreground\" />,\n options: [...new Set(items.map((i) => i.company))],\n },\n ],\n [filterCategories, items],\n )\n\n const buildSuggestedActions = React.useMemo(\n () => buildSuggestedActionsProp ?? (() => []),\n [buildSuggestedActionsProp],\n )\n\n const buildSourceItems = React.useMemo(\n () => buildSourceItemsProp ?? (() => []),\n [buildSourceItemsProp],\n )\n\n const getSignalScore = React.useMemo(\n () => getSignalScoreProp ?? (() => DEFAULT_SIGNAL_SCORE),\n [getSignalScoreProp],\n )\n\n // Build a map from filter category id → QueueItem field for targeted filtering.\n // Known category ids are mapped explicitly; unknown categories fall back to a\n // broad search across display fields so consumer-defined filters still work.\n const filterFieldMap = React.useMemo<\n Record<string, (item: QueueItem, value: string) => boolean>\n >(() => {\n const map: Record<string, (item: QueueItem, value: string) => boolean> = {}\n for (const cat of resolvedFilterCategories) {\n switch (cat.id) {\n case \"category\":\n case \"signalType\":\n map[cat.id] = (item, v) => item.tag1.toLowerCase() === v.toLowerCase()\n break\n case \"account\":\n map[cat.id] = (item, v) => item.company.toLowerCase() === v.toLowerCase()\n break\n default:\n // Fallback: check all display fields\n map[cat.id] = (item, v) => {\n const lv = v.toLowerCase()\n return (\n item.tag1.toLowerCase() === lv ||\n item.company.toLowerCase() === lv ||\n item.title.toLowerCase().includes(lv) ||\n item.details.toLowerCase().includes(lv)\n )\n }\n }\n }\n return map\n }, [resolvedFilterCategories])\n\n // Filter items for list view based on toolbar filters\n const filteredItems = React.useMemo(() => {\n const activeFilters = Object.entries(inboxFilters).filter(\n ([, value]) => value && value !== \"all\"\n )\n if (activeFilters.length === 0) return items\n return items.filter((item) =>\n activeFilters.every(([key, value]) => {\n const matcher = filterFieldMap[key]\n return matcher ? matcher(item, value) : true\n })\n )\n }, [items, inboxFilters, filterFieldMap])\n\n // Resolve quick filter tabs once — used by both the split view filter and\n // the tab bar render. Each tab's `matchValue` (falling back to `label`) is\n // compared against `item.tag1` so consumer labels can differ from data values.\n type QuickFilterTab = { id: string; label: string; matchValue?: string; count?: number }\n const resolvedQuickFilterTabs = React.useMemo<QuickFilterTab[]>(() => {\n if (quickFilterTabs) return quickFilterTabs\n // Derive default tabs from the actual item tag1 values\n const uniqueTags = [...new Set(items.map((i) => i.tag1))]\n return uniqueTags.map((tag) => ({\n id: tag.toLowerCase().replace(/\\s+/g, \"-\"),\n label: tag,\n }))\n }, [quickFilterTabs, items])\n\n // Compute per-tab counts once so they can be displayed in the tab bar\n const quickFilterTabCounts = React.useMemo(() => {\n const counts: Record<string, number> = {}\n for (const tab of resolvedQuickFilterTabs) {\n const match = (tab.matchValue ?? tab.label).toLowerCase()\n counts[tab.id] = items.filter((i) => i.tag1.toLowerCase() === match).length\n }\n return counts\n }, [resolvedQuickFilterTabs, items])\n\n // Filter items for split view based on quick filter tabs and search\n const splitViewItems = React.useMemo(() => {\n let filtered = items\n // Apply quick filter tab\n if (activeQuickFilter !== \"all\") {\n const activeTab = resolvedQuickFilterTabs.find((t) => t.id === activeQuickFilter)\n if (activeTab) {\n const match = (activeTab.matchValue ?? activeTab.label).toLowerCase()\n filtered = filtered.filter(\n (item) => item.tag1.toLowerCase() === match\n )\n }\n }\n // Apply search input\n if (splitViewSearch.trim()) {\n const q = splitViewSearch.trim().toLowerCase()\n filtered = filtered.filter(\n (item) =>\n item.tag1.toLowerCase().includes(q) ||\n item.company.toLowerCase().includes(q) ||\n item.title.toLowerCase().includes(q)\n )\n }\n return filtered\n }, [items, activeQuickFilter, resolvedQuickFilterTabs, splitViewSearch])\n\n // Grouped items for list view\n const inboxGroups = React.useMemo<GroupedListGroup<QueueItem>[]>(() => {\n const urgent = filteredItems.filter((i) => i.statusColor === \"red\")\n const active = filteredItems.filter((i) => i.statusColor !== \"red\")\n return [\n { key: \"urgent\", label: \"Urgent\", items: urgent },\n { key: \"active\", label: \"Active\", items: active },\n ].filter((g) => g.items.length > 0)\n }, [filteredItems])\n\n const renderInboxRow = React.useCallback(\n (item: QueueItem) => (\n <>\n <span className={`h-2 w-2 shrink-0 rounded-full ${item.statusColor === \"red\" ? \"bg-[#f43f5e]\" : \"bg-[#3b82f6]\"}`} />\n <span className=\"w-[80px] shrink-0 font-mono text-xs text-muted-foreground/80\">{item.id}</span>\n <span className=\"shrink-0 rounded-md border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground whitespace-nowrap\">{item.tag1}</span>\n <span className=\"min-w-0 flex-1 truncate text-sm font-semibold text-foreground\">{item.title}</span>\n <span className=\"w-[120px] shrink-0 truncate text-xs font-medium text-foreground\">{item.company}</span>\n <span className=\"w-[80px] shrink-0 text-right text-xs text-muted-foreground\">{item.time}</span>\n </>\n ),\n [],\n )\n\n const handleInboxItemSelect = React.useCallback(\n (item: QueueItem) => {\n setSelectedTask(item)\n if (onItemSelect) {\n onItemSelect(item)\n } else if (inboxViewMode === \"list\") {\n setPreviousViewMode(\"list\")\n setInboxViewMode(\"detail\")\n }\n },\n [inboxViewMode, onItemSelect],\n )\n\n const handleBackFromDetail = React.useCallback(() => {\n setInboxViewMode(previousViewMode)\n }, [previousViewMode])\n\n const handleViewModeChange = React.useCallback((id: string) => {\n const mode = id as \"inbox\" | \"list\" | \"detail\"\n if (mode !== \"detail\") {\n setPreviousViewMode(mode)\n }\n setInboxViewMode(mode)\n }, [])\n\n React.useEffect(() => {\n const mql = window.matchMedia(\"(max-width: 768px)\")\n function handleChange(e: MediaQueryListEvent | MediaQueryList) {\n if (e.matches && inboxViewMode === \"inbox\") {\n setPreviousViewMode(\"inbox\")\n setInboxViewMode(\"detail\")\n }\n }\n handleChange(mql)\n mql.addEventListener(\"change\", handleChange)\n return () => mql.removeEventListener(\"change\", handleChange)\n }, [inboxViewMode])\n\n const detailViewProps: DetailViewProps = {\n item: selectedTask,\n sections,\n getSignalScore,\n buildSuggestedActions,\n buildSourceItems,\n getTimelineEvents,\n accountContacts: buildAccountContacts?.(selectedTask) ?? accountContacts,\n emailSignature,\n iconMap,\n onOpenEntityPanel,\n onOpenRecentActivity,\n onSuggestedActionFeedback,\n signalLabels,\n }\n\n return (\n <div className=\"flex h-full w-full flex-col\">\n {/* Toolbar */}\n <div className=\"flex items-center justify-between border-b border-border bg-background px-4 py-3 shrink-0\">\n <div className=\"flex items-center gap-3\">\n {inboxViewMode === \"detail\" ? (\n <button\n type=\"button\"\n onClick={handleBackFromDetail}\n className=\"flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n ) : null}\n <h2 className=\"text-lg font-semibold text-foreground\">Inbox</h2>\n <Badge variant=\"secondary\" className=\"bg-muted text-muted-foreground hover:bg-muted font-medium text-[11px] px-2 py-0.5 rounded-md\">\n {items.length}\n </Badge>\n </div>\n <div className=\"flex items-center gap-3\">\n <ViewModeToggle\n modes={[\n { id: \"inbox\", icon: <Columns2 className=\"h-3.5 w-3.5\" />, label: \"Split View\" },\n { id: \"list\", icon: <LayoutList className=\"h-3.5 w-3.5\" />, label: \"List View\" },\n { id: \"detail\", icon: <Square className=\"h-3.5 w-3.5\" />, label: \"Detail View\" },\n ]}\n activeMode={inboxViewMode}\n onModeChange={handleViewModeChange}\n />\n {headerActions}\n </div>\n </div>\n\n {/* View modes */}\n {inboxViewMode === \"detail\" ? (\n <div className=\"flex h-full flex-1 flex-col overflow-hidden bg-background\">\n <div className=\"flex-1 overflow-y-auto\">\n <DetailView {...detailViewProps} />\n </div>\n </div>\n ) : inboxViewMode === \"list\" ? (\n <div className=\"flex-1 overflow-y-auto bg-background\">\n <InboxToolbar\n assignee={inboxAssignee}\n onAssigneeChange={setInboxAssignee}\n filterCategories={resolvedFilterCategories}\n selectedFilters={inboxFilters}\n onFilterChange={(catId, val) =>\n setInboxFilters((prev) => ({ ...prev, [catId]: val }))\n }\n onClearFilters={() => setInboxFilters({})}\n />\n <GroupedListView<QueueItem>\n groups={inboxGroups}\n renderRow={renderInboxRow}\n getItemKey={(item) => item.id}\n selectedKey={selectedTask.id}\n onItemClick={handleInboxItemSelect}\n emptyMessage=\"No inbox items\"\n />\n </div>\n ) : (\n /* Split view */\n <div className=\"flex h-full min-h-0 w-full flex-1\">\n <div className=\"flex h-full min-w-[380px] w-[380px] flex-col border-r border-border bg-background shadow-sm z-10\">\n <div className=\"flex flex-col gap-4 border-b border-border p-4 shrink-0\">\n {!hideToolbarActions && (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><Eye className=\"w-4 h-4\" /></Button>\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><FileText className=\"w-4 h-4\" /></Button>\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><Clock className=\"w-4 h-4\" /></Button>\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><CheckSquare className=\"w-4 h-4\" /></Button>\n </div>\n <Button size=\"sm\" className=\"h-8 px-4 bg-foreground text-background hover:bg-foreground/90 text-xs font-semibold gap-1.5 rounded-md\">\n <Plus className=\"w-4 h-4\" /> Add Task\n </Button>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1\">\n <Filter className=\"absolute left-2.5 top-1.5 w-4 h-4 text-muted-foreground\" />\n <Input\n className=\"h-8 pl-8 text-xs bg-background border-border rounded-md shadow-none\"\n placeholder=\"Filter by category...\"\n value={splitViewSearch}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSplitViewSearch(e.target.value)}\n />\n </div>\n {!hideAccountsButton && (\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs font-medium rounded-md shadow-none\">\n <Building className=\"w-3.5 h-3.5 mr-1.5\" /> {accountDetailsLabel ?? \"Accounts\"}\n </Button>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 overflow-x-auto pb-1 mt-1 scrollbar-hide\">\n <Button\n size=\"sm\"\n variant={activeQuickFilter === \"all\" ? \"default\" : \"outline\"}\n className={`h-7 rounded-full px-3.5 text-[11px] font-semibold shadow-none ${\n activeQuickFilter === \"all\"\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-transparent border-border text-muted-foreground hover:text-foreground\"\n }`}\n onClick={() => setActiveQuickFilter(\"all\")}\n >\n All\n </Button>\n {resolvedQuickFilterTabs.map((tab) => {\n const count = tab.count ?? quickFilterTabCounts[tab.id]\n return (\n <Button\n key={tab.id}\n size=\"sm\"\n variant={activeQuickFilter === tab.id ? \"default\" : \"outline\"}\n className={`h-7 rounded-full px-3.5 text-[11px] font-medium shadow-none ${\n activeQuickFilter === tab.id\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-transparent border-border text-muted-foreground hover:text-foreground\"\n }`}\n onClick={() => setActiveQuickFilter(tab.id)}\n >\n {tab.label}{count != null && count > 0 ? ` (${count})` : \"\"}\n </Button>\n )\n })}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {splitViewItems.map((item) => (\n <div\n key={item.id}\n onClick={() => { setSelectedTask(item); onItemSelect?.(item) }}\n className={`cursor-pointer border-b border-border p-4 transition-colors group relative border-l-2 ${\n selectedTask.id === item.id\n ? \"bg-muted/30 border-l-brand-purple\"\n : \"bg-transparent border-l-transparent hover:bg-muted/10\"\n }`}\n >\n <div className=\"mb-1.5 flex items-center gap-2\">\n <span className=\"min-w-0 truncate text-[13px] font-semibold text-foreground leading-tight\">{item.title}</span>\n {selectedTask.id !== item.id && item.tag1 && (\n <span className=\"shrink-0 rounded-md border border-border bg-muted/60 px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {item.tag1}\n </span>\n )}\n <span className=\"ml-auto shrink-0 text-[10px] font-medium text-muted-foreground/80\">{item.time}</span>\n </div>\n <div className=\"flex items-start gap-2 mt-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 mt-1.5 ${item.statusColor === \"red\" ? \"bg-[#f43f5e]\" : \"bg-[#3b82f6]\"}`} />\n <span className=\"text-xs text-muted-foreground leading-tight\">{item.details}</span>\n </div>\n {buildEntityChips && (() => {\n const chips = buildEntityChips(item)\n if (!chips.length) return null\n return (\n <div className=\"flex items-center gap-1.5 mt-2 flex-wrap\">\n {chips.map((chip) => (\n <button\n key={chip.id}\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); chip.onClick?.() }}\n className=\"inline-flex items-center gap-1 rounded-md border border-border/60 bg-muted/30 px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <span className=\"flex h-3.5 w-3.5 items-center justify-center rounded bg-muted-foreground/10 text-[8px] font-semibold\">{chip.avatarLetter}</span>\n {chip.label}\n </button>\n ))}\n </div>\n )\n })()}\n {!hideHoverActions && (\n <div className={`absolute right-4 bottom-4 flex items-center gap-1.5 bg-background shadow-sm rounded-md px-1 py-0.5 border border-border ${\n selectedTask.id === item.id ? \"opacity-100\" : \"opacity-0 group-hover:opacity-100 transition-opacity\"\n }`}>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 rounded text-muted-foreground hover:text-foreground\"><CheckSquare className=\"w-3.5 h-3.5\" /></Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 rounded text-muted-foreground hover:text-foreground\"><Clock className=\"w-3.5 h-3.5\" /></Button>\n </div>\n )}\n </div>\n ))}\n <div className=\"p-4\">\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs font-semibold rounded-md shadow-none\">See more</Button>\n </div>\n </div>\n </div>\n\n <div className=\"flex h-full flex-1 flex-col overflow-hidden bg-background\">\n <div className=\"flex-1 overflow-y-auto\">\n <DetailView {...detailViewProps} />\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../src/prototype/prototype-inbox-view.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ArrowLeft,\n ChevronDown,\n ChevronRight,\n Filter,\n FileText,\n Clock,\n CheckSquare,\n Eye,\n Plus,\n\n Building,\n LayoutList,\n Columns2,\n Square,\n Tag,\n} from \"lucide-react\"\n\nimport { Button } from \"../components/button\"\nimport { Badge } from \"../components/badge\"\nimport { Input } from \"../components/input\"\nimport { ViewModeToggle } from \"../components/view-mode-toggle\"\nimport {\n InboxToolbar,\n type AssigneeFilter,\n type InboxFilterCategory,\n} from \"../components/inbox-toolbar\"\nimport { GroupedListView, type GroupedListGroup } from \"../components/item-list\"\nimport { SignalApproval } from \"../components/signal-feedback-inline\"\nimport { ScoreBreakdown } from \"../components/score-breakdown\"\nimport { Citation, type SourceDef } from \"../components/detail-view\"\nimport {\n SuggestedActions,\n type SuggestedAction,\n type SuggestedContact,\n} from \"../components/suggested-actions\"\nimport { TimelineActivity, type TimelineEvent } from \"../components/timeline-activity\"\nimport type {\n QueueItem,\n InboxViewConfig,\n InboxDetailSections,\n SignalScoreData,\n} from \"./prototype-config\"\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface PrototypeInboxViewProps extends InboxViewConfig {\n /** Extra ReactNode rendered at the end of the header bar (e.g. exit button). */\n headerActions?: React.ReactNode\n onOpenEntityPanel?: () => void\n onOpenRecentActivity?: () => void\n onNavigateToInbox?: () => void\n onItemSelect?: (item: QueueItem) => void\n defaultViewMode?: \"list\" | \"split\"\n}\n\n// ---------------------------------------------------------------------------\n// Default detail sections\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_DETAIL_SECTIONS: InboxDetailSections = {\n signalBrief: true,\n suggestedActions: true,\n timeline: true,\n}\n\nconst DEFAULT_SIGNAL_SCORE: SignalScoreData = {\n score: 65,\n factors: [\n { key: \"trigger\", label: \"Trigger strength\", score: 70, why: \"Moderate signal detected based on account activity\" },\n { key: \"fit\", label: \"Company fit\", score: 65, why: \"Reasonable fit based on company profile\" },\n { key: \"timing\", label: \"Timing\", score: 58, why: \"Within general evaluation window\" },\n ],\n whyNow: \"Moderate signals detected that warrant review and potential outreach.\",\n evidence: [\n \"Activity patterns suggest potential opportunity\",\n \"Company profile aligns with target segment\",\n ],\n confidence: 72,\n}\n\n// ---------------------------------------------------------------------------\n// Detail View\n// ---------------------------------------------------------------------------\n\nexport interface DetailViewProps {\n item: QueueItem\n sections: InboxDetailSections\n getSignalScore: (company: string) => SignalScoreData\n buildSuggestedActions: (item: QueueItem) => SuggestedAction[]\n buildSourceItems: (item: QueueItem) => SourceDef[]\n getTimelineEvents?: (item: QueueItem) => TimelineEvent[]\n accountContacts: SuggestedContact[]\n emailSignature: string | React.ReactNode\n iconMap: Record<string, string>\n onOpenEntityPanel?: () => void\n onOpenRecentActivity?: () => void\n onSuggestedActionFeedback?: (actionId: number | string, feedback: string, actionTitle?: string) => void\n signalLabels?: { approveButton?: string; dismissButton?: string; approvedStatus?: string; dismissedStatus?: string }\n signalBriefCopy?: InboxViewConfig[\"signalBriefCopy\"]\n}\n\nexport function DetailView({\n item,\n sections,\n getSignalScore,\n buildSuggestedActions,\n buildSourceItems,\n getTimelineEvents,\n accountContacts,\n emailSignature,\n iconMap,\n onOpenEntityPanel,\n onOpenRecentActivity,\n onSuggestedActionFeedback: _onSuggestedActionFeedback,\n signalLabels,\n signalBriefCopy,\n}: DetailViewProps) {\n const [evidenceExpanded, setEvidenceExpanded] = React.useState(false)\n const [showTimeline, setShowTimeline] = React.useState(false)\n const [extraActions, setExtraActions] = React.useState<SuggestedAction[]>([])\n\n React.useEffect(() => {\n setShowTimeline(false)\n setEvidenceExpanded(false)\n setExtraActions([])\n }, [item.id])\n\n const signalData = React.useMemo(\n () => getSignalScore(item.company),\n [getSignalScore, item.company],\n )\n\n const suggestedActions = React.useMemo(\n () => [...buildSuggestedActions(item), ...extraActions],\n [buildSuggestedActions, item, extraActions],\n )\n const sourceItems = React.useMemo(() => buildSourceItems(item), [buildSourceItems, item])\n const timelineEvents = React.useMemo(\n () => getTimelineEvents?.(item) ?? [],\n [getTimelineEvents, item],\n )\n\n const handleDuplicate = React.useCallback(\n (id: number | string) => {\n const base = suggestedActions.find((a) => a.id === id)\n if (!base || base.type !== \"email\") return\n const clone: SuggestedAction = {\n ...base,\n id: `${base.id}-dup-${Date.now()}`,\n emailMeta: base.emailMeta ? { ...base.emailMeta, to: undefined } : undefined,\n }\n setExtraActions((prev) => [...prev, clone])\n },\n [suggestedActions],\n )\n\n return (\n <SignalApproval.Root\n companyName={item.company}\n opportunityUrl={`https://acme.lightning.force.com/lightning/r/Opportunity/006${item.id}/view`}\n labels={signalLabels}\n onApprove={() => {\n console.log(\"Approved signal:\", { taskId: item.id, company: item.company })\n }}\n onApproveFeedback={(reasons, detail) => {\n signalData.onApproveFeedback?.(reasons, detail)\n console.log(\"Approval feedback:\", { taskId: item.id, company: item.company, reasons, detail })\n }}\n onDismiss={(reasons, detail) => {\n signalData.onDismissFeedback?.(reasons, detail)\n console.log(\"Dismissed signal:\", { taskId: item.id, reasons, detail })\n }}\n >\n <div className=\"mx-auto w-full max-w-3xl p-6 pb-12 md:p-8\">\n <div className=\"pb-8\">\n {/* Header */}\n <div className=\"mb-4 flex items-center gap-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n Back\n </button>\n <span className=\"text-muted-foreground/40\">&middot;</span>\n <span className=\"text-xs text-muted-foreground\">{item.company}</span>\n </div>\n\n <h1 className=\"mb-3 text-2xl font-bold tracking-tight text-foreground\">{item.title}</h1>\n\n <div className=\"mb-6 flex flex-wrap items-center gap-2\">\n {item.statusColor === \"red\" && (\n <div className=\"inline-flex items-center gap-1 rounded-md bg-red-50 px-2.5 py-1 text-xs font-semibold text-red-700\">\n <span className=\"text-[10px] font-bold\">!</span> Urgent\n </div>\n )}\n <div className=\"inline-flex items-center gap-1 rounded-md bg-muted px-2.5 py-1 text-xs font-medium text-muted-foreground\">\n {item.tag1}\n </div>\n <button\n type=\"button\"\n onClick={onOpenEntityPanel}\n className=\"ml-1 inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-muted/30 px-2 py-1 transition-colors hover:bg-muted/50\"\n >\n <div className=\"flex h-4 w-4 items-center justify-center rounded bg-muted-foreground/10 text-[9px] font-semibold text-muted-foreground\">\n {item.company.substring(0, 1)}\n </div>\n <span className=\"text-xs font-medium text-foreground\">{item.company}</span>\n <ChevronRight className=\"h-3 w-3 text-muted-foreground/50\" />\n </button>\n </div>\n\n {/* Signal Brief */}\n {sections.signalBrief && (() => {\n const pct = signalData.score\n const scoreColor = pct >= 70 ? \"text-emerald-600\" : pct >= 40 ? \"text-amber-600\" : \"text-red-600\"\n const barColor = pct >= 70 ? \"bg-emerald-500\" : pct >= 40 ? \"bg-amber-500\" : \"bg-red-500\"\n const scoreLabel = pct >= 70 ? \"HIGH\" : pct >= 40 ? \"MEDIUM\" : \"LOW\"\n\n const evidenceWithCitations: React.ReactNode[] =\n sourceItems.length >= 4\n ? [\n <>\n There are <span className=\"font-medium text-foreground\">3 unusual signals</span> including a large balance\n outflow and reduced login frequency\n <Citation number={1} source={sourceItems[0]} />\n <Citation number={2} source={sourceItems[1]} />\n <Citation number={3} source={sourceItems[2]} />\n </>,\n <>\n Scott mentioned in <span className=\"font-medium text-foreground\">#treasury-questions</span> that they are actively\n looking for treasury management options\n <Citation number={4} source={sourceItems[2]} />\n </>,\n <>\n You have a recent email thread regarding optimization options that hasn&apos;t been replied to\n <Citation number={5} source={sourceItems[3]} />\n </>,\n ]\n : signalData.evidence.map((ev, i) => (\n <span key={i}>{ev}</span>\n ))\n\n const briefHeading = signalBriefCopy?.heading ?? \"Signal brief\"\n const introOpt = signalBriefCopy?.intro\n const briefIntro =\n introOpt === null\n ? null\n : typeof introOpt === \"function\"\n ? introOpt(item)\n : introOpt ?? `We detected signals that suggest a potential opportunity with ${item.company}.`\n return (\n <div className=\"mb-8\">\n {briefHeading ? (\n <h3 className=\"text-xs font-bold text-muted-foreground uppercase tracking-wider mb-3\">{briefHeading}</h3>\n ) : null}\n {briefIntro ? (\n <p className=\"text-sm text-muted-foreground leading-relaxed mb-2\">\n {briefIntro}\n </p>\n ) : null}\n <p className=\"text-sm text-foreground/90 leading-relaxed mb-4\">\n {signalData.whyNow}\n </p>\n\n <div className=\"mb-5 rounded-md border border-border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[10px] font-bold text-muted-foreground uppercase tracking-wider\">Signal Score</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold text-foreground\">{signalData.score}/100</span>\n <span className={`text-[10px] font-bold uppercase ${scoreColor}`}>{scoreLabel}</span>\n </div>\n </div>\n <div className=\"h-1.5 bg-muted rounded-full overflow-hidden mb-2\">\n <div\n className={`h-full rounded-full transition-all duration-500 ${barColor}`}\n style={{ width: `${signalData.score}%` }}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => setEvidenceExpanded((prev) => !prev)}\n className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronDown className={`h-3 w-3 transition-transform duration-200 ${evidenceExpanded ? \"rotate-180\" : \"\"}`} />\n View more\n </button>\n\n {evidenceExpanded && (\n <div className=\"mt-3 space-y-3\">\n <ul className=\"space-y-2\">\n {evidenceWithCitations.map((ev, index) => (\n <li key={index} className=\"flex items-start gap-2 text-sm\">\n <div className=\"w-1.5 h-1.5 bg-primary rounded-full mt-2 flex-shrink-0\" />\n <span className=\"text-muted-foreground leading-relaxed\">{ev}</span>\n </li>\n ))}\n </ul>\n <ScoreBreakdown\n factors={signalData.factors}\n onFactorFeedback={signalData.onFactorFeedback ?? ((key, type, detail) =>\n console.log(\"Signal factor feedback:\", { company: item.company, factor: key, type, detail })\n )}\n />\n <SignalApproval.Actions />\n </div>\n )}\n </div>\n\n {!evidenceExpanded && <SignalApproval.Actions />}\n </div>\n )\n })()}\n\n {/* Activity Timeline */}\n {sections.timeline && timelineEvents.length > 0 && (\n <div className=\"mb-8\">\n <button\n type=\"button\"\n onClick={() => setShowTimeline((prev) => !prev)}\n className=\"group/timeline flex w-full items-center justify-between gap-2 py-2 rounded-md transition-colors hover:bg-muted/40 -mx-2 px-2 cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-xs font-bold text-muted-foreground uppercase tracking-wider group-hover/timeline:text-foreground transition-colors\">Activity timeline</h3>\n {!showTimeline && (\n <span className=\"text-[11px] text-muted-foreground/60\">&middot; Last activity 1d ago</span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[11px] font-medium text-muted-foreground\">{timelineEvents.length} events</span>\n <ChevronDown className={`h-3.5 w-3.5 text-muted-foreground transition-transform duration-200 ${showTimeline ? \"rotate-180\" : \"\"}`} />\n </div>\n </button>\n {showTimeline && (\n <div className=\"mt-3\">\n <TimelineActivity events={timelineEvents} />\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Suggested Actions */}\n {sections.suggestedActions && (\n <SignalApproval.Gate>\n <SuggestedActions\n actions={suggestedActions}\n accountContacts={accountContacts}\n signature={emailSignature}\n iconMap={iconMap}\n onDismiss={(id) => console.log(\"Dismiss action:\", id)}\n onSend={(id) => console.log(\"Send action:\", id)}\n onSaveDraft={(id) => console.log(\"Save draft:\", id)}\n onDuplicate={handleDuplicate}\n onOpenAccountDetails={onOpenEntityPanel}\n onOpenRecentActivity={onOpenRecentActivity}\n onMarkComplete={(id) => console.log(\"Mark complete:\", id)}\n onDispatchAgent={(id) => console.log(\"Dispatch agent:\", id)}\n />\n </SignalApproval.Gate>\n )}\n </div>\n </SignalApproval.Root>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\nexport function PrototypeInboxView({\n items,\n filterCategories,\n detailSections,\n accountContacts = [],\n buildAccountContacts,\n emailSignature = \"\",\n buildSuggestedActions: buildSuggestedActionsProp,\n buildSourceItems: buildSourceItemsProp,\n getSignalScore: getSignalScoreProp,\n getTimelineEvents,\n iconMap = {},\n hideToolbarActions,\n hideHoverActions,\n onSuggestedActionFeedback,\n headerActions,\n onOpenEntityPanel,\n onOpenRecentActivity,\n onItemSelect,\n defaultViewMode,\n buildEntityChips,\n quickFilterTabs,\n hideAccountsButton,\n accountDetailsLabel,\n signalLabels,\n signalBriefCopy,\n}: PrototypeInboxViewProps) {\n const [inboxViewMode, setInboxViewMode] = React.useState<\"inbox\" | \"list\" | \"detail\">(\n defaultViewMode === \"list\" ? \"list\" : defaultViewMode === \"split\" ? \"inbox\" : \"inbox\"\n )\n const [previousViewMode, setPreviousViewMode] = React.useState<\"inbox\" | \"list\">(\"inbox\")\n const [selectedTask, setSelectedTask] = React.useState(items[0])\n const [inboxAssignee, setInboxAssignee] = React.useState<AssigneeFilter>(\"me\")\n const [inboxFilters, setInboxFilters] = React.useState<Record<string, string>>({})\n const [activeQuickFilter, setActiveQuickFilter] = React.useState<string>(\"all\")\n const [splitViewSearch, setSplitViewSearch] = React.useState(\"\")\n\n const sections = React.useMemo(\n () => ({ ...DEFAULT_DETAIL_SECTIONS, ...detailSections }),\n [detailSections],\n )\n\n const resolvedFilterCategories: InboxFilterCategory[] = React.useMemo(\n () =>\n filterCategories ?? [\n {\n id: \"category\",\n label: \"Category\",\n icon: <Tag className=\"h-3.5 w-3.5 text-muted-foreground\" />,\n options: [...new Set(items.map((i) => i.tag1))],\n },\n {\n id: \"account\",\n label: \"Account\",\n icon: <Building className=\"h-3.5 w-3.5 text-muted-foreground\" />,\n options: [...new Set(items.map((i) => i.company))],\n },\n ],\n [filterCategories, items],\n )\n\n const buildSuggestedActions = React.useMemo(\n () => buildSuggestedActionsProp ?? (() => []),\n [buildSuggestedActionsProp],\n )\n\n const buildSourceItems = React.useMemo(\n () => buildSourceItemsProp ?? (() => []),\n [buildSourceItemsProp],\n )\n\n const getSignalScore = React.useMemo(\n () => getSignalScoreProp ?? (() => DEFAULT_SIGNAL_SCORE),\n [getSignalScoreProp],\n )\n\n // Build a map from filter category id → QueueItem field for targeted filtering.\n // Known category ids are mapped explicitly; unknown categories fall back to a\n // broad search across display fields so consumer-defined filters still work.\n const filterFieldMap = React.useMemo<\n Record<string, (item: QueueItem, value: string) => boolean>\n >(() => {\n const map: Record<string, (item: QueueItem, value: string) => boolean> = {}\n for (const cat of resolvedFilterCategories) {\n switch (cat.id) {\n case \"category\":\n case \"signalType\":\n map[cat.id] = (item, v) => item.tag1.toLowerCase() === v.toLowerCase()\n break\n case \"account\":\n map[cat.id] = (item, v) => item.company.toLowerCase() === v.toLowerCase()\n break\n default:\n // Fallback: check all display fields\n map[cat.id] = (item, v) => {\n const lv = v.toLowerCase()\n return (\n item.tag1.toLowerCase() === lv ||\n item.company.toLowerCase() === lv ||\n item.title.toLowerCase().includes(lv) ||\n item.details.toLowerCase().includes(lv)\n )\n }\n }\n }\n return map\n }, [resolvedFilterCategories])\n\n // Filter items for list view based on toolbar filters\n const filteredItems = React.useMemo(() => {\n const activeFilters = Object.entries(inboxFilters).filter(\n ([, value]) => value && value !== \"all\"\n )\n if (activeFilters.length === 0) return items\n return items.filter((item) =>\n activeFilters.every(([key, value]) => {\n const matcher = filterFieldMap[key]\n return matcher ? matcher(item, value) : true\n })\n )\n }, [items, inboxFilters, filterFieldMap])\n\n // Resolve quick filter tabs once — used by both the split view filter and\n // the tab bar render. Each tab's `matchValue` (falling back to `label`) is\n // compared against `item.tag1` so consumer labels can differ from data values.\n type QuickFilterTab = { id: string; label: string; matchValue?: string; count?: number }\n const resolvedQuickFilterTabs = React.useMemo<QuickFilterTab[]>(() => {\n if (quickFilterTabs) return quickFilterTabs\n // Derive default tabs from the actual item tag1 values\n const uniqueTags = [...new Set(items.map((i) => i.tag1))]\n return uniqueTags.map((tag) => ({\n id: tag.toLowerCase().replace(/\\s+/g, \"-\"),\n label: tag,\n }))\n }, [quickFilterTabs, items])\n\n // Compute per-tab counts once so they can be displayed in the tab bar\n const quickFilterTabCounts = React.useMemo(() => {\n const counts: Record<string, number> = {}\n for (const tab of resolvedQuickFilterTabs) {\n const match = (tab.matchValue ?? tab.label).toLowerCase()\n counts[tab.id] = items.filter((i) => i.tag1.toLowerCase() === match).length\n }\n return counts\n }, [resolvedQuickFilterTabs, items])\n\n // Filter items for split view based on quick filter tabs and search\n const splitViewItems = React.useMemo(() => {\n let filtered = items\n // Apply quick filter tab\n if (activeQuickFilter !== \"all\") {\n const activeTab = resolvedQuickFilterTabs.find((t) => t.id === activeQuickFilter)\n if (activeTab) {\n const match = (activeTab.matchValue ?? activeTab.label).toLowerCase()\n filtered = filtered.filter(\n (item) => item.tag1.toLowerCase() === match\n )\n }\n }\n // Apply search input\n if (splitViewSearch.trim()) {\n const q = splitViewSearch.trim().toLowerCase()\n filtered = filtered.filter(\n (item) =>\n item.tag1.toLowerCase().includes(q) ||\n item.company.toLowerCase().includes(q) ||\n item.title.toLowerCase().includes(q)\n )\n }\n return filtered\n }, [items, activeQuickFilter, resolvedQuickFilterTabs, splitViewSearch])\n\n // Grouped items for list view\n const inboxGroups = React.useMemo<GroupedListGroup<QueueItem>[]>(() => {\n const urgent = filteredItems.filter((i) => i.statusColor === \"red\")\n const active = filteredItems.filter((i) => i.statusColor !== \"red\")\n return [\n { key: \"urgent\", label: \"Urgent\", items: urgent },\n { key: \"active\", label: \"Active\", items: active },\n ].filter((g) => g.items.length > 0)\n }, [filteredItems])\n\n const renderInboxRow = React.useCallback(\n (item: QueueItem) => (\n <>\n <span className={`h-2 w-2 shrink-0 rounded-full ${item.statusColor === \"red\" ? \"bg-[#f43f5e]\" : \"bg-[#3b82f6]\"}`} />\n <span className=\"w-[80px] shrink-0 font-mono text-xs text-muted-foreground/80\">{item.id}</span>\n <span className=\"shrink-0 rounded-md border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground whitespace-nowrap\">{item.tag1}</span>\n <span className=\"min-w-0 flex-1 truncate text-sm font-semibold text-foreground\">{item.title}</span>\n <span className=\"w-[120px] shrink-0 truncate text-xs font-medium text-foreground\">{item.company}</span>\n <span className=\"w-[80px] shrink-0 text-right text-xs text-muted-foreground\">{item.time}</span>\n </>\n ),\n [],\n )\n\n const handleInboxItemSelect = React.useCallback(\n (item: QueueItem) => {\n setSelectedTask(item)\n if (onItemSelect) {\n onItemSelect(item)\n } else if (inboxViewMode === \"list\") {\n setPreviousViewMode(\"list\")\n setInboxViewMode(\"detail\")\n }\n },\n [inboxViewMode, onItemSelect],\n )\n\n const handleBackFromDetail = React.useCallback(() => {\n setInboxViewMode(previousViewMode)\n }, [previousViewMode])\n\n const handleViewModeChange = React.useCallback((id: string) => {\n const mode = id as \"inbox\" | \"list\" | \"detail\"\n if (mode !== \"detail\") {\n setPreviousViewMode(mode)\n }\n setInboxViewMode(mode)\n }, [])\n\n React.useEffect(() => {\n const mql = window.matchMedia(\"(max-width: 768px)\")\n function handleChange(e: MediaQueryListEvent | MediaQueryList) {\n if (e.matches && inboxViewMode === \"inbox\") {\n setPreviousViewMode(\"inbox\")\n setInboxViewMode(\"detail\")\n }\n }\n handleChange(mql)\n mql.addEventListener(\"change\", handleChange)\n return () => mql.removeEventListener(\"change\", handleChange)\n }, [inboxViewMode])\n\n const detailViewProps: DetailViewProps = {\n item: selectedTask,\n sections,\n getSignalScore,\n buildSuggestedActions,\n buildSourceItems,\n getTimelineEvents,\n accountContacts: buildAccountContacts?.(selectedTask) ?? accountContacts,\n emailSignature,\n iconMap,\n onOpenEntityPanel,\n onOpenRecentActivity,\n onSuggestedActionFeedback,\n signalLabels,\n signalBriefCopy,\n }\n\n return (\n <div className=\"flex h-full w-full flex-col\">\n {/* Toolbar */}\n <div className=\"flex items-center justify-between border-b border-border bg-background px-4 py-3 shrink-0\">\n <div className=\"flex items-center gap-3\">\n {inboxViewMode === \"detail\" ? (\n <button\n type=\"button\"\n onClick={handleBackFromDetail}\n className=\"flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n ) : null}\n <h2 className=\"text-lg font-semibold text-foreground\">Inbox</h2>\n <Badge variant=\"secondary\" className=\"bg-muted text-muted-foreground hover:bg-muted font-medium text-[11px] px-2 py-0.5 rounded-md\">\n {items.length}\n </Badge>\n </div>\n <div className=\"flex items-center gap-3\">\n <ViewModeToggle\n modes={[\n { id: \"inbox\", icon: <Columns2 className=\"h-3.5 w-3.5\" />, label: \"Split View\" },\n { id: \"list\", icon: <LayoutList className=\"h-3.5 w-3.5\" />, label: \"List View\" },\n { id: \"detail\", icon: <Square className=\"h-3.5 w-3.5\" />, label: \"Detail View\" },\n ]}\n activeMode={inboxViewMode}\n onModeChange={handleViewModeChange}\n />\n {headerActions}\n </div>\n </div>\n\n {/* View modes */}\n {inboxViewMode === \"detail\" ? (\n <div className=\"flex h-full flex-1 flex-col overflow-hidden bg-background\">\n <div className=\"flex-1 overflow-y-auto\">\n <DetailView {...detailViewProps} />\n </div>\n </div>\n ) : inboxViewMode === \"list\" ? (\n <div className=\"flex-1 overflow-y-auto bg-background\">\n <InboxToolbar\n assignee={inboxAssignee}\n onAssigneeChange={setInboxAssignee}\n filterCategories={resolvedFilterCategories}\n selectedFilters={inboxFilters}\n onFilterChange={(catId, val) =>\n setInboxFilters((prev) => ({ ...prev, [catId]: val }))\n }\n onClearFilters={() => setInboxFilters({})}\n />\n <GroupedListView<QueueItem>\n groups={inboxGroups}\n renderRow={renderInboxRow}\n getItemKey={(item) => item.id}\n selectedKey={selectedTask.id}\n onItemClick={handleInboxItemSelect}\n emptyMessage=\"No inbox items\"\n />\n </div>\n ) : (\n /* Split view */\n <div className=\"flex h-full min-h-0 w-full flex-1\">\n <div className=\"flex h-full min-w-[380px] w-[380px] flex-col border-r border-border bg-background shadow-sm z-10\">\n <div className=\"flex flex-col gap-4 border-b border-border p-4 shrink-0\">\n {!hideToolbarActions && (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><Eye className=\"w-4 h-4\" /></Button>\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><FileText className=\"w-4 h-4\" /></Button>\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><Clock className=\"w-4 h-4\" /></Button>\n <Button variant=\"outline\" size=\"icon\" className=\"h-8 w-8 text-muted-foreground\"><CheckSquare className=\"w-4 h-4\" /></Button>\n </div>\n <Button size=\"sm\" className=\"h-8 px-4 bg-foreground text-background hover:bg-foreground/90 text-xs font-semibold gap-1.5 rounded-md\">\n <Plus className=\"w-4 h-4\" /> Add Task\n </Button>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1\">\n <Filter className=\"absolute left-2.5 top-1.5 w-4 h-4 text-muted-foreground\" />\n <Input\n className=\"h-8 pl-8 text-xs bg-background border-border rounded-md shadow-none\"\n placeholder=\"Filter by category...\"\n value={splitViewSearch}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSplitViewSearch(e.target.value)}\n />\n </div>\n {!hideAccountsButton && (\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs font-medium rounded-md shadow-none\">\n <Building className=\"w-3.5 h-3.5 mr-1.5\" /> {accountDetailsLabel ?? \"Accounts\"}\n </Button>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 overflow-x-auto pb-1 mt-1 scrollbar-hide\">\n <Button\n size=\"sm\"\n variant={activeQuickFilter === \"all\" ? \"default\" : \"outline\"}\n className={`h-7 rounded-full px-3.5 text-[11px] font-semibold shadow-none ${\n activeQuickFilter === \"all\"\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-transparent border-border text-muted-foreground hover:text-foreground\"\n }`}\n onClick={() => setActiveQuickFilter(\"all\")}\n >\n All\n </Button>\n {resolvedQuickFilterTabs.map((tab) => {\n const count = tab.count ?? quickFilterTabCounts[tab.id]\n return (\n <Button\n key={tab.id}\n size=\"sm\"\n variant={activeQuickFilter === tab.id ? \"default\" : \"outline\"}\n className={`h-7 rounded-full px-3.5 text-[11px] font-medium shadow-none ${\n activeQuickFilter === tab.id\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-transparent border-border text-muted-foreground hover:text-foreground\"\n }`}\n onClick={() => setActiveQuickFilter(tab.id)}\n >\n {tab.label}{count != null && count > 0 ? ` (${count})` : \"\"}\n </Button>\n )\n })}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {splitViewItems.map((item) => (\n <div\n key={item.id}\n onClick={() => { setSelectedTask(item); onItemSelect?.(item) }}\n className={`cursor-pointer border-b border-border p-4 transition-colors group relative border-l-2 ${\n selectedTask.id === item.id\n ? \"bg-muted/30 border-l-brand-purple\"\n : \"bg-transparent border-l-transparent hover:bg-muted/10\"\n }`}\n >\n <div className=\"mb-1.5 flex items-center gap-2\">\n <span className=\"min-w-0 truncate text-[13px] font-semibold text-foreground leading-tight\">{item.title}</span>\n {selectedTask.id !== item.id && item.tag1 && (\n <span className=\"shrink-0 rounded-md border border-border bg-muted/60 px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {item.tag1}\n </span>\n )}\n <span className=\"ml-auto shrink-0 text-[10px] font-medium text-muted-foreground/80\">{item.time}</span>\n </div>\n <div className=\"flex items-start gap-2 mt-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 mt-1.5 ${item.statusColor === \"red\" ? \"bg-[#f43f5e]\" : \"bg-[#3b82f6]\"}`} />\n <span className=\"text-xs text-muted-foreground leading-tight\">{item.details}</span>\n </div>\n {buildEntityChips && (() => {\n const chips = buildEntityChips(item)\n if (!chips.length) return null\n return (\n <div className=\"flex items-center gap-1.5 mt-2 flex-wrap\">\n {chips.map((chip) => (\n <button\n key={chip.id}\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); chip.onClick?.() }}\n className=\"inline-flex items-center gap-1 rounded-md border border-border/60 bg-muted/30 px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <span className=\"flex h-3.5 w-3.5 items-center justify-center rounded bg-muted-foreground/10 text-[8px] font-semibold\">{chip.avatarLetter}</span>\n {chip.label}\n </button>\n ))}\n </div>\n )\n })()}\n {!hideHoverActions && (\n <div className={`absolute right-4 bottom-4 flex items-center gap-1.5 bg-background shadow-sm rounded-md px-1 py-0.5 border border-border ${\n selectedTask.id === item.id ? \"opacity-100\" : \"opacity-0 group-hover:opacity-100 transition-opacity\"\n }`}>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 rounded text-muted-foreground hover:text-foreground\"><CheckSquare className=\"w-3.5 h-3.5\" /></Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 rounded text-muted-foreground hover:text-foreground\"><Clock className=\"w-3.5 h-3.5\" /></Button>\n </div>\n )}\n </div>\n ))}\n <div className=\"p-4\">\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs font-semibold rounded-md shadow-none\">See more</Button>\n </div>\n </div>\n </div>\n\n <div className=\"flex h-full flex-1 flex-col overflow-hidden bg-background\">\n <div className=\"flex-1 overflow-y-auto\">\n <DetailView {...detailViewProps} />\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["_a"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@handled-ai/design-system",
3
- "version": "0.9.8",
3
+ "version": "0.9.10",
4
4
  "description": "Handled UI component library (shadcn-style, New York)",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@9.12.0",
@@ -48,6 +48,8 @@ export interface SidebarNavItem {
48
48
 
49
49
  export interface SidebarNavSection {
50
50
  title?: string
51
+ /** Optional icon shown to the left of the section title (expanded sidebars only). */
52
+ titleIconUrl?: string
51
53
  items: SidebarNavItem[]
52
54
  moreItems?: SidebarNavItem[]
53
55
  }
@@ -284,8 +286,18 @@ function NavSection({
284
286
  onClick={() => setIsExpanded(!isExpanded)}
285
287
  className="flex w-full items-center justify-between mb-1 px-3 group cursor-pointer"
286
288
  >
287
- <span className="text-xs font-bold tracking-widest text-sidebar-foreground/50 uppercase">
288
- {section.title}
289
+ <span className="flex items-center gap-1.5 min-w-0">
290
+ {section.titleIconUrl && (
291
+ <img
292
+ src={section.titleIconUrl}
293
+ alt=""
294
+ aria-hidden="true"
295
+ className="h-3.5 w-3.5 shrink-0 object-contain opacity-70"
296
+ />
297
+ )}
298
+ <span className="text-xs font-bold tracking-widest text-sidebar-foreground/50 uppercase truncate">
299
+ {section.title}
300
+ </span>
289
301
  </span>
290
302
  <ChevronDown
291
303
  className={cn(
@@ -81,6 +81,23 @@ export interface InboxViewConfig {
81
81
  approvedStatus?: string
82
82
  dismissedStatus?: string
83
83
  }
84
+ /**
85
+ * Override the copy used in the detail panel "Signal brief" section.
86
+ * Useful when the prototype represents an internal ops inbox rather than
87
+ * an outbound sales signal — the default heading and intro line are
88
+ * written for the latter.
89
+ */
90
+ signalBriefCopy?: {
91
+ /** Section heading (default: "Signal brief"). Pass an empty string to hide. */
92
+ heading?: string
93
+ /**
94
+ * Introductory line rendered above the per-item `whyNow` text.
95
+ * Receives the `QueueItem` so the caller can interpolate the company
96
+ * name or other fields. Pass `null` (or a function returning `null`)
97
+ * to suppress the intro line entirely.
98
+ */
99
+ intro?: string | ((item: QueueItem) => string | null) | null
100
+ }
84
101
  }
85
102
 
86
103
  // ---------------------------------------------------------------------------
@@ -102,6 +102,7 @@ export interface DetailViewProps {
102
102
  onOpenRecentActivity?: () => void
103
103
  onSuggestedActionFeedback?: (actionId: number | string, feedback: string, actionTitle?: string) => void
104
104
  signalLabels?: { approveButton?: string; dismissButton?: string; approvedStatus?: string; dismissedStatus?: string }
105
+ signalBriefCopy?: InboxViewConfig["signalBriefCopy"]
105
106
  }
106
107
 
107
108
  export function DetailView({
@@ -118,6 +119,7 @@ export function DetailView({
118
119
  onOpenRecentActivity,
119
120
  onSuggestedActionFeedback: _onSuggestedActionFeedback,
120
121
  signalLabels,
122
+ signalBriefCopy,
121
123
  }: DetailViewProps) {
122
124
  const [evidenceExpanded, setEvidenceExpanded] = React.useState(false)
123
125
  const [showTimeline, setShowTimeline] = React.useState(false)
@@ -245,12 +247,24 @@ export function DetailView({
245
247
  <span key={i}>{ev}</span>
246
248
  ))
247
249
 
250
+ const briefHeading = signalBriefCopy?.heading ?? "Signal brief"
251
+ const introOpt = signalBriefCopy?.intro
252
+ const briefIntro =
253
+ introOpt === null
254
+ ? null
255
+ : typeof introOpt === "function"
256
+ ? introOpt(item)
257
+ : introOpt ?? `We detected signals that suggest a potential opportunity with ${item.company}.`
248
258
  return (
249
259
  <div className="mb-8">
250
- <h3 className="text-xs font-bold text-muted-foreground uppercase tracking-wider mb-3">Signal brief</h3>
251
- <p className="text-sm text-muted-foreground leading-relaxed mb-2">
252
- We detected signals that suggest a potential opportunity with {item.company}.
253
- </p>
260
+ {briefHeading ? (
261
+ <h3 className="text-xs font-bold text-muted-foreground uppercase tracking-wider mb-3">{briefHeading}</h3>
262
+ ) : null}
263
+ {briefIntro ? (
264
+ <p className="text-sm text-muted-foreground leading-relaxed mb-2">
265
+ {briefIntro}
266
+ </p>
267
+ ) : null}
254
268
  <p className="text-sm text-foreground/90 leading-relaxed mb-4">
255
269
  {signalData.whyNow}
256
270
  </p>
@@ -385,6 +399,7 @@ export function PrototypeInboxView({
385
399
  hideAccountsButton,
386
400
  accountDetailsLabel,
387
401
  signalLabels,
402
+ signalBriefCopy,
388
403
  }: PrototypeInboxViewProps) {
389
404
  const [inboxViewMode, setInboxViewMode] = React.useState<"inbox" | "list" | "detail">(
390
405
  defaultViewMode === "list" ? "list" : defaultViewMode === "split" ? "inbox" : "inbox"
@@ -607,6 +622,7 @@ export function PrototypeInboxView({
607
622
  onOpenRecentActivity,
608
623
  onSuggestedActionFeedback,
609
624
  signalLabels,
625
+ signalBriefCopy,
610
626
  }
611
627
 
612
628
  return (