@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.
Files changed (220) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist/{code-block-C4Zp_ewI.cjs → code-block-BPI6hA9o.cjs} +2 -2
  3. package/dist/{code-block-C4Zp_ewI.cjs.map → code-block-BPI6hA9o.cjs.map} +1 -1
  4. package/dist/{code-block-CnRVTecy.js → code-block-BdjHwqE4.js} +2 -2
  5. package/dist/{code-block-CnRVTecy.js.map → code-block-BdjHwqE4.js.map} +1 -1
  6. package/dist/{code-editor-DuX_CPRv.js → code-editor-CxHGOvdY.js} +3 -3
  7. package/dist/{code-editor-DuX_CPRv.js.map → code-editor-CxHGOvdY.js.map} +1 -1
  8. package/dist/{code-editor-LhRB_wMh.cjs → code-editor-DVWPuq12.cjs} +3 -3
  9. package/dist/{code-editor-LhRB_wMh.cjs.map → code-editor-DVWPuq12.cjs.map} +1 -1
  10. package/dist/combobox-DQdRtI_v.cjs +245 -0
  11. package/dist/combobox-DQdRtI_v.cjs.map +1 -0
  12. package/dist/combobox-DvRTz5eL.js +223 -0
  13. package/dist/combobox-DvRTz5eL.js.map +1 -0
  14. package/dist/{command-DPEUOKZw.js → command-CkFCH229.js} +86 -43
  15. package/dist/command-CkFCH229.js.map +1 -0
  16. package/dist/{command-D0tQ1Lpz.cjs → command-EI7t_0WS.cjs} +86 -43
  17. package/dist/command-EI7t_0WS.cjs.map +1 -0
  18. package/dist/components/CodeBlock.cjs.js +1 -1
  19. package/dist/components/CodeBlock.es.js +1 -1
  20. package/dist/components/CodeEditor.cjs.js +1 -1
  21. package/dist/components/CodeEditor.es.js +1 -1
  22. package/dist/components/Columns.cjs.js +1 -1
  23. package/dist/components/Columns.es.js +1 -1
  24. package/dist/components/Combobox.cjs.js +2 -4
  25. package/dist/components/Combobox.cjs.js.map +1 -1
  26. package/dist/components/Combobox.es.js +1 -2
  27. package/dist/components/Combobox.es.js.map +1 -1
  28. package/dist/components/Command.cjs.js +1 -1
  29. package/dist/components/Command.es.js +1 -1
  30. package/dist/components/CopyButton.cjs.js +1 -1
  31. package/dist/components/CopyButton.es.js +1 -1
  32. package/dist/components/DataCodeSection.cjs.js +1 -1
  33. package/dist/components/DataCodeSection.es.js +1 -1
  34. package/dist/components/DataDetailsPanel.cjs.js +1 -1
  35. package/dist/components/DataDetailsPanel.es.js +1 -1
  36. package/dist/components/DataKeysAndValues.cjs.js +1 -1
  37. package/dist/components/DataKeysAndValues.es.js +1 -1
  38. package/dist/components/DataList.cjs.js +2 -2
  39. package/dist/components/DataList.es.js +2 -2
  40. package/dist/components/DataPanel.cjs.js +1 -1
  41. package/dist/components/DataPanel.es.js +1 -1
  42. package/dist/components/Dialog.cjs.js +1 -1
  43. package/dist/components/Dialog.es.js +1 -1
  44. package/dist/components/HorizontalBars.cjs.js +1 -1
  45. package/dist/components/HorizontalBars.es.js +1 -1
  46. package/dist/components/LogsDataList.cjs.js +2 -2
  47. package/dist/components/LogsDataList.es.js +2 -2
  48. package/dist/components/MainSidebar.cjs.js +1 -1
  49. package/dist/components/MainSidebar.es.js +1 -1
  50. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  51. package/dist/components/MarkdownRenderer.es.js +1 -1
  52. package/dist/components/MetricsDataTable.cjs.js +1 -1
  53. package/dist/components/MetricsDataTable.es.js +1 -1
  54. package/dist/components/PropertyFilter.cjs.js +1 -1
  55. package/dist/components/PropertyFilter.es.js +1 -1
  56. package/dist/components/ScrollArea.cjs.js +1 -1
  57. package/dist/components/ScrollArea.es.js +1 -1
  58. package/dist/components/SideDialog.cjs.js +1 -1
  59. package/dist/components/SideDialog.es.js +1 -1
  60. package/dist/components/Truncate.cjs.js +1 -1
  61. package/dist/components/Truncate.es.js +1 -1
  62. package/dist/{copy-button-BfiqaCtC.js → copy-button-RffVknBA.js} +2 -2
  63. package/dist/{copy-button-BfiqaCtC.js.map → copy-button-RffVknBA.js.map} +1 -1
  64. package/dist/{copy-button-BaAuAgdC.cjs → copy-button-ler9dH8g.cjs} +3 -3
  65. package/dist/{copy-button-BaAuAgdC.cjs.map → copy-button-ler9dH8g.cjs.map} +1 -1
  66. package/dist/{data-code-section-MygZlpwo.js → data-code-section-BBBffVVs.js} +3 -3
  67. package/dist/{data-code-section-MygZlpwo.js.map → data-code-section-BBBffVVs.js.map} +1 -1
  68. package/dist/{data-code-section-BtFzBCox.cjs → data-code-section-ChVXPz-i.cjs} +3 -3
  69. package/dist/{data-code-section-BtFzBCox.cjs.map → data-code-section-ChVXPz-i.cjs.map} +1 -1
  70. package/dist/{data-keys-and-values-BSeQG7jb.js → data-keys-and-values-C3pzr_d1.js} +2 -2
  71. package/dist/{data-keys-and-values-BSeQG7jb.js.map → data-keys-and-values-C3pzr_d1.js.map} +1 -1
  72. package/dist/{data-keys-and-values-Spy2O_IE.cjs → data-keys-and-values-KIwfkmc7.cjs} +3 -3
  73. package/dist/{data-keys-and-values-Spy2O_IE.cjs.map → data-keys-and-values-KIwfkmc7.cjs.map} +1 -1
  74. package/dist/{data-list-skeleton-COjCBzBF.cjs → data-list-skeleton-BlOwAki1.cjs} +5 -15
  75. package/dist/data-list-skeleton-BlOwAki1.cjs.map +1 -0
  76. package/dist/{data-list-skeleton-DmAqHgws.js → data-list-skeleton-DD7ljjgS.js} +5 -15
  77. package/dist/data-list-skeleton-DD7ljjgS.js.map +1 -0
  78. package/dist/{data-panel-DToYF7cH.cjs → data-panel-DBxE_3ux.cjs} +2 -2
  79. package/dist/{data-panel-DToYF7cH.cjs.map → data-panel-DBxE_3ux.cjs.map} +1 -1
  80. package/dist/{data-panel-DumaHQiP.js → data-panel-DPVF9Yok.js} +2 -2
  81. package/dist/{data-panel-DumaHQiP.js.map → data-panel-DPVF9Yok.js.map} +1 -1
  82. package/dist/{dialog-46zkb32X.cjs → dialog-C0gOGKEK.cjs} +31 -29
  83. package/dist/dialog-C0gOGKEK.cjs.map +1 -0
  84. package/dist/{dialog-CSSfcjSX.js → dialog-DTLHod4X.js} +31 -29
  85. package/dist/dialog-DTLHod4X.js.map +1 -0
  86. package/dist/dialog.css +2 -2
  87. package/dist/hooks/use-autoscroll.cjs.js +110 -0
  88. package/dist/hooks/use-autoscroll.cjs.js.map +1 -0
  89. package/dist/hooks/use-autoscroll.d.ts +2 -0
  90. package/dist/hooks/use-autoscroll.es.js +106 -0
  91. package/dist/hooks/use-autoscroll.es.js.map +1 -0
  92. package/dist/hooks/use-copy-to-clipboard.cjs.js +11 -0
  93. package/dist/hooks/use-copy-to-clipboard.cjs.js.map +1 -0
  94. package/dist/hooks/use-copy-to-clipboard.d.ts +2 -0
  95. package/dist/hooks/use-copy-to-clipboard.es.js +3 -0
  96. package/dist/hooks/use-copy-to-clipboard.es.js.map +1 -0
  97. package/dist/hooks/use-in-view.cjs.js +22 -0
  98. package/dist/hooks/use-in-view.cjs.js.map +1 -0
  99. package/dist/hooks/use-in-view.d.ts +2 -0
  100. package/dist/hooks/use-in-view.es.js +18 -0
  101. package/dist/hooks/use-in-view.es.js.map +1 -0
  102. package/dist/hooks/use-is-mobile.cjs.js +21 -0
  103. package/dist/hooks/use-is-mobile.cjs.js.map +1 -0
  104. package/dist/hooks/use-is-mobile.d.ts +2 -0
  105. package/dist/hooks/use-is-mobile.es.js +17 -0
  106. package/dist/hooks/use-is-mobile.es.js.map +1 -0
  107. package/dist/hooks/use-keyboard-shortcut-label.cjs.js +29 -0
  108. package/dist/hooks/use-keyboard-shortcut-label.cjs.js.map +1 -0
  109. package/dist/hooks/use-keyboard-shortcut-label.d.ts +2 -0
  110. package/dist/hooks/use-keyboard-shortcut-label.es.js +24 -0
  111. package/dist/hooks/use-keyboard-shortcut-label.es.js.map +1 -0
  112. package/dist/{horizontal-bars-DjLETHvH.js → horizontal-bars-r1aEIHUc.js} +2 -2
  113. package/dist/{horizontal-bars-DjLETHvH.js.map → horizontal-bars-r1aEIHUc.js.map} +1 -1
  114. package/dist/{horizontal-bars-C9qp4r47.cjs → horizontal-bars-uPFpgihX.cjs} +2 -2
  115. package/dist/{horizontal-bars-C9qp4r47.cjs.map → horizontal-bars-uPFpgihX.cjs.map} +1 -1
  116. package/dist/index.cjs.js +88 -79
  117. package/dist/index.cjs.js.map +1 -1
  118. package/dist/index.css +55 -30
  119. package/dist/index.es.js +72 -69
  120. package/dist/index.es.js.map +1 -1
  121. package/dist/{logs-data-list-kzBMv1MW.cjs → logs-data-list-3qmFjBz8.cjs} +2 -2
  122. package/dist/{logs-data-list-kzBMv1MW.cjs.map → logs-data-list-3qmFjBz8.cjs.map} +1 -1
  123. package/dist/{logs-data-list-Bkf7oWlx.js → logs-data-list-Dh6c7URj.js} +2 -2
  124. package/dist/{logs-data-list-Bkf7oWlx.js.map → logs-data-list-Dh6c7URj.js.map} +1 -1
  125. package/dist/{main-sidebar-Djs_3tGw.cjs → main-sidebar-ByHmwU4R.cjs} +6 -5
  126. package/dist/main-sidebar-ByHmwU4R.cjs.map +1 -0
  127. package/dist/{main-sidebar-1GVDTtcD.js → main-sidebar-DJSorgYQ.js} +6 -5
  128. package/dist/main-sidebar-DJSorgYQ.js.map +1 -0
  129. package/dist/{markdown-renderer-DyUlVfRt.cjs → markdown-renderer-Dyg_1QXx.cjs} +2 -2
  130. package/dist/{markdown-renderer-DyUlVfRt.cjs.map → markdown-renderer-Dyg_1QXx.cjs.map} +1 -1
  131. package/dist/{markdown-renderer-BYSrmn0E.js → markdown-renderer-QftQuP4g.js} +2 -2
  132. package/dist/{markdown-renderer-BYSrmn0E.js.map → markdown-renderer-QftQuP4g.js.map} +1 -1
  133. package/dist/{metrics-data-table-D7vx2WEJ.cjs → metrics-data-table-AjAA-dqH.cjs} +2 -2
  134. package/dist/{metrics-data-table-D7vx2WEJ.cjs.map → metrics-data-table-AjAA-dqH.cjs.map} +1 -1
  135. package/dist/{metrics-data-table-DryqJWoI.js → metrics-data-table-hSmtDNck.js} +2 -2
  136. package/dist/{metrics-data-table-DryqJWoI.js.map → metrics-data-table-hSmtDNck.js.map} +1 -1
  137. package/dist/{multi-column-BzL86JPK.cjs → multi-column-BbVNPvhh.cjs} +2 -2
  138. package/dist/{multi-column-BzL86JPK.cjs.map → multi-column-BbVNPvhh.cjs.map} +1 -1
  139. package/dist/{multi-column-C1sXoVG3.js → multi-column-o9qcoBXV.js} +2 -2
  140. package/dist/{multi-column-C1sXoVG3.js.map → multi-column-o9qcoBXV.js.map} +1 -1
  141. package/dist/{property-filter-creator-DU8pl6-6.cjs → property-filter-creator-CaG_zPdy.cjs} +4 -3
  142. package/dist/property-filter-creator-CaG_zPdy.cjs.map +1 -0
  143. package/dist/{property-filter-creator-B9tK0VY3.js → property-filter-creator-Cl9E6wxf.js} +4 -3
  144. package/dist/property-filter-creator-Cl9E6wxf.js.map +1 -0
  145. package/dist/scroll-area-BtcyzOxO.cjs +243 -0
  146. package/dist/scroll-area-BtcyzOxO.cjs.map +1 -0
  147. package/dist/scroll-area-DjZ6nTm5.js +221 -0
  148. package/dist/scroll-area-DjZ6nTm5.js.map +1 -0
  149. package/dist/src/ds/components/Combobox/combobox-styles.d.ts +5 -12
  150. package/dist/src/ds/components/Combobox/combobox.d.ts +13 -4
  151. package/dist/src/ds/components/Combobox/combobox.stories.d.ts +1 -0
  152. package/dist/src/ds/components/Combobox/index.d.ts +0 -1
  153. package/dist/src/ds/components/Command/command.d.ts +5 -1
  154. package/dist/src/ds/components/Command/command.stories.d.ts +1 -0
  155. package/dist/src/ds/components/DataList/data-list-root.d.ts +3 -4
  156. package/dist/src/ds/components/Dialog/dialog.d.ts +2 -0
  157. package/dist/src/ds/components/MainSidebar/main-sidebar-nav-item-classes.d.ts +12 -0
  158. package/dist/src/ds/components/MainSidebar/main-sidebar-nav-link.d.ts +0 -13
  159. package/dist/src/ds/components/MainSidebar/main-sidebar.d.ts +2 -1
  160. package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +12 -0
  161. package/dist/src/ds/components/ScrollArea/scroll-area.stories.d.ts +2 -0
  162. package/dist/src/hooks/use-copy-to-clipboard.d.ts +9 -1
  163. package/dist/src/hooks/use-keyboard-shortcut-label.d.ts +2 -0
  164. package/dist/src/index.d.ts +1 -1
  165. package/dist/src/lib/file/index.d.ts +1 -0
  166. package/dist/src/lib/file/schemes.d.ts +26 -0
  167. package/dist/{traces-data-list-BPTKzaN6.cjs → traces-data-list-BNmnKyDD.cjs} +8 -3
  168. package/dist/traces-data-list-BNmnKyDD.cjs.map +1 -0
  169. package/dist/{traces-data-list-CB7frfpp.js → traces-data-list-DRyI45Ke.js} +8 -3
  170. package/dist/traces-data-list-DRyI45Ke.js.map +1 -0
  171. package/dist/{truncate-C9bKR_02.js → truncate-B8_8wx-G.js} +2 -2
  172. package/dist/{truncate-C9bKR_02.js.map → truncate-B8_8wx-G.js.map} +1 -1
  173. package/dist/{truncate-RL2aHd1a.cjs → truncate-Csk5KmAy.cjs} +2 -2
  174. package/dist/{truncate-RL2aHd1a.cjs.map → truncate-Csk5KmAy.cjs.map} +1 -1
  175. package/dist/use-copy-to-clipboard-D7L_l6_x.js +127 -0
  176. package/dist/use-copy-to-clipboard-D7L_l6_x.js.map +1 -0
  177. package/dist/use-copy-to-clipboard-DHaJCGet.cjs +131 -0
  178. package/dist/use-copy-to-clipboard-DHaJCGet.cjs.map +1 -0
  179. package/package.json +12 -6
  180. package/dist/combobox-B2TriE9Z.cjs +0 -77
  181. package/dist/combobox-B2TriE9Z.cjs.map +0 -1
  182. package/dist/combobox-q2xPfCZc.js +0 -75
  183. package/dist/combobox-q2xPfCZc.js.map +0 -1
  184. package/dist/command-D0tQ1Lpz.cjs.map +0 -1
  185. package/dist/command-DPEUOKZw.js.map +0 -1
  186. package/dist/components/ScrollableContainer.cjs.js +0 -10
  187. package/dist/components/ScrollableContainer.cjs.js.map +0 -1
  188. package/dist/components/ScrollableContainer.d.ts +0 -2
  189. package/dist/components/ScrollableContainer.es.js +0 -2
  190. package/dist/components/ScrollableContainer.es.js.map +0 -1
  191. package/dist/data-list-skeleton-COjCBzBF.cjs.map +0 -1
  192. package/dist/data-list-skeleton-DmAqHgws.js.map +0 -1
  193. package/dist/dialog-46zkb32X.cjs.map +0 -1
  194. package/dist/dialog-CSSfcjSX.js.map +0 -1
  195. package/dist/main-sidebar-1GVDTtcD.js.map +0 -1
  196. package/dist/main-sidebar-Djs_3tGw.cjs.map +0 -1
  197. package/dist/multi-combobox-DkFLK64B.cjs +0 -193
  198. package/dist/multi-combobox-DkFLK64B.cjs.map +0 -1
  199. package/dist/multi-combobox-Y3gT0MqV.js +0 -189
  200. package/dist/multi-combobox-Y3gT0MqV.js.map +0 -1
  201. package/dist/property-filter-creator-B9tK0VY3.js.map +0 -1
  202. package/dist/property-filter-creator-DU8pl6-6.cjs.map +0 -1
  203. package/dist/scroll-area-BqJfcT94.cjs +0 -230
  204. package/dist/scroll-area-BqJfcT94.cjs.map +0 -1
  205. package/dist/scroll-area-BtDqmqBK.js +0 -208
  206. package/dist/scroll-area-BtDqmqBK.js.map +0 -1
  207. package/dist/scrollable-container-BqOFHwdb.js +0 -151
  208. package/dist/scrollable-container-BqOFHwdb.js.map +0 -1
  209. package/dist/scrollable-container-Btq-TfCL.cjs +0 -153
  210. package/dist/scrollable-container-Btq-TfCL.cjs.map +0 -1
  211. package/dist/src/ds/components/Combobox/multi-combobox.d.ts +0 -22
  212. package/dist/src/ds/components/ScrollableContainer/index.d.ts +0 -1
  213. package/dist/src/ds/components/ScrollableContainer/scrollable-container.d.ts +0 -8
  214. package/dist/src/ds/components/ScrollableContainer/scrollable-container.stories.d.ts +0 -10
  215. package/dist/traces-data-list-BPTKzaN6.cjs.map +0 -1
  216. package/dist/traces-data-list-CB7frfpp.js.map +0 -1
  217. package/dist/use-copy-to-clipboard-CGqfkXnN.js +0 -73
  218. package/dist/use-copy-to-clipboard-CGqfkXnN.js.map +0 -1
  219. package/dist/use-copy-to-clipboard-CQgIuR1c.cjs +0 -77
  220. package/dist/use-copy-to-clipboard-CQgIuR1c.cjs.map +0 -1
@@ -1,189 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Combobox } from '@base-ui/react/combobox';
3
- import { ChevronsUpDown, Search, Check } from 'lucide-react';
4
- import { b as buttonVariants } from './Button-DoOEJwa_.js';
5
- import { b as controlTriggerOpenState } from './control-size-BdDLgGX4.js';
6
- import { t as transitions } from './transitions-tFfqxz40.js';
7
- import { c as cn } from './utils-CzYGxqbG.js';
8
-
9
- function normalizeComboboxVariant(variant) {
10
- return variant === "link" ? "ghost" : variant;
11
- }
12
- function comboboxTriggerClass({
13
- variant,
14
- size,
15
- error,
16
- className
17
- }) {
18
- const visualVariant = normalizeComboboxVariant(variant);
19
- return cn(
20
- buttonVariants({ variant: visualVariant, size }),
21
- // Fill the field and push the value left / chevron right (Button's base
22
- // centers its content with `justify-center`).
23
- "w-full min-w-32 justify-between",
24
- // Read as "active" while the popup is open, per variant (see map above).
25
- controlTriggerOpenState[visualVariant],
26
- "data-[placeholder]:text-neutral3",
27
- error && "border-error hover:border-error focus-visible:border-error",
28
- className
29
- );
30
- }
31
- const comboboxStyles = {
32
- /** Root wrapper */
33
- root: "flex flex-col gap-1.5",
34
- /** Chevron icon in trigger — inherits the variant's text color via currentColor. */
35
- chevron: "ml-2 h-4 w-4 shrink-0 opacity-60",
36
- /** Placeholder text color */
37
- placeholder: "text-neutral3",
38
- /** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */
39
- popup: cn(
40
- "min-w-(--anchor-width) w-max max-w-(--available-width) rounded-xl border border-border1 bg-surface3 text-neutral4",
41
- "shadow-dialog",
42
- "origin-(--transform-origin)",
43
- "transition-[transform,scale,opacity] duration-150 ease-out",
44
- "data-starting-style:scale-95 data-starting-style:opacity-0",
45
- "data-ending-style:scale-95 data-ending-style:opacity-0"
46
- ),
47
- /** Positioner */
48
- positioner: "z-50 pointer-events-auto",
49
- /** Search input container — borderless top section, hairline divider below. */
50
- searchContainer: cn("flex items-center border-b border-border1 px-2.5 py-1.5", transitions.colors),
51
- /** Search icon */
52
- searchIcon: cn("mr-2 h-3.5 w-3.5 shrink-0 text-neutral3", transitions.colors),
53
- /** Search input */
54
- searchInput: cn(
55
- "flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6",
56
- "placeholder:text-neutral3 disabled:cursor-not-allowed disabled:opacity-50",
57
- "outline-none focus:outline-none focus-visible:outline-none",
58
- transitions.colors
59
- ),
60
- /** Empty state */
61
- empty: "not-empty:block hidden py-4 text-center text-ui-smd text-neutral3",
62
- /** Options list */
63
- list: "max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1",
64
- /** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */
65
- item: cn(
66
- "group/item relative flex cursor-pointer select-none items-center gap-2 rounded-md",
67
- "pl-2.5 pr-2 py-1.5 min-h-8",
68
- "text-ui-smd leading-ui-sm text-neutral4",
69
- "outline-none focus:outline-none focus-visible:outline-none",
70
- transitions.colors,
71
- "data-highlighted:bg-surface4 data-highlighted:text-neutral6",
72
- "data-selected:text-neutral6"
73
- ),
74
- /** Multi-select item — keeps the left checkbox slot, no right indicator. */
75
- itemMulti: cn(
76
- "relative flex cursor-pointer select-none items-center gap-2.5 rounded-md",
77
- "pl-2 pr-2.5 py-1.5 min-h-8",
78
- "text-ui-smd leading-ui-sm text-neutral4",
79
- "outline-none focus:outline-none focus-visible:outline-none",
80
- transitions.colors,
81
- "data-highlighted:bg-surface4 data-highlighted:text-neutral6",
82
- "data-selected:text-neutral6"
83
- ),
84
- /** Right-aligned slot grouping end content + selection check. */
85
- itemRightSlot: "ml-auto flex items-center gap-2 shrink-0",
86
- /** Check indicator container — inline, fixed 16x16, shown only when item is selected. */
87
- checkContainer: "flex h-4 w-4 shrink-0 items-center justify-center text-accent1",
88
- /** Check icon (single select) */
89
- checkIcon: "h-3.5 w-3.5",
90
- /** Checkbox container (multi select) */
91
- checkbox: "flex h-4 w-4 shrink-0 items-center justify-center rounded-[4px] border",
92
- /** Checkbox selected state */
93
- checkboxSelected: "bg-accent1 border-accent1",
94
- /** Checkbox unselected state */
95
- checkboxUnselected: "border-border2",
96
- /** Check icon for checkbox (multi select) */
97
- checkboxIcon: "h-3 w-3 text-surface1",
98
- /** Option content wrapper */
99
- optionContent: "flex items-center gap-2 w-full min-w-0",
100
- /** Option label/description wrapper */
101
- optionText: "flex flex-col gap-0.5 min-w-0",
102
- /** Option label */
103
- optionLabel: "truncate",
104
- /** Option description */
105
- optionDescription: "text-ui-sm text-neutral3 truncate",
106
- /** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */
107
- optionEnd: "ml-auto flex items-center shrink-0",
108
- /** Error message */
109
- error: "text-ui-sm text-accent2"
110
- };
111
-
112
- function MultiCombobox({
113
- options,
114
- value = [],
115
- onValueChange,
116
- placeholder = "Select options...",
117
- searchPlaceholder = "Search...",
118
- emptyText = "No option found.",
119
- className,
120
- disabled = false,
121
- variant = "default",
122
- size = "md",
123
- open,
124
- onOpenChange,
125
- container,
126
- error
127
- }) {
128
- const selectedOptions = options.filter((option) => value.includes(option.value));
129
- const handleSelect = (items) => {
130
- if (items) {
131
- onValueChange?.(items.map((item) => item.value));
132
- }
133
- };
134
- const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;
135
- return /* @__PURE__ */ jsxs("div", { className: comboboxStyles.root, children: [
136
- /* @__PURE__ */ jsxs(
137
- Combobox.Root,
138
- {
139
- multiple: true,
140
- items: options,
141
- value: selectedOptions,
142
- onValueChange: handleSelect,
143
- disabled,
144
- open,
145
- onOpenChange,
146
- children: [
147
- /* @__PURE__ */ jsxs(Combobox.Trigger, { className: comboboxTriggerClass({ variant, size, error: Boolean(error), className }), children: [
148
- /* @__PURE__ */ jsx("span", { className: cn("truncate", selectedOptions.length === 0 && comboboxStyles.placeholder), children: triggerText }),
149
- /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center", children: /* @__PURE__ */ jsx(ChevronsUpDown, { className: comboboxStyles.chevron }) })
150
- ] }),
151
- /* @__PURE__ */ jsx(Combobox.Portal, { container, children: /* @__PURE__ */ jsx(Combobox.Positioner, { align: "start", sideOffset: 4, className: comboboxStyles.positioner, children: /* @__PURE__ */ jsxs(Combobox.Popup, { className: comboboxStyles.popup, children: [
152
- /* @__PURE__ */ jsxs("div", { className: comboboxStyles.searchContainer, children: [
153
- /* @__PURE__ */ jsx(Search, { className: comboboxStyles.searchIcon }),
154
- /* @__PURE__ */ jsx(Combobox.Input, { className: comboboxStyles.searchInput, placeholder: searchPlaceholder })
155
- ] }),
156
- /* @__PURE__ */ jsx(Combobox.Empty, { className: comboboxStyles.empty, children: emptyText }),
157
- /* @__PURE__ */ jsx(Combobox.List, { className: comboboxStyles.list, children: (option) => {
158
- const isSelected = value.includes(option.value);
159
- return /* @__PURE__ */ jsxs(Combobox.Item, { value: option, className: comboboxStyles.itemMulti, children: [
160
- /* @__PURE__ */ jsx(
161
- "span",
162
- {
163
- className: cn(
164
- comboboxStyles.checkbox,
165
- isSelected ? comboboxStyles.checkboxSelected : comboboxStyles.checkboxUnselected
166
- ),
167
- children: isSelected && /* @__PURE__ */ jsx(Check, { className: comboboxStyles.checkboxIcon })
168
- }
169
- ),
170
- /* @__PURE__ */ jsxs("span", { className: comboboxStyles.optionContent, children: [
171
- option.start,
172
- /* @__PURE__ */ jsxs("span", { className: comboboxStyles.optionText, children: [
173
- /* @__PURE__ */ jsx("span", { className: comboboxStyles.optionLabel, children: option.label }),
174
- option.description && /* @__PURE__ */ jsx("span", { className: comboboxStyles.optionDescription, children: option.description })
175
- ] }),
176
- option.end ? /* @__PURE__ */ jsx("div", { className: comboboxStyles.optionEnd, children: option.end }) : null
177
- ] })
178
- ] }, option.value);
179
- } })
180
- ] }) }) })
181
- ]
182
- }
183
- ),
184
- error && /* @__PURE__ */ jsx("span", { className: comboboxStyles.error, children: error })
185
- ] });
186
- }
187
-
188
- export { MultiCombobox as M, comboboxTriggerClass as a, comboboxStyles as c };
189
- //# sourceMappingURL=multi-combobox-Y3gT0MqV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multi-combobox-Y3gT0MqV.js","sources":["../src/ds/components/Combobox/combobox-styles.ts","../src/ds/components/Combobox/multi-combobox.tsx"],"sourcesContent":["import { 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 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: cn(\n 'group/item relative flex cursor-pointer select-none items-center gap-2 rounded-md',\n 'pl-2.5 pr-2 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 /** Multi-select item — keeps the left checkbox slot, no right indicator. */\n itemMulti: cn(\n 'relative flex cursor-pointer select-none items-center gap-2.5 rounded-md',\n 'pl-2 pr-2.5 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 /** 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-accent1',\n\n /** Check icon (single select) */\n checkIcon: 'h-3.5 w-3.5',\n\n /** Checkbox container (multi select) */\n checkbox: 'flex h-4 w-4 shrink-0 items-center justify-center rounded-[4px] border',\n\n /** Checkbox selected state */\n checkboxSelected: 'bg-accent1 border-accent1',\n\n /** Checkbox unselected state */\n checkboxUnselected: 'border-border2',\n\n /** Check icon for checkbox (multi select) */\n checkboxIcon: 'h-3 w-3 text-surface1',\n\n /** Option content wrapper */\n optionContent: 'flex items-center gap-2 w-full min-w-0',\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 type { ComboboxOption } from './combobox';\nimport { comboboxStyles, comboboxTriggerClass } from './combobox-styles';\nimport type { ComboboxVariant } from './combobox-styles';\nimport type { TextButtonSize } from '@/ds/components/Button/Button';\nimport { cn } from '@/lib/utils';\n\nexport type { ComboboxOption };\n\nexport type MultiComboboxProps = {\n options: ComboboxOption[];\n value?: string[];\n onValueChange?: (value: string[]) => void;\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 function MultiCombobox({\n options,\n value = [],\n onValueChange,\n placeholder = 'Select options...',\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}: MultiComboboxProps) {\n const selectedOptions = options.filter(option => value.includes(option.value));\n\n const handleSelect = (items: ComboboxOption[] | null) => {\n if (items) {\n onValueChange?.(items.map(item => item.value));\n }\n };\n\n const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;\n\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n multiple\n items={options}\n value={selectedOptions}\n onValueChange={handleSelect}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n <BaseCombobox.Trigger className={comboboxTriggerClass({ variant, size, error: Boolean(error), className })}>\n <span className={cn('truncate', selectedOptions.length === 0 && comboboxStyles.placeholder)}>\n {triggerText}\n </span>\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={container}>\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 = value.includes(option.value);\n return (\n <BaseCombobox.Item key={option.value} value={option} className={comboboxStyles.itemMulti}>\n <span\n className={cn(\n comboboxStyles.checkbox,\n isSelected ? comboboxStyles.checkboxSelected : comboboxStyles.checkboxUnselected,\n )}\n >\n {isSelected && <Check className={comboboxStyles.checkboxIcon} />}\n </span>\n <span className={comboboxStyles.optionContent}>\n {option.start}\n <span className={comboboxStyles.optionText}>\n <span className={comboboxStyles.optionLabel}>{option.label}</span>\n {option.description && (\n <span className={comboboxStyles.optionDescription}>{option.description}</span>\n )}\n </span>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n </span>\n </BaseCombobox.Item>\n );\n }}\n </BaseCombobox.List>\n </BaseCombobox.Popup>\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n}\n"],"names":["BaseCombobox"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"property-filter-creator-B9tK0VY3.js","sources":["../src/ds/components/PropertyFilter/property-filter-actions.tsx","../src/ds/components/PropertyFilter/pick-multi-panel.tsx","../src/ds/components/PropertyFilter/property-filter-applied.tsx","../src/ds/components/PropertyFilter/property-filter-creator.tsx"],"sourcesContent":["import { EllipsisVerticalIcon, SaveIcon, Trash2Icon, XIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\n\nexport type PropertyFilterActionsProps = {\n disabled?: boolean;\n /** Neutralize each pill's value (keep pills, clear values). Shown as a button, not a menu item. */\n onClear?: () => void;\n /** Fully remove all active filters. Rendered as \"Remove all filters\" inside the overflow menu. */\n onRemoveAll?: () => void;\n /** Persist the current filter set (typically to localStorage) for later restoration. */\n onSave?: () => void;\n /** Drop a previously-saved filter set. Wire only when a saved set actually exists. */\n onRemoveSaved?: () => void;\n};\n\n/**\n * Shared action bar for filter-driven pages (traces, logs, …). Renders a\n * Clear button and an overflow menu with Remove all / Save / Remove saved actions.\n */\nexport function PropertyFilterActions({\n disabled,\n onClear,\n onRemoveAll,\n onSave,\n onRemoveSaved,\n}: PropertyFilterActionsProps) {\n const hasMenuItems = !!(onRemoveAll || onSave || onRemoveSaved);\n const showClear = !!onClear;\n if (!showClear && !hasMenuItems) return null;\n\n return (\n <div className=\"flex items-center gap-2\">\n {showClear && (\n <Button disabled={disabled} size=\"md\" onClick={() => onClear!()}>\n <XIcon />\n Clear\n </Button>\n )}\n\n {hasMenuItems && (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button disabled={disabled} size=\"md\" aria-label=\"More filter actions\">\n <EllipsisVerticalIcon />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {onRemoveAll && (\n <DropdownMenu.Item onSelect={() => onRemoveAll()}>\n <XIcon />\n Remove all filters\n </DropdownMenu.Item>\n )}\n {onRemoveAll && (onSave || onRemoveSaved) && <DropdownMenu.Separator />}\n {onSave && (\n <DropdownMenu.Item onSelect={() => onSave()}>\n <SaveIcon />\n Save filters for next time\n </DropdownMenu.Item>\n )}\n {onRemoveSaved && (\n <DropdownMenu.Item onSelect={() => onRemoveSaved()}>\n <Trash2Icon />\n Remove saved filters\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { Input } from '@/ds/components/Input';\nimport { RadioGroup, RadioGroupItem } from '@/ds/components/RadioGroup';\nimport { Spinner } from '@/ds/components/Spinner/spinner';\n\ntype PickMultiField = Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n\nexport type PickMultiPanelProps = {\n field: PickMultiField;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[] | undefined) => void;\n};\n\n/**\n * Reusable body for a pick-multi side popover: optional search input plus a\n * radio group (single-select) or checkbox list (when `field.multi` is true).\n * Shared between the Filter Creator's property-picker side popover and the\n * PropertyFilterApplied pill's inline editor so both surfaces use the exact same UI.\n */\nexport function PickMultiPanel({ field, tokens, onChange }: PickMultiPanelProps) {\n const [query, setQuery] = useState('');\n\n const filteredOptions = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return field.options;\n return field.options.filter(o => o.label.toLowerCase().includes(q));\n }, [field.options, query]);\n\n const token = useMemo(() => tokens.find(t => t.fieldId === field.id), [tokens, field.id]);\n // Fall back to `defaultValue` when no token exists — lets view-toggle fields (e.g. List mode)\n // show their default option pre-selected before the user explicitly picks one.\n const selectedValue = typeof token?.value === 'string' ? token.value : !field.multi ? field.defaultValue : undefined;\n const selectedValues = useMemo<string[]>(() => {\n if (Array.isArray(token?.value)) return token!.value as string[];\n if (typeof token?.value === 'string') return [token.value];\n return [];\n }, [token]);\n\n return (\n <>\n {field.searchable !== false && (\n <Input\n size=\"sm\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n placeholder={`Search ${field.label.toLowerCase()}...`}\n className=\"mb-2\"\n onKeyDown={e => {\n if (e.key !== 'ArrowDown') return;\n const panel = e.currentTarget.closest<HTMLElement>('[data-pick-multi-panel]');\n const first = panel?.querySelector<HTMLElement>('[data-pick-multi-item]:not([disabled])');\n if (!first) return;\n e.preventDefault();\n e.stopPropagation();\n first.focus();\n }}\n />\n )}\n\n {field.isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-ui-sm text-neutral3\">\n <Spinner size=\"sm\" className=\"size-3 text-neutral3\" />\n Loading options…\n </div>\n ) : filteredOptions.length === 0 ? (\n <div className=\"px-2 py-1.5 text-ui-sm text-neutral3\">{field.emptyText ?? 'No option found.'}</div>\n ) : field.multi ? (\n <div className=\"max-h-[80dvh] overflow-auto\">\n {filteredOptions.map(option => {\n const checked = selectedValues.includes(option.value);\n return (\n <label\n key={option.value}\n title={option.label}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 cursor-pointer focus-within:bg-surface4 focus-within:text-neutral6 min-w-0\"\n >\n <Checkbox\n data-pick-multi-item=\"\"\n checked={checked}\n onCheckedChange={next => {\n const isChecked = next === true;\n const nextValues = isChecked\n ? selectedValues.includes(option.value)\n ? selectedValues\n : [...selectedValues, option.value]\n : selectedValues.filter(v => v !== option.value);\n onChange(field.id, nextValues);\n }}\n className=\"shrink-0\"\n />\n <span className=\"truncate min-w-0 flex-1\">{option.label}</span>\n </label>\n );\n })}\n </div>\n ) : (\n <RadioGroup\n value={selectedValue ?? ''}\n onValueChange={value => onChange(field.id, value)}\n className=\"max-h-[80dvh] gap-0 overflow-auto\"\n >\n {filteredOptions.map(option => (\n <label\n key={option.value}\n title={option.label}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 cursor-pointer focus-within:bg-surface4 focus-within:text-neutral6 min-w-0\"\n >\n <RadioGroupItem data-pick-multi-item=\"\" value={option.value} className=\"shrink-0\" />\n <span className=\"truncate min-w-0 flex-1\">{option.label}</span>\n </label>\n ))}\n {!field.omitAnyOption && (\n <label\n title=\"Any\"\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 cursor-pointer focus-within:bg-surface4 focus-within:text-neutral6 min-w-0\"\n >\n <RadioGroupItem data-pick-multi-item=\"\" value=\"Any\" className=\"shrink-0\" />\n <span className=\"truncate min-w-0 flex-1\">Any</span>\n </label>\n )}\n </RadioGroup>\n )}\n </>\n );\n}\n","import { LockIcon, XIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '../Button';\nimport { ButtonsGroup, ButtonsGroupText } from '../ButtonsGroup';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../Tooltip';\nimport { PickMultiPanel } from './pick-multi-panel';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Input } from '@/ds/components/Input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover/popover';\n\nexport type PropertyFilterAppliedProps = {\n fields: PropertyFilterField[];\n tokens: PropertyFilterToken[];\n onTokensChange: (tokens: PropertyFilterToken[]) => void;\n disabled?: boolean;\n /**\n * Field id that was just added via the Creator — rendered pill auto-focuses\n * its input so the user can start typing immediately.\n */\n autoFocusFieldId?: string;\n /**\n * Field ids whose pills must remain visible and read-only — value stays\n * displayed but cannot be edited or removed. Use when an upstream context\n * (e.g. agent-scoped traces tab) pre-applies a filter that the user must\n * not be able to clear.\n */\n lockedFieldIds?: readonly string[];\n /** Tooltip content shown on hover/focus of any locked pill. */\n lockedTooltipContent?: ReactNode;\n};\n\nfunction stringifyTokenValue(value: string | string[]) {\n if (Array.isArray(value)) return value.length === 0 ? 'Any' : value.join(', ');\n return value;\n}\n\nconst DEFAULT_LOCKED_TOOLTIP = 'This filter is set by the current context and cannot be removed here.';\n\nfunction lookupOptionLabel(field: PropertyFilterField, value: string | string[]): string {\n if (field.kind === 'pick-multi' && field.options) {\n if (Array.isArray(value)) {\n if (value.length === 0) return 'Any';\n return value.map(v => field.options.find(o => o.value === v)?.label ?? v).join(', ');\n }\n return field.options.find(o => o.value === value)?.label ?? value;\n }\n return stringifyTokenValue(value);\n}\n\ntype LockedTokenPillProps = {\n field: PropertyFilterField;\n value: string | string[];\n tooltipContent: ReactNode;\n};\n\nfunction LockedTokenPill({ field, value, tooltipContent }: LockedTokenPillProps) {\n const display = lookupOptionLabel(field, value);\n const lockA11yLabel = `${field.label} filter is locked by context`;\n\n return (\n <TooltipProvider delayDuration={150}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ButtonsGroup\n spacing=\"close\"\n data-locked-field-id={field.id}\n data-property-filter-pill=\"locked\"\n tabIndex={0}\n aria-label={lockA11yLabel}\n >\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">{display}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">\n <LockIcon />\n </ButtonsGroupText>\n </ButtonsGroup>\n </TooltipTrigger>\n <TooltipContent>{tooltipContent}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\ntype TextTokenPillProps = {\n field: Extract<PropertyFilterField, { kind: 'text' }>;\n value: string;\n onChange: (value: string) => void;\n onRemove: () => void;\n disabled?: boolean;\n autoFocus?: boolean;\n};\n\nfunction TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }: TextTokenPillProps) {\n // Local draft keeps the caret stable when the URL round-trip trims the\n // stored value (e.g. trailing spaces). We only re-sync from the prop when\n // the external value is genuinely different from our current (trimmed) draft.\n const [draft, setDraft] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (draft.trim() !== value) setDraft(value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus();\n }, [autoFocus]);\n\n return (\n <ButtonsGroup spacing=\"close\">\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <Input\n ref={inputRef}\n size=\"md\"\n disabled={disabled}\n value={draft}\n placeholder={field.placeholder ?? `Enter ${field.label}`}\n onChange={e => {\n const next = e.target.value;\n setDraft(next);\n // Apply live — URL and traces query update on every keystroke.\n // Empty values persist as empty-value tokens so the pill stays visible.\n if (next.trim() !== value) onChange(next);\n }}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n const trimmed = draft.trim();\n if (trimmed !== value) onChange(trimmed);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(value);\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n <Button\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove ${field.label} filter`}\n size=\"md\"\n onMouseDown={e => e.preventDefault()}\n onClick={onRemove}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n}\n\ntype PickMultiTokenPillProps = {\n field: Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n token: PropertyFilterToken;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[] | undefined) => void;\n onRemove: () => void;\n disabled?: boolean;\n};\n\nfunction PickMultiTokenPill({ field, token, tokens, onChange, onRemove, disabled }: PickMultiTokenPillProps) {\n const [open, setOpen] = useState(false);\n\n return (\n <ButtonsGroup spacing=\"close\">\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" disabled={disabled} size=\"md\">\n {stringifyTokenValue(token.value)}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" sideOffset={8} className=\"w-64 p-2\" data-pick-multi-panel>\n <PickMultiPanel field={field} tokens={tokens} onChange={onChange} />\n </PopoverContent>\n </Popover>\n <Button\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove ${field.label} filter`}\n size=\"md\"\n onClick={onRemove}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n}\n\n/**\n * Applied filter pills. Text/id-style tokens render with an always-active\n * input so the user can edit the value inline (and an empty token is valid —\n * it persists in the URL until the user explicitly removes it via ×).\n * Pick-multi tokens render with a clickable value that opens the same side\n * popover as the Filter Creator so the user can update selections in place.\n * Creation lives in a separate component (PropertyFilterCreator).\n */\nexport function PropertyFilterApplied({\n fields,\n tokens,\n onTokensChange,\n disabled,\n autoFocusFieldId,\n lockedFieldIds,\n lockedTooltipContent = DEFAULT_LOCKED_TOOLTIP,\n}: PropertyFilterAppliedProps) {\n if (tokens.length === 0) return null;\n\n const lockedSet = new Set(lockedFieldIds ?? []);\n\n const replaceTokenAt = (index: number, next: PropertyFilterToken) => {\n const copy = [...tokens];\n copy[index] = next;\n onTokensChange(copy);\n };\n\n const removeTokenAt = (index: number) => {\n onTokensChange(tokens.filter((_, i) => i !== index));\n };\n\n return (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {tokens.map((token, index) => {\n const field = fields.find(f => f.id === token.fieldId);\n if (!field) return null;\n\n if (lockedSet.has(token.fieldId)) {\n return (\n <LockedTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n value={token.value}\n tooltipContent={lockedTooltipContent}\n />\n );\n }\n\n if (field.kind === 'text' && typeof token.value === 'string') {\n return (\n <TextTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n value={token.value}\n disabled={disabled}\n autoFocus={autoFocusFieldId === token.fieldId}\n onChange={nextValue => replaceTokenAt(index, { fieldId: token.fieldId, value: nextValue })}\n onRemove={() => removeTokenAt(index)}\n />\n );\n }\n\n if (field.kind === 'pick-multi') {\n return (\n <PickMultiTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n token={token}\n tokens={tokens}\n disabled={disabled}\n onChange={(fieldId, value) => {\n // Unselecting everything (empty array) keeps the pill alive in\n // a neutral state — the user explicitly removes it via ×. This\n // lets the page-level Reset neutralize values without dropping\n // the pill structure.\n if (value === undefined) {\n removeTokenAt(index);\n return;\n }\n replaceTokenAt(index, { fieldId, value });\n }}\n onRemove={() => removeTokenAt(index)}\n />\n );\n }\n\n return (\n <ButtonsGroup spacing=\"close\" key={`${token.fieldId}-${index}`}>\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">{stringifyTokenValue(token.value)}</ButtonsGroupText>\n <Button\n type=\"button\"\n disabled={disabled}\n size=\"md\"\n aria-label={`Remove ${field.label} filter`}\n onClick={() => removeTokenAt(index)}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n })}\n </div>\n );\n}\n","import { ArrowLeftIcon, ChevronRightIcon, FilterIcon, ListFilterPlusIcon, PlusIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { PickMultiPanel } from './pick-multi-panel';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { MultiCombobox } from '@/ds/components/Combobox/multi-combobox';\nimport { Input } from '@/ds/components/Input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type PropertyFilterCreatorProps = {\n fields: PropertyFilterField[];\n tokens: PropertyFilterToken[];\n onTokensChange: (tokens: PropertyFilterToken[]) => void;\n label?: string;\n disabled?: boolean;\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Called when the user picks a text (id-style) field. Consumers are expected\n * to render a pending applied-filter pill with an active input so the user\n * can type the value inline instead of in this popover.\n */\n onStartTextFilter?: (fieldId: string) => void;\n /**\n * Field ids hidden from the Add Filter dropdown. Use to prevent users from\n * recreating a filter that an upstream context already owns (e.g. the agent\n * id when viewing the agent-scoped traces tab).\n */\n hiddenFieldIds?: readonly string[];\n};\n\n/**\n * Minimal Linear-style filter creator: a `+ Filter` button whose popover walks\n * the user through property → value → commit. For id-style text fields, the\n * picker closes immediately and the applied-filter pill owns the input. For\n * `pick-multi` fields (e.g. Root Entity Name) hovering the item opens a\n * separate side popover with checkboxes — each check adds its own applied\n * filter and the main popover stays open so users can pick many.\n */\nexport function PropertyFilterCreator({\n fields,\n tokens,\n onTokensChange,\n label = 'Add Filter',\n disabled,\n size,\n onStartTextFilter,\n hiddenFieldIds,\n}: PropertyFilterCreatorProps) {\n const visibleFields = useMemo(() => {\n if (!hiddenFieldIds || hiddenFieldIds.length === 0) return fields;\n const hidden = new Set(hiddenFieldIds);\n return fields.filter(f => !hidden.has(f.id));\n }, [fields, hiddenFieldIds]);\n const [open, setOpen] = useState(false);\n const [fieldId, setFieldId] = useState<string | undefined>();\n const [textValue, setTextValue] = useState('');\n const [multiValue, setMultiValue] = useState<string[]>([]);\n const [error, setError] = useState<string | undefined>();\n // Single source of truth for which pick-multi side panel is open. Opens only\n // via explicit click/keyboard press on the menu item — no hover/focus\n // auto-open (was too flicker-prone).\n const [openPickMultiFieldId, setOpenPickMultiFieldId] = useState<string | undefined>();\n\n const textInputRef = useRef<HTMLInputElement>(null);\n // When the user picks a text field we close this popover and hand off focus\n // to the newly-created pill's input — prevent Radix from returning focus to\n // the trigger button in that case.\n const skipCloseFocusRef = useRef(false);\n\n const togglePickMulti = useCallback((id: string) => {\n setOpenPickMultiFieldId(current => (current === id ? undefined : id));\n }, []);\n const closePickMulti = useCallback(() => setOpenPickMultiFieldId(undefined), []);\n\n useEffect(() => {\n if (!open) setOpenPickMultiFieldId(undefined);\n }, [open]);\n\n const selectedField = useMemo(() => visibleFields.find(f => f.id === fieldId), [visibleFields, fieldId]);\n // Only single-use kinds (text, multi-select) count as \"used\". `pick-multi`\n // allows multiple tokens with the same fieldId.\n const singleUseFieldIds = useMemo(() => {\n const ids = new Set<string>();\n for (const token of tokens) {\n const field = fields.find(f => f.id === token.fieldId);\n if (field && field.kind !== 'pick-multi') ids.add(token.fieldId);\n }\n return ids;\n }, [tokens, fields]);\n\n const reset = useCallback(() => {\n setFieldId(undefined);\n setTextValue('');\n setMultiValue([]);\n setError(undefined);\n }, []);\n\n useEffect(() => {\n if (!open) reset();\n }, [open, reset]);\n\n useEffect(() => {\n if (!open) return;\n if (selectedField?.kind === 'text') textInputRef.current?.focus();\n }, [open, selectedField]);\n\n /**\n * Replace whatever token exists for `fieldId` with the given value. Used by\n * both single-select (radio) and multi-select (checkbox) pick-multi panels.\n * Pass `undefined` or `[]` to remove the token entirely.\n */\n const replacePickMultiToken = useCallback(\n (fieldId: string, value: string | string[] | undefined) => {\n const existingIndex = tokens.findIndex(t => t.fieldId === fieldId);\n const shouldRemove = value === undefined || (Array.isArray(value) && value.length === 0);\n\n if (shouldRemove) {\n if (existingIndex === -1) return;\n onTokensChange(tokens.filter((_, i) => i !== existingIndex));\n return;\n }\n\n if (existingIndex === -1) {\n onTokensChange([...tokens, { fieldId, value }]);\n return;\n }\n\n const nextTokens = [...tokens];\n nextTokens[existingIndex] = { fieldId, value };\n onTokensChange(nextTokens);\n },\n [onTokensChange, tokens],\n );\n\n const commit = useCallback(() => {\n if (!selectedField) {\n setError('Choose a property first.');\n return;\n }\n if (singleUseFieldIds.has(selectedField.id)) {\n setError(`Remove the existing ${selectedField.label} filter before adding another.`);\n return;\n }\n if (selectedField.kind === 'text' && !textValue.trim()) {\n setError(`Enter a value for ${selectedField.label}.`);\n return;\n }\n if (selectedField.kind === 'multi-select' && multiValue.length === 0) {\n setError(`Choose at least one ${selectedField.label.toLowerCase()} value.`);\n return;\n }\n const token: PropertyFilterToken =\n selectedField.kind === 'multi-select'\n ? { fieldId: selectedField.id, value: multiValue }\n : { fieldId: selectedField.id, value: (textValue as string).trim() };\n onTokensChange([...tokens, token]);\n setOpen(false);\n }, [multiValue, onTokensChange, selectedField, singleUseFieldIds, textValue, tokens]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size={size} disabled={disabled}>\n <ListFilterPlusIcon />\n {label}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"p-3 w-64\"\n initialFocus={false}\n finalFocus={() => {\n if (skipCloseFocusRef.current) {\n skipCloseFocusRef.current = false;\n return false;\n }\n return true;\n }}\n >\n <div className=\"grid gap-3\">\n {selectedField && (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Back to properties\"\n className=\"text-neutral3 hover:text-neutral6 transition-colors\"\n onClick={() => {\n setFieldId(undefined);\n setTextValue('');\n setMultiValue([]);\n setError(undefined);\n }}\n >\n <ArrowLeftIcon className=\"h-4 w-4\" />\n </button>\n <FilterIcon className=\"h-4 w-4 shrink-0 text-neutral3\" />\n <span className=\"text-ui-sm text-neutral3\">{`${selectedField.label} · is`}</span>\n </div>\n )}\n\n {!selectedField && (\n <div\n role=\"menu\"\n className=\"max-h-[80dvh] overflow-auto\"\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>('[data-filter-item]:not([disabled])'),\n );\n if (buttons.length === 0) return;\n e.preventDefault();\n const active = document.activeElement as HTMLElement | null;\n const current = buttons.findIndex(b => b === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = buttons.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % buttons.length;\n else next = current <= 0 ? buttons.length - 1 : current - 1;\n buttons[next]?.focus();\n }}\n >\n {visibleFields.length > 0 ? (\n visibleFields.map(f => {\n const used = singleUseFieldIds.has(f.id);\n if (f.kind === 'pick-multi') {\n return (\n <PickMultiMenuItem\n key={f.id}\n field={f}\n tokens={tokens}\n onChange={replacePickMultiToken}\n open={openPickMultiFieldId === f.id}\n onToggle={togglePickMulti}\n onClose={closePickMulti}\n />\n );\n }\n return (\n <button\n key={f.id}\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'group flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md transition-colors',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n used\n ? 'cursor-not-allowed text-neutral2 opacity-70'\n : 'text-neutral4 hover:bg-surface4 hover:text-neutral6',\n )}\n disabled={used}\n onClick={() => {\n setError(undefined);\n if (f.kind === 'text') {\n onTokensChange([...tokens, { fieldId: f.id, value: '' }]);\n onStartTextFilter?.(f.id);\n skipCloseFocusRef.current = true;\n setOpen(false);\n return;\n }\n setFieldId(f.id);\n }}\n >\n <span className=\"truncate\">{f.label}</span>\n {used ? (\n <span className=\"ml-auto text-neutral3\">In use</span>\n ) : (\n <PlusIcon className=\"ml-auto h-4 w-4 text-neutral3 opacity-0 transition-opacity group-hover:opacity-100 group-focus:opacity-100\" />\n )}\n </button>\n );\n })\n ) : (\n <div className=\"px-2 py-1.5 text-ui-sm text-neutral3\">No matching property.</div>\n )}\n </div>\n )}\n\n {selectedField && selectedField.kind === 'text' && (\n <Input\n ref={textInputRef}\n size=\"md\"\n value={textValue}\n onChange={e => {\n setTextValue(e.target.value);\n setError(undefined);\n }}\n placeholder={selectedField.placeholder ?? `Enter ${selectedField.label}`}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n }\n }}\n />\n )}\n\n {selectedField && selectedField.kind === 'multi-select' && (\n <MultiCombobox\n options={selectedField.options ?? []}\n value={multiValue}\n onValueChange={v => {\n setMultiValue(v);\n setError(undefined);\n }}\n placeholder={selectedField.placeholder ?? `Choose ${selectedField.label}`}\n searchPlaceholder={`Search ${selectedField.label.toLowerCase()}...`}\n emptyText={selectedField.emptyText ?? 'No option found.'}\n size=\"md\"\n />\n )}\n\n {error && <div className=\"text-ui-sm text-red-500\">{error}</div>}\n\n {selectedField && selectedField.kind !== 'pick-multi' && (\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"ghost\" size=\"md\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"outline\" size=\"md\" onClick={commit}>\n Add filter\n </Button>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PickMultiField = Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n\ntype PickMultiMenuItemProps = {\n field: PickMultiField;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[] | undefined) => void;\n open: boolean;\n onToggle: (fieldId: string) => void;\n onClose: () => void;\n};\n\n/**\n * A property-picker menu item that opens a separate Radix popover (portaled to\n * the side) with a radio group (single-select) or checkbox list (multi-select,\n * `field.multi === true`). Open/close is driven by explicit click / keyboard\n * press; the panel only closes when the user clicks outside, presses Escape,\n * or clicks the row again to toggle it off.\n */\nfunction PickMultiMenuItem({ field, tokens, onChange, open, onToggle, onClose }: PickMultiMenuItemProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <Popover\n open={open}\n onOpenChange={next => {\n if (next) onToggle(field.id);\n else onClose();\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 transition-colors',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n )}\n onKeyDown={e => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n if (!open) onToggle(field.id);\n e.preventDefault();\n requestAnimationFrame(() => {\n const first = contentRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n first?.focus();\n });\n }}\n >\n {open && <ChevronRightIcon className=\"h-4 w-4 text-neutral3 shrink-0\" />}\n <span className=\"truncate\">{field.label}</span>\n {!open && <ChevronRightIcon className=\"h-4 w-4 ml-auto text-neutral3 shrink-0\" />}\n </button>\n </PopoverTrigger>\n <PopoverContent\n ref={contentRef}\n side=\"right\"\n align=\"start\"\n sideOffset={8}\n className=\"w-64 p-2\"\n initialFocus={false}\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const items = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>('[data-pick-multi-item]:not([disabled])'),\n );\n if (items.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n const active = document.activeElement as HTMLElement | null;\n const current = items.findIndex(el => el === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = items.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % items.length;\n else next = current <= 0 ? items.length - 1 : current - 1;\n items[next]?.focus();\n }}\n data-pick-multi-panel\n >\n <PickMultiPanel field={field} tokens={tokens} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["fieldId"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"property-filter-creator-DU8pl6-6.cjs","sources":["../src/ds/components/PropertyFilter/property-filter-actions.tsx","../src/ds/components/PropertyFilter/pick-multi-panel.tsx","../src/ds/components/PropertyFilter/property-filter-applied.tsx","../src/ds/components/PropertyFilter/property-filter-creator.tsx"],"sourcesContent":["import { EllipsisVerticalIcon, SaveIcon, Trash2Icon, XIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\n\nexport type PropertyFilterActionsProps = {\n disabled?: boolean;\n /** Neutralize each pill's value (keep pills, clear values). Shown as a button, not a menu item. */\n onClear?: () => void;\n /** Fully remove all active filters. Rendered as \"Remove all filters\" inside the overflow menu. */\n onRemoveAll?: () => void;\n /** Persist the current filter set (typically to localStorage) for later restoration. */\n onSave?: () => void;\n /** Drop a previously-saved filter set. Wire only when a saved set actually exists. */\n onRemoveSaved?: () => void;\n};\n\n/**\n * Shared action bar for filter-driven pages (traces, logs, …). Renders a\n * Clear button and an overflow menu with Remove all / Save / Remove saved actions.\n */\nexport function PropertyFilterActions({\n disabled,\n onClear,\n onRemoveAll,\n onSave,\n onRemoveSaved,\n}: PropertyFilterActionsProps) {\n const hasMenuItems = !!(onRemoveAll || onSave || onRemoveSaved);\n const showClear = !!onClear;\n if (!showClear && !hasMenuItems) return null;\n\n return (\n <div className=\"flex items-center gap-2\">\n {showClear && (\n <Button disabled={disabled} size=\"md\" onClick={() => onClear!()}>\n <XIcon />\n Clear\n </Button>\n )}\n\n {hasMenuItems && (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button disabled={disabled} size=\"md\" aria-label=\"More filter actions\">\n <EllipsisVerticalIcon />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {onRemoveAll && (\n <DropdownMenu.Item onSelect={() => onRemoveAll()}>\n <XIcon />\n Remove all filters\n </DropdownMenu.Item>\n )}\n {onRemoveAll && (onSave || onRemoveSaved) && <DropdownMenu.Separator />}\n {onSave && (\n <DropdownMenu.Item onSelect={() => onSave()}>\n <SaveIcon />\n Save filters for next time\n </DropdownMenu.Item>\n )}\n {onRemoveSaved && (\n <DropdownMenu.Item onSelect={() => onRemoveSaved()}>\n <Trash2Icon />\n Remove saved filters\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { Input } from '@/ds/components/Input';\nimport { RadioGroup, RadioGroupItem } from '@/ds/components/RadioGroup';\nimport { Spinner } from '@/ds/components/Spinner/spinner';\n\ntype PickMultiField = Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n\nexport type PickMultiPanelProps = {\n field: PickMultiField;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[] | undefined) => void;\n};\n\n/**\n * Reusable body for a pick-multi side popover: optional search input plus a\n * radio group (single-select) or checkbox list (when `field.multi` is true).\n * Shared between the Filter Creator's property-picker side popover and the\n * PropertyFilterApplied pill's inline editor so both surfaces use the exact same UI.\n */\nexport function PickMultiPanel({ field, tokens, onChange }: PickMultiPanelProps) {\n const [query, setQuery] = useState('');\n\n const filteredOptions = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return field.options;\n return field.options.filter(o => o.label.toLowerCase().includes(q));\n }, [field.options, query]);\n\n const token = useMemo(() => tokens.find(t => t.fieldId === field.id), [tokens, field.id]);\n // Fall back to `defaultValue` when no token exists — lets view-toggle fields (e.g. List mode)\n // show their default option pre-selected before the user explicitly picks one.\n const selectedValue = typeof token?.value === 'string' ? token.value : !field.multi ? field.defaultValue : undefined;\n const selectedValues = useMemo<string[]>(() => {\n if (Array.isArray(token?.value)) return token!.value as string[];\n if (typeof token?.value === 'string') return [token.value];\n return [];\n }, [token]);\n\n return (\n <>\n {field.searchable !== false && (\n <Input\n size=\"sm\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n placeholder={`Search ${field.label.toLowerCase()}...`}\n className=\"mb-2\"\n onKeyDown={e => {\n if (e.key !== 'ArrowDown') return;\n const panel = e.currentTarget.closest<HTMLElement>('[data-pick-multi-panel]');\n const first = panel?.querySelector<HTMLElement>('[data-pick-multi-item]:not([disabled])');\n if (!first) return;\n e.preventDefault();\n e.stopPropagation();\n first.focus();\n }}\n />\n )}\n\n {field.isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-ui-sm text-neutral3\">\n <Spinner size=\"sm\" className=\"size-3 text-neutral3\" />\n Loading options…\n </div>\n ) : filteredOptions.length === 0 ? (\n <div className=\"px-2 py-1.5 text-ui-sm text-neutral3\">{field.emptyText ?? 'No option found.'}</div>\n ) : field.multi ? (\n <div className=\"max-h-[80dvh] overflow-auto\">\n {filteredOptions.map(option => {\n const checked = selectedValues.includes(option.value);\n return (\n <label\n key={option.value}\n title={option.label}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 cursor-pointer focus-within:bg-surface4 focus-within:text-neutral6 min-w-0\"\n >\n <Checkbox\n data-pick-multi-item=\"\"\n checked={checked}\n onCheckedChange={next => {\n const isChecked = next === true;\n const nextValues = isChecked\n ? selectedValues.includes(option.value)\n ? selectedValues\n : [...selectedValues, option.value]\n : selectedValues.filter(v => v !== option.value);\n onChange(field.id, nextValues);\n }}\n className=\"shrink-0\"\n />\n <span className=\"truncate min-w-0 flex-1\">{option.label}</span>\n </label>\n );\n })}\n </div>\n ) : (\n <RadioGroup\n value={selectedValue ?? ''}\n onValueChange={value => onChange(field.id, value)}\n className=\"max-h-[80dvh] gap-0 overflow-auto\"\n >\n {filteredOptions.map(option => (\n <label\n key={option.value}\n title={option.label}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 cursor-pointer focus-within:bg-surface4 focus-within:text-neutral6 min-w-0\"\n >\n <RadioGroupItem data-pick-multi-item=\"\" value={option.value} className=\"shrink-0\" />\n <span className=\"truncate min-w-0 flex-1\">{option.label}</span>\n </label>\n ))}\n {!field.omitAnyOption && (\n <label\n title=\"Any\"\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 cursor-pointer focus-within:bg-surface4 focus-within:text-neutral6 min-w-0\"\n >\n <RadioGroupItem data-pick-multi-item=\"\" value=\"Any\" className=\"shrink-0\" />\n <span className=\"truncate min-w-0 flex-1\">Any</span>\n </label>\n )}\n </RadioGroup>\n )}\n </>\n );\n}\n","import { LockIcon, XIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '../Button';\nimport { ButtonsGroup, ButtonsGroupText } from '../ButtonsGroup';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../Tooltip';\nimport { PickMultiPanel } from './pick-multi-panel';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Input } from '@/ds/components/Input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover/popover';\n\nexport type PropertyFilterAppliedProps = {\n fields: PropertyFilterField[];\n tokens: PropertyFilterToken[];\n onTokensChange: (tokens: PropertyFilterToken[]) => void;\n disabled?: boolean;\n /**\n * Field id that was just added via the Creator — rendered pill auto-focuses\n * its input so the user can start typing immediately.\n */\n autoFocusFieldId?: string;\n /**\n * Field ids whose pills must remain visible and read-only — value stays\n * displayed but cannot be edited or removed. Use when an upstream context\n * (e.g. agent-scoped traces tab) pre-applies a filter that the user must\n * not be able to clear.\n */\n lockedFieldIds?: readonly string[];\n /** Tooltip content shown on hover/focus of any locked pill. */\n lockedTooltipContent?: ReactNode;\n};\n\nfunction stringifyTokenValue(value: string | string[]) {\n if (Array.isArray(value)) return value.length === 0 ? 'Any' : value.join(', ');\n return value;\n}\n\nconst DEFAULT_LOCKED_TOOLTIP = 'This filter is set by the current context and cannot be removed here.';\n\nfunction lookupOptionLabel(field: PropertyFilterField, value: string | string[]): string {\n if (field.kind === 'pick-multi' && field.options) {\n if (Array.isArray(value)) {\n if (value.length === 0) return 'Any';\n return value.map(v => field.options.find(o => o.value === v)?.label ?? v).join(', ');\n }\n return field.options.find(o => o.value === value)?.label ?? value;\n }\n return stringifyTokenValue(value);\n}\n\ntype LockedTokenPillProps = {\n field: PropertyFilterField;\n value: string | string[];\n tooltipContent: ReactNode;\n};\n\nfunction LockedTokenPill({ field, value, tooltipContent }: LockedTokenPillProps) {\n const display = lookupOptionLabel(field, value);\n const lockA11yLabel = `${field.label} filter is locked by context`;\n\n return (\n <TooltipProvider delayDuration={150}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ButtonsGroup\n spacing=\"close\"\n data-locked-field-id={field.id}\n data-property-filter-pill=\"locked\"\n tabIndex={0}\n aria-label={lockA11yLabel}\n >\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">{display}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">\n <LockIcon />\n </ButtonsGroupText>\n </ButtonsGroup>\n </TooltipTrigger>\n <TooltipContent>{tooltipContent}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\ntype TextTokenPillProps = {\n field: Extract<PropertyFilterField, { kind: 'text' }>;\n value: string;\n onChange: (value: string) => void;\n onRemove: () => void;\n disabled?: boolean;\n autoFocus?: boolean;\n};\n\nfunction TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }: TextTokenPillProps) {\n // Local draft keeps the caret stable when the URL round-trip trims the\n // stored value (e.g. trailing spaces). We only re-sync from the prop when\n // the external value is genuinely different from our current (trimmed) draft.\n const [draft, setDraft] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (draft.trim() !== value) setDraft(value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus();\n }, [autoFocus]);\n\n return (\n <ButtonsGroup spacing=\"close\">\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <Input\n ref={inputRef}\n size=\"md\"\n disabled={disabled}\n value={draft}\n placeholder={field.placeholder ?? `Enter ${field.label}`}\n onChange={e => {\n const next = e.target.value;\n setDraft(next);\n // Apply live — URL and traces query update on every keystroke.\n // Empty values persist as empty-value tokens so the pill stays visible.\n if (next.trim() !== value) onChange(next);\n }}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n const trimmed = draft.trim();\n if (trimmed !== value) onChange(trimmed);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(value);\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n <Button\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove ${field.label} filter`}\n size=\"md\"\n onMouseDown={e => e.preventDefault()}\n onClick={onRemove}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n}\n\ntype PickMultiTokenPillProps = {\n field: Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n token: PropertyFilterToken;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[] | undefined) => void;\n onRemove: () => void;\n disabled?: boolean;\n};\n\nfunction PickMultiTokenPill({ field, token, tokens, onChange, onRemove, disabled }: PickMultiTokenPillProps) {\n const [open, setOpen] = useState(false);\n\n return (\n <ButtonsGroup spacing=\"close\">\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" disabled={disabled} size=\"md\">\n {stringifyTokenValue(token.value)}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" sideOffset={8} className=\"w-64 p-2\" data-pick-multi-panel>\n <PickMultiPanel field={field} tokens={tokens} onChange={onChange} />\n </PopoverContent>\n </Popover>\n <Button\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove ${field.label} filter`}\n size=\"md\"\n onClick={onRemove}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n}\n\n/**\n * Applied filter pills. Text/id-style tokens render with an always-active\n * input so the user can edit the value inline (and an empty token is valid —\n * it persists in the URL until the user explicitly removes it via ×).\n * Pick-multi tokens render with a clickable value that opens the same side\n * popover as the Filter Creator so the user can update selections in place.\n * Creation lives in a separate component (PropertyFilterCreator).\n */\nexport function PropertyFilterApplied({\n fields,\n tokens,\n onTokensChange,\n disabled,\n autoFocusFieldId,\n lockedFieldIds,\n lockedTooltipContent = DEFAULT_LOCKED_TOOLTIP,\n}: PropertyFilterAppliedProps) {\n if (tokens.length === 0) return null;\n\n const lockedSet = new Set(lockedFieldIds ?? []);\n\n const replaceTokenAt = (index: number, next: PropertyFilterToken) => {\n const copy = [...tokens];\n copy[index] = next;\n onTokensChange(copy);\n };\n\n const removeTokenAt = (index: number) => {\n onTokensChange(tokens.filter((_, i) => i !== index));\n };\n\n return (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {tokens.map((token, index) => {\n const field = fields.find(f => f.id === token.fieldId);\n if (!field) return null;\n\n if (lockedSet.has(token.fieldId)) {\n return (\n <LockedTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n value={token.value}\n tooltipContent={lockedTooltipContent}\n />\n );\n }\n\n if (field.kind === 'text' && typeof token.value === 'string') {\n return (\n <TextTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n value={token.value}\n disabled={disabled}\n autoFocus={autoFocusFieldId === token.fieldId}\n onChange={nextValue => replaceTokenAt(index, { fieldId: token.fieldId, value: nextValue })}\n onRemove={() => removeTokenAt(index)}\n />\n );\n }\n\n if (field.kind === 'pick-multi') {\n return (\n <PickMultiTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n token={token}\n tokens={tokens}\n disabled={disabled}\n onChange={(fieldId, value) => {\n // Unselecting everything (empty array) keeps the pill alive in\n // a neutral state — the user explicitly removes it via ×. This\n // lets the page-level Reset neutralize values without dropping\n // the pill structure.\n if (value === undefined) {\n removeTokenAt(index);\n return;\n }\n replaceTokenAt(index, { fieldId, value });\n }}\n onRemove={() => removeTokenAt(index)}\n />\n );\n }\n\n return (\n <ButtonsGroup spacing=\"close\" key={`${token.fieldId}-${index}`}>\n <ButtonsGroupText size=\"md\">{field.label}</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">is</ButtonsGroupText>\n <ButtonsGroupText size=\"md\">{stringifyTokenValue(token.value)}</ButtonsGroupText>\n <Button\n type=\"button\"\n disabled={disabled}\n size=\"md\"\n aria-label={`Remove ${field.label} filter`}\n onClick={() => removeTokenAt(index)}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n })}\n </div>\n );\n}\n","import { ArrowLeftIcon, ChevronRightIcon, FilterIcon, ListFilterPlusIcon, PlusIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { PickMultiPanel } from './pick-multi-panel';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { MultiCombobox } from '@/ds/components/Combobox/multi-combobox';\nimport { Input } from '@/ds/components/Input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type PropertyFilterCreatorProps = {\n fields: PropertyFilterField[];\n tokens: PropertyFilterToken[];\n onTokensChange: (tokens: PropertyFilterToken[]) => void;\n label?: string;\n disabled?: boolean;\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Called when the user picks a text (id-style) field. Consumers are expected\n * to render a pending applied-filter pill with an active input so the user\n * can type the value inline instead of in this popover.\n */\n onStartTextFilter?: (fieldId: string) => void;\n /**\n * Field ids hidden from the Add Filter dropdown. Use to prevent users from\n * recreating a filter that an upstream context already owns (e.g. the agent\n * id when viewing the agent-scoped traces tab).\n */\n hiddenFieldIds?: readonly string[];\n};\n\n/**\n * Minimal Linear-style filter creator: a `+ Filter` button whose popover walks\n * the user through property → value → commit. For id-style text fields, the\n * picker closes immediately and the applied-filter pill owns the input. For\n * `pick-multi` fields (e.g. Root Entity Name) hovering the item opens a\n * separate side popover with checkboxes — each check adds its own applied\n * filter and the main popover stays open so users can pick many.\n */\nexport function PropertyFilterCreator({\n fields,\n tokens,\n onTokensChange,\n label = 'Add Filter',\n disabled,\n size,\n onStartTextFilter,\n hiddenFieldIds,\n}: PropertyFilterCreatorProps) {\n const visibleFields = useMemo(() => {\n if (!hiddenFieldIds || hiddenFieldIds.length === 0) return fields;\n const hidden = new Set(hiddenFieldIds);\n return fields.filter(f => !hidden.has(f.id));\n }, [fields, hiddenFieldIds]);\n const [open, setOpen] = useState(false);\n const [fieldId, setFieldId] = useState<string | undefined>();\n const [textValue, setTextValue] = useState('');\n const [multiValue, setMultiValue] = useState<string[]>([]);\n const [error, setError] = useState<string | undefined>();\n // Single source of truth for which pick-multi side panel is open. Opens only\n // via explicit click/keyboard press on the menu item — no hover/focus\n // auto-open (was too flicker-prone).\n const [openPickMultiFieldId, setOpenPickMultiFieldId] = useState<string | undefined>();\n\n const textInputRef = useRef<HTMLInputElement>(null);\n // When the user picks a text field we close this popover and hand off focus\n // to the newly-created pill's input — prevent Radix from returning focus to\n // the trigger button in that case.\n const skipCloseFocusRef = useRef(false);\n\n const togglePickMulti = useCallback((id: string) => {\n setOpenPickMultiFieldId(current => (current === id ? undefined : id));\n }, []);\n const closePickMulti = useCallback(() => setOpenPickMultiFieldId(undefined), []);\n\n useEffect(() => {\n if (!open) setOpenPickMultiFieldId(undefined);\n }, [open]);\n\n const selectedField = useMemo(() => visibleFields.find(f => f.id === fieldId), [visibleFields, fieldId]);\n // Only single-use kinds (text, multi-select) count as \"used\". `pick-multi`\n // allows multiple tokens with the same fieldId.\n const singleUseFieldIds = useMemo(() => {\n const ids = new Set<string>();\n for (const token of tokens) {\n const field = fields.find(f => f.id === token.fieldId);\n if (field && field.kind !== 'pick-multi') ids.add(token.fieldId);\n }\n return ids;\n }, [tokens, fields]);\n\n const reset = useCallback(() => {\n setFieldId(undefined);\n setTextValue('');\n setMultiValue([]);\n setError(undefined);\n }, []);\n\n useEffect(() => {\n if (!open) reset();\n }, [open, reset]);\n\n useEffect(() => {\n if (!open) return;\n if (selectedField?.kind === 'text') textInputRef.current?.focus();\n }, [open, selectedField]);\n\n /**\n * Replace whatever token exists for `fieldId` with the given value. Used by\n * both single-select (radio) and multi-select (checkbox) pick-multi panels.\n * Pass `undefined` or `[]` to remove the token entirely.\n */\n const replacePickMultiToken = useCallback(\n (fieldId: string, value: string | string[] | undefined) => {\n const existingIndex = tokens.findIndex(t => t.fieldId === fieldId);\n const shouldRemove = value === undefined || (Array.isArray(value) && value.length === 0);\n\n if (shouldRemove) {\n if (existingIndex === -1) return;\n onTokensChange(tokens.filter((_, i) => i !== existingIndex));\n return;\n }\n\n if (existingIndex === -1) {\n onTokensChange([...tokens, { fieldId, value }]);\n return;\n }\n\n const nextTokens = [...tokens];\n nextTokens[existingIndex] = { fieldId, value };\n onTokensChange(nextTokens);\n },\n [onTokensChange, tokens],\n );\n\n const commit = useCallback(() => {\n if (!selectedField) {\n setError('Choose a property first.');\n return;\n }\n if (singleUseFieldIds.has(selectedField.id)) {\n setError(`Remove the existing ${selectedField.label} filter before adding another.`);\n return;\n }\n if (selectedField.kind === 'text' && !textValue.trim()) {\n setError(`Enter a value for ${selectedField.label}.`);\n return;\n }\n if (selectedField.kind === 'multi-select' && multiValue.length === 0) {\n setError(`Choose at least one ${selectedField.label.toLowerCase()} value.`);\n return;\n }\n const token: PropertyFilterToken =\n selectedField.kind === 'multi-select'\n ? { fieldId: selectedField.id, value: multiValue }\n : { fieldId: selectedField.id, value: (textValue as string).trim() };\n onTokensChange([...tokens, token]);\n setOpen(false);\n }, [multiValue, onTokensChange, selectedField, singleUseFieldIds, textValue, tokens]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size={size} disabled={disabled}>\n <ListFilterPlusIcon />\n {label}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"p-3 w-64\"\n initialFocus={false}\n finalFocus={() => {\n if (skipCloseFocusRef.current) {\n skipCloseFocusRef.current = false;\n return false;\n }\n return true;\n }}\n >\n <div className=\"grid gap-3\">\n {selectedField && (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Back to properties\"\n className=\"text-neutral3 hover:text-neutral6 transition-colors\"\n onClick={() => {\n setFieldId(undefined);\n setTextValue('');\n setMultiValue([]);\n setError(undefined);\n }}\n >\n <ArrowLeftIcon className=\"h-4 w-4\" />\n </button>\n <FilterIcon className=\"h-4 w-4 shrink-0 text-neutral3\" />\n <span className=\"text-ui-sm text-neutral3\">{`${selectedField.label} · is`}</span>\n </div>\n )}\n\n {!selectedField && (\n <div\n role=\"menu\"\n className=\"max-h-[80dvh] overflow-auto\"\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>('[data-filter-item]:not([disabled])'),\n );\n if (buttons.length === 0) return;\n e.preventDefault();\n const active = document.activeElement as HTMLElement | null;\n const current = buttons.findIndex(b => b === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = buttons.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % buttons.length;\n else next = current <= 0 ? buttons.length - 1 : current - 1;\n buttons[next]?.focus();\n }}\n >\n {visibleFields.length > 0 ? (\n visibleFields.map(f => {\n const used = singleUseFieldIds.has(f.id);\n if (f.kind === 'pick-multi') {\n return (\n <PickMultiMenuItem\n key={f.id}\n field={f}\n tokens={tokens}\n onChange={replacePickMultiToken}\n open={openPickMultiFieldId === f.id}\n onToggle={togglePickMulti}\n onClose={closePickMulti}\n />\n );\n }\n return (\n <button\n key={f.id}\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'group flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md transition-colors',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n used\n ? 'cursor-not-allowed text-neutral2 opacity-70'\n : 'text-neutral4 hover:bg-surface4 hover:text-neutral6',\n )}\n disabled={used}\n onClick={() => {\n setError(undefined);\n if (f.kind === 'text') {\n onTokensChange([...tokens, { fieldId: f.id, value: '' }]);\n onStartTextFilter?.(f.id);\n skipCloseFocusRef.current = true;\n setOpen(false);\n return;\n }\n setFieldId(f.id);\n }}\n >\n <span className=\"truncate\">{f.label}</span>\n {used ? (\n <span className=\"ml-auto text-neutral3\">In use</span>\n ) : (\n <PlusIcon className=\"ml-auto h-4 w-4 text-neutral3 opacity-0 transition-opacity group-hover:opacity-100 group-focus:opacity-100\" />\n )}\n </button>\n );\n })\n ) : (\n <div className=\"px-2 py-1.5 text-ui-sm text-neutral3\">No matching property.</div>\n )}\n </div>\n )}\n\n {selectedField && selectedField.kind === 'text' && (\n <Input\n ref={textInputRef}\n size=\"md\"\n value={textValue}\n onChange={e => {\n setTextValue(e.target.value);\n setError(undefined);\n }}\n placeholder={selectedField.placeholder ?? `Enter ${selectedField.label}`}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n }\n }}\n />\n )}\n\n {selectedField && selectedField.kind === 'multi-select' && (\n <MultiCombobox\n options={selectedField.options ?? []}\n value={multiValue}\n onValueChange={v => {\n setMultiValue(v);\n setError(undefined);\n }}\n placeholder={selectedField.placeholder ?? `Choose ${selectedField.label}`}\n searchPlaceholder={`Search ${selectedField.label.toLowerCase()}...`}\n emptyText={selectedField.emptyText ?? 'No option found.'}\n size=\"md\"\n />\n )}\n\n {error && <div className=\"text-ui-sm text-red-500\">{error}</div>}\n\n {selectedField && selectedField.kind !== 'pick-multi' && (\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"ghost\" size=\"md\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"outline\" size=\"md\" onClick={commit}>\n Add filter\n </Button>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ntype PickMultiField = Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n\ntype PickMultiMenuItemProps = {\n field: PickMultiField;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[] | undefined) => void;\n open: boolean;\n onToggle: (fieldId: string) => void;\n onClose: () => void;\n};\n\n/**\n * A property-picker menu item that opens a separate Radix popover (portaled to\n * the side) with a radio group (single-select) or checkbox list (multi-select,\n * `field.multi === true`). Open/close is driven by explicit click / keyboard\n * press; the panel only closes when the user clicks outside, presses Escape,\n * or clicks the row again to toggle it off.\n */\nfunction PickMultiMenuItem({ field, tokens, onChange, open, onToggle, onClose }: PickMultiMenuItemProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <Popover\n open={open}\n onOpenChange={next => {\n if (next) onToggle(field.id);\n else onClose();\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"menuitem\"\n data-filter-item=\"\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-ui-md text-neutral4 hover:bg-surface4 hover:text-neutral6 transition-colors',\n 'focus:bg-surface4 focus:text-neutral6 focus:outline-none',\n )}\n onKeyDown={e => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n if (!open) onToggle(field.id);\n e.preventDefault();\n requestAnimationFrame(() => {\n const first = contentRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n first?.focus();\n });\n }}\n >\n {open && <ChevronRightIcon className=\"h-4 w-4 text-neutral3 shrink-0\" />}\n <span className=\"truncate\">{field.label}</span>\n {!open && <ChevronRightIcon className=\"h-4 w-4 ml-auto text-neutral3 shrink-0\" />}\n </button>\n </PopoverTrigger>\n <PopoverContent\n ref={contentRef}\n side=\"right\"\n align=\"start\"\n sideOffset={8}\n className=\"w-64 p-2\"\n initialFocus={false}\n onKeyDown={e => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return;\n const items = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>('[data-pick-multi-item]:not([disabled])'),\n );\n if (items.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n const active = document.activeElement as HTMLElement | null;\n const current = items.findIndex(el => el === active);\n let next: number;\n if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = items.length - 1;\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % items.length;\n else next = current <= 0 ? items.length - 1 : current - 1;\n items[next]?.focus();\n }}\n data-pick-multi-panel\n >\n <PickMultiPanel field={field} tokens={tokens} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["jsxs","Button","jsx","XIcon","DropdownMenu","EllipsisVerticalIcon","SaveIcon","Trash2Icon","useState","useMemo","Fragment","Input","Spinner","Checkbox","RadioGroup","RadioGroupItem","TooltipProvider","Tooltip","TooltipTrigger","ButtonsGroup","ButtonsGroupText","LockIcon","TooltipContent","useRef","useEffect","Popover","PopoverTrigger","PopoverContent","useCallback","fieldId","ListFilterPlusIcon","ArrowLeftIcon","FilterIcon","cn","PlusIcon","MultiCombobox","ChevronRightIcon"],"mappings":"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"}