@craftzbay/ui 0.8.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -6
- package/dist-lib/components/ui/Accordion.js +60 -0
- package/dist-lib/components/ui/Accordion.js.map +1 -0
- package/dist-lib/components/ui/Alert.d.ts +1 -1
- package/dist-lib/components/ui/Alert.js +66 -0
- package/dist-lib/components/ui/Alert.js.map +1 -0
- package/dist-lib/components/ui/Avatar.d.ts +2 -2
- package/dist-lib/components/ui/Avatar.js +96 -0
- package/dist-lib/components/ui/Avatar.js.map +1 -0
- package/dist-lib/components/ui/Badge.d.ts +1 -1
- package/dist-lib/components/ui/Badge.js +67 -0
- package/dist-lib/components/ui/Badge.js.map +1 -0
- package/dist-lib/components/ui/Breadcrumbs.js +34 -0
- package/dist-lib/components/ui/Breadcrumbs.js.map +1 -0
- package/dist-lib/components/ui/Button.d.ts +1 -1
- package/dist-lib/components/ui/Button.js +117 -0
- package/dist-lib/components/ui/Button.js.map +1 -0
- package/dist-lib/components/ui/Calendar.d.ts +7 -1
- package/dist-lib/components/ui/Calendar.js +111 -0
- package/dist-lib/components/ui/Calendar.js.map +1 -0
- package/dist-lib/components/ui/Card.d.ts +1 -1
- package/dist-lib/components/ui/Card.js +116 -0
- package/dist-lib/components/ui/Card.js.map +1 -0
- package/dist-lib/components/ui/Carousel.d.ts +5 -1
- package/dist-lib/components/ui/Carousel.js +143 -0
- package/dist-lib/components/ui/Carousel.js.map +1 -0
- package/dist-lib/components/ui/Chart.d.ts +26 -4
- package/dist-lib/components/ui/Chart.js +253 -0
- package/dist-lib/components/ui/Chart.js.map +1 -0
- package/dist-lib/components/ui/Checkbox.js +56 -0
- package/dist-lib/components/ui/Checkbox.js.map +1 -0
- package/dist-lib/components/ui/Combobox.d.ts +7 -0
- package/dist-lib/components/ui/Combobox.js +164 -0
- package/dist-lib/components/ui/Combobox.js.map +1 -0
- package/dist-lib/components/ui/CommandPalette.d.ts +3 -3
- package/dist-lib/components/ui/CommandPalette.js +174 -0
- package/dist-lib/components/ui/CommandPalette.js.map +1 -0
- package/dist-lib/components/ui/ContextMenu.js +150 -0
- package/dist-lib/components/ui/ContextMenu.js.map +1 -0
- package/dist-lib/components/ui/DataGrid.js +84 -0
- package/dist-lib/components/ui/DataGrid.js.map +1 -0
- package/dist-lib/components/ui/DatePicker.d.ts +16 -13
- package/dist-lib/components/ui/DatePicker.js +174 -0
- package/dist-lib/components/ui/DatePicker.js.map +1 -0
- package/dist-lib/components/ui/DesignSystemProvider.d.ts +8 -1
- package/dist-lib/components/ui/DesignSystemProvider.js +79 -0
- package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -0
- package/dist-lib/components/ui/Dialog.d.ts +1 -1
- package/dist-lib/components/ui/Dialog.js +140 -0
- package/dist-lib/components/ui/Dialog.js.map +1 -0
- package/dist-lib/components/ui/Drawer.d.ts +6 -0
- package/dist-lib/components/ui/Drawer.js +98 -0
- package/dist-lib/components/ui/Drawer.js.map +1 -0
- package/dist-lib/components/ui/DropdownMenu.js +164 -0
- package/dist-lib/components/ui/DropdownMenu.js.map +1 -0
- package/dist-lib/components/ui/EmptyState.js +32 -0
- package/dist-lib/components/ui/EmptyState.js.map +1 -0
- package/dist-lib/components/ui/ErrorState.js +48 -0
- package/dist-lib/components/ui/ErrorState.js.map +1 -0
- package/dist-lib/components/ui/FileUpload.d.ts +3 -0
- package/dist-lib/components/ui/FileUpload.js +108 -0
- package/dist-lib/components/ui/FileUpload.js.map +1 -0
- package/dist-lib/components/ui/Form.d.ts +1 -0
- package/dist-lib/components/ui/Form.js +105 -0
- package/dist-lib/components/ui/Form.js.map +1 -0
- package/dist-lib/components/ui/Icon.d.ts +34 -0
- package/dist-lib/components/ui/Icon.js +26 -0
- package/dist-lib/components/ui/Icon.js.map +1 -0
- package/dist-lib/components/ui/IconButton.d.ts +1 -1
- package/dist-lib/components/ui/IconButton.js +56 -0
- package/dist-lib/components/ui/IconButton.js.map +1 -0
- package/dist-lib/components/ui/Input.d.ts +6 -3
- package/dist-lib/components/ui/Input.js +135 -0
- package/dist-lib/components/ui/Input.js.map +1 -0
- package/dist-lib/components/ui/Kbd.js +24 -0
- package/dist-lib/components/ui/Kbd.js.map +1 -0
- package/dist-lib/components/ui/MultiSelect.d.ts +3 -1
- package/dist-lib/components/ui/MultiSelect.js +196 -0
- package/dist-lib/components/ui/MultiSelect.js.map +1 -0
- package/dist-lib/components/ui/Pagination.d.ts +23 -0
- package/dist-lib/components/ui/Pagination.js +148 -0
- package/dist-lib/components/ui/Pagination.js.map +1 -0
- package/dist-lib/components/ui/Popover.js +35 -0
- package/dist-lib/components/ui/Popover.js.map +1 -0
- package/dist-lib/components/ui/Progress.js +95 -0
- package/dist-lib/components/ui/Progress.js.map +1 -0
- package/dist-lib/components/ui/RadioGroup.js +64 -0
- package/dist-lib/components/ui/RadioGroup.js.map +1 -0
- package/dist-lib/components/ui/ScrollArea.js +44 -0
- package/dist-lib/components/ui/ScrollArea.js.map +1 -0
- package/dist-lib/components/ui/Select.js +131 -0
- package/dist-lib/components/ui/Select.js.map +1 -0
- package/dist-lib/components/ui/Separator.js +26 -0
- package/dist-lib/components/ui/Separator.js.map +1 -0
- package/dist-lib/components/ui/Sheet.d.ts +1 -1
- package/dist-lib/components/ui/Sheet.js +113 -0
- package/dist-lib/components/ui/Sheet.js.map +1 -0
- package/dist-lib/components/ui/Sidebar.d.ts +18 -6
- package/dist-lib/components/ui/Sidebar.js +169 -0
- package/dist-lib/components/ui/Sidebar.js.map +1 -0
- package/dist-lib/components/ui/Skeleton.js +28 -0
- package/dist-lib/components/ui/Skeleton.js.map +1 -0
- package/dist-lib/components/ui/Slider.js +52 -0
- package/dist-lib/components/ui/Slider.js.map +1 -0
- package/dist-lib/components/ui/Snackbar.d.ts +1 -1
- package/dist-lib/components/ui/Snackbar.js +56 -0
- package/dist-lib/components/ui/Snackbar.js.map +1 -0
- package/dist-lib/components/ui/Spinner.js +42 -0
- package/dist-lib/components/ui/Spinner.js.map +1 -0
- package/dist-lib/components/ui/Stepper.js +88 -0
- package/dist-lib/components/ui/Stepper.js.map +1 -0
- package/dist-lib/components/ui/Switch.js +77 -0
- package/dist-lib/components/ui/Switch.js.map +1 -0
- package/dist-lib/components/ui/Table.d.ts +9 -1
- package/dist-lib/components/ui/Table.js +157 -0
- package/dist-lib/components/ui/Table.js.map +1 -0
- package/dist-lib/components/ui/Tabs.d.ts +1 -1
- package/dist-lib/components/ui/Tabs.js +89 -0
- package/dist-lib/components/ui/Tabs.js.map +1 -0
- package/dist-lib/components/ui/TagInput.d.ts +17 -2
- package/dist-lib/components/ui/TagInput.js +111 -0
- package/dist-lib/components/ui/TagInput.js.map +1 -0
- package/dist-lib/components/ui/Textarea.js +77 -0
- package/dist-lib/components/ui/Textarea.js.map +1 -0
- package/dist-lib/components/ui/Timeline.d.ts +16 -6
- package/dist-lib/components/ui/Timeline.js +52 -0
- package/dist-lib/components/ui/Timeline.js.map +1 -0
- package/dist-lib/components/ui/Toast.d.ts +1 -1
- package/dist-lib/components/ui/Toast.js +171 -0
- package/dist-lib/components/ui/Toast.js.map +1 -0
- package/dist-lib/components/ui/Tooltip.js +58 -0
- package/dist-lib/components/ui/Tooltip.js.map +1 -0
- package/dist-lib/components/ui/TopNav.js +52 -0
- package/dist-lib/components/ui/TopNav.js.map +1 -0
- package/dist-lib/components/ui/Tree.d.ts +27 -5
- package/dist-lib/components/ui/Tree.js +167 -0
- package/dist-lib/components/ui/Tree.js.map +1 -0
- package/dist-lib/hooks/use-field-ids.d.ts +29 -0
- package/dist-lib/hooks/use-field-ids.js +18 -0
- package/dist-lib/hooks/use-field-ids.js.map +1 -0
- package/dist-lib/hooks/use-media-query.js +18 -0
- package/dist-lib/hooks/use-media-query.js.map +1 -0
- package/dist-lib/hooks/use-strings.d.ts +5 -0
- package/dist-lib/hooks/use-strings.js +12 -0
- package/dist-lib/hooks/use-strings.js.map +1 -0
- package/dist-lib/hooks/use-toast.js +36 -0
- package/dist-lib/hooks/use-toast.js.map +1 -0
- package/dist-lib/icon.d.ts +8 -0
- package/dist-lib/icon.js +7 -0
- package/dist-lib/icon.js.map +1 -0
- package/dist-lib/icons/index.d.ts +71 -11
- package/dist-lib/icons/index.js +145 -0
- package/dist-lib/icons/index.js.map +1 -0
- package/dist-lib/illustrations/index.js +105 -0
- package/dist-lib/illustrations/index.js.map +1 -0
- package/dist-lib/index.d.ts +62 -58
- package/dist-lib/index.js +268 -4386
- package/dist-lib/index.js.map +1 -1
- package/dist-lib/lib/strings.d.ts +129 -0
- package/dist-lib/lib/strings.js +85 -0
- package/dist-lib/lib/strings.js.map +1 -0
- package/dist-lib/lib/strings.mn.d.ts +3 -0
- package/dist-lib/lib/strings.mn.js +70 -0
- package/dist-lib/lib/strings.mn.js.map +1 -0
- package/dist-lib/lib/utils.d.ts +0 -1
- package/dist-lib/lib/utils.js +10 -0
- package/dist-lib/lib/utils.js.map +1 -0
- package/dist-lib/styles.css +1 -1
- package/dist-lib/theme.css +777 -0
- package/package.json +31 -8
- package/dist-lib/index.cjs +0 -8
- package/dist-lib/index.cjs.map +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as n, jsxs as l } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as d, useState as p, useEffect as f } from "react";
|
|
4
|
+
import { Command as m } from "cmdk";
|
|
5
|
+
import * as i from "@radix-ui/react-dialog";
|
|
6
|
+
import { Search as g } from "../../icons/index.js";
|
|
7
|
+
import { cn as r } from "../../lib/utils.js";
|
|
8
|
+
import { useStrings as x } from "../../hooks/use-strings.js";
|
|
9
|
+
const u = d(function({ className: e, ...t }, o) {
|
|
10
|
+
return /* @__PURE__ */ n(
|
|
11
|
+
m,
|
|
12
|
+
{
|
|
13
|
+
ref: o,
|
|
14
|
+
className: r(
|
|
15
|
+
"flex h-full w-full flex-col overflow-hidden rounded-lg bg-popover text-popover-foreground",
|
|
16
|
+
e
|
|
17
|
+
),
|
|
18
|
+
...t
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
u.displayName = "Command";
|
|
23
|
+
const y = d(function({ className: e, ...t }, o) {
|
|
24
|
+
return /* @__PURE__ */ l("div", { className: "flex items-center gap-2 border-b border-border px-3", "cmdk-input-wrapper": "", children: [
|
|
25
|
+
/* @__PURE__ */ n(g, { className: "size-4 shrink-0 text-foreground-subtle", "aria-hidden": !0 }),
|
|
26
|
+
/* @__PURE__ */ n(
|
|
27
|
+
m.Input,
|
|
28
|
+
{
|
|
29
|
+
ref: o,
|
|
30
|
+
className: r(
|
|
31
|
+
"flex h-11 w-full bg-transparent py-3 text-sm outline-none",
|
|
32
|
+
"placeholder:text-foreground-subtle disabled:cursor-not-allowed disabled:opacity-50",
|
|
33
|
+
e
|
|
34
|
+
),
|
|
35
|
+
...t
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
] });
|
|
39
|
+
});
|
|
40
|
+
y.displayName = "CommandInput";
|
|
41
|
+
const b = d(function({ className: e, ...t }, o) {
|
|
42
|
+
return /* @__PURE__ */ n(
|
|
43
|
+
m.List,
|
|
44
|
+
{
|
|
45
|
+
ref: o,
|
|
46
|
+
className: r("max-h-[320px] overflow-y-auto p-1", e),
|
|
47
|
+
...t
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
b.displayName = "CommandList";
|
|
52
|
+
const C = d(function(e, t) {
|
|
53
|
+
return /* @__PURE__ */ n(
|
|
54
|
+
m.Empty,
|
|
55
|
+
{
|
|
56
|
+
ref: t,
|
|
57
|
+
className: "py-8 text-center text-sm text-foreground-subtle",
|
|
58
|
+
...e
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
C.displayName = "CommandEmpty";
|
|
63
|
+
const h = d(function({ className: e, ...t }, o) {
|
|
64
|
+
return /* @__PURE__ */ n(
|
|
65
|
+
m.Group,
|
|
66
|
+
{
|
|
67
|
+
ref: o,
|
|
68
|
+
className: r(
|
|
69
|
+
"overflow-hidden text-foreground p-1",
|
|
70
|
+
"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5",
|
|
71
|
+
"[&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium",
|
|
72
|
+
"[&_[cmdk-group-heading]]:text-foreground-subtle",
|
|
73
|
+
e
|
|
74
|
+
),
|
|
75
|
+
...t
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
h.displayName = "CommandGroup";
|
|
80
|
+
const v = d(function({ className: e, ...t }, o) {
|
|
81
|
+
return /* @__PURE__ */ n(
|
|
82
|
+
m.Separator,
|
|
83
|
+
{
|
|
84
|
+
ref: o,
|
|
85
|
+
className: r("-mx-1 my-1 h-px bg-border", e),
|
|
86
|
+
...t
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
v.displayName = "CommandSeparator";
|
|
91
|
+
const N = d(function({ className: e, ...t }, o) {
|
|
92
|
+
return /* @__PURE__ */ n(
|
|
93
|
+
m.Item,
|
|
94
|
+
{
|
|
95
|
+
ref: o,
|
|
96
|
+
className: r(
|
|
97
|
+
"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-foreground outline-none",
|
|
98
|
+
"data-[selected=true]:bg-background-muted data-[selected=true]:text-foreground",
|
|
99
|
+
"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
|
|
100
|
+
"[&_svg]:size-4 [&_svg]:text-foreground-subtle",
|
|
101
|
+
e
|
|
102
|
+
),
|
|
103
|
+
...t
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
N.displayName = "CommandItem";
|
|
108
|
+
function E({ children: a, className: e }) {
|
|
109
|
+
return /* @__PURE__ */ n(
|
|
110
|
+
"span",
|
|
111
|
+
{
|
|
112
|
+
className: r(
|
|
113
|
+
"ml-auto inline-flex items-center gap-0.5 text-xs tracking-widest text-foreground-subtle font-mono",
|
|
114
|
+
e
|
|
115
|
+
),
|
|
116
|
+
children: a
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
function L({ open: a, onOpenChange: e, children: t, title: o }) {
|
|
121
|
+
const s = x();
|
|
122
|
+
return /* @__PURE__ */ n(i.Root, { open: a, onOpenChange: e, children: /* @__PURE__ */ l(i.Portal, { children: [
|
|
123
|
+
/* @__PURE__ */ n(
|
|
124
|
+
i.Overlay,
|
|
125
|
+
{
|
|
126
|
+
className: r(
|
|
127
|
+
"fixed inset-0 z-[var(--z-overlay)] bg-overlay",
|
|
128
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
129
|
+
"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0"
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ l(
|
|
134
|
+
i.Content,
|
|
135
|
+
{
|
|
136
|
+
"aria-describedby": void 0,
|
|
137
|
+
className: r(
|
|
138
|
+
"fixed left-1/2 top-[20%] z-[var(--z-modal)] -translate-x-1/2",
|
|
139
|
+
"w-[calc(100%-2rem)] max-w-[640px] overflow-hidden",
|
|
140
|
+
"rounded-lg border border-border bg-popover text-popover-foreground shadow-lg",
|
|
141
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
142
|
+
"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0",
|
|
143
|
+
"data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95"
|
|
144
|
+
),
|
|
145
|
+
children: [
|
|
146
|
+
/* @__PURE__ */ n(i.Title, { className: "sr-only", children: o ?? s.commandDialog.title }),
|
|
147
|
+
/* @__PURE__ */ n(u, { children: t })
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
)
|
|
151
|
+
] }) });
|
|
152
|
+
}
|
|
153
|
+
function D(a) {
|
|
154
|
+
const [e, t] = p(0);
|
|
155
|
+
f(() => {
|
|
156
|
+
const o = (s) => {
|
|
157
|
+
s.key === "k" && (s.metaKey || s.ctrlKey) && (s.preventDefault(), a(!0), t((c) => c + 1));
|
|
158
|
+
};
|
|
159
|
+
return window.addEventListener("keydown", o), () => window.removeEventListener("keydown", o);
|
|
160
|
+
}, [a]);
|
|
161
|
+
}
|
|
162
|
+
export {
|
|
163
|
+
u as Command,
|
|
164
|
+
L as CommandDialog,
|
|
165
|
+
C as CommandEmpty,
|
|
166
|
+
h as CommandGroup,
|
|
167
|
+
y as CommandInput,
|
|
168
|
+
N as CommandItem,
|
|
169
|
+
b as CommandList,
|
|
170
|
+
v as CommandSeparator,
|
|
171
|
+
E as CommandShortcut,
|
|
172
|
+
D as useCommandPaletteShortcut
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sources":["../../../src/components/ui/CommandPalette.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useEffect,\n useState,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Search } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\n\n/* -----------------------------------------------------------------------------\n * CommandPalette is a Dialog hosting a `cmdk` Command. It supports grouped\n * items, keyboard navigation (handled by cmdk), an empty state, and a\n * pluggable list of \"recent\" items shown when the search input is empty.\n * --------------------------------------------------------------------------- */\n\nexport const Command = forwardRef<\n ElementRef<typeof CommandPrimitive>,\n ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(function Command({ className, ...props }, ref) {\n return (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-lg bg-popover text-popover-foreground',\n className,\n )}\n {...props}\n />\n );\n});\nCommand.displayName = 'Command';\n\nexport const CommandInput = forwardRef<\n ElementRef<typeof CommandPrimitive.Input>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(function CommandInput({ className, ...props }, ref) {\n return (\n <div className=\"flex items-center gap-2 border-b border-border px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"size-4 shrink-0 text-foreground-subtle\" aria-hidden />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-11 w-full bg-transparent py-3 text-sm outline-none',\n 'placeholder:text-foreground-subtle disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n );\n});\nCommandInput.displayName = 'CommandInput';\n\nexport const CommandList = forwardRef<\n ElementRef<typeof CommandPrimitive.List>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(function CommandList({ className, ...props }, ref) {\n return (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[320px] overflow-y-auto p-1', className)}\n {...props}\n />\n );\n});\nCommandList.displayName = 'CommandList';\n\nexport const CommandEmpty = forwardRef<\n ElementRef<typeof CommandPrimitive.Empty>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>(function CommandEmpty(props, ref) {\n return (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-8 text-center text-sm text-foreground-subtle\"\n {...props}\n />\n );\n});\nCommandEmpty.displayName = 'CommandEmpty';\n\nexport const CommandGroup = forwardRef<\n ElementRef<typeof CommandPrimitive.Group>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(function CommandGroup({ className, ...props }, ref) {\n return (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden text-foreground p-1',\n '[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5',\n '[&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n '[&_[cmdk-group-heading]]:text-foreground-subtle',\n className,\n )}\n {...props}\n />\n );\n});\nCommandGroup.displayName = 'CommandGroup';\n\nexport const CommandSeparator = forwardRef<\n ElementRef<typeof CommandPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(function CommandSeparator({ className, ...props }, ref) {\n return (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n );\n});\nCommandSeparator.displayName = 'CommandSeparator';\n\nexport const CommandItem = forwardRef<\n ElementRef<typeof CommandPrimitive.Item>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(function CommandItem({ className, ...props }, ref) {\n return (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-foreground outline-none',\n 'data-[selected=true]:bg-background-muted data-[selected=true]:text-foreground',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50',\n '[&_svg]:size-4 [&_svg]:text-foreground-subtle',\n className,\n )}\n {...props}\n />\n );\n});\nCommandItem.displayName = 'CommandItem';\n\nexport function CommandShortcut({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <span\n className={cn(\n 'ml-auto inline-flex items-center gap-0.5 text-xs tracking-widest text-foreground-subtle font-mono',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\n/* -----------------------------------------------------------------------------\n * Dialog wrapper — a ready-to-use ⌘K palette.\n * --------------------------------------------------------------------------- */\n\nexport interface CommandDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: ReactNode;\n /** Visible label for screen readers. */\n title?: string;\n}\n\nexport function CommandDialog({ open, onOpenChange, children, title }: CommandDialogProps) {\n const strings = useStrings();\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-[var(--z-overlay)] bg-overlay',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0',\n )}\n />\n <DialogPrimitive.Content\n aria-describedby={undefined}\n className={cn(\n 'fixed left-1/2 top-[20%] z-[var(--z-modal)] -translate-x-1/2',\n 'w-[calc(100%-2rem)] max-w-[640px] overflow-hidden',\n 'rounded-lg border border-border bg-popover text-popover-foreground shadow-lg',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0',\n 'data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95',\n )}\n >\n <DialogPrimitive.Title className=\"sr-only\">\n {title ?? strings.commandDialog.title}\n </DialogPrimitive.Title>\n <Command>{children}</Command>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n\n/**\n * Hook that wires ⌘K / Ctrl+K to a setter — the canonical way to mount the\n * palette in an app shell.\n *\n * @example\n * const [open, setOpen] = useState(false);\n * useCommandPaletteShortcut(setOpen);\n * …\n * <CommandDialog open={open} onOpenChange={setOpen}>\n * <CommandInput placeholder=\"Type a command…\" />\n * <CommandList>\n * <CommandEmpty>No results.</CommandEmpty>\n * <CommandGroup heading=\"Suggestions\">\n * <CommandItem>Create project</CommandItem>\n * <CommandItem>Invite teammate</CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </CommandDialog>\n *\n * @do Group items by category. Show \"Recent\" first when the query is empty.\n * @dont Hide essential actions behind the palette only — keep at least one\n * button entry in the UI.\n */\nexport function useCommandPaletteShortcut(setOpen: (open: boolean) => void): void {\n const [_, force] = useState(0);\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'k' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setOpen(true);\n force((n) => n + 1);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [setOpen]);\n}\n"],"names":["Command","forwardRef","className","props","ref","jsx","CommandPrimitive","cn","CommandInput","jsxs","Search","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","CommandShortcut","children","CommandDialog","open","onOpenChange","title","strings","useStrings","DialogPrimitive","useCommandPaletteShortcut","setOpen","_","force","useState","useEffect","onKey","e","n"],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as c, jsx as a } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as s } from "react";
|
|
4
|
+
import * as t from "@radix-ui/react-context-menu";
|
|
5
|
+
import { Check as l, Circle as m, ChevronRight as x } from "../../icons/index.js";
|
|
6
|
+
import { cn as r } from "../../lib/utils.js";
|
|
7
|
+
const k = t.Root, w = t.Trigger, T = t.Group, p = t.Portal, j = t.Sub, G = t.RadioGroup, d = r(
|
|
8
|
+
"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-foreground outline-none",
|
|
9
|
+
"data-[highlighted]:bg-background-muted data-[highlighted]:text-foreground",
|
|
10
|
+
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
|
|
11
|
+
), C = s(function({ className: e, children: n, ...o }, i) {
|
|
12
|
+
return /* @__PURE__ */ c(
|
|
13
|
+
t.SubTrigger,
|
|
14
|
+
{
|
|
15
|
+
ref: i,
|
|
16
|
+
className: r(d, "data-[state=open]:bg-background-muted", e),
|
|
17
|
+
...o,
|
|
18
|
+
children: [
|
|
19
|
+
n,
|
|
20
|
+
/* @__PURE__ */ a(x, { className: "ml-auto size-4 text-foreground-subtle", "aria-hidden": !0 })
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
C.displayName = "ContextMenuSubTrigger";
|
|
26
|
+
const g = s(function({ className: e, ...n }, o) {
|
|
27
|
+
return /* @__PURE__ */ a(
|
|
28
|
+
t.SubContent,
|
|
29
|
+
{
|
|
30
|
+
ref: o,
|
|
31
|
+
className: r(
|
|
32
|
+
"z-[var(--z-popover)] min-w-[8rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md",
|
|
33
|
+
e
|
|
34
|
+
),
|
|
35
|
+
...n
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
g.displayName = "ContextMenuSubContent";
|
|
40
|
+
const b = s(function({ className: e, ...n }, o) {
|
|
41
|
+
return /* @__PURE__ */ a(p, { children: /* @__PURE__ */ a(
|
|
42
|
+
t.Content,
|
|
43
|
+
{
|
|
44
|
+
ref: o,
|
|
45
|
+
className: r(
|
|
46
|
+
"z-[var(--z-popover)] min-w-[12rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md",
|
|
47
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
48
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
49
|
+
e
|
|
50
|
+
),
|
|
51
|
+
...n
|
|
52
|
+
}
|
|
53
|
+
) });
|
|
54
|
+
});
|
|
55
|
+
b.displayName = "ContextMenuContent";
|
|
56
|
+
const f = s(function({ className: e, destructive: n, ...o }, i) {
|
|
57
|
+
return /* @__PURE__ */ a(
|
|
58
|
+
t.Item,
|
|
59
|
+
{
|
|
60
|
+
ref: i,
|
|
61
|
+
className: r(
|
|
62
|
+
d,
|
|
63
|
+
n && "text-danger-text data-[highlighted]:bg-danger-soft data-[highlighted]:text-danger-text",
|
|
64
|
+
e
|
|
65
|
+
),
|
|
66
|
+
...o
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
f.displayName = "ContextMenuItem";
|
|
71
|
+
const h = s(function({ className: e, children: n, ...o }, i) {
|
|
72
|
+
return /* @__PURE__ */ c(
|
|
73
|
+
t.CheckboxItem,
|
|
74
|
+
{
|
|
75
|
+
ref: i,
|
|
76
|
+
className: r(d, "pl-8", e),
|
|
77
|
+
...o,
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ a("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ a(t.ItemIndicator, { children: /* @__PURE__ */ a(l, { className: "size-4 text-accent", "aria-hidden": !0 }) }) }),
|
|
80
|
+
n
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
h.displayName = "ContextMenuCheckboxItem";
|
|
86
|
+
const M = s(function({ className: e, children: n, ...o }, i) {
|
|
87
|
+
return /* @__PURE__ */ c(
|
|
88
|
+
t.RadioItem,
|
|
89
|
+
{
|
|
90
|
+
ref: i,
|
|
91
|
+
className: r(d, "pl-8", e),
|
|
92
|
+
...o,
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ a("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ a(t.ItemIndicator, { children: /* @__PURE__ */ a(m, { className: "size-2 fill-accent text-accent", "aria-hidden": !0 }) }) }),
|
|
95
|
+
n
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
M.displayName = "ContextMenuRadioItem";
|
|
101
|
+
const N = s(function({ className: e, ...n }, o) {
|
|
102
|
+
return /* @__PURE__ */ a(
|
|
103
|
+
t.Label,
|
|
104
|
+
{
|
|
105
|
+
ref: o,
|
|
106
|
+
className: r("px-2 py-1.5 text-xs font-medium text-foreground-subtle", e),
|
|
107
|
+
...n
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
N.displayName = "ContextMenuLabel";
|
|
112
|
+
const I = s(function({ className: e, ...n }, o) {
|
|
113
|
+
return /* @__PURE__ */ a(
|
|
114
|
+
t.Separator,
|
|
115
|
+
{
|
|
116
|
+
ref: o,
|
|
117
|
+
className: r("-mx-1 my-1 h-px bg-border", e),
|
|
118
|
+
...n
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
I.displayName = "ContextMenuSeparator";
|
|
123
|
+
function S({ className: u, ...e }) {
|
|
124
|
+
return /* @__PURE__ */ a(
|
|
125
|
+
"span",
|
|
126
|
+
{
|
|
127
|
+
className: r("ml-auto text-xs tracking-widest text-foreground-subtle font-mono", u),
|
|
128
|
+
...e
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
S.displayName = "ContextMenuShortcut";
|
|
133
|
+
export {
|
|
134
|
+
k as ContextMenu,
|
|
135
|
+
h as ContextMenuCheckboxItem,
|
|
136
|
+
b as ContextMenuContent,
|
|
137
|
+
T as ContextMenuGroup,
|
|
138
|
+
f as ContextMenuItem,
|
|
139
|
+
N as ContextMenuLabel,
|
|
140
|
+
p as ContextMenuPortal,
|
|
141
|
+
G as ContextMenuRadioGroup,
|
|
142
|
+
M as ContextMenuRadioItem,
|
|
143
|
+
I as ContextMenuSeparator,
|
|
144
|
+
S as ContextMenuShortcut,
|
|
145
|
+
j as ContextMenuSub,
|
|
146
|
+
g as ContextMenuSubContent,
|
|
147
|
+
C as ContextMenuSubTrigger,
|
|
148
|
+
w as ContextMenuTrigger
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=ContextMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.js","sources":["../../../src/components/ui/ContextMenu.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n} from 'react';\nimport * as ContextMenuPrimitive from '@radix-ui/react-context-menu';\nimport { Check, ChevronRight, Circle } from '@/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Right-click (or two-finger tap) menu. Visual surface mirrors DropdownMenu\n * for consistency.\n *\n * @example\n * <ContextMenu>\n * <ContextMenuTrigger asChild>\n * <div className=\"grid h-32 place-items-center rounded-lg border border-border\">\n * Right-click me\n * </div>\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <ContextMenuItem>Open</ContextMenuItem>\n * <ContextMenuSeparator />\n * <ContextMenuItem destructive>Delete</ContextMenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n *\n * @do Mirror DropdownMenu items for the same surface — users expect the same\n * operations from both.\n * @dont Hide critical actions behind right-click — they must also exist in\n * a visible button or menu.\n */\nexport const ContextMenu = ContextMenuPrimitive.Root;\nexport const ContextMenuTrigger = ContextMenuPrimitive.Trigger;\nexport const ContextMenuGroup = ContextMenuPrimitive.Group;\nexport const ContextMenuPortal = ContextMenuPrimitive.Portal;\nexport const ContextMenuSub = ContextMenuPrimitive.Sub;\nexport const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\n\nconst itemClasses = cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-foreground outline-none',\n 'data-[highlighted]:bg-background-muted data-[highlighted]:text-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n);\n\nexport const ContextMenuSubTrigger = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger>\n>(function ContextMenuSubTrigger({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(itemClasses, 'data-[state=open]:bg-background-muted', className)}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto size-4 text-foreground-subtle\" aria-hidden />\n </ContextMenuPrimitive.SubTrigger>\n );\n});\nContextMenuSubTrigger.displayName = 'ContextMenuSubTrigger';\n\nexport const ContextMenuSubContent = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.SubContent>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(function ContextMenuSubContent({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-[var(--z-popover)] min-w-[8rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md',\n className,\n )}\n {...props}\n />\n );\n});\nContextMenuSubContent.displayName = 'ContextMenuSubContent';\n\nexport const ContextMenuContent = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Content>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(function ContextMenuContent({ className, ...props }, ref) {\n return (\n <ContextMenuPortal>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(\n 'z-[var(--z-popover)] min-w-[12rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n </ContextMenuPortal>\n );\n});\nContextMenuContent.displayName = 'ContextMenuContent';\n\nexport const ContextMenuItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Item>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & { destructive?: boolean }\n>(function ContextMenuItem({ className, destructive, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n itemClasses,\n destructive &&\n 'text-danger-text data-[highlighted]:bg-danger-soft data-[highlighted]:text-danger-text',\n className,\n )}\n {...props}\n />\n );\n});\nContextMenuItem.displayName = 'ContextMenuItem';\n\nexport const ContextMenuCheckboxItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(function ContextMenuCheckboxItem({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(itemClasses, 'pl-8', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex size-4 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"size-4 text-accent\" aria-hidden />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n});\nContextMenuCheckboxItem.displayName = 'ContextMenuCheckboxItem';\n\nexport const ContextMenuRadioItem = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(function ContextMenuRadioItem({ className, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(itemClasses, 'pl-8', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex size-4 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"size-2 fill-accent text-accent\" aria-hidden />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n});\nContextMenuRadioItem.displayName = 'ContextMenuRadioItem';\n\nexport const ContextMenuLabel = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Label>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label>\n>(function ContextMenuLabel({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-xs font-medium text-foreground-subtle', className)}\n {...props}\n />\n );\n});\nContextMenuLabel.displayName = 'ContextMenuLabel';\n\nexport const ContextMenuSeparator = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(function ContextMenuSeparator({ className, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n );\n});\nContextMenuSeparator.displayName = 'ContextMenuSeparator';\n\nexport function ContextMenuShortcut({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest text-foreground-subtle font-mono', className)}\n {...props}\n />\n );\n}\nContextMenuShortcut.displayName = 'ContextMenuShortcut';\n"],"names":["ContextMenu","ContextMenuPrimitive","ContextMenuTrigger","ContextMenuGroup","ContextMenuPortal","ContextMenuSub","ContextMenuRadioGroup","itemClasses","cn","ContextMenuSubTrigger","forwardRef","className","children","props","ref","jsxs","jsx","ChevronRight","ContextMenuSubContent","ContextMenuContent","ContextMenuItem","destructive","ContextMenuCheckboxItem","Check","ContextMenuRadioItem","Circle","ContextMenuLabel","ContextMenuSeparator","ContextMenuShortcut"],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as d, jsx as r } from "react/jsx-runtime";
|
|
3
|
+
import { useState as x, useMemo as v } from "react";
|
|
4
|
+
import { Settings as C } from "../../icons/index.js";
|
|
5
|
+
import { cn as c } from "../../lib/utils.js";
|
|
6
|
+
import { useStrings as N } from "../../hooks/use-strings.js";
|
|
7
|
+
import { DropdownMenu as S, DropdownMenuTrigger as T, DropdownMenuContent as D, DropdownMenuLabel as M, DropdownMenuSeparator as G, DropdownMenuCheckboxItem as H } from "./DropdownMenu.js";
|
|
8
|
+
import { IconButton as j } from "./IconButton.js";
|
|
9
|
+
import { Input as I } from "./Input.js";
|
|
10
|
+
import { Table as R, TableHeader as B, TableRow as o, TableSortHeader as L, TableHead as A, TableBody as K, TableCell as m } from "./Table.js";
|
|
11
|
+
import { Skeleton as P } from "./Skeleton.js";
|
|
12
|
+
function U({
|
|
13
|
+
columns: h,
|
|
14
|
+
rows: p,
|
|
15
|
+
loading: g,
|
|
16
|
+
sort: b,
|
|
17
|
+
onSortChange: u,
|
|
18
|
+
filter: a,
|
|
19
|
+
emptyState: f,
|
|
20
|
+
className: y
|
|
21
|
+
}) {
|
|
22
|
+
const n = N(), [s, k] = x({}), t = v(() => h.filter((e) => !s[e.key]), [h, s]), w = () => g ? Array.from({ length: 5 }).map((e, l) => /* @__PURE__ */ r(o, { children: t.map((i) => /* @__PURE__ */ r(m, { children: /* @__PURE__ */ r(P, { variant: "text", className: "w-3/4" }) }, i.key)) }, `skel-${l}`)) : p.length === 0 ? /* @__PURE__ */ r(o, { children: /* @__PURE__ */ r(m, { colSpan: t.length, className: "h-32 text-center", children: f ?? /* @__PURE__ */ r("span", { className: "text-foreground-subtle", children: n.dataGrid.empty }) }) }) : p.map((e) => /* @__PURE__ */ r(o, { children: t.map((l) => /* @__PURE__ */ r(
|
|
23
|
+
m,
|
|
24
|
+
{
|
|
25
|
+
className: c(l.align === "right" && "text-right tabular"),
|
|
26
|
+
children: l.cell ? l.cell(e) : e[l.key]
|
|
27
|
+
},
|
|
28
|
+
l.key
|
|
29
|
+
)) }, e.id));
|
|
30
|
+
return /* @__PURE__ */ d("div", { className: c("flex flex-col gap-3", y), children: [
|
|
31
|
+
/* @__PURE__ */ d("div", { className: "flex items-center justify-between gap-2", children: [
|
|
32
|
+
a ? /* @__PURE__ */ r(
|
|
33
|
+
I,
|
|
34
|
+
{
|
|
35
|
+
type: "search",
|
|
36
|
+
placeholder: a.placeholder ?? n.dataGrid.filterPlaceholder,
|
|
37
|
+
value: a.value,
|
|
38
|
+
onChange: (e) => a.onChange(e.target.value),
|
|
39
|
+
clearable: !0,
|
|
40
|
+
onClear: () => a.onChange(""),
|
|
41
|
+
className: "max-w-sm w-full",
|
|
42
|
+
hideLabel: !0,
|
|
43
|
+
label: n.dataGrid.filterRows
|
|
44
|
+
}
|
|
45
|
+
) : /* @__PURE__ */ r("div", {}),
|
|
46
|
+
/* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ d(S, { children: [
|
|
47
|
+
/* @__PURE__ */ r(T, { asChild: !0, children: /* @__PURE__ */ r(j, { "aria-label": n.dataGrid.columnVisibility, icon: /* @__PURE__ */ r(C, {}), variant: "outline" }) }),
|
|
48
|
+
/* @__PURE__ */ d(D, { children: [
|
|
49
|
+
/* @__PURE__ */ r(M, { children: n.dataGrid.columns }),
|
|
50
|
+
/* @__PURE__ */ r(G, {}),
|
|
51
|
+
h.map((e) => /* @__PURE__ */ r(
|
|
52
|
+
H,
|
|
53
|
+
{
|
|
54
|
+
checked: !s[e.key],
|
|
55
|
+
onCheckedChange: (l) => k((i) => ({ ...i, [e.key]: !l })),
|
|
56
|
+
children: e.header
|
|
57
|
+
},
|
|
58
|
+
e.key
|
|
59
|
+
))
|
|
60
|
+
] })
|
|
61
|
+
] }) })
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ r("div", { className: "rounded-lg border border-border overflow-hidden", children: /* @__PURE__ */ d(R, { children: [
|
|
64
|
+
/* @__PURE__ */ r("colgroup", { children: t.map((e) => /* @__PURE__ */ r("col", { style: e.width ? { width: e.width } : void 0 }, e.key)) }),
|
|
65
|
+
/* @__PURE__ */ r(B, { children: /* @__PURE__ */ r(o, { children: t.map(
|
|
66
|
+
(e) => e.sortable && u ? /* @__PURE__ */ r(
|
|
67
|
+
L,
|
|
68
|
+
{
|
|
69
|
+
sortKey: e.key,
|
|
70
|
+
currentSort: b ?? null,
|
|
71
|
+
onSortChange: (l, i) => u({ key: l, direction: i }),
|
|
72
|
+
children: e.header
|
|
73
|
+
},
|
|
74
|
+
e.key
|
|
75
|
+
) : /* @__PURE__ */ r(A, { className: c(e.align === "right" && "text-right"), children: e.header }, e.key)
|
|
76
|
+
) }) }),
|
|
77
|
+
/* @__PURE__ */ r(K, { children: w() })
|
|
78
|
+
] }) })
|
|
79
|
+
] });
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
U as DataGrid
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=DataGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid.js","sources":["../../../src/components/ui/DataGrid.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo, useState, type ReactNode } from 'react';\nimport { Settings } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from './DropdownMenu';\nimport { IconButton } from './IconButton';\nimport { Input } from './Input';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n TableSortHeader,\n} from './Table';\nimport { Skeleton } from './Skeleton';\n\nexport interface DataGridColumn<TRow> {\n /** Stable key used for visibility, sort, and React lists. */\n key: string;\n /** Header label. */\n header: ReactNode;\n /** Render the cell. Defaults to the value at `row[key]`. */\n cell?: (row: TRow) => ReactNode;\n /** Cell width — passed to `<col>` so the grid keeps shape during loading. */\n width?: string;\n /** Allow sorting on this column. */\n sortable?: boolean;\n /** Right-align numeric / monetary columns. */\n align?: 'left' | 'right';\n}\n\nexport interface DataGridProps<TRow extends { id: string | number }> {\n columns: DataGridColumn<TRow>[];\n rows: TRow[];\n loading?: boolean;\n /** Initial sort state. */\n sort?: { key: string; direction: 'asc' | 'desc' } | null;\n onSortChange?: (sort: { key: string; direction: 'asc' | 'desc' }) => void;\n /** Show a filter input row above the grid. */\n filter?: { value: string; onChange: (q: string) => void; placeholder?: string };\n /** Empty-state node when no rows are visible. */\n emptyState?: ReactNode;\n className?: string;\n}\n\n/**\n * Composite grid built from `Table` + DropdownMenu + Input. Provides\n * column visibility toggle, an inline filter, sortable headers, and\n * loading / empty states.\n *\n * @example\n * <DataGrid\n * columns={[\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'status', header: 'Status', cell: r => <Badge tone={...}>{r.status}</Badge> },\n * { key: 'updatedAt', header: 'Updated', align: 'right' },\n * ]}\n * rows={rows}\n * filter={{ value: q, onChange: setQ }}\n * sort={sort}\n * onSortChange={setSort}\n * />\n *\n * @do Provide a meaningful empty state with a primary action when the grid\n * starts empty (no items at all, not just filtered out).\n * @dont Render thousands of rows synchronously — virtualise with `@tanstack/react-virtual`\n * and wrap with this component's headers as a shell.\n */\nexport function DataGrid<TRow extends { id: string | number }>({\n columns,\n rows,\n loading,\n sort,\n onSortChange,\n filter,\n emptyState,\n className,\n}: DataGridProps<TRow>) {\n const strings = useStrings();\n const [hidden, setHidden] = useState<Record<string, boolean>>({});\n const visibleColumns = useMemo(() => columns.filter((c) => !hidden[c.key]), [columns, hidden]);\n\n const renderRows = () => {\n if (loading) {\n return Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={`skel-${i}`}>\n {visibleColumns.map((c) => (\n <TableCell key={c.key}>\n <Skeleton variant=\"text\" className=\"w-3/4\" />\n </TableCell>\n ))}\n </TableRow>\n ));\n }\n if (rows.length === 0) {\n return (\n <TableRow>\n <TableCell colSpan={visibleColumns.length} className=\"h-32 text-center\">\n {emptyState ?? (\n <span className=\"text-foreground-subtle\">{strings.dataGrid.empty}</span>\n )}\n </TableCell>\n </TableRow>\n );\n }\n return rows.map((row) => (\n <TableRow key={row.id}>\n {visibleColumns.map((c) => (\n <TableCell\n key={c.key}\n className={cn(c.align === 'right' && 'text-right tabular')}\n >\n {c.cell ? c.cell(row) : (row as Record<string, unknown>)[c.key] as ReactNode}\n </TableCell>\n ))}\n </TableRow>\n ));\n };\n\n return (\n <div className={cn('flex flex-col gap-3', className)}>\n <div className=\"flex items-center justify-between gap-2\">\n {filter ? (\n <Input\n type=\"search\"\n placeholder={filter.placeholder ?? strings.dataGrid.filterPlaceholder}\n value={filter.value}\n onChange={(e) => filter.onChange(e.target.value)}\n clearable\n onClear={() => filter.onChange('')}\n className=\"max-w-sm w-full\"\n hideLabel\n label={strings.dataGrid.filterRows}\n />\n ) : (\n <div />\n )}\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton aria-label={strings.dataGrid.columnVisibility} icon={<Settings />} variant=\"outline\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuLabel>{strings.dataGrid.columns}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {columns.map((c) => (\n <DropdownMenuCheckboxItem\n key={c.key}\n checked={!hidden[c.key]}\n onCheckedChange={(v) =>\n setHidden((prev) => ({ ...prev, [c.key]: !v }))\n }\n >\n {c.header}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border overflow-hidden\">\n <Table>\n <colgroup>\n {visibleColumns.map((c) => (\n <col key={c.key} style={c.width ? { width: c.width } : undefined} />\n ))}\n </colgroup>\n <TableHeader>\n <TableRow>\n {visibleColumns.map((c) =>\n c.sortable && onSortChange ? (\n <TableSortHeader\n key={c.key}\n sortKey={c.key}\n currentSort={sort ?? null}\n onSortChange={(k, d) => onSortChange({ key: k, direction: d })}\n >\n {c.header}\n </TableSortHeader>\n ) : (\n <TableHead key={c.key} className={cn(c.align === 'right' && 'text-right')}>\n {c.header}\n </TableHead>\n ),\n )}\n </TableRow>\n </TableHeader>\n <TableBody>{renderRows()}</TableBody>\n </Table>\n </div>\n </div>\n );\n}\n"],"names":["DataGrid","columns","rows","loading","sort","onSortChange","filter","emptyState","className","strings","useStrings","hidden","setHidden","useState","visibleColumns","useMemo","c","renderRows","_","i","jsx","TableRow","TableCell","Skeleton","row","cn","jsxs","Input","DropdownMenu","DropdownMenuTrigger","IconButton","Settings","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","v","prev","Table","TableHeader","TableSortHeader","k","d","TableHead","TableBody"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { DateRange } from 'react-day-picker';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
onChange: (date: Date | undefined) => void;
|
|
2
|
+
import { DateRange, DayPickerProps, Matcher } from 'react-day-picker';
|
|
3
|
+
type CalendarLocale = DayPickerProps['locale'];
|
|
4
|
+
interface PickerCommonProps {
|
|
6
5
|
label?: ReactNode;
|
|
7
6
|
placeholder?: string;
|
|
8
7
|
error?: ReactNode;
|
|
@@ -10,28 +9,31 @@ export interface DatePickerProps {
|
|
|
10
9
|
/** Restrict to a date range. Days outside are not selectable. */
|
|
11
10
|
fromDate?: Date;
|
|
12
11
|
toDate?: Date;
|
|
12
|
+
/** Extra RDP matcher(s) for disabled days, merged with `fromDate`/`toDate`. */
|
|
13
|
+
disabledDays?: Matcher | Matcher[];
|
|
14
|
+
/** Custom display formatter for the trigger text. */
|
|
15
|
+
formatDate?: (d: Date) => string;
|
|
16
|
+
/** date-fns locale object passed through to react-day-picker. */
|
|
17
|
+
locale?: CalendarLocale;
|
|
13
18
|
className?: string;
|
|
14
19
|
}
|
|
20
|
+
export interface DatePickerProps extends PickerCommonProps {
|
|
21
|
+
value?: Date;
|
|
22
|
+
onChange: (date: Date | undefined) => void;
|
|
23
|
+
}
|
|
15
24
|
/**
|
|
16
25
|
* Single-date picker.
|
|
17
26
|
*
|
|
18
27
|
* @example
|
|
19
28
|
* <DatePicker label="Date of birth" value={dob} onChange={setDob} />
|
|
20
29
|
*
|
|
21
|
-
* @do Use locale-aware formatting via
|
|
30
|
+
* @do Use locale-aware formatting via `formatDate` / `locale`.
|
|
22
31
|
* @dont Roll a custom calendar — Radix Popover + react-day-picker handles a11y.
|
|
23
32
|
*/
|
|
24
33
|
export declare const DatePicker: import('react').ForwardRefExoticComponent<DatePickerProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
25
|
-
export interface DateRangePickerProps {
|
|
34
|
+
export interface DateRangePickerProps extends PickerCommonProps {
|
|
26
35
|
value?: DateRange;
|
|
27
36
|
onChange: (range: DateRange | undefined) => void;
|
|
28
|
-
label?: ReactNode;
|
|
29
|
-
placeholder?: string;
|
|
30
|
-
error?: ReactNode;
|
|
31
|
-
disabled?: boolean;
|
|
32
|
-
fromDate?: Date;
|
|
33
|
-
toDate?: Date;
|
|
34
|
-
className?: string;
|
|
35
37
|
}
|
|
36
38
|
/**
|
|
37
39
|
* Two-date range picker. `value` is `{from, to}`.
|
|
@@ -40,3 +42,4 @@ export interface DateRangePickerProps {
|
|
|
40
42
|
* <DateRangePicker label="Reporting period" value={range} onChange={setRange} />
|
|
41
43
|
*/
|
|
42
44
|
export declare const DateRangePicker: import('react').ForwardRefExoticComponent<DateRangePickerProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
45
|
+
export {};
|