@zentauri-ui/zentauri-components 2.1.5 → 2.1.7
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/README.md +12 -8
- package/cli/cli.integration.test.ts +36 -0
- package/cli/index.mjs +91 -12
- package/cli/index.test.ts +180 -0
- package/cli/props.json +609 -14
- package/cli/registry.json +22 -0
- package/cli/rewrite-imports.mjs +29 -4
- package/cli/rewrite-imports.test.ts +35 -0
- package/dist/{chunk-RENXBUZY.js → chunk-5ELR6MIN.js} +6 -6
- package/dist/{chunk-RENXBUZY.js.map → chunk-5ELR6MIN.js.map} +1 -1
- package/dist/chunk-5FU57ZVQ.js +19 -0
- package/dist/{chunk-D2GISTDL.js.map → chunk-5FU57ZVQ.js.map} +1 -1
- package/dist/chunk-74SKXGTM.js +4 -0
- package/dist/chunk-74SKXGTM.js.map +1 -0
- package/dist/{chunk-WBZKMSXW.mjs → chunk-7UXPXCKV.mjs} +3 -3
- package/dist/{chunk-WBZKMSXW.mjs.map → chunk-7UXPXCKV.mjs.map} +1 -1
- package/dist/chunk-COCPCZMR.mjs +77 -0
- package/dist/chunk-COCPCZMR.mjs.map +1 -0
- package/dist/chunk-CYKSS5S5.mjs +128 -0
- package/dist/chunk-CYKSS5S5.mjs.map +1 -0
- package/dist/chunk-DBNGLT5U.mjs +221 -0
- package/dist/chunk-DBNGLT5U.mjs.map +1 -0
- package/dist/{chunk-BL6UVCV7.mjs → chunk-FUCW5GPE.mjs} +36 -11
- package/dist/chunk-FUCW5GPE.mjs.map +1 -0
- package/dist/chunk-G7FVHZRB.js +225 -0
- package/dist/chunk-G7FVHZRB.js.map +1 -0
- package/dist/chunk-HMDH4BQJ.js +123 -0
- package/dist/chunk-HMDH4BQJ.js.map +1 -0
- package/dist/chunk-I7EBE7BD.js +98 -0
- package/dist/chunk-I7EBE7BD.js.map +1 -0
- package/dist/{chunk-PAG5CTLN.mjs → chunk-KVSRUAXP.mjs} +3 -3
- package/dist/{chunk-PAG5CTLN.mjs.map → chunk-KVSRUAXP.mjs.map} +1 -1
- package/dist/chunk-LHBJD57K.mjs +143 -0
- package/dist/chunk-LHBJD57K.mjs.map +1 -0
- package/dist/chunk-OYAJG2BO.js +83 -0
- package/dist/chunk-OYAJG2BO.js.map +1 -0
- package/dist/chunk-PG7LQVU6.js +86 -0
- package/dist/chunk-PG7LQVU6.js.map +1 -0
- package/dist/chunk-PTU5ZAYX.js +145 -0
- package/dist/chunk-PTU5ZAYX.js.map +1 -0
- package/dist/chunk-QKO5DA4N.mjs +81 -0
- package/dist/chunk-QKO5DA4N.mjs.map +1 -0
- package/dist/chunk-T7PIKDUZ.js +130 -0
- package/dist/chunk-T7PIKDUZ.js.map +1 -0
- package/dist/chunk-TDK5TVJE.mjs +3 -0
- package/dist/chunk-TDK5TVJE.mjs.map +1 -0
- package/dist/{chunk-NZSZE36T.js → chunk-TJ2EWPER.js} +42 -10
- package/dist/chunk-TJ2EWPER.js.map +1 -0
- package/dist/chunk-VBNW2B4D.mjs +3 -0
- package/dist/chunk-VBNW2B4D.mjs.map +1 -0
- package/dist/chunk-W6DO36XD.mjs +96 -0
- package/dist/chunk-W6DO36XD.mjs.map +1 -0
- package/dist/chunk-XR3J46TZ.js +4 -0
- package/dist/chunk-XR3J46TZ.js.map +1 -0
- package/dist/chunk-ZOHCADDL.mjs +121 -0
- package/dist/chunk-ZOHCADDL.mjs.map +1 -0
- package/dist/design-system/audio-player.d.ts +61 -0
- package/dist/design-system/audio-player.d.ts.map +1 -0
- package/dist/design-system/data-table.d.ts +8 -0
- package/dist/design-system/data-table.d.ts.map +1 -0
- package/dist/design-system/facade.js +11 -10
- package/dist/design-system/facade.js.map +1 -1
- package/dist/design-system/facade.mjs +10 -9
- package/dist/design-system/facade.mjs.map +1 -1
- package/dist/design-system/index.d.ts +2 -0
- package/dist/design-system/index.d.ts.map +1 -1
- package/dist/hooks/useTableFilter.js +6 -116
- package/dist/hooks/useTableFilter.js.map +1 -1
- package/dist/hooks/useTableFilter.mjs +1 -118
- package/dist/hooks/useTableFilter.mjs.map +1 -1
- package/dist/hooks/useTableSort.js +6 -91
- package/dist/hooks/useTableSort.js.map +1 -1
- package/dist/hooks/useTableSort.mjs +1 -93
- package/dist/hooks/useTableSort.mjs.map +1 -1
- package/dist/hooks/useVirtualList.js +6 -76
- package/dist/hooks/useVirtualList.js.map +1 -1
- package/dist/hooks/useVirtualList.mjs +1 -78
- package/dist/hooks/useVirtualList.mjs.map +1 -1
- package/dist/ui/audio-player/audio-player-base.d.ts +20 -0
- package/dist/ui/audio-player/audio-player-base.d.ts.map +1 -0
- package/dist/ui/audio-player/audio-player.d.ts +6 -0
- package/dist/ui/audio-player/audio-player.d.ts.map +1 -0
- package/dist/ui/audio-player/index.d.ts +5 -0
- package/dist/ui/audio-player/index.d.ts.map +1 -0
- package/dist/ui/audio-player/types.d.ts +44 -0
- package/dist/ui/audio-player/types.d.ts.map +1 -0
- package/dist/ui/audio-player/variants.d.ts +12 -0
- package/dist/ui/audio-player/variants.d.ts.map +1 -0
- package/dist/ui/audio-player.js +556 -0
- package/dist/ui/audio-player.js.map +1 -0
- package/dist/ui/audio-player.mjs +545 -0
- package/dist/ui/audio-player.mjs.map +1 -0
- package/dist/ui/buttons/animated.js +13 -12
- package/dist/ui/buttons/animated.js.map +1 -1
- package/dist/ui/buttons/animated.mjs +11 -10
- package/dist/ui/buttons/animated.mjs.map +1 -1
- package/dist/ui/buttons.js +15 -13
- package/dist/ui/buttons.mjs +13 -11
- package/dist/ui/checkbox.js +7 -123
- package/dist/ui/checkbox.js.map +1 -1
- package/dist/ui/checkbox.mjs +2 -126
- package/dist/ui/checkbox.mjs.map +1 -1
- package/dist/ui/data-table/data-table-base.d.ts +6 -0
- package/dist/ui/data-table/data-table-base.d.ts.map +1 -0
- package/dist/ui/data-table/data-table.d.ts +6 -0
- package/dist/ui/data-table/data-table.d.ts.map +1 -0
- package/dist/ui/data-table/index.d.ts +4 -0
- package/dist/ui/data-table/index.d.ts.map +1 -0
- package/dist/ui/data-table/types.d.ts +92 -0
- package/dist/ui/data-table/types.d.ts.map +1 -0
- package/dist/ui/data-table/variants.d.ts +8 -0
- package/dist/ui/data-table/variants.d.ts.map +1 -0
- package/dist/ui/data-table.js +620 -0
- package/dist/ui/data-table.js.map +1 -0
- package/dist/ui/data-table.mjs +611 -0
- package/dist/ui/data-table.mjs.map +1 -0
- package/dist/ui/dynamic-stepper.js +23 -22
- package/dist/ui/dynamic-stepper.js.map +1 -1
- package/dist/ui/dynamic-stepper.mjs +12 -11
- package/dist/ui/dynamic-stepper.mjs.map +1 -1
- package/dist/ui/inputs.js +7 -138
- package/dist/ui/inputs.js.map +1 -1
- package/dist/ui/inputs.mjs +2 -141
- package/dist/ui/inputs.mjs.map +1 -1
- package/dist/ui/pagination.js +25 -225
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/pagination.mjs +13 -227
- package/dist/ui/pagination.mjs.map +1 -1
- package/dist/ui/table.js +1 -0
- package/dist/ui/table.mjs +1 -0
- package/package.json +1 -1
- package/src/design-system/audio-player.ts +109 -0
- package/src/design-system/data-table.ts +20 -0
- package/src/design-system/index.ts +2 -0
- package/src/ui/audio-player/audio-player-base.tsx +557 -0
- package/src/ui/audio-player/audio-player.test.tsx +485 -0
- package/src/ui/audio-player/audio-player.tsx +8 -0
- package/src/ui/audio-player/index.ts +24 -0
- package/src/ui/audio-player/types.ts +57 -0
- package/src/ui/audio-player/variants.ts +43 -0
- package/src/ui/data-table/data-table-base.tsx +701 -0
- package/src/ui/data-table/data-table.test.tsx +389 -0
- package/src/ui/data-table/data-table.tsx +11 -0
- package/src/ui/data-table/index.ts +24 -0
- package/src/ui/data-table/types.ts +121 -0
- package/src/ui/data-table/variants.ts +21 -0
- package/dist/chunk-BL6UVCV7.mjs.map +0 -1
- package/dist/chunk-D2GISTDL.js +0 -19
- package/dist/chunk-NZSZE36T.js.map +0 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useTableFilter/useTableFilter.ts
|
|
6
|
+
function normalizeFilters(filters) {
|
|
7
|
+
if (!filters || typeof filters !== "object") {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
return Object.fromEntries(
|
|
11
|
+
Object.entries(filters).filter(
|
|
12
|
+
(entry) => typeof entry[1] === "string" && entry[1].trim().length > 0
|
|
13
|
+
)
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
function defaultColumnValue(row, filterKey) {
|
|
17
|
+
if (row && typeof row === "object" && filterKey in row) {
|
|
18
|
+
return row[filterKey];
|
|
19
|
+
}
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
function useTableFilter({
|
|
23
|
+
data,
|
|
24
|
+
filters,
|
|
25
|
+
defaultFilters = {},
|
|
26
|
+
onFiltersChange,
|
|
27
|
+
getColumnValue = defaultColumnValue,
|
|
28
|
+
filterPredicate
|
|
29
|
+
}) {
|
|
30
|
+
const [internalFilters, setInternalFilters] = react.useState(() => normalizeFilters(defaultFilters));
|
|
31
|
+
const isControlled = filters !== void 0;
|
|
32
|
+
const currentFilters = react.useMemo(
|
|
33
|
+
() => normalizeFilters(isControlled ? filters : internalFilters),
|
|
34
|
+
[filters, internalFilters, isControlled]
|
|
35
|
+
);
|
|
36
|
+
const setFilters = react.useCallback(
|
|
37
|
+
(nextFilters) => {
|
|
38
|
+
const normalized = normalizeFilters(nextFilters);
|
|
39
|
+
if (!isControlled) {
|
|
40
|
+
setInternalFilters(normalized);
|
|
41
|
+
}
|
|
42
|
+
onFiltersChange?.(normalized);
|
|
43
|
+
},
|
|
44
|
+
[isControlled, onFiltersChange]
|
|
45
|
+
);
|
|
46
|
+
const updateFilters = react.useCallback(
|
|
47
|
+
(updater) => {
|
|
48
|
+
if (isControlled) {
|
|
49
|
+
const normalized = normalizeFilters(updater(currentFilters));
|
|
50
|
+
onFiltersChange?.(normalized);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
setInternalFilters((previousFilters) => {
|
|
54
|
+
const normalized = normalizeFilters(updater(previousFilters));
|
|
55
|
+
onFiltersChange?.(normalized);
|
|
56
|
+
return normalized;
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
[currentFilters, isControlled, onFiltersChange]
|
|
60
|
+
);
|
|
61
|
+
const setFilter = react.useCallback(
|
|
62
|
+
(filterKey, value) => {
|
|
63
|
+
updateFilters((previousFilters) => ({
|
|
64
|
+
...previousFilters,
|
|
65
|
+
[filterKey]: value
|
|
66
|
+
}));
|
|
67
|
+
},
|
|
68
|
+
[updateFilters]
|
|
69
|
+
);
|
|
70
|
+
const clearFilter = react.useCallback(
|
|
71
|
+
(filterKey) => {
|
|
72
|
+
updateFilters((previousFilters) => {
|
|
73
|
+
const nextFilters = { ...previousFilters };
|
|
74
|
+
delete nextFilters[filterKey];
|
|
75
|
+
return nextFilters;
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
[updateFilters]
|
|
79
|
+
);
|
|
80
|
+
const clearFilters = react.useCallback(() => {
|
|
81
|
+
setFilters({});
|
|
82
|
+
}, [setFilters]);
|
|
83
|
+
const activeFilters = react.useMemo(
|
|
84
|
+
() => Object.entries(currentFilters).map(
|
|
85
|
+
([filterKey, filterValue]) => ({
|
|
86
|
+
filterKey,
|
|
87
|
+
filterValue,
|
|
88
|
+
lowerFilterValue: filterValue.toLowerCase()
|
|
89
|
+
})
|
|
90
|
+
),
|
|
91
|
+
[currentFilters]
|
|
92
|
+
);
|
|
93
|
+
const filteredData = react.useMemo(() => {
|
|
94
|
+
if (activeFilters.length === 0) {
|
|
95
|
+
return [...data];
|
|
96
|
+
}
|
|
97
|
+
return data.filter(
|
|
98
|
+
(row) => activeFilters.every(({ filterKey, filterValue, lowerFilterValue }) => {
|
|
99
|
+
if (filterPredicate) {
|
|
100
|
+
return filterPredicate(row, filterValue, filterKey);
|
|
101
|
+
}
|
|
102
|
+
const columnValue = getColumnValue(row, filterKey);
|
|
103
|
+
if (columnValue == null) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return String(columnValue).toLowerCase().includes(lowerFilterValue);
|
|
107
|
+
})
|
|
108
|
+
);
|
|
109
|
+
}, [activeFilters, data, filterPredicate, getColumnValue]);
|
|
110
|
+
return {
|
|
111
|
+
filters: currentFilters,
|
|
112
|
+
filteredData,
|
|
113
|
+
hasActiveFilters: activeFilters.length > 0,
|
|
114
|
+
setFilter,
|
|
115
|
+
setFilters,
|
|
116
|
+
clearFilter,
|
|
117
|
+
clearFilters
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
exports.useTableFilter = useTableFilter;
|
|
122
|
+
//# sourceMappingURL=chunk-HMDH4BQJ.js.map
|
|
123
|
+
//# sourceMappingURL=chunk-HMDH4BQJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useTableFilter/useTableFilter.ts"],"names":["useState","useMemo","useCallback"],"mappings":"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","file":"chunk-HMDH4BQJ.js","sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport type {\n TableFilterState,\n UseTableFilterParams,\n UseTableFilterResult,\n} from \"./types\";\n\nfunction normalizeFilters<TKey extends string>(\n filters: TableFilterState<TKey> | null | undefined,\n): TableFilterState<TKey> {\n if (!filters || typeof filters !== \"object\") {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(filters).filter(\n (entry): entry is [TKey, string] =>\n typeof entry[1] === \"string\" && entry[1].trim().length > 0,\n ),\n ) as TableFilterState<TKey>;\n}\n\nfunction defaultColumnValue<TData, TKey extends string>(\n row: TData,\n filterKey: TKey,\n): unknown {\n if (row && typeof row === \"object\" && filterKey in row) {\n return (row as Record<TKey, unknown>)[filterKey];\n }\n return undefined;\n}\n\nexport function useTableFilter<TData, TKey extends string = string>({\n data,\n filters,\n defaultFilters = {},\n onFiltersChange,\n getColumnValue = defaultColumnValue,\n filterPredicate,\n}: UseTableFilterParams<TData, TKey>): UseTableFilterResult<TData, TKey> {\n const [internalFilters, setInternalFilters] = useState<\n TableFilterState<TKey>\n >(() => normalizeFilters(defaultFilters));\n\n const isControlled = filters !== undefined;\n const currentFilters = useMemo(\n () => normalizeFilters(isControlled ? filters : internalFilters),\n [filters, internalFilters, isControlled],\n );\n\n const setFilters = useCallback(\n (nextFilters: TableFilterState<TKey>) => {\n const normalized = normalizeFilters(nextFilters);\n if (!isControlled) {\n setInternalFilters(normalized);\n }\n onFiltersChange?.(normalized);\n },\n [isControlled, onFiltersChange],\n );\n\n const updateFilters = useCallback(\n (\n updater: (\n previousFilters: TableFilterState<TKey>,\n ) => TableFilterState<TKey>,\n ) => {\n if (isControlled) {\n const normalized = normalizeFilters(updater(currentFilters));\n onFiltersChange?.(normalized);\n return;\n }\n\n setInternalFilters((previousFilters) => {\n const normalized = normalizeFilters(updater(previousFilters));\n onFiltersChange?.(normalized);\n return normalized;\n });\n },\n [currentFilters, isControlled, onFiltersChange],\n );\n\n const setFilter = useCallback(\n (filterKey: TKey, value: string) => {\n updateFilters((previousFilters) => ({\n ...previousFilters,\n [filterKey]: value,\n }));\n },\n [updateFilters],\n );\n\n const clearFilter = useCallback(\n (filterKey: TKey) => {\n updateFilters((previousFilters) => {\n const nextFilters = { ...previousFilters };\n delete nextFilters[filterKey];\n return nextFilters;\n });\n },\n [updateFilters],\n );\n\n const clearFilters = useCallback(() => {\n setFilters({});\n }, [setFilters]);\n\n const activeFilters = useMemo(\n () =>\n (Object.entries(currentFilters) as [TKey, string][]).map(\n ([filterKey, filterValue]) => ({\n filterKey,\n filterValue,\n lowerFilterValue: filterValue.toLowerCase(),\n }),\n ),\n [currentFilters],\n );\n\n const filteredData = useMemo(() => {\n if (activeFilters.length === 0) {\n return [...data];\n }\n\n return data.filter((row) =>\n activeFilters.every(({ filterKey, filterValue, lowerFilterValue }) => {\n if (filterPredicate) {\n return filterPredicate(row, filterValue, filterKey);\n }\n\n const columnValue = getColumnValue(row, filterKey);\n if (columnValue == null) {\n return false;\n }\n\n return String(columnValue).toLowerCase().includes(lowerFilterValue);\n }),\n );\n }, [activeFilters, data, filterPredicate, getColumnValue]);\n\n return {\n filters: currentFilters,\n filteredData,\n hasActiveFilters: activeFilters.length > 0,\n setFilter,\n setFilters,\n clearFilter,\n clearFilters,\n };\n}\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useTableSort/useTableSort.ts
|
|
6
|
+
function nextSortDirection(currentDirection) {
|
|
7
|
+
if (currentDirection === "ascending") {
|
|
8
|
+
return "descending";
|
|
9
|
+
}
|
|
10
|
+
if (currentDirection === "descending") {
|
|
11
|
+
return "none";
|
|
12
|
+
}
|
|
13
|
+
return "ascending";
|
|
14
|
+
}
|
|
15
|
+
function normalizeSortState(nextSort) {
|
|
16
|
+
if (!nextSort.sortKey || nextSort.sortDirection === "none") {
|
|
17
|
+
return { sortKey: void 0, sortDirection: "none" };
|
|
18
|
+
}
|
|
19
|
+
return nextSort;
|
|
20
|
+
}
|
|
21
|
+
function useTableSort({
|
|
22
|
+
sortKey,
|
|
23
|
+
defaultSortKey,
|
|
24
|
+
sortDirection,
|
|
25
|
+
defaultSortDirection = "none",
|
|
26
|
+
onSortChange
|
|
27
|
+
} = {}) {
|
|
28
|
+
const [internalSort, setInternalSort] = react.useState(
|
|
29
|
+
() => normalizeSortState({
|
|
30
|
+
sortKey: defaultSortKey,
|
|
31
|
+
sortDirection: defaultSortDirection
|
|
32
|
+
})
|
|
33
|
+
);
|
|
34
|
+
const isSortKeyControlled = sortKey !== void 0;
|
|
35
|
+
const isSortDirectionControlled = sortDirection !== void 0;
|
|
36
|
+
const currentSort = normalizeSortState({
|
|
37
|
+
sortKey: isSortKeyControlled ? sortKey : internalSort.sortKey,
|
|
38
|
+
sortDirection: isSortDirectionControlled ? sortDirection : internalSort.sortDirection
|
|
39
|
+
});
|
|
40
|
+
const setSort = react.useCallback(
|
|
41
|
+
(nextSort) => {
|
|
42
|
+
const normalized = normalizeSortState(nextSort);
|
|
43
|
+
if (!isSortKeyControlled || !isSortDirectionControlled) {
|
|
44
|
+
setInternalSort((previousSort) => ({
|
|
45
|
+
sortKey: isSortKeyControlled ? previousSort.sortKey : normalized.sortKey,
|
|
46
|
+
sortDirection: isSortDirectionControlled ? previousSort.sortDirection : normalized.sortDirection
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
onSortChange?.(normalized);
|
|
50
|
+
},
|
|
51
|
+
[isSortDirectionControlled, isSortKeyControlled, onSortChange]
|
|
52
|
+
);
|
|
53
|
+
const clearSort = react.useCallback(() => {
|
|
54
|
+
setSort({ sortKey: void 0, sortDirection: "none" });
|
|
55
|
+
}, [setSort]);
|
|
56
|
+
const toggleSort = react.useCallback(
|
|
57
|
+
(nextSortKey) => {
|
|
58
|
+
const direction = currentSort.sortKey === nextSortKey ? nextSortDirection(currentSort.sortDirection) : "ascending";
|
|
59
|
+
setSort({
|
|
60
|
+
sortKey: nextSortKey,
|
|
61
|
+
sortDirection: direction
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
[currentSort.sortDirection, currentSort.sortKey, setSort]
|
|
65
|
+
);
|
|
66
|
+
const getSortProps = react.useCallback(
|
|
67
|
+
(nextSortKey) => ({
|
|
68
|
+
sortKey: nextSortKey,
|
|
69
|
+
sortDirection: currentSort.sortKey === nextSortKey ? currentSort.sortDirection : "none",
|
|
70
|
+
onSortChange: (nextSort) => {
|
|
71
|
+
setSort(nextSort);
|
|
72
|
+
}
|
|
73
|
+
}),
|
|
74
|
+
[currentSort.sortDirection, currentSort.sortKey, setSort]
|
|
75
|
+
);
|
|
76
|
+
return react.useMemo(
|
|
77
|
+
() => ({
|
|
78
|
+
sortKey: currentSort.sortKey,
|
|
79
|
+
sortDirection: currentSort.sortDirection,
|
|
80
|
+
setSort,
|
|
81
|
+
clearSort,
|
|
82
|
+
toggleSort,
|
|
83
|
+
getSortProps
|
|
84
|
+
}),
|
|
85
|
+
[
|
|
86
|
+
clearSort,
|
|
87
|
+
currentSort.sortDirection,
|
|
88
|
+
currentSort.sortKey,
|
|
89
|
+
getSortProps,
|
|
90
|
+
setSort,
|
|
91
|
+
toggleSort
|
|
92
|
+
]
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
exports.useTableSort = useTableSort;
|
|
97
|
+
//# sourceMappingURL=chunk-I7EBE7BD.js.map
|
|
98
|
+
//# sourceMappingURL=chunk-I7EBE7BD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useTableSort/useTableSort.ts"],"names":["useState","useCallback","useMemo"],"mappings":"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","file":"chunk-I7EBE7BD.js","sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport type { TableSortDirection, TableSortState } from \"../../ui/table/types\";\nimport type { UseTableSortParams, UseTableSortResult } from \"./types\";\n\nfunction nextSortDirection(\n currentDirection: TableSortDirection,\n): TableSortDirection {\n if (currentDirection === \"ascending\") {\n return \"descending\";\n }\n if (currentDirection === \"descending\") {\n return \"none\";\n }\n return \"ascending\";\n}\n\nfunction normalizeSortState<TKey extends string>(\n nextSort: TableSortState<TKey>,\n): TableSortState<TKey> {\n if (!nextSort.sortKey || nextSort.sortDirection === \"none\") {\n return { sortKey: undefined, sortDirection: \"none\" };\n }\n return nextSort;\n}\n\nexport function useTableSort<TKey extends string = string>({\n sortKey,\n defaultSortKey,\n sortDirection,\n defaultSortDirection = \"none\",\n onSortChange,\n}: UseTableSortParams<TKey> = {}): UseTableSortResult<TKey> {\n const [internalSort, setInternalSort] = useState<TableSortState<TKey>>(() =>\n normalizeSortState({\n sortKey: defaultSortKey,\n sortDirection: defaultSortDirection,\n }),\n );\n\n const isSortKeyControlled = sortKey !== undefined;\n const isSortDirectionControlled = sortDirection !== undefined;\n const currentSort = normalizeSortState({\n sortKey: isSortKeyControlled ? sortKey : internalSort.sortKey,\n sortDirection: isSortDirectionControlled\n ? sortDirection\n : internalSort.sortDirection,\n });\n\n const setSort = useCallback(\n (nextSort: TableSortState<TKey>) => {\n const normalized = normalizeSortState(nextSort);\n if (!isSortKeyControlled || !isSortDirectionControlled) {\n setInternalSort((previousSort) => ({\n sortKey: isSortKeyControlled\n ? previousSort.sortKey\n : normalized.sortKey,\n sortDirection: isSortDirectionControlled\n ? previousSort.sortDirection\n : normalized.sortDirection,\n }));\n }\n onSortChange?.(normalized);\n },\n [isSortDirectionControlled, isSortKeyControlled, onSortChange],\n );\n\n const clearSort = useCallback(() => {\n setSort({ sortKey: undefined, sortDirection: \"none\" });\n }, [setSort]);\n\n const toggleSort = useCallback(\n (nextSortKey: TKey) => {\n const direction =\n currentSort.sortKey === nextSortKey\n ? nextSortDirection(currentSort.sortDirection)\n : \"ascending\";\n\n setSort({\n sortKey: nextSortKey,\n sortDirection: direction,\n });\n },\n [currentSort.sortDirection, currentSort.sortKey, setSort],\n );\n\n const getSortProps = useCallback(\n (nextSortKey: TKey) => ({\n sortKey: nextSortKey,\n sortDirection:\n currentSort.sortKey === nextSortKey\n ? currentSort.sortDirection\n : \"none\",\n onSortChange: (nextSort: TableSortState) => {\n setSort(nextSort as TableSortState<TKey>);\n },\n }),\n [currentSort.sortDirection, currentSort.sortKey, setSort],\n );\n\n return useMemo(\n () => ({\n sortKey: currentSort.sortKey,\n sortDirection: currentSort.sortDirection,\n setSort,\n clearSort,\n toggleSort,\n getSortProps,\n }),\n [\n clearSort,\n currentSort.sortDirection,\n currentSort.sortKey,\n getSortProps,\n setSort,\n toggleSort,\n ],\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { zuiButtonBase, zuiButtonSizes, zuiButtonAppearances } from './chunk-
|
|
1
|
+
import { zuiButtonBase, zuiButtonSizes, zuiButtonAppearances } from './chunk-FUCW5GPE.mjs';
|
|
2
2
|
import { cva } from 'class-variance-authority';
|
|
3
3
|
|
|
4
4
|
var buttonVariants = cva(zuiButtonBase, {
|
|
@@ -13,5 +13,5 @@ var buttonVariants = cva(zuiButtonBase, {
|
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
export { buttonVariants };
|
|
16
|
-
//# sourceMappingURL=chunk-
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
16
|
+
//# sourceMappingURL=chunk-KVSRUAXP.mjs.map
|
|
17
|
+
//# sourceMappingURL=chunk-KVSRUAXP.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/buttons/variants.ts"],"names":[],"mappings":";;;AAQO,IAAM,cAAA,GAAiB,IAAI,aAAA,EAAe;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,oBAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,UAAA,EAAY,SAAA;AAAA,IACZ,IAAA,EAAM;AAAA;AAEV,CAAC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/ui/buttons/variants.ts"],"names":[],"mappings":";;;AAQO,IAAM,cAAA,GAAiB,IAAI,aAAA,EAAe;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,oBAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,UAAA,EAAY,SAAA;AAAA,IACZ,IAAA,EAAM;AAAA;AAEV,CAAC","file":"chunk-KVSRUAXP.mjs","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nimport {\n zuiButtonAppearances,\n zuiButtonBase,\n zuiButtonSizes,\n} from \"../../design-system\";\n\nexport const buttonVariants = cva(zuiButtonBase, {\n variants: {\n appearance: zuiButtonAppearances,\n size: zuiButtonSizes,\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n },\n});\n"]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { inputVariants } from './chunk-O22T5X4G.mjs';
|
|
2
|
+
import { cn } from './chunk-4D54YOL6.mjs';
|
|
3
|
+
import { useId } from 'react';
|
|
4
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function mergeDescribedByIds(user, ...generated) {
|
|
7
|
+
const ids = [
|
|
8
|
+
...(user ?? "").split(/\s+/).filter(Boolean),
|
|
9
|
+
...generated.filter((id) => Boolean(id))
|
|
10
|
+
];
|
|
11
|
+
const unique = [...new Set(ids)];
|
|
12
|
+
return unique.length > 0 ? unique.join(" ") : void 0;
|
|
13
|
+
}
|
|
14
|
+
var InputBase = (props) => {
|
|
15
|
+
const generatedId = useId();
|
|
16
|
+
if (props.as === "textarea") {
|
|
17
|
+
const {
|
|
18
|
+
className: className2,
|
|
19
|
+
appearance: appearance2,
|
|
20
|
+
size: size2,
|
|
21
|
+
ring: ring2 = true,
|
|
22
|
+
ref: ref2,
|
|
23
|
+
"aria-invalid": ariaInvalidProp2,
|
|
24
|
+
errorMessage: errorMessage2,
|
|
25
|
+
hint: hint2,
|
|
26
|
+
label: label2,
|
|
27
|
+
id: id2,
|
|
28
|
+
as: as2,
|
|
29
|
+
"aria-describedby": ariaDescribedByUser2,
|
|
30
|
+
...rest2
|
|
31
|
+
} = props;
|
|
32
|
+
const controlId2 = id2 ?? generatedId;
|
|
33
|
+
const errorId2 = `${controlId2}-error`;
|
|
34
|
+
const hintId2 = `${controlId2}-hint`;
|
|
35
|
+
const ariaInvalid2 = ariaInvalidProp2 !== void 0 ? ariaInvalidProp2 : appearance2 === "error" ? true : void 0;
|
|
36
|
+
const describedBy2 = mergeDescribedByIds(
|
|
37
|
+
ariaDescribedByUser2,
|
|
38
|
+
hint2 !== void 0 ? hintId2 : void 0,
|
|
39
|
+
errorMessage2 && appearance2 === "error" ? errorId2 : void 0
|
|
40
|
+
);
|
|
41
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
42
|
+
label2 !== void 0 && /* @__PURE__ */ jsx(
|
|
43
|
+
"label",
|
|
44
|
+
{
|
|
45
|
+
htmlFor: controlId2,
|
|
46
|
+
className: "mb-1 block text-sm font-medium text-slate-200",
|
|
47
|
+
children: label2
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
hint2 !== void 0 && /* @__PURE__ */ jsx("p", { id: hintId2, className: "mb-1 text-xs text-slate-400", children: hint2 }),
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
"textarea",
|
|
53
|
+
{
|
|
54
|
+
ref: ref2,
|
|
55
|
+
id: controlId2,
|
|
56
|
+
"data-slot": "input",
|
|
57
|
+
className: cn(
|
|
58
|
+
inputVariants({ appearance: appearance2, size: size2, ring: ring2, as: as2 }),
|
|
59
|
+
className2
|
|
60
|
+
),
|
|
61
|
+
"aria-invalid": ariaInvalid2,
|
|
62
|
+
"aria-describedby": describedBy2,
|
|
63
|
+
...rest2
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
errorMessage2 && appearance2 === "error" && /* @__PURE__ */ jsx(
|
|
67
|
+
"p",
|
|
68
|
+
{
|
|
69
|
+
id: errorId2,
|
|
70
|
+
className: "mt-2 pl-4 text-sm text-rose-500 wrap-break-word",
|
|
71
|
+
children: errorMessage2
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
] });
|
|
75
|
+
}
|
|
76
|
+
const {
|
|
77
|
+
className,
|
|
78
|
+
appearance,
|
|
79
|
+
size,
|
|
80
|
+
ring = true,
|
|
81
|
+
ref,
|
|
82
|
+
"aria-invalid": ariaInvalidProp,
|
|
83
|
+
errorMessage,
|
|
84
|
+
hint,
|
|
85
|
+
label,
|
|
86
|
+
id,
|
|
87
|
+
as,
|
|
88
|
+
"aria-describedby": ariaDescribedByUser,
|
|
89
|
+
...rest
|
|
90
|
+
} = props;
|
|
91
|
+
const controlId = id ?? generatedId;
|
|
92
|
+
const errorId = `${controlId}-error`;
|
|
93
|
+
const hintId = `${controlId}-hint`;
|
|
94
|
+
const ariaInvalid = ariaInvalidProp !== void 0 ? ariaInvalidProp : appearance === "error" ? true : void 0;
|
|
95
|
+
const describedBy = mergeDescribedByIds(
|
|
96
|
+
ariaDescribedByUser,
|
|
97
|
+
hint !== void 0 ? hintId : void 0,
|
|
98
|
+
errorMessage && appearance === "error" ? errorId : void 0
|
|
99
|
+
);
|
|
100
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
101
|
+
label !== void 0 && /* @__PURE__ */ jsx(
|
|
102
|
+
"label",
|
|
103
|
+
{
|
|
104
|
+
htmlFor: controlId,
|
|
105
|
+
className: "mb-1 block text-sm font-medium text-slate-200",
|
|
106
|
+
children: label
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
hint !== void 0 && /* @__PURE__ */ jsx("p", { id: hintId, className: "mb-1 text-xs text-slate-400", children: hint }),
|
|
110
|
+
/* @__PURE__ */ jsx(
|
|
111
|
+
"input",
|
|
112
|
+
{
|
|
113
|
+
ref,
|
|
114
|
+
id: controlId,
|
|
115
|
+
"data-slot": "input",
|
|
116
|
+
className: cn(
|
|
117
|
+
inputVariants({ appearance, size, ring, as: as ?? "input" }),
|
|
118
|
+
className
|
|
119
|
+
),
|
|
120
|
+
"aria-invalid": ariaInvalid,
|
|
121
|
+
"aria-describedby": describedBy,
|
|
122
|
+
...rest
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
errorMessage && appearance === "error" && /* @__PURE__ */ jsx(
|
|
126
|
+
"p",
|
|
127
|
+
{
|
|
128
|
+
id: errorId,
|
|
129
|
+
className: "mt-2 pl-4 text-sm text-rose-500 wrap-break-word",
|
|
130
|
+
children: errorMessage
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
] });
|
|
134
|
+
};
|
|
135
|
+
InputBase.displayName = "Input";
|
|
136
|
+
var Input = (props) => {
|
|
137
|
+
return /* @__PURE__ */ jsx(InputBase, { ...props });
|
|
138
|
+
};
|
|
139
|
+
Input.displayName = "Input";
|
|
140
|
+
|
|
141
|
+
export { Input };
|
|
142
|
+
//# sourceMappingURL=chunk-LHBJD57K.mjs.map
|
|
143
|
+
//# sourceMappingURL=chunk-LHBJD57K.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/inputs/input-base.tsx","../src/ui/inputs/input.tsx"],"names":["className","appearance","size","ring","ref","ariaInvalidProp","errorMessage","hint","label","id","as","ariaDescribedByUser","rest","controlId","errorId","hintId","ariaInvalid","describedBy","jsx"],"mappings":"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","file":"chunk-LHBJD57K.mjs","sourcesContent":["\"use client\";\n\nimport { useId } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { InputProps } from \"./types\";\nimport { inputVariants } from \"./variants\";\n\nfunction mergeDescribedByIds(\n user: string | undefined,\n ...generated: (string | undefined)[]\n): string | undefined {\n const ids = [\n ...(user ?? \"\").split(/\\s+/).filter(Boolean),\n ...generated.filter((id): id is string => Boolean(id)),\n ];\n const unique = [...new Set(ids)];\n return unique.length > 0 ? unique.join(\" \") : undefined;\n}\n\nexport const InputBase = (props: InputProps) => {\n const generatedId = useId();\n\n if (props.as === \"textarea\") {\n const {\n className,\n appearance,\n size,\n ring = true,\n ref,\n \"aria-invalid\": ariaInvalidProp,\n errorMessage,\n hint,\n label,\n id,\n as,\n \"aria-describedby\": ariaDescribedByUser,\n ...rest\n } = props;\n\n const controlId = id ?? generatedId;\n const errorId = `${controlId}-error`;\n const hintId = `${controlId}-hint`;\n const ariaInvalid =\n ariaInvalidProp !== undefined\n ? ariaInvalidProp\n : appearance === \"error\"\n ? true\n : undefined;\n\n const describedBy = mergeDescribedByIds(\n ariaDescribedByUser,\n hint !== undefined ? hintId : undefined,\n errorMessage && appearance === \"error\" ? errorId : undefined,\n );\n\n return (\n <>\n {label !== undefined && (\n <label\n htmlFor={controlId}\n className=\"mb-1 block text-sm font-medium text-slate-200\"\n >\n {label}\n </label>\n )}\n {hint !== undefined && (\n <p id={hintId} className=\"mb-1 text-xs text-slate-400\">\n {hint}\n </p>\n )}\n <textarea\n ref={ref}\n id={controlId}\n data-slot=\"input\"\n className={cn(\n inputVariants({ appearance, size, ring, as }),\n className,\n )}\n aria-invalid={ariaInvalid}\n aria-describedby={describedBy}\n {...rest}\n />\n {errorMessage && appearance === \"error\" && (\n <p\n id={errorId}\n className=\"mt-2 pl-4 text-sm text-rose-500 wrap-break-word\"\n >\n {errorMessage}\n </p>\n )}\n </>\n );\n }\n\n const {\n className,\n appearance,\n size,\n ring = true,\n ref,\n \"aria-invalid\": ariaInvalidProp,\n errorMessage,\n hint,\n label,\n id,\n as,\n \"aria-describedby\": ariaDescribedByUser,\n ...rest\n } = props;\n\n const controlId = id ?? generatedId;\n const errorId = `${controlId}-error`;\n const hintId = `${controlId}-hint`;\n const ariaInvalid =\n ariaInvalidProp !== undefined\n ? ariaInvalidProp\n : appearance === \"error\"\n ? true\n : undefined;\n\n const describedBy = mergeDescribedByIds(\n ariaDescribedByUser,\n hint !== undefined ? hintId : undefined,\n errorMessage && appearance === \"error\" ? errorId : undefined,\n );\n\n return (\n <>\n {label !== undefined && (\n <label\n htmlFor={controlId}\n className=\"mb-1 block text-sm font-medium text-slate-200\"\n >\n {label}\n </label>\n )}\n {hint !== undefined && (\n <p id={hintId} className=\"mb-1 text-xs text-slate-400\">\n {hint}\n </p>\n )}\n <input\n ref={ref}\n id={controlId}\n data-slot=\"input\"\n className={cn(\n inputVariants({ appearance, size, ring, as: as ?? \"input\" }),\n className,\n )}\n aria-invalid={ariaInvalid}\n aria-describedby={describedBy}\n {...rest}\n />\n {errorMessage && appearance === \"error\" && (\n <p\n id={errorId}\n className=\"mt-2 pl-4 text-sm text-rose-500 wrap-break-word\"\n >\n {errorMessage}\n </p>\n )}\n </>\n );\n};\n\nInputBase.displayName = \"Input\";\n","import { InputBase } from \"./input-base\";\nimport type { InputProps } from \"./types\";\n\nexport const Input = (props: InputProps) => {\n return <InputBase {...props} />;\n};\n\nInput.displayName = \"Input\";\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useVirtualList/useVirtualList.ts
|
|
6
|
+
function useVirtualList({
|
|
7
|
+
itemCount,
|
|
8
|
+
itemHeight,
|
|
9
|
+
overscan = 3
|
|
10
|
+
}) {
|
|
11
|
+
const [container, setContainer] = react.useState(null);
|
|
12
|
+
const [scrollTop, setScrollTop] = react.useState(0);
|
|
13
|
+
const [viewportHeight, setViewportHeight] = react.useState(0);
|
|
14
|
+
const setContainerRef = react.useCallback((node) => {
|
|
15
|
+
setContainer(node);
|
|
16
|
+
}, []);
|
|
17
|
+
react.useEffect(() => {
|
|
18
|
+
if (container == null) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const onScroll = () => {
|
|
22
|
+
setScrollTop(container.scrollTop);
|
|
23
|
+
};
|
|
24
|
+
const measure = () => {
|
|
25
|
+
setViewportHeight(container.clientHeight);
|
|
26
|
+
};
|
|
27
|
+
measure();
|
|
28
|
+
onScroll();
|
|
29
|
+
container.addEventListener("scroll", onScroll, { passive: true });
|
|
30
|
+
let observer;
|
|
31
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
32
|
+
observer = new ResizeObserver(measure);
|
|
33
|
+
observer.observe(container);
|
|
34
|
+
}
|
|
35
|
+
return () => {
|
|
36
|
+
container.removeEventListener("scroll", onScroll);
|
|
37
|
+
observer?.disconnect();
|
|
38
|
+
};
|
|
39
|
+
}, [container]);
|
|
40
|
+
const safeItemCount = Math.max(0, Math.floor(itemCount));
|
|
41
|
+
const safeItemHeight = Math.max(1, itemHeight);
|
|
42
|
+
const safeOverscan = Math.max(0, Math.floor(overscan));
|
|
43
|
+
const totalHeight = safeItemCount * safeItemHeight;
|
|
44
|
+
const startIndex = safeItemCount === 0 ? 0 : Math.max(0, Math.floor(scrollTop / safeItemHeight) - safeOverscan);
|
|
45
|
+
const endIndex = safeItemCount === 0 ? -1 : Math.min(
|
|
46
|
+
safeItemCount - 1,
|
|
47
|
+
Math.ceil((scrollTop + viewportHeight) / safeItemHeight) - 1 + safeOverscan
|
|
48
|
+
);
|
|
49
|
+
const virtualItems = react.useMemo(() => {
|
|
50
|
+
const items = [];
|
|
51
|
+
for (let index = startIndex; index <= endIndex; index += 1) {
|
|
52
|
+
items.push({
|
|
53
|
+
index,
|
|
54
|
+
start: index * safeItemHeight,
|
|
55
|
+
size: safeItemHeight
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return items;
|
|
59
|
+
}, [endIndex, safeItemHeight, startIndex]);
|
|
60
|
+
const scrollToIndex = react.useCallback(
|
|
61
|
+
(index) => {
|
|
62
|
+
if (container == null || safeItemCount === 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const clamped = Math.min(Math.max(index, 0), safeItemCount - 1);
|
|
66
|
+
container.scrollTop = clamped * safeItemHeight;
|
|
67
|
+
setScrollTop(container.scrollTop);
|
|
68
|
+
},
|
|
69
|
+
[container, safeItemCount, safeItemHeight]
|
|
70
|
+
);
|
|
71
|
+
return {
|
|
72
|
+
setContainerRef,
|
|
73
|
+
virtualItems,
|
|
74
|
+
totalHeight,
|
|
75
|
+
startIndex,
|
|
76
|
+
endIndex,
|
|
77
|
+
scrollToIndex
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
exports.useVirtualList = useVirtualList;
|
|
82
|
+
//# sourceMappingURL=chunk-OYAJG2BO.js.map
|
|
83
|
+
//# sourceMappingURL=chunk-OYAJG2BO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useVirtualList/useVirtualList.ts"],"names":["useState","useCallback","useEffect","useMemo"],"mappings":"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","file":"chunk-OYAJG2BO.js","sourcesContent":["\"use client\";\n\nimport type { RefCallback } from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nexport type VirtualItem = {\n /** Index into your data array. */\n index: number;\n /** Offset from the top of the scroll content in pixels (use for `translateY` / `top`). */\n start: number;\n /** Row height in pixels. */\n size: number;\n};\n\nexport type UseVirtualListParams = {\n /** Total number of rows in the list. */\n itemCount: number;\n /** Fixed height of every row in pixels (must be > 0). */\n itemHeight: number;\n /** Extra rows rendered above and below the viewport (default `3`). */\n overscan?: number;\n};\n\nexport type UseVirtualListResult = {\n /** Callback ref for the scrollable container (needs `overflow-y: auto` and a bounded height). */\n setContainerRef: RefCallback<HTMLElement>;\n /** The rows to render, each with its absolute `start` offset. */\n virtualItems: VirtualItem[];\n /** Height of the full list content; set it on an inner spacer element. */\n totalHeight: number;\n /** First rendered index (after overscan). */\n startIndex: number;\n /** Last rendered index (after overscan), `-1` when empty. */\n endIndex: number;\n /** Scroll the container so the given row is at the top. */\n scrollToIndex: (index: number) => void;\n};\n\n/**\n * Headless fixed-height list virtualization: renders only the rows visible in the\n * scroll container (plus `overscan`), so lists of tens of thousands of rows stay cheap.\n *\n * Markup recipe: outer container gets `setContainerRef` + `overflow-y: auto` and a height;\n * inside it, one relative spacer div with `height: totalHeight`; each virtual item is\n * absolutely positioned at `translateY(item.start)` with `height: item.size`.\n *\n * Viewport size tracks `ResizeObserver` (when available) and scroll position tracks a\n * passive `scroll` listener. For variable-height rows, reach for a dedicated virtualizer.\n *\n * @param params - {@link UseVirtualListParams}\n * @returns {@link UseVirtualListResult}\n */\nexport function useVirtualList({\n itemCount,\n itemHeight,\n overscan = 3,\n}: UseVirtualListParams): UseVirtualListResult {\n const [container, setContainer] = useState<HTMLElement | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(0);\n\n const setContainerRef = useCallback((node: HTMLElement | null) => {\n setContainer(node);\n }, []);\n\n useEffect(() => {\n if (container == null) {\n return;\n }\n const onScroll = () => {\n setScrollTop(container.scrollTop);\n };\n const measure = () => {\n setViewportHeight(container.clientHeight);\n };\n measure();\n onScroll();\n container.addEventListener(\"scroll\", onScroll, { passive: true });\n let observer: ResizeObserver | undefined;\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(measure);\n observer.observe(container);\n }\n return () => {\n container.removeEventListener(\"scroll\", onScroll);\n observer?.disconnect();\n };\n }, [container]);\n\n const safeItemCount = Math.max(0, Math.floor(itemCount));\n const safeItemHeight = Math.max(1, itemHeight);\n const safeOverscan = Math.max(0, Math.floor(overscan));\n\n const totalHeight = safeItemCount * safeItemHeight;\n const startIndex =\n safeItemCount === 0\n ? 0\n : Math.max(0, Math.floor(scrollTop / safeItemHeight) - safeOverscan);\n const endIndex =\n safeItemCount === 0\n ? -1\n : Math.min(\n safeItemCount - 1,\n Math.ceil((scrollTop + viewportHeight) / safeItemHeight) -\n 1 +\n safeOverscan,\n );\n\n const virtualItems = useMemo(() => {\n const items: VirtualItem[] = [];\n for (let index = startIndex; index <= endIndex; index += 1) {\n items.push({\n index,\n start: index * safeItemHeight,\n size: safeItemHeight,\n });\n }\n return items;\n }, [endIndex, safeItemHeight, startIndex]);\n\n const scrollToIndex = useCallback(\n (index: number) => {\n if (container == null || safeItemCount === 0) {\n return;\n }\n const clamped = Math.min(Math.max(index, 0), safeItemCount - 1);\n container.scrollTop = clamped * safeItemHeight;\n setScrollTop(container.scrollTop);\n },\n [container, safeItemCount, safeItemHeight],\n );\n\n return {\n setContainerRef,\n virtualItems,\n totalHeight,\n startIndex,\n endIndex,\n scrollToIndex,\n };\n}\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/design-system/audio-player.ts
|
|
4
|
+
var zuiAudioPlayerBase = [
|
|
5
|
+
"w-full",
|
|
6
|
+
"rounded-[var(--zui-audio-player-radius,var(--zui-radius,0.75rem))]",
|
|
7
|
+
"bg-[var(--zui-audio-player-bg,var(--zui-surface,#ffffff))] dark:bg-[var(--zui-audio-player-bg-dark,var(--zui-surface-dark,#0f172a))]",
|
|
8
|
+
"border border-[var(--zui-audio-player-border,var(--zui-border,#e2e8f0))] dark:border-[var(--zui-audio-player-border-dark,var(--zui-border-dark,#1e293b))]",
|
|
9
|
+
"shadow-[var(--zui-audio-player-shadow,var(--zui-shadow,0_1px_2px_#0f172a14))] dark:shadow-[var(--zui-audio-player-shadow-dark,var(--zui-shadow-dark,0_1px_2px_#0f172a1f))]",
|
|
10
|
+
"text-[color:var(--zui-audio-player-fg,var(--zui-fg,#0f172a))] dark:text-[color:var(--zui-audio-player-fg-dark,var(--zui-fg-dark,#f8fafc))]"
|
|
11
|
+
];
|
|
12
|
+
var zuiAudioPlayerAppearances = {
|
|
13
|
+
default: "[--audio-fill:var(--zui-audio-player-default-fill,var(--zui-brand,#0f172a))] dark:[--audio-fill:var(--zui-audio-player-default-fill-dark,var(--zui-brand-dark,#f8fafc))]",
|
|
14
|
+
secondary: "[--audio-fill:var(--zui-audio-player-secondary-fill,var(--zui-fg,#475569))] dark:[--audio-fill:var(--zui-audio-player-secondary-fill-dark,var(--zui-fg-dark,#94a3b8))]",
|
|
15
|
+
destructive: "[--audio-fill:var(--zui-audio-player-destructive-fill,var(--zui-status-error,#dc2626))] dark:[--audio-fill:var(--zui-audio-player-destructive-fill-dark,var(--zui-status-error-dark,#ef4444))]",
|
|
16
|
+
blue: "[--audio-fill:var(--zui-audio-player-blue-fill,var(--zui-color-blue,#2563eb))] dark:[--audio-fill:var(--zui-audio-player-blue-fill-dark,var(--zui-color-blue-dark,#3b82f6))]",
|
|
17
|
+
cyan: "[--audio-fill:var(--zui-audio-player-cyan-fill,var(--zui-color-cyan,#0891b2))] dark:[--audio-fill:var(--zui-audio-player-cyan-fill-dark,var(--zui-color-cyan-dark,#22d3ee))]",
|
|
18
|
+
green: "[--audio-fill:var(--zui-audio-player-green-fill,var(--zui-color-green,#16a34a))] dark:[--audio-fill:var(--zui-audio-player-green-fill-dark,var(--zui-color-green-dark,#22c55e))]",
|
|
19
|
+
lime: "[--audio-fill:var(--zui-audio-player-lime-fill,var(--zui-color-lime,#65a30d))] dark:[--audio-fill:var(--zui-audio-player-lime-fill-dark,var(--zui-color-lime-dark,#a3e635))]",
|
|
20
|
+
mint: "[--audio-fill:var(--zui-audio-player-mint-fill,var(--zui-color-mint,#10b981))] dark:[--audio-fill:var(--zui-audio-player-mint-fill-dark,var(--zui-color-mint-dark,#6ee7b7))]",
|
|
21
|
+
ocean: "[--audio-fill:var(--zui-audio-player-ocean-fill,var(--zui-color-ocean,#0284c7))] dark:[--audio-fill:var(--zui-audio-player-ocean-fill-dark,var(--zui-color-ocean-dark,#38bdf8))]",
|
|
22
|
+
sapphire: "[--audio-fill:var(--zui-audio-player-sapphire-fill,var(--zui-color-sapphire,#1d4ed8))] dark:[--audio-fill:var(--zui-audio-player-sapphire-fill-dark,var(--zui-color-sapphire-dark,#60a5fa))]",
|
|
23
|
+
lavender: "[--audio-fill:var(--zui-audio-player-lavender-fill,var(--zui-color-lavender,#8b5cf6))] dark:[--audio-fill:var(--zui-audio-player-lavender-fill-dark,var(--zui-color-lavender-dark,#a78bfa))]",
|
|
24
|
+
ruby: "[--audio-fill:var(--zui-audio-player-ruby-fill,var(--zui-color-ruby,#be123c))] dark:[--audio-fill:var(--zui-audio-player-ruby-fill-dark,var(--zui-color-ruby-dark,#fb7185))]",
|
|
25
|
+
red: "[--audio-fill:var(--zui-audio-player-red-fill,var(--zui-color-red,#dc2626))] dark:[--audio-fill:var(--zui-audio-player-red-fill-dark,var(--zui-color-red-dark,#ef4444))]",
|
|
26
|
+
slate: "[--audio-fill:var(--zui-audio-player-slate-fill,var(--zui-color-slate,#475569))] dark:[--audio-fill:var(--zui-audio-player-slate-fill-dark,var(--zui-color-slate-dark,#64748b))]",
|
|
27
|
+
zinc: "[--audio-fill:var(--zui-audio-player-zinc-fill,var(--zui-color-zinc,#52525b))] dark:[--audio-fill:var(--zui-audio-player-zinc-fill-dark,var(--zui-color-zinc-dark,#71717a))]",
|
|
28
|
+
royal: "[--audio-fill:var(--zui-audio-player-royal-fill,var(--zui-color-royal,#4338ca))] dark:[--audio-fill:var(--zui-audio-player-royal-fill-dark,var(--zui-color-royal-dark,#818cf8))]",
|
|
29
|
+
electric: "[--audio-fill:var(--zui-audio-player-electric-fill,var(--zui-color-electric,#0ea5e9))] dark:[--audio-fill:var(--zui-audio-player-electric-fill-dark,var(--zui-color-electric-dark,#38bdf8))]",
|
|
30
|
+
forest: "[--audio-fill:var(--zui-audio-player-forest-fill,var(--zui-color-forest,#166534))] dark:[--audio-fill:var(--zui-audio-player-forest-fill-dark,var(--zui-color-forest-dark,#4ade80))]",
|
|
31
|
+
sunset: "[--audio-fill:var(--zui-audio-player-sunset-fill,var(--zui-color-sunset,#ea580c))] dark:[--audio-fill:var(--zui-audio-player-sunset-fill-dark,var(--zui-color-sunset-dark,#fb923c))]",
|
|
32
|
+
magenta: "[--audio-fill:var(--zui-audio-player-magenta-fill,var(--zui-color-magenta,#c026d3))] dark:[--audio-fill:var(--zui-audio-player-magenta-fill-dark,var(--zui-color-magenta-dark,#e879f9))]",
|
|
33
|
+
crimson: "[--audio-fill:var(--zui-audio-player-crimson-fill,var(--zui-color-crimson,#b91c1c))] dark:[--audio-fill:var(--zui-audio-player-crimson-fill-dark,var(--zui-color-crimson-dark,#f87171))]",
|
|
34
|
+
emerald: "[--audio-fill:var(--zui-audio-player-emerald-fill,var(--zui-color-emerald,#059669))] dark:[--audio-fill:var(--zui-audio-player-emerald-fill-dark,var(--zui-color-emerald-dark,#34d399))]",
|
|
35
|
+
indigo: "[--audio-fill:var(--zui-audio-player-indigo-fill,var(--zui-color-indigo,#4f46e5))] dark:[--audio-fill:var(--zui-audio-player-indigo-fill-dark,var(--zui-color-indigo-dark,#6366f1))]",
|
|
36
|
+
purple: "[--audio-fill:var(--zui-audio-player-purple-fill,var(--zui-color-purple,#7c3aed))] dark:[--audio-fill:var(--zui-audio-player-purple-fill-dark,var(--zui-color-purple-dark,#8b5cf6))]",
|
|
37
|
+
pink: "[--audio-fill:var(--zui-audio-player-pink-fill,var(--zui-color-pink,#db2777))] dark:[--audio-fill:var(--zui-audio-player-pink-fill-dark,var(--zui-color-pink-dark,#ec4899))]",
|
|
38
|
+
rose: "[--audio-fill:var(--zui-audio-player-rose-fill,var(--zui-color-rose,#e11d48))] dark:[--audio-fill:var(--zui-audio-player-rose-fill-dark,var(--zui-color-rose-dark,#f43f5e))]",
|
|
39
|
+
sky: "[--audio-fill:var(--zui-audio-player-sky-fill,var(--zui-color-sky,#0284c7))] dark:[--audio-fill:var(--zui-audio-player-sky-fill-dark,var(--zui-color-sky-dark,#38bdf8))]",
|
|
40
|
+
teal: "[--audio-fill:var(--zui-audio-player-teal-fill,var(--zui-color-teal,#0d9488))] dark:[--audio-fill:var(--zui-audio-player-teal-fill-dark,var(--zui-color-teal-dark,#2dd4bf))]",
|
|
41
|
+
yellow: "[--audio-fill:var(--zui-audio-player-yellow-fill,var(--zui-color-yellow,#ca8a04))] dark:[--audio-fill:var(--zui-audio-player-yellow-fill-dark,var(--zui-color-yellow-dark,#eab308))]",
|
|
42
|
+
orange: "[--audio-fill:var(--zui-audio-player-orange-fill,var(--zui-color-orange,#ea580c))] dark:[--audio-fill:var(--zui-audio-player-orange-fill-dark,var(--zui-color-orange-dark,#f97316))]",
|
|
43
|
+
"gradient-blue": "[--audio-fill:var(--zui-audio-player-gradient-blue-fill,linear-gradient(90deg,#2563eb,#7c3aed))] dark:[--audio-fill:var(--zui-audio-player-gradient-blue-fill-dark,linear-gradient(90deg,#3b82f6,#8b5cf6))]",
|
|
44
|
+
"gradient-green": "[--audio-fill:var(--zui-audio-player-gradient-green-fill,linear-gradient(90deg,#16a34a,#0d9488))] dark:[--audio-fill:var(--zui-audio-player-gradient-green-fill-dark,linear-gradient(90deg,#22c55e,#2dd4bf))]",
|
|
45
|
+
"gradient-red": "[--audio-fill:var(--zui-audio-player-gradient-red-fill,linear-gradient(90deg,#dc2626,#db2777))] dark:[--audio-fill:var(--zui-audio-player-gradient-red-fill-dark,linear-gradient(90deg,#ef4444,#ec4899))]",
|
|
46
|
+
"gradient-yellow": "[--audio-fill:var(--zui-audio-player-gradient-yellow-fill,linear-gradient(90deg,#ca8a04,#ea580c))] dark:[--audio-fill:var(--zui-audio-player-gradient-yellow-fill-dark,linear-gradient(90deg,#eab308,#f97316))]",
|
|
47
|
+
"gradient-purple": "[--audio-fill:var(--zui-audio-player-gradient-purple-fill,linear-gradient(90deg,#7c3aed,#db2777))] dark:[--audio-fill:var(--zui-audio-player-gradient-purple-fill-dark,linear-gradient(90deg,#8b5cf6,#ec4899))]",
|
|
48
|
+
"gradient-teal": "[--audio-fill:var(--zui-audio-player-gradient-teal-fill,linear-gradient(90deg,#0d9488,#0284c7))] dark:[--audio-fill:var(--zui-audio-player-gradient-teal-fill-dark,linear-gradient(90deg,#2dd4bf,#38bdf8))]",
|
|
49
|
+
"gradient-indigo": "[--audio-fill:var(--zui-audio-player-gradient-indigo-fill,linear-gradient(90deg,#4f46e5,#7c3aed))] dark:[--audio-fill:var(--zui-audio-player-gradient-indigo-fill-dark,linear-gradient(90deg,#6366f1,#8b5cf6))]",
|
|
50
|
+
"gradient-pink": "[--audio-fill:var(--zui-audio-player-gradient-pink-fill,linear-gradient(90deg,#db2777,#e11d48))] dark:[--audio-fill:var(--zui-audio-player-gradient-pink-fill-dark,linear-gradient(90deg,#ec4899,#f43f5e))]",
|
|
51
|
+
"gradient-orange": "[--audio-fill:var(--zui-audio-player-gradient-orange-fill,linear-gradient(90deg,#ea580c,#ca8a04))] dark:[--audio-fill:var(--zui-audio-player-gradient-orange-fill-dark,linear-gradient(90deg,#f97316,#eab308))]"
|
|
52
|
+
};
|
|
53
|
+
var zuiAudioPlayerSizes = {
|
|
54
|
+
sm: "p-3 text-xs gap-2",
|
|
55
|
+
md: "p-4 text-sm gap-3",
|
|
56
|
+
lg: "p-5 text-base gap-4"
|
|
57
|
+
};
|
|
58
|
+
var zuiAudioPlayerShapes = {
|
|
59
|
+
flat: "rounded-none",
|
|
60
|
+
rounded: "rounded-xl",
|
|
61
|
+
pill: "rounded-3xl"
|
|
62
|
+
};
|
|
63
|
+
var zuiAudioPlayerTrackBase = [
|
|
64
|
+
"relative w-full overflow-hidden cursor-pointer",
|
|
65
|
+
"rounded-[inherit]",
|
|
66
|
+
"bg-[var(--zui-audio-player-track-bg,var(--zui-surface-muted,#0000001a))] dark:bg-[var(--zui-audio-player-track-bg-dark,var(--zui-surface-muted-dark,#ffffff1a))]",
|
|
67
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--audio-fill,#0f172a)] focus-visible:ring-offset-2"
|
|
68
|
+
];
|
|
69
|
+
var zuiAudioPlayerTrackSizes = {
|
|
70
|
+
sm: "h-1",
|
|
71
|
+
md: "h-1.5",
|
|
72
|
+
lg: "h-2"
|
|
73
|
+
};
|
|
74
|
+
var zuiAudioPlayerBarBase = "h-full origin-left [background:var(--audio-fill)] transition-[transform] will-change-transform";
|
|
75
|
+
var zuiAudioPlayerTimeBase = "tabular-nums font-mono text-[color:var(--zui-audio-player-time-fg,var(--zui-fg-muted,#64748b))] dark:text-[color:var(--zui-audio-player-time-fg-dark,var(--zui-fg-muted-dark,#94a3b8))]";
|
|
76
|
+
|
|
77
|
+
exports.zuiAudioPlayerAppearances = zuiAudioPlayerAppearances;
|
|
78
|
+
exports.zuiAudioPlayerBarBase = zuiAudioPlayerBarBase;
|
|
79
|
+
exports.zuiAudioPlayerBase = zuiAudioPlayerBase;
|
|
80
|
+
exports.zuiAudioPlayerShapes = zuiAudioPlayerShapes;
|
|
81
|
+
exports.zuiAudioPlayerSizes = zuiAudioPlayerSizes;
|
|
82
|
+
exports.zuiAudioPlayerTimeBase = zuiAudioPlayerTimeBase;
|
|
83
|
+
exports.zuiAudioPlayerTrackBase = zuiAudioPlayerTrackBase;
|
|
84
|
+
exports.zuiAudioPlayerTrackSizes = zuiAudioPlayerTrackSizes;
|
|
85
|
+
//# sourceMappingURL=chunk-PG7LQVU6.js.map
|
|
86
|
+
//# sourceMappingURL=chunk-PG7LQVU6.js.map
|