@mastra/playground-ui 64.0.0-alpha.8 → 64.0.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 (155) hide show
  1. package/dist/combobox-BNlVCFgY.cjs +718 -0
  2. package/dist/combobox-BNlVCFgY.cjs.map +1 -0
  3. package/dist/combobox-Bw13EcK0.js +676 -0
  4. package/dist/combobox-Bw13EcK0.js.map +1 -0
  5. package/dist/{combobox-styles-B3jftCXY.js → combobox-styles-Dr66ofEp.js} +2 -2
  6. package/dist/{combobox-styles-B3jftCXY.js.map → combobox-styles-Dr66ofEp.js.map} +1 -1
  7. package/dist/components/Combobox.cjs.js +22 -1
  8. package/dist/components/Combobox.cjs.js.map +1 -1
  9. package/dist/components/Combobox.es.js +2 -2
  10. package/dist/components/DataList.cjs.js +15 -17
  11. package/dist/components/DataList.cjs.js.map +1 -1
  12. package/dist/components/DataList.es.js +4 -5
  13. package/dist/components/DataList.es.js.map +1 -1
  14. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  15. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  16. package/dist/components/FilterBar.es.js +3 -3
  17. package/dist/components/LogsDataList.cjs.js +5 -2
  18. package/dist/components/LogsDataList.cjs.js.map +1 -1
  19. package/dist/components/LogsDataList.es.js +5 -2
  20. package/dist/components/LogsDataList.es.js.map +1 -1
  21. package/dist/components/Meter.cjs.js +172 -0
  22. package/dist/components/Meter.cjs.js.map +1 -0
  23. package/dist/components/Meter.d.ts +2 -0
  24. package/dist/components/Meter.es.js +167 -0
  25. package/dist/components/Meter.es.js.map +1 -0
  26. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  27. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  28. package/dist/components/PropertyFilter.cjs.js +1 -1
  29. package/dist/components/PropertyFilter.es.js +1 -1
  30. package/dist/components/SavedViews.es.js +1 -1
  31. package/dist/components/Table.cjs.js +11 -1
  32. package/dist/components/Table.cjs.js.map +1 -1
  33. package/dist/components/Table.es.js +11 -1
  34. package/dist/components/Table.es.js.map +1 -1
  35. package/dist/{data-list-top-DSr_ocKA.js → data-list-DdCZZctL.js} +332 -5
  36. package/dist/data-list-DdCZZctL.js.map +1 -0
  37. package/dist/{data-list-top-ByT2Mo77.cjs → data-list-ecHsw-zr.cjs} +339 -13
  38. package/dist/data-list-ecHsw-zr.cjs.map +1 -0
  39. package/dist/{data-list-skeleton-B_SXAeE0.js → data-list-skeleton-CGKlcoiI.js} +2 -2
  40. package/dist/{data-list-skeleton-B_SXAeE0.js.map → data-list-skeleton-CGKlcoiI.js.map} +1 -1
  41. package/dist/{data-list-skeleton-BqC9Gggi.cjs → data-list-skeleton-DGMTqeNP.cjs} +6 -6
  42. package/dist/{data-list-skeleton-BqC9Gggi.cjs.map → data-list-skeleton-DGMTqeNP.cjs.map} +1 -1
  43. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -1
  44. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  45. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -1
  46. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  47. package/dist/domains/logs/components/logs-list-view.cjs.js +3 -2
  48. package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
  49. package/dist/domains/logs/components/logs-list-view.es.js +3 -2
  50. package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
  51. package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
  52. package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
  53. package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
  54. package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
  55. package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
  56. package/dist/domains/scores/components/span-scoring.es.js +1 -1
  57. package/dist/domains/scores/components/trace-scores-tab.cjs.js +2 -1
  58. package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
  59. package/dist/domains/scores/components/trace-scores-tab.es.js +2 -1
  60. package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
  61. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +0 -1
  62. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  63. package/dist/domains/traces/components/thread-view-by-trace.es.js +0 -1
  64. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  65. package/dist/domains/traces/components/trace-columns-menu.cjs.js +10 -2
  66. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  67. package/dist/domains/traces/components/trace-columns-menu.es.js +10 -2
  68. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  69. package/dist/domains/traces/components/trace-data-panel.cjs.js +2 -1
  70. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  71. package/dist/domains/traces/components/trace-data-panel.es.js +2 -1
  72. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  73. package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
  74. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js +2 -0
  75. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js.map +1 -1
  76. package/dist/domains/traces/components/traces-list-view-adapter.es.js +2 -0
  77. package/dist/domains/traces/components/traces-list-view-adapter.es.js.map +1 -1
  78. package/dist/domains/traces/components/traces-list-view.cjs.js +13 -5
  79. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  80. package/dist/domains/traces/components/traces-list-view.es.js +12 -4
  81. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  82. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +4 -1
  83. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  84. package/dist/domains/traces/components/traces-page-skeleton.es.js +4 -1
  85. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  86. package/dist/domains/traces/trace-list-columns.cjs.js +12 -4
  87. package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
  88. package/dist/domains/traces/trace-list-columns.es.js +12 -4
  89. package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
  90. package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
  91. package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
  92. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  93. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  94. package/dist/ee/signals/components/entity-index-list.cjs.js +3 -1
  95. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  96. package/dist/ee/signals/components/entity-index-list.es.js +3 -1
  97. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  98. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +3 -1
  99. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  100. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +3 -1
  101. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  102. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  103. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  104. package/dist/{filter-bar-chip-BAqmNIeE.js → filter-bar-chip-BarAq1S2.js} +2 -2
  105. package/dist/{filter-bar-chip-BAqmNIeE.js.map → filter-bar-chip-BarAq1S2.js.map} +1 -1
  106. package/dist/layout/tabbed-container.cjs.js +2 -2
  107. package/dist/layout/tabbed-container.es.js +2 -2
  108. package/dist/{logs-data-list-CoER2Hst.js → logs-data-list-DBJINzIL.js} +2 -3
  109. package/dist/{logs-data-list-CoER2Hst.js.map → logs-data-list-DBJINzIL.js.map} +1 -1
  110. package/dist/{logs-data-list-DRR6cMgl.cjs → logs-data-list-IWZgMCKG.cjs} +21 -22
  111. package/dist/{logs-data-list-DRR6cMgl.cjs.map → logs-data-list-IWZgMCKG.cjs.map} +1 -1
  112. package/dist/{metrics-stacked-bar-chart-BijHfnOd.cjs → metrics-stacked-bar-chart-BofJ8NDc.cjs} +45 -3
  113. package/dist/metrics-stacked-bar-chart-BofJ8NDc.cjs.map +1 -0
  114. package/dist/{metrics-stacked-bar-chart-CdcENBLD.js → metrics-stacked-bar-chart-DcxHznKw.js} +47 -5
  115. package/dist/metrics-stacked-bar-chart-DcxHznKw.js.map +1 -0
  116. package/dist/src/domains/traces/components/traces-list-view.d.ts +4 -0
  117. package/dist/src/domains/traces/trace-list-columns.d.ts +1 -1
  118. package/dist/src/ds/components/Combobox/combobox-parts.d.ts +102 -0
  119. package/dist/src/ds/components/Combobox/combobox.d.ts +17 -3
  120. package/dist/src/ds/components/Combobox/index.d.ts +1 -0
  121. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list-cells.d.ts +7 -0
  122. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +2 -1
  123. package/dist/src/ds/components/Meter/index.d.ts +2 -0
  124. package/dist/src/ds/components/Meter/meter-context.d.ts +6 -0
  125. package/dist/src/ds/components/Meter/meter-key-row.d.ts +6 -0
  126. package/dist/src/ds/components/Meter/meter-root.d.ts +14 -0
  127. package/dist/src/ds/components/Meter/meter-segment.d.ts +5 -0
  128. package/dist/src/ds/components/Meter/meter-source.d.ts +6 -0
  129. package/dist/src/ds/components/Meter/meter.d.ts +6 -0
  130. package/dist/src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.d.ts +1 -0
  131. package/dist/src/ds/components/Table/Table.d.ts +4 -2
  132. package/dist/style.css +196 -2
  133. package/dist/{traces-data-list-B0-fbEpk.cjs → traces-data-list-BH24OVKh.cjs} +23 -19
  134. package/dist/traces-data-list-BH24OVKh.cjs.map +1 -0
  135. package/dist/{traces-data-list-0GcqZUbe.js → traces-data-list-BOJB37dV.js} +8 -4
  136. package/dist/traces-data-list-BOJB37dV.js.map +1 -0
  137. package/package.json +10 -10
  138. package/dist/combobox-DlKD-Q3M.js +0 -208
  139. package/dist/combobox-DlKD-Q3M.js.map +0 -1
  140. package/dist/combobox-VHtZQcl9.cjs +0 -229
  141. package/dist/combobox-VHtZQcl9.cjs.map +0 -1
  142. package/dist/data-list-DUfXIhyC.cjs +0 -142
  143. package/dist/data-list-DUfXIhyC.cjs.map +0 -1
  144. package/dist/data-list-DXQY_iQW.js +0 -138
  145. package/dist/data-list-DXQY_iQW.js.map +0 -1
  146. package/dist/data-list-spacer-ByA4ce2a.js +0 -209
  147. package/dist/data-list-spacer-ByA4ce2a.js.map +0 -1
  148. package/dist/data-list-spacer-tQaBaum4.cjs +0 -218
  149. package/dist/data-list-spacer-tQaBaum4.cjs.map +0 -1
  150. package/dist/data-list-top-ByT2Mo77.cjs.map +0 -1
  151. package/dist/data-list-top-DSr_ocKA.js.map +0 -1
  152. package/dist/metrics-stacked-bar-chart-BijHfnOd.cjs.map +0 -1
  153. package/dist/metrics-stacked-bar-chart-CdcENBLD.js.map +0 -1
  154. package/dist/traces-data-list-0GcqZUbe.js.map +0 -1
  155. package/dist/traces-data-list-B0-fbEpk.cjs.map +0 -1
@@ -0,0 +1,676 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { Combobox as Combobox$1 } from '@base-ui/react/combobox';
3
+ import { X, ChevronsUpDown, Search, Check, ChevronDown } from 'lucide-react';
4
+ import * as React from 'react';
5
+ import { c as comboboxStyles, a as comboboxTriggerClass, b as comboboxItemClass } from './combobox-styles-Dr66ofEp.js';
6
+ import { i as isIconButtonSize, B as Button } from './Button-EGoajBQY.js';
7
+ import { S as ScrollArea, a as ScrollAreaViewport } from './scroll-area-MaMqo4l8.js';
8
+ import { FLOATING_POSITION_METHOD } from './primitives/floating.es.js';
9
+ import { useFluidMenu, FluidMenuItems, useFluidMenuItemRef } from './primitives/fluid-menu.es.js';
10
+ import { menuLabelClass, menuSeparatorClass } from './primitives/menu-item.es.js';
11
+ import { passwordManagerOptOutProps } from './primitives/password-manager-autofill.es.js';
12
+ import { usePortalContainer } from './primitives/portal-container.es.js';
13
+ import { c as cn } from './cn-CQUhN5Jx.js';
14
+ import { a as useFieldAriaIds, k as keepOwnAccessibleName } from './field-control-aria-DB6y41tQ.js';
15
+ import { F as FieldBlock, f as fieldErrorId } from './field-error-id-Sqhk00e4.js';
16
+ import { deprecatedErrorAria } from './primitives/form-element.es.js';
17
+
18
+ const FieldAnchorContext = React.createContext(void 0);
19
+ function ComboboxRoot(props) {
20
+ const [field, setField] = React.useState(null);
21
+ return /* @__PURE__ */ jsx(FieldAnchorContext.Provider, { value: { field: field ?? void 0, setField }, children: /* @__PURE__ */ jsx(Combobox$1.Root, { ...props }) });
22
+ }
23
+ const fieldClass = (size = "md") => cn(
24
+ comboboxTriggerClass({ variant: "default", size }),
25
+ // The Button recipe brightens icons on hover; a field's chevron stays muted.
26
+ "cursor-text gap-2 focus-within:[--surface-rim:var(--field-rim-focus)] not-disabled:hover:[&_svg]:text-muted-foreground",
27
+ // Disabled like other form elements (muted text, not-allowed cursor). Keyed off the input because
28
+ // Base UI marks the input group, not the chips field, with `data-disabled`.
29
+ "has-[input:disabled]:cursor-not-allowed has-[input:disabled]:bg-field-disabled has-[input:disabled]:[&_*]:cursor-not-allowed has-[input:disabled]:[&_*]:text-muted-foreground",
30
+ // The input inside carries `aria-invalid`; the field shows it like other invalid fields.
31
+ "has-[[aria-invalid=true]]:[--field-rim-focus:var(--destructive-indicator)] has-[[aria-invalid=true]]:[--field-rim:var(--destructive-indicator)]"
32
+ );
33
+ const fieldPx = "0.9em";
34
+ const fieldStyle = {
35
+ paddingInlineStart: fieldPx,
36
+ paddingInlineEnd: `calc(${fieldPx} - 6.33px)`
37
+ };
38
+ const chipsFieldStyle = {
39
+ // Longhands only: a `padding` shorthand here would also reset the chevron's end padding.
40
+ paddingBlock: "4px",
41
+ paddingInlineStart: "4px",
42
+ paddingInlineEnd: fieldStyle.paddingInlineEnd
43
+ };
44
+ const inputClass = "h-full w-0 min-w-0 flex-1 bg-transparent text-foreground outline-none placeholder:text-muted-foreground";
45
+ function moveCaretToEnd(event) {
46
+ const input = event.currentTarget;
47
+ requestAnimationFrame(() => input.setSelectionRange(input.value.length, input.value.length));
48
+ }
49
+ function ComboboxValue(props) {
50
+ return /* @__PURE__ */ jsx(Combobox$1.Value, { "data-slot": "combobox-value", ...props });
51
+ }
52
+ function ComboboxFieldTrigger() {
53
+ return /* @__PURE__ */ jsx(
54
+ Combobox$1.Trigger,
55
+ {
56
+ "data-slot": "combobox-field-trigger",
57
+ "aria-label": "Show options",
58
+ className: "flex size-5.5 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground not-data-disabled:hover:bg-fill",
59
+ children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-4" })
60
+ }
61
+ );
62
+ }
63
+ function ComboboxTrigger({
64
+ className,
65
+ children,
66
+ variant = "default",
67
+ size = "md",
68
+ icon,
69
+ showChevron = !(icon && isIconButtonSize(size)),
70
+ ...props
71
+ }) {
72
+ const iconOnly = isIconButtonSize(size);
73
+ return /* @__PURE__ */ jsxs(
74
+ Combobox$1.Trigger,
75
+ {
76
+ "data-slot": "combobox-trigger",
77
+ "data-shape": iconOnly ? "icon" : void 0,
78
+ className: comboboxTriggerClass({ variant, size, className }),
79
+ ...props,
80
+ children: [
81
+ iconOnly ? /* @__PURE__ */ jsxs(Fragment, { children: [
82
+ icon,
83
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children })
84
+ ] }) : /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
85
+ icon,
86
+ /* @__PURE__ */ jsx("span", { className: "truncate", children })
87
+ ] }),
88
+ showChevron ? /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center", children: /* @__PURE__ */ jsx(ChevronsUpDown, { className: cn(comboboxStyles.chevron, iconOnly && "ml-0") }) }) : null
89
+ ]
90
+ }
91
+ );
92
+ }
93
+ function ComboboxClear({ className, ...props }) {
94
+ return /* @__PURE__ */ jsx(
95
+ Combobox$1.Clear,
96
+ {
97
+ "data-slot": "combobox-clear",
98
+ "aria-label": "Clear",
99
+ className: cn(
100
+ "flex size-4 shrink-0 items-center justify-center rounded-full text-muted-foreground hover:text-foreground",
101
+ className
102
+ ),
103
+ ...props,
104
+ children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
105
+ }
106
+ );
107
+ }
108
+ function ComboboxInput({
109
+ className,
110
+ children,
111
+ showTrigger = true,
112
+ showClear = false,
113
+ size,
114
+ start,
115
+ onFocus,
116
+ ...props
117
+ }) {
118
+ const anchor = React.useContext(FieldAnchorContext);
119
+ return /* @__PURE__ */ jsxs(
120
+ Combobox$1.InputGroup,
121
+ {
122
+ ref: anchor?.setField,
123
+ "data-slot": "combobox-input",
124
+ className: cn(fieldClass(size), className),
125
+ style: fieldStyle,
126
+ children: [
127
+ start ? /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center", children: start }) : null,
128
+ /* @__PURE__ */ jsx(
129
+ Combobox$1.Input,
130
+ {
131
+ onFocus: (event) => {
132
+ moveCaretToEnd(event);
133
+ onFocus?.(event);
134
+ },
135
+ className: inputClass,
136
+ ...passwordManagerOptOutProps,
137
+ ...props
138
+ }
139
+ ),
140
+ children ? /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center gap-2 text-muted-foreground", children }) : null,
141
+ showClear ? /* @__PURE__ */ jsx(ComboboxClear, {}) : null,
142
+ showTrigger ? /* @__PURE__ */ jsx(ComboboxFieldTrigger, {}) : null
143
+ ]
144
+ }
145
+ );
146
+ }
147
+ function ComboboxSearch({ className, ...props }) {
148
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "combobox-search", className: comboboxStyles.searchContainer, children: [
149
+ /* @__PURE__ */ jsx(Search, { className: comboboxStyles.searchIcon }),
150
+ /* @__PURE__ */ jsx(
151
+ Combobox$1.Input,
152
+ {
153
+ className: cn(comboboxStyles.searchInput, className),
154
+ ...passwordManagerOptOutProps,
155
+ ...props
156
+ }
157
+ )
158
+ ] });
159
+ }
160
+ function ComboboxContent({
161
+ className,
162
+ side = "bottom",
163
+ sideOffset = 4,
164
+ align = "start",
165
+ alignOffset = 0,
166
+ anchor,
167
+ container,
168
+ ...props
169
+ }) {
170
+ const field = React.useContext(FieldAnchorContext)?.field;
171
+ const resolvedContainer = usePortalContainer(container);
172
+ return /* @__PURE__ */ jsx(Combobox$1.Portal, { container: resolvedContainer, children: /* @__PURE__ */ jsx(
173
+ Combobox$1.Positioner,
174
+ {
175
+ side,
176
+ sideOffset,
177
+ align,
178
+ alignOffset,
179
+ anchor: anchor ?? field,
180
+ positionMethod: FLOATING_POSITION_METHOD,
181
+ className: comboboxStyles.positioner,
182
+ children: /* @__PURE__ */ jsx(
183
+ Combobox$1.Popup,
184
+ {
185
+ "data-slot": "combobox-content",
186
+ className: cn(
187
+ comboboxStyles.popup,
188
+ field ? "w-(--anchor-width)" : "w-[max(11rem,var(--anchor-width))]",
189
+ className
190
+ ),
191
+ ...props
192
+ }
193
+ )
194
+ }
195
+ ) });
196
+ }
197
+ function ComboboxList({ className, ...props }) {
198
+ const menu = useFluidMenu();
199
+ return /* @__PURE__ */ jsx(ScrollArea, { maxHeight: "var(--spacing-dropdown)", children: /* @__PURE__ */ jsx(ScrollAreaViewport, { className: "scroll-py-8", children: /* @__PURE__ */ jsx("div", { className: menu.containerClassName, ...menu.getContainerProps({}), children: /* @__PURE__ */ jsx(FluidMenuItems, { menu, children: /* @__PURE__ */ jsx(Combobox$1.List, { "data-slot": "combobox-list", className: cn(comboboxStyles.list, className), ...props }) }) }) }) });
200
+ }
201
+ function ComboboxItem({ className, children, ref, ...props }) {
202
+ return /* @__PURE__ */ jsxs(
203
+ Combobox$1.Item,
204
+ {
205
+ ref: useFluidMenuItemRef(ref),
206
+ "data-slot": "combobox-item",
207
+ className: cn(comboboxItemClass({}), className),
208
+ ...props,
209
+ children: [
210
+ /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 items-center gap-2", children }),
211
+ /* @__PURE__ */ jsx("span", { className: comboboxStyles.checkContainer, children: /* @__PURE__ */ jsx(Combobox$1.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: comboboxStyles.checkIcon }) }) })
212
+ ]
213
+ }
214
+ );
215
+ }
216
+ function ComboboxItemContent({ className, ...props }) {
217
+ return /* @__PURE__ */ jsx("span", { "data-slot": "combobox-item-content", className: cn("flex min-w-0 flex-col gap-0.5", className), ...props });
218
+ }
219
+ function ComboboxItemTitle({ className, ...props }) {
220
+ return /* @__PURE__ */ jsx("span", { "data-slot": "combobox-item-title", className: cn("truncate", className), ...props });
221
+ }
222
+ function ComboboxItemDescription({ className, ...props }) {
223
+ return /* @__PURE__ */ jsx(
224
+ "span",
225
+ {
226
+ "data-slot": "combobox-item-description",
227
+ className: cn("line-clamp-2 text-caption whitespace-normal text-muted-foreground", className),
228
+ ...props
229
+ }
230
+ );
231
+ }
232
+ function ComboboxItemEnd({ className, ...props }) {
233
+ return /* @__PURE__ */ jsx(
234
+ "span",
235
+ {
236
+ "data-slot": "combobox-item-end",
237
+ className: cn("ml-auto shrink-0 text-caption text-muted-foreground", className),
238
+ ...props
239
+ }
240
+ );
241
+ }
242
+ function ComboboxGroup(props) {
243
+ return /* @__PURE__ */ jsx(Combobox$1.Group, { "data-slot": "combobox-group", ...props });
244
+ }
245
+ function ComboboxLabel({ className, ...props }) {
246
+ return /* @__PURE__ */ jsx(Combobox$1.GroupLabel, { "data-slot": "combobox-label", className: cn(menuLabelClass, className), ...props });
247
+ }
248
+ function ComboboxCollection(props) {
249
+ return /* @__PURE__ */ jsx(Combobox$1.Collection, { "data-slot": "combobox-collection", ...props });
250
+ }
251
+ function ComboboxEmpty({ className, ...props }) {
252
+ return /* @__PURE__ */ jsx(Combobox$1.Empty, { "data-slot": "combobox-empty", className: cn(comboboxStyles.empty, className), ...props });
253
+ }
254
+ function ComboboxSeparator({ className, ...props }) {
255
+ return /* @__PURE__ */ jsx(Combobox$1.Separator, { "data-slot": "combobox-separator", className: cn(menuSeparatorClass, className), ...props });
256
+ }
257
+ function ComboboxChips({ className, children, ...props }) {
258
+ const anchor = React.useContext(FieldAnchorContext);
259
+ const field = anchor?.field;
260
+ const [multiline, setMultiline] = React.useState(false);
261
+ React.useLayoutEffect(() => {
262
+ if (!field || typeof ResizeObserver === "undefined") return;
263
+ const rowHeight = parseFloat(getComputedStyle(field).minHeight) || 0;
264
+ const observer = new ResizeObserver(() => setMultiline(field.offsetHeight > rowHeight + 1));
265
+ observer.observe(field);
266
+ return () => observer.disconnect();
267
+ }, [field]);
268
+ return /* @__PURE__ */ jsxs(
269
+ Combobox$1.Chips,
270
+ {
271
+ ref: anchor?.setField,
272
+ "data-slot": "combobox-chips",
273
+ "data-multiline": multiline ? "" : void 0,
274
+ style: chipsFieldStyle,
275
+ className: cn(fieldClass(), "h-auto min-h-control-md items-start data-multiline:rounded-xl", className),
276
+ ...props,
277
+ children: [
278
+ /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 flex-wrap gap-[3px]", children }),
279
+ /* @__PURE__ */ jsx("span", { className: "flex h-5.5 shrink-0 items-center", children: /* @__PURE__ */ jsx(ComboboxFieldTrigger, {}) })
280
+ ]
281
+ }
282
+ );
283
+ }
284
+ function ComboboxChip({
285
+ className,
286
+ children,
287
+ showRemove = true,
288
+ ...props
289
+ }) {
290
+ return /* @__PURE__ */ jsxs(
291
+ Combobox$1.Chip,
292
+ {
293
+ "data-slot": "combobox-chip",
294
+ className: cn(
295
+ // 8px from the left edge to the text, 6px from the text to the ×'s ink, 8px from the ink to
296
+ // the right edge. Text in the controls' role (`text-label`), like the field value.
297
+ "flex h-5.5 items-center rounded-full bg-fill pl-2 text-label text-foreground",
298
+ !showRemove && "pr-2",
299
+ className
300
+ ),
301
+ ...props,
302
+ children: [
303
+ children,
304
+ showRemove ? /* @__PURE__ */ jsx(
305
+ Combobox$1.ChipRemove,
306
+ {
307
+ "data-slot": "combobox-chip-remove",
308
+ "aria-label": typeof children === "string" ? `Remove ${children}` : "Remove",
309
+ className: "flex h-full cursor-pointer items-center rounded-r-full pr-[5.5px] pl-[3.5px] text-muted-foreground not-data-disabled:hover:text-foreground",
310
+ children: /* @__PURE__ */ jsx(X, { className: "size-3", style: { color: "inherit" } })
311
+ }
312
+ ) : null
313
+ ]
314
+ }
315
+ );
316
+ }
317
+ function ComboboxChipsInput({ className, onFocus, ...props }) {
318
+ return /* @__PURE__ */ jsx(
319
+ Combobox$1.Input,
320
+ {
321
+ "data-slot": "combobox-chip-input",
322
+ onFocus: (event) => {
323
+ moveCaretToEnd(event);
324
+ onFocus?.(event);
325
+ },
326
+ className: cn(
327
+ inputClass,
328
+ // Text lines up with other fields' text when there are no chips; 4px after a chip otherwise.
329
+ // Not `first:`: Base UI inserts a hidden Dismiss element before the input while open.
330
+ "h-5.5 w-0 min-w-12 flex-1 pl-[calc(0.9em_-_4px)] [[data-slot=combobox-chip]~&]:pl-1",
331
+ className
332
+ ),
333
+ ...passwordManagerOptOutProps,
334
+ ...props
335
+ }
336
+ );
337
+ }
338
+
339
+ const EMPTY_VALUES = [];
340
+ function isMultipleCombobox(props) {
341
+ return props.multiple === true;
342
+ }
343
+ function optionText(option) {
344
+ return typeof option.displayLabel === "string" ? option.displayLabel : option.label;
345
+ }
346
+ function textPlaceholder(placeholder) {
347
+ return typeof placeholder === "string" ? placeholder : void 0;
348
+ }
349
+ function getComboboxShape({
350
+ inFieldContext,
351
+ multiple,
352
+ variant,
353
+ size,
354
+ iconOnlyValue,
355
+ showChevron,
356
+ placeholder
357
+ }) {
358
+ if (!inFieldContext) return "trigger";
359
+ if (variant !== "default") return "trigger";
360
+ if (isIconButtonSize(size)) return "trigger";
361
+ if (iconOnlyValue || !showChevron) return "trigger";
362
+ if (placeholder !== void 0 && textPlaceholder(placeholder) === void 0) return "trigger";
363
+ if (!multiple) return "field";
364
+ if (size !== "md") return "trigger";
365
+ return "chips";
366
+ }
367
+ function getCustomOption(options, inputValue) {
368
+ const value = inputValue.trim();
369
+ if (!value) return void 0;
370
+ if (options.some((option) => option.value === value || optionText(option) === value)) return void 0;
371
+ return { label: `Use “${value}”`, value };
372
+ }
373
+ function useOptionFilter() {
374
+ const { contains } = Combobox$1.useFilter();
375
+ return (option, query) => [option.label, optionText(option), ...option.keywords ?? []].some((text) => contains(text, query));
376
+ }
377
+ function getFallbackAriaLabel({ hasLabel, multiple }) {
378
+ if (hasLabel) return void 0;
379
+ return multiple ? "Select options" : "Select option";
380
+ }
381
+ function getControlProps({
382
+ id,
383
+ ariaLabel,
384
+ ariaDescribedBy,
385
+ hasLabel,
386
+ multiple,
387
+ error,
388
+ errorName
389
+ }) {
390
+ const describedBy = [ariaDescribedBy, error ? fieldErrorId(errorName) : void 0].filter(Boolean).join(" ");
391
+ return {
392
+ id,
393
+ "aria-label": ariaLabel ?? getFallbackAriaLabel({ hasLabel, multiple }),
394
+ ...keepOwnAccessibleName({ "aria-label": ariaLabel }),
395
+ ...deprecatedErrorAria(Boolean(error)),
396
+ "aria-describedby": describedBy || void 0
397
+ };
398
+ }
399
+ function triggerClassName({ iconOnlyValue, className }) {
400
+ return cn(iconOnlyValue && "w-auto px-2.5", className);
401
+ }
402
+ function ComboboxOptionText({ option }) {
403
+ return /* @__PURE__ */ jsxs("span", { className: comboboxStyles.optionText, children: [
404
+ /* @__PURE__ */ jsx("span", { className: comboboxStyles.optionLabel, children: option.label }),
405
+ option.description && /* @__PURE__ */ jsx("span", { className: comboboxStyles.optionDescription, children: option.description })
406
+ ] });
407
+ }
408
+ function ComboboxClearFooter({ label, onClear }) {
409
+ return /* @__PURE__ */ jsx("div", { className: "border-t border-border p-1", children: /* @__PURE__ */ jsx(
410
+ Button,
411
+ {
412
+ type: "button",
413
+ variant: "destructive-ghost",
414
+ size: "sm",
415
+ className: "w-full justify-start",
416
+ onClick: onClear,
417
+ icon: /* @__PURE__ */ jsx(X, {}),
418
+ children: label
419
+ }
420
+ ) });
421
+ }
422
+ function ComboboxOptionsContent({
423
+ showSearch,
424
+ searchPlaceholder,
425
+ emptyText,
426
+ align,
427
+ container,
428
+ footer
429
+ }) {
430
+ return /* @__PURE__ */ jsxs(ComboboxContent, { align, container, children: [
431
+ showSearch ? /* @__PURE__ */ jsx(ComboboxSearch, { placeholder: searchPlaceholder }) : null,
432
+ /* @__PURE__ */ jsx(ComboboxEmpty, { children: emptyText }),
433
+ /* @__PURE__ */ jsx(ComboboxList, { children: (option) => /* @__PURE__ */ jsxs(ComboboxItem, { value: option, children: [
434
+ option.start,
435
+ /* @__PURE__ */ jsx(ComboboxOptionText, { option }),
436
+ option.end ? /* @__PURE__ */ jsx("span", { className: comboboxStyles.optionEnd, children: option.end }) : null
437
+ ] }, option.value) }),
438
+ footer
439
+ ] });
440
+ }
441
+ function SingleComboboxControl({
442
+ shape,
443
+ controlProps,
444
+ placeholder,
445
+ selectedOption,
446
+ look
447
+ }) {
448
+ if (shape === "field") {
449
+ return /* @__PURE__ */ jsx(
450
+ ComboboxInput,
451
+ {
452
+ ...controlProps,
453
+ size: isIconButtonSize(look.size) ? void 0 : look.size,
454
+ placeholder: textPlaceholder(placeholder),
455
+ start: selectedOption?.start,
456
+ className: look.className
457
+ }
458
+ );
459
+ }
460
+ return /* @__PURE__ */ jsx(
461
+ ComboboxTrigger,
462
+ {
463
+ ...controlProps,
464
+ variant: look.variant,
465
+ size: look.size,
466
+ showChevron: look.showChevron,
467
+ icon: isIconButtonSize(look.size) ? void 0 : selectedOption?.start,
468
+ className: triggerClassName(look),
469
+ children: selectedOption?.displayLabel ?? /* @__PURE__ */ jsx(ComboboxValue, { placeholder })
470
+ }
471
+ );
472
+ }
473
+ function MultipleComboboxControl({
474
+ shape,
475
+ controlProps,
476
+ placeholder,
477
+ selectedCount,
478
+ look
479
+ }) {
480
+ if (shape === "chips") {
481
+ return /* @__PURE__ */ jsx(ComboboxChips, { className: look.className, children: /* @__PURE__ */ jsx(ComboboxValue, { children: (items) => /* @__PURE__ */ jsxs(Fragment, { children: [
482
+ items.map((item) => /* @__PURE__ */ jsx(ComboboxChip, { children: item.label }, item.value)),
483
+ /* @__PURE__ */ jsx(
484
+ ComboboxChipsInput,
485
+ {
486
+ ...controlProps,
487
+ placeholder: items.length === 0 ? textPlaceholder(placeholder) : void 0
488
+ }
489
+ )
490
+ ] }) }) });
491
+ }
492
+ const text = selectedCount === 0 ? placeholder : `${selectedCount} selected`;
493
+ return /* @__PURE__ */ jsx(
494
+ ComboboxTrigger,
495
+ {
496
+ ...controlProps,
497
+ variant: look.variant,
498
+ size: look.size,
499
+ showChevron: look.showChevron,
500
+ className: triggerClassName(look),
501
+ children: /* @__PURE__ */ jsx("span", { className: cn(selectedCount === 0 && comboboxStyles.placeholder), children: text })
502
+ }
503
+ );
504
+ }
505
+ function SingleCombobox({
506
+ shape,
507
+ controlProps,
508
+ options,
509
+ value,
510
+ onValueChange,
511
+ placeholder = "Select option...",
512
+ searchPlaceholder = "Search...",
513
+ emptyText = "No option found.",
514
+ className,
515
+ disabled = false,
516
+ variant = "default",
517
+ size = "md",
518
+ open,
519
+ onOpenChange,
520
+ container,
521
+ align = "start",
522
+ showChevron = true,
523
+ iconOnlyValue = false,
524
+ allowCustomValue = false,
525
+ onInputValueChange
526
+ }) {
527
+ const [inputValue, setInputValue] = React.useState("");
528
+ const filter = useOptionFilter();
529
+ const inField = shape === "field";
530
+ const selectedOption = options.find((option) => option.value === value);
531
+ const customOption = allowCustomValue ? getCustomOption(options, inputValue) : void 0;
532
+ const items = customOption ? [customOption, ...options] : options;
533
+ function handleInputValueChange(next) {
534
+ setInputValue(next);
535
+ onInputValueChange?.(next);
536
+ }
537
+ function handleValueChange(item) {
538
+ if (!item) return;
539
+ onValueChange?.(item.value);
540
+ if (!inField) handleInputValueChange("");
541
+ }
542
+ return /* @__PURE__ */ jsxs(
543
+ ComboboxRoot,
544
+ {
545
+ autoHighlight: true,
546
+ items,
547
+ filter,
548
+ itemToStringLabel: optionText,
549
+ value: selectedOption ?? null,
550
+ inputValue: inField ? void 0 : inputValue,
551
+ onInputValueChange: handleInputValueChange,
552
+ onValueChange: handleValueChange,
553
+ disabled,
554
+ open,
555
+ onOpenChange,
556
+ children: [
557
+ /* @__PURE__ */ jsx(
558
+ SingleComboboxControl,
559
+ {
560
+ shape,
561
+ controlProps,
562
+ placeholder,
563
+ selectedOption,
564
+ look: { variant, size, showChevron, iconOnlyValue, className }
565
+ }
566
+ ),
567
+ /* @__PURE__ */ jsx(
568
+ ComboboxOptionsContent,
569
+ {
570
+ showSearch: !inField,
571
+ searchPlaceholder,
572
+ emptyText,
573
+ align,
574
+ container
575
+ }
576
+ )
577
+ ]
578
+ }
579
+ );
580
+ }
581
+ function MultipleCombobox({
582
+ shape,
583
+ controlProps,
584
+ options,
585
+ value = EMPTY_VALUES,
586
+ onValueChange,
587
+ clearLabel,
588
+ placeholder = "Select options...",
589
+ searchPlaceholder = "Search...",
590
+ emptyText = "No option found.",
591
+ className,
592
+ disabled = false,
593
+ variant = "default",
594
+ size = "md",
595
+ open,
596
+ onOpenChange,
597
+ container,
598
+ align = "start",
599
+ showChevron = true,
600
+ iconOnlyValue = false
601
+ }) {
602
+ const filter = useOptionFilter();
603
+ const selectedValues = new Set(value);
604
+ const selectedOptions = options.filter((option) => selectedValues.has(option.value));
605
+ const footer = clearLabel && selectedOptions.length > 0 ? /* @__PURE__ */ jsx(ComboboxClearFooter, { label: clearLabel, onClear: () => onValueChange?.([]) }) : void 0;
606
+ return /* @__PURE__ */ jsxs(
607
+ ComboboxRoot,
608
+ {
609
+ multiple: true,
610
+ autoHighlight: true,
611
+ items: options,
612
+ filter,
613
+ value: selectedOptions,
614
+ onValueChange: (items) => onValueChange?.(items.map((item) => item.value)),
615
+ disabled,
616
+ open,
617
+ onOpenChange,
618
+ children: [
619
+ /* @__PURE__ */ jsx(
620
+ MultipleComboboxControl,
621
+ {
622
+ shape,
623
+ controlProps,
624
+ placeholder,
625
+ selectedCount: selectedOptions.length,
626
+ look: { variant, size, showChevron, iconOnlyValue, className }
627
+ }
628
+ ),
629
+ /* @__PURE__ */ jsx(
630
+ ComboboxOptionsContent,
631
+ {
632
+ showSearch: shape !== "chips",
633
+ searchPlaceholder,
634
+ emptyText,
635
+ align,
636
+ container,
637
+ footer
638
+ }
639
+ )
640
+ ]
641
+ }
642
+ );
643
+ }
644
+ function Combobox(props) {
645
+ const field = useFieldAriaIds();
646
+ const generatedName = React.useId();
647
+ const multiple = isMultipleCombobox(props);
648
+ const shape = getComboboxShape({
649
+ inFieldContext: Boolean(field),
650
+ multiple,
651
+ variant: props.variant ?? "default",
652
+ size: props.size ?? "md",
653
+ iconOnlyValue: props.iconOnlyValue ?? false,
654
+ showChevron: props.showChevron ?? true,
655
+ placeholder: props.placeholder
656
+ });
657
+ const errorName = props.name ?? generatedName;
658
+ const controlProps = getControlProps({
659
+ id: props.id,
660
+ ariaLabel: props["aria-label"],
661
+ ariaDescribedBy: props["aria-describedby"],
662
+ hasLabel: Boolean(props.id || field),
663
+ multiple,
664
+ error: props.error,
665
+ errorName
666
+ });
667
+ const root = isMultipleCombobox(props) ? /* @__PURE__ */ jsx(MultipleCombobox, { ...props, shape, controlProps }) : /* @__PURE__ */ jsx(SingleCombobox, { ...props, shape, controlProps });
668
+ if (!props.error) return root;
669
+ return /* @__PURE__ */ jsxs("div", { className: comboboxStyles.root, children: [
670
+ root,
671
+ /* @__PURE__ */ jsx(FieldBlock.ErrorMsg, { name: errorName, children: props.error })
672
+ ] });
673
+ }
674
+
675
+ export { Combobox as C, ComboboxChip as a, ComboboxChips as b, ComboboxChipsInput as c, ComboboxClear as d, ComboboxCollection as e, ComboboxContent as f, ComboboxEmpty as g, ComboboxGroup as h, ComboboxInput as i, ComboboxItem as j, ComboboxItemContent as k, ComboboxItemDescription as l, ComboboxItemEnd as m, ComboboxItemTitle as n, ComboboxLabel as o, ComboboxList as p, ComboboxRoot as q, ComboboxSearch as r, ComboboxSeparator as s, ComboboxTrigger as t, ComboboxValue as u };
676
+ //# sourceMappingURL=combobox-Bw13EcK0.js.map