pixelize-design-library 2.2.192 → 3.0.1-beta.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 (216) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/MIGRATION.md +562 -0
  3. package/coverage/clover.xml +638 -0
  4. package/coverage/coverage-final.json +20 -0
  5. package/coverage/lcov-report/Table/CompactSelect.tsx.html +379 -0
  6. package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +514 -0
  7. package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +373 -0
  8. package/coverage/lcov-report/Table/Components/Pagination.tsx.html +574 -0
  9. package/coverage/lcov-report/Table/Components/TableActions.tsx.html +574 -0
  10. package/coverage/lcov-report/Table/Components/TableBody.tsx.html +1027 -0
  11. package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +397 -0
  12. package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +1060 -0
  13. package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +361 -0
  14. package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +337 -0
  15. package/coverage/lcov-report/Table/Components/index.html +266 -0
  16. package/coverage/lcov-report/Table/Components/useDebounce.ts.html +178 -0
  17. package/coverage/lcov-report/Table/Components/useTable.ts.html +778 -0
  18. package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +1810 -0
  19. package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +178 -0
  20. package/coverage/lcov-report/Table/Table.tsx.html +1567 -0
  21. package/coverage/lcov-report/Table/TableProps.tsx.html +658 -0
  22. package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +619 -0
  23. package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +229 -0
  24. package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +532 -0
  25. package/coverage/lcov-report/Table/TableSettings/index.html +146 -0
  26. package/coverage/lcov-report/Table/TableToDo.tsx.html +973 -0
  27. package/coverage/lcov-report/Table/TextOperationControls.tsx.html +271 -0
  28. package/coverage/lcov-report/Table/filterTypes.ts.html +97 -0
  29. package/coverage/lcov-report/Table/index.html +176 -0
  30. package/coverage/lcov-report/base.css +224 -0
  31. package/coverage/lcov-report/block-navigation.js +87 -0
  32. package/coverage/lcov-report/favicon.png +0 -0
  33. package/coverage/lcov-report/index.html +146 -0
  34. package/coverage/lcov-report/prettify.css +1 -0
  35. package/coverage/lcov-report/prettify.js +2 -0
  36. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  37. package/coverage/lcov-report/sorter.js +210 -0
  38. package/coverage/lcov.info +1836 -0
  39. package/dist/Assets/defaultLogo.tsx +31 -0
  40. package/dist/Components/Table/Components/ActiveFilters.js +3 -3
  41. package/dist/Theme/Dark/palette.d.ts +370 -0
  42. package/dist/Theme/Dark/palette.js +372 -0
  43. package/dist/components-v2/AlertDialog/AlertDialog.d.ts +23 -0
  44. package/dist/components-v2/AlertDialog/AlertDialog.js +98 -0
  45. package/dist/components-v2/Breadcrumbs/Breadcrumbs.d.ts +14 -0
  46. package/dist/components-v2/Breadcrumbs/Breadcrumbs.js +66 -0
  47. package/dist/components-v2/Charts/AreaChart.d.ts +23 -0
  48. package/dist/components-v2/Charts/AreaChart.js +63 -0
  49. package/dist/components-v2/Charts/BarChart.d.ts +25 -0
  50. package/dist/components-v2/Charts/BarChart.js +57 -0
  51. package/dist/components-v2/Charts/LineChart.d.ts +23 -0
  52. package/dist/components-v2/Charts/LineChart.js +55 -0
  53. package/dist/components-v2/Charts/PieChart.d.ts +15 -0
  54. package/dist/components-v2/Charts/PieChart.js +54 -0
  55. package/dist/components-v2/Charts/PolarChart.d.ts +14 -0
  56. package/dist/components-v2/Charts/PolarChart.js +54 -0
  57. package/dist/components-v2/Charts/chartOptions.d.ts +7 -0
  58. package/dist/components-v2/Charts/chartOptions.js +41 -0
  59. package/dist/components-v2/Charts/useChartTheme.d.ts +22 -0
  60. package/dist/components-v2/Charts/useChartTheme.js +106 -0
  61. package/dist/components-v2/ContactForm/ContactForm.d.ts +25 -0
  62. package/dist/components-v2/ContactForm/ContactForm.js +116 -0
  63. package/dist/components-v2/DatePicker/Calendar.d.ts +19 -0
  64. package/dist/components-v2/DatePicker/Calendar.js +212 -0
  65. package/dist/components-v2/DatePicker/DatePicker.d.ts +46 -0
  66. package/dist/components-v2/DatePicker/DatePicker.js +189 -0
  67. package/dist/components-v2/DatePicker/TimePicker.d.ts +12 -0
  68. package/dist/components-v2/DatePicker/TimePicker.js +105 -0
  69. package/dist/components-v2/DatePicker/utils.d.ts +31 -0
  70. package/dist/components-v2/DatePicker/utils.js +109 -0
  71. package/dist/components-v2/Drawer/Drawer.d.ts +27 -0
  72. package/dist/components-v2/Drawer/Drawer.js +132 -0
  73. package/dist/components-v2/FeedbackForm/FeedbackForm.d.ts +26 -0
  74. package/dist/components-v2/FeedbackForm/FeedbackForm.js +112 -0
  75. package/dist/components-v2/FileUploader/FileUploader.d.ts +28 -0
  76. package/dist/components-v2/FileUploader/FileUploader.js +127 -0
  77. package/dist/components-v2/Input/TextInput.d.ts +41 -0
  78. package/dist/components-v2/Input/TextInput.js +169 -0
  79. package/dist/components-v2/KanbanBoard/KanbanBoard.d.ts +39 -0
  80. package/dist/components-v2/KanbanBoard/KanbanBoard.js +101 -0
  81. package/dist/components-v2/Layout/AppLayout.d.ts +22 -0
  82. package/dist/components-v2/Layout/AppLayout.js +53 -0
  83. package/dist/components-v2/Loading/Loading.d.ts +19 -0
  84. package/dist/components-v2/Loading/Loading.js +55 -0
  85. package/dist/components-v2/Modal/Modal.d.ts +30 -0
  86. package/dist/components-v2/Modal/Modal.js +82 -0
  87. package/dist/components-v2/NavigationBar/NavigationBar.d.ts +47 -0
  88. package/dist/components-v2/NavigationBar/NavigationBar.js +148 -0
  89. package/dist/components-v2/Notification/Notification.d.ts +22 -0
  90. package/dist/components-v2/Notification/Notification.js +113 -0
  91. package/dist/components-v2/NumberInput/NumberInput.d.ts +37 -0
  92. package/dist/components-v2/NumberInput/NumberInput.js +210 -0
  93. package/dist/components-v2/PinInput/PinInput.d.ts +26 -0
  94. package/dist/components-v2/PinInput/PinInput.js +138 -0
  95. package/dist/components-v2/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +18 -0
  96. package/dist/components-v2/ProfilePhotoViewer/ProfilePhotoViewer.js +91 -0
  97. package/dist/components-v2/Select/Select.d.ts +41 -0
  98. package/dist/components-v2/Select/Select.js +284 -0
  99. package/dist/components-v2/Sidebar/Sidebar.d.ts +41 -0
  100. package/dist/components-v2/Sidebar/Sidebar.js +182 -0
  101. package/dist/components-v2/Slider/Slider.d.ts +18 -0
  102. package/dist/components-v2/Slider/Slider.js +101 -0
  103. package/dist/components-v2/Table/Table.d.ts +7 -0
  104. package/dist/components-v2/Table/Table.js +172 -0
  105. package/dist/components-v2/Table/TableProps.d.ts +139 -0
  106. package/dist/components-v2/Table/TableProps.js +9 -0
  107. package/dist/components-v2/Table/components/ActiveFilters.d.ts +10 -0
  108. package/dist/components-v2/Table/components/ActiveFilters.js +70 -0
  109. package/dist/components-v2/Table/components/BulkActionBar.d.ts +11 -0
  110. package/dist/components-v2/Table/components/BulkActionBar.js +92 -0
  111. package/dist/components-v2/Table/components/ColumnResizeHandle.d.ts +7 -0
  112. package/dist/components-v2/Table/components/ColumnResizeHandle.js +41 -0
  113. package/dist/components-v2/Table/components/Pagination.d.ts +11 -0
  114. package/dist/components-v2/Table/components/Pagination.js +92 -0
  115. package/dist/components-v2/Table/components/TableBody.d.ts +23 -0
  116. package/dist/components-v2/Table/components/TableBody.js +69 -0
  117. package/dist/components-v2/Table/components/TableCell.d.ts +14 -0
  118. package/dist/components-v2/Table/components/TableCell.js +63 -0
  119. package/dist/components-v2/Table/components/TableEmptyState.d.ts +12 -0
  120. package/dist/components-v2/Table/components/TableEmptyState.js +55 -0
  121. package/dist/components-v2/Table/components/TableErrorState.d.ts +6 -0
  122. package/dist/components-v2/Table/components/TableErrorState.js +52 -0
  123. package/dist/components-v2/Table/components/TableHeader.d.ts +21 -0
  124. package/dist/components-v2/Table/components/TableHeader.js +94 -0
  125. package/dist/components-v2/Table/components/TableRow.d.ts +20 -0
  126. package/dist/components-v2/Table/components/TableRow.js +64 -0
  127. package/dist/components-v2/Table/components/TableSearch.d.ts +8 -0
  128. package/dist/components-v2/Table/components/TableSearch.js +47 -0
  129. package/dist/components-v2/Table/filters/FilterChips.d.ts +6 -0
  130. package/dist/components-v2/Table/filters/FilterChips.js +9 -0
  131. package/dist/components-v2/Table/filters/LeftFilterPane.d.ts +17 -0
  132. package/dist/components-v2/Table/filters/LeftFilterPane.js +105 -0
  133. package/dist/components-v2/Table/filters/TableFilters.d.ts +12 -0
  134. package/dist/components-v2/Table/filters/TableFilters.js +127 -0
  135. package/dist/components-v2/Table/hooks/useColumnResize.d.ts +15 -0
  136. package/dist/components-v2/Table/hooks/useColumnResize.js +104 -0
  137. package/dist/components-v2/Table/hooks/useTable.d.ts +58 -0
  138. package/dist/components-v2/Table/hooks/useTable.js +254 -0
  139. package/dist/components-v2/Table/hooks/useTableKeyboard.d.ts +25 -0
  140. package/dist/components-v2/Table/hooks/useTableKeyboard.js +112 -0
  141. package/dist/components-v2/Table/hooks/useVirtualScroll.d.ts +29 -0
  142. package/dist/components-v2/Table/hooks/useVirtualScroll.js +83 -0
  143. package/dist/components-v2/Table/settings/ManageColumns.d.ts +12 -0
  144. package/dist/components-v2/Table/settings/ManageColumns.js +59 -0
  145. package/dist/components-v2/Table/settings/TableSettings.d.ts +12 -0
  146. package/dist/components-v2/Table/settings/TableSettings.js +57 -0
  147. package/dist/components-v2/Table/utils/filterUtils.d.ts +7 -0
  148. package/dist/components-v2/Table/utils/filterUtils.js +149 -0
  149. package/dist/components-v2/Table/utils/sortUtils.d.ts +6 -0
  150. package/dist/components-v2/Table/utils/sortUtils.js +65 -0
  151. package/dist/components-v2/Tag/Tag.d.ts +15 -0
  152. package/dist/components-v2/Tag/Tag.js +87 -0
  153. package/dist/components-v2/Timeline/Timeline.d.ts +18 -0
  154. package/dist/components-v2/Timeline/Timeline.js +76 -0
  155. package/dist/components-v2/Toaster/Toaster.d.ts +61 -0
  156. package/dist/components-v2/Toaster/Toaster.js +63 -0
  157. package/dist/components-v2/Toggle/Toggle.d.ts +28 -0
  158. package/dist/components-v2/Toggle/Toggle.js +90 -0
  159. package/dist/components-v2/ui/accordion.d.ts +12 -0
  160. package/dist/components-v2/ui/accordion.js +104 -0
  161. package/dist/components-v2/ui/alert.d.ts +18 -0
  162. package/dist/components-v2/ui/alert.js +99 -0
  163. package/dist/components-v2/ui/avatar.d.ts +12 -0
  164. package/dist/components-v2/ui/avatar.js +80 -0
  165. package/dist/components-v2/ui/badge.d.ts +10 -0
  166. package/dist/components-v2/ui/badge.js +76 -0
  167. package/dist/components-v2/ui/button.d.ts +18 -0
  168. package/dist/components-v2/ui/button.js +97 -0
  169. package/dist/components-v2/ui/checkbox.d.ts +15 -0
  170. package/dist/components-v2/ui/checkbox.js +86 -0
  171. package/dist/components-v2/ui/dialog.d.ts +30 -0
  172. package/dist/components-v2/ui/dialog.js +115 -0
  173. package/dist/components-v2/ui/dropdown-menu.d.ts +26 -0
  174. package/dist/components-v2/ui/dropdown-menu.js +121 -0
  175. package/dist/components-v2/ui/field.d.ts +32 -0
  176. package/dist/components-v2/ui/field.js +62 -0
  177. package/dist/components-v2/ui/form-field.d.ts +25 -0
  178. package/dist/components-v2/ui/form-field.js +96 -0
  179. package/dist/components-v2/ui/input.d.ts +9 -0
  180. package/dist/components-v2/ui/input.js +73 -0
  181. package/dist/components-v2/ui/label.d.ts +10 -0
  182. package/dist/components-v2/ui/label.js +70 -0
  183. package/dist/components-v2/ui/popover.d.ts +9 -0
  184. package/dist/components-v2/ui/popover.js +60 -0
  185. package/dist/components-v2/ui/progress.d.ts +12 -0
  186. package/dist/components-v2/ui/progress.js +75 -0
  187. package/dist/components-v2/ui/radio-group.d.ts +17 -0
  188. package/dist/components-v2/ui/radio-group.js +91 -0
  189. package/dist/components-v2/ui/select.d.ts +24 -0
  190. package/dist/components-v2/ui/select.js +122 -0
  191. package/dist/components-v2/ui/separator.d.ts +5 -0
  192. package/dist/components-v2/ui/separator.js +55 -0
  193. package/dist/components-v2/ui/skeleton.d.ts +9 -0
  194. package/dist/components-v2/ui/skeleton.js +68 -0
  195. package/dist/components-v2/ui/spinner.d.ts +16 -0
  196. package/dist/components-v2/ui/spinner.js +64 -0
  197. package/dist/components-v2/ui/switch.d.ts +10 -0
  198. package/dist/components-v2/ui/switch.js +81 -0
  199. package/dist/components-v2/ui/tabs.d.ts +13 -0
  200. package/dist/components-v2/ui/tabs.js +95 -0
  201. package/dist/components-v2/ui/textarea.d.ts +10 -0
  202. package/dist/components-v2/ui/textarea.js +96 -0
  203. package/dist/components-v2/ui/tooltip.d.ts +17 -0
  204. package/dist/components-v2/ui/tooltip.js +75 -0
  205. package/dist/index.d.ts +128 -64
  206. package/dist/index.js +246 -173
  207. package/dist/lib/utils.d.ts +2 -0
  208. package/dist/lib/utils.js +8 -0
  209. package/dist/theme-v2/ThemeProvider.d.ts +19 -0
  210. package/dist/theme-v2/ThemeProvider.js +149 -0
  211. package/dist/theme-v2/dark.css +47 -0
  212. package/dist/theme-v2/tokens.css +72 -0
  213. package/package.json +41 -20
  214. package/tailwind.config.ts +91 -0
  215. package/vite.config.ts +49 -10
  216. package/index.html +0 -13
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Sidebar = Sidebar;
37
+ const React = __importStar(require("react"));
38
+ const framer_motion_1 = require("framer-motion");
39
+ const lucide_react_1 = require("lucide-react");
40
+ const utils_1 = require("../../lib/utils");
41
+ const badge_1 = require("../ui/badge");
42
+ const popover_1 = require("../ui/popover");
43
+ const skeleton_1 = require("../ui/skeleton");
44
+ const EXPANDED_WIDTH = 240;
45
+ const COLLAPSED_WIDTH = 64;
46
+ function Sidebar({ menus, activeItem, onItemClick, logo, companyName, collapsed: collapsedProp, onCollapsedChange, defaultCollapsed = false, mobileOpen = false, onMobileOpenChange, otherApps, footer, isLoading = false, className, }) {
47
+ const isCollapsedControlled = collapsedProp !== undefined;
48
+ const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);
49
+ const collapsed = isCollapsedControlled ? collapsedProp : internalCollapsed;
50
+ const toggleCollapsed = () => {
51
+ const next = !collapsed;
52
+ if (!isCollapsedControlled)
53
+ setInternalCollapsed(next);
54
+ onCollapsedChange === null || onCollapsedChange === void 0 ? void 0 : onCollapsedChange(next);
55
+ };
56
+ return (React.createElement(React.Fragment, null,
57
+ React.createElement(framer_motion_1.motion.aside, { "aria-label": "Main navigation", animate: { width: collapsed ? COLLAPSED_WIDTH : EXPANDED_WIDTH }, initial: false, transition: { duration: 0.2, ease: "easeInOut" }, className: (0, utils_1.cn)("sticky top-0 hidden h-screen shrink-0 flex-col border-r border-border bg-card text-card-foreground md:flex", className) },
58
+ React.createElement(SidebarBody, { menus: menus, activeItem: activeItem, onItemClick: onItemClick, logo: logo, companyName: companyName, collapsed: collapsed, onToggleCollapsed: toggleCollapsed, otherApps: otherApps, footer: footer, isLoading: isLoading })),
59
+ React.createElement(framer_motion_1.AnimatePresence, null, mobileOpen && (React.createElement(React.Fragment, null,
60
+ React.createElement(framer_motion_1.motion.div, { key: "sidebar-backdrop", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.15 }, onClick: () => onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false), className: "fixed inset-0 z-40 bg-foreground/40 backdrop-blur-sm md:hidden", "aria-hidden": "true" }),
61
+ React.createElement(framer_motion_1.motion.aside, { key: "sidebar-drawer", initial: { x: "-100%" }, animate: { x: 0 }, exit: { x: "-100%" }, transition: { duration: 0.2, ease: "easeInOut" }, className: (0, utils_1.cn)("fixed inset-y-0 left-0 z-50 flex w-60 flex-col border-r border-border bg-card text-card-foreground md:hidden", className), "aria-label": "Main navigation" },
62
+ React.createElement(SidebarBody, { menus: menus, activeItem: activeItem, onItemClick: (item) => {
63
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item);
64
+ onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false);
65
+ }, logo: logo, companyName: companyName, collapsed: false, onToggleCollapsed: () => onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false), otherApps: otherApps, footer: footer, isLoading: isLoading, isMobileDrawer: true })))))));
66
+ }
67
+ function SidebarBody({ menus, activeItem, onItemClick, logo, companyName, collapsed, onToggleCollapsed, otherApps, footer, isLoading, isMobileDrawer = false, }) {
68
+ var _a, _b;
69
+ return (React.createElement("nav", { className: "flex h-full min-h-0 flex-col", "aria-label": "Sidebar" },
70
+ React.createElement("div", { className: (0, utils_1.cn)("flex h-14 shrink-0 items-center gap-2 border-b border-border px-3", collapsed && "justify-center px-2") },
71
+ logo ? (React.createElement("img", { src: logo, alt: "", className: "h-7 w-7 shrink-0 rounded-md object-contain" })) : (React.createElement("div", { className: "grid h-7 w-7 shrink-0 place-items-center rounded-md bg-primary text-xs font-semibold text-primary-foreground" }, (_b = (_a = companyName === null || companyName === void 0 ? void 0 : companyName[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase()) !== null && _b !== void 0 ? _b : "P")),
72
+ !collapsed && companyName && (React.createElement("span", { className: "truncate text-sm font-semibold text-foreground" }, companyName))),
73
+ React.createElement("ul", { className: "flex-1 overflow-y-auto px-2 py-3", role: "list" }, isLoading
74
+ ? Array.from({ length: 5 }).map((_, index) => (React.createElement("li", { key: `skeleton-${index}`, className: "mb-1" },
75
+ React.createElement("div", { className: (0, utils_1.cn)("flex items-center gap-2 px-2 py-1.5", collapsed && "justify-center") },
76
+ React.createElement(skeleton_1.Skeleton, { variant: "rectangle", className: "h-5 w-5 rounded" }),
77
+ !collapsed && (React.createElement(skeleton_1.Skeleton, { variant: "text", className: "h-3 w-24" }))))))
78
+ : menus.map((item) => (React.createElement(SidebarMenuRow, { key: item.id, item: item, activeItem: activeItem, collapsed: collapsed, onItemClick: onItemClick })))),
79
+ otherApps && otherApps.length > 0 && (React.createElement("div", { className: "shrink-0 border-t border-border px-2 py-2" }, collapsed ? (React.createElement(popover_1.Popover, null,
80
+ React.createElement(popover_1.PopoverTrigger, { asChild: true },
81
+ React.createElement("button", { type: "button", "aria-label": "Other apps", className: "flex h-9 w-full items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" },
82
+ React.createElement(lucide_react_1.Grid3x3, { "aria-hidden": "true", className: "h-4 w-4" }))),
83
+ React.createElement(popover_1.PopoverContent, { side: "right", align: "end", className: "w-56 p-1" },
84
+ React.createElement(OtherAppsList, { apps: otherApps })))) : (React.createElement(React.Fragment, null,
85
+ React.createElement("p", { className: "px-2 pb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground" }, "Other apps"),
86
+ React.createElement(OtherAppsList, { apps: otherApps }))))),
87
+ footer && (React.createElement("div", { className: "shrink-0 border-t border-border px-2 py-2" }, footer)),
88
+ React.createElement("div", { className: "shrink-0 border-t border-border px-2 py-2" },
89
+ React.createElement("button", { type: "button", onClick: onToggleCollapsed, "aria-label": isMobileDrawer
90
+ ? "Close sidebar"
91
+ : collapsed
92
+ ? "Expand sidebar"
93
+ : "Collapse sidebar", "aria-expanded": !collapsed, className: "flex h-8 w-full items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" },
94
+ React.createElement(lucide_react_1.ChevronLeft, { "aria-hidden": "true", className: (0, utils_1.cn)("h-4 w-4 transition-transform motion-safe:duration-200", collapsed && "rotate-180") })))));
95
+ }
96
+ function SidebarMenuRow({ item, activeItem, collapsed, onItemClick, nested = false, }) {
97
+ var _a;
98
+ const hasChildren = !!item.children && item.children.length > 0;
99
+ const isActive = activeItem === item.id;
100
+ const childActive = hasChildren &&
101
+ item.children.some((child) => child.id === activeItem);
102
+ const [expanded, setExpanded] = React.useState(childActive);
103
+ React.useEffect(() => {
104
+ if (childActive)
105
+ setExpanded(true);
106
+ }, [childActive]);
107
+ const [hoverOpen, setHoverOpen] = React.useState(false);
108
+ const closeTimer = React.useRef(null);
109
+ const scheduleClose = () => {
110
+ if (closeTimer.current)
111
+ window.clearTimeout(closeTimer.current);
112
+ closeTimer.current = window.setTimeout(() => setHoverOpen(false), 120);
113
+ };
114
+ const cancelClose = () => {
115
+ if (closeTimer.current)
116
+ window.clearTimeout(closeTimer.current);
117
+ setHoverOpen(true);
118
+ };
119
+ const handleClick = (event) => {
120
+ if (item.disabled)
121
+ return;
122
+ event.preventDefault();
123
+ if (hasChildren && !collapsed) {
124
+ setExpanded((prev) => !prev);
125
+ return;
126
+ }
127
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item);
128
+ };
129
+ const IconComponent = item.icon;
130
+ const trigger = (React.createElement("button", { type: "button", disabled: item.disabled, "aria-current": isActive ? "page" : undefined, "aria-disabled": item.disabled || undefined, "aria-haspopup": hasChildren ? "menu" : undefined, "aria-expanded": hasChildren ? expanded || hoverOpen : undefined, "aria-label": collapsed ? item.title : undefined, onClick: handleClick, onMouseEnter: collapsed && hasChildren ? cancelClose : undefined, onMouseLeave: collapsed && hasChildren ? scheduleClose : undefined, className: (0, utils_1.cn)("group relative flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm transition-colors", "text-muted-foreground hover:bg-accent hover:text-foreground", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", isActive && "bg-primary/10 text-primary hover:bg-primary/15", collapsed && "justify-center px-2", nested && "py-1 text-xs") },
131
+ isActive && (React.createElement("span", { "aria-hidden": "true", className: "absolute left-0 top-1/2 h-5 w-0.5 -translate-y-1/2 rounded-r bg-primary" })),
132
+ IconComponent ? (React.createElement(IconComponent, { "aria-hidden": "true", className: (0, utils_1.cn)("h-4 w-4 shrink-0", isActive && "text-primary") })) : (React.createElement("span", { "aria-hidden": "true", className: "h-4 w-4 shrink-0 rounded-sm bg-muted" })),
133
+ !collapsed && (React.createElement(React.Fragment, null,
134
+ React.createElement("span", { className: "flex-1 truncate text-left" }, item.title),
135
+ item.badge && (React.createElement(badge_1.Badge, { variant: badgeVariant(item.badge.variant), size: "sm", className: "px-1.5 py-0 text-[10px]" }, (_a = item.badge.label) !== null && _a !== void 0 ? _a : item.badge.count)),
136
+ hasChildren && (React.createElement(lucide_react_1.ChevronDown, { "aria-hidden": "true", className: (0, utils_1.cn)("h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform motion-safe:duration-200", expanded && "rotate-180") })))),
137
+ collapsed && item.badge && (React.createElement("span", { "aria-hidden": "true", className: (0, utils_1.cn)("absolute right-1 top-1 h-1.5 w-1.5 rounded-full", badgeDot(item.badge.variant)) }))));
138
+ if (collapsed && hasChildren) {
139
+ return (React.createElement("li", null,
140
+ React.createElement(popover_1.Popover, { open: hoverOpen, onOpenChange: setHoverOpen },
141
+ React.createElement(popover_1.PopoverTrigger, { asChild: true }, trigger),
142
+ React.createElement(popover_1.PopoverContent, { side: "right", align: "start", sideOffset: 8, onMouseEnter: cancelClose, onMouseLeave: scheduleClose, className: "w-56 p-1" },
143
+ React.createElement("div", { className: "px-2 py-1 text-xs font-semibold text-muted-foreground" }, item.title),
144
+ React.createElement("ul", { role: "list" }, item.children.map((child) => (React.createElement(SidebarMenuRow, { key: child.id, item: child, activeItem: activeItem, collapsed: false, onItemClick: (value) => {
145
+ setHoverOpen(false);
146
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(value);
147
+ }, nested: true }))))))));
148
+ }
149
+ return (React.createElement("li", null,
150
+ trigger,
151
+ hasChildren && !collapsed && (React.createElement(framer_motion_1.AnimatePresence, { initial: false }, expanded && (React.createElement(framer_motion_1.motion.ul, { key: "submenu", initial: { height: 0, opacity: 0 }, animate: { height: "auto", opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: { duration: 0.18, ease: "easeInOut" }, className: "ml-5 mt-0.5 overflow-hidden border-l border-border pl-2", role: "list" }, item.children.map((child) => (React.createElement(SidebarMenuRow, { key: child.id, item: child, activeItem: activeItem, collapsed: false, onItemClick: onItemClick, nested: true })))))))));
152
+ }
153
+ function OtherAppsList({ apps }) {
154
+ return (React.createElement("ul", { role: "list" }, apps.map((app) => (React.createElement("li", { key: app.id },
155
+ React.createElement("a", { href: app.url, className: "flex items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" },
156
+ app.iconUrl ? (React.createElement("img", { src: app.iconUrl, alt: "", className: "h-4 w-4 rounded-sm object-contain" })) : app.icon ? (React.createElement(app.icon, { "aria-hidden": "true", className: "h-4 w-4" })) : (React.createElement(lucide_react_1.Grid3x3, { "aria-hidden": "true", className: "h-4 w-4" })),
157
+ React.createElement("span", { className: "truncate" }, app.name)))))));
158
+ }
159
+ function badgeVariant(variant) {
160
+ switch (variant) {
161
+ case "destructive":
162
+ return "destructive";
163
+ case "success":
164
+ return "success";
165
+ case "warning":
166
+ return "warning";
167
+ default:
168
+ return "default";
169
+ }
170
+ }
171
+ function badgeDot(variant) {
172
+ switch (variant) {
173
+ case "destructive":
174
+ return "bg-destructive";
175
+ case "success":
176
+ return "bg-success";
177
+ case "warning":
178
+ return "bg-warning";
179
+ default:
180
+ return "bg-primary";
181
+ }
182
+ }
@@ -0,0 +1,18 @@
1
+ import * as React from "react";
2
+ import * as SliderPrimitive from "@radix-ui/react-slider";
3
+ export interface SliderMark {
4
+ value: number;
5
+ label?: React.ReactNode;
6
+ }
7
+ export interface SliderProps extends Omit<React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>, "value" | "defaultValue" | "onValueChange"> {
8
+ /** Single value or pair for range mode. */
9
+ value?: number | number[];
10
+ defaultValue?: number | number[];
11
+ onValueChange?: (value: number | number[]) => void;
12
+ /** Show tooltip with current value on the thumb. */
13
+ showTooltip?: boolean;
14
+ /** Marks rendered along the track. */
15
+ marks?: SliderMark[];
16
+ formatValue?: (value: number) => string;
17
+ }
18
+ export declare const Slider: React.ForwardRefExoticComponent<SliderProps & React.RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __rest = (this && this.__rest) || function (s, e) {
36
+ var t = {};
37
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
38
+ t[p] = s[p];
39
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
40
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
41
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
42
+ t[p[i]] = s[p[i]];
43
+ }
44
+ return t;
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.Slider = void 0;
48
+ const React = __importStar(require("react"));
49
+ const SliderPrimitive = __importStar(require("@radix-ui/react-slider"));
50
+ const utils_1 = require("../../lib/utils");
51
+ const tooltip_1 = require("../ui/tooltip");
52
+ exports.Slider = React.forwardRef((_a, ref) => {
53
+ var { className, value, defaultValue, onValueChange, showTooltip = false, marks, formatValue = String, min = 0, max = 100, step = 1 } = _a, rest = __rest(_a, ["className", "value", "defaultValue", "onValueChange", "showTooltip", "marks", "formatValue", "min", "max", "step"]);
54
+ const isRange = Array.isArray(value)
55
+ ? value.length > 1
56
+ : Array.isArray(defaultValue)
57
+ ? defaultValue.length > 1
58
+ : false;
59
+ const internalValue = React.useMemo(() => {
60
+ var _a;
61
+ const source = (_a = value !== null && value !== void 0 ? value : defaultValue) !== null && _a !== void 0 ? _a : (isRange ? [min, max] : [min]);
62
+ return Array.isArray(source) ? source : [source];
63
+ }, [value, defaultValue, isRange, min, max]);
64
+ const [trackedValue, setTrackedValue] = React.useState(internalValue);
65
+ const displayValue = value !== undefined
66
+ ? Array.isArray(value)
67
+ ? value
68
+ : [value]
69
+ : trackedValue;
70
+ return (React.createElement("div", { className: (0, utils_1.cn)("w-full select-none", className) },
71
+ React.createElement(SliderPrimitive.Root, Object.assign({ ref: ref, value: displayValue, defaultValue: defaultValue !== undefined
72
+ ? Array.isArray(defaultValue)
73
+ ? defaultValue
74
+ : [defaultValue]
75
+ : undefined, onValueChange: (next) => {
76
+ setTrackedValue(next);
77
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(isRange ? next : next[0]);
78
+ }, min: min, max: max, step: step, className: "relative flex h-5 w-full touch-none items-center" }, rest),
79
+ React.createElement(SliderPrimitive.Track, { className: "relative h-1 w-full grow overflow-hidden rounded-full bg-muted" },
80
+ React.createElement(SliderPrimitive.Range, { className: "absolute h-full bg-primary" })),
81
+ displayValue.map((thumbValue, index) => {
82
+ const thumb = (React.createElement(SliderPrimitive.Thumb, { key: index, "aria-label": isRange
83
+ ? index === 0
84
+ ? "Minimum value"
85
+ : "Maximum value"
86
+ : "Value", className: (0, utils_1.cn)("block h-4 w-4 rounded-full border-2 border-primary bg-background shadow-sm transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background", "disabled:pointer-events-none disabled:opacity-50") }));
87
+ if (!showTooltip)
88
+ return thumb;
89
+ return (React.createElement(tooltip_1.Tooltip, { key: index, open: true },
90
+ React.createElement(tooltip_1.TooltipTrigger, { asChild: true }, thumb),
91
+ React.createElement(tooltip_1.TooltipContent, { side: "top", sideOffset: 6 }, formatValue(thumbValue))));
92
+ })),
93
+ marks && marks.length > 0 && (React.createElement("div", { "aria-hidden": "true", className: "relative mt-1.5 h-4 text-[10px] text-muted-foreground" }, marks.map((mark) => {
94
+ var _a;
95
+ const ratio = (mark.value - min) / (max - min);
96
+ return (React.createElement("span", { key: mark.value, style: {
97
+ left: `${Math.min(Math.max(ratio, 0), 1) * 100}%`,
98
+ }, className: "absolute -translate-x-1/2" }, (_a = mark.label) !== null && _a !== void 0 ? _a : mark.value));
99
+ })))));
100
+ });
101
+ exports.Slider.displayName = "Slider";
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import { type ColumnDef, type TableProps } from "./TableProps";
3
+ export declare function Table<T>(props: TableProps<T>): React.ReactElement;
4
+ export declare namespace Table {
5
+ var displayName: string;
6
+ }
7
+ export type { ColumnDef, TableProps };
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Table = Table;
37
+ const React = __importStar(require("react"));
38
+ const lucide_react_1 = require("lucide-react");
39
+ const utils_1 = require("../../lib/utils");
40
+ const button_1 = require("../ui/button");
41
+ const dropdown_menu_1 = require("../ui/dropdown-menu");
42
+ const ActiveFilters_1 = require("./components/ActiveFilters");
43
+ const BulkActionBar_1 = require("./components/BulkActionBar");
44
+ const Pagination_1 = require("./components/Pagination");
45
+ const TableBody_1 = require("./components/TableBody");
46
+ const TableEmptyState_1 = require("./components/TableEmptyState");
47
+ const TableErrorState_1 = require("./components/TableErrorState");
48
+ const TableHeader_1 = require("./components/TableHeader");
49
+ const TableSearch_1 = require("./components/TableSearch");
50
+ const LeftFilterPane_1 = require("./filters/LeftFilterPane");
51
+ const TableFilters_1 = require("./filters/TableFilters");
52
+ const useColumnResize_1 = require("./hooks/useColumnResize");
53
+ const useTable_1 = require("./hooks/useTable");
54
+ const useTableKeyboard_1 = require("./hooks/useTableKeyboard");
55
+ const useVirtualScroll_1 = require("./hooks/useVirtualScroll");
56
+ const ManageColumns_1 = require("./settings/ManageColumns");
57
+ const TableSettings_1 = require("./settings/TableSettings");
58
+ const TableProps_1 = require("./TableProps");
59
+ const sortUtils_1 = require("./utils/sortUtils");
60
+ const DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
61
+ function Table(props) {
62
+ const { data, columns, rowKey, selectable = false, selectedRows, onSelectionChange, selectionMode = "multi", onRowClick, rowClassName, sortable = true, defaultSort, onSortChange, filterable = true, defaultFilters, onFilterChange, searchable = true, searchPlaceholder, onSearchChange, isServerSearch = false, pagination = true, paginationMode = "client", defaultPageSize = 50, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS, totalCount, onPageChange, isLoading = false, loadingRowCount = 5, error = null, onRetry, emptyState, emptyTitle, emptyDescription, emptyAction, density: densityProp = "default", maxHeight, virtualScroll, rowHeight, virtualScrollThreshold = 500, defaultHiddenColumns = [], showColumnToggle = true, columnResizable = true, stickyHeader = true, noBorders = false, bulkActions = [], filterSidebar, filterMode = "inline", preferences, headerActions, exportOptions, className, style, } = props;
63
+ const tableState = (0, useTable_1.useTable)({
64
+ data,
65
+ columns,
66
+ rowKey,
67
+ selectable,
68
+ selectionMode,
69
+ selectedRows,
70
+ onSelectionChange,
71
+ sortable,
72
+ defaultSort,
73
+ onSortChange,
74
+ filterable,
75
+ defaultFilters,
76
+ onFilterChange,
77
+ searchable,
78
+ onSearchChange,
79
+ isServerSearch,
80
+ pagination,
81
+ paginationMode,
82
+ defaultPageSize,
83
+ totalCount,
84
+ onPageChange,
85
+ defaultHiddenColumns,
86
+ density: densityProp,
87
+ preferences,
88
+ });
89
+ const { pageData, processed, pageCount, visibleColumns, columnVisibility, setColumnHidden, columnWidths, setColumnWidth, density, setDensity, sort, setSort, filters, setFilters, searchQuery, setSearchQuery, selection, toggleRow, toggleAll, clearSelection, isAllSelected, isSomeSelected, pageIndex, pageSize, setPage, setPageSize, } = tableState;
90
+ const resize = (0, useColumnResize_1.useColumnResize)({
91
+ columns,
92
+ columnWidths,
93
+ setColumnWidth,
94
+ enabled: columnResizable,
95
+ });
96
+ const scrollRef = React.useRef(null);
97
+ const resolvedRowHeight = rowHeight !== null && rowHeight !== void 0 ? rowHeight : TableProps_1.ROW_HEIGHT[density];
98
+ const virtual = (0, useVirtualScroll_1.useVirtualScroll)({
99
+ rowCount: pageData.length,
100
+ rowHeight: resolvedRowHeight,
101
+ enabled: virtualScroll,
102
+ threshold: virtualScrollThreshold,
103
+ scrollContainerRef: scrollRef,
104
+ });
105
+ const keyboardEnabled = selectable || !!onRowClick;
106
+ const keyboard = (0, useTableKeyboard_1.useTableKeyboard)({
107
+ rowCount: pageData.length,
108
+ columnCount: visibleColumns.length,
109
+ hasSelectionColumn: selectable,
110
+ onActivateRow: (rowIndex) => {
111
+ const row = pageData[rowIndex];
112
+ if (row && onRowClick) {
113
+ onRowClick(row, {});
114
+ }
115
+ },
116
+ onToggleRow: (rowIndex) => {
117
+ const row = pageData[rowIndex];
118
+ if (row)
119
+ toggleRow((0, sortUtils_1.resolveRowKey)(row, rowKey));
120
+ },
121
+ onClearSelection: clearSelection,
122
+ });
123
+ const selectedKeys = React.useMemo(() => new Set(selection), [selection]);
124
+ const selectedRowData = React.useMemo(() => data.filter((row) => selectedKeys.has((0, sortUtils_1.resolveRowKey)(row, rowKey))), [data, selectedKeys, rowKey]);
125
+ const hasActiveFilters = filters.length > 0 || searchQuery.length > 0;
126
+ const showSidebar = (filterSidebar === null || filterSidebar === void 0 ? void 0 : filterSidebar.enabled) && filterMode === "sidebar";
127
+ const handleRemoveFilter = (filter) => {
128
+ setFilters((prev) => prev.filter((f) => f !== filter));
129
+ };
130
+ const clearAllFilters = () => {
131
+ setFilters([]);
132
+ if (searchQuery)
133
+ setSearchQuery("");
134
+ };
135
+ const totalRows = paginationMode === "server" ? totalCount !== null && totalCount !== void 0 ? totalCount : 0 : processed.length;
136
+ const hasError = error !== null && error !== undefined;
137
+ const isEmpty = !isLoading && !hasError && pageData.length === 0;
138
+ return (React.createElement("div", { className: (0, utils_1.cn)("flex flex-col overflow-hidden rounded-md border border-border bg-card text-card-foreground", className), style: Object.assign({ "--row-height": `${resolvedRowHeight}px` }, style) },
139
+ React.createElement("div", { className: "flex flex-wrap items-center justify-between gap-2 border-b border-border bg-card px-3 py-2" },
140
+ React.createElement("div", { className: "flex flex-1 items-center gap-2" }, searchable && (React.createElement(TableSearch_1.TableSearch, { value: searchQuery, onChange: setSearchQuery, placeholder: searchPlaceholder }))),
141
+ React.createElement("div", { className: "flex flex-wrap items-center gap-2" },
142
+ filterable && filterMode === "inline" && (React.createElement(TableFilters_1.TableFilters, { columns: columns, filters: filters, onApply: (next) => setFilters(next) })),
143
+ showColumnToggle && (React.createElement(ManageColumns_1.ManageColumns, { columns: columns, columnVisibility: columnVisibility, onChange: setColumnHidden })),
144
+ React.createElement(TableSettings_1.TableSettings, { density: density, onDensityChange: setDensity }),
145
+ exportOptions && exportOptions.length > 0 && (React.createElement(dropdown_menu_1.DropdownMenu, null,
146
+ React.createElement(dropdown_menu_1.DropdownMenuTrigger, { asChild: true },
147
+ React.createElement(button_1.Button, { size: "sm", variant: "outline", leftIcon: React.createElement(lucide_react_1.Download, null) }, "Export")),
148
+ React.createElement(dropdown_menu_1.DropdownMenuContent, { align: "end" }, exportOptions.map((option) => (React.createElement(dropdown_menu_1.DropdownMenuItem, { key: option.label, onClick: () => option.onExport(processed, selectedRowData) },
149
+ option.icon,
150
+ option.label)))))),
151
+ headerActions)),
152
+ React.createElement(ActiveFilters_1.ActiveFilters, { filters: filters, columns: columns, onRemove: handleRemoveFilter, onClearAll: () => setFilters([]) }),
153
+ React.createElement(BulkActionBar_1.BulkActionBar, { selectedCount: selection.length, selectedKeys: selection, selectedRows: selectedRowData, actions: bulkActions, onClear: clearSelection }),
154
+ React.createElement("div", { className: "flex flex-1 overflow-hidden" },
155
+ showSidebar && filterSidebar && filterSidebar.position !== "right" && (React.createElement(LeftFilterPane_1.LeftFilterPane, { filters: filterSidebar.filters, onApply: filterSidebar.onApply, isLoading: filterSidebar.isLoading })),
156
+ React.createElement("div", { ref: scrollRef, role: keyboardEnabled ? "grid" : undefined, "aria-busy": isLoading || undefined, "aria-rowcount": pageData.length || undefined, "aria-colcount": visibleColumns.length + (selectable ? 1 : 0) || undefined, tabIndex: keyboardEnabled ? 0 : undefined, onKeyDown: keyboardEnabled ? keyboard.handleKeyDown : undefined, style: {
157
+ maxHeight: typeof maxHeight === "number"
158
+ ? `${maxHeight}px`
159
+ : maxHeight,
160
+ }, className: (0, utils_1.cn)("relative flex-1 overflow-auto", keyboardEnabled &&
161
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset") }, hasError ? (React.createElement(TableErrorState_1.TableErrorState, { error: error, onRetry: onRetry })) : isEmpty ? (emptyState !== null && emptyState !== void 0 ? emptyState : (React.createElement(TableEmptyState_1.TableEmptyState, { title: emptyTitle, description: emptyDescription, hasActiveFilters: hasActiveFilters, onClearFilters: hasActiveFilters ? clearAllFilters : undefined, action: emptyAction }))) : (React.createElement("table", { className: (0, utils_1.cn)("w-full border-collapse text-left", noBorders && "[&_td]:border-0"), style: { tableLayout: "fixed" } },
162
+ React.createElement(TableHeader_1.TableHeader, { columns: visibleColumns, columnWidths: columnWidths, sortable: sortable, sort: sort, onSortChange: setSort, selectable: selectable, selectionMode: selectionMode, isAllSelected: isAllSelected, isSomeSelected: isSomeSelected, onToggleAll: toggleAll, resizable: columnResizable, resizingColumnId: resize.resizingColumnId, onResizePointerDown: resize.handlePointerDown, sticky: stickyHeader, focusedColIndex: keyboard.active.row === -1
163
+ ? keyboard.active.col
164
+ : -1, onCellClick: (colIndex) => keyboard.setActive({ row: -1, col: colIndex }) }),
165
+ React.createElement(TableBody_1.TableBody, { data: pageData, columns: visibleColumns, rowKey: rowKey, columnWidths: columnWidths, selectable: selectable, selectedKeys: selectedKeys, onToggleSelect: (key) => toggleRow(key), onRowClick: onRowClick, rowClassName: rowClassName, striped: true, noBorders: noBorders, focusedRowIndex: keyboard.active.row, focusedColIndex: keyboard.active.col, onCellClick: (rowIndex, colIndex) => keyboard.setActive({
166
+ row: rowIndex,
167
+ col: colIndex,
168
+ }), isLoading: isLoading, loadingRowCount: loadingRowCount, virtual: virtual })))),
169
+ showSidebar && filterSidebar && filterSidebar.position === "right" && (React.createElement(LeftFilterPane_1.LeftFilterPane, { filters: filterSidebar.filters, onApply: filterSidebar.onApply, isLoading: filterSidebar.isLoading, position: "right" }))),
170
+ pagination && !hasError && (React.createElement(Pagination_1.Pagination, { pageIndex: pageIndex, pageCount: pageCount, pageSize: pageSize, pageSizeOptions: pageSizeOptions, totalRows: totalRows, onPageChange: (page) => setPage(page), onPageSizeChange: (size) => setPageSize(size) }))));
171
+ }
172
+ Table.displayName = "Table";
@@ -0,0 +1,139 @@
1
+ import type * as React from "react";
2
+ export type SortDirection = "asc" | "desc" | null;
3
+ export type FilterOperator = "equals" | "not_equals" | "contains" | "not_contains" | "starts_with" | "ends_with" | "greater_than" | "less_than" | "between" | "is_empty" | "is_not_empty" | "in" | "not_in";
4
+ export type ColumnType = "text" | "number" | "date" | "boolean" | "select" | "custom";
5
+ export type Density = "compact" | "default" | "comfortable";
6
+ export interface ColumnDef<T = unknown> {
7
+ id: string;
8
+ header: string;
9
+ accessorKey?: keyof T;
10
+ accessorFn?: (row: T) => unknown;
11
+ cell?: (value: unknown, row: T) => React.ReactNode;
12
+ type?: ColumnType;
13
+ sortable?: boolean;
14
+ filterable?: boolean;
15
+ filterOptions?: {
16
+ label: string;
17
+ value: unknown;
18
+ }[];
19
+ width?: number;
20
+ minWidth?: number;
21
+ maxWidth?: number;
22
+ sticky?: "left" | "right";
23
+ hidden?: boolean;
24
+ enableHiding?: boolean;
25
+ enableResizing?: boolean;
26
+ align?: "left" | "center" | "right";
27
+ meta?: Record<string, unknown>;
28
+ }
29
+ export interface ActiveFilter {
30
+ columnId: string;
31
+ operator: FilterOperator;
32
+ /** A single value or [from, to] for `between` / array for `in`/`not_in`. */
33
+ value: unknown;
34
+ }
35
+ export interface SortState {
36
+ id: string;
37
+ direction: SortDirection;
38
+ }
39
+ export type RowKey<T> = keyof T | ((row: T) => string | number);
40
+ export interface FilterSidebarConfig {
41
+ id: string;
42
+ label: string;
43
+ type: "select" | "multi-select" | "date-range" | "number-range" | "text";
44
+ options?: {
45
+ label: string;
46
+ value: unknown;
47
+ }[];
48
+ }
49
+ export interface BulkAction<T = unknown> {
50
+ label: string;
51
+ icon?: React.ReactNode;
52
+ onClick: (selectedKeys: (string | number)[], selectedRows: T[]) => void;
53
+ variant?: "default" | "destructive";
54
+ /** When true, shows a confirmation dialog before invoking onClick. */
55
+ confirm?: boolean | {
56
+ title: string;
57
+ description?: string;
58
+ };
59
+ }
60
+ export interface ExportOption<T = unknown> {
61
+ label: string;
62
+ icon?: React.ReactNode;
63
+ onExport: (data: T[], selectedRows: T[]) => void;
64
+ }
65
+ export interface TablePreferences {
66
+ storageKey: string;
67
+ }
68
+ export interface PersistedTableState {
69
+ columnVisibility?: Record<string, boolean>;
70
+ columnOrder?: string[];
71
+ columnWidths?: Record<string, number>;
72
+ density?: Density;
73
+ pageSize?: number;
74
+ }
75
+ export interface TableProps<T = unknown> {
76
+ data: T[];
77
+ columns: ColumnDef<T>[];
78
+ rowKey: RowKey<T>;
79
+ selectable?: boolean;
80
+ selectedRows?: (string | number)[];
81
+ onSelectionChange?: (selectedKeys: (string | number)[]) => void;
82
+ selectionMode?: "single" | "multi";
83
+ onRowClick?: (row: T, event: React.MouseEvent) => void;
84
+ rowClassName?: (row: T) => string | undefined;
85
+ sortable?: boolean;
86
+ defaultSort?: SortState;
87
+ onSortChange?: (sort: SortState | null) => void;
88
+ filterable?: boolean;
89
+ defaultFilters?: ActiveFilter[];
90
+ onFilterChange?: (filters: ActiveFilter[]) => void;
91
+ searchable?: boolean;
92
+ searchPlaceholder?: string;
93
+ onSearchChange?: (query: string) => void;
94
+ isServerSearch?: boolean;
95
+ pagination?: boolean;
96
+ paginationMode?: "client" | "server";
97
+ defaultPageSize?: number;
98
+ pageSizeOptions?: number[];
99
+ totalCount?: number;
100
+ onPageChange?: (page: number, pageSize: number) => void;
101
+ isLoading?: boolean;
102
+ loadingRowCount?: number;
103
+ error?: Error | string | null;
104
+ onRetry?: () => void;
105
+ emptyState?: React.ReactNode;
106
+ emptyTitle?: string;
107
+ emptyDescription?: string;
108
+ emptyAction?: {
109
+ label: string;
110
+ onClick: () => void;
111
+ };
112
+ density?: Density;
113
+ maxHeight?: number | string;
114
+ virtualScroll?: boolean;
115
+ /** Defaults to 44 (default density). */
116
+ rowHeight?: number;
117
+ /** Threshold for auto-enabling virtual scroll. Default 500. */
118
+ virtualScrollThreshold?: number;
119
+ defaultHiddenColumns?: string[];
120
+ showColumnToggle?: boolean;
121
+ columnResizable?: boolean;
122
+ stickyHeader?: boolean;
123
+ noBorders?: boolean;
124
+ bulkActions?: BulkAction<T>[];
125
+ filterSidebar?: {
126
+ enabled: boolean;
127
+ position?: "left" | "right";
128
+ filters: FilterSidebarConfig[];
129
+ onApply: (filters: Record<string, unknown>) => void;
130
+ isLoading?: boolean;
131
+ };
132
+ filterMode?: "inline" | "sidebar" | "modal";
133
+ preferences?: TablePreferences;
134
+ headerActions?: React.ReactNode;
135
+ exportOptions?: ExportOption<T>[];
136
+ className?: string;
137
+ style?: React.CSSProperties;
138
+ }
139
+ export declare const ROW_HEIGHT: Record<Density, number>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ROW_HEIGHT = void 0;
4
+ /* Density → row-height in px */
5
+ exports.ROW_HEIGHT = {
6
+ compact: 32,
7
+ default: 44,
8
+ comfortable: 56,
9
+ };