nest-filter 1.0.1 → 1.0.2

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.
@@ -1,9 +1,9 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useEffect, useCallback } from 'react';
3
- import { Button } from './ui/Button.js';
4
- import { Input } from './ui/Input.js';
5
- import { Select } from './ui/Select.js';
6
- import { Dialog } from './ui/Dialog.js';
3
+ import { Button } from './ui/button.js';
4
+ import { Input } from './ui/input.js';
5
+ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './ui/select.js';
6
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from './ui/dialog.js';
7
7
  import { FilterX, Plus, Layers, Trash2, Binary, ListFilter } from 'lucide-react';
8
8
  import { applyFilters } from '../utils/filterLogic.js';
9
9
 
@@ -51,10 +51,7 @@ const FilterGroupUI = ({ group, depth, columns, onAddRule, onAddGroup, onUpdateR
51
51
  ? "bg-slate-900 text-slate-50"
52
52
  : "text-slate-500 hover:text-slate-900"}`, children: "OR" })] })] }), jsxs("div", { className: "flex items-center gap-2", children: [jsxs(Button, { variant: "outline", size: "sm", onClick: () => onAddRule(group.id), className: "h-7 text-[10px] font-bold uppercase", children: [jsx(Plus, { className: "mr-1 h-3 w-3" }), " Rule"] }), jsxs(Button, { variant: "outline", size: "sm", onClick: () => onAddGroup(group.id), className: "h-7 text-[10px] font-bold uppercase", children: [jsx(Layers, { className: "mr-1 h-3 w-3" }), " Group"] }), depth > 0 && (jsx(Button, { variant: "ghost", size: "sm", onClick: () => onRemoveItem(group.id), className: "text-slate-400", children: jsx(Trash2, { className: "h-5 w-5 text-red-500" }) }))] })] }), jsxs("div", { className: "space-y-3", children: [group.items.map((item) => {
53
53
  const column = columns.find((c) => c.id === (item.type === "rule" ? item.columnId : null));
54
- return item.type === "rule" ? (jsxs("div", { className: "flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm", children: [jsx("div", { className: "flex-1 min-w-[140px]", children: jsx(Select, { value: item.columnId, options: columns.map((c) => ({
55
- value: c.id,
56
- label: c.label,
57
- })), onValueChange: (val) => {
54
+ return item.type === "rule" ? (jsxs("div", { className: "flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm", children: [jsx("div", { className: "flex-1 min-w-[140px]", children: jsxs(Select, { value: item.columnId, onValueChange: (val) => {
58
55
  const colId = val;
59
56
  const col = columns.find((c) => c.id === colId);
60
57
  onUpdateRule(item.id, {
@@ -68,10 +65,7 @@ const FilterGroupUI = ({ group, depth, columns, onAddRule, onAddGroup, onUpdateR
68
65
  : "contains",
69
66
  value: "",
70
67
  });
71
- } }) }), jsx("div", { className: "w-full md:w-44", children: jsx(Select, { value: item.operator, options: getOperatorsForType(column?.type || "string"), onValueChange: (val) => onUpdateRule(item.id, { operator: val }) }) }), jsx("div", { className: "flex-[1.5] min-w-[180px]", children: column?.type === "date" ? (jsx(Input, { type: "date", value: item.value || "", onChange: (e) => onUpdateRule(item.id, { value: e.target.value }) })) : column?.type === "boolean" ? (jsxs("div", { className: "h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic", children: [jsx(Binary, { className: "h-3 w-3 mr-2" }), "Binary state"] })) : column?.type === "select" ? (jsx(Select, { value: item.value || "", placeholder: "Choose option...", options: (column.options || []).map((opt) => ({
72
- value: opt,
73
- label: opt,
74
- })), onValueChange: (val) => onUpdateRule(item.id, { value: val }) })) : (jsx(Input, { placeholder: "Search query...", value: item.value || "", onChange: (e) => onUpdateRule(item.id, { value: e.target.value }) })) }), jsx(Button, { variant: "ghost", size: "icon", onClick: () => onRemoveItem(item.id), className: "h-9 w-9 text-slate-300 hover:text-red-500 hover:bg-red-50", children: jsx(Trash2, { className: "h-5 w-5 text-red-500" }) })] }, item.id)) : (jsx(FilterGroupUI, { group: item, depth: depth + 1, columns: columns, onAddRule: onAddRule, onAddGroup: onAddGroup, onUpdateRule: onUpdateRule, onUpdateGroupLogic: onUpdateGroupLogic, onRemoveItem: onRemoveItem }));
68
+ }, children: [jsx(SelectTrigger, { children: jsx(SelectValue, { placeholder: "Select column..." }) }), jsx(SelectContent, { children: columns.map((c) => (jsx(SelectItem, { value: c.id, children: c.label }, c.id))) })] }) }), jsx("div", { className: "w-full md:w-44", children: jsxs(Select, { value: item.operator, onValueChange: (val) => onUpdateRule(item.id, { operator: val }), children: [jsx(SelectTrigger, { children: jsx(SelectValue, { placeholder: "Select operator..." }) }), jsx(SelectContent, { className: "z-[100]", children: getOperatorsForType(column?.type || "string").map((op) => (jsx(SelectItem, { value: op.value, children: op.label }, op.value))) })] }) }), jsx("div", { className: "flex-[1.5] min-w-[180px]", children: column?.type === "date" ? (jsx(Input, { type: "date", value: item.value || "", onChange: (e) => onUpdateRule(item.id, { value: e.target.value }) })) : column?.type === "boolean" ? (jsxs("div", { className: "h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic", children: [jsx(Binary, { className: "h-3 w-3 mr-2" }), "Binary state"] })) : column?.type === "select" ? (jsxs(Select, { value: item.value || "", onValueChange: (val) => onUpdateRule(item.id, { value: val }), children: [jsx(SelectTrigger, { children: jsx(SelectValue, { placeholder: "Choose option..." }) }), jsx(SelectContent, { className: "z-[100]", children: (column.options || []).map((opt) => (jsx(SelectItem, { value: opt, children: opt }, opt))) })] })) : (jsx(Input, { placeholder: "Search query...", value: item.value || "", onChange: (e) => onUpdateRule(item.id, { value: e.target.value }) })) }), jsx(Button, { variant: "ghost", size: "icon", onClick: () => onRemoveItem(item.id), className: "h-9 w-9 text-slate-300 hover:text-red-500 hover:bg-red-50", children: jsx(Trash2, { className: "h-5 w-5 text-red-500" }) })] }, item.id)) : (jsx(FilterGroupUI, { group: item, depth: depth + 1, columns: columns, onAddRule: onAddRule, onAddGroup: onAddGroup, onUpdateRule: onUpdateRule, onUpdateGroupLogic: onUpdateGroupLogic, onRemoveItem: onRemoveItem }));
75
69
  }), group.items.length === 0 && (jsxs("div", { className: "flex flex-col items-center justify-center py-6 rounded-md border border-dashed border-slate-200 bg-white/50", children: [jsx(ListFilter, { className: "h-5 w-5 text-slate-300 mb-1" }), jsx("p", { className: "text-[10px] text-slate-400 font-bold uppercase tracking-widest", children: "Add a rule to filter" })] }))] })] }));
76
70
  };
77
71
  const AdvancedFilter = ({ isOpen, onClose, data, columns, setFilteredData, initialFilters, }) => {
@@ -156,7 +150,7 @@ const AdvancedFilter = ({ isOpen, onClose, data, columns, setFilteredData, initi
156
150
  setFilteredData(data);
157
151
  onClose();
158
152
  };
159
- return (jsxs(Dialog, { open: isOpen, onOpenChange: onClose, title: "Advanced Filters by arijit", description: "Refine your dataset using structured logic and multi-type comparisons.", children: [jsx("div", { className: "max-h-[60vh] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32", children: jsx(FilterGroupUI, { group: rootGroup, depth: 0, columns: columns, onAddRule: handleAddRule, onAddGroup: handleAddGroup, onUpdateRule: handleUpdateRule, onUpdateGroupLogic: handleUpdateGroupLogic, onRemoveItem: handleRemoveItem }) }), jsxs("div", { className: "flex w-full justify-between items-center gap-4", children: [jsxs(Button, { variant: "ghost", onClick: handleClear, className: "text-slate-400 hover:text-red-500 font-black text-[10px] uppercase tracking-widest gap-2", children: [jsx(FilterX, { className: "h-4 w-4" }), " Reset Filters"] }), jsxs("div", { className: "flex gap-2", children: [jsx(Button, { variant: "outline", onClick: onClose, className: "font-bold h-11 px-6", children: "Cancel" }), jsx(Button, { onClick: handleApply, className: "bg-slate-900 font-bold h-11 px-10 rounded-lg shadow-lg hover:shadow-xl transition-shadow", children: "Apply View" })] })] })] }));
153
+ return (jsx(Dialog, { open: isOpen, onOpenChange: onClose, children: jsx(DialogContent, { className: "min-w-[65vw]", children: jsxs(DialogHeader, { children: [jsx(DialogTitle, { children: "Advanced Filters" }), jsx(DialogDescription, { children: "Refine your dataset using structured logic and multi-type comparisons." }), jsx("div", { className: "max-h-[60vh] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32", children: jsx(FilterGroupUI, { group: rootGroup, depth: 0, columns: columns, onAddRule: handleAddRule, onAddGroup: handleAddGroup, onUpdateRule: handleUpdateRule, onUpdateGroupLogic: handleUpdateGroupLogic, onRemoveItem: handleRemoveItem }) }), jsxs("div", { className: "flex w-full justify-between items-center gap-4", children: [jsxs(Button, { variant: "ghost", onClick: handleClear, className: "text-slate-400 hover:text-red-500 font-black text-[10px] uppercase tracking-widest gap-2", children: [jsx(FilterX, { className: "h-4 w-4" }), " Reset Filters"] }), jsxs("div", { className: "flex gap-2", children: [jsx(Button, { variant: "outline", onClick: onClose, className: "font-bold h-11 px-6", children: "Cancel" }), jsx(Button, { onClick: handleApply, className: "font-bold h-11 px-10 rounded-lg shadow-lg hover:shadow-xl transition-shadow", children: "Apply View" })] })] })] }) }) }));
160
154
  };
161
155
 
162
156
  export { AdvancedFilter };
@@ -1 +1 @@
1
- {"version":3,"file":"AdvancedFilter.js","sources":["../../src/components/AdvancedFilter.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { useState, useEffect, useCallback } from \"react\";\nimport {\n FilterRule,\n FilterGroup,\n ColumnDefinition,\n LogicalOperator,\n FilterOperator,\n FilterItem,\n} from \"../types\";\nimport { Button } from \"./ui/Button\";\nimport { Input } from \"./ui/Input\";\nimport { Select } from \"./ui/Select\";\nimport { Dialog } from \"./ui/Dialog\";\nimport {\n Plus,\n Trash2,\n Layers,\n Binary,\n FilterX,\n ListFilter,\n} from \"lucide-react\";\nimport { applyFilters } from \"../utils/filterLogic\";\n\ninterface AdvancedFilterProps<T> {\n isOpen: boolean;\n onClose: () => void;\n data: T[];\n columns: ColumnDefinition<T>[];\n setFilteredData: (data: T[]) => void;\n initialFilters?: FilterGroup<T>;\n}\n\nconst getOperatorsForType = (\n type: string\n): { value: FilterOperator; label: string }[] => {\n switch (type) {\n case \"string\":\n return [\n { value: \"contains\", label: \"Contains\" },\n { value: \"not_contains\", label: \"Does not contain\" },\n { value: \"equals\", label: \"Exact match\" },\n ];\n case \"select\":\n return [\n { value: \"equals\", label: \"Is\" },\n { value: \"not_equals\", label: \"Is not\" },\n ];\n case \"number\":\n return [\n { value: \"equals\", label: \"=\" },\n { value: \"not_equals\", label: \"!=\" },\n { value: \"gt\", label: \">\" },\n { value: \"lt\", label: \"<\" },\n { value: \"gte\", label: \">=\" },\n { value: \"lte\", label: \"<=\" },\n ];\n case \"date\":\n return [\n { value: \"is\", label: \"On date\" },\n { value: \"before\", label: \"Before\" },\n { value: \"after\", label: \"After\" },\n ];\n case \"boolean\":\n return [\n { value: \"true\", label: \"True\" },\n { value: \"false\", label: \"False\" },\n ];\n default:\n return [];\n }\n};\n\nconst FilterGroupUI = <T,>({\n group,\n depth,\n columns,\n onAddRule,\n onAddGroup,\n onUpdateRule,\n onUpdateGroupLogic,\n onRemoveItem,\n}: {\n group: FilterGroup<T>;\n depth: number;\n columns: ColumnDefinition<T>[];\n onAddRule: (parentId: string) => void;\n onAddGroup: (parentId: string) => void;\n onUpdateRule: (ruleId: string, updates: Partial<FilterRule<T>>) => void;\n onUpdateGroupLogic: (groupId: string, logic: LogicalOperator) => void;\n onRemoveItem: (itemId: string) => void;\n}) => {\n return (\n <div\n className={`rounded-lg border border-slate-200 bg-slate-50/50 p-4 mb-4 ${\n depth > 0 ? \"ml-6 md:ml-10 relative border-l-2 border-l-slate-300\" : \"\"\n }`}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-4 mb-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-widest text-slate-500\">\n Group Logic\n </span>\n <div className=\"flex rounded-md border border-slate-200 bg-white p-1 shadow-sm\">\n <button\n onClick={() => onUpdateGroupLogic(group.id, \"AND\")}\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\n group.logic === \"AND\"\n ? \"bg-slate-900 text-slate-50\"\n : \"text-slate-500 hover:text-slate-900\"\n }`}\n >\n AND\n </button>\n <button\n onClick={() => onUpdateGroupLogic(group.id, \"OR\")}\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\n group.logic === \"OR\"\n ? \"bg-slate-900 text-slate-50\"\n : \"text-slate-500 hover:text-slate-900\"\n }`}\n >\n OR\n </button>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onAddRule(group.id)}\n className=\"h-7 text-[10px] font-bold uppercase\"\n >\n <Plus className=\"mr-1 h-3 w-3\" /> Rule\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onAddGroup(group.id)}\n className=\"h-7 text-[10px] font-bold uppercase\"\n >\n <Layers className=\"mr-1 h-3 w-3\" /> Group\n </Button>\n {depth > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRemoveItem(group.id)}\n className=\"text-slate-400\"\n >\n <Trash2 className=\"h-5 w-5 text-red-500\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {group.items.map((item) => {\n const column = columns.find(\n (c) => c.id === (item.type === \"rule\" ? item.columnId : null)\n );\n return item.type === \"rule\" ? (\n <div\n key={item.id}\n className=\"flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm\"\n >\n <div className=\"flex-1 min-w-[140px]\">\n <Select\n value={item.columnId as string}\n options={columns.map((c) => ({\n value: c.id as string,\n label: c.label,\n }))}\n onValueChange={(val) => {\n const colId = val as keyof T;\n const col = columns.find((c) => c.id === colId);\n onUpdateRule(item.id, {\n columnId: colId,\n operator:\n col?.type === \"date\"\n ? \"is\"\n : col?.type === \"number\"\n ? \"equals\"\n : col?.type === \"select\"\n ? \"equals\"\n : \"contains\",\n value: \"\",\n });\n }}\n />\n </div>\n <div className=\"w-full md:w-44\">\n <Select\n value={item.operator}\n options={getOperatorsForType(column?.type || \"string\")}\n onValueChange={(val) =>\n onUpdateRule(item.id, { operator: val as FilterOperator })\n }\n />\n </div>\n <div className=\"flex-[1.5] min-w-[180px]\">\n {column?.type === \"date\" ? (\n <Input\n type=\"date\"\n value={item.value || \"\"}\n onChange={(e) =>\n onUpdateRule(item.id, { value: e.target.value })\n }\n />\n ) : column?.type === \"boolean\" ? (\n <div className=\"h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic\">\n <Binary className=\"h-3 w-3 mr-2\" />\n Binary state\n </div>\n ) : column?.type === \"select\" ? (\n <Select\n value={item.value || \"\"}\n placeholder=\"Choose option...\"\n options={(column.options || []).map((opt) => ({\n value: opt,\n label: opt,\n }))}\n onValueChange={(val) =>\n onUpdateRule(item.id, { value: val })\n }\n />\n ) : (\n <Input\n placeholder=\"Search query...\"\n value={item.value || \"\"}\n onChange={(e) =>\n onUpdateRule(item.id, { value: e.target.value })\n }\n />\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onRemoveItem(item.id)}\n className=\"h-9 w-9 text-slate-300 hover:text-red-500 hover:bg-red-50\"\n >\n <Trash2 className=\"h-5 w-5 text-red-500\" />\n </Button>\n </div>\n ) : (\n <FilterGroupUI\n group={item}\n depth={depth + 1}\n columns={columns}\n onAddRule={onAddRule}\n onAddGroup={onAddGroup}\n onUpdateRule={onUpdateRule}\n onUpdateGroupLogic={onUpdateGroupLogic}\n onRemoveItem={onRemoveItem}\n />\n );\n })}\n {group.items.length === 0 && (\n <div className=\"flex flex-col items-center justify-center py-6 rounded-md border border-dashed border-slate-200 bg-white/50\">\n <ListFilter className=\"h-5 w-5 text-slate-300 mb-1\" />\n <p className=\"text-[10px] text-slate-400 font-bold uppercase tracking-widest\">\n Add a rule to filter\n </p>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport const AdvancedFilter = <T,>({\n isOpen,\n onClose,\n data,\n columns,\n setFilteredData,\n initialFilters,\n}: AdvancedFilterProps<T>) => {\n const [rootGroup, setRootGroup] = useState<FilterGroup<T>>({\n type: \"group\",\n id: \"root\",\n logic: \"AND\",\n items: [],\n });\n\n useEffect(() => {\n if (initialFilters) setRootGroup(initialFilters);\n }, [initialFilters, isOpen]);\n\n const updateItemRecursively = useCallback(\n (\n group: FilterGroup<T>,\n targetId: string,\n updater: (item: FilterItem<T>) => FilterItem<T> | null\n ): FilterGroup<T> => {\n if (group.id === targetId) return updater(group) as FilterGroup<T>;\n return {\n ...group,\n items: group.items\n .map((item) => {\n if (item.id === targetId) return updater(item);\n if (item.type === \"group\")\n return updateItemRecursively(item, targetId, updater);\n return item;\n })\n .filter(Boolean) as FilterItem<T>[],\n };\n },\n []\n );\n\n const handleAddRule = useCallback(\n (parentId: string) => {\n const firstCol = columns[0];\n const newRule: FilterRule<T> = {\n type: \"rule\",\n id: Math.random().toString(36).substr(2, 9),\n columnId: firstCol.id,\n operator:\n firstCol.type === \"string\"\n ? \"contains\"\n : firstCol.type === \"select\"\n ? \"equals\"\n : \"equals\",\n value: \"\",\n };\n setRootGroup((prev) =>\n updateItemRecursively(prev, parentId, (group) => ({\n ...(group as FilterGroup<T>),\n items: [...(group as FilterGroup<T>).items, newRule],\n }))\n );\n },\n [columns, updateItemRecursively]\n );\n\n const handleAddGroup = useCallback(\n (parentId: string) => {\n const newGroup: FilterGroup<T> = {\n type: \"group\",\n id: Math.random().toString(36).substr(2, 9),\n logic: \"AND\",\n items: [],\n };\n setRootGroup((prev) =>\n updateItemRecursively(prev, parentId, (group) => ({\n ...(group as FilterGroup<T>),\n items: [...(group as FilterGroup<T>).items, newGroup],\n }))\n );\n },\n [updateItemRecursively]\n );\n\n const handleUpdateRule = useCallback(\n (ruleId: string, updates: Partial<FilterRule<T>>) => {\n setRootGroup((prev) =>\n updateItemRecursively(\n prev,\n ruleId,\n (rule) => ({ ...rule, ...updates } as FilterRule<T>)\n )\n );\n },\n [updateItemRecursively]\n );\n\n const handleUpdateGroupLogic = useCallback(\n (groupId: string, logic: LogicalOperator) => {\n setRootGroup((prev) =>\n updateItemRecursively(\n prev,\n groupId,\n (group) => ({ ...group, logic } as FilterGroup<T>)\n )\n );\n },\n [updateItemRecursively]\n );\n\n const handleRemoveItem = useCallback(\n (itemId: string) => {\n setRootGroup((prev) => updateItemRecursively(prev, itemId, () => null));\n },\n [updateItemRecursively]\n );\n\n const handleApply = () => {\n const filtered = applyFilters(data, rootGroup, columns);\n setFilteredData(filtered);\n onClose();\n };\n\n const handleClear = () => {\n const emptyGroup: FilterGroup<T> = {\n type: \"group\",\n id: \"root\",\n logic: \"AND\",\n items: [],\n };\n setRootGroup(emptyGroup);\n setFilteredData(data);\n onClose();\n };\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={onClose}\n title=\"Advanced Filters by arijit\"\n description=\"Refine your dataset using structured logic and multi-type comparisons.\"\n >\n <div className=\"max-h-[60vh] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32\">\n <FilterGroupUI\n group={rootGroup}\n depth={0}\n columns={columns}\n onAddRule={handleAddRule}\n onAddGroup={handleAddGroup}\n onUpdateRule={handleUpdateRule}\n onUpdateGroupLogic={handleUpdateGroupLogic}\n onRemoveItem={handleRemoveItem}\n />\n </div>\n <div className=\"flex w-full justify-between items-center gap-4\">\n <Button\n variant=\"ghost\"\n onClick={handleClear}\n className=\"text-slate-400 hover:text-red-500 font-black text-[10px] uppercase tracking-widest gap-2\"\n >\n <FilterX className=\"h-4 w-4\" /> Reset Filters\n </Button>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n className=\"font-bold h-11 px-6\"\n >\n Cancel\n </Button>\n <Button\n onClick={handleApply}\n className=\"bg-slate-900 font-bold h-11 px-10 rounded-lg shadow-lg hover:shadow-xl transition-shadow\"\n >\n Apply View\n </Button>\n </div>\n </div>\n </Dialog>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"AdvancedFilter.js","sources":["../../src/components/AdvancedFilter.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport {\n FilterRule,\n FilterGroup,\n ColumnDefinition,\n LogicalOperator,\n FilterOperator,\n FilterItem,\n} from \"../types\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"./ui/dialog\";\nimport {\n Plus,\n Trash2,\n Layers,\n Binary,\n FilterX,\n ListFilter,\n} from \"lucide-react\";\nimport { applyFilters } from \"../utils/filterLogic\";\n\ninterface AdvancedFilterProps<T> {\n isOpen: boolean;\n onClose: () => void;\n data: T[];\n columns: ColumnDefinition<T>[];\n setFilteredData: (data: T[]) => void;\n initialFilters?: FilterGroup<T>;\n}\n\nconst getOperatorsForType = (\n type: string\n): { value: FilterOperator; label: string }[] => {\n switch (type) {\n case \"string\":\n return [\n { value: \"contains\", label: \"Contains\" },\n { value: \"not_contains\", label: \"Does not contain\" },\n { value: \"equals\", label: \"Exact match\" },\n ];\n case \"select\":\n return [\n { value: \"equals\", label: \"Is\" },\n { value: \"not_equals\", label: \"Is not\" },\n ];\n case \"number\":\n return [\n { value: \"equals\", label: \"=\" },\n { value: \"not_equals\", label: \"!=\" },\n { value: \"gt\", label: \">\" },\n { value: \"lt\", label: \"<\" },\n { value: \"gte\", label: \">=\" },\n { value: \"lte\", label: \"<=\" },\n ];\n case \"date\":\n return [\n { value: \"is\", label: \"On date\" },\n { value: \"before\", label: \"Before\" },\n { value: \"after\", label: \"After\" },\n ];\n case \"boolean\":\n return [\n { value: \"true\", label: \"True\" },\n { value: \"false\", label: \"False\" },\n ];\n default:\n return [];\n }\n};\n\nconst FilterGroupUI = <T,>({\n group,\n depth,\n columns,\n onAddRule,\n onAddGroup,\n onUpdateRule,\n onUpdateGroupLogic,\n onRemoveItem,\n}: {\n group: FilterGroup<T>;\n depth: number;\n columns: ColumnDefinition<T>[];\n onAddRule: (parentId: string) => void;\n onAddGroup: (parentId: string) => void;\n onUpdateRule: (ruleId: string, updates: Partial<FilterRule<T>>) => void;\n onUpdateGroupLogic: (groupId: string, logic: LogicalOperator) => void;\n onRemoveItem: (itemId: string) => void;\n}) => {\n return (\n <div\n className={`rounded-lg border border-slate-200 bg-slate-50/50 p-4 mb-4 ${\n depth > 0 ? \"ml-6 md:ml-10 relative border-l-2 border-l-slate-300\" : \"\"\n }`}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-4 mb-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-widest text-slate-500\">\n Group Logic\n </span>\n <div className=\"flex rounded-md border border-slate-200 bg-white p-1 shadow-sm\">\n <button\n onClick={() => onUpdateGroupLogic(group.id, \"AND\")}\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\n group.logic === \"AND\"\n ? \"bg-slate-900 text-slate-50\"\n : \"text-slate-500 hover:text-slate-900\"\n }`}\n >\n AND\n </button>\n <button\n onClick={() => onUpdateGroupLogic(group.id, \"OR\")}\n className={`px-3 py-1 text-[10px] font-black rounded-sm transition-all ${\n group.logic === \"OR\"\n ? \"bg-slate-900 text-slate-50\"\n : \"text-slate-500 hover:text-slate-900\"\n }`}\n >\n OR\n </button>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onAddRule(group.id)}\n className=\"h-7 text-[10px] font-bold uppercase\"\n >\n <Plus className=\"mr-1 h-3 w-3\" /> Rule\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onAddGroup(group.id)}\n className=\"h-7 text-[10px] font-bold uppercase\"\n >\n <Layers className=\"mr-1 h-3 w-3\" /> Group\n </Button>\n {depth > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRemoveItem(group.id)}\n className=\"text-slate-400\"\n >\n <Trash2 className=\"h-5 w-5 text-red-500\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {group.items.map((item) => {\n const column = columns.find(\n (c) => c.id === (item.type === \"rule\" ? item.columnId : null)\n );\n return item.type === \"rule\" ? (\n <div\n key={item.id}\n className=\"flex flex-col md:flex-row md:items-center gap-3 p-3 bg-white border border-slate-200 rounded-md shadow-sm\"\n >\n <div className=\"flex-1 min-w-[140px]\">\n <Select\n value={item.columnId as string}\n onValueChange={(val) => {\n const colId = val as keyof T;\n const col = columns.find((c) => c.id === colId);\n onUpdateRule(item.id, {\n columnId: colId,\n operator:\n col?.type === \"date\"\n ? \"is\"\n : col?.type === \"number\"\n ? \"equals\"\n : col?.type === \"select\"\n ? \"equals\"\n : \"contains\",\n value: \"\",\n });\n }}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select column...\" />\n </SelectTrigger>\n <SelectContent>\n {columns.map((c) => (\n <SelectItem key={c.id as string} value={c.id as string}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"w-full md:w-44\">\n <Select\n value={item.operator}\n onValueChange={(val) =>\n onUpdateRule(item.id, { operator: val as FilterOperator })\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select operator...\" />\n </SelectTrigger>\n <SelectContent className=\"z-[100]\">\n {getOperatorsForType(column?.type || \"string\").map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex-[1.5] min-w-[180px]\">\n {column?.type === \"date\" ? (\n <Input\n type=\"date\"\n value={item.value || \"\"}\n onChange={(e) =>\n onUpdateRule(item.id, { value: e.target.value })\n }\n />\n ) : column?.type === \"boolean\" ? (\n <div className=\"h-10 flex items-center px-3 border border-slate-200 rounded-md bg-slate-50 text-[10px] font-black uppercase tracking-tighter text-slate-400 italic\">\n <Binary className=\"h-3 w-3 mr-2\" />\n Binary state\n </div>\n ) : column?.type === \"select\" ? (\n <Select\n value={item.value || \"\"}\n onValueChange={(val) =>\n onUpdateRule(item.id, { value: val })\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Choose option...\" />\n </SelectTrigger>\n <SelectContent className=\"z-[100]\">\n {(column.options || []).map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Input\n placeholder=\"Search query...\"\n value={item.value || \"\"}\n onChange={(e) =>\n onUpdateRule(item.id, { value: e.target.value })\n }\n />\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onRemoveItem(item.id)}\n className=\"h-9 w-9 text-slate-300 hover:text-red-500 hover:bg-red-50\"\n >\n <Trash2 className=\"h-5 w-5 text-red-500\" />\n </Button>\n </div>\n ) : (\n <FilterGroupUI\n group={item}\n depth={depth + 1}\n columns={columns}\n onAddRule={onAddRule}\n onAddGroup={onAddGroup}\n onUpdateRule={onUpdateRule}\n onUpdateGroupLogic={onUpdateGroupLogic}\n onRemoveItem={onRemoveItem}\n />\n );\n })}\n {group.items.length === 0 && (\n <div className=\"flex flex-col items-center justify-center py-6 rounded-md border border-dashed border-slate-200 bg-white/50\">\n <ListFilter className=\"h-5 w-5 text-slate-300 mb-1\" />\n <p className=\"text-[10px] text-slate-400 font-bold uppercase tracking-widest\">\n Add a rule to filter\n </p>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport const AdvancedFilter = <T,>({\n isOpen,\n onClose,\n data,\n columns,\n setFilteredData,\n initialFilters,\n}: AdvancedFilterProps<T>) => {\n const [rootGroup, setRootGroup] = useState<FilterGroup<T>>({\n type: \"group\",\n id: \"root\",\n logic: \"AND\",\n items: [],\n });\n\n useEffect(() => {\n if (initialFilters) setRootGroup(initialFilters);\n }, [initialFilters, isOpen]);\n\n const updateItemRecursively = useCallback(\n (\n group: FilterGroup<T>,\n targetId: string,\n updater: (item: FilterItem<T>) => FilterItem<T> | null\n ): FilterGroup<T> => {\n if (group.id === targetId) return updater(group) as FilterGroup<T>;\n return {\n ...group,\n items: group.items\n .map((item) => {\n if (item.id === targetId) return updater(item);\n if (item.type === \"group\")\n return updateItemRecursively(item, targetId, updater);\n return item;\n })\n .filter(Boolean) as FilterItem<T>[],\n };\n },\n []\n );\n\n const handleAddRule = useCallback(\n (parentId: string) => {\n const firstCol = columns[0];\n const newRule: FilterRule<T> = {\n type: \"rule\",\n id: Math.random().toString(36).substr(2, 9),\n columnId: firstCol.id,\n operator:\n firstCol.type === \"string\"\n ? \"contains\"\n : firstCol.type === \"select\"\n ? \"equals\"\n : \"equals\",\n value: \"\",\n };\n setRootGroup((prev) =>\n updateItemRecursively(prev, parentId, (group) => ({\n ...(group as FilterGroup<T>),\n items: [...(group as FilterGroup<T>).items, newRule],\n }))\n );\n },\n [columns, updateItemRecursively]\n );\n\n const handleAddGroup = useCallback(\n (parentId: string) => {\n const newGroup: FilterGroup<T> = {\n type: \"group\",\n id: Math.random().toString(36).substr(2, 9),\n logic: \"AND\",\n items: [],\n };\n setRootGroup((prev) =>\n updateItemRecursively(prev, parentId, (group) => ({\n ...(group as FilterGroup<T>),\n items: [...(group as FilterGroup<T>).items, newGroup],\n }))\n );\n },\n [updateItemRecursively]\n );\n\n const handleUpdateRule = useCallback(\n (ruleId: string, updates: Partial<FilterRule<T>>) => {\n setRootGroup((prev) =>\n updateItemRecursively(\n prev,\n ruleId,\n (rule) => ({ ...rule, ...updates } as FilterRule<T>)\n )\n );\n },\n [updateItemRecursively]\n );\n\n const handleUpdateGroupLogic = useCallback(\n (groupId: string, logic: LogicalOperator) => {\n setRootGroup((prev) =>\n updateItemRecursively(\n prev,\n groupId,\n (group) => ({ ...group, logic } as FilterGroup<T>)\n )\n );\n },\n [updateItemRecursively]\n );\n\n const handleRemoveItem = useCallback(\n (itemId: string) => {\n setRootGroup((prev) => updateItemRecursively(prev, itemId, () => null));\n },\n [updateItemRecursively]\n );\n\n const handleApply = () => {\n const filtered = applyFilters(data, rootGroup, columns);\n setFilteredData(filtered);\n onClose();\n };\n\n const handleClear = () => {\n const emptyGroup: FilterGroup<T> = {\n type: \"group\",\n id: \"root\",\n logic: \"AND\",\n items: [],\n };\n setRootGroup(emptyGroup);\n setFilteredData(data);\n onClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent className=\"min-w-[65vw]\">\n <DialogHeader>\n <DialogTitle>Advanced Filters</DialogTitle>\n <DialogDescription>\n Refine your dataset using structured logic and multi-type\n comparisons.\n </DialogDescription>\n <div className=\"max-h-[60vh] overflow-y-auto px-1 custom-scrollbar pr-3 pb-32\">\n <FilterGroupUI\n group={rootGroup}\n depth={0}\n columns={columns}\n onAddRule={handleAddRule}\n onAddGroup={handleAddGroup}\n onUpdateRule={handleUpdateRule}\n onUpdateGroupLogic={handleUpdateGroupLogic}\n onRemoveItem={handleRemoveItem}\n />\n </div>\n <div className=\"flex w-full justify-between items-center gap-4\">\n <Button\n variant=\"ghost\"\n onClick={handleClear}\n className=\"text-slate-400 hover:text-red-500 font-black text-[10px] uppercase tracking-widest gap-2\"\n >\n <FilterX className=\"h-4 w-4\" /> Reset Filters\n </Button>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n className=\"font-bold h-11 px-6\"\n >\n Cancel\n </Button>\n <Button\n onClick={handleApply}\n className=\"font-bold h-11 px-10 rounded-lg shadow-lg hover:shadow-xl transition-shadow\"\n >\n Apply View\n </Button>\n </div>\n </div>\n </DialogHeader>\n </DialogContent>\n </Dialog>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { TableData, ColumnDefinition } from '../types';
3
+ interface DataTableProps {
4
+ data: TableData[];
5
+ columnsDef: ColumnDefinition[];
6
+ }
7
+ declare const DataTable: React.FC<DataTableProps>;
8
+ export default DataTable;
@@ -1,7 +1,7 @@
1
- import React from 'react';
2
- interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
3
- variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
4
- size?: 'default' | 'sm' | 'lg' | 'icon';
5
- }
6
- export declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
7
- export {};
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const buttonVariants: any;
4
+ declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
5
+ asChild?: boolean;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ export { Button, buttonVariants };
@@ -1,24 +1,36 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import React from 'react';
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from '@/lib/utils';
3
5
 
4
- const Button = React.forwardRef(({ className = '', variant = 'default', size = 'default', ...props }, ref) => {
5
- const baseStyles = 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50';
6
- const variants = {
7
- default: 'bg-slate-900 text-slate-50 hover:bg-slate-900/90',
8
- destructive: 'bg-red-500 text-slate-50 hover:bg-red-500/90',
9
- outline: 'border border-slate-200 bg-white hover:bg-slate-100 hover:text-slate-900',
10
- secondary: 'bg-slate-100 text-slate-900 hover:bg-slate-100/80',
11
- ghost: 'hover:bg-slate-100 hover:text-slate-900',
12
- link: 'text-slate-900 underline-offset-4 hover:underline',
13
- };
14
- const sizes = {
15
- default: 'h-10 px-4 py-2',
16
- sm: 'h-9 rounded-md px-3',
17
- lg: 'h-11 rounded-md px-8',
18
- icon: 'h-10 w-10',
19
- };
20
- return (jsx("button", { ref: ref, className: `${baseStyles} ${variants[variant]} ${sizes[size]} ${className}`, ...props }));
6
+ const buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", {
7
+ variants: {
8
+ variant: {
9
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
10
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
11
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
12
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
13
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
14
+ link: "text-primary underline-offset-4 hover:underline",
15
+ },
16
+ size: {
17
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
18
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
19
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
20
+ icon: "size-9",
21
+ "icon-sm": "size-8",
22
+ "icon-lg": "size-10",
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ variant: "default",
27
+ size: "default",
28
+ },
21
29
  });
30
+ function Button({ className, variant = "default", size = "default", asChild = false, ...props }) {
31
+ const Comp = asChild ? Slot : "button";
32
+ return (jsx(Comp, { "data-slot": "button", "data-variant": variant, "data-size": size, className: cn(buttonVariants({ variant, size, className })), ...props }));
33
+ }
22
34
 
23
- export { Button };
24
- //# sourceMappingURL=Button.js.map
35
+ export { Button, buttonVariants };
36
+ //# sourceMappingURL=button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../../src/components/ui/Button.tsx"],"sourcesContent":["\nimport React from 'react';\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className = '', variant = 'default', size = 'default', ...props }, ref) => {\n const baseStyles = 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50';\n \n const variants = {\n default: 'bg-slate-900 text-slate-50 hover:bg-slate-900/90',\n destructive: 'bg-red-500 text-slate-50 hover:bg-red-500/90',\n outline: 'border border-slate-200 bg-white hover:bg-slate-100 hover:text-slate-900',\n secondary: 'bg-slate-100 text-slate-900 hover:bg-slate-100/80',\n ghost: 'hover:bg-slate-100 hover:text-slate-900',\n link: 'text-slate-900 underline-offset-4 hover:underline',\n };\n\n const sizes = {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n };\n\n return (\n <button\n ref={ref}\n className={`${baseStyles} ${variants[variant]} ${sizes[size]} ${className}`}\n {...props}\n />\n );\n }\n);\n"],"names":["_jsx"],"mappings":";;;AAQO,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CACpC,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,GAAG,SAAS,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;IAC3E,MAAM,UAAU,GAAG,wRAAwR;AAE3S,IAAA,MAAM,QAAQ,GAAG;AACf,QAAA,OAAO,EAAE,kDAAkD;AAC3D,QAAA,WAAW,EAAE,8CAA8C;AAC3D,QAAA,OAAO,EAAE,0EAA0E;AACnF,QAAA,SAAS,EAAE,mDAAmD;AAC9D,QAAA,KAAK,EAAE,yCAAyC;AAChD,QAAA,IAAI,EAAE,mDAAmD;KAC1D;AAED,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,OAAO,EAAE,gBAAgB;AACzB,QAAA,EAAE,EAAE,qBAAqB;AACzB,QAAA,EAAE,EAAE,sBAAsB;AAC1B,QAAA,IAAI,EAAE,WAAW;KAClB;IAED,QACEA,GAAA,CAAA,QAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,EAAA,GACvE,KAAK,EAAA,CACT;AAEN,CAAC;;;;"}
1
+ {"version":3,"file":"button.js","sources":["../../../src/components/ui/button.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n"],"names":["_jsx"],"mappings":";;;;;AAMA,MAAM,cAAc,GAAG,GAAG,CACxB,6bAA6b,EAC7b;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,wDAAwD;AACjE,YAAA,WAAW,EACT,mJAAmJ;AACrJ,YAAA,OAAO,EACL,uIAAuI;AACzI,YAAA,SAAS,EACP,8DAA8D;AAChE,YAAA,KAAK,EACH,sEAAsE;AACxE,YAAA,IAAI,EAAE,iDAAiD;AACxD,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,OAAO,EAAE,+BAA+B;AACxC,YAAA,EAAE,EAAE,+CAA+C;AACnD,YAAA,EAAE,EAAE,sCAAsC;AAC1C,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,SAAS;AACrB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,IAAI,EAAE,SAAS;AAChB,KAAA;AACF,CAAA;AAGH,SAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,SAAS,EAChB,OAAO,GAAG,KAAK,EACf,GAAG,KAAK,EAIP,EAAA;IACD,MAAM,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ;AAEtC,IAAA,QACEA,GAAA,CAAC,IAAI,EAAA,EAAA,WAAA,EACO,QAAQ,EAAA,cAAA,EACJ,OAAO,EAAA,WAAA,EACV,IAAI,EACf,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAAA,GACvD,KAAK,EAAA,CACT;AAEN;;;;"}
@@ -1,11 +1,15 @@
1
- import React from 'react';
2
- interface DialogProps {
3
- open: boolean;
4
- onOpenChange: (open: boolean) => void;
5
- title: string;
6
- description?: string;
7
- children: React.ReactNode;
8
- footer?: React.ReactNode;
9
- }
10
- export declare const Dialog: React.FC<DialogProps>;
11
- export {};
1
+ import * as React from "react";
2
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
3
+ declare function Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ declare function DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
5
+ declare function DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>): import("react/jsx-runtime").JSX.Element;
6
+ declare function DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>): import("react/jsx-runtime").JSX.Element;
7
+ declare function DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>): import("react/jsx-runtime").JSX.Element;
8
+ declare function DialogContent({ className, children, showCloseButton, ...props }: React.ComponentProps<typeof DialogPrimitive.Content> & {
9
+ showCloseButton?: boolean;
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ declare function DialogHeader({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
12
+ declare function DialogFooter({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
13
+ declare function DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>): import("react/jsx-runtime").JSX.Element;
14
+ declare function DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>): import("react/jsx-runtime").JSX.Element;
15
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
@@ -1,11 +1,29 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { X } from 'lucide-react';
2
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
3
+ import { XIcon } from 'lucide-react';
4
+ import { cn } from '@/lib/utils';
3
5
 
4
- const Dialog = ({ open, onOpenChange, title, description, children, footer }) => {
5
- if (!open)
6
- return null;
7
- return (jsx("div", { className: "fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-sm animate-in fade-in duration-200", children: jsxs("div", { className: "relative w-full max-w-4xl rounded-lg border border-slate-200 bg-white p-6 shadow-lg animate-in zoom-in-95 duration-200", children: [jsxs("div", { className: "flex flex-col space-y-1.5 text-center sm:text-left mb-6", children: [jsx("h2", { className: "text-lg font-semibold leading-none tracking-tight", children: title }), description && jsx("p", { className: "text-sm text-slate-500", children: description }), jsxs("button", { onClick: () => onOpenChange(false), className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-slate-950 focus:ring-offset-2 disabled:pointer-events-none", children: [jsx(X, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: "Close" })] })] }), jsx("div", { className: "py-2", children: children }), footer && (jsx("div", { className: "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 mt-6", children: footer }))] }) }));
8
- };
6
+ function Dialog({ ...props }) {
7
+ return jsx(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
8
+ }
9
+ function DialogPortal({ ...props }) {
10
+ return jsx(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
11
+ }
12
+ function DialogOverlay({ className, ...props }) {
13
+ return (jsx(DialogPrimitive.Overlay, { "data-slot": "dialog-overlay", className: cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", className), ...props }));
14
+ }
15
+ function DialogContent({ className, children, showCloseButton = true, ...props }) {
16
+ return (jsxs(DialogPortal, { "data-slot": "dialog-portal", children: [jsx(DialogOverlay, {}), jsxs(DialogPrimitive.Content, { "data-slot": "dialog-content", className: cn("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg", className), ...props, children: [children, showCloseButton && (jsxs(DialogPrimitive.Close, { "data-slot": "dialog-close", className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", children: [jsx(XIcon, {}), jsx("span", { className: "sr-only", children: "Close" })] }))] })] }));
17
+ }
18
+ function DialogHeader({ className, ...props }) {
19
+ return (jsx("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-2 text-center sm:text-left", className), ...props }));
20
+ }
21
+ function DialogTitle({ className, ...props }) {
22
+ return (jsx(DialogPrimitive.Title, { "data-slot": "dialog-title", className: cn("text-lg leading-none font-semibold", className), ...props }));
23
+ }
24
+ function DialogDescription({ className, ...props }) {
25
+ return (jsx(DialogPrimitive.Description, { "data-slot": "dialog-description", className: cn("text-muted-foreground text-sm", className), ...props }));
26
+ }
9
27
 
10
- export { Dialog };
11
- //# sourceMappingURL=Dialog.js.map
28
+ export { Dialog, DialogContent, DialogDescription, DialogHeader, DialogOverlay, DialogPortal, DialogTitle };
29
+ //# sourceMappingURL=dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","sources":["../../../src/components/ui/Dialog.tsx"],"sourcesContent":["\nimport React from 'react';\nimport { X } from 'lucide-react';\n\ninterface DialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nexport const Dialog: React.FC<DialogProps> = ({ open, onOpenChange, title, description, children, footer }) => {\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-slate-950/80 p-4 pt-[5vh] backdrop-blur-sm animate-in fade-in duration-200\">\n <div className=\"relative w-full max-w-4xl rounded-lg border border-slate-200 bg-white p-6 shadow-lg animate-in zoom-in-95 duration-200\">\n <div className=\"flex flex-col space-y-1.5 text-center sm:text-left mb-6\">\n <h2 className=\"text-lg font-semibold leading-none tracking-tight\">{title}</h2>\n {description && <p className=\"text-sm text-slate-500\">{description}</p>}\n <button\n onClick={() => onOpenChange(false)}\n className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-slate-950 focus:ring-offset-2 disabled:pointer-events-none\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </button>\n </div>\n <div className=\"py-2\">\n {children}\n </div>\n {footer && (\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 mt-6\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;AAaO,MAAM,MAAM,GAA0B,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAI;AAC5G,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAEtB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kJAAkJ,EAAA,QAAA,EAC/JC,cAAK,SAAS,EAAC,wHAAwH,EAAA,QAAA,EAAA,CACrIA,cAAK,SAAS,EAAC,yDAAyD,EAAA,QAAA,EAAA,CACtED,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAE,KAAK,GAAM,EAC7E,WAAW,IAAIA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAE,WAAW,EAAA,CAAK,EACvEC,iBACE,OAAO,EAAE,MAAM,YAAY,CAAC,KAAK,CAAC,EAClC,SAAS,EAAC,2MAA2M,aAErND,GAAA,CAAC,CAAC,IAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EACzBA,cAAM,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,OAAA,EAAA,CAAa,CAAA,EAAA,CAC/B,IACL,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,MAAM,EAAA,QAAA,EAClB,QAAQ,GACL,EACL,MAAM,KACLA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oEAAoE,YAChF,MAAM,EAAA,CACH,CACP,CAAA,EAAA,CACG,EAAA,CACF;AAEV;;;;"}
1
+ {"version":3,"file":"dialog.js","sources":["../../../src/components/ui/dialog.tsx"],"sourcesContent":["\"use client\"\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;AAOA,SAAS,MAAM,CAAC,EACd,GAAG,KAAK,EAC0C,EAAA;IAClD,OAAOA,GAAA,CAAC,eAAe,CAAC,IAAI,iBAAW,QAAQ,EAAA,GAAK,KAAK,EAAA,CAAI;AAC/D;AAQA,SAAS,YAAY,CAAC,EACpB,GAAG,KAAK,EAC4C,EAAA;IACpD,OAAOA,GAAA,CAAC,eAAe,CAAC,MAAM,iBAAW,eAAe,EAAA,GAAK,KAAK,EAAA,CAAI;AACxE;AAQA,SAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EAC6C,EAAA;IACrD,QACEA,IAAC,eAAe,CAAC,OAAO,EAAA,EAAA,WAAA,EACZ,gBAAgB,EAC1B,SAAS,EAAE,EAAE,CACX,wJAAwJ,EACxJ,SAAS,CACV,KACG,KAAK,EAAA,CACT;AAEN;AAEA,SAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,eAAe,GAAG,IAAI,EACtB,GAAG,KAAK,EAGT,EAAA;IACC,QACEC,IAAA,CAAC,YAAY,EAAA,EAAA,WAAA,EAAW,eAAe,EAAA,QAAA,EAAA,CACrCD,GAAA,CAAC,aAAa,EAAA,EAAA,CAAG,EACjBC,IAAA,CAAC,eAAe,CAAC,OAAO,EAAA,EAAA,WAAA,EACZ,gBAAgB,EAC1B,SAAS,EAAE,EAAE,CACX,0XAA0X,EAC1X,SAAS,CACV,EAAA,GACG,KAAK,EAAA,QAAA,EAAA,CAER,QAAQ,EACR,eAAe,KACdA,IAAA,CAAC,eAAe,CAAC,KAAK,EAAA,EAAA,WAAA,EACV,cAAc,EACxB,SAAS,EAAC,mWAAmW,EAAA,QAAA,EAAA,CAE7WD,GAAA,CAAC,KAAK,EAAA,EAAA,CAAG,EACTA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,OAAA,EAAA,CAAa,CAAA,EAAA,CAChB,CACzB,CAAA,EAAA,CACuB,CAAA,EAAA,CACb;AAEnB;AAEA,SAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B,EAAA;AACxE,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAA,WAAA,EACY,eAAe,EACzB,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,EAAA,GACpE,KAAK,EAAA,CACT;AAEN;AAeA,SAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EAC2C,EAAA;IACnD,QACEA,IAAC,eAAe,CAAC,KAAK,EAAA,EAAA,WAAA,EACV,cAAc,EACxB,SAAS,EAAE,EAAE,CAAC,oCAAoC,EAAE,SAAS,CAAC,KAC1D,KAAK,EAAA,CACT;AAEN;AAEA,SAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACiD,EAAA;IACzD,QACEA,IAAC,eAAe,CAAC,WAAW,EAAA,EAAA,WAAA,EAChB,oBAAoB,EAC9B,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,EAAA,CACT;AAEN;;;;"}
@@ -1,2 +1,3 @@
1
- import React from 'react';
2
- export declare const Input: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<HTMLInputElement>>;
1
+ import * as React from "react";
2
+ declare function Input({ className, type, ...props }: React.ComponentProps<"input">): import("react/jsx-runtime").JSX.Element;
3
+ export { Input };
@@ -1,9 +1,9 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import React from 'react';
2
+ import { cn } from '@/lib/utils';
3
3
 
4
- const Input = React.forwardRef(({ className = '', type, ...props }, ref) => {
5
- return (jsx("input", { type: type, className: `flex h-10 w-full rounded-md border border-slate-200 bg-white px-3 py-2 text-sm ring-offset-white file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-slate-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${className}`, ref: ref, ...props }));
6
- });
4
+ function Input({ className, type, ...props }) {
5
+ return (jsx("input", { type: type, "data-slot": "input", className: cn("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", className), ...props }));
6
+ }
7
7
 
8
8
  export { Input };
9
- //# sourceMappingURL=Input.js.map
9
+ //# sourceMappingURL=input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","sources":["../../../src/components/ui/Input.tsx"],"sourcesContent":["\nimport React from 'react';\n\nexport const Input = React.forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(\n ({ className = '', type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={`flex h-10 w-full rounded-md border border-slate-200 bg-white px-3 py-2 text-sm ring-offset-white file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-slate-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${className}`}\n ref={ref}\n {...props}\n />\n );\n }\n);\n"],"names":["_jsx"],"mappings":";;;MAGa,KAAK,GAAG,KAAK,CAAC,UAAU,CACnC,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;AAC1C,IAAA,QACEA,GAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,CAAA,qVAAA,EAAwV,SAAS,CAAA,CAAE,EAC9W,GAAG,EAAE,GAAG,KACJ,KAAK,EAAA,CACT;AAEN,CAAC;;;;"}
1
+ {"version":3,"file":"input.js","sources":["../../../src/components/ui/input.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n"],"names":["_jsx"],"mappings":";;;AAIA,SAAS,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAiC,EAAA;IACzE,QACEA,GAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAE,IAAI,eACA,OAAO,EACjB,SAAS,EAAE,EAAE,CACX,4bAA4b,EAC5b,+EAA+E,EAC/E,wGAAwG,EACxG,SAAS,CACV,EAAA,GACG,KAAK,EAAA,CACT;AAEN;;;;"}
@@ -1,13 +1,15 @@
1
- import React from 'react';
2
- interface SelectProps {
3
- value: string;
4
- onValueChange: (value: string) => void;
5
- options: {
6
- value: string;
7
- label: string;
8
- }[];
9
- placeholder?: string;
10
- className?: string;
11
- }
12
- export declare const Select: React.FC<SelectProps>;
13
- export {};
1
+ import * as React from "react";
2
+ import * as SelectPrimitive from "@radix-ui/react-select";
3
+ declare function Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ declare function SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>): import("react/jsx-runtime").JSX.Element;
5
+ declare function SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>): import("react/jsx-runtime").JSX.Element;
6
+ declare function SelectTrigger({ className, size, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
7
+ size?: "sm" | "default";
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ declare function SelectContent({ className, children, position, align, ...props }: React.ComponentProps<typeof SelectPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
10
+ declare function SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>): import("react/jsx-runtime").JSX.Element;
11
+ declare function SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>): import("react/jsx-runtime").JSX.Element;
12
+ declare function SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>): import("react/jsx-runtime").JSX.Element;
13
+ declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>): import("react/jsx-runtime").JSX.Element;
14
+ declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>): import("react/jsx-runtime").JSX.Element;
15
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
@@ -1,24 +1,31 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useRef, useEffect } from 'react';
3
- import { ChevronDown, Check } from 'lucide-react';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import * as SelectPrimitive from '@radix-ui/react-select';
3
+ import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from 'lucide-react';
4
+ import { cn } from '@/lib/utils';
4
5
 
5
- const Select = ({ value, onValueChange, options, placeholder = "Select...", className = "" }) => {
6
- const [isOpen, setIsOpen] = useState(false);
7
- const containerRef = useRef(null);
8
- const selected = options.find(o => o.value === value);
9
- useEffect(() => {
10
- const handleOutside = (e) => {
11
- if (containerRef.current && !containerRef.current.contains(e.target))
12
- setIsOpen(false);
13
- };
14
- document.addEventListener('mousedown', handleOutside);
15
- return () => document.removeEventListener('mousedown', handleOutside);
16
- }, []);
17
- return (jsxs("div", { className: `relative w-full ${className}`, ref: containerRef, style: { zIndex: isOpen ? 60 : 1 }, children: [jsxs("button", { type: "button", onClick: () => setIsOpen(!isOpen), className: "flex h-10 w-full items-center justify-between rounded-md border border-slate-200 bg-white px-3 py-2 text-sm ring-offset-white placeholder:text-slate-500 focus:outline-none focus:ring-2 focus:ring-slate-950 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors hover:border-slate-300", children: [jsx("span", { className: "truncate", children: selected ? selected.label : placeholder }), jsx(ChevronDown, { className: `h-4 w-4 opacity-50 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}` })] }), isOpen && (jsx("div", { className: "absolute top-full left-0 z-50 mt-1 min-w-[8rem] w-full max-h-[200px] overflow-y-auto rounded-md border border-slate-200 bg-white text-slate-950 shadow-xl animate-in fade-in zoom-in-95 duration-100", children: jsx("div", { className: "p-1", children: options.length > 0 ? options.map((opt) => (jsxs("button", { onClick: () => {
18
- onValueChange(opt.value);
19
- setIsOpen(false);
20
- }, className: `relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none hover:bg-slate-100 hover:text-slate-900 transition-colors ${opt.value === value ? 'bg-slate-100 font-medium' : ''}`, children: [opt.value === value && (jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: jsx(Check, { className: "h-4 w-4 text-slate-900" }) })), jsx("span", { className: "truncate", children: opt.label })] }, opt.value))) : (jsx("div", { className: "py-2 px-2 text-xs text-slate-400 italic text-center", children: "No options" })) }) }))] }));
21
- };
6
+ function Select({ ...props }) {
7
+ return jsx(SelectPrimitive.Root, { "data-slot": "select", ...props });
8
+ }
9
+ function SelectValue({ ...props }) {
10
+ return jsx(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
11
+ }
12
+ function SelectTrigger({ className, size = "default", children, ...props }) {
13
+ return (jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", "data-size": size, className: cn("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [children, jsx(SelectPrimitive.Icon, { asChild: true, children: jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })] }));
14
+ }
15
+ function SelectContent({ className, children, position = "item-aligned", align = "center", ...props }) {
16
+ return (jsx(SelectPrimitive.Portal, { children: jsxs(SelectPrimitive.Content, { "data-slot": "select-content", className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md", position === "popper" &&
17
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position, align: align, ...props, children: [jsx(SelectScrollUpButton, {}), jsx(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" &&
18
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"), children: children }), jsx(SelectScrollDownButton, {})] }) }));
19
+ }
20
+ function SelectItem({ className, children, ...props }) {
21
+ return (jsxs(SelectPrimitive.Item, { "data-slot": "select-item", className: cn("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className), ...props, children: [jsx("span", { "data-slot": "select-item-indicator", className: "absolute right-2 flex size-3.5 items-center justify-center", children: jsx(SelectPrimitive.ItemIndicator, { children: jsx(CheckIcon, { className: "size-4" }) }) }), jsx(SelectPrimitive.ItemText, { children: children })] }));
22
+ }
23
+ function SelectScrollUpButton({ className, ...props }) {
24
+ return (jsx(SelectPrimitive.ScrollUpButton, { "data-slot": "select-scroll-up-button", className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: jsx(ChevronUpIcon, { className: "size-4" }) }));
25
+ }
26
+ function SelectScrollDownButton({ className, ...props }) {
27
+ return (jsx(SelectPrimitive.ScrollDownButton, { "data-slot": "select-scroll-down-button", className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: jsx(ChevronDownIcon, { className: "size-4" }) }));
28
+ }
22
29
 
23
- export { Select };
24
- //# sourceMappingURL=Select.js.map
30
+ export { Select, SelectContent, SelectItem, SelectScrollDownButton, SelectScrollUpButton, SelectTrigger, SelectValue };
31
+ //# sourceMappingURL=select.js.map