@mastra/playground-ui 35.0.0 → 35.1.0-alpha.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.
- package/CHANGELOG.md +77 -0
- package/dist/{code-block-C4Zp_ewI.cjs → code-block-BPI6hA9o.cjs} +2 -2
- package/dist/{code-block-C4Zp_ewI.cjs.map → code-block-BPI6hA9o.cjs.map} +1 -1
- package/dist/{code-block-CnRVTecy.js → code-block-BdjHwqE4.js} +2 -2
- package/dist/{code-block-CnRVTecy.js.map → code-block-BdjHwqE4.js.map} +1 -1
- package/dist/{code-editor-DuX_CPRv.js → code-editor-CxHGOvdY.js} +3 -3
- package/dist/{code-editor-DuX_CPRv.js.map → code-editor-CxHGOvdY.js.map} +1 -1
- package/dist/{code-editor-LhRB_wMh.cjs → code-editor-DVWPuq12.cjs} +3 -3
- package/dist/{code-editor-LhRB_wMh.cjs.map → code-editor-DVWPuq12.cjs.map} +1 -1
- package/dist/combobox-DQdRtI_v.cjs +245 -0
- package/dist/combobox-DQdRtI_v.cjs.map +1 -0
- package/dist/combobox-DvRTz5eL.js +223 -0
- package/dist/combobox-DvRTz5eL.js.map +1 -0
- package/dist/{command-DPEUOKZw.js → command-CkFCH229.js} +86 -43
- package/dist/command-CkFCH229.js.map +1 -0
- package/dist/{command-D0tQ1Lpz.cjs → command-EI7t_0WS.cjs} +86 -43
- package/dist/command-EI7t_0WS.cjs.map +1 -0
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/Columns.cjs.js +1 -1
- package/dist/components/Columns.es.js +1 -1
- package/dist/components/Combobox.cjs.js +2 -4
- package/dist/components/Combobox.cjs.js.map +1 -1
- package/dist/components/Combobox.es.js +1 -2
- package/dist/components/Combobox.es.js.map +1 -1
- package/dist/components/Command.cjs.js +1 -1
- package/dist/components/Command.es.js +1 -1
- package/dist/components/CopyButton.cjs.js +1 -1
- package/dist/components/CopyButton.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataDetailsPanel.cjs.js +1 -1
- package/dist/components/DataDetailsPanel.es.js +1 -1
- package/dist/components/DataKeysAndValues.cjs.js +1 -1
- package/dist/components/DataKeysAndValues.es.js +1 -1
- package/dist/components/DataList.cjs.js +2 -2
- package/dist/components/DataList.es.js +2 -2
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/Dialog.cjs.js +1 -1
- package/dist/components/Dialog.es.js +1 -1
- package/dist/components/HorizontalBars.cjs.js +1 -1
- package/dist/components/HorizontalBars.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MainSidebar.cjs.js +1 -1
- package/dist/components/MainSidebar.es.js +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MetricsDataTable.cjs.js +1 -1
- package/dist/components/MetricsDataTable.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/components/ScrollArea.cjs.js +1 -1
- package/dist/components/ScrollArea.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +1 -1
- package/dist/components/SideDialog.es.js +1 -1
- package/dist/components/Truncate.cjs.js +1 -1
- package/dist/components/Truncate.es.js +1 -1
- package/dist/{copy-button-BfiqaCtC.js → copy-button-RffVknBA.js} +2 -2
- package/dist/{copy-button-BfiqaCtC.js.map → copy-button-RffVknBA.js.map} +1 -1
- package/dist/{copy-button-BaAuAgdC.cjs → copy-button-ler9dH8g.cjs} +3 -3
- package/dist/{copy-button-BaAuAgdC.cjs.map → copy-button-ler9dH8g.cjs.map} +1 -1
- package/dist/{data-code-section-MygZlpwo.js → data-code-section-BBBffVVs.js} +3 -3
- package/dist/{data-code-section-MygZlpwo.js.map → data-code-section-BBBffVVs.js.map} +1 -1
- package/dist/{data-code-section-BtFzBCox.cjs → data-code-section-ChVXPz-i.cjs} +3 -3
- package/dist/{data-code-section-BtFzBCox.cjs.map → data-code-section-ChVXPz-i.cjs.map} +1 -1
- package/dist/{data-keys-and-values-BSeQG7jb.js → data-keys-and-values-C3pzr_d1.js} +2 -2
- package/dist/{data-keys-and-values-BSeQG7jb.js.map → data-keys-and-values-C3pzr_d1.js.map} +1 -1
- package/dist/{data-keys-and-values-Spy2O_IE.cjs → data-keys-and-values-KIwfkmc7.cjs} +3 -3
- package/dist/{data-keys-and-values-Spy2O_IE.cjs.map → data-keys-and-values-KIwfkmc7.cjs.map} +1 -1
- package/dist/{data-list-skeleton-COjCBzBF.cjs → data-list-skeleton-BlOwAki1.cjs} +5 -15
- package/dist/data-list-skeleton-BlOwAki1.cjs.map +1 -0
- package/dist/{data-list-skeleton-DmAqHgws.js → data-list-skeleton-DD7ljjgS.js} +5 -15
- package/dist/data-list-skeleton-DD7ljjgS.js.map +1 -0
- package/dist/{data-panel-DToYF7cH.cjs → data-panel-DBxE_3ux.cjs} +2 -2
- package/dist/{data-panel-DToYF7cH.cjs.map → data-panel-DBxE_3ux.cjs.map} +1 -1
- package/dist/{data-panel-DumaHQiP.js → data-panel-DPVF9Yok.js} +2 -2
- package/dist/{data-panel-DumaHQiP.js.map → data-panel-DPVF9Yok.js.map} +1 -1
- package/dist/{dialog-46zkb32X.cjs → dialog-C0gOGKEK.cjs} +31 -29
- package/dist/dialog-C0gOGKEK.cjs.map +1 -0
- package/dist/{dialog-CSSfcjSX.js → dialog-DTLHod4X.js} +31 -29
- package/dist/dialog-DTLHod4X.js.map +1 -0
- package/dist/dialog.css +2 -2
- package/dist/hooks/use-autoscroll.cjs.js +110 -0
- package/dist/hooks/use-autoscroll.cjs.js.map +1 -0
- package/dist/hooks/use-autoscroll.d.ts +2 -0
- package/dist/hooks/use-autoscroll.es.js +106 -0
- package/dist/hooks/use-autoscroll.es.js.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.cjs.js +11 -0
- package/dist/hooks/use-copy-to-clipboard.cjs.js.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.d.ts +2 -0
- package/dist/hooks/use-copy-to-clipboard.es.js +3 -0
- package/dist/hooks/use-copy-to-clipboard.es.js.map +1 -0
- package/dist/hooks/use-in-view.cjs.js +22 -0
- package/dist/hooks/use-in-view.cjs.js.map +1 -0
- package/dist/hooks/use-in-view.d.ts +2 -0
- package/dist/hooks/use-in-view.es.js +18 -0
- package/dist/hooks/use-in-view.es.js.map +1 -0
- package/dist/hooks/use-is-mobile.cjs.js +21 -0
- package/dist/hooks/use-is-mobile.cjs.js.map +1 -0
- package/dist/hooks/use-is-mobile.d.ts +2 -0
- package/dist/hooks/use-is-mobile.es.js +17 -0
- package/dist/hooks/use-is-mobile.es.js.map +1 -0
- package/dist/hooks/use-keyboard-shortcut-label.cjs.js +29 -0
- package/dist/hooks/use-keyboard-shortcut-label.cjs.js.map +1 -0
- package/dist/hooks/use-keyboard-shortcut-label.d.ts +2 -0
- package/dist/hooks/use-keyboard-shortcut-label.es.js +24 -0
- package/dist/hooks/use-keyboard-shortcut-label.es.js.map +1 -0
- package/dist/{horizontal-bars-DjLETHvH.js → horizontal-bars-r1aEIHUc.js} +2 -2
- package/dist/{horizontal-bars-DjLETHvH.js.map → horizontal-bars-r1aEIHUc.js.map} +1 -1
- package/dist/{horizontal-bars-C9qp4r47.cjs → horizontal-bars-uPFpgihX.cjs} +2 -2
- package/dist/{horizontal-bars-C9qp4r47.cjs.map → horizontal-bars-uPFpgihX.cjs.map} +1 -1
- package/dist/index.cjs.js +88 -79
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.css +55 -30
- package/dist/index.es.js +72 -69
- package/dist/index.es.js.map +1 -1
- package/dist/{logs-data-list-kzBMv1MW.cjs → logs-data-list-3qmFjBz8.cjs} +2 -2
- package/dist/{logs-data-list-kzBMv1MW.cjs.map → logs-data-list-3qmFjBz8.cjs.map} +1 -1
- package/dist/{logs-data-list-Bkf7oWlx.js → logs-data-list-Dh6c7URj.js} +2 -2
- package/dist/{logs-data-list-Bkf7oWlx.js.map → logs-data-list-Dh6c7URj.js.map} +1 -1
- package/dist/{main-sidebar-Djs_3tGw.cjs → main-sidebar-ByHmwU4R.cjs} +6 -5
- package/dist/main-sidebar-ByHmwU4R.cjs.map +1 -0
- package/dist/{main-sidebar-1GVDTtcD.js → main-sidebar-DJSorgYQ.js} +6 -5
- package/dist/main-sidebar-DJSorgYQ.js.map +1 -0
- package/dist/{markdown-renderer-DyUlVfRt.cjs → markdown-renderer-Dyg_1QXx.cjs} +2 -2
- package/dist/{markdown-renderer-DyUlVfRt.cjs.map → markdown-renderer-Dyg_1QXx.cjs.map} +1 -1
- package/dist/{markdown-renderer-BYSrmn0E.js → markdown-renderer-QftQuP4g.js} +2 -2
- package/dist/{markdown-renderer-BYSrmn0E.js.map → markdown-renderer-QftQuP4g.js.map} +1 -1
- package/dist/{metrics-data-table-D7vx2WEJ.cjs → metrics-data-table-AjAA-dqH.cjs} +2 -2
- package/dist/{metrics-data-table-D7vx2WEJ.cjs.map → metrics-data-table-AjAA-dqH.cjs.map} +1 -1
- package/dist/{metrics-data-table-DryqJWoI.js → metrics-data-table-hSmtDNck.js} +2 -2
- package/dist/{metrics-data-table-DryqJWoI.js.map → metrics-data-table-hSmtDNck.js.map} +1 -1
- package/dist/{multi-column-BzL86JPK.cjs → multi-column-BbVNPvhh.cjs} +2 -2
- package/dist/{multi-column-BzL86JPK.cjs.map → multi-column-BbVNPvhh.cjs.map} +1 -1
- package/dist/{multi-column-C1sXoVG3.js → multi-column-o9qcoBXV.js} +2 -2
- package/dist/{multi-column-C1sXoVG3.js.map → multi-column-o9qcoBXV.js.map} +1 -1
- package/dist/{property-filter-creator-DU8pl6-6.cjs → property-filter-creator-CaG_zPdy.cjs} +4 -3
- package/dist/property-filter-creator-CaG_zPdy.cjs.map +1 -0
- package/dist/{property-filter-creator-B9tK0VY3.js → property-filter-creator-Cl9E6wxf.js} +4 -3
- package/dist/property-filter-creator-Cl9E6wxf.js.map +1 -0
- package/dist/scroll-area-BtcyzOxO.cjs +243 -0
- package/dist/scroll-area-BtcyzOxO.cjs.map +1 -0
- package/dist/scroll-area-DjZ6nTm5.js +221 -0
- package/dist/scroll-area-DjZ6nTm5.js.map +1 -0
- package/dist/src/ds/components/Combobox/combobox-styles.d.ts +5 -12
- package/dist/src/ds/components/Combobox/combobox.d.ts +13 -4
- package/dist/src/ds/components/Combobox/combobox.stories.d.ts +1 -0
- package/dist/src/ds/components/Combobox/index.d.ts +0 -1
- package/dist/src/ds/components/Command/command.d.ts +5 -1
- package/dist/src/ds/components/Command/command.stories.d.ts +1 -0
- package/dist/src/ds/components/DataList/data-list-root.d.ts +3 -4
- package/dist/src/ds/components/Dialog/dialog.d.ts +2 -0
- package/dist/src/ds/components/MainSidebar/main-sidebar-nav-item-classes.d.ts +12 -0
- package/dist/src/ds/components/MainSidebar/main-sidebar-nav-link.d.ts +0 -13
- package/dist/src/ds/components/MainSidebar/main-sidebar.d.ts +2 -1
- package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +12 -0
- package/dist/src/ds/components/ScrollArea/scroll-area.stories.d.ts +2 -0
- package/dist/src/hooks/use-copy-to-clipboard.d.ts +9 -1
- package/dist/src/hooks/use-keyboard-shortcut-label.d.ts +2 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/lib/file/index.d.ts +1 -0
- package/dist/src/lib/file/schemes.d.ts +26 -0
- package/dist/{traces-data-list-BPTKzaN6.cjs → traces-data-list-BNmnKyDD.cjs} +8 -3
- package/dist/traces-data-list-BNmnKyDD.cjs.map +1 -0
- package/dist/{traces-data-list-CB7frfpp.js → traces-data-list-DRyI45Ke.js} +8 -3
- package/dist/traces-data-list-DRyI45Ke.js.map +1 -0
- package/dist/{truncate-C9bKR_02.js → truncate-B8_8wx-G.js} +2 -2
- package/dist/{truncate-C9bKR_02.js.map → truncate-B8_8wx-G.js.map} +1 -1
- package/dist/{truncate-RL2aHd1a.cjs → truncate-Csk5KmAy.cjs} +2 -2
- package/dist/{truncate-RL2aHd1a.cjs.map → truncate-Csk5KmAy.cjs.map} +1 -1
- package/dist/use-copy-to-clipboard-D7L_l6_x.js +127 -0
- package/dist/use-copy-to-clipboard-D7L_l6_x.js.map +1 -0
- package/dist/use-copy-to-clipboard-DHaJCGet.cjs +131 -0
- package/dist/use-copy-to-clipboard-DHaJCGet.cjs.map +1 -0
- package/package.json +12 -6
- package/dist/combobox-B2TriE9Z.cjs +0 -77
- package/dist/combobox-B2TriE9Z.cjs.map +0 -1
- package/dist/combobox-q2xPfCZc.js +0 -75
- package/dist/combobox-q2xPfCZc.js.map +0 -1
- package/dist/command-D0tQ1Lpz.cjs.map +0 -1
- package/dist/command-DPEUOKZw.js.map +0 -1
- package/dist/components/ScrollableContainer.cjs.js +0 -10
- package/dist/components/ScrollableContainer.cjs.js.map +0 -1
- package/dist/components/ScrollableContainer.d.ts +0 -2
- package/dist/components/ScrollableContainer.es.js +0 -2
- package/dist/components/ScrollableContainer.es.js.map +0 -1
- package/dist/data-list-skeleton-COjCBzBF.cjs.map +0 -1
- package/dist/data-list-skeleton-DmAqHgws.js.map +0 -1
- package/dist/dialog-46zkb32X.cjs.map +0 -1
- package/dist/dialog-CSSfcjSX.js.map +0 -1
- package/dist/main-sidebar-1GVDTtcD.js.map +0 -1
- package/dist/main-sidebar-Djs_3tGw.cjs.map +0 -1
- package/dist/multi-combobox-DkFLK64B.cjs +0 -193
- package/dist/multi-combobox-DkFLK64B.cjs.map +0 -1
- package/dist/multi-combobox-Y3gT0MqV.js +0 -189
- package/dist/multi-combobox-Y3gT0MqV.js.map +0 -1
- package/dist/property-filter-creator-B9tK0VY3.js.map +0 -1
- package/dist/property-filter-creator-DU8pl6-6.cjs.map +0 -1
- package/dist/scroll-area-BqJfcT94.cjs +0 -230
- package/dist/scroll-area-BqJfcT94.cjs.map +0 -1
- package/dist/scroll-area-BtDqmqBK.js +0 -208
- package/dist/scroll-area-BtDqmqBK.js.map +0 -1
- package/dist/scrollable-container-BqOFHwdb.js +0 -151
- package/dist/scrollable-container-BqOFHwdb.js.map +0 -1
- package/dist/scrollable-container-Btq-TfCL.cjs +0 -153
- package/dist/scrollable-container-Btq-TfCL.cjs.map +0 -1
- package/dist/src/ds/components/Combobox/multi-combobox.d.ts +0 -22
- package/dist/src/ds/components/ScrollableContainer/index.d.ts +0 -1
- package/dist/src/ds/components/ScrollableContainer/scrollable-container.d.ts +0 -8
- package/dist/src/ds/components/ScrollableContainer/scrollable-container.stories.d.ts +0 -10
- package/dist/traces-data-list-BPTKzaN6.cjs.map +0 -1
- package/dist/traces-data-list-CB7frfpp.js.map +0 -1
- package/dist/use-copy-to-clipboard-CGqfkXnN.js +0 -73
- package/dist/use-copy-to-clipboard-CGqfkXnN.js.map +0 -1
- package/dist/use-copy-to-clipboard-CQgIuR1c.cjs +0 -77
- package/dist/use-copy-to-clipboard-CQgIuR1c.cjs.map +0 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
const combobox = require('@base-ui/react/combobox');
|
|
5
|
+
const lucideReact = require('lucide-react');
|
|
6
|
+
const React = require('react');
|
|
7
|
+
const index = require('./index-DPkWrpVb.cjs');
|
|
8
|
+
const Button = require('./Button-DpIX8JMz.cjs');
|
|
9
|
+
const controlSize = require('./control-size-D67C0kPZ.cjs');
|
|
10
|
+
const transitions = require('./transitions-DpczSjmD.cjs');
|
|
11
|
+
const utils = require('./utils-vA5sWo9W.cjs');
|
|
12
|
+
const portalContainer = require('./portal-container-BsvHZxj7.cjs');
|
|
13
|
+
|
|
14
|
+
function _interopNamespaceDefault(e) {
|
|
15
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
16
|
+
if (e) {
|
|
17
|
+
for (const k in e) {
|
|
18
|
+
if (k !== 'default') {
|
|
19
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
20
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: () => e[k]
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
n.default = e;
|
|
28
|
+
return Object.freeze(n);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
32
|
+
|
|
33
|
+
function normalizeComboboxVariant(variant) {
|
|
34
|
+
return variant === "link" ? "ghost" : variant;
|
|
35
|
+
}
|
|
36
|
+
function comboboxTriggerClass({
|
|
37
|
+
variant,
|
|
38
|
+
size,
|
|
39
|
+
error,
|
|
40
|
+
className
|
|
41
|
+
}) {
|
|
42
|
+
const visualVariant = normalizeComboboxVariant(variant);
|
|
43
|
+
return utils.cn(
|
|
44
|
+
Button.buttonVariants({ variant: visualVariant, size }),
|
|
45
|
+
// Fill the field and push the value left / chevron right (Button's base
|
|
46
|
+
// centers its content with `justify-center`).
|
|
47
|
+
"w-full min-w-32 justify-between",
|
|
48
|
+
// Read as "active" while the popup is open, per variant (see map above).
|
|
49
|
+
controlSize.controlTriggerOpenState[visualVariant],
|
|
50
|
+
"data-[placeholder]:text-neutral3",
|
|
51
|
+
error && "border-error hover:border-error focus-visible:border-error",
|
|
52
|
+
className
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
const comboboxItemClass = index.cva(
|
|
56
|
+
utils.cn(
|
|
57
|
+
"relative flex cursor-pointer select-none items-center rounded-md",
|
|
58
|
+
"py-1.5 min-h-8",
|
|
59
|
+
"text-ui-smd leading-ui-sm text-neutral4",
|
|
60
|
+
"outline-none focus:outline-none focus-visible:outline-none",
|
|
61
|
+
transitions.transitions.colors,
|
|
62
|
+
"data-highlighted:bg-surface4 data-highlighted:text-neutral6",
|
|
63
|
+
"data-selected:text-neutral6"
|
|
64
|
+
),
|
|
65
|
+
{
|
|
66
|
+
variants: {
|
|
67
|
+
multiple: {
|
|
68
|
+
false: "gap-2 pl-2.5 pr-2",
|
|
69
|
+
true: "gap-2 pl-2.5 pr-2"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
defaultVariants: {
|
|
73
|
+
multiple: false
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
const comboboxStyles = {
|
|
78
|
+
/** Root wrapper */
|
|
79
|
+
root: "flex flex-col gap-1.5",
|
|
80
|
+
/** Chevron icon in trigger — inherits the variant's text color via currentColor. */
|
|
81
|
+
chevron: "ml-2 h-4 w-4 shrink-0 opacity-60",
|
|
82
|
+
/** Placeholder text color */
|
|
83
|
+
placeholder: "text-neutral3",
|
|
84
|
+
/** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */
|
|
85
|
+
popup: utils.cn(
|
|
86
|
+
"min-w-(--anchor-width) w-max max-w-(--available-width) rounded-xl border border-border1 bg-surface3 text-neutral4",
|
|
87
|
+
"shadow-dialog",
|
|
88
|
+
"origin-(--transform-origin)",
|
|
89
|
+
"transition-[transform,scale,opacity] duration-150 ease-out",
|
|
90
|
+
"data-starting-style:scale-95 data-starting-style:opacity-0",
|
|
91
|
+
"data-ending-style:scale-95 data-ending-style:opacity-0"
|
|
92
|
+
),
|
|
93
|
+
/** Positioner */
|
|
94
|
+
positioner: "z-50 pointer-events-auto",
|
|
95
|
+
/** Search input container — borderless top section, hairline divider below. */
|
|
96
|
+
searchContainer: utils.cn("flex items-center border-b border-border1 px-2.5 py-1.5", transitions.transitions.colors),
|
|
97
|
+
/** Search icon */
|
|
98
|
+
searchIcon: utils.cn("mr-2 h-3.5 w-3.5 shrink-0 text-neutral3", transitions.transitions.colors),
|
|
99
|
+
/** Search input */
|
|
100
|
+
searchInput: utils.cn(
|
|
101
|
+
"flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6",
|
|
102
|
+
"placeholder:text-neutral3 disabled:cursor-not-allowed disabled:opacity-50",
|
|
103
|
+
"outline-none focus:outline-none focus-visible:outline-none",
|
|
104
|
+
transitions.transitions.colors
|
|
105
|
+
),
|
|
106
|
+
/** Empty state */
|
|
107
|
+
empty: "not-empty:block hidden py-4 text-center text-ui-smd text-neutral3",
|
|
108
|
+
/** Options list */
|
|
109
|
+
list: "max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1",
|
|
110
|
+
/** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */
|
|
111
|
+
item: comboboxItemClass({ multiple: false }),
|
|
112
|
+
/** Multi-select item — same item rhythm with a right-aligned selected check. */
|
|
113
|
+
itemMulti: comboboxItemClass({ multiple: true }),
|
|
114
|
+
/** Right-aligned slot grouping end content + selection check. */
|
|
115
|
+
itemRightSlot: "ml-auto flex items-center gap-2 shrink-0",
|
|
116
|
+
/** Check indicator container — inline, fixed 16x16, shown only when item is selected. */
|
|
117
|
+
checkContainer: "flex h-4 w-4 shrink-0 items-center justify-center text-neutral6",
|
|
118
|
+
/** Check icon (single select) */
|
|
119
|
+
checkIcon: "h-3.5 w-3.5",
|
|
120
|
+
/** Option label/description wrapper */
|
|
121
|
+
optionText: "flex flex-col gap-0.5 min-w-0",
|
|
122
|
+
/** Option label */
|
|
123
|
+
optionLabel: "truncate",
|
|
124
|
+
/** Option description */
|
|
125
|
+
optionDescription: "text-ui-sm text-neutral3 truncate",
|
|
126
|
+
/** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */
|
|
127
|
+
optionEnd: "ml-auto flex items-center shrink-0",
|
|
128
|
+
/** Error message */
|
|
129
|
+
error: "text-ui-sm text-accent2"
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const EMPTY_VALUES = [];
|
|
133
|
+
const EMPTY_OPTIONS = [];
|
|
134
|
+
function isMultipleCombobox(props) {
|
|
135
|
+
return props.multiple === true;
|
|
136
|
+
}
|
|
137
|
+
function ComboboxOptionText({ option }) {
|
|
138
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: comboboxStyles.optionText, children: [
|
|
139
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.optionLabel, children: option.label }),
|
|
140
|
+
option.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.optionDescription, children: option.description })
|
|
141
|
+
] });
|
|
142
|
+
}
|
|
143
|
+
function Combobox(props) {
|
|
144
|
+
const {
|
|
145
|
+
options,
|
|
146
|
+
placeholder = isMultipleCombobox(props) ? "Select options..." : "Select option...",
|
|
147
|
+
searchPlaceholder = "Search...",
|
|
148
|
+
emptyText = "No option found.",
|
|
149
|
+
className,
|
|
150
|
+
disabled = false,
|
|
151
|
+
variant = "default",
|
|
152
|
+
size = "md",
|
|
153
|
+
open,
|
|
154
|
+
onOpenChange,
|
|
155
|
+
container,
|
|
156
|
+
error
|
|
157
|
+
} = props;
|
|
158
|
+
const multiple = isMultipleCombobox(props);
|
|
159
|
+
const selectedValues = multiple ? props.value ?? EMPTY_VALUES : EMPTY_VALUES;
|
|
160
|
+
const selectedValueSet = React__namespace.useMemo(() => new Set(selectedValues), [selectedValues]);
|
|
161
|
+
const selectedOption = multiple ? null : options.find((option) => option.value === props.value) ?? null;
|
|
162
|
+
const selectedOptions = multiple ? options.filter((option) => selectedValueSet.has(option.value)) : EMPTY_OPTIONS;
|
|
163
|
+
const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;
|
|
164
|
+
const resolvedContainer = portalContainer.usePortalContainer(container);
|
|
165
|
+
const comboboxContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
166
|
+
/* @__PURE__ */ jsxRuntime.jsxs(combobox.Combobox.Trigger, { className: comboboxTriggerClass({ variant, size, error: Boolean(error), className }), children: [
|
|
167
|
+
multiple ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn("truncate", selectedOptions.length === 0 && comboboxStyles.placeholder), children: triggerText }) : (
|
|
168
|
+
// Keep truncation off the outer wrapper so start adornments are not clipped.
|
|
169
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2 min-w-0 flex-1", children: [
|
|
170
|
+
selectedOption?.start,
|
|
171
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: /* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Value, { placeholder }) })
|
|
172
|
+
] })
|
|
173
|
+
),
|
|
174
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: comboboxStyles.chevron }) })
|
|
175
|
+
] }),
|
|
176
|
+
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Portal, { container: resolvedContainer, children: /* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Positioner, { align: "start", sideOffset: 4, className: comboboxStyles.positioner, children: /* @__PURE__ */ jsxRuntime.jsxs(combobox.Combobox.Popup, { className: comboboxStyles.popup, children: [
|
|
177
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: comboboxStyles.searchContainer, children: [
|
|
178
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: comboboxStyles.searchIcon }),
|
|
179
|
+
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Input, { className: comboboxStyles.searchInput, placeholder: searchPlaceholder })
|
|
180
|
+
] }),
|
|
181
|
+
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Empty, { className: comboboxStyles.empty, children: emptyText }),
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.List, { className: comboboxStyles.list, children: (option) => {
|
|
183
|
+
const isSelected = selectedValueSet.has(option.value);
|
|
184
|
+
return /* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Item, { value: option, className: comboboxItemClass({ multiple }), children: multiple ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
185
|
+
option.start,
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsx(ComboboxOptionText, { option }),
|
|
187
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: comboboxStyles.itemRightSlot, children: [
|
|
188
|
+
option.end ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: comboboxStyles.optionEnd, children: option.end }) : null,
|
|
189
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.checkContainer, children: isSelected ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: comboboxStyles.checkIcon }) : null })
|
|
190
|
+
] })
|
|
191
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
192
|
+
option.start,
|
|
193
|
+
/* @__PURE__ */ jsxRuntime.jsx(ComboboxOptionText, { option }),
|
|
194
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: comboboxStyles.itemRightSlot, children: [
|
|
195
|
+
option.end ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: comboboxStyles.optionEnd, children: option.end }) : null,
|
|
196
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.checkContainer, children: /* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: comboboxStyles.checkIcon }) }) })
|
|
197
|
+
] })
|
|
198
|
+
] }) }, option.value);
|
|
199
|
+
} })
|
|
200
|
+
] }) }) })
|
|
201
|
+
] });
|
|
202
|
+
if (multiple) {
|
|
203
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: comboboxStyles.root, children: [
|
|
204
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
205
|
+
combobox.Combobox.Root,
|
|
206
|
+
{
|
|
207
|
+
multiple: true,
|
|
208
|
+
autoHighlight: true,
|
|
209
|
+
items: options,
|
|
210
|
+
value: selectedOptions,
|
|
211
|
+
onValueChange: (items) => props.onValueChange?.((items ?? []).map((item) => item.value)),
|
|
212
|
+
disabled,
|
|
213
|
+
open,
|
|
214
|
+
onOpenChange,
|
|
215
|
+
children: comboboxContent
|
|
216
|
+
}
|
|
217
|
+
),
|
|
218
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.error, children: error })
|
|
219
|
+
] });
|
|
220
|
+
}
|
|
221
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: comboboxStyles.root, children: [
|
|
222
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
223
|
+
combobox.Combobox.Root,
|
|
224
|
+
{
|
|
225
|
+
autoHighlight: true,
|
|
226
|
+
items: options,
|
|
227
|
+
value: selectedOption,
|
|
228
|
+
onValueChange: (item) => {
|
|
229
|
+
if (item) {
|
|
230
|
+
props.onValueChange?.(item.value);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
disabled,
|
|
234
|
+
open,
|
|
235
|
+
onOpenChange,
|
|
236
|
+
children: comboboxContent
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.error, children: error })
|
|
240
|
+
] });
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
exports.Combobox = Combobox;
|
|
244
|
+
exports.comboboxStyles = comboboxStyles;
|
|
245
|
+
//# sourceMappingURL=combobox-DQdRtI_v.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox-DQdRtI_v.cjs","sources":["../src/ds/components/Combobox/combobox-styles.ts","../src/ds/components/Combobox/combobox.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { buttonVariants } from '../Button/Button';\nimport type { TextButtonSize } from '../Button/Button';\nimport { controlTriggerOpenState } from '@/ds/primitives/control-size';\nimport type { ControlTriggerVisualVariant } from '@/ds/primitives/control-size';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\n/**\n * A combobox is a form field, so it reuses the same button looks as everywhere,\n * mirroring `SelectTrigger`: `default` (the Button's filled default surface —\n * the default here too), `outline` (bordered, transparent) and `ghost`\n * (borderless, for breadcrumbs/inline pickers). Only the high-emphasis `primary`\n * look is intentionally NOT offered (a field is not a call-to-action).\n */\nexport type ComboboxVisualVariant = ControlTriggerVisualVariant;\nexport type ComboboxLegacyVariant = 'link';\nexport type ComboboxVariant = ComboboxVisualVariant | ComboboxLegacyVariant;\n\nfunction normalizeComboboxVariant(variant: ComboboxVariant): ComboboxVisualVariant {\n return variant === 'link' ? 'ghost' : variant;\n}\n\n/**\n * Single source of truth for both the single- and multi-select combobox\n * triggers. A combobox = a button + a trailing chevron, so it reuses the Button\n * recipe (variant colors, size = height/text/padding/radius, unified border\n * focus, disabled) and layers only the combobox-specific extras — exactly like\n * `SelectTrigger`.\n */\nexport function comboboxTriggerClass({\n variant,\n size,\n error,\n className,\n}: {\n variant: ComboboxVariant;\n size: TextButtonSize;\n error?: boolean;\n className?: string;\n}): string {\n const visualVariant = normalizeComboboxVariant(variant);\n\n return cn(\n buttonVariants({ variant: visualVariant, size }),\n // Fill the field and push the value left / chevron right (Button's base\n // centers its content with `justify-center`).\n 'w-full min-w-32 justify-between',\n // Read as \"active\" while the popup is open, per variant (see map above).\n controlTriggerOpenState[visualVariant],\n 'data-[placeholder]:text-neutral3',\n error && 'border-error hover:border-error focus-visible:border-error',\n className,\n );\n}\n\nexport const comboboxItemClass = cva(\n cn(\n 'relative flex cursor-pointer select-none items-center rounded-md',\n 'py-1.5 min-h-8',\n 'text-ui-smd leading-ui-sm text-neutral4',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n 'data-highlighted:bg-surface4 data-highlighted:text-neutral6',\n 'data-selected:text-neutral6',\n ),\n {\n variants: {\n multiple: {\n false: 'gap-2 pl-2.5 pr-2',\n true: 'gap-2 pl-2.5 pr-2',\n },\n },\n defaultVariants: {\n multiple: false,\n },\n },\n);\n\nexport const comboboxStyles = {\n /** Root wrapper */\n root: 'flex flex-col gap-1.5',\n\n /** Chevron icon in trigger — inherits the variant's text color via currentColor. */\n chevron: 'ml-2 h-4 w-4 shrink-0 opacity-60',\n\n /** Placeholder text color */\n placeholder: 'text-neutral3',\n\n /** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */\n popup: cn(\n 'min-w-(--anchor-width) w-max max-w-(--available-width) rounded-xl border border-border1 bg-surface3 text-neutral4',\n 'shadow-dialog',\n 'origin-(--transform-origin)',\n 'transition-[transform,scale,opacity] duration-150 ease-out',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n ),\n\n /** Positioner */\n positioner: 'z-50 pointer-events-auto',\n\n /** Search input container — borderless top section, hairline divider below. */\n searchContainer: cn('flex items-center border-b border-border1 px-2.5 py-1.5', transitions.colors),\n\n /** Search icon */\n searchIcon: cn('mr-2 h-3.5 w-3.5 shrink-0 text-neutral3', transitions.colors),\n\n /** Search input */\n searchInput: cn(\n 'flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6',\n 'placeholder:text-neutral3 disabled:cursor-not-allowed disabled:opacity-50',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n ),\n\n /** Empty state */\n empty: 'not-empty:block hidden py-4 text-center text-ui-smd text-neutral3',\n\n /** Options list */\n list: 'max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1',\n\n /** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */\n item: comboboxItemClass({ multiple: false }),\n\n /** Multi-select item — same item rhythm with a right-aligned selected check. */\n itemMulti: comboboxItemClass({ multiple: true }),\n\n /** Right-aligned slot grouping end content + selection check. */\n itemRightSlot: 'ml-auto flex items-center gap-2 shrink-0',\n\n /** Check indicator container — inline, fixed 16x16, shown only when item is selected. */\n checkContainer: 'flex h-4 w-4 shrink-0 items-center justify-center text-neutral6',\n\n /** Check icon (single select) */\n checkIcon: 'h-3.5 w-3.5',\n\n /** Option label/description wrapper */\n optionText: 'flex flex-col gap-0.5 min-w-0',\n\n /** Option label */\n optionLabel: 'truncate',\n\n /** Option description */\n optionDescription: 'text-ui-sm text-neutral3 truncate',\n\n /** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */\n optionEnd: 'ml-auto flex items-center shrink-0',\n\n /** Error message */\n error: 'text-ui-sm text-accent2',\n} as const;\n","import { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { Check, ChevronsUpDown, Search } from 'lucide-react';\nimport * as React from 'react';\nimport { comboboxItemClass, comboboxStyles, comboboxTriggerClass } from './combobox-styles';\nimport type { ComboboxVariant } from './combobox-styles';\nimport type { TextButtonSize } from '@/ds/components/Button/Button';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { cn } from '@/lib/utils';\n\nexport type { ComboboxVariant } from './combobox-styles';\n\nexport type ComboboxOption = {\n label: string;\n value: string;\n description?: string;\n start?: React.ReactNode;\n end?: React.ReactNode;\n};\n\ntype ComboboxSharedProps = {\n options: ComboboxOption[];\n placeholder?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n className?: string;\n disabled?: boolean;\n variant?: ComboboxVariant;\n size?: TextButtonSize;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n container?: HTMLElement | ShadowRoot | null | React.RefObject<HTMLElement | ShadowRoot | null>;\n error?: string;\n};\n\nexport type ComboboxSingleProps = ComboboxSharedProps & {\n multiple?: false;\n value?: string;\n onValueChange?: (value: string) => void;\n};\n\nexport type ComboboxMultipleProps = ComboboxSharedProps & {\n multiple: true;\n value?: readonly string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;\n\nconst EMPTY_VALUES: string[] = [];\nconst EMPTY_OPTIONS: ComboboxOption[] = [];\n\nfunction isMultipleCombobox(props: ComboboxProps): props is ComboboxMultipleProps {\n return props.multiple === true;\n}\n\nfunction ComboboxOptionText({ option }: { option: ComboboxOption }) {\n return (\n <span className={comboboxStyles.optionText}>\n <span className={comboboxStyles.optionLabel}>{option.label}</span>\n {option.description && <span className={comboboxStyles.optionDescription}>{option.description}</span>}\n </span>\n );\n}\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder = isMultipleCombobox(props) ? 'Select options...' : 'Select option...',\n searchPlaceholder = 'Search...',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n error,\n } = props;\n const multiple = isMultipleCombobox(props);\n const selectedValues = multiple ? (props.value ?? EMPTY_VALUES) : EMPTY_VALUES;\n const selectedValueSet = React.useMemo(() => new Set(selectedValues), [selectedValues]);\n const selectedOption = multiple ? null : (options.find(option => option.value === props.value) ?? null);\n const selectedOptions = multiple ? options.filter(option => selectedValueSet.has(option.value)) : EMPTY_OPTIONS;\n const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;\n // Default to the nearest SideDialog/Drawer popup so the list stays\n // interactive inside a modal drawer; an explicit `container` still wins.\n const resolvedContainer = usePortalContainer(container);\n\n const comboboxContent = (\n <>\n <BaseCombobox.Trigger className={comboboxTriggerClass({ variant, size, error: Boolean(error), className })}>\n {multiple ? (\n <span className={cn('truncate', selectedOptions.length === 0 && comboboxStyles.placeholder)}>\n {triggerText}\n </span>\n ) : (\n // Keep truncation off the outer wrapper so start adornments are not clipped.\n <span className=\"flex items-center gap-2 min-w-0 flex-1\">\n {selectedOption?.start}\n <span className=\"truncate\">\n <BaseCombobox.Value placeholder={placeholder} />\n </span>\n </span>\n )}\n {/* Wrap the chevron in a `<span>` so the svg is one level deep and\n escapes Button's `[&>svg]` adornments — mirrors Select's chevron wrap. */}\n <span className=\"flex shrink-0 items-center\">\n <ChevronsUpDown className={comboboxStyles.chevron} />\n </span>\n </BaseCombobox.Trigger>\n\n <BaseCombobox.Portal container={resolvedContainer}>\n <BaseCombobox.Positioner align=\"start\" sideOffset={4} className={comboboxStyles.positioner}>\n <BaseCombobox.Popup className={comboboxStyles.popup}>\n <div className={comboboxStyles.searchContainer}>\n <Search className={comboboxStyles.searchIcon} />\n <BaseCombobox.Input className={comboboxStyles.searchInput} placeholder={searchPlaceholder} />\n </div>\n <BaseCombobox.Empty className={comboboxStyles.empty}>{emptyText}</BaseCombobox.Empty>\n <BaseCombobox.List className={comboboxStyles.list}>\n {(option: ComboboxOption) => {\n const isSelected = selectedValueSet.has(option.value);\n\n return (\n <BaseCombobox.Item key={option.value} value={option} className={comboboxItemClass({ multiple })}>\n {multiple ? (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n {isSelected ? <Check className={comboboxStyles.checkIcon} /> : null}\n </span>\n </span>\n </>\n ) : (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n <BaseCombobox.ItemIndicator>\n <Check className={comboboxStyles.checkIcon} />\n </BaseCombobox.ItemIndicator>\n </span>\n </span>\n </>\n )}\n </BaseCombobox.Item>\n );\n }}\n </BaseCombobox.List>\n </BaseCombobox.Popup>\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n </>\n );\n\n if (multiple) {\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n multiple\n autoHighlight\n items={options}\n value={selectedOptions}\n onValueChange={items => props.onValueChange?.((items ?? []).map(item => item.value))}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n }\n\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n autoHighlight\n items={options}\n value={selectedOption}\n onValueChange={item => {\n if (item) {\n props.onValueChange?.(item.value);\n }\n }}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n}\n"],"names":["cn","buttonVariants","controlTriggerOpenState","cva","transitions","jsxs","jsx","React","usePortalContainer","Fragment","BaseCombobox","ChevronsUpDown","Search","Check"],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Combobox as Combobox$1 } from '@base-ui/react/combobox';
|
|
3
|
+
import { ChevronsUpDown, Search, Check } from 'lucide-react';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { c as cva } from './index-CsyK0ihk.js';
|
|
6
|
+
import { b as buttonVariants } from './Button-DoOEJwa_.js';
|
|
7
|
+
import { b as controlTriggerOpenState } from './control-size-BdDLgGX4.js';
|
|
8
|
+
import { t as transitions } from './transitions-tFfqxz40.js';
|
|
9
|
+
import { c as cn } from './utils-CzYGxqbG.js';
|
|
10
|
+
import { u as usePortalContainer } from './portal-container-BlQ6JKob.js';
|
|
11
|
+
|
|
12
|
+
function normalizeComboboxVariant(variant) {
|
|
13
|
+
return variant === "link" ? "ghost" : variant;
|
|
14
|
+
}
|
|
15
|
+
function comboboxTriggerClass({
|
|
16
|
+
variant,
|
|
17
|
+
size,
|
|
18
|
+
error,
|
|
19
|
+
className
|
|
20
|
+
}) {
|
|
21
|
+
const visualVariant = normalizeComboboxVariant(variant);
|
|
22
|
+
return cn(
|
|
23
|
+
buttonVariants({ variant: visualVariant, size }),
|
|
24
|
+
// Fill the field and push the value left / chevron right (Button's base
|
|
25
|
+
// centers its content with `justify-center`).
|
|
26
|
+
"w-full min-w-32 justify-between",
|
|
27
|
+
// Read as "active" while the popup is open, per variant (see map above).
|
|
28
|
+
controlTriggerOpenState[visualVariant],
|
|
29
|
+
"data-[placeholder]:text-neutral3",
|
|
30
|
+
error && "border-error hover:border-error focus-visible:border-error",
|
|
31
|
+
className
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
const comboboxItemClass = cva(
|
|
35
|
+
cn(
|
|
36
|
+
"relative flex cursor-pointer select-none items-center rounded-md",
|
|
37
|
+
"py-1.5 min-h-8",
|
|
38
|
+
"text-ui-smd leading-ui-sm text-neutral4",
|
|
39
|
+
"outline-none focus:outline-none focus-visible:outline-none",
|
|
40
|
+
transitions.colors,
|
|
41
|
+
"data-highlighted:bg-surface4 data-highlighted:text-neutral6",
|
|
42
|
+
"data-selected:text-neutral6"
|
|
43
|
+
),
|
|
44
|
+
{
|
|
45
|
+
variants: {
|
|
46
|
+
multiple: {
|
|
47
|
+
false: "gap-2 pl-2.5 pr-2",
|
|
48
|
+
true: "gap-2 pl-2.5 pr-2"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
defaultVariants: {
|
|
52
|
+
multiple: false
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
const comboboxStyles = {
|
|
57
|
+
/** Root wrapper */
|
|
58
|
+
root: "flex flex-col gap-1.5",
|
|
59
|
+
/** Chevron icon in trigger — inherits the variant's text color via currentColor. */
|
|
60
|
+
chevron: "ml-2 h-4 w-4 shrink-0 opacity-60",
|
|
61
|
+
/** Placeholder text color */
|
|
62
|
+
placeholder: "text-neutral3",
|
|
63
|
+
/** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */
|
|
64
|
+
popup: cn(
|
|
65
|
+
"min-w-(--anchor-width) w-max max-w-(--available-width) rounded-xl border border-border1 bg-surface3 text-neutral4",
|
|
66
|
+
"shadow-dialog",
|
|
67
|
+
"origin-(--transform-origin)",
|
|
68
|
+
"transition-[transform,scale,opacity] duration-150 ease-out",
|
|
69
|
+
"data-starting-style:scale-95 data-starting-style:opacity-0",
|
|
70
|
+
"data-ending-style:scale-95 data-ending-style:opacity-0"
|
|
71
|
+
),
|
|
72
|
+
/** Positioner */
|
|
73
|
+
positioner: "z-50 pointer-events-auto",
|
|
74
|
+
/** Search input container — borderless top section, hairline divider below. */
|
|
75
|
+
searchContainer: cn("flex items-center border-b border-border1 px-2.5 py-1.5", transitions.colors),
|
|
76
|
+
/** Search icon */
|
|
77
|
+
searchIcon: cn("mr-2 h-3.5 w-3.5 shrink-0 text-neutral3", transitions.colors),
|
|
78
|
+
/** Search input */
|
|
79
|
+
searchInput: cn(
|
|
80
|
+
"flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6",
|
|
81
|
+
"placeholder:text-neutral3 disabled:cursor-not-allowed disabled:opacity-50",
|
|
82
|
+
"outline-none focus:outline-none focus-visible:outline-none",
|
|
83
|
+
transitions.colors
|
|
84
|
+
),
|
|
85
|
+
/** Empty state */
|
|
86
|
+
empty: "not-empty:block hidden py-4 text-center text-ui-smd text-neutral3",
|
|
87
|
+
/** Options list */
|
|
88
|
+
list: "max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1",
|
|
89
|
+
/** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */
|
|
90
|
+
item: comboboxItemClass({ multiple: false }),
|
|
91
|
+
/** Multi-select item — same item rhythm with a right-aligned selected check. */
|
|
92
|
+
itemMulti: comboboxItemClass({ multiple: true }),
|
|
93
|
+
/** Right-aligned slot grouping end content + selection check. */
|
|
94
|
+
itemRightSlot: "ml-auto flex items-center gap-2 shrink-0",
|
|
95
|
+
/** Check indicator container — inline, fixed 16x16, shown only when item is selected. */
|
|
96
|
+
checkContainer: "flex h-4 w-4 shrink-0 items-center justify-center text-neutral6",
|
|
97
|
+
/** Check icon (single select) */
|
|
98
|
+
checkIcon: "h-3.5 w-3.5",
|
|
99
|
+
/** Option label/description wrapper */
|
|
100
|
+
optionText: "flex flex-col gap-0.5 min-w-0",
|
|
101
|
+
/** Option label */
|
|
102
|
+
optionLabel: "truncate",
|
|
103
|
+
/** Option description */
|
|
104
|
+
optionDescription: "text-ui-sm text-neutral3 truncate",
|
|
105
|
+
/** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */
|
|
106
|
+
optionEnd: "ml-auto flex items-center shrink-0",
|
|
107
|
+
/** Error message */
|
|
108
|
+
error: "text-ui-sm text-accent2"
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const EMPTY_VALUES = [];
|
|
112
|
+
const EMPTY_OPTIONS = [];
|
|
113
|
+
function isMultipleCombobox(props) {
|
|
114
|
+
return props.multiple === true;
|
|
115
|
+
}
|
|
116
|
+
function ComboboxOptionText({ option }) {
|
|
117
|
+
return /* @__PURE__ */ jsxs("span", { className: comboboxStyles.optionText, children: [
|
|
118
|
+
/* @__PURE__ */ jsx("span", { className: comboboxStyles.optionLabel, children: option.label }),
|
|
119
|
+
option.description && /* @__PURE__ */ jsx("span", { className: comboboxStyles.optionDescription, children: option.description })
|
|
120
|
+
] });
|
|
121
|
+
}
|
|
122
|
+
function Combobox(props) {
|
|
123
|
+
const {
|
|
124
|
+
options,
|
|
125
|
+
placeholder = isMultipleCombobox(props) ? "Select options..." : "Select option...",
|
|
126
|
+
searchPlaceholder = "Search...",
|
|
127
|
+
emptyText = "No option found.",
|
|
128
|
+
className,
|
|
129
|
+
disabled = false,
|
|
130
|
+
variant = "default",
|
|
131
|
+
size = "md",
|
|
132
|
+
open,
|
|
133
|
+
onOpenChange,
|
|
134
|
+
container,
|
|
135
|
+
error
|
|
136
|
+
} = props;
|
|
137
|
+
const multiple = isMultipleCombobox(props);
|
|
138
|
+
const selectedValues = multiple ? props.value ?? EMPTY_VALUES : EMPTY_VALUES;
|
|
139
|
+
const selectedValueSet = React.useMemo(() => new Set(selectedValues), [selectedValues]);
|
|
140
|
+
const selectedOption = multiple ? null : options.find((option) => option.value === props.value) ?? null;
|
|
141
|
+
const selectedOptions = multiple ? options.filter((option) => selectedValueSet.has(option.value)) : EMPTY_OPTIONS;
|
|
142
|
+
const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;
|
|
143
|
+
const resolvedContainer = usePortalContainer(container);
|
|
144
|
+
const comboboxContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
145
|
+
/* @__PURE__ */ jsxs(Combobox$1.Trigger, { className: comboboxTriggerClass({ variant, size, error: Boolean(error), className }), children: [
|
|
146
|
+
multiple ? /* @__PURE__ */ jsx("span", { className: cn("truncate", selectedOptions.length === 0 && comboboxStyles.placeholder), children: triggerText }) : (
|
|
147
|
+
// Keep truncation off the outer wrapper so start adornments are not clipped.
|
|
148
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 min-w-0 flex-1", children: [
|
|
149
|
+
selectedOption?.start,
|
|
150
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: /* @__PURE__ */ jsx(Combobox$1.Value, { placeholder }) })
|
|
151
|
+
] })
|
|
152
|
+
),
|
|
153
|
+
/* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center", children: /* @__PURE__ */ jsx(ChevronsUpDown, { className: comboboxStyles.chevron }) })
|
|
154
|
+
] }),
|
|
155
|
+
/* @__PURE__ */ jsx(Combobox$1.Portal, { container: resolvedContainer, children: /* @__PURE__ */ jsx(Combobox$1.Positioner, { align: "start", sideOffset: 4, className: comboboxStyles.positioner, children: /* @__PURE__ */ jsxs(Combobox$1.Popup, { className: comboboxStyles.popup, children: [
|
|
156
|
+
/* @__PURE__ */ jsxs("div", { className: comboboxStyles.searchContainer, children: [
|
|
157
|
+
/* @__PURE__ */ jsx(Search, { className: comboboxStyles.searchIcon }),
|
|
158
|
+
/* @__PURE__ */ jsx(Combobox$1.Input, { className: comboboxStyles.searchInput, placeholder: searchPlaceholder })
|
|
159
|
+
] }),
|
|
160
|
+
/* @__PURE__ */ jsx(Combobox$1.Empty, { className: comboboxStyles.empty, children: emptyText }),
|
|
161
|
+
/* @__PURE__ */ jsx(Combobox$1.List, { className: comboboxStyles.list, children: (option) => {
|
|
162
|
+
const isSelected = selectedValueSet.has(option.value);
|
|
163
|
+
return /* @__PURE__ */ jsx(Combobox$1.Item, { value: option, className: comboboxItemClass({ multiple }), children: multiple ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
164
|
+
option.start,
|
|
165
|
+
/* @__PURE__ */ jsx(ComboboxOptionText, { option }),
|
|
166
|
+
/* @__PURE__ */ jsxs("span", { className: comboboxStyles.itemRightSlot, children: [
|
|
167
|
+
option.end ? /* @__PURE__ */ jsx("div", { className: comboboxStyles.optionEnd, children: option.end }) : null,
|
|
168
|
+
/* @__PURE__ */ jsx("span", { className: comboboxStyles.checkContainer, children: isSelected ? /* @__PURE__ */ jsx(Check, { className: comboboxStyles.checkIcon }) : null })
|
|
169
|
+
] })
|
|
170
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
171
|
+
option.start,
|
|
172
|
+
/* @__PURE__ */ jsx(ComboboxOptionText, { option }),
|
|
173
|
+
/* @__PURE__ */ jsxs("span", { className: comboboxStyles.itemRightSlot, children: [
|
|
174
|
+
option.end ? /* @__PURE__ */ jsx("div", { className: comboboxStyles.optionEnd, children: option.end }) : null,
|
|
175
|
+
/* @__PURE__ */ jsx("span", { className: comboboxStyles.checkContainer, children: /* @__PURE__ */ jsx(Combobox$1.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: comboboxStyles.checkIcon }) }) })
|
|
176
|
+
] })
|
|
177
|
+
] }) }, option.value);
|
|
178
|
+
} })
|
|
179
|
+
] }) }) })
|
|
180
|
+
] });
|
|
181
|
+
if (multiple) {
|
|
182
|
+
return /* @__PURE__ */ jsxs("div", { className: comboboxStyles.root, children: [
|
|
183
|
+
/* @__PURE__ */ jsx(
|
|
184
|
+
Combobox$1.Root,
|
|
185
|
+
{
|
|
186
|
+
multiple: true,
|
|
187
|
+
autoHighlight: true,
|
|
188
|
+
items: options,
|
|
189
|
+
value: selectedOptions,
|
|
190
|
+
onValueChange: (items) => props.onValueChange?.((items ?? []).map((item) => item.value)),
|
|
191
|
+
disabled,
|
|
192
|
+
open,
|
|
193
|
+
onOpenChange,
|
|
194
|
+
children: comboboxContent
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
error && /* @__PURE__ */ jsx("span", { className: comboboxStyles.error, children: error })
|
|
198
|
+
] });
|
|
199
|
+
}
|
|
200
|
+
return /* @__PURE__ */ jsxs("div", { className: comboboxStyles.root, children: [
|
|
201
|
+
/* @__PURE__ */ jsx(
|
|
202
|
+
Combobox$1.Root,
|
|
203
|
+
{
|
|
204
|
+
autoHighlight: true,
|
|
205
|
+
items: options,
|
|
206
|
+
value: selectedOption,
|
|
207
|
+
onValueChange: (item) => {
|
|
208
|
+
if (item) {
|
|
209
|
+
props.onValueChange?.(item.value);
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
disabled,
|
|
213
|
+
open,
|
|
214
|
+
onOpenChange,
|
|
215
|
+
children: comboboxContent
|
|
216
|
+
}
|
|
217
|
+
),
|
|
218
|
+
error && /* @__PURE__ */ jsx("span", { className: comboboxStyles.error, children: error })
|
|
219
|
+
] });
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export { Combobox as C, comboboxStyles as c };
|
|
223
|
+
//# sourceMappingURL=combobox-DvRTz5eL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox-DvRTz5eL.js","sources":["../src/ds/components/Combobox/combobox-styles.ts","../src/ds/components/Combobox/combobox.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { buttonVariants } from '../Button/Button';\nimport type { TextButtonSize } from '../Button/Button';\nimport { controlTriggerOpenState } from '@/ds/primitives/control-size';\nimport type { ControlTriggerVisualVariant } from '@/ds/primitives/control-size';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\n/**\n * A combobox is a form field, so it reuses the same button looks as everywhere,\n * mirroring `SelectTrigger`: `default` (the Button's filled default surface —\n * the default here too), `outline` (bordered, transparent) and `ghost`\n * (borderless, for breadcrumbs/inline pickers). Only the high-emphasis `primary`\n * look is intentionally NOT offered (a field is not a call-to-action).\n */\nexport type ComboboxVisualVariant = ControlTriggerVisualVariant;\nexport type ComboboxLegacyVariant = 'link';\nexport type ComboboxVariant = ComboboxVisualVariant | ComboboxLegacyVariant;\n\nfunction normalizeComboboxVariant(variant: ComboboxVariant): ComboboxVisualVariant {\n return variant === 'link' ? 'ghost' : variant;\n}\n\n/**\n * Single source of truth for both the single- and multi-select combobox\n * triggers. A combobox = a button + a trailing chevron, so it reuses the Button\n * recipe (variant colors, size = height/text/padding/radius, unified border\n * focus, disabled) and layers only the combobox-specific extras — exactly like\n * `SelectTrigger`.\n */\nexport function comboboxTriggerClass({\n variant,\n size,\n error,\n className,\n}: {\n variant: ComboboxVariant;\n size: TextButtonSize;\n error?: boolean;\n className?: string;\n}): string {\n const visualVariant = normalizeComboboxVariant(variant);\n\n return cn(\n buttonVariants({ variant: visualVariant, size }),\n // Fill the field and push the value left / chevron right (Button's base\n // centers its content with `justify-center`).\n 'w-full min-w-32 justify-between',\n // Read as \"active\" while the popup is open, per variant (see map above).\n controlTriggerOpenState[visualVariant],\n 'data-[placeholder]:text-neutral3',\n error && 'border-error hover:border-error focus-visible:border-error',\n className,\n );\n}\n\nexport const comboboxItemClass = cva(\n cn(\n 'relative flex cursor-pointer select-none items-center rounded-md',\n 'py-1.5 min-h-8',\n 'text-ui-smd leading-ui-sm text-neutral4',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n 'data-highlighted:bg-surface4 data-highlighted:text-neutral6',\n 'data-selected:text-neutral6',\n ),\n {\n variants: {\n multiple: {\n false: 'gap-2 pl-2.5 pr-2',\n true: 'gap-2 pl-2.5 pr-2',\n },\n },\n defaultVariants: {\n multiple: false,\n },\n },\n);\n\nexport const comboboxStyles = {\n /** Root wrapper */\n root: 'flex flex-col gap-1.5',\n\n /** Chevron icon in trigger — inherits the variant's text color via currentColor. */\n chevron: 'ml-2 h-4 w-4 shrink-0 opacity-60',\n\n /** Placeholder text color */\n placeholder: 'text-neutral3',\n\n /** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */\n popup: cn(\n 'min-w-(--anchor-width) w-max max-w-(--available-width) rounded-xl border border-border1 bg-surface3 text-neutral4',\n 'shadow-dialog',\n 'origin-(--transform-origin)',\n 'transition-[transform,scale,opacity] duration-150 ease-out',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n ),\n\n /** Positioner */\n positioner: 'z-50 pointer-events-auto',\n\n /** Search input container — borderless top section, hairline divider below. */\n searchContainer: cn('flex items-center border-b border-border1 px-2.5 py-1.5', transitions.colors),\n\n /** Search icon */\n searchIcon: cn('mr-2 h-3.5 w-3.5 shrink-0 text-neutral3', transitions.colors),\n\n /** Search input */\n searchInput: cn(\n 'flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6',\n 'placeholder:text-neutral3 disabled:cursor-not-allowed disabled:opacity-50',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n ),\n\n /** Empty state */\n empty: 'not-empty:block hidden py-4 text-center text-ui-smd text-neutral3',\n\n /** Options list */\n list: 'max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1',\n\n /** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */\n item: comboboxItemClass({ multiple: false }),\n\n /** Multi-select item — same item rhythm with a right-aligned selected check. */\n itemMulti: comboboxItemClass({ multiple: true }),\n\n /** Right-aligned slot grouping end content + selection check. */\n itemRightSlot: 'ml-auto flex items-center gap-2 shrink-0',\n\n /** Check indicator container — inline, fixed 16x16, shown only when item is selected. */\n checkContainer: 'flex h-4 w-4 shrink-0 items-center justify-center text-neutral6',\n\n /** Check icon (single select) */\n checkIcon: 'h-3.5 w-3.5',\n\n /** Option label/description wrapper */\n optionText: 'flex flex-col gap-0.5 min-w-0',\n\n /** Option label */\n optionLabel: 'truncate',\n\n /** Option description */\n optionDescription: 'text-ui-sm text-neutral3 truncate',\n\n /** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */\n optionEnd: 'ml-auto flex items-center shrink-0',\n\n /** Error message */\n error: 'text-ui-sm text-accent2',\n} as const;\n","import { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { Check, ChevronsUpDown, Search } from 'lucide-react';\nimport * as React from 'react';\nimport { comboboxItemClass, comboboxStyles, comboboxTriggerClass } from './combobox-styles';\nimport type { ComboboxVariant } from './combobox-styles';\nimport type { TextButtonSize } from '@/ds/components/Button/Button';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { cn } from '@/lib/utils';\n\nexport type { ComboboxVariant } from './combobox-styles';\n\nexport type ComboboxOption = {\n label: string;\n value: string;\n description?: string;\n start?: React.ReactNode;\n end?: React.ReactNode;\n};\n\ntype ComboboxSharedProps = {\n options: ComboboxOption[];\n placeholder?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n className?: string;\n disabled?: boolean;\n variant?: ComboboxVariant;\n size?: TextButtonSize;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n container?: HTMLElement | ShadowRoot | null | React.RefObject<HTMLElement | ShadowRoot | null>;\n error?: string;\n};\n\nexport type ComboboxSingleProps = ComboboxSharedProps & {\n multiple?: false;\n value?: string;\n onValueChange?: (value: string) => void;\n};\n\nexport type ComboboxMultipleProps = ComboboxSharedProps & {\n multiple: true;\n value?: readonly string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;\n\nconst EMPTY_VALUES: string[] = [];\nconst EMPTY_OPTIONS: ComboboxOption[] = [];\n\nfunction isMultipleCombobox(props: ComboboxProps): props is ComboboxMultipleProps {\n return props.multiple === true;\n}\n\nfunction ComboboxOptionText({ option }: { option: ComboboxOption }) {\n return (\n <span className={comboboxStyles.optionText}>\n <span className={comboboxStyles.optionLabel}>{option.label}</span>\n {option.description && <span className={comboboxStyles.optionDescription}>{option.description}</span>}\n </span>\n );\n}\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder = isMultipleCombobox(props) ? 'Select options...' : 'Select option...',\n searchPlaceholder = 'Search...',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n error,\n } = props;\n const multiple = isMultipleCombobox(props);\n const selectedValues = multiple ? (props.value ?? EMPTY_VALUES) : EMPTY_VALUES;\n const selectedValueSet = React.useMemo(() => new Set(selectedValues), [selectedValues]);\n const selectedOption = multiple ? null : (options.find(option => option.value === props.value) ?? null);\n const selectedOptions = multiple ? options.filter(option => selectedValueSet.has(option.value)) : EMPTY_OPTIONS;\n const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;\n // Default to the nearest SideDialog/Drawer popup so the list stays\n // interactive inside a modal drawer; an explicit `container` still wins.\n const resolvedContainer = usePortalContainer(container);\n\n const comboboxContent = (\n <>\n <BaseCombobox.Trigger className={comboboxTriggerClass({ variant, size, error: Boolean(error), className })}>\n {multiple ? (\n <span className={cn('truncate', selectedOptions.length === 0 && comboboxStyles.placeholder)}>\n {triggerText}\n </span>\n ) : (\n // Keep truncation off the outer wrapper so start adornments are not clipped.\n <span className=\"flex items-center gap-2 min-w-0 flex-1\">\n {selectedOption?.start}\n <span className=\"truncate\">\n <BaseCombobox.Value placeholder={placeholder} />\n </span>\n </span>\n )}\n {/* Wrap the chevron in a `<span>` so the svg is one level deep and\n escapes Button's `[&>svg]` adornments — mirrors Select's chevron wrap. */}\n <span className=\"flex shrink-0 items-center\">\n <ChevronsUpDown className={comboboxStyles.chevron} />\n </span>\n </BaseCombobox.Trigger>\n\n <BaseCombobox.Portal container={resolvedContainer}>\n <BaseCombobox.Positioner align=\"start\" sideOffset={4} className={comboboxStyles.positioner}>\n <BaseCombobox.Popup className={comboboxStyles.popup}>\n <div className={comboboxStyles.searchContainer}>\n <Search className={comboboxStyles.searchIcon} />\n <BaseCombobox.Input className={comboboxStyles.searchInput} placeholder={searchPlaceholder} />\n </div>\n <BaseCombobox.Empty className={comboboxStyles.empty}>{emptyText}</BaseCombobox.Empty>\n <BaseCombobox.List className={comboboxStyles.list}>\n {(option: ComboboxOption) => {\n const isSelected = selectedValueSet.has(option.value);\n\n return (\n <BaseCombobox.Item key={option.value} value={option} className={comboboxItemClass({ multiple })}>\n {multiple ? (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n {isSelected ? <Check className={comboboxStyles.checkIcon} /> : null}\n </span>\n </span>\n </>\n ) : (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n <BaseCombobox.ItemIndicator>\n <Check className={comboboxStyles.checkIcon} />\n </BaseCombobox.ItemIndicator>\n </span>\n </span>\n </>\n )}\n </BaseCombobox.Item>\n );\n }}\n </BaseCombobox.List>\n </BaseCombobox.Popup>\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n </>\n );\n\n if (multiple) {\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n multiple\n autoHighlight\n items={options}\n value={selectedOptions}\n onValueChange={items => props.onValueChange?.((items ?? []).map(item => item.value))}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n }\n\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n autoHighlight\n items={options}\n value={selectedOption}\n onValueChange={item => {\n if (item) {\n props.onValueChange?.(item.value);\n }\n }}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n}\n"],"names":["BaseCombobox"],"mappings":"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"}
|