@craftzbay/ui 0.10.0 → 0.11.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 (187) hide show
  1. package/README.md +14 -8
  2. package/dist-lib/__tests__/helpers/color.d.ts +9 -0
  3. package/dist-lib/__tests__/helpers/theme.d.ts +18 -0
  4. package/dist-lib/components/ui/Accordion.js +18 -7
  5. package/dist-lib/components/ui/Accordion.js.map +1 -1
  6. package/dist-lib/components/ui/Alert.d.ts +16 -0
  7. package/dist-lib/components/ui/Alert.js +47 -34
  8. package/dist-lib/components/ui/Alert.js.map +1 -1
  9. package/dist-lib/components/ui/Avatar.d.ts +1 -1
  10. package/dist-lib/components/ui/Avatar.js +45 -47
  11. package/dist-lib/components/ui/Avatar.js.map +1 -1
  12. package/dist-lib/components/ui/Badge.d.ts +3 -1
  13. package/dist-lib/components/ui/Badge.js +24 -15
  14. package/dist-lib/components/ui/Badge.js.map +1 -1
  15. package/dist-lib/components/ui/Breadcrumbs.d.ts +2 -0
  16. package/dist-lib/components/ui/Breadcrumbs.js +46 -28
  17. package/dist-lib/components/ui/Breadcrumbs.js.map +1 -1
  18. package/dist-lib/components/ui/Button.d.ts +5 -3
  19. package/dist-lib/components/ui/Button.js +59 -45
  20. package/dist-lib/components/ui/Button.js.map +1 -1
  21. package/dist-lib/components/ui/Calendar.d.ts +1 -1
  22. package/dist-lib/components/ui/Calendar.js +87 -59
  23. package/dist-lib/components/ui/Calendar.js.map +1 -1
  24. package/dist-lib/components/ui/Card.d.ts +2 -0
  25. package/dist-lib/components/ui/Card.js +48 -67
  26. package/dist-lib/components/ui/Card.js.map +1 -1
  27. package/dist-lib/components/ui/Carousel.d.ts +6 -6
  28. package/dist-lib/components/ui/Carousel.js +133 -102
  29. package/dist-lib/components/ui/Carousel.js.map +1 -1
  30. package/dist-lib/components/ui/Chart.d.ts +49 -10
  31. package/dist-lib/components/ui/Chart.js +415 -181
  32. package/dist-lib/components/ui/Chart.js.map +1 -1
  33. package/dist-lib/components/ui/Checkbox.js +42 -28
  34. package/dist-lib/components/ui/Checkbox.js.map +1 -1
  35. package/dist-lib/components/ui/Combobox.d.ts +2 -0
  36. package/dist-lib/components/ui/Combobox.js +142 -111
  37. package/dist-lib/components/ui/Combobox.js.map +1 -1
  38. package/dist-lib/components/ui/CommandPalette.d.ts +6 -3
  39. package/dist-lib/components/ui/CommandPalette.js +92 -87
  40. package/dist-lib/components/ui/CommandPalette.js.map +1 -1
  41. package/dist-lib/components/ui/ContextMenu.d.ts +7 -2
  42. package/dist-lib/components/ui/ContextMenu.js +77 -62
  43. package/dist-lib/components/ui/ContextMenu.js.map +1 -1
  44. package/dist-lib/components/ui/DataGrid.d.ts +17 -4
  45. package/dist-lib/components/ui/DataGrid.js +65 -50
  46. package/dist-lib/components/ui/DataGrid.js.map +1 -1
  47. package/dist-lib/components/ui/DatePicker.js +118 -99
  48. package/dist-lib/components/ui/DatePicker.js.map +1 -1
  49. package/dist-lib/components/ui/DesignSystemProvider.d.ts +94 -40
  50. package/dist-lib/components/ui/DesignSystemProvider.js +111 -55
  51. package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -1
  52. package/dist-lib/components/ui/Dialog.d.ts +18 -3
  53. package/dist-lib/components/ui/Dialog.js +105 -80
  54. package/dist-lib/components/ui/Dialog.js.map +1 -1
  55. package/dist-lib/components/ui/Drawer.d.ts +17 -2
  56. package/dist-lib/components/ui/Drawer.js +89 -55
  57. package/dist-lib/components/ui/Drawer.js.map +1 -1
  58. package/dist-lib/components/ui/DropdownMenu.js +14 -9
  59. package/dist-lib/components/ui/DropdownMenu.js.map +1 -1
  60. package/dist-lib/components/ui/EmptyState.d.ts +2 -0
  61. package/dist-lib/components/ui/EmptyState.js +30 -16
  62. package/dist-lib/components/ui/EmptyState.js.map +1 -1
  63. package/dist-lib/components/ui/ErrorState.d.ts +13 -2
  64. package/dist-lib/components/ui/ErrorState.js +44 -23
  65. package/dist-lib/components/ui/ErrorState.js.map +1 -1
  66. package/dist-lib/components/ui/FileUpload.js +59 -56
  67. package/dist-lib/components/ui/FileUpload.js.map +1 -1
  68. package/dist-lib/components/ui/Form.d.ts +15 -2
  69. package/dist-lib/components/ui/Form.js +97 -71
  70. package/dist-lib/components/ui/Form.js.map +1 -1
  71. package/dist-lib/components/ui/Icon.d.ts +1 -1
  72. package/dist-lib/components/ui/Icon.js +20 -14
  73. package/dist-lib/components/ui/Icon.js.map +1 -1
  74. package/dist-lib/components/ui/IconButton.d.ts +2 -2
  75. package/dist-lib/components/ui/IconButton.js +28 -20
  76. package/dist-lib/components/ui/IconButton.js.map +1 -1
  77. package/dist-lib/components/ui/Input.d.ts +3 -1
  78. package/dist-lib/components/ui/Input.js +92 -78
  79. package/dist-lib/components/ui/Input.js.map +1 -1
  80. package/dist-lib/components/ui/Kbd.js +1 -1
  81. package/dist-lib/components/ui/Kbd.js.map +1 -1
  82. package/dist-lib/components/ui/MultiSelect.js +121 -107
  83. package/dist-lib/components/ui/MultiSelect.js.map +1 -1
  84. package/dist-lib/components/ui/Pagination.js +67 -62
  85. package/dist-lib/components/ui/Pagination.js.map +1 -1
  86. package/dist-lib/components/ui/Popover.js +14 -14
  87. package/dist-lib/components/ui/Popover.js.map +1 -1
  88. package/dist-lib/components/ui/Progress.d.ts +3 -3
  89. package/dist-lib/components/ui/Progress.js +77 -72
  90. package/dist-lib/components/ui/Progress.js.map +1 -1
  91. package/dist-lib/components/ui/RadioGroup.d.ts +1 -1
  92. package/dist-lib/components/ui/RadioGroup.js +69 -52
  93. package/dist-lib/components/ui/RadioGroup.js.map +1 -1
  94. package/dist-lib/components/ui/RelativeTime.d.ts +19 -0
  95. package/dist-lib/components/ui/RelativeTime.js +31 -0
  96. package/dist-lib/components/ui/RelativeTime.js.map +1 -0
  97. package/dist-lib/components/ui/ScrollArea.d.ts +9 -1
  98. package/dist-lib/components/ui/ScrollArea.js +43 -27
  99. package/dist-lib/components/ui/ScrollArea.js.map +1 -1
  100. package/dist-lib/components/ui/Select.d.ts +6 -1
  101. package/dist-lib/components/ui/Select.js +79 -71
  102. package/dist-lib/components/ui/Select.js.map +1 -1
  103. package/dist-lib/components/ui/Separator.js +1 -1
  104. package/dist-lib/components/ui/Separator.js.map +1 -1
  105. package/dist-lib/components/ui/Sheet.d.ts +9 -0
  106. package/dist-lib/components/ui/Sheet.js +69 -46
  107. package/dist-lib/components/ui/Sheet.js.map +1 -1
  108. package/dist-lib/components/ui/Sidebar.d.ts +12 -9
  109. package/dist-lib/components/ui/Sidebar.js +152 -109
  110. package/dist-lib/components/ui/Sidebar.js.map +1 -1
  111. package/dist-lib/components/ui/Skeleton.d.ts +13 -2
  112. package/dist-lib/components/ui/Skeleton.js +15 -14
  113. package/dist-lib/components/ui/Skeleton.js.map +1 -1
  114. package/dist-lib/components/ui/Slider.js +41 -29
  115. package/dist-lib/components/ui/Slider.js.map +1 -1
  116. package/dist-lib/components/ui/Snackbar.js +23 -22
  117. package/dist-lib/components/ui/Snackbar.js.map +1 -1
  118. package/dist-lib/components/ui/Spinner.js +18 -6
  119. package/dist-lib/components/ui/Spinner.js.map +1 -1
  120. package/dist-lib/components/ui/Stepper.d.ts +6 -0
  121. package/dist-lib/components/ui/Stepper.js +71 -48
  122. package/dist-lib/components/ui/Stepper.js.map +1 -1
  123. package/dist-lib/components/ui/Switch.js +46 -43
  124. package/dist-lib/components/ui/Switch.js.map +1 -1
  125. package/dist-lib/components/ui/Table.d.ts +33 -5
  126. package/dist-lib/components/ui/Table.js +141 -119
  127. package/dist-lib/components/ui/Table.js.map +1 -1
  128. package/dist-lib/components/ui/Tabs.js +50 -48
  129. package/dist-lib/components/ui/Tabs.js.map +1 -1
  130. package/dist-lib/components/ui/TagInput.js +45 -45
  131. package/dist-lib/components/ui/TagInput.js.map +1 -1
  132. package/dist-lib/components/ui/Textarea.js +65 -54
  133. package/dist-lib/components/ui/Textarea.js.map +1 -1
  134. package/dist-lib/components/ui/Timeline.js +39 -35
  135. package/dist-lib/components/ui/Timeline.js.map +1 -1
  136. package/dist-lib/components/ui/Toast.js +44 -57
  137. package/dist-lib/components/ui/Toast.js.map +1 -1
  138. package/dist-lib/components/ui/Tooltip.d.ts +4 -1
  139. package/dist-lib/components/ui/Tooltip.js +24 -22
  140. package/dist-lib/components/ui/Tooltip.js.map +1 -1
  141. package/dist-lib/components/ui/TopNav.d.ts +7 -3
  142. package/dist-lib/components/ui/TopNav.js +35 -25
  143. package/dist-lib/components/ui/TopNav.js.map +1 -1
  144. package/dist-lib/components/ui/Tree.d.ts +15 -10
  145. package/dist-lib/components/ui/Tree.js +82 -79
  146. package/dist-lib/components/ui/Tree.js.map +1 -1
  147. package/dist-lib/hooks/use-debounce.d.ts +19 -0
  148. package/dist-lib/hooks/use-debounce.js +36 -0
  149. package/dist-lib/hooks/use-debounce.js.map +1 -0
  150. package/dist-lib/hooks/use-delayed-loading.d.ts +21 -0
  151. package/dist-lib/hooks/use-delayed-loading.js +20 -0
  152. package/dist-lib/hooks/use-delayed-loading.js.map +1 -0
  153. package/dist-lib/hooks/use-field-ids.d.ts +2 -1
  154. package/dist-lib/hooks/use-field-ids.js +9 -9
  155. package/dist-lib/hooks/use-field-ids.js.map +1 -1
  156. package/dist-lib/hooks/use-media-query.d.ts +3 -1
  157. package/dist-lib/hooks/use-media-query.js +16 -12
  158. package/dist-lib/hooks/use-media-query.js.map +1 -1
  159. package/dist-lib/hooks/use-modifier-key.d.ts +13 -0
  160. package/dist-lib/hooks/use-modifier-key.js +19 -0
  161. package/dist-lib/hooks/use-modifier-key.js.map +1 -0
  162. package/dist-lib/hooks/use-toast.d.ts +7 -2
  163. package/dist-lib/hooks/use-toast.js +61 -30
  164. package/dist-lib/hooks/use-toast.js.map +1 -1
  165. package/dist-lib/icons/index.d.ts +9 -0
  166. package/dist-lib/icons/index.js +148 -130
  167. package/dist-lib/icons/index.js.map +1 -1
  168. package/dist-lib/illustrations/index.d.ts +1 -0
  169. package/dist-lib/illustrations/index.js +15 -6
  170. package/dist-lib/illustrations/index.js.map +1 -1
  171. package/dist-lib/index.d.ts +6 -0
  172. package/dist-lib/index.js +280 -260
  173. package/dist-lib/index.js.map +1 -1
  174. package/dist-lib/lib/format.d.ts +65 -0
  175. package/dist-lib/lib/format.js +95 -0
  176. package/dist-lib/lib/format.js.map +1 -0
  177. package/dist-lib/lib/return-focus.d.ts +11 -0
  178. package/dist-lib/lib/return-focus.js +12 -0
  179. package/dist-lib/lib/return-focus.js.map +1 -0
  180. package/dist-lib/lib/strings.d.ts +62 -1
  181. package/dist-lib/lib/strings.js +75 -19
  182. package/dist-lib/lib/strings.js.map +1 -1
  183. package/dist-lib/lib/strings.mn.js +50 -5
  184. package/dist-lib/lib/strings.mn.js.map +1 -1
  185. package/dist-lib/styles.css +1 -1
  186. package/dist-lib/theme.css +141 -78
  187. package/package.json +10 -3
@@ -1,164 +1,195 @@
1
1
  "use client";
2
- import { jsxs as r, jsx as e } from "react/jsx-runtime";
3
- import { forwardRef as O, useState as i, useMemo as R, useEffect as ee, useCallback as te } from "react";
2
+ import { jsxs as o, jsx as r } from "react/jsx-runtime";
3
+ import { forwardRef as de, useState as s, useCallback as D, useMemo as M, useRef as ie, useEffect as Q } from "react";
4
4
  import * as p from "@radix-ui/react-popover";
5
- import { Command as d } from "cmdk";
6
- import { X as re, ChevronsUpDown as oe, Loader2 as ae, Check as se } from "../../icons/index.js";
7
- import { cn as c } from "../../lib/utils.js";
8
- import { useStrings as le } from "../../hooks/use-strings.js";
9
- import { useFieldIds as ne } from "../../hooks/use-field-ids.js";
10
- import { IconButton as ie } from "./IconButton.js";
11
- const de = O(function({
12
- value: o,
13
- onChange: x,
14
- options: C,
15
- loadOptions: a,
16
- selectedLabel: g,
17
- label: I,
18
- helperText: h,
19
- error: v,
20
- placeholder: H,
21
- searchPlaceholder: L,
22
- emptyText: q,
23
- clearable: P = !0,
24
- disabled: z,
25
- size: u = "md",
26
- id: D,
27
- className: M
28
- }, Q) {
29
- const m = le(), T = H ?? m.combobox.placeholder, U = L ?? m.combobox.searchPlaceholder, V = q ?? m.combobox.empty, N = !!v, { fieldId: y, helperId: X, errorId: $, describedBy: A } = ne(D, {
30
- hasHelper: !!h,
31
- hasError: N
32
- }), k = `${y}-list`, [f, S] = i(!1), [w, G] = i(""), [B, J] = i([]), [E, j] = i(!1), [l, F] = i(null), b = R(() => a ? B : C ?? [], [a, B, C]);
33
- ee(() => {
34
- if (!a || !f) return;
5
+ import { Command as f } from "cmdk";
6
+ import { X as ce, ChevronsUpDown as ue, Loader2 as me, Check as fe } from "../../icons/index.js";
7
+ import { cn as b } from "../../lib/utils.js";
8
+ import { useStrings as be } from "../../hooks/use-strings.js";
9
+ import { useFieldIds as xe } from "../../hooks/use-field-ids.js";
10
+ import { IconButton as pe } from "./IconButton.js";
11
+ const ge = de(function({
12
+ value: a,
13
+ onChange: g,
14
+ options: k,
15
+ loadOptions: l,
16
+ selectedLabel: h,
17
+ label: n,
18
+ helperText: v,
19
+ error: y,
20
+ placeholder: U,
21
+ searchPlaceholder: V,
22
+ emptyText: X,
23
+ loadErrorText: A,
24
+ clearable: z = !0,
25
+ disabled: L,
26
+ size: x = "md",
27
+ id: R,
28
+ className: G
29
+ }, J) {
30
+ const d = be(), N = U ?? d.combobox.placeholder, K = V ?? d.combobox.searchPlaceholder, W = X ?? d.combobox.empty, Y = A ?? d.combobox.loadError, w = !!y, { fieldId: c, helperId: Z, errorId: _, describedBy: O } = xe(R, {
31
+ hasHelper: !!v,
32
+ hasError: w
33
+ }), [ee, re] = s(void 0), te = D((e) => re(e == null ? void 0 : e.id), []), [u, B] = s(!1), [C, oe] = s(""), [S, j] = s([]), [I, F] = s(!1), [T, $] = s(!1), [m, H] = s(null), E = M(
34
+ () => l ? S : k ?? [],
35
+ [l, S, k]
36
+ ), q = ie(l);
37
+ Q(() => {
38
+ q.current = l;
39
+ }), Q(() => {
40
+ const e = q.current;
41
+ if (!e || !u) return;
35
42
  let t = !1;
36
- return j(!0), a(w).then((n) => {
37
- t || J(n);
43
+ return F(!0), $(!1), e(C).then((P) => {
44
+ t || j(P);
45
+ }).catch(() => {
46
+ t || (j([]), $(!0));
38
47
  }).finally(() => {
39
- t || j(!1);
48
+ t || F(!1);
40
49
  }), () => {
41
50
  t = !0;
42
51
  };
43
- }, [w, f, a]);
44
- const s = R(() => {
45
- if (o == null) return null;
46
- const t = b.find((n) => n.value === o);
47
- return t || ((l == null ? void 0 : l.value) === o ? l : g !== void 0 ? { value: o, label: g } : null);
48
- }, [b, o, l, g]), K = u === "sm" ? "h-8" : u === "lg" ? "h-10" : "h-9", W = u === "sm" ? "px-2.5" : u === "lg" ? "px-3.5" : "px-3", Y = P ? "pr-14" : "pr-9", Z = te(() => {
49
- F(null), x(null);
50
- }, [x]);
51
- return /* @__PURE__ */ r("div", { ref: Q, className: c("flex flex-col gap-1.5", M), children: [
52
- I && /* @__PURE__ */ e("label", { htmlFor: y, className: "text-foreground text-sm font-medium", children: I }),
53
- /* @__PURE__ */ r(p.Root, { open: f, onOpenChange: S, children: [
54
- /* @__PURE__ */ r("div", { className: "relative w-full", children: [
55
- /* @__PURE__ */ e(p.Trigger, { asChild: !0, children: /* @__PURE__ */ e(
52
+ }, [C, u, !!l]);
53
+ const i = M(() => {
54
+ if (a == null) return null;
55
+ const e = E.find((t) => t.value === a);
56
+ return e || ((m == null ? void 0 : m.value) === a ? m : h !== void 0 ? { value: a, label: h } : null);
57
+ }, [E, a, m, h]), ae = x === "sm" ? "h-8" : x === "lg" ? "h-10" : "h-9", se = x === "sm" ? "px-2.5" : x === "lg" ? "px-3.5" : "px-3", le = z ? "pr-14" : "pr-9", ne = D(() => {
58
+ H(null), g(null);
59
+ }, [g]);
60
+ return /* @__PURE__ */ o("div", { ref: J, className: b("flex flex-col gap-1.5", G), children: [
61
+ n && /* @__PURE__ */ r(
62
+ "label",
63
+ {
64
+ id: `${c}-label`,
65
+ htmlFor: c,
66
+ className: "text-foreground text-sm font-medium",
67
+ children: n
68
+ }
69
+ ),
70
+ /* @__PURE__ */ o(p.Root, { open: u, onOpenChange: B, children: [
71
+ /* @__PURE__ */ o("div", { className: "relative w-full", children: [
72
+ /* @__PURE__ */ r(p.Trigger, { asChild: !0, children: /* @__PURE__ */ r(
56
73
  "button",
57
74
  {
58
- id: y,
75
+ id: c,
59
76
  type: "button",
60
77
  role: "combobox",
61
- "aria-expanded": f,
78
+ "aria-expanded": u,
62
79
  "aria-haspopup": "listbox",
63
- "aria-controls": k,
64
- "aria-invalid": N || void 0,
65
- "aria-describedby": A,
66
- disabled: z,
67
- className: c(
80
+ "aria-controls": u ? ee : void 0,
81
+ "aria-labelledby": n ? `${c}-label` : void 0,
82
+ "aria-label": n || R ? void 0 : N,
83
+ "aria-invalid": w || void 0,
84
+ "aria-describedby": O,
85
+ disabled: L,
86
+ className: b(
68
87
  "bg-card text-foreground inline-flex w-full items-center justify-between gap-2 rounded-md border text-sm",
69
88
  "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
70
89
  "focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
71
90
  "disabled:cursor-not-allowed disabled:opacity-50",
72
- K,
73
- W,
74
- Y,
75
- N ? "border-danger focus-visible:border-danger focus-visible:ring-danger" : "border-border focus-visible:border-accent focus-visible:ring-ring"
91
+ ae,
92
+ se,
93
+ le,
94
+ w ? "border-danger focus-visible:border-danger focus-visible:ring-danger" : "border-border-input focus-visible:border-accent focus-visible:ring-ring"
76
95
  ),
77
- children: /* @__PURE__ */ e(
96
+ children: /* @__PURE__ */ r(
78
97
  "span",
79
98
  {
80
- className: c("truncate", !s && "text-foreground-subtle"),
81
- title: s ? s.label : void 0,
82
- children: s ? s.label : T
99
+ className: b("truncate", !i && "text-foreground-subtle"),
100
+ title: i ? i.label : void 0,
101
+ children: i ? i.label : N
83
102
  }
84
103
  )
85
104
  }
86
105
  ) }),
87
- /* @__PURE__ */ r("span", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center gap-0.5 pr-2", children: [
88
- P && s && !z && /* @__PURE__ */ e(
89
- ie,
106
+ /* @__PURE__ */ o("span", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center gap-0.5 pr-2", children: [
107
+ z && i && !L && /* @__PURE__ */ r(
108
+ pe,
90
109
  {
91
110
  size: "sm",
92
111
  variant: "ghost",
93
- "aria-label": m.combobox.clear,
94
- icon: /* @__PURE__ */ e(re, {}),
95
- onClick: Z,
112
+ "aria-label": d.combobox.clear,
113
+ icon: /* @__PURE__ */ r(ce, {}),
114
+ onClick: ne,
96
115
  className: "text-foreground-subtle hover:text-foreground pointer-events-auto size-6"
97
116
  }
98
117
  ),
99
- /* @__PURE__ */ e(oe, { className: "text-foreground-subtle size-4", "aria-hidden": !0 })
118
+ /* @__PURE__ */ r(ue, { className: "text-foreground-subtle size-4", "aria-hidden": !0 })
100
119
  ] })
101
120
  ] }),
102
- /* @__PURE__ */ e(p.Portal, { children: /* @__PURE__ */ e(
121
+ /* @__PURE__ */ r(p.Portal, { children: /* @__PURE__ */ r(
103
122
  p.Content,
104
123
  {
124
+ "aria-labelledby": n ? `${c}-label` : void 0,
125
+ "aria-label": n ? void 0 : N,
105
126
  align: "start",
106
127
  sideOffset: 4,
107
- className: c(
128
+ className: b(
108
129
  "border-border bg-popover text-popover-foreground z-[var(--z-popover)] w-[var(--radix-popover-trigger-width)] overflow-hidden rounded-lg border shadow-md",
109
130
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
110
131
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
111
132
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95"
112
133
  ),
113
- children: /* @__PURE__ */ r(d, { shouldFilter: !a, className: "flex h-full w-full flex-col", children: [
114
- /* @__PURE__ */ r("div", { className: "border-border flex items-center border-b px-3", children: [
115
- /* @__PURE__ */ e(
116
- d.Input,
134
+ children: /* @__PURE__ */ o(f, { shouldFilter: !l, className: "flex h-full w-full flex-col", children: [
135
+ /* @__PURE__ */ o("div", { className: "border-border flex items-center border-b px-3", children: [
136
+ /* @__PURE__ */ r(
137
+ f.Input,
117
138
  {
118
- value: w,
119
- onValueChange: G,
120
- placeholder: U,
121
- className: "placeholder:text-foreground-subtle flex h-9 w-full bg-transparent py-2 text-sm outline-none"
139
+ value: C,
140
+ onValueChange: oe,
141
+ placeholder: K,
142
+ className: "placeholder:text-foreground-subtle flex h-9 w-full bg-transparent py-2 text-lg outline-none md:text-sm"
122
143
  }
123
144
  ),
124
- E && /* @__PURE__ */ e(ae, { className: "text-foreground-subtle size-4 animate-spin", "aria-hidden": !0 })
145
+ I && /* @__PURE__ */ r(me, { className: "text-foreground-subtle size-4 animate-spin", "aria-hidden": !0 })
125
146
  ] }),
126
- /* @__PURE__ */ r(d.List, { id: k, className: "max-h-64 overflow-y-auto p-1", children: [
127
- b.map((t) => {
128
- const n = t.value === o;
129
- return /* @__PURE__ */ r(
130
- d.Item,
131
- {
132
- value: t.value,
133
- disabled: t.disabled,
134
- onSelect: (_) => {
135
- F(t), x(_), S(!1);
136
- },
137
- className: c(
138
- "text-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm",
139
- "data-[selected=true]:bg-background-muted",
140
- "data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50"
141
- ),
142
- children: [
143
- /* @__PURE__ */ e("span", { className: "flex-1", children: t.label }),
144
- t.description && /* @__PURE__ */ e("span", { className: "text-foreground-subtle text-xs", children: t.description }),
145
- n && /* @__PURE__ */ e(se, { className: "text-accent size-4", "aria-hidden": !0 })
146
- ]
147
- },
148
- t.value
149
- );
150
- }),
151
- !E && b.length === 0 && /* @__PURE__ */ e(d.Empty, { className: "text-foreground-subtle px-2 py-6 text-center text-sm", children: V })
152
- ] })
147
+ /* @__PURE__ */ o(
148
+ f.List,
149
+ {
150
+ ref: te,
151
+ label: d.command.suggestions,
152
+ className: "max-h-64 overflow-y-auto p-1",
153
+ children: [
154
+ E.map((e) => {
155
+ const t = e.value === a;
156
+ return /* @__PURE__ */ o(
157
+ f.Item,
158
+ {
159
+ value: e.value,
160
+ keywords: e.description ? [e.label, e.description] : [e.label],
161
+ disabled: e.disabled,
162
+ onSelect: (P) => {
163
+ H(e), g(P), B(!1);
164
+ },
165
+ className: b(
166
+ "text-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm",
167
+ "data-[selected=true]:bg-background-muted",
168
+ "data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50"
169
+ ),
170
+ children: [
171
+ /* @__PURE__ */ r("span", { className: "flex-1", children: e.label }),
172
+ e.description && /* @__PURE__ */ r("span", { className: "text-foreground-subtle text-xs", children: e.description }),
173
+ t && /* @__PURE__ */ r(fe, { className: "text-accent size-4", "aria-hidden": !0 })
174
+ ]
175
+ },
176
+ e.value
177
+ );
178
+ }),
179
+ T && !I && /* @__PURE__ */ r("div", { className: "text-danger-text px-2 py-6 text-center text-sm", children: Y }),
180
+ !I && !T && /* @__PURE__ */ r(f.Empty, { className: "text-foreground-subtle px-2 py-6 text-center text-sm", children: W })
181
+ ]
182
+ }
183
+ )
153
184
  ] })
154
185
  }
155
186
  ) })
156
187
  ] }),
157
- v ? /* @__PURE__ */ e("p", { id: $, role: "alert", className: "text-danger-text text-xs", children: v }) : h ? /* @__PURE__ */ e("p", { id: X, className: "text-foreground-subtle text-xs", children: h }) : null
188
+ y ? /* @__PURE__ */ r("p", { id: _, className: "text-danger-text text-xs", children: y }) : v ? /* @__PURE__ */ r("p", { id: Z, className: "text-foreground-subtle text-xs", children: v }) : null
158
189
  ] });
159
190
  });
160
- de.displayName = "Combobox";
191
+ ge.displayName = "Combobox";
161
192
  export {
162
- de as Combobox
193
+ ge as Combobox
163
194
  };
164
195
  //# sourceMappingURL=Combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","sources":["../../../src/components/ui/Combobox.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, useCallback, useEffect, useMemo, useState, type ReactNode } from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { Check, ChevronsUpDown, Loader2, X } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport { useFieldIds } from '@/hooks/use-field-ids';\nimport { IconButton } from './IconButton';\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n /** Currently selected value (controlled). */\n value: string | null;\n /** Called when a value is picked or cleared. */\n onChange: (value: string | null) => void;\n /** Static options. Ignored if `loadOptions` is provided. */\n options?: ComboboxOption[];\n /**\n * Async loader called with the current query each time it changes.\n * Use for server-side search.\n */\n loadOptions?: (query: string) => Promise<ComboboxOption[]>;\n /**\n * Label to show for a preset `value` in `loadOptions` mode before the\n * first search has resolved (the component has no option list yet).\n */\n selectedLabel?: string;\n /** Visible label above the field. */\n label?: ReactNode;\n /** Hint below the field. Hidden when `error` is set. */\n helperText?: ReactNode;\n /** Validation error. */\n error?: ReactNode;\n /** Placeholder shown when no value is selected. */\n placeholder?: string;\n /** Search placeholder inside the popover. */\n searchPlaceholder?: string;\n /** Empty state copy when nothing matches. */\n emptyText?: string;\n /** Allow clearing the selection with an inline ×. */\n clearable?: boolean;\n /** Disable the entire field. */\n disabled?: boolean;\n /** Field size, matches Input. */\n size?: 'sm' | 'md' | 'lg';\n /** Consumer-supplied id for the trigger (label association). */\n id?: string;\n className?: string;\n}\n\n/**\n * Single-select with typeahead. Use `options` for client-side filtering or\n * `loadOptions` for server-side search.\n *\n * @example Client-side\n * <Combobox label=\"Country\" options={countries} value={c} onChange={setC} />\n *\n * @example Server-side\n * <Combobox label=\"Assignee\"\n * value={user}\n * onChange={setUser}\n * loadOptions={async (q) => api.searchUsers(q)} />\n *\n * @do Use Combobox over Select for >12 options or when the user is expected\n * to know what they want.\n * @dont Re-query on every keystroke without debouncing — pass a debounced\n * `loadOptions` to avoid hammering the server.\n */\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(function Combobox(\n {\n value,\n onChange,\n options,\n loadOptions,\n selectedLabel,\n label,\n helperText,\n error,\n placeholder: placeholderProp,\n searchPlaceholder: searchPlaceholderProp,\n emptyText: emptyTextProp,\n clearable = true,\n disabled,\n size = 'md',\n id,\n className,\n },\n ref,\n) {\n const strings = useStrings();\n const placeholder = placeholderProp ?? strings.combobox.placeholder;\n const searchPlaceholder = searchPlaceholderProp ?? strings.combobox.searchPlaceholder;\n const emptyText = emptyTextProp ?? strings.combobox.empty;\n const isError = Boolean(error);\n const { fieldId, helperId, errorId, describedBy } = useFieldIds(id, {\n hasHelper: Boolean(helperText),\n hasError: isError,\n });\n const listId = `${fieldId}-list`;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [loaded, setLoaded] = useState<ComboboxOption[]>([]);\n const [loading, setLoading] = useState(false);\n // In async mode the option list only exists after the first search, so the\n // chosen option is remembered here to keep its label on the trigger.\n const [selectedOption, setSelectedOption] = useState<ComboboxOption | null>(null);\n\n // Resolve options: static or async-loaded.\n const items = useMemo(() => (loadOptions ? loaded : (options ?? [])), [loadOptions, loaded, options]);\n\n useEffect(() => {\n if (!loadOptions || !open) return;\n let cancelled = false;\n setLoading(true);\n loadOptions(query)\n .then((res) => {\n if (!cancelled) setLoaded(res);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [query, open, loadOptions]);\n\n const selected = useMemo<ComboboxOption | null>(() => {\n if (value === null || value === undefined) return null;\n const fromItems = items.find((o) => o.value === value);\n if (fromItems) return fromItems;\n if (selectedOption?.value === value) return selectedOption;\n if (selectedLabel !== undefined) return { value, label: selectedLabel };\n return null;\n }, [items, value, selectedOption, selectedLabel]);\n\n const triggerHeight = size === 'sm' ? 'h-8' : size === 'lg' ? 'h-10' : 'h-9';\n const triggerPadding = size === 'sm' ? 'px-2.5' : size === 'lg' ? 'px-3.5' : 'px-3';\n // Leave room on the right for the clear button + chevron.\n const triggerPaddingRight = clearable ? 'pr-14' : 'pr-9';\n\n const handleClear = useCallback(() => {\n setSelectedOption(null);\n onChange(null);\n }, [onChange]);\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1.5', className)}>\n {label && (\n <label htmlFor={fieldId} className=\"text-foreground text-sm font-medium\">\n {label}\n </label>\n )}\n\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <div className=\"relative w-full\">\n <PopoverPrimitive.Trigger asChild>\n <button\n id={fieldId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-invalid={isError || undefined}\n aria-describedby={describedBy}\n disabled={disabled}\n className={cn(\n 'bg-card text-foreground inline-flex w-full items-center justify-between gap-2 rounded-md border text-sm',\n 'transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n triggerHeight,\n triggerPadding,\n triggerPaddingRight,\n isError\n ? 'border-danger focus-visible:border-danger focus-visible:ring-danger'\n : 'border-border focus-visible:border-accent focus-visible:ring-ring',\n )}\n >\n <span\n className={cn('truncate', !selected && 'text-foreground-subtle')}\n title={selected ? selected.label : undefined}\n >\n {selected ? selected.label : placeholder}\n </span>\n </button>\n </PopoverPrimitive.Trigger>\n\n {/* Controls sit outside the trigger: a button inside a button is invalid HTML. */}\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center gap-0.5 pr-2\">\n {clearable && selected && !disabled && (\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n aria-label={strings.combobox.clear}\n icon={<X />}\n onClick={handleClear}\n className=\"text-foreground-subtle hover:text-foreground pointer-events-auto size-6\"\n />\n )}\n <ChevronsUpDown className=\"text-foreground-subtle size-4\" aria-hidden />\n </span>\n </div>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className={cn(\n 'border-border bg-popover text-popover-foreground z-[var(--z-popover)] w-[var(--radix-popover-trigger-width)] overflow-hidden rounded-lg border 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 )}\n >\n <CommandPrimitive shouldFilter={!loadOptions} className=\"flex h-full w-full flex-col\">\n <div className=\"border-border flex items-center border-b px-3\">\n <CommandPrimitive.Input\n value={query}\n onValueChange={setQuery}\n placeholder={searchPlaceholder}\n className=\"placeholder:text-foreground-subtle flex h-9 w-full bg-transparent py-2 text-sm outline-none\"\n />\n {loading && (\n <Loader2 className=\"text-foreground-subtle size-4 animate-spin\" aria-hidden />\n )}\n </div>\n <CommandPrimitive.List id={listId} className=\"max-h-64 overflow-y-auto p-1\">\n {items.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <CommandPrimitive.Item\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled}\n onSelect={(v) => {\n setSelectedOption(opt);\n onChange(v);\n setOpen(false);\n }}\n className={cn(\n 'text-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm',\n 'data-[selected=true]:bg-background-muted',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50',\n )}\n >\n <span className=\"flex-1\">{opt.label}</span>\n {opt.description && (\n <span className=\"text-foreground-subtle text-xs\">{opt.description}</span>\n )}\n {isSelected && <Check className=\"text-accent size-4\" aria-hidden />}\n </CommandPrimitive.Item>\n );\n })}\n {!loading && items.length === 0 && (\n <CommandPrimitive.Empty className=\"text-foreground-subtle px-2 py-6 text-center text-sm\">\n {emptyText}\n </CommandPrimitive.Empty>\n )}\n </CommandPrimitive.List>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n\n {error ? (\n <p id={errorId} role=\"alert\" className=\"text-danger-text text-xs\">\n {error}\n </p>\n ) : helperText ? (\n <p id={helperId} className=\"text-foreground-subtle text-xs\">\n {helperText}\n </p>\n ) : null}\n </div>\n );\n});\n\nCombobox.displayName = 'Combobox';\n"],"names":["Combobox","forwardRef","value","onChange","options","loadOptions","selectedLabel","label","helperText","error","placeholderProp","searchPlaceholderProp","emptyTextProp","clearable","disabled","size","id","className","ref","strings","useStrings","placeholder","searchPlaceholder","emptyText","isError","fieldId","helperId","errorId","describedBy","useFieldIds","listId","open","setOpen","useState","query","setQuery","loaded","setLoaded","loading","setLoading","selectedOption","setSelectedOption","items","useMemo","useEffect","cancelled","res","selected","fromItems","o","triggerHeight","triggerPadding","triggerPaddingRight","handleClear","useCallback","cn","PopoverPrimitive","jsxs","jsx","IconButton","X","ChevronsUpDown","CommandPrimitive","Loader2","opt","isSelected","v","Check"],"mappings":"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"}
1
+ {"version":3,"file":"Combobox.js","sources":["../../../src/components/ui/Combobox.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { Check, ChevronsUpDown, Loader2, X } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport { useFieldIds } from '@/hooks/use-field-ids';\nimport { IconButton } from './IconButton';\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n /** Currently selected value (controlled). */\n value: string | null;\n /** Called when a value is picked or cleared. */\n onChange: (value: string | null) => void;\n /** Static options. Ignored if `loadOptions` is provided. */\n options?: ComboboxOption[];\n /**\n * Async loader called with the current query each time it changes.\n * Use for server-side search.\n */\n loadOptions?: (query: string) => Promise<ComboboxOption[]>;\n /**\n * Label to show for a preset `value` in `loadOptions` mode before the\n * first search has resolved (the component has no option list yet).\n */\n selectedLabel?: string;\n /** Visible label above the field. */\n label?: ReactNode;\n /** Hint below the field. Hidden when `error` is set. */\n helperText?: ReactNode;\n /** Validation error. */\n error?: ReactNode;\n /** Placeholder shown when no value is selected. */\n placeholder?: string;\n /** Search placeholder inside the popover. */\n searchPlaceholder?: string;\n /** Empty state copy when nothing matches. */\n emptyText?: string;\n /** Message shown when `loadOptions` rejects. */\n loadErrorText?: string;\n /** Allow clearing the selection with an inline ×. */\n clearable?: boolean;\n /** Disable the entire field. */\n disabled?: boolean;\n /** Field size, matches Input. */\n size?: 'sm' | 'md' | 'lg';\n /** Consumer-supplied id for the trigger (label association). */\n id?: string;\n className?: string;\n}\n\n/**\n * Single-select with typeahead. Use `options` for client-side filtering or\n * `loadOptions` for server-side search.\n *\n * @example Client-side\n * <Combobox label=\"Country\" options={countries} value={c} onChange={setC} />\n *\n * @example Server-side\n * <Combobox label=\"Assignee\"\n * value={user}\n * onChange={setUser}\n * loadOptions={async (q) => api.searchUsers(q)} />\n *\n * @do Use Combobox over Select for >12 options or when the user is expected\n * to know what they want.\n * @dont Re-query on every keystroke without debouncing — pass a debounced\n * `loadOptions` to avoid hammering the server.\n */\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(function Combobox(\n {\n value,\n onChange,\n options,\n loadOptions,\n selectedLabel,\n label,\n helperText,\n error,\n placeholder: placeholderProp,\n searchPlaceholder: searchPlaceholderProp,\n emptyText: emptyTextProp,\n loadErrorText: loadErrorTextProp,\n clearable = true,\n disabled,\n size = 'md',\n id,\n className,\n },\n ref,\n) {\n const strings = useStrings();\n const placeholder = placeholderProp ?? strings.combobox.placeholder;\n const searchPlaceholder = searchPlaceholderProp ?? strings.combobox.searchPlaceholder;\n const emptyText = emptyTextProp ?? strings.combobox.empty;\n const loadErrorText = loadErrorTextProp ?? strings.combobox.loadError;\n const isError = Boolean(error);\n const { fieldId, helperId, errorId, describedBy } = useFieldIds(id, {\n hasHelper: Boolean(helperText),\n hasError: isError,\n });\n // cmdk assigns its own id to the list, so read it back from the node once\n // the portal mounts; aria-controls is only set while the listbox exists.\n const [listId, setListId] = useState<string | undefined>(undefined);\n const listRef = useCallback((el: HTMLDivElement | null) => setListId(el?.id), []);\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [loaded, setLoaded] = useState<ComboboxOption[]>([]);\n const [loading, setLoading] = useState(false);\n const [loadError, setLoadError] = useState(false);\n // In async mode the option list only exists after the first search, so the\n // chosen option is remembered here to keep its label on the trigger.\n const [selectedOption, setSelectedOption] = useState<ComboboxOption | null>(null);\n\n // Resolve options: static or async-loaded.\n const items = useMemo(\n () => (loadOptions ? loaded : (options ?? [])),\n [loadOptions, loaded, options],\n );\n\n // Latest loader in a ref so an inline `loadOptions={async q => …}` does not\n // retrigger the fetch on every parent render — only query / open do.\n const loadRef = useRef(loadOptions);\n useEffect(() => {\n loadRef.current = loadOptions;\n });\n const hasLoader = Boolean(loadOptions);\n useEffect(() => {\n const load = loadRef.current;\n if (!load || !open) return;\n let cancelled = false;\n setLoading(true);\n setLoadError(false);\n load(query)\n .then((res) => {\n if (!cancelled) setLoaded(res);\n })\n .catch(() => {\n if (!cancelled) {\n setLoaded([]);\n setLoadError(true);\n }\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [query, open, hasLoader]);\n\n const selected = useMemo<ComboboxOption | null>(() => {\n if (value === null || value === undefined) return null;\n const fromItems = items.find((o) => o.value === value);\n if (fromItems) return fromItems;\n if (selectedOption?.value === value) return selectedOption;\n if (selectedLabel !== undefined) return { value, label: selectedLabel };\n return null;\n }, [items, value, selectedOption, selectedLabel]);\n\n const triggerHeight = size === 'sm' ? 'h-8' : size === 'lg' ? 'h-10' : 'h-9';\n const triggerPadding = size === 'sm' ? 'px-2.5' : size === 'lg' ? 'px-3.5' : 'px-3';\n // Leave room on the right for the clear button + chevron.\n const triggerPaddingRight = clearable ? 'pr-14' : 'pr-9';\n\n const handleClear = useCallback(() => {\n setSelectedOption(null);\n onChange(null);\n }, [onChange]);\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1.5', className)}>\n {label && (\n <label\n id={`${fieldId}-label`}\n htmlFor={fieldId}\n className=\"text-foreground text-sm font-medium\"\n >\n {label}\n </label>\n )}\n\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <div className=\"relative w-full\">\n <PopoverPrimitive.Trigger asChild>\n <button\n id={fieldId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={open ? listId : undefined}\n // role=combobox takes no name from content, so the placeholder\n // must be exposed explicitly. A consumer `id` implies an external\n // <label htmlFor>, which aria-label would override.\n aria-labelledby={label ? `${fieldId}-label` : undefined}\n aria-label={label || id ? undefined : placeholder}\n aria-invalid={isError || undefined}\n aria-describedby={describedBy}\n disabled={disabled}\n className={cn(\n 'bg-card text-foreground inline-flex w-full items-center justify-between gap-2 rounded-md border text-sm',\n 'transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'focus-visible:ring-offset-background outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n triggerHeight,\n triggerPadding,\n triggerPaddingRight,\n isError\n ? 'border-danger focus-visible:border-danger focus-visible:ring-danger'\n : 'border-border-input focus-visible:border-accent focus-visible:ring-ring',\n )}\n >\n <span\n className={cn('truncate', !selected && 'text-foreground-subtle')}\n title={selected ? selected.label : undefined}\n >\n {selected ? selected.label : placeholder}\n </span>\n </button>\n </PopoverPrimitive.Trigger>\n\n {/* Controls sit outside the trigger: a button inside a button is invalid HTML. */}\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center gap-0.5 pr-2\">\n {clearable && selected && !disabled && (\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n aria-label={strings.combobox.clear}\n icon={<X />}\n onClick={handleClear}\n className=\"text-foreground-subtle hover:text-foreground pointer-events-auto size-6\"\n />\n )}\n <ChevronsUpDown className=\"text-foreground-subtle size-4\" aria-hidden />\n </span>\n </div>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n // Radix gives the popover role=\"dialog\"; name it after the field.\n aria-labelledby={label ? `${fieldId}-label` : undefined}\n aria-label={label ? undefined : placeholder}\n align=\"start\"\n sideOffset={4}\n className={cn(\n 'border-border bg-popover text-popover-foreground z-[var(--z-popover)] w-[var(--radix-popover-trigger-width)] overflow-hidden rounded-lg border 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 )}\n >\n <CommandPrimitive shouldFilter={!loadOptions} className=\"flex h-full w-full flex-col\">\n <div className=\"border-border flex items-center border-b px-3\">\n <CommandPrimitive.Input\n value={query}\n onValueChange={setQuery}\n placeholder={searchPlaceholder}\n className=\"placeholder:text-foreground-subtle flex h-9 w-full bg-transparent py-2 text-lg outline-none md:text-sm\"\n />\n {loading && (\n <Loader2 className=\"text-foreground-subtle size-4 animate-spin\" aria-hidden />\n )}\n </div>\n <CommandPrimitive.List\n ref={listRef}\n label={strings.command.suggestions}\n className=\"max-h-64 overflow-y-auto p-1\"\n >\n {items.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <CommandPrimitive.Item\n key={opt.value}\n value={opt.value}\n // cmdk matches on value + keywords; users type the label, not the id.\n keywords={opt.description ? [opt.label, opt.description] : [opt.label]}\n disabled={opt.disabled}\n onSelect={(v) => {\n setSelectedOption(opt);\n onChange(v);\n setOpen(false);\n }}\n className={cn(\n 'text-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm',\n 'data-[selected=true]:bg-background-muted',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50',\n )}\n >\n <span className=\"flex-1\">{opt.label}</span>\n {opt.description && (\n <span className=\"text-foreground-subtle text-xs\">{opt.description}</span>\n )}\n {isSelected && <Check className=\"text-accent size-4\" aria-hidden />}\n </CommandPrimitive.Item>\n );\n })}\n {loadError && !loading && (\n <div className=\"text-danger-text px-2 py-6 text-center text-sm\">\n {loadErrorText}\n </div>\n )}\n {/* cmdk only shows Empty when no item matches the query, so it can always be mounted. */}\n {!loading && !loadError && (\n <CommandPrimitive.Empty className=\"text-foreground-subtle px-2 py-6 text-center text-sm\">\n {emptyText}\n </CommandPrimitive.Empty>\n )}\n </CommandPrimitive.List>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n\n {error ? (\n <p id={errorId} className=\"text-danger-text text-xs\">\n {error}\n </p>\n ) : helperText ? (\n <p id={helperId} className=\"text-foreground-subtle text-xs\">\n {helperText}\n </p>\n ) : null}\n </div>\n );\n});\n\nCombobox.displayName = 'Combobox';\n"],"names":["Combobox","forwardRef","value","onChange","options","loadOptions","selectedLabel","label","helperText","error","placeholderProp","searchPlaceholderProp","emptyTextProp","loadErrorTextProp","clearable","disabled","size","id","className","ref","strings","useStrings","placeholder","searchPlaceholder","emptyText","loadErrorText","isError","fieldId","helperId","errorId","describedBy","useFieldIds","listId","setListId","useState","listRef","useCallback","el","open","setOpen","query","setQuery","loaded","setLoaded","loading","setLoading","loadError","setLoadError","selectedOption","setSelectedOption","items","useMemo","loadRef","useRef","useEffect","load","cancelled","res","selected","fromItems","o","triggerHeight","triggerPadding","triggerPaddingRight","handleClear","cn","jsx","PopoverPrimitive","jsxs","IconButton","X","ChevronsUpDown","CommandPrimitive","Loader2","opt","isSelected","v","Check"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ReactNode } from 'react';
1
+ import { Dispatch, ReactNode, SetStateAction } from 'react';
2
2
  export declare const Command: import('react').ForwardRefExoticComponent<Omit<{
3
3
  children?: React.ReactNode;
4
4
  } & Pick<Pick<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof import('react').HTMLAttributes<HTMLDivElement>> & {
@@ -71,10 +71,13 @@ export declare const CommandItem: import('react').ForwardRefExoticComponent<Omit
71
71
  keywords?: string[];
72
72
  forceMount?: boolean;
73
73
  } & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
74
- export declare function CommandShortcut({ children, className }: {
74
+ export declare function CommandShortcut({ children, className, }: {
75
75
  children: ReactNode;
76
76
  className?: string;
77
77
  }): import("react/jsx-runtime").JSX.Element;
78
+ export declare namespace CommandShortcut {
79
+ var displayName: string;
80
+ }
78
81
  export interface CommandDialogProps {
79
82
  open: boolean;
80
83
  onOpenChange: (open: boolean) => void;
@@ -106,4 +109,4 @@ export declare function CommandDialog({ open, onOpenChange, children, title }: C
106
109
  * @dont Hide essential actions behind the palette only — keep at least one
107
110
  * button entry in the UI.
108
111
  */
109
- export declare function useCommandPaletteShortcut(setOpen: (open: boolean) => void): void;
112
+ export declare function useCommandPaletteShortcut(setOpen: Dispatch<SetStateAction<boolean>>): void;