@jameskabz/nextcraft-ui 0.7.5 → 0.8.1

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-data-table-filters.cjs +184 -0
  2. package/dist/components/craft-data-table-filters.cjs.map +1 -0
  3. package/dist/components/craft-data-table-filters.d.cts +58 -0
  4. package/dist/components/craft-data-table-filters.d.ts +58 -0
  5. package/dist/components/craft-data-table-filters.js +160 -0
  6. package/dist/components/craft-data-table-filters.js.map +1 -0
  7. package/dist/components/craft-data-table-header.cjs +1 -1
  8. package/dist/components/craft-data-table-header.cjs.map +1 -1
  9. package/dist/components/craft-data-table-header.js +1 -1
  10. package/dist/components/craft-data-table-header.js.map +1 -1
  11. package/dist/components/craft-data-table.cjs +8 -5
  12. package/dist/components/craft-data-table.cjs.map +1 -1
  13. package/dist/components/craft-data-table.js +8 -5
  14. package/dist/components/craft-data-table.js.map +1 -1
  15. package/dist/components/craft-filter-bar.cjs +75 -5
  16. package/dist/components/craft-filter-bar.cjs.map +1 -1
  17. package/dist/components/craft-filter-bar.d.cts +29 -3
  18. package/dist/components/craft-filter-bar.d.ts +29 -3
  19. package/dist/components/craft-filter-bar.js +75 -5
  20. package/dist/components/craft-filter-bar.js.map +1 -1
  21. package/dist/components/craft-toast.cjs +40 -56
  22. package/dist/components/craft-toast.cjs.map +1 -1
  23. package/dist/components/craft-toast.d.cts +3 -23
  24. package/dist/components/craft-toast.d.ts +3 -23
  25. package/dist/components/craft-toast.js +41 -45
  26. package/dist/components/craft-toast.js.map +1 -1
  27. package/dist/craft-toast-BcscwgO3.d.ts +56 -0
  28. package/dist/craft-toast-C7rMmROV.d.cts +56 -0
  29. package/dist/index.cjs +11 -4
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +2 -1
  32. package/dist/index.d.ts +2 -1
  33. package/dist/index.js +7 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/styles.css +16 -5
  36. package/package.json +1 -1
@@ -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":[]}
@@ -338,9 +338,12 @@ function CraftDataTable({
338
338
  rowLoading[rowId] && "opacity-60"
339
339
  );
340
340
  const containerClasses = (0, import_cn.cn)(
341
- "overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
342
- " shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
343
- variant === "minimal" && "border-transparent bg-transparent shadow-none"
341
+ "relative overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
342
+ "shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
343
+ variant === "minimal" ? "border-transparent bg-transparent shadow-none" : (0, import_cn.cn)(
344
+ "border-[rgb(var(--nc-accent-1)/0.35)]",
345
+ "bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]"
346
+ )
344
347
  );
345
348
  const openModal = (content) => {
346
349
  if (!enableTextModal) return;
@@ -429,7 +432,7 @@ function CraftDataTable({
429
432
  }
430
433
  ),
431
434
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("overflow-x-auto", (loading || dataLoading) && "opacity-60"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { className: "min-w-full border-collapse text-left text-sm", children: [
432
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { className: "bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
435
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { className: "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)] text-[rgb(var(--nc-fg-muted))]", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
433
436
  resolvedSelectable && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { className: (0, import_cn.cn)("w-12", headerPaddingClasses[density]), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center justify-center", children: bulkLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_loader.CraftLoader, { loading: true, type: "spin", size: "small", color: loadingColor }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
434
437
  import_craft_checkbox.CraftCheckbox,
435
438
  {
@@ -625,7 +628,7 @@ function CraftDataTable({
625
628
  }
626
629
  )
627
630
  ] }),
628
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_modal.CraftModal, { open: showModal, onOpenChange: setShowModal, title: "Full Text", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-3", children: [
631
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_modal.CraftModal, { open: showModal, onOpenChange: setShowModal, title: "Full Text", tone, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-3", children: [
629
632
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: "Full content" }),
630
633
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words", children: modalContent }),
631
634
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex justify-end", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_button.CraftButton, { type: "button", variant: "ghost", onClick: closeModal, children: "Close" }) })