@dreamtree-org/twreact-ui 1.0.63 → 1.0.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -220,7 +220,7 @@ const Check = createLucideIcon$1("Check", [
220
220
  */
221
221
 
222
222
 
223
- const ChevronDown = createLucideIcon$1("ChevronDown", [
223
+ const ChevronDown$1 = createLucideIcon$1("ChevronDown", [
224
224
  ["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]
225
225
  ]);
226
226
 
@@ -374,6 +374,20 @@ const Info = createLucideIcon$1("Info", [
374
374
  */
375
375
 
376
376
 
377
+ const List = createLucideIcon$1("List", [
378
+ ["line", { x1: "8", x2: "21", y1: "6", y2: "6", key: "7ey8pc" }],
379
+ ["line", { x1: "8", x2: "21", y1: "12", y2: "12", key: "rjfblc" }],
380
+ ["line", { x1: "8", x2: "21", y1: "18", y2: "18", key: "c3b1m8" }],
381
+ ["line", { x1: "3", x2: "3.01", y1: "6", y2: "6", key: "1g7gq3" }],
382
+ ["line", { x1: "3", x2: "3.01", y1: "12", y2: "12", key: "1pjlvk" }],
383
+ ["line", { x1: "3", x2: "3.01", y1: "18", y2: "18", key: "28t2mc" }]
384
+ ]);
385
+
386
+ /**
387
+ * lucide-react v0.0.1 - ISC
388
+ */
389
+
390
+
377
391
  const Loader2 = createLucideIcon$1("Loader2", [
378
392
  ["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]
379
393
  ]);
@@ -456,6 +470,24 @@ const Plus = createLucideIcon$1("Plus", [
456
470
  */
457
471
 
458
472
 
473
+ const RefreshCcw = createLucideIcon$1("RefreshCcw", [
474
+ [
475
+ "path",
476
+ { d: "M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "14sxne" }
477
+ ],
478
+ ["path", { d: "M3 3v5h5", key: "1xhq8a" }],
479
+ [
480
+ "path",
481
+ { d: "M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16", key: "1hlbsb" }
482
+ ],
483
+ ["path", { d: "M16 16h5v5", key: "ccwih5" }]
484
+ ]);
485
+
486
+ /**
487
+ * lucide-react v0.0.1 - ISC
488
+ */
489
+
490
+
459
491
  const Search = createLucideIcon$1("Search", [
460
492
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }],
461
493
  ["path", { d: "m21 21-4.3-4.3", key: "1qie3q" }]
@@ -3664,7 +3696,7 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
3664
3696
  return _objectSpread$a(_objectSpread$a({}, prev), {}, _defineProperty$4({}, group.label, !prev[group.label]));
3665
3697
  });
3666
3698
  }
3667
- }, /*#__PURE__*/React__default.createElement(ChevronDown, {
3699
+ }, /*#__PURE__*/React__default.createElement(ChevronDown$1, {
3668
3700
  className: cn$1("h-4 w-4 text-gray-400 transition-transform", {
3669
3701
  "rotate-180": collapsedGroups[group.label]
3670
3702
  })
@@ -3773,7 +3805,7 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
3773
3805
  "aria-label": "Clear selection"
3774
3806
  }, /*#__PURE__*/React__default.createElement(X, {
3775
3807
  className: "h-4 w-4"
3776
- })), /*#__PURE__*/React__default.createElement(ChevronDown, {
3808
+ })), /*#__PURE__*/React__default.createElement(ChevronDown$1, {
3777
3809
  className: cn$1("h-4 w-4 text-gray-400 transition-transform", {
3778
3810
  "rotate-180": isOpen
3779
3811
  })
@@ -3831,7 +3863,7 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
3831
3863
  }, error));
3832
3864
  });
3833
3865
 
3834
- var _excluded$k = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange"];
3866
+ var _excluded$k = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange", "showReloadButton", "renderReloadButton", "onReload", "stripedRows", "stripedColors", "responsiveBreakpoint"];
3835
3867
  function ownKeys$9(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3836
3868
  function _objectSpread$9(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$9(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$9(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3837
3869
  var Table = function Table(_ref) {
@@ -3875,87 +3907,123 @@ var Table = function Table(_ref) {
3875
3907
  _ref$showLimitSelecto = _ref.showLimitSelector,
3876
3908
  showLimitSelector = _ref$showLimitSelecto === void 0 ? true : _ref$showLimitSelecto,
3877
3909
  onLimitChange = _ref.onLimitChange,
3910
+ _ref$showReloadButton = _ref.showReloadButton,
3911
+ showReloadButton = _ref$showReloadButton === void 0 ? true : _ref$showReloadButton,
3912
+ renderReloadButton = _ref.renderReloadButton,
3913
+ onReload = _ref.onReload,
3914
+ _ref$stripedRows = _ref.stripedRows,
3915
+ stripedRows = _ref$stripedRows === void 0 ? true : _ref$stripedRows,
3916
+ _ref$stripedColors = _ref.stripedColors,
3917
+ stripedColors = _ref$stripedColors === void 0 ? ["#ffffff", "#f7fafc"] : _ref$stripedColors,
3918
+ _ref$responsiveBreakp = _ref.responsiveBreakpoint,
3919
+ responsiveBreakpoint = _ref$responsiveBreakp === void 0 ? 768 : _ref$responsiveBreakp,
3878
3920
  props = _objectWithoutProperties$1(_ref, _excluded$k);
3879
- // keep original table data / loading
3880
- var _useState = useState(Array.isArray(data) ? data : []),
3921
+ // State for responsive view
3922
+ var _useState = useState(false),
3881
3923
  _useState2 = _slicedToArray(_useState, 2),
3882
- tableData = _useState2[0],
3883
- setTableData = _useState2[1];
3884
- var _useState3 = useState(false),
3924
+ isMobileView = _useState2[0],
3925
+ setIsMobileView = _useState2[1];
3926
+
3927
+ // Keep original table data / loading
3928
+ var _useState3 = useState(Array.isArray(data) ? data : []),
3885
3929
  _useState4 = _slicedToArray(_useState3, 2),
3886
- loading = _useState4[0],
3887
- _setLoading = _useState4[1];
3930
+ tableData = _useState4[0],
3931
+ setTableData = _useState4[1];
3932
+ var _useState5 = useState(false),
3933
+ _useState6 = _slicedToArray(_useState5, 2),
3934
+ loading = _useState6[0],
3935
+ setLoading = _useState6[1];
3888
3936
 
3889
- // column visibility state (local copy of `columns` so we can toggle isVisible)
3890
- var _useState5 = useState(function () {
3937
+ // Column visibility state
3938
+ var _useState7 = useState(function () {
3891
3939
  return Array.isArray(columns) ? columns.map(function (c) {
3892
3940
  return _objectSpread$9({}, c);
3893
3941
  }) : [];
3894
3942
  }),
3895
- _useState6 = _slicedToArray(_useState5, 2),
3896
- columnsState = _useState6[0],
3897
- setColumnsState = _useState6[1];
3943
+ _useState8 = _slicedToArray(_useState7, 2),
3944
+ columnsState = _useState8[0],
3945
+ setColumnsState = _useState8[1];
3898
3946
  useEffect(function () {
3899
- // sync when prop changes
3947
+ // Sync when prop changes
3900
3948
  setColumnsState(Array.isArray(columns) ? columns.map(function (c) {
3901
3949
  return _objectSpread$9({}, c);
3902
3950
  }) : []);
3903
3951
  }, [columns]);
3904
3952
 
3905
- // popover state for column toggler
3906
- var _useState7 = useState(false),
3907
- _useState8 = _slicedToArray(_useState7, 2),
3908
- showColumnMenu = _useState8[0],
3909
- setShowColumnMenu = _useState8[1];
3953
+ // Popover state for column toggler
3954
+ var _useState9 = useState(false),
3955
+ _useState0 = _slicedToArray(_useState9, 2),
3956
+ showColumnMenu = _useState0[0],
3957
+ setShowColumnMenu = _useState0[1];
3910
3958
  var columnMenuRef = useRef(null);
3911
3959
  var columnToggleBtnRef = useRef(null);
3912
- var _useState9 = useState(pageSize),
3913
- _useState0 = _slicedToArray(_useState9, 2),
3914
- limit = _useState0[0],
3915
- setLimit = _useState0[1];
3960
+ var _useState1 = useState(pageSize),
3961
+ _useState10 = _slicedToArray(_useState1, 2),
3962
+ limit = _useState10[0],
3963
+ setLimit = _useState10[1];
3916
3964
 
3917
- // other states
3918
- var _useState1 = useState({
3965
+ // Other states
3966
+ var _useState11 = useState({
3919
3967
  key: null,
3920
3968
  direction: "asc"
3921
3969
  }),
3922
- _useState10 = _slicedToArray(_useState1, 2),
3923
- sortConfig = _useState10[0],
3924
- setSortConfig = _useState10[1];
3925
- var _useState11 = useState(new Set()),
3926
3970
  _useState12 = _slicedToArray(_useState11, 2),
3927
- selectedRows = _useState12[0],
3928
- setSelectedRows = _useState12[1];
3971
+ sortConfig = _useState12[0],
3972
+ setSortConfig = _useState12[1];
3929
3973
  var _useState13 = useState(new Set()),
3930
3974
  _useState14 = _slicedToArray(_useState13, 2),
3931
- expandedRows = _useState14[0],
3932
- setExpandedRows = _useState14[1];
3933
- var _useState15 = useState(1),
3975
+ selectedRows = _useState14[0],
3976
+ setSelectedRows = _useState14[1];
3977
+ var _useState15 = useState(new Set()),
3934
3978
  _useState16 = _slicedToArray(_useState15, 2),
3935
- currentPage = _useState16[0],
3936
- setCurrentPage = _useState16[1];
3937
- var _useState17 = useState({}),
3979
+ expandedRows = _useState16[0],
3980
+ setExpandedRows = _useState16[1];
3981
+ var _useState17 = useState(1),
3938
3982
  _useState18 = _slicedToArray(_useState17, 2),
3939
- filters = _useState18[0],
3940
- setFilters = _useState18[1];
3941
- var _useState19 = useState(filters.global || ""),
3983
+ currentPage = _useState18[0],
3984
+ setCurrentPage = _useState18[1];
3985
+ var _useState19 = useState({}),
3942
3986
  _useState20 = _slicedToArray(_useState19, 2),
3943
- searchInput = _useState20[0],
3944
- setSearchInput = _useState20[1];
3945
-
3946
- //popover per-row
3947
- var _useState21 = useState(null),
3987
+ filters = _useState20[0],
3988
+ setFilters = _useState20[1];
3989
+ var _useState21 = useState(filters.global || ""),
3948
3990
  _useState22 = _slicedToArray(_useState21, 2),
3949
- actionAnchor = _useState22[0],
3950
- setActionAnchor = _useState22[1];
3991
+ searchInput = _useState22[0],
3992
+ setSearchInput = _useState22[1];
3993
+ var _useState23 = useState(false),
3994
+ _useState24 = _slicedToArray(_useState23, 2),
3995
+ showMobileFilters = _useState24[0],
3996
+ setShowMobileFilters = _useState24[1];
3997
+
3998
+ // Popover per-row
3999
+ var _useState25 = useState(null),
4000
+ _useState26 = _slicedToArray(_useState25, 2),
4001
+ actionAnchor = _useState26[0],
4002
+ setActionAnchor = _useState26[1];
3951
4003
  var actionMenuRef = useRef(null);
3952
4004
 
3953
- // per-row action menu open key
3954
- var _useState23 = useState(null),
3955
- _useState24 = _slicedToArray(_useState23, 2),
3956
- openActionKey = _useState24[0],
3957
- setOpenActionKey = _useState24[1];
4005
+ // Per-row action menu open key
4006
+ var _useState27 = useState(null),
4007
+ _useState28 = _slicedToArray(_useState27, 2),
4008
+ openActionKey = _useState28[0],
4009
+ setOpenActionKey = _useState28[1];
3958
4010
  var openRef = useRef(null);
4011
+
4012
+ // Check if mobile view
4013
+ useEffect(function () {
4014
+ var checkMobile = function checkMobile() {
4015
+ setIsMobileView(window.innerWidth < responsiveBreakpoint);
4016
+ };
4017
+
4018
+ // Initial check
4019
+ checkMobile();
4020
+
4021
+ // Add event listener
4022
+ window.addEventListener("resize", checkMobile);
4023
+ return function () {
4024
+ window.removeEventListener("resize", checkMobile);
4025
+ };
4026
+ }, [responsiveBreakpoint]);
3959
4027
  var isValidList = function isValidList(d) {
3960
4028
  return Array.isArray(d);
3961
4029
  };
@@ -3963,7 +4031,7 @@ var Table = function Table(_ref) {
3963
4031
  if (isValidList(newData)) setTableData(newData);else setTableData([]);
3964
4032
  };
3965
4033
 
3966
- // close column menu when clicking outside
4034
+ // Close column menu when clicking outside
3967
4035
  useEffect(function () {
3968
4036
  var onDocClick = function onDocClick(e) {
3969
4037
  if (showColumnMenu && columnMenuRef.current && !columnMenuRef.current.contains(e.target) && columnToggleBtnRef.current && !columnToggleBtnRef.current.contains(e.target)) {
@@ -3976,7 +4044,7 @@ var Table = function Table(_ref) {
3976
4044
  };
3977
4045
  }, [showColumnMenu]);
3978
4046
 
3979
- // close per-row actionmenu when clicking outside (existing)
4047
+ // Close per-row actionmenu when clicking outside
3980
4048
  useEffect(function () {
3981
4049
  var handler = function handler(e) {
3982
4050
  if (openActionKey && openRef.current && !openRef.current.contains(e.target)) {
@@ -3989,7 +4057,7 @@ var Table = function Table(_ref) {
3989
4057
  };
3990
4058
  }, [openActionKey]);
3991
4059
 
3992
- // visible columns derived from columnsState
4060
+ // Visible columns derived from columnsState
3993
4061
  var visibleColumns = useMemo(function () {
3994
4062
  return columnsState.filter(function (col) {
3995
4063
  return col.isVisible !== false;
@@ -4006,7 +4074,7 @@ var Table = function Table(_ref) {
4006
4074
  setCurrentPage(1);
4007
4075
  };
4008
4076
 
4009
- // keep previous handlers
4077
+ // Handle actions
4010
4078
  var handleOnAction = function handleOnAction(action, row) {
4011
4079
  var _action$onClick;
4012
4080
  (_action$onClick = action.onClick) === null || _action$onClick === void 0 || _action$onClick.call(action, {
@@ -4056,7 +4124,7 @@ var Table = function Table(_ref) {
4056
4124
  return String(globalIndex);
4057
4125
  };
4058
4126
 
4059
- // sorting
4127
+ // Sorting
4060
4128
  var sortedData = useMemo(function () {
4061
4129
  if (!sortConfig.key) return tableData;
4062
4130
  var key = sortConfig.key,
@@ -4078,19 +4146,17 @@ var Table = function Table(_ref) {
4078
4146
  });
4079
4147
  }, [tableData, sortConfig]);
4080
4148
 
4081
- // filtering
4149
+ // Filtering
4082
4150
  var filteredData = useMemo(function () {
4083
- // if no filtering enabled, return sortedData
4084
-
4085
4151
  if (!filterable || Object.keys(filters).length === 0) return sortedData;
4086
4152
  var globalQuery = String(filters.global || "").trim().toLowerCase();
4087
4153
  return sortedData.filter(function (row) {
4088
- // 1) per-column filters: all must match
4154
+ // Per-column filters
4089
4155
  var perColumnOk = Object.entries(filters).every(function (_ref2) {
4090
4156
  var _ref3 = _slicedToArray(_ref2, 2),
4091
4157
  key = _ref3[0],
4092
4158
  value = _ref3[1];
4093
- if (key === "global") return true; // skip global here
4159
+ if (key === "global") return true;
4094
4160
  if (!value) return true;
4095
4161
  var cell = row === null || row === void 0 ? void 0 : row[key];
4096
4162
  if (cell == null) return false;
@@ -4098,18 +4164,14 @@ var Table = function Table(_ref) {
4098
4164
  });
4099
4165
  if (!perColumnOk) return false;
4100
4166
 
4101
- // 2) global filter (if present) - search across visible columns first,
4102
- // fallback to searching all row values
4167
+ // Global filter
4103
4168
  if (globalQuery) {
4104
- // try visible columns
4105
4169
  var matchesVisible = visibleColumns.some(function (col) {
4106
4170
  var v = row === null || row === void 0 ? void 0 : row[col.key];
4107
4171
  if (v == null) return false;
4108
4172
  return String(v).toLowerCase().includes(globalQuery);
4109
4173
  });
4110
4174
  if (matchesVisible) return true;
4111
-
4112
- // fallback: check any value in the row object
4113
4175
  return Object.values(row || {}).some(function (v) {
4114
4176
  return v != null ? String(v).toLowerCase().includes(globalQuery) : false;
4115
4177
  });
@@ -4118,18 +4180,18 @@ var Table = function Table(_ref) {
4118
4180
  });
4119
4181
  }, [sortedData, filters, filterable, visibleColumns]);
4120
4182
 
4121
- // pagination indices
4183
+ // Pagination indices
4122
4184
  var startIndex = pagination ? (currentPage - 1) * limit : 0;
4123
4185
  var endIndex = pagination ? startIndex + limit : filteredData.length;
4124
4186
 
4125
- // paginated view
4187
+ // Paginated view
4126
4188
  var paginatedData = useMemo(function () {
4127
4189
  if (!pagination) return filteredData;
4128
4190
  return filteredData.slice(startIndex, endIndex);
4129
4191
  }, [filteredData, startIndex, endIndex, pagination]);
4130
4192
  var totalPages = Math.max(1, Math.ceil(filteredData.length / limit));
4131
4193
 
4132
- // sorting handler
4194
+ // Sorting handler
4133
4195
  var handleSort = function handleSort(key) {
4134
4196
  if (!sortable) return;
4135
4197
  var direction = sortConfig.key === key && sortConfig.direction === "asc" ? "desc" : "asc";
@@ -4140,10 +4202,9 @@ var Table = function Table(_ref) {
4140
4202
  onSort === null || onSort === void 0 || onSort(key, direction);
4141
4203
  };
4142
4204
 
4143
- // selection handlers
4205
+ // Selection handlers
4144
4206
  var handleSelectAll = function handleSelectAll() {
4145
4207
  var newSelection = new Set(selectedRows);
4146
- // select/deselect all rows on current page
4147
4208
  var pageRowKeys = paginatedData.map(function (r, i) {
4148
4209
  return getRowKey(r, startIndex + i);
4149
4210
  });
@@ -4201,7 +4262,7 @@ var Table = function Table(_ref) {
4201
4262
  return row === null || row === void 0 ? void 0 : row[column.key];
4202
4263
  };
4203
4264
 
4204
- // UI counts (include action column if enabled)
4265
+ // UI counts
4205
4266
  var visibleCount = (showSerial ? 1 : 0) + visibleColumns.length + (selectable ? 1 : 0) + (hasDetails ? 1 : 0) + (withAction ? 1 : 0);
4206
4267
  var toggleActions = function toggleActions(e, actionCellKey, row) {
4207
4268
  e.stopPropagation();
@@ -4241,32 +4302,28 @@ var Table = function Table(_ref) {
4241
4302
  };
4242
4303
  }, [actionAnchor]);
4243
4304
  useEffect(function () {
4244
- if (onFetch) {
4245
- onFetch({
4246
- setData: setDataForExternal,
4247
- filters: filters,
4248
- setLoading: function setLoading(isLoading) {
4249
- return _setLoading(isLoading);
4250
- },
4251
- pagination: {
4252
- currentPage: currentPage,
4253
- limit: limit,
4254
- totalPages: totalPages,
4255
- nextRecords: paginatedData
4256
- }
4257
- });
4258
- }
4259
- }, [filters, onFetch, currentPage, limit, paginatedData]);
4305
+ if (!onFetch) return;
4306
+ onFetch({
4307
+ setData: setDataForExternal,
4308
+ filters: filters,
4309
+ setLoading: setLoading,
4310
+ pagination: {
4311
+ currentPage: currentPage,
4312
+ limit: limit,
4313
+ totalPages: totalPages,
4314
+ nextRecords: paginatedData
4315
+ }
4316
+ });
4317
+ }, [filters, currentPage, limit, onFetch]);
4260
4318
  useEffect(function () {
4261
4319
  if (!onFetch && isValidList(data)) setTableData(data);
4262
4320
  }, [data, onFetch]);
4263
4321
 
4264
- // GLOBAL SEARCH
4322
+ // Global search
4265
4323
  useEffect(function () {
4266
4324
  setSearchInput(filters.global || "");
4267
4325
  }, [filters.global]);
4268
4326
  var applyGlobalSearch = function applyGlobalSearch() {
4269
- // apply filter only when user clicks Search or presses Enter
4270
4327
  handleFilter("global", searchInput);
4271
4328
  };
4272
4329
  var onGlobalKeyDown = function onGlobalKeyDown(e) {
@@ -4285,38 +4342,274 @@ var Table = function Table(_ref) {
4285
4342
  onLimitChange === null || onLimitChange === void 0 || onLimitChange(parsed);
4286
4343
  };
4287
4344
 
4288
- // RENDER
4345
+ // Render mobile card
4346
+ var renderMobileCard = function renderMobileCard(row, rowIndexInPage) {
4347
+ var globalIndex = startIndex + rowIndexInPage;
4348
+ var key = getRowKey(row, globalIndex);
4349
+ var actionCellKey = "actions-".concat(key);
4350
+ var extraRowClass = typeof rowClass === "function" ? rowClass({
4351
+ row: row,
4352
+ rowIndex: globalIndex
4353
+ }) : "";
4354
+ var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
4355
+ var stripeBg = stripedRows && !selectedRows.has(key) ? stripedColors[globalIndex % stripedColors.length] : undefined;
4356
+ return /*#__PURE__*/React__default.createElement("div", {
4357
+ key: key,
4358
+ style: stripeBg ? {
4359
+ backgroundColor: stripeBg
4360
+ } : undefined,
4361
+ className: cn$1("border rounded-lg mb-3 shadow-sm overflow-hidden transition-all duration-200", {
4362
+ "cursor-pointer": !!onRowClick,
4363
+ "bg-primary-50 border-primary-200": selectedRows.has(key),
4364
+ "hover:shadow-md": !selectedRows.has(key)
4365
+ }, safeExtraRowClass),
4366
+ onClick: function onClick() {
4367
+ return onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row, globalIndex);
4368
+ }
4369
+ }, /*#__PURE__*/React__default.createElement("div", {
4370
+ className: "flex items-center justify-between p-4 border-b bg-gray-50"
4371
+ }, /*#__PURE__*/React__default.createElement("div", {
4372
+ className: "flex items-center gap-3"
4373
+ }, hasDetails && /*#__PURE__*/React__default.createElement("button", {
4374
+ onClick: function onClick(e) {
4375
+ e.stopPropagation();
4376
+ toggleExpandRow(row, rowIndexInPage);
4377
+ },
4378
+ "aria-expanded": expandedRows.has(key),
4379
+ className: "p-1 rounded hover:bg-gray-200"
4380
+ }, expandedRows.has(key) ? "▾" : "▸"), selectable && /*#__PURE__*/React__default.createElement("input", {
4381
+ type: "checkbox",
4382
+ className: "rounded border-gray-300 h-4 w-4",
4383
+ checked: selectedRows.has(key),
4384
+ onChange: function onChange(e) {
4385
+ e.stopPropagation();
4386
+ handleSelectRow(row, rowIndexInPage);
4387
+ },
4388
+ onClick: function onClick(e) {
4389
+ return e.stopPropagation();
4390
+ }
4391
+ }), showSerial && /*#__PURE__*/React__default.createElement("span", {
4392
+ className: "text-sm font-medium text-gray-600"
4393
+ }, "#", globalIndex + 1)), withAction && /*#__PURE__*/React__default.createElement("div", {
4394
+ className: "relative"
4395
+ }, /*#__PURE__*/React__default.createElement("button", {
4396
+ onClick: function onClick(e) {
4397
+ e.stopPropagation();
4398
+ toggleActions(e, actionCellKey, row);
4399
+ },
4400
+ "aria-expanded": openActionKey === actionCellKey,
4401
+ className: "p-1.5 rounded hover:bg-gray-200",
4402
+ title: "Actions"
4403
+ }, /*#__PURE__*/React__default.createElement(MoreVertical, {
4404
+ className: "h-4 w-4"
4405
+ })), actionAnchor && actionAnchor.key === actionCellKey && /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement(ActionMenuPortal, {
4406
+ anchorElem: actionAnchor.elem,
4407
+ anchorRow: actionAnchor.row,
4408
+ actions: actionsToUse,
4409
+ onClose: function onClose() {
4410
+ setOpenActionKey(null);
4411
+ setActionAnchor(null);
4412
+ },
4413
+ onAction: function onAction(action) {
4414
+ handleOnAction(action, row);
4415
+ setOpenActionKey(null);
4416
+ setActionAnchor(null);
4417
+ },
4418
+ menuRef: actionMenuRef
4419
+ }), document.body))), /*#__PURE__*/React__default.createElement("div", {
4420
+ className: "p-4"
4421
+ }, visibleColumns.map(function (column, colIndex) {
4422
+ var extraCellClass = typeof cellClass === "function" ? cellClass({
4423
+ row: row,
4424
+ rowIndex: globalIndex,
4425
+ column: column,
4426
+ columnIndex: colIndex
4427
+ }) : "";
4428
+ var safeExtraCellClass = typeof extraCellClass === "string" ? extraCellClass.trim() : "";
4429
+ return /*#__PURE__*/React__default.createElement("div", {
4430
+ key: column.key,
4431
+ className: cn$1("flex justify-between items-center flex-row py-2 border-b last:border-b-0", safeExtraCellClass)
4432
+ }, /*#__PURE__*/React__default.createElement("div", {
4433
+ className: "text-xs font-medium text-gray-500 uppercase tracking-wide mb-1 sm:mb-0 sm:w-1/3 sm:pr-2"
4434
+ }, column.label), /*#__PURE__*/React__default.createElement("div", {
4435
+ className: "text-sm text-gray-900 sm:w-2/3 sm:pl-2 break-words"
4436
+ }, renderCell(column, row, globalIndex)));
4437
+ })), hasDetails && expandedRows.has(key) && DetailsComponent && /*#__PURE__*/React__default.createElement("div", {
4438
+ className: "border-t bg-gray-50 p-4"
4439
+ }, /*#__PURE__*/React__default.createElement(DetailsComponent, {
4440
+ row: row,
4441
+ index: globalIndex
4442
+ })));
4443
+ };
4444
+
4445
+ // Render mobile filters
4446
+ var renderMobileFilters = function renderMobileFilters() {
4447
+ return /*#__PURE__*/React__default.createElement("div", {
4448
+ className: "mb-4 p-3 bg-gray-50 rounded-lg"
4449
+ }, /*#__PURE__*/React__default.createElement("div", {
4450
+ className: "flex items-center justify-between mb-3"
4451
+ }, /*#__PURE__*/React__default.createElement("h3", {
4452
+ className: "text-sm font-medium text-gray-700"
4453
+ }, "Filters"), /*#__PURE__*/React__default.createElement("button", {
4454
+ onClick: function onClick() {
4455
+ return setShowMobileFilters(!showMobileFilters);
4456
+ },
4457
+ className: "text-xs text-gray-500 hover:text-gray-700"
4458
+ }, showMobileFilters ? "Hide" : "Show")), showMobileFilters && /*#__PURE__*/React__default.createElement("div", {
4459
+ className: "space-y-3"
4460
+ }, globalSearch && /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("div", {
4461
+ className: "relative"
4462
+ }, /*#__PURE__*/React__default.createElement("input", {
4463
+ type: "text",
4464
+ placeholder: "Search...",
4465
+ className: "w-full rounded-md border border-gray-300 px-4 py-2 text-sm",
4466
+ value: searchInput,
4467
+ onChange: function onChange(e) {
4468
+ return setSearchInput(e.target.value);
4469
+ },
4470
+ onKeyDown: onGlobalKeyDown
4471
+ }), /*#__PURE__*/React__default.createElement(Search, {
4472
+ className: "absolute right-3 top-2.5 h-4 w-4 text-gray-400"
4473
+ }))), filterable && visibleColumns.map(function (column) {
4474
+ return /*#__PURE__*/React__default.createElement("div", {
4475
+ key: column.key
4476
+ }, /*#__PURE__*/React__default.createElement("label", {
4477
+ className: "block text-xs font-medium text-gray-600 mb-1"
4478
+ }, column.label), /*#__PURE__*/React__default.createElement("input", {
4479
+ type: "text",
4480
+ placeholder: "Filter ".concat(column.label),
4481
+ className: "w-full rounded-md border border-gray-300 px-3 py-2 text-sm",
4482
+ value: filters[column.key] || "",
4483
+ onChange: function onChange(e) {
4484
+ return handleFilter(column.key, e.target.value);
4485
+ }
4486
+ }));
4487
+ })));
4488
+ };
4489
+
4490
+ // Render
4289
4491
  return /*#__PURE__*/React__default.createElement("div", {
4290
- className: "w-full"
4291
- }, globalSearch && /*#__PURE__*/React__default.createElement("div", {
4292
- className: "mb-4 flex items-center gap-2 w-1/2 "
4492
+ className: "w-full border rounded-lg md:rounded-md bg-white"
4493
+ }, /*#__PURE__*/React__default.createElement("div", {
4494
+ className: "flex flex-col md:flex-row justify-between items-start md:items-center gap-3 p-4 border-b"
4495
+ }, /*#__PURE__*/React__default.createElement("div", {
4496
+ className: "flex flex-col sm:flex-row items-start sm:items-center gap-3 w-full md:w-auto"
4497
+ }, showReloadButton && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, renderReloadButton ? typeof renderReloadButton === "function" ? renderReloadButton() : renderReloadButton : /*#__PURE__*/React__default.createElement("button", {
4498
+ type: "button",
4499
+ className: "px-4 py-2 bg-primary-100 flex items-center gap-2 rounded-lg md:rounded text-primary-700 hover:bg-primary-200 transition-colors",
4500
+ onClick: onReload
4501
+ }, /*#__PURE__*/React__default.createElement(RefreshCcw, {
4502
+ className: "size-4"
4503
+ }), /*#__PURE__*/React__default.createElement("span", {
4504
+ className: "hidden sm:inline"
4505
+ }, "Reload"))), showLimitSelector && /*#__PURE__*/React__default.createElement("div", {
4506
+ className: "flex items-center gap-2"
4507
+ }, /*#__PURE__*/React__default.createElement("label", {
4508
+ htmlFor: "pagination-limit",
4509
+ className: "text-sm text-gray-600 whitespace-nowrap"
4510
+ }, "Show"), /*#__PURE__*/React__default.createElement(Select, {
4511
+ options: Array.isArray(limitOptions) && limitOptions.length > 0 ? limitOptions.map(function (opt) {
4512
+ return {
4513
+ label: String(opt),
4514
+ value: opt
4515
+ };
4516
+ }) : [25, 50, 100].map(function (opt) {
4517
+ return {
4518
+ label: String(opt),
4519
+ value: opt
4520
+ };
4521
+ }),
4522
+ value: limit,
4523
+ allowClear: false,
4524
+ placeholder: "",
4525
+ onChange: function onChange(e) {
4526
+ return handleLimitChange(e);
4527
+ },
4528
+ className: "w-20 md:w-30"
4529
+ }), /*#__PURE__*/React__default.createElement("p", {
4530
+ className: "text-sm text-gray-600 whitespace-nowrap"
4531
+ }, "entries"))), /*#__PURE__*/React__default.createElement("div", {
4532
+ className: "flex flex-col sm:flex-row items-start sm:items-center gap-3 w-full md:w-auto"
4533
+ }, /*#__PURE__*/React__default.createElement("div", {
4534
+ className: "text-sm text-gray-700 whitespace-nowrap"
4535
+ }, filteredData.length === 0 ? 0 : startIndex + 1, " -", " ", Math.min(endIndex, filteredData.length), " of ", filteredData.length, " ", "results"), pagination && /*#__PURE__*/React__default.createElement("div", {
4536
+ className: "flex items-center gap-1"
4537
+ }, /*#__PURE__*/React__default.createElement("div", {
4538
+ className: "flex gap-1"
4539
+ }, /*#__PURE__*/React__default.createElement("button", {
4540
+ className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4541
+ disabled: currentPage === 1,
4542
+ onClick: function onClick() {
4543
+ return setCurrentPage(function (p) {
4544
+ return Math.max(1, p - 1);
4545
+ });
4546
+ },
4547
+ "aria-label": "Previous page"
4548
+ }, /*#__PURE__*/React__default.createElement(ChevronLeft, {
4549
+ className: "size-4 md:size-5 text-gray-800"
4550
+ })), /*#__PURE__*/React__default.createElement("button", {
4551
+ className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4552
+ disabled: currentPage === totalPages,
4553
+ onClick: function onClick() {
4554
+ return setCurrentPage(function (p) {
4555
+ return Math.min(totalPages, p + 1);
4556
+ });
4557
+ },
4558
+ "aria-label": "Next page"
4559
+ }, /*#__PURE__*/React__default.createElement(ChevronRight, {
4560
+ className: "size-4 md:size-5 text-gray-800"
4561
+ })))))), globalSearch && /*#__PURE__*/React__default.createElement("div", {
4562
+ className: "p-4 border-b"
4563
+ }, /*#__PURE__*/React__default.createElement("div", {
4564
+ className: "flex flex-col sm:flex-row items-start sm:items-center gap-2"
4293
4565
  }, /*#__PURE__*/React__default.createElement("div", {
4294
4566
  className: "relative w-full"
4295
4567
  }, /*#__PURE__*/React__default.createElement("input", {
4296
4568
  type: "text",
4297
- placeholder: "Global search...",
4298
- className: "rounded-md border border-gray-300 px-4 py-3 w-full text-sm flex-1 outline-none",
4569
+ placeholder: "Search...",
4570
+ className: "w-full rounded-lg md:rounded-md border border-gray-300 px-4 py-3 md:py-2 text-sm flex-1 outline-none pr-12",
4299
4571
  value: searchInput,
4300
4572
  onChange: function onChange(e) {
4301
4573
  return setSearchInput(e.target.value);
4302
- } // just update local state
4303
- ,
4304
- onKeyDown: onGlobalKeyDown // apply on Enter
4574
+ },
4575
+ onKeyDown: onGlobalKeyDown
4305
4576
  }), /*#__PURE__*/React__default.createElement("button", {
4306
- onClick: applyGlobalSearch // apply when clicked
4307
- ,
4308
- className: "rounded-md border bg-secondary-100 border-gray-300 px-4 py-2 text-sm hover:bg-gray-100 absolute right-0 left-0 w-fit ml-auto h-full",
4577
+ onClick: applyGlobalSearch,
4578
+ className: "absolute right-2 top-1/2 transform -translate-y-1/2 p-2 rounded-lg hover:bg-gray-100",
4309
4579
  title: "Search"
4310
4580
  }, /*#__PURE__*/React__default.createElement(Search, {
4311
- className: "text-gray-400"
4581
+ className: "h-4 w-4 text-gray-400"
4312
4582
  }))), /*#__PURE__*/React__default.createElement("button", {
4313
4583
  onClick: function onClick() {
4314
4584
  setSearchInput("");
4315
4585
  handleFilter("global", "");
4316
4586
  },
4317
- className: "rounded-md border border-gray-300 h-full px-3 py-3 text-sm hover:bg-gray-100",
4318
- title: "Clear"
4319
- }, "Clear")), /*#__PURE__*/React__default.createElement("div", {
4587
+ className: "whitespace-nowrap rounded-lg md:rounded-md border border-gray-300 px-4 py-3 md:py-2 text-sm hover:bg-gray-100 w-full sm:w-auto"
4588
+ }, "Clear"))), filterable && isMobileView && renderMobileFilters(), showColumnMenu && /*#__PURE__*/React__default.createElement("div", {
4589
+ ref: columnMenuRef,
4590
+ className: "absolute right-4 mt-2 w-56 z-50 bg-white rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 p-3 lg:block sm:block hidden",
4591
+ onClick: function onClick(e) {
4592
+ return e.stopPropagation();
4593
+ }
4594
+ }, /*#__PURE__*/React__default.createElement("p", {
4595
+ className: "text-sm font-medium text-center mb-2"
4596
+ }, "Show / hide columns"), /*#__PURE__*/React__default.createElement("div", {
4597
+ className: "max-h-56 overflow-auto"
4598
+ }, columnsState.map(function (col) {
4599
+ return /*#__PURE__*/React__default.createElement("label", {
4600
+ key: col.key,
4601
+ className: "flex cursor-pointer items-center gap-2 px-2 py-1.5 hover:bg-gray-50 rounded"
4602
+ }, /*#__PURE__*/React__default.createElement("input", {
4603
+ type: "checkbox",
4604
+ checked: col.isVisible !== false,
4605
+ onChange: function onChange() {
4606
+ return toggleColumnVisibility(col.key);
4607
+ },
4608
+ className: "rounded"
4609
+ }), /*#__PURE__*/React__default.createElement("span", {
4610
+ className: "text-sm font-normal"
4611
+ }, col.label));
4612
+ }))), !isMobileView && /*#__PURE__*/React__default.createElement("div", {
4320
4613
  className: "overflow-x-auto"
4321
4614
  }, /*#__PURE__*/React__default.createElement("table", _extends({
4322
4615
  className: cn$1("min-w-full divide-y divide-gray-200", className)
@@ -4352,7 +4645,7 @@ var Table = function Table(_ref) {
4352
4645
  className: cn$1("h-3 w-3", {
4353
4646
  "text-primary-600": sortConfig.key === column.key && sortConfig.direction === "asc"
4354
4647
  })
4355
- }), /*#__PURE__*/React__default.createElement(ChevronDown, {
4648
+ }), /*#__PURE__*/React__default.createElement(ChevronDown$1, {
4356
4649
  className: cn$1("h-3 w-3 -mt-1", {
4357
4650
  "text-primary-600": sortConfig.key === column.key && sortConfig.direction === "desc"
4358
4651
  })
@@ -4373,53 +4666,54 @@ var Table = function Table(_ref) {
4373
4666
  className: "p-1 rounded hover:bg-gray-100"
4374
4667
  }, /*#__PURE__*/React__default.createElement(MoreVertical, {
4375
4668
  className: "h-4 w-4"
4376
- })), showColumnMenu && /*#__PURE__*/React__default.createElement("div", {
4377
- ref: columnMenuRef,
4378
- className: "absolute right-0 mt-2 w-56 z-50 bg-white rounded-md shadow-lg ring-1 ring-black ring-opacity-5 p-2",
4379
- onClick: function onClick(e) {
4380
- return e.stopPropagation();
4381
- }
4382
- }, /*#__PURE__*/React__default.createElement("p", {
4383
- className: "text-sm font-normal text-center"
4384
- }, "Show / hide columns"), /*#__PURE__*/React__default.createElement("div", {
4385
- className: "max-h-56 overflow-auto"
4386
- }, columnsState.map(function (col) {
4387
- return /*#__PURE__*/React__default.createElement("label", {
4388
- key: col.key,
4389
- className: "flex cursor-pointer items-center gap-2 px-2 py-1 hover:bg-gray-50 rounded"
4390
- }, /*#__PURE__*/React__default.createElement("input", {
4391
- type: "checkbox",
4392
- checked: col.isVisible !== false,
4393
- onChange: function onChange() {
4394
- return toggleColumnVisibility(col.key);
4395
- }
4396
- }), /*#__PURE__*/React__default.createElement("span", {
4397
- className: "text-sm font-normal"
4398
- }, col.label));
4399
- }))))), withAction && /*#__PURE__*/React__default.createElement("th", {
4669
+ })))), withAction && /*#__PURE__*/React__default.createElement("th", {
4400
4670
  className: "w-12 px-4 py-3"
4401
- })), /*#__PURE__*/React__default.createElement("tr", null, filterable && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("th", null), visibleColumns.map(function (column) {
4671
+ })), filterable && /*#__PURE__*/React__default.createElement("tr", null, hasDetails && /*#__PURE__*/React__default.createElement("th", {
4672
+ className: "pb-4"
4673
+ }), showSerial && /*#__PURE__*/React__default.createElement("th", {
4674
+ className: "pb-4"
4675
+ }), selectable && /*#__PURE__*/React__default.createElement("th", {
4676
+ className: "pb-4"
4677
+ }), visibleColumns.map(function (column) {
4402
4678
  return /*#__PURE__*/React__default.createElement("th", {
4403
- className: "text-left pl-6 pb-4"
4404
- }, /*#__PURE__*/React__default.createElement("input", {
4405
4679
  key: column.key,
4680
+ className: "px-6 pb-4"
4681
+ }, /*#__PURE__*/React__default.createElement("input", {
4406
4682
  type: "text",
4407
- placeholder: "Filter ".concat(column.label, "..."),
4408
- className: "rounded-md border border-gray-300 px-3 py-1 text-sm font-normal",
4683
+ placeholder: "Filter ".concat(column.label),
4684
+ className: "w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm",
4409
4685
  value: filters[column.key] || "",
4410
4686
  onChange: function onChange(e) {
4411
4687
  return handleFilter(column.key, e.target.value);
4412
4688
  }
4413
4689
  }));
4414
- })))), /*#__PURE__*/React__default.createElement("tbody", {
4690
+ }), /*#__PURE__*/React__default.createElement("th", {
4691
+ className: "pb-4"
4692
+ }), withAction && /*#__PURE__*/React__default.createElement("th", {
4693
+ className: "pb-4"
4694
+ }))), /*#__PURE__*/React__default.createElement("tbody", {
4415
4695
  className: "divide-y divide-gray-200 bg-white"
4416
4696
  }, loading ? /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
4417
4697
  colSpan: visibleCount,
4418
- className: "px-6 py-4 text-sm"
4419
- }, "Loading...")) : paginatedData.length === 0 ? /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
4698
+ className: "px-6 py-8 text-center"
4699
+ }, /*#__PURE__*/React__default.createElement("div", {
4700
+ className: "flex flex-col items-center gap-2"
4701
+ }, /*#__PURE__*/React__default.createElement("div", {
4702
+ className: "h-6 w-6 animate-spin rounded-full border-2 border-primary-600 border-t-transparent"
4703
+ }), /*#__PURE__*/React__default.createElement("span", {
4704
+ className: "text-sm text-gray-500"
4705
+ }, "Loading...")))) : paginatedData.length === 0 ? /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
4420
4706
  colSpan: visibleCount,
4421
- className: "px-6 py-4 text-sm"
4422
- }, "No results found.")) : paginatedData.map(function (row, rowIndexInPage) {
4707
+ className: "px-6 py-8 text-center"
4708
+ }, /*#__PURE__*/React__default.createElement("div", {
4709
+ className: "flex flex-col items-center gap-2"
4710
+ }, /*#__PURE__*/React__default.createElement("div", {
4711
+ className: "text-gray-400"
4712
+ }, /*#__PURE__*/React__default.createElement(List, {
4713
+ className: "h-8 w-8"
4714
+ })), /*#__PURE__*/React__default.createElement("span", {
4715
+ className: "text-sm text-gray-500"
4716
+ }, "No results found.")))) : paginatedData.map(function (row, rowIndexInPage) {
4423
4717
  var globalIndex = startIndex + rowIndexInPage;
4424
4718
  var key = getRowKey(row, globalIndex);
4425
4719
  var actionCellKey = "actions-".concat(key);
@@ -4428,9 +4722,13 @@ var Table = function Table(_ref) {
4428
4722
  rowIndex: globalIndex
4429
4723
  }) : "";
4430
4724
  var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
4725
+ var stripeBg = stripedRows && !selectedRows.has(key) ? stripedColors[globalIndex % stripedColors.length] : undefined;
4431
4726
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, {
4432
4727
  key: key
4433
4728
  }, /*#__PURE__*/React__default.createElement("tr", {
4729
+ style: stripeBg ? {
4730
+ backgroundColor: stripeBg
4731
+ } : undefined,
4434
4732
  className: cn$1("hover:bg-gray-50", {
4435
4733
  "cursor-pointer": !!onRowClick,
4436
4734
  "bg-primary-50": selectedRows.has(key)
@@ -4471,9 +4769,7 @@ var Table = function Table(_ref) {
4471
4769
  var safeExtraCellClass = typeof extraCellClass === "string" ? extraCellClass.trim() : "";
4472
4770
  return /*#__PURE__*/React__default.createElement("td", {
4473
4771
  key: column.key,
4474
- className: cn$1("px-6 py-4 whitespace-nowrap text-sm text-gray-900",
4475
- // append the cellClass string only if it's a string
4476
- safeExtraCellClass)
4772
+ className: cn$1("px-6 py-4 whitespace-nowrap text-sm text-gray-900", safeExtraCellClass)
4477
4773
  }, renderCell(column, row, globalIndex));
4478
4774
  }), withAction && /*#__PURE__*/React__default.createElement("td", {
4479
4775
  className: "px-4 py-4 text-sm text-right",
@@ -4493,6 +4789,7 @@ var Table = function Table(_ref) {
4493
4789
  className: "h-4 w-4"
4494
4790
  }))), actionAnchor && actionAnchor.key === actionCellKey && /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement(ActionMenuPortal, {
4495
4791
  anchorElem: actionAnchor.elem,
4792
+ anchorRow: actionAnchor.row,
4496
4793
  actions: actionsToUse,
4497
4794
  onClose: function onClose() {
4498
4795
  setOpenActionKey(null);
@@ -4511,62 +4808,71 @@ var Table = function Table(_ref) {
4511
4808
  row: row,
4512
4809
  index: globalIndex
4513
4810
  })))));
4514
- })))), pagination && /*#__PURE__*/React__default.createElement("div", {
4515
- className: "mt-4 flex items-center justify-between"
4811
+ })))), isMobileView && /*#__PURE__*/React__default.createElement("div", {
4812
+ className: "p-4"
4813
+ }, loading ? /*#__PURE__*/React__default.createElement("div", {
4814
+ className: "py-8 text-center"
4815
+ }, /*#__PURE__*/React__default.createElement("div", {
4816
+ className: "flex flex-col items-center gap-2"
4817
+ }, /*#__PURE__*/React__default.createElement("div", {
4818
+ className: "h-6 w-6 animate-spin rounded-full border-2 border-primary-600 border-t-transparent"
4819
+ }), /*#__PURE__*/React__default.createElement("span", {
4820
+ className: "text-sm text-gray-500"
4821
+ }, "Loading..."))) : paginatedData.length === 0 ? /*#__PURE__*/React__default.createElement("div", {
4822
+ className: "py-8 text-center"
4823
+ }, /*#__PURE__*/React__default.createElement("div", {
4824
+ className: "flex flex-col items-center gap-2"
4825
+ }, /*#__PURE__*/React__default.createElement("div", {
4826
+ className: "text-gray-400"
4827
+ }, /*#__PURE__*/React__default.createElement(List, {
4828
+ className: "h-8 w-8"
4829
+ })), /*#__PURE__*/React__default.createElement("span", {
4830
+ className: "text-sm text-gray-500"
4831
+ }, "No results found."))) : paginatedData.map(function (row, rowIndexInPage) {
4832
+ return renderMobileCard(row, rowIndexInPage);
4833
+ })), pagination && /*#__PURE__*/React__default.createElement("div", {
4834
+ className: "p-4 border-t"
4835
+ }, /*#__PURE__*/React__default.createElement("div", {
4836
+ className: "flex flex-col sm:flex-row items-center justify-between gap-3"
4516
4837
  }, /*#__PURE__*/React__default.createElement("div", {
4517
- className: "text-sm text-gray-700"
4518
- }, "Showing ", filteredData.length === 0 ? 0 : startIndex + 1, " to", " ", Math.min(endIndex, filteredData.length), " of ", filteredData.length, " ", "results"), /*#__PURE__*/React__default.createElement("div", {
4519
- className: "flex items-center gap-1"
4520
- }, showLimitSelector && /*#__PURE__*/React__default.createElement("div", {
4521
- className: "flex items-center space-x-2"
4522
- }, /*#__PURE__*/React__default.createElement("label", {
4523
- htmlFor: "pagination-limit",
4524
4838
  className: "text-sm text-gray-600"
4525
- }, "Show"), /*#__PURE__*/React__default.createElement(Select, {
4526
- options: Array.isArray(limitOptions) && limitOptions.length > 0 ? limitOptions.map(function (opt) {
4527
- return {
4528
- label: String(opt),
4529
- value: opt
4530
- };
4531
- }) : [25, 50, 100].map(function (opt) {
4532
- return {
4533
- label: String(opt),
4534
- value: opt
4535
- };
4536
- }),
4537
- value: limit,
4538
- allowClear: false,
4539
- onChange: function onChange(e) {
4540
- return handleLimitChange(e);
4541
- },
4542
- className: "w-20"
4543
- })), /*#__PURE__*/React__default.createElement("div", {
4544
- className: "flex gap-1"
4839
+ }, "Page ", currentPage, " of ", totalPages), /*#__PURE__*/React__default.createElement("div", {
4840
+ className: "flex items-center gap-2"
4545
4841
  }, /*#__PURE__*/React__default.createElement("button", {
4546
- className: "rounded-md border border-gray-300 px-3 py-1 text-sm disabled:opacity-50",
4842
+ className: "rounded-lg md:rounded-md border border-gray-300 px-4 py-2 text-sm disabled:opacity-50 hover:bg-gray-50",
4547
4843
  disabled: currentPage === 1,
4548
4844
  onClick: function onClick() {
4549
4845
  return setCurrentPage(function (p) {
4550
4846
  return Math.max(1, p - 1);
4551
4847
  });
4552
4848
  }
4553
- }, "Previous"), Array.from({
4554
- length: totalPages
4849
+ }, "Previous"), /*#__PURE__*/React__default.createElement("div", {
4850
+ className: "flex items-center gap-1"
4851
+ }, Array.from({
4852
+ length: Math.min(5, totalPages)
4555
4853
  }, function (_, i) {
4556
- return i + 1;
4557
- }).map(function (page) {
4854
+ var pageNum;
4855
+ if (totalPages <= 5) {
4856
+ pageNum = i + 1;
4857
+ } else if (currentPage <= 3) {
4858
+ pageNum = i + 1;
4859
+ } else if (currentPage >= totalPages - 2) {
4860
+ pageNum = totalPages - 4 + i;
4861
+ } else {
4862
+ pageNum = currentPage - 2 + i;
4863
+ }
4558
4864
  return /*#__PURE__*/React__default.createElement("button", {
4559
- key: page,
4560
- className: cn$1("rounded-md px-3 py-1 text-sm", {
4561
- "bg-primary-600 text-white": page === currentPage,
4562
- "border border-gray-300": page !== currentPage
4865
+ key: pageNum,
4866
+ className: cn$1("h-8 w-8 rounded-lg md:rounded-md text-sm", {
4867
+ "bg-primary-600 text-white": pageNum === currentPage,
4868
+ "border border-gray-300 hover:bg-gray-50": pageNum !== currentPage
4563
4869
  }),
4564
4870
  onClick: function onClick() {
4565
- return setCurrentPage(page);
4871
+ return setCurrentPage(pageNum);
4566
4872
  }
4567
- }, page);
4568
- }), /*#__PURE__*/React__default.createElement("button", {
4569
- className: "rounded-md border border-gray-300 px-3 py-1 text-sm disabled:opacity-50",
4873
+ }, pageNum);
4874
+ })), /*#__PURE__*/React__default.createElement("button", {
4875
+ className: "rounded-lg md:rounded-md border border-gray-300 px-4 py-2 text-sm disabled:opacity-50 hover:bg-gray-50",
4570
4876
  disabled: currentPage === totalPages,
4571
4877
  onClick: function onClick() {
4572
4878
  return setCurrentPage(function (p) {
@@ -4576,7 +4882,7 @@ var Table = function Table(_ref) {
4576
4882
  }, "Next")))));
4577
4883
  };
4578
4884
 
4579
- /* ---------------- ActionMenuPortal (unchanged) ---------------- */
4885
+ /* ---------------- ActionMenuPortal (updated for mobile) ---------------- */
4580
4886
  function ActionMenuPortal(_ref4) {
4581
4887
  var anchorElem = _ref4.anchorElem,
4582
4888
  anchorRow = _ref4.anchorRow,
@@ -4585,10 +4891,10 @@ function ActionMenuPortal(_ref4) {
4585
4891
  _ref4.onClose;
4586
4892
  var onAction = _ref4.onAction,
4587
4893
  menuRef = _ref4.menuRef;
4588
- var _useState25 = useState(0),
4589
- _useState26 = _slicedToArray(_useState25, 2),
4590
- setTick = _useState26[1]; // force update for repositioning
4591
- var _useState27 = useState({
4894
+ var _useState29 = useState(0),
4895
+ _useState30 = _slicedToArray(_useState29, 2),
4896
+ setTick = _useState30[1];
4897
+ var _useState31 = useState({
4592
4898
  left: 0,
4593
4899
  top: 0,
4594
4900
  transformOrigin: "top right",
@@ -4596,9 +4902,9 @@ function ActionMenuPortal(_ref4) {
4596
4902
  width: 180,
4597
4903
  opacity: 0
4598
4904
  }),
4599
- _useState28 = _slicedToArray(_useState27, 2),
4600
- style = _useState28[0],
4601
- setStyle = _useState28[1];
4905
+ _useState32 = _slicedToArray(_useState31, 2),
4906
+ style = _useState32[0],
4907
+ setStyle = _useState32[1];
4602
4908
  var menuWidth = 180;
4603
4909
  var maxMenuHeight = 320;
4604
4910
  var computePosition = function computePosition() {
@@ -4645,7 +4951,6 @@ function ActionMenuPortal(_ref4) {
4645
4951
  window.removeEventListener("resize", onScrollOrResize);
4646
4952
  window.removeEventListener("scroll", onScrollOrResize, true);
4647
4953
  };
4648
- // eslint-disable-next-line react-hooks/exhaustive-deps
4649
4954
  }, [anchorElem]);
4650
4955
  return /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement("div", {
4651
4956
  ref: menuRef,
@@ -4656,7 +4961,7 @@ function ActionMenuPortal(_ref4) {
4656
4961
  maxHeight: style.maxHeight,
4657
4962
  transformOrigin: style.transformOrigin
4658
4963
  },
4659
- className: "absolute z-50 bg-white rounded-md shadow-lg ring-1 ring-black ring-opacity-5 overflow-y-auto transition-opacity duration-150 ease-out",
4964
+ className: "absolute z-50 bg-white rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 overflow-y-auto transition-opacity duration-150 ease-out",
4660
4965
  onClick: function onClick(e) {
4661
4966
  return e.stopPropagation();
4662
4967
  }
@@ -15241,7 +15546,7 @@ var Sidebar = function Sidebar(_ref2) {
15241
15546
  className: "flex-1 truncate"
15242
15547
  }, item.label), hasChildren && /*#__PURE__*/React__default.createElement("span", {
15243
15548
  className: "ml-2 flex-shrink-0"
15244
- }, isExpanded ? /*#__PURE__*/React__default.createElement(ChevronLeft, {
15549
+ }, isExpanded ? /*#__PURE__*/React__default.createElement(ChevronDown, {
15245
15550
  className: "h-4 w-4"
15246
15551
  }) : /*#__PURE__*/React__default.createElement(ChevronRight, {
15247
15552
  className: "h-4 w-4"