@a5it/sync-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +45 -0
  2. package/dist/components/data-table/actions/action-delete.d.ts +8 -0
  3. package/dist/components/data-table/actions/action-delete.d.ts.map +1 -0
  4. package/dist/components/data-table/actions/action-delete.js +17 -0
  5. package/dist/components/data-table/actions/action-delete.js.map +1 -0
  6. package/dist/components/data-table/actions/action-item.d.ts +7 -0
  7. package/dist/components/data-table/actions/action-item.d.ts.map +1 -0
  8. package/dist/components/data-table/actions/action-item.js +7 -0
  9. package/dist/components/data-table/actions/action-item.js.map +1 -0
  10. package/dist/components/data-table/actions/actions-dropdown.d.ts +8 -0
  11. package/dist/components/data-table/actions/actions-dropdown.d.ts.map +1 -0
  12. package/dist/components/data-table/actions/actions-dropdown.js +9 -0
  13. package/dist/components/data-table/actions/actions-dropdown.js.map +1 -0
  14. package/dist/components/data-table/cells/date-time-cell.d.ts +16 -0
  15. package/dist/components/data-table/cells/date-time-cell.d.ts.map +1 -0
  16. package/dist/components/data-table/cells/date-time-cell.js +32 -0
  17. package/dist/components/data-table/cells/date-time-cell.js.map +1 -0
  18. package/dist/components/data-table/cells/payment-pill.d.ts +7 -0
  19. package/dist/components/data-table/cells/payment-pill.d.ts.map +1 -0
  20. package/dist/components/data-table/cells/payment-pill.js +23 -0
  21. package/dist/components/data-table/cells/payment-pill.js.map +1 -0
  22. package/dist/components/data-table/cells/record-id-cell.d.ts +7 -0
  23. package/dist/components/data-table/cells/record-id-cell.d.ts.map +1 -0
  24. package/dist/components/data-table/cells/record-id-cell.js +7 -0
  25. package/dist/components/data-table/cells/record-id-cell.js.map +1 -0
  26. package/dist/components/data-table/cells/status-pill.d.ts +6 -0
  27. package/dist/components/data-table/cells/status-pill.d.ts.map +1 -0
  28. package/dist/components/data-table/cells/status-pill.js +67 -0
  29. package/dist/components/data-table/cells/status-pill.js.map +1 -0
  30. package/dist/components/data-table/cells/table-checkbox.d.ts +4 -0
  31. package/dist/components/data-table/cells/table-checkbox.d.ts.map +1 -0
  32. package/dist/components/data-table/cells/table-checkbox.js +9 -0
  33. package/dist/components/data-table/cells/table-checkbox.js.map +1 -0
  34. package/dist/components/data-table/cells/text-cell.d.ts +8 -0
  35. package/dist/components/data-table/cells/text-cell.d.ts.map +1 -0
  36. package/dist/components/data-table/cells/text-cell.js +7 -0
  37. package/dist/components/data-table/cells/text-cell.js.map +1 -0
  38. package/dist/components/data-table/column-header.d.ts +10 -0
  39. package/dist/components/data-table/column-header.d.ts.map +1 -0
  40. package/dist/components/data-table/column-header.js +42 -0
  41. package/dist/components/data-table/column-header.js.map +1 -0
  42. package/dist/components/data-table/columns/selection.d.ts +4 -0
  43. package/dist/components/data-table/columns/selection.d.ts.map +1 -0
  44. package/dist/components/data-table/columns/selection.js +33 -0
  45. package/dist/components/data-table/columns/selection.js.map +1 -0
  46. package/dist/components/data-table/filters/all-filters.d.ts +11 -0
  47. package/dist/components/data-table/filters/all-filters.d.ts.map +1 -0
  48. package/dist/components/data-table/filters/all-filters.js +9 -0
  49. package/dist/components/data-table/filters/all-filters.js.map +1 -0
  50. package/dist/components/data-table/filters/bulk-delete.d.ts +16 -0
  51. package/dist/components/data-table/filters/bulk-delete.d.ts.map +1 -0
  52. package/dist/components/data-table/filters/bulk-delete.js +20 -0
  53. package/dist/components/data-table/filters/bulk-delete.js.map +1 -0
  54. package/dist/components/data-table/filters/filters.d.ts +4 -0
  55. package/dist/components/data-table/filters/filters.d.ts.map +1 -0
  56. package/dist/components/data-table/filters/filters.js +10 -0
  57. package/dist/components/data-table/filters/filters.js.map +1 -0
  58. package/dist/components/data-table/filters/reset.d.ts +21 -0
  59. package/dist/components/data-table/filters/reset.d.ts.map +1 -0
  60. package/dist/components/data-table/filters/reset.js +34 -0
  61. package/dist/components/data-table/filters/reset.js.map +1 -0
  62. package/dist/components/data-table/filters/search.d.ts +25 -0
  63. package/dist/components/data-table/filters/search.d.ts.map +1 -0
  64. package/dist/components/data-table/filters/search.js +89 -0
  65. package/dist/components/data-table/filters/search.js.map +1 -0
  66. package/dist/components/data-table/filters/sort-by.d.ts +7 -0
  67. package/dist/components/data-table/filters/sort-by.d.ts.map +1 -0
  68. package/dist/components/data-table/filters/sort-by.js +76 -0
  69. package/dist/components/data-table/filters/sort-by.js.map +1 -0
  70. package/dist/components/data-table/index.d.ts +26 -0
  71. package/dist/components/data-table/index.d.ts.map +1 -0
  72. package/dist/components/data-table/index.js +24 -0
  73. package/dist/components/data-table/index.js.map +1 -0
  74. package/dist/components/data-table/pagination/pagination.d.ts +66 -0
  75. package/dist/components/data-table/pagination/pagination.d.ts.map +1 -0
  76. package/dist/components/data-table/pagination/pagination.js +224 -0
  77. package/dist/components/data-table/pagination/pagination.js.map +1 -0
  78. package/dist/components/data-table/provider.d.ts +284 -0
  79. package/dist/components/data-table/provider.d.ts.map +1 -0
  80. package/dist/components/data-table/provider.js +193 -0
  81. package/dist/components/data-table/provider.js.map +1 -0
  82. package/dist/components/data-table/table.d.ts +21 -0
  83. package/dist/components/data-table/table.d.ts.map +1 -0
  84. package/dist/components/data-table/table.js +120 -0
  85. package/dist/components/data-table/table.js.map +1 -0
  86. package/dist/components/data-table/tabs.d.ts +19 -0
  87. package/dist/components/data-table/tabs.d.ts.map +1 -0
  88. package/dist/components/data-table/tabs.js +22 -0
  89. package/dist/components/data-table/tabs.js.map +1 -0
  90. package/dist/components/data-table/url-state.d.ts +54 -0
  91. package/dist/components/data-table/url-state.d.ts.map +1 -0
  92. package/dist/components/data-table/url-state.js +130 -0
  93. package/dist/components/data-table/url-state.js.map +1 -0
  94. package/dist/components/page-header/index.d.ts +3 -0
  95. package/dist/components/page-header/index.d.ts.map +1 -0
  96. package/dist/components/page-header/index.js +2 -0
  97. package/dist/components/page-header/index.js.map +1 -0
  98. package/dist/components/page-header/page-header.d.ts +56 -0
  99. package/dist/components/page-header/page-header.d.ts.map +1 -0
  100. package/dist/components/page-header/page-header.js +59 -0
  101. package/dist/components/page-header/page-header.js.map +1 -0
  102. package/dist/components/sidebar/index.d.ts +2 -0
  103. package/dist/components/sidebar/index.d.ts.map +1 -0
  104. package/dist/components/sidebar/index.js +2 -0
  105. package/dist/components/sidebar/index.js.map +1 -0
  106. package/dist/components/ui/alert-dialog.d.ts +15 -0
  107. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  108. package/dist/components/ui/alert-dialog.js +40 -0
  109. package/dist/components/ui/alert-dialog.js.map +1 -0
  110. package/dist/components/ui/button.d.ts +12 -0
  111. package/dist/components/ui/button.d.ts.map +1 -0
  112. package/dist/components/ui/button.js +36 -0
  113. package/dist/components/ui/button.js.map +1 -0
  114. package/dist/components/ui/checkbox.d.ts +5 -0
  115. package/dist/components/ui/checkbox.d.ts.map +1 -0
  116. package/dist/components/ui/checkbox.js +10 -0
  117. package/dist/components/ui/checkbox.js.map +1 -0
  118. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  119. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  120. package/dist/components/ui/dropdown-menu.js +52 -0
  121. package/dist/components/ui/dropdown-menu.js.map +1 -0
  122. package/dist/components/ui/scroll-area.d.ts +6 -0
  123. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  124. package/dist/components/ui/scroll-area.js +14 -0
  125. package/dist/components/ui/scroll-area.js.map +1 -0
  126. package/dist/components/ui/sheet.d.ts +14 -0
  127. package/dist/components/ui/sheet.d.ts.map +1 -0
  128. package/dist/components/ui/sheet.js +41 -0
  129. package/dist/components/ui/sheet.js.map +1 -0
  130. package/dist/components/ui/table.d.ts +11 -0
  131. package/dist/components/ui/table.d.ts.map +1 -0
  132. package/dist/components/ui/table.js +30 -0
  133. package/dist/components/ui/table.js.map +1 -0
  134. package/dist/hooks/index.d.ts +2 -0
  135. package/dist/hooks/index.d.ts.map +1 -0
  136. package/dist/hooks/index.js +3 -0
  137. package/dist/hooks/index.js.map +1 -0
  138. package/dist/index.d.ts +7 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +8 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/lib/utils.d.ts +7 -0
  143. package/dist/lib/utils.d.ts.map +1 -0
  144. package/dist/lib/utils.js +33 -0
  145. package/dist/lib/utils.js.map +1 -0
  146. package/dist/providers/index.d.ts +2 -0
  147. package/dist/providers/index.d.ts.map +1 -0
  148. package/dist/providers/index.js +3 -0
  149. package/dist/providers/index.js.map +1 -0
  150. package/dist/styles/index.css +19 -0
  151. package/dist/types/index.d.ts +4 -0
  152. package/dist/types/index.d.ts.map +1 -0
  153. package/dist/types/index.js +2 -0
  154. package/dist/types/index.js.map +1 -0
  155. package/dist/utils/index.d.ts +2 -0
  156. package/dist/utils/index.d.ts.map +1 -0
  157. package/dist/utils/index.js +2 -0
  158. package/dist/utils/index.js.map +1 -0
  159. package/package.json +95 -0
@@ -0,0 +1,224 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { useQueryState, parseAsInteger } from "nuqs";
5
+ import { ChevronDown, ChevronLeft, ChevronRight } from "lucide-react";
6
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../../ui/dropdown-menu";
7
+ import { cn } from "../../../lib/utils";
8
+ import { useDataTable } from "../provider";
9
+ // ─────────────────────────────────────────────────────────────────────────────
10
+ // Default Configuration
11
+ // ─────────────────────────────────────────────────────────────────────────────
12
+ const DEFAULT_PAGE_PARAM = "page";
13
+ const DEFAULT_LIMIT_PARAM = "limit";
14
+ const DEFAULT_PAGE_SIZE = 10;
15
+ const DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100];
16
+ // ─────────────────────────────────────────────────────────────────────────────
17
+ // Helper to get config values
18
+ // ─────────────────────────────────────────────────────────────────────────────
19
+ function getPaginationParams(config) {
20
+ if (config?.mode === "client" || config?.mode === "server") {
21
+ return {
22
+ pageParam: config.params?.page ?? DEFAULT_PAGE_PARAM,
23
+ limitParam: config.params?.limit ?? DEFAULT_LIMIT_PARAM,
24
+ defaultPageSize: config.defaultPageSize ?? DEFAULT_PAGE_SIZE,
25
+ pageSizeOptions: config.pageSizeOptions ?? DEFAULT_PAGE_SIZE_OPTIONS,
26
+ };
27
+ }
28
+ return {
29
+ pageParam: DEFAULT_PAGE_PARAM,
30
+ limitParam: DEFAULT_LIMIT_PARAM,
31
+ defaultPageSize: DEFAULT_PAGE_SIZE,
32
+ pageSizeOptions: DEFAULT_PAGE_SIZE_OPTIONS,
33
+ };
34
+ }
35
+ /**
36
+ * Pagination container that reads from DataTableProvider's paginationConfig.
37
+ *
38
+ * Both client and server modes sync page/limit to URL query params.
39
+ * - **Client mode**: TanStack Table paginates locally
40
+ * - **Server mode**: URL params trigger server-side pagination
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * <DataTablePagination>
45
+ * <DataTablePaginationInfo />
46
+ * <DataTablePaginationActions>
47
+ * <DataTablePaginationLimits />
48
+ * <DataTablePaginationLinks />
49
+ * </DataTablePaginationActions>
50
+ * </DataTablePagination>
51
+ * ```
52
+ */
53
+ export function DataTablePagination({ className, children, ...props }) {
54
+ return (_jsx("div", { "data-slot": "data-table-pagination", className: cn("content-center flex w-full flex-wrap items-center justify-between gap-2", className), ...props, children: children }));
55
+ }
56
+ export function DataTablePaginationInfo({ format, className, ...props }) {
57
+ const { table, paginationConfig } = useDataTable();
58
+ const { defaultPageSize, pageParam, limitParam } = getPaginationParams(paginationConfig);
59
+ const isClientMode = paginationConfig?.mode === "client";
60
+ const isServerMode = paginationConfig?.mode === "server";
61
+ // URL state
62
+ const [urlPage] = useQueryState(pageParam, {
63
+ ...parseAsInteger,
64
+ defaultValue: 1,
65
+ shallow: isClientMode,
66
+ });
67
+ const [urlLimit] = useQueryState(limitParam, {
68
+ ...parseAsInteger,
69
+ defaultValue: defaultPageSize,
70
+ shallow: isClientMode,
71
+ });
72
+ // Get total count
73
+ let total;
74
+ if (isServerMode) {
75
+ total = paginationConfig.total;
76
+ }
77
+ else {
78
+ // Client mode: use filtered row count from TanStack
79
+ total = table.getFilteredRowModel().rows.length;
80
+ }
81
+ const page = urlPage;
82
+ const limit = urlLimit;
83
+ const start = Math.min((page - 1) * limit + 1, total);
84
+ const end = Math.min(page * limit, total);
85
+ if (total === 0) {
86
+ return (_jsx("div", { "data-slot": "data-table-pagination-info", className: cn("text-[14px] leading-4 font-normal text-[#1a1a1a]", className), ...props, children: "0-0 of 0" }));
87
+ }
88
+ const content = format
89
+ ? format(start, end, total)
90
+ : `${start}-${end} of ${total}`;
91
+ return (_jsx("div", { "data-slot": "data-table-pagination-info", className: cn("text-[14px] leading-4 font-normal text-[#1a1a1a]", className), ...props, children: content }));
92
+ }
93
+ export function DataTablePaginationLimits({ className, buttonClassName, contentClassName, label = "Result per page", onLimitChange, }) {
94
+ const { table, paginationConfig } = useDataTable();
95
+ const { defaultPageSize, pageSizeOptions, pageParam, limitParam } = getPaginationParams(paginationConfig);
96
+ const isClientMode = paginationConfig?.mode === "client";
97
+ // URL state
98
+ const [, setUrlPage] = useQueryState(pageParam, {
99
+ ...parseAsInteger,
100
+ defaultValue: 1,
101
+ shallow: isClientMode,
102
+ });
103
+ const [urlLimit, setUrlLimit] = useQueryState(limitParam, {
104
+ ...parseAsInteger,
105
+ defaultValue: defaultPageSize,
106
+ shallow: isClientMode,
107
+ });
108
+ const handleLimitChange = React.useCallback((newLimit) => {
109
+ // Update URL
110
+ setUrlLimit(newLimit);
111
+ // Reset to page 1
112
+ setUrlPage(1);
113
+ // For client mode, also update TanStack table
114
+ if (isClientMode) {
115
+ table.setPageSize(newLimit);
116
+ table.setPageIndex(0);
117
+ }
118
+ onLimitChange?.(newLimit);
119
+ }, [setUrlLimit, setUrlPage, isClientMode, table, onLimitChange]);
120
+ return (_jsxs("div", { "data-slot": "data-table-pagination-limits", className: cn("flex items-center gap-2", className), children: [label && (_jsx("span", { className: "text-[14px] leading-4 font-normal text-[#1a1a1a]", children: label })), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: cn("flex h-8 items-center justify-center gap-2 rounded-[4px] border border-[#e6e6e6] bg-white px-3 py-2", "text-[14px] leading-4 font-normal text-[#1a1a1a]", buttonClassName), children: [urlLimit, _jsx(ChevronDown, { className: "h-[19.2px] w-[19.2px]", "aria-hidden": true })] }) }), _jsx(DropdownMenuContent, { align: "start", className: cn("min-w-[84px]", contentClassName), children: pageSizeOptions.map((option) => (_jsx(DropdownMenuItem, { onSelect: () => handleLimitChange(option), className: cn(urlLimit === option && "bg-[#f7f7f7]"), children: option }, option))) })] })] }));
121
+ }
122
+ export function DataTablePaginationLinks({ className, maxVisible = 7, showPrevNext = true, onPageChange, }) {
123
+ const { table, paginationConfig } = useDataTable();
124
+ const { defaultPageSize, pageParam, limitParam } = getPaginationParams(paginationConfig);
125
+ const isClientMode = paginationConfig?.mode === "client";
126
+ const isServerMode = paginationConfig?.mode === "server";
127
+ // URL state
128
+ const [urlPage, setUrlPage] = useQueryState(pageParam, {
129
+ ...parseAsInteger,
130
+ defaultValue: 1,
131
+ shallow: isClientMode,
132
+ });
133
+ const [urlLimit] = useQueryState(limitParam, {
134
+ ...parseAsInteger,
135
+ defaultValue: defaultPageSize,
136
+ shallow: isClientMode,
137
+ });
138
+ // Sync URL to TanStack table for client mode on mount
139
+ React.useEffect(() => {
140
+ if (isClientMode) {
141
+ table.setPageIndex(urlPage - 1); // TanStack uses 0-indexed
142
+ table.setPageSize(urlLimit);
143
+ }
144
+ }, [isClientMode, urlPage, urlLimit, table]);
145
+ // Calculate total pages
146
+ let totalPages;
147
+ if (isServerMode) {
148
+ const serverTotal = paginationConfig.total;
149
+ totalPages = Math.ceil(serverTotal / urlLimit);
150
+ }
151
+ else {
152
+ // Client mode: use TanStack's page count
153
+ totalPages = table.getPageCount();
154
+ }
155
+ const normalizedTotalPages = totalPages > 0 ? totalPages : 1;
156
+ const handlePageChange = React.useCallback((newPage) => {
157
+ const safePage = Math.min(Math.max(newPage, 1), normalizedTotalPages);
158
+ // Update URL
159
+ setUrlPage(safePage);
160
+ // For client mode, also update TanStack table
161
+ if (isClientMode) {
162
+ table.setPageIndex(safePage - 1); // TanStack uses 0-indexed
163
+ }
164
+ onPageChange?.(safePage);
165
+ }, [setUrlPage, isClientMode, table, onPageChange, normalizedTotalPages]);
166
+ const page = Math.min(Math.max(urlPage, 1), normalizedTotalPages);
167
+ const canGoPrev = page > 1;
168
+ const canGoNext = page < normalizedTotalPages;
169
+ return (_jsxs("div", { "data-slot": "data-table-pagination-links", className: cn("flex items-center gap-4", className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-[14px] leading-4 font-normal text-[#1a1a1a]", children: "Page" }), _jsx("div", { className: "flex h-8 w-[44px] items-center justify-center rounded-[4px] border border-[#e6e6e6] px-3 py-2", children: _jsx("span", { className: "text-[14px] leading-4 font-normal text-[#4d4d4d]", children: page }) })] }), _jsxs("div", { className: "flex items-center gap-2", children: [showPrevNext && (_jsxs(PaginationButton, { variant: "control", onClick: () => handlePageChange(page - 1), disabled: !canGoPrev, "aria-label": "Go to previous page", children: [_jsx(ChevronLeft, { className: "h-[19.2px] w-[19.2px]", "aria-hidden": true }), _jsx("span", { children: "Back" })] })), generatePageNumbers(page, normalizedTotalPages, maxVisible).map((item, index) => item === "ellipsis" ? (_jsx("span", { className: "inline-flex h-8 min-w-8 items-center justify-center text-[14px] leading-4 font-normal text-[#1a1a1a]", "aria-hidden": true, children: "..." }, `ellipsis-${index}`)) : (_jsx(PaginationButton, { variant: "page", onClick: () => handlePageChange(item), active: item === page, "aria-label": `Go to page ${item}`, "aria-current": item === page ? "page" : undefined, children: item }, item))), showPrevNext && (_jsxs(PaginationButton, { variant: "control", onClick: () => handlePageChange(page + 1), disabled: !canGoNext, "aria-label": "Go to next page", children: [_jsx("span", { children: "Next" }), _jsx(ChevronRight, { className: "h-[19.2px] w-[19.2px]", "aria-hidden": true })] }))] })] }));
170
+ }
171
+ function PaginationButton({ active, variant = "page", disabled, className, children, ...props }) {
172
+ return (_jsx("button", { type: "button", disabled: disabled, className: cn("inline-flex h-8 items-center justify-center gap-1 rounded-[4px] text-[14px] leading-4 transition-colors", variant === "control" &&
173
+ "border border-[#e6e6e6] px-3 py-2 font-normal text-[#1a1a1a]", variant === "page" &&
174
+ "min-w-8 border border-[#e6e6e6] px-3 py-2 font-normal text-[#1a1a1a]", variant === "page" &&
175
+ active &&
176
+ "w-8 border-transparent bg-primary font-bold text-white", disabled && "cursor-not-allowed opacity-30", className), ...props, children: children }));
177
+ }
178
+ function generatePageNumbers(currentPage, totalPages, maxVisible) {
179
+ // If total pages fit within maxVisible, show all
180
+ if (totalPages <= maxVisible) {
181
+ return Array.from({ length: totalPages }, (_, i) => i + 1);
182
+ }
183
+ const pages = [];
184
+ const halfVisible = Math.floor((maxVisible - 2) / 2); // Reserve 2 for first and last
185
+ // Always include first page
186
+ pages.push(1);
187
+ // Calculate range around current page
188
+ let start = Math.max(2, currentPage - halfVisible);
189
+ let end = Math.min(totalPages - 1, currentPage + halfVisible);
190
+ // Adjust if we're near the beginning
191
+ if (currentPage <= halfVisible + 2) {
192
+ start = 2;
193
+ end = Math.min(totalPages - 1, maxVisible - 1);
194
+ }
195
+ // Adjust if we're near the end
196
+ if (currentPage >= totalPages - halfVisible - 1) {
197
+ start = Math.max(2, totalPages - maxVisible + 2);
198
+ end = totalPages - 1;
199
+ }
200
+ // Add ellipsis before middle section if needed
201
+ if (start > 2) {
202
+ pages.push("ellipsis");
203
+ }
204
+ // Add middle pages
205
+ for (let i = start; i <= end; i++) {
206
+ pages.push(i);
207
+ }
208
+ // Add ellipsis after middle section if needed
209
+ if (end < totalPages - 1) {
210
+ pages.push("ellipsis");
211
+ }
212
+ // Always include last page
213
+ if (totalPages > 1) {
214
+ pages.push(totalPages);
215
+ }
216
+ return pages;
217
+ }
218
+ // ─────────────────────────────────────────────────────────────────────────────
219
+ // Pagination Actions Container (for layout composability)
220
+ // ─────────────────────────────────────────────────────────────────────────────
221
+ export function DataTablePaginationActions({ className, ...props }) {
222
+ return (_jsx("div", { "data-slot": "data-table-pagination-actions", className: cn("flex items-center gap-4", className), ...props }));
223
+ }
224
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../src/components/data-table/pagination/pagination.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,284 @@
1
+ import * as React from "react";
2
+ import { ColumnDef, ColumnFiltersState, PaginationState, RowSelectionState, SortingState, Table, Updater } from "@tanstack/react-table";
3
+ import { UrlStateConfig, UrlStateContextValue } from "./url-state";
4
+ export type DataTableColumnMeta = {
5
+ headerClassName?: string;
6
+ cellClassName?: string;
7
+ /**
8
+ * Simple label used by generic UI (e.g. Sort By dropdown). This avoids trying
9
+ * to stringify the columnDef.header ReactNode.
10
+ */
11
+ label?: string;
12
+ /**
13
+ * Explicit label used by the Sort By dropdown.
14
+ */
15
+ sortyByLabel?: string;
16
+ };
17
+ /**
18
+ * Client-side filtering: URL query params + TanStack Table filters in-browser.
19
+ * URL params persist across reloads/navigation, TanStack handles the actual filtering.
20
+ *
21
+ * @template TData - The row data type. Param keys will autocomplete to `keyof TData`.
22
+ */
23
+ export type ClientFilterConfig<TData> = {
24
+ mode: "client";
25
+ /**
26
+ * Map of column accessor keys to URL query param names.
27
+ * TanStack Table filters locally using these columns.
28
+ * URL params provide persistence across reloads/navigation.
29
+ *
30
+ * Type-safe: Only keys from your data type are allowed as object keys.
31
+ * @example { title: "q", amount: "amt" } → ?q=hello&amt=500 (filtered by TanStack)
32
+ */
33
+ params: Partial<Record<keyof TData & string, string>>;
34
+ };
35
+ /**
36
+ * Server-side filtering: URL query params drive the filter state.
37
+ * Your server handles the actual filtering.
38
+ *
39
+ * @template TData - The row data type. Param keys will autocomplete to `keyof TData`.
40
+ */
41
+ export type ServerFilterConfig<TData> = {
42
+ mode: "server";
43
+ /**
44
+ * Map of column accessor keys to URL query param names.
45
+ * Server handles the actual filtering based on these params.
46
+ *
47
+ * Type-safe: Only keys from your data type are allowed as object keys.
48
+ * @example { title: "q", amount: "amt" } → ?q=hello&amt=500 (filtered by server)
49
+ */
50
+ params: Partial<Record<keyof TData & string, string>>;
51
+ };
52
+ /**
53
+ * No filtering enabled (default behavior).
54
+ */
55
+ export type NoFilterConfig = {
56
+ mode?: undefined;
57
+ };
58
+ /**
59
+ * Discriminated union: only one filtering mode can be active.
60
+ * TypeScript will error if you try to use props from both modes.
61
+ *
62
+ * Both client and server modes use the same `params` structure for URL persistence.
63
+ * The difference is WHO does the filtering: TanStack (client) or your API (server).
64
+ *
65
+ * @template TData - The row data type for type-safe column keys.
66
+ */
67
+ export type FilterConfig<TData> = ClientFilterConfig<TData> | ServerFilterConfig<TData> | NoFilterConfig;
68
+ /**
69
+ * Pagination URL param configuration.
70
+ */
71
+ export type PaginationParams = {
72
+ /**
73
+ * URL query param name for page number.
74
+ * @default "page"
75
+ */
76
+ page?: string;
77
+ /**
78
+ * URL query param name for page size/limit.
79
+ * @default "limit"
80
+ */
81
+ limit?: string;
82
+ };
83
+ /**
84
+ * Client-side pagination: TanStack Table handles pagination in-browser.
85
+ * URL params persist across reloads/navigation.
86
+ */
87
+ export type ClientPaginationConfig = {
88
+ mode: "client";
89
+ /**
90
+ * URL query param names for pagination.
91
+ * @example { page: "p", limit: "size" } → ?p=1&size=20
92
+ */
93
+ params?: PaginationParams;
94
+ /**
95
+ * Default page size.
96
+ * @default 10
97
+ */
98
+ defaultPageSize?: number;
99
+ /**
100
+ * Available page size options for the dropdown.
101
+ * @default [10, 20, 50, 100]
102
+ */
103
+ pageSizeOptions?: number[];
104
+ };
105
+ /**
106
+ * Server-side pagination: URL query params drive the pagination state.
107
+ * Your server handles the actual data slicing.
108
+ */
109
+ export type ServerPaginationConfig = {
110
+ mode: "server";
111
+ /**
112
+ * URL query param names for pagination.
113
+ * @example { page: "p", limit: "size" } → ?p=1&size=20
114
+ */
115
+ params?: PaginationParams;
116
+ /**
117
+ * Total number of items (from server response).
118
+ * Required for calculating total pages.
119
+ */
120
+ total: number;
121
+ /**
122
+ * Default page size.
123
+ * @default 10
124
+ */
125
+ defaultPageSize?: number;
126
+ /**
127
+ * Available page size options for the dropdown.
128
+ * @default [10, 20, 50, 100]
129
+ */
130
+ pageSizeOptions?: number[];
131
+ };
132
+ /**
133
+ * No pagination enabled (default behavior - shows all rows).
134
+ */
135
+ export type NoPaginationConfig = {
136
+ mode?: undefined;
137
+ };
138
+ /**
139
+ * Discriminated union: only one pagination mode can be active.
140
+ *
141
+ * - **Client mode**: TanStack paginates locally, URL params provide persistence
142
+ * - **Server mode**: URL params trigger server-side pagination, requires `total`
143
+ */
144
+ export type PaginationConfig = ClientPaginationConfig | ServerPaginationConfig | NoPaginationConfig;
145
+ export type DataTableQueryState = {
146
+ sorting: SortingState;
147
+ columnFilters: ColumnFiltersState;
148
+ globalFilter: string;
149
+ pagination: PaginationState;
150
+ rowSelection: RowSelectionState;
151
+ };
152
+ type OnChangeFn<T> = (updaterOrValue: Updater<T>) => void;
153
+ type DataTableContextValue<TData extends {
154
+ id: string | number;
155
+ }> = {
156
+ table: Table<TData>;
157
+ /**
158
+ * Filtering configuration (client, server, or none).
159
+ */
160
+ filterConfig: FilterConfig<TData>;
161
+ /**
162
+ * Pagination configuration (client, server, or none).
163
+ */
164
+ paginationConfig: PaginationConfig;
165
+ /**
166
+ * Loading state for server-side operations (filtering, pagination, etc.).
167
+ * When true, the table shows a loading indicator (e.g., reduced opacity).
168
+ */
169
+ isLoading: boolean;
170
+ /**
171
+ * Initial loading state. When true, table rows render skeleton placeholders.
172
+ */
173
+ isInitialLoading: boolean;
174
+ /**
175
+ * URL state management (tabs, sorting, visibility, search).
176
+ */
177
+ urlState: UrlStateContextValue;
178
+ };
179
+ export declare function useDataTable<TData extends {
180
+ id: string | number;
181
+ }>(): DataTableContextValue<TData>;
182
+ export type DataTableProviderProps<TData extends {
183
+ id: string | number;
184
+ }, TValue> = {
185
+ data: TData[];
186
+ columns: ColumnDef<TData, TValue>[];
187
+ children: React.ReactNode;
188
+ /**
189
+ * Enable row selection (checkboxes).
190
+ */
191
+ enableRowSelection?: boolean;
192
+ /**
193
+ * Optional override for the injected selection column.
194
+ */
195
+ selectionColumn?: ColumnDef<TData, TValue>;
196
+ getRowId?: (originalRow: TData, index: number, parent?: any) => string;
197
+ manualSorting?: boolean;
198
+ sorting?: SortingState;
199
+ defaultSorting?: SortingState;
200
+ onSortingChange?: OnChangeFn<SortingState>;
201
+ manualFiltering?: boolean;
202
+ columnFilters?: ColumnFiltersState;
203
+ defaultColumnFilters?: ColumnFiltersState;
204
+ onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>;
205
+ globalFilter?: string;
206
+ defaultGlobalFilter?: string;
207
+ onGlobalFilterChange?: OnChangeFn<string>;
208
+ manualPagination?: boolean;
209
+ pageCount?: number;
210
+ pagination?: PaginationState;
211
+ defaultPagination?: PaginationState;
212
+ onPaginationChange?: OnChangeFn<PaginationState>;
213
+ rowSelection?: RowSelectionState;
214
+ defaultRowSelection?: RowSelectionState;
215
+ onRowSelectionChange?: OnChangeFn<RowSelectionState>;
216
+ /**
217
+ * Convenience callback for server-driven tables. Fires whenever query-relevant
218
+ * state changes (sorting/filters/pagination/selection).
219
+ */
220
+ onQueryChange?: (state: DataTableQueryState) => void;
221
+ /**
222
+ * Filtering mode configuration. Use discriminated union to ensure
223
+ * only one mode is active at a time.
224
+ *
225
+ * @example Client-side filtering
226
+ * ```tsx
227
+ * <DataTableProvider
228
+ * filterConfig={{ mode: "client", columns: ["title", "amount"] }}
229
+ * />
230
+ * ```
231
+ *
232
+ * @example Server-side filtering
233
+ * ```tsx
234
+ * <DataTableProvider
235
+ * filterConfig={{ mode: "server", params: { title: "q", amount: "amt" } }}
236
+ * />
237
+ * ```
238
+ */
239
+ filterConfig?: FilterConfig<TData>;
240
+ /**
241
+ * Pagination mode configuration. Use discriminated union to ensure
242
+ * only one mode is active at a time.
243
+ *
244
+ * @example Client-side pagination
245
+ * ```tsx
246
+ * <DataTableProvider
247
+ * paginationConfig={{ mode: "client", defaultPageSize: 10 }}
248
+ * />
249
+ * ```
250
+ *
251
+ * @example Server-side pagination
252
+ * ```tsx
253
+ * <DataTableProvider
254
+ * paginationConfig={{ mode: "server", total: 500 }}
255
+ * />
256
+ * ```
257
+ */
258
+ paginationConfig?: PaginationConfig;
259
+ /**
260
+ * Loading state for server-side operations.
261
+ * When true, the table displays with reduced opacity to indicate loading.
262
+ */
263
+ isLoading?: boolean;
264
+ /**
265
+ * Initial loading state (first data load). When true, the table rows render
266
+ * skeleton placeholders with normal row height.
267
+ */
268
+ isInitialLoading?: boolean;
269
+ /**
270
+ * URL state configuration for persisting tabs, sorting, and column visibility.
271
+ * When provided, state is synced to browser URL query params.
272
+ */
273
+ urlStateConfig?: UrlStateConfig;
274
+ /**
275
+ * Default tab value (used when URL param is empty).
276
+ * Should match the first tab's value for proper reset behavior.
277
+ */
278
+ defaultTab?: string;
279
+ };
280
+ export declare function DataTableProvider<TData extends {
281
+ id: string | number;
282
+ }, TValue>({ data, columns, children, enableRowSelection, selectionColumn, getRowId, manualSorting, sorting, defaultSorting, onSortingChange, manualFiltering, columnFilters, defaultColumnFilters, onColumnFiltersChange, globalFilter, defaultGlobalFilter, onGlobalFilterChange, manualPagination, pageCount, pagination, defaultPagination, onPaginationChange, rowSelection, defaultRowSelection, onRowSelectionChange, onQueryChange, filterConfig, paginationConfig, isLoading, isInitialLoading, urlStateConfig, defaultTab, }: DataTableProviderProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
283
+ export {};
284
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/components/data-table/provider.tsx"],"names":[],"mappings":"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"}