@handled-ai/design-system 0.8.0 → 0.9.0
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.
- package/README.md +14 -4
- package/dist/charts/bar-chart-component.d.ts +24 -0
- package/dist/charts/bar-chart-component.js +123 -0
- package/dist/charts/bar-chart-component.js.map +1 -0
- package/dist/charts/chart-tooltip.d.ts +26 -0
- package/dist/charts/chart-tooltip.js +69 -0
- package/dist/charts/chart-tooltip.js.map +1 -0
- package/dist/charts/chart.d.ts +64 -0
- package/dist/charts/chart.js +285 -0
- package/dist/charts/chart.js.map +1 -0
- package/dist/charts/donut-chart.d.ts +21 -0
- package/dist/charts/donut-chart.js +96 -0
- package/dist/charts/donut-chart.js.map +1 -0
- package/dist/charts/index.d.ts +11 -0
- package/dist/charts/index.js +10 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/pipeline-overview.d.ts +76 -0
- package/dist/charts/pipeline-overview.js +372 -0
- package/dist/charts/pipeline-overview.js.map +1 -0
- package/dist/charts/sankey-chart.d.ts +52 -0
- package/dist/charts/sankey-chart.js +219 -0
- package/dist/charts/sankey-chart.js.map +1 -0
- package/dist/charts/top-line-metrics.d.ts +26 -0
- package/dist/charts/top-line-metrics.js +224 -0
- package/dist/charts/top-line-metrics.js.map +1 -0
- package/dist/charts/trend-area-chart.d.ts +21 -0
- package/dist/charts/trend-area-chart.js +150 -0
- package/dist/charts/trend-area-chart.js.map +1 -0
- package/dist/charts/volume-analysis-chart.d.ts +19 -0
- package/dist/charts/volume-analysis-chart.js +121 -0
- package/dist/charts/volume-analysis-chart.js.map +1 -0
- package/dist/components/activity-detail.d.ts +38 -0
- package/dist/components/activity-detail.js +163 -0
- package/dist/components/activity-detail.js.map +1 -0
- package/dist/components/activity-log.d.ts +21 -0
- package/dist/components/activity-log.js +61 -0
- package/dist/components/activity-log.js.map +1 -0
- package/dist/components/agent-popover.d.ts +71 -0
- package/dist/components/agent-popover.js +282 -0
- package/dist/components/agent-popover.js.map +1 -0
- package/dist/components/agent-widget.d.ts +24 -0
- package/dist/components/agent-widget.js +117 -0
- package/dist/components/agent-widget.js.map +1 -0
- package/dist/components/avatar.d.ts +13 -0
- package/dist/components/avatar.js +140 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +12 -0
- package/dist/components/badge.js +75 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +13 -0
- package/dist/components/button.js +83 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.d.ts +11 -0
- package/dist/components/card.js +119 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/contact-list.d.ts +34 -0
- package/dist/components/contact-list.js +84 -0
- package/dist/components/contact-list.js.map +1 -0
- package/dist/components/dashboard-cards.d.ts +10 -0
- package/dist/components/dashboard-cards.js +164 -0
- package/dist/components/dashboard-cards.js.map +1 -0
- package/dist/components/data-table-display.d.ts +19 -0
- package/dist/components/data-table-display.js +109 -0
- package/dist/components/data-table-display.js.map +1 -0
- package/dist/components/data-table-filter.d.ts +18 -0
- package/dist/components/data-table-filter.js +107 -0
- package/dist/components/data-table-filter.js.map +1 -0
- package/dist/components/data-table-quick-views.d.ts +13 -0
- package/dist/components/data-table-quick-views.js +90 -0
- package/dist/components/data-table-quick-views.js.map +1 -0
- package/dist/components/data-table-toolbar.d.ts +18 -0
- package/dist/components/data-table-toolbar.js +45 -0
- package/dist/components/data-table-toolbar.js.map +1 -0
- package/dist/components/data-table.d.ts +39 -0
- package/dist/components/data-table.js +821 -0
- package/dist/components/data-table.js.map +1 -0
- package/dist/components/detail-view.d.ts +44 -0
- package/dist/components/detail-view.js +165 -0
- package/dist/components/detail-view.js.map +1 -0
- package/dist/components/dialog.d.ts +19 -0
- package/dist/components/dialog.js +188 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +27 -0
- package/dist/components/dropdown-menu.js +279 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/entity-panel.d.ts +69 -0
- package/dist/components/entity-panel.js +584 -0
- package/dist/components/entity-panel.js.map +1 -0
- package/dist/components/inbox-row.d.ts +27 -0
- package/dist/components/inbox-row.js +139 -0
- package/dist/components/inbox-row.js.map +1 -0
- package/dist/components/inbox-toolbar.d.ts +21 -0
- package/dist/components/inbox-toolbar.js +203 -0
- package/dist/components/inbox-toolbar.js.map +1 -0
- package/dist/components/input.d.ts +5 -0
- package/dist/components/input.js +50 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/insights-filter-bar.d.ts +21 -0
- package/dist/components/insights-filter-bar.js +99 -0
- package/dist/components/insights-filter-bar.js.map +1 -0
- package/dist/components/item-list-display.d.ts +22 -0
- package/dist/components/item-list-display.js +240 -0
- package/dist/components/item-list-display.js.map +1 -0
- package/dist/components/item-list-filter.d.ts +16 -0
- package/dist/components/item-list-filter.js +87 -0
- package/dist/components/item-list-filter.js.map +1 -0
- package/dist/components/item-list-toolbar.d.ts +25 -0
- package/dist/components/item-list-toolbar.js +79 -0
- package/dist/components/item-list-toolbar.js.map +1 -0
- package/dist/components/item-list.d.ts +20 -0
- package/dist/components/item-list.js +702 -0
- package/dist/components/item-list.js.map +1 -0
- package/dist/components/label.d.ts +6 -0
- package/dist/components/label.js +55 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/message.d.ts +23 -0
- package/dist/components/message.js +117 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/metric-card.d.ts +25 -0
- package/dist/components/metric-card.js +107 -0
- package/dist/components/metric-card.js.map +1 -0
- package/dist/components/performance-metrics-table.d.ts +38 -0
- package/dist/components/performance-metrics-table.js +342 -0
- package/dist/components/performance-metrics-table.js.map +1 -0
- package/dist/components/preview-list.d.ts +14 -0
- package/dist/components/preview-list.js +83 -0
- package/dist/components/preview-list.js.map +1 -0
- package/dist/components/progress.d.ts +6 -0
- package/dist/components/progress.js +69 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/quick-action-chat-area.d.ts +24 -0
- package/dist/components/quick-action-chat-area.js +178 -0
- package/dist/components/quick-action-chat-area.js.map +1 -0
- package/dist/components/quick-action-modal.d.ts +30 -0
- package/dist/components/quick-action-modal.js +288 -0
- package/dist/components/quick-action-modal.js.map +1 -0
- package/dist/components/quick-action-sidebar-nav.d.ts +51 -0
- package/dist/components/quick-action-sidebar-nav.js +528 -0
- package/dist/components/quick-action-sidebar-nav.js.map +1 -0
- package/dist/components/recommended-actions-section.d.ts +23 -0
- package/dist/components/recommended-actions-section.js +215 -0
- package/dist/components/recommended-actions-section.js.map +1 -0
- package/dist/components/report-card.d.ts +26 -0
- package/dist/components/report-card.js +69 -0
- package/dist/components/report-card.js.map +1 -0
- package/dist/components/score-analysis-modal.d.ts +26 -0
- package/dist/components/score-analysis-modal.js +141 -0
- package/dist/components/score-analysis-modal.js.map +1 -0
- package/dist/components/score-breakdown.d.ts +17 -0
- package/dist/components/score-breakdown.js +162 -0
- package/dist/components/score-breakdown.js.map +1 -0
- package/dist/components/score-feedback.d.ts +40 -0
- package/dist/components/score-feedback.js +209 -0
- package/dist/components/score-feedback.js.map +1 -0
- package/dist/components/score-ring.d.ts +14 -0
- package/dist/components/score-ring.js +79 -0
- package/dist/components/score-ring.js.map +1 -0
- package/dist/components/scroll-area.d.ts +7 -0
- package/dist/components/scroll-area.js +101 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +17 -0
- package/dist/components/select.js +228 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +6 -0
- package/dist/components/separator.js +61 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +16 -0
- package/dist/components/sheet.js +168 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +73 -0
- package/dist/components/sidebar.js +723 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/signal-feedback-inline.d.ts +51 -0
- package/dist/components/signal-feedback-inline.js +548 -0
- package/dist/components/signal-feedback-inline.js.map +1 -0
- package/dist/components/simple-data-table.d.ts +15 -0
- package/dist/components/simple-data-table.js +91 -0
- package/dist/components/simple-data-table.js.map +1 -0
- package/dist/components/skeleton.d.ts +5 -0
- package/dist/components/skeleton.js +44 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/status-badge.d.ts +10 -0
- package/dist/components/status-badge.js +82 -0
- package/dist/components/status-badge.js.map +1 -0
- package/dist/components/styled-bar-list.d.ts +20 -0
- package/dist/components/styled-bar-list.js +59 -0
- package/dist/components/styled-bar-list.js.map +1 -0
- package/dist/components/suggested-actions.d.ts +110 -0
- package/dist/components/suggested-actions.js +1538 -0
- package/dist/components/suggested-actions.js.map +1 -0
- package/dist/components/table.d.ts +12 -0
- package/dist/components/table.js +147 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +14 -0
- package/dist/components/tabs.js +129 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +5 -0
- package/dist/components/textarea.js +47 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/timeline-activity.d.ts +34 -0
- package/dist/components/timeline-activity.js +181 -0
- package/dist/components/timeline-activity.js.map +1 -0
- package/dist/components/tooltip.d.ts +9 -0
- package/dist/components/tooltip.js +93 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/view-mode-toggle.d.ts +16 -0
- package/dist/components/view-mode-toggle.js +24 -0
- package/dist/components/view-mode-toggle.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +21 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/index.d.ts +68 -1878
- package/dist/index.js +69 -10918
- package/dist/index.js.map +1 -1
- package/dist/lib/icons.d.ts +18 -0
- package/dist/lib/icons.js +21 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/prototype/index.d.ts +20 -0
- package/dist/prototype/index.js +8 -0
- package/dist/prototype/index.js.map +1 -0
- package/dist/prototype/prototype-accounts-view.d.ts +22 -0
- package/dist/prototype/prototype-accounts-view.js +70 -0
- package/dist/prototype/prototype-accounts-view.js.map +1 -0
- package/dist/prototype/prototype-admin-view.d.ts +21 -0
- package/dist/prototype/prototype-admin-view.js +53 -0
- package/dist/prototype/prototype-admin-view.js.map +1 -0
- package/dist/prototype/prototype-config.d.ts +226 -0
- package/dist/prototype/prototype-config.js +1 -0
- package/dist/prototype/prototype-config.js.map +1 -0
- package/dist/prototype/prototype-inbox-view.d.ts +48 -0
- package/dist/prototype/prototype-inbox-view.js +701 -0
- package/dist/prototype/prototype-inbox-view.js.map +1 -0
- package/dist/prototype/prototype-insights-view.d.ts +23 -0
- package/dist/prototype/prototype-insights-view.js +335 -0
- package/dist/prototype/prototype-insights-view.js.map +1 -0
- package/dist/prototype/prototype-shell.d.ts +40 -0
- package/dist/prototype/prototype-shell.js +190 -0
- package/dist/prototype/prototype-shell.js.map +1 -0
- package/dist/prototype/prototype-work-queue-view.d.ts +8 -0
- package/dist/prototype/prototype-work-queue-view.js +17 -0
- package/dist/prototype/prototype-work-queue-view.js.map +1 -0
- package/dist/three/agent-orb.d.ts +39 -0
- package/dist/three/agent-orb.js +500 -0
- package/dist/three/agent-orb.js.map +1 -0
- package/dist/three/index.d.ts +2 -0
- package/dist/three/index.js +2 -0
- package/dist/three/index.js.map +1 -0
- package/package.json +98 -17
- package/src/charts/bar-chart-component.tsx +150 -0
- package/src/charts/chart-tooltip.tsx +86 -0
- package/src/charts/chart.tsx +371 -0
- package/src/charts/donut-chart.tsx +112 -0
- package/src/charts/index.ts +13 -0
- package/src/charts/pipeline-overview.tsx +476 -0
- package/src/charts/sankey-chart.tsx +290 -0
- package/src/charts/top-line-metrics.tsx +261 -0
- package/src/charts/trend-area-chart.tsx +150 -0
- package/src/charts/volume-analysis-chart.tsx +124 -0
- package/src/components/activity-detail.tsx +233 -0
- package/src/components/activity-log.tsx +89 -0
- package/src/components/agent-popover.tsx +373 -0
- package/src/components/agent-widget.tsx +163 -0
- package/src/components/avatar.tsx +109 -0
- package/src/components/badge.tsx +48 -0
- package/src/components/button.tsx +59 -0
- package/src/components/card.tsx +92 -0
- package/src/components/contact-list.tsx +121 -0
- package/src/components/dashboard-cards.tsx +170 -0
- package/src/components/data-table-display.tsx +139 -0
- package/src/components/data-table-filter.tsx +138 -0
- package/src/components/data-table-quick-views.tsx +103 -0
- package/src/components/data-table-toolbar.tsx +56 -0
- package/src/components/data-table.tsx +915 -0
- package/src/components/detail-view.tsx +237 -0
- package/src/components/dialog.tsx +158 -0
- package/src/components/dropdown-menu.tsx +257 -0
- package/src/components/entity-panel.tsx +767 -0
- package/src/components/inbox-row.tsx +132 -0
- package/src/components/inbox-toolbar.tsx +213 -0
- package/src/components/input.tsx +21 -0
- package/src/components/insights-filter-bar.tsx +132 -0
- package/src/components/item-list-display.tsx +278 -0
- package/src/components/item-list-filter.tsx +118 -0
- package/src/components/item-list-toolbar.tsx +97 -0
- package/src/components/item-list.tsx +843 -0
- package/src/components/label.tsx +24 -0
- package/src/components/message.tsx +83 -0
- package/src/components/metric-card.tsx +178 -0
- package/src/components/performance-metrics-table.tsx +442 -0
- package/src/components/preview-list.tsx +62 -0
- package/src/components/progress.tsx +31 -0
- package/src/components/quick-action-chat-area.tsx +156 -0
- package/src/components/quick-action-modal.tsx +331 -0
- package/src/components/quick-action-sidebar-nav.tsx +592 -0
- package/src/components/recommended-actions-section.tsx +258 -0
- package/src/components/report-card.tsx +106 -0
- package/src/components/score-analysis-modal.tsx +172 -0
- package/src/components/score-breakdown.tsx +179 -0
- package/src/components/score-feedback.tsx +288 -0
- package/src/components/score-ring.tsx +87 -0
- package/src/components/scroll-area.tsx +58 -0
- package/src/components/select.tsx +190 -0
- package/src/components/separator.tsx +28 -0
- package/src/components/sheet.tsx +143 -0
- package/src/components/sidebar.tsx +726 -0
- package/src/components/signal-feedback-inline.tsx +591 -0
- package/src/components/simple-data-table.tsx +124 -0
- package/src/components/skeleton.tsx +15 -0
- package/src/components/status-badge.tsx +63 -0
- package/src/components/styled-bar-list.tsx +70 -0
- package/src/components/suggested-actions.tsx +1985 -0
- package/src/components/table.tsx +116 -0
- package/src/components/tabs.tsx +91 -0
- package/src/components/textarea.tsx +18 -0
- package/src/components/timeline-activity.tsx +234 -0
- package/src/components/tooltip.tsx +57 -0
- package/src/components/view-mode-toggle.tsx +39 -0
- package/src/hooks/use-mobile.ts +21 -0
- package/src/index.ts +77 -0
- package/src/lib/icons.ts +18 -0
- package/src/lib/utils.ts +6 -0
- package/src/prototype/index.ts +11 -0
- package/src/prototype/prototype-accounts-view.tsx +112 -0
- package/src/prototype/prototype-admin-view.tsx +67 -0
- package/src/prototype/prototype-config.ts +243 -0
- package/src/prototype/prototype-inbox-view.tsx +810 -0
- package/src/prototype/prototype-insights-view.tsx +379 -0
- package/src/prototype/prototype-shell.tsx +219 -0
- package/src/prototype/prototype-work-queue-view.tsx +30 -0
- package/src/styles/globals.css +299 -0
- package/src/three/agent-orb.tsx +557 -0
- package/src/three/index.ts +5 -0
- package/src/types/r3f.d.ts +8 -0
|
@@ -0,0 +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\">·</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'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\">· 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"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { InsightsViewConfig } from './prototype-config.js';
|
|
3
|
+
import '../components/quick-action-sidebar-nav.js';
|
|
4
|
+
import '../components/quick-action-modal.js';
|
|
5
|
+
import '../components/score-breakdown.js';
|
|
6
|
+
import '../components/suggested-actions.js';
|
|
7
|
+
import '../components/detail-view.js';
|
|
8
|
+
import '../components/inbox-toolbar.js';
|
|
9
|
+
import '../components/data-table-filter.js';
|
|
10
|
+
import '../components/data-table.js';
|
|
11
|
+
import '../components/metric-card.js';
|
|
12
|
+
import '../charts/pipeline-overview.js';
|
|
13
|
+
import '../components/timeline-activity.js';
|
|
14
|
+
import 'lucide-react';
|
|
15
|
+
|
|
16
|
+
interface PrototypeInsightsViewProps extends InsightsViewConfig {
|
|
17
|
+
assistantName?: string;
|
|
18
|
+
headerActions?: React.ReactNode;
|
|
19
|
+
onNavigateToInbox?: () => void;
|
|
20
|
+
}
|
|
21
|
+
declare function PrototypeInsightsView({ tabs, coaching, metrics, expandedMetrics, dashboardCards, analytics, assistantName, headerActions, onNavigateToInbox, customTabs, }: PrototypeInsightsViewProps): React.JSX.Element;
|
|
22
|
+
|
|
23
|
+
export { PrototypeInsightsView, type PrototypeInsightsViewProps };
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
"use client";
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
21
|
+
import * as React from "react";
|
|
22
|
+
import {
|
|
23
|
+
BarChart2,
|
|
24
|
+
TrendingUp,
|
|
25
|
+
ThumbsUp,
|
|
26
|
+
ThumbsDown,
|
|
27
|
+
X,
|
|
28
|
+
MessageCircle
|
|
29
|
+
} from "lucide-react";
|
|
30
|
+
import { Button } from "../components/button.js";
|
|
31
|
+
import { Input } from "../components/input.js";
|
|
32
|
+
import { MetricCard } from "../components/metric-card.js";
|
|
33
|
+
import {
|
|
34
|
+
TopTasksCard,
|
|
35
|
+
UpcomingMeetingsCard,
|
|
36
|
+
RecentlyCompletedCard,
|
|
37
|
+
CheckInsCard
|
|
38
|
+
} from "../components/dashboard-cards.js";
|
|
39
|
+
import { PipelineOverview } from "../charts/pipeline-overview.js";
|
|
40
|
+
import { VolumeAnalysisChart } from "../charts/volume-analysis-chart.js";
|
|
41
|
+
import { DonutChart } from "../charts/donut-chart.js";
|
|
42
|
+
import { TrendAreaChart } from "../charts/trend-area-chart.js";
|
|
43
|
+
import { BarChartComponent } from "../charts/bar-chart-component.js";
|
|
44
|
+
import { StyledBarList } from "../components/styled-bar-list.js";
|
|
45
|
+
import { ReportCard } from "../components/report-card.js";
|
|
46
|
+
const DEFAULT_METRICS = [
|
|
47
|
+
{
|
|
48
|
+
title: "Referrals at Risk",
|
|
49
|
+
value: 28,
|
|
50
|
+
change: { value: "2 vs last week", direction: "up", isGood: false },
|
|
51
|
+
showExternalLink: true,
|
|
52
|
+
showInfo: true,
|
|
53
|
+
dataPoints: [
|
|
54
|
+
{ label: "No Contact", value: 6, color: "#166534" },
|
|
55
|
+
{ label: "Stalled", value: 4, color: "#22c55e" },
|
|
56
|
+
{ label: "Needs Attn", value: 8, color: "#6ee7b7" },
|
|
57
|
+
{ label: "Auth Delay", value: 5, color: "#ccfbf1" },
|
|
58
|
+
{ label: "DCS Hold", value: 3, color: "#99f6e4" },
|
|
59
|
+
{ label: "Expired Referral", value: 2, color: "#f1f5f9" }
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
title: "Dropped from Pipeline",
|
|
64
|
+
value: 47,
|
|
65
|
+
change: { value: "12 vs last week", direction: "down", isGood: true },
|
|
66
|
+
showExternalLink: true,
|
|
67
|
+
showInfo: true,
|
|
68
|
+
dataPoints: [
|
|
69
|
+
{ label: "No Contact", value: 12, color: "#166534" },
|
|
70
|
+
{ label: "Ins. Denied", value: 15, color: "#22c55e" },
|
|
71
|
+
{ label: "Refused", value: 6, color: "#6ee7b7" },
|
|
72
|
+
{ label: "Intake Stalled", value: 8, color: "#ccfbf1" },
|
|
73
|
+
{ label: "Other", value: 6, color: "#f1f5f9" }
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
title: "Time to Schedule",
|
|
78
|
+
value: "4.2 days",
|
|
79
|
+
subtitle: "median, referrals \u2192 scheduled",
|
|
80
|
+
change: { value: "0.8d vs last week", direction: "down", isGood: true },
|
|
81
|
+
footerText: "Slowest stage: Contact \u2192 Intake (1.5d)",
|
|
82
|
+
showInfo: true
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
title: "Conversion Rate",
|
|
86
|
+
value: "53%",
|
|
87
|
+
subtitle: "referrals \u2192 scheduled",
|
|
88
|
+
change: { value: "3% vs last week", direction: "up", isGood: true },
|
|
89
|
+
footerText: "Largest drop-off: No Contact (22%)",
|
|
90
|
+
showInfo: true
|
|
91
|
+
}
|
|
92
|
+
];
|
|
93
|
+
const DEFAULT_EXPANDED_METRICS = [
|
|
94
|
+
{
|
|
95
|
+
title: "Avg Handle Time",
|
|
96
|
+
value: "1.2",
|
|
97
|
+
unit: "days",
|
|
98
|
+
change: { value: "0.3d vs last week", direction: "down", isGood: true },
|
|
99
|
+
footerText: "Fastest stage: Verification (0.2d)",
|
|
100
|
+
showInfo: true
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
title: "Conversion Rate",
|
|
104
|
+
value: "78%",
|
|
105
|
+
change: { value: "2% vs last week", direction: "up", isGood: true },
|
|
106
|
+
footerText: "Top source: Internal Referrals (85%)",
|
|
107
|
+
showInfo: true
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
title: "Pending Intakes",
|
|
111
|
+
value: "124",
|
|
112
|
+
change: { value: "15 vs last week", direction: "up", isGood: false },
|
|
113
|
+
footerText: "Requires immediate attention: 32",
|
|
114
|
+
showInfo: true
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
title: "Patient Satisfaction",
|
|
118
|
+
value: "4.8",
|
|
119
|
+
unit: "/ 5",
|
|
120
|
+
change: { value: "0.1 vs last month", direction: "up", isGood: true },
|
|
121
|
+
footerText: "Based on 450 recent surveys",
|
|
122
|
+
showInfo: true
|
|
123
|
+
}
|
|
124
|
+
];
|
|
125
|
+
function PrototypeInsightsView({
|
|
126
|
+
tabs,
|
|
127
|
+
coaching,
|
|
128
|
+
metrics,
|
|
129
|
+
expandedMetrics,
|
|
130
|
+
dashboardCards,
|
|
131
|
+
analytics,
|
|
132
|
+
assistantName,
|
|
133
|
+
headerActions,
|
|
134
|
+
onNavigateToInbox,
|
|
135
|
+
customTabs
|
|
136
|
+
}) {
|
|
137
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
138
|
+
const showOverview = (tabs == null ? void 0 : tabs.overview) !== false;
|
|
139
|
+
const showAnalytics = (tabs == null ? void 0 : tabs.analytics) !== false;
|
|
140
|
+
const [insightsTab, setInsightsTab] = React.useState(
|
|
141
|
+
showOverview ? "overview" : showAnalytics ? "analytics" : (_b = (_a = customTabs == null ? void 0 : customTabs[0]) == null ? void 0 : _a.id) != null ? _b : "overview"
|
|
142
|
+
);
|
|
143
|
+
const allTabs = [];
|
|
144
|
+
if (showOverview) allTabs.push({ id: "overview", label: "Overview", icon: BarChart2 });
|
|
145
|
+
if (showAnalytics) allTabs.push({ id: "analytics", label: "Analytics", icon: TrendingUp });
|
|
146
|
+
if (customTabs) allTabs.push(...customTabs);
|
|
147
|
+
const [showAllMetrics, setShowAllMetrics] = React.useState(false);
|
|
148
|
+
const [showCoaching, setShowCoaching] = React.useState((coaching == null ? void 0 : coaching.enabled) !== false);
|
|
149
|
+
const resolvedMetrics = metrics != null ? metrics : DEFAULT_METRICS;
|
|
150
|
+
const resolvedExpandedMetrics = expandedMetrics != null ? expandedMetrics : DEFAULT_EXPANDED_METRICS;
|
|
151
|
+
const cards = {
|
|
152
|
+
topTasks: (dashboardCards == null ? void 0 : dashboardCards.topTasks) !== false,
|
|
153
|
+
upcomingMeetings: (dashboardCards == null ? void 0 : dashboardCards.upcomingMeetings) !== false,
|
|
154
|
+
recentlyCompleted: (dashboardCards == null ? void 0 : dashboardCards.recentlyCompleted) !== false,
|
|
155
|
+
checkIns: (dashboardCards == null ? void 0 : dashboardCards.checkIns) !== false
|
|
156
|
+
};
|
|
157
|
+
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-7xl space-y-5 p-6 md:p-8", children: [
|
|
158
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
159
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
160
|
+
/* @__PURE__ */ jsx("h2", { className: "mb-1 text-xl font-bold tracking-tight text-foreground", children: "Insights & Overview" }),
|
|
161
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Monitor your key performance indicators and daily tasks." })
|
|
162
|
+
] }),
|
|
163
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
164
|
+
assistantName && /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-8 gap-2 text-xs font-semibold rounded-full px-4 border-foreground text-foreground hover:bg-muted/50", children: [
|
|
165
|
+
/* @__PURE__ */ jsx(MessageCircle, { className: "w-3.5 h-3.5" }),
|
|
166
|
+
"Talk to ",
|
|
167
|
+
assistantName
|
|
168
|
+
] }),
|
|
169
|
+
headerActions
|
|
170
|
+
] })
|
|
171
|
+
] }),
|
|
172
|
+
allTabs.length >= 2 && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1 border-b border-border", children: allTabs.map((tab) => /* @__PURE__ */ jsxs(
|
|
173
|
+
"button",
|
|
174
|
+
{
|
|
175
|
+
type: "button",
|
|
176
|
+
onClick: () => setInsightsTab(tab.id),
|
|
177
|
+
className: `relative px-4 py-2 text-sm font-medium transition-colors ${insightsTab === tab.id ? "text-foreground" : "text-muted-foreground hover:text-foreground"}`,
|
|
178
|
+
children: [
|
|
179
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
|
|
180
|
+
tab.icon && /* @__PURE__ */ jsx(tab.icon, { className: "h-3.5 w-3.5" }),
|
|
181
|
+
tab.label
|
|
182
|
+
] }),
|
|
183
|
+
insightsTab === tab.id && /* @__PURE__ */ jsx("span", { className: "absolute bottom-0 left-0 right-0 h-0.5 bg-foreground rounded-full" })
|
|
184
|
+
]
|
|
185
|
+
},
|
|
186
|
+
tab.id
|
|
187
|
+
)) }),
|
|
188
|
+
insightsTab === "overview" && showOverview && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
189
|
+
showCoaching && /* @__PURE__ */ jsxs("div", { className: "border border-border rounded-xl p-6 relative bg-card shadow-sm", children: [
|
|
190
|
+
/* @__PURE__ */ jsx(
|
|
191
|
+
Button,
|
|
192
|
+
{
|
|
193
|
+
variant: "ghost",
|
|
194
|
+
size: "icon",
|
|
195
|
+
className: "absolute top-4 right-4 h-6 w-6 text-muted-foreground hover:text-foreground",
|
|
196
|
+
onClick: () => setShowCoaching(false),
|
|
197
|
+
children: /* @__PURE__ */ jsx(X, { className: "w-4 h-4" })
|
|
198
|
+
}
|
|
199
|
+
),
|
|
200
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 mb-2", children: /* @__PURE__ */ jsx("h3", { className: "font-bold text-foreground text-sm", children: "Daily Coaching Insight" }) }),
|
|
201
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed mb-4 max-w-4xl", children: "We analyze your pipeline activity, recent communications, and account health to provide personalized recommendations for your day." }),
|
|
202
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-brand-purple/10 rounded-lg p-5 text-[13px] text-foreground font-medium italic border border-brand-purple/20 relative", children: [
|
|
203
|
+
/* @__PURE__ */ jsx("div", { className: "absolute top-0 left-0 w-1 h-full bg-brand-purple rounded-l-lg" }),
|
|
204
|
+
(_c = coaching == null ? void 0 : coaching.message) != null ? _c : "\u201CGreat job catching the churn risk on Lunchclub yesterday. Today, focus on pushing the stalled intake pipeline. Try making 2 more touches on accounts that have gone dark this week.\u201D"
|
|
205
|
+
] }),
|
|
206
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center gap-2", children: [
|
|
207
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs text-muted-foreground hover:text-foreground shadow-none", children: [
|
|
208
|
+
/* @__PURE__ */ jsx(ThumbsUp, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
209
|
+
" Helpful"
|
|
210
|
+
] }),
|
|
211
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs text-muted-foreground hover:text-foreground shadow-none", children: [
|
|
212
|
+
/* @__PURE__ */ jsx(ThumbsDown, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
213
|
+
" Not Helpful"
|
|
214
|
+
] }),
|
|
215
|
+
/* @__PURE__ */ jsx("div", { className: "relative max-w-sm ml-2 flex-1", children: /* @__PURE__ */ jsx(Input, { placeholder: "Provide additional feedback...", className: "h-7 text-xs shadow-none border-border bg-muted/20 w-full" }) })
|
|
216
|
+
] })
|
|
217
|
+
] }),
|
|
218
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
219
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
220
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-foreground uppercase tracking-wider", children: "Key Metrics" }),
|
|
221
|
+
resolvedExpandedMetrics.length > 0 && /* @__PURE__ */ jsx(
|
|
222
|
+
Button,
|
|
223
|
+
{
|
|
224
|
+
variant: "ghost",
|
|
225
|
+
size: "sm",
|
|
226
|
+
className: "text-xs text-muted-foreground hover:text-foreground",
|
|
227
|
+
onClick: () => setShowAllMetrics(!showAllMetrics),
|
|
228
|
+
children: showAllMetrics ? "Hide additional metrics" : "Show more metrics"
|
|
229
|
+
}
|
|
230
|
+
)
|
|
231
|
+
] }),
|
|
232
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4", children: [
|
|
233
|
+
resolvedMetrics.map((m, i) => /* @__PURE__ */ jsx(MetricCard, __spreadValues({}, m), i)),
|
|
234
|
+
showAllMetrics && resolvedExpandedMetrics.map((m, i) => /* @__PURE__ */ jsx(MetricCard, __spreadValues({}, m), `exp-${i}`))
|
|
235
|
+
] })
|
|
236
|
+
] }),
|
|
237
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-6 mt-8", children: [
|
|
238
|
+
/* @__PURE__ */ jsxs("div", { className: "lg:col-span-2 space-y-6", children: [
|
|
239
|
+
cards.topTasks && /* @__PURE__ */ jsx(TopTasksCard, { onViewAll: onNavigateToInbox }),
|
|
240
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
241
|
+
cards.upcomingMeetings && /* @__PURE__ */ jsx(UpcomingMeetingsCard, {}),
|
|
242
|
+
cards.recentlyCompleted && /* @__PURE__ */ jsx(RecentlyCompletedCard, {})
|
|
243
|
+
] })
|
|
244
|
+
] }),
|
|
245
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-6", children: cards.checkIns && /* @__PURE__ */ jsx(CheckInsCard, {}) })
|
|
246
|
+
] })
|
|
247
|
+
] }),
|
|
248
|
+
insightsTab === "analytics" && showAnalytics && /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
249
|
+
(analytics == null ? void 0 : analytics.pipeline) && /* @__PURE__ */ jsx(
|
|
250
|
+
PipelineOverview,
|
|
251
|
+
{
|
|
252
|
+
stages: analytics.pipeline.stages,
|
|
253
|
+
stageMetrics: analytics.pipeline.stageMetrics,
|
|
254
|
+
stageTimings: analytics.pipeline.stageTimings,
|
|
255
|
+
filterBreakdowns: analytics.pipeline.filterBreakdowns
|
|
256
|
+
}
|
|
257
|
+
),
|
|
258
|
+
(analytics == null ? void 0 : analytics.volumeChart) && /* @__PURE__ */ jsx(
|
|
259
|
+
ReportCard,
|
|
260
|
+
{
|
|
261
|
+
title: "Volume Analysis",
|
|
262
|
+
subtitle: "Referral volume broken down by facility over time",
|
|
263
|
+
filterOptions: analytics.volumeChart.filterOptions,
|
|
264
|
+
selectedFilter: (_e = (_d = analytics.volumeChart.filterOptions) == null ? void 0 : _d[0]) == null ? void 0 : _e.value,
|
|
265
|
+
children: /* @__PURE__ */ jsx(
|
|
266
|
+
VolumeAnalysisChart,
|
|
267
|
+
{
|
|
268
|
+
data: analytics.volumeChart.data,
|
|
269
|
+
dataKeys: analytics.volumeChart.dataKeys
|
|
270
|
+
}
|
|
271
|
+
)
|
|
272
|
+
}
|
|
273
|
+
),
|
|
274
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6", children: [
|
|
275
|
+
(analytics == null ? void 0 : analytics.donutChart) && /* @__PURE__ */ jsx(ReportCard, { title: "Risk Breakdown", subtitle: "Referrals at risk by category", children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(
|
|
276
|
+
DonutChart,
|
|
277
|
+
{
|
|
278
|
+
data: analytics.donutChart.data,
|
|
279
|
+
centerLabel: analytics.donutChart.centerLabel,
|
|
280
|
+
showLegend: true
|
|
281
|
+
}
|
|
282
|
+
) }) }),
|
|
283
|
+
(analytics == null ? void 0 : analytics.trendChart) && /* @__PURE__ */ jsx(
|
|
284
|
+
ReportCard,
|
|
285
|
+
{
|
|
286
|
+
title: "Referrals Over Time",
|
|
287
|
+
subtitle: "Weekly appointment trends",
|
|
288
|
+
toggleOptions: analytics.trendChart.toggleOptions,
|
|
289
|
+
selectedToggle: (_f = analytics.trendChart.toggleOptions) == null ? void 0 : _f[0],
|
|
290
|
+
children: /* @__PURE__ */ jsx(
|
|
291
|
+
TrendAreaChart,
|
|
292
|
+
{
|
|
293
|
+
data: analytics.trendChart.data,
|
|
294
|
+
series: analytics.trendChart.series,
|
|
295
|
+
xAxisKey: (_g = analytics.trendChart.xAxisKey) != null ? _g : "name",
|
|
296
|
+
height: (_h = analytics.trendChart.height) != null ? _h : 220
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
}
|
|
300
|
+
)
|
|
301
|
+
] }),
|
|
302
|
+
((analytics == null ? void 0 : analytics.barChart) || (analytics == null ? void 0 : analytics.barList)) && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-6", children: [
|
|
303
|
+
(analytics == null ? void 0 : analytics.barChart) && /* @__PURE__ */ jsx(
|
|
304
|
+
ReportCard,
|
|
305
|
+
{
|
|
306
|
+
title: "Outreach Activity",
|
|
307
|
+
subtitle: "Daily outreach by channel",
|
|
308
|
+
className: "lg:col-span-2",
|
|
309
|
+
children: /* @__PURE__ */ jsx(
|
|
310
|
+
BarChartComponent,
|
|
311
|
+
{
|
|
312
|
+
data: analytics.barChart.data,
|
|
313
|
+
bars: analytics.barChart.bars
|
|
314
|
+
}
|
|
315
|
+
)
|
|
316
|
+
}
|
|
317
|
+
),
|
|
318
|
+
(analytics == null ? void 0 : analytics.barList) && /* @__PURE__ */ jsx(ReportCard, { title: "Top Activity Types", subtitle: "By completion percentage", children: /* @__PURE__ */ jsx(
|
|
319
|
+
StyledBarList,
|
|
320
|
+
{
|
|
321
|
+
data: analytics.barList.data,
|
|
322
|
+
valueFormatter: analytics.barList.valueFormatter
|
|
323
|
+
}
|
|
324
|
+
) })
|
|
325
|
+
] })
|
|
326
|
+
] }),
|
|
327
|
+
customTabs == null ? void 0 : customTabs.map(
|
|
328
|
+
(tab) => insightsTab === tab.id ? /* @__PURE__ */ jsx("div", { children: tab.content }, tab.id) : null
|
|
329
|
+
)
|
|
330
|
+
] });
|
|
331
|
+
}
|
|
332
|
+
export {
|
|
333
|
+
PrototypeInsightsView
|
|
334
|
+
};
|
|
335
|
+
//# sourceMappingURL=prototype-insights-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/prototype/prototype-insights-view.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n BarChart2,\n TrendingUp,\n ThumbsUp,\n ThumbsDown,\n X,\n MessageCircle,\n} from \"lucide-react\"\n\nimport { Button } from \"../components/button\"\nimport { Input } from \"../components/input\"\nimport { MetricCard } from \"../components/metric-card\"\nimport type { MetricCardProps } from \"../components/metric-card\"\nimport {\n TopTasksCard,\n UpcomingMeetingsCard,\n RecentlyCompletedCard,\n CheckInsCard,\n} from \"../components/dashboard-cards\"\nimport { PipelineOverview } from \"../charts/pipeline-overview\"\nimport { VolumeAnalysisChart } from \"../charts/volume-analysis-chart\"\nimport { DonutChart } from \"../charts/donut-chart\"\nimport { TrendAreaChart } from \"../charts/trend-area-chart\"\nimport { BarChartComponent } from \"../charts/bar-chart-component\"\nimport { StyledBarList } from \"../components/styled-bar-list\"\nimport { ReportCard } from \"../components/report-card\"\nimport type { InsightsViewConfig } from \"./prototype-config\"\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface PrototypeInsightsViewProps extends InsightsViewConfig {\n assistantName?: string\n headerActions?: React.ReactNode\n onNavigateToInbox?: () => void\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_METRICS: MetricCardProps[] = [\n {\n title: \"Referrals at Risk\",\n value: 28,\n change: { value: \"2 vs last week\", direction: \"up\", isGood: false },\n showExternalLink: true,\n showInfo: true,\n dataPoints: [\n { label: \"No Contact\", value: 6, color: \"#166534\" },\n { label: \"Stalled\", value: 4, color: \"#22c55e\" },\n { label: \"Needs Attn\", value: 8, color: \"#6ee7b7\" },\n { label: \"Auth Delay\", value: 5, color: \"#ccfbf1\" },\n { label: \"DCS Hold\", value: 3, color: \"#99f6e4\" },\n { label: \"Expired Referral\", value: 2, color: \"#f1f5f9\" },\n ],\n },\n {\n title: \"Dropped from Pipeline\",\n value: 47,\n change: { value: \"12 vs last week\", direction: \"down\", isGood: true },\n showExternalLink: true,\n showInfo: true,\n dataPoints: [\n { label: \"No Contact\", value: 12, color: \"#166534\" },\n { label: \"Ins. Denied\", value: 15, color: \"#22c55e\" },\n { label: \"Refused\", value: 6, color: \"#6ee7b7\" },\n { label: \"Intake Stalled\", value: 8, color: \"#ccfbf1\" },\n { label: \"Other\", value: 6, color: \"#f1f5f9\" },\n ],\n },\n {\n title: \"Time to Schedule\",\n value: \"4.2 days\",\n subtitle: \"median, referrals → scheduled\",\n change: { value: \"0.8d vs last week\", direction: \"down\", isGood: true },\n footerText: \"Slowest stage: Contact → Intake (1.5d)\",\n showInfo: true,\n },\n {\n title: \"Conversion Rate\",\n value: \"53%\",\n subtitle: \"referrals → scheduled\",\n change: { value: \"3% vs last week\", direction: \"up\", isGood: true },\n footerText: \"Largest drop-off: No Contact (22%)\",\n showInfo: true,\n },\n]\n\nconst DEFAULT_EXPANDED_METRICS: MetricCardProps[] = [\n {\n title: \"Avg Handle Time\",\n value: \"1.2\",\n unit: \"days\",\n change: { value: \"0.3d vs last week\", direction: \"down\", isGood: true },\n footerText: \"Fastest stage: Verification (0.2d)\",\n showInfo: true,\n },\n {\n title: \"Conversion Rate\",\n value: \"78%\",\n change: { value: \"2% vs last week\", direction: \"up\", isGood: true },\n footerText: \"Top source: Internal Referrals (85%)\",\n showInfo: true,\n },\n {\n title: \"Pending Intakes\",\n value: \"124\",\n change: { value: \"15 vs last week\", direction: \"up\", isGood: false },\n footerText: \"Requires immediate attention: 32\",\n showInfo: true,\n },\n {\n title: \"Patient Satisfaction\",\n value: \"4.8\",\n unit: \"/ 5\",\n change: { value: \"0.1 vs last month\", direction: \"up\", isGood: true },\n footerText: \"Based on 450 recent surveys\",\n showInfo: true,\n },\n]\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PrototypeInsightsView({\n tabs,\n coaching,\n metrics,\n expandedMetrics,\n dashboardCards,\n analytics,\n assistantName,\n headerActions,\n onNavigateToInbox,\n customTabs,\n}: PrototypeInsightsViewProps) {\n const showOverview = tabs?.overview !== false\n const showAnalytics = tabs?.analytics !== false\n const [insightsTab, setInsightsTab] = React.useState<string>(\n showOverview ? \"overview\" : showAnalytics ? \"analytics\" : customTabs?.[0]?.id ?? \"overview\",\n )\n\n const allTabs: { id: string; label: string; icon?: React.ComponentType<{ className?: string }> }[] = []\n if (showOverview) allTabs.push({ id: \"overview\", label: \"Overview\", icon: BarChart2 })\n if (showAnalytics) allTabs.push({ id: \"analytics\", label: \"Analytics\", icon: TrendingUp })\n if (customTabs) allTabs.push(...customTabs)\n const [showAllMetrics, setShowAllMetrics] = React.useState(false)\n const [showCoaching, setShowCoaching] = React.useState(coaching?.enabled !== false)\n\n const resolvedMetrics = metrics ?? DEFAULT_METRICS\n const resolvedExpandedMetrics = expandedMetrics ?? DEFAULT_EXPANDED_METRICS\n\n const cards = {\n topTasks: dashboardCards?.topTasks !== false,\n upcomingMeetings: dashboardCards?.upcomingMeetings !== false,\n recentlyCompleted: dashboardCards?.recentlyCompleted !== false,\n checkIns: dashboardCards?.checkIns !== false,\n }\n\n return (\n <div className=\"mx-auto max-w-7xl space-y-5 p-6 md:p-8\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"mb-1 text-xl font-bold tracking-tight text-foreground\">Insights & Overview</h2>\n <p className=\"text-sm text-muted-foreground\">Monitor your key performance indicators and daily tasks.</p>\n </div>\n <div className=\"flex items-center gap-3\">\n {assistantName && (\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 gap-2 text-xs font-semibold rounded-full px-4 border-foreground text-foreground hover:bg-muted/50\">\n <MessageCircle className=\"w-3.5 h-3.5\" />\n Talk to {assistantName}\n </Button>\n )}\n {headerActions}\n </div>\n </div>\n\n {/* Tab switcher */}\n {allTabs.length >= 2 && (\n <div className=\"flex items-center gap-1 border-b border-border\">\n {allTabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setInsightsTab(tab.id)}\n className={`relative px-4 py-2 text-sm font-medium transition-colors ${\n insightsTab === tab.id ? \"text-foreground\" : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n <span className=\"flex items-center gap-2\">\n {tab.icon && <tab.icon className=\"h-3.5 w-3.5\" />}\n {tab.label}\n </span>\n {insightsTab === tab.id && (\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-foreground rounded-full\" />\n )}\n </button>\n ))}\n </div>\n )}\n\n {/* ---- Overview Tab ---- */}\n {insightsTab === \"overview\" && showOverview && (\n <>\n {/* Coaching Banner */}\n {showCoaching && (\n <div className=\"border border-border rounded-xl p-6 relative bg-card shadow-sm\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute top-4 right-4 h-6 w-6 text-muted-foreground hover:text-foreground\"\n onClick={() => setShowCoaching(false)}\n >\n <X className=\"w-4 h-4\" />\n </Button>\n <div className=\"flex items-center gap-2 mb-2\">\n <h3 className=\"font-bold text-foreground text-sm\">Daily Coaching Insight</h3>\n </div>\n <p className=\"text-sm text-muted-foreground leading-relaxed mb-4 max-w-4xl\">\n We analyze your pipeline activity, recent communications, and account health to provide personalized recommendations for your day.\n </p>\n <div className=\"bg-brand-purple/10 rounded-lg p-5 text-[13px] text-foreground font-medium italic border border-brand-purple/20 relative\">\n <div className=\"absolute top-0 left-0 w-1 h-full bg-brand-purple rounded-l-lg\" />\n {coaching?.message ??\n \"\\u201CGreat job catching the churn risk on Lunchclub yesterday. Today, focus on pushing the stalled intake pipeline. Try making 2 more touches on accounts that have gone dark this week.\\u201D\"}\n </div>\n <div className=\"mt-4 flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground hover:text-foreground shadow-none\">\n <ThumbsUp className=\"w-3.5 h-3.5 mr-1.5\" /> Helpful\n </Button>\n <Button variant=\"outline\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground hover:text-foreground shadow-none\">\n <ThumbsDown className=\"w-3.5 h-3.5 mr-1.5\" /> Not Helpful\n </Button>\n <div className=\"relative max-w-sm ml-2 flex-1\">\n <Input placeholder=\"Provide additional feedback...\" className=\"h-7 text-xs shadow-none border-border bg-muted/20 w-full\" />\n </div>\n </div>\n </div>\n )}\n\n {/* Metrics */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold text-foreground uppercase tracking-wider\">Key Metrics</h3>\n {resolvedExpandedMetrics.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => setShowAllMetrics(!showAllMetrics)}\n >\n {showAllMetrics ? \"Hide additional metrics\" : \"Show more metrics\"}\n </Button>\n )}\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\n {resolvedMetrics.map((m, i) => (\n <MetricCard key={i} {...m} />\n ))}\n {showAllMetrics &&\n resolvedExpandedMetrics.map((m, i) => (\n <MetricCard key={`exp-${i}`} {...m} />\n ))}\n </div>\n </div>\n\n {/* Dashboard cards */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6 mt-8\">\n <div className=\"lg:col-span-2 space-y-6\">\n {cards.topTasks && <TopTasksCard onViewAll={onNavigateToInbox} />}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {cards.upcomingMeetings && <UpcomingMeetingsCard />}\n {cards.recentlyCompleted && <RecentlyCompletedCard />}\n </div>\n </div>\n <div className=\"space-y-6\">\n {cards.checkIns && <CheckInsCard />}\n </div>\n </div>\n </>\n )}\n\n {/* ---- Analytics Tab ---- */}\n {insightsTab === \"analytics\" && showAnalytics && (\n <div className=\"space-y-6\">\n {analytics?.pipeline && (\n <PipelineOverview\n stages={analytics.pipeline.stages}\n stageMetrics={analytics.pipeline.stageMetrics}\n stageTimings={analytics.pipeline.stageTimings}\n filterBreakdowns={analytics.pipeline.filterBreakdowns}\n />\n )}\n\n {analytics?.volumeChart && (\n <ReportCard\n title=\"Volume Analysis\"\n subtitle=\"Referral volume broken down by facility over time\"\n filterOptions={analytics.volumeChart.filterOptions}\n selectedFilter={analytics.volumeChart.filterOptions?.[0]?.value}\n >\n <VolumeAnalysisChart\n data={analytics.volumeChart.data}\n dataKeys={analytics.volumeChart.dataKeys}\n />\n </ReportCard>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {analytics?.donutChart && (\n <ReportCard title=\"Risk Breakdown\" subtitle=\"Referrals at risk by category\">\n <div className=\"flex items-center justify-center\">\n <DonutChart\n data={analytics.donutChart.data}\n centerLabel={analytics.donutChart.centerLabel}\n showLegend\n />\n </div>\n </ReportCard>\n )}\n\n {analytics?.trendChart && (\n <ReportCard\n title=\"Referrals Over Time\"\n subtitle=\"Weekly appointment trends\"\n toggleOptions={analytics.trendChart.toggleOptions}\n selectedToggle={analytics.trendChart.toggleOptions?.[0]}\n >\n <TrendAreaChart\n data={analytics.trendChart.data}\n series={analytics.trendChart.series}\n xAxisKey={analytics.trendChart.xAxisKey ?? \"name\"}\n height={analytics.trendChart.height ?? 220}\n />\n </ReportCard>\n )}\n </div>\n\n {(analytics?.barChart || analytics?.barList) && (\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {analytics?.barChart && (\n <ReportCard\n title=\"Outreach Activity\"\n subtitle=\"Daily outreach by channel\"\n className=\"lg:col-span-2\"\n >\n <BarChartComponent\n data={analytics.barChart.data}\n bars={analytics.barChart.bars}\n />\n </ReportCard>\n )}\n {analytics?.barList && (\n <ReportCard title=\"Top Activity Types\" subtitle=\"By completion percentage\">\n <StyledBarList\n data={analytics.barList.data}\n valueFormatter={analytics.barList.valueFormatter}\n />\n </ReportCard>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Custom Tabs */}\n {customTabs?.map(tab =>\n insightsTab === tab.id ? <div key={tab.id}>{tab.content}</div> : null\n )}\n </div>\n )\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { PrototypeConfig } from './prototype-config.js';
|
|
3
|
+
import '../components/quick-action-sidebar-nav.js';
|
|
4
|
+
import '../components/quick-action-modal.js';
|
|
5
|
+
import '../components/score-breakdown.js';
|
|
6
|
+
import '../components/suggested-actions.js';
|
|
7
|
+
import '../components/detail-view.js';
|
|
8
|
+
import '../components/inbox-toolbar.js';
|
|
9
|
+
import '../components/data-table-filter.js';
|
|
10
|
+
import '../components/data-table.js';
|
|
11
|
+
import '../components/metric-card.js';
|
|
12
|
+
import '../charts/pipeline-overview.js';
|
|
13
|
+
import '../components/timeline-activity.js';
|
|
14
|
+
import 'lucide-react';
|
|
15
|
+
|
|
16
|
+
interface PrototypeShellProps {
|
|
17
|
+
config: PrototypeConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Optional ReactNode rendered in the header area of each view.
|
|
20
|
+
* Useful for adding an "Exit Preview" button in the design system showcase.
|
|
21
|
+
*/
|
|
22
|
+
headerActions?: React.ReactNode;
|
|
23
|
+
/**
|
|
24
|
+
* Custom content to render inside the EntityPanel.
|
|
25
|
+
* When provided, overrides the default section-based rendering.
|
|
26
|
+
* Receives `onClose` so children can close the panel.
|
|
27
|
+
*/
|
|
28
|
+
entityPanelChildren?: React.ReactNode | ((ctx: {
|
|
29
|
+
onClose: () => void;
|
|
30
|
+
}) => React.ReactNode);
|
|
31
|
+
/**
|
|
32
|
+
* Fired on every sidebar navigation click (both navigable and non-navigable views).
|
|
33
|
+
* Useful for intercepting clicks on product-specific views like "settings"
|
|
34
|
+
* that live outside the shell.
|
|
35
|
+
*/
|
|
36
|
+
onNavigate?: (viewId: string) => void;
|
|
37
|
+
}
|
|
38
|
+
declare function PrototypeShell({ config, headerActions, entityPanelChildren, onNavigate, }: PrototypeShellProps): React.JSX.Element;
|
|
39
|
+
|
|
40
|
+
export { PrototypeShell, type PrototypeShellProps };
|