@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.
Files changed (336) hide show
  1. package/README.md +14 -4
  2. package/dist/charts/bar-chart-component.d.ts +24 -0
  3. package/dist/charts/bar-chart-component.js +123 -0
  4. package/dist/charts/bar-chart-component.js.map +1 -0
  5. package/dist/charts/chart-tooltip.d.ts +26 -0
  6. package/dist/charts/chart-tooltip.js +69 -0
  7. package/dist/charts/chart-tooltip.js.map +1 -0
  8. package/dist/charts/chart.d.ts +64 -0
  9. package/dist/charts/chart.js +285 -0
  10. package/dist/charts/chart.js.map +1 -0
  11. package/dist/charts/donut-chart.d.ts +21 -0
  12. package/dist/charts/donut-chart.js +96 -0
  13. package/dist/charts/donut-chart.js.map +1 -0
  14. package/dist/charts/index.d.ts +11 -0
  15. package/dist/charts/index.js +10 -0
  16. package/dist/charts/index.js.map +1 -0
  17. package/dist/charts/pipeline-overview.d.ts +76 -0
  18. package/dist/charts/pipeline-overview.js +372 -0
  19. package/dist/charts/pipeline-overview.js.map +1 -0
  20. package/dist/charts/sankey-chart.d.ts +52 -0
  21. package/dist/charts/sankey-chart.js +219 -0
  22. package/dist/charts/sankey-chart.js.map +1 -0
  23. package/dist/charts/top-line-metrics.d.ts +26 -0
  24. package/dist/charts/top-line-metrics.js +224 -0
  25. package/dist/charts/top-line-metrics.js.map +1 -0
  26. package/dist/charts/trend-area-chart.d.ts +21 -0
  27. package/dist/charts/trend-area-chart.js +150 -0
  28. package/dist/charts/trend-area-chart.js.map +1 -0
  29. package/dist/charts/volume-analysis-chart.d.ts +19 -0
  30. package/dist/charts/volume-analysis-chart.js +121 -0
  31. package/dist/charts/volume-analysis-chart.js.map +1 -0
  32. package/dist/components/activity-detail.d.ts +38 -0
  33. package/dist/components/activity-detail.js +163 -0
  34. package/dist/components/activity-detail.js.map +1 -0
  35. package/dist/components/activity-log.d.ts +21 -0
  36. package/dist/components/activity-log.js +61 -0
  37. package/dist/components/activity-log.js.map +1 -0
  38. package/dist/components/agent-popover.d.ts +71 -0
  39. package/dist/components/agent-popover.js +282 -0
  40. package/dist/components/agent-popover.js.map +1 -0
  41. package/dist/components/agent-widget.d.ts +24 -0
  42. package/dist/components/agent-widget.js +117 -0
  43. package/dist/components/agent-widget.js.map +1 -0
  44. package/dist/components/avatar.d.ts +13 -0
  45. package/dist/components/avatar.js +140 -0
  46. package/dist/components/avatar.js.map +1 -0
  47. package/dist/components/badge.d.ts +12 -0
  48. package/dist/components/badge.js +75 -0
  49. package/dist/components/badge.js.map +1 -0
  50. package/dist/components/button.d.ts +13 -0
  51. package/dist/components/button.js +83 -0
  52. package/dist/components/button.js.map +1 -0
  53. package/dist/components/card.d.ts +11 -0
  54. package/dist/components/card.js +119 -0
  55. package/dist/components/card.js.map +1 -0
  56. package/dist/components/contact-list.d.ts +34 -0
  57. package/dist/components/contact-list.js +84 -0
  58. package/dist/components/contact-list.js.map +1 -0
  59. package/dist/components/dashboard-cards.d.ts +10 -0
  60. package/dist/components/dashboard-cards.js +164 -0
  61. package/dist/components/dashboard-cards.js.map +1 -0
  62. package/dist/components/data-table-display.d.ts +19 -0
  63. package/dist/components/data-table-display.js +109 -0
  64. package/dist/components/data-table-display.js.map +1 -0
  65. package/dist/components/data-table-filter.d.ts +18 -0
  66. package/dist/components/data-table-filter.js +107 -0
  67. package/dist/components/data-table-filter.js.map +1 -0
  68. package/dist/components/data-table-quick-views.d.ts +13 -0
  69. package/dist/components/data-table-quick-views.js +90 -0
  70. package/dist/components/data-table-quick-views.js.map +1 -0
  71. package/dist/components/data-table-toolbar.d.ts +18 -0
  72. package/dist/components/data-table-toolbar.js +45 -0
  73. package/dist/components/data-table-toolbar.js.map +1 -0
  74. package/dist/components/data-table.d.ts +39 -0
  75. package/dist/components/data-table.js +821 -0
  76. package/dist/components/data-table.js.map +1 -0
  77. package/dist/components/detail-view.d.ts +44 -0
  78. package/dist/components/detail-view.js +165 -0
  79. package/dist/components/detail-view.js.map +1 -0
  80. package/dist/components/dialog.d.ts +19 -0
  81. package/dist/components/dialog.js +188 -0
  82. package/dist/components/dialog.js.map +1 -0
  83. package/dist/components/dropdown-menu.d.ts +27 -0
  84. package/dist/components/dropdown-menu.js +279 -0
  85. package/dist/components/dropdown-menu.js.map +1 -0
  86. package/dist/components/entity-panel.d.ts +69 -0
  87. package/dist/components/entity-panel.js +584 -0
  88. package/dist/components/entity-panel.js.map +1 -0
  89. package/dist/components/inbox-row.d.ts +27 -0
  90. package/dist/components/inbox-row.js +139 -0
  91. package/dist/components/inbox-row.js.map +1 -0
  92. package/dist/components/inbox-toolbar.d.ts +21 -0
  93. package/dist/components/inbox-toolbar.js +203 -0
  94. package/dist/components/inbox-toolbar.js.map +1 -0
  95. package/dist/components/input.d.ts +5 -0
  96. package/dist/components/input.js +50 -0
  97. package/dist/components/input.js.map +1 -0
  98. package/dist/components/insights-filter-bar.d.ts +21 -0
  99. package/dist/components/insights-filter-bar.js +99 -0
  100. package/dist/components/insights-filter-bar.js.map +1 -0
  101. package/dist/components/item-list-display.d.ts +22 -0
  102. package/dist/components/item-list-display.js +240 -0
  103. package/dist/components/item-list-display.js.map +1 -0
  104. package/dist/components/item-list-filter.d.ts +16 -0
  105. package/dist/components/item-list-filter.js +87 -0
  106. package/dist/components/item-list-filter.js.map +1 -0
  107. package/dist/components/item-list-toolbar.d.ts +25 -0
  108. package/dist/components/item-list-toolbar.js +79 -0
  109. package/dist/components/item-list-toolbar.js.map +1 -0
  110. package/dist/components/item-list.d.ts +20 -0
  111. package/dist/components/item-list.js +702 -0
  112. package/dist/components/item-list.js.map +1 -0
  113. package/dist/components/label.d.ts +6 -0
  114. package/dist/components/label.js +55 -0
  115. package/dist/components/label.js.map +1 -0
  116. package/dist/components/message.d.ts +23 -0
  117. package/dist/components/message.js +117 -0
  118. package/dist/components/message.js.map +1 -0
  119. package/dist/components/metric-card.d.ts +25 -0
  120. package/dist/components/metric-card.js +107 -0
  121. package/dist/components/metric-card.js.map +1 -0
  122. package/dist/components/performance-metrics-table.d.ts +38 -0
  123. package/dist/components/performance-metrics-table.js +342 -0
  124. package/dist/components/performance-metrics-table.js.map +1 -0
  125. package/dist/components/preview-list.d.ts +14 -0
  126. package/dist/components/preview-list.js +83 -0
  127. package/dist/components/preview-list.js.map +1 -0
  128. package/dist/components/progress.d.ts +6 -0
  129. package/dist/components/progress.js +69 -0
  130. package/dist/components/progress.js.map +1 -0
  131. package/dist/components/quick-action-chat-area.d.ts +24 -0
  132. package/dist/components/quick-action-chat-area.js +178 -0
  133. package/dist/components/quick-action-chat-area.js.map +1 -0
  134. package/dist/components/quick-action-modal.d.ts +30 -0
  135. package/dist/components/quick-action-modal.js +288 -0
  136. package/dist/components/quick-action-modal.js.map +1 -0
  137. package/dist/components/quick-action-sidebar-nav.d.ts +51 -0
  138. package/dist/components/quick-action-sidebar-nav.js +528 -0
  139. package/dist/components/quick-action-sidebar-nav.js.map +1 -0
  140. package/dist/components/recommended-actions-section.d.ts +23 -0
  141. package/dist/components/recommended-actions-section.js +215 -0
  142. package/dist/components/recommended-actions-section.js.map +1 -0
  143. package/dist/components/report-card.d.ts +26 -0
  144. package/dist/components/report-card.js +69 -0
  145. package/dist/components/report-card.js.map +1 -0
  146. package/dist/components/score-analysis-modal.d.ts +26 -0
  147. package/dist/components/score-analysis-modal.js +141 -0
  148. package/dist/components/score-analysis-modal.js.map +1 -0
  149. package/dist/components/score-breakdown.d.ts +17 -0
  150. package/dist/components/score-breakdown.js +162 -0
  151. package/dist/components/score-breakdown.js.map +1 -0
  152. package/dist/components/score-feedback.d.ts +40 -0
  153. package/dist/components/score-feedback.js +209 -0
  154. package/dist/components/score-feedback.js.map +1 -0
  155. package/dist/components/score-ring.d.ts +14 -0
  156. package/dist/components/score-ring.js +79 -0
  157. package/dist/components/score-ring.js.map +1 -0
  158. package/dist/components/scroll-area.d.ts +7 -0
  159. package/dist/components/scroll-area.js +101 -0
  160. package/dist/components/scroll-area.js.map +1 -0
  161. package/dist/components/select.d.ts +17 -0
  162. package/dist/components/select.js +228 -0
  163. package/dist/components/select.js.map +1 -0
  164. package/dist/components/separator.d.ts +6 -0
  165. package/dist/components/separator.js +61 -0
  166. package/dist/components/separator.js.map +1 -0
  167. package/dist/components/sheet.d.ts +16 -0
  168. package/dist/components/sheet.js +168 -0
  169. package/dist/components/sheet.js.map +1 -0
  170. package/dist/components/sidebar.d.ts +73 -0
  171. package/dist/components/sidebar.js +723 -0
  172. package/dist/components/sidebar.js.map +1 -0
  173. package/dist/components/signal-feedback-inline.d.ts +51 -0
  174. package/dist/components/signal-feedback-inline.js +548 -0
  175. package/dist/components/signal-feedback-inline.js.map +1 -0
  176. package/dist/components/simple-data-table.d.ts +15 -0
  177. package/dist/components/simple-data-table.js +91 -0
  178. package/dist/components/simple-data-table.js.map +1 -0
  179. package/dist/components/skeleton.d.ts +5 -0
  180. package/dist/components/skeleton.js +44 -0
  181. package/dist/components/skeleton.js.map +1 -0
  182. package/dist/components/status-badge.d.ts +10 -0
  183. package/dist/components/status-badge.js +82 -0
  184. package/dist/components/status-badge.js.map +1 -0
  185. package/dist/components/styled-bar-list.d.ts +20 -0
  186. package/dist/components/styled-bar-list.js +59 -0
  187. package/dist/components/styled-bar-list.js.map +1 -0
  188. package/dist/components/suggested-actions.d.ts +110 -0
  189. package/dist/components/suggested-actions.js +1538 -0
  190. package/dist/components/suggested-actions.js.map +1 -0
  191. package/dist/components/table.d.ts +12 -0
  192. package/dist/components/table.js +147 -0
  193. package/dist/components/table.js.map +1 -0
  194. package/dist/components/tabs.d.ts +14 -0
  195. package/dist/components/tabs.js +129 -0
  196. package/dist/components/tabs.js.map +1 -0
  197. package/dist/components/textarea.d.ts +5 -0
  198. package/dist/components/textarea.js +47 -0
  199. package/dist/components/textarea.js.map +1 -0
  200. package/dist/components/timeline-activity.d.ts +34 -0
  201. package/dist/components/timeline-activity.js +181 -0
  202. package/dist/components/timeline-activity.js.map +1 -0
  203. package/dist/components/tooltip.d.ts +9 -0
  204. package/dist/components/tooltip.js +93 -0
  205. package/dist/components/tooltip.js.map +1 -0
  206. package/dist/components/view-mode-toggle.d.ts +16 -0
  207. package/dist/components/view-mode-toggle.js +24 -0
  208. package/dist/components/view-mode-toggle.js.map +1 -0
  209. package/dist/hooks/use-mobile.d.ts +3 -0
  210. package/dist/hooks/use-mobile.js +21 -0
  211. package/dist/hooks/use-mobile.js.map +1 -0
  212. package/dist/index.d.ts +68 -1878
  213. package/dist/index.js +69 -10918
  214. package/dist/index.js.map +1 -1
  215. package/dist/lib/icons.d.ts +18 -0
  216. package/dist/lib/icons.js +21 -0
  217. package/dist/lib/icons.js.map +1 -0
  218. package/dist/lib/utils.d.ts +5 -0
  219. package/dist/lib/utils.js +9 -0
  220. package/dist/lib/utils.js.map +1 -0
  221. package/dist/prototype/index.d.ts +20 -0
  222. package/dist/prototype/index.js +8 -0
  223. package/dist/prototype/index.js.map +1 -0
  224. package/dist/prototype/prototype-accounts-view.d.ts +22 -0
  225. package/dist/prototype/prototype-accounts-view.js +70 -0
  226. package/dist/prototype/prototype-accounts-view.js.map +1 -0
  227. package/dist/prototype/prototype-admin-view.d.ts +21 -0
  228. package/dist/prototype/prototype-admin-view.js +53 -0
  229. package/dist/prototype/prototype-admin-view.js.map +1 -0
  230. package/dist/prototype/prototype-config.d.ts +226 -0
  231. package/dist/prototype/prototype-config.js +1 -0
  232. package/dist/prototype/prototype-config.js.map +1 -0
  233. package/dist/prototype/prototype-inbox-view.d.ts +48 -0
  234. package/dist/prototype/prototype-inbox-view.js +701 -0
  235. package/dist/prototype/prototype-inbox-view.js.map +1 -0
  236. package/dist/prototype/prototype-insights-view.d.ts +23 -0
  237. package/dist/prototype/prototype-insights-view.js +335 -0
  238. package/dist/prototype/prototype-insights-view.js.map +1 -0
  239. package/dist/prototype/prototype-shell.d.ts +40 -0
  240. package/dist/prototype/prototype-shell.js +190 -0
  241. package/dist/prototype/prototype-shell.js.map +1 -0
  242. package/dist/prototype/prototype-work-queue-view.d.ts +8 -0
  243. package/dist/prototype/prototype-work-queue-view.js +17 -0
  244. package/dist/prototype/prototype-work-queue-view.js.map +1 -0
  245. package/dist/three/agent-orb.d.ts +39 -0
  246. package/dist/three/agent-orb.js +500 -0
  247. package/dist/three/agent-orb.js.map +1 -0
  248. package/dist/three/index.d.ts +2 -0
  249. package/dist/three/index.js +2 -0
  250. package/dist/three/index.js.map +1 -0
  251. package/package.json +98 -17
  252. package/src/charts/bar-chart-component.tsx +150 -0
  253. package/src/charts/chart-tooltip.tsx +86 -0
  254. package/src/charts/chart.tsx +371 -0
  255. package/src/charts/donut-chart.tsx +112 -0
  256. package/src/charts/index.ts +13 -0
  257. package/src/charts/pipeline-overview.tsx +476 -0
  258. package/src/charts/sankey-chart.tsx +290 -0
  259. package/src/charts/top-line-metrics.tsx +261 -0
  260. package/src/charts/trend-area-chart.tsx +150 -0
  261. package/src/charts/volume-analysis-chart.tsx +124 -0
  262. package/src/components/activity-detail.tsx +233 -0
  263. package/src/components/activity-log.tsx +89 -0
  264. package/src/components/agent-popover.tsx +373 -0
  265. package/src/components/agent-widget.tsx +163 -0
  266. package/src/components/avatar.tsx +109 -0
  267. package/src/components/badge.tsx +48 -0
  268. package/src/components/button.tsx +59 -0
  269. package/src/components/card.tsx +92 -0
  270. package/src/components/contact-list.tsx +121 -0
  271. package/src/components/dashboard-cards.tsx +170 -0
  272. package/src/components/data-table-display.tsx +139 -0
  273. package/src/components/data-table-filter.tsx +138 -0
  274. package/src/components/data-table-quick-views.tsx +103 -0
  275. package/src/components/data-table-toolbar.tsx +56 -0
  276. package/src/components/data-table.tsx +915 -0
  277. package/src/components/detail-view.tsx +237 -0
  278. package/src/components/dialog.tsx +158 -0
  279. package/src/components/dropdown-menu.tsx +257 -0
  280. package/src/components/entity-panel.tsx +767 -0
  281. package/src/components/inbox-row.tsx +132 -0
  282. package/src/components/inbox-toolbar.tsx +213 -0
  283. package/src/components/input.tsx +21 -0
  284. package/src/components/insights-filter-bar.tsx +132 -0
  285. package/src/components/item-list-display.tsx +278 -0
  286. package/src/components/item-list-filter.tsx +118 -0
  287. package/src/components/item-list-toolbar.tsx +97 -0
  288. package/src/components/item-list.tsx +843 -0
  289. package/src/components/label.tsx +24 -0
  290. package/src/components/message.tsx +83 -0
  291. package/src/components/metric-card.tsx +178 -0
  292. package/src/components/performance-metrics-table.tsx +442 -0
  293. package/src/components/preview-list.tsx +62 -0
  294. package/src/components/progress.tsx +31 -0
  295. package/src/components/quick-action-chat-area.tsx +156 -0
  296. package/src/components/quick-action-modal.tsx +331 -0
  297. package/src/components/quick-action-sidebar-nav.tsx +592 -0
  298. package/src/components/recommended-actions-section.tsx +258 -0
  299. package/src/components/report-card.tsx +106 -0
  300. package/src/components/score-analysis-modal.tsx +172 -0
  301. package/src/components/score-breakdown.tsx +179 -0
  302. package/src/components/score-feedback.tsx +288 -0
  303. package/src/components/score-ring.tsx +87 -0
  304. package/src/components/scroll-area.tsx +58 -0
  305. package/src/components/select.tsx +190 -0
  306. package/src/components/separator.tsx +28 -0
  307. package/src/components/sheet.tsx +143 -0
  308. package/src/components/sidebar.tsx +726 -0
  309. package/src/components/signal-feedback-inline.tsx +591 -0
  310. package/src/components/simple-data-table.tsx +124 -0
  311. package/src/components/skeleton.tsx +15 -0
  312. package/src/components/status-badge.tsx +63 -0
  313. package/src/components/styled-bar-list.tsx +70 -0
  314. package/src/components/suggested-actions.tsx +1985 -0
  315. package/src/components/table.tsx +116 -0
  316. package/src/components/tabs.tsx +91 -0
  317. package/src/components/textarea.tsx +18 -0
  318. package/src/components/timeline-activity.tsx +234 -0
  319. package/src/components/tooltip.tsx +57 -0
  320. package/src/components/view-mode-toggle.tsx +39 -0
  321. package/src/hooks/use-mobile.ts +21 -0
  322. package/src/index.ts +77 -0
  323. package/src/lib/icons.ts +18 -0
  324. package/src/lib/utils.ts +6 -0
  325. package/src/prototype/index.ts +11 -0
  326. package/src/prototype/prototype-accounts-view.tsx +112 -0
  327. package/src/prototype/prototype-admin-view.tsx +67 -0
  328. package/src/prototype/prototype-config.ts +243 -0
  329. package/src/prototype/prototype-inbox-view.tsx +810 -0
  330. package/src/prototype/prototype-insights-view.tsx +379 -0
  331. package/src/prototype/prototype-shell.tsx +219 -0
  332. package/src/prototype/prototype-work-queue-view.tsx +30 -0
  333. package/src/styles/globals.css +299 -0
  334. package/src/three/agent-orb.tsx +557 -0
  335. package/src/three/index.ts +5 -0
  336. package/src/types/r3f.d.ts +8 -0
@@ -0,0 +1,342 @@
1
+ "use client"
2
+
3
+ "use client";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import * as React from "react";
6
+ import {
7
+ AlertTriangle,
8
+ CheckCircle2,
9
+ ChevronDown,
10
+ ChevronLeft,
11
+ ChevronRight
12
+ } from "lucide-react";
13
+ import { cn } from "../lib/utils.js";
14
+ import { Avatar, AvatarFallback } from "./avatar.js";
15
+ import { Button } from "./button.js";
16
+ import {
17
+ DropdownMenu,
18
+ DropdownMenuContent,
19
+ DropdownMenuItem,
20
+ DropdownMenuTrigger
21
+ } from "./dropdown-menu.js";
22
+ import { Input } from "./input.js";
23
+ import { ScrollArea, ScrollBar } from "./scroll-area.js";
24
+ import {
25
+ Table,
26
+ TableBody,
27
+ TableCell,
28
+ TableHead,
29
+ TableHeader,
30
+ TableRow
31
+ } from "./table.js";
32
+ const DEFAULT_ROWS = [
33
+ {
34
+ id: "member-1",
35
+ label: "Jennifer Davis",
36
+ avatarFallback: "JD",
37
+ role: "Senior Coordinator",
38
+ primaryValue: 188,
39
+ primaryTarget: 200,
40
+ ratePercent: 78,
41
+ metricOne: 256,
42
+ metricTwo: "8.5h",
43
+ metricThree: 401,
44
+ metricFour: 42
45
+ },
46
+ {
47
+ id: "member-2",
48
+ label: "Robert Taylor",
49
+ avatarFallback: "RT",
50
+ role: "Coordinator",
51
+ primaryValue: 168,
52
+ primaryTarget: 200,
53
+ ratePercent: 70,
54
+ metricOne: 210,
55
+ metricTwo: "7.4h",
56
+ metricThree: 330,
57
+ metricFour: 36
58
+ },
59
+ {
60
+ id: "member-3",
61
+ label: "Karen Park",
62
+ avatarFallback: "KP",
63
+ role: "Coordinator",
64
+ primaryValue: 165,
65
+ primaryTarget: 200,
66
+ ratePercent: 68,
67
+ metricOne: 195,
68
+ metricTwo: "6.9h",
69
+ metricThree: 298,
70
+ metricFour: 33
71
+ },
72
+ {
73
+ id: "member-4",
74
+ label: "Alex Chen",
75
+ avatarFallback: "AC",
76
+ role: "Junior Coordinator",
77
+ primaryValue: 142,
78
+ primaryTarget: 200,
79
+ ratePercent: 65,
80
+ metricOne: 201,
81
+ metricTwo: "7.2h",
82
+ metricThree: 315,
83
+ metricFour: 29
84
+ },
85
+ {
86
+ id: "member-5",
87
+ label: "Sarah Mitchell",
88
+ avatarFallback: "SM",
89
+ role: "Senior Coordinator",
90
+ primaryValue: 130,
91
+ primaryTarget: 200,
92
+ ratePercent: 76,
93
+ metricOne: 247,
94
+ metricTwo: "8.2h",
95
+ metricThree: 389,
96
+ metricFour: 31
97
+ },
98
+ {
99
+ id: "member-6",
100
+ label: "Mike Rodriguez",
101
+ avatarFallback: "MR",
102
+ role: "Coordinator",
103
+ primaryValue: 115,
104
+ primaryTarget: 200,
105
+ ratePercent: 72,
106
+ metricOne: 218,
107
+ metricTwo: "7.8h",
108
+ metricThree: 342,
109
+ metricFour: 25
110
+ }
111
+ ];
112
+ const DEFAULT_SORT_OPTIONS = [
113
+ { id: "primary-desc", label: "Primary Metric (High to Low)" },
114
+ { id: "primary-asc", label: "Primary Metric (Low to High)" },
115
+ { id: "rate-desc", label: "Rate (High to Low)" },
116
+ { id: "metric-four-desc", label: "Metric Four (High to Low)" }
117
+ ];
118
+ function getProgressStatus(value, target) {
119
+ const percent = value / target * 100;
120
+ if (percent >= 80) {
121
+ return {
122
+ color: "bg-emerald-500",
123
+ textColor: "text-emerald-700",
124
+ icon: /* @__PURE__ */ jsx(CheckCircle2, { className: "h-3.5 w-3.5 text-emerald-600" })
125
+ };
126
+ }
127
+ if (percent >= 65) {
128
+ return {
129
+ color: "bg-amber-500",
130
+ textColor: "text-amber-700",
131
+ icon: /* @__PURE__ */ jsx(AlertTriangle, { className: "h-3.5 w-3.5 text-amber-600" })
132
+ };
133
+ }
134
+ return {
135
+ color: "bg-red-500",
136
+ textColor: "text-red-700",
137
+ icon: /* @__PURE__ */ jsx(AlertTriangle, { className: "h-3.5 w-3.5 text-red-600" })
138
+ };
139
+ }
140
+ function sortRows(rows, sortId) {
141
+ const copy = [...rows];
142
+ switch (sortId) {
143
+ case "primary-asc":
144
+ return copy.sort((a, b) => a.primaryValue - b.primaryValue);
145
+ case "rate-desc":
146
+ return copy.sort((a, b) => b.ratePercent - a.ratePercent);
147
+ case "metric-four-desc":
148
+ return copy.sort((a, b) => b.metricFour - a.metricFour);
149
+ case "primary-desc":
150
+ default:
151
+ return copy.sort((a, b) => b.primaryValue - a.primaryValue);
152
+ }
153
+ }
154
+ function PerformanceMetricsTable({
155
+ title = "Performance Table",
156
+ entityColumnLabel = "Entity",
157
+ primaryMetricColumnLabel = "Primary Goal",
158
+ rateColumnLabel = "Rate",
159
+ metricOneColumnLabel = "Metric One",
160
+ metricTwoColumnLabel = "Metric Two",
161
+ metricThreeColumnLabel = "Metric Three",
162
+ metricFourColumnLabel = "Metric Four",
163
+ viewOptions = ["By Entity"],
164
+ roleOptions = ["All", "Senior Coordinator", "Coordinator", "Junior Coordinator"],
165
+ sortOptions = DEFAULT_SORT_OPTIONS,
166
+ rows = DEFAULT_ROWS,
167
+ pageSize = 6,
168
+ searchPlaceholder = "Search rows..."
169
+ }) {
170
+ var _a, _b, _c, _d, _e, _f;
171
+ const [view, setView] = React.useState((_a = viewOptions[0]) != null ? _a : "By Entity");
172
+ const [sortId, setSortId] = React.useState(
173
+ (_c = (_b = sortOptions[0]) == null ? void 0 : _b.id) != null ? _c : "primary-desc"
174
+ );
175
+ const [roleFilter, setRoleFilter] = React.useState((_d = roleOptions[0]) != null ? _d : "All");
176
+ const [search, setSearch] = React.useState("");
177
+ const [page, setPage] = React.useState(1);
178
+ const filteredRows = React.useMemo(() => {
179
+ const normalized = search.trim().toLowerCase();
180
+ return rows.filter((row) => {
181
+ if (roleFilter !== "All" && row.role !== roleFilter) {
182
+ return false;
183
+ }
184
+ if (!normalized) {
185
+ return true;
186
+ }
187
+ return row.label.toLowerCase().includes(normalized);
188
+ });
189
+ }, [roleFilter, rows, search]);
190
+ const sortedRows = React.useMemo(
191
+ () => sortRows(filteredRows, sortId),
192
+ [filteredRows, sortId]
193
+ );
194
+ const pageCount = Math.max(1, Math.ceil(sortedRows.length / pageSize));
195
+ const start = (page - 1) * pageSize;
196
+ const paginatedRows = sortedRows.slice(start, start + pageSize);
197
+ React.useEffect(() => {
198
+ setPage(1);
199
+ }, [search, roleFilter, sortId, view]);
200
+ React.useEffect(() => {
201
+ setPage((previous) => Math.min(previous, pageCount));
202
+ }, [pageCount]);
203
+ const sortLabel = (_f = (_e = sortOptions.find((option) => option.id === sortId)) == null ? void 0 : _e.label) != null ? _f : "Sort";
204
+ return /* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded-xl border border-border bg-card", children: [
205
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border px-4 py-3", children: [
206
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-foreground", children: title }),
207
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
208
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
209
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-8 text-xs", children: [
210
+ view,
211
+ /* @__PURE__ */ jsx(ChevronDown, { className: "ml-2 h-3.5 w-3.5" })
212
+ ] }) }),
213
+ /* @__PURE__ */ jsx(DropdownMenuContent, { children: viewOptions.map((option) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => setView(option), children: option }, option)) })
214
+ ] }),
215
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
216
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-8 text-xs", children: [
217
+ "Sort: ",
218
+ sortLabel.replace(/\s*\(.+\)/, ""),
219
+ /* @__PURE__ */ jsx(ChevronDown, { className: "ml-2 h-3.5 w-3.5" })
220
+ ] }) }),
221
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", className: "w-56", children: sortOptions.map((option) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => setSortId(option.id), children: option.label }, option.id)) })
222
+ ] }),
223
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
224
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "h-8 text-xs", children: [
225
+ "Role: ",
226
+ roleFilter,
227
+ /* @__PURE__ */ jsx(ChevronDown, { className: "ml-2 h-3.5 w-3.5" })
228
+ ] }) }),
229
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", children: roleOptions.map((option) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => setRoleFilter(option), children: option }, option)) })
230
+ ] }),
231
+ /* @__PURE__ */ jsx(
232
+ Input,
233
+ {
234
+ value: search,
235
+ onChange: (event) => setSearch(event.target.value),
236
+ placeholder: searchPlaceholder,
237
+ className: "h-8 w-48 text-xs"
238
+ }
239
+ )
240
+ ] })
241
+ ] }),
242
+ /* @__PURE__ */ jsxs(ScrollArea, { children: [
243
+ /* @__PURE__ */ jsx("div", { className: "min-w-[1180px]", children: /* @__PURE__ */ jsxs(Table, { children: [
244
+ /* @__PURE__ */ jsx(TableHeader, { className: "bg-muted/30", children: /* @__PURE__ */ jsxs(TableRow, { className: "hover:bg-transparent", children: [
245
+ /* @__PURE__ */ jsx(TableHead, { className: "px-4 py-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: entityColumnLabel }),
246
+ /* @__PURE__ */ jsx(TableHead, { className: "w-[260px] px-4 py-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: primaryMetricColumnLabel }),
247
+ /* @__PURE__ */ jsx(TableHead, { className: "px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: rateColumnLabel }),
248
+ /* @__PURE__ */ jsx(TableHead, { className: "px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: metricOneColumnLabel }),
249
+ /* @__PURE__ */ jsx(TableHead, { className: "px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: metricTwoColumnLabel }),
250
+ /* @__PURE__ */ jsx(TableHead, { className: "px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: metricThreeColumnLabel }),
251
+ /* @__PURE__ */ jsx(TableHead, { className: "px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: metricFourColumnLabel })
252
+ ] }) }),
253
+ /* @__PURE__ */ jsx(TableBody, { children: paginatedRows.map((row) => {
254
+ const percentage = row.primaryValue / row.primaryTarget * 100;
255
+ const progress = getProgressStatus(row.primaryValue, row.primaryTarget);
256
+ return /* @__PURE__ */ jsxs(TableRow, { className: "hover:bg-muted/30", children: [
257
+ /* @__PURE__ */ jsx(TableCell, { className: "px-4 py-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
258
+ /* @__PURE__ */ jsx(Avatar, { className: "h-8 w-8 border border-border", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-emerald-100 text-[11px] font-medium text-emerald-700", children: row.avatarFallback }) }),
259
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-foreground", children: row.label })
260
+ ] }) }),
261
+ /* @__PURE__ */ jsx(TableCell, { className: "px-4 py-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
262
+ /* @__PURE__ */ jsx("span", { className: "shrink-0", children: progress.icon }),
263
+ /* @__PURE__ */ jsxs("div", { className: "w-full max-w-[180px]", children: [
264
+ /* @__PURE__ */ jsxs("div", { className: "mb-1 text-sm font-bold text-foreground", children: [
265
+ row.primaryValue,
266
+ "/",
267
+ row.primaryTarget
268
+ ] }),
269
+ /* @__PURE__ */ jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx(
270
+ "div",
271
+ {
272
+ className: cn("h-full rounded-full", progress.color),
273
+ style: { width: `${Math.min(100, percentage)}%` }
274
+ }
275
+ ) }),
276
+ /* @__PURE__ */ jsxs("div", { className: cn("mt-1 text-xs font-medium", progress.textColor), children: [
277
+ Math.round(percentage),
278
+ "%"
279
+ ] })
280
+ ] })
281
+ ] }) }),
282
+ /* @__PURE__ */ jsxs(TableCell, { className: "px-4 py-3 text-right text-sm font-semibold text-emerald-600", children: [
283
+ row.ratePercent,
284
+ "%"
285
+ ] }),
286
+ /* @__PURE__ */ jsx(TableCell, { className: "px-4 py-3 text-right text-sm font-medium text-foreground", children: row.metricOne }),
287
+ /* @__PURE__ */ jsx(TableCell, { className: "px-4 py-3 text-right text-sm text-muted-foreground", children: row.metricTwo }),
288
+ /* @__PURE__ */ jsx(TableCell, { className: "px-4 py-3 text-right text-sm font-medium text-foreground", children: row.metricThree }),
289
+ /* @__PURE__ */ jsx(TableCell, { className: "px-4 py-3 text-right text-sm font-medium text-foreground", children: row.metricFour })
290
+ ] }, row.id);
291
+ }) })
292
+ ] }) }),
293
+ /* @__PURE__ */ jsx(ScrollBar, { orientation: "horizontal" })
294
+ ] }),
295
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-t border-border bg-muted/20 px-4 py-3", children: [
296
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground", children: [
297
+ "Showing ",
298
+ sortedRows.length === 0 ? 0 : start + 1,
299
+ " to",
300
+ " ",
301
+ Math.min(start + pageSize, sortedRows.length),
302
+ " of ",
303
+ sortedRows.length,
304
+ " rows"
305
+ ] }),
306
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
307
+ /* @__PURE__ */ jsxs(
308
+ Button,
309
+ {
310
+ variant: "outline",
311
+ size: "sm",
312
+ className: "h-7 text-xs",
313
+ disabled: page <= 1,
314
+ onClick: () => setPage((previous) => Math.max(previous - 1, 1)),
315
+ children: [
316
+ /* @__PURE__ */ jsx(ChevronLeft, { className: "mr-1 h-3.5 w-3.5" }),
317
+ "Previous"
318
+ ]
319
+ }
320
+ ),
321
+ /* @__PURE__ */ jsxs(
322
+ Button,
323
+ {
324
+ variant: "outline",
325
+ size: "sm",
326
+ className: "h-7 text-xs",
327
+ disabled: page >= pageCount,
328
+ onClick: () => setPage((previous) => Math.min(previous + 1, pageCount)),
329
+ children: [
330
+ "Next",
331
+ /* @__PURE__ */ jsx(ChevronRight, { className: "ml-1 h-3.5 w-3.5" })
332
+ ]
333
+ }
334
+ )
335
+ ] })
336
+ ] })
337
+ ] });
338
+ }
339
+ export {
340
+ PerformanceMetricsTable
341
+ };
342
+ //# sourceMappingURL=performance-metrics-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/performance-metrics-table.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n AlertTriangle,\n CheckCircle2,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n} from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Avatar, AvatarFallback } from \"./avatar\"\nimport { Button } from \"./button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\nimport { Input } from \"./input\"\nimport { ScrollArea, ScrollBar } from \"./scroll-area\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\"\n\nexport interface PerformanceMetricsTableRow {\n id: string\n label: string\n avatarFallback: string\n role?: string\n primaryValue: number\n primaryTarget: number\n ratePercent: number\n metricOne: number\n metricTwo: string\n metricThree: number\n metricFour: number\n}\n\nexport interface PerformanceMetricsTableSortOption {\n id: \"primary-desc\" | \"primary-asc\" | \"rate-desc\" | \"metric-four-desc\"\n label: string\n}\n\ninterface PerformanceMetricsTableProps {\n title?: string\n entityColumnLabel?: string\n primaryMetricColumnLabel?: string\n rateColumnLabel?: string\n metricOneColumnLabel?: string\n metricTwoColumnLabel?: string\n metricThreeColumnLabel?: string\n metricFourColumnLabel?: string\n viewOptions?: string[]\n roleOptions?: string[]\n sortOptions?: PerformanceMetricsTableSortOption[]\n rows?: PerformanceMetricsTableRow[]\n pageSize?: number\n searchPlaceholder?: string\n}\n\nconst DEFAULT_ROWS: PerformanceMetricsTableRow[] = [\n {\n id: \"member-1\",\n label: \"Jennifer Davis\",\n avatarFallback: \"JD\",\n role: \"Senior Coordinator\",\n primaryValue: 188,\n primaryTarget: 200,\n ratePercent: 78,\n metricOne: 256,\n metricTwo: \"8.5h\",\n metricThree: 401,\n metricFour: 42,\n },\n {\n id: \"member-2\",\n label: \"Robert Taylor\",\n avatarFallback: \"RT\",\n role: \"Coordinator\",\n primaryValue: 168,\n primaryTarget: 200,\n ratePercent: 70,\n metricOne: 210,\n metricTwo: \"7.4h\",\n metricThree: 330,\n metricFour: 36,\n },\n {\n id: \"member-3\",\n label: \"Karen Park\",\n avatarFallback: \"KP\",\n role: \"Coordinator\",\n primaryValue: 165,\n primaryTarget: 200,\n ratePercent: 68,\n metricOne: 195,\n metricTwo: \"6.9h\",\n metricThree: 298,\n metricFour: 33,\n },\n {\n id: \"member-4\",\n label: \"Alex Chen\",\n avatarFallback: \"AC\",\n role: \"Junior Coordinator\",\n primaryValue: 142,\n primaryTarget: 200,\n ratePercent: 65,\n metricOne: 201,\n metricTwo: \"7.2h\",\n metricThree: 315,\n metricFour: 29,\n },\n {\n id: \"member-5\",\n label: \"Sarah Mitchell\",\n avatarFallback: \"SM\",\n role: \"Senior Coordinator\",\n primaryValue: 130,\n primaryTarget: 200,\n ratePercent: 76,\n metricOne: 247,\n metricTwo: \"8.2h\",\n metricThree: 389,\n metricFour: 31,\n },\n {\n id: \"member-6\",\n label: \"Mike Rodriguez\",\n avatarFallback: \"MR\",\n role: \"Coordinator\",\n primaryValue: 115,\n primaryTarget: 200,\n ratePercent: 72,\n metricOne: 218,\n metricTwo: \"7.8h\",\n metricThree: 342,\n metricFour: 25,\n },\n]\n\nconst DEFAULT_SORT_OPTIONS: PerformanceMetricsTableSortOption[] = [\n { id: \"primary-desc\", label: \"Primary Metric (High to Low)\" },\n { id: \"primary-asc\", label: \"Primary Metric (Low to High)\" },\n { id: \"rate-desc\", label: \"Rate (High to Low)\" },\n { id: \"metric-four-desc\", label: \"Metric Four (High to Low)\" },\n]\n\nfunction getProgressStatus(value: number, target: number) {\n const percent = (value / target) * 100\n\n if (percent >= 80) {\n return {\n color: \"bg-emerald-500\",\n textColor: \"text-emerald-700\",\n icon: <CheckCircle2 className=\"h-3.5 w-3.5 text-emerald-600\" />,\n }\n }\n\n if (percent >= 65) {\n return {\n color: \"bg-amber-500\",\n textColor: \"text-amber-700\",\n icon: <AlertTriangle className=\"h-3.5 w-3.5 text-amber-600\" />,\n }\n }\n\n return {\n color: \"bg-red-500\",\n textColor: \"text-red-700\",\n icon: <AlertTriangle className=\"h-3.5 w-3.5 text-red-600\" />,\n }\n}\n\nfunction sortRows(\n rows: PerformanceMetricsTableRow[],\n sortId: PerformanceMetricsTableSortOption[\"id\"]\n) {\n const copy = [...rows]\n switch (sortId) {\n case \"primary-asc\":\n return copy.sort((a, b) => a.primaryValue - b.primaryValue)\n case \"rate-desc\":\n return copy.sort((a, b) => b.ratePercent - a.ratePercent)\n case \"metric-four-desc\":\n return copy.sort((a, b) => b.metricFour - a.metricFour)\n case \"primary-desc\":\n default:\n return copy.sort((a, b) => b.primaryValue - a.primaryValue)\n }\n}\n\nexport function PerformanceMetricsTable({\n title = \"Performance Table\",\n entityColumnLabel = \"Entity\",\n primaryMetricColumnLabel = \"Primary Goal\",\n rateColumnLabel = \"Rate\",\n metricOneColumnLabel = \"Metric One\",\n metricTwoColumnLabel = \"Metric Two\",\n metricThreeColumnLabel = \"Metric Three\",\n metricFourColumnLabel = \"Metric Four\",\n viewOptions = [\"By Entity\"],\n roleOptions = [\"All\", \"Senior Coordinator\", \"Coordinator\", \"Junior Coordinator\"],\n sortOptions = DEFAULT_SORT_OPTIONS,\n rows = DEFAULT_ROWS,\n pageSize = 6,\n searchPlaceholder = \"Search rows...\",\n}: PerformanceMetricsTableProps) {\n const [view, setView] = React.useState(viewOptions[0] ?? \"By Entity\")\n const [sortId, setSortId] =\n React.useState<PerformanceMetricsTableSortOption[\"id\"]>(\n sortOptions[0]?.id ?? \"primary-desc\"\n )\n const [roleFilter, setRoleFilter] = React.useState(roleOptions[0] ?? \"All\")\n const [search, setSearch] = React.useState(\"\")\n const [page, setPage] = React.useState(1)\n\n const filteredRows = React.useMemo(() => {\n const normalized = search.trim().toLowerCase()\n return rows.filter((row) => {\n if (roleFilter !== \"All\" && row.role !== roleFilter) {\n return false\n }\n if (!normalized) {\n return true\n }\n return row.label.toLowerCase().includes(normalized)\n })\n }, [roleFilter, rows, search])\n\n const sortedRows = React.useMemo(\n () => sortRows(filteredRows, sortId),\n [filteredRows, sortId]\n )\n\n const pageCount = Math.max(1, Math.ceil(sortedRows.length / pageSize))\n const start = (page - 1) * pageSize\n const paginatedRows = sortedRows.slice(start, start + pageSize)\n\n React.useEffect(() => {\n setPage(1)\n }, [search, roleFilter, sortId, view])\n\n React.useEffect(() => {\n setPage((previous) => Math.min(previous, pageCount))\n }, [pageCount])\n\n const sortLabel =\n sortOptions.find((option) => option.id === sortId)?.label ?? \"Sort\"\n\n return (\n <div className=\"overflow-hidden rounded-xl border border-border bg-card\">\n <div className=\"flex items-center justify-between border-b border-border px-4 py-3\">\n <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs\">\n {view}\n <ChevronDown className=\"ml-2 h-3.5 w-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {viewOptions.map((option) => (\n <DropdownMenuItem key={option} onClick={() => setView(option)}>\n {option}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs\">\n Sort: {sortLabel.replace(/\\s*\\(.+\\)/, \"\")}\n <ChevronDown className=\"ml-2 h-3.5 w-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n {sortOptions.map((option) => (\n <DropdownMenuItem key={option.id} onClick={() => setSortId(option.id)}>\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs\">\n Role: {roleFilter}\n <ChevronDown className=\"ml-2 h-3.5 w-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {roleOptions.map((option) => (\n <DropdownMenuItem key={option} onClick={() => setRoleFilter(option)}>\n {option}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={searchPlaceholder}\n className=\"h-8 w-48 text-xs\"\n />\n </div>\n </div>\n\n <ScrollArea>\n <div className=\"min-w-[1180px]\">\n <Table>\n <TableHeader className=\"bg-muted/30\">\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className=\"px-4 py-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {entityColumnLabel}\n </TableHead>\n <TableHead className=\"w-[260px] px-4 py-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {primaryMetricColumnLabel}\n </TableHead>\n <TableHead className=\"px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {rateColumnLabel}\n </TableHead>\n <TableHead className=\"px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {metricOneColumnLabel}\n </TableHead>\n <TableHead className=\"px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {metricTwoColumnLabel}\n </TableHead>\n <TableHead className=\"px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {metricThreeColumnLabel}\n </TableHead>\n <TableHead className=\"px-4 py-3 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {metricFourColumnLabel}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {paginatedRows.map((row) => {\n const percentage = (row.primaryValue / row.primaryTarget) * 100\n const progress = getProgressStatus(row.primaryValue, row.primaryTarget)\n\n return (\n <TableRow key={row.id} className=\"hover:bg-muted/30\">\n <TableCell className=\"px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-8 w-8 border border-border\">\n <AvatarFallback className=\"bg-emerald-100 text-[11px] font-medium text-emerald-700\">\n {row.avatarFallback}\n </AvatarFallback>\n </Avatar>\n <span className=\"text-sm font-medium text-foreground\">{row.label}</span>\n </div>\n </TableCell>\n\n <TableCell className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"shrink-0\">{progress.icon}</span>\n <div className=\"w-full max-w-[180px]\">\n <div className=\"mb-1 text-sm font-bold text-foreground\">\n {row.primaryValue}/{row.primaryTarget}\n </div>\n <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full rounded-full\", progress.color)}\n style={{ width: `${Math.min(100, percentage)}%` }}\n />\n </div>\n <div className={cn(\"mt-1 text-xs font-medium\", progress.textColor)}>\n {Math.round(percentage)}%\n </div>\n </div>\n </div>\n </TableCell>\n\n <TableCell className=\"px-4 py-3 text-right text-sm font-semibold text-emerald-600\">\n {row.ratePercent}%\n </TableCell>\n <TableCell className=\"px-4 py-3 text-right text-sm font-medium text-foreground\">\n {row.metricOne}\n </TableCell>\n <TableCell className=\"px-4 py-3 text-right text-sm text-muted-foreground\">\n {row.metricTwo}\n </TableCell>\n <TableCell className=\"px-4 py-3 text-right text-sm font-medium text-foreground\">\n {row.metricThree}\n </TableCell>\n <TableCell className=\"px-4 py-3 text-right text-sm font-medium text-foreground\">\n {row.metricFour}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n <ScrollBar orientation=\"horizontal\" />\n </ScrollArea>\n\n <div className=\"flex items-center justify-between border-t border-border bg-muted/20 px-4 py-3\">\n <span className=\"text-xs text-muted-foreground\">\n Showing {sortedRows.length === 0 ? 0 : start + 1} to{\" \"}\n {Math.min(start + pageSize, sortedRows.length)} of {sortedRows.length} rows\n </span>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n disabled={page <= 1}\n onClick={() => setPage((previous) => Math.max(previous - 1, 1))}\n >\n <ChevronLeft className=\"mr-1 h-3.5 w-3.5\" />\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n disabled={page >= pageCount}\n onClick={() =>\n setPage((previous) => Math.min(previous + 1, pageCount))\n }\n >\n Next\n <ChevronRight className=\"ml-1 h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+
3
+ declare function PreviewList({ children, className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
4
+ interface PreviewListItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
5
+ icon?: React.ReactNode;
6
+ title: React.ReactNode;
7
+ subtitle?: React.ReactNode;
8
+ meta?: React.ReactNode;
9
+ action?: React.ReactNode;
10
+ isHoverable?: boolean;
11
+ }
12
+ declare const PreviewListItem: React.ForwardRefExoticComponent<PreviewListItemProps & React.RefAttributes<HTMLDivElement>>;
13
+
14
+ export { PreviewList, PreviewListItem, type PreviewListItemProps };
@@ -0,0 +1,83 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
32
+ import { jsx, jsxs } from "react/jsx-runtime";
33
+ import * as React from "react";
34
+ import { cn } from "../lib/utils.js";
35
+ function PreviewList(_a) {
36
+ var _b = _a, {
37
+ children,
38
+ className
39
+ } = _b, props = __objRest(_b, [
40
+ "children",
41
+ "className"
42
+ ]);
43
+ const items = React.Children.toArray(children);
44
+ const visibleItems = items.slice(0, 8);
45
+ return /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({ className: cn("flex flex-col", className) }, props), { children: visibleItems }));
46
+ }
47
+ const PreviewListItem = React.forwardRef(
48
+ (_c, ref) => {
49
+ var _d = _c, { className, icon, title, subtitle, meta, action, isHoverable = true } = _d, props = __objRest(_d, ["className", "icon", "title", "subtitle", "meta", "action", "isHoverable"]);
50
+ return /* @__PURE__ */ jsxs(
51
+ "div",
52
+ __spreadProps(__spreadValues({
53
+ ref,
54
+ className: cn(
55
+ "flex items-center justify-between group relative bg-background transition-colors",
56
+ "px-6 h-16 border-b border-border last:border-0",
57
+ isHoverable && "hover:bg-muted/30 cursor-pointer",
58
+ className
59
+ )
60
+ }, props), {
61
+ children: [
62
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 overflow-hidden min-w-0 h-full py-2", children: [
63
+ icon && /* @__PURE__ */ jsx("div", { className: "shrink-0 flex items-center justify-center", children: icon }),
64
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex flex-col justify-center gap-1", children: [
65
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-foreground truncate leading-snug", children: title }),
66
+ subtitle && /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground truncate leading-snug", children: subtitle })
67
+ ] })
68
+ ] }),
69
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 shrink-0 pl-4", children: [
70
+ meta && /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-2", action && "group-hover:opacity-0 transition-opacity"), children: meta }),
71
+ action && /* @__PURE__ */ jsx("div", { className: "absolute right-4 opacity-0 group-hover:opacity-100 transition-opacity flex items-center bg-background/95 backdrop-blur-sm pl-2", children: action })
72
+ ] })
73
+ ]
74
+ })
75
+ );
76
+ }
77
+ );
78
+ PreviewListItem.displayName = "PreviewListItem";
79
+ export {
80
+ PreviewList,
81
+ PreviewListItem
82
+ };
83
+ //# sourceMappingURL=preview-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/preview-list.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"../lib/utils\"\n\nexport function PreviewList({\n children,\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n const items = React.Children.toArray(children)\n const visibleItems = items.slice(0, 8)\n\n return (\n <div className={cn(\"flex flex-col\", className)} {...props}>\n {visibleItems}\n </div>\n )\n}\n\nexport interface PreviewListItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: React.ReactNode\n title: React.ReactNode\n subtitle?: React.ReactNode\n meta?: React.ReactNode // e.g. time, badges on the right\n action?: React.ReactNode // hover action like a \"Join\" button\n isHoverable?: boolean\n}\n\nexport const PreviewListItem = React.forwardRef<HTMLDivElement, PreviewListItemProps>(\n ({ className, icon, title, subtitle, meta, action, isHoverable = true, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex items-center justify-between group relative bg-background transition-colors\",\n \"px-6 h-16 border-b border-border last:border-0\",\n isHoverable && \"hover:bg-muted/30 cursor-pointer\",\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-3 overflow-hidden min-w-0 h-full py-2\">\n {icon && <div className=\"shrink-0 flex items-center justify-center\">{icon}</div>}\n <div className=\"min-w-0 flex flex-col justify-center gap-1\">\n <div className=\"text-sm font-semibold text-foreground truncate leading-snug\">{title}</div>\n {subtitle && <div className=\"text-xs text-muted-foreground truncate leading-snug\">{subtitle}</div>}\n </div>\n </div>\n\n <div className=\"flex items-center gap-4 shrink-0 pl-4\">\n {meta && <div className={cn(\"flex items-center gap-2\", action && \"group-hover:opacity-0 transition-opacity\")}>{meta}</div>}\n \n {action && (\n <div className=\"absolute right-4 opacity-0 group-hover:opacity-100 transition-opacity flex items-center bg-background/95 backdrop-blur-sm pl-2\">\n {action}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nPreviewListItem.displayName = \"PreviewListItem\"\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYI,cA8BM,YA9BN;AAZJ,YAAY,WAAW;AACvB,SAAS,UAAU;AAEZ,SAAS,YAAY,IAIa;AAJb,eAC1B;AAAA;AAAA,IACA;AAAA,EALF,IAG4B,IAGvB,kBAHuB,IAGvB;AAAA,IAFH;AAAA,IACA;AAAA;AAGA,QAAM,QAAQ,MAAM,SAAS,QAAQ,QAAQ;AAC7C,QAAM,eAAe,MAAM,MAAM,GAAG,CAAC;AAErC,SACE,oBAAC,sCAAI,WAAW,GAAG,iBAAiB,SAAS,KAAO,QAAnD,EACE,yBACH;AAEJ;AAWO,MAAM,kBAAkB,MAAM;AAAA,EACnC,CAAC,IAAkF,QAAQ;AAA1F,iBAAE,aAAW,MAAM,OAAO,UAAU,MAAM,QAAQ,cAAc,KA5BnE,IA4BG,IAAyE,kBAAzE,IAAyE,CAAvE,aAAW,QAAM,SAAO,YAAU,QAAM,UAAQ;AACjD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF;AAAA,SACI,QARL;AAAA,QAUC;AAAA,+BAAC,SAAI,WAAU,+DACZ;AAAA,oBAAQ,oBAAC,SAAI,WAAU,6CAA6C,gBAAK;AAAA,YAC1E,qBAAC,SAAI,WAAU,8CACb;AAAA,kCAAC,SAAI,WAAU,+DAA+D,iBAAM;AAAA,cACnF,YAAY,oBAAC,SAAI,WAAU,uDAAuD,oBAAS;AAAA,eAC9F;AAAA,aACF;AAAA,UAEA,qBAAC,SAAI,WAAU,yCACZ;AAAA,oBAAQ,oBAAC,SAAI,WAAW,GAAG,2BAA2B,UAAU,0CAA0C,GAAI,gBAAK;AAAA,YAEnH,UACC,oBAAC,SAAI,WAAU,kIACZ,kBACH;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,gBAAgB,cAAc;","names":[]}
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ import { Progress as Progress$1 } from 'radix-ui';
3
+
4
+ declare function Progress({ className, value, ...props }: React.ComponentProps<typeof Progress$1.Root>): React.JSX.Element;
5
+
6
+ export { Progress };
@@ -0,0 +1,69 @@
1
+ "use client"
2
+
3
+ "use client";
4
+ var __defProp = Object.defineProperty;
5
+ var __defProps = Object.defineProperties;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __objRest = (source, exclude) => {
24
+ var target = {};
25
+ for (var prop in source)
26
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
27
+ target[prop] = source[prop];
28
+ if (source != null && __getOwnPropSymbols)
29
+ for (var prop of __getOwnPropSymbols(source)) {
30
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
31
+ target[prop] = source[prop];
32
+ }
33
+ return target;
34
+ };
35
+ import { jsx } from "react/jsx-runtime";
36
+ import { Progress as ProgressPrimitive } from "radix-ui";
37
+ import { cn } from "../lib/utils.js";
38
+ function Progress(_a) {
39
+ var _b = _a, {
40
+ className,
41
+ value
42
+ } = _b, props = __objRest(_b, [
43
+ "className",
44
+ "value"
45
+ ]);
46
+ return /* @__PURE__ */ jsx(
47
+ ProgressPrimitive.Root,
48
+ __spreadProps(__spreadValues({
49
+ "data-slot": "progress",
50
+ className: cn(
51
+ "bg-primary/20 relative h-2 w-full overflow-hidden rounded-full",
52
+ className
53
+ )
54
+ }, props), {
55
+ children: /* @__PURE__ */ jsx(
56
+ ProgressPrimitive.Indicator,
57
+ {
58
+ "data-slot": "progress-indicator",
59
+ className: "bg-primary h-full w-full flex-1 transition-all",
60
+ style: { transform: `translateX(-${100 - (value || 0)}%)` }
61
+ }
62
+ )
63
+ })
64
+ );
65
+ }
66
+ export {
67
+ Progress
68
+ };
69
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/progress.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary h-full w-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBM;AAlBN,SAAS,YAAY,yBAAyB;AAE9C,SAAS,UAAU;AAEnB,SAAS,SAAS,IAIsC;AAJtC,eAChB;AAAA;AAAA,IACA;AAAA,EATF,IAOkB,IAGb,kBAHa,IAGb;AAAA,IAFH;AAAA,IACA;AAAA;AAGA,SACE;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,OACI,QANL;AAAA,MAQC;AAAA,QAAC,kBAAkB;AAAA,QAAlB;AAAA,UACC,aAAU;AAAA,UACV,WAAU;AAAA,UACV,OAAO,EAAE,WAAW,eAAe,OAAO,SAAS,EAAE,KAAK;AAAA;AAAA,MAC5D;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+
3
+ type QuickActionPriority = "normal" | "high" | "urgent";
4
+ interface QuickActionSubmitPayload {
5
+ message: string;
6
+ priority: QuickActionPriority;
7
+ }
8
+ interface QuickActionChatAreaProps extends Omit<React.ComponentProps<"div">, "onSubmit"> {
9
+ placeholder?: string;
10
+ submitLabel?: string;
11
+ value?: string;
12
+ defaultValue?: string;
13
+ onValueChange?: (value: string) => void;
14
+ priority?: QuickActionPriority;
15
+ defaultPriority?: QuickActionPriority;
16
+ onPriorityChange?: (priority: QuickActionPriority) => void;
17
+ onSubmit: (payload: QuickActionSubmitPayload) => void;
18
+ allowEmptySubmit?: boolean;
19
+ clearOnSubmit?: boolean;
20
+ showEnterHint?: boolean;
21
+ }
22
+ declare function QuickActionChatArea({ className, placeholder, submitLabel, value, defaultValue, onValueChange, priority, defaultPriority, onPriorityChange, onSubmit, allowEmptySubmit, clearOnSubmit, showEnterHint, ...props }: QuickActionChatAreaProps): React.JSX.Element;
23
+
24
+ export { QuickActionChatArea, type QuickActionPriority, type QuickActionSubmitPayload };