@handled-ai/design-system 0.8.0 → 0.9.1

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 (340) 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/components/virtualized-data-table.d.ts +29 -0
  210. package/dist/components/virtualized-data-table.js +231 -0
  211. package/dist/components/virtualized-data-table.js.map +1 -0
  212. package/dist/hooks/use-mobile.d.ts +3 -0
  213. package/dist/hooks/use-mobile.js +21 -0
  214. package/dist/hooks/use-mobile.js.map +1 -0
  215. package/dist/index.d.ts +69 -1878
  216. package/dist/index.js +70 -10918
  217. package/dist/index.js.map +1 -1
  218. package/dist/lib/icons.d.ts +18 -0
  219. package/dist/lib/icons.js +21 -0
  220. package/dist/lib/icons.js.map +1 -0
  221. package/dist/lib/utils.d.ts +5 -0
  222. package/dist/lib/utils.js +9 -0
  223. package/dist/lib/utils.js.map +1 -0
  224. package/dist/prototype/index.d.ts +20 -0
  225. package/dist/prototype/index.js +8 -0
  226. package/dist/prototype/index.js.map +1 -0
  227. package/dist/prototype/prototype-accounts-view.d.ts +22 -0
  228. package/dist/prototype/prototype-accounts-view.js +70 -0
  229. package/dist/prototype/prototype-accounts-view.js.map +1 -0
  230. package/dist/prototype/prototype-admin-view.d.ts +21 -0
  231. package/dist/prototype/prototype-admin-view.js +53 -0
  232. package/dist/prototype/prototype-admin-view.js.map +1 -0
  233. package/dist/prototype/prototype-config.d.ts +226 -0
  234. package/dist/prototype/prototype-config.js +1 -0
  235. package/dist/prototype/prototype-config.js.map +1 -0
  236. package/dist/prototype/prototype-inbox-view.d.ts +48 -0
  237. package/dist/prototype/prototype-inbox-view.js +701 -0
  238. package/dist/prototype/prototype-inbox-view.js.map +1 -0
  239. package/dist/prototype/prototype-insights-view.d.ts +23 -0
  240. package/dist/prototype/prototype-insights-view.js +335 -0
  241. package/dist/prototype/prototype-insights-view.js.map +1 -0
  242. package/dist/prototype/prototype-shell.d.ts +40 -0
  243. package/dist/prototype/prototype-shell.js +190 -0
  244. package/dist/prototype/prototype-shell.js.map +1 -0
  245. package/dist/prototype/prototype-work-queue-view.d.ts +8 -0
  246. package/dist/prototype/prototype-work-queue-view.js +17 -0
  247. package/dist/prototype/prototype-work-queue-view.js.map +1 -0
  248. package/dist/three/agent-orb.d.ts +39 -0
  249. package/dist/three/agent-orb.js +500 -0
  250. package/dist/three/agent-orb.js.map +1 -0
  251. package/dist/three/index.d.ts +2 -0
  252. package/dist/three/index.js +2 -0
  253. package/dist/three/index.js.map +1 -0
  254. package/package.json +104 -18
  255. package/src/charts/bar-chart-component.tsx +150 -0
  256. package/src/charts/chart-tooltip.tsx +86 -0
  257. package/src/charts/chart.tsx +371 -0
  258. package/src/charts/donut-chart.tsx +112 -0
  259. package/src/charts/index.ts +13 -0
  260. package/src/charts/pipeline-overview.tsx +476 -0
  261. package/src/charts/sankey-chart.tsx +290 -0
  262. package/src/charts/top-line-metrics.tsx +261 -0
  263. package/src/charts/trend-area-chart.tsx +150 -0
  264. package/src/charts/volume-analysis-chart.tsx +124 -0
  265. package/src/components/activity-detail.tsx +233 -0
  266. package/src/components/activity-log.tsx +89 -0
  267. package/src/components/agent-popover.tsx +373 -0
  268. package/src/components/agent-widget.tsx +163 -0
  269. package/src/components/avatar.tsx +109 -0
  270. package/src/components/badge.tsx +48 -0
  271. package/src/components/button.tsx +59 -0
  272. package/src/components/card.tsx +92 -0
  273. package/src/components/contact-list.tsx +121 -0
  274. package/src/components/dashboard-cards.tsx +170 -0
  275. package/src/components/data-table-display.tsx +139 -0
  276. package/src/components/data-table-filter.tsx +138 -0
  277. package/src/components/data-table-quick-views.tsx +103 -0
  278. package/src/components/data-table-toolbar.tsx +56 -0
  279. package/src/components/data-table.tsx +915 -0
  280. package/src/components/detail-view.tsx +237 -0
  281. package/src/components/dialog.tsx +158 -0
  282. package/src/components/dropdown-menu.tsx +257 -0
  283. package/src/components/entity-panel.tsx +767 -0
  284. package/src/components/inbox-row.tsx +132 -0
  285. package/src/components/inbox-toolbar.tsx +213 -0
  286. package/src/components/input.tsx +21 -0
  287. package/src/components/insights-filter-bar.tsx +132 -0
  288. package/src/components/item-list-display.tsx +278 -0
  289. package/src/components/item-list-filter.tsx +118 -0
  290. package/src/components/item-list-toolbar.tsx +97 -0
  291. package/src/components/item-list.tsx +843 -0
  292. package/src/components/label.tsx +24 -0
  293. package/src/components/message.tsx +83 -0
  294. package/src/components/metric-card.tsx +178 -0
  295. package/src/components/performance-metrics-table.tsx +442 -0
  296. package/src/components/preview-list.tsx +62 -0
  297. package/src/components/progress.tsx +31 -0
  298. package/src/components/quick-action-chat-area.tsx +156 -0
  299. package/src/components/quick-action-modal.tsx +331 -0
  300. package/src/components/quick-action-sidebar-nav.tsx +592 -0
  301. package/src/components/recommended-actions-section.tsx +258 -0
  302. package/src/components/report-card.tsx +106 -0
  303. package/src/components/score-analysis-modal.tsx +172 -0
  304. package/src/components/score-breakdown.tsx +179 -0
  305. package/src/components/score-feedback.tsx +288 -0
  306. package/src/components/score-ring.tsx +87 -0
  307. package/src/components/scroll-area.tsx +58 -0
  308. package/src/components/select.tsx +190 -0
  309. package/src/components/separator.tsx +28 -0
  310. package/src/components/sheet.tsx +143 -0
  311. package/src/components/sidebar.tsx +726 -0
  312. package/src/components/signal-feedback-inline.tsx +591 -0
  313. package/src/components/simple-data-table.tsx +124 -0
  314. package/src/components/skeleton.tsx +15 -0
  315. package/src/components/status-badge.tsx +63 -0
  316. package/src/components/styled-bar-list.tsx +70 -0
  317. package/src/components/suggested-actions.tsx +1985 -0
  318. package/src/components/table.tsx +116 -0
  319. package/src/components/tabs.tsx +91 -0
  320. package/src/components/textarea.tsx +18 -0
  321. package/src/components/timeline-activity.tsx +234 -0
  322. package/src/components/tooltip.tsx +57 -0
  323. package/src/components/view-mode-toggle.tsx +39 -0
  324. package/src/components/virtualized-data-table.tsx +309 -0
  325. package/src/hooks/use-mobile.ts +21 -0
  326. package/src/index.ts +78 -0
  327. package/src/lib/icons.ts +18 -0
  328. package/src/lib/utils.ts +6 -0
  329. package/src/prototype/index.ts +11 -0
  330. package/src/prototype/prototype-accounts-view.tsx +112 -0
  331. package/src/prototype/prototype-admin-view.tsx +67 -0
  332. package/src/prototype/prototype-config.ts +243 -0
  333. package/src/prototype/prototype-inbox-view.tsx +810 -0
  334. package/src/prototype/prototype-insights-view.tsx +379 -0
  335. package/src/prototype/prototype-shell.tsx +219 -0
  336. package/src/prototype/prototype-work-queue-view.tsx +30 -0
  337. package/src/styles/globals.css +299 -0
  338. package/src/three/agent-orb.tsx +557 -0
  339. package/src/three/index.ts +5 -0
  340. package/src/types/r3f.d.ts +8 -0
@@ -0,0 +1,231 @@
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 * as React from "react";
25
+ import { useVirtualizer } from "@tanstack/react-virtual";
26
+ import {
27
+ useReactTable,
28
+ getCoreRowModel,
29
+ flexRender
30
+ } from "@tanstack/react-table";
31
+ import { ArrowDown, ArrowUp, ArrowUpDown, SearchX, Loader2 } from "lucide-react";
32
+ import { cn } from "../lib/utils.js";
33
+ function VirtualizedDataTable({
34
+ columns,
35
+ data,
36
+ height = 600,
37
+ estimateRowHeight = 48,
38
+ overscan = 8,
39
+ onRowClick,
40
+ getRowId,
41
+ onReachBottom,
42
+ reachBottomThreshold = 5,
43
+ hasMore = true,
44
+ isFetchingMore,
45
+ sorting,
46
+ onSortingChange,
47
+ columnFilters,
48
+ onColumnFiltersChange,
49
+ columnVisibility,
50
+ onColumnVisibilityChange,
51
+ emptyIcon,
52
+ emptyMessage = "No rows found",
53
+ emptyDescription = "Try adjusting your filters",
54
+ className
55
+ }) {
56
+ const [internalSorting, setInternalSorting] = React.useState([]);
57
+ const resolvedSorting = sorting != null ? sorting : internalSorting;
58
+ const resolvedOnSortingChange = onSortingChange != null ? onSortingChange : setInternalSorting;
59
+ const [internalColumnFilters, setInternalColumnFilters] = React.useState([]);
60
+ const resolvedColumnFilters = columnFilters != null ? columnFilters : internalColumnFilters;
61
+ const resolvedOnColumnFiltersChange = onColumnFiltersChange != null ? onColumnFiltersChange : setInternalColumnFilters;
62
+ const [internalColumnVisibility, setInternalColumnVisibility] = React.useState({});
63
+ const resolvedColumnVisibility = columnVisibility != null ? columnVisibility : internalColumnVisibility;
64
+ const resolvedOnColumnVisibilityChange = onColumnVisibilityChange != null ? onColumnVisibilityChange : setInternalColumnVisibility;
65
+ const table = useReactTable(__spreadProps(__spreadValues({
66
+ data,
67
+ columns
68
+ }, getRowId ? { getRowId } : {}), {
69
+ state: {
70
+ sorting: resolvedSorting,
71
+ columnFilters: resolvedColumnFilters,
72
+ columnVisibility: resolvedColumnVisibility
73
+ },
74
+ onSortingChange: resolvedOnSortingChange,
75
+ onColumnFiltersChange: resolvedOnColumnFiltersChange,
76
+ onColumnVisibilityChange: resolvedOnColumnVisibilityChange,
77
+ manualSorting: true,
78
+ manualFiltering: true,
79
+ manualPagination: true,
80
+ getCoreRowModel: getCoreRowModel()
81
+ }));
82
+ const scrollContainerRef = React.useRef(null);
83
+ const rows = table.getRowModel().rows;
84
+ const virtualizer = useVirtualizer({
85
+ count: rows.length,
86
+ getScrollElement: () => scrollContainerRef.current,
87
+ estimateSize: () => estimateRowHeight,
88
+ overscan,
89
+ measureElement: (element) => element.getBoundingClientRect().height
90
+ });
91
+ const lastTriggeredDataLengthRef = React.useRef(0);
92
+ const virtualItems = virtualizer.getVirtualItems();
93
+ const lastVirtualItemIndex = virtualItems.length > 0 ? virtualItems[virtualItems.length - 1].index : -1;
94
+ React.useEffect(() => {
95
+ if (!onReachBottom || isFetchingMore || hasMore === false) return;
96
+ if (lastVirtualItemIndex < 0) return;
97
+ if (lastVirtualItemIndex < rows.length - reachBottomThreshold) return;
98
+ if (lastTriggeredDataLengthRef.current === data.length) return;
99
+ lastTriggeredDataLengthRef.current = data.length;
100
+ onReachBottom();
101
+ }, [
102
+ lastVirtualItemIndex,
103
+ rows.length,
104
+ data.length,
105
+ onReachBottom,
106
+ isFetchingMore,
107
+ hasMore,
108
+ reachBottomThreshold
109
+ ]);
110
+ return /* @__PURE__ */ jsx("div", { className: cn("w-full", className), children: /* @__PURE__ */ jsxs(
111
+ "div",
112
+ {
113
+ ref: scrollContainerRef,
114
+ className: "relative overflow-auto",
115
+ style: {
116
+ height: typeof height === "number" ? `${height}px` : height,
117
+ contain: "strict"
118
+ },
119
+ role: "table",
120
+ "aria-rowcount": data.length,
121
+ "aria-colcount": table.getVisibleLeafColumns().length,
122
+ children: [
123
+ /* @__PURE__ */ jsx("div", { className: "sticky top-0 z-10 bg-background", role: "rowgroup", children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(
124
+ "div",
125
+ {
126
+ className: "flex w-max min-w-full border-b border-border/50",
127
+ role: "row",
128
+ children: headerGroup.headers.map((header, colIdx) => /* @__PURE__ */ jsx(
129
+ "div",
130
+ {
131
+ className: "h-9 px-3 flex items-center text-xs font-medium text-muted-foreground whitespace-nowrap",
132
+ style: {
133
+ width: header.getSize(),
134
+ minWidth: header.getSize()
135
+ },
136
+ role: "columnheader",
137
+ "aria-colindex": colIdx + 1,
138
+ "aria-sort": header.column.getIsSorted() === "asc" ? "ascending" : header.column.getIsSorted() === "desc" ? "descending" : header.column.getCanSort() ? "none" : void 0,
139
+ children: header.isPlaceholder ? null : header.column.getCanSort() ? /* @__PURE__ */ jsxs(
140
+ "button",
141
+ {
142
+ type: "button",
143
+ className: "inline-flex items-center gap-1 hover:text-foreground transition-colors",
144
+ onClick: header.column.getToggleSortingHandler(),
145
+ children: [
146
+ flexRender(
147
+ header.column.columnDef.header,
148
+ header.getContext()
149
+ ),
150
+ header.column.getIsSorted() === "asc" ? /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }) : header.column.getIsSorted() === "desc" ? /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowUpDown, { className: "w-3 h-3 opacity-40" })
151
+ ]
152
+ }
153
+ ) : flexRender(
154
+ header.column.columnDef.header,
155
+ header.getContext()
156
+ )
157
+ },
158
+ header.id
159
+ ))
160
+ },
161
+ headerGroup.id
162
+ )) }),
163
+ rows.length > 0 ? /* @__PURE__ */ jsx(
164
+ "div",
165
+ {
166
+ role: "rowgroup",
167
+ style: {
168
+ height: virtualizer.getTotalSize(),
169
+ width: "100%",
170
+ position: "relative"
171
+ },
172
+ children: virtualizer.getVirtualItems().map((virtualRow) => {
173
+ const row = rows[virtualRow.index];
174
+ return /* @__PURE__ */ jsx(
175
+ "div",
176
+ {
177
+ "data-index": virtualRow.index,
178
+ ref: virtualizer.measureElement,
179
+ className: cn(
180
+ "absolute left-0 w-max min-w-full flex group transition-colors",
181
+ onRowClick && "cursor-pointer"
182
+ ),
183
+ style: {
184
+ transform: `translateY(${virtualRow.start}px)`
185
+ },
186
+ role: "row",
187
+ "aria-rowindex": virtualRow.index + 2,
188
+ onClick: () => onRowClick == null ? void 0 : onRowClick(row.original),
189
+ tabIndex: onRowClick ? 0 : void 0,
190
+ onKeyDown: onRowClick ? (e) => {
191
+ if (e.key === "Enter" || e.key === " ") {
192
+ e.preventDefault();
193
+ onRowClick(row.original);
194
+ }
195
+ } : void 0,
196
+ children: row.getVisibleCells().map((cell, colIdx) => /* @__PURE__ */ jsx(
197
+ "div",
198
+ {
199
+ className: "px-3 py-3 flex items-center whitespace-nowrap group-hover:bg-muted/50",
200
+ style: {
201
+ width: cell.column.getSize(),
202
+ minWidth: cell.column.getSize()
203
+ },
204
+ role: "cell",
205
+ "aria-colindex": colIdx + 1,
206
+ children: flexRender(
207
+ cell.column.columnDef.cell,
208
+ cell.getContext()
209
+ )
210
+ },
211
+ cell.id
212
+ ))
213
+ },
214
+ row.id
215
+ );
216
+ })
217
+ }
218
+ ) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-1 text-muted-foreground py-20", children: [
219
+ emptyIcon != null ? emptyIcon : /* @__PURE__ */ jsx(SearchX, { className: "h-7 w-7 opacity-40" }),
220
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: emptyMessage }),
221
+ /* @__PURE__ */ jsx("p", { className: "text-xs", children: emptyDescription })
222
+ ] }),
223
+ isFetchingMore && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-4", children: /* @__PURE__ */ jsx(Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) })
224
+ ]
225
+ }
226
+ ) });
227
+ }
228
+ export {
229
+ VirtualizedDataTable
230
+ };
231
+ //# sourceMappingURL=virtualized-data-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/virtualized-data-table.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { useVirtualizer } from \"@tanstack/react-virtual\"\nimport {\n useReactTable,\n getCoreRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type ColumnFiltersState,\n type VisibilityState,\n type OnChangeFn,\n} from \"@tanstack/react-table\"\nimport { ArrowDown, ArrowUp, ArrowUpDown, SearchX, Loader2 } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\n\nexport interface VirtualizedDataTableProps<TData> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columns: ColumnDef<TData, any>[]\n data: TData[]\n\n // Virtualization\n height?: number | string\n estimateRowHeight?: number\n overscan?: number\n\n // Row interaction\n onRowClick?: (row: TData) => void\n getRowId?: (original: TData, index: number) => string\n\n // Infinite scroll\n onReachBottom?: () => void\n reachBottomThreshold?: number\n hasMore?: boolean\n isFetchingMore?: boolean\n\n // Server-driven state (controlled) — omit for internal state\n sorting?: SortingState\n onSortingChange?: OnChangeFn<SortingState>\n columnFilters?: ColumnFiltersState\n onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>\n columnVisibility?: VisibilityState\n onColumnVisibilityChange?: OnChangeFn<VisibilityState>\n\n // Empty state\n emptyIcon?: React.ReactNode\n emptyMessage?: string\n emptyDescription?: string\n\n // Styling\n className?: string\n}\n\nexport function VirtualizedDataTable<TData>({\n columns,\n data,\n height = 600,\n estimateRowHeight = 48,\n overscan = 8,\n onRowClick,\n getRowId,\n onReachBottom,\n reachBottomThreshold = 5,\n hasMore = true,\n isFetchingMore,\n sorting,\n onSortingChange,\n columnFilters,\n onColumnFiltersChange,\n columnVisibility,\n onColumnVisibilityChange,\n emptyIcon,\n emptyMessage = \"No rows found\",\n emptyDescription = \"Try adjusting your filters\",\n className,\n}: VirtualizedDataTableProps<TData>) {\n // Controlled/uncontrolled state for sorting\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([])\n const resolvedSorting = sorting ?? internalSorting\n const resolvedOnSortingChange = onSortingChange ?? setInternalSorting\n\n // Controlled/uncontrolled state for column filters\n const [internalColumnFilters, setInternalColumnFilters] =\n React.useState<ColumnFiltersState>([])\n const resolvedColumnFilters = columnFilters ?? internalColumnFilters\n const resolvedOnColumnFiltersChange =\n onColumnFiltersChange ?? setInternalColumnFilters\n\n // Controlled/uncontrolled state for column visibility\n const [internalColumnVisibility, setInternalColumnVisibility] =\n React.useState<VisibilityState>({})\n const resolvedColumnVisibility = columnVisibility ?? internalColumnVisibility\n const resolvedOnColumnVisibilityChange =\n onColumnVisibilityChange ?? setInternalColumnVisibility\n\n // TanStack Table setup\n const table = useReactTable({\n data,\n columns,\n ...(getRowId ? { getRowId } : {}),\n state: {\n sorting: resolvedSorting,\n columnFilters: resolvedColumnFilters,\n columnVisibility: resolvedColumnVisibility,\n },\n onSortingChange: resolvedOnSortingChange,\n onColumnFiltersChange: resolvedOnColumnFiltersChange,\n onColumnVisibilityChange: resolvedOnColumnVisibilityChange,\n manualSorting: true,\n manualFiltering: true,\n manualPagination: true,\n getCoreRowModel: getCoreRowModel(),\n })\n\n // Virtualizer setup\n const scrollContainerRef = React.useRef<HTMLDivElement>(null)\n const rows = table.getRowModel().rows\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: () => estimateRowHeight,\n overscan,\n measureElement: (element) => element.getBoundingClientRect().height,\n })\n\n // Infinite scroll detection\n const lastTriggeredDataLengthRef = React.useRef<number>(0)\n\n // Derive a stable primitive for the last visible virtual-item index so the\n // effect below doesn't re-run on every render (getVirtualItems() returns a\n // new array reference each call).\n const virtualItems = virtualizer.getVirtualItems()\n const lastVirtualItemIndex =\n virtualItems.length > 0\n ? virtualItems[virtualItems.length - 1].index\n : -1\n\n React.useEffect(() => {\n if (!onReachBottom || isFetchingMore || hasMore === false) return\n if (lastVirtualItemIndex < 0) return\n if (lastVirtualItemIndex < rows.length - reachBottomThreshold) return\n\n // Prevent re-firing until data.length changes (i.e. new page loaded).\n if (lastTriggeredDataLengthRef.current === data.length) return\n lastTriggeredDataLengthRef.current = data.length\n\n onReachBottom()\n }, [\n lastVirtualItemIndex,\n rows.length,\n data.length,\n onReachBottom,\n isFetchingMore,\n hasMore,\n reachBottomThreshold,\n ])\n\n return (\n <div className={cn(\"w-full\", className)}>\n <div\n ref={scrollContainerRef}\n className=\"relative overflow-auto\"\n style={{\n height: typeof height === \"number\" ? `${height}px` : height,\n contain: \"strict\",\n }}\n role=\"table\"\n aria-rowcount={data.length}\n aria-colcount={table.getVisibleLeafColumns().length}\n >\n {/* Sticky header */}\n <div className=\"sticky top-0 z-10 bg-background\" role=\"rowgroup\">\n {table.getHeaderGroups().map((headerGroup) => (\n <div\n key={headerGroup.id}\n className=\"flex w-max min-w-full border-b border-border/50\"\n role=\"row\"\n >\n {headerGroup.headers.map((header, colIdx) => (\n <div\n key={header.id}\n className=\"h-9 px-3 flex items-center text-xs font-medium text-muted-foreground whitespace-nowrap\"\n style={{\n width: header.getSize(),\n minWidth: header.getSize(),\n }}\n role=\"columnheader\"\n aria-colindex={colIdx + 1}\n aria-sort={\n header.column.getIsSorted() === \"asc\"\n ? \"ascending\"\n : header.column.getIsSorted() === \"desc\"\n ? \"descending\"\n : header.column.getCanSort()\n ? \"none\"\n : undefined\n }\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 hover:text-foreground transition-colors\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {header.column.getIsSorted() === \"asc\" ? (\n <ArrowUp className=\"w-3 h-3\" />\n ) : header.column.getIsSorted() === \"desc\" ? (\n <ArrowDown className=\"w-3 h-3\" />\n ) : (\n <ArrowUpDown className=\"w-3 h-3 opacity-40\" />\n )}\n </button>\n ) : (\n flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )\n )}\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Virtualized body or empty state */}\n {rows.length > 0 ? (\n <div\n role=\"rowgroup\"\n style={{\n height: virtualizer.getTotalSize(),\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {virtualizer.getVirtualItems().map((virtualRow) => {\n const row = rows[virtualRow.index]\n return (\n <div\n key={row.id}\n data-index={virtualRow.index}\n ref={virtualizer.measureElement}\n className={cn(\n \"absolute left-0 w-max min-w-full flex group transition-colors\",\n onRowClick && \"cursor-pointer\",\n )}\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n role=\"row\"\n aria-rowindex={virtualRow.index + 2}\n onClick={() => onRowClick?.(row.original)}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={\n onRowClick\n ? (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n onRowClick(row.original)\n }\n }\n : undefined\n }\n >\n {row.getVisibleCells().map((cell, colIdx) => (\n <div\n key={cell.id}\n className=\"px-3 py-3 flex items-center whitespace-nowrap group-hover:bg-muted/50\"\n style={{\n width: cell.column.getSize(),\n minWidth: cell.column.getSize(),\n }}\n role=\"cell\"\n aria-colindex={colIdx + 1}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </div>\n ))}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-1 text-muted-foreground py-20\">\n {emptyIcon ?? <SearchX className=\"h-7 w-7 opacity-40\" />}\n <p className=\"text-sm font-medium\">{emptyMessage}</p>\n <p className=\"text-xs\">{emptyDescription}</p>\n </div>\n )}\n\n {/* Loading indicator */}\n {isFetchingMore && (\n <div className=\"flex items-center justify-center py-4\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n )}\n </div>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA0MoB,SAUI,KAVJ;AAxMpB,YAAY,WAAW;AACvB,SAAS,sBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AACP,SAAS,WAAW,SAAS,aAAa,SAAS,eAAe;AAElE,SAAS,UAAU;AAuCZ,SAAS,qBAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB;AACF,GAAqC;AAEnC,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAuB,CAAC,CAAC;AAC7E,QAAM,kBAAkB,4BAAW;AACnC,QAAM,0BAA0B,4CAAmB;AAGnD,QAAM,CAAC,uBAAuB,wBAAwB,IACpD,MAAM,SAA6B,CAAC,CAAC;AACvC,QAAM,wBAAwB,wCAAiB;AAC/C,QAAM,gCACJ,wDAAyB;AAG3B,QAAM,CAAC,0BAA0B,2BAA2B,IAC1D,MAAM,SAA0B,CAAC,CAAC;AACpC,QAAM,2BAA2B,8CAAoB;AACrD,QAAM,mCACJ,8DAA4B;AAG9B,QAAM,QAAQ,cAAc;AAAA,IAC1B;AAAA,IACA;AAAA,KACI,WAAW,EAAE,SAAS,IAAI,CAAC,IAHL;AAAA,IAI1B,OAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe;AAAA,MACf,kBAAkB;AAAA,IACpB;AAAA,IACA,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,iBAAiB,gBAAgB;AAAA,EACnC,EAAC;AAGD,QAAM,qBAAqB,MAAM,OAAuB,IAAI;AAC5D,QAAM,OAAO,MAAM,YAAY,EAAE;AAEjC,QAAM,cAAc,eAAe;AAAA,IACjC,OAAO,KAAK;AAAA,IACZ,kBAAkB,MAAM,mBAAmB;AAAA,IAC3C,cAAc,MAAM;AAAA,IACpB;AAAA,IACA,gBAAgB,CAAC,YAAY,QAAQ,sBAAsB,EAAE;AAAA,EAC/D,CAAC;AAGD,QAAM,6BAA6B,MAAM,OAAe,CAAC;AAKzD,QAAM,eAAe,YAAY,gBAAgB;AACjD,QAAM,uBACJ,aAAa,SAAS,IAClB,aAAa,aAAa,SAAS,CAAC,EAAE,QACtC;AAEN,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,iBAAiB,kBAAkB,YAAY,MAAO;AAC3D,QAAI,uBAAuB,EAAG;AAC9B,QAAI,uBAAuB,KAAK,SAAS,qBAAsB;AAG/D,QAAI,2BAA2B,YAAY,KAAK,OAAQ;AACxD,+BAA2B,UAAU,KAAK;AAE1C,kBAAc;AAAA,EAChB,GAAG;AAAA,IACD;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,oBAAC,SAAI,WAAW,GAAG,UAAU,SAAS,GACpC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO;AAAA,QACL,QAAQ,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO;AAAA,QACrD,SAAS;AAAA,MACX;AAAA,MACA,MAAK;AAAA,MACL,iBAAe,KAAK;AAAA,MACpB,iBAAe,MAAM,sBAAsB,EAAE;AAAA,MAG7C;AAAA,4BAAC,SAAI,WAAU,mCAAkC,MAAK,YACnD,gBAAM,gBAAgB,EAAE,IAAI,CAAC,gBAC5B;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,MAAK;AAAA,YAEJ,sBAAY,QAAQ,IAAI,CAAC,QAAQ,WAChC;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,OAAO,OAAO,QAAQ;AAAA,kBACtB,UAAU,OAAO,QAAQ;AAAA,gBAC3B;AAAA,gBACA,MAAK;AAAA,gBACL,iBAAe,SAAS;AAAA,gBACxB,aACE,OAAO,OAAO,YAAY,MAAM,QAC5B,cACA,OAAO,OAAO,YAAY,MAAM,SAC9B,eACA,OAAO,OAAO,WAAW,IACvB,SACA;AAAA,gBAGT,iBAAO,gBAAgB,OAAO,OAAO,OAAO,WAAW,IACtD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,OAAO,OAAO,wBAAwB;AAAA,oBAE9C;AAAA;AAAA,wBACC,OAAO,OAAO,UAAU;AAAA,wBACxB,OAAO,WAAW;AAAA,sBACpB;AAAA,sBACC,OAAO,OAAO,YAAY,MAAM,QAC/B,oBAAC,WAAQ,WAAU,WAAU,IAC3B,OAAO,OAAO,YAAY,MAAM,SAClC,oBAAC,aAAU,WAAU,WAAU,IAE/B,oBAAC,eAAY,WAAU,sBAAqB;AAAA;AAAA;AAAA,gBAEhD,IAEA;AAAA,kBACE,OAAO,OAAO,UAAU;AAAA,kBACxB,OAAO,WAAW;AAAA,gBACpB;AAAA;AAAA,cAxCG,OAAO;AAAA,YA0Cd,CACD;AAAA;AAAA,UAjDI,YAAY;AAAA,QAkDnB,CACD,GACH;AAAA,QAGC,KAAK,SAAS,IACb;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,cACL,QAAQ,YAAY,aAAa;AAAA,cACjC,OAAO;AAAA,cACP,UAAU;AAAA,YACZ;AAAA,YAEC,sBAAY,gBAAgB,EAAE,IAAI,CAAC,eAAe;AACjD,oBAAM,MAAM,KAAK,WAAW,KAAK;AACjC,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,cAAY,WAAW;AAAA,kBACvB,KAAK,YAAY;AAAA,kBACjB,WAAW;AAAA,oBACT;AAAA,oBACA,cAAc;AAAA,kBAChB;AAAA,kBACA,OAAO;AAAA,oBACL,WAAW,cAAc,WAAW,KAAK;AAAA,kBAC3C;AAAA,kBACA,MAAK;AAAA,kBACL,iBAAe,WAAW,QAAQ;AAAA,kBAClC,SAAS,MAAM,yCAAa,IAAI;AAAA,kBAChC,UAAU,aAAa,IAAI;AAAA,kBAC3B,WACE,aACI,CAAC,MAA2B;AAC1B,wBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,wBAAE,eAAe;AACjB,iCAAW,IAAI,QAAQ;AAAA,oBACzB;AAAA,kBACF,IACA;AAAA,kBAGL,cAAI,gBAAgB,EAAE,IAAI,CAAC,MAAM,WAChC;AAAA,oBAAC;AAAA;AAAA,sBAEC,WAAU;AAAA,sBACV,OAAO;AAAA,wBACL,OAAO,KAAK,OAAO,QAAQ;AAAA,wBAC3B,UAAU,KAAK,OAAO,QAAQ;AAAA,sBAChC;AAAA,sBACA,MAAK;AAAA,sBACL,iBAAe,SAAS;AAAA,sBAEvB;AAAA,wBACC,KAAK,OAAO,UAAU;AAAA,wBACtB,KAAK,WAAW;AAAA,sBAClB;AAAA;AAAA,oBAZK,KAAK;AAAA,kBAaZ,CACD;AAAA;AAAA,gBAzCI,IAAI;AAAA,cA0CX;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH,IAEA,qBAAC,SAAI,WAAU,+EACZ;AAAA,0CAAa,oBAAC,WAAQ,WAAU,sBAAqB;AAAA,UACtD,oBAAC,OAAE,WAAU,uBAAuB,wBAAa;AAAA,UACjD,oBAAC,OAAE,WAAU,WAAW,4BAAiB;AAAA,WAC3C;AAAA,QAID,kBACC,oBAAC,SAAI,WAAU,yCACb,8BAAC,WAAQ,WAAU,8CAA6C,GAClE;AAAA;AAAA;AAAA,EAEJ,GACF;AAEJ;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function useIsMobile(): boolean;
2
+
3
+ export { useIsMobile };
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ const MOBILE_BREAKPOINT = 768;
3
+ function useIsMobile() {
4
+ const [isMobile, setIsMobile] = React.useState(
5
+ void 0
6
+ );
7
+ React.useEffect(() => {
8
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
9
+ const onChange = () => {
10
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
11
+ };
12
+ mql.addEventListener("change", onChange);
13
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
14
+ return () => mql.removeEventListener("change", onChange);
15
+ }, []);
16
+ return !!isMobile;
17
+ }
18
+ export {
19
+ useIsMobile
20
+ };
21
+ //# sourceMappingURL=use-mobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/use-mobile.ts"],"sourcesContent":["import * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener(\"change\", onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return !!isMobile;\n}\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,MAAM,oBAAoB;AAEnB,SAAS,cAAc;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AACpB,UAAM,MAAM,OAAO,WAAW,eAAe,oBAAoB,CAAC,KAAK;AACvE,UAAM,WAAW,MAAM;AACrB,kBAAY,OAAO,aAAa,iBAAiB;AAAA,IACnD;AACA,QAAI,iBAAiB,UAAU,QAAQ;AACvC,gBAAY,OAAO,aAAa,iBAAiB;AACjD,WAAO,MAAM,IAAI,oBAAoB,UAAU,QAAQ;AAAA,EACzD,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,CAAC;AACX;","names":[]}