@jameskabz/nextcraft-ui 0.4.0 → 0.6.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 (59) hide show
  1. package/README.md +94 -0
  2. package/dist/chunk-6F7FN2ZF.js +671 -0
  3. package/dist/chunk-6F7FN2ZF.js.map +1 -0
  4. package/dist/chunk-7Q4Z47HT.js +657 -0
  5. package/dist/chunk-7Q4Z47HT.js.map +1 -0
  6. package/dist/chunk-7SKDTIEK.js +49 -0
  7. package/dist/chunk-7SKDTIEK.js.map +1 -0
  8. package/dist/chunk-FEFH5O5K.js +49 -0
  9. package/dist/chunk-FEFH5O5K.js.map +1 -0
  10. package/dist/chunk-M2EKVXB6.js +127 -0
  11. package/dist/chunk-M2EKVXB6.js.map +1 -0
  12. package/dist/chunk-SBLIF6UU.js +1029 -0
  13. package/dist/chunk-SBLIF6UU.js.map +1 -0
  14. package/dist/chunk-VQ6T3HIX.js +9 -0
  15. package/dist/chunk-VQ6T3HIX.js.map +1 -0
  16. package/dist/chunk-YVZL4GET.js +328 -0
  17. package/dist/chunk-YVZL4GET.js.map +1 -0
  18. package/dist/chunk-ZRV4Y374.js +582 -0
  19. package/dist/chunk-ZRV4Y374.js.map +1 -0
  20. package/dist/craft/components.cjs +1838 -0
  21. package/dist/craft/components.cjs.map +1 -0
  22. package/dist/craft/components.d.cts +369 -0
  23. package/dist/craft/components.d.ts +369 -0
  24. package/dist/craft/components.js +78 -0
  25. package/dist/craft/components.js.map +1 -0
  26. package/dist/craft/forms.cjs +1376 -0
  27. package/dist/craft/forms.cjs.map +1 -0
  28. package/dist/craft/forms.d.cts +101 -0
  29. package/dist/craft/forms.d.ts +101 -0
  30. package/dist/craft/forms.js +14 -0
  31. package/dist/craft/forms.js.map +1 -0
  32. package/dist/craft/layout.cjs +410 -0
  33. package/dist/craft/layout.cjs.map +1 -0
  34. package/dist/craft/layout.d.cts +170 -0
  35. package/dist/craft/layout.d.ts +170 -0
  36. package/dist/craft/layout.js +27 -0
  37. package/dist/craft/layout.js.map +1 -0
  38. package/dist/craft/table.cjs +662 -0
  39. package/dist/craft/table.cjs.map +1 -0
  40. package/dist/craft/table.d.cts +99 -0
  41. package/dist/craft/table.d.ts +99 -0
  42. package/dist/craft/table.js +15 -0
  43. package/dist/craft/table.js.map +1 -0
  44. package/dist/craft/theme.cjs +166 -0
  45. package/dist/craft/theme.cjs.map +1 -0
  46. package/dist/craft/theme.d.cts +10 -0
  47. package/dist/craft/theme.d.ts +10 -0
  48. package/dist/craft/theme.js +12 -0
  49. package/dist/craft/theme.js.map +1 -0
  50. package/dist/index.cjs +2374 -317
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +10 -277
  53. package/dist/index.d.ts +10 -277
  54. package/dist/index.js +92 -1347
  55. package/dist/index.js.map +1 -1
  56. package/dist/styles.css +359 -4
  57. package/dist/theme-context-EVI9PfKv.d.cts +22 -0
  58. package/dist/theme-context-EVI9PfKv.d.ts +22 -0
  59. package/package.json +30 -1
@@ -0,0 +1,582 @@
1
+ import {
2
+ CraftInput
3
+ } from "./chunk-7SKDTIEK.js";
4
+ import {
5
+ cn
6
+ } from "./chunk-VQ6T3HIX.js";
7
+
8
+ // src/components/craft-filter-bar.tsx
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ function CraftFilterBar({
11
+ title,
12
+ description,
13
+ searchValue,
14
+ onSearchChange,
15
+ searchPlaceholder = "Search...",
16
+ actions,
17
+ filters,
18
+ tone,
19
+ className
20
+ }) {
21
+ return /* @__PURE__ */ jsxs(
22
+ "div",
23
+ {
24
+ className: cn(
25
+ "rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl",
26
+ className
27
+ ),
28
+ "data-nc-theme": tone,
29
+ children: [
30
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
31
+ /* @__PURE__ */ jsxs("div", { children: [
32
+ title && /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold", children: title }),
33
+ description && /* @__PURE__ */ jsx("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: description })
34
+ ] }),
35
+ actions && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3", children: actions })
36
+ ] }),
37
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 grid gap-4 md:grid-cols-[minmax(0,1fr)_auto]", children: [
38
+ /* @__PURE__ */ jsx(
39
+ CraftInput,
40
+ {
41
+ type: "search",
42
+ placeholder: searchPlaceholder,
43
+ value: searchValue != null ? searchValue : "",
44
+ onChange: (event) => onSearchChange == null ? void 0 : onSearchChange(event.target.value),
45
+ tone
46
+ }
47
+ ),
48
+ filters && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-3", children: filters })
49
+ ] })
50
+ ]
51
+ }
52
+ );
53
+ }
54
+
55
+ // src/components/craft-table-toolbar.tsx
56
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
57
+ function CraftTableToolbar({
58
+ title,
59
+ description,
60
+ searchValue,
61
+ onSearchChange,
62
+ searchPlaceholder = "Search table...",
63
+ actions,
64
+ filters,
65
+ bulkActions,
66
+ tone,
67
+ className
68
+ }) {
69
+ return /* @__PURE__ */ jsxs2(
70
+ "div",
71
+ {
72
+ className: cn(
73
+ "rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl",
74
+ className
75
+ ),
76
+ "data-nc-theme": tone,
77
+ children: [
78
+ /* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
79
+ /* @__PURE__ */ jsxs2("div", { children: [
80
+ title && /* @__PURE__ */ jsx2("h3", { className: "text-lg font-semibold", children: title }),
81
+ description && /* @__PURE__ */ jsx2("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: description })
82
+ ] }),
83
+ actions && /* @__PURE__ */ jsx2("div", { className: "flex items-center gap-3", children: actions })
84
+ ] }),
85
+ /* @__PURE__ */ jsxs2("div", { className: "mt-4 grid gap-4 lg:grid-cols-[minmax(0,1fr)_auto]", children: [
86
+ /* @__PURE__ */ jsx2(
87
+ CraftInput,
88
+ {
89
+ type: "search",
90
+ placeholder: searchPlaceholder,
91
+ value: searchValue != null ? searchValue : "",
92
+ onChange: (event) => onSearchChange == null ? void 0 : onSearchChange(event.target.value),
93
+ tone
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-center gap-3", children: [
97
+ filters,
98
+ bulkActions
99
+ ] })
100
+ ] })
101
+ ]
102
+ }
103
+ );
104
+ }
105
+
106
+ // src/components/craft-pagination.tsx
107
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
108
+ function getPageNumbers(pageIndex, pageCount, maxButtons = 5) {
109
+ if (pageCount <= maxButtons) {
110
+ return Array.from({ length: pageCount }, (_, i) => i);
111
+ }
112
+ const pages = [];
113
+ const start = Math.max(0, pageIndex - 1);
114
+ const end = Math.min(pageCount - 1, pageIndex + 1);
115
+ pages.push(0);
116
+ if (start > 1) pages.push("ellipsis");
117
+ for (let i = start; i <= end; i += 1) {
118
+ if (i !== 0 && i !== pageCount - 1) pages.push(i);
119
+ }
120
+ if (end < pageCount - 2) pages.push("ellipsis");
121
+ pages.push(pageCount - 1);
122
+ return pages;
123
+ }
124
+ function CraftPagination({
125
+ pageIndex,
126
+ pageCount,
127
+ onPageChange,
128
+ canPrevious = pageIndex > 0,
129
+ canNext = pageIndex < pageCount - 1,
130
+ pageSize,
131
+ pageSizeOptions = [10, 20, 50],
132
+ onPageSizeChange,
133
+ tone,
134
+ className
135
+ }) {
136
+ const pages = getPageNumbers(pageIndex, pageCount);
137
+ return /* @__PURE__ */ jsxs3(
138
+ "div",
139
+ {
140
+ className: cn(
141
+ "flex flex-wrap items-center justify-between gap-4",
142
+ className
143
+ ),
144
+ "data-nc-theme": tone,
145
+ children: [
146
+ /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2", children: [
147
+ /* @__PURE__ */ jsx3(
148
+ "button",
149
+ {
150
+ type: "button",
151
+ className: cn(
152
+ "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition",
153
+ "hover:bg-[rgb(var(--nc-surface)/0.2)]",
154
+ !canPrevious && "opacity-50 cursor-not-allowed"
155
+ ),
156
+ onClick: () => onPageChange(Math.max(pageIndex - 1, 0)),
157
+ disabled: !canPrevious,
158
+ children: "Prev"
159
+ }
160
+ ),
161
+ pages.map(
162
+ (page, index) => page === "ellipsis" ? /* @__PURE__ */ jsx3("span", { className: "px-2 text-[rgb(var(--nc-fg-muted))]", children: "..." }, `ellipsis-${index}`) : /* @__PURE__ */ jsx3(
163
+ "button",
164
+ {
165
+ type: "button",
166
+ className: cn(
167
+ "rounded-xl border px-3 py-2 text-xs transition",
168
+ page === pageIndex ? "border-[rgb(var(--nc-accent-1)/0.6)] bg-[rgb(var(--nc-accent-1)/0.2)] text-[rgb(var(--nc-fg))]" : "border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))] hover:text-[rgb(var(--nc-fg))] hover:bg-[rgb(var(--nc-surface)/0.2)]"
169
+ ),
170
+ onClick: () => onPageChange(page),
171
+ children: page + 1
172
+ },
173
+ page
174
+ )
175
+ ),
176
+ /* @__PURE__ */ jsx3(
177
+ "button",
178
+ {
179
+ type: "button",
180
+ className: cn(
181
+ "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition",
182
+ "hover:bg-[rgb(var(--nc-surface)/0.2)]",
183
+ !canNext && "opacity-50 cursor-not-allowed"
184
+ ),
185
+ onClick: () => onPageChange(Math.min(pageIndex + 1, pageCount - 1)),
186
+ disabled: !canNext,
187
+ children: "Next"
188
+ }
189
+ )
190
+ ] }),
191
+ onPageSizeChange && /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2 text-xs text-[rgb(var(--nc-fg-muted))]", children: [
192
+ /* @__PURE__ */ jsx3("span", { children: "Rows" }),
193
+ /* @__PURE__ */ jsx3(
194
+ "select",
195
+ {
196
+ className: "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]",
197
+ value: pageSize,
198
+ onChange: (event) => onPageSizeChange(Number(event.target.value)),
199
+ children: pageSizeOptions.map((size) => /* @__PURE__ */ jsx3("option", { value: size, children: size }, size))
200
+ }
201
+ )
202
+ ] })
203
+ ]
204
+ }
205
+ );
206
+ }
207
+
208
+ // src/components/craft-data-table.tsx
209
+ import * as React from "react";
210
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
211
+ function getColumnValue(column, row) {
212
+ if (typeof column.accessor === "function") return column.accessor(row);
213
+ const record = row;
214
+ if (typeof column.accessor === "string") return record[column.accessor];
215
+ return record[column.id];
216
+ }
217
+ function normalizeValue(value) {
218
+ if (value === null || value === void 0) return "";
219
+ if (typeof value === "number") return value;
220
+ if (typeof value === "string") return value.toLowerCase();
221
+ if (value instanceof Date) return value.getTime();
222
+ return String(value).toLowerCase();
223
+ }
224
+ function CraftDataTable({
225
+ data,
226
+ columns,
227
+ tone,
228
+ className,
229
+ loading = false,
230
+ emptyState,
231
+ toolbar,
232
+ enableSorting = true,
233
+ enableFiltering = true,
234
+ enableColumnVisibility = true,
235
+ enableRowSelection = true,
236
+ enablePagination = true,
237
+ showGlobalFilter,
238
+ manualSorting = false,
239
+ manualFiltering = false,
240
+ manualPagination = false,
241
+ sortBy,
242
+ onSortChange,
243
+ filters,
244
+ onFiltersChange,
245
+ globalFilter,
246
+ onGlobalFilterChange,
247
+ columnVisibility,
248
+ onColumnVisibilityChange,
249
+ selectedRowIds,
250
+ onRowSelectionChange,
251
+ getRowId,
252
+ pageIndex,
253
+ pageSize = 10,
254
+ pageCount,
255
+ onPageChange,
256
+ onPageSizeChange
257
+ }) {
258
+ const [internalSort, setInternalSort] = React.useState(null);
259
+ const [internalFilters, setInternalFilters] = React.useState({});
260
+ const [internalGlobalFilter, setInternalGlobalFilter] = React.useState("");
261
+ const [internalVisibility, setInternalVisibility] = React.useState(
262
+ () => columns.reduce((acc, column) => {
263
+ acc[column.id] = !column.hidden;
264
+ return acc;
265
+ }, {})
266
+ );
267
+ const [internalSelection, setInternalSelection] = React.useState({});
268
+ const [internalPageIndex, setInternalPageIndex] = React.useState(0);
269
+ const [showColumns, setShowColumns] = React.useState(false);
270
+ const resolvedSort = sortBy != null ? sortBy : internalSort;
271
+ const resolvedFilters = filters != null ? filters : internalFilters;
272
+ const resolvedGlobalFilter = globalFilter != null ? globalFilter : internalGlobalFilter;
273
+ const resolvedVisibility = columnVisibility != null ? columnVisibility : internalVisibility;
274
+ const resolvedSelection = selectedRowIds != null ? selectedRowIds : internalSelection;
275
+ const resolvedPageIndex = pageIndex != null ? pageIndex : internalPageIndex;
276
+ const setSort = (next) => {
277
+ if (sortBy === void 0) setInternalSort(next);
278
+ onSortChange == null ? void 0 : onSortChange(next);
279
+ };
280
+ const setFilters = (next) => {
281
+ if (filters === void 0) setInternalFilters(next);
282
+ onFiltersChange == null ? void 0 : onFiltersChange(next);
283
+ };
284
+ const setVisibility = (next) => {
285
+ if (columnVisibility === void 0) setInternalVisibility(next);
286
+ onColumnVisibilityChange == null ? void 0 : onColumnVisibilityChange(next);
287
+ };
288
+ const setSelection = (next) => {
289
+ if (selectedRowIds === void 0) setInternalSelection(next);
290
+ onRowSelectionChange == null ? void 0 : onRowSelectionChange(next);
291
+ };
292
+ const setPageIndex = React.useCallback(
293
+ (next) => {
294
+ if (pageIndex === void 0) setInternalPageIndex(next);
295
+ onPageChange == null ? void 0 : onPageChange(next);
296
+ },
297
+ [pageIndex, onPageChange]
298
+ );
299
+ const visibleColumns = columns.filter(
300
+ (column) => resolvedVisibility[column.id] !== false
301
+ );
302
+ const filteredData = React.useMemo(() => {
303
+ if (manualFiltering) return data;
304
+ const globalValue = resolvedGlobalFilter.trim();
305
+ return data.filter((row) => {
306
+ if (globalValue) {
307
+ const matchesGlobal = columns.some((column) => {
308
+ const value = normalizeValue(getColumnValue(column, row));
309
+ return String(value).includes(globalValue.toLowerCase());
310
+ });
311
+ if (!matchesGlobal) return false;
312
+ }
313
+ return Object.entries(resolvedFilters).every(([columnId, value]) => {
314
+ if (!value) return true;
315
+ const column = columns.find((col) => col.id === columnId);
316
+ if (!column) return true;
317
+ const cellValue = normalizeValue(getColumnValue(column, row));
318
+ return String(cellValue).includes(value.toLowerCase());
319
+ });
320
+ });
321
+ }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);
322
+ const sortedData = React.useMemo(() => {
323
+ if (manualSorting || !resolvedSort) return filteredData;
324
+ const column = columns.find((col) => col.id === resolvedSort.id);
325
+ if (!column) return filteredData;
326
+ const sorted = [...filteredData].sort((a, b) => {
327
+ const valueA = normalizeValue(getColumnValue(column, a));
328
+ const valueB = normalizeValue(getColumnValue(column, b));
329
+ if (typeof valueA === "number" && typeof valueB === "number") {
330
+ return valueA - valueB;
331
+ }
332
+ return String(valueA).localeCompare(String(valueB));
333
+ });
334
+ return resolvedSort.desc ? sorted.reverse() : sorted;
335
+ }, [columns, filteredData, manualSorting, resolvedSort]);
336
+ const resolvedPageCount = manualPagination ? Math.max(pageCount != null ? pageCount : 1, 1) : Math.max(Math.ceil(sortedData.length / pageSize), 1);
337
+ React.useEffect(() => {
338
+ if (resolvedPageIndex > resolvedPageCount - 1) {
339
+ setPageIndex(Math.max(resolvedPageCount - 1, 0));
340
+ }
341
+ }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);
342
+ const pagedData = React.useMemo(() => {
343
+ if (!enablePagination || manualPagination) return sortedData;
344
+ const start = resolvedPageIndex * pageSize;
345
+ return sortedData.slice(start, start + pageSize);
346
+ }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);
347
+ const rowIdFor = React.useCallback(
348
+ (row, index) => {
349
+ var _a;
350
+ return (_a = getRowId == null ? void 0 : getRowId(row, index)) != null ? _a : String(index);
351
+ },
352
+ [getRowId]
353
+ );
354
+ const pageStartIndex = enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;
355
+ const pageRowIds = pagedData.map(
356
+ (row, index) => rowIdFor(row, pageStartIndex + index)
357
+ );
358
+ const allSelected = pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);
359
+ const someSelected = pageRowIds.some((id) => resolvedSelection[id]);
360
+ const headerCheckboxRef = React.useRef(null);
361
+ React.useEffect(() => {
362
+ if (headerCheckboxRef.current) {
363
+ headerCheckboxRef.current.indeterminate = someSelected && !allSelected;
364
+ }
365
+ }, [someSelected, allSelected]);
366
+ const toggleSort = (column) => {
367
+ if (!enableSorting || column.sortable === false) return;
368
+ const current = resolvedSort;
369
+ if (!current || current.id !== column.id) {
370
+ setSort({ id: column.id, desc: false });
371
+ return;
372
+ }
373
+ if (!current.desc) {
374
+ setSort({ id: column.id, desc: true });
375
+ return;
376
+ }
377
+ setSort(null);
378
+ };
379
+ const emptyContent = emptyState != null ? emptyState : /* @__PURE__ */ jsx4("div", { className: "text-center text-sm text-[rgb(var(--nc-fg-muted))]", children: "No results found." });
380
+ const resolvedShowGlobalFilter = showGlobalFilter != null ? showGlobalFilter : enableFiltering && !toolbar;
381
+ const setGlobalFilter = (next) => {
382
+ if (globalFilter === void 0) setInternalGlobalFilter(next);
383
+ onGlobalFilterChange == null ? void 0 : onGlobalFilterChange(next);
384
+ };
385
+ return /* @__PURE__ */ jsxs4("div", { className: cn("space-y-4", className), "data-nc-theme": tone, children: [
386
+ toolbar,
387
+ resolvedShowGlobalFilter && /* @__PURE__ */ jsxs4("div", { className: "flex items-center justify-between gap-3 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-sm text-[rgb(var(--nc-fg))]", children: [
388
+ /* @__PURE__ */ jsx4("span", { className: "text-xs text-[rgb(var(--nc-fg-muted))]", children: "Global filter" }),
389
+ /* @__PURE__ */ jsx4(
390
+ "input",
391
+ {
392
+ type: "search",
393
+ value: resolvedGlobalFilter,
394
+ onChange: (event) => setGlobalFilter(event.target.value),
395
+ placeholder: "Search all columns...",
396
+ className: "w-full max-w-xs rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]"
397
+ }
398
+ )
399
+ ] }),
400
+ enableColumnVisibility && /* @__PURE__ */ jsxs4("div", { className: "relative flex justify-end", children: [
401
+ /* @__PURE__ */ jsx4(
402
+ "button",
403
+ {
404
+ type: "button",
405
+ className: "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition hover:bg-[rgb(var(--nc-surface)/0.2)]",
406
+ onClick: () => setShowColumns((prev) => !prev),
407
+ children: "Columns"
408
+ }
409
+ ),
410
+ showColumns && /* @__PURE__ */ jsx4("div", { className: "absolute right-0 top-10 z-20 w-48 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl", children: /* @__PURE__ */ jsx4("div", { className: "grid gap-2", children: columns.map((column) => /* @__PURE__ */ jsxs4(
411
+ "label",
412
+ {
413
+ className: "flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]",
414
+ children: [
415
+ /* @__PURE__ */ jsx4(
416
+ "input",
417
+ {
418
+ type: "checkbox",
419
+ className: "h-4 w-4 accent-[rgb(var(--nc-accent-1))]",
420
+ checked: resolvedVisibility[column.id] !== false,
421
+ onChange: (event) => setVisibility({
422
+ ...resolvedVisibility,
423
+ [column.id]: event.target.checked
424
+ })
425
+ }
426
+ ),
427
+ column.header
428
+ ]
429
+ },
430
+ column.id
431
+ )) }) })
432
+ ] }),
433
+ /* @__PURE__ */ jsx4("div", { className: "overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl", children: /* @__PURE__ */ jsxs4("table", { className: "w-full border-collapse text-left text-sm", children: [
434
+ /* @__PURE__ */ jsx4("thead", { className: "bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]", children: /* @__PURE__ */ jsxs4("tr", { children: [
435
+ enableRowSelection && /* @__PURE__ */ jsx4("th", { className: "w-12 px-4 py-3", children: /* @__PURE__ */ jsx4(
436
+ "input",
437
+ {
438
+ ref: headerCheckboxRef,
439
+ type: "checkbox",
440
+ className: "h-4 w-4 accent-[rgb(var(--nc-accent-1))]",
441
+ checked: allSelected,
442
+ onChange: (event) => {
443
+ const next = { ...resolvedSelection };
444
+ pageRowIds.forEach((id) => {
445
+ next[id] = event.target.checked;
446
+ });
447
+ setSelection(next);
448
+ }
449
+ }
450
+ ) }),
451
+ visibleColumns.map((column) => {
452
+ var _a;
453
+ return /* @__PURE__ */ jsxs4(
454
+ "th",
455
+ {
456
+ className: cn(
457
+ "px-4 py-3 text-xs font-semibold uppercase tracking-[0.2em]",
458
+ column.headerClassName
459
+ ),
460
+ style: { width: column.width },
461
+ children: [
462
+ /* @__PURE__ */ jsxs4(
463
+ "button",
464
+ {
465
+ type: "button",
466
+ className: cn(
467
+ "flex items-center gap-2",
468
+ enableSorting && column.sortable !== false ? "cursor-pointer" : "cursor-default"
469
+ ),
470
+ onClick: () => toggleSort(column),
471
+ children: [
472
+ /* @__PURE__ */ jsx4("span", { children: column.header }),
473
+ (resolvedSort == null ? void 0 : resolvedSort.id) === column.id && /* @__PURE__ */ jsx4("span", { className: "text-[rgb(var(--nc-accent-1))]", children: resolvedSort.desc ? "\u2193" : "\u2191" })
474
+ ]
475
+ }
476
+ ),
477
+ enableFiltering && column.filterable !== false && /* @__PURE__ */ jsx4(
478
+ "input",
479
+ {
480
+ type: "text",
481
+ value: (_a = resolvedFilters[column.id]) != null ? _a : "",
482
+ onChange: (event) => setFilters({
483
+ ...resolvedFilters,
484
+ [column.id]: event.target.value
485
+ }),
486
+ placeholder: "Filter",
487
+ className: "mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]"
488
+ }
489
+ )
490
+ ]
491
+ },
492
+ column.id
493
+ );
494
+ })
495
+ ] }) }),
496
+ /* @__PURE__ */ jsxs4("tbody", { className: "text-[rgb(var(--nc-fg))]", children: [
497
+ loading && /* @__PURE__ */ jsx4("tr", { children: /* @__PURE__ */ jsx4(
498
+ "td",
499
+ {
500
+ colSpan: visibleColumns.length + (enableRowSelection ? 1 : 0),
501
+ className: "px-4 py-10 text-center text-sm text-[rgb(var(--nc-fg-muted))]",
502
+ children: /* @__PURE__ */ jsxs4("span", { className: "inline-flex items-center gap-2", children: [
503
+ /* @__PURE__ */ jsx4("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-[rgb(var(--nc-fg-muted))] border-t-transparent" }),
504
+ "Loading data..."
505
+ ] })
506
+ }
507
+ ) }),
508
+ !loading && pagedData.length === 0 && /* @__PURE__ */ jsx4("tr", { children: /* @__PURE__ */ jsx4(
509
+ "td",
510
+ {
511
+ colSpan: visibleColumns.length + (enableRowSelection ? 1 : 0),
512
+ className: "px-4 py-10",
513
+ children: emptyContent
514
+ }
515
+ ) }),
516
+ !loading && pagedData.map((row, rowIndex) => {
517
+ const rowId = rowIdFor(row, pageStartIndex + rowIndex);
518
+ const isSelected = resolvedSelection[rowId];
519
+ return /* @__PURE__ */ jsxs4(
520
+ "tr",
521
+ {
522
+ className: cn(
523
+ "border-t border-[rgb(var(--nc-border)/0.15)]",
524
+ isSelected && "bg-[rgb(var(--nc-accent-1)/0.08)]"
525
+ ),
526
+ children: [
527
+ enableRowSelection && /* @__PURE__ */ jsx4("td", { className: "px-4 py-4", children: /* @__PURE__ */ jsx4(
528
+ "input",
529
+ {
530
+ type: "checkbox",
531
+ className: "h-4 w-4 accent-[rgb(var(--nc-accent-1))]",
532
+ checked: isSelected,
533
+ onChange: (event) => setSelection({
534
+ ...resolvedSelection,
535
+ [rowId]: event.target.checked
536
+ })
537
+ }
538
+ ) }),
539
+ visibleColumns.map((column) => {
540
+ var _a;
541
+ return /* @__PURE__ */ jsx4(
542
+ "td",
543
+ {
544
+ className: cn(
545
+ "px-4 py-4",
546
+ column.align === "center" && "text-center",
547
+ column.align === "right" && "text-right",
548
+ column.cellClassName
549
+ ),
550
+ children: column.cell ? column.cell(row) : String((_a = getColumnValue(column, row)) != null ? _a : "")
551
+ },
552
+ column.id
553
+ );
554
+ })
555
+ ]
556
+ },
557
+ rowId
558
+ );
559
+ })
560
+ ] })
561
+ ] }) }),
562
+ enablePagination && /* @__PURE__ */ jsx4(
563
+ CraftPagination,
564
+ {
565
+ pageIndex: resolvedPageIndex,
566
+ pageCount: resolvedPageCount,
567
+ onPageChange: setPageIndex,
568
+ pageSize,
569
+ onPageSizeChange,
570
+ tone
571
+ }
572
+ )
573
+ ] });
574
+ }
575
+
576
+ export {
577
+ CraftFilterBar,
578
+ CraftTableToolbar,
579
+ CraftPagination,
580
+ CraftDataTable
581
+ };
582
+ //# sourceMappingURL=chunk-ZRV4Y374.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/craft-filter-bar.tsx","../src/components/craft-table-toolbar.tsx","../src/components/craft-pagination.tsx","../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftInput } from \"@/components/craft-input\";\n\nexport type CraftFilterBarProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n};\n\nexport function CraftFilterBar({\n title,\n description,\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n actions,\n filters,\n tone,\n className,\n}: CraftFilterBarProps) {\n return (\n <div\n className={cn(\n \"rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\n <div>\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\n {description && (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {description}\n </p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n <div className=\"mt-4 grid gap-4 md:grid-cols-[minmax(0,1fr)_auto]\">\n <CraftInput\n type=\"search\"\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n onChange={(event) => onSearchChange?.(event.target.value)}\n tone={tone}\n />\n {filters && <div className=\"flex flex-wrap items-center gap-3\">{filters}</div>}\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftInput } from \"@/components/craft-input\";\n\nexport type CraftTableToolbarProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n bulkActions?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n};\n\nexport function CraftTableToolbar({\n title,\n description,\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Search table...\",\n actions,\n filters,\n bulkActions,\n tone,\n className,\n}: CraftTableToolbarProps) {\n return (\n <div\n className={cn(\n \"rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_12px_36px_rgba(0,0,0,0.2)] backdrop-blur-2xl\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\n <div>\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\n {description && (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {description}\n </p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n <div className=\"mt-4 grid gap-4 lg:grid-cols-[minmax(0,1fr)_auto]\">\n <CraftInput\n type=\"search\"\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n onChange={(event) => onSearchChange?.(event.target.value)}\n tone={tone}\n />\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {bulkActions}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftPaginationProps = {\n pageIndex: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n canPrevious?: boolean;\n canNext?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n onPageSizeChange?: (size: number) => void;\n tone?: ThemeName;\n className?: string;\n};\n\nfunction getPageNumbers(pageIndex: number, pageCount: number, maxButtons = 5) {\n if (pageCount <= maxButtons) {\n return Array.from({ length: pageCount }, (_, i) => i);\n }\n\n const pages: Array<number | \"ellipsis\"> = [];\n const start = Math.max(0, pageIndex - 1);\n const end = Math.min(pageCount - 1, pageIndex + 1);\n\n pages.push(0);\n\n if (start > 1) pages.push(\"ellipsis\");\n\n for (let i = start; i <= end; i += 1) {\n if (i !== 0 && i !== pageCount - 1) pages.push(i);\n }\n\n if (end < pageCount - 2) pages.push(\"ellipsis\");\n\n pages.push(pageCount - 1);\n\n return pages;\n}\n\nexport function CraftPagination({\n pageIndex,\n pageCount,\n onPageChange,\n canPrevious = pageIndex > 0,\n canNext = pageIndex < pageCount - 1,\n pageSize,\n pageSizeOptions = [10, 20, 50],\n onPageSizeChange,\n tone,\n className,\n}: CraftPaginationProps) {\n const pages = getPageNumbers(pageIndex, pageCount);\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-between gap-4\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n className={cn(\n \"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition\",\n \"hover:bg-[rgb(var(--nc-surface)/0.2)]\",\n !canPrevious && \"opacity-50 cursor-not-allowed\"\n )}\n onClick={() => onPageChange(Math.max(pageIndex - 1, 0))}\n disabled={!canPrevious}\n >\n Prev\n </button>\n {pages.map((page, index) =>\n page === \"ellipsis\" ? (\n <span key={`ellipsis-${index}`} className=\"px-2 text-[rgb(var(--nc-fg-muted))]\">\n ...\n </span>\n ) : (\n <button\n key={page}\n type=\"button\"\n className={cn(\n \"rounded-xl border px-3 py-2 text-xs transition\",\n page === pageIndex\n ? \"border-[rgb(var(--nc-accent-1)/0.6)] bg-[rgb(var(--nc-accent-1)/0.2)] text-[rgb(var(--nc-fg))]\"\n : \"border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))] hover:text-[rgb(var(--nc-fg))] hover:bg-[rgb(var(--nc-surface)/0.2)]\"\n )}\n onClick={() => onPageChange(page)}\n >\n {page + 1}\n </button>\n )\n )}\n <button\n type=\"button\"\n className={cn(\n \"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition\",\n \"hover:bg-[rgb(var(--nc-surface)/0.2)]\",\n !canNext && \"opacity-50 cursor-not-allowed\"\n )}\n onClick={() => onPageChange(Math.min(pageIndex + 1, pageCount - 1))}\n disabled={!canNext}\n >\n Next\n </button>\n </div>\n\n {onPageSizeChange && (\n <div className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg-muted))]\">\n <span>Rows</span>\n <select\n className=\"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftPagination } from \"@/components/craft-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n tone?: ThemeName;\n className?: string;\n loading?: boolean;\n emptyState?: React.ReactNode;\n toolbar?: React.ReactNode;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enableRowSelection?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n tone,\n className,\n loading = false,\n emptyState,\n toolbar,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enableRowSelection = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => getRowId?.(row, index) ?? String(index),\n [getRowId]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row, index) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const emptyContent = emptyState ?? (\n <div className=\"text-center text-sm text-[rgb(var(--nc-fg-muted))]\">\n No results found.\n </div>\n );\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n {resolvedShowGlobalFilter && (\n <div className=\"flex items-center justify-between gap-3 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-sm text-[rgb(var(--nc-fg))]\">\n <span className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">Global filter</span>\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\"\n />\n </div>\n )}\n\n {enableColumnVisibility && (\n <div className=\"relative flex justify-end\">\n <button\n type=\"button\"\n className=\"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition hover:bg-[rgb(var(--nc-surface)/0.2)]\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </button>\n {showColumns && (\n <div className=\"absolute right-0 top-10 z-20 w-48 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n <div className=\"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <table className=\"w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {enableRowSelection && (\n <th className=\"w-12 px-4 py-3\">\n <input\n ref={headerCheckboxRef}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n </th>\n )}\n {visibleColumns.map((column) => (\n <th\n key={column.id}\n className={cn(\n \"px-4 py-3 text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{column.header}</span>\n {resolvedSort?.id === column.id && (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n )}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {loading && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableRowSelection ? 1 : 0)}\n className=\"px-4 py-10 text-center text-sm text-[rgb(var(--nc-fg-muted))]\"\n >\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-[rgb(var(--nc-fg-muted))] border-t-transparent\" />\n Loading data...\n </span>\n </td>\n </tr>\n )}\n {!loading && pagedData.length === 0 && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableRowSelection ? 1 : 0)}\n className=\"px-4 py-10\"\n >\n {emptyContent}\n </td>\n </tr>\n )}\n {!loading &&\n pagedData.map((row, rowIndex) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = resolvedSelection[rowId];\n return (\n <tr\n key={rowId}\n className={cn(\n \"border-t border-[rgb(var(--nc-border)/0.15)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.08)]\"\n )}\n >\n {enableRowSelection && (\n <td className=\"px-4 py-4\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td\n key={column.id}\n className={cn(\n \"px-4 py-4\",\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {column.cell\n ? column.cell(row)\n : String(getColumnValue(column, row) ?? \"\")}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {enablePagination && (\n <CraftPagination\n pageIndex={resolvedPageIndex}\n pageCount={resolvedPageCount}\n onPageChange={setPageIndex}\n pageSize={pageSize}\n onPageSizeChange={onPageSizeChange}\n tone={tone}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs"]}