@lglab/compose-ui 0.28.0 → 0.30.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.
- package/dist/accordion.d.ts +49 -40
- package/dist/accordion.d.ts.map +1 -0
- package/dist/accordion.js +47 -45
- package/dist/accordion.js.map +1 -0
- package/dist/alert-dialog.d.ts +93 -87
- package/dist/alert-dialog.d.ts.map +1 -0
- package/dist/alert-dialog.js +94 -111
- package/dist/alert-dialog.js.map +1 -0
- package/dist/autocomplete.d.ts +99 -96
- package/dist/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete.js +92 -116
- package/dist/autocomplete.js.map +1 -0
- package/dist/avatar.d.ts +56 -47
- package/dist/avatar.d.ts.map +1 -0
- package/dist/avatar.js +66 -79
- package/dist/avatar.js.map +1 -0
- package/dist/badge.d.ts +48 -42
- package/dist/badge.d.ts.map +1 -0
- package/dist/badge.js +195 -202
- package/dist/badge.js.map +1 -0
- package/dist/button.d.ts +26 -21
- package/dist/button.d.ts.map +1 -0
- package/dist/button.js +24 -24
- package/dist/button.js.map +1 -0
- package/dist/card.d.ts +105 -99
- package/dist/card.d.ts.map +1 -0
- package/dist/card.js +105 -66
- package/dist/card.js.map +1 -0
- package/dist/checkbox-group.d.ts +16 -12
- package/dist/checkbox-group.d.ts.map +1 -0
- package/dist/checkbox-group.js +18 -14
- package/dist/checkbox-group.js.map +1 -0
- package/dist/checkbox.d.ts +25 -19
- package/dist/checkbox.d.ts.map +1 -0
- package/dist/checkbox.js +26 -32
- package/dist/checkbox.js.map +1 -0
- package/dist/collapsible.d.ts +32 -26
- package/dist/collapsible.d.ts.map +1 -0
- package/dist/collapsible.js +32 -32
- package/dist/collapsible.js.map +1 -0
- package/dist/combobox.d.ts +191 -182
- package/dist/combobox.d.ts.map +1 -0
- package/dist/combobox.js +176 -250
- package/dist/combobox.js.map +1 -0
- package/dist/components/table/filters.d.ts +29 -0
- package/dist/components/table/filters.d.ts.map +1 -0
- package/dist/components/table/filters.js +47 -0
- package/dist/components/table/filters.js.map +1 -0
- package/dist/components/table/primitives.d.ts +93 -0
- package/dist/components/table/primitives.d.ts.map +1 -0
- package/dist/components/table/primitives.js +129 -0
- package/dist/components/table/primitives.js.map +1 -0
- package/dist/components/table/sort.js +17 -0
- package/dist/components/table/sort.js.map +1 -0
- package/dist/components/table/types.d.ts +101 -0
- package/dist/components/table/types.d.ts.map +1 -0
- package/dist/context-menu.d.ts +151 -138
- package/dist/context-menu.d.ts.map +1 -0
- package/dist/context-menu.js +151 -173
- package/dist/context-menu.js.map +1 -0
- package/dist/dialog.d.ts +101 -92
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dialog.js +101 -105
- package/dist/dialog.js.map +1 -0
- package/dist/drawer.d.ts +109 -99
- package/dist/drawer.d.ts.map +1 -0
- package/dist/drawer.js +120 -111
- package/dist/drawer.js.map +1 -0
- package/dist/field.d.ts +61 -54
- package/dist/field.d.ts.map +1 -0
- package/dist/field.js +58 -27
- package/dist/field.js.map +1 -0
- package/dist/fieldset.d.ts +24 -19
- package/dist/fieldset.d.ts.map +1 -0
- package/dist/fieldset.js +26 -18
- package/dist/fieldset.js.map +1 -0
- package/dist/form.d.ts +16 -12
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +18 -8
- package/dist/form.js.map +1 -0
- package/dist/index.d.ts +48 -2115
- package/dist/index.js +47 -318
- package/dist/input.d.ts +16 -12
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +19 -9
- package/dist/input.js.map +1 -0
- package/dist/lib/arrow-svg.js +28 -0
- package/dist/lib/arrow-svg.js.map +1 -0
- package/dist/lib/button-variants.d.ts +6 -0
- package/dist/lib/button-variants.d.ts.map +1 -0
- package/dist/lib/button-variants.js +31 -0
- package/dist/lib/button-variants.js.map +1 -0
- package/dist/lib/control-variants.d.ts +6 -0
- package/dist/lib/control-variants.d.ts.map +1 -0
- package/dist/lib/control-variants.js +38 -0
- package/dist/lib/control-variants.js.map +1 -0
- package/dist/lib/form-variants.js +11 -0
- package/dist/lib/form-variants.js.map +1 -0
- package/dist/lib/tooltip-variants.d.ts +5 -0
- package/dist/lib/tooltip-variants.d.ts.map +1 -0
- package/dist/lib/tooltip-variants.js +36 -0
- package/dist/lib/tooltip-variants.js.map +1 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/menu.d.ts +151 -138
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +151 -146
- package/dist/menu.js.map +1 -0
- package/dist/menubar.d.ts +168 -155
- package/dist/menubar.d.ts.map +1 -0
- package/dist/menubar.js +163 -169
- package/dist/menubar.js.map +1 -0
- package/dist/meter.d.ts +53 -43
- package/dist/meter.d.ts.map +1 -0
- package/dist/meter.js +59 -64
- package/dist/meter.js.map +1 -0
- package/dist/navigation-menu.d.ts +111 -96
- package/dist/navigation-menu.d.ts.map +1 -0
- package/dist/navigation-menu.js +117 -175
- package/dist/navigation-menu.js.map +1 -0
- package/dist/number-field.d.ts +64 -54
- package/dist/number-field.d.ts.map +1 -0
- package/dist/number-field.js +61 -69
- package/dist/number-field.js.map +1 -0
- package/dist/pagination.d.ts +184 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +164 -0
- package/dist/pagination.js.map +1 -0
- package/dist/popover.d.ts +90 -82
- package/dist/popover.d.ts.map +1 -0
- package/dist/popover.js +85 -94
- package/dist/popover.js.map +1 -0
- package/dist/preview-card.d.ts +58 -54
- package/dist/preview-card.d.ts.map +1 -0
- package/dist/preview-card.js +57 -81
- package/dist/preview-card.js.map +1 -0
- package/dist/progress.d.ts +48 -40
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +46 -50
- package/dist/progress.js.map +1 -0
- package/dist/radio-group.d.ts +16 -12
- package/dist/radio-group.d.ts.map +1 -0
- package/dist/radio-group.js +18 -14
- package/dist/radio-group.js.map +1 -0
- package/dist/radio.d.ts +24 -19
- package/dist/radio.d.ts.map +1 -0
- package/dist/radio.js +25 -34
- package/dist/radio.js.map +1 -0
- package/dist/scroll-area.d.ts +57 -47
- package/dist/scroll-area.d.ts.map +1 -0
- package/dist/scroll-area.js +54 -56
- package/dist/scroll-area.js.map +1 -0
- package/dist/select.d.ts +146 -133
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +133 -167
- package/dist/select.js.map +1 -0
- package/dist/separator.d.ts +17 -12
- package/dist/separator.d.ts.map +1 -0
- package/dist/separator.js +19 -23
- package/dist/separator.js.map +1 -0
- package/dist/skeleton.d.ts +20 -0
- package/dist/skeleton.d.ts.map +1 -0
- package/dist/skeleton.js +27 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/slider.d.ts +56 -47
- package/dist/slider.d.ts.map +1 -0
- package/dist/slider.js +53 -62
- package/dist/slider.js.map +1 -0
- package/dist/styles/default.css +15 -1
- package/dist/switch.d.ts +24 -19
- package/dist/switch.d.ts.map +1 -0
- package/dist/switch.js +23 -39
- package/dist/switch.js.map +1 -0
- package/dist/table/index.d.ts +5 -0
- package/dist/table/index.js +5 -0
- package/dist/table/use-table.d.ts +9 -0
- package/dist/table/use-table.d.ts.map +1 -0
- package/dist/table/use-table.js +256 -0
- package/dist/table/use-table.js.map +1 -0
- package/dist/tabs.d.ts +60 -49
- package/dist/tabs.d.ts.map +1 -0
- package/dist/tabs.js +76 -84
- package/dist/tabs.js.map +1 -0
- package/dist/textarea.d.ts +15 -11
- package/dist/textarea.d.ts.map +1 -0
- package/dist/textarea.js +18 -14
- package/dist/textarea.js.map +1 -0
- package/dist/toast.d.ts +87 -81
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +79 -150
- package/dist/toast.js.map +1 -0
- package/dist/toggle-group.d.ts +34 -29
- package/dist/toggle-group.d.ts.map +1 -0
- package/dist/toggle-group.js +31 -34
- package/dist/toggle-group.js.map +1 -0
- package/dist/toggle.d.ts +24 -21
- package/dist/toggle.d.ts.map +1 -0
- package/dist/toggle.js +22 -15
- package/dist/toggle.js.map +1 -0
- package/dist/toolbar.d.ts +64 -56
- package/dist/toolbar.d.ts.map +1 -0
- package/dist/toolbar.js +57 -68
- package/dist/toolbar.js.map +1 -0
- package/dist/tooltip.d.ts +67 -62
- package/dist/tooltip.d.ts.map +1 -0
- package/dist/tooltip.js +65 -90
- package/dist/tooltip.js.map +1 -0
- package/package.json +25 -13
- package/dist/arrow-svg-C6zQTvgS.js +0 -40
- package/dist/button-variants-CbFMPwc8.js +0 -33
- package/dist/control-variants-Bwep4n0y.js +0 -37
- package/dist/form-variants-LJ8gIbk0.js +0 -9
- package/dist/utils-B6yFEsav.js +0 -8
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { cn } from "../lib/utils.js";
|
|
2
|
+
import { compareValues } from "../components/table/sort.js";
|
|
3
|
+
import { useCallback, useDeferredValue, useMemo, useState } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/table/use-table.ts
|
|
6
|
+
const DEFAULT_PAGE_SIZE = 10;
|
|
7
|
+
const DEFAULT_PAGE_SIZE_OPTIONS = [
|
|
8
|
+
10,
|
|
9
|
+
25,
|
|
10
|
+
50,
|
|
11
|
+
100
|
|
12
|
+
];
|
|
13
|
+
function useTable(options) {
|
|
14
|
+
const { data, columns: columnDefs, pagination, sort, search, filters, selection: selectionConfig } = options;
|
|
15
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
16
|
+
const [pageSize, setPageSize] = useState(pagination?.pageSize ?? DEFAULT_PAGE_SIZE);
|
|
17
|
+
const [sortState, setSortState] = useState({
|
|
18
|
+
key: sort?.key ?? null,
|
|
19
|
+
direction: sort?.direction ?? "asc"
|
|
20
|
+
});
|
|
21
|
+
const [searchTerm, setSearchTerm] = useState("");
|
|
22
|
+
const [filterValues, setFilterValues] = useState(() => {
|
|
23
|
+
if (!filters) return {};
|
|
24
|
+
const initial = {};
|
|
25
|
+
for (const [id, def] of Object.entries(filters)) if (def.defaultValue !== void 0) initial[id] = def.defaultValue;
|
|
26
|
+
return initial;
|
|
27
|
+
});
|
|
28
|
+
const [internalSelectedKeys, setInternalSelectedKeys] = useState(() => new Set(selectionConfig?.defaultSelectedKeys ?? []));
|
|
29
|
+
const isControlled = selectionConfig?.selectedKeys !== void 0;
|
|
30
|
+
const selectedKeysSet = useMemo(() => isControlled ? new Set(selectionConfig?.selectedKeys) : internalSelectedKeys, [
|
|
31
|
+
isControlled,
|
|
32
|
+
selectionConfig?.selectedKeys,
|
|
33
|
+
internalSelectedKeys
|
|
34
|
+
]);
|
|
35
|
+
const sortKey = sortState.key;
|
|
36
|
+
const sortDirection = sortState.direction;
|
|
37
|
+
const debouncedSearchTerm = useDeferredValue(searchTerm);
|
|
38
|
+
const pageSizeOptions = pagination?.pageSizeOptions ?? DEFAULT_PAGE_SIZE_OPTIONS;
|
|
39
|
+
const filteredByFilters = useMemo(() => {
|
|
40
|
+
if (!filters) return data;
|
|
41
|
+
return data.filter((row) => {
|
|
42
|
+
for (const [id, def] of Object.entries(filters)) {
|
|
43
|
+
const value = filterValues[id];
|
|
44
|
+
if (value === void 0) continue;
|
|
45
|
+
if (!def.predicate(row, value)) return false;
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
});
|
|
49
|
+
}, [
|
|
50
|
+
data,
|
|
51
|
+
filters,
|
|
52
|
+
filterValues
|
|
53
|
+
]);
|
|
54
|
+
const filteredData = useMemo(() => {
|
|
55
|
+
if (!search || !debouncedSearchTerm) return filteredByFilters;
|
|
56
|
+
const term = debouncedSearchTerm.toLowerCase();
|
|
57
|
+
return filteredByFilters.filter((row) => search.keys.some((key) => String(row[key]).toLowerCase().includes(term)));
|
|
58
|
+
}, [
|
|
59
|
+
filteredByFilters,
|
|
60
|
+
debouncedSearchTerm,
|
|
61
|
+
search
|
|
62
|
+
]);
|
|
63
|
+
const sortedData = useMemo(() => {
|
|
64
|
+
if (!sortKey) return filteredData;
|
|
65
|
+
return [...filteredData].sort((a, b) => compareValues(a[sortKey], b[sortKey], sortDirection));
|
|
66
|
+
}, [
|
|
67
|
+
filteredData,
|
|
68
|
+
sortKey,
|
|
69
|
+
sortDirection
|
|
70
|
+
]);
|
|
71
|
+
const totalItems = sortedData.length;
|
|
72
|
+
const totalPages = pagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1;
|
|
73
|
+
const effectivePage = Math.min(currentPage, totalPages);
|
|
74
|
+
const rows = useMemo(() => {
|
|
75
|
+
if (!pagination) return sortedData;
|
|
76
|
+
const start = (effectivePage - 1) * pageSize;
|
|
77
|
+
return sortedData.slice(start, start + pageSize);
|
|
78
|
+
}, [
|
|
79
|
+
sortedData,
|
|
80
|
+
effectivePage,
|
|
81
|
+
pageSize,
|
|
82
|
+
pagination
|
|
83
|
+
]);
|
|
84
|
+
const onPageChange = useCallback((page) => {
|
|
85
|
+
setCurrentPage(Math.max(1, Math.min(page, totalPages)));
|
|
86
|
+
}, [totalPages]);
|
|
87
|
+
const onPageSizeChange = useCallback((size) => {
|
|
88
|
+
setPageSize(size);
|
|
89
|
+
setCurrentPage(1);
|
|
90
|
+
}, []);
|
|
91
|
+
const onSort = useCallback((key) => {
|
|
92
|
+
setSortState((prev) => {
|
|
93
|
+
if (prev.key !== key) return {
|
|
94
|
+
key,
|
|
95
|
+
direction: "asc"
|
|
96
|
+
};
|
|
97
|
+
if (prev.direction === "asc") return {
|
|
98
|
+
key,
|
|
99
|
+
direction: "desc"
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
key: null,
|
|
103
|
+
direction: "asc"
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
setCurrentPage(1);
|
|
107
|
+
}, []);
|
|
108
|
+
const onSearchChange = useCallback((term) => {
|
|
109
|
+
setSearchTerm(term);
|
|
110
|
+
setCurrentPage(1);
|
|
111
|
+
}, []);
|
|
112
|
+
const setFilterValue = useCallback((id, value) => {
|
|
113
|
+
setFilterValues((prev) => ({
|
|
114
|
+
...prev,
|
|
115
|
+
[id]: value
|
|
116
|
+
}));
|
|
117
|
+
setCurrentPage(1);
|
|
118
|
+
}, []);
|
|
119
|
+
const clearFilters = useCallback(() => {
|
|
120
|
+
setFilterValues({});
|
|
121
|
+
setCurrentPage(1);
|
|
122
|
+
}, []);
|
|
123
|
+
const activeFilterCount = useMemo(() => Object.values(filterValues).filter((v) => v !== void 0 && v !== null && !(Array.isArray(v) && v.length === 0) && v !== "").length, [filterValues]);
|
|
124
|
+
const currentPageRowKeys = useMemo(() => {
|
|
125
|
+
if (!selectionConfig) return [];
|
|
126
|
+
return rows.map((row) => selectionConfig.rowKey(row));
|
|
127
|
+
}, [rows, selectionConfig]);
|
|
128
|
+
const pageSelectionState = useMemo(() => {
|
|
129
|
+
if (!selectionConfig || currentPageRowKeys.length === 0) return "none";
|
|
130
|
+
const selectedOnPage = currentPageRowKeys.filter((key) => selectedKeysSet.has(key));
|
|
131
|
+
if (selectedOnPage.length === 0) return "none";
|
|
132
|
+
if (selectedOnPage.length === currentPageRowKeys.length) return "all";
|
|
133
|
+
return "some";
|
|
134
|
+
}, [
|
|
135
|
+
selectionConfig,
|
|
136
|
+
currentPageRowKeys,
|
|
137
|
+
selectedKeysSet
|
|
138
|
+
]);
|
|
139
|
+
const updateSelection = useCallback((newKeys) => {
|
|
140
|
+
if (isControlled) selectionConfig?.onSelectionChange?.(newKeys);
|
|
141
|
+
else {
|
|
142
|
+
setInternalSelectedKeys(new Set(newKeys));
|
|
143
|
+
selectionConfig?.onSelectionChange?.(newKeys);
|
|
144
|
+
}
|
|
145
|
+
}, [isControlled, selectionConfig]);
|
|
146
|
+
const isSelected = useCallback((key) => selectedKeysSet.has(key), [selectedKeysSet]);
|
|
147
|
+
const toggleRow = useCallback((key) => {
|
|
148
|
+
const newKeys = new Set(selectedKeysSet);
|
|
149
|
+
if (newKeys.has(key)) newKeys.delete(key);
|
|
150
|
+
else newKeys.add(key);
|
|
151
|
+
updateSelection(Array.from(newKeys));
|
|
152
|
+
}, [selectedKeysSet, updateSelection]);
|
|
153
|
+
const isRowSelected = useCallback((row) => {
|
|
154
|
+
if (!selectionConfig) return false;
|
|
155
|
+
return selectedKeysSet.has(selectionConfig.rowKey(row));
|
|
156
|
+
}, [selectedKeysSet, selectionConfig]);
|
|
157
|
+
const toggleRowSelection = useCallback((row) => {
|
|
158
|
+
if (!selectionConfig) return;
|
|
159
|
+
toggleRow(selectionConfig.rowKey(row));
|
|
160
|
+
}, [toggleRow, selectionConfig]);
|
|
161
|
+
const toggleAllOnPage = useCallback(() => {
|
|
162
|
+
const newKeys = new Set(selectedKeysSet);
|
|
163
|
+
if (pageSelectionState === "all") for (const key of currentPageRowKeys) newKeys.delete(key);
|
|
164
|
+
else for (const key of currentPageRowKeys) newKeys.add(key);
|
|
165
|
+
updateSelection(Array.from(newKeys));
|
|
166
|
+
}, [
|
|
167
|
+
selectedKeysSet,
|
|
168
|
+
pageSelectionState,
|
|
169
|
+
currentPageRowKeys,
|
|
170
|
+
updateSelection
|
|
171
|
+
]);
|
|
172
|
+
const clearSelection = useCallback(() => {
|
|
173
|
+
updateSelection([]);
|
|
174
|
+
}, [updateSelection]);
|
|
175
|
+
const selection = useMemo(() => {
|
|
176
|
+
if (!selectionConfig) return void 0;
|
|
177
|
+
return {
|
|
178
|
+
selectedKeys: Array.from(selectedKeysSet),
|
|
179
|
+
selectedCount: selectedKeysSet.size,
|
|
180
|
+
isSelected,
|
|
181
|
+
toggleRow,
|
|
182
|
+
isRowSelected,
|
|
183
|
+
toggleRowSelection,
|
|
184
|
+
toggleAllOnPage,
|
|
185
|
+
clearSelection,
|
|
186
|
+
pageSelectionState,
|
|
187
|
+
isIndeterminate: pageSelectionState === "some",
|
|
188
|
+
isAllOnPageSelected: pageSelectionState === "all"
|
|
189
|
+
};
|
|
190
|
+
}, [
|
|
191
|
+
selectionConfig,
|
|
192
|
+
selectedKeysSet,
|
|
193
|
+
isSelected,
|
|
194
|
+
toggleRow,
|
|
195
|
+
isRowSelected,
|
|
196
|
+
toggleRowSelection,
|
|
197
|
+
toggleAllOnPage,
|
|
198
|
+
clearSelection,
|
|
199
|
+
pageSelectionState
|
|
200
|
+
]);
|
|
201
|
+
return {
|
|
202
|
+
columns: useMemo(() => {
|
|
203
|
+
return columnDefs.map((def) => {
|
|
204
|
+
const key = def.key;
|
|
205
|
+
const sortable = def.sortable ?? false;
|
|
206
|
+
const isSorted = sortKey === key;
|
|
207
|
+
const renderCell = (row) => {
|
|
208
|
+
const value = row[key];
|
|
209
|
+
if (def.cell) return def.cell(value, row);
|
|
210
|
+
if (def.format) return def.format(value, row);
|
|
211
|
+
return value == null ? "" : String(value);
|
|
212
|
+
};
|
|
213
|
+
return {
|
|
214
|
+
key,
|
|
215
|
+
head: {
|
|
216
|
+
children: def.header,
|
|
217
|
+
className: cn(def.className, def.headerClassName) || void 0,
|
|
218
|
+
style: def.width ? { width: def.width } : void 0,
|
|
219
|
+
sortable,
|
|
220
|
+
sortDirection: isSorted ? sortDirection : void 0,
|
|
221
|
+
onSort: sortable ? () => onSort(key) : void 0
|
|
222
|
+
},
|
|
223
|
+
cell: { className: cn(def.className, def.cellClassName) || void 0 },
|
|
224
|
+
renderCell
|
|
225
|
+
};
|
|
226
|
+
});
|
|
227
|
+
}, [
|
|
228
|
+
columnDefs,
|
|
229
|
+
sortKey,
|
|
230
|
+
sortDirection,
|
|
231
|
+
onSort
|
|
232
|
+
]),
|
|
233
|
+
rows,
|
|
234
|
+
totalItems,
|
|
235
|
+
currentPage: effectivePage,
|
|
236
|
+
totalPages,
|
|
237
|
+
pageSize,
|
|
238
|
+
pageSizeOptions,
|
|
239
|
+
onPageChange,
|
|
240
|
+
onPageSizeChange,
|
|
241
|
+
sortKey,
|
|
242
|
+
sortDirection,
|
|
243
|
+
onSort,
|
|
244
|
+
searchTerm,
|
|
245
|
+
onSearchChange,
|
|
246
|
+
filterValues,
|
|
247
|
+
setFilterValue,
|
|
248
|
+
clearFilters,
|
|
249
|
+
activeFilterCount,
|
|
250
|
+
selection
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
//#endregion
|
|
255
|
+
export { useTable };
|
|
256
|
+
//# sourceMappingURL=use-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-table.js","names":[],"sources":["../../src/components/table/use-table.ts"],"sourcesContent":["import { type ReactNode, useCallback, useDeferredValue, useMemo, useState } from 'react'\n\nimport { cn } from '../../lib/utils'\nimport { compareValues } from './sort'\nimport type {\n ColumnDef,\n FilterValues,\n ProcessedColumn,\n SelectionState,\n SortDirection,\n UseTableOptions,\n UseTableReturn,\n} from './types'\n\nconst DEFAULT_PAGE_SIZE = 10\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100]\n\nexport function useTable<T>(options: UseTableOptions<T>): UseTableReturn<T> {\n const {\n data,\n columns: columnDefs,\n pagination,\n sort,\n search,\n filters,\n selection: selectionConfig,\n } = options\n\n const [currentPage, setCurrentPage] = useState(1)\n const [pageSize, setPageSize] = useState(pagination?.pageSize ?? DEFAULT_PAGE_SIZE)\n const [sortState, setSortState] = useState<{\n key: keyof T | null\n direction: SortDirection\n }>({\n key: sort?.key ?? null,\n direction: sort?.direction ?? 'asc',\n })\n const [searchTerm, setSearchTerm] = useState('')\n const [filterValues, setFilterValues] = useState<FilterValues>(() => {\n if (!filters) return {}\n const initial: FilterValues = {}\n for (const [id, def] of Object.entries(filters)) {\n if (def.defaultValue !== undefined) {\n initial[id] = def.defaultValue\n }\n }\n return initial\n })\n\n // Selection state (internal, used when uncontrolled)\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<Set<string | number>>(\n () => new Set(selectionConfig?.defaultSelectedKeys ?? []),\n )\n\n // Determine if controlled or uncontrolled\n const isControlled = selectionConfig?.selectedKeys !== undefined\n const selectedKeysSet = useMemo(\n () => (isControlled ? new Set(selectionConfig?.selectedKeys) : internalSelectedKeys),\n [isControlled, selectionConfig?.selectedKeys, internalSelectedKeys],\n )\n\n const sortKey = sortState.key\n const sortDirection = sortState.direction\n const debouncedSearchTerm = useDeferredValue(searchTerm)\n\n const pageSizeOptions = pagination?.pageSizeOptions ?? DEFAULT_PAGE_SIZE_OPTIONS\n\n // Step 1: Apply filters\n const filteredByFilters = useMemo(() => {\n if (!filters) return data\n return data.filter((row) => {\n for (const [id, def] of Object.entries(filters)) {\n const value = filterValues[id]\n if (value === undefined) continue\n if (!def.predicate(row, value)) return false\n }\n return true\n })\n }, [data, filters, filterValues])\n\n // Step 2: Apply search\n const filteredData = useMemo(() => {\n if (!search || !debouncedSearchTerm) return filteredByFilters\n const term = debouncedSearchTerm.toLowerCase()\n return filteredByFilters.filter((row) =>\n search.keys.some((key) => String(row[key]).toLowerCase().includes(term)),\n )\n }, [filteredByFilters, debouncedSearchTerm, search])\n\n const sortedData = useMemo(() => {\n if (!sortKey) return filteredData\n return [...filteredData].sort((a, b) =>\n compareValues(a[sortKey], b[sortKey], sortDirection),\n )\n }, [filteredData, sortKey, sortDirection])\n\n const totalItems = sortedData.length\n const totalPages = pagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1\n\n const effectivePage = Math.min(currentPage, totalPages)\n\n const rows = useMemo(() => {\n if (!pagination) return sortedData\n const start = (effectivePage - 1) * pageSize\n return sortedData.slice(start, start + pageSize)\n }, [sortedData, effectivePage, pageSize, pagination])\n\n const onPageChange = useCallback(\n (page: number) => {\n setCurrentPage(Math.max(1, Math.min(page, totalPages)))\n },\n [totalPages],\n )\n\n const onPageSizeChange = useCallback((size: number) => {\n setPageSize(size)\n setCurrentPage(1)\n }, [])\n\n const onSort = useCallback((key: keyof T) => {\n setSortState((prev) => {\n if (prev.key !== key) {\n return { key, direction: 'asc' }\n }\n if (prev.direction === 'asc') {\n return { key, direction: 'desc' }\n }\n return { key: null, direction: 'asc' }\n })\n setCurrentPage(1)\n }, [])\n\n const onSearchChange = useCallback((term: string) => {\n setSearchTerm(term)\n setCurrentPage(1)\n }, [])\n\n const setFilterValue = useCallback((id: string, value: unknown) => {\n setFilterValues((prev) => ({ ...prev, [id]: value }))\n setCurrentPage(1)\n }, [])\n\n const clearFilters = useCallback(() => {\n setFilterValues({})\n setCurrentPage(1)\n }, [])\n\n const activeFilterCount = useMemo(\n () =>\n Object.values(filterValues).filter(\n (v) =>\n v !== undefined &&\n v !== null &&\n !(Array.isArray(v) && v.length === 0) &&\n v !== '',\n ).length,\n [filterValues],\n )\n\n // Selection: compute current page row keys\n const currentPageRowKeys = useMemo(() => {\n if (!selectionConfig) return []\n return rows.map((row) => selectionConfig.rowKey(row))\n }, [rows, selectionConfig])\n\n // Selection: compute page selection state\n const pageSelectionState = useMemo((): 'all' | 'some' | 'none' => {\n if (!selectionConfig || currentPageRowKeys.length === 0) return 'none'\n const selectedOnPage = currentPageRowKeys.filter((key) => selectedKeysSet.has(key))\n if (selectedOnPage.length === 0) return 'none'\n if (selectedOnPage.length === currentPageRowKeys.length) return 'all'\n return 'some'\n }, [selectionConfig, currentPageRowKeys, selectedKeysSet])\n\n // Selection: helper to update selection\n const updateSelection = useCallback(\n (newKeys: (string | number)[]) => {\n if (isControlled) {\n selectionConfig?.onSelectionChange?.(newKeys)\n } else {\n setInternalSelectedKeys(new Set(newKeys))\n selectionConfig?.onSelectionChange?.(newKeys)\n }\n },\n [isControlled, selectionConfig],\n )\n\n const isSelected = useCallback(\n (key: string | number) => selectedKeysSet.has(key),\n [selectedKeysSet],\n )\n\n const toggleRow = useCallback(\n (key: string | number) => {\n const newKeys = new Set(selectedKeysSet)\n if (newKeys.has(key)) {\n newKeys.delete(key)\n } else {\n newKeys.add(key)\n }\n updateSelection(Array.from(newKeys))\n },\n [selectedKeysSet, updateSelection],\n )\n\n // Row-based convenience methods that use rowKey internally\n const isRowSelected = useCallback(\n (row: T) => {\n if (!selectionConfig) return false\n return selectedKeysSet.has(selectionConfig.rowKey(row))\n },\n [selectedKeysSet, selectionConfig],\n )\n\n const toggleRowSelection = useCallback(\n (row: T) => {\n if (!selectionConfig) return\n toggleRow(selectionConfig.rowKey(row))\n },\n [toggleRow, selectionConfig],\n )\n\n const toggleAllOnPage = useCallback(() => {\n const newKeys = new Set(selectedKeysSet)\n if (pageSelectionState === 'all') {\n // Deselect all on current page\n for (const key of currentPageRowKeys) {\n newKeys.delete(key)\n }\n } else {\n // Select all on current page\n for (const key of currentPageRowKeys) {\n newKeys.add(key)\n }\n }\n updateSelection(Array.from(newKeys))\n }, [selectedKeysSet, pageSelectionState, currentPageRowKeys, updateSelection])\n\n const clearSelection = useCallback(() => {\n updateSelection([])\n }, [updateSelection])\n\n // Build selection state object\n const selection: SelectionState<T> | undefined = useMemo(() => {\n if (!selectionConfig) return undefined\n return {\n selectedKeys: Array.from(selectedKeysSet),\n selectedCount: selectedKeysSet.size,\n isSelected,\n toggleRow,\n isRowSelected,\n toggleRowSelection,\n toggleAllOnPage,\n clearSelection,\n pageSelectionState,\n isIndeterminate: pageSelectionState === 'some',\n isAllOnPageSelected: pageSelectionState === 'all',\n }\n }, [\n selectionConfig,\n selectedKeysSet,\n isSelected,\n toggleRow,\n isRowSelected,\n toggleRowSelection,\n toggleAllOnPage,\n clearSelection,\n pageSelectionState,\n ])\n\n const columns = useMemo(() => {\n return columnDefs.map((def: ColumnDef<T, keyof T>): ProcessedColumn<T> => {\n const key = def.key\n const sortable = def.sortable ?? false\n const isSorted = sortKey === key\n\n const renderCell = (row: T): ReactNode => {\n const value = row[key]\n if (def.cell) return def.cell(value, row)\n if (def.format) return def.format(value, row)\n return value == null ? '' : String(value)\n }\n\n return {\n key,\n head: {\n children: def.header,\n className: cn(def.className, def.headerClassName) || undefined,\n style: def.width ? { width: def.width } : undefined,\n sortable,\n sortDirection: isSorted ? sortDirection : undefined,\n onSort: sortable ? () => onSort(key) : undefined,\n },\n cell: {\n className: cn(def.className, def.cellClassName) || undefined,\n },\n renderCell,\n }\n })\n }, [columnDefs, sortKey, sortDirection, onSort])\n\n return {\n columns,\n rows,\n totalItems,\n currentPage: effectivePage,\n totalPages,\n pageSize,\n pageSizeOptions,\n onPageChange,\n onPageSizeChange,\n sortKey,\n sortDirection,\n onSort,\n searchTerm,\n onSearchChange,\n filterValues,\n setFilterValue,\n clearFilters,\n activeFilterCount,\n selection,\n }\n}\n"],"mappings":"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"}
|
package/dist/tabs.d.ts
CHANGED
|
@@ -1,49 +1,60 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as
|
|
3
|
-
import { Tabs } from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as react_jsx_runtime120 from "react/jsx-runtime";
|
|
3
|
+
import { Tabs } from "@base-ui/react/tabs";
|
|
4
|
+
|
|
5
|
+
//#region src/components/tabs.d.ts
|
|
6
|
+
type TabsRootProps = React.ComponentProps<typeof Tabs.Root>;
|
|
7
|
+
declare const TabsRoot: {
|
|
8
|
+
({
|
|
9
|
+
className,
|
|
10
|
+
...props
|
|
11
|
+
}: TabsRootProps): react_jsx_runtime120.JSX.Element;
|
|
12
|
+
displayName: string;
|
|
13
|
+
};
|
|
14
|
+
type TabsListProps = React.ComponentProps<typeof Tabs.List> & {
|
|
15
|
+
/** Orientation of the tabs list */
|
|
16
|
+
orientation?: 'horizontal' | 'vertical';
|
|
17
|
+
};
|
|
18
|
+
declare const TabsList: {
|
|
19
|
+
({
|
|
20
|
+
className,
|
|
21
|
+
orientation,
|
|
22
|
+
...props
|
|
23
|
+
}: TabsListProps): react_jsx_runtime120.JSX.Element;
|
|
24
|
+
displayName: string;
|
|
25
|
+
};
|
|
26
|
+
type TabsTabProps = React.ComponentProps<typeof Tabs.Tab> & {
|
|
27
|
+
/** Size of the tab */
|
|
28
|
+
size?: 'sm' | 'default' | 'lg';
|
|
29
|
+
};
|
|
30
|
+
declare const TabsTab: {
|
|
31
|
+
({
|
|
32
|
+
className,
|
|
33
|
+
size,
|
|
34
|
+
...props
|
|
35
|
+
}: TabsTabProps): react_jsx_runtime120.JSX.Element;
|
|
36
|
+
displayName: string;
|
|
37
|
+
};
|
|
38
|
+
type TabsIndicatorProps = React.ComponentProps<typeof Tabs.Indicator> & {
|
|
39
|
+
/** Orientation of the indicator (should match the tabs list orientation) */
|
|
40
|
+
orientation?: 'horizontal' | 'vertical';
|
|
41
|
+
};
|
|
42
|
+
declare const TabsIndicator: {
|
|
43
|
+
({
|
|
44
|
+
className,
|
|
45
|
+
orientation,
|
|
46
|
+
...props
|
|
47
|
+
}: TabsIndicatorProps): react_jsx_runtime120.JSX.Element;
|
|
48
|
+
displayName: string;
|
|
49
|
+
};
|
|
50
|
+
type TabsPanelProps = React.ComponentProps<typeof Tabs.Panel>;
|
|
51
|
+
declare const TabsPanel: {
|
|
52
|
+
({
|
|
53
|
+
className,
|
|
54
|
+
...props
|
|
55
|
+
}: TabsPanelProps): react_jsx_runtime120.JSX.Element;
|
|
56
|
+
displayName: string;
|
|
57
|
+
};
|
|
58
|
+
//#endregion
|
|
59
|
+
export { TabsIndicator, type TabsIndicatorProps, TabsList, type TabsListProps, TabsPanel, type TabsPanelProps, TabsRoot, type TabsRootProps, TabsTab, type TabsTabProps };
|
|
60
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","names":[],"sources":["../src/components/tabs.tsx"],"sourcesContent":[],"mappings":";;;;;KAYK,aAAA,GAAgB,KAAA,CAAM,sBAAsB,IAAA,CAAS;cAEpD;;;;KAAqC,gBAAa,oBAAA,CAAA,GAAA,CAAA;EAFnD,WAAA,EAAA,MAAa;CAAA;KA2Bb,aAAA,GAAgB,KAAA,CAAM,cA3B+B,CAAA,OA2BT,IAAA,CAAS,IA3BA,CAAA,GAAA;;EAAjB,WAAA,CAAA,EAAA,YAAA,GAAA,UAAA;AAAA,CAAA;cAgCnC,QA5BL,EAAA;;;;;KA4BsE,gBAAa,oBAAA,CAAA,GAAA,CAAA;aA9BzC,EAAA,MAAA;;KAoEtC,YAAA,GAAe,KAAA,CAAM,cApE8B,CAAA,OAoER,IAAA,CAAS,GApED,CAAA,GAAA;EAyBnD;EAAa,IAAA,CAAA,EAAA,IAAA,GAAA,SAAA,GAAA,IAAA;;cAgDZ,OAhDqB,EAAA;EAAc,CAAA;IAAA,SAAA;IAAA,IAAA;IAAA,GAAA;EAAA,CAAA,EAgDO,YAhDP,CAAA,EAgDmB,oBAAA,CAAA,GAAA,CAAA,OAhDnB;EAKnC,WAOL,EAAA,MAAA;CAAA;KA+DI,kBAAA,GAAqB,KAAA,CAAM,sBAAsB,IAAA,CAAS;;aAtEQ,CAAA,EAAA,YAAA,GAAA,UAAA;;cA2EjE,aA3E8E,EAAA;EAsC/E,CAAA;IAAA,SAAA;IAAA,WAAY;IAAA,GAAA;EAAA,CAAA,EAyCd,kBAzCc,CAAA,EAyCI,oBAAA,CAAA,GAAA,CAAA,OAzCJ;EAAA,WAAA,EAAA,MAAA;;KAwDZ,cAAA,GAAiB,KAAA,CAAM,cAxDF,CAAA,OAwDwB,IAAA,CAAS,KAxDjC,CAAA;cA0DpB,SA1DkC,EAAA;EAKlC,CAAA;IAAA,SAEL;IAAA,GAAA;EAAA,CAAA,EAmD2C,cAnD3C,CAAA,EAmDyD,oBAAA,CAAA,GAAA,CAAA,OAnDzD;EAAA,WAAA,EAAA,MAAA"}
|
package/dist/tabs.js
CHANGED
|
@@ -1,85 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
defaultVariants: {
|
|
18
|
-
orientation: "horizontal"
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
), c = ({ className: t, orientation: a = "horizontal", ...e }) => /* @__PURE__ */ o(
|
|
22
|
-
r.List,
|
|
23
|
-
{
|
|
24
|
-
className: i(l({ orientation: a }), t),
|
|
25
|
-
...e
|
|
26
|
-
}
|
|
27
|
-
);
|
|
28
|
-
c.displayName = "TabsList";
|
|
29
|
-
const d = s(
|
|
30
|
-
[
|
|
31
|
-
"relative z-10 inline-flex items-center justify-center whitespace-nowrap",
|
|
32
|
-
"rounded-md px-3 py-1.5 text-sm font-medium",
|
|
33
|
-
"transition-all duration-200",
|
|
34
|
-
"text-foreground/80",
|
|
35
|
-
"data-[active]:text-foreground",
|
|
36
|
-
"hover:text-foreground"
|
|
37
|
-
],
|
|
38
|
-
{
|
|
39
|
-
variants: {
|
|
40
|
-
size: {
|
|
41
|
-
sm: "px-2 py-1 text-xs",
|
|
42
|
-
default: "px-3 py-1.5 text-sm",
|
|
43
|
-
lg: "px-4 py-2 text-base"
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
defaultVariants: {
|
|
47
|
-
size: "default"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
), m = ({ className: t, size: a, ...e }) => /* @__PURE__ */ o(r.Tab, { className: i(d({ size: a }), t), ...e });
|
|
51
|
-
m.displayName = "TabsTab";
|
|
52
|
-
const b = s(
|
|
53
|
-
["absolute rounded-md bg-background shadow-sm", "transition-all duration-200 ease-out"],
|
|
54
|
-
{
|
|
55
|
-
variants: {
|
|
56
|
-
orientation: {
|
|
57
|
-
horizontal: "bottom-1 top-1 left-[var(--active-tab-left)] w-[var(--active-tab-width)]",
|
|
58
|
-
vertical: "left-1 right-1 top-[var(--active-tab-top)] h-[var(--active-tab-height)]"
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
defaultVariants: {
|
|
62
|
-
orientation: "horizontal"
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
), f = ({
|
|
66
|
-
className: t,
|
|
67
|
-
orientation: a = "horizontal",
|
|
68
|
-
...e
|
|
69
|
-
}) => /* @__PURE__ */ o(
|
|
70
|
-
r.Indicator,
|
|
71
|
-
{
|
|
72
|
-
className: i(b({ orientation: a }), t),
|
|
73
|
-
...e
|
|
74
|
-
}
|
|
75
|
-
);
|
|
76
|
-
f.displayName = "TabsIndicator";
|
|
77
|
-
const u = ({ className: t, ...a }) => /* @__PURE__ */ o(r.Panel, { className: i("mt-2 ring-offset-background", t), ...a });
|
|
78
|
-
u.displayName = "TabsPanel";
|
|
79
|
-
export {
|
|
80
|
-
f as TabsIndicator,
|
|
81
|
-
c as TabsList,
|
|
82
|
-
u as TabsPanel,
|
|
83
|
-
n as TabsRoot,
|
|
84
|
-
m as TabsTab
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { cn } from "./lib/utils.js";
|
|
4
|
+
import "react";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
import { Tabs } from "@base-ui/react/tabs";
|
|
8
|
+
|
|
9
|
+
//#region src/components/tabs.tsx
|
|
10
|
+
const TabsRoot = ({ className, ...props }) => {
|
|
11
|
+
return /* @__PURE__ */ jsx(Tabs.Root, {
|
|
12
|
+
className: cn("flex flex-col w-full", className),
|
|
13
|
+
...props
|
|
14
|
+
});
|
|
85
15
|
};
|
|
16
|
+
TabsRoot.displayName = "TabsRoot";
|
|
17
|
+
const tabsListVariants = cva(["relative inline-flex w-fit items-center gap-1", "rounded-lg bg-muted p-1"], {
|
|
18
|
+
variants: { orientation: {
|
|
19
|
+
horizontal: "flex-row",
|
|
20
|
+
vertical: "flex-col"
|
|
21
|
+
} },
|
|
22
|
+
defaultVariants: { orientation: "horizontal" }
|
|
23
|
+
});
|
|
24
|
+
const TabsList = ({ className, orientation = "horizontal", ...props }) => {
|
|
25
|
+
return /* @__PURE__ */ jsx(Tabs.List, {
|
|
26
|
+
className: cn(tabsListVariants({ orientation }), className),
|
|
27
|
+
...props
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
TabsList.displayName = "TabsList";
|
|
31
|
+
const tabsTabVariants = cva([
|
|
32
|
+
"relative z-10 inline-flex items-center justify-center whitespace-nowrap",
|
|
33
|
+
"rounded-md px-3 py-1.5 text-sm font-medium",
|
|
34
|
+
"transition-all duration-200",
|
|
35
|
+
"text-foreground/80",
|
|
36
|
+
"data-[active]:text-foreground",
|
|
37
|
+
"hover:text-foreground"
|
|
38
|
+
], {
|
|
39
|
+
variants: { size: {
|
|
40
|
+
sm: "px-2 py-1 text-xs",
|
|
41
|
+
default: "px-3 py-1.5 text-sm",
|
|
42
|
+
lg: "px-4 py-2 text-base"
|
|
43
|
+
} },
|
|
44
|
+
defaultVariants: { size: "default" }
|
|
45
|
+
});
|
|
46
|
+
const TabsTab = ({ className, size, ...props }) => {
|
|
47
|
+
return /* @__PURE__ */ jsx(Tabs.Tab, {
|
|
48
|
+
className: cn(tabsTabVariants({ size }), className),
|
|
49
|
+
...props
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
TabsTab.displayName = "TabsTab";
|
|
53
|
+
const tabsIndicatorVariants = cva(["absolute rounded-md bg-background shadow-sm", "transition-all duration-200 ease-out"], {
|
|
54
|
+
variants: { orientation: {
|
|
55
|
+
horizontal: "bottom-1 top-1 left-[var(--active-tab-left)] w-[var(--active-tab-width)]",
|
|
56
|
+
vertical: "left-1 right-1 top-[var(--active-tab-top)] h-[var(--active-tab-height)]"
|
|
57
|
+
} },
|
|
58
|
+
defaultVariants: { orientation: "horizontal" }
|
|
59
|
+
});
|
|
60
|
+
const TabsIndicator = ({ className, orientation = "horizontal", ...props }) => {
|
|
61
|
+
return /* @__PURE__ */ jsx(Tabs.Indicator, {
|
|
62
|
+
className: cn(tabsIndicatorVariants({ orientation }), className),
|
|
63
|
+
...props
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
TabsIndicator.displayName = "TabsIndicator";
|
|
67
|
+
const TabsPanel = ({ className, ...props }) => {
|
|
68
|
+
return /* @__PURE__ */ jsx(Tabs.Panel, {
|
|
69
|
+
className: cn("mt-2 ring-offset-background", className),
|
|
70
|
+
...props
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
TabsPanel.displayName = "TabsPanel";
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { TabsIndicator, TabsList, TabsPanel, TabsRoot, TabsTab };
|
|
77
|
+
//# sourceMappingURL=tabs.js.map
|
package/dist/tabs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","names":["BaseTabs"],"sources":["../src/components/tabs.tsx"],"sourcesContent":["'use client'\n\nimport { Tabs as BaseTabs } from '@base-ui/react/tabs'\nimport { cva } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\n// ============================================================================\n// TabsRoot\n// ============================================================================\n\ntype TabsRootProps = React.ComponentProps<typeof BaseTabs.Root>\n\nconst TabsRoot = ({ className, ...props }: TabsRootProps) => {\n return <BaseTabs.Root className={cn('flex flex-col w-full', className)} {...props} />\n}\n\nTabsRoot.displayName = 'TabsRoot'\n\n// ============================================================================\n// TabsList\n// ============================================================================\n\nconst tabsListVariants = cva(\n ['relative inline-flex w-fit items-center gap-1', 'rounded-lg bg-muted p-1'],\n {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n },\n)\n\ntype TabsListProps = React.ComponentProps<typeof BaseTabs.List> & {\n /** Orientation of the tabs list */\n orientation?: 'horizontal' | 'vertical'\n}\n\nconst TabsList = ({ className, orientation = 'horizontal', ...props }: TabsListProps) => {\n return (\n <BaseTabs.List\n className={cn(tabsListVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nTabsList.displayName = 'TabsList'\n\n// ============================================================================\n// TabsTab\n// ============================================================================\n\nconst tabsTabVariants = cva(\n [\n 'relative z-10 inline-flex items-center justify-center whitespace-nowrap',\n 'rounded-md px-3 py-1.5 text-sm font-medium',\n 'transition-all duration-200',\n 'text-foreground/80',\n 'data-[active]:text-foreground',\n 'hover:text-foreground',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 py-1 text-xs',\n default: 'px-3 py-1.5 text-sm',\n lg: 'px-4 py-2 text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n },\n)\n\ntype TabsTabProps = React.ComponentProps<typeof BaseTabs.Tab> & {\n /** Size of the tab */\n size?: 'sm' | 'default' | 'lg'\n}\n\nconst TabsTab = ({ className, size, ...props }: TabsTabProps) => {\n return <BaseTabs.Tab className={cn(tabsTabVariants({ size }), className)} {...props} />\n}\n\nTabsTab.displayName = 'TabsTab'\n\n// ============================================================================\n// TabsIndicator\n// ============================================================================\n\nconst tabsIndicatorVariants = cva(\n ['absolute rounded-md bg-background shadow-sm', 'transition-all duration-200 ease-out'],\n {\n variants: {\n orientation: {\n horizontal:\n 'bottom-1 top-1 left-[var(--active-tab-left)] w-[var(--active-tab-width)]',\n vertical:\n 'left-1 right-1 top-[var(--active-tab-top)] h-[var(--active-tab-height)]',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n },\n)\n\ntype TabsIndicatorProps = React.ComponentProps<typeof BaseTabs.Indicator> & {\n /** Orientation of the indicator (should match the tabs list orientation) */\n orientation?: 'horizontal' | 'vertical'\n}\n\nconst TabsIndicator = ({\n className,\n orientation = 'horizontal',\n ...props\n}: TabsIndicatorProps) => {\n return (\n <BaseTabs.Indicator\n className={cn(tabsIndicatorVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nTabsIndicator.displayName = 'TabsIndicator'\n\n// ============================================================================\n// TabsPanel\n// ============================================================================\n\ntype TabsPanelProps = React.ComponentProps<typeof BaseTabs.Panel>\n\nconst TabsPanel = ({ className, ...props }: TabsPanelProps) => {\n return (\n <BaseTabs.Panel className={cn('mt-2 ring-offset-background', className)} {...props} />\n )\n}\n\nTabsPanel.displayName = 'TabsPanel'\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { TabsRoot, TabsList, TabsTab, TabsIndicator, TabsPanel }\n\nexport type {\n TabsRootProps,\n TabsListProps,\n TabsTabProps,\n TabsIndicatorProps,\n TabsPanelProps,\n}\n"],"mappings":";;;;;;;;;AAcA,MAAM,YAAY,EAAE,WAAW,GAAG,YAA2B;AAC3D,QAAO,oBAACA,KAAS;EAAK,WAAW,GAAG,wBAAwB,UAAU;EAAE,GAAI;GAAS;;AAGvF,SAAS,cAAc;AAMvB,MAAM,mBAAmB,IACvB,CAAC,iDAAiD,0BAA0B,EAC5E;CACE,UAAU,EACR,aAAa;EACX,YAAY;EACZ,UAAU;EACX,EACF;CACD,iBAAiB,EACf,aAAa,cACd;CACF,CACF;AAOD,MAAM,YAAY,EAAE,WAAW,cAAc,cAAc,GAAG,YAA2B;AACvF,QACE,oBAACA,KAAS;EACR,WAAW,GAAG,iBAAiB,EAAE,aAAa,CAAC,EAAE,UAAU;EAC3D,GAAI;GACJ;;AAIN,SAAS,cAAc;AAMvB,MAAM,kBAAkB,IACtB;CACE;CACA;CACA;CACA;CACA;CACA;CACD,EACD;CACE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,SAAS;EACT,IAAI;EACL,EACF;CACD,iBAAiB,EACf,MAAM,WACP;CACF,CACF;AAOD,MAAM,WAAW,EAAE,WAAW,MAAM,GAAG,YAA0B;AAC/D,QAAO,oBAACA,KAAS;EAAI,WAAW,GAAG,gBAAgB,EAAE,MAAM,CAAC,EAAE,UAAU;EAAE,GAAI;GAAS;;AAGzF,QAAQ,cAAc;AAMtB,MAAM,wBAAwB,IAC5B,CAAC,+CAA+C,uCAAuC,EACvF;CACE,UAAU,EACR,aAAa;EACX,YACE;EACF,UACE;EACH,EACF;CACD,iBAAiB,EACf,aAAa,cACd;CACF,CACF;AAOD,MAAM,iBAAiB,EACrB,WACA,cAAc,cACd,GAAG,YACqB;AACxB,QACE,oBAACA,KAAS;EACR,WAAW,GAAG,sBAAsB,EAAE,aAAa,CAAC,EAAE,UAAU;EAChE,GAAI;GACJ;;AAIN,cAAc,cAAc;AAQ5B,MAAM,aAAa,EAAE,WAAW,GAAG,YAA4B;AAC7D,QACE,oBAACA,KAAS;EAAM,WAAW,GAAG,+BAA+B,UAAU;EAAE,GAAI;GAAS;;AAI1F,UAAU,cAAc"}
|
package/dist/textarea.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as react_jsx_runtime125 from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/components/textarea.d.ts
|
|
5
|
+
type TextareaProps = React.ComponentProps<'textarea'>;
|
|
6
|
+
declare const Textarea: {
|
|
7
|
+
({
|
|
8
|
+
className,
|
|
9
|
+
...props
|
|
10
|
+
}: TextareaProps): react_jsx_runtime125.JSX.Element;
|
|
11
|
+
displayName: string;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { Textarea, type TextareaProps };
|
|
15
|
+
//# sourceMappingURL=textarea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.d.ts","names":[],"sources":["../src/components/textarea.tsx"],"sourcesContent":[],"mappings":";;;;KAOK,aAAA,GAAgB,KAAA,CAAM;cAErB;;;;KAAqC,gBAAa,oBAAA,CAAA,GAAA,CAAA;EAFnD,WAAA,EAAA,MAAa;AAAuB,CAAA"}
|
package/dist/textarea.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
m as Textarea
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { cn } from "./lib/utils.js";
|
|
4
|
+
import { inputBaseStyles } from "./lib/form-variants.js";
|
|
5
|
+
import "react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
|
|
8
|
+
//#region src/components/textarea.tsx
|
|
9
|
+
const Textarea = ({ className, ...props }) => {
|
|
10
|
+
return /* @__PURE__ */ jsx("textarea", {
|
|
11
|
+
className: cn(inputBaseStyles, "h-auto min-h-20 py-2", className),
|
|
12
|
+
...props
|
|
13
|
+
});
|
|
15
14
|
};
|
|
15
|
+
Textarea.displayName = "Textarea";
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { Textarea };
|
|
19
|
+
//# sourceMappingURL=textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.js","names":[],"sources":["../src/components/textarea.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { inputBaseStyles } from '../lib/form-variants'\nimport { cn } from '../lib/utils'\n\ntype TextareaProps = React.ComponentProps<'textarea'>\n\nconst Textarea = ({ className, ...props }: TextareaProps) => {\n return (\n <textarea\n className={cn(inputBaseStyles, 'h-auto min-h-20 py-2', className)}\n {...props}\n />\n )\n}\n\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n\nexport type { TextareaProps }\n"],"mappings":";;;;;;;;AASA,MAAM,YAAY,EAAE,WAAW,GAAG,YAA2B;AAC3D,QACE,oBAAC;EACC,WAAW,GAAG,iBAAiB,wBAAwB,UAAU;EACjE,GAAI;GACJ;;AAIN,SAAS,cAAc"}
|