@mastra/playground-ui 35.0.0 → 35.1.0-alpha.1

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 +86 -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-BLRjYB5N.cjs} +3 -2
  138. package/dist/{multi-column-BzL86JPK.cjs.map → multi-column-BLRjYB5N.cjs.map} +1 -1
  139. package/dist/{multi-column-C1sXoVG3.js → multi-column-e_-j_rrO.js} +3 -2
  140. package/dist/{multi-column-C1sXoVG3.js.map → multi-column-e_-j_rrO.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
@@ -10,7 +10,7 @@ import { P as Popover, b as PopoverTrigger, a as PopoverContent } from './popove
10
10
  import { C as Checkbox } from './checkbox-DmKlRClz.js';
11
11
  import { R as RadioGroup, a as RadioGroupItem } from './radio-group-DIbajvIk.js';
12
12
  import { S as Spinner } from './spinner-DuizqJj9.js';
13
- import { M as MultiCombobox } from './multi-combobox-Y3gT0MqV.js';
13
+ import { C as Combobox } from './combobox-DvRTz5eL.js';
14
14
  import { c as cn } from './utils-CzYGxqbG.js';
15
15
 
16
16
  function PropertyFilterActions({
@@ -566,8 +566,9 @@ function PropertyFilterCreator({
566
566
  }
567
567
  ),
568
568
  selectedField && selectedField.kind === "multi-select" && /* @__PURE__ */ jsx(
569
- MultiCombobox,
569
+ Combobox,
570
570
  {
571
+ multiple: true,
571
572
  options: selectedField.options ?? [],
572
573
  value: multiValue,
573
574
  onValueChange: (v) => {
@@ -665,4 +666,4 @@ function PickMultiMenuItem({ field, tokens, onChange, open, onToggle, onClose })
665
666
  }
666
667
 
667
668
  export { PickMultiPanel as P, PropertyFilterActions as a, PropertyFilterApplied as b, PropertyFilterCreator as c };
668
- //# sourceMappingURL=property-filter-creator-B9tK0VY3.js.map
669
+ //# sourceMappingURL=property-filter-creator-Cl9E6wxf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-filter-creator-Cl9E6wxf.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 { Combobox } from '@/ds/components/Combobox/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 <Combobox\n multiple\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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"}
@@ -0,0 +1,243 @@
1
+ 'use strict';
2
+
3
+ const jsxRuntime = require('react/jsx-runtime');
4
+ const scrollArea = require('@base-ui/react/scroll-area');
5
+ const lucideReact = require('lucide-react');
6
+ const React = require('react');
7
+ const hooks_useAutoscroll = require('./hooks/use-autoscroll.cjs.js');
8
+ const utils = require('./utils-vA5sWo9W.cjs');
9
+
10
+ function _interopNamespaceDefault(e) {
11
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
12
+ if (e) {
13
+ for (const k in e) {
14
+ if (k !== 'default') {
15
+ const d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: () => e[k]
19
+ });
20
+ }
21
+ }
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ const React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
28
+
29
+ const DEFAULT_SCROLL_BUTTON_SPEED = 100;
30
+ const DEFAULT_SCROLL_BUTTON_INTERVAL_TIME = 20;
31
+ const MIN_SCROLL_BUTTON_SPEED = 1;
32
+ const MIN_SCROLL_BUTTON_INTERVAL_TIME = 16;
33
+ function resolveMask(mask, orientation) {
34
+ if (mask === false) return { top: false, bottom: false, left: false, right: false };
35
+ const vertical = orientation === "vertical" || orientation === "both";
36
+ const horizontal = orientation === "horizontal" || orientation === "both";
37
+ const sides = { top: vertical, bottom: vertical, left: horizontal, right: horizontal };
38
+ if (mask === true || mask === void 0) return sides;
39
+ if (mask.y !== void 0) {
40
+ sides.top = mask.y;
41
+ sides.bottom = mask.y;
42
+ }
43
+ if (mask.x !== void 0) {
44
+ sides.left = mask.x;
45
+ sides.right = mask.x;
46
+ }
47
+ if (mask.top !== void 0) sides.top = mask.top;
48
+ if (mask.bottom !== void 0) sides.bottom = mask.bottom;
49
+ if (mask.left !== void 0) sides.left = mask.left;
50
+ if (mask.right !== void 0) sides.right = mask.right;
51
+ return sides;
52
+ }
53
+ function maskClasses(sides) {
54
+ return utils.cn(
55
+ sides.top && "data-[overflow-y-start]:mask-t-from-[calc(100%-2rem)]",
56
+ sides.bottom && "data-[overflow-y-end]:mask-b-from-[calc(100%-2rem)]",
57
+ sides.left && "data-[overflow-x-start]:mask-l-from-[calc(100%-2rem)]",
58
+ sides.right && "data-[overflow-x-end]:mask-r-from-[calc(100%-2rem)]"
59
+ );
60
+ }
61
+ function clampScrollButtonNumber(value, fallback, min) {
62
+ const resolvedValue = value ?? fallback;
63
+ return Number.isFinite(resolvedValue) ? Math.max(min, resolvedValue) : Math.max(min, fallback);
64
+ }
65
+ const ScrollButton = ({ direction, label, onStartScrolling, onStopScrolling, onKeyboardScroll }) => {
66
+ const Icon = direction === "left" ? lucideReact.ChevronLeftIcon : lucideReact.ChevronRightIcon;
67
+ return /* @__PURE__ */ jsxRuntime.jsx(
68
+ "button",
69
+ {
70
+ type: "button",
71
+ "aria-label": label,
72
+ className: utils.cn(
73
+ "absolute top-1 bottom-1 z-10 hidden w-8 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent text-neutral3 transition-colors duration-normal ease-out-custom hover:bg-neutral6/5 hover:text-neutral6 active:bg-neutral6/10",
74
+ "outline-hidden focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-neutral5/55",
75
+ direction === "left" ? "left-1 group-data-[overflow-x-start]/scroll-area:flex" : "right-1 group-data-[overflow-x-end]/scroll-area:flex"
76
+ ),
77
+ onPointerDown: (event) => onStartScrolling(direction, event),
78
+ onPointerUp: onStopScrolling,
79
+ onPointerLeave: onStopScrolling,
80
+ onPointerCancel: onStopScrolling,
81
+ onBlur: onStopScrolling,
82
+ onClick: (event) => {
83
+ if (event.detail === 0) onKeyboardScroll(direction);
84
+ },
85
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { "aria-hidden": "true", className: "size-4" })
86
+ }
87
+ );
88
+ };
89
+ const ScrollButtons = ({ areaRef, scrollButtons }) => {
90
+ const scrollButtonInterval = React__namespace.useRef(null);
91
+ const scrollButtonOptions = typeof scrollButtons === "object" ? scrollButtons : void 0;
92
+ const scrollButtonSpeed = clampScrollButtonNumber(
93
+ scrollButtonOptions?.scrollSpeed,
94
+ DEFAULT_SCROLL_BUTTON_SPEED,
95
+ MIN_SCROLL_BUTTON_SPEED
96
+ );
97
+ const scrollButtonIntervalTime = clampScrollButtonNumber(
98
+ scrollButtonOptions?.scrollIntervalTime,
99
+ DEFAULT_SCROLL_BUTTON_INTERVAL_TIME,
100
+ MIN_SCROLL_BUTTON_INTERVAL_TIME
101
+ );
102
+ const leftScrollButtonLabel = scrollButtonOptions?.leftLabel ?? "Scroll left";
103
+ const rightScrollButtonLabel = scrollButtonOptions?.rightLabel ?? "Scroll right";
104
+ const stopScrollButtonScrolling = React__namespace.useCallback(() => {
105
+ if (!scrollButtonInterval.current) return;
106
+ clearInterval(scrollButtonInterval.current);
107
+ scrollButtonInterval.current = null;
108
+ }, []);
109
+ const scrollByDirection = React__namespace.useCallback(
110
+ (direction, multiplier = 1) => {
111
+ const viewport = areaRef.current;
112
+ if (!viewport) return;
113
+ viewport.scrollBy({
114
+ left: direction === "right" ? scrollButtonSpeed * multiplier : -scrollButtonSpeed * multiplier,
115
+ behavior: "smooth"
116
+ });
117
+ },
118
+ [areaRef, scrollButtonSpeed]
119
+ );
120
+ const startScrollButtonScrolling = React__namespace.useCallback(
121
+ (direction, event) => {
122
+ event?.preventDefault();
123
+ event?.stopPropagation();
124
+ event?.currentTarget.setPointerCapture?.(event.pointerId);
125
+ stopScrollButtonScrolling();
126
+ scrollByDirection(direction, 2);
127
+ scrollButtonInterval.current = setInterval(() => {
128
+ scrollByDirection(direction);
129
+ }, scrollButtonIntervalTime);
130
+ },
131
+ [scrollButtonIntervalTime, scrollByDirection, stopScrollButtonScrolling]
132
+ );
133
+ React__namespace.useEffect(() => {
134
+ return () => {
135
+ stopScrollButtonScrolling();
136
+ };
137
+ }, [stopScrollButtonScrolling]);
138
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
139
+ /* @__PURE__ */ jsxRuntime.jsx(
140
+ ScrollButton,
141
+ {
142
+ direction: "left",
143
+ label: leftScrollButtonLabel,
144
+ onStartScrolling: startScrollButtonScrolling,
145
+ onStopScrolling: stopScrollButtonScrolling,
146
+ onKeyboardScroll: (direction) => scrollByDirection(direction, 2)
147
+ }
148
+ ),
149
+ /* @__PURE__ */ jsxRuntime.jsx(
150
+ ScrollButton,
151
+ {
152
+ direction: "right",
153
+ label: rightScrollButtonLabel,
154
+ onStartScrolling: startScrollButtonScrolling,
155
+ onStopScrolling: stopScrollButtonScrolling,
156
+ onKeyboardScroll: (direction) => scrollByDirection(direction, 2)
157
+ }
158
+ )
159
+ ] });
160
+ };
161
+ const ScrollArea = React__namespace.forwardRef(
162
+ ({
163
+ className,
164
+ children,
165
+ viewPortClassName,
166
+ maxHeight,
167
+ autoScroll = false,
168
+ orientation = "vertical",
169
+ scrollButtons,
170
+ mask,
171
+ showMask,
172
+ viewportRef,
173
+ ...props
174
+ }, ref) => {
175
+ const areaRef = React__namespace.useRef(null);
176
+ hooks_useAutoscroll.useAutoscroll(areaRef, { enabled: autoScroll });
177
+ const setViewportRef = React__namespace.useCallback(
178
+ (node) => {
179
+ areaRef.current = node;
180
+ if (typeof viewportRef === "function") viewportRef(node);
181
+ else if (viewportRef) viewportRef.current = node;
182
+ },
183
+ [viewportRef]
184
+ );
185
+ const effectiveMask = mask !== void 0 ? mask : showMask;
186
+ const sides = resolveMask(effectiveMask, orientation);
187
+ const viewportStyle = {};
188
+ if (maxHeight) viewportStyle.maxHeight = maxHeight;
189
+ if (orientation === "vertical") {
190
+ viewportStyle.overflowX = "hidden";
191
+ viewportStyle.overflowY = "scroll";
192
+ } else if (orientation === "horizontal") {
193
+ viewportStyle.overflowX = "scroll";
194
+ viewportStyle.overflowY = "hidden";
195
+ }
196
+ const contentStyle = orientation === "vertical" ? { minWidth: "0px" } : orientation === "horizontal" ? { minHeight: "0px" } : void 0;
197
+ return /* @__PURE__ */ jsxRuntime.jsxs(
198
+ scrollArea.ScrollArea.Root,
199
+ {
200
+ ref,
201
+ className: utils.cn("group/scroll-area relative overflow-hidden", className),
202
+ ...props,
203
+ children: [
204
+ /* @__PURE__ */ jsxRuntime.jsx(
205
+ scrollArea.ScrollArea.Viewport,
206
+ {
207
+ ref: setViewportRef,
208
+ className: utils.cn("h-full w-full rounded-[inherit]", maskClasses(sides), viewPortClassName),
209
+ style: viewportStyle,
210
+ children: /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea.Content, { style: contentStyle, children })
211
+ }
212
+ ),
213
+ scrollButtons && orientation !== "vertical" && /* @__PURE__ */ jsxRuntime.jsx(ScrollButtons, { areaRef, scrollButtons }),
214
+ (orientation === "vertical" || orientation === "both") && /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, { orientation: "vertical" }),
215
+ (orientation === "horizontal" || orientation === "both") && /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, { orientation: "horizontal" }),
216
+ orientation === "both" && /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea.Corner, {})
217
+ ]
218
+ }
219
+ );
220
+ }
221
+ );
222
+ ScrollArea.displayName = "ScrollArea";
223
+ const ScrollBar = React__namespace.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
224
+ scrollArea.ScrollArea.Scrollbar,
225
+ {
226
+ ref,
227
+ orientation,
228
+ className: utils.cn(
229
+ "flex touch-none select-none transition-opacity duration-normal ease-out-custom",
230
+ "opacity-0 data-[hovering]:opacity-100 data-[scrolling]:opacity-100 data-[scrolling]:duration-0",
231
+ orientation === "vertical" && "h-full w-1.5 p-px",
232
+ orientation === "horizontal" && "h-1.5 w-full flex-col p-px",
233
+ className
234
+ ),
235
+ ...props,
236
+ children: /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea.Thumb, { className: "relative flex-1 rounded-full bg-neutral4/30 hover:bg-neutral4/60 transition-colors duration-normal" })
237
+ }
238
+ ));
239
+ ScrollBar.displayName = "ScrollBar";
240
+
241
+ exports.ScrollArea = ScrollArea;
242
+ exports.ScrollBar = ScrollBar;
243
+ //# sourceMappingURL=scroll-area-BtcyzOxO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area-BtcyzOxO.cjs","sources":["../src/ds/components/ScrollArea/scroll-area.tsx"],"sourcesContent":["import { ScrollArea as ScrollAreaPrimitive } from '@base-ui/react/scroll-area';\nimport { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { useAutoscroll } from '@/hooks/use-autoscroll';\nimport { cn } from '@/lib/utils';\n\ntype Orientation = 'vertical' | 'horizontal' | 'both';\ntype ScrollButtonDirection = 'left' | 'right';\n\nconst DEFAULT_SCROLL_BUTTON_SPEED = 100;\nconst DEFAULT_SCROLL_BUTTON_INTERVAL_TIME = 20;\nconst MIN_SCROLL_BUTTON_SPEED = 1;\nconst MIN_SCROLL_BUTTON_INTERVAL_TIME = 16;\n\nexport type MaskSides = {\n top?: boolean;\n bottom?: boolean;\n left?: boolean;\n right?: boolean;\n /** Shorthand: sets both `left` and `right`. Per-side keys override. */\n x?: boolean;\n /** Shorthand: sets both `top` and `bottom`. Per-side keys override. */\n y?: boolean;\n};\n\n/**\n * - `true` / omitted: fade the edges that match `orientation`.\n * - `false`: no fade.\n * - object: per-side override on top of the orientation default.\n */\nexport type ScrollAreaMask = boolean | MaskSides;\n\nexport type ScrollAreaScrollButtons =\n | boolean\n | {\n /** Pixels to scroll per repeated interval. */\n scrollSpeed?: number;\n /** Milliseconds between repeated scroll steps while the button is held. */\n scrollIntervalTime?: number;\n leftLabel?: string;\n rightLabel?: string;\n };\n\nexport type ScrollAreaProps = React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> & {\n viewPortClassName?: string;\n maxHeight?: string;\n autoScroll?: boolean;\n orientation?: Orientation;\n /** Show left/right controls for horizontal overflow. Only applies to `horizontal` and `both` orientations. */\n scrollButtons?: ScrollAreaScrollButtons;\n /** Fade content at the edges where it's clipped by overflow. Defaults to the axes matching `orientation`. */\n mask?: ScrollAreaMask;\n /** @deprecated Use `mask` instead. Retained for backward compatibility. */\n showMask?: boolean;\n /**\n * Ref to the scrolling viewport element. Use this as the scroll element for a\n * virtualizer (`getScrollElement: () => viewportRef.current`) so the list can\n * virtualize while still using the ScrollArea's overlay scrollbar + masks.\n */\n viewportRef?: React.Ref<HTMLDivElement>;\n};\n\ntype ResolvedMask = { top: boolean; bottom: boolean; left: boolean; right: boolean };\n\nfunction resolveMask(mask: ScrollAreaMask | undefined, orientation: Orientation): ResolvedMask {\n if (mask === false) return { top: false, bottom: false, left: false, right: false };\n\n const vertical = orientation === 'vertical' || orientation === 'both';\n const horizontal = orientation === 'horizontal' || orientation === 'both';\n const sides: ResolvedMask = { top: vertical, bottom: vertical, left: horizontal, right: horizontal };\n\n if (mask === true || mask === undefined) return sides;\n\n if (mask.y !== undefined) {\n sides.top = mask.y;\n sides.bottom = mask.y;\n }\n if (mask.x !== undefined) {\n sides.left = mask.x;\n sides.right = mask.x;\n }\n if (mask.top !== undefined) sides.top = mask.top;\n if (mask.bottom !== undefined) sides.bottom = mask.bottom;\n if (mask.left !== undefined) sides.left = mask.left;\n if (mask.right !== undefined) sides.right = mask.right;\n\n return sides;\n}\n\nfunction maskClasses(sides: ResolvedMask) {\n return cn(\n sides.top && 'data-[overflow-y-start]:mask-t-from-[calc(100%-2rem)]',\n sides.bottom && 'data-[overflow-y-end]:mask-b-from-[calc(100%-2rem)]',\n sides.left && 'data-[overflow-x-start]:mask-l-from-[calc(100%-2rem)]',\n sides.right && 'data-[overflow-x-end]:mask-r-from-[calc(100%-2rem)]',\n );\n}\n\nfunction clampScrollButtonNumber(value: number | undefined, fallback: number, min: number) {\n const resolvedValue = value ?? fallback;\n return Number.isFinite(resolvedValue) ? Math.max(min, resolvedValue) : Math.max(min, fallback);\n}\n\ntype ScrollButtonProps = {\n direction: ScrollButtonDirection;\n label: string;\n onStartScrolling: (direction: ScrollButtonDirection, event?: React.PointerEvent<HTMLButtonElement>) => void;\n onStopScrolling: () => void;\n onKeyboardScroll: (direction: ScrollButtonDirection) => void;\n};\n\nconst ScrollButton = ({ direction, label, onStartScrolling, onStopScrolling, onKeyboardScroll }: ScrollButtonProps) => {\n const Icon = direction === 'left' ? ChevronLeftIcon : ChevronRightIcon;\n\n return (\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n 'absolute top-1 bottom-1 z-10 hidden w-8 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent text-neutral3 transition-colors duration-normal ease-out-custom hover:bg-neutral6/5 hover:text-neutral6 active:bg-neutral6/10',\n 'outline-hidden focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-neutral5/55',\n direction === 'left'\n ? 'left-1 group-data-[overflow-x-start]/scroll-area:flex'\n : 'right-1 group-data-[overflow-x-end]/scroll-area:flex',\n )}\n onPointerDown={event => onStartScrolling(direction, event)}\n onPointerUp={onStopScrolling}\n onPointerLeave={onStopScrolling}\n onPointerCancel={onStopScrolling}\n onBlur={onStopScrolling}\n onClick={event => {\n if (event.detail === 0) onKeyboardScroll(direction);\n }}\n >\n <Icon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n );\n};\n\ntype ScrollButtonsProps = {\n areaRef: React.RefObject<HTMLDivElement | null>;\n scrollButtons: Exclude<ScrollAreaScrollButtons, false | undefined>;\n};\n\nconst ScrollButtons = ({ areaRef, scrollButtons }: ScrollButtonsProps) => {\n const scrollButtonInterval = React.useRef<ReturnType<typeof setInterval> | null>(null);\n const scrollButtonOptions = typeof scrollButtons === 'object' ? scrollButtons : undefined;\n const scrollButtonSpeed = clampScrollButtonNumber(\n scrollButtonOptions?.scrollSpeed,\n DEFAULT_SCROLL_BUTTON_SPEED,\n MIN_SCROLL_BUTTON_SPEED,\n );\n const scrollButtonIntervalTime = clampScrollButtonNumber(\n scrollButtonOptions?.scrollIntervalTime,\n DEFAULT_SCROLL_BUTTON_INTERVAL_TIME,\n MIN_SCROLL_BUTTON_INTERVAL_TIME,\n );\n const leftScrollButtonLabel = scrollButtonOptions?.leftLabel ?? 'Scroll left';\n const rightScrollButtonLabel = scrollButtonOptions?.rightLabel ?? 'Scroll right';\n\n const stopScrollButtonScrolling = React.useCallback(() => {\n if (!scrollButtonInterval.current) return;\n clearInterval(scrollButtonInterval.current);\n scrollButtonInterval.current = null;\n }, []);\n\n const scrollByDirection = React.useCallback(\n (direction: ScrollButtonDirection, multiplier = 1) => {\n const viewport = areaRef.current;\n if (!viewport) return;\n\n viewport.scrollBy({\n left: direction === 'right' ? scrollButtonSpeed * multiplier : -scrollButtonSpeed * multiplier,\n behavior: 'smooth',\n });\n },\n [areaRef, scrollButtonSpeed],\n );\n\n const startScrollButtonScrolling = React.useCallback(\n (direction: ScrollButtonDirection, event?: React.PointerEvent<HTMLButtonElement>) => {\n event?.preventDefault();\n event?.stopPropagation();\n event?.currentTarget.setPointerCapture?.(event.pointerId);\n\n stopScrollButtonScrolling();\n scrollByDirection(direction, 2);\n\n scrollButtonInterval.current = setInterval(() => {\n scrollByDirection(direction);\n }, scrollButtonIntervalTime);\n },\n [scrollButtonIntervalTime, scrollByDirection, stopScrollButtonScrolling],\n );\n\n React.useEffect(() => {\n return () => {\n stopScrollButtonScrolling();\n };\n }, [stopScrollButtonScrolling]);\n\n return (\n <>\n <ScrollButton\n direction=\"left\"\n label={leftScrollButtonLabel}\n onStartScrolling={startScrollButtonScrolling}\n onStopScrolling={stopScrollButtonScrolling}\n onKeyboardScroll={direction => scrollByDirection(direction, 2)}\n />\n <ScrollButton\n direction=\"right\"\n label={rightScrollButtonLabel}\n onStartScrolling={startScrollButtonScrolling}\n onStopScrolling={stopScrollButtonScrolling}\n onKeyboardScroll={direction => scrollByDirection(direction, 2)}\n />\n </>\n );\n};\n\nconst ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n (\n {\n className,\n children,\n viewPortClassName,\n maxHeight,\n autoScroll = false,\n orientation = 'vertical',\n scrollButtons,\n mask,\n showMask,\n viewportRef,\n ...props\n },\n ref,\n ) => {\n const areaRef = React.useRef<HTMLDivElement>(null);\n useAutoscroll(areaRef, { enabled: autoScroll });\n\n // Keep the internal autoscroll ref while also exposing the viewport to callers\n // (e.g. a virtualizer's scroll element).\n const setViewportRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n areaRef.current = node;\n if (typeof viewportRef === 'function') viewportRef(node);\n else if (viewportRef) (viewportRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [viewportRef],\n );\n\n const effectiveMask: ScrollAreaMask | undefined = mask !== undefined ? mask : showMask;\n const sides = resolveMask(effectiveMask, orientation);\n\n const viewportStyle: React.CSSProperties = {};\n if (maxHeight) viewportStyle.maxHeight = maxHeight;\n if (orientation === 'vertical') {\n viewportStyle.overflowX = 'hidden';\n viewportStyle.overflowY = 'scroll';\n } else if (orientation === 'horizontal') {\n viewportStyle.overflowX = 'scroll';\n viewportStyle.overflowY = 'hidden';\n }\n\n // Base UI's ScrollAreaContent forces `min-width: fit-content` so the\n // content can grow wider than the viewport (required for horizontal scroll\n // measurement). For vertical-only scroll we override it so children shrink\n // to the viewport width instead of forcing horizontal scroll.\n const contentStyle: React.CSSProperties | undefined =\n orientation === 'vertical'\n ? { minWidth: '0px' }\n : orientation === 'horizontal'\n ? { minHeight: '0px' }\n : undefined;\n\n return (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn('group/scroll-area relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={setViewportRef}\n className={cn('h-full w-full rounded-[inherit]', maskClasses(sides), viewPortClassName)}\n style={viewportStyle}\n >\n <ScrollAreaPrimitive.Content style={contentStyle}>{children}</ScrollAreaPrimitive.Content>\n </ScrollAreaPrimitive.Viewport>\n {scrollButtons && orientation !== 'vertical' && (\n <ScrollButtons areaRef={areaRef} scrollButtons={scrollButtons} />\n )}\n {(orientation === 'vertical' || orientation === 'both') && <ScrollBar orientation=\"vertical\" />}\n {(orientation === 'horizontal' || orientation === 'both') && <ScrollBar orientation=\"horizontal\" />}\n {orientation === 'both' && <ScrollAreaPrimitive.Corner />}\n </ScrollAreaPrimitive.Root>\n );\n },\n);\nScrollArea.displayName = 'ScrollArea';\n\nconst ScrollBar = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Scrollbar>\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n <ScrollAreaPrimitive.Scrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-opacity duration-normal ease-out-custom',\n 'opacity-0 data-[hovering]:opacity-100 data-[scrolling]:opacity-100 data-[scrolling]:duration-0',\n orientation === 'vertical' && 'h-full w-1.5 p-px',\n orientation === 'horizontal' && 'h-1.5 w-full flex-col p-px',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb className=\"relative flex-1 rounded-full bg-neutral4/30 hover:bg-neutral4/60 transition-colors duration-normal\" />\n </ScrollAreaPrimitive.Scrollbar>\n));\nScrollBar.displayName = 'ScrollBar';\n\nexport { ScrollArea, ScrollBar };\n"],"names":["cn","ChevronLeftIcon","ChevronRightIcon","jsx","React","jsxs","Fragment","useAutoscroll","ScrollAreaPrimitive"],"mappings":"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"}