@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
@@ -0,0 +1,221 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { ScrollArea as ScrollArea$1 } from '@base-ui/react/scroll-area';
3
+ import { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';
4
+ import * as React from 'react';
5
+ import { useAutoscroll } from './hooks/use-autoscroll.es.js';
6
+ import { c as cn } from './utils-CzYGxqbG.js';
7
+
8
+ const DEFAULT_SCROLL_BUTTON_SPEED = 100;
9
+ const DEFAULT_SCROLL_BUTTON_INTERVAL_TIME = 20;
10
+ const MIN_SCROLL_BUTTON_SPEED = 1;
11
+ const MIN_SCROLL_BUTTON_INTERVAL_TIME = 16;
12
+ function resolveMask(mask, orientation) {
13
+ if (mask === false) return { top: false, bottom: false, left: false, right: false };
14
+ const vertical = orientation === "vertical" || orientation === "both";
15
+ const horizontal = orientation === "horizontal" || orientation === "both";
16
+ const sides = { top: vertical, bottom: vertical, left: horizontal, right: horizontal };
17
+ if (mask === true || mask === void 0) return sides;
18
+ if (mask.y !== void 0) {
19
+ sides.top = mask.y;
20
+ sides.bottom = mask.y;
21
+ }
22
+ if (mask.x !== void 0) {
23
+ sides.left = mask.x;
24
+ sides.right = mask.x;
25
+ }
26
+ if (mask.top !== void 0) sides.top = mask.top;
27
+ if (mask.bottom !== void 0) sides.bottom = mask.bottom;
28
+ if (mask.left !== void 0) sides.left = mask.left;
29
+ if (mask.right !== void 0) sides.right = mask.right;
30
+ return sides;
31
+ }
32
+ function maskClasses(sides) {
33
+ return cn(
34
+ sides.top && "data-[overflow-y-start]:mask-t-from-[calc(100%-2rem)]",
35
+ sides.bottom && "data-[overflow-y-end]:mask-b-from-[calc(100%-2rem)]",
36
+ sides.left && "data-[overflow-x-start]:mask-l-from-[calc(100%-2rem)]",
37
+ sides.right && "data-[overflow-x-end]:mask-r-from-[calc(100%-2rem)]"
38
+ );
39
+ }
40
+ function clampScrollButtonNumber(value, fallback, min) {
41
+ const resolvedValue = value ?? fallback;
42
+ return Number.isFinite(resolvedValue) ? Math.max(min, resolvedValue) : Math.max(min, fallback);
43
+ }
44
+ const ScrollButton = ({ direction, label, onStartScrolling, onStopScrolling, onKeyboardScroll }) => {
45
+ const Icon = direction === "left" ? ChevronLeftIcon : ChevronRightIcon;
46
+ return /* @__PURE__ */ jsx(
47
+ "button",
48
+ {
49
+ type: "button",
50
+ "aria-label": label,
51
+ className: cn(
52
+ "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",
53
+ "outline-hidden focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-neutral5/55",
54
+ direction === "left" ? "left-1 group-data-[overflow-x-start]/scroll-area:flex" : "right-1 group-data-[overflow-x-end]/scroll-area:flex"
55
+ ),
56
+ onPointerDown: (event) => onStartScrolling(direction, event),
57
+ onPointerUp: onStopScrolling,
58
+ onPointerLeave: onStopScrolling,
59
+ onPointerCancel: onStopScrolling,
60
+ onBlur: onStopScrolling,
61
+ onClick: (event) => {
62
+ if (event.detail === 0) onKeyboardScroll(direction);
63
+ },
64
+ children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", className: "size-4" })
65
+ }
66
+ );
67
+ };
68
+ const ScrollButtons = ({ areaRef, scrollButtons }) => {
69
+ const scrollButtonInterval = React.useRef(null);
70
+ const scrollButtonOptions = typeof scrollButtons === "object" ? scrollButtons : void 0;
71
+ const scrollButtonSpeed = clampScrollButtonNumber(
72
+ scrollButtonOptions?.scrollSpeed,
73
+ DEFAULT_SCROLL_BUTTON_SPEED,
74
+ MIN_SCROLL_BUTTON_SPEED
75
+ );
76
+ const scrollButtonIntervalTime = clampScrollButtonNumber(
77
+ scrollButtonOptions?.scrollIntervalTime,
78
+ DEFAULT_SCROLL_BUTTON_INTERVAL_TIME,
79
+ MIN_SCROLL_BUTTON_INTERVAL_TIME
80
+ );
81
+ const leftScrollButtonLabel = scrollButtonOptions?.leftLabel ?? "Scroll left";
82
+ const rightScrollButtonLabel = scrollButtonOptions?.rightLabel ?? "Scroll right";
83
+ const stopScrollButtonScrolling = React.useCallback(() => {
84
+ if (!scrollButtonInterval.current) return;
85
+ clearInterval(scrollButtonInterval.current);
86
+ scrollButtonInterval.current = null;
87
+ }, []);
88
+ const scrollByDirection = React.useCallback(
89
+ (direction, multiplier = 1) => {
90
+ const viewport = areaRef.current;
91
+ if (!viewport) return;
92
+ viewport.scrollBy({
93
+ left: direction === "right" ? scrollButtonSpeed * multiplier : -scrollButtonSpeed * multiplier,
94
+ behavior: "smooth"
95
+ });
96
+ },
97
+ [areaRef, scrollButtonSpeed]
98
+ );
99
+ const startScrollButtonScrolling = React.useCallback(
100
+ (direction, event) => {
101
+ event?.preventDefault();
102
+ event?.stopPropagation();
103
+ event?.currentTarget.setPointerCapture?.(event.pointerId);
104
+ stopScrollButtonScrolling();
105
+ scrollByDirection(direction, 2);
106
+ scrollButtonInterval.current = setInterval(() => {
107
+ scrollByDirection(direction);
108
+ }, scrollButtonIntervalTime);
109
+ },
110
+ [scrollButtonIntervalTime, scrollByDirection, stopScrollButtonScrolling]
111
+ );
112
+ React.useEffect(() => {
113
+ return () => {
114
+ stopScrollButtonScrolling();
115
+ };
116
+ }, [stopScrollButtonScrolling]);
117
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
118
+ /* @__PURE__ */ jsx(
119
+ ScrollButton,
120
+ {
121
+ direction: "left",
122
+ label: leftScrollButtonLabel,
123
+ onStartScrolling: startScrollButtonScrolling,
124
+ onStopScrolling: stopScrollButtonScrolling,
125
+ onKeyboardScroll: (direction) => scrollByDirection(direction, 2)
126
+ }
127
+ ),
128
+ /* @__PURE__ */ jsx(
129
+ ScrollButton,
130
+ {
131
+ direction: "right",
132
+ label: rightScrollButtonLabel,
133
+ onStartScrolling: startScrollButtonScrolling,
134
+ onStopScrolling: stopScrollButtonScrolling,
135
+ onKeyboardScroll: (direction) => scrollByDirection(direction, 2)
136
+ }
137
+ )
138
+ ] });
139
+ };
140
+ const ScrollArea = React.forwardRef(
141
+ ({
142
+ className,
143
+ children,
144
+ viewPortClassName,
145
+ maxHeight,
146
+ autoScroll = false,
147
+ orientation = "vertical",
148
+ scrollButtons,
149
+ mask,
150
+ showMask,
151
+ viewportRef,
152
+ ...props
153
+ }, ref) => {
154
+ const areaRef = React.useRef(null);
155
+ useAutoscroll(areaRef, { enabled: autoScroll });
156
+ const setViewportRef = React.useCallback(
157
+ (node) => {
158
+ areaRef.current = node;
159
+ if (typeof viewportRef === "function") viewportRef(node);
160
+ else if (viewportRef) viewportRef.current = node;
161
+ },
162
+ [viewportRef]
163
+ );
164
+ const effectiveMask = mask !== void 0 ? mask : showMask;
165
+ const sides = resolveMask(effectiveMask, orientation);
166
+ const viewportStyle = {};
167
+ if (maxHeight) viewportStyle.maxHeight = maxHeight;
168
+ if (orientation === "vertical") {
169
+ viewportStyle.overflowX = "hidden";
170
+ viewportStyle.overflowY = "scroll";
171
+ } else if (orientation === "horizontal") {
172
+ viewportStyle.overflowX = "scroll";
173
+ viewportStyle.overflowY = "hidden";
174
+ }
175
+ const contentStyle = orientation === "vertical" ? { minWidth: "0px" } : orientation === "horizontal" ? { minHeight: "0px" } : void 0;
176
+ return /* @__PURE__ */ jsxs(
177
+ ScrollArea$1.Root,
178
+ {
179
+ ref,
180
+ className: cn("group/scroll-area relative overflow-hidden", className),
181
+ ...props,
182
+ children: [
183
+ /* @__PURE__ */ jsx(
184
+ ScrollArea$1.Viewport,
185
+ {
186
+ ref: setViewportRef,
187
+ className: cn("h-full w-full rounded-[inherit]", maskClasses(sides), viewPortClassName),
188
+ style: viewportStyle,
189
+ children: /* @__PURE__ */ jsx(ScrollArea$1.Content, { style: contentStyle, children })
190
+ }
191
+ ),
192
+ scrollButtons && orientation !== "vertical" && /* @__PURE__ */ jsx(ScrollButtons, { areaRef, scrollButtons }),
193
+ (orientation === "vertical" || orientation === "both") && /* @__PURE__ */ jsx(ScrollBar, { orientation: "vertical" }),
194
+ (orientation === "horizontal" || orientation === "both") && /* @__PURE__ */ jsx(ScrollBar, { orientation: "horizontal" }),
195
+ orientation === "both" && /* @__PURE__ */ jsx(ScrollArea$1.Corner, {})
196
+ ]
197
+ }
198
+ );
199
+ }
200
+ );
201
+ ScrollArea.displayName = "ScrollArea";
202
+ const ScrollBar = React.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsx(
203
+ ScrollArea$1.Scrollbar,
204
+ {
205
+ ref,
206
+ orientation,
207
+ className: cn(
208
+ "flex touch-none select-none transition-opacity duration-normal ease-out-custom",
209
+ "opacity-0 data-[hovering]:opacity-100 data-[scrolling]:opacity-100 data-[scrolling]:duration-0",
210
+ orientation === "vertical" && "h-full w-1.5 p-px",
211
+ orientation === "horizontal" && "h-1.5 w-full flex-col p-px",
212
+ className
213
+ ),
214
+ ...props,
215
+ children: /* @__PURE__ */ jsx(ScrollArea$1.Thumb, { className: "relative flex-1 rounded-full bg-neutral4/30 hover:bg-neutral4/60 transition-colors duration-normal" })
216
+ }
217
+ ));
218
+ ScrollBar.displayName = "ScrollBar";
219
+
220
+ export { ScrollArea as S, ScrollBar as a };
221
+ //# sourceMappingURL=scroll-area-DjZ6nTm5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area-DjZ6nTm5.js","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":["ScrollAreaPrimitive"],"mappings":"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"}
@@ -23,6 +23,9 @@ export declare function comboboxTriggerClass({ variant, size, error, className,
23
23
  error?: boolean;
24
24
  className?: string;
25
25
  }): string;
26
+ export declare const comboboxItemClass: (props?: ({
27
+ multiple?: boolean | null | undefined;
28
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
26
29
  export declare const comboboxStyles: {
27
30
  /** Root wrapper */
28
31
  readonly root: "flex flex-col gap-1.5";
@@ -46,24 +49,14 @@ export declare const comboboxStyles: {
46
49
  readonly list: "max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1";
47
50
  /** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */
48
51
  readonly item: string;
49
- /** Multi-select item — keeps the left checkbox slot, no right indicator. */
52
+ /** Multi-select item — same item rhythm with a right-aligned selected check. */
50
53
  readonly itemMulti: string;
51
54
  /** Right-aligned slot grouping end content + selection check. */
52
55
  readonly itemRightSlot: "ml-auto flex items-center gap-2 shrink-0";
53
56
  /** Check indicator container — inline, fixed 16x16, shown only when item is selected. */
54
- readonly checkContainer: "flex h-4 w-4 shrink-0 items-center justify-center text-accent1";
57
+ readonly checkContainer: "flex h-4 w-4 shrink-0 items-center justify-center text-neutral6";
55
58
  /** Check icon (single select) */
56
59
  readonly checkIcon: "h-3.5 w-3.5";
57
- /** Checkbox container (multi select) */
58
- readonly checkbox: "flex h-4 w-4 shrink-0 items-center justify-center rounded-[4px] border";
59
- /** Checkbox selected state */
60
- readonly checkboxSelected: "bg-accent1 border-accent1";
61
- /** Checkbox unselected state */
62
- readonly checkboxUnselected: "border-border2";
63
- /** Check icon for checkbox (multi select) */
64
- readonly checkboxIcon: "h-3 w-3 text-surface1";
65
- /** Option content wrapper */
66
- readonly optionContent: "flex items-center gap-2 w-full min-w-0";
67
60
  /** Option label/description wrapper */
68
61
  readonly optionText: "flex flex-col gap-0.5 min-w-0";
69
62
  /** Option label */
@@ -9,10 +9,8 @@ export type ComboboxOption = {
9
9
  start?: React.ReactNode;
10
10
  end?: React.ReactNode;
11
11
  };
12
- export type ComboboxProps = {
12
+ type ComboboxSharedProps = {
13
13
  options: ComboboxOption[];
14
- value?: string;
15
- onValueChange?: (value: string) => void;
16
14
  placeholder?: string;
17
15
  searchPlaceholder?: string;
18
16
  emptyText?: string;
@@ -25,4 +23,15 @@ export type ComboboxProps = {
25
23
  container?: HTMLElement | ShadowRoot | null | React.RefObject<HTMLElement | ShadowRoot | null>;
26
24
  error?: string;
27
25
  };
28
- export declare function Combobox({ options, value, onValueChange, placeholder, searchPlaceholder, emptyText, className, disabled, variant, size, open, onOpenChange, container, error, }: ComboboxProps): import("react/jsx-runtime").JSX.Element;
26
+ export type ComboboxSingleProps = ComboboxSharedProps & {
27
+ multiple?: false;
28
+ value?: string;
29
+ onValueChange?: (value: string) => void;
30
+ };
31
+ export type ComboboxMultipleProps = ComboboxSharedProps & {
32
+ multiple: true;
33
+ value?: readonly string[];
34
+ onValueChange?: (value: string[]) => void;
35
+ };
36
+ export type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;
37
+ export declare function Combobox(props: ComboboxProps): import("react/jsx-runtime").JSX.Element;
@@ -12,3 +12,4 @@ export declare const ManyOptions: Story;
12
12
  export declare const Variants: Story;
13
13
  export declare const WithDescriptions: Story;
14
14
  export declare const Sizes: Story;
15
+ export declare const Multiple: Story;
@@ -1,4 +1,3 @@
1
1
  export * from './combobox';
2
- export * from './multi-combobox';
3
2
  export { comboboxStyles } from './combobox-styles';
4
3
  export { Combobox as ComboboxPrimitive } from '@base-ui/react/combobox';
@@ -5,8 +5,12 @@ type CommandDialogProps = Omit<React.ComponentPropsWithoutRef<typeof Dialog>, 'c
5
5
  children?: React.ReactNode;
6
6
  title?: string;
7
7
  description?: string;
8
+ contentClassName?: string;
9
+ commandClassName?: string;
10
+ showOverlay?: boolean;
11
+ overlayClassName?: string;
8
12
  };
9
- declare const CommandDialog: ({ children, title, description, ...props }: CommandDialogProps) => import("react/jsx-runtime").JSX.Element;
13
+ declare const CommandDialog: ({ children, title, description, contentClassName, commandClassName, showOverlay, overlayClassName, ...props }: CommandDialogProps) => import("react/jsx-runtime").JSX.Element;
10
14
  declare const CommandInput: React.ForwardRefExoticComponent<any>;
11
15
  declare const CommandList: React.ForwardRefExoticComponent<any>;
12
16
  declare const CommandEmpty: React.ForwardRefExoticComponent<any>;
@@ -4,6 +4,7 @@ declare const meta: Meta<typeof Command>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof Command>;
6
6
  export declare const Default: Story;
7
+ export declare const InlineVercelStyle: Story;
7
8
  export declare const WithDialog: Story;
8
9
  export declare const Empty: Story;
9
10
  export declare const WithShortcuts: Story;
@@ -2,13 +2,12 @@ import { ReactNode, RefObject } from 'react';
2
2
  /**
3
3
  * Visual treatment for the whole list.
4
4
  *
5
- * - `default`: bordered card, `surface2` body, hairline row separators.
6
5
  * - `striped`: borderless and full-bleed, zebra-striped rows (every other row
7
6
  * tinted), contrasting sticky header band, no row separators.
8
7
  * - `lined`: borderless and full-bleed like `striped`, but rows stay transparent
9
8
  * and use subtle separators instead of zebra tints.
10
9
  */
11
- export type DataListVariant = 'default' | 'striped' | 'lined';
10
+ export type DataListVariant = 'striped' | 'lined';
12
11
  export type DataListRootProps = {
13
12
  children: ReactNode;
14
13
  columns: string;
@@ -16,8 +15,8 @@ export type DataListRootProps = {
16
15
  variant?: DataListVariant;
17
16
  /**
18
17
  * Ref to the scroll container — pass this to TanStack Virtual's
19
- * `getScrollElement` when virtualizing. Without it, the list behaves as a
20
- * normal scrollable grid.
18
+ * `getScrollElement` when virtualizing. Without it, the ScrollArea viewport
19
+ * scrolls normally.
21
20
  */
22
21
  scrollRef?: RefObject<HTMLDivElement | null>;
23
22
  };
@@ -18,6 +18,8 @@ type DialogOverlayProps = Omit<DialogPrimitive.Backdrop.Props, 'className'> & {
18
18
  declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogOverlayProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
19
19
  type DialogContentProps = Omit<DialogPrimitive.Popup.Props, 'className'> & {
20
20
  className?: string;
21
+ showOverlay?: boolean;
22
+ overlayClassName?: string;
21
23
  };
22
24
  declare const DialogContent: React.ForwardRefExoticComponent<Omit<DialogContentProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
23
25
  declare const DialogHeader: {
@@ -0,0 +1,12 @@
1
+ type ItemStyleOptions = {
2
+ isActive?: boolean;
3
+ isCollapsed?: boolean;
4
+ isFeatured?: boolean;
5
+ };
6
+ /**
7
+ * Shared classes for any sidebar nav row element (anchor, button, custom).
8
+ * Apply directly to the interactive element so `asChild` and custom slotted
9
+ * elements all receive the same styling.
10
+ */
11
+ export declare const navItemClasses: ({ isActive, isCollapsed, isFeatured }?: ItemStyleOptions) => string;
12
+ export {};
@@ -11,18 +11,6 @@ export type NavLink = {
11
11
  /** @deprecated Sidebar nav items now render flush; this option is accepted but ignored. */
12
12
  indent?: boolean;
13
13
  };
14
- type ItemStyleOptions = {
15
- isActive?: boolean;
16
- isCollapsed?: boolean;
17
- isFeatured?: boolean;
18
- };
19
- /**
20
- * Shared classes for any sidebar nav row element (anchor, button, custom).
21
- * Apply directly to the interactive element so `asChild` and custom slotted
22
- * elements (e.g. router Links) all receive the same styling without relying
23
- * on `[&>a]:` child selectors.
24
- */
25
- export declare const navItemClasses: ({ isActive, isCollapsed, isFeatured }?: ItemStyleOptions) => string;
26
14
  export type MainSidebarNavLinkProps = Omit<ComponentPropsWithoutRef<'li'>, 'children'> & {
27
15
  link?: NavLink;
28
16
  isActive?: boolean;
@@ -39,4 +27,3 @@ export type MainSidebarNavLinkProps = Omit<ComponentPropsWithoutRef<'li'>, 'chil
39
27
  asChild?: boolean;
40
28
  };
41
29
  export declare function MainSidebarNavLink({ link, state: stateProp, children, isActive, className, LinkComponent: LinkProp, asChild, ...props }: MainSidebarNavLinkProps): import("react/jsx-runtime").JSX.Element;
42
- export {};
@@ -12,7 +12,8 @@ import { MainSidebarSections } from './main-sidebar-sections';
12
12
  import { MainSidebarTrigger } from './main-sidebar-trigger';
13
13
  export { MainSidebarProvider, type SidebarState, type MainSidebarProviderProps } from './main-sidebar-context';
14
14
  export { useMainSidebar, useMaybeSidebar } from './main-sidebar-context';
15
- export { type NavLink, navItemClasses } from './main-sidebar-nav-link';
15
+ export { navItemClasses } from './main-sidebar-nav-item-classes';
16
+ export { type NavLink } from './main-sidebar-nav-link';
16
17
  export { type NavSection } from './main-sidebar-nav-section';
17
18
  export { MainSidebarTrigger } from './main-sidebar-trigger';
18
19
  export { MainSidebarMobileTrigger } from './main-sidebar-mobile-trigger';
@@ -17,11 +17,21 @@ export type MaskSides = {
17
17
  * - object: per-side override on top of the orientation default.
18
18
  */
19
19
  export type ScrollAreaMask = boolean | MaskSides;
20
+ export type ScrollAreaScrollButtons = boolean | {
21
+ /** Pixels to scroll per repeated interval. */
22
+ scrollSpeed?: number;
23
+ /** Milliseconds between repeated scroll steps while the button is held. */
24
+ scrollIntervalTime?: number;
25
+ leftLabel?: string;
26
+ rightLabel?: string;
27
+ };
20
28
  export type ScrollAreaProps = React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> & {
21
29
  viewPortClassName?: string;
22
30
  maxHeight?: string;
23
31
  autoScroll?: boolean;
24
32
  orientation?: Orientation;
33
+ /** Show left/right controls for horizontal overflow. Only applies to `horizontal` and `both` orientations. */
34
+ scrollButtons?: ScrollAreaScrollButtons;
25
35
  /** Fade content at the edges where it's clipped by overflow. Defaults to the axes matching `orientation`. */
26
36
  mask?: ScrollAreaMask;
27
37
  /** @deprecated Use `mask` instead. Retained for backward compatibility. */
@@ -38,6 +48,8 @@ declare const ScrollArea: React.ForwardRefExoticComponent<Omit<Omit<import('@bas
38
48
  maxHeight?: string;
39
49
  autoScroll?: boolean;
40
50
  orientation?: Orientation;
51
+ /** Show left/right controls for horizontal overflow. Only applies to `horizontal` and `both` orientations. */
52
+ scrollButtons?: ScrollAreaScrollButtons;
41
53
  /** Fade content at the edges where it's clipped by overflow. Defaults to the axes matching `orientation`. */
42
54
  mask?: ScrollAreaMask;
43
55
  /** @deprecated Use `mask` instead. Retained for backward compatibility. */
@@ -6,6 +6,8 @@ type Story = StoryObj<typeof ScrollArea>;
6
6
  export declare const Default: Story;
7
7
  export declare const WithMaxHeight: Story;
8
8
  export declare const HorizontalScroll: Story;
9
+ export declare const HorizontalScrollButtons: Story;
10
+ export declare const Badges: Story;
9
11
  export declare const CodeBlock: Story;
10
12
  export declare const ChatMessages: Story;
11
13
  export declare const MaskDisabled: Story;
@@ -1,9 +1,17 @@
1
1
  type UseCopyToClipboardProps = {
2
2
  text: string;
3
3
  copyMessage?: string;
4
+ copiedDuration?: number;
5
+ showToast?: boolean;
4
6
  };
5
- export declare function useCopyToClipboard({ text, copyMessage }: UseCopyToClipboardProps): {
7
+ type UseCopyToClipboardOptions = Omit<UseCopyToClipboardProps, 'text'>;
8
+ type UseCopyToClipboardDynamicResult = {
6
9
  isCopied: boolean;
10
+ copyToClipboard: (value: string) => void;
11
+ };
12
+ type UseCopyToClipboardConfiguredResult = UseCopyToClipboardDynamicResult & {
7
13
  handleCopy: () => void;
8
14
  };
15
+ export declare function useCopyToClipboard(props: UseCopyToClipboardProps): UseCopyToClipboardConfiguredResult;
16
+ export declare function useCopyToClipboard(props: UseCopyToClipboardOptions): UseCopyToClipboardDynamicResult;
9
17
  export {};
@@ -0,0 +1,2 @@
1
+ export declare function useIsApplePlatform(): boolean;
2
+ export declare function useKeyboardShortcutLabel(key: string): string;
@@ -89,7 +89,6 @@ export * from './ds/components/DateTimeRangePicker';
89
89
  export * from './ds/components/HorizontalBars';
90
90
  export * from './ds/components/MetricsDataTable';
91
91
  export * from './ds/components/MetricsLineChart';
92
- export * from './ds/components/ScrollableContainer';
93
92
  export * from './ds/components/StatusBadge';
94
93
  export * from './ds/icons/index';
95
94
  export * from './ds/tokens';
@@ -100,6 +99,7 @@ export * from './hooks/use-copy-to-clipboard';
100
99
  export * from './hooks/use-in-view';
101
100
  export * from './hooks/use-autoscroll';
102
101
  export * from './hooks/use-is-mobile';
102
+ export * from './hooks/use-keyboard-shortcut-label';
103
103
  export { cn } from './lib/utils';
104
104
  export * from './lib/string';
105
105
  export * from './lib/number';
@@ -1,4 +1,5 @@
1
1
  export * from './constants';
2
2
  export * from './contentTypeFromUrl';
3
3
  export * from './downloadJson';
4
+ export * from './schemes';
4
5
  export * from './toBase64';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Single source of truth for the URL schemes the attachment pipeline understands.
3
+ *
4
+ * These MUST stay aligned with the protocols Mastra core accepts in
5
+ * `packages/core/src/agent/message-list/prompt/attachments-to-parts.ts` (its
6
+ * `switch (url.protocol)` whitelists exactly `http:`, `https:`, `gs:`, `s3:`
7
+ * and throws `Unsupported URL protocol` for anything else). Forwarding a scheme
8
+ * the UI accepts but core rejects would surface as a runtime error, so the sets
9
+ * are kept in lockstep — see `schemes.parity.test.ts`.
10
+ */
11
+ /** Schemes the browser can fetch directly (for inline previews and HEAD lookups). */
12
+ export declare const BROWSER_FETCHABLE_SCHEMES: readonly ["https://", "http://"];
13
+ /**
14
+ * Cloud-storage schemes that are forwarded to the model provider and resolved
15
+ * server-side (e.g. Vertex AI for `gs://`, Bedrock for `s3://`). The browser
16
+ * cannot fetch these, so they are never HEAD-ed or previewed inline.
17
+ */
18
+ export declare const NON_FETCHABLE_REMOTE_SCHEMES: readonly ["gs://", "s3://"];
19
+ /** Every remote scheme an attachment URL may use (fetchable + cloud-storage). */
20
+ export declare const REMOTE_URL_SCHEMES: readonly ["https://", "http://", "gs://", "s3://"];
21
+ /** True when the value starts with any supported remote scheme. */
22
+ export declare const isRemoteUrl: (value: string) => boolean;
23
+ /** True when the browser can fetch the value directly (http/https). */
24
+ export declare const isBrowserFetchableUrl: (value: string) => boolean;
25
+ /** True when the value is a cloud-storage URI the browser cannot fetch (gs/s3). */
26
+ export declare const isNonFetchableRemoteUrl: (value: string) => boolean;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const dataListSkeleton = require('./data-list-skeleton-COjCBzBF.cjs');
3
+ const dataListSkeleton = require('./data-list-skeleton-BlOwAki1.cjs');
4
4
  const jsxRuntime = require('react/jsx-runtime');
5
5
  const lucideReact = require('lucide-react');
6
6
  const Button = require('./Button-DpIX8JMz.cjs');
@@ -88,7 +88,12 @@ const DataListTopCells = React.forwardRef(
88
88
  "div",
89
89
  {
90
90
  ref,
91
- className: utils.cn("grid grid-cols-subgrid gap-8 col-span-full px-5", flushLeft && "pl-0!", className),
91
+ className: utils.cn(
92
+ "grid grid-cols-subgrid gap-8 px-5 pointer-events-none [&>*]:pointer-events-auto",
93
+ !colStart && "col-span-full",
94
+ flushLeft && "pl-0!",
95
+ className
96
+ ),
92
97
  style: colStart ? { ...style, gridColumn: `${colStart} / -1` } : style,
93
98
  ...rest,
94
99
  children
@@ -238,4 +243,4 @@ const TracesDataList = Object.assign(TracesDataListRoot, {
238
243
  exports.DataList = DataList;
239
244
  exports.ScoresDataList = ScoresDataList;
240
245
  exports.TracesDataList = TracesDataList;
241
- //# sourceMappingURL=traces-data-list-BPTKzaN6.cjs.map
246
+ //# sourceMappingURL=traces-data-list-BNmnKyDD.cjs.map