jett.admin.npmpackage 1.0.62 → 1.0.65

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.css CHANGED
@@ -276,9 +276,6 @@
276
276
  .top-0 {
277
277
  top: calc(var(--spacing) * 0);
278
278
  }
279
- .top-4 {
280
- top: calc(var(--spacing) * 4);
281
- }
282
279
  .top-full {
283
280
  top: 100%;
284
281
  }
@@ -291,9 +288,6 @@
291
288
  .left-0 {
292
289
  left: calc(var(--spacing) * 0);
293
290
  }
294
- .left-4 {
295
- left: calc(var(--spacing) * 4);
296
- }
297
291
  .z-10 {
298
292
  z-index: 10;
299
293
  }
@@ -360,6 +354,9 @@
360
354
  .h-6 {
361
355
  height: calc(var(--spacing) * 6);
362
356
  }
357
+ .h-9 {
358
+ height: calc(var(--spacing) * 9);
359
+ }
363
360
  .h-10 {
364
361
  height: calc(var(--spacing) * 10);
365
362
  }
@@ -399,12 +396,18 @@
399
396
  .w-6 {
400
397
  width: calc(var(--spacing) * 6);
401
398
  }
399
+ .w-9 {
400
+ width: calc(var(--spacing) * 9);
401
+ }
402
402
  .w-10 {
403
403
  width: calc(var(--spacing) * 10);
404
404
  }
405
405
  .w-11 {
406
406
  width: calc(var(--spacing) * 11);
407
407
  }
408
+ .w-20 {
409
+ width: calc(var(--spacing) * 20);
410
+ }
408
411
  .w-\[50px\] {
409
412
  width: 50px;
410
413
  }
@@ -414,6 +417,9 @@
414
417
  .w-full {
415
418
  width: 100%;
416
419
  }
420
+ .min-w-9 {
421
+ min-width: calc(var(--spacing) * 9);
422
+ }
417
423
  .min-w-\[100\%\] {
418
424
  min-width: 100%;
419
425
  }
@@ -423,9 +429,6 @@
423
429
  .shrink-0 {
424
430
  flex-shrink: 0;
425
431
  }
426
- .table-fixed {
427
- table-layout: fixed;
428
- }
429
432
  .caption-bottom {
430
433
  caption-side: bottom;
431
434
  }
@@ -494,6 +497,9 @@
494
497
  .gap-3 {
495
498
  gap: calc(var(--spacing) * 3);
496
499
  }
500
+ .gap-4 {
501
+ gap: calc(var(--spacing) * 4);
502
+ }
497
503
  .truncate {
498
504
  overflow: hidden;
499
505
  text-overflow: ellipsis;
@@ -577,6 +583,9 @@
577
583
  .border-gray-400 {
578
584
  border-color: var(--color-gray-400);
579
585
  }
586
+ .border-primary {
587
+ border-color: var(--color-primary);
588
+ }
580
589
  .border-red-500 {
581
590
  border-color: var(--color-red-500);
582
591
  }
@@ -670,6 +679,9 @@
670
679
  .pt-2 {
671
680
  padding-top: calc(var(--spacing) * 2);
672
681
  }
682
+ .pt-20 {
683
+ padding-top: calc(var(--spacing) * 20);
684
+ }
673
685
  .text-center {
674
686
  text-align: center;
675
687
  }
@@ -997,6 +1009,11 @@
997
1009
  position: relative;
998
1010
  }
999
1011
  }
1012
+ .md\:block {
1013
+ @media (width >= 48rem) {
1014
+ display: block;
1015
+ }
1016
+ }
1000
1017
  .md\:hidden {
1001
1018
  @media (width >= 48rem) {
1002
1019
  display: none;
@@ -1013,6 +1030,11 @@
1013
1030
  translate: var(--tw-translate-x) var(--tw-translate-y);
1014
1031
  }
1015
1032
  }
1033
+ .md\:pt-4 {
1034
+ @media (width >= 48rem) {
1035
+ padding-top: calc(var(--spacing) * 4);
1036
+ }
1037
+ }
1016
1038
  .md\:max-lg\:w-\[280px\] {
1017
1039
  @media (width >= 48rem) {
1018
1040
  @media (width < 64rem) {
@@ -1050,6 +1072,11 @@
1050
1072
  background-color: var(--color-green-900);
1051
1073
  }
1052
1074
  }
1075
+ .dark\:bg-primary {
1076
+ &:where(.dark, .dark *) {
1077
+ background-color: var(--color-primary);
1078
+ }
1079
+ }
1053
1080
  .dark\:bg-red-900 {
1054
1081
  &:where(.dark, .dark *) {
1055
1082
  background-color: var(--color-red-900);
@@ -1070,6 +1097,11 @@
1070
1097
  color: #f4f4f5cc;
1071
1098
  }
1072
1099
  }
1100
+ .dark\:text-gray-600 {
1101
+ &:where(.dark, .dark *) {
1102
+ color: var(--color-gray-600);
1103
+ }
1104
+ }
1073
1105
  .dark\:text-green-100 {
1074
1106
  &:where(.dark, .dark *) {
1075
1107
  color: var(--color-green-100);
package/dist/index.js CHANGED
@@ -41,6 +41,7 @@ __export(index_exports, {
41
41
  CustomTable: () => CustomTable,
42
42
  CustomTextarea: () => CustomTextarea,
43
43
  CustomUpload: () => CustomUpload,
44
+ Pagination: () => Pagination,
44
45
  ProgressBar: () => ProgressBar,
45
46
  RightSheet: () => RightSheet
46
47
  });
@@ -777,26 +778,35 @@ var AppSideBar = ({
777
778
  const closeMobileMenu = () => {
778
779
  setIsMobileMenuOpen(false);
779
780
  };
780
- return /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement(
781
+ return /* @__PURE__ */ import_react12.default.createElement(import_react12.default.Fragment, null, /* @__PURE__ */ import_react12.default.createElement("div", { className: "fixed top-0 left-0 w-full z-50 md:hidden bg-white dark:bg-[#18181b] border-b border-gray-200 dark:border-[#303036] shadow-lg px-4 py-3 flex items-center justify-between" }, /* @__PURE__ */ import_react12.default.createElement(
781
782
  "button",
782
783
  {
783
784
  onClick: toggleMobileMenu,
784
- className: "fixed top-0 left-0 w-full z-50 md:hidden p-2 bg-white dark:bg-[#18181b] border-b border-gray-200 dark:border-[#303036] shadow-lg hover:bg-gray-50 dark:hover:bg-[#27272a] transition-colors",
785
+ className: "p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-[#27272a] transition-colors",
785
786
  "aria-label": "Toggle menu"
786
787
  },
787
788
  isMobileMenuOpen ? /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.X, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" }) : /* @__PURE__ */ import_react12.default.createElement(import_lucide_react6.Menu, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" })
788
- ), isMobileMenuOpen && /* @__PURE__ */ import_react12.default.createElement(
789
+ ), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex-1 flex justify-center" }, /* @__PURE__ */ import_react12.default.createElement(
790
+ "img",
791
+ {
792
+ src: sideBarLogoLocal,
793
+ alt: "sidebarLogo",
794
+ width: 108,
795
+ height: 40,
796
+ className: "object-contain"
797
+ }
798
+ )), /* @__PURE__ */ import_react12.default.createElement("div", { className: "w-10" })), isMobileMenuOpen && /* @__PURE__ */ import_react12.default.createElement(
789
799
  "div",
790
800
  {
791
- className: "fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden",
801
+ className: "fixed inset-0 bg-black/80 bg-opacity-50 z-40 md:hidden",
792
802
  onClick: closeMobileMenu
793
803
  }
794
804
  ), /* @__PURE__ */ import_react12.default.createElement(
795
805
  "div",
796
806
  {
797
- className: `fixed top-0 left-0 md:relative w-[320px] transition-all ease-in-out delay-100 bg-white dark:bg-[#18181b] border-r border-gray-200 dark:border-[#303036] flex flex-col p-4 h-full max-h-[100vh] z-40 md:max-lg:w-[280px] ${isMobileMenuOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"}`
807
+ className: `fixed top-0 left-0 md:relative w-[320px] transition-all ease-in-out delay-100 bg-white dark:bg-[#18181b] border-r border-gray-200 dark:border-[#303036] flex flex-col p-4 pt-20 md:pt-4 h-full max-h-[100vh] z-40 md:max-lg:w-[280px] ${isMobileMenuOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"}`
798
808
  },
799
- /* @__PURE__ */ import_react12.default.createElement("div", { className: "p-2 mb-2" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex items-center justify-center w-full h-[60px] mb-2" }, /* @__PURE__ */ import_react12.default.createElement(
809
+ /* @__PURE__ */ import_react12.default.createElement("div", { className: "p-2 mb-2 hidden md:block" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex items-center justify-center w-full h-[60px] mb-2" }, /* @__PURE__ */ import_react12.default.createElement(
800
810
  "img",
801
811
  {
802
812
  src: sideBarLogoLocal,
@@ -964,7 +974,7 @@ var CustomTable = ({
964
974
  children,
965
975
  isHideCheckbox = "false"
966
976
  }) => {
967
- return /* @__PURE__ */ import_react14.default.createElement("div", { className: "border border-[#e5e5e5] dark:border-[#303036] rounded-lg overflow-x-auto" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "w-full relative overflow-x-auto" }, /* @__PURE__ */ import_react14.default.createElement("table", { className: "w-full caption-bottom text-sm overflow-x-auto bg-white dark:bg-[#18181b] table-fixed border-collapse" }, /* @__PURE__ */ import_react14.default.createElement("thead", { className: "border-b border-[#e5e5e5] dark:bg-[#18181b]" }, /* @__PURE__ */ import_react14.default.createElement(
977
+ return /* @__PURE__ */ import_react14.default.createElement("div", { className: "border border-[#e5e5e5] dark:border-[#303036] rounded-lg overflow-x-auto flex flex-col" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "w-full relative overflow-x-auto flex-1" }, /* @__PURE__ */ import_react14.default.createElement("table", { className: "w-full caption-bottom text-sm overflow-x-auto bg-white dark:bg-[#18181b] border-collapse" }, /* @__PURE__ */ import_react14.default.createElement("thead", { className: "border-b border-[#e5e5e5] dark:bg-[#18181b]" }, /* @__PURE__ */ import_react14.default.createElement(
968
978
  "tr",
969
979
  {
970
980
  className: "transition-colors text-[#737373] hover:bg-muted/50 \r\n data-[state=selected]:bg-muted"
@@ -990,6 +1000,147 @@ var CustomTable = ({
990
1000
  })
991
1001
  )), /* @__PURE__ */ import_react14.default.createElement("tbody", null, children))));
992
1002
  };
1003
+
1004
+ // src/Pagination/Pagination.jsx
1005
+ var import_react15 = __toESM(require("react"));
1006
+ var import_lucide_react7 = require("lucide-react");
1007
+ var Pagination = ({
1008
+ data = [],
1009
+ children,
1010
+ component: Component,
1011
+ itemsPerPage = 10,
1012
+ itemsPerPageOptions = [5, 10, 20, 50, 100],
1013
+ // Controlled props (optional)
1014
+ currentPage: controlledCurrentPage,
1015
+ onPageChange: controlledOnPageChange,
1016
+ onItemsPerPageChange: controlledOnItemsPerPageChange,
1017
+ // Legacy props for backward compatibility
1018
+ totalPages,
1019
+ totalItems: legacyTotalItems,
1020
+ onPageChange: legacyOnPageChange,
1021
+ onItemsPerPageChange: legacyOnItemsPerPageChange
1022
+ }) => {
1023
+ const [internalCurrentPage, setInternalCurrentPage] = (0, import_react15.useState)(1);
1024
+ const [internalItemsPerPage, setInternalItemsPerPage] = (0, import_react15.useState)(itemsPerPage);
1025
+ const isControlled = controlledCurrentPage !== void 0;
1026
+ const isItemsPerPageControlled = controlledOnItemsPerPageChange !== void 0;
1027
+ const currentPage = isControlled ? controlledCurrentPage : internalCurrentPage;
1028
+ const activeItemsPerPage = isItemsPerPageControlled ? itemsPerPage : internalItemsPerPage;
1029
+ const totalItems = legacyTotalItems !== void 0 ? legacyTotalItems : data.length;
1030
+ const calculatedTotalPages = (0, import_react15.useMemo)(() => {
1031
+ if (totalItems > 0 && activeItemsPerPage > 0) {
1032
+ return Math.ceil(totalItems / activeItemsPerPage);
1033
+ }
1034
+ return 1;
1035
+ }, [totalItems, activeItemsPerPage]);
1036
+ const paginatedData = (0, import_react15.useMemo)(() => {
1037
+ if (!data || data.length === 0) return [];
1038
+ const startIndex = (currentPage - 1) * activeItemsPerPage;
1039
+ const endIndex = startIndex + activeItemsPerPage;
1040
+ return data.slice(startIndex, endIndex);
1041
+ }, [data, currentPage, activeItemsPerPage]);
1042
+ (0, import_react15.useEffect)(() => {
1043
+ if (!isControlled && currentPage > calculatedTotalPages && calculatedTotalPages > 0) {
1044
+ setInternalCurrentPage(1);
1045
+ }
1046
+ }, [calculatedTotalPages, isControlled, currentPage]);
1047
+ const getPageNumbers = () => {
1048
+ const pages = [];
1049
+ const maxVisible = 5;
1050
+ let startPage = Math.max(1, currentPage - Math.floor(maxVisible / 2));
1051
+ let endPage = Math.min(calculatedTotalPages, startPage + maxVisible - 1);
1052
+ if (endPage - startPage < maxVisible - 1) {
1053
+ startPage = Math.max(1, endPage - maxVisible + 1);
1054
+ }
1055
+ for (let i = startPage; i <= endPage; i++) {
1056
+ pages.push(i);
1057
+ }
1058
+ return pages;
1059
+ };
1060
+ const handlePageChange = (page) => {
1061
+ if (page >= 1 && page <= calculatedTotalPages) {
1062
+ if (isControlled && controlledOnPageChange) {
1063
+ controlledOnPageChange(page);
1064
+ } else if (legacyOnPageChange) {
1065
+ legacyOnPageChange(page);
1066
+ } else {
1067
+ setInternalCurrentPage(page);
1068
+ }
1069
+ }
1070
+ };
1071
+ const handleItemsPerPageChange = (value) => {
1072
+ const newItemsPerPage = Number(value);
1073
+ if (isControlled && controlledOnItemsPerPageChange) {
1074
+ controlledOnItemsPerPageChange(newItemsPerPage);
1075
+ if (controlledOnPageChange) {
1076
+ controlledOnPageChange(1);
1077
+ }
1078
+ } else if (legacyOnItemsPerPageChange) {
1079
+ legacyOnItemsPerPageChange(newItemsPerPage);
1080
+ if (legacyOnPageChange) {
1081
+ legacyOnPageChange(1);
1082
+ }
1083
+ } else {
1084
+ setInternalItemsPerPage(newItemsPerPage);
1085
+ setInternalCurrentPage(1);
1086
+ }
1087
+ };
1088
+ const startItem = totalItems !== void 0 ? (currentPage - 1) * activeItemsPerPage + 1 : null;
1089
+ const endItem = totalItems !== void 0 ? Math.min(currentPage * activeItemsPerPage, totalItems) : null;
1090
+ const renderContent = () => {
1091
+ if (Component) {
1092
+ return paginatedData.map((item) => {
1093
+ return /* @__PURE__ */ import_react15.default.createElement(Component, { key: item.id, data: item });
1094
+ });
1095
+ }
1096
+ return null;
1097
+ };
1098
+ return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, renderContent()), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-col sm:flex-row justify-between items-center gap-4 px-4 py-3 border-t border-[#e5e5e5] dark:border-[#303036] bg-white dark:bg-[#18181b] z-10" }, totalItems !== void 0 && /* @__PURE__ */ import_react15.default.createElement("div", { className: "text-sm text-[#737373] dark:text-white" }, "Showing ", startItem, " to ", endItem, " of ", totalItems, " entries"), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react15.default.createElement(
1099
+ "button",
1100
+ {
1101
+ onClick: () => handlePageChange(1),
1102
+ disabled: currentPage === 1,
1103
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1104
+ title: "First page"
1105
+ },
1106
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronsLeft, { size: 16 })
1107
+ ), /* @__PURE__ */ import_react15.default.createElement(
1108
+ "button",
1109
+ {
1110
+ onClick: () => handlePageChange(currentPage - 1),
1111
+ disabled: currentPage === 1,
1112
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1113
+ title: "Previous page"
1114
+ },
1115
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronLeft, { size: 16 })
1116
+ ), getPageNumbers().map((pageNum) => /* @__PURE__ */ import_react15.default.createElement(
1117
+ "button",
1118
+ {
1119
+ key: pageNum,
1120
+ onClick: () => handlePageChange(pageNum),
1121
+ className: `flex items-center justify-center min-w-9 h-9 px-3 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === pageNum ? "bg-primary text-white border-primary dark:bg-primary" : "bg-white text-black hover:bg-gray-50 dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`
1122
+ },
1123
+ pageNum
1124
+ )), /* @__PURE__ */ import_react15.default.createElement(
1125
+ "button",
1126
+ {
1127
+ onClick: () => handlePageChange(currentPage + 1),
1128
+ disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1129
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1130
+ title: "Next page"
1131
+ },
1132
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronRight, { size: 16 })
1133
+ ), /* @__PURE__ */ import_react15.default.createElement(
1134
+ "button",
1135
+ {
1136
+ onClick: () => handlePageChange(calculatedTotalPages),
1137
+ disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1138
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1139
+ title: "Last page"
1140
+ },
1141
+ /* @__PURE__ */ import_react15.default.createElement(import_lucide_react7.ChevronsRight, { size: 16 })
1142
+ ))));
1143
+ };
993
1144
  // Annotate the CommonJS export names for ESM import in node:
994
1145
  0 && (module.exports = {
995
1146
  AppSideBar,
@@ -1004,6 +1155,7 @@ var CustomTable = ({
1004
1155
  CustomTable,
1005
1156
  CustomTextarea,
1006
1157
  CustomUpload,
1158
+ Pagination,
1007
1159
  ProgressBar,
1008
1160
  RightSheet
1009
1161
  });
package/dist/index.mjs CHANGED
@@ -743,26 +743,35 @@ var AppSideBar = ({
743
743
  const closeMobileMenu = () => {
744
744
  setIsMobileMenuOpen(false);
745
745
  };
746
- return /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(
746
+ return /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement("div", { className: "fixed top-0 left-0 w-full z-50 md:hidden bg-white dark:bg-[#18181b] border-b border-gray-200 dark:border-[#303036] shadow-lg px-4 py-3 flex items-center justify-between" }, /* @__PURE__ */ React12.createElement(
747
747
  "button",
748
748
  {
749
749
  onClick: toggleMobileMenu,
750
- className: "fixed top-0 left-0 w-full z-50 md:hidden p-2 bg-white dark:bg-[#18181b] border-b border-gray-200 dark:border-[#303036] shadow-lg hover:bg-gray-50 dark:hover:bg-[#27272a] transition-colors",
750
+ className: "p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-[#27272a] transition-colors",
751
751
  "aria-label": "Toggle menu"
752
752
  },
753
753
  isMobileMenuOpen ? /* @__PURE__ */ React12.createElement(X, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" }) : /* @__PURE__ */ React12.createElement(Menu, { className: "w-6 h-6 text-gray-700 dark:text-[#f4f4f5cc]" })
754
- ), isMobileMenuOpen && /* @__PURE__ */ React12.createElement(
754
+ ), /* @__PURE__ */ React12.createElement("div", { className: "flex-1 flex justify-center" }, /* @__PURE__ */ React12.createElement(
755
+ "img",
756
+ {
757
+ src: sideBarLogoLocal,
758
+ alt: "sidebarLogo",
759
+ width: 108,
760
+ height: 40,
761
+ className: "object-contain"
762
+ }
763
+ )), /* @__PURE__ */ React12.createElement("div", { className: "w-10" })), isMobileMenuOpen && /* @__PURE__ */ React12.createElement(
755
764
  "div",
756
765
  {
757
- className: "fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden",
766
+ className: "fixed inset-0 bg-black/80 bg-opacity-50 z-40 md:hidden",
758
767
  onClick: closeMobileMenu
759
768
  }
760
769
  ), /* @__PURE__ */ React12.createElement(
761
770
  "div",
762
771
  {
763
- className: `fixed top-0 left-0 md:relative w-[320px] transition-all ease-in-out delay-100 bg-white dark:bg-[#18181b] border-r border-gray-200 dark:border-[#303036] flex flex-col p-4 h-full max-h-[100vh] z-40 md:max-lg:w-[280px] ${isMobileMenuOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"}`
772
+ className: `fixed top-0 left-0 md:relative w-[320px] transition-all ease-in-out delay-100 bg-white dark:bg-[#18181b] border-r border-gray-200 dark:border-[#303036] flex flex-col p-4 pt-20 md:pt-4 h-full max-h-[100vh] z-40 md:max-lg:w-[280px] ${isMobileMenuOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"}`
764
773
  },
765
- /* @__PURE__ */ React12.createElement("div", { className: "p-2 mb-2" }, /* @__PURE__ */ React12.createElement("div", { className: "flex items-center justify-center w-full h-[60px] mb-2" }, /* @__PURE__ */ React12.createElement(
774
+ /* @__PURE__ */ React12.createElement("div", { className: "p-2 mb-2 hidden md:block" }, /* @__PURE__ */ React12.createElement("div", { className: "flex items-center justify-center w-full h-[60px] mb-2" }, /* @__PURE__ */ React12.createElement(
766
775
  "img",
767
776
  {
768
777
  src: sideBarLogoLocal,
@@ -930,7 +939,7 @@ var CustomTable = ({
930
939
  children,
931
940
  isHideCheckbox = "false"
932
941
  }) => {
933
- return /* @__PURE__ */ React14.createElement("div", { className: "border border-[#e5e5e5] dark:border-[#303036] rounded-lg overflow-x-auto" }, /* @__PURE__ */ React14.createElement("div", { className: "w-full relative overflow-x-auto" }, /* @__PURE__ */ React14.createElement("table", { className: "w-full caption-bottom text-sm overflow-x-auto bg-white dark:bg-[#18181b] table-fixed border-collapse" }, /* @__PURE__ */ React14.createElement("thead", { className: "border-b border-[#e5e5e5] dark:bg-[#18181b]" }, /* @__PURE__ */ React14.createElement(
942
+ return /* @__PURE__ */ React14.createElement("div", { className: "border border-[#e5e5e5] dark:border-[#303036] rounded-lg overflow-x-auto flex flex-col" }, /* @__PURE__ */ React14.createElement("div", { className: "w-full relative overflow-x-auto flex-1" }, /* @__PURE__ */ React14.createElement("table", { className: "w-full caption-bottom text-sm overflow-x-auto bg-white dark:bg-[#18181b] border-collapse" }, /* @__PURE__ */ React14.createElement("thead", { className: "border-b border-[#e5e5e5] dark:bg-[#18181b]" }, /* @__PURE__ */ React14.createElement(
934
943
  "tr",
935
944
  {
936
945
  className: "transition-colors text-[#737373] hover:bg-muted/50 \r\n data-[state=selected]:bg-muted"
@@ -956,6 +965,147 @@ var CustomTable = ({
956
965
  })
957
966
  )), /* @__PURE__ */ React14.createElement("tbody", null, children))));
958
967
  };
968
+
969
+ // src/Pagination/Pagination.jsx
970
+ import React15, { useMemo, useState as useState5, useEffect as useEffect3 } from "react";
971
+ import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react";
972
+ var Pagination = ({
973
+ data = [],
974
+ children,
975
+ component: Component,
976
+ itemsPerPage = 10,
977
+ itemsPerPageOptions = [5, 10, 20, 50, 100],
978
+ // Controlled props (optional)
979
+ currentPage: controlledCurrentPage,
980
+ onPageChange: controlledOnPageChange,
981
+ onItemsPerPageChange: controlledOnItemsPerPageChange,
982
+ // Legacy props for backward compatibility
983
+ totalPages,
984
+ totalItems: legacyTotalItems,
985
+ onPageChange: legacyOnPageChange,
986
+ onItemsPerPageChange: legacyOnItemsPerPageChange
987
+ }) => {
988
+ const [internalCurrentPage, setInternalCurrentPage] = useState5(1);
989
+ const [internalItemsPerPage, setInternalItemsPerPage] = useState5(itemsPerPage);
990
+ const isControlled = controlledCurrentPage !== void 0;
991
+ const isItemsPerPageControlled = controlledOnItemsPerPageChange !== void 0;
992
+ const currentPage = isControlled ? controlledCurrentPage : internalCurrentPage;
993
+ const activeItemsPerPage = isItemsPerPageControlled ? itemsPerPage : internalItemsPerPage;
994
+ const totalItems = legacyTotalItems !== void 0 ? legacyTotalItems : data.length;
995
+ const calculatedTotalPages = useMemo(() => {
996
+ if (totalItems > 0 && activeItemsPerPage > 0) {
997
+ return Math.ceil(totalItems / activeItemsPerPage);
998
+ }
999
+ return 1;
1000
+ }, [totalItems, activeItemsPerPage]);
1001
+ const paginatedData = useMemo(() => {
1002
+ if (!data || data.length === 0) return [];
1003
+ const startIndex = (currentPage - 1) * activeItemsPerPage;
1004
+ const endIndex = startIndex + activeItemsPerPage;
1005
+ return data.slice(startIndex, endIndex);
1006
+ }, [data, currentPage, activeItemsPerPage]);
1007
+ useEffect3(() => {
1008
+ if (!isControlled && currentPage > calculatedTotalPages && calculatedTotalPages > 0) {
1009
+ setInternalCurrentPage(1);
1010
+ }
1011
+ }, [calculatedTotalPages, isControlled, currentPage]);
1012
+ const getPageNumbers = () => {
1013
+ const pages = [];
1014
+ const maxVisible = 5;
1015
+ let startPage = Math.max(1, currentPage - Math.floor(maxVisible / 2));
1016
+ let endPage = Math.min(calculatedTotalPages, startPage + maxVisible - 1);
1017
+ if (endPage - startPage < maxVisible - 1) {
1018
+ startPage = Math.max(1, endPage - maxVisible + 1);
1019
+ }
1020
+ for (let i = startPage; i <= endPage; i++) {
1021
+ pages.push(i);
1022
+ }
1023
+ return pages;
1024
+ };
1025
+ const handlePageChange = (page) => {
1026
+ if (page >= 1 && page <= calculatedTotalPages) {
1027
+ if (isControlled && controlledOnPageChange) {
1028
+ controlledOnPageChange(page);
1029
+ } else if (legacyOnPageChange) {
1030
+ legacyOnPageChange(page);
1031
+ } else {
1032
+ setInternalCurrentPage(page);
1033
+ }
1034
+ }
1035
+ };
1036
+ const handleItemsPerPageChange = (value) => {
1037
+ const newItemsPerPage = Number(value);
1038
+ if (isControlled && controlledOnItemsPerPageChange) {
1039
+ controlledOnItemsPerPageChange(newItemsPerPage);
1040
+ if (controlledOnPageChange) {
1041
+ controlledOnPageChange(1);
1042
+ }
1043
+ } else if (legacyOnItemsPerPageChange) {
1044
+ legacyOnItemsPerPageChange(newItemsPerPage);
1045
+ if (legacyOnPageChange) {
1046
+ legacyOnPageChange(1);
1047
+ }
1048
+ } else {
1049
+ setInternalItemsPerPage(newItemsPerPage);
1050
+ setInternalCurrentPage(1);
1051
+ }
1052
+ };
1053
+ const startItem = totalItems !== void 0 ? (currentPage - 1) * activeItemsPerPage + 1 : null;
1054
+ const endItem = totalItems !== void 0 ? Math.min(currentPage * activeItemsPerPage, totalItems) : null;
1055
+ const renderContent = () => {
1056
+ if (Component) {
1057
+ return paginatedData.map((item) => {
1058
+ return /* @__PURE__ */ React15.createElement(Component, { key: item.id, data: item });
1059
+ });
1060
+ }
1061
+ return null;
1062
+ };
1063
+ return /* @__PURE__ */ React15.createElement(React15.Fragment, null, /* @__PURE__ */ React15.createElement(React15.Fragment, null, renderContent()), /* @__PURE__ */ React15.createElement("div", { className: "flex flex-col sm:flex-row justify-between items-center gap-4 px-4 py-3 border-t border-[#e5e5e5] dark:border-[#303036] bg-white dark:bg-[#18181b] z-10" }, totalItems !== void 0 && /* @__PURE__ */ React15.createElement("div", { className: "text-sm text-[#737373] dark:text-white" }, "Showing ", startItem, " to ", endItem, " of ", totalItems, " entries"), /* @__PURE__ */ React15.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React15.createElement(
1064
+ "button",
1065
+ {
1066
+ onClick: () => handlePageChange(1),
1067
+ disabled: currentPage === 1,
1068
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1069
+ title: "First page"
1070
+ },
1071
+ /* @__PURE__ */ React15.createElement(ChevronsLeft, { size: 16 })
1072
+ ), /* @__PURE__ */ React15.createElement(
1073
+ "button",
1074
+ {
1075
+ onClick: () => handlePageChange(currentPage - 1),
1076
+ disabled: currentPage === 1,
1077
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === 1 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1078
+ title: "Previous page"
1079
+ },
1080
+ /* @__PURE__ */ React15.createElement(ChevronLeft, { size: 16 })
1081
+ ), getPageNumbers().map((pageNum) => /* @__PURE__ */ React15.createElement(
1082
+ "button",
1083
+ {
1084
+ key: pageNum,
1085
+ onClick: () => handlePageChange(pageNum),
1086
+ className: `flex items-center justify-center min-w-9 h-9 px-3 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === pageNum ? "bg-primary text-white border-primary dark:bg-primary" : "bg-white text-black hover:bg-gray-50 dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`
1087
+ },
1088
+ pageNum
1089
+ )), /* @__PURE__ */ React15.createElement(
1090
+ "button",
1091
+ {
1092
+ onClick: () => handlePageChange(currentPage + 1),
1093
+ disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1094
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1095
+ title: "Next page"
1096
+ },
1097
+ /* @__PURE__ */ React15.createElement(ChevronRight, { size: 16 })
1098
+ ), /* @__PURE__ */ React15.createElement(
1099
+ "button",
1100
+ {
1101
+ onClick: () => handlePageChange(calculatedTotalPages),
1102
+ disabled: currentPage === calculatedTotalPages || calculatedTotalPages === 0,
1103
+ className: `flex items-center justify-center w-9 h-9 rounded-md border border-[#e5e5e5] dark:border-[#303036] text-sm transition-colors ${currentPage === calculatedTotalPages || calculatedTotalPages === 0 ? "bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-[#27272a] dark:text-gray-600" : "bg-white text-black hover:bg-gray-50 cursor-pointer dark:bg-[#18181b] dark:text-white dark:hover:bg-[#27272a]"}`,
1104
+ title: "Last page"
1105
+ },
1106
+ /* @__PURE__ */ React15.createElement(ChevronsRight, { size: 16 })
1107
+ ))));
1108
+ };
959
1109
  export {
960
1110
  AppSideBar,
961
1111
  Chip,
@@ -969,6 +1119,7 @@ export {
969
1119
  CustomTable,
970
1120
  CustomTextarea,
971
1121
  CustomUpload,
1122
+ Pagination,
972
1123
  ProgressBar,
973
1124
  RightSheet
974
1125
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jett.admin.npmpackage",
3
- "version": "1.0.62",
3
+ "version": "1.0.65",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "exports": {