@refine-studio/ui 0.0.0 → 0.2.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.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -2
  3. package/dist/components/accordion/accordion.d.ts +15 -0
  4. package/dist/components/accordion/accordion.js +58 -0
  5. package/dist/components/accordion/accordion.js.map +1 -0
  6. package/dist/components/alert/alert.d.ts +24 -0
  7. package/dist/components/alert/alert.js +98 -0
  8. package/dist/components/alert/alert.js.map +1 -0
  9. package/dist/components/alert-dialog/alert-dialog.d.ts +36 -0
  10. package/dist/components/alert-dialog/alert-dialog.js +112 -0
  11. package/dist/components/alert-dialog/alert-dialog.js.map +1 -0
  12. package/dist/components/app-shell/app-shell.d.ts +77 -0
  13. package/dist/components/app-shell/app-shell.js +224 -0
  14. package/dist/components/app-shell/app-shell.js.map +1 -0
  15. package/dist/components/avatar/avatar.d.ts +32 -0
  16. package/dist/components/avatar/avatar.js +83 -0
  17. package/dist/components/avatar/avatar.js.map +1 -0
  18. package/dist/components/badge/badge.d.ts +15 -0
  19. package/dist/components/badge/badge.js +50 -0
  20. package/dist/components/badge/badge.js.map +1 -0
  21. package/dist/components/breadcrumb/breadcrumb.d.ts +24 -0
  22. package/dist/components/breadcrumb/breadcrumb.js +82 -0
  23. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  24. package/dist/components/button/button.d.ts +15 -0
  25. package/dist/components/button/button.js +75 -0
  26. package/dist/components/button/button.js.map +1 -0
  27. package/dist/components/card/card.d.ts +46 -0
  28. package/dist/components/card/card.js +124 -0
  29. package/dist/components/card/card.js.map +1 -0
  30. package/dist/components/checkbox/checkbox.d.ts +6 -0
  31. package/dist/components/checkbox/checkbox.js +31 -0
  32. package/dist/components/checkbox/checkbox.js.map +1 -0
  33. package/dist/components/chip/chip.d.ts +25 -0
  34. package/dist/components/chip/chip.js +54 -0
  35. package/dist/components/chip/chip.js.map +1 -0
  36. package/dist/components/code/code.d.ts +15 -0
  37. package/dist/components/code/code.js +63 -0
  38. package/dist/components/code/code.js.map +1 -0
  39. package/dist/components/collapsible/collapsible.d.ts +14 -0
  40. package/dist/components/collapsible/collapsible.js +55 -0
  41. package/dist/components/collapsible/collapsible.js.map +1 -0
  42. package/dist/components/combobox/combobox.d.ts +33 -0
  43. package/dist/components/combobox/combobox.js +244 -0
  44. package/dist/components/combobox/combobox.js.map +1 -0
  45. package/dist/components/command-menu/command-menu.d.ts +35 -0
  46. package/dist/components/command-menu/command-menu.js +116 -0
  47. package/dist/components/command-menu/command-menu.js.map +1 -0
  48. package/dist/components/context-menu/context-menu.d.ts +45 -0
  49. package/dist/components/context-menu/context-menu.js +136 -0
  50. package/dist/components/context-menu/context-menu.js.map +1 -0
  51. package/dist/components/data-table/data-table.d.ts +49 -0
  52. package/dist/components/data-table/data-table.js +171 -0
  53. package/dist/components/data-table/data-table.js.map +1 -0
  54. package/dist/components/data-table/sort-rows.d.ts +6 -0
  55. package/dist/components/data-table/sort-rows.js +33 -0
  56. package/dist/components/data-table/sort-rows.js.map +1 -0
  57. package/dist/components/dialog/dialog.d.ts +42 -0
  58. package/dist/components/dialog/dialog.js +118 -0
  59. package/dist/components/dialog/dialog.js.map +1 -0
  60. package/dist/components/dropdown-menu/dropdown-menu.d.ts +45 -0
  61. package/dist/components/dropdown-menu/dropdown-menu.js +137 -0
  62. package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -0
  63. package/dist/components/dropdown-menu/menu-styles.d.ts +10 -0
  64. package/dist/components/dropdown-menu/menu-styles.js +34 -0
  65. package/dist/components/dropdown-menu/menu-styles.js.map +1 -0
  66. package/dist/components/empty-state/empty-state.d.ts +12 -0
  67. package/dist/components/empty-state/empty-state.js +46 -0
  68. package/dist/components/empty-state/empty-state.js.map +1 -0
  69. package/dist/components/eyebrow/eyebrow.d.ts +9 -0
  70. package/dist/components/eyebrow/eyebrow.js +25 -0
  71. package/dist/components/eyebrow/eyebrow.js.map +1 -0
  72. package/dist/components/field/field.d.ts +56 -0
  73. package/dist/components/field/field.js +135 -0
  74. package/dist/components/field/field.js.map +1 -0
  75. package/dist/components/glow-border/glow-border.d.ts +9 -0
  76. package/dist/components/glow-border/glow-border.js +39 -0
  77. package/dist/components/glow-border/glow-border.js.map +1 -0
  78. package/dist/components/hex-field/hex-field.d.ts +12 -0
  79. package/dist/components/hex-field/hex-field.js +86 -0
  80. package/dist/components/hex-field/hex-field.js.map +1 -0
  81. package/dist/components/input/input.d.ts +14 -0
  82. package/dist/components/input/input.js +52 -0
  83. package/dist/components/input/input.js.map +1 -0
  84. package/dist/components/kbd/kbd.d.ts +9 -0
  85. package/dist/components/kbd/kbd.js +26 -0
  86. package/dist/components/kbd/kbd.js.map +1 -0
  87. package/dist/components/label/label.d.ts +6 -0
  88. package/dist/components/label/label.js +17 -0
  89. package/dist/components/label/label.js.map +1 -0
  90. package/dist/components/logo/logo-paths.d.ts +5 -0
  91. package/dist/components/logo/logo-paths.js +20 -0
  92. package/dist/components/logo/logo-paths.js.map +1 -0
  93. package/dist/components/logo/logo.d.ts +18 -0
  94. package/dist/components/logo/logo.js +94 -0
  95. package/dist/components/logo/logo.js.map +1 -0
  96. package/dist/components/marquee/marquee.d.ts +15 -0
  97. package/dist/components/marquee/marquee.js +54 -0
  98. package/dist/components/marquee/marquee.js.map +1 -0
  99. package/dist/components/page-header/page-header.d.ts +15 -0
  100. package/dist/components/page-header/page-header.js +50 -0
  101. package/dist/components/page-header/page-header.js.map +1 -0
  102. package/dist/components/pagination/pagination.d.ts +28 -0
  103. package/dist/components/pagination/pagination.js +95 -0
  104. package/dist/components/pagination/pagination.js.map +1 -0
  105. package/dist/components/popover/popover.d.ts +14 -0
  106. package/dist/components/popover/popover.js +48 -0
  107. package/dist/components/popover/popover.js.map +1 -0
  108. package/dist/components/progress/progress.d.ts +14 -0
  109. package/dist/components/progress/progress.js +41 -0
  110. package/dist/components/progress/progress.js.map +1 -0
  111. package/dist/components/radio-group/radio-group.d.ts +10 -0
  112. package/dist/components/radio-group/radio-group.js +33 -0
  113. package/dist/components/radio-group/radio-group.js.map +1 -0
  114. package/dist/components/section-heading/section-heading.d.ts +18 -0
  115. package/dist/components/section-heading/section-heading.js +57 -0
  116. package/dist/components/section-heading/section-heading.js.map +1 -0
  117. package/dist/components/select/select.d.ts +32 -0
  118. package/dist/components/select/select.js +100 -0
  119. package/dist/components/select/select.js.map +1 -0
  120. package/dist/components/separator/separator.d.ts +10 -0
  121. package/dist/components/separator/separator.js +37 -0
  122. package/dist/components/separator/separator.js.map +1 -0
  123. package/dist/components/sheet/sheet.d.ts +29 -0
  124. package/dist/components/sheet/sheet.js +130 -0
  125. package/dist/components/sheet/sheet.js.map +1 -0
  126. package/dist/components/skeleton/skeleton.d.ts +5 -0
  127. package/dist/components/skeleton/skeleton.js +18 -0
  128. package/dist/components/skeleton/skeleton.js.map +1 -0
  129. package/dist/components/slider/slider.d.ts +10 -0
  130. package/dist/components/slider/slider.js +36 -0
  131. package/dist/components/slider/slider.js.map +1 -0
  132. package/dist/components/spinner/spinner.d.ts +9 -0
  133. package/dist/components/spinner/spinner.js +40 -0
  134. package/dist/components/spinner/spinner.js.map +1 -0
  135. package/dist/components/spotlight/spotlight.d.ts +9 -0
  136. package/dist/components/spotlight/spotlight.js +32 -0
  137. package/dist/components/spotlight/spotlight.js.map +1 -0
  138. package/dist/components/starfield/starfield.d.ts +11 -0
  139. package/dist/components/starfield/starfield.js +76 -0
  140. package/dist/components/starfield/starfield.js.map +1 -0
  141. package/dist/components/stat/stat.d.ts +28 -0
  142. package/dist/components/stat/stat.js +100 -0
  143. package/dist/components/stat/stat.js.map +1 -0
  144. package/dist/components/switch/switch.d.ts +13 -0
  145. package/dist/components/switch/switch.js +44 -0
  146. package/dist/components/switch/switch.js.map +1 -0
  147. package/dist/components/table/table.d.ts +52 -0
  148. package/dist/components/table/table.js +96 -0
  149. package/dist/components/table/table.js.map +1 -0
  150. package/dist/components/tabs/tabs.d.ts +24 -0
  151. package/dist/components/tabs/tabs.js +89 -0
  152. package/dist/components/tabs/tabs.js.map +1 -0
  153. package/dist/components/textarea/textarea.d.ts +5 -0
  154. package/dist/components/textarea/textarea.js +20 -0
  155. package/dist/components/textarea/textarea.js.map +1 -0
  156. package/dist/components/theme-switcher/theme-switcher.d.ts +7 -0
  157. package/dist/components/theme-switcher/theme-switcher.js +57 -0
  158. package/dist/components/theme-switcher/theme-switcher.js.map +1 -0
  159. package/dist/components/toaster/toaster.d.ts +7 -0
  160. package/dist/components/toaster/toaster.js +43 -0
  161. package/dist/components/toaster/toaster.js.map +1 -0
  162. package/dist/components/toggle-group/toggle-group.d.ts +24 -0
  163. package/dist/components/toggle-group/toggle-group.js +84 -0
  164. package/dist/components/toggle-group/toggle-group.js.map +1 -0
  165. package/dist/components/tooltip/tooltip.d.ts +19 -0
  166. package/dist/components/tooltip/tooltip.js +49 -0
  167. package/dist/components/tooltip/tooltip.js.map +1 -0
  168. package/dist/fonts/geist-cyrillic-ext-wght-normal.woff2 +0 -0
  169. package/dist/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
  170. package/dist/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
  171. package/dist/fonts/geist-latin-wght-normal.woff2 +0 -0
  172. package/dist/fonts/geist-mono-cyrillic-ext-wght-normal.woff2 +0 -0
  173. package/dist/fonts/geist-mono-cyrillic-wght-normal.woff2 +0 -0
  174. package/dist/fonts/geist-mono-latin-ext-wght-normal.woff2 +0 -0
  175. package/dist/fonts/geist-mono-latin-wght-normal.woff2 +0 -0
  176. package/dist/fonts/geist-mono-symbols2-wght-normal.woff2 +0 -0
  177. package/dist/fonts/geist-mono-vietnamese-wght-normal.woff2 +0 -0
  178. package/dist/fonts/geist-mono.LICENSE +93 -0
  179. package/dist/fonts/geist-vietnamese-wght-normal.woff2 +0 -0
  180. package/dist/fonts/geist.LICENSE +93 -0
  181. package/dist/icons/icon.d.ts +10 -0
  182. package/dist/icons/icon.js +13 -0
  183. package/dist/icons/icon.js.map +1 -0
  184. package/dist/icons/refine-icon-names.d.ts +5 -0
  185. package/dist/icons/refine-icon-names.js +16 -0
  186. package/dist/icons/refine-icon-names.js.map +1 -0
  187. package/dist/icons/refine-icons.d.ts +467 -0
  188. package/dist/icons/refine-icons.js +473 -0
  189. package/dist/icons/refine-icons.js.map +1 -0
  190. package/dist/icons/with-refine-weight.d.ts +11 -0
  191. package/dist/icons/with-refine-weight.js +25 -0
  192. package/dist/icons/with-refine-weight.js.map +1 -0
  193. package/dist/index.d.ts +61 -0
  194. package/dist/index.js +61 -0
  195. package/dist/lib/cn.d.ts +5 -0
  196. package/dist/lib/cn.js +49 -0
  197. package/dist/lib/cn.js.map +1 -0
  198. package/dist/lib/use-breakpoint.d.ts +16 -0
  199. package/dist/lib/use-breakpoint.js +52 -0
  200. package/dist/lib/use-breakpoint.js.map +1 -0
  201. package/dist/styles.css +697 -0
  202. package/dist/theme/theme-provider.d.ts +31 -0
  203. package/dist/theme/theme-provider.js +115 -0
  204. package/dist/theme/theme-provider.js.map +1 -0
  205. package/dist/theme/theme-scope.d.ts +12 -0
  206. package/dist/theme/theme-scope.js +22 -0
  207. package/dist/theme/theme-scope.js.map +1 -0
  208. package/dist/theme/theme.d.ts +20 -0
  209. package/dist/theme/theme.js +37 -0
  210. package/dist/theme/theme.js.map +1 -0
  211. package/package.json +91 -5
@@ -0,0 +1,244 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { RefineIconAddPlus, RefineIconCheck, RefineIconCloseSM, RefineIconSearchMagnifyingGlass } from "../../icons/refine-icons.js";
3
+ import { Command as Command$1, CommandEmpty, CommandGroup, CommandItem, CommandList } from "../command-menu/command-menu.js";
4
+ import { Popover, PopoverAnchor, PopoverContent } from "../popover/popover.js";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { useRef, useState } from "react";
7
+ import { Command } from "cmdk";
8
+ // src/components/combobox/combobox.tsx
9
+ var SHELL_CLASS_NAME_BY_SIZE = {
10
+ lg: "h-control-lg text-body",
11
+ md: "h-control-md text-body-sm",
12
+ sm: "h-control-sm text-body-sm"
13
+ };
14
+ var CREATE_VALUE = "__combobox-create__";
15
+ /**
16
+ * Returns true when the query appears in the option's label, value, keywords or text hint, ignoring case.
17
+ */
18
+ var matchesQuery = (option, query) => {
19
+ const needle = query.trim().toLowerCase();
20
+ if (!needle) return true;
21
+ return [
22
+ option.label,
23
+ option.value,
24
+ ...option.keywords ?? [],
25
+ typeof option.hint === "string" ? option.hint : ""
26
+ ].some((text) => {
27
+ return text.toLowerCase().includes(needle);
28
+ });
29
+ };
30
+ /**
31
+ * Splits options into groups in the order each group first appears; options without a group share one unnamed group.
32
+ */
33
+ var groupOptions = (options) => {
34
+ const groups = /* @__PURE__ */ new Map();
35
+ for (const option of options) {
36
+ const key = option.group ?? "";
37
+ groups.set(key, [...groups.get(key) ?? [], option]);
38
+ }
39
+ return [...groups.entries()];
40
+ };
41
+ /**
42
+ * Picks one value from a long list by typing; arrows move, Enter picks, Escape closes, and `onCreate` adds a "Create" row for an unmatched query.
43
+ */
44
+ var Combobox = ({ "aria-label": ariaLabel, className, createLabel = (query) => {
45
+ return `Create “${query}”`;
46
+ }, disabled = false, emptyMessage = "Nothing matches.", leading = /* @__PURE__ */ jsx(RefineIconSearchMagnifyingGlass, {
47
+ "aria-hidden": true,
48
+ className: "size-4 shrink-0 text-muted-foreground"
49
+ }), onCreate, onQueryChange, onValueChange, options, placeholder = "Search…", query: controlledQuery, renderOption, renderValue, size = "md", value }) => {
50
+ const [isOpen, setIsOpen] = useState(false);
51
+ const [uncontrolledQuery, setUncontrolledQuery] = useState("");
52
+ const anchorRef = useRef(null);
53
+ const inputRef = useRef(null);
54
+ const isQueryControlled = controlledQuery !== void 0;
55
+ const query = isQueryControlled ? controlledQuery : uncontrolledQuery;
56
+ const selected = options.find((option) => {
57
+ return option.value === value;
58
+ });
59
+ const isShowingChip = !!selected && !isOpen && !query;
60
+ const visible = isQueryControlled ? options : options.filter((option) => {
61
+ return matchesQuery(option, query);
62
+ });
63
+ const trimmed = query.trim();
64
+ const canCreate = !!onCreate && !!trimmed && !options.some((option) => {
65
+ return option.label.toLowerCase() === trimmed.toLowerCase();
66
+ });
67
+ /**
68
+ * Writes the query to the caller when controlled, to local state otherwise.
69
+ */
70
+ const setQuery = (next) => {
71
+ if (!isQueryControlled) setUncontrolledQuery(next);
72
+ onQueryChange?.(next);
73
+ };
74
+ /**
75
+ * Updates the query from typing and opens the list.
76
+ */
77
+ const handleQueryChange = (next) => {
78
+ setQuery(next);
79
+ setIsOpen(true);
80
+ };
81
+ /**
82
+ * Picks an option, clears the query and closes the list.
83
+ */
84
+ const handleSelect = (option) => {
85
+ onValueChange(option.value);
86
+ setQuery("");
87
+ setIsOpen(false);
88
+ };
89
+ /**
90
+ * Hands the trimmed query to `onCreate`, clears the query and closes the list.
91
+ */
92
+ const handleCreate = () => {
93
+ onCreate?.(trimmed);
94
+ setQuery("");
95
+ setIsOpen(false);
96
+ };
97
+ /**
98
+ * Clears the picked value and puts the cursor back in the field.
99
+ */
100
+ const handleClear = () => {
101
+ onValueChange(null);
102
+ setIsOpen(true);
103
+ requestAnimationFrame(() => {
104
+ inputRef.current?.focus();
105
+ });
106
+ };
107
+ /**
108
+ * Swaps the chip for the field so the user can search again.
109
+ */
110
+ const handleEdit = () => {
111
+ setIsOpen(true);
112
+ requestAnimationFrame(() => {
113
+ inputRef.current?.focus();
114
+ });
115
+ };
116
+ /**
117
+ * Escape closes an open list, and on a closed list clears the query; cmdk handles arrows and Enter.
118
+ */
119
+ const handleKeyDown = (event) => {
120
+ if (event.key === "Escape") {
121
+ event.preventDefault();
122
+ if (isOpen) setIsOpen(false);
123
+ else setQuery("");
124
+ return;
125
+ }
126
+ if (event.key === "ArrowDown" && !isOpen) setIsOpen(true);
127
+ };
128
+ return /* @__PURE__ */ jsx(Command$1, {
129
+ className: cn("size-auto overflow-visible bg-transparent", className),
130
+ "data-slot": "combobox",
131
+ label: ariaLabel,
132
+ loop: true,
133
+ shouldFilter: false,
134
+ children: /* @__PURE__ */ jsxs(Popover, {
135
+ onOpenChange: setIsOpen,
136
+ open: isOpen && !disabled,
137
+ children: [/* @__PURE__ */ jsx(PopoverAnchor, {
138
+ asChild: true,
139
+ children: /* @__PURE__ */ jsxs("div", {
140
+ className: cn("gap-2 px-3 flex w-full items-center rounded-control border border-input bg-card transition-colors", "focus-within:border-gem focus-within:ring-3 focus-within:ring-gem/20", disabled && "pointer-events-none opacity-45", SHELL_CLASS_NAME_BY_SIZE[size]),
141
+ "data-slot": "combobox-field",
142
+ ref: anchorRef,
143
+ children: [leading, isShowingChip ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("button", {
144
+ className: "min-w-0 gap-2 flex flex-1 items-center rounded-inner text-left focus-ring",
145
+ "data-slot": "combobox-value",
146
+ disabled,
147
+ onClick: handleEdit,
148
+ type: "button",
149
+ children: renderValue ? renderValue(selected) : /* @__PURE__ */ jsx("span", {
150
+ className: "truncate",
151
+ children: selected.label
152
+ })
153
+ }), /* @__PURE__ */ jsxs("button", {
154
+ className: "-mr-1 size-6 grid shrink-0 place-items-center rounded-inner text-muted-foreground focus-ring hover:bg-hover hover:text-foreground",
155
+ "data-slot": "combobox-clear",
156
+ disabled,
157
+ onClick: handleClear,
158
+ title: "Clear",
159
+ type: "button",
160
+ children: [/* @__PURE__ */ jsx(RefineIconCloseSM, {
161
+ "aria-hidden": true,
162
+ className: "size-4"
163
+ }), /* @__PURE__ */ jsx("span", {
164
+ className: "sr-only",
165
+ children: "Clear"
166
+ })]
167
+ })] }) : /* @__PURE__ */ jsx(Command.Input, {
168
+ className: "min-w-0 h-full flex-1 bg-transparent outline-none placeholder:text-subtle",
169
+ "data-slot": "combobox-input",
170
+ disabled,
171
+ onFocus: () => {
172
+ setIsOpen(true);
173
+ },
174
+ onKeyDown: handleKeyDown,
175
+ onValueChange: handleQueryChange,
176
+ placeholder: selected ? selected.label : placeholder,
177
+ ref: inputRef,
178
+ value: query
179
+ })]
180
+ })
181
+ }), /* @__PURE__ */ jsx(PopoverContent, {
182
+ align: "start",
183
+ className: "min-w-64 p-0 w-(--radix-popover-trigger-width)",
184
+ "data-slot": "combobox-content",
185
+ onEscapeKeyDown: (event) => {
186
+ event.preventDefault();
187
+ },
188
+ onInteractOutside: (event) => {
189
+ if (anchorRef.current?.contains(event.target)) event.preventDefault();
190
+ },
191
+ onOpenAutoFocus: (event) => {
192
+ event.preventDefault();
193
+ },
194
+ sideOffset: 4,
195
+ children: /* @__PURE__ */ jsxs(CommandList, {
196
+ onMouseDown: (event) => {
197
+ event.preventDefault();
198
+ },
199
+ children: [
200
+ /* @__PURE__ */ jsx(CommandEmpty, { children: emptyMessage }),
201
+ groupOptions(visible).map(([heading, groupItems]) => {
202
+ return /* @__PURE__ */ jsx(CommandGroup, {
203
+ heading: heading || void 0,
204
+ children: groupItems.map((option) => {
205
+ const isSelected = option.value === value;
206
+ return /* @__PURE__ */ jsxs(CommandItem, {
207
+ "data-checked": isSelected || void 0,
208
+ disabled: option.disabled,
209
+ onSelect: () => {
210
+ handleSelect(option);
211
+ },
212
+ value: option.value,
213
+ children: [renderOption ? renderOption(option) : /* @__PURE__ */ jsxs(Fragment, { children: [option.hint ? /* @__PURE__ */ jsx("span", {
214
+ className: "shrink-0 font-mono text-caption text-muted-foreground",
215
+ children: option.hint
216
+ }) : null, /* @__PURE__ */ jsx("span", {
217
+ className: "min-w-0 flex-1 truncate",
218
+ children: option.label
219
+ })] }), isSelected ? /* @__PURE__ */ jsx(RefineIconCheck, {
220
+ "aria-hidden": true,
221
+ className: "ml-auto text-gem-ink"
222
+ }) : null]
223
+ }, option.value);
224
+ })
225
+ }, heading || "ungrouped");
226
+ }),
227
+ canCreate ? /* @__PURE__ */ jsx(CommandGroup, { children: /* @__PURE__ */ jsxs(CommandItem, {
228
+ "data-slot": "combobox-create",
229
+ onSelect: handleCreate,
230
+ value: CREATE_VALUE,
231
+ children: [/* @__PURE__ */ jsx(RefineIconAddPlus, { "aria-hidden": true }), /* @__PURE__ */ jsx("span", {
232
+ className: "min-w-0 flex-1 truncate",
233
+ children: createLabel(trimmed)
234
+ })]
235
+ }) }) : null
236
+ ]
237
+ })
238
+ })]
239
+ })
240
+ });
241
+ };
242
+ export { Combobox };
243
+
244
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.js","names":["Command","_Fragment","CommandPrimitive"],"sources":["../../../src/components/combobox/combobox.tsx"],"sourcesContent":["import { Command as CommandPrimitive } from 'cmdk';\nimport { type KeyboardEvent, type ReactNode, useRef, useState } from 'react';\n\nimport {\n RefineIconAddPlus,\n RefineIconCheck,\n RefineIconCloseSM,\n RefineIconSearchMagnifyingGlass,\n} from '../../icons/refine-icons';\nimport { cn } from '../../lib/cn';\nimport { Command, CommandEmpty, CommandGroup, CommandItem, CommandList } from '../command-menu/command-menu';\nimport { Popover, PopoverAnchor, PopoverContent } from '../popover/popover';\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n group?: string;\n hint?: ReactNode;\n keywords?: string[];\n}\n\ntype ComboboxSize = 'lg' | 'md' | 'sm';\n\nconst SHELL_CLASS_NAME_BY_SIZE: Record<ComboboxSize, string> = {\n lg: 'h-control-lg text-body',\n md: 'h-control-md text-body-sm',\n sm: 'h-control-sm text-body-sm',\n};\n\nconst CREATE_VALUE = '__combobox-create__';\n\ninterface ComboboxProps {\n options: ComboboxOption[];\n value: string | null;\n onValueChange: (value: string | null) => void;\n 'aria-label'?: string;\n className?: string;\n createLabel?: (query: string) => ReactNode;\n disabled?: boolean;\n emptyMessage?: ReactNode;\n leading?: ReactNode;\n onCreate?: (query: string) => void;\n onQueryChange?: (query: string) => void;\n placeholder?: string;\n query?: string;\n renderOption?: (option: ComboboxOption) => ReactNode;\n renderValue?: (option: ComboboxOption) => ReactNode;\n size?: ComboboxSize;\n}\n\n/**\n * Returns true when the query appears in the option's label, value, keywords or text hint, ignoring case.\n */\nconst matchesQuery = (option: ComboboxOption, query: string) => {\n const needle = query.trim().toLowerCase();\n if (!needle) return true;\n const haystack = [\n option.label,\n option.value,\n ...(option.keywords ?? []),\n typeof option.hint === 'string' ? option.hint : '',\n ];\n return haystack.some((text) => {\n return text.toLowerCase().includes(needle);\n });\n};\n\n/**\n * Splits options into groups in the order each group first appears; options without a group share one unnamed group.\n */\nconst groupOptions = (options: ComboboxOption[]) => {\n const groups = new Map<string, ComboboxOption[]>();\n for (const option of options) {\n const key = option.group ?? '';\n groups.set(key, [...(groups.get(key) ?? []), option]);\n }\n return [...groups.entries()];\n};\n\n/**\n * Picks one value from a long list by typing; arrows move, Enter picks, Escape closes, and `onCreate` adds a \"Create\" row for an unmatched query.\n */\nexport const Combobox = ({\n 'aria-label': ariaLabel,\n className,\n createLabel = (query) => {\n return `Create “${query}”`;\n },\n disabled = false,\n emptyMessage = 'Nothing matches.',\n leading = <RefineIconSearchMagnifyingGlass aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />,\n onCreate,\n onQueryChange,\n onValueChange,\n options,\n placeholder = 'Search…',\n query: controlledQuery,\n renderOption,\n renderValue,\n size = 'md',\n value,\n}: ComboboxProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [uncontrolledQuery, setUncontrolledQuery] = useState('');\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const isQueryControlled = controlledQuery !== undefined;\n const query = isQueryControlled ? controlledQuery : uncontrolledQuery;\n const selected = options.find((option) => {\n return option.value === value;\n });\n const isShowingChip = !!selected && !isOpen && !query;\n // A controlled query means the caller filters, often on the server, so the list shows options as given.\n const visible = isQueryControlled\n ? options\n : options.filter((option) => {\n return matchesQuery(option, query);\n });\n const trimmed = query.trim();\n const canCreate =\n !!onCreate &&\n !!trimmed &&\n !options.some((option) => {\n return option.label.toLowerCase() === trimmed.toLowerCase();\n });\n\n /**\n * Writes the query to the caller when controlled, to local state otherwise.\n */\n const setQuery = (next: string) => {\n if (!isQueryControlled) setUncontrolledQuery(next);\n onQueryChange?.(next);\n };\n\n /**\n * Updates the query from typing and opens the list.\n */\n const handleQueryChange = (next: string) => {\n setQuery(next);\n setIsOpen(true);\n };\n\n /**\n * Picks an option, clears the query and closes the list.\n */\n const handleSelect = (option: ComboboxOption) => {\n onValueChange(option.value);\n setQuery('');\n setIsOpen(false);\n };\n\n /**\n * Hands the trimmed query to `onCreate`, clears the query and closes the list.\n */\n const handleCreate = () => {\n onCreate?.(trimmed);\n setQuery('');\n setIsOpen(false);\n };\n\n /**\n * Clears the picked value and puts the cursor back in the field.\n */\n const handleClear = () => {\n onValueChange(null);\n setIsOpen(true);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n };\n\n /**\n * Swaps the chip for the field so the user can search again.\n */\n const handleEdit = () => {\n setIsOpen(true);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n };\n\n /**\n * Escape closes an open list, and on a closed list clears the query; cmdk handles arrows and Enter.\n */\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n if (isOpen) setIsOpen(false);\n else setQuery('');\n return;\n }\n if (event.key === 'ArrowDown' && !isOpen) setIsOpen(true);\n };\n\n return (\n // cmdk names the field through its own label element, which outranks an aria-label on the input.\n <Command\n className={cn('size-auto overflow-visible bg-transparent', className)}\n data-slot=\"combobox\"\n label={ariaLabel}\n loop\n shouldFilter={false}\n >\n <Popover onOpenChange={setIsOpen} open={isOpen && !disabled}>\n <PopoverAnchor asChild>\n <div\n className={cn(\n 'gap-2 px-3 flex w-full items-center rounded-control border border-input bg-card transition-colors',\n 'focus-within:border-gem focus-within:ring-3 focus-within:ring-gem/20',\n disabled && 'pointer-events-none opacity-45',\n SHELL_CLASS_NAME_BY_SIZE[size],\n )}\n data-slot=\"combobox-field\"\n ref={anchorRef}\n >\n {leading}\n {isShowingChip ? (\n <>\n <button\n className=\"min-w-0 gap-2 flex flex-1 items-center rounded-inner text-left focus-ring\"\n data-slot=\"combobox-value\"\n disabled={disabled}\n onClick={handleEdit}\n type=\"button\"\n >\n {renderValue ? renderValue(selected) : <span className=\"truncate\">{selected.label}</span>}\n </button>\n <button\n className=\"-mr-1 size-6 grid shrink-0 place-items-center rounded-inner text-muted-foreground focus-ring hover:bg-hover hover:text-foreground\"\n data-slot=\"combobox-clear\"\n disabled={disabled}\n onClick={handleClear}\n title=\"Clear\"\n type=\"button\"\n >\n <RefineIconCloseSM aria-hidden className=\"size-4\" />\n <span className=\"sr-only\">Clear</span>\n </button>\n </>\n ) : (\n <CommandPrimitive.Input\n className=\"min-w-0 h-full flex-1 bg-transparent outline-none placeholder:text-subtle\"\n data-slot=\"combobox-input\"\n disabled={disabled}\n onFocus={() => {\n setIsOpen(true);\n }}\n onKeyDown={handleKeyDown}\n onValueChange={handleQueryChange}\n placeholder={selected ? selected.label : placeholder}\n ref={inputRef}\n value={query}\n />\n )}\n </div>\n </PopoverAnchor>\n <PopoverContent\n align=\"start\"\n className=\"min-w-64 p-0 w-(--radix-popover-trigger-width)\"\n data-slot=\"combobox-content\"\n // The field keeps focus while the list is open, so typing keeps filtering.\n onEscapeKeyDown={(event) => {\n event.preventDefault();\n }}\n onInteractOutside={(event) => {\n if (anchorRef.current?.contains(event.target as Node)) event.preventDefault();\n }}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n sideOffset={4}\n >\n <CommandList\n // A mousedown on the list would blur the field and close the popover before the click lands.\n onMouseDown={(event) => {\n event.preventDefault();\n }}\n >\n <CommandEmpty>{emptyMessage}</CommandEmpty>\n {groupOptions(visible).map(([heading, groupItems]) => {\n return (\n <CommandGroup heading={heading || undefined} key={heading || 'ungrouped'}>\n {groupItems.map((option) => {\n const isSelected = option.value === value;\n return (\n <CommandItem\n data-checked={isSelected || undefined}\n disabled={option.disabled}\n key={option.value}\n onSelect={() => {\n handleSelect(option);\n }}\n value={option.value}\n >\n {renderOption ? (\n renderOption(option)\n ) : (\n <>\n {option.hint ? (\n <span className=\"shrink-0 font-mono text-caption text-muted-foreground\">\n {option.hint}\n </span>\n ) : null}\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n </>\n )}\n {isSelected ? <RefineIconCheck aria-hidden className=\"ml-auto text-gem-ink\" /> : null}\n </CommandItem>\n );\n })}\n </CommandGroup>\n );\n })}\n {canCreate ? (\n <CommandGroup>\n <CommandItem data-slot=\"combobox-create\" onSelect={handleCreate} value={CREATE_VALUE}>\n <RefineIconAddPlus aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\">{createLabel(trimmed)}</span>\n </CommandItem>\n </CommandGroup>\n ) : null}\n </CommandList>\n </PopoverContent>\n </Popover>\n </Command>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { Command as CommandPrimitive } from 'cmdk';
2
+ import type { ComponentProps } from 'react';
3
+ import { Dialog } from '../dialog/dialog';
4
+ /**
5
+ * Filters and navigates a list of commands with the keyboard; use it inline or inside `CommandMenu`.
6
+ */
7
+ export declare const Command: ({ className, ...props }: ComponentProps<typeof CommandPrimitive>) => import("react").JSX.Element;
8
+ interface CommandMenuProps extends ComponentProps<typeof Dialog> {
9
+ description?: string;
10
+ title?: string;
11
+ }
12
+ /**
13
+ * Wraps a `Command` palette in a dialog, the ⌘K pattern; the title and description are announced but not shown.
14
+ */
15
+ export declare const CommandMenu: ({ children, description, title, ...props }: CommandMenuProps) => import("react").JSX.Element;
16
+ /**
17
+ * Renders the search field with a leading magnifier.
18
+ */
19
+ export declare const CommandInput: ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Input>) => import("react").JSX.Element;
20
+ export declare const CommandList: ({ className, ...props }: ComponentProps<typeof CommandPrimitive.List>) => import("react").JSX.Element;
21
+ /**
22
+ * Shows when nothing matches the query.
23
+ */
24
+ export declare const CommandEmpty: ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Empty>) => import("react").JSX.Element;
25
+ export declare const CommandGroup: ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Group>) => import("react").JSX.Element;
26
+ export declare const CommandSeparator: ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Separator>) => import("react").JSX.Element;
27
+ /**
28
+ * Runs a command; the highlighted item takes a gem tint.
29
+ */
30
+ export declare const CommandItem: ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Item>) => import("react").JSX.Element;
31
+ /**
32
+ * Right-aligns a keyboard shortcut hint inside an item.
33
+ */
34
+ export declare const CommandShortcut: ({ className, ...props }: ComponentProps<"span">) => import("react").JSX.Element;
35
+ export {};
@@ -0,0 +1,116 @@
1
+ "use client";
2
+ import { cn } from "../../lib/cn.js";
3
+ import { RefineIconSearchMagnifyingGlass } from "../../icons/refine-icons.js";
4
+ import { Dialog, DialogContent, DialogDescription, DialogTitle } from "../dialog/dialog.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Command } from "cmdk";
7
+ // src/components/command-menu/command-menu.tsx
8
+ /**
9
+ * Filters and navigates a list of commands with the keyboard; use it inline or inside `CommandMenu`.
10
+ */
11
+ var Command$1 = ({ className, ...props }) => {
12
+ return /* @__PURE__ */ jsx(Command, {
13
+ className: cn("flex size-full flex-col overflow-hidden bg-popover text-popover-foreground", className),
14
+ "data-slot": "command",
15
+ ...props
16
+ });
17
+ };
18
+ /**
19
+ * Wraps a `Command` palette in a dialog, the ⌘K pattern; the title and description are announced but not shown.
20
+ */
21
+ var CommandMenu = ({ children, description = "Search for a command to run.", title = "Command palette", ...props }) => {
22
+ return /* @__PURE__ */ jsx(Dialog, {
23
+ ...props,
24
+ children: /* @__PURE__ */ jsxs(DialogContent, {
25
+ className: "top-[20dvh] translate-y-0 p-0",
26
+ showClose: false,
27
+ size: "lg",
28
+ children: [
29
+ /* @__PURE__ */ jsx(DialogTitle, {
30
+ className: "sr-only",
31
+ children: title
32
+ }),
33
+ /* @__PURE__ */ jsx(DialogDescription, {
34
+ className: "sr-only",
35
+ children: description
36
+ }),
37
+ /* @__PURE__ */ jsx(Command$1, {
38
+ className: "max-h-[min(32rem,70dvh)]",
39
+ children
40
+ })
41
+ ]
42
+ })
43
+ });
44
+ };
45
+ /**
46
+ * Renders the search field with a leading magnifier.
47
+ */
48
+ var CommandInput = ({ className, ...props }) => {
49
+ return /* @__PURE__ */ jsxs("div", {
50
+ className: "flex items-center gap-3 border-b px-4",
51
+ "data-slot": "command-input-wrapper",
52
+ children: [/* @__PURE__ */ jsx(RefineIconSearchMagnifyingGlass, {
53
+ "aria-hidden": true,
54
+ className: "size-4 shrink-0 text-muted-foreground",
55
+ role: "presentation"
56
+ }), /* @__PURE__ */ jsx(Command.Input, {
57
+ className: cn("flex h-control-xl w-full bg-transparent text-body outline-none placeholder:text-subtle disabled:cursor-not-allowed disabled:opacity-45", className),
58
+ "data-slot": "command-input",
59
+ ...props
60
+ })]
61
+ });
62
+ };
63
+ var CommandList = ({ className, ...props }) => {
64
+ return /* @__PURE__ */ jsx(Command.List, {
65
+ className: cn("max-h-96 scroll-py-2 overflow-x-hidden overflow-y-auto p-2", className),
66
+ "data-slot": "command-list",
67
+ ...props
68
+ });
69
+ };
70
+ /**
71
+ * Shows when nothing matches the query.
72
+ */
73
+ var CommandEmpty = ({ className, ...props }) => {
74
+ return /* @__PURE__ */ jsx(Command.Empty, {
75
+ className: cn("py-10 text-center text-body-sm text-muted-foreground", className),
76
+ "data-slot": "command-empty",
77
+ ...props
78
+ });
79
+ };
80
+ var CommandGroup = ({ className, ...props }) => {
81
+ return /* @__PURE__ */ jsx(Command.Group, {
82
+ className: cn("overflow-hidden py-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1.5 [&_[cmdk-group-heading]]:eyebrow [&_[cmdk-group-heading]]:text-subtle", className),
83
+ "data-slot": "command-group",
84
+ ...props
85
+ });
86
+ };
87
+ var CommandSeparator = ({ className, ...props }) => {
88
+ return /* @__PURE__ */ jsx(Command.Separator, {
89
+ className: cn("-mx-2 my-1 h-px bg-border", className),
90
+ "data-slot": "command-separator",
91
+ ...props
92
+ });
93
+ };
94
+ /**
95
+ * Runs a command; the highlighted item takes a gem tint.
96
+ */
97
+ var CommandItem = ({ className, ...props }) => {
98
+ return /* @__PURE__ */ jsx(Command.Item, {
99
+ className: cn("relative flex cursor-default items-center gap-3 rounded-control px-2.5 py-2 text-body-sm outline-none select-none", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", "data-[selected=true]:bg-gem-soft data-[selected=true]:text-foreground data-[selected=true]:[&_svg:not([class*=\"text-\"])]:text-gem-ink", "data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-45", className),
100
+ "data-slot": "command-item",
101
+ ...props
102
+ });
103
+ };
104
+ /**
105
+ * Right-aligns a keyboard shortcut hint inside an item.
106
+ */
107
+ var CommandShortcut = ({ className, ...props }) => {
108
+ return /* @__PURE__ */ jsx("span", {
109
+ className: cn("ml-auto font-mono text-caption tracking-wide text-subtle", className),
110
+ "data-slot": "command-shortcut",
111
+ ...props
112
+ });
113
+ };
114
+ export { Command$1 as Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandMenu, CommandSeparator, CommandShortcut };
115
+
116
+ //# sourceMappingURL=command-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-menu.js","names":["Command","CommandPrimitive"],"sources":["../../../src/components/command-menu/command-menu.tsx"],"sourcesContent":["'use client';\n\nimport { Command as CommandPrimitive } from 'cmdk';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../../lib/cn';\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '../dialog/dialog';\nimport { RefineIconSearchMagnifyingGlass } from '../../icons/refine-icons';\n\n/**\n * Filters and navigates a list of commands with the keyboard; use it inline or inside `CommandMenu`.\n */\nexport const Command = ({ className, ...props }: ComponentProps<typeof CommandPrimitive>) => {\n return (\n <CommandPrimitive\n className={cn('flex size-full flex-col overflow-hidden bg-popover text-popover-foreground', className)}\n data-slot=\"command\"\n {...props}\n />\n );\n};\n\ninterface CommandMenuProps extends ComponentProps<typeof Dialog> {\n description?: string;\n title?: string;\n}\n\n/**\n * Wraps a `Command` palette in a dialog, the ⌘K pattern; the title and description are announced but not shown.\n */\nexport const CommandMenu = ({\n children,\n description = 'Search for a command to run.',\n title = 'Command palette',\n ...props\n}: CommandMenuProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"top-[20dvh] translate-y-0 p-0\" showClose={false} size=\"lg\">\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n <Command className=\"max-h-[min(32rem,70dvh)]\">{children}</Command>\n </DialogContent>\n </Dialog>\n );\n};\n\n/**\n * Renders the search field with a leading magnifier.\n */\nexport const CommandInput = ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Input>) => {\n return (\n <div className=\"flex items-center gap-3 border-b px-4\" data-slot=\"command-input-wrapper\">\n <RefineIconSearchMagnifyingGlass\n aria-hidden\n className=\"size-4 shrink-0 text-muted-foreground\"\n role=\"presentation\"\n />\n <CommandPrimitive.Input\n className={cn(\n 'flex h-control-xl w-full bg-transparent text-body outline-none placeholder:text-subtle disabled:cursor-not-allowed disabled:opacity-45',\n className,\n )}\n data-slot=\"command-input\"\n {...props}\n />\n </div>\n );\n};\n\nexport const CommandList = ({ className, ...props }: ComponentProps<typeof CommandPrimitive.List>) => {\n return (\n <CommandPrimitive.List\n className={cn('max-h-96 scroll-py-2 overflow-x-hidden overflow-y-auto p-2', className)}\n data-slot=\"command-list\"\n {...props}\n />\n );\n};\n\n/**\n * Shows when nothing matches the query.\n */\nexport const CommandEmpty = ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Empty>) => {\n return (\n <CommandPrimitive.Empty\n className={cn('py-10 text-center text-body-sm text-muted-foreground', className)}\n data-slot=\"command-empty\"\n {...props}\n />\n );\n};\n\nexport const CommandGroup = ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Group>) => {\n return (\n <CommandPrimitive.Group\n className={cn(\n 'overflow-hidden py-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1.5 [&_[cmdk-group-heading]]:eyebrow [&_[cmdk-group-heading]]:text-subtle',\n className,\n )}\n data-slot=\"command-group\"\n {...props}\n />\n );\n};\n\nexport const CommandSeparator = ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Separator>) => {\n return (\n <CommandPrimitive.Separator\n className={cn('-mx-2 my-1 h-px bg-border', className)}\n data-slot=\"command-separator\"\n {...props}\n />\n );\n};\n\n/**\n * Runs a command; the highlighted item takes a gem tint.\n */\nexport const CommandItem = ({ className, ...props }: ComponentProps<typeof CommandPrimitive.Item>) => {\n return (\n <CommandPrimitive.Item\n className={cn(\n // base\n 'relative flex cursor-default items-center gap-3 rounded-control px-2.5 py-2 text-body-sm outline-none select-none',\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n // hover\n 'data-[selected=true]:bg-gem-soft data-[selected=true]:text-foreground data-[selected=true]:[&_svg:not([class*=\"text-\"])]:text-gem-ink',\n // disabled\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-45',\n className,\n )}\n data-slot=\"command-item\"\n {...props}\n />\n );\n};\n\n/**\n * Right-aligns a keyboard shortcut hint inside an item.\n */\nexport const CommandShortcut = ({ className, ...props }: ComponentProps<'span'>) => {\n return (\n <span\n className={cn('ml-auto font-mono text-caption tracking-wide text-subtle', className)}\n data-slot=\"command-shortcut\"\n {...props}\n />\n );\n};\n"],"mappings":";;;;;;;;;;AAYA,IAAaA,aAAW,EAAE,WAAW,GAAG,YAAqD;CAC3F,OACE,oBAACC,SAAD;EACE,WAAW,GAAG,8EAA8E,SAAS;EACrG,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;;AAUA,IAAa,eAAe,EAC1B,UACA,cAAc,gCACd,QAAQ,mBACR,GAAG,YACmB;CACtB,OACE,oBAAC,QAAD;EAAQ,GAAI;EACV,UAAA,qBAAC,eAAD;GAAe,WAAU;GAAgC,WAAW;GAAO,MAAK;GAAhF,UAAA;IACE,oBAAC,aAAD;KAAa,WAAU;KAAW,UAAA;IAAmB,CAAA;IACrD,oBAAC,mBAAD;KAAmB,WAAU;KAAW,UAAA;IAA+B,CAAA;IACvE,oBAACD,WAAD;KAAS,WAAU;KAA4B;IAAkB,CAAA;GACpD;;CACT,CAAA;AAEZ;;;;AAKA,IAAa,gBAAgB,EAAE,WAAW,GAAG,YAA2D;CACtG,OACE,qBAAC,OAAD;EAAK,WAAU;EAAwC,aAAU;EAAjE,UAAA,CACE,oBAAC,iCAAD;GACE,eAAA;GACA,WAAU;GACV,MAAK;EACN,CAAA,GACD,oBAACC,QAAiB,OAAlB;GACE,WAAW,GACT,0IACA,SACF;GACA,aAAU;GACV,GAAI;EACL,CAAA,CACE;;AAET;AAEA,IAAa,eAAe,EAAE,WAAW,GAAG,YAA0D;CACpG,OACE,oBAACA,QAAiB,MAAlB;EACE,WAAW,GAAG,8DAA8D,SAAS;EACrF,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;;AAKA,IAAa,gBAAgB,EAAE,WAAW,GAAG,YAA2D;CACtG,OACE,oBAACA,QAAiB,OAAlB;EACE,WAAW,GAAG,wDAAwD,SAAS;EAC/E,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,gBAAgB,EAAE,WAAW,GAAG,YAA2D;CACtG,OACE,oBAACA,QAAiB,OAAlB;EACE,WAAW,GACT,0MACA,SACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,oBAAoB,EAAE,WAAW,GAAG,YAA+D;CAC9G,OACE,oBAACA,QAAiB,WAAlB;EACE,WAAW,GAAG,6BAA6B,SAAS;EACpD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;;AAKA,IAAa,eAAe,EAAE,WAAW,GAAG,YAA0D;CACpG,OACE,oBAACA,QAAiB,MAAlB;EACE,WAAW,GAET,qHACA,yIAEA,2IAEA,4EACA,SACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;;AAKA,IAAa,mBAAmB,EAAE,WAAW,GAAG,YAAoC;CAClF,OACE,oBAAC,QAAD;EACE,WAAW,GAAG,4DAA4D,SAAS;EACnF,aAAU;EACV,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,45 @@
1
+ import type { VariantProps } from 'class-variance-authority';
2
+ import { ContextMenu as ContextMenuPrimitive } from 'radix-ui';
3
+ import type { ComponentProps } from 'react';
4
+ import { menuItemVariants } from '../dropdown-menu/menu-styles';
5
+ /**
6
+ * Holds the open state of a menu of actions opened by right-clicking or long-pressing its trigger area.
7
+ */
8
+ export declare const ContextMenu: (props: ComponentProps<typeof ContextMenuPrimitive.Root>) => import("react").JSX.Element;
9
+ export declare const ContextMenuTrigger: (props: ComponentProps<typeof ContextMenuPrimitive.Trigger>) => import("react").JSX.Element;
10
+ export declare const ContextMenuGroup: (props: ComponentProps<typeof ContextMenuPrimitive.Group>) => import("react").JSX.Element;
11
+ export declare const ContextMenuRadioGroup: (props: ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) => import("react").JSX.Element;
12
+ export declare const ContextMenuSub: (props: ComponentProps<typeof ContextMenuPrimitive.Sub>) => import("react").JSX.Element;
13
+ /**
14
+ * Portals the menu panel at the pointer.
15
+ */
16
+ export declare const ContextMenuContent: ({ className, ...props }: ComponentProps<typeof ContextMenuPrimitive.Content>) => import("react").JSX.Element;
17
+ type ContextMenuItemProps = ComponentProps<typeof ContextMenuPrimitive.Item> & VariantProps<typeof menuItemVariants>;
18
+ /**
19
+ * Runs an action; the `danger` variant marks destructive ones.
20
+ */
21
+ export declare const ContextMenuItem: ({ className, inset, variant, ...props }: ContextMenuItemProps) => import("react").JSX.Element;
22
+ /**
23
+ * Toggles a setting and shows a check while it is on.
24
+ */
25
+ export declare const ContextMenuCheckboxItem: ({ children, className, ...props }: ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) => import("react").JSX.Element;
26
+ /**
27
+ * Picks one option of its radio group and marks it with a dot.
28
+ */
29
+ export declare const ContextMenuRadioItem: ({ children, className, ...props }: ComponentProps<typeof ContextMenuPrimitive.RadioItem>) => import("react").JSX.Element;
30
+ export declare const ContextMenuLabel: ({ className, inset, ...props }: ComponentProps<typeof ContextMenuPrimitive.Label> & {
31
+ inset?: boolean;
32
+ }) => import("react").JSX.Element;
33
+ export declare const ContextMenuSeparator: ({ className, ...props }: ComponentProps<typeof ContextMenuPrimitive.Separator>) => import("react").JSX.Element;
34
+ /**
35
+ * Right-aligns a keyboard shortcut hint inside an item.
36
+ */
37
+ export declare const ContextMenuShortcut: ({ className, ...props }: ComponentProps<"span">) => import("react").JSX.Element;
38
+ /**
39
+ * Opens a nested menu and points at it with a chevron.
40
+ */
41
+ export declare const ContextMenuSubTrigger: ({ children, className, inset, ...props }: ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {
42
+ inset?: boolean;
43
+ }) => import("react").JSX.Element;
44
+ export declare const ContextMenuSubContent: ({ className, ...props }: ComponentProps<typeof ContextMenuPrimitive.SubContent>) => import("react").JSX.Element;
45
+ export {};
@@ -0,0 +1,136 @@
1
+ "use client";
2
+ import { cn } from "../../lib/cn.js";
3
+ import { RefineIconCheck, RefineIconChevronRight, RefineIconCircleFilled } from "../../icons/refine-icons.js";
4
+ import { MENU_CONTENT_CLASS_NAME, MENU_INDICATOR_CLASS_NAME, MENU_INDICATOR_ITEM_CLASS_NAME, MENU_LABEL_CLASS_NAME, MENU_SEPARATOR_CLASS_NAME, MENU_SHORTCUT_CLASS_NAME, menuItemVariants } from "../dropdown-menu/menu-styles.js";
5
+ import { ContextMenu } from "radix-ui";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ // src/components/context-menu/context-menu.tsx
8
+ /**
9
+ * Holds the open state of a menu of actions opened by right-clicking or long-pressing its trigger area.
10
+ */
11
+ var ContextMenu$1 = (props) => {
12
+ return /* @__PURE__ */ jsx(ContextMenu.Root, {
13
+ "data-slot": "context-menu",
14
+ ...props
15
+ });
16
+ };
17
+ var ContextMenuTrigger = (props) => {
18
+ return /* @__PURE__ */ jsx(ContextMenu.Trigger, {
19
+ "data-slot": "context-menu-trigger",
20
+ ...props
21
+ });
22
+ };
23
+ var ContextMenuGroup = (props) => {
24
+ return /* @__PURE__ */ jsx(ContextMenu.Group, {
25
+ "data-slot": "context-menu-group",
26
+ ...props
27
+ });
28
+ };
29
+ var ContextMenuRadioGroup = (props) => {
30
+ return /* @__PURE__ */ jsx(ContextMenu.RadioGroup, {
31
+ "data-slot": "context-menu-radio-group",
32
+ ...props
33
+ });
34
+ };
35
+ var ContextMenuSub = (props) => {
36
+ return /* @__PURE__ */ jsx(ContextMenu.Sub, {
37
+ "data-slot": "context-menu-sub",
38
+ ...props
39
+ });
40
+ };
41
+ /**
42
+ * Portals the menu panel at the pointer.
43
+ */
44
+ var ContextMenuContent = ({ className, ...props }) => {
45
+ return /* @__PURE__ */ jsx(ContextMenu.Portal, { children: /* @__PURE__ */ jsx(ContextMenu.Content, {
46
+ className: cn(MENU_CONTENT_CLASS_NAME, "origin-(--radix-context-menu-content-transform-origin)", className),
47
+ "data-slot": "context-menu-content",
48
+ ...props
49
+ }) });
50
+ };
51
+ /**
52
+ * Runs an action; the `danger` variant marks destructive ones.
53
+ */
54
+ var ContextMenuItem = ({ className, inset, variant, ...props }) => {
55
+ return /* @__PURE__ */ jsx(ContextMenu.Item, {
56
+ className: cn(menuItemVariants({
57
+ inset,
58
+ variant
59
+ }), className),
60
+ "data-slot": "context-menu-item",
61
+ ...props
62
+ });
63
+ };
64
+ /**
65
+ * Toggles a setting and shows a check while it is on.
66
+ */
67
+ var ContextMenuCheckboxItem = ({ children, className, ...props }) => {
68
+ return /* @__PURE__ */ jsxs(ContextMenu.CheckboxItem, {
69
+ className: cn(MENU_INDICATOR_ITEM_CLASS_NAME, className),
70
+ "data-slot": "context-menu-checkbox-item",
71
+ ...props,
72
+ children: [/* @__PURE__ */ jsx("span", {
73
+ className: MENU_INDICATOR_CLASS_NAME,
74
+ children: /* @__PURE__ */ jsx(ContextMenu.ItemIndicator, { children: /* @__PURE__ */ jsx(RefineIconCheck, { className: "size-4 text-gem-ink" }) })
75
+ }), children]
76
+ });
77
+ };
78
+ /**
79
+ * Picks one option of its radio group and marks it with a dot.
80
+ */
81
+ var ContextMenuRadioItem = ({ children, className, ...props }) => {
82
+ return /* @__PURE__ */ jsxs(ContextMenu.RadioItem, {
83
+ className: cn(MENU_INDICATOR_ITEM_CLASS_NAME, className),
84
+ "data-slot": "context-menu-radio-item",
85
+ ...props,
86
+ children: [/* @__PURE__ */ jsx("span", {
87
+ className: MENU_INDICATOR_CLASS_NAME,
88
+ children: /* @__PURE__ */ jsx(ContextMenu.ItemIndicator, { children: /* @__PURE__ */ jsx(RefineIconCircleFilled, { className: "size-2 text-gem-ink" }) })
89
+ }), children]
90
+ });
91
+ };
92
+ var ContextMenuLabel = ({ className, inset, ...props }) => {
93
+ return /* @__PURE__ */ jsx(ContextMenu.Label, {
94
+ className: cn(MENU_LABEL_CLASS_NAME, { "pl-8": inset }, className),
95
+ "data-slot": "context-menu-label",
96
+ ...props
97
+ });
98
+ };
99
+ var ContextMenuSeparator = ({ className, ...props }) => {
100
+ return /* @__PURE__ */ jsx(ContextMenu.Separator, {
101
+ className: cn(MENU_SEPARATOR_CLASS_NAME, className),
102
+ "data-slot": "context-menu-separator",
103
+ ...props
104
+ });
105
+ };
106
+ /**
107
+ * Right-aligns a keyboard shortcut hint inside an item.
108
+ */
109
+ var ContextMenuShortcut = ({ className, ...props }) => {
110
+ return /* @__PURE__ */ jsx("span", {
111
+ className: cn(MENU_SHORTCUT_CLASS_NAME, className),
112
+ "data-slot": "context-menu-shortcut",
113
+ ...props
114
+ });
115
+ };
116
+ /**
117
+ * Opens a nested menu and points at it with a chevron.
118
+ */
119
+ var ContextMenuSubTrigger = ({ children, className, inset, ...props }) => {
120
+ return /* @__PURE__ */ jsxs(ContextMenu.SubTrigger, {
121
+ className: cn(menuItemVariants({ inset }), className),
122
+ "data-slot": "context-menu-sub-trigger",
123
+ ...props,
124
+ children: [children, /* @__PURE__ */ jsx(RefineIconChevronRight, { className: "ml-auto size-4" })]
125
+ });
126
+ };
127
+ var ContextMenuSubContent = ({ className, ...props }) => {
128
+ return /* @__PURE__ */ jsx(ContextMenu.Portal, { children: /* @__PURE__ */ jsx(ContextMenu.SubContent, {
129
+ className: cn(MENU_CONTENT_CLASS_NAME, "origin-(--radix-context-menu-content-transform-origin)", className),
130
+ "data-slot": "context-menu-sub-content",
131
+ ...props
132
+ }) });
133
+ };
134
+ export { ContextMenu$1 as ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger };
135
+
136
+ //# sourceMappingURL=context-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.js","names":["ContextMenu","ContextMenuPrimitive"],"sources":["../../../src/components/context-menu/context-menu.tsx"],"sourcesContent":["'use client';\n\nimport type { VariantProps } from 'class-variance-authority';\nimport { ContextMenu as ContextMenuPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../../lib/cn';\nimport {\n MENU_CONTENT_CLASS_NAME,\n MENU_INDICATOR_CLASS_NAME,\n MENU_INDICATOR_ITEM_CLASS_NAME,\n MENU_LABEL_CLASS_NAME,\n MENU_SEPARATOR_CLASS_NAME,\n MENU_SHORTCUT_CLASS_NAME,\n menuItemVariants,\n} from '../dropdown-menu/menu-styles';\nimport { RefineIconCheck, RefineIconChevronRight, RefineIconCircleFilled } from '../../icons/refine-icons';\n\n/**\n * Holds the open state of a menu of actions opened by right-clicking or long-pressing its trigger area.\n */\nexport const ContextMenu = (props: ComponentProps<typeof ContextMenuPrimitive.Root>) => {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />;\n};\n\nexport const ContextMenuTrigger = (props: ComponentProps<typeof ContextMenuPrimitive.Trigger>) => {\n return <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" {...props} />;\n};\n\nexport const ContextMenuGroup = (props: ComponentProps<typeof ContextMenuPrimitive.Group>) => {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />;\n};\n\nexport const ContextMenuRadioGroup = (props: ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) => {\n return <ContextMenuPrimitive.RadioGroup data-slot=\"context-menu-radio-group\" {...props} />;\n};\n\nexport const ContextMenuSub = (props: ComponentProps<typeof ContextMenuPrimitive.Sub>) => {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />;\n};\n\n/**\n * Portals the menu panel at the pointer.\n */\nexport const ContextMenuContent = ({ className, ...props }: ComponentProps<typeof ContextMenuPrimitive.Content>) => {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n className={cn(MENU_CONTENT_CLASS_NAME, 'origin-(--radix-context-menu-content-transform-origin)', className)}\n data-slot=\"context-menu-content\"\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n};\n\ntype ContextMenuItemProps = ComponentProps<typeof ContextMenuPrimitive.Item> & VariantProps<typeof menuItemVariants>;\n\n/**\n * Runs an action; the `danger` variant marks destructive ones.\n */\nexport const ContextMenuItem = ({ className, inset, variant, ...props }: ContextMenuItemProps) => {\n return (\n <ContextMenuPrimitive.Item\n className={cn(menuItemVariants({ inset, variant }), className)}\n data-slot=\"context-menu-item\"\n {...props}\n />\n );\n};\n\n/**\n * Toggles a setting and shows a check while it is on.\n */\nexport const ContextMenuCheckboxItem = ({\n children,\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) => {\n return (\n <ContextMenuPrimitive.CheckboxItem\n className={cn(MENU_INDICATOR_ITEM_CLASS_NAME, className)}\n data-slot=\"context-menu-checkbox-item\"\n {...props}\n >\n <span className={MENU_INDICATOR_CLASS_NAME}>\n <ContextMenuPrimitive.ItemIndicator>\n <RefineIconCheck className=\"size-4 text-gem-ink\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n};\n\n/**\n * Picks one option of its radio group and marks it with a dot.\n */\nexport const ContextMenuRadioItem = ({\n children,\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.RadioItem>) => {\n return (\n <ContextMenuPrimitive.RadioItem\n className={cn(MENU_INDICATOR_ITEM_CLASS_NAME, className)}\n data-slot=\"context-menu-radio-item\"\n {...props}\n >\n <span className={MENU_INDICATOR_CLASS_NAME}>\n <ContextMenuPrimitive.ItemIndicator>\n <RefineIconCircleFilled className=\"size-2 text-gem-ink\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n};\n\nexport const ContextMenuLabel = ({\n className,\n inset,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean;\n}) => {\n return (\n <ContextMenuPrimitive.Label\n className={cn(MENU_LABEL_CLASS_NAME, { 'pl-8': inset }, className)}\n data-slot=\"context-menu-label\"\n {...props}\n />\n );\n};\n\nexport const ContextMenuSeparator = ({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.Separator>) => {\n return (\n <ContextMenuPrimitive.Separator\n className={cn(MENU_SEPARATOR_CLASS_NAME, className)}\n data-slot=\"context-menu-separator\"\n {...props}\n />\n );\n};\n\n/**\n * Right-aligns a keyboard shortcut hint inside an item.\n */\nexport const ContextMenuShortcut = ({ className, ...props }: ComponentProps<'span'>) => {\n return <span className={cn(MENU_SHORTCUT_CLASS_NAME, className)} data-slot=\"context-menu-shortcut\" {...props} />;\n};\n\n/**\n * Opens a nested menu and points at it with a chevron.\n */\nexport const ContextMenuSubTrigger = ({\n children,\n className,\n inset,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) => {\n return (\n <ContextMenuPrimitive.SubTrigger\n className={cn(menuItemVariants({ inset }), className)}\n data-slot=\"context-menu-sub-trigger\"\n {...props}\n >\n {children}\n <RefineIconChevronRight className=\"ml-auto size-4\" />\n </ContextMenuPrimitive.SubTrigger>\n );\n};\n\nexport const ContextMenuSubContent = ({\n className,\n ...props\n}: ComponentProps<typeof ContextMenuPrimitive.SubContent>) => {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.SubContent\n className={cn(MENU_CONTENT_CLASS_NAME, 'origin-(--radix-context-menu-content-transform-origin)', className)}\n data-slot=\"context-menu-sub-content\"\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n};\n"],"mappings":"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"}