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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist/{code-block-C4Zp_ewI.cjs → code-block-BPI6hA9o.cjs} +2 -2
  3. package/dist/{code-block-C4Zp_ewI.cjs.map → code-block-BPI6hA9o.cjs.map} +1 -1
  4. package/dist/{code-block-CnRVTecy.js → code-block-BdjHwqE4.js} +2 -2
  5. package/dist/{code-block-CnRVTecy.js.map → code-block-BdjHwqE4.js.map} +1 -1
  6. package/dist/{code-editor-DuX_CPRv.js → code-editor-CxHGOvdY.js} +3 -3
  7. package/dist/{code-editor-DuX_CPRv.js.map → code-editor-CxHGOvdY.js.map} +1 -1
  8. package/dist/{code-editor-LhRB_wMh.cjs → code-editor-DVWPuq12.cjs} +3 -3
  9. package/dist/{code-editor-LhRB_wMh.cjs.map → code-editor-DVWPuq12.cjs.map} +1 -1
  10. package/dist/combobox-DQdRtI_v.cjs +245 -0
  11. package/dist/combobox-DQdRtI_v.cjs.map +1 -0
  12. package/dist/combobox-DvRTz5eL.js +223 -0
  13. package/dist/combobox-DvRTz5eL.js.map +1 -0
  14. package/dist/{command-DPEUOKZw.js → command-CkFCH229.js} +86 -43
  15. package/dist/command-CkFCH229.js.map +1 -0
  16. package/dist/{command-D0tQ1Lpz.cjs → command-EI7t_0WS.cjs} +86 -43
  17. package/dist/command-EI7t_0WS.cjs.map +1 -0
  18. package/dist/components/CodeBlock.cjs.js +1 -1
  19. package/dist/components/CodeBlock.es.js +1 -1
  20. package/dist/components/CodeEditor.cjs.js +1 -1
  21. package/dist/components/CodeEditor.es.js +1 -1
  22. package/dist/components/Columns.cjs.js +1 -1
  23. package/dist/components/Columns.es.js +1 -1
  24. package/dist/components/Combobox.cjs.js +2 -4
  25. package/dist/components/Combobox.cjs.js.map +1 -1
  26. package/dist/components/Combobox.es.js +1 -2
  27. package/dist/components/Combobox.es.js.map +1 -1
  28. package/dist/components/Command.cjs.js +1 -1
  29. package/dist/components/Command.es.js +1 -1
  30. package/dist/components/CopyButton.cjs.js +1 -1
  31. package/dist/components/CopyButton.es.js +1 -1
  32. package/dist/components/DataCodeSection.cjs.js +1 -1
  33. package/dist/components/DataCodeSection.es.js +1 -1
  34. package/dist/components/DataDetailsPanel.cjs.js +1 -1
  35. package/dist/components/DataDetailsPanel.es.js +1 -1
  36. package/dist/components/DataKeysAndValues.cjs.js +1 -1
  37. package/dist/components/DataKeysAndValues.es.js +1 -1
  38. package/dist/components/DataList.cjs.js +2 -2
  39. package/dist/components/DataList.es.js +2 -2
  40. package/dist/components/DataPanel.cjs.js +1 -1
  41. package/dist/components/DataPanel.es.js +1 -1
  42. package/dist/components/Dialog.cjs.js +1 -1
  43. package/dist/components/Dialog.es.js +1 -1
  44. package/dist/components/HorizontalBars.cjs.js +1 -1
  45. package/dist/components/HorizontalBars.es.js +1 -1
  46. package/dist/components/LogsDataList.cjs.js +2 -2
  47. package/dist/components/LogsDataList.es.js +2 -2
  48. package/dist/components/MainSidebar.cjs.js +1 -1
  49. package/dist/components/MainSidebar.es.js +1 -1
  50. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  51. package/dist/components/MarkdownRenderer.es.js +1 -1
  52. package/dist/components/MetricsDataTable.cjs.js +1 -1
  53. package/dist/components/MetricsDataTable.es.js +1 -1
  54. package/dist/components/PropertyFilter.cjs.js +1 -1
  55. package/dist/components/PropertyFilter.es.js +1 -1
  56. package/dist/components/ScrollArea.cjs.js +1 -1
  57. package/dist/components/ScrollArea.es.js +1 -1
  58. package/dist/components/SideDialog.cjs.js +1 -1
  59. package/dist/components/SideDialog.es.js +1 -1
  60. package/dist/components/Truncate.cjs.js +1 -1
  61. package/dist/components/Truncate.es.js +1 -1
  62. package/dist/{copy-button-BfiqaCtC.js → copy-button-RffVknBA.js} +2 -2
  63. package/dist/{copy-button-BfiqaCtC.js.map → copy-button-RffVknBA.js.map} +1 -1
  64. package/dist/{copy-button-BaAuAgdC.cjs → copy-button-ler9dH8g.cjs} +3 -3
  65. package/dist/{copy-button-BaAuAgdC.cjs.map → copy-button-ler9dH8g.cjs.map} +1 -1
  66. package/dist/{data-code-section-MygZlpwo.js → data-code-section-BBBffVVs.js} +3 -3
  67. package/dist/{data-code-section-MygZlpwo.js.map → data-code-section-BBBffVVs.js.map} +1 -1
  68. package/dist/{data-code-section-BtFzBCox.cjs → data-code-section-ChVXPz-i.cjs} +3 -3
  69. package/dist/{data-code-section-BtFzBCox.cjs.map → data-code-section-ChVXPz-i.cjs.map} +1 -1
  70. package/dist/{data-keys-and-values-BSeQG7jb.js → data-keys-and-values-C3pzr_d1.js} +2 -2
  71. package/dist/{data-keys-and-values-BSeQG7jb.js.map → data-keys-and-values-C3pzr_d1.js.map} +1 -1
  72. package/dist/{data-keys-and-values-Spy2O_IE.cjs → data-keys-and-values-KIwfkmc7.cjs} +3 -3
  73. package/dist/{data-keys-and-values-Spy2O_IE.cjs.map → data-keys-and-values-KIwfkmc7.cjs.map} +1 -1
  74. package/dist/{data-list-skeleton-COjCBzBF.cjs → data-list-skeleton-BlOwAki1.cjs} +5 -15
  75. package/dist/data-list-skeleton-BlOwAki1.cjs.map +1 -0
  76. package/dist/{data-list-skeleton-DmAqHgws.js → data-list-skeleton-DD7ljjgS.js} +5 -15
  77. package/dist/data-list-skeleton-DD7ljjgS.js.map +1 -0
  78. package/dist/{data-panel-DToYF7cH.cjs → data-panel-DBxE_3ux.cjs} +2 -2
  79. package/dist/{data-panel-DToYF7cH.cjs.map → data-panel-DBxE_3ux.cjs.map} +1 -1
  80. package/dist/{data-panel-DumaHQiP.js → data-panel-DPVF9Yok.js} +2 -2
  81. package/dist/{data-panel-DumaHQiP.js.map → data-panel-DPVF9Yok.js.map} +1 -1
  82. package/dist/{dialog-46zkb32X.cjs → dialog-C0gOGKEK.cjs} +31 -29
  83. package/dist/dialog-C0gOGKEK.cjs.map +1 -0
  84. package/dist/{dialog-CSSfcjSX.js → dialog-DTLHod4X.js} +31 -29
  85. package/dist/dialog-DTLHod4X.js.map +1 -0
  86. package/dist/dialog.css +2 -2
  87. package/dist/hooks/use-autoscroll.cjs.js +110 -0
  88. package/dist/hooks/use-autoscroll.cjs.js.map +1 -0
  89. package/dist/hooks/use-autoscroll.d.ts +2 -0
  90. package/dist/hooks/use-autoscroll.es.js +106 -0
  91. package/dist/hooks/use-autoscroll.es.js.map +1 -0
  92. package/dist/hooks/use-copy-to-clipboard.cjs.js +11 -0
  93. package/dist/hooks/use-copy-to-clipboard.cjs.js.map +1 -0
  94. package/dist/hooks/use-copy-to-clipboard.d.ts +2 -0
  95. package/dist/hooks/use-copy-to-clipboard.es.js +3 -0
  96. package/dist/hooks/use-copy-to-clipboard.es.js.map +1 -0
  97. package/dist/hooks/use-in-view.cjs.js +22 -0
  98. package/dist/hooks/use-in-view.cjs.js.map +1 -0
  99. package/dist/hooks/use-in-view.d.ts +2 -0
  100. package/dist/hooks/use-in-view.es.js +18 -0
  101. package/dist/hooks/use-in-view.es.js.map +1 -0
  102. package/dist/hooks/use-is-mobile.cjs.js +21 -0
  103. package/dist/hooks/use-is-mobile.cjs.js.map +1 -0
  104. package/dist/hooks/use-is-mobile.d.ts +2 -0
  105. package/dist/hooks/use-is-mobile.es.js +17 -0
  106. package/dist/hooks/use-is-mobile.es.js.map +1 -0
  107. package/dist/hooks/use-keyboard-shortcut-label.cjs.js +29 -0
  108. package/dist/hooks/use-keyboard-shortcut-label.cjs.js.map +1 -0
  109. package/dist/hooks/use-keyboard-shortcut-label.d.ts +2 -0
  110. package/dist/hooks/use-keyboard-shortcut-label.es.js +24 -0
  111. package/dist/hooks/use-keyboard-shortcut-label.es.js.map +1 -0
  112. package/dist/{horizontal-bars-DjLETHvH.js → horizontal-bars-r1aEIHUc.js} +2 -2
  113. package/dist/{horizontal-bars-DjLETHvH.js.map → horizontal-bars-r1aEIHUc.js.map} +1 -1
  114. package/dist/{horizontal-bars-C9qp4r47.cjs → horizontal-bars-uPFpgihX.cjs} +2 -2
  115. package/dist/{horizontal-bars-C9qp4r47.cjs.map → horizontal-bars-uPFpgihX.cjs.map} +1 -1
  116. package/dist/index.cjs.js +88 -79
  117. package/dist/index.cjs.js.map +1 -1
  118. package/dist/index.css +55 -30
  119. package/dist/index.es.js +72 -69
  120. package/dist/index.es.js.map +1 -1
  121. package/dist/{logs-data-list-kzBMv1MW.cjs → logs-data-list-3qmFjBz8.cjs} +2 -2
  122. package/dist/{logs-data-list-kzBMv1MW.cjs.map → logs-data-list-3qmFjBz8.cjs.map} +1 -1
  123. package/dist/{logs-data-list-Bkf7oWlx.js → logs-data-list-Dh6c7URj.js} +2 -2
  124. package/dist/{logs-data-list-Bkf7oWlx.js.map → logs-data-list-Dh6c7URj.js.map} +1 -1
  125. package/dist/{main-sidebar-Djs_3tGw.cjs → main-sidebar-ByHmwU4R.cjs} +6 -5
  126. package/dist/main-sidebar-ByHmwU4R.cjs.map +1 -0
  127. package/dist/{main-sidebar-1GVDTtcD.js → main-sidebar-DJSorgYQ.js} +6 -5
  128. package/dist/main-sidebar-DJSorgYQ.js.map +1 -0
  129. package/dist/{markdown-renderer-DyUlVfRt.cjs → markdown-renderer-Dyg_1QXx.cjs} +2 -2
  130. package/dist/{markdown-renderer-DyUlVfRt.cjs.map → markdown-renderer-Dyg_1QXx.cjs.map} +1 -1
  131. package/dist/{markdown-renderer-BYSrmn0E.js → markdown-renderer-QftQuP4g.js} +2 -2
  132. package/dist/{markdown-renderer-BYSrmn0E.js.map → markdown-renderer-QftQuP4g.js.map} +1 -1
  133. package/dist/{metrics-data-table-D7vx2WEJ.cjs → metrics-data-table-AjAA-dqH.cjs} +2 -2
  134. package/dist/{metrics-data-table-D7vx2WEJ.cjs.map → metrics-data-table-AjAA-dqH.cjs.map} +1 -1
  135. package/dist/{metrics-data-table-DryqJWoI.js → metrics-data-table-hSmtDNck.js} +2 -2
  136. package/dist/{metrics-data-table-DryqJWoI.js.map → metrics-data-table-hSmtDNck.js.map} +1 -1
  137. package/dist/{multi-column-BzL86JPK.cjs → multi-column-BbVNPvhh.cjs} +2 -2
  138. package/dist/{multi-column-BzL86JPK.cjs.map → multi-column-BbVNPvhh.cjs.map} +1 -1
  139. package/dist/{multi-column-C1sXoVG3.js → multi-column-o9qcoBXV.js} +2 -2
  140. package/dist/{multi-column-C1sXoVG3.js.map → multi-column-o9qcoBXV.js.map} +1 -1
  141. package/dist/{property-filter-creator-DU8pl6-6.cjs → property-filter-creator-CaG_zPdy.cjs} +4 -3
  142. package/dist/property-filter-creator-CaG_zPdy.cjs.map +1 -0
  143. package/dist/{property-filter-creator-B9tK0VY3.js → property-filter-creator-Cl9E6wxf.js} +4 -3
  144. package/dist/property-filter-creator-Cl9E6wxf.js.map +1 -0
  145. package/dist/scroll-area-BtcyzOxO.cjs +243 -0
  146. package/dist/scroll-area-BtcyzOxO.cjs.map +1 -0
  147. package/dist/scroll-area-DjZ6nTm5.js +221 -0
  148. package/dist/scroll-area-DjZ6nTm5.js.map +1 -0
  149. package/dist/src/ds/components/Combobox/combobox-styles.d.ts +5 -12
  150. package/dist/src/ds/components/Combobox/combobox.d.ts +13 -4
  151. package/dist/src/ds/components/Combobox/combobox.stories.d.ts +1 -0
  152. package/dist/src/ds/components/Combobox/index.d.ts +0 -1
  153. package/dist/src/ds/components/Command/command.d.ts +5 -1
  154. package/dist/src/ds/components/Command/command.stories.d.ts +1 -0
  155. package/dist/src/ds/components/DataList/data-list-root.d.ts +3 -4
  156. package/dist/src/ds/components/Dialog/dialog.d.ts +2 -0
  157. package/dist/src/ds/components/MainSidebar/main-sidebar-nav-item-classes.d.ts +12 -0
  158. package/dist/src/ds/components/MainSidebar/main-sidebar-nav-link.d.ts +0 -13
  159. package/dist/src/ds/components/MainSidebar/main-sidebar.d.ts +2 -1
  160. package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +12 -0
  161. package/dist/src/ds/components/ScrollArea/scroll-area.stories.d.ts +2 -0
  162. package/dist/src/hooks/use-copy-to-clipboard.d.ts +9 -1
  163. package/dist/src/hooks/use-keyboard-shortcut-label.d.ts +2 -0
  164. package/dist/src/index.d.ts +1 -1
  165. package/dist/src/lib/file/index.d.ts +1 -0
  166. package/dist/src/lib/file/schemes.d.ts +26 -0
  167. package/dist/{traces-data-list-BPTKzaN6.cjs → traces-data-list-BNmnKyDD.cjs} +8 -3
  168. package/dist/traces-data-list-BNmnKyDD.cjs.map +1 -0
  169. package/dist/{traces-data-list-CB7frfpp.js → traces-data-list-DRyI45Ke.js} +8 -3
  170. package/dist/traces-data-list-DRyI45Ke.js.map +1 -0
  171. package/dist/{truncate-C9bKR_02.js → truncate-B8_8wx-G.js} +2 -2
  172. package/dist/{truncate-C9bKR_02.js.map → truncate-B8_8wx-G.js.map} +1 -1
  173. package/dist/{truncate-RL2aHd1a.cjs → truncate-Csk5KmAy.cjs} +2 -2
  174. package/dist/{truncate-RL2aHd1a.cjs.map → truncate-Csk5KmAy.cjs.map} +1 -1
  175. package/dist/use-copy-to-clipboard-D7L_l6_x.js +127 -0
  176. package/dist/use-copy-to-clipboard-D7L_l6_x.js.map +1 -0
  177. package/dist/use-copy-to-clipboard-DHaJCGet.cjs +131 -0
  178. package/dist/use-copy-to-clipboard-DHaJCGet.cjs.map +1 -0
  179. package/package.json +12 -6
  180. package/dist/combobox-B2TriE9Z.cjs +0 -77
  181. package/dist/combobox-B2TriE9Z.cjs.map +0 -1
  182. package/dist/combobox-q2xPfCZc.js +0 -75
  183. package/dist/combobox-q2xPfCZc.js.map +0 -1
  184. package/dist/command-D0tQ1Lpz.cjs.map +0 -1
  185. package/dist/command-DPEUOKZw.js.map +0 -1
  186. package/dist/components/ScrollableContainer.cjs.js +0 -10
  187. package/dist/components/ScrollableContainer.cjs.js.map +0 -1
  188. package/dist/components/ScrollableContainer.d.ts +0 -2
  189. package/dist/components/ScrollableContainer.es.js +0 -2
  190. package/dist/components/ScrollableContainer.es.js.map +0 -1
  191. package/dist/data-list-skeleton-COjCBzBF.cjs.map +0 -1
  192. package/dist/data-list-skeleton-DmAqHgws.js.map +0 -1
  193. package/dist/dialog-46zkb32X.cjs.map +0 -1
  194. package/dist/dialog-CSSfcjSX.js.map +0 -1
  195. package/dist/main-sidebar-1GVDTtcD.js.map +0 -1
  196. package/dist/main-sidebar-Djs_3tGw.cjs.map +0 -1
  197. package/dist/multi-combobox-DkFLK64B.cjs +0 -193
  198. package/dist/multi-combobox-DkFLK64B.cjs.map +0 -1
  199. package/dist/multi-combobox-Y3gT0MqV.js +0 -189
  200. package/dist/multi-combobox-Y3gT0MqV.js.map +0 -1
  201. package/dist/property-filter-creator-B9tK0VY3.js.map +0 -1
  202. package/dist/property-filter-creator-DU8pl6-6.cjs.map +0 -1
  203. package/dist/scroll-area-BqJfcT94.cjs +0 -230
  204. package/dist/scroll-area-BqJfcT94.cjs.map +0 -1
  205. package/dist/scroll-area-BtDqmqBK.js +0 -208
  206. package/dist/scroll-area-BtDqmqBK.js.map +0 -1
  207. package/dist/scrollable-container-BqOFHwdb.js +0 -151
  208. package/dist/scrollable-container-BqOFHwdb.js.map +0 -1
  209. package/dist/scrollable-container-Btq-TfCL.cjs +0 -153
  210. package/dist/scrollable-container-Btq-TfCL.cjs.map +0 -1
  211. package/dist/src/ds/components/Combobox/multi-combobox.d.ts +0 -22
  212. package/dist/src/ds/components/ScrollableContainer/index.d.ts +0 -1
  213. package/dist/src/ds/components/ScrollableContainer/scrollable-container.d.ts +0 -8
  214. package/dist/src/ds/components/ScrollableContainer/scrollable-container.stories.d.ts +0 -10
  215. package/dist/traces-data-list-BPTKzaN6.cjs.map +0 -1
  216. package/dist/traces-data-list-CB7frfpp.js.map +0 -1
  217. package/dist/use-copy-to-clipboard-CGqfkXnN.js +0 -73
  218. package/dist/use-copy-to-clipboard-CGqfkXnN.js.map +0 -1
  219. package/dist/use-copy-to-clipboard-CQgIuR1c.cjs +0 -77
  220. package/dist/use-copy-to-clipboard-CQgIuR1c.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-keyboard-shortcut-label.cjs.js","sources":["../../src/hooks/use-keyboard-shortcut-label.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\n\ntype NavigatorWithUserAgentData = Navigator & {\n userAgentData?: {\n platform?: string;\n };\n};\n\nconst APPLE_PLATFORM_PATTERN = /mac|iphone|ipad|ipod/i;\n\nfunction getIsApplePlatform() {\n if (typeof navigator === 'undefined') return false;\n\n const nav = navigator as NavigatorWithUserAgentData;\n const platform = nav.userAgentData?.platform || nav.platform || '';\n const userAgent = nav.userAgent || '';\n\n return APPLE_PLATFORM_PATTERN.test(platform) || APPLE_PLATFORM_PATTERN.test(userAgent);\n}\n\nexport function useIsApplePlatform() {\n const [isApplePlatform] = useState(getIsApplePlatform);\n\n return isApplePlatform;\n}\n\nexport function useKeyboardShortcutLabel(key: string) {\n const isApplePlatform = useIsApplePlatform();\n\n return useMemo(() => {\n const normalizedKey = key.trim().toUpperCase();\n return `${isApplePlatform ? '⌘' : 'Ctrl'} ${normalizedKey}`;\n }, [isApplePlatform, key]);\n}\n"],"names":["useState","useMemo"],"mappings":";;;;;;AAQA,MAAM,sBAAA,GAAyB,uBAAA;AAE/B,SAAS,kBAAA,GAAqB;AAC5B,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAE7C,EAAA,MAAM,GAAA,GAAM,SAAA;AACZ,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,aAAA,EAAe,QAAA,IAAY,IAAI,QAAA,IAAY,EAAA;AAChE,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,IAAa,EAAA;AAEnC,EAAA,OAAO,uBAAuB,IAAA,CAAK,QAAQ,CAAA,IAAK,sBAAA,CAAuB,KAAK,SAAS,CAAA;AACvF;AAEO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,CAAC,eAAe,CAAA,GAAIA,cAAA,CAAS,kBAAkB,CAAA;AAErD,EAAA,OAAO,eAAA;AACT;AAEO,SAAS,yBAAyB,GAAA,EAAa;AACpD,EAAA,MAAM,kBAAkB,kBAAA,EAAmB;AAE3C,EAAA,OAAOC,cAAQ,MAAM;AACnB,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC7C,IAAA,OAAO,CAAA,EAAG,eAAA,GAAkB,GAAA,GAAM,MAAM,IAAI,aAAa,CAAA,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,eAAA,EAAiB,GAAG,CAAC,CAAA;AAC3B;;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/hooks/use-keyboard-shortcut-label'
2
+ export {}
@@ -0,0 +1,24 @@
1
+ import { useState, useMemo } from 'react';
2
+
3
+ const APPLE_PLATFORM_PATTERN = /mac|iphone|ipad|ipod/i;
4
+ function getIsApplePlatform() {
5
+ if (typeof navigator === "undefined") return false;
6
+ const nav = navigator;
7
+ const platform = nav.userAgentData?.platform || nav.platform || "";
8
+ const userAgent = nav.userAgent || "";
9
+ return APPLE_PLATFORM_PATTERN.test(platform) || APPLE_PLATFORM_PATTERN.test(userAgent);
10
+ }
11
+ function useIsApplePlatform() {
12
+ const [isApplePlatform] = useState(getIsApplePlatform);
13
+ return isApplePlatform;
14
+ }
15
+ function useKeyboardShortcutLabel(key) {
16
+ const isApplePlatform = useIsApplePlatform();
17
+ return useMemo(() => {
18
+ const normalizedKey = key.trim().toUpperCase();
19
+ return `${isApplePlatform ? "⌘" : "Ctrl"} ${normalizedKey}`;
20
+ }, [isApplePlatform, key]);
21
+ }
22
+
23
+ export { useIsApplePlatform, useKeyboardShortcutLabel };
24
+ //# sourceMappingURL=use-keyboard-shortcut-label.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-keyboard-shortcut-label.es.js","sources":["../../src/hooks/use-keyboard-shortcut-label.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\n\ntype NavigatorWithUserAgentData = Navigator & {\n userAgentData?: {\n platform?: string;\n };\n};\n\nconst APPLE_PLATFORM_PATTERN = /mac|iphone|ipad|ipod/i;\n\nfunction getIsApplePlatform() {\n if (typeof navigator === 'undefined') return false;\n\n const nav = navigator as NavigatorWithUserAgentData;\n const platform = nav.userAgentData?.platform || nav.platform || '';\n const userAgent = nav.userAgent || '';\n\n return APPLE_PLATFORM_PATTERN.test(platform) || APPLE_PLATFORM_PATTERN.test(userAgent);\n}\n\nexport function useIsApplePlatform() {\n const [isApplePlatform] = useState(getIsApplePlatform);\n\n return isApplePlatform;\n}\n\nexport function useKeyboardShortcutLabel(key: string) {\n const isApplePlatform = useIsApplePlatform();\n\n return useMemo(() => {\n const normalizedKey = key.trim().toUpperCase();\n return `${isApplePlatform ? '⌘' : 'Ctrl'} ${normalizedKey}`;\n }, [isApplePlatform, key]);\n}\n"],"names":[],"mappings":";;AAQA,MAAM,sBAAA,GAAyB,uBAAA;AAE/B,SAAS,kBAAA,GAAqB;AAC5B,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAE7C,EAAA,MAAM,GAAA,GAAM,SAAA;AACZ,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,aAAA,EAAe,QAAA,IAAY,IAAI,QAAA,IAAY,EAAA;AAChE,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,IAAa,EAAA;AAEnC,EAAA,OAAO,uBAAuB,IAAA,CAAK,QAAQ,CAAA,IAAK,sBAAA,CAAuB,KAAK,SAAS,CAAA;AACvF;AAEO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,CAAC,eAAe,CAAA,GAAI,QAAA,CAAS,kBAAkB,CAAA;AAErD,EAAA,OAAO,eAAA;AACT;AAEO,SAAS,yBAAyB,GAAA,EAAa;AACpD,EAAA,MAAM,kBAAkB,kBAAA,EAAmB;AAE3C,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC7C,IAAA,OAAO,CAAA,EAAG,eAAA,GAAkB,GAAA,GAAM,MAAM,IAAI,aAAa,CAAA,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,eAAA,EAAiB,GAAG,CAAC,CAAA;AAC3B;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { S as ScrollArea } from './scroll-area-BtDqmqBK.js';
2
+ import { S as ScrollArea } from './scroll-area-DjZ6nTm5.js';
3
3
  import { T as Tooltip, c as TooltipTrigger, a as TooltipContent } from './tooltip-DehuxlSR.js';
4
4
  import { c as cn } from './utils-CzYGxqbG.js';
5
5
 
@@ -103,4 +103,4 @@ function Wrapper({ children }) {
103
103
  }
104
104
 
105
105
  export { HorizontalBars as H };
106
- //# sourceMappingURL=horizontal-bars-DjLETHvH.js.map
106
+ //# sourceMappingURL=horizontal-bars-r1aEIHUc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"horizontal-bars-DjLETHvH.js","sources":["../src/ds/components/HorizontalBars/horizontal-bars.tsx"],"sourcesContent":["import type { ElementType, ReactNode } from 'react';\nimport { ScrollArea } from '@/ds/components/ScrollArea/scroll-area';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\ntype Segment = { label: string; color: string };\n\ntype HorizontalBarRow = {\n name: string;\n values: number[];\n /** If present, the whole row is rendered as a link to this URL. */\n href?: string;\n /** If present, an individual segment becomes its own link. Indices align with `segments`. */\n hrefs?: Array<string | undefined>;\n};\n\nexport function HorizontalBars({\n data,\n segments,\n maxVal,\n fmt,\n className,\n LinkComponent = 'a',\n}: {\n data: Array<HorizontalBarRow>;\n segments: Segment[];\n maxVal: number;\n fmt: (v: number) => string;\n className?: string;\n /** Override how links produced by `href` / `hrefs` are rendered. Receives `href`,\n * `className`, `aria-label`, and `children`. Defaults to a plain `<a>` element;\n * consumers using a router should pass an adapter that maps `href` to their\n * navigation primitive (e.g. react-router `<Link to={href} />`). */\n LinkComponent?: ElementType;\n}) {\n const sorted = [...data].sort((a, b) => {\n const totalB = b.values.reduce((s, v) => s + v, 0);\n const totalA = a.values.reduce((s, v) => s + v, 0);\n return totalB - totalA;\n });\n\n const isStacked = segments.length > 1;\n\n return (\n <ScrollArea className={cn('w-full h-full', className)}>\n <div className=\"flex items-center gap-3 mb-4 mt-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n {segments.map(seg => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: seg.color }} />\n <span className=\"text-ui-sm text-neutral3\">{seg.label}</span>\n </div>\n ))}\n </div>\n <span className=\"shrink-0 text-ui-sm text-neutral2 pr-2\">Total</span>\n </div>\n <div className=\"grid gap-3.5\">\n {sorted.map(d => {\n const total = d.values.reduce((s, v) => s + v, 0);\n const rowBody = (\n <>\n <div className=\"relative h-full flex-1 min-w-0\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className={cn('absolute inset-y-0 left-0', d.href ? 'cursor-pointer' : 'cursor-default')}\n style={{ width: `${maxVal > 0 ? (total / maxVal) * 100 : 0}%` }}\n >\n {segments.map((seg, si) => {\n const val = d.values[si] ?? 0;\n const pct = total > 0 ? (val / total) * 100 : 0;\n const left = d.values.slice(0, si).reduce((s, v) => s + (total > 0 ? (v / total) * 100 : 0), 0);\n const isLastWithValue = d.values.slice(si + 1).every(v => !v);\n // Only honor segment-level links when the row itself is not an anchor.\n // Otherwise we'd render <a> nested inside <a>, which is invalid HTML.\n const segHref = d.href ? undefined : d.hrefs?.[si];\n\n const segmentNode = (\n <div\n className={cn(\n 'absolute inset-y-0 opacity-40 dark:opacity-100',\n isStacked && si === 0 && 'rounded-l',\n isStacked && isLastWithValue && 'rounded-r',\n !isStacked && 'rounded',\n segHref && 'cursor-pointer hover:opacity-70 transition-opacity',\n )}\n style={{\n left: isStacked ? `${left}%` : 0,\n width: isStacked ? `${pct}%` : `${pct}%`,\n backgroundColor: seg.color,\n }}\n />\n );\n\n if (segHref) {\n return (\n <LinkComponent\n key={seg.label}\n href={segHref}\n aria-label={`${d.name} — ${seg.label}`}\n className=\"contents\"\n >\n {segmentNode}\n </LinkComponent>\n );\n }\n return <Wrapper key={seg.label}>{segmentNode}</Wrapper>;\n })}\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n <div className=\"grid gap-1\">\n {segments.map((seg, si) => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <span>{seg.label}</span>\n <span className=\"ml-auto pl-3\">{fmt(d.values[si] ?? 0)}</span>\n </div>\n ))}\n </div>\n </TooltipContent>\n </Tooltip>\n <span className=\"absolute inset-y-0 left-2.5 flex items-center text-ui-sm text-neutral4 truncate z-10 pointer-events-none\">\n {d.name}\n </span>\n </div>\n <span className=\"text-ui-md text-neutral4 tabular-nums shrink-0 pr-3\">{fmt(total)}</span>\n </>\n );\n\n if (d.href) {\n return (\n <LinkComponent\n key={d.name}\n href={d.href}\n className=\"flex items-center gap-14 h-6 rounded outline-none cursor-pointer hover:bg-surface3 focus-visible:bg-surface3 transition-colors\"\n >\n {rowBody}\n </LinkComponent>\n );\n }\n return (\n <div key={d.name} className=\"flex items-center gap-14 h-6 \">\n {rowBody}\n </div>\n );\n })}\n </div>\n </ScrollArea>\n );\n}\n\nfunction Wrapper({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n"],"names":[],"mappings":";;;;;AAgBO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,GAAgB;AAClB,CAAA,EAWG;AACD,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACtC,IAAA,MAAM,MAAA,GAAS,EAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,EAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACjD,IAAA,OAAO,MAAA,GAAS,MAAA;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,SAAS,MAAA,GAAS,CAAA;AAEpC,EAAA,4BACG,UAAA,EAAA,EAAW,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,SAAS,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACZ,QAAA,EAAA,QAAA,CAAS,IAAI,CAAA,GAAA,qBACZ,IAAA,CAAC,KAAA,EAAA,EAAoB,SAAA,EAAU,yBAAA,EAC7B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAsB,KAAA,EAAO,EAAE,eAAA,EAAiB,GAAA,CAAI,OAAM,EAAG,CAAA;AAAA,wBAC5E,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,cAAI,KAAA,EAAM;AAAA,OAAA,EAAA,EAF9C,GAAA,CAAI,KAGd,CACD,CAAA,EACH,CAAA;AAAA,sBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,OAAA,EAAK;AAAA,KAAA,EAChE,CAAA;AAAA,wBACC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA,KAAK;AACf,MAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAChD,MAAA,MAAM,0BACJ,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,WAAW,EAAA,CAAG,2BAAA,EAA6B,CAAA,CAAE,IAAA,GAAO,mBAAmB,gBAAgB,CAAA;AAAA,gBACvF,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,GAAS,IAAK,KAAA,GAAQ,MAAA,GAAU,GAAA,GAAM,CAAC,CAAA,CAAA,CAAA,EAAI;AAAA,gBAE7D,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,EAAA,KAAO;AACzB,kBAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA,IAAK,CAAA;AAC5B,kBAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,CAAA,GAAK,GAAA,GAAM,QAAS,GAAA,GAAM,CAAA;AAC9C,kBAAA,MAAM,OAAO,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,EAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,KAAA,GAAQ,CAAA,GAAK,IAAI,KAAA,GAAS,GAAA,GAAM,IAAI,CAAC,CAAA;AAC9F,kBAAA,MAAM,eAAA,GAAkB,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAG5D,kBAAA,MAAM,UAAU,CAAA,CAAE,IAAA,GAAO,MAAA,GAAY,CAAA,CAAE,QAAQ,EAAE,CAAA;AAEjD,kBAAA,MAAM,WAAA,mBACJ,GAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,EAAA;AAAA,wBACT,gDAAA;AAAA,wBACA,SAAA,IAAa,OAAO,CAAA,IAAK,WAAA;AAAA,wBACzB,aAAa,eAAA,IAAmB,WAAA;AAAA,wBAChC,CAAC,SAAA,IAAa,SAAA;AAAA,wBACd,OAAA,IAAW;AAAA,uBACb;AAAA,sBACA,KAAA,EAAO;AAAA,wBACL,IAAA,EAAM,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,GAAM,CAAA;AAAA,wBAC/B,OAAO,SAAA,GAAY,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,GAAM,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA,wBACrC,iBAAiB,GAAA,CAAI;AAAA;AACvB;AAAA,mBACF;AAGF,kBAAA,IAAI,OAAA,EAAS;AACX,oBAAA,uBACE,GAAA;AAAA,sBAAC,aAAA;AAAA,sBAAA;AAAA,wBAEC,IAAA,EAAM,OAAA;AAAA,wBACN,cAAY,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,IAAI,KAAK,CAAA,CAAA;AAAA,wBACpC,SAAA,EAAU,UAAA;AAAA,wBAET,QAAA,EAAA;AAAA,uBAAA;AAAA,sBALI,GAAA,CAAI;AAAA,qBAMX;AAAA,kBAEJ;AACA,kBAAA,uBAAO,GAAA,CAAC,OAAA,EAAA,EAAyB,QAAA,EAAA,WAAA,EAAA,EAAZ,GAAA,CAAI,KAAoB,CAAA;AAAA,gBAC/C,CAAC;AAAA;AAAA,aACH,EACF,CAAA;AAAA,gCACC,cAAA,EAAA,EAAe,IAAA,EAAK,OAAM,SAAA,EAAU,WAAA,EACnC,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,GAAA,EAAK,uBAClB,IAAA,CAAC,KAAA,EAAA,EAAoB,WAAU,yBAAA,EAC7B,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAM,cAAI,KAAA,EAAM,CAAA;AAAA,8BACjB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAA,GAAA,CAAI,EAAE,MAAA,CAAO,EAAE,CAAA,IAAK,CAAC,CAAA,EAAE;AAAA,aAAA,EAAA,EAF/C,GAAA,CAAI,KAGd,CACD,CAAA,EACH,CAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0GAAA,EACb,YAAE,IAAA,EACL;AAAA,SAAA,EACF,CAAA;AAAA,4BACC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,GAAA,CAAI,KAAK,CAAA,EAAE;AAAA,OAAA,EACpF,CAAA;AAGF,MAAA,IAAI,EAAE,IAAA,EAAM;AACV,QAAA,uBACE,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YAEC,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,SAAA,EAAU,gIAAA;AAAA,YAET,QAAA,EAAA;AAAA,WAAA;AAAA,UAJI,CAAA,CAAE;AAAA,SAKT;AAAA,MAEJ;AACA,MAAA,2BACG,KAAA,EAAA,EAAiB,SAAA,EAAU,+BAAA,EACzB,QAAA,EAAA,OAAA,EAAA,EADO,EAAE,IAEZ,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,OAAA,CAAQ,EAAE,QAAA,EAAS,EAA4B;AACtD,EAAA,uCAAU,QAAA,EAAS,CAAA;AACrB;;;;"}
1
+ {"version":3,"file":"horizontal-bars-r1aEIHUc.js","sources":["../src/ds/components/HorizontalBars/horizontal-bars.tsx"],"sourcesContent":["import type { ElementType, ReactNode } from 'react';\nimport { ScrollArea } from '@/ds/components/ScrollArea/scroll-area';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\ntype Segment = { label: string; color: string };\n\ntype HorizontalBarRow = {\n name: string;\n values: number[];\n /** If present, the whole row is rendered as a link to this URL. */\n href?: string;\n /** If present, an individual segment becomes its own link. Indices align with `segments`. */\n hrefs?: Array<string | undefined>;\n};\n\nexport function HorizontalBars({\n data,\n segments,\n maxVal,\n fmt,\n className,\n LinkComponent = 'a',\n}: {\n data: Array<HorizontalBarRow>;\n segments: Segment[];\n maxVal: number;\n fmt: (v: number) => string;\n className?: string;\n /** Override how links produced by `href` / `hrefs` are rendered. Receives `href`,\n * `className`, `aria-label`, and `children`. Defaults to a plain `<a>` element;\n * consumers using a router should pass an adapter that maps `href` to their\n * navigation primitive (e.g. react-router `<Link to={href} />`). */\n LinkComponent?: ElementType;\n}) {\n const sorted = [...data].sort((a, b) => {\n const totalB = b.values.reduce((s, v) => s + v, 0);\n const totalA = a.values.reduce((s, v) => s + v, 0);\n return totalB - totalA;\n });\n\n const isStacked = segments.length > 1;\n\n return (\n <ScrollArea className={cn('w-full h-full', className)}>\n <div className=\"flex items-center gap-3 mb-4 mt-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n {segments.map(seg => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: seg.color }} />\n <span className=\"text-ui-sm text-neutral3\">{seg.label}</span>\n </div>\n ))}\n </div>\n <span className=\"shrink-0 text-ui-sm text-neutral2 pr-2\">Total</span>\n </div>\n <div className=\"grid gap-3.5\">\n {sorted.map(d => {\n const total = d.values.reduce((s, v) => s + v, 0);\n const rowBody = (\n <>\n <div className=\"relative h-full flex-1 min-w-0\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className={cn('absolute inset-y-0 left-0', d.href ? 'cursor-pointer' : 'cursor-default')}\n style={{ width: `${maxVal > 0 ? (total / maxVal) * 100 : 0}%` }}\n >\n {segments.map((seg, si) => {\n const val = d.values[si] ?? 0;\n const pct = total > 0 ? (val / total) * 100 : 0;\n const left = d.values.slice(0, si).reduce((s, v) => s + (total > 0 ? (v / total) * 100 : 0), 0);\n const isLastWithValue = d.values.slice(si + 1).every(v => !v);\n // Only honor segment-level links when the row itself is not an anchor.\n // Otherwise we'd render <a> nested inside <a>, which is invalid HTML.\n const segHref = d.href ? undefined : d.hrefs?.[si];\n\n const segmentNode = (\n <div\n className={cn(\n 'absolute inset-y-0 opacity-40 dark:opacity-100',\n isStacked && si === 0 && 'rounded-l',\n isStacked && isLastWithValue && 'rounded-r',\n !isStacked && 'rounded',\n segHref && 'cursor-pointer hover:opacity-70 transition-opacity',\n )}\n style={{\n left: isStacked ? `${left}%` : 0,\n width: isStacked ? `${pct}%` : `${pct}%`,\n backgroundColor: seg.color,\n }}\n />\n );\n\n if (segHref) {\n return (\n <LinkComponent\n key={seg.label}\n href={segHref}\n aria-label={`${d.name} — ${seg.label}`}\n className=\"contents\"\n >\n {segmentNode}\n </LinkComponent>\n );\n }\n return <Wrapper key={seg.label}>{segmentNode}</Wrapper>;\n })}\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n <div className=\"grid gap-1\">\n {segments.map((seg, si) => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <span>{seg.label}</span>\n <span className=\"ml-auto pl-3\">{fmt(d.values[si] ?? 0)}</span>\n </div>\n ))}\n </div>\n </TooltipContent>\n </Tooltip>\n <span className=\"absolute inset-y-0 left-2.5 flex items-center text-ui-sm text-neutral4 truncate z-10 pointer-events-none\">\n {d.name}\n </span>\n </div>\n <span className=\"text-ui-md text-neutral4 tabular-nums shrink-0 pr-3\">{fmt(total)}</span>\n </>\n );\n\n if (d.href) {\n return (\n <LinkComponent\n key={d.name}\n href={d.href}\n className=\"flex items-center gap-14 h-6 rounded outline-none cursor-pointer hover:bg-surface3 focus-visible:bg-surface3 transition-colors\"\n >\n {rowBody}\n </LinkComponent>\n );\n }\n return (\n <div key={d.name} className=\"flex items-center gap-14 h-6 \">\n {rowBody}\n </div>\n );\n })}\n </div>\n </ScrollArea>\n );\n}\n\nfunction Wrapper({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const jsxRuntime = require('react/jsx-runtime');
4
- const scrollArea = require('./scroll-area-BqJfcT94.cjs');
4
+ const scrollArea = require('./scroll-area-BtcyzOxO.cjs');
5
5
  const tooltip = require('./tooltip-j8gUR1Qk.cjs');
6
6
  const utils = require('./utils-vA5sWo9W.cjs');
7
7
 
@@ -105,4 +105,4 @@ function Wrapper({ children }) {
105
105
  }
106
106
 
107
107
  exports.HorizontalBars = HorizontalBars;
108
- //# sourceMappingURL=horizontal-bars-C9qp4r47.cjs.map
108
+ //# sourceMappingURL=horizontal-bars-uPFpgihX.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"horizontal-bars-C9qp4r47.cjs","sources":["../src/ds/components/HorizontalBars/horizontal-bars.tsx"],"sourcesContent":["import type { ElementType, ReactNode } from 'react';\nimport { ScrollArea } from '@/ds/components/ScrollArea/scroll-area';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\ntype Segment = { label: string; color: string };\n\ntype HorizontalBarRow = {\n name: string;\n values: number[];\n /** If present, the whole row is rendered as a link to this URL. */\n href?: string;\n /** If present, an individual segment becomes its own link. Indices align with `segments`. */\n hrefs?: Array<string | undefined>;\n};\n\nexport function HorizontalBars({\n data,\n segments,\n maxVal,\n fmt,\n className,\n LinkComponent = 'a',\n}: {\n data: Array<HorizontalBarRow>;\n segments: Segment[];\n maxVal: number;\n fmt: (v: number) => string;\n className?: string;\n /** Override how links produced by `href` / `hrefs` are rendered. Receives `href`,\n * `className`, `aria-label`, and `children`. Defaults to a plain `<a>` element;\n * consumers using a router should pass an adapter that maps `href` to their\n * navigation primitive (e.g. react-router `<Link to={href} />`). */\n LinkComponent?: ElementType;\n}) {\n const sorted = [...data].sort((a, b) => {\n const totalB = b.values.reduce((s, v) => s + v, 0);\n const totalA = a.values.reduce((s, v) => s + v, 0);\n return totalB - totalA;\n });\n\n const isStacked = segments.length > 1;\n\n return (\n <ScrollArea className={cn('w-full h-full', className)}>\n <div className=\"flex items-center gap-3 mb-4 mt-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n {segments.map(seg => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: seg.color }} />\n <span className=\"text-ui-sm text-neutral3\">{seg.label}</span>\n </div>\n ))}\n </div>\n <span className=\"shrink-0 text-ui-sm text-neutral2 pr-2\">Total</span>\n </div>\n <div className=\"grid gap-3.5\">\n {sorted.map(d => {\n const total = d.values.reduce((s, v) => s + v, 0);\n const rowBody = (\n <>\n <div className=\"relative h-full flex-1 min-w-0\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className={cn('absolute inset-y-0 left-0', d.href ? 'cursor-pointer' : 'cursor-default')}\n style={{ width: `${maxVal > 0 ? (total / maxVal) * 100 : 0}%` }}\n >\n {segments.map((seg, si) => {\n const val = d.values[si] ?? 0;\n const pct = total > 0 ? (val / total) * 100 : 0;\n const left = d.values.slice(0, si).reduce((s, v) => s + (total > 0 ? (v / total) * 100 : 0), 0);\n const isLastWithValue = d.values.slice(si + 1).every(v => !v);\n // Only honor segment-level links when the row itself is not an anchor.\n // Otherwise we'd render <a> nested inside <a>, which is invalid HTML.\n const segHref = d.href ? undefined : d.hrefs?.[si];\n\n const segmentNode = (\n <div\n className={cn(\n 'absolute inset-y-0 opacity-40 dark:opacity-100',\n isStacked && si === 0 && 'rounded-l',\n isStacked && isLastWithValue && 'rounded-r',\n !isStacked && 'rounded',\n segHref && 'cursor-pointer hover:opacity-70 transition-opacity',\n )}\n style={{\n left: isStacked ? `${left}%` : 0,\n width: isStacked ? `${pct}%` : `${pct}%`,\n backgroundColor: seg.color,\n }}\n />\n );\n\n if (segHref) {\n return (\n <LinkComponent\n key={seg.label}\n href={segHref}\n aria-label={`${d.name} — ${seg.label}`}\n className=\"contents\"\n >\n {segmentNode}\n </LinkComponent>\n );\n }\n return <Wrapper key={seg.label}>{segmentNode}</Wrapper>;\n })}\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n <div className=\"grid gap-1\">\n {segments.map((seg, si) => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <span>{seg.label}</span>\n <span className=\"ml-auto pl-3\">{fmt(d.values[si] ?? 0)}</span>\n </div>\n ))}\n </div>\n </TooltipContent>\n </Tooltip>\n <span className=\"absolute inset-y-0 left-2.5 flex items-center text-ui-sm text-neutral4 truncate z-10 pointer-events-none\">\n {d.name}\n </span>\n </div>\n <span className=\"text-ui-md text-neutral4 tabular-nums shrink-0 pr-3\">{fmt(total)}</span>\n </>\n );\n\n if (d.href) {\n return (\n <LinkComponent\n key={d.name}\n href={d.href}\n className=\"flex items-center gap-14 h-6 rounded outline-none cursor-pointer hover:bg-surface3 focus-visible:bg-surface3 transition-colors\"\n >\n {rowBody}\n </LinkComponent>\n );\n }\n return (\n <div key={d.name} className=\"flex items-center gap-14 h-6 \">\n {rowBody}\n </div>\n );\n })}\n </div>\n </ScrollArea>\n );\n}\n\nfunction Wrapper({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n"],"names":["ScrollArea","cn","jsxs","jsx","Fragment","Tooltip","TooltipTrigger","TooltipContent"],"mappings":"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"}
1
+ {"version":3,"file":"horizontal-bars-uPFpgihX.cjs","sources":["../src/ds/components/HorizontalBars/horizontal-bars.tsx"],"sourcesContent":["import type { ElementType, ReactNode } from 'react';\nimport { ScrollArea } from '@/ds/components/ScrollArea/scroll-area';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\ntype Segment = { label: string; color: string };\n\ntype HorizontalBarRow = {\n name: string;\n values: number[];\n /** If present, the whole row is rendered as a link to this URL. */\n href?: string;\n /** If present, an individual segment becomes its own link. Indices align with `segments`. */\n hrefs?: Array<string | undefined>;\n};\n\nexport function HorizontalBars({\n data,\n segments,\n maxVal,\n fmt,\n className,\n LinkComponent = 'a',\n}: {\n data: Array<HorizontalBarRow>;\n segments: Segment[];\n maxVal: number;\n fmt: (v: number) => string;\n className?: string;\n /** Override how links produced by `href` / `hrefs` are rendered. Receives `href`,\n * `className`, `aria-label`, and `children`. Defaults to a plain `<a>` element;\n * consumers using a router should pass an adapter that maps `href` to their\n * navigation primitive (e.g. react-router `<Link to={href} />`). */\n LinkComponent?: ElementType;\n}) {\n const sorted = [...data].sort((a, b) => {\n const totalB = b.values.reduce((s, v) => s + v, 0);\n const totalA = a.values.reduce((s, v) => s + v, 0);\n return totalB - totalA;\n });\n\n const isStacked = segments.length > 1;\n\n return (\n <ScrollArea className={cn('w-full h-full', className)}>\n <div className=\"flex items-center gap-3 mb-4 mt-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n {segments.map(seg => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: seg.color }} />\n <span className=\"text-ui-sm text-neutral3\">{seg.label}</span>\n </div>\n ))}\n </div>\n <span className=\"shrink-0 text-ui-sm text-neutral2 pr-2\">Total</span>\n </div>\n <div className=\"grid gap-3.5\">\n {sorted.map(d => {\n const total = d.values.reduce((s, v) => s + v, 0);\n const rowBody = (\n <>\n <div className=\"relative h-full flex-1 min-w-0\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className={cn('absolute inset-y-0 left-0', d.href ? 'cursor-pointer' : 'cursor-default')}\n style={{ width: `${maxVal > 0 ? (total / maxVal) * 100 : 0}%` }}\n >\n {segments.map((seg, si) => {\n const val = d.values[si] ?? 0;\n const pct = total > 0 ? (val / total) * 100 : 0;\n const left = d.values.slice(0, si).reduce((s, v) => s + (total > 0 ? (v / total) * 100 : 0), 0);\n const isLastWithValue = d.values.slice(si + 1).every(v => !v);\n // Only honor segment-level links when the row itself is not an anchor.\n // Otherwise we'd render <a> nested inside <a>, which is invalid HTML.\n const segHref = d.href ? undefined : d.hrefs?.[si];\n\n const segmentNode = (\n <div\n className={cn(\n 'absolute inset-y-0 opacity-40 dark:opacity-100',\n isStacked && si === 0 && 'rounded-l',\n isStacked && isLastWithValue && 'rounded-r',\n !isStacked && 'rounded',\n segHref && 'cursor-pointer hover:opacity-70 transition-opacity',\n )}\n style={{\n left: isStacked ? `${left}%` : 0,\n width: isStacked ? `${pct}%` : `${pct}%`,\n backgroundColor: seg.color,\n }}\n />\n );\n\n if (segHref) {\n return (\n <LinkComponent\n key={seg.label}\n href={segHref}\n aria-label={`${d.name} — ${seg.label}`}\n className=\"contents\"\n >\n {segmentNode}\n </LinkComponent>\n );\n }\n return <Wrapper key={seg.label}>{segmentNode}</Wrapper>;\n })}\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n <div className=\"grid gap-1\">\n {segments.map((seg, si) => (\n <div key={seg.label} className=\"flex items-center gap-2\">\n <span>{seg.label}</span>\n <span className=\"ml-auto pl-3\">{fmt(d.values[si] ?? 0)}</span>\n </div>\n ))}\n </div>\n </TooltipContent>\n </Tooltip>\n <span className=\"absolute inset-y-0 left-2.5 flex items-center text-ui-sm text-neutral4 truncate z-10 pointer-events-none\">\n {d.name}\n </span>\n </div>\n <span className=\"text-ui-md text-neutral4 tabular-nums shrink-0 pr-3\">{fmt(total)}</span>\n </>\n );\n\n if (d.href) {\n return (\n <LinkComponent\n key={d.name}\n href={d.href}\n className=\"flex items-center gap-14 h-6 rounded outline-none cursor-pointer hover:bg-surface3 focus-visible:bg-surface3 transition-colors\"\n >\n {rowBody}\n </LinkComponent>\n );\n }\n return (\n <div key={d.name} className=\"flex items-center gap-14 h-6 \">\n {rowBody}\n </div>\n );\n })}\n </div>\n </ScrollArea>\n );\n}\n\nfunction Wrapper({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n"],"names":["ScrollArea","cn","jsxs","jsx","Fragment","Tooltip","TooltipTrigger","TooltipContent"],"mappings":"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"}
package/dist/index.cjs.js CHANGED
@@ -7,7 +7,7 @@ const Avatar = require('./Avatar-Y-1fas25.cjs');
7
7
  const Badge = require('./Badge-CuKV4oHH.cjs');
8
8
  const Breadcrumb = require('./Breadcrumb-BT_nzL3M.cjs');
9
9
  const Button = require('./Button-DpIX8JMz.cjs');
10
- const codeEditor = require('./code-editor-LhRB_wMh.cjs');
10
+ const codeEditor = require('./code-editor-DVWPuq12.cjs');
11
11
  const highlight = require('./highlight-C2uRVhiA.cjs');
12
12
  const EmptyState = require('./EmptyState-vw7dhSKP.cjs');
13
13
  const Entity = require('./Entity-DALpbsRa.cjs');
@@ -21,15 +21,14 @@ const Txt = require('./Txt-Cmn4ug68.cjs');
21
21
  const alertDialog = require('./alert-dialog-DfQhrc2F.cjs');
22
22
  const checkbox = require('./checkbox-Bda6srNY.cjs');
23
23
  const collapsible = require('./collapsible-CDSgJ39O.cjs');
24
- const combobox = require('./combobox-B2TriE9Z.cjs');
25
- const multiCombobox = require('./multi-combobox-DkFLK64B.cjs');
24
+ const combobox = require('./combobox-DQdRtI_v.cjs');
26
25
  const combobox$1 = require('@base-ui/react/combobox');
27
- const command = require('./command-D0tQ1Lpz.cjs');
26
+ const command = require('./command-EI7t_0WS.cjs');
28
27
  const code = require('./code-B3WONxnA.cjs');
29
- const codeBlock = require('./code-block-C4Zp_ewI.cjs');
30
- const copyButton = require('./copy-button-BaAuAgdC.cjs');
28
+ const codeBlock = require('./code-block-BPI6hA9o.cjs');
29
+ const copyButton = require('./copy-button-ler9dH8g.cjs');
31
30
  const dashboardCard = require('./dashboard-card-B9enj4NG.cjs');
32
- const dialog = require('./dialog-46zkb32X.cjs');
31
+ const dialog = require('./dialog-C0gOGKEK.cjs');
33
32
  const drawer = require('./drawer-DQDa97Ep.cjs');
34
33
  const dropdownMenu = require('./dropdown-menu-Vl_C0N5e.cjs');
35
34
  const entry = require('./entry-BwpOISbt.cjs');
@@ -44,13 +43,13 @@ const input = require('./input-DGvJg7no.cjs');
44
43
  const inputGroup = require('./input-group-Bi_4j-WW.cjs');
45
44
  const kbd = require('./kbd-CnIg1L19.cjs');
46
45
  const label = require('./label-U8omtW8w.cjs');
47
- const markdownRenderer = require('./markdown-renderer-DyUlVfRt.cjs');
46
+ const markdownRenderer = require('./markdown-renderer-Dyg_1QXx.cjs');
48
47
  const metricsCard = require('./metrics-card-hs1pqY2Y.cjs');
49
48
  const metricsFlexGrid = require('./metrics-flex-grid-DzlyAgr7.cjs');
50
49
  const popover = require('./popover-B8RFw-D-.cjs');
51
- const propertyFilterCreator = require('./property-filter-creator-DU8pl6-6.cjs');
50
+ const propertyFilterCreator = require('./property-filter-creator-CaG_zPdy.cjs');
52
51
  const radioGroup = require('./radio-group-CcZMn-TY.cjs');
53
- const scrollArea = require('./scroll-area-BqJfcT94.cjs');
52
+ const scrollArea = require('./scroll-area-BtcyzOxO.cjs');
54
53
  const pendingIndicator = require('./pending-indicator-BxD-kwEk.cjs');
55
54
  const searchbar = require('./searchbar-8KtQRL0s.cjs');
56
55
  const select = require('./select-DDgw1wG-.cjs');
@@ -63,7 +62,7 @@ const _switch = require('./switch-DJRX_Onf.cjs');
63
62
  const themeProvider = require('./theme-provider-aO5-jZVp.cjs');
64
63
  const themeToggle = require('./theme-toggle-DWtjTo-a.cjs');
65
64
  const tooltip = require('./tooltip-j8gUR1Qk.cjs');
66
- const truncate = require('./truncate-RL2aHd1a.cjs');
65
+ const truncate = require('./truncate-Csk5KmAy.cjs');
67
66
  const buttonsGroup = require('./buttons-group-BvLg2kpv.cjs');
68
67
  const mainContent = require('./main-content-CnmMWNin.cjs');
69
68
  const mainHeader = require('./main-header-DJLRceP9.cjs');
@@ -72,7 +71,7 @@ const dateTimePicker = require('./date-time-picker-Bjr6V3AR.cjs');
72
71
  const timePicker = require('./time-picker-DWrxHBfR.cjs');
73
72
  const components_JSONSchemaForm = require('./components/JSONSchemaForm.cjs.js');
74
73
  const keyValueList = require('./key-value-list-D067I300.cjs');
75
- const mainSidebar = require('./main-sidebar-Djs_3tGw.cjs');
74
+ const mainSidebar = require('./main-sidebar-ByHmwU4R.cjs');
76
75
  const pageHeader = require('./page-header-C1ZlL4Ua.cjs');
77
76
  const section = require('./section-muObW4n-.cjs');
78
77
  const sectionCard = require('./section-card-23Os1QRs.cjs');
@@ -81,7 +80,7 @@ const tabsTab = require('./tabs-tab-CulV7e_n.cjs');
81
80
  const tabsContent = require('./tabs-content-m86TGI_b.cjs');
82
81
  const getShortId = require('./get-short-id-DtN4BmrD.cjs');
83
82
  const contentBlock = require('./content-block-Csb01oxE.cjs');
84
- const multiColumn = require('./multi-column-BzL86JPK.cjs');
83
+ const multiColumn = require('./multi-column-BbVNPvhh.cjs');
85
84
  const codeDiff = require('./code-diff-C2vuR6Ti.cjs');
86
85
  const helpers = require('./helpers-BbJUaSrW.cjs');
87
86
  const Notice = require('./Notice-Mjo3MJi2.cjs');
@@ -89,35 +88,38 @@ const chip = require('./chip-Cx5D5DkA.cjs');
89
88
  const chipsGroup = require('./chips-group-CaxAKuxv.cjs');
90
89
  const tree = require('./tree-BcSHc5Cw.cjs');
91
90
  const selectDataFilter = require('./select-data-filter-DxoxTXk2.cjs');
92
- const tracesDataList = require('./traces-data-list-BPTKzaN6.cjs');
93
- const dataListSkeleton = require('./data-list-skeleton-COjCBzBF.cjs');
94
- const logsDataList = require('./logs-data-list-kzBMv1MW.cjs');
91
+ const tracesDataList = require('./traces-data-list-BNmnKyDD.cjs');
92
+ const dataListSkeleton = require('./data-list-skeleton-BlOwAki1.cjs');
93
+ const logsDataList = require('./logs-data-list-3qmFjBz8.cjs');
95
94
  const noDataPageLayout = require('./no-data-page-layout-CiNBx-vK.cjs');
96
95
  const pageHeadingContext = require('./page-heading-context-Du-CpxAx.cjs');
97
96
  const listSearch = require('./list-search-DY84ZCM-.cjs');
98
97
  const ErrorBoundary = require('./ErrorBoundary-BqiUSXyJ.cjs');
99
98
  const ErrorState = require('./ErrorState-Dq9BVWmR.cjs');
100
99
  const Card = require('./Card-Xx0_PeuI.cjs');
101
- const dataCodeSection = require('./data-code-section-BtFzBCox.cjs');
100
+ const dataCodeSection = require('./data-code-section-ChVXPz-i.cjs');
102
101
  const components_DataDetailsPanel = require('./components/DataDetailsPanel.cjs.js');
103
- const dataKeysAndValues = require('./data-keys-and-values-Spy2O_IE.cjs');
104
- const dataPanel = require('./data-panel-DToYF7cH.cjs');
102
+ const dataKeysAndValues = require('./data-keys-and-values-KIwfkmc7.cjs');
103
+ const dataPanel = require('./data-panel-DBxE_3ux.cjs');
105
104
  const dateTimeRangePicker = require('./date-time-range-picker-DjcVeD-Z.cjs');
106
- const horizontalBars = require('./horizontal-bars-C9qp4r47.cjs');
107
- const metricsDataTable = require('./metrics-data-table-D7vx2WEJ.cjs');
105
+ const horizontalBars = require('./horizontal-bars-uPFpgihX.cjs');
106
+ const metricsDataTable = require('./metrics-data-table-AjAA-dqH.cjs');
108
107
  const metricsLineChart = require('./metrics-line-chart-D1ZGVepo.cjs');
109
- const scrollableContainer = require('./scrollable-container-Btq-TfCL.cjs');
110
108
  const StatusBadge = require('./StatusBadge-DKtfODhH.cjs');
111
109
  const tokens = require('./tokens.cjs.js');
112
110
  const spacings = require('./spacings-BP8L49kn.cjs');
113
111
  const controlSize = require('./control-size-D67C0kPZ.cjs');
114
112
  const formElement = require('./form-element-Cy7aV1Ds.cjs');
115
113
  const transitions = require('./transitions-DpczSjmD.cjs');
116
- const useCopyToClipboard = require('./use-copy-to-clipboard-CQgIuR1c.cjs');
117
- const React = require('react');
114
+ const hooks_useCopyToClipboard = require('./use-copy-to-clipboard-DHaJCGet.cjs');
115
+ const hooks_useInView = require('./hooks/use-in-view.cjs.js');
116
+ const hooks_useAutoscroll = require('./hooks/use-autoscroll.cjs.js');
117
+ const hooks_useIsMobile = require('./hooks/use-is-mobile.cjs.js');
118
+ const hooks_useKeyboardShortcutLabel = require('./hooks/use-keyboard-shortcut-label.cjs.js');
118
119
  const utils = require('./utils-vA5sWo9W.cjs');
119
120
  const jsxRuntime = require('react/jsx-runtime');
120
121
  const lucideReact = require('lucide-react');
122
+ const React = require('react');
121
123
  const reactResizablePanels = require('react-resizable-panels');
122
124
  const Icon = require('./Icon-C_Ooy-cP.cjs');
123
125
  const zustand = require('zustand');
@@ -1412,33 +1414,6 @@ const MetricsIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "
1412
1414
  )
1413
1415
  ] });
1414
1416
 
1415
- const useInView = () => {
1416
- const [inView, setInView] = React.useState(false);
1417
- const setRef = React.useCallback((node) => {
1418
- if (node) {
1419
- const observer = new IntersectionObserver(([entry]) => {
1420
- setInView(entry.isIntersecting);
1421
- });
1422
- observer.observe(node);
1423
- return () => observer.disconnect();
1424
- }
1425
- }, []);
1426
- return { inView, setRef };
1427
- };
1428
-
1429
- const useIsMobile = (breakpoint = 1024) => {
1430
- const query = React.useMemo(() => `(max-width: ${breakpoint - 1}px)`, [breakpoint]);
1431
- const [isMobile, setIsMobile] = React.useState(false);
1432
- React.useLayoutEffect(() => {
1433
- const mq = window.matchMedia(query);
1434
- const update = () => setIsMobile(mq.matches);
1435
- update();
1436
- mq.addEventListener("change", update);
1437
- return () => mq.removeEventListener("change", update);
1438
- }, [query]);
1439
- return isMobile;
1440
- };
1441
-
1442
1417
  const lodashTitleCase = (str) => {
1443
1418
  const camelCased = str.replace(/[-_\s]+(.)?/g, (_, char) => char ? char.toUpperCase() : "").replace(/^(.)/, (char) => char.toLowerCase());
1444
1419
  return camelCased.replace(/([A-Z])/g, " $1").replace(/^./, (str2) => str2.toUpperCase()).trim();
@@ -2550,10 +2525,48 @@ const EXTENSION_TO_MIME = {
2550
2525
  svg: "image/svg+xml",
2551
2526
  bmp: "image/bmp",
2552
2527
  ico: "image/x-icon",
2553
- pdf: "application/pdf"
2528
+ pdf: "application/pdf",
2529
+ // Video
2530
+ mp4: "video/mp4",
2531
+ mov: "video/quicktime",
2532
+ webm: "video/webm",
2533
+ mkv: "video/x-matroska",
2534
+ avi: "video/x-msvideo",
2535
+ mpeg: "video/mpeg",
2536
+ mpg: "video/mpeg",
2537
+ // Audio
2538
+ mp3: "audio/mpeg",
2539
+ wav: "audio/wav",
2540
+ ogg: "audio/ogg",
2541
+ oga: "audio/ogg",
2542
+ m4a: "audio/mp4",
2543
+ aac: "audio/aac",
2544
+ flac: "audio/flac"
2554
2545
  };
2555
2546
 
2547
+ const BROWSER_FETCHABLE_SCHEMES = ["https://", "http://"];
2548
+ const NON_FETCHABLE_REMOTE_SCHEMES = ["gs://", "s3://"];
2549
+ const REMOTE_URL_SCHEMES = [...BROWSER_FETCHABLE_SCHEMES, ...NON_FETCHABLE_REMOTE_SCHEMES];
2550
+ const isRemoteUrl = (value) => REMOTE_URL_SCHEMES.some((scheme) => value.startsWith(scheme));
2551
+ const isBrowserFetchableUrl = (value) => BROWSER_FETCHABLE_SCHEMES.some((scheme) => value.startsWith(scheme));
2552
+ const isNonFetchableRemoteUrl = (value) => NON_FETCHABLE_REMOTE_SCHEMES.some((scheme) => value.startsWith(scheme));
2553
+
2554
+ const contentTypeFromExtension = (url) => {
2555
+ try {
2556
+ const { pathname } = new URL(url);
2557
+ const extension = pathname.split(".").pop();
2558
+ if (!extension) return void 0;
2559
+ return EXTENSION_TO_MIME[extension.toLowerCase()];
2560
+ } catch {
2561
+ const extension = url.split(".").pop()?.split(/[?#]/)[0];
2562
+ if (!extension) return void 0;
2563
+ return EXTENSION_TO_MIME[extension.toLowerCase()];
2564
+ }
2565
+ };
2556
2566
  const getFileContentType = async (url) => {
2567
+ if (NON_FETCHABLE_REMOTE_SCHEMES.some((scheme) => url.startsWith(scheme))) {
2568
+ return contentTypeFromExtension(url);
2569
+ }
2557
2570
  try {
2558
2571
  const response = await fetch(url, {
2559
2572
  method: "HEAD"
@@ -2567,17 +2580,7 @@ const getFileContentType = async (url) => {
2567
2580
  }
2568
2581
  return contentType;
2569
2582
  } catch {
2570
- try {
2571
- const urlObject = new URL(url);
2572
- const pathname = urlObject.pathname;
2573
- const extension = pathname.split(".").pop();
2574
- if (!extension) return void 0;
2575
- return EXTENSION_TO_MIME[extension.toLowerCase()];
2576
- } catch {
2577
- const extension = url.split(".").pop()?.split(/[?#]/)[0];
2578
- if (!extension) return void 0;
2579
- return EXTENSION_TO_MIME[extension.toLowerCase()];
2580
- }
2583
+ return contentTypeFromExtension(url);
2581
2584
  }
2582
2585
  };
2583
2586
 
@@ -6056,7 +6059,7 @@ function useDownloadTraceJson() {
6056
6059
  if (isPending) return;
6057
6060
  setIsPending(true);
6058
6061
  const task = client.getTrace(traceId).then((trace) => downloadJson(`trace-${traceId}.json`, trace)).finally(() => setIsPending(false));
6059
- useCopyToClipboard.toast.promise({
6062
+ hooks_useCopyToClipboard.toast.promise({
6060
6063
  myPromise: task,
6061
6064
  loadingMessage: "Preparing trace download…",
6062
6065
  successMessage: "Trace downloaded",
@@ -7108,7 +7111,7 @@ const useTraces = ({
7108
7111
  } = polling;
7109
7112
  const client = react.useMastraClient();
7110
7113
  const queryClient = reactQuery.useQueryClient();
7111
- const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();
7114
+ const { inView: isEndOfListInView, setRef: setEndOfListElement } = hooks_useInView.useInView();
7112
7115
  const [deltaSupport, setDeltaSupport] = React.useState(() => deltaSupportByClient.get(client) ?? "unknown");
7113
7116
  const deltaUnsupported = deltaSupport === "unsupported";
7114
7117
  const [autoRefetch, setAutoRefetch] = React.useState(true);
@@ -7686,13 +7689,13 @@ function useTraceFilterPersistence(searchParams, setSearchParams, options) {
7686
7689
  saveTraceFiltersToStorage(searchParams, storageKey);
7687
7690
  setHasSavedFilters(true);
7688
7691
  const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE$1;
7689
- if (text !== false) useCopyToClipboard.toast.success(text);
7692
+ if (text !== false) hooks_useCopyToClipboard.toast.success(text);
7690
7693
  }, [searchParams, storageKey, messages?.saved]);
7691
7694
  const handleRemoveSaved = React.useCallback(() => {
7692
7695
  clearSavedTraceFilters(storageKey);
7693
7696
  setHasSavedFilters(false);
7694
7697
  const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE$1;
7695
- if (text !== false) useCopyToClipboard.toast.success(text);
7698
+ if (text !== false) hooks_useCopyToClipboard.toast.success(text);
7696
7699
  }, [storageKey, messages?.cleared]);
7697
7700
  const hydratedRef = React.useRef(false);
7698
7701
  React.useEffect(() => {
@@ -8105,7 +8108,7 @@ function selectLogs(data) {
8105
8108
  }
8106
8109
  const useLogs = ({ filters } = {}) => {
8107
8110
  const client = react.useMastraClient();
8108
- const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();
8111
+ const { inView: isEndOfListInView, setRef: setEndOfListElement } = hooks_useInView.useInView();
8109
8112
  const query = reactQuery.useInfiniteQuery({
8110
8113
  queryKey: ["logs", filters],
8111
8114
  queryFn: ({ pageParam }) => client.listLogsVNext({
@@ -8326,13 +8329,13 @@ function useLogsFilterPersistence(searchParams, setSearchParams, options) {
8326
8329
  saveLogsFiltersToStorage(searchParams, storageKey);
8327
8330
  setHasSavedFilters(true);
8328
8331
  const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE;
8329
- if (text !== false) useCopyToClipboard.toast.success(text);
8332
+ if (text !== false) hooks_useCopyToClipboard.toast.success(text);
8330
8333
  }, [searchParams, storageKey, messages?.saved]);
8331
8334
  const handleRemoveSaved = React.useCallback(() => {
8332
8335
  clearSavedLogsFilters(storageKey);
8333
8336
  setHasSavedFilters(false);
8334
8337
  const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE;
8335
- if (text !== false) useCopyToClipboard.toast.success(text);
8338
+ if (text !== false) hooks_useCopyToClipboard.toast.success(text);
8336
8339
  }, [storageKey, messages?.cleared]);
8337
8340
  const hydratedRef = React.useRef(false);
8338
8341
  React.useEffect(() => {
@@ -8480,8 +8483,7 @@ exports.Collapsible = collapsible.Collapsible;
8480
8483
  exports.CollapsibleContent = collapsible.CollapsibleContent;
8481
8484
  exports.CollapsibleTrigger = collapsible.CollapsibleTrigger;
8482
8485
  exports.Combobox = combobox.Combobox;
8483
- exports.MultiCombobox = multiCombobox.MultiCombobox;
8484
- exports.comboboxStyles = multiCombobox.comboboxStyles;
8486
+ exports.comboboxStyles = combobox.comboboxStyles;
8485
8487
  Object.defineProperty(exports, "ComboboxPrimitive", {
8486
8488
  enumerable: true,
8487
8489
  get: () => combobox$1.Combobox
@@ -8565,7 +8567,6 @@ exports.RadioGroup = radioGroup.RadioGroup;
8565
8567
  exports.RadioGroupItem = radioGroup.RadioGroupItem;
8566
8568
  exports.ScrollArea = scrollArea.ScrollArea;
8567
8569
  exports.ScrollBar = scrollArea.ScrollBar;
8568
- exports.useAutoscroll = scrollArea.useAutoscroll;
8569
8570
  exports.PendingIndicator = pendingIndicator.PendingIndicator;
8570
8571
  exports.Searchbar = searchbar.Searchbar;
8571
8572
  exports.SearchbarWrapper = searchbar.SearchbarWrapper;
@@ -8693,7 +8694,6 @@ exports.HorizontalBars = horizontalBars.HorizontalBars;
8693
8694
  exports.MetricsDataTable = metricsDataTable.MetricsDataTable;
8694
8695
  exports.MetricsLineChart = metricsLineChart.MetricsLineChart;
8695
8696
  exports.MetricsLineChartTooltip = metricsLineChart.MetricsLineChartTooltip;
8696
- exports.ScrollableContainer = scrollableContainer.ScrollableContainer;
8697
8697
  exports.StatusBadge = StatusBadge.StatusBadge;
8698
8698
  exports.Animations = tokens.Animations;
8699
8699
  exports.BorderColors = spacings.BorderColors;
@@ -8720,9 +8720,14 @@ exports.unstyledFormElementStyle = formElement.unstyledFormElementStyle;
8720
8720
  exports.focusRing = transitions.focusRing;
8721
8721
  exports.hoverEffects = transitions.hoverEffects;
8722
8722
  exports.transitions = transitions.transitions;
8723
- exports.Toaster = useCopyToClipboard.Toaster;
8724
- exports.toast = useCopyToClipboard.toast;
8725
- exports.useCopyToClipboard = useCopyToClipboard.useCopyToClipboard;
8723
+ exports.Toaster = hooks_useCopyToClipboard.Toaster;
8724
+ exports.toast = hooks_useCopyToClipboard.toast;
8725
+ exports.useCopyToClipboard = hooks_useCopyToClipboard.useCopyToClipboard;
8726
+ exports.useInView = hooks_useInView.useInView;
8727
+ exports.useAutoscroll = hooks_useAutoscroll.useAutoscroll;
8728
+ exports.useIsMobile = hooks_useIsMobile.useIsMobile;
8729
+ exports.useIsApplePlatform = hooks_useKeyboardShortcutLabel.useIsApplePlatform;
8730
+ exports.useKeyboardShortcutLabel = hooks_useKeyboardShortcutLabel.useKeyboardShortcutLabel;
8726
8731
  exports.cn = utils.cn;
8727
8732
  exports.Icon = Icon.Icon;
8728
8733
  exports.AgentCoinIcon = AgentCoinIcon;
@@ -8733,6 +8738,7 @@ exports.AnthropicChatIcon = AnthropicChatIcon;
8733
8738
  exports.AnthropicMessagesIcon = AnthropicMessagesIcon;
8734
8739
  exports.ApiIcon = ApiIcon;
8735
8740
  exports.AzureIcon = AzureIcon;
8741
+ exports.BROWSER_FETCHABLE_SCHEMES = BROWSER_FETCHABLE_SCHEMES;
8736
8742
  exports.BarListContent = BarListContent;
8737
8743
  exports.BranchIcon = BranchIcon;
8738
8744
  exports.CHART_COLORS = CHART_COLORS;
@@ -8794,6 +8800,7 @@ exports.MetricsIcon = MetricsIcon;
8794
8800
  exports.MetricsProvider = MetricsProvider;
8795
8801
  exports.MistralIcon = MistralIcon;
8796
8802
  exports.ModelUsageCostCardView = ModelUsageCostCardView;
8803
+ exports.NON_FETCHABLE_REMOTE_SCHEMES = NON_FETCHABLE_REMOTE_SCHEMES;
8797
8804
  exports.NetlifyIcon = NetlifyIcon;
8798
8805
  exports.NoLogsInfo = NoLogsInfo;
8799
8806
  exports.NoTracesInfo = NoTracesInfo;
@@ -8807,6 +8814,7 @@ exports.PanelDrawer = PanelDrawer;
8807
8814
  exports.PanelSeparator = PanelSeparator;
8808
8815
  exports.ProcessorIcon = ProcessorIcon;
8809
8816
  exports.PromptIcon = PromptIcon;
8817
+ exports.REMOTE_URL_SCHEMES = REMOTE_URL_SCHEMES;
8810
8818
  exports.ROOT_ENTITY_TYPES = ROOT_ENTITY_TYPES;
8811
8819
  exports.ROOT_ENTITY_TYPE_OPTIONS = ROOT_ENTITY_TYPE_OPTIONS;
8812
8820
  exports.RepoIcon = RepoIcon;
@@ -8909,8 +8917,11 @@ exports.is401UnauthorizedError = is401UnauthorizedError;
8909
8917
  exports.is403ForbiddenError = is403ForbiddenError;
8910
8918
  exports.is404NotFoundError = is404NotFoundError;
8911
8919
  exports.isBranchesNotSupportedError = isBranchesNotSupportedError;
8920
+ exports.isBrowserFetchableUrl = isBrowserFetchableUrl;
8921
+ exports.isNonFetchableRemoteUrl = isNonFetchableRemoteUrl;
8912
8922
  exports.isNonRetryableError = isNonRetryableError;
8913
8923
  exports.isObjectEmpty = isObjectEmpty;
8924
+ exports.isRemoteUrl = isRemoteUrl;
8914
8925
  exports.isRule = isRule;
8915
8926
  exports.isRuleGroup = isRuleGroup;
8916
8927
  exports.isTokenLimitExceeded = isTokenLimitExceeded;
@@ -8941,8 +8952,6 @@ exports.useDownloadTraceJson = useDownloadTraceJson;
8941
8952
  exports.useDrilldown = useDrilldown;
8942
8953
  exports.useEntityNames = useEntityNames;
8943
8954
  exports.useEnvironments = useEnvironments;
8944
- exports.useInView = useInView;
8945
- exports.useIsMobile = useIsMobile;
8946
8955
  exports.useLatencyMetrics = useLatencyMetrics;
8947
8956
  exports.useLogs = useLogs;
8948
8957
  exports.useLogsFilterPersistence = useLogsFilterPersistence;