@jameskabz/nextcraft-ui 0.7.4 → 0.8.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 (36) hide show
  1. package/dist/components/craft-card.cjs +2 -2
  2. package/dist/components/craft-card.cjs.map +1 -1
  3. package/dist/components/craft-card.js +2 -2
  4. package/dist/components/craft-card.js.map +1 -1
  5. package/dist/components/craft-data-table-filters.cjs +184 -0
  6. package/dist/components/craft-data-table-filters.cjs.map +1 -0
  7. package/dist/components/craft-data-table-filters.d.cts +58 -0
  8. package/dist/components/craft-data-table-filters.d.ts +58 -0
  9. package/dist/components/craft-data-table-filters.js +160 -0
  10. package/dist/components/craft-data-table-filters.js.map +1 -0
  11. package/dist/components/craft-data-table-header.cjs +1 -1
  12. package/dist/components/craft-data-table-header.cjs.map +1 -1
  13. package/dist/components/craft-data-table-header.js +1 -1
  14. package/dist/components/craft-data-table-header.js.map +1 -1
  15. package/dist/components/craft-data-table.cjs +11 -8
  16. package/dist/components/craft-data-table.cjs.map +1 -1
  17. package/dist/components/craft-data-table.js +11 -8
  18. package/dist/components/craft-data-table.js.map +1 -1
  19. package/dist/components/craft-filter-bar.cjs +75 -5
  20. package/dist/components/craft-filter-bar.cjs.map +1 -1
  21. package/dist/components/craft-filter-bar.d.cts +29 -3
  22. package/dist/components/craft-filter-bar.d.ts +29 -3
  23. package/dist/components/craft-filter-bar.js +75 -5
  24. package/dist/components/craft-filter-bar.js.map +1 -1
  25. package/dist/components/craft-loader.cjs +1 -1
  26. package/dist/components/craft-loader.cjs.map +1 -1
  27. package/dist/components/craft-loader.js +1 -1
  28. package/dist/components/craft-loader.js.map +1 -1
  29. package/dist/index.cjs +3 -0
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +1 -0
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.js +2 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/styles.css +44 -5
  36. package/package.json +1 -1
@@ -45,8 +45,8 @@ function CraftCard({
45
45
  intensityClasses[intensity],
46
46
  "bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]",
47
47
  bordered ? "border-2 border-[rgb(var(--nc-accent-1)/0.3)]" : "border-0",
48
- elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.4)]" : "shadow-none",
49
- "before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 before:transition-opacity before:duration-300",
48
+ elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]" : "shadow-none",
49
+ "before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300",
50
50
  "transition-all duration-300",
51
51
  className
52
52
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.4)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CM;AA1CN,gBAAmB;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,sDAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CM;AA1CN,gBAAmB;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,sDAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
@@ -22,8 +22,8 @@ function CraftCard({
22
22
  intensityClasses[intensity],
23
23
  "bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]",
24
24
  bordered ? "border-2 border-[rgb(var(--nc-accent-1)/0.3)]" : "border-0",
25
- elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.4)]" : "shadow-none",
26
- "before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 before:transition-opacity before:duration-300",
25
+ elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]" : "shadow-none",
26
+ "before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300",
27
27
  "transition-all duration-300",
28
28
  className
29
29
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.4)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":"AA0CM;AA1CN,SAAS,UAAU;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,8BAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":"AA0CM;AA1CN,SAAS,UAAU;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,8BAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var craft_data_table_filters_exports = {};
21
+ __export(craft_data_table_filters_exports, {
22
+ CraftDataTableFilters: () => CraftDataTableFilters
23
+ });
24
+ module.exports = __toCommonJS(craft_data_table_filters_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_cn = require("../utils/cn");
27
+ var import_craft_button = require("../components/craft-button");
28
+ var import_craft_input = require("../components/craft-input");
29
+ var import_craft_select = require("../components/craft-select");
30
+ function CraftDataTableFilters({
31
+ title,
32
+ description,
33
+ searchValue,
34
+ onSearchChange,
35
+ searchPlaceholder = "Search...",
36
+ showSearch = true,
37
+ addButton,
38
+ selectFilters,
39
+ onSelectFiltersChange,
40
+ dateFilters,
41
+ onDateFiltersChange,
42
+ showFilters = true,
43
+ showClear = true,
44
+ clearLabel = "Clear filters",
45
+ onClearFilters,
46
+ showFileUpload = false,
47
+ fileUploadAccept,
48
+ fileUploadMaxSize,
49
+ onFilesSelected,
50
+ totalItems,
51
+ itemLabel = "items",
52
+ tone,
53
+ className
54
+ }) {
55
+ var _a, _b;
56
+ const hasSelects = Boolean(selectFilters && selectFilters.length > 0);
57
+ const hasDates = Boolean(dateFilters && dateFilters.length > 0);
58
+ const hasFilters = showFilters && (hasSelects || hasDates);
59
+ const updateSelectFilter = (index, value) => {
60
+ if (!selectFilters || !onSelectFiltersChange) return;
61
+ const next = selectFilters.map(
62
+ (filter, idx) => idx === index ? { ...filter, value } : filter
63
+ );
64
+ onSelectFiltersChange(next);
65
+ };
66
+ const updateDateFilter = (index, key, value) => {
67
+ if (!dateFilters || !onDateFiltersChange) return;
68
+ const next = dateFilters.map(
69
+ (filter, idx) => idx === index ? { ...filter, [key]: value } : filter
70
+ );
71
+ onDateFiltersChange(next);
72
+ };
73
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
74
+ "div",
75
+ {
76
+ className: (0, import_cn.cn)(
77
+ "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",
78
+ className
79
+ ),
80
+ "data-nc-theme": tone,
81
+ children: [
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
83
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
84
+ title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold", children: title }),
85
+ description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: description }),
86
+ typeof totalItems === "number" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-[rgb(var(--nc-fg-muted))]", children: [
87
+ totalItems,
88
+ " ",
89
+ itemLabel
90
+ ] })
91
+ ] }),
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3", children: [
93
+ showFileUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
94
+ import_craft_input.CraftInput,
95
+ {
96
+ type: "file",
97
+ accept: fileUploadAccept,
98
+ onChange: (event) => {
99
+ const files = event.target.files;
100
+ if (!files || files.length === 0) return;
101
+ if (typeof fileUploadMaxSize === "number" && files[0] && files[0].size > fileUploadMaxSize) {
102
+ return;
103
+ }
104
+ onFilesSelected == null ? void 0 : onFilesSelected(files);
105
+ event.currentTarget.value = "";
106
+ }
107
+ }
108
+ ),
109
+ addButton ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
110
+ import_craft_button.CraftButton,
111
+ {
112
+ type: "button",
113
+ variant: (_a = addButton.variant) != null ? _a : "outline",
114
+ size: (_b = addButton.size) != null ? _b : "sm",
115
+ disabled: addButton.disabled,
116
+ onClick: addButton.onClick,
117
+ children: addButton.label
118
+ }
119
+ ) : null,
120
+ showClear && onClearFilters ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_button.CraftButton, { type: "button", variant: "ghost", onClick: onClearFilters, children: clearLabel }) : null
121
+ ] })
122
+ ] }),
123
+ (showSearch || hasFilters) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-4 grid gap-4", children: [
124
+ showSearch && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
125
+ import_craft_input.CraftInput,
126
+ {
127
+ type: "search",
128
+ placeholder: searchPlaceholder,
129
+ value: searchValue != null ? searchValue : "",
130
+ onChange: (event) => onSearchChange == null ? void 0 : onSearchChange(event.target.value),
131
+ tone
132
+ }
133
+ ),
134
+ hasFilters && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap items-end gap-3", children: [
135
+ selectFilters == null ? void 0 : selectFilters.map((filter, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "grid gap-2 text-xs", children: [
136
+ filter.label ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
138
+ import_craft_select.CraftSelect,
139
+ {
140
+ value: filter.value,
141
+ disabled: filter.disabled,
142
+ onChange: (event) => updateSelectFilter(index, event.target.value),
143
+ children: [
144
+ filter.placeholder ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "", children: filter.placeholder }) : null,
145
+ filter.options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: option.value, children: option.label }, String(option.value)))
146
+ ]
147
+ }
148
+ )
149
+ ] }, filter.key)),
150
+ dateFilters == null ? void 0 : dateFilters.map((filter, index) => {
151
+ var _a2, _b2;
152
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid gap-2 text-xs", children: [
153
+ filter.label ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
155
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
156
+ import_craft_input.CraftInput,
157
+ {
158
+ type: "date",
159
+ value: (_a2 = filter.from) != null ? _a2 : "",
160
+ onChange: (event) => updateDateFilter(index, "from", event.target.value)
161
+ }
162
+ ),
163
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
164
+ import_craft_input.CraftInput,
165
+ {
166
+ type: "date",
167
+ value: (_b2 = filter.to) != null ? _b2 : "",
168
+ onChange: (event) => updateDateFilter(index, "to", event.target.value)
169
+ }
170
+ )
171
+ ] })
172
+ ] }, filter.key);
173
+ })
174
+ ] })
175
+ ] })
176
+ ]
177
+ }
178
+ );
179
+ }
180
+ // Annotate the CommonJS export names for ESM import in node:
181
+ 0 && (module.exports = {
182
+ CraftDataTableFilters
183
+ });
184
+ //# sourceMappingURL=craft-data-table-filters.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/craft-data-table-filters.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton, type CraftButtonProps } from \"@/components/craft-button\";\nimport { CraftInput } from \"@/components/craft-input\";\nimport { CraftSelect } from \"@/components/craft-select\";\n\nexport type CraftDataTableFilterSelectOption = {\n label: React.ReactNode;\n value: string;\n};\n\nexport type CraftDataTableFilterSelect = {\n key: string;\n label?: React.ReactNode;\n value: string;\n placeholder?: string;\n options: CraftDataTableFilterSelectOption[];\n disabled?: boolean;\n};\n\nexport type CraftDataTableFilterDate = {\n key: string;\n label?: React.ReactNode;\n from?: string;\n to?: string;\n};\n\nexport type CraftDataTableFiltersProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n showSearch?: boolean;\n\n addButton?: {\n label: React.ReactNode;\n icon?: React.ReactNode | string;\n variant?: CraftButtonProps[\"variant\"];\n size?: CraftButtonProps[\"size\"];\n disabled?: boolean;\n onClick: () => void;\n };\n\n selectFilters?: CraftDataTableFilterSelect[];\n onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;\n\n dateFilters?: CraftDataTableFilterDate[];\n onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;\n\n showFilters?: boolean;\n\n showClear?: boolean;\n clearLabel?: React.ReactNode;\n onClearFilters?: () => void;\n\n showFileUpload?: boolean;\n fileUploadAccept?: string;\n fileUploadMaxSize?: number;\n onFilesSelected?: (files: FileList) => void;\n\n totalItems?: number;\n itemLabel?: string;\n\n tone?: ThemeName;\n className?: string;\n};\n\nexport function CraftDataTableFilters({\n title,\n description,\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n showSearch = true,\n addButton,\n selectFilters,\n onSelectFiltersChange,\n dateFilters,\n onDateFiltersChange,\n showFilters = true,\n showClear = true,\n clearLabel = \"Clear filters\",\n onClearFilters,\n showFileUpload = false,\n fileUploadAccept,\n fileUploadMaxSize,\n onFilesSelected,\n totalItems,\n itemLabel = \"items\",\n tone,\n className,\n}: CraftDataTableFiltersProps) {\n const hasSelects = Boolean(selectFilters && selectFilters.length > 0);\n const hasDates = Boolean(dateFilters && dateFilters.length > 0);\n const hasFilters = showFilters && (hasSelects || hasDates);\n\n const updateSelectFilter = (index: number, value: string) => {\n if (!selectFilters || !onSelectFiltersChange) return;\n const next = selectFilters.map((filter, idx) =>\n idx === index ? { ...filter, value } : filter\n );\n onSelectFiltersChange(next);\n };\n\n const updateDateFilter = (\n index: number,\n key: \"from\" | \"to\",\n value: string\n ) => {\n if (!dateFilters || !onDateFiltersChange) return;\n const next = dateFilters.map((filter, idx) =>\n idx === index ? { ...filter, [key]: value } : filter\n );\n onDateFiltersChange(next);\n };\n\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 {typeof totalItems === \"number\" && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {totalItems} {itemLabel}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {showFileUpload && (\n <CraftInput\n type=\"file\"\n accept={fileUploadAccept}\n onChange={(event) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n if (\n typeof fileUploadMaxSize === \"number\" &&\n files[0] &&\n files[0].size > fileUploadMaxSize\n ) {\n return;\n }\n onFilesSelected?.(files);\n event.currentTarget.value = \"\";\n }}\n />\n )}\n\n {addButton ? (\n <CraftButton\n type=\"button\"\n variant={addButton.variant ?? \"outline\"}\n size={addButton.size ?? \"sm\"}\n disabled={addButton.disabled}\n onClick={addButton.onClick}\n >\n {addButton.label}\n </CraftButton>\n ) : null}\n\n {showClear && onClearFilters ? (\n <CraftButton type=\"button\" variant=\"ghost\" onClick={onClearFilters}>\n {clearLabel}\n </CraftButton>\n ) : null}\n </div>\n </div>\n\n {(showSearch || hasFilters) && (\n <div className=\"mt-4 grid gap-4\">\n {showSearch && (\n <CraftInput\n type=\"search\"\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n onChange={(event) => onSearchChange?.(event.target.value)}\n tone={tone}\n />\n )}\n\n {hasFilters && (\n <div className=\"flex flex-wrap items-end gap-3\">\n {selectFilters?.map((filter, index) => (\n <label key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <CraftSelect\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) =>\n updateSelectFilter(index, event.target.value)\n }\n >\n {filter.placeholder ? (\n <option value=\"\">{filter.placeholder}</option>\n ) : null}\n {filter.options.map((option) => (\n <option key={String(option.value)} value={option.value}>\n {option.label}\n </option>\n ))}\n </CraftSelect>\n </label>\n ))}\n\n {dateFilters?.map((filter, index) => (\n <div key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <CraftInput\n type=\"date\"\n value={filter.from ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"from\", event.target.value)\n }\n />\n <CraftInput\n type=\"date\"\n value={filter.to ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"to\", event.target.value)\n }\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["_a","_b"]}
@@ -0,0 +1,58 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ThemeName } from '../theme/theme-context.cjs';
4
+ import { CraftButtonProps } from './craft-button.cjs';
5
+
6
+ type CraftDataTableFilterSelectOption = {
7
+ label: React.ReactNode;
8
+ value: string;
9
+ };
10
+ type CraftDataTableFilterSelect = {
11
+ key: string;
12
+ label?: React.ReactNode;
13
+ value: string;
14
+ placeholder?: string;
15
+ options: CraftDataTableFilterSelectOption[];
16
+ disabled?: boolean;
17
+ };
18
+ type CraftDataTableFilterDate = {
19
+ key: string;
20
+ label?: React.ReactNode;
21
+ from?: string;
22
+ to?: string;
23
+ };
24
+ type CraftDataTableFiltersProps = {
25
+ title?: React.ReactNode;
26
+ description?: React.ReactNode;
27
+ searchValue?: string;
28
+ onSearchChange?: (value: string) => void;
29
+ searchPlaceholder?: string;
30
+ showSearch?: boolean;
31
+ addButton?: {
32
+ label: React.ReactNode;
33
+ icon?: React.ReactNode | string;
34
+ variant?: CraftButtonProps["variant"];
35
+ size?: CraftButtonProps["size"];
36
+ disabled?: boolean;
37
+ onClick: () => void;
38
+ };
39
+ selectFilters?: CraftDataTableFilterSelect[];
40
+ onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;
41
+ dateFilters?: CraftDataTableFilterDate[];
42
+ onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;
43
+ showFilters?: boolean;
44
+ showClear?: boolean;
45
+ clearLabel?: React.ReactNode;
46
+ onClearFilters?: () => void;
47
+ showFileUpload?: boolean;
48
+ fileUploadAccept?: string;
49
+ fileUploadMaxSize?: number;
50
+ onFilesSelected?: (files: FileList) => void;
51
+ totalItems?: number;
52
+ itemLabel?: string;
53
+ tone?: ThemeName;
54
+ className?: string;
55
+ };
56
+ declare function CraftDataTableFilters({ title, description, searchValue, onSearchChange, searchPlaceholder, showSearch, addButton, selectFilters, onSelectFiltersChange, dateFilters, onDateFiltersChange, showFilters, showClear, clearLabel, onClearFilters, showFileUpload, fileUploadAccept, fileUploadMaxSize, onFilesSelected, totalItems, itemLabel, tone, className, }: CraftDataTableFiltersProps): react_jsx_runtime.JSX.Element;
57
+
58
+ export { type CraftDataTableFilterDate, type CraftDataTableFilterSelect, type CraftDataTableFilterSelectOption, CraftDataTableFilters, type CraftDataTableFiltersProps };
@@ -0,0 +1,58 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ThemeName } from '../theme/theme-context.js';
4
+ import { CraftButtonProps } from './craft-button.js';
5
+
6
+ type CraftDataTableFilterSelectOption = {
7
+ label: React.ReactNode;
8
+ value: string;
9
+ };
10
+ type CraftDataTableFilterSelect = {
11
+ key: string;
12
+ label?: React.ReactNode;
13
+ value: string;
14
+ placeholder?: string;
15
+ options: CraftDataTableFilterSelectOption[];
16
+ disabled?: boolean;
17
+ };
18
+ type CraftDataTableFilterDate = {
19
+ key: string;
20
+ label?: React.ReactNode;
21
+ from?: string;
22
+ to?: string;
23
+ };
24
+ type CraftDataTableFiltersProps = {
25
+ title?: React.ReactNode;
26
+ description?: React.ReactNode;
27
+ searchValue?: string;
28
+ onSearchChange?: (value: string) => void;
29
+ searchPlaceholder?: string;
30
+ showSearch?: boolean;
31
+ addButton?: {
32
+ label: React.ReactNode;
33
+ icon?: React.ReactNode | string;
34
+ variant?: CraftButtonProps["variant"];
35
+ size?: CraftButtonProps["size"];
36
+ disabled?: boolean;
37
+ onClick: () => void;
38
+ };
39
+ selectFilters?: CraftDataTableFilterSelect[];
40
+ onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;
41
+ dateFilters?: CraftDataTableFilterDate[];
42
+ onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;
43
+ showFilters?: boolean;
44
+ showClear?: boolean;
45
+ clearLabel?: React.ReactNode;
46
+ onClearFilters?: () => void;
47
+ showFileUpload?: boolean;
48
+ fileUploadAccept?: string;
49
+ fileUploadMaxSize?: number;
50
+ onFilesSelected?: (files: FileList) => void;
51
+ totalItems?: number;
52
+ itemLabel?: string;
53
+ tone?: ThemeName;
54
+ className?: string;
55
+ };
56
+ declare function CraftDataTableFilters({ title, description, searchValue, onSearchChange, searchPlaceholder, showSearch, addButton, selectFilters, onSelectFiltersChange, dateFilters, onDateFiltersChange, showFilters, showClear, clearLabel, onClearFilters, showFileUpload, fileUploadAccept, fileUploadMaxSize, onFilesSelected, totalItems, itemLabel, tone, className, }: CraftDataTableFiltersProps): react_jsx_runtime.JSX.Element;
57
+
58
+ export { type CraftDataTableFilterDate, type CraftDataTableFilterSelect, type CraftDataTableFilterSelectOption, CraftDataTableFilters, type CraftDataTableFiltersProps };
@@ -0,0 +1,160 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { cn } from "../utils/cn";
4
+ import { CraftButton } from "../components/craft-button";
5
+ import { CraftInput } from "../components/craft-input";
6
+ import { CraftSelect } from "../components/craft-select";
7
+ function CraftDataTableFilters({
8
+ title,
9
+ description,
10
+ searchValue,
11
+ onSearchChange,
12
+ searchPlaceholder = "Search...",
13
+ showSearch = true,
14
+ addButton,
15
+ selectFilters,
16
+ onSelectFiltersChange,
17
+ dateFilters,
18
+ onDateFiltersChange,
19
+ showFilters = true,
20
+ showClear = true,
21
+ clearLabel = "Clear filters",
22
+ onClearFilters,
23
+ showFileUpload = false,
24
+ fileUploadAccept,
25
+ fileUploadMaxSize,
26
+ onFilesSelected,
27
+ totalItems,
28
+ itemLabel = "items",
29
+ tone,
30
+ className
31
+ }) {
32
+ var _a, _b;
33
+ const hasSelects = Boolean(selectFilters && selectFilters.length > 0);
34
+ const hasDates = Boolean(dateFilters && dateFilters.length > 0);
35
+ const hasFilters = showFilters && (hasSelects || hasDates);
36
+ const updateSelectFilter = (index, value) => {
37
+ if (!selectFilters || !onSelectFiltersChange) return;
38
+ const next = selectFilters.map(
39
+ (filter, idx) => idx === index ? { ...filter, value } : filter
40
+ );
41
+ onSelectFiltersChange(next);
42
+ };
43
+ const updateDateFilter = (index, key, value) => {
44
+ if (!dateFilters || !onDateFiltersChange) return;
45
+ const next = dateFilters.map(
46
+ (filter, idx) => idx === index ? { ...filter, [key]: value } : filter
47
+ );
48
+ onDateFiltersChange(next);
49
+ };
50
+ return /* @__PURE__ */ jsxs(
51
+ "div",
52
+ {
53
+ className: cn(
54
+ "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",
55
+ className
56
+ ),
57
+ "data-nc-theme": tone,
58
+ children: [
59
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
60
+ /* @__PURE__ */ jsxs("div", { children: [
61
+ title && /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold", children: title }),
62
+ description && /* @__PURE__ */ jsx("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: description }),
63
+ typeof totalItems === "number" && /* @__PURE__ */ jsxs("p", { className: "text-xs text-[rgb(var(--nc-fg-muted))]", children: [
64
+ totalItems,
65
+ " ",
66
+ itemLabel
67
+ ] })
68
+ ] }),
69
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
70
+ showFileUpload && /* @__PURE__ */ jsx(
71
+ CraftInput,
72
+ {
73
+ type: "file",
74
+ accept: fileUploadAccept,
75
+ onChange: (event) => {
76
+ const files = event.target.files;
77
+ if (!files || files.length === 0) return;
78
+ if (typeof fileUploadMaxSize === "number" && files[0] && files[0].size > fileUploadMaxSize) {
79
+ return;
80
+ }
81
+ onFilesSelected == null ? void 0 : onFilesSelected(files);
82
+ event.currentTarget.value = "";
83
+ }
84
+ }
85
+ ),
86
+ addButton ? /* @__PURE__ */ jsx(
87
+ CraftButton,
88
+ {
89
+ type: "button",
90
+ variant: (_a = addButton.variant) != null ? _a : "outline",
91
+ size: (_b = addButton.size) != null ? _b : "sm",
92
+ disabled: addButton.disabled,
93
+ onClick: addButton.onClick,
94
+ children: addButton.label
95
+ }
96
+ ) : null,
97
+ showClear && onClearFilters ? /* @__PURE__ */ jsx(CraftButton, { type: "button", variant: "ghost", onClick: onClearFilters, children: clearLabel }) : null
98
+ ] })
99
+ ] }),
100
+ (showSearch || hasFilters) && /* @__PURE__ */ jsxs("div", { className: "mt-4 grid gap-4", children: [
101
+ showSearch && /* @__PURE__ */ jsx(
102
+ CraftInput,
103
+ {
104
+ type: "search",
105
+ placeholder: searchPlaceholder,
106
+ value: searchValue != null ? searchValue : "",
107
+ onChange: (event) => onSearchChange == null ? void 0 : onSearchChange(event.target.value),
108
+ tone
109
+ }
110
+ ),
111
+ hasFilters && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-end gap-3", children: [
112
+ selectFilters == null ? void 0 : selectFilters.map((filter, index) => /* @__PURE__ */ jsxs("label", { className: "grid gap-2 text-xs", children: [
113
+ filter.label ? /* @__PURE__ */ jsx("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
114
+ /* @__PURE__ */ jsxs(
115
+ CraftSelect,
116
+ {
117
+ value: filter.value,
118
+ disabled: filter.disabled,
119
+ onChange: (event) => updateSelectFilter(index, event.target.value),
120
+ children: [
121
+ filter.placeholder ? /* @__PURE__ */ jsx("option", { value: "", children: filter.placeholder }) : null,
122
+ filter.options.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, String(option.value)))
123
+ ]
124
+ }
125
+ )
126
+ ] }, filter.key)),
127
+ dateFilters == null ? void 0 : dateFilters.map((filter, index) => {
128
+ var _a2, _b2;
129
+ return /* @__PURE__ */ jsxs("div", { className: "grid gap-2 text-xs", children: [
130
+ filter.label ? /* @__PURE__ */ jsx("span", { className: "text-[rgb(var(--nc-fg-muted))]", children: filter.label }) : null,
131
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
132
+ /* @__PURE__ */ jsx(
133
+ CraftInput,
134
+ {
135
+ type: "date",
136
+ value: (_a2 = filter.from) != null ? _a2 : "",
137
+ onChange: (event) => updateDateFilter(index, "from", event.target.value)
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsx(
141
+ CraftInput,
142
+ {
143
+ type: "date",
144
+ value: (_b2 = filter.to) != null ? _b2 : "",
145
+ onChange: (event) => updateDateFilter(index, "to", event.target.value)
146
+ }
147
+ )
148
+ ] })
149
+ ] }, filter.key);
150
+ })
151
+ ] })
152
+ ] })
153
+ ]
154
+ }
155
+ );
156
+ }
157
+ export {
158
+ CraftDataTableFilters
159
+ };
160
+ //# sourceMappingURL=craft-data-table-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/craft-data-table-filters.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton, type CraftButtonProps } from \"@/components/craft-button\";\nimport { CraftInput } from \"@/components/craft-input\";\nimport { CraftSelect } from \"@/components/craft-select\";\n\nexport type CraftDataTableFilterSelectOption = {\n label: React.ReactNode;\n value: string;\n};\n\nexport type CraftDataTableFilterSelect = {\n key: string;\n label?: React.ReactNode;\n value: string;\n placeholder?: string;\n options: CraftDataTableFilterSelectOption[];\n disabled?: boolean;\n};\n\nexport type CraftDataTableFilterDate = {\n key: string;\n label?: React.ReactNode;\n from?: string;\n to?: string;\n};\n\nexport type CraftDataTableFiltersProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n showSearch?: boolean;\n\n addButton?: {\n label: React.ReactNode;\n icon?: React.ReactNode | string;\n variant?: CraftButtonProps[\"variant\"];\n size?: CraftButtonProps[\"size\"];\n disabled?: boolean;\n onClick: () => void;\n };\n\n selectFilters?: CraftDataTableFilterSelect[];\n onSelectFiltersChange?: (filters: CraftDataTableFilterSelect[]) => void;\n\n dateFilters?: CraftDataTableFilterDate[];\n onDateFiltersChange?: (filters: CraftDataTableFilterDate[]) => void;\n\n showFilters?: boolean;\n\n showClear?: boolean;\n clearLabel?: React.ReactNode;\n onClearFilters?: () => void;\n\n showFileUpload?: boolean;\n fileUploadAccept?: string;\n fileUploadMaxSize?: number;\n onFilesSelected?: (files: FileList) => void;\n\n totalItems?: number;\n itemLabel?: string;\n\n tone?: ThemeName;\n className?: string;\n};\n\nexport function CraftDataTableFilters({\n title,\n description,\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n showSearch = true,\n addButton,\n selectFilters,\n onSelectFiltersChange,\n dateFilters,\n onDateFiltersChange,\n showFilters = true,\n showClear = true,\n clearLabel = \"Clear filters\",\n onClearFilters,\n showFileUpload = false,\n fileUploadAccept,\n fileUploadMaxSize,\n onFilesSelected,\n totalItems,\n itemLabel = \"items\",\n tone,\n className,\n}: CraftDataTableFiltersProps) {\n const hasSelects = Boolean(selectFilters && selectFilters.length > 0);\n const hasDates = Boolean(dateFilters && dateFilters.length > 0);\n const hasFilters = showFilters && (hasSelects || hasDates);\n\n const updateSelectFilter = (index: number, value: string) => {\n if (!selectFilters || !onSelectFiltersChange) return;\n const next = selectFilters.map((filter, idx) =>\n idx === index ? { ...filter, value } : filter\n );\n onSelectFiltersChange(next);\n };\n\n const updateDateFilter = (\n index: number,\n key: \"from\" | \"to\",\n value: string\n ) => {\n if (!dateFilters || !onDateFiltersChange) return;\n const next = dateFilters.map((filter, idx) =>\n idx === index ? { ...filter, [key]: value } : filter\n );\n onDateFiltersChange(next);\n };\n\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 {typeof totalItems === \"number\" && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {totalItems} {itemLabel}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {showFileUpload && (\n <CraftInput\n type=\"file\"\n accept={fileUploadAccept}\n onChange={(event) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n if (\n typeof fileUploadMaxSize === \"number\" &&\n files[0] &&\n files[0].size > fileUploadMaxSize\n ) {\n return;\n }\n onFilesSelected?.(files);\n event.currentTarget.value = \"\";\n }}\n />\n )}\n\n {addButton ? (\n <CraftButton\n type=\"button\"\n variant={addButton.variant ?? \"outline\"}\n size={addButton.size ?? \"sm\"}\n disabled={addButton.disabled}\n onClick={addButton.onClick}\n >\n {addButton.label}\n </CraftButton>\n ) : null}\n\n {showClear && onClearFilters ? (\n <CraftButton type=\"button\" variant=\"ghost\" onClick={onClearFilters}>\n {clearLabel}\n </CraftButton>\n ) : null}\n </div>\n </div>\n\n {(showSearch || hasFilters) && (\n <div className=\"mt-4 grid gap-4\">\n {showSearch && (\n <CraftInput\n type=\"search\"\n placeholder={searchPlaceholder}\n value={searchValue ?? \"\"}\n onChange={(event) => onSearchChange?.(event.target.value)}\n tone={tone}\n />\n )}\n\n {hasFilters && (\n <div className=\"flex flex-wrap items-end gap-3\">\n {selectFilters?.map((filter, index) => (\n <label key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <CraftSelect\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) =>\n updateSelectFilter(index, event.target.value)\n }\n >\n {filter.placeholder ? (\n <option value=\"\">{filter.placeholder}</option>\n ) : null}\n {filter.options.map((option) => (\n <option key={String(option.value)} value={option.value}>\n {option.label}\n </option>\n ))}\n </CraftSelect>\n </label>\n ))}\n\n {dateFilters?.map((filter, index) => (\n <div key={filter.key} className=\"grid gap-2 text-xs\">\n {filter.label ? (\n <span className=\"text-[rgb(var(--nc-fg-muted))]\">\n {filter.label}\n </span>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <CraftInput\n type=\"date\"\n value={filter.from ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"from\", event.target.value)\n }\n />\n <CraftInput\n type=\"date\"\n value={filter.to ?? \"\"}\n onChange={(event) =>\n updateDateFilter(index, \"to\", event.target.value)\n }\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["_a","_b"]}
@@ -30,7 +30,7 @@ const paddingClasses = {
30
30
  comfortable: "px-8 py-5"
31
31
  };
32
32
  const variantClasses = {
33
- default: "border-b border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.12)]",
33
+ default: "border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]",
34
34
  minimal: "border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent"
35
35
  };
36
36
  function CraftDataTableHeader({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.12)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDM;AAhDN,gBAAmB;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,qDAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,4CAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,4CAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,6CAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDM;AAhDN,gBAAmB;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,qDAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,4CAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,4CAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,6CAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -7,7 +7,7 @@ const paddingClasses = {
7
7
  comfortable: "px-8 py-5"
8
8
  };
9
9
  const variantClasses = {
10
- default: "border-b border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.12)]",
10
+ default: "border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]",
11
11
  minimal: "border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent"
12
12
  };
13
13
  function CraftDataTableHeader({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.12)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";AAoDM,SACW,KADX;AAhDN,SAAS,UAAU;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,6BAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,oBAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,oBAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,qBAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/craft-data-table-header.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";AAoDM,SACW,KADX;AAhDN,SAAS,UAAU;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,6BAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,oBAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,oBAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,qBAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}