@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,21 @@
1
+ import * as React from 'react';
2
+
3
+ interface FilterDefinition {
4
+ id: string;
5
+ label: string;
6
+ options: string[];
7
+ defaultValue?: string;
8
+ icon?: "calendar" | React.ComponentType<{
9
+ className?: string;
10
+ }>;
11
+ }
12
+ interface InsightsFilterBarProps {
13
+ filters: FilterDefinition[];
14
+ values: Record<string, string>;
15
+ onChange: (filterId: string, value: string) => void;
16
+ onClearAll?: () => void;
17
+ className?: string;
18
+ }
19
+ declare function InsightsFilterBar({ filters, values, onChange, onClearAll, className, }: InsightsFilterBarProps): React.JSX.Element;
20
+
21
+ export { type FilterDefinition, InsightsFilterBar, type InsightsFilterBarProps };
@@ -0,0 +1,99 @@
1
+ "use client"
2
+
3
+ "use client";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { CalendarIcon, ChevronDownIcon, FilterIcon } from "lucide-react";
6
+ import { cn } from "../lib/utils.js";
7
+ import { Button } from "./button.js";
8
+ import {
9
+ DropdownMenu,
10
+ DropdownMenuCheckboxItem,
11
+ DropdownMenuContent,
12
+ DropdownMenuItem,
13
+ DropdownMenuTrigger
14
+ } from "./dropdown-menu.js";
15
+ function hasNonDefaultValue(filters, values) {
16
+ return filters.some((filter) => {
17
+ var _a, _b;
18
+ const defaultVal = (_b = (_a = filter.defaultValue) != null ? _a : filter.options[0]) != null ? _b : "All";
19
+ return values[filter.id] !== void 0 && values[filter.id] !== defaultVal;
20
+ });
21
+ }
22
+ function InsightsFilterBar({
23
+ filters,
24
+ values,
25
+ onChange,
26
+ onClearAll,
27
+ className
28
+ }) {
29
+ const showClearAll = onClearAll && hasNonDefaultValue(filters, values);
30
+ return /* @__PURE__ */ jsxs(
31
+ "div",
32
+ {
33
+ "data-slot": "insights-filter-bar",
34
+ className: cn(
35
+ "flex flex-wrap items-center gap-3 rounded-md border border-border bg-card p-4 shadow-sm",
36
+ className
37
+ ),
38
+ children: [
39
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
40
+ /* @__PURE__ */ jsx(FilterIcon, { className: "h-4 w-4 text-muted-foreground" }),
41
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-muted-foreground", children: "Filters:" })
42
+ ] }),
43
+ filters.map((filter) => {
44
+ var _a, _b;
45
+ const current = (_b = (_a = values[filter.id]) != null ? _a : filter.defaultValue) != null ? _b : "All";
46
+ const isCheckbox = filter.options.length > 0;
47
+ const IconComp = filter.icon === "calendar" ? CalendarIcon : typeof filter.icon === "function" ? filter.icon : null;
48
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
49
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
50
+ Button,
51
+ {
52
+ variant: "outline",
53
+ size: "sm",
54
+ className: "h-8 gap-1.5 text-xs font-normal shadow-none",
55
+ children: [
56
+ IconComp ? /* @__PURE__ */ jsx(IconComp, { className: "h-3.5 w-3.5 text-muted-foreground" }) : null,
57
+ filter.label,
58
+ ": ",
59
+ current,
60
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-3.5 w-3.5 opacity-50" })
61
+ ]
62
+ }
63
+ ) }),
64
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "start", children: isCheckbox ? filter.options.map((option) => /* @__PURE__ */ jsx(
65
+ DropdownMenuCheckboxItem,
66
+ {
67
+ checked: current === option,
68
+ onCheckedChange: () => onChange(filter.id, option),
69
+ children: option
70
+ },
71
+ option
72
+ )) : filter.options.map((option) => /* @__PURE__ */ jsx(
73
+ DropdownMenuItem,
74
+ {
75
+ onSelect: () => onChange(filter.id, option),
76
+ children: option
77
+ },
78
+ option
79
+ )) })
80
+ ] }, filter.id);
81
+ }),
82
+ showClearAll ? /* @__PURE__ */ jsx("div", { className: "ml-auto", children: /* @__PURE__ */ jsx(
83
+ Button,
84
+ {
85
+ variant: "ghost",
86
+ size: "sm",
87
+ className: "h-8 text-xs text-destructive hover:text-destructive",
88
+ onClick: onClearAll,
89
+ children: "Clear All"
90
+ }
91
+ ) }) : null
92
+ ]
93
+ }
94
+ );
95
+ }
96
+ export {
97
+ InsightsFilterBar
98
+ };
99
+ //# sourceMappingURL=insights-filter-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/insights-filter-bar.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { CalendarIcon, ChevronDownIcon, FilterIcon } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./button\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\n\nexport interface FilterDefinition {\n id: string\n label: string\n options: string[]\n defaultValue?: string\n icon?: \"calendar\" | React.ComponentType<{ className?: string }>\n}\n\nexport interface InsightsFilterBarProps {\n filters: FilterDefinition[]\n values: Record<string, string>\n onChange: (filterId: string, value: string) => void\n onClearAll?: () => void\n className?: string\n}\n\nfunction hasNonDefaultValue(\n filters: FilterDefinition[],\n values: Record<string, string>\n) {\n return filters.some((filter) => {\n const defaultVal = filter.defaultValue ?? filter.options[0] ?? \"All\"\n return values[filter.id] !== undefined && values[filter.id] !== defaultVal\n })\n}\n\nfunction InsightsFilterBar({\n filters,\n values,\n onChange,\n onClearAll,\n className,\n}: InsightsFilterBarProps) {\n const showClearAll = onClearAll && hasNonDefaultValue(filters, values)\n\n return (\n <div\n data-slot=\"insights-filter-bar\"\n className={cn(\n \"flex flex-wrap items-center gap-3 rounded-md border border-border bg-card p-4 shadow-sm\",\n className\n )}\n >\n <div className=\"flex items-center gap-2\">\n <FilterIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-muted-foreground\">\n Filters:\n </span>\n </div>\n\n {filters.map((filter) => {\n const current = values[filter.id] ?? filter.defaultValue ?? \"All\"\n const isCheckbox = filter.options.length > 0\n\n const IconComp =\n filter.icon === \"calendar\"\n ? CalendarIcon\n : typeof filter.icon === \"function\"\n ? filter.icon\n : null\n\n return (\n <DropdownMenu key={filter.id}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 text-xs font-normal shadow-none\"\n >\n {IconComp ? (\n <IconComp className=\"h-3.5 w-3.5 text-muted-foreground\" />\n ) : null}\n {filter.label}: {current}\n <ChevronDownIcon className=\"h-3.5 w-3.5 opacity-50\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {isCheckbox\n ? filter.options.map((option) => (\n <DropdownMenuCheckboxItem\n key={option}\n checked={current === option}\n onCheckedChange={() => onChange(filter.id, option)}\n >\n {option}\n </DropdownMenuCheckboxItem>\n ))\n : filter.options.map((option) => (\n <DropdownMenuItem\n key={option}\n onSelect={() => onChange(filter.id, option)}\n >\n {option}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n })}\n\n {showClearAll ? (\n <div className=\"ml-auto\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 text-xs text-destructive hover:text-destructive\"\n onClick={onClearAll}\n >\n Clear All\n </Button>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport { InsightsFilterBar }\n"],"mappings":";AA0DM,SACE,KADF;AAvDN,SAAS,cAAc,iBAAiB,kBAAkB;AAE1D,SAAS,UAAU;AACnB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBP,SAAS,mBACP,SACA,QACA;AACA,SAAO,QAAQ,KAAK,CAAC,WAAW;AAnClC;AAoCI,UAAM,cAAa,kBAAO,iBAAP,YAAuB,OAAO,QAAQ,CAAC,MAAvC,YAA4C;AAC/D,WAAO,OAAO,OAAO,EAAE,MAAM,UAAa,OAAO,OAAO,EAAE,MAAM;AAAA,EAClE,CAAC;AACH;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,eAAe,cAAc,mBAAmB,SAAS,MAAM;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,cAAW,WAAU,iCAAgC;AAAA,UACtD,oBAAC,UAAK,WAAU,6CAA4C,sBAE5D;AAAA,WACF;AAAA,QAEC,QAAQ,IAAI,CAAC,WAAW;AAjE/B;AAkEQ,gBAAM,WAAU,kBAAO,OAAO,EAAE,MAAhB,YAAqB,OAAO,iBAA5B,YAA4C;AAC5D,gBAAM,aAAa,OAAO,QAAQ,SAAS;AAE3C,gBAAM,WACJ,OAAO,SAAS,aACZ,eACA,OAAO,OAAO,SAAS,aACrB,OAAO,OACP;AAER,iBACE,qBAAC,gBACC;AAAA,gCAAC,uBAAoB,SAAO,MAC1B;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAU;AAAA,gBAET;AAAA,6BACC,oBAAC,YAAS,WAAU,qCAAoC,IACtD;AAAA,kBACH,OAAO;AAAA,kBAAM;AAAA,kBAAG;AAAA,kBACjB,oBAAC,mBAAgB,WAAU,0BAAyB;AAAA;AAAA;AAAA,YACtD,GACF;AAAA,YACA,oBAAC,uBAAoB,OAAM,SACxB,uBACG,OAAO,QAAQ,IAAI,CAAC,WAClB;AAAA,cAAC;AAAA;AAAA,gBAEC,SAAS,YAAY;AAAA,gBACrB,iBAAiB,MAAM,SAAS,OAAO,IAAI,MAAM;AAAA,gBAEhD;AAAA;AAAA,cAJI;AAAA,YAKP,CACD,IACD,OAAO,QAAQ,IAAI,CAAC,WAClB;AAAA,cAAC;AAAA;AAAA,gBAEC,UAAU,MAAM,SAAS,OAAO,IAAI,MAAM;AAAA,gBAEzC;AAAA;AAAA,cAHI;AAAA,YAIP,CACD,GACP;AAAA,eAjCiB,OAAO,EAkC1B;AAAA,QAEJ,CAAC;AAAA,QAEA,eACC,oBAAC,SAAI,WAAU,WACb;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACV;AAAA;AAAA,QAED,GACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+
3
+ type ItemListGrouping = "stage" | "owner" | "risk";
4
+ type ItemListViewMode = "list" | "board";
5
+ interface ItemListDisplayState {
6
+ viewMode: ItemListViewMode;
7
+ grouping: ItemListGrouping;
8
+ subGrouping: "none" | ItemListGrouping;
9
+ ordering: string;
10
+ orderingDirection: "asc" | "desc";
11
+ showContactSignals: boolean;
12
+ showOwner: boolean;
13
+ showStatus: boolean;
14
+ }
15
+ interface ItemListDisplayProps {
16
+ value: ItemListDisplayState;
17
+ onChange: (next: ItemListDisplayState) => void;
18
+ onReset: () => void;
19
+ }
20
+ declare function ItemListDisplay({ value, onChange, onReset, }: ItemListDisplayProps): React.JSX.Element;
21
+
22
+ export { ItemListDisplay, type ItemListDisplayState, type ItemListGrouping, type ItemListViewMode };
@@ -0,0 +1,240 @@
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
+ import { jsx, jsxs } from "react/jsx-runtime";
24
+ import {
25
+ ArrowDownAZ,
26
+ ArrowUpAZ,
27
+ LayoutTemplate,
28
+ List as ListIcon,
29
+ RotateCcw,
30
+ SlidersHorizontal
31
+ } from "lucide-react";
32
+ import { Popover as PopoverPrimitive } from "radix-ui";
33
+ import { cn } from "../lib/utils.js";
34
+ import { Button } from "./button.js";
35
+ import {
36
+ Select,
37
+ SelectContent,
38
+ SelectItem,
39
+ SelectTrigger,
40
+ SelectValue
41
+ } from "./select.js";
42
+ import { Separator } from "./separator.js";
43
+ function ItemListDisplay({
44
+ value,
45
+ onChange,
46
+ onReset
47
+ }) {
48
+ const toggleField = (field) => {
49
+ onChange(__spreadProps(__spreadValues({}, value), {
50
+ [field]: !value[field]
51
+ }));
52
+ };
53
+ return /* @__PURE__ */ jsxs(PopoverPrimitive.Root, { children: [
54
+ /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
55
+ Button,
56
+ {
57
+ variant: "outline",
58
+ size: "sm",
59
+ className: "h-8 gap-2 rounded-md border-border bg-background text-xs font-medium text-foreground shadow-none hover:bg-muted/50",
60
+ children: [
61
+ /* @__PURE__ */ jsx(SlidersHorizontal, { className: "h-3.5 w-3.5" }),
62
+ "Display"
63
+ ]
64
+ }
65
+ ) }),
66
+ /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
67
+ PopoverPrimitive.Content,
68
+ {
69
+ align: "start",
70
+ sideOffset: 4,
71
+ className: "z-50 w-[280px] rounded-lg border border-border bg-background p-4 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
72
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
73
+ /* @__PURE__ */ jsxs("div", { className: "flex rounded-md bg-muted/60 p-1", children: [
74
+ /* @__PURE__ */ jsxs(
75
+ "button",
76
+ {
77
+ type: "button",
78
+ onClick: () => onChange(__spreadProps(__spreadValues({}, value), { viewMode: "list" })),
79
+ className: cn(
80
+ "flex flex-1 flex-col items-center justify-center gap-1.5 rounded-sm px-3 py-2 text-xs font-medium transition-all",
81
+ value.viewMode === "list" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
82
+ ),
83
+ children: [
84
+ /* @__PURE__ */ jsx(ListIcon, { className: "h-4 w-4" }),
85
+ "List"
86
+ ]
87
+ }
88
+ ),
89
+ /* @__PURE__ */ jsxs(
90
+ "button",
91
+ {
92
+ type: "button",
93
+ onClick: () => onChange(__spreadProps(__spreadValues({}, value), { viewMode: "board" })),
94
+ className: cn(
95
+ "flex flex-1 flex-col items-center justify-center gap-1.5 rounded-sm px-3 py-2 text-xs font-medium transition-all",
96
+ value.viewMode === "board" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
97
+ ),
98
+ children: [
99
+ /* @__PURE__ */ jsx(LayoutTemplate, { className: "h-4 w-4" }),
100
+ "Board"
101
+ ]
102
+ }
103
+ )
104
+ ] }),
105
+ /* @__PURE__ */ jsx(Separator, {}),
106
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
107
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[80px_1fr] items-center gap-2", children: [
108
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Grouping" }),
109
+ /* @__PURE__ */ jsxs(
110
+ Select,
111
+ {
112
+ value: value.grouping,
113
+ onValueChange: (g) => onChange(__spreadProps(__spreadValues({}, value), { grouping: g })),
114
+ children: [
115
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 text-xs", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
116
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
117
+ /* @__PURE__ */ jsx(SelectItem, { value: "stage", className: "text-xs", children: "Stage" }),
118
+ /* @__PURE__ */ jsx(SelectItem, { value: "owner", className: "text-xs", children: "Assignee" }),
119
+ /* @__PURE__ */ jsx(SelectItem, { value: "risk", className: "text-xs", children: "Risk level" })
120
+ ] })
121
+ ]
122
+ }
123
+ )
124
+ ] }),
125
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[80px_1fr] items-center gap-2", children: [
126
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Sub-grouping" }),
127
+ /* @__PURE__ */ jsxs(
128
+ Select,
129
+ {
130
+ value: value.subGrouping,
131
+ onValueChange: (g) => onChange(__spreadProps(__spreadValues({}, value), {
132
+ subGrouping: g
133
+ })),
134
+ children: [
135
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 text-xs", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
136
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
137
+ /* @__PURE__ */ jsx(SelectItem, { value: "none", className: "text-xs", children: "No grouping" }),
138
+ /* @__PURE__ */ jsx(SelectItem, { value: "stage", className: "text-xs", children: "Stage" }),
139
+ /* @__PURE__ */ jsx(SelectItem, { value: "owner", className: "text-xs", children: "Assignee" }),
140
+ /* @__PURE__ */ jsx(SelectItem, { value: "risk", className: "text-xs", children: "Risk level" })
141
+ ] })
142
+ ]
143
+ }
144
+ )
145
+ ] }),
146
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[80px_1fr_32px] items-center gap-2", children: [
147
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Ordering" }),
148
+ /* @__PURE__ */ jsxs(
149
+ Select,
150
+ {
151
+ value: value.ordering,
152
+ onValueChange: (o) => onChange(__spreadProps(__spreadValues({}, value), { ordering: o })),
153
+ children: [
154
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 text-xs", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
155
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
156
+ /* @__PURE__ */ jsx(SelectItem, { value: "priority", className: "text-xs", children: "Priority" }),
157
+ /* @__PURE__ */ jsx(SelectItem, { value: "aging", className: "text-xs", children: "Age" }),
158
+ /* @__PURE__ */ jsx(SelectItem, { value: "name", className: "text-xs", children: "Name" })
159
+ ] })
160
+ ]
161
+ }
162
+ ),
163
+ /* @__PURE__ */ jsx(
164
+ Button,
165
+ {
166
+ variant: "outline",
167
+ size: "icon",
168
+ className: "h-8 w-8",
169
+ onClick: () => onChange(__spreadProps(__spreadValues({}, value), {
170
+ orderingDirection: value.orderingDirection === "asc" ? "desc" : "asc"
171
+ })),
172
+ children: value.orderingDirection === "asc" ? /* @__PURE__ */ jsx(ArrowDownAZ, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(ArrowUpAZ, { className: "h-3.5 w-3.5" })
173
+ }
174
+ )
175
+ ] })
176
+ ] }),
177
+ /* @__PURE__ */ jsx(Separator, {}),
178
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
179
+ /* @__PURE__ */ jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: "Visible row details" }),
180
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
181
+ /* @__PURE__ */ jsx(
182
+ "button",
183
+ {
184
+ type: "button",
185
+ onClick: () => toggleField("showContactSignals"),
186
+ className: cn(
187
+ "rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors",
188
+ value.showContactSignals ? "border-emerald-300 bg-emerald-50 text-emerald-700" : "border-border bg-background text-muted-foreground hover:bg-muted"
189
+ ),
190
+ children: "Contact signals"
191
+ }
192
+ ),
193
+ /* @__PURE__ */ jsx(
194
+ "button",
195
+ {
196
+ type: "button",
197
+ onClick: () => toggleField("showOwner"),
198
+ className: cn(
199
+ "rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors",
200
+ value.showOwner ? "border-emerald-300 bg-emerald-50 text-emerald-700" : "border-border bg-background text-muted-foreground hover:bg-muted"
201
+ ),
202
+ children: "Assignee"
203
+ }
204
+ ),
205
+ /* @__PURE__ */ jsx(
206
+ "button",
207
+ {
208
+ type: "button",
209
+ onClick: () => toggleField("showStatus"),
210
+ className: cn(
211
+ "rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors",
212
+ value.showStatus ? "border-emerald-300 bg-emerald-50 text-emerald-700" : "border-border bg-background text-muted-foreground hover:bg-muted"
213
+ ),
214
+ children: "Stage badge"
215
+ }
216
+ )
217
+ ] })
218
+ ] }),
219
+ /* @__PURE__ */ jsx(Separator, {}),
220
+ /* @__PURE__ */ jsxs(
221
+ "button",
222
+ {
223
+ type: "button",
224
+ onClick: onReset,
225
+ className: "inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground transition-colors hover:text-foreground",
226
+ children: [
227
+ /* @__PURE__ */ jsx(RotateCcw, { className: "h-3 w-3" }),
228
+ "Reset display settings"
229
+ ]
230
+ }
231
+ )
232
+ ] })
233
+ }
234
+ ) })
235
+ ] });
236
+ }
237
+ export {
238
+ ItemListDisplay
239
+ };
240
+ //# sourceMappingURL=item-list-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/item-list-display.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ArrowDownAZ,\n ArrowUpAZ,\n LayoutTemplate,\n List as ListIcon,\n RotateCcw,\n SlidersHorizontal,\n} from \"lucide-react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\"\nimport { Separator } from \"./separator\"\n\nexport type ItemListGrouping = \"stage\" | \"owner\" | \"risk\"\nexport type ItemListViewMode = \"list\" | \"board\"\n\nexport interface ItemListDisplayState {\n viewMode: ItemListViewMode\n grouping: ItemListGrouping\n subGrouping: \"none\" | ItemListGrouping\n ordering: string\n orderingDirection: \"asc\" | \"desc\"\n showContactSignals: boolean\n showOwner: boolean\n showStatus: boolean\n}\n\ninterface ItemListDisplayProps {\n value: ItemListDisplayState\n onChange: (next: ItemListDisplayState) => void\n onReset: () => void\n}\n\nexport function ItemListDisplay({\n value,\n onChange,\n onReset,\n}: ItemListDisplayProps) {\n const toggleField = (\n field: \"showContactSignals\" | \"showOwner\" | \"showStatus\",\n ) => {\n onChange({\n ...value,\n [field]: !value[field],\n })\n }\n\n return (\n <PopoverPrimitive.Root>\n <PopoverPrimitive.Trigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-2 rounded-md border-border bg-background text-xs font-medium text-foreground shadow-none hover:bg-muted/50\"\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n Display\n </Button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className=\"z-50 w-[280px] rounded-lg border border-border bg-background p-4 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\"\n >\n <div className=\"flex flex-col gap-4\">\n {/* View Toggle */}\n <div className=\"flex rounded-md bg-muted/60 p-1\">\n <button\n type=\"button\"\n onClick={() => onChange({ ...value, viewMode: \"list\" })}\n className={cn(\n \"flex flex-1 flex-col items-center justify-center gap-1.5 rounded-sm px-3 py-2 text-xs font-medium transition-all\",\n value.viewMode === \"list\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <ListIcon className=\"h-4 w-4\" />\n List\n </button>\n <button\n type=\"button\"\n onClick={() => onChange({ ...value, viewMode: \"board\" })}\n className={cn(\n \"flex flex-1 flex-col items-center justify-center gap-1.5 rounded-sm px-3 py-2 text-xs font-medium transition-all\",\n value.viewMode === \"board\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <LayoutTemplate className=\"h-4 w-4\" />\n Board\n </button>\n </div>\n\n <Separator />\n\n {/* Grouping Controls */}\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-[80px_1fr] items-center gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Grouping\n </span>\n <Select\n value={value.grouping}\n onValueChange={(g) =>\n onChange({ ...value, grouping: g as ItemListGrouping })\n }\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"stage\" className=\"text-xs\">\n Stage\n </SelectItem>\n <SelectItem value=\"owner\" className=\"text-xs\">\n Assignee\n </SelectItem>\n <SelectItem value=\"risk\" className=\"text-xs\">\n Risk level\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"grid grid-cols-[80px_1fr] items-center gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Sub-grouping\n </span>\n <Select\n value={value.subGrouping}\n onValueChange={(g) =>\n onChange({\n ...value,\n subGrouping: g as \"none\" | ItemListGrouping,\n })\n }\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\" className=\"text-xs\">\n No grouping\n </SelectItem>\n <SelectItem value=\"stage\" className=\"text-xs\">\n Stage\n </SelectItem>\n <SelectItem value=\"owner\" className=\"text-xs\">\n Assignee\n </SelectItem>\n <SelectItem value=\"risk\" className=\"text-xs\">\n Risk level\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"grid grid-cols-[80px_1fr_32px] items-center gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Ordering\n </span>\n <Select\n value={value.ordering}\n onValueChange={(o) => onChange({ ...value, ordering: o })}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"priority\" className=\"text-xs\">\n Priority\n </SelectItem>\n <SelectItem value=\"aging\" className=\"text-xs\">\n Age\n </SelectItem>\n <SelectItem value=\"name\" className=\"text-xs\">\n Name\n </SelectItem>\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() =>\n onChange({\n ...value,\n orderingDirection:\n value.orderingDirection === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {value.orderingDirection === \"asc\" ? (\n <ArrowDownAZ className=\"h-3.5 w-3.5\" />\n ) : (\n <ArrowUpAZ className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n\n <Separator />\n\n {/* Visible Row Details */}\n <div className=\"space-y-2\">\n <span className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Visible row details\n </span>\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => toggleField(\"showContactSignals\")}\n className={cn(\n \"rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors\",\n value.showContactSignals\n ? \"border-emerald-300 bg-emerald-50 text-emerald-700\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted\",\n )}\n >\n Contact signals\n </button>\n <button\n type=\"button\"\n onClick={() => toggleField(\"showOwner\")}\n className={cn(\n \"rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors\",\n value.showOwner\n ? \"border-emerald-300 bg-emerald-50 text-emerald-700\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted\",\n )}\n >\n Assignee\n </button>\n <button\n type=\"button\"\n onClick={() => toggleField(\"showStatus\")}\n className={cn(\n \"rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors\",\n value.showStatus\n ? \"border-emerald-300 bg-emerald-50 text-emerald-700\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted\",\n )}\n >\n Stage badge\n </button>\n </div>\n </div>\n\n <Separator />\n\n <button\n type=\"button\"\n onClick={onReset}\n className=\"inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Reset display settings\n </button>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+
3
+ interface ItemListFilterCategory {
4
+ id: string;
5
+ label: string;
6
+ options: string[];
7
+ }
8
+ interface ItemListFilterProps {
9
+ categories: ItemListFilterCategory[];
10
+ selectedFilters: Record<string, string[]>;
11
+ onToggleFilter: (categoryId: string, option: string) => void;
12
+ onClearFilters: () => void;
13
+ }
14
+ declare function ItemListFilter({ categories, selectedFilters, onToggleFilter, onClearFilters, }: ItemListFilterProps): React.JSX.Element;
15
+
16
+ export { ItemListFilter, type ItemListFilterCategory };
@@ -0,0 +1,87 @@
1
+ "use client"
2
+
3
+ "use client";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { Filter, X } from "lucide-react";
6
+ import { cn } from "../lib/utils.js";
7
+ import { Button } from "./button.js";
8
+ import {
9
+ DropdownMenu,
10
+ DropdownMenuContent,
11
+ DropdownMenuLabel,
12
+ DropdownMenuSeparator,
13
+ DropdownMenuTrigger
14
+ } from "./dropdown-menu.js";
15
+ function getActiveFilterCount(selectedFilters) {
16
+ return Object.values(selectedFilters).reduce(
17
+ (count, values) => count + values.length,
18
+ 0
19
+ );
20
+ }
21
+ function ItemListFilter({
22
+ categories,
23
+ selectedFilters,
24
+ onToggleFilter,
25
+ onClearFilters
26
+ }) {
27
+ const activeFilterCount = getActiveFilterCount(selectedFilters);
28
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
29
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
30
+ Button,
31
+ {
32
+ variant: "outline",
33
+ size: "sm",
34
+ className: "h-8 gap-2 rounded-md border-border bg-background text-xs font-medium text-foreground shadow-none hover:bg-muted/50",
35
+ children: [
36
+ /* @__PURE__ */ jsx(Filter, { className: "h-3.5 w-3.5" }),
37
+ "Filter",
38
+ activeFilterCount > 0 ? /* @__PURE__ */ jsx("span", { className: "rounded bg-muted px-1.5 py-0 text-[10px] font-semibold text-muted-foreground", children: activeFilterCount }) : null
39
+ ]
40
+ }
41
+ ) }),
42
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: "w-[280px] p-3", children: [
43
+ /* @__PURE__ */ jsx(DropdownMenuLabel, { className: "px-0 text-xs font-semibold text-foreground", children: "Apply filters" }),
44
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, { className: "my-2" }),
45
+ /* @__PURE__ */ jsx("div", { className: "space-y-3", children: categories.map((category, index) => /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
46
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: category.label }),
47
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: category.options.map((option) => {
48
+ var _a, _b;
49
+ const selected = (_b = (_a = selectedFilters[category.id]) == null ? void 0 : _a.includes(option)) != null ? _b : false;
50
+ return /* @__PURE__ */ jsx(
51
+ "button",
52
+ {
53
+ type: "button",
54
+ onClick: () => onToggleFilter(category.id, option),
55
+ className: cn(
56
+ "rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors",
57
+ selected ? "border-emerald-300 bg-emerald-50 text-emerald-700" : "border-border bg-background text-muted-foreground hover:bg-muted"
58
+ ),
59
+ children: option
60
+ },
61
+ option
62
+ );
63
+ }) }),
64
+ index < categories.length - 1 ? /* @__PURE__ */ jsx(DropdownMenuSeparator, { className: "mt-2" }) : null
65
+ ] }, category.id)) }),
66
+ activeFilterCount > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
67
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, { className: "my-2" }),
68
+ /* @__PURE__ */ jsxs(
69
+ "button",
70
+ {
71
+ type: "button",
72
+ onClick: onClearFilters,
73
+ className: "inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground transition-colors hover:text-foreground",
74
+ children: [
75
+ /* @__PURE__ */ jsx(X, { className: "h-3 w-3" }),
76
+ "Clear all"
77
+ ]
78
+ }
79
+ )
80
+ ] }) : null
81
+ ] })
82
+ ] });
83
+ }
84
+ export {
85
+ ItemListFilter
86
+ };
87
+ //# sourceMappingURL=item-list-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/item-list-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Filter, X } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\n\nexport interface ItemListFilterCategory {\n id: string\n label: string\n options: string[]\n}\n\ninterface ItemListFilterProps {\n categories: ItemListFilterCategory[]\n selectedFilters: Record<string, string[]>\n onToggleFilter: (categoryId: string, option: string) => void\n onClearFilters: () => void\n}\n\nfunction getActiveFilterCount(selectedFilters: Record<string, string[]>) {\n return Object.values(selectedFilters).reduce(\n (count, values) => count + values.length,\n 0\n )\n}\n\nexport function ItemListFilter({\n categories,\n selectedFilters,\n onToggleFilter,\n onClearFilters,\n}: ItemListFilterProps) {\n const activeFilterCount = getActiveFilterCount(selectedFilters)\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-2 rounded-md border-border bg-background text-xs font-medium text-foreground shadow-none hover:bg-muted/50\"\n >\n <Filter className=\"h-3.5 w-3.5\" />\n Filter\n {activeFilterCount > 0 ? (\n <span className=\"rounded bg-muted px-1.5 py-0 text-[10px] font-semibold text-muted-foreground\">\n {activeFilterCount}\n </span>\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[280px] p-3\">\n <DropdownMenuLabel className=\"px-0 text-xs font-semibold text-foreground\">\n Apply filters\n </DropdownMenuLabel>\n <DropdownMenuSeparator className=\"my-2\" />\n\n <div className=\"space-y-3\">\n {categories.map((category, index) => (\n <div key={category.id} className=\"space-y-1.5\">\n <p className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {category.label}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {category.options.map((option) => {\n const selected =\n selectedFilters[category.id]?.includes(option) ?? false\n\n return (\n <button\n key={option}\n type=\"button\"\n onClick={() => onToggleFilter(category.id, option)}\n className={cn(\n \"rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors\",\n selected\n ? \"border-emerald-300 bg-emerald-50 text-emerald-700\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted\"\n )}\n >\n {option}\n </button>\n )\n })}\n </div>\n {index < categories.length - 1 ? (\n <DropdownMenuSeparator className=\"mt-2\" />\n ) : null}\n </div>\n ))}\n </div>\n\n {activeFilterCount > 0 ? (\n <>\n <DropdownMenuSeparator className=\"my-2\" />\n <button\n type=\"button\"\n onClick={onClearFilters}\n className=\"inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n Clear all\n </button>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],"mappings":";AA8CQ,SAwDE,UAnDA,KALF;AA3CR,SAAS,QAAQ,SAAS;AAE1B,SAAS,UAAU;AACnB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP,SAAS,qBAAqB,iBAA2C;AACvE,SAAO,OAAO,OAAO,eAAe,EAAE;AAAA,IACpC,CAAC,OAAO,WAAW,QAAQ,OAAO;AAAA,IAClC;AAAA,EACF;AACF;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,oBAAoB,qBAAqB,eAAe;AAE9D,SACE,qBAAC,gBACC;AAAA,wBAAC,uBAAoB,SAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QAEV;AAAA,8BAAC,UAAO,WAAU,eAAc;AAAA,UAAE;AAAA,UAEjC,oBAAoB,IACnB,oBAAC,UAAK,WAAU,gFACb,6BACH,IACE;AAAA;AAAA;AAAA,IACN,GACF;AAAA,IACA,qBAAC,uBAAoB,OAAM,OAAM,WAAU,iBACzC;AAAA,0BAAC,qBAAkB,WAAU,8CAA6C,2BAE1E;AAAA,MACA,oBAAC,yBAAsB,WAAU,QAAO;AAAA,MAExC,oBAAC,SAAI,WAAU,aACZ,qBAAW,IAAI,CAAC,UAAU,UACzB,qBAAC,SAAsB,WAAU,eAC/B;AAAA,4BAAC,OAAE,WAAU,2EACV,mBAAS,OACZ;AAAA,QACA,oBAAC,SAAI,WAAU,0BACZ,mBAAS,QAAQ,IAAI,CAAC,WAAW;AAzElD;AA0EkB,gBAAM,YACJ,2BAAgB,SAAS,EAAE,MAA3B,mBAA8B,SAAS,YAAvC,YAAkD;AAEpD,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM,eAAe,SAAS,IAAI,MAAM;AAAA,cACjD,WAAW;AAAA,gBACT;AAAA,gBACA,WACI,sDACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,YAVI;AAAA,UAWP;AAAA,QAEJ,CAAC,GACH;AAAA,QACC,QAAQ,WAAW,SAAS,IAC3B,oBAAC,yBAAsB,WAAU,QAAO,IACtC;AAAA,WA5BI,SAAS,EA6BnB,CACD,GACH;AAAA,MAEC,oBAAoB,IACnB,iCACE;AAAA,4BAAC,yBAAsB,WAAU,QAAO;AAAA,QACxC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YAEV;AAAA,kCAAC,KAAE,WAAU,WAAU;AAAA,cAAE;AAAA;AAAA;AAAA,QAE3B;AAAA,SACF,IACE;AAAA,OACN;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import { ItemListDisplayState } from './item-list-display.js';
3
+ import { ItemListFilterCategory } from './item-list-filter.js';
4
+
5
+ interface ItemListQuickView {
6
+ id: string;
7
+ label: string;
8
+ count: number;
9
+ }
10
+ interface ItemListToolbarProps {
11
+ quickViews: ItemListQuickView[];
12
+ activeQuickView: string | null;
13
+ onQuickViewChange: (viewId: string | null) => void;
14
+ filterCategories: ItemListFilterCategory[];
15
+ selectedFilters: Record<string, string[]>;
16
+ onToggleFilter: (categoryId: string, option: string) => void;
17
+ onClearFilters: () => void;
18
+ display: ItemListDisplayState;
19
+ onDisplayChange: (next: ItemListDisplayState) => void;
20
+ onResetDisplay: () => void;
21
+ searchSlot?: React.ReactNode;
22
+ }
23
+ declare function ItemListToolbar({ quickViews, activeQuickView, onQuickViewChange, filterCategories, selectedFilters, onToggleFilter, onClearFilters, display, onDisplayChange, onResetDisplay, searchSlot, }: ItemListToolbarProps): React.JSX.Element;
24
+
25
+ export { type ItemListQuickView, ItemListToolbar };