@gerege-systems/ui 0.11.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.
Files changed (218) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist-lib/__tests__/helpers/color.d.ts +9 -0
  4. package/dist-lib/__tests__/helpers/theme.d.ts +18 -0
  5. package/dist-lib/components/ui/Accordion.d.ts +21 -0
  6. package/dist-lib/components/ui/Accordion.js +71 -0
  7. package/dist-lib/components/ui/Accordion.js.map +1 -0
  8. package/dist-lib/components/ui/Alert.d.ts +51 -0
  9. package/dist-lib/components/ui/Alert.js +79 -0
  10. package/dist-lib/components/ui/Alert.js.map +1 -0
  11. package/dist-lib/components/ui/Avatar.d.ts +52 -0
  12. package/dist-lib/components/ui/Avatar.js +94 -0
  13. package/dist-lib/components/ui/Avatar.js.map +1 -0
  14. package/dist-lib/components/ui/Badge.d.ts +26 -0
  15. package/dist-lib/components/ui/Badge.js +76 -0
  16. package/dist-lib/components/ui/Badge.js.map +1 -0
  17. package/dist-lib/components/ui/Breadcrumbs.d.ts +33 -0
  18. package/dist-lib/components/ui/Breadcrumbs.js +52 -0
  19. package/dist-lib/components/ui/Breadcrumbs.js.map +1 -0
  20. package/dist-lib/components/ui/Button.d.ts +52 -0
  21. package/dist-lib/components/ui/Button.js +131 -0
  22. package/dist-lib/components/ui/Button.js.map +1 -0
  23. package/dist-lib/components/ui/Calendar.d.ts +15 -0
  24. package/dist-lib/components/ui/Calendar.js +139 -0
  25. package/dist-lib/components/ui/Calendar.js.map +1 -0
  26. package/dist-lib/components/ui/Card.d.ts +39 -0
  27. package/dist-lib/components/ui/Card.js +97 -0
  28. package/dist-lib/components/ui/Card.js.map +1 -0
  29. package/dist-lib/components/ui/Carousel.d.ts +27 -0
  30. package/dist-lib/components/ui/Carousel.js +174 -0
  31. package/dist-lib/components/ui/Carousel.js.map +1 -0
  32. package/dist-lib/components/ui/Chart.d.ts +87 -0
  33. package/dist-lib/components/ui/Chart.js +487 -0
  34. package/dist-lib/components/ui/Chart.js.map +1 -0
  35. package/dist-lib/components/ui/Checkbox.d.ts +28 -0
  36. package/dist-lib/components/ui/Checkbox.js +70 -0
  37. package/dist-lib/components/ui/Checkbox.js.map +1 -0
  38. package/dist-lib/components/ui/Combobox.d.ts +67 -0
  39. package/dist-lib/components/ui/Combobox.js +195 -0
  40. package/dist-lib/components/ui/Combobox.js.map +1 -0
  41. package/dist-lib/components/ui/CommandPalette.d.ts +112 -0
  42. package/dist-lib/components/ui/CommandPalette.js +179 -0
  43. package/dist-lib/components/ui/CommandPalette.js.map +1 -0
  44. package/dist-lib/components/ui/ContextMenu.d.ts +50 -0
  45. package/dist-lib/components/ui/ContextMenu.js +165 -0
  46. package/dist-lib/components/ui/ContextMenu.js.map +1 -0
  47. package/dist-lib/components/ui/DataGrid.d.ts +79 -0
  48. package/dist-lib/components/ui/DataGrid.js +99 -0
  49. package/dist-lib/components/ui/DataGrid.js.map +1 -0
  50. package/dist-lib/components/ui/DatePicker.d.ts +45 -0
  51. package/dist-lib/components/ui/DatePicker.js +193 -0
  52. package/dist-lib/components/ui/DatePicker.js.map +1 -0
  53. package/dist-lib/components/ui/DesignSystemProvider.d.ts +147 -0
  54. package/dist-lib/components/ui/DesignSystemProvider.js +135 -0
  55. package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -0
  56. package/dist-lib/components/ui/Dialog.d.ts +77 -0
  57. package/dist-lib/components/ui/Dialog.js +165 -0
  58. package/dist-lib/components/ui/Dialog.js.map +1 -0
  59. package/dist-lib/components/ui/Drawer.d.ts +44 -0
  60. package/dist-lib/components/ui/Drawer.js +132 -0
  61. package/dist-lib/components/ui/Drawer.js.map +1 -0
  62. package/dist-lib/components/ui/DropdownMenu.d.ts +47 -0
  63. package/dist-lib/components/ui/DropdownMenu.js +169 -0
  64. package/dist-lib/components/ui/DropdownMenu.js.map +1 -0
  65. package/dist-lib/components/ui/EmptyState.d.ts +48 -0
  66. package/dist-lib/components/ui/EmptyState.js +46 -0
  67. package/dist-lib/components/ui/EmptyState.js.map +1 -0
  68. package/dist-lib/components/ui/ErrorState.d.ts +51 -0
  69. package/dist-lib/components/ui/ErrorState.js +69 -0
  70. package/dist-lib/components/ui/ErrorState.js.map +1 -0
  71. package/dist-lib/components/ui/FileUpload.d.ts +26 -0
  72. package/dist-lib/components/ui/FileUpload.js +111 -0
  73. package/dist-lib/components/ui/FileUpload.js.map +1 -0
  74. package/dist-lib/components/ui/Form.d.ts +36 -0
  75. package/dist-lib/components/ui/Form.js +131 -0
  76. package/dist-lib/components/ui/Form.js.map +1 -0
  77. package/dist-lib/components/ui/Icon.d.ts +34 -0
  78. package/dist-lib/components/ui/Icon.js +32 -0
  79. package/dist-lib/components/ui/Icon.js.map +1 -0
  80. package/dist-lib/components/ui/IconButton.d.ts +34 -0
  81. package/dist-lib/components/ui/IconButton.js +64 -0
  82. package/dist-lib/components/ui/IconButton.js.map +1 -0
  83. package/dist-lib/components/ui/Input.d.ts +54 -0
  84. package/dist-lib/components/ui/Input.js +158 -0
  85. package/dist-lib/components/ui/Input.js.map +1 -0
  86. package/dist-lib/components/ui/Kbd.d.ts +16 -0
  87. package/dist-lib/components/ui/Kbd.js +24 -0
  88. package/dist-lib/components/ui/Kbd.js.map +1 -0
  89. package/dist-lib/components/ui/MultiSelect.d.ts +64 -0
  90. package/dist-lib/components/ui/MultiSelect.js +210 -0
  91. package/dist-lib/components/ui/MultiSelect.js.map +1 -0
  92. package/dist-lib/components/ui/Pagination.d.ts +55 -0
  93. package/dist-lib/components/ui/Pagination.js +153 -0
  94. package/dist-lib/components/ui/Pagination.js.map +1 -0
  95. package/dist-lib/components/ui/Popover.d.ts +16 -0
  96. package/dist-lib/components/ui/Popover.js +35 -0
  97. package/dist-lib/components/ui/Popover.js.map +1 -0
  98. package/dist-lib/components/ui/Progress.d.ts +40 -0
  99. package/dist-lib/components/ui/Progress.js +100 -0
  100. package/dist-lib/components/ui/Progress.js.map +1 -0
  101. package/dist-lib/components/ui/RadioGroup.d.ts +27 -0
  102. package/dist-lib/components/ui/RadioGroup.js +81 -0
  103. package/dist-lib/components/ui/RadioGroup.js.map +1 -0
  104. package/dist-lib/components/ui/RelativeTime.d.ts +19 -0
  105. package/dist-lib/components/ui/RelativeTime.js +31 -0
  106. package/dist-lib/components/ui/RelativeTime.js.map +1 -0
  107. package/dist-lib/components/ui/ScrollArea.d.ts +21 -0
  108. package/dist-lib/components/ui/ScrollArea.js +60 -0
  109. package/dist-lib/components/ui/ScrollArea.js.map +1 -0
  110. package/dist-lib/components/ui/Select.d.ts +61 -0
  111. package/dist-lib/components/ui/Select.js +139 -0
  112. package/dist-lib/components/ui/Select.js.map +1 -0
  113. package/dist-lib/components/ui/Separator.d.ts +13 -0
  114. package/dist-lib/components/ui/Separator.js +26 -0
  115. package/dist-lib/components/ui/Separator.js.map +1 -0
  116. package/dist-lib/components/ui/Sheet.d.ts +55 -0
  117. package/dist-lib/components/ui/Sheet.js +136 -0
  118. package/dist-lib/components/ui/Sheet.js.map +1 -0
  119. package/dist-lib/components/ui/Sidebar.d.ts +91 -0
  120. package/dist-lib/components/ui/Sidebar.js +212 -0
  121. package/dist-lib/components/ui/Sidebar.js.map +1 -0
  122. package/dist-lib/components/ui/Skeleton.d.ts +37 -0
  123. package/dist-lib/components/ui/Skeleton.js +29 -0
  124. package/dist-lib/components/ui/Skeleton.js.map +1 -0
  125. package/dist-lib/components/ui/Slider.d.ts +33 -0
  126. package/dist-lib/components/ui/Slider.js +64 -0
  127. package/dist-lib/components/ui/Slider.js.map +1 -0
  128. package/dist-lib/components/ui/Snackbar.d.ts +21 -0
  129. package/dist-lib/components/ui/Snackbar.js +57 -0
  130. package/dist-lib/components/ui/Snackbar.js.map +1 -0
  131. package/dist-lib/components/ui/Spinner.d.ts +23 -0
  132. package/dist-lib/components/ui/Spinner.js +54 -0
  133. package/dist-lib/components/ui/Spinner.js.map +1 -0
  134. package/dist-lib/components/ui/Stepper.d.ts +40 -0
  135. package/dist-lib/components/ui/Stepper.js +111 -0
  136. package/dist-lib/components/ui/Stepper.js.map +1 -0
  137. package/dist-lib/components/ui/Switch.d.ts +33 -0
  138. package/dist-lib/components/ui/Switch.js +80 -0
  139. package/dist-lib/components/ui/Switch.js.map +1 -0
  140. package/dist-lib/components/ui/Table.d.ts +71 -0
  141. package/dist-lib/components/ui/Table.js +179 -0
  142. package/dist-lib/components/ui/Table.js.map +1 -0
  143. package/dist-lib/components/ui/Tabs.d.ts +32 -0
  144. package/dist-lib/components/ui/Tabs.js +91 -0
  145. package/dist-lib/components/ui/Tabs.js.map +1 -0
  146. package/dist-lib/components/ui/TagInput.d.ts +39 -0
  147. package/dist-lib/components/ui/TagInput.js +111 -0
  148. package/dist-lib/components/ui/TagInput.js.map +1 -0
  149. package/dist-lib/components/ui/Textarea.d.ts +34 -0
  150. package/dist-lib/components/ui/Textarea.js +88 -0
  151. package/dist-lib/components/ui/Textarea.js.map +1 -0
  152. package/dist-lib/components/ui/Timeline.d.ts +33 -0
  153. package/dist-lib/components/ui/Timeline.js +56 -0
  154. package/dist-lib/components/ui/Timeline.js.map +1 -0
  155. package/dist-lib/components/ui/Toast.d.ts +53 -0
  156. package/dist-lib/components/ui/Toast.js +158 -0
  157. package/dist-lib/components/ui/Toast.js.map +1 -0
  158. package/dist-lib/components/ui/Tooltip.d.ts +38 -0
  159. package/dist-lib/components/ui/Tooltip.js +60 -0
  160. package/dist-lib/components/ui/Tooltip.js.map +1 -0
  161. package/dist-lib/components/ui/TopNav.d.ts +37 -0
  162. package/dist-lib/components/ui/TopNav.js +69 -0
  163. package/dist-lib/components/ui/TopNav.js.map +1 -0
  164. package/dist-lib/components/ui/Tree.d.ts +51 -0
  165. package/dist-lib/components/ui/Tree.js +170 -0
  166. package/dist-lib/components/ui/Tree.js.map +1 -0
  167. package/dist-lib/hooks/use-debounce.d.ts +19 -0
  168. package/dist-lib/hooks/use-debounce.js +36 -0
  169. package/dist-lib/hooks/use-debounce.js.map +1 -0
  170. package/dist-lib/hooks/use-delayed-loading.d.ts +21 -0
  171. package/dist-lib/hooks/use-delayed-loading.js +20 -0
  172. package/dist-lib/hooks/use-delayed-loading.js.map +1 -0
  173. package/dist-lib/hooks/use-field-ids.d.ts +30 -0
  174. package/dist-lib/hooks/use-field-ids.js +18 -0
  175. package/dist-lib/hooks/use-field-ids.js.map +1 -0
  176. package/dist-lib/hooks/use-media-query.d.ts +11 -0
  177. package/dist-lib/hooks/use-media-query.js +22 -0
  178. package/dist-lib/hooks/use-media-query.js.map +1 -0
  179. package/dist-lib/hooks/use-modifier-key.d.ts +13 -0
  180. package/dist-lib/hooks/use-modifier-key.js +19 -0
  181. package/dist-lib/hooks/use-modifier-key.js.map +1 -0
  182. package/dist-lib/hooks/use-strings.d.ts +5 -0
  183. package/dist-lib/hooks/use-strings.js +12 -0
  184. package/dist-lib/hooks/use-strings.js.map +1 -0
  185. package/dist-lib/hooks/use-toast.d.ts +48 -0
  186. package/dist-lib/hooks/use-toast.js +67 -0
  187. package/dist-lib/hooks/use-toast.js.map +1 -0
  188. package/dist-lib/icon.d.ts +8 -0
  189. package/dist-lib/icon.js +7 -0
  190. package/dist-lib/icon.js.map +1 -0
  191. package/dist-lib/icons/index.d.ts +80 -0
  192. package/dist-lib/icons/index.js +163 -0
  193. package/dist-lib/icons/index.js.map +1 -0
  194. package/dist-lib/illustrations/index.d.ts +10 -0
  195. package/dist-lib/illustrations/index.js +114 -0
  196. package/dist-lib/illustrations/index.js.map +1 -0
  197. package/dist-lib/index.d.ts +68 -0
  198. package/dist-lib/index.js +291 -0
  199. package/dist-lib/index.js.map +1 -0
  200. package/dist-lib/lib/cva.d.ts +6 -0
  201. package/dist-lib/lib/format.d.ts +65 -0
  202. package/dist-lib/lib/format.js +95 -0
  203. package/dist-lib/lib/format.js.map +1 -0
  204. package/dist-lib/lib/return-focus.d.ts +11 -0
  205. package/dist-lib/lib/return-focus.js +12 -0
  206. package/dist-lib/lib/return-focus.js.map +1 -0
  207. package/dist-lib/lib/strings.d.ts +190 -0
  208. package/dist-lib/lib/strings.js +141 -0
  209. package/dist-lib/lib/strings.js.map +1 -0
  210. package/dist-lib/lib/strings.mn.d.ts +3 -0
  211. package/dist-lib/lib/strings.mn.js +115 -0
  212. package/dist-lib/lib/strings.mn.js.map +1 -0
  213. package/dist-lib/lib/utils.d.ts +11 -0
  214. package/dist-lib/lib/utils.js +10 -0
  215. package/dist-lib/lib/utils.js.map +1 -0
  216. package/dist-lib/styles.css +1 -0
  217. package/dist-lib/theme.css +840 -0
  218. package/package.json +158 -0
@@ -0,0 +1,179 @@
1
+ "use client";
2
+ import { jsx as a, jsxs as u } from "react/jsx-runtime";
3
+ import { forwardRef as d, useRef as x, useEffect as y } from "react";
4
+ import { Command as m } from "cmdk";
5
+ import * as l from "@radix-ui/react-dialog";
6
+ import { Search as C } from "../../icons/index.js";
7
+ import { cn as r } from "../../lib/utils.js";
8
+ import { useStrings as p } from "../../hooks/use-strings.js";
9
+ const f = d(function({ className: t, ...e }, o) {
10
+ return /* @__PURE__ */ a(
11
+ m,
12
+ {
13
+ ref: o,
14
+ className: r(
15
+ "bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-lg",
16
+ t
17
+ ),
18
+ ...e
19
+ }
20
+ );
21
+ });
22
+ f.displayName = "Command";
23
+ const b = d(function({ className: t, ...e }, o) {
24
+ return /* @__PURE__ */ u("div", { className: "border-border flex items-center gap-2 border-b px-3", "cmdk-input-wrapper": "", children: [
25
+ /* @__PURE__ */ a(C, { className: "text-foreground-subtle size-4 shrink-0", "aria-hidden": !0 }),
26
+ /* @__PURE__ */ a(
27
+ m.Input,
28
+ {
29
+ ref: o,
30
+ className: r(
31
+ "flex h-11 w-full bg-transparent py-3 text-lg outline-none md:text-sm",
32
+ "placeholder:text-foreground-subtle disabled:cursor-not-allowed disabled:opacity-50",
33
+ t
34
+ ),
35
+ ...e
36
+ }
37
+ )
38
+ ] });
39
+ });
40
+ b.displayName = "CommandInput";
41
+ const h = d(function({ className: t, label: e, ...o }, i) {
42
+ const s = p();
43
+ return /* @__PURE__ */ a(
44
+ m.List,
45
+ {
46
+ ref: i,
47
+ label: e ?? s.command.suggestions,
48
+ className: r("max-h-[320px] overflow-y-auto p-1", t),
49
+ ...o
50
+ }
51
+ );
52
+ });
53
+ h.displayName = "CommandList";
54
+ const v = d(function({ className: t, ...e }, o) {
55
+ return /* @__PURE__ */ a(
56
+ m.Empty,
57
+ {
58
+ ref: o,
59
+ className: r("text-foreground-subtle py-8 text-center text-sm", t),
60
+ ...e
61
+ }
62
+ );
63
+ });
64
+ v.displayName = "CommandEmpty";
65
+ const N = d(function({ className: t, ...e }, o) {
66
+ return /* @__PURE__ */ a(
67
+ m.Group,
68
+ {
69
+ ref: o,
70
+ className: r(
71
+ "text-foreground overflow-hidden p-1",
72
+ "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5",
73
+ "[&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium",
74
+ "[&_[cmdk-group-heading]]:text-foreground-subtle",
75
+ t
76
+ ),
77
+ ...e
78
+ }
79
+ );
80
+ });
81
+ N.displayName = "CommandGroup";
82
+ const w = d(function({ className: t, ...e }, o) {
83
+ return /* @__PURE__ */ a(m.Separator, { ref: o, asChild: !0, ...e, children: /* @__PURE__ */ a("div", { role: "none", className: r("bg-border -mx-1 my-1 h-px", t) }) });
84
+ });
85
+ w.displayName = "CommandSeparator";
86
+ const k = d(function({ className: t, ...e }, o) {
87
+ return /* @__PURE__ */ a(
88
+ m.Item,
89
+ {
90
+ ref: o,
91
+ className: r(
92
+ "text-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none",
93
+ "data-[selected=true]:bg-background-muted data-[selected=true]:text-foreground",
94
+ "data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
95
+ "[&_svg]:text-foreground-subtle [&_svg]:size-4",
96
+ t
97
+ ),
98
+ ...e
99
+ }
100
+ );
101
+ });
102
+ k.displayName = "CommandItem";
103
+ function S({
104
+ children: n,
105
+ className: t
106
+ }) {
107
+ return /* @__PURE__ */ a(
108
+ "span",
109
+ {
110
+ className: r(
111
+ "text-foreground-subtle ml-auto inline-flex items-center gap-0.5 font-mono text-xs tracking-widest",
112
+ t
113
+ ),
114
+ children: n
115
+ }
116
+ );
117
+ }
118
+ S.displayName = "CommandShortcut";
119
+ function K({ open: n, onOpenChange: t, children: e, title: o }) {
120
+ const i = p(), s = x(null);
121
+ return /* @__PURE__ */ a(l.Root, { open: n, onOpenChange: t, children: /* @__PURE__ */ u(l.Portal, { children: [
122
+ /* @__PURE__ */ a(
123
+ l.Overlay,
124
+ {
125
+ className: r(
126
+ "bg-overlay fixed inset-0 z-[var(--z-overlay)]",
127
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
128
+ "data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0"
129
+ )
130
+ }
131
+ ),
132
+ /* @__PURE__ */ u(
133
+ l.Content,
134
+ {
135
+ "aria-describedby": void 0,
136
+ onOpenAutoFocus: () => {
137
+ s.current = document.activeElement;
138
+ },
139
+ onCloseAutoFocus: (g) => {
140
+ var c;
141
+ g.preventDefault(), (c = s.current) == null || c.focus(), s.current = null;
142
+ },
143
+ className: r(
144
+ "fixed top-[20%] left-1/2 z-[var(--z-modal)] -translate-x-1/2",
145
+ "w-[calc(100%-2rem)] max-w-[640px] overflow-hidden",
146
+ "border-border bg-popover text-popover-foreground rounded-lg border shadow-lg",
147
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
148
+ "data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0",
149
+ "data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95"
150
+ ),
151
+ children: [
152
+ /* @__PURE__ */ a(l.Title, { className: "sr-only", children: o ?? i.commandDialog.title }),
153
+ /* @__PURE__ */ a(f, { children: e })
154
+ ]
155
+ }
156
+ )
157
+ ] }) });
158
+ }
159
+ function G(n) {
160
+ y(() => {
161
+ const t = (e) => {
162
+ (e.key === "k" || e.key === "K") && (e.metaKey || e.ctrlKey) && !e.altKey && (e.preventDefault(), n((o) => !o));
163
+ };
164
+ return window.addEventListener("keydown", t), () => window.removeEventListener("keydown", t);
165
+ }, [n]);
166
+ }
167
+ export {
168
+ f as Command,
169
+ K as CommandDialog,
170
+ v as CommandEmpty,
171
+ N as CommandGroup,
172
+ b as CommandInput,
173
+ k as CommandItem,
174
+ h as CommandList,
175
+ w as CommandSeparator,
176
+ S as CommandShortcut,
177
+ G as useCommandPaletteShortcut
178
+ };
179
+ //# 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 useRef,\n type ComponentPropsWithoutRef,\n type Dispatch,\n type ElementRef,\n type ReactNode,\n type SetStateAction,\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 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-lg',\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=\"border-border flex items-center gap-2 border-b px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"text-foreground-subtle size-4 shrink-0\" aria-hidden />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-11 w-full bg-transparent py-3 text-lg outline-none md:text-sm',\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, label, ...props }, ref) {\n const strings = useStrings();\n return (\n <CommandPrimitive.List\n ref={ref}\n label={label ?? strings.command.suggestions}\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({ className, ...props }, ref) {\n return (\n <CommandPrimitive.Empty\n ref={ref}\n className={cn('text-foreground-subtle py-8 text-center text-sm', className)}\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 'text-foreground overflow-hidden 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 // cmdk hard-codes role=\"separator\", which is not a permitted child of the\n // listbox. asChild lets the child's role win: the divider is purely visual.\n return (\n <CommandPrimitive.Separator ref={ref} asChild {...props}>\n <div role=\"none\" className={cn('bg-border -mx-1 my-1 h-px', className)} />\n </CommandPrimitive.Separator>\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 'text-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-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]:text-foreground-subtle [&_svg]:size-4',\n className,\n )}\n {...props}\n />\n );\n});\nCommandItem.displayName = 'CommandItem';\n\nexport function CommandShortcut({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n 'text-foreground-subtle ml-auto inline-flex items-center gap-0.5 font-mono text-xs tracking-widest',\n className,\n )}\n >\n {children}\n </span>\n );\n}\nCommandShortcut.displayName = 'CommandShortcut';\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 // The palette has no DialogTrigger (⌘K / any button opens it), so Radix has\n // no trigger to return focus to and would drop it on <body>. Remember what\n // was focused when the dialog opened and restore it on close.\n const returnFocusRef = useRef<HTMLElement | null>(null);\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(\n 'bg-overlay fixed inset-0 z-[var(--z-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 onOpenAutoFocus={() => {\n returnFocusRef.current = document.activeElement as HTMLElement | null;\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n returnFocusRef.current?.focus();\n returnFocusRef.current = null;\n }}\n className={cn(\n 'fixed top-[20%] left-1/2 z-[var(--z-modal)] -translate-x-1/2',\n 'w-[calc(100%-2rem)] max-w-[640px] overflow-hidden',\n 'border-border bg-popover text-popover-foreground rounded-lg border 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: Dispatch<SetStateAction<boolean>>): void {\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if ((e.key === 'k' || e.key === 'K') && (e.metaKey || e.ctrlKey) && !e.altKey) {\n e.preventDefault();\n // Functional update: ⌘K toggles without the hook tracking open state.\n setOpen((prev) => !prev);\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","label","strings","useStrings","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","CommandShortcut","children","CommandDialog","open","onOpenChange","title","returnFocusRef","useRef","DialogPrimitive","event","_a","useCommandPaletteShortcut","setOpen","useEffect","onKey","prev"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import * as ContextMenuPrimitive from '@radix-ui/react-context-menu';
3
+ /**
4
+ * Right-click (or two-finger tap) menu. Visual surface mirrors DropdownMenu
5
+ * for consistency.
6
+ *
7
+ * @example
8
+ * <ContextMenu>
9
+ * <ContextMenuTrigger asChild>
10
+ * <div className="grid h-32 place-items-center rounded-lg border border-border">
11
+ * Right-click me
12
+ * </div>
13
+ * </ContextMenuTrigger>
14
+ * <ContextMenuContent>
15
+ * <ContextMenuItem>Open</ContextMenuItem>
16
+ * <ContextMenuSeparator />
17
+ * <ContextMenuItem destructive>Delete</ContextMenuItem>
18
+ * </ContextMenuContent>
19
+ * </ContextMenu>
20
+ *
21
+ * @do Mirror DropdownMenu items for the same surface — users expect the same
22
+ * operations from both.
23
+ * @dont Hide critical actions behind right-click — they must also exist in
24
+ * a visible button or menu.
25
+ */
26
+ export declare const ContextMenu: import('react').FC<ContextMenuPrimitive.ContextMenuProps>;
27
+ export declare const ContextMenuTrigger: import('react').ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuTriggerProps & import('react').RefAttributes<HTMLSpanElement>>;
28
+ export declare const ContextMenuGroup: import('react').ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuGroupProps & import('react').RefAttributes<HTMLDivElement>>;
29
+ export declare const ContextMenuPortal: import('react').FC<ContextMenuPrimitive.ContextMenuPortalProps>;
30
+ export declare const ContextMenuSub: import('react').FC<ContextMenuPrimitive.ContextMenuSubProps>;
31
+ export declare const ContextMenuRadioGroup: import('react').ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuRadioGroupProps & import('react').RefAttributes<HTMLDivElement>>;
32
+ export declare const ContextMenuSubTrigger: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubTriggerProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & {
33
+ inset?: boolean;
34
+ } & import('react').RefAttributes<HTMLDivElement>>;
35
+ export declare const ContextMenuSubContent: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubContentProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
36
+ export declare const ContextMenuContent: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuContentProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
37
+ export declare const ContextMenuItem: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuItemProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & {
38
+ inset?: boolean;
39
+ destructive?: boolean;
40
+ } & import('react').RefAttributes<HTMLDivElement>>;
41
+ export declare const ContextMenuCheckboxItem: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuCheckboxItemProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
42
+ export declare const ContextMenuRadioItem: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuRadioItemProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
43
+ export declare const ContextMenuLabel: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuLabelProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & {
44
+ inset?: boolean;
45
+ } & import('react').RefAttributes<HTMLDivElement>>;
46
+ export declare const ContextMenuSeparator: import('react').ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSeparatorProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
47
+ export declare function ContextMenuShortcut({ className, ...props }: HTMLAttributes<HTMLSpanElement>): import("react/jsx-runtime").JSX.Element;
48
+ export declare namespace ContextMenuShortcut {
49
+ var displayName: string;
50
+ }
@@ -0,0 +1,165 @@
1
+ "use client";
2
+ import { jsxs as l, jsx as a } from "react/jsx-runtime";
3
+ import { forwardRef as u } from "react";
4
+ import * as t from "@radix-ui/react-context-menu";
5
+ import { Check as m, Circle as x, ChevronRight as p } from "../../icons/index.js";
6
+ import { cn as r } from "../../lib/utils.js";
7
+ const w = t.Root, T = t.Trigger, j = t.Group, C = t.Portal, G = t.Sub, L = t.RadioGroup, i = 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
+ "transition-colors duration-[var(--duration-fast)]"
12
+ ), g = u(function({ className: e, inset: n, children: o, ...d }, c) {
13
+ return /* @__PURE__ */ l(
14
+ t.SubTrigger,
15
+ {
16
+ ref: c,
17
+ className: r(
18
+ i,
19
+ "data-[state=open]:bg-background-muted",
20
+ n && "pl-8",
21
+ e
22
+ ),
23
+ ...d,
24
+ children: [
25
+ o,
26
+ /* @__PURE__ */ a(p, { className: "text-foreground-subtle ml-auto size-4", "aria-hidden": !0 })
27
+ ]
28
+ }
29
+ );
30
+ });
31
+ g.displayName = "ContextMenuSubTrigger";
32
+ const f = u(function({ className: e, ...n }, o) {
33
+ return /* @__PURE__ */ a(
34
+ t.SubContent,
35
+ {
36
+ ref: o,
37
+ className: r(
38
+ "border-border bg-popover text-popover-foreground z-[var(--z-popover)] min-w-[8rem] overflow-hidden rounded-lg border p-1 shadow-md",
39
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
40
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
41
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
42
+ e
43
+ ),
44
+ ...n
45
+ }
46
+ );
47
+ });
48
+ f.displayName = "ContextMenuSubContent";
49
+ const b = u(function({ className: e, ...n }, o) {
50
+ return /* @__PURE__ */ a(C, { children: /* @__PURE__ */ a(
51
+ t.Content,
52
+ {
53
+ ref: o,
54
+ className: r(
55
+ "border-border bg-popover text-popover-foreground z-[var(--z-popover)] min-w-[12rem] overflow-hidden rounded-lg border p-1 shadow-md",
56
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
57
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
58
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
59
+ e
60
+ ),
61
+ ...n
62
+ }
63
+ ) });
64
+ });
65
+ b.displayName = "ContextMenuContent";
66
+ const h = u(function({ className: e, inset: n, destructive: o, ...d }, c) {
67
+ return /* @__PURE__ */ a(
68
+ t.Item,
69
+ {
70
+ ref: c,
71
+ className: r(
72
+ i,
73
+ n && "pl-8",
74
+ o && "text-danger-text data-[highlighted]:bg-danger-soft data-[highlighted]:text-danger-text",
75
+ e
76
+ ),
77
+ ...d
78
+ }
79
+ );
80
+ });
81
+ h.displayName = "ContextMenuItem";
82
+ const M = u(function({ className: e, children: n, ...o }, d) {
83
+ return /* @__PURE__ */ l(
84
+ t.CheckboxItem,
85
+ {
86
+ ref: d,
87
+ className: r(i, "pl-8", e),
88
+ ...o,
89
+ children: [
90
+ /* @__PURE__ */ a("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ a(t.ItemIndicator, { children: /* @__PURE__ */ a(m, { className: "text-accent size-4", "aria-hidden": !0 }) }) }),
91
+ n
92
+ ]
93
+ }
94
+ );
95
+ });
96
+ M.displayName = "ContextMenuCheckboxItem";
97
+ const N = u(function({ className: e, children: n, ...o }, d) {
98
+ return /* @__PURE__ */ l(
99
+ t.RadioItem,
100
+ {
101
+ ref: d,
102
+ className: r(i, "pl-8", e),
103
+ ...o,
104
+ children: [
105
+ /* @__PURE__ */ a("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ a(t.ItemIndicator, { children: /* @__PURE__ */ a(x, { className: "fill-accent text-accent size-2", "aria-hidden": !0 }) }) }),
106
+ n
107
+ ]
108
+ }
109
+ );
110
+ });
111
+ N.displayName = "ContextMenuRadioItem";
112
+ const I = u(function({ className: e, inset: n, ...o }, d) {
113
+ return /* @__PURE__ */ a(
114
+ t.Label,
115
+ {
116
+ ref: d,
117
+ className: r(
118
+ "text-foreground-subtle px-2 py-1.5 text-xs font-medium",
119
+ n && "pl-8",
120
+ e
121
+ ),
122
+ ...o
123
+ }
124
+ );
125
+ });
126
+ I.displayName = "ContextMenuLabel";
127
+ const S = u(function({ className: e, ...n }, o) {
128
+ return /* @__PURE__ */ a(
129
+ t.Separator,
130
+ {
131
+ ref: o,
132
+ className: r("bg-border -mx-1 my-1 h-px", e),
133
+ ...n
134
+ }
135
+ );
136
+ });
137
+ S.displayName = "ContextMenuSeparator";
138
+ function v({ className: s, ...e }) {
139
+ return /* @__PURE__ */ a(
140
+ "span",
141
+ {
142
+ className: r("text-foreground-subtle ml-auto font-mono text-xs tracking-widest", s),
143
+ ...e
144
+ }
145
+ );
146
+ }
147
+ v.displayName = "ContextMenuShortcut";
148
+ export {
149
+ w as ContextMenu,
150
+ M as ContextMenuCheckboxItem,
151
+ b as ContextMenuContent,
152
+ j as ContextMenuGroup,
153
+ h as ContextMenuItem,
154
+ I as ContextMenuLabel,
155
+ C as ContextMenuPortal,
156
+ L as ContextMenuRadioGroup,
157
+ N as ContextMenuRadioItem,
158
+ S as ContextMenuSeparator,
159
+ v as ContextMenuShortcut,
160
+ G as ContextMenuSub,
161
+ f as ContextMenuSubContent,
162
+ g as ContextMenuSubTrigger,
163
+ T as ContextMenuTrigger
164
+ };
165
+ //# 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 'transition-colors duration-[var(--duration-fast)]',\n);\n\nexport const ContextMenuSubTrigger = forwardRef<\n ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(function ContextMenuSubTrigger({ className, inset, children, ...props }, ref) {\n return (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n itemClasses,\n 'data-[state=open]:bg-background-muted',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"text-foreground-subtle ml-auto size-4\" 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 'border-border bg-popover text-popover-foreground z-[var(--z-popover)] min-w-[8rem] overflow-hidden rounded-lg border p-1 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 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\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 'border-border bg-popover text-popover-foreground z-[var(--z-popover)] min-w-[12rem] overflow-hidden rounded-lg border p-1 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 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\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> & {\n inset?: boolean;\n destructive?: boolean;\n }\n>(function ContextMenuItem({ className, inset, destructive, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n itemClasses,\n inset && 'pl-8',\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=\"text-accent size-4\" 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=\"fill-accent text-accent size-2\" 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> & { inset?: boolean }\n>(function ContextMenuLabel({ className, inset, ...props }, ref) {\n return (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'text-foreground-subtle px-2 py-1.5 text-xs font-medium',\n inset && 'pl-8',\n className,\n )}\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('bg-border -mx-1 my-1 h-px', className)}\n {...props}\n />\n );\n});\nContextMenuSeparator.displayName = 'ContextMenuSeparator';\n\nexport function ContextMenuShortcut({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n className={cn('text-foreground-subtle ml-auto font-mono text-xs tracking-widest', className)}\n {...props}\n />\n );\n}\nContextMenuShortcut.displayName = 'ContextMenuShortcut';\n"],"names":["ContextMenu","ContextMenuPrimitive","ContextMenuTrigger","ContextMenuGroup","ContextMenuPortal","ContextMenuSub","ContextMenuRadioGroup","itemClasses","cn","ContextMenuSubTrigger","forwardRef","className","inset","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,79 @@
1
+ import { ReactNode } from 'react';
2
+ export interface DataGridColumn<TRow> {
3
+ /**
4
+ * Stable key used for visibility, sort, and React lists. Autocompletes
5
+ * row fields; any string is allowed for computed columns (with `cell`).
6
+ */
7
+ key: (keyof TRow & string) | (string & {});
8
+ /** Header label. */
9
+ header: ReactNode;
10
+ /**
11
+ * Render the cell. Defaults to the value at `row[key]`: `Date` →
12
+ * `formatDate` (yyyy-MM-dd HH:mm), primitives as-is, other objects via
13
+ * `String()`.
14
+ */
15
+ cell?: (row: TRow) => ReactNode;
16
+ /** Cell width — passed to `<col>` so the grid keeps shape during loading. */
17
+ width?: string;
18
+ /** Allow sorting on this column. */
19
+ sortable?: boolean;
20
+ /** Right-align numeric / monetary columns. */
21
+ align?: 'left' | 'right';
22
+ }
23
+ export interface DataGridProps<TRow extends {
24
+ id: string | number;
25
+ }> {
26
+ columns: DataGridColumn<TRow>[];
27
+ rows: TRow[];
28
+ loading?: boolean;
29
+ /** Initial sort state. */
30
+ sort?: {
31
+ key: string;
32
+ direction: 'asc' | 'desc';
33
+ } | null;
34
+ onSortChange?: (sort: {
35
+ key: string;
36
+ direction: 'asc' | 'desc';
37
+ }) => void;
38
+ /** Show a filter input row above the grid. */
39
+ filter?: {
40
+ value: string;
41
+ onChange: (q: string) => void;
42
+ placeholder?: string;
43
+ };
44
+ /** Empty-state node when no rows are visible. */
45
+ emptyState?: ReactNode;
46
+ /**
47
+ * Controlled column visibility: `{ [key]: boolean }` (missing = visible).
48
+ * Omit for internal state. At least one column always stays visible.
49
+ */
50
+ columnVisibility?: Record<string, boolean>;
51
+ onColumnVisibilityChange?: (next: Record<string, boolean>) => void;
52
+ className?: string;
53
+ }
54
+ /**
55
+ * Composite grid built from `Table` + DropdownMenu + Input. Provides
56
+ * column visibility toggle, an inline filter, sortable headers, and
57
+ * loading / empty states.
58
+ *
59
+ * @example
60
+ * <DataGrid
61
+ * columns={[
62
+ * { key: 'name', header: 'Name', sortable: true },
63
+ * { key: 'status', header: 'Status', cell: r => <Badge tone={...}>{r.status}</Badge> },
64
+ * { key: 'updatedAt', header: 'Updated', align: 'right' },
65
+ * ]}
66
+ * rows={rows}
67
+ * filter={{ value: q, onChange: setQ }}
68
+ * sort={sort}
69
+ * onSortChange={setSort}
70
+ * />
71
+ *
72
+ * @do Provide a meaningful empty state with a primary action when the grid
73
+ * starts empty (no items at all, not just filtered out).
74
+ * @dont Render thousands of rows synchronously — virtualise with `@tanstack/react-virtual`
75
+ * and wrap with this component's headers as a shell.
76
+ */
77
+ export declare function DataGrid<TRow extends {
78
+ id: string | number;
79
+ }>({ columns, rows, loading, sort, onSortChange, filter, emptyState, columnVisibility, onColumnVisibilityChange, className, }: DataGridProps<TRow>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { jsxs as d, jsx as r } from "react/jsx-runtime";
3
+ import { useState as M, useMemo as T, isValidElement as G } from "react";
4
+ import { Settings as C } from "../../icons/index.js";
5
+ import { cn as j } from "../../lib/utils.js";
6
+ import { formatDate as v } from "../../lib/format.js";
7
+ import { useStrings as I } from "../../hooks/use-strings.js";
8
+ import { DropdownMenu as H, DropdownMenuTrigger as R, DropdownMenuContent as B, DropdownMenuLabel as L, DropdownMenuSeparator as V, DropdownMenuCheckboxItem as A } from "./DropdownMenu.js";
9
+ import { IconButton as E } from "./IconButton.js";
10
+ import { Input as K } from "./Input.js";
11
+ import { Table as P, TableHeader as _, TableRow as m, TableSortHeader as $, TableHead as q, TableBody as z, TableCell as p } from "./Table.js";
12
+ import { Skeleton as F } from "./Skeleton.js";
13
+ function J(t, s) {
14
+ return t == null || t === "" ? /* @__PURE__ */ r("span", { "aria-label": s, className: "text-foreground-subtle", children: "—" }) : t instanceof Date ? v(t) : typeof t == "object" ? G(t) ? t : String(t) : t;
15
+ }
16
+ function ae({
17
+ columns: t,
18
+ rows: s,
19
+ loading: b,
20
+ sort: y,
21
+ onSortChange: u,
22
+ filter: o,
23
+ emptyState: k,
24
+ columnVisibility: f,
25
+ onColumnVisibilityChange: h,
26
+ className: x
27
+ }) {
28
+ const n = I(), [w, D] = M({}), c = f ?? w, g = (e) => c[e] !== !1, a = T(
29
+ () => t.filter((e) => c[e.key] !== !1),
30
+ [t, c]
31
+ ), N = (e, l) => {
32
+ if (!l && a.length <= 1) return;
33
+ const i = { ...c, [e]: l };
34
+ f === void 0 && D(i), h == null || h(i);
35
+ }, S = () => b ? Array.from({ length: 5 }).map((e, l) => /* @__PURE__ */ r(m, { children: a.map((i) => /* @__PURE__ */ r(p, { children: /* @__PURE__ */ r(F, { variant: "text", className: "w-3/4" }) }, i.key)) }, `skel-${l}`)) : s.length === 0 ? /* @__PURE__ */ r(m, { children: /* @__PURE__ */ r(p, { colSpan: Math.max(1, a.length), className: "h-32 text-center", children: k ?? /* @__PURE__ */ r("span", { className: "text-foreground-subtle", children: n.dataGrid.empty }) }) }) : s.map((e) => /* @__PURE__ */ r(m, { children: a.map((l) => /* @__PURE__ */ r(p, { align: l.align ?? "left", children: l.cell ? l.cell(e) : J(e[l.key], n.dataGrid.emptyCell) }, l.key)) }, e.id));
36
+ return /* @__PURE__ */ d("div", { className: j("flex flex-col gap-3", x), children: [
37
+ /* @__PURE__ */ d("div", { className: "flex items-center justify-between gap-2", children: [
38
+ o ? /* @__PURE__ */ r(
39
+ K,
40
+ {
41
+ type: "search",
42
+ placeholder: o.placeholder ?? n.dataGrid.filterPlaceholder,
43
+ value: o.value,
44
+ onChange: (e) => o.onChange(e.target.value),
45
+ clearable: !0,
46
+ onClear: () => o.onChange(""),
47
+ className: "w-full max-w-sm",
48
+ hideLabel: !0,
49
+ label: n.dataGrid.filterRows
50
+ }
51
+ ) : /* @__PURE__ */ r("div", {}),
52
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ d(H, { children: [
53
+ /* @__PURE__ */ r(R, { asChild: !0, children: /* @__PURE__ */ r(
54
+ E,
55
+ {
56
+ "aria-label": n.dataGrid.columnVisibility,
57
+ icon: /* @__PURE__ */ r(C, {}),
58
+ variant: "outline"
59
+ }
60
+ ) }),
61
+ /* @__PURE__ */ d(B, { children: [
62
+ /* @__PURE__ */ r(L, { children: n.dataGrid.columns }),
63
+ /* @__PURE__ */ r(V, {}),
64
+ t.map((e) => /* @__PURE__ */ r(
65
+ A,
66
+ {
67
+ checked: g(e.key),
68
+ disabled: g(e.key) && a.length <= 1,
69
+ onCheckedChange: (l) => N(e.key, l === !0),
70
+ children: e.header
71
+ },
72
+ e.key
73
+ ))
74
+ ] })
75
+ ] }) })
76
+ ] }),
77
+ /* @__PURE__ */ d(P, { containerClassName: "rounded-lg border border-border", children: [
78
+ /* @__PURE__ */ r("colgroup", { children: a.map((e) => /* @__PURE__ */ r("col", { style: e.width ? { width: e.width } : void 0 }, e.key)) }),
79
+ /* @__PURE__ */ r(_, { children: /* @__PURE__ */ r(m, { children: a.map(
80
+ (e) => e.sortable && u ? /* @__PURE__ */ r(
81
+ $,
82
+ {
83
+ align: e.align ?? "left",
84
+ sortKey: e.key,
85
+ currentSort: y ?? null,
86
+ onSortChange: (l, i) => u({ key: l, direction: i }),
87
+ children: e.header
88
+ },
89
+ e.key
90
+ ) : /* @__PURE__ */ r(q, { align: e.align ?? "left", children: e.header }, e.key)
91
+ ) }) }),
92
+ /* @__PURE__ */ r(z, { children: S() })
93
+ ] })
94
+ ] });
95
+ }
96
+ export {
97
+ ae as DataGrid
98
+ };
99
+ //# sourceMappingURL=DataGrid.js.map