@teton/smith-ui 0.2.196 → 0.2.198

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ export { BackLink, InfoRow, SideNav, type SideNavItem, type TabItem, TabNav, } f
7
7
  export { type DropdownItem, DropdownMenu } from './dropdown';
8
8
  export { PageContainer } from './page-container';
9
9
  export { SearchInput } from './search-input';
10
- export { Select } from './select';
10
+ export { Select, SelectMenu, type SelectMenuOption, } from './select';
11
11
  export { StatCard } from './stat-card';
12
12
  export { StateTimeline, type TimelineLane, type TimelineSpan, type TimelineTone, UptimeBars, type UptimeBucket, } from './state-timeline';
13
13
  export { type IconComponent, SECTION_THEMES, type SectionTheme, type SectionThemeName, } from './theme';
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { jsx as e, jsxs as i, Fragment as N } from "react/jsx-runtime";
2
- import { X as T, ChevronRight as k, MoreHorizontal as I, Loader2 as z, ArrowLeft as K, ChevronDown as P, Search as U, Check as X } from "lucide-react";
3
- import { useState as E, useRef as j, useEffect as D } from "react";
4
- import { Link as v } from "react-router";
5
- const H = {
1
+ import { jsx as e, jsxs as l, Fragment as $ } from "react/jsx-runtime";
2
+ import { X as M, ChevronRight as T, MoreHorizontal as K, Loader2 as P, ArrowLeft as U, ChevronDown as B, Search as H, Check as I } from "lucide-react";
3
+ import { useState as N, useRef as C, useEffect as L } from "react";
4
+ import { Link as w } from "react-router";
5
+ const X = {
6
6
  gray: "bg-gray-100 text-gray-700",
7
7
  blue: "bg-blue-100 text-blue-700",
8
8
  green: "bg-green-100 text-green-700",
@@ -20,7 +20,7 @@ function ne({
20
20
  return /* @__PURE__ */ e(
21
21
  "span",
22
22
  {
23
- className: `px-1.5 py-0.5 text-xs font-medium ${t ? "rounded-full" : "rounded"} ${H[r]} ${n}`,
23
+ className: `px-1.5 py-0.5 text-xs font-medium ${t ? "rounded-full" : "rounded"} ${X[r]} ${n}`,
24
24
  children: a
25
25
  }
26
26
  );
@@ -31,9 +31,9 @@ function ae({
31
31
  onClick: n,
32
32
  onRemove: a,
33
33
  active: o = !1,
34
- title: u
34
+ title: h
35
35
  }) {
36
- const l = /* @__PURE__ */ i(N, { children: [
36
+ const i = /* @__PURE__ */ l($, { children: [
37
37
  /* @__PURE__ */ e(
38
38
  "span",
39
39
  {
@@ -49,17 +49,17 @@ function ae({
49
49
  }
50
50
  )
51
51
  ] }), c = `inline-flex items-center overflow-hidden rounded-md border text-xs ${o ? "border-blue-300" : "border-gray-200"}`;
52
- return a ? /* @__PURE__ */ i("span", { className: c, children: [
53
- l,
52
+ return a ? /* @__PURE__ */ l("span", { className: c, children: [
53
+ i,
54
54
  /* @__PURE__ */ e(
55
55
  "button",
56
56
  {
57
57
  type: "button",
58
58
  onClick: a,
59
- title: u,
59
+ title: h,
60
60
  "aria-label": `Remove ${t !== void 0 ? `${r}=${t}` : r}`,
61
61
  className: `flex items-center px-1.5 py-1 border-l cursor-pointer transition-colors ${o ? "bg-blue-100 border-blue-200 text-blue-500 hover:bg-blue-200 hover:text-blue-700" : "border-gray-200 text-gray-400 hover:bg-gray-100 hover:text-gray-600"}`,
62
- children: /* @__PURE__ */ e(T, { className: "w-3 h-3" })
62
+ children: /* @__PURE__ */ e(M, { className: "w-3 h-3" })
63
63
  }
64
64
  )
65
65
  ] }) : n ? /* @__PURE__ */ e(
@@ -67,11 +67,11 @@ function ae({
67
67
  {
68
68
  type: "button",
69
69
  onClick: n,
70
- title: u,
70
+ title: h,
71
71
  className: `${c} cursor-pointer transition-colors ${o ? "" : "hover:border-gray-300"}`,
72
- children: l
72
+ children: i
73
73
  }
74
- ) : /* @__PURE__ */ e("span", { className: c, children: l });
74
+ ) : /* @__PURE__ */ e("span", { className: c, children: i });
75
75
  }
76
76
  function oe({
77
77
  segments: r,
@@ -79,7 +79,7 @@ function oe({
79
79
  maxVisible: n = 5,
80
80
  className: a = ""
81
81
  }) {
82
- const [o, u] = E(!1), l = !o && r.length > n, c = l ? r.slice(0, 1) : [], m = l ? r.length - n : 0, b = l ? r.slice(1 + m) : r, x = l ? 1 + m : 0, d = (s, g) => g === r.length - 1 ? /* @__PURE__ */ e(
82
+ const [o, h] = N(!1), i = !o && r.length > n, c = i ? r.slice(0, 1) : [], m = i ? r.length - n : 0, b = i ? r.slice(1 + m) : r, p = i ? 1 + m : 0, d = (s, u) => u === r.length - 1 ? /* @__PURE__ */ e(
83
83
  "span",
84
84
  {
85
85
  "aria-current": "page",
@@ -91,40 +91,40 @@ function oe({
91
91
  "button",
92
92
  {
93
93
  type: "button",
94
- onClick: () => t(g),
94
+ onClick: () => t(u),
95
95
  className: "px-1.5 py-0.5 rounded text-gray-500 hover:text-gray-900 hover:bg-gray-100 transition-colors cursor-pointer truncate max-w-[12rem]",
96
96
  children: s.label
97
97
  },
98
98
  s.key
99
99
  );
100
- return /* @__PURE__ */ i(
100
+ return /* @__PURE__ */ l(
101
101
  "nav",
102
102
  {
103
103
  "aria-label": "Breadcrumb",
104
104
  className: `flex items-center gap-0.5 text-sm min-w-0 overflow-hidden ${a}`,
105
105
  children: [
106
- c.map((s, g) => /* @__PURE__ */ i("span", { className: "flex items-center gap-0.5 min-w-0", children: [
107
- d(s, g),
108
- /* @__PURE__ */ e(k, { className: "w-3.5 h-3.5 text-gray-300 flex-shrink-0" })
106
+ c.map((s, u) => /* @__PURE__ */ l("span", { className: "flex items-center gap-0.5 min-w-0", children: [
107
+ d(s, u),
108
+ /* @__PURE__ */ e(T, { className: "w-3.5 h-3.5 text-gray-300 flex-shrink-0" })
109
109
  ] }, s.key)),
110
- l && /* @__PURE__ */ i("span", { className: "flex items-center gap-0.5 flex-shrink-0", children: [
110
+ i && /* @__PURE__ */ l("span", { className: "flex items-center gap-0.5 flex-shrink-0", children: [
111
111
  /* @__PURE__ */ e(
112
112
  "button",
113
113
  {
114
114
  type: "button",
115
- onClick: () => u(!0),
115
+ onClick: () => h(!0),
116
116
  title: `Show ${m} hidden ${m === 1 ? "folder" : "folders"}`,
117
117
  className: "px-1 py-0.5 rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-colors cursor-pointer",
118
- children: /* @__PURE__ */ e(I, { className: "w-4 h-4" })
118
+ children: /* @__PURE__ */ e(K, { className: "w-4 h-4" })
119
119
  }
120
120
  ),
121
- /* @__PURE__ */ e(k, { className: "w-3.5 h-3.5 text-gray-300" })
121
+ /* @__PURE__ */ e(T, { className: "w-3.5 h-3.5 text-gray-300" })
122
122
  ] }),
123
- b.map((s, g) => {
124
- const h = x + g;
125
- return /* @__PURE__ */ i("span", { className: "flex items-center gap-0.5 min-w-0", children: [
126
- d(s, h),
127
- h < r.length - 1 && /* @__PURE__ */ e(k, { className: "w-3.5 h-3.5 text-gray-300 flex-shrink-0" })
123
+ b.map((s, u) => {
124
+ const x = p + u;
125
+ return /* @__PURE__ */ l("span", { className: "flex items-center gap-0.5 min-w-0", children: [
126
+ d(s, x),
127
+ x < r.length - 1 && /* @__PURE__ */ e(T, { className: "w-3.5 h-3.5 text-gray-300 flex-shrink-0" })
128
128
  ] }, s.key);
129
129
  })
130
130
  ]
@@ -170,43 +170,43 @@ function Z({
170
170
  size: n = "md",
171
171
  icon: a,
172
172
  loading: o = !1,
173
- disabled: u = !1,
174
- type: l = "button",
173
+ disabled: h = !1,
174
+ type: i = "button",
175
175
  title: c,
176
176
  onClick: m,
177
177
  to: b,
178
- href: x,
178
+ href: p,
179
179
  target: d,
180
180
  className: s = "",
181
- children: g
181
+ children: u
182
182
  }) {
183
- const h = `inline-flex items-center justify-center font-medium rounded-lg transition-colors duration-100 cursor-pointer active:scale-[.98] ${Y[n]} ${G[r]} ${V[r][t]} ${s}`, p = /* @__PURE__ */ i(N, { children: [
184
- o ? /* @__PURE__ */ e(z, { className: "w-4 h-4 animate-spin" }) : a,
185
- g
183
+ const x = `inline-flex items-center justify-center font-medium rounded-lg transition-colors duration-100 cursor-pointer active:scale-[.98] ${Y[n]} ${G[r]} ${V[r][t]} ${s}`, f = /* @__PURE__ */ l($, { children: [
184
+ o ? /* @__PURE__ */ e(P, { className: "w-4 h-4 animate-spin" }) : a,
185
+ u
186
186
  ] });
187
- return b ? /* @__PURE__ */ e(v, { to: b, className: h, title: c, children: p }) : x ? /* @__PURE__ */ e(
187
+ return b ? /* @__PURE__ */ e(w, { to: b, className: x, title: c, children: f }) : p ? /* @__PURE__ */ e(
188
188
  "a",
189
189
  {
190
- href: x,
190
+ href: p,
191
191
  target: d,
192
192
  rel: d === "_blank" ? "noopener noreferrer" : void 0,
193
- className: h,
193
+ className: x,
194
194
  title: c,
195
- children: p
195
+ children: f
196
196
  }
197
197
  ) : /* @__PURE__ */ e(
198
198
  "button",
199
199
  {
200
- type: l,
200
+ type: i,
201
201
  onClick: m,
202
- disabled: u || o,
202
+ disabled: h || o,
203
203
  title: c,
204
- className: `${h} disabled:opacity-50 disabled:cursor-not-allowed`,
205
- children: p
204
+ className: `${x} disabled:opacity-50 disabled:cursor-not-allowed`,
205
+ children: f
206
206
  }
207
207
  );
208
208
  }
209
- function L({
209
+ function S({
210
210
  className: r = "",
211
211
  children: t
212
212
  }) {
@@ -224,21 +224,21 @@ function se({
224
224
  theme: n,
225
225
  count: a,
226
226
  actions: o,
227
- bodyClassName: u = "p-5",
228
- className: l = "",
227
+ bodyClassName: h = "p-5",
228
+ className: i = "",
229
229
  children: c
230
230
  }) {
231
- return /* @__PURE__ */ i(L, { className: `overflow-hidden ${l}`, children: [
232
- /* @__PURE__ */ i(
231
+ return /* @__PURE__ */ l(S, { className: `overflow-hidden ${i}`, children: [
232
+ /* @__PURE__ */ l(
233
233
  "div",
234
234
  {
235
235
  className: `px-4 py-3 flex items-center justify-between border-b border-black/5 ${n.header}`,
236
236
  children: [
237
- /* @__PURE__ */ i("h4", { className: "text-sm font-semibold flex items-center", children: [
237
+ /* @__PURE__ */ l("h4", { className: "text-sm font-semibold flex items-center", children: [
238
238
  r && /* @__PURE__ */ e(r, { className: "w-4 h-4 mr-2" }),
239
239
  t
240
240
  ] }),
241
- (o || a !== void 0) && /* @__PURE__ */ i("div", { className: "flex items-center gap-2", children: [
241
+ (o || a !== void 0) && /* @__PURE__ */ l("div", { className: "flex items-center gap-2", children: [
242
242
  o,
243
243
  a !== void 0 && /* @__PURE__ */ e(
244
244
  "span",
@@ -251,7 +251,7 @@ function se({
251
251
  ]
252
252
  }
253
253
  ),
254
- /* @__PURE__ */ e("div", { className: u, children: c })
254
+ /* @__PURE__ */ e("div", { className: h, children: c })
255
255
  ] });
256
256
  }
257
257
  const q = {
@@ -265,15 +265,15 @@ function le({
265
265
  action: a,
266
266
  children: o
267
267
  }) {
268
- const { accent: u, chip: l } = q[r];
269
- return /* @__PURE__ */ e(L, { className: `border-l-4 ${u} px-5 py-4`, children: /* @__PURE__ */ i("div", { className: "flex items-start justify-between gap-4", children: [
270
- /* @__PURE__ */ i("div", { className: "min-w-0 flex-1", children: [
271
- /* @__PURE__ */ i("div", { className: "flex items-center gap-2.5 flex-wrap", children: [
268
+ const { accent: h, chip: i } = q[r];
269
+ return /* @__PURE__ */ e(S, { className: `border-l-4 ${h} px-5 py-4`, children: /* @__PURE__ */ l("div", { className: "flex items-start justify-between gap-4", children: [
270
+ /* @__PURE__ */ l("div", { className: "min-w-0 flex-1", children: [
271
+ /* @__PURE__ */ l("div", { className: "flex items-center gap-2.5 flex-wrap", children: [
272
272
  /* @__PURE__ */ e("h4", { className: "text-base font-semibold text-gray-900", children: t }),
273
273
  n && /* @__PURE__ */ e(
274
274
  "span",
275
275
  {
276
- className: `text-[11px] font-bold uppercase tracking-wide px-1.5 py-0.5 rounded ${l}`,
276
+ className: `text-[11px] font-bold uppercase tracking-wide px-1.5 py-0.5 rounded ${i}`,
277
277
  children: n
278
278
  }
279
279
  )
@@ -289,20 +289,20 @@ function ie({
289
289
  count: n,
290
290
  theme: a,
291
291
  actions: o,
292
- footer: u,
293
- children: l
292
+ footer: h,
293
+ children: i
294
294
  }) {
295
- return /* @__PURE__ */ i(L, { className: "overflow-hidden flex flex-col", children: [
296
- /* @__PURE__ */ i(
295
+ return /* @__PURE__ */ l(S, { className: "overflow-hidden flex flex-col", children: [
296
+ /* @__PURE__ */ l(
297
297
  "div",
298
298
  {
299
299
  className: `px-4 py-3 flex items-center justify-between border-b border-black/5 ${a.header}`,
300
300
  children: [
301
- /* @__PURE__ */ i("h4", { className: "text-sm font-semibold flex items-center", children: [
301
+ /* @__PURE__ */ l("h4", { className: "text-sm font-semibold flex items-center", children: [
302
302
  r && /* @__PURE__ */ e(r, { className: "w-4 h-4 mr-2" }),
303
303
  t
304
304
  ] }),
305
- /* @__PURE__ */ i("div", { className: "flex items-center gap-2", children: [
305
+ /* @__PURE__ */ l("div", { className: "flex items-center gap-2", children: [
306
306
  o,
307
307
  n !== void 0 && /* @__PURE__ */ e(
308
308
  "span",
@@ -315,35 +315,35 @@ function ie({
315
315
  ]
316
316
  }
317
317
  ),
318
- /* @__PURE__ */ e("div", { className: "divide-y divide-gray-100", children: l }),
319
- u
318
+ /* @__PURE__ */ e("div", { className: "divide-y divide-gray-100", children: i }),
319
+ h
320
320
  ] });
321
321
  }
322
- function de({
322
+ function ce({
323
323
  to: r,
324
324
  onClick: t,
325
325
  hover: n = "hover:bg-gray-50",
326
326
  className: a = "",
327
327
  children: o
328
328
  }) {
329
- const l = `flex items-center justify-between px-4 py-3 transition-colors ${n} ${!!(r || t) ? "cursor-pointer" : ""} ${a}`;
330
- return r ? /* @__PURE__ */ e(v, { to: r, className: l, children: o }) : t ? /* @__PURE__ */ e(
329
+ const i = `flex items-center justify-between px-4 py-3 transition-colors ${n} ${!!(r || t) ? "cursor-pointer" : ""} ${a}`;
330
+ return r ? /* @__PURE__ */ e(w, { to: r, className: i, children: o }) : t ? /* @__PURE__ */ e(
331
331
  "button",
332
332
  {
333
333
  type: "button",
334
334
  onClick: t,
335
- className: `w-full text-left ${l}`,
335
+ className: `w-full text-left ${i}`,
336
336
  children: o
337
337
  }
338
- ) : /* @__PURE__ */ e("div", { className: l, children: o });
338
+ ) : /* @__PURE__ */ e("div", { className: i, children: o });
339
339
  }
340
- function ce({
340
+ function de({
341
341
  to: r,
342
342
  count: t,
343
343
  noun: n = "items"
344
344
  }) {
345
- return /* @__PURE__ */ i(
346
- v,
345
+ return /* @__PURE__ */ l(
346
+ w,
347
347
  {
348
348
  to: r,
349
349
  className: "block px-4 py-2.5 text-sm font-medium text-blue-600 hover:text-blue-700 hover:bg-gray-50 transition-colors",
@@ -379,21 +379,21 @@ function ue({
379
379
  onClick: t,
380
380
  children: n
381
381
  }) {
382
- const a = "inline-flex items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors cursor-pointer", o = /* @__PURE__ */ i(N, { children: [
383
- /* @__PURE__ */ e(K, { className: "w-4 h-4" }),
382
+ const a = "inline-flex items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors cursor-pointer", o = /* @__PURE__ */ l($, { children: [
383
+ /* @__PURE__ */ e(U, { className: "w-4 h-4" }),
384
384
  /* @__PURE__ */ e("span", { children: n })
385
385
  ] });
386
- return r ? /* @__PURE__ */ e(v, { to: r, className: a, children: o }) : /* @__PURE__ */ e("button", { type: "button", onClick: t, className: a, children: o });
386
+ return r ? /* @__PURE__ */ e(w, { to: r, className: a, children: o }) : /* @__PURE__ */ e("button", { type: "button", onClick: t, className: a, children: o });
387
387
  }
388
388
  function be({
389
389
  items: r,
390
390
  actions: t
391
391
  }) {
392
- return /* @__PURE__ */ i("div", { className: "border-b border-gray-200 flex items-end justify-between gap-4", children: [
392
+ return /* @__PURE__ */ l("div", { className: "border-b border-gray-200 flex items-end justify-between gap-4", children: [
393
393
  /* @__PURE__ */ e("nav", { className: "-mb-px flex space-x-8", children: r.map((n) => {
394
394
  const a = n.active ? "py-2 px-1 border-b-2 border-blue-500 text-blue-600 font-medium text-sm" : "py-2 px-1 border-b-2 border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 font-medium text-sm transition-colors cursor-pointer";
395
395
  return n.to && !n.active ? /* @__PURE__ */ e(
396
- v,
396
+ w,
397
397
  {
398
398
  to: n.to,
399
399
  state: n.state,
@@ -408,7 +408,7 @@ function be({
408
408
  }
409
409
  function me({ items: r }) {
410
410
  return /* @__PURE__ */ e("nav", { className: "space-y-1", children: r.map((t) => {
411
- const n = t.icon, a = `group/side relative flex items-center gap-3 h-10 rounded-md px-3 text-sm transition-all duration-200 cursor-pointer ${t.active ? "bg-blue-50 text-blue-700 font-medium" : "text-gray-600 hover:bg-gray-100 hover:text-gray-900"}`, o = /* @__PURE__ */ i(N, { children: [
411
+ const n = t.icon, a = `group/side relative flex items-center gap-3 h-10 rounded-md px-3 text-sm transition-all duration-200 cursor-pointer ${t.active ? "bg-blue-50 text-blue-700 font-medium" : "text-gray-600 hover:bg-gray-100 hover:text-gray-900"}`, o = /* @__PURE__ */ l($, { children: [
412
412
  /* @__PURE__ */ e(
413
413
  "span",
414
414
  {
@@ -418,7 +418,7 @@ function me({ items: r }) {
418
418
  n && /* @__PURE__ */ e(n, { className: "w-[18px] h-[18px] shrink-0 transition-transform duration-200 group-hover/side:scale-110" }),
419
419
  /* @__PURE__ */ e("span", { className: "truncate", children: t.label })
420
420
  ] });
421
- return t.active ? /* @__PURE__ */ e("span", { className: a, "aria-current": "page", children: o }, t.to) : /* @__PURE__ */ e(v, { to: t.to, className: a, children: o }, t.to);
421
+ return t.active ? /* @__PURE__ */ e("span", { className: a, "aria-current": "page", children: o }, t.to) : /* @__PURE__ */ e(w, { to: t.to, className: a, children: o }, t.to);
422
422
  }) });
423
423
  }
424
424
  function he({
@@ -427,8 +427,8 @@ function he({
427
427
  iconClassName: n = "text-gray-400",
428
428
  children: a
429
429
  }) {
430
- return /* @__PURE__ */ i("div", { className: "flex items-center justify-between gap-4", children: [
431
- /* @__PURE__ */ i("span", { className: "text-gray-700 flex items-center flex-shrink-0", children: [
430
+ return /* @__PURE__ */ l("div", { className: "flex items-center justify-between gap-4", children: [
431
+ /* @__PURE__ */ l("span", { className: "text-gray-700 flex items-center flex-shrink-0", children: [
432
432
  t && /* @__PURE__ */ e(t, { className: `w-4 h-4 mr-2 ${n}` }),
433
433
  r
434
434
  ] }),
@@ -442,42 +442,42 @@ const Q = {
442
442
  green: "text-green-600",
443
443
  orange: "text-orange-600",
444
444
  gray: "text-gray-500"
445
- }, A = "w-full flex items-start gap-3 px-3 py-2 text-left transition-colors hover:bg-gray-50 cursor-pointer";
445
+ }, R = "w-full flex items-start gap-3 px-3 py-2 text-left transition-colors hover:bg-gray-50 cursor-pointer";
446
446
  function pe({
447
447
  label: r,
448
448
  items: t,
449
449
  icon: n,
450
450
  variant: a = "soft",
451
451
  tone: o = "gray",
452
- size: u = "md",
453
- align: l = "right",
452
+ size: h = "md",
453
+ align: i = "right",
454
454
  className: c = ""
455
455
  }) {
456
- const [m, b] = E(!1), x = j(null);
457
- return D(() => {
456
+ const [m, b] = N(!1), p = C(null);
457
+ return L(() => {
458
458
  if (!m) return;
459
- const d = (g) => {
460
- var h;
461
- (h = x.current) != null && h.contains(g.target) || b(!1);
462
- }, s = (g) => {
463
- g.key === "Escape" && b(!1);
459
+ const d = (u) => {
460
+ var x;
461
+ (x = p.current) != null && x.contains(u.target) || b(!1);
462
+ }, s = (u) => {
463
+ u.key === "Escape" && b(!1);
464
464
  };
465
465
  return document.addEventListener("mousedown", d), document.addEventListener("keydown", s), () => {
466
466
  document.removeEventListener("mousedown", d), document.removeEventListener("keydown", s);
467
467
  };
468
- }, [m]), /* @__PURE__ */ i("div", { className: `relative ${c}`, ref: x, children: [
469
- /* @__PURE__ */ i(
468
+ }, [m]), /* @__PURE__ */ l("div", { className: `relative ${c}`, ref: p, children: [
469
+ /* @__PURE__ */ l(
470
470
  Z,
471
471
  {
472
472
  variant: a,
473
473
  tone: o,
474
- size: u,
474
+ size: h,
475
475
  icon: n,
476
476
  onClick: () => b((d) => !d),
477
477
  children: [
478
478
  r,
479
479
  /* @__PURE__ */ e(
480
- P,
480
+ B,
481
481
  {
482
482
  className: `w-4 h-4 transition-transform duration-200 ${m ? "rotate-180" : ""}`
483
483
  }
@@ -488,17 +488,17 @@ function pe({
488
488
  m && /* @__PURE__ */ e(
489
489
  "div",
490
490
  {
491
- className: `absolute ${l === "right" ? "right-0" : "left-0"} mt-2 w-64 py-1 bg-white rounded-lg shadow-lg border border-gray-200 z-50 animate-dropdown-in`,
491
+ className: `absolute ${i === "right" ? "right-0" : "left-0"} mt-2 w-64 py-1 bg-white rounded-lg shadow-lg border border-gray-200 z-50 animate-dropdown-in`,
492
492
  children: t.map((d, s) => {
493
- const g = Q[d.tone ?? "gray"], h = /* @__PURE__ */ i(N, { children: [
493
+ const u = Q[d.tone ?? "gray"], x = /* @__PURE__ */ l($, { children: [
494
494
  d.icon && /* @__PURE__ */ e(
495
495
  "span",
496
496
  {
497
- className: `flex items-center gap-1 mt-0.5 flex-shrink-0 ${g}`,
497
+ className: `flex items-center gap-1 mt-0.5 flex-shrink-0 ${u}`,
498
498
  children: d.icon
499
499
  }
500
500
  ),
501
- /* @__PURE__ */ i("span", { className: "min-w-0", children: [
501
+ /* @__PURE__ */ l("span", { className: "min-w-0", children: [
502
502
  /* @__PURE__ */ e("span", { className: "block text-sm font-medium text-gray-900", children: d.label }),
503
503
  d.description && /* @__PURE__ */ e("span", { className: "block text-xs text-gray-500 mt-0.5 break-all", children: d.description })
504
504
  ] })
@@ -509,9 +509,9 @@ function pe({
509
509
  href: d.href,
510
510
  target: d.target,
511
511
  rel: d.target === "_blank" ? "noopener noreferrer" : void 0,
512
- className: A,
512
+ className: R,
513
513
  onClick: () => b(!1),
514
- children: h
514
+ children: x
515
515
  },
516
516
  s
517
517
  ) : /* @__PURE__ */ e(
@@ -520,11 +520,11 @@ function pe({
520
520
  type: "button",
521
521
  disabled: d.disabled,
522
522
  onClick: () => {
523
- var p;
524
- d.keepOpen || b(!1), (p = d.onClick) == null || p.call(d);
523
+ var f;
524
+ d.keepOpen || b(!1), (f = d.onClick) == null || f.call(d);
525
525
  },
526
- className: `${A} disabled:opacity-50 disabled:cursor-not-allowed`,
527
- children: h
526
+ className: `${R} disabled:opacity-50 disabled:cursor-not-allowed`,
527
+ children: x
528
528
  },
529
529
  s
530
530
  );
@@ -552,25 +552,25 @@ function fe({
552
552
  className: a = "w-full",
553
553
  slashToFocus: o = !1
554
554
  }) {
555
- const u = j(null);
556
- return D(() => {
555
+ const h = C(null);
556
+ return L(() => {
557
557
  if (!o) return;
558
- function l(c) {
558
+ function i(c) {
559
559
  var b;
560
560
  if (c.key !== "/" || c.ctrlKey || c.metaKey || c.altKey) return;
561
561
  const m = c.target;
562
- m.tagName === "INPUT" || m.tagName === "TEXTAREA" || m.tagName === "SELECT" || m.isContentEditable || (c.preventDefault(), (b = u.current) == null || b.focus());
562
+ m.tagName === "INPUT" || m.tagName === "TEXTAREA" || m.tagName === "SELECT" || m.isContentEditable || (c.preventDefault(), (b = h.current) == null || b.focus());
563
563
  }
564
- return document.addEventListener("keydown", l), () => document.removeEventListener("keydown", l);
565
- }, [o]), /* @__PURE__ */ i("div", { className: `relative ${a}`, children: [
566
- /* @__PURE__ */ e(U, { className: "absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 w-4 h-4 pointer-events-none" }),
564
+ return document.addEventListener("keydown", i), () => document.removeEventListener("keydown", i);
565
+ }, [o]), /* @__PURE__ */ l("div", { className: `relative ${a}`, children: [
566
+ /* @__PURE__ */ e(H, { className: "absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 w-4 h-4 pointer-events-none" }),
567
567
  /* @__PURE__ */ e(
568
568
  "input",
569
569
  {
570
- ref: u,
570
+ ref: h,
571
571
  type: "text",
572
572
  value: r,
573
- onChange: (l) => t(l.target.value),
573
+ onChange: (i) => t(i.target.value),
574
574
  placeholder: n,
575
575
  className: "w-full pl-10 pr-10 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm text-gray-900 placeholder-gray-400"
576
576
  }
@@ -584,20 +584,135 @@ function ye({
584
584
  children: n,
585
585
  id: a,
586
586
  className: o = "w-auto",
587
- disabled: u = !1
587
+ disabled: h = !1
588
588
  }) {
589
589
  return /* @__PURE__ */ e(
590
590
  "select",
591
591
  {
592
592
  id: a,
593
593
  value: r,
594
- onChange: (l) => t(l.target.value),
595
- disabled: u,
594
+ onChange: (i) => t(i.target.value),
595
+ disabled: h,
596
596
  className: `px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-gray-900 text-sm disabled:opacity-50 ${o}`,
597
597
  children: n
598
598
  }
599
599
  );
600
600
  }
601
+ function ve({
602
+ value: r,
603
+ onChange: t,
604
+ options: n,
605
+ ariaLabel: a,
606
+ align: o = "left",
607
+ className: h = "",
608
+ menuClassName: i = "w-56"
609
+ }) {
610
+ const [c, m] = N(!1), [b, p] = N(null), d = C(null), s = n.findIndex((g) => g.value === r), u = s >= 0 ? n[s] : void 0;
611
+ L(() => {
612
+ if (!c) return;
613
+ const g = (y) => {
614
+ var v;
615
+ (v = d.current) != null && v.contains(y.target) || m(!1);
616
+ };
617
+ return document.addEventListener("mousedown", g), () => document.removeEventListener("mousedown", g);
618
+ }, [c]);
619
+ function x(g) {
620
+ const y = n[g];
621
+ y && (t(y.value), m(!1));
622
+ }
623
+ function f(g) {
624
+ if (g.key === "Escape") {
625
+ m(!1);
626
+ return;
627
+ }
628
+ if (g.key === "ArrowDown" || g.key === "ArrowUp") {
629
+ if (g.preventDefault(), !c) {
630
+ m(!0), p(s >= 0 ? s : 0);
631
+ return;
632
+ }
633
+ p((y) => {
634
+ const k = (y ?? s) + (g.key === "ArrowDown" ? 1 : -1);
635
+ return Math.max(0, Math.min(k, n.length - 1));
636
+ });
637
+ return;
638
+ }
639
+ c && g.key === "Enter" && b != null && (g.preventDefault(), x(b));
640
+ }
641
+ return /* @__PURE__ */ l(
642
+ "div",
643
+ {
644
+ className: `relative ${h}`,
645
+ ref: d,
646
+ onKeyDown: f,
647
+ children: [
648
+ /* @__PURE__ */ l(
649
+ "button",
650
+ {
651
+ type: "button",
652
+ "aria-label": a,
653
+ "aria-haspopup": "listbox",
654
+ "aria-expanded": c,
655
+ onClick: () => {
656
+ m((g) => !g), p(s >= 0 ? s : 0);
657
+ },
658
+ className: "w-full inline-flex items-center justify-between gap-2 px-3 py-2 text-sm font-medium rounded-lg border border-gray-200 bg-gray-50 text-gray-700 shadow-sm transition-colors duration-100 cursor-pointer hover:bg-gray-100 hover:shadow",
659
+ children: [
660
+ /* @__PURE__ */ e("span", { className: "truncate", children: (u == null ? void 0 : u.label) ?? r }),
661
+ /* @__PURE__ */ e(
662
+ B,
663
+ {
664
+ className: `w-4 h-4 flex-shrink-0 text-gray-400 transition-transform duration-200 ${c ? "rotate-180" : ""}`
665
+ }
666
+ )
667
+ ]
668
+ }
669
+ ),
670
+ c && /* @__PURE__ */ e(
671
+ "div",
672
+ {
673
+ role: "listbox",
674
+ "aria-label": a,
675
+ tabIndex: -1,
676
+ className: `absolute ${o === "right" ? "right-0" : "left-0"} mt-2 ${i} max-h-72 overflow-y-auto py-1 bg-white rounded-lg shadow-lg border border-gray-200 z-50 animate-dropdown-in`,
677
+ children: n.map((g, y) => {
678
+ const v = g.value === r;
679
+ return /* @__PURE__ */ l(
680
+ "button",
681
+ {
682
+ type: "button",
683
+ role: "option",
684
+ "aria-selected": v,
685
+ onMouseEnter: () => p(y),
686
+ onClick: () => x(y),
687
+ className: `w-full flex items-start gap-2 px-3 py-2 text-left transition-colors cursor-pointer ${b === y ? "bg-gray-50" : ""}`,
688
+ children: [
689
+ /* @__PURE__ */ e(
690
+ I,
691
+ {
692
+ className: `w-4 h-4 mt-0.5 flex-shrink-0 text-blue-600 ${v ? "" : "invisible"}`
693
+ }
694
+ ),
695
+ /* @__PURE__ */ l("span", { className: "min-w-0", children: [
696
+ /* @__PURE__ */ e(
697
+ "span",
698
+ {
699
+ className: `block text-sm ${v ? "font-medium text-gray-900" : "text-gray-700"}`,
700
+ children: g.label
701
+ }
702
+ ),
703
+ g.description && /* @__PURE__ */ e("span", { className: "block text-xs text-gray-500 mt-0.5", children: g.description })
704
+ ] })
705
+ ]
706
+ },
707
+ g.value
708
+ );
709
+ })
710
+ }
711
+ )
712
+ ]
713
+ }
714
+ );
715
+ }
601
716
  const W = {
602
717
  neutral: { badge: "bg-gray-100", icon: "text-gray-400" },
603
718
  green: { badge: "bg-green-100", icon: "text-green-600" },
@@ -606,14 +721,14 @@ const W = {
606
721
  red: { badge: "bg-red-100", icon: "text-red-600" },
607
722
  purple: { badge: "bg-purple-100", icon: "text-purple-600" }
608
723
  };
609
- function ve({
724
+ function we({
610
725
  icon: r,
611
726
  label: t,
612
727
  value: n,
613
728
  tone: a = "neutral"
614
729
  }) {
615
730
  const o = W[a];
616
- return /* @__PURE__ */ i("div", { className: "flex items-center gap-4", children: [
731
+ return /* @__PURE__ */ l("div", { className: "flex items-center gap-4", children: [
617
732
  /* @__PURE__ */ e(
618
733
  "div",
619
734
  {
@@ -621,117 +736,117 @@ function ve({
621
736
  children: /* @__PURE__ */ e(r, { className: `w-6 h-6 ${o.icon}` })
622
737
  }
623
738
  ),
624
- /* @__PURE__ */ i("div", { children: [
739
+ /* @__PURE__ */ l("div", { children: [
625
740
  /* @__PURE__ */ e("p", { className: "text-sm font-medium text-gray-500", children: t }),
626
741
  /* @__PURE__ */ e("p", { className: "text-3xl font-bold text-gray-900 tabular-nums", children: n })
627
742
  ] })
628
743
  ] });
629
744
  }
630
- const O = {
745
+ const _ = {
631
746
  ok: "bg-green-500",
632
747
  down: "bg-red-500",
633
748
  unknown: "bg-gray-300"
634
- }, R = (r) => `${(r * 100).toFixed(4)}%`;
749
+ }, j = (r) => `${(r * 100).toFixed(4)}%`;
635
750
  function Ne({
636
751
  from: r,
637
752
  to: t,
638
753
  spans: n,
639
754
  coverageFrom: a,
640
755
  buckets: o = 48,
641
- height: u = "1.75rem",
642
- renderTooltip: l
756
+ height: h = "1.75rem",
757
+ renderTooltip: i
643
758
  }) {
644
- const [c, m] = E(null), b = r.getTime(), x = t.getTime() - b;
645
- if (!(x > 0)) return null;
646
- const d = a == null ? void 0 : a.getTime(), s = x / o, g = Array.from({ length: o }, (p, f) => {
647
- const y = b + f * s, w = y + s, M = d !== void 0 ? Math.max(0, Math.min(w, d) - y) : 0;
648
- let $ = 0;
649
- for (const C of n) {
650
- const S = Math.max(C.start.getTime(), y), _ = Math.min(C.end.getTime(), w);
651
- _ > S && ($ += _ - S);
759
+ const [c, m] = N(null), b = r.getTime(), p = t.getTime() - b;
760
+ if (!(p > 0)) return null;
761
+ const d = a == null ? void 0 : a.getTime(), s = p / o, u = Array.from({ length: o }, (f, g) => {
762
+ const y = b + g * s, v = y + s, k = d !== void 0 ? Math.max(0, Math.min(v, d) - y) : 0;
763
+ let E = 0;
764
+ for (const D of n) {
765
+ const A = Math.max(D.start.getTime(), y), O = Math.min(D.end.getTime(), v);
766
+ O > A && (E += O - A);
652
767
  }
653
- const B = Math.max(1, s - M);
768
+ const z = Math.max(1, s - k);
654
769
  return {
655
770
  start: new Date(y),
656
- end: new Date(w),
657
- downMs: $,
658
- unknownMs: M,
659
- ratio: 1 - $ / B
771
+ end: new Date(v),
772
+ downMs: E,
773
+ unknownMs: k,
774
+ ratio: 1 - E / z
660
775
  };
661
776
  });
662
- return /* @__PURE__ */ i("div", { className: "relative", children: [
663
- c !== null && l && /* @__PURE__ */ e(
777
+ return /* @__PURE__ */ l("div", { className: "relative", children: [
778
+ c !== null && i && /* @__PURE__ */ e(
664
779
  "div",
665
780
  {
666
781
  className: "pointer-events-none absolute bottom-full z-10 mb-2 whitespace-nowrap rounded-md bg-gray-900 px-2 py-1.5 text-[11px] leading-tight text-white shadow-lg",
667
- style: ((p) => {
668
- const f = (p + 0.5) / o;
669
- return f < 0.15 ? { left: 0 } : f > 0.85 ? { right: 0 } : { left: `${f * 100}%`, transform: "translateX(-50%)" };
782
+ style: ((f) => {
783
+ const g = (f + 0.5) / o;
784
+ return g < 0.15 ? { left: 0 } : g > 0.85 ? { right: 0 } : { left: `${g * 100}%`, transform: "translateX(-50%)" };
670
785
  })(c),
671
- children: l(g[c])
786
+ children: i(u[c])
672
787
  }
673
788
  ),
674
789
  /* @__PURE__ */ e(
675
790
  "div",
676
791
  {
677
792
  className: "flex items-stretch gap-[2px]",
678
- style: { height: u },
793
+ style: { height: h },
679
794
  onMouseLeave: () => m(null),
680
- children: g.map((p, f) => /* @__PURE__ */ i(
795
+ children: u.map((f, g) => /* @__PURE__ */ l(
681
796
  "div",
682
797
  {
683
- onMouseEnter: () => m(f),
684
- className: `relative z-10 min-w-[2px] flex-1 cursor-pointer overflow-hidden rounded-[2px] bg-emerald-500 transition-opacity ${c === f ? "opacity-60" : ""}`,
798
+ onMouseEnter: () => m(g),
799
+ className: `relative z-10 min-w-[2px] flex-1 cursor-pointer overflow-hidden rounded-[2px] bg-emerald-500 transition-opacity ${c === g ? "opacity-60" : ""}`,
685
800
  children: [
686
- p.unknownMs > 0 && /* @__PURE__ */ e(
801
+ f.unknownMs > 0 && /* @__PURE__ */ e(
687
802
  "div",
688
803
  {
689
804
  className: "absolute inset-y-0 left-0 bg-gray-300",
690
- style: { width: `${p.unknownMs / s * 100}%` }
805
+ style: { width: `${f.unknownMs / s * 100}%` }
691
806
  }
692
807
  ),
693
- p.downMs > 0 && /* @__PURE__ */ e(
808
+ f.downMs > 0 && /* @__PURE__ */ e(
694
809
  "div",
695
810
  {
696
811
  className: "absolute inset-x-0 bottom-0 bg-red-500",
697
812
  style: {
698
- height: `max(3px, ${p.downMs / s * 100}%)`
813
+ height: `max(3px, ${f.downMs / s * 100}%)`
699
814
  }
700
815
  }
701
816
  )
702
817
  ]
703
818
  },
704
- p.start.getTime()
819
+ f.start.getTime()
705
820
  ))
706
821
  }
707
822
  )
708
823
  ] });
709
824
  }
710
- function we({
825
+ function $e({
711
826
  from: r,
712
827
  to: t,
713
828
  lanes: n,
714
829
  baseline: a = "ok",
715
830
  ticks: o = 5,
716
- formatTick: u = (b) => b.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }),
717
- labelWidth: l = "8rem",
831
+ formatTick: h = (b) => b.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }),
832
+ labelWidth: i = "8rem",
718
833
  rowHeight: c = "1.25rem",
719
834
  emptyLabel: m = "No data"
720
835
  }) {
721
- const b = r.getTime(), x = t.getTime() - b;
722
- if (!(x > 0) || n.length === 0)
836
+ const b = r.getTime(), p = t.getTime() - b;
837
+ if (!(p > 0) || n.length === 0)
723
838
  return /* @__PURE__ */ e("div", { className: "py-8 text-center text-sm text-gray-500", children: m });
724
839
  const d = Array.from(
725
840
  { length: Math.max(2, o) },
726
- (s, g) => new Date(b + x * g / (Math.max(2, o) - 1))
841
+ (s, u) => new Date(b + p * u / (Math.max(2, o) - 1))
727
842
  );
728
- return /* @__PURE__ */ i("div", { className: "space-y-1.5", children: [
729
- n.map((s) => /* @__PURE__ */ i("div", { className: "flex items-center gap-3", children: [
843
+ return /* @__PURE__ */ l("div", { className: "space-y-1.5", children: [
844
+ n.map((s) => /* @__PURE__ */ l("div", { className: "flex items-center gap-3", children: [
730
845
  /* @__PURE__ */ e(
731
846
  "div",
732
847
  {
733
848
  className: "shrink-0 truncate font-mono text-xs text-gray-600",
734
- style: { width: l },
849
+ style: { width: i },
735
850
  title: s.name,
736
851
  children: s.label ?? s.name
737
852
  }
@@ -739,23 +854,23 @@ function we({
739
854
  /* @__PURE__ */ e(
740
855
  "div",
741
856
  {
742
- className: `relative flex-1 overflow-hidden rounded-sm ${O[a]}`,
857
+ className: `relative flex-1 overflow-hidden rounded-sm ${_[a]}`,
743
858
  style: { height: c },
744
- children: s.spans.map((g) => {
745
- const h = Math.max(g.start.getTime(), b), p = Math.min(g.end.getTime(), b + x);
746
- if (p <= h) return null;
747
- const f = (h - b) / x, y = (p - h) / x;
859
+ children: s.spans.map((u) => {
860
+ const x = Math.max(u.start.getTime(), b), f = Math.min(u.end.getTime(), b + p);
861
+ if (f <= x) return null;
862
+ const g = (x - b) / p, y = (f - x) / p;
748
863
  return /* @__PURE__ */ e(
749
864
  "div",
750
865
  {
751
- className: `absolute inset-y-0 ${O[g.tone]}`,
866
+ className: `absolute inset-y-0 ${_[u.tone]}`,
752
867
  style: {
753
- left: R(f),
754
- width: `max(2px, ${R(y)})`
868
+ left: j(g),
869
+ width: `max(2px, ${j(y)})`
755
870
  },
756
- title: g.label
871
+ title: u.label
757
872
  },
758
- `${g.start.getTime()}-${g.end.getTime()}`
873
+ `${u.start.getTime()}-${u.end.getTime()}`
759
874
  );
760
875
  })
761
876
  }
@@ -767,16 +882,16 @@ function we({
767
882
  {
768
883
  className: "flex justify-between pt-1 text-[11px] tabular-nums text-gray-400",
769
884
  style: {
770
- marginLeft: l,
885
+ marginLeft: i,
771
886
  paddingLeft: "0.75rem",
772
887
  marginRight: n.some((s) => s.trailing !== void 0) ? "4rem" : void 0
773
888
  },
774
- children: d.map((s) => /* @__PURE__ */ e("span", { children: u(s) }, s.getTime()))
889
+ children: d.map((s) => /* @__PURE__ */ e("span", { children: h(s) }, s.getTime()))
775
890
  }
776
891
  )
777
892
  ] });
778
893
  }
779
- const $e = {
894
+ const ke = {
780
895
  blue: {
781
896
  header: "bg-blue-50 text-blue-800",
782
897
  hover: "hover:bg-blue-50",
@@ -818,7 +933,7 @@ const $e = {
818
933
  badge: "bg-gray-200 text-gray-700"
819
934
  }
820
935
  };
821
- function ke({
936
+ function Ee({
822
937
  toast: r,
823
938
  onClose: t
824
939
  }) {
@@ -826,8 +941,8 @@ function ke({
826
941
  "div",
827
942
  {
828
943
  className: `fixed top-4 right-4 z-50 p-4 rounded-lg shadow-lg border transition-all duration-300 ease-in-out ${r.type === "success" ? "bg-green-50 text-green-800 border-green-200" : "bg-red-50 text-red-800 border-red-200"}`,
829
- children: /* @__PURE__ */ i("div", { className: "flex items-center space-x-2", children: [
830
- r.type === "success" ? /* @__PURE__ */ e(X, { className: "w-5 h-5 text-green-600" }) : /* @__PURE__ */ e(T, { className: "w-5 h-5 text-red-600" }),
944
+ children: /* @__PURE__ */ l("div", { className: "flex items-center space-x-2", children: [
945
+ r.type === "success" ? /* @__PURE__ */ e(I, { className: "w-5 h-5 text-green-600" }) : /* @__PURE__ */ e(M, { className: "w-5 h-5 text-red-600" }),
831
946
  /* @__PURE__ */ e("span", { className: "text-sm font-medium", children: r.message }),
832
947
  /* @__PURE__ */ e(
833
948
  "button",
@@ -835,7 +950,7 @@ function ke({
835
950
  type: "button",
836
951
  onClick: t,
837
952
  className: "ml-2 text-gray-400 hover:text-gray-600 cursor-pointer",
838
- children: /* @__PURE__ */ e(T, { className: "w-4 h-4" })
953
+ children: /* @__PURE__ */ e(M, { className: "w-4 h-4" })
839
954
  }
840
955
  )
841
956
  ] })
@@ -844,28 +959,29 @@ function ke({
844
959
  }
845
960
  export {
846
961
  le as AlertBanner,
847
- H as BADGE_COLORS,
962
+ X as BADGE_COLORS,
848
963
  ue as BackLink,
849
964
  ne as Badge,
850
965
  oe as Breadcrumbs,
851
966
  Z as Button,
852
- L as Card,
967
+ S as Card,
853
968
  ge as CountryFlag,
854
969
  pe as DropdownMenu,
855
970
  he as InfoRow,
856
971
  ae as LabelChip,
857
- de as ListRow,
972
+ ce as ListRow,
858
973
  xe as PageContainer,
859
974
  se as Panel,
860
- $e as SECTION_THEMES,
975
+ ke as SECTION_THEMES,
861
976
  fe as SearchInput,
862
977
  ie as SectionCard,
863
978
  ye as Select,
979
+ ve as SelectMenu,
864
980
  me as SideNav,
865
- ve as StatCard,
866
- we as StateTimeline,
981
+ we as StatCard,
982
+ $e as StateTimeline,
867
983
  be as TabNav,
868
- ke as Toast,
984
+ Ee as Toast,
869
985
  Ne as UptimeBars,
870
- ce as ViewAllFooter
986
+ de as ViewAllFooter
871
987
  };
package/dist/select.d.ts CHANGED
@@ -10,3 +10,25 @@ export declare function Select({ value, onChange, children, id, className, disab
10
10
  className?: string;
11
11
  disabled?: boolean;
12
12
  }): import("react/jsx-runtime").JSX.Element;
13
+ export interface SelectMenuOption {
14
+ value: string;
15
+ label: string;
16
+ /** Secondary line under the label — for the detail a tooltip would carry. */
17
+ description?: ReactNode;
18
+ }
19
+ /**
20
+ * Value picker with `DropdownMenu`'s popover chrome. Use it instead of `Select`
21
+ * where a native `<select>`'s platform styling sits next to design-system
22
+ * buttons and inputs; the trigger shows the selected option's label. Closes on
23
+ * outside click, Escape, or selection; Arrow keys move the highlight.
24
+ */
25
+ export declare function SelectMenu({ value, onChange, options, ariaLabel, align, className, menuClassName, }: {
26
+ value: string;
27
+ onChange: (value: string) => void;
28
+ options: SelectMenuOption[];
29
+ ariaLabel: string;
30
+ /** Which edge of the trigger the menu is anchored to. */
31
+ align?: "left" | "right";
32
+ className?: string;
33
+ menuClassName?: string;
34
+ }): import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teton/smith-ui",
3
- "version": "0.2.196",
3
+ "version": "0.2.198",
4
4
  "description": "Smith dashboard design-system primitives (React + Tailwind CSS v4).",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {