@workflow/web-shared 5.0.0-beta.3 → 5.0.0-beta.30

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 (402) hide show
  1. package/README.md +2 -10
  2. package/dist/components/error-boundary.js +1 -1
  3. package/dist/components/event-list-view.d.ts +46 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +228 -90
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +6 -2
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +5 -2
  10. package/dist/components/new-trace-viewer/components/copy-button.js +3 -3
  11. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts +34 -0
  12. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  13. package/dist/components/new-trace-viewer/components/detail-panel-width.js +67 -0
  14. package/dist/components/new-trace-viewer/components/detail-panel.d.ts +14 -0
  15. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +1 -0
  16. package/dist/components/new-trace-viewer/components/detail-panel.js +122 -0
  17. package/dist/components/new-trace-viewer/components/draggable-border.d.ts +31 -0
  18. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +1 -0
  19. package/dist/components/new-trace-viewer/components/draggable-border.js +140 -0
  20. package/dist/components/new-trace-viewer/components/event-list.d.ts +4 -2
  21. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
  22. package/dist/components/new-trace-viewer/components/event-list.js +22 -13
  23. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  27. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  28. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  29. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  30. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  31. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  32. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  33. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  34. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  35. package/dist/components/new-trace-viewer/components/minimap.d.ts +14 -0
  36. package/dist/components/new-trace-viewer/components/minimap.d.ts.map +1 -0
  37. package/dist/components/new-trace-viewer/components/minimap.js +337 -0
  38. package/dist/components/new-trace-viewer/components/pane-constants.d.ts +14 -0
  39. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +1 -0
  40. package/dist/components/new-trace-viewer/components/pane-constants.js +16 -0
  41. package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
  42. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
  43. package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
  44. package/dist/components/new-trace-viewer/components/split-pane.d.ts +3 -7
  45. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
  46. package/dist/components/new-trace-viewer/components/split-pane.js +25 -84
  47. package/dist/components/new-trace-viewer/components/timeline.d.ts +19 -15
  48. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  49. package/dist/components/new-trace-viewer/components/timeline.js +229 -111
  50. package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
  51. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  52. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  53. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +55 -0
  54. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  55. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  56. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  57. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +26 -0
  58. package/dist/components/new-trace-viewer/components/use-element-width.d.ts +8 -0
  59. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +1 -0
  60. package/dist/components/new-trace-viewer/components/use-element-width.js +25 -0
  61. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
  62. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
  63. package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
  64. package/dist/components/new-trace-viewer/context.d.ts +3 -1
  65. package/dist/components/new-trace-viewer/context.d.ts.map +1 -1
  66. package/dist/components/new-trace-viewer/context.js +9 -10
  67. package/dist/components/new-trace-viewer/icons.js +3 -3
  68. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  69. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  70. package/dist/components/new-trace-viewer/search.js +134 -0
  71. package/dist/components/new-trace-viewer/trace-viewer.d.ts +6 -3
  72. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  73. package/dist/components/new-trace-viewer/trace-viewer.js +167 -162
  74. package/dist/components/new-trace-viewer/types.d.ts +2 -0
  75. package/dist/components/new-trace-viewer/types.d.ts.map +1 -1
  76. package/dist/components/new-trace-viewer/types.js +2 -2
  77. package/dist/components/new-trace-viewer/utils.d.ts +48 -13
  78. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
  79. package/dist/components/new-trace-viewer/utils.js +135 -107
  80. package/dist/components/run-trace-view.d.ts +5 -7
  81. package/dist/components/run-trace-view.d.ts.map +1 -1
  82. package/dist/components/run-trace-view.js +3 -3
  83. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  84. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  85. package/dist/components/sidebar/attribute-panel.js +133 -113
  86. package/dist/components/sidebar/attributes-block.d.ts +40 -0
  87. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  88. package/dist/components/sidebar/attributes-block.js +140 -0
  89. package/dist/components/sidebar/conversation-view.js +1 -1
  90. package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
  91. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  92. package/dist/components/sidebar/copyable-data-block.js +17 -16
  93. package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
  94. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  95. package/dist/components/sidebar/entity-detail-panel.js +35 -69
  96. package/dist/components/sidebar/events-list.d.ts +6 -2
  97. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  98. package/dist/components/sidebar/events-list.js +76 -62
  99. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  100. package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
  101. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  102. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  103. package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
  104. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  105. package/dist/components/sidebar/span-detail-merge.js +92 -0
  106. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  107. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  108. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  109. package/dist/components/stream-viewer.js +1 -1
  110. package/dist/components/trace-viewer/components/map.d.ts +2 -2
  111. package/dist/components/trace-viewer/components/map.d.ts.map +1 -1
  112. package/dist/components/trace-viewer/components/map.js +1 -1
  113. package/dist/components/trace-viewer/components/markers.js +1 -1
  114. package/dist/components/trace-viewer/components/node.d.ts +7 -7
  115. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  116. package/dist/components/trace-viewer/components/node.js +2 -1
  117. package/dist/components/trace-viewer/components/search-input.js +1 -1
  118. package/dist/components/trace-viewer/components/search.js +1 -1
  119. package/dist/components/trace-viewer/components/span-content.js +1 -1
  120. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  121. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  122. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  123. package/dist/components/trace-viewer/components/ui.js +1 -1
  124. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  125. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  126. package/dist/components/trace-viewer/context.js +1 -1
  127. package/dist/components/trace-viewer/index.js +1 -1
  128. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  129. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  130. package/dist/components/trace-viewer/types.js +1 -1
  131. package/dist/components/trace-viewer/util/constants.js +1 -1
  132. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  133. package/dist/components/trace-viewer/util/timing.d.ts +3 -3
  134. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  135. package/dist/components/trace-viewer/util/timing.js +8 -11
  136. package/dist/components/trace-viewer/util/tree.js +1 -1
  137. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  138. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  139. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  140. package/dist/components/trace-viewer/worker.js +1 -1
  141. package/dist/components/trace-viewer-new.d.ts +5 -1
  142. package/dist/components/trace-viewer-new.d.ts.map +1 -1
  143. package/dist/components/trace-viewer-new.js +8 -10
  144. package/dist/components/ui/alert.js +2 -2
  145. package/dist/components/ui/button.d.ts +10 -0
  146. package/dist/components/ui/button.d.ts.map +1 -0
  147. package/dist/components/ui/button.js +46 -0
  148. package/dist/components/ui/card.js +2 -2
  149. package/dist/components/ui/collapsible.d.ts +46 -0
  150. package/dist/components/ui/collapsible.d.ts.map +1 -0
  151. package/dist/components/ui/collapsible.js +66 -0
  152. package/dist/components/ui/context-card.d.ts +47 -0
  153. package/dist/components/ui/context-card.d.ts.map +1 -0
  154. package/dist/components/ui/context-card.js +471 -0
  155. package/dist/components/ui/data-inspector.d.ts +7 -6
  156. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  157. package/dist/components/ui/data-inspector.js +232 -99
  158. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  159. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  160. package/dist/components/ui/data-inspector.styles.js +95 -0
  161. package/dist/components/ui/decrypt-button.js +1 -1
  162. package/dist/components/ui/error-card.js +2 -2
  163. package/dist/components/ui/error-stack-block.d.ts +17 -10
  164. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  165. package/dist/components/ui/error-stack-block.js +49 -30
  166. package/dist/components/ui/icon-button.d.ts +19 -0
  167. package/dist/components/ui/icon-button.d.ts.map +1 -0
  168. package/dist/components/ui/icon-button.js +29 -0
  169. package/dist/components/ui/kbd.d.ts +10 -0
  170. package/dist/components/ui/kbd.d.ts.map +1 -0
  171. package/dist/components/ui/kbd.js +25 -0
  172. package/dist/components/ui/load-more-button.js +1 -1
  173. package/dist/components/ui/menu-dropdown.js +1 -1
  174. package/dist/components/ui/skeleton.js +2 -2
  175. package/dist/components/ui/spinner.js +1 -1
  176. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  177. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  178. package/dist/components/ui/timestamp-tooltip.js +80 -132
  179. package/dist/components/ui/tooltip.d.ts +10 -0
  180. package/dist/components/ui/tooltip.d.ts.map +1 -0
  181. package/dist/components/ui/tooltip.js +12 -0
  182. package/dist/components/workflow-trace-view.d.ts +7 -8
  183. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  184. package/dist/components/workflow-trace-view.js +11 -16
  185. package/dist/components/workflow-traces/event-colors.d.ts +2 -1
  186. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  187. package/dist/components/workflow-traces/event-colors.js +15 -7
  188. package/dist/components/workflow-traces/trace-colors.d.ts.map +1 -1
  189. package/dist/components/workflow-traces/trace-colors.js +3 -4
  190. package/dist/components/workflow-traces/trace-span-construction.d.ts +7 -4
  191. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  192. package/dist/components/workflow-traces/trace-span-construction.js +87 -33
  193. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  194. package/dist/hooks/use-dark-mode.js +1 -1
  195. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  196. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  197. package/dist/hooks/use-intersection-observer.js +29 -0
  198. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  199. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  200. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  201. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  202. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  203. package/dist/hooks/use-reduced-motion.js +29 -0
  204. package/dist/index.d.ts +3 -2
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +4 -3
  207. package/dist/lib/cn.d.ts +10 -0
  208. package/dist/lib/cn.d.ts.map +1 -0
  209. package/dist/lib/cn.js +83 -0
  210. package/dist/lib/event-analysis.d.ts +1 -1
  211. package/dist/lib/event-analysis.d.ts.map +1 -1
  212. package/dist/lib/event-analysis.js +3 -2
  213. package/dist/lib/event-materialization.d.ts +1 -1
  214. package/dist/lib/event-materialization.d.ts.map +1 -1
  215. package/dist/lib/event-materialization.js +29 -21
  216. package/dist/lib/exact-event-search-id.d.ts +25 -0
  217. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  218. package/dist/lib/exact-event-search-id.js +39 -0
  219. package/dist/lib/hydration.d.ts +17 -2
  220. package/dist/lib/hydration.d.ts.map +1 -1
  221. package/dist/lib/hydration.js +185 -22
  222. package/dist/lib/stream-display.js +1 -1
  223. package/dist/lib/toast.js +1 -1
  224. package/dist/lib/trace-builder.d.ts +16 -4
  225. package/dist/lib/trace-builder.d.ts.map +1 -1
  226. package/dist/lib/trace-builder.js +34 -15
  227. package/dist/lib/utils.d.ts +23 -9
  228. package/dist/lib/utils.d.ts.map +1 -1
  229. package/dist/lib/utils.js +73 -33
  230. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  231. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  232. package/dist/lib/zstd-browser-decoder.js +41 -0
  233. package/dist/styles.css +14 -0
  234. package/package.json +10 -7
  235. package/src/components/event-list-view.tsx +375 -116
  236. package/src/components/index.ts +12 -5
  237. package/src/components/new-trace-viewer/components/copy-button.tsx +2 -2
  238. package/src/components/new-trace-viewer/components/detail-panel-width.test.ts +123 -0
  239. package/src/components/new-trace-viewer/components/detail-panel-width.ts +76 -0
  240. package/src/components/new-trace-viewer/components/detail-panel.tsx +273 -0
  241. package/src/components/new-trace-viewer/components/draggable-border.tsx +216 -0
  242. package/src/components/new-trace-viewer/components/event-list.tsx +57 -32
  243. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  244. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  245. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  246. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  247. package/src/components/new-trace-viewer/components/minimap.tsx +559 -0
  248. package/src/components/new-trace-viewer/components/pane-constants.ts +19 -0
  249. package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
  250. package/src/components/new-trace-viewer/components/split-pane.tsx +80 -135
  251. package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
  252. package/src/components/new-trace-viewer/components/timeline.tsx +603 -239
  253. package/src/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  254. package/src/components/new-trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  255. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
  256. package/src/components/new-trace-viewer/components/use-element-width.ts +29 -0
  257. package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
  258. package/src/components/new-trace-viewer/context.tsx +13 -14
  259. package/src/components/new-trace-viewer/icons.tsx +2 -2
  260. package/src/components/new-trace-viewer/search.ts +178 -0
  261. package/src/components/new-trace-viewer/trace-viewer.tsx +336 -293
  262. package/src/components/new-trace-viewer/types.ts +2 -0
  263. package/src/components/new-trace-viewer/utils.test.ts +247 -0
  264. package/src/components/new-trace-viewer/utils.ts +203 -134
  265. package/src/components/run-trace-view.tsx +10 -14
  266. package/src/components/sidebar/attribute-panel.tsx +276 -275
  267. package/src/components/sidebar/attributes-block.tsx +326 -0
  268. package/src/components/sidebar/copyable-data-block.tsx +50 -28
  269. package/src/components/sidebar/entity-detail-panel.tsx +89 -123
  270. package/src/components/sidebar/events-list.tsx +196 -178
  271. package/src/components/sidebar/sidebar-data-context.tsx +11 -11
  272. package/src/components/sidebar/span-detail-merge.ts +134 -0
  273. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  274. package/src/components/trace-viewer/components/node.tsx +3 -2
  275. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  276. package/src/components/trace-viewer/util/timing.ts +7 -11
  277. package/src/components/trace-viewer-new.tsx +21 -15
  278. package/src/components/ui/alert.tsx +1 -1
  279. package/src/components/ui/button.tsx +68 -0
  280. package/src/components/ui/card.tsx +1 -1
  281. package/src/components/ui/collapsible.tsx +219 -0
  282. package/src/components/ui/context-card.tsx +784 -0
  283. package/src/components/ui/data-inspector.styles.ts +96 -0
  284. package/src/components/ui/data-inspector.tsx +501 -204
  285. package/src/components/ui/error-card.tsx +1 -1
  286. package/src/components/ui/error-stack-block.tsx +84 -55
  287. package/src/components/ui/icon-button.tsx +53 -0
  288. package/src/components/ui/kbd.tsx +43 -0
  289. package/src/components/ui/skeleton.tsx +1 -1
  290. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  291. package/src/components/ui/tooltip.tsx +47 -0
  292. package/src/components/workflow-trace-view.tsx +31 -36
  293. package/src/components/workflow-traces/event-colors.ts +15 -11
  294. package/src/components/workflow-traces/trace-colors.ts +6 -6
  295. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  296. package/src/components/workflow-traces/trace-span-construction.ts +118 -35
  297. package/src/hooks/use-intersection-observer.ts +57 -0
  298. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  299. package/src/hooks/use-reduced-motion.ts +34 -0
  300. package/src/index.ts +9 -0
  301. package/src/lib/cn.ts +93 -0
  302. package/src/lib/event-analysis.ts +6 -4
  303. package/src/lib/event-materialization.ts +35 -21
  304. package/src/lib/exact-event-search-id.ts +67 -0
  305. package/src/lib/hydration.ts +203 -29
  306. package/src/lib/trace-builder.ts +44 -19
  307. package/src/lib/utils.test.ts +33 -0
  308. package/src/lib/utils.ts +82 -35
  309. package/src/lib/zstd-browser-decoder.ts +42 -0
  310. package/src/styles.css +14 -0
  311. package/dist/components/error-boundary.js.map +0 -1
  312. package/dist/components/event-list-view.js.map +0 -1
  313. package/dist/components/hook-actions.js.map +0 -1
  314. package/dist/components/index.js.map +0 -1
  315. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  316. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  317. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  318. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  319. package/dist/components/new-trace-viewer/context.js.map +0 -1
  320. package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
  321. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
  322. package/dist/components/new-trace-viewer/detail-panel.js +0 -11
  323. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  324. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  325. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  326. package/dist/components/new-trace-viewer/types.js.map +0 -1
  327. package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
  328. package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
  329. package/dist/components/new-trace-viewer/util/constants.js +0 -2
  330. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  331. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  332. package/dist/components/run-trace-view.js.map +0 -1
  333. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  334. package/dist/components/sidebar/conversation-view.js.map +0 -1
  335. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  336. package/dist/components/sidebar/detail-card.d.ts +0 -14
  337. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  338. package/dist/components/sidebar/detail-card.js +0 -20
  339. package/dist/components/sidebar/detail-card.js.map +0 -1
  340. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  341. package/dist/components/sidebar/events-list.js.map +0 -1
  342. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  343. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  344. package/dist/components/stream-viewer.js.map +0 -1
  345. package/dist/components/trace-viewer/components/map.js.map +0 -1
  346. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  347. package/dist/components/trace-viewer/components/node.js.map +0 -1
  348. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  349. package/dist/components/trace-viewer/components/search.js.map +0 -1
  350. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  351. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  352. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  353. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  354. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  355. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  356. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  357. package/dist/components/trace-viewer/context.js.map +0 -1
  358. package/dist/components/trace-viewer/index.js.map +0 -1
  359. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  360. package/dist/components/trace-viewer/types.js.map +0 -1
  361. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  362. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  363. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  364. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  365. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  366. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  367. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  368. package/dist/components/trace-viewer/worker.js.map +0 -1
  369. package/dist/components/trace-viewer-new.js.map +0 -1
  370. package/dist/components/ui/alert.js.map +0 -1
  371. package/dist/components/ui/card.js.map +0 -1
  372. package/dist/components/ui/data-inspector.js.map +0 -1
  373. package/dist/components/ui/decrypt-button.js.map +0 -1
  374. package/dist/components/ui/error-card.js.map +0 -1
  375. package/dist/components/ui/error-stack-block.js.map +0 -1
  376. package/dist/components/ui/inspector-theme.d.ts +0 -95
  377. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  378. package/dist/components/ui/inspector-theme.js +0 -82
  379. package/dist/components/ui/inspector-theme.js.map +0 -1
  380. package/dist/components/ui/load-more-button.js.map +0 -1
  381. package/dist/components/ui/menu-dropdown.js.map +0 -1
  382. package/dist/components/ui/skeleton.js.map +0 -1
  383. package/dist/components/ui/spinner.js.map +0 -1
  384. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  385. package/dist/components/workflow-trace-view.js.map +0 -1
  386. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  387. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  388. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  389. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  390. package/dist/hooks/use-dark-mode.js.map +0 -1
  391. package/dist/index.js.map +0 -1
  392. package/dist/lib/event-analysis.js.map +0 -1
  393. package/dist/lib/event-materialization.js.map +0 -1
  394. package/dist/lib/hydration.js.map +0 -1
  395. package/dist/lib/stream-display.js.map +0 -1
  396. package/dist/lib/toast.js.map +0 -1
  397. package/dist/lib/trace-builder.js.map +0 -1
  398. package/dist/lib/utils.js.map +0 -1
  399. package/src/components/new-trace-viewer/detail-panel.tsx +0 -57
  400. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  401. package/src/components/sidebar/detail-card.tsx +0 -65
  402. package/src/components/ui/inspector-theme.ts +0 -110
@@ -13,18 +13,24 @@ export {
13
13
  ResolveHookModal,
14
14
  useHookActions,
15
15
  } from './hook-actions';
16
+ export { TraceViewerSkeleton } from './new-trace-viewer/components/trace-viewer-skeleton';
16
17
  export { RunTraceView } from './run-trace-view';
17
18
  export { ConversationView } from './sidebar/conversation-view';
18
- export {
19
- SidebarDataProvider,
20
- type SidebarDataContextValue,
21
- } from './sidebar/sidebar-data-context';
22
19
  export type {
23
20
  SelectedSpanInfo,
24
21
  SpanSelectionInfo,
25
22
  } from './sidebar/entity-detail-panel';
23
+ export {
24
+ type SidebarDataContextValue,
25
+ SidebarDataProvider,
26
+ } from './sidebar/sidebar-data-context';
27
+ export type {
28
+ DetailResource,
29
+ FetchSpanDetail,
30
+ } from './sidebar/use-selected-span-detail';
26
31
  export { type StreamChunk, StreamViewer } from './stream-viewer';
27
32
  export type { Span, SpanEvent } from './trace-viewer/types';
33
+ export { NewTraceViewer } from './trace-viewer-new';
28
34
  export {
29
35
  DataInspector,
30
36
  type DataInspectorProps,
@@ -32,8 +38,9 @@ export {
32
38
  type DecryptClickContextValue,
33
39
  } from './ui/data-inspector';
34
40
  export { DecryptButton } from './ui/decrypt-button';
41
+ export { IconButton } from './ui/icon-button';
42
+ export { Kbd } from './ui/kbd';
35
43
  export { LoadMoreButton } from './ui/load-more-button';
36
44
  export { MenuDropdown, type MenuDropdownOption } from './ui/menu-dropdown';
37
45
  export { Spinner } from './ui/spinner';
38
46
  export { WorkflowTraceViewer } from './workflow-trace-view';
39
- export { NewTraceViewer } from './trace-viewer-new';
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { Check, Copy } from 'lucide-react';
4
4
  import { type JSX, useEffect, useRef, useState } from 'react';
5
- import { cn } from '../../../lib/utils';
5
+ import { cn } from '../../../lib/cn';
6
6
 
7
7
  interface CopyButtonProps {
8
8
  copyText: string;
@@ -31,7 +31,7 @@ export function CopyButton({
31
31
  type="button"
32
32
  aria-label={ariaLabel}
33
33
  className={cn(
34
- 'cursor-pointer text-gray-800 hover:text-gray-1000 bg-transparent border-none p-1 m-0',
34
+ 'cursor-pointer text-gray-800 hover:text-gray-1000 bg-transparent border-0 p-1 m-0',
35
35
  className
36
36
  )}
37
37
  onClick={(e) => {
@@ -0,0 +1,123 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import {
3
+ clampPanelWidth,
4
+ computeMaxPanelWidth,
5
+ MAIN_MIN_WIDTH,
6
+ PANEL_DEFAULT_WIDTH,
7
+ PANEL_HARD_MAX_WIDTH,
8
+ PANEL_MIN_WIDTH,
9
+ PANEL_WIDTH_STORAGE_KEY,
10
+ readStoredPanelWidth,
11
+ writeStoredPanelWidth,
12
+ } from './detail-panel-width';
13
+
14
+ function stubLocalStorage(overrides: Partial<Storage> = {}) {
15
+ const storage = {
16
+ getItem: vi.fn().mockReturnValue(null),
17
+ setItem: vi.fn(),
18
+ ...overrides,
19
+ };
20
+ vi.stubGlobal('window', { localStorage: storage });
21
+ return storage;
22
+ }
23
+
24
+ afterEach(() => {
25
+ vi.unstubAllGlobals();
26
+ });
27
+
28
+ describe('computeMaxPanelWidth', () => {
29
+ it('falls back to the hard max when the container is unmeasured', () => {
30
+ expect(computeMaxPanelWidth(0)).toBe(PANEL_HARD_MAX_WIDTH);
31
+ expect(computeMaxPanelWidth(-5)).toBe(PANEL_HARD_MAX_WIDTH);
32
+ });
33
+
34
+ it('reserves the main-area minimum', () => {
35
+ expect(computeMaxPanelWidth(1000)).toBe(1000 - MAIN_MIN_WIDTH);
36
+ });
37
+
38
+ it('caps at the hard max on very wide containers', () => {
39
+ expect(computeMaxPanelWidth(5000)).toBe(PANEL_HARD_MAX_WIDTH);
40
+ });
41
+
42
+ it('bottoms out at 0 when the container is smaller than the main minimum', () => {
43
+ expect(computeMaxPanelWidth(MAIN_MIN_WIDTH - 50)).toBe(0);
44
+ });
45
+ });
46
+
47
+ describe('clampPanelWidth', () => {
48
+ it('passes through widths within bounds', () => {
49
+ expect(clampPanelWidth(360, 1000)).toBe(360);
50
+ });
51
+
52
+ it('clamps to the panel minimum', () => {
53
+ expect(clampPanelWidth(100, 1000)).toBe(PANEL_MIN_WIDTH);
54
+ });
55
+
56
+ it('clamps to the container-relative maximum', () => {
57
+ expect(clampPanelWidth(900, 1000)).toBe(1000 - MAIN_MIN_WIDTH);
58
+ });
59
+
60
+ it('lets the max win below the crossover so the panel gives way, not the main area', () => {
61
+ // Container too small for both floors: panel compresses below its own min.
62
+ const available = PANEL_MIN_WIDTH + MAIN_MIN_WIDTH - 100;
63
+ expect(clampPanelWidth(360, available)).toBe(available - MAIN_MIN_WIDTH);
64
+ });
65
+ });
66
+
67
+ describe('readStoredPanelWidth', () => {
68
+ it('returns the default when window is unavailable (SSR)', () => {
69
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
70
+ });
71
+
72
+ it('returns the stored value when valid', () => {
73
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('512') });
74
+ expect(readStoredPanelWidth()).toBe(512);
75
+ });
76
+
77
+ it('returns the default for missing or unparseable values', () => {
78
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue(null) });
79
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
80
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('not-a-number') });
81
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
82
+ });
83
+
84
+ it('clamps stored values to absolute bounds only', () => {
85
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('-20') });
86
+ expect(readStoredPanelWidth()).toBe(PANEL_MIN_WIDTH);
87
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('99999') });
88
+ expect(readStoredPanelWidth()).toBe(PANEL_HARD_MAX_WIDTH);
89
+ });
90
+
91
+ it('returns the default when storage access throws', () => {
92
+ stubLocalStorage({
93
+ getItem: vi.fn().mockImplementation(() => {
94
+ throw new Error('denied');
95
+ }),
96
+ });
97
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
98
+ });
99
+ });
100
+
101
+ describe('writeStoredPanelWidth', () => {
102
+ it('is a no-op when window is unavailable (SSR)', () => {
103
+ expect(() => writeStoredPanelWidth(400)).not.toThrow();
104
+ });
105
+
106
+ it('rounds and writes the value', () => {
107
+ const storage = stubLocalStorage();
108
+ writeStoredPanelWidth(412.6);
109
+ expect(storage.setItem).toHaveBeenCalledWith(
110
+ PANEL_WIDTH_STORAGE_KEY,
111
+ '413'
112
+ );
113
+ });
114
+
115
+ it('swallows storage errors (private mode, quota)', () => {
116
+ stubLocalStorage({
117
+ setItem: vi.fn().mockImplementation(() => {
118
+ throw new Error('quota');
119
+ }),
120
+ });
121
+ expect(() => writeStoredPanelWidth(400)).not.toThrow();
122
+ });
123
+ });
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Width model for the span detail panel: the stored value is the user's
3
+ * preferred width (absolute px, persisted to localStorage on explicit
4
+ * interaction only), while the container-relative maximum is applied at
5
+ * render time — so a width preferred on a wide screen survives a narrower
6
+ * session and restores when the viewer grows again.
7
+ */
8
+
9
+ /** Floor for the detail panel — matches the previous `clamp(280px, …)` floor. */
10
+ export const PANEL_MIN_WIDTH = 280;
11
+
12
+ /**
13
+ * Absolute ceiling enforced at the storage layer so a corrupt or stale stored
14
+ * value can never wedge the layout open.
15
+ */
16
+ export const PANEL_HARD_MAX_WIDTH = 1300;
17
+
18
+ /** Default width — matches the previous fixed 360px column. */
19
+ export const PANEL_DEFAULT_WIDTH = 360;
20
+
21
+ /**
22
+ * Width the main (event list + timeline) area keeps while the panel is
23
+ * resized or the container shrinks. Below `PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`
24
+ * of container the panel gives way first, compressing below its own floor —
25
+ * the list and timeline stay usable at the panel's expense.
26
+ */
27
+ export const MAIN_MIN_WIDTH = 400;
28
+
29
+ export const PANEL_WIDTH_STORAGE_KEY = 'workflow-trace-detail-panel-width';
30
+
31
+ function clamp(value: number, min: number, max: number): number {
32
+ return Math.min(Math.max(value, min), max);
33
+ }
34
+
35
+ export function computeMaxPanelWidth(availableWidth: number): number {
36
+ if (availableWidth <= 0) return PANEL_HARD_MAX_WIDTH;
37
+ return Math.min(
38
+ Math.max(availableWidth - MAIN_MIN_WIDTH, 0),
39
+ PANEL_HARD_MAX_WIDTH
40
+ );
41
+ }
42
+
43
+ /**
44
+ * Note: when the container is too small to honor both floors
45
+ * (`availableWidth < PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`), the max wins and the
46
+ * panel compresses below `PANEL_MIN_WIDTH`.
47
+ */
48
+ export function clampPanelWidth(width: number, availableWidth: number): number {
49
+ return clamp(width, PANEL_MIN_WIDTH, computeMaxPanelWidth(availableWidth));
50
+ }
51
+
52
+ export function readStoredPanelWidth(): number {
53
+ if (typeof window === 'undefined') return PANEL_DEFAULT_WIDTH;
54
+ try {
55
+ const raw = window.localStorage.getItem(PANEL_WIDTH_STORAGE_KEY);
56
+ const value = raw ? Number(raw) : Number.NaN;
57
+ if (!Number.isFinite(value)) return PANEL_DEFAULT_WIDTH;
58
+ // Only enforce absolute bounds at the storage layer; the container-relative
59
+ // max is applied at render time (see module docs).
60
+ return clamp(value, PANEL_MIN_WIDTH, PANEL_HARD_MAX_WIDTH);
61
+ } catch {
62
+ return PANEL_DEFAULT_WIDTH;
63
+ }
64
+ }
65
+
66
+ export function writeStoredPanelWidth(width: number): void {
67
+ if (typeof window === 'undefined') return;
68
+ try {
69
+ window.localStorage.setItem(
70
+ PANEL_WIDTH_STORAGE_KEY,
71
+ String(Math.round(width))
72
+ );
73
+ } catch {
74
+ // Best-effort (private mode, quota).
75
+ }
76
+ }
@@ -0,0 +1,273 @@
1
+ 'use client';
2
+
3
+ import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
4
+ import { ChevronDown, ChevronUp, X } from 'lucide-react';
5
+ import {
6
+ type ReactNode,
7
+ type RefObject,
8
+ useCallback,
9
+ useEffect,
10
+ useMemo,
11
+ useRef,
12
+ useState,
13
+ } from 'react';
14
+ import { filterSpanRawEvents } from '../../../lib/trace-builder';
15
+ import { ErrorBoundary } from '../../error-boundary';
16
+ import {
17
+ EntityDetailPanel,
18
+ type SelectedSpanInfo,
19
+ } from '../../sidebar/entity-detail-panel';
20
+ import { useSidebarData } from '../../sidebar/sidebar-data-context';
21
+ import { IconButton } from '../../ui/icon-button';
22
+ import { Kbd } from '../../ui/kbd';
23
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/tooltip';
24
+ import { useActiveSpan } from '../context';
25
+ import {
26
+ clampPanelWidth,
27
+ computeMaxPanelWidth,
28
+ PANEL_DEFAULT_WIDTH,
29
+ PANEL_MIN_WIDTH,
30
+ readStoredPanelWidth,
31
+ writeStoredPanelWidth,
32
+ } from './detail-panel-width';
33
+ import { DraggableBorder } from './draggable-border';
34
+ import { useElementWidth } from './use-element-width';
35
+
36
+ const DETAIL_PANEL_ID = 'trace-detail-panel';
37
+
38
+ /** Bridge ActiveSpanContext + SidebarDataContext → SelectedSpanInfo. */
39
+ function useSelectedSpanInfo(): SelectedSpanInfo | null {
40
+ const { activeSpan } = useActiveSpan();
41
+ const sidebar = useSidebarData();
42
+
43
+ return useMemo(() => {
44
+ if (!activeSpan) return null;
45
+
46
+ const resource = activeSpan.attributes?.resource as string | undefined;
47
+ const rawEvents = filterSpanRawEvents(
48
+ sidebar.events,
49
+ resource,
50
+ activeSpan.spanId
51
+ );
52
+
53
+ return {
54
+ data: activeSpan.attributes?.data,
55
+ resource,
56
+ spanId: activeSpan.spanId,
57
+ rawEvents,
58
+ };
59
+ }, [activeSpan, sidebar]);
60
+ }
61
+
62
+ /**
63
+ * The span detail aside: content, prev/next/close header, J/K navigation, and
64
+ * the resizable left border with its width model (see detail-panel-width.ts).
65
+ *
66
+ * Always mounted — it renders null without a selection — so the panel width
67
+ * survives closing and reopening within a session.
68
+ */
69
+ export function TraceDetailPanel({
70
+ containerRef,
71
+ onNavigateToSpan,
72
+ onClose,
73
+ }: {
74
+ containerRef: RefObject<HTMLDivElement | null>;
75
+ onNavigateToSpan: (spanId: string) => void;
76
+ onClose: () => void;
77
+ }): ReactNode {
78
+ const { activeSpan, activeSpanId, spans } = useActiveSpan();
79
+ const sidebar = useSidebarData();
80
+ const selectedSpan = useSelectedSpanInfo();
81
+ const isOpen = Boolean(activeSpan);
82
+
83
+ const [storedWidth, setStoredWidth] = useState<number>(() =>
84
+ readStoredPanelWidth()
85
+ );
86
+ const containerWidth = useElementWidth(containerRef, isOpen);
87
+ const asideRef = useRef<HTMLDivElement | null>(null);
88
+
89
+ const handleResize = useCallback(
90
+ (next: number) => {
91
+ const clamped = clampPanelWidth(next, containerWidth);
92
+ setStoredWidth(clamped);
93
+ writeStoredPanelWidth(clamped);
94
+ },
95
+ [containerWidth]
96
+ );
97
+
98
+ const panelWidth = clampPanelWidth(storedWidth, containerWidth);
99
+ const panelMaxWidth = Math.max(
100
+ PANEL_MIN_WIDTH,
101
+ computeMaxPanelWidth(containerWidth)
102
+ );
103
+
104
+ const { prevSpanId, nextSpanId } = useMemo(() => {
105
+ if (!activeSpanId) return { prevSpanId: null, nextSpanId: null };
106
+ const i = spans.findIndex((s) => s.spanId === activeSpanId);
107
+ if (i === -1) return { prevSpanId: null, nextSpanId: null };
108
+ return {
109
+ prevSpanId: spans[i - 1]?.spanId ?? null,
110
+ nextSpanId: spans[i + 1]?.spanId ?? null,
111
+ };
112
+ }, [activeSpanId, spans]);
113
+
114
+ const handleSelectPrev = useCallback(() => {
115
+ if (prevSpanId) onNavigateToSpan(prevSpanId);
116
+ }, [prevSpanId, onNavigateToSpan]);
117
+
118
+ const handleSelectNext = useCallback(() => {
119
+ if (nextSpanId) onNavigateToSpan(nextSpanId);
120
+ }, [nextSpanId, onNavigateToSpan]);
121
+
122
+ useEffect(() => {
123
+ if (!isOpen) return;
124
+
125
+ const onKeyDown = (e: KeyboardEvent): void => {
126
+ if (
127
+ e.key !== 'j' &&
128
+ e.key !== 'k' &&
129
+ e.key !== 'ArrowDown' &&
130
+ e.key !== 'ArrowUp'
131
+ ) {
132
+ return;
133
+ }
134
+ const target = e.target as HTMLElement | null;
135
+ if (
136
+ target instanceof HTMLInputElement ||
137
+ target instanceof HTMLTextAreaElement ||
138
+ target?.isContentEditable
139
+ ) {
140
+ return;
141
+ }
142
+ const targetId =
143
+ e.key === 'k' || e.key === 'ArrowUp' ? prevSpanId : nextSpanId;
144
+ if (targetId) {
145
+ e.preventDefault();
146
+ onNavigateToSpan(targetId);
147
+ }
148
+ };
149
+
150
+ window.addEventListener('keydown', onKeyDown);
151
+ return () => window.removeEventListener('keydown', onKeyDown);
152
+ }, [isOpen, prevSpanId, nextSpanId, onNavigateToSpan]);
153
+
154
+ // Derive the selected span name for the panel header
155
+ const selectedSpanName = useMemo(() => {
156
+ if (!selectedSpan?.data) return 'Details';
157
+ const data = selectedSpan.data as Record<string, unknown>;
158
+ if (selectedSpan.resource === 'hook') {
159
+ return (data.token as string | undefined) ?? (data.hookId as string);
160
+ }
161
+
162
+ const stepName = data.stepName as string | undefined;
163
+ const workflowName = data.workflowName as string | undefined;
164
+ return (
165
+ (stepName ? parseStepName(stepName)?.shortName : undefined) ??
166
+ (workflowName ? parseWorkflowName(workflowName)?.shortName : undefined) ??
167
+ stepName ??
168
+ workflowName ??
169
+ (data.hookId as string) ??
170
+ 'Details'
171
+ );
172
+ }, [selectedSpan?.data, selectedSpan?.resource]);
173
+
174
+ if (!activeSpan) return null;
175
+
176
+ return (
177
+ <aside
178
+ ref={asideRef}
179
+ id={DETAIL_PANEL_ID}
180
+ className="relative flex flex-col h-full max-h-full shrink-0 bg-background-100 border-l border-gray-alpha-400"
181
+ style={{ width: panelWidth }}
182
+ >
183
+ <DraggableBorder
184
+ element={asideRef}
185
+ position="left"
186
+ onWidthChange={handleResize}
187
+ onReset={() => handleResize(PANEL_DEFAULT_WIDTH)}
188
+ aria-label="Resize span details panel"
189
+ aria-controls={DETAIL_PANEL_ID}
190
+ aria-valuemin={PANEL_MIN_WIDTH}
191
+ aria-valuemax={panelMaxWidth}
192
+ aria-valuenow={Math.min(
193
+ Math.max(Math.round(panelWidth), PANEL_MIN_WIDTH),
194
+ panelMaxWidth
195
+ )}
196
+ />
197
+ {/* Panel header */}
198
+ <div className="flex items-center justify-between gap-2 shrink-0 px-4 py-[7.5px]">
199
+ <span className="text-label-14 font-medium text-gray-1000 truncate block">
200
+ {selectedSpanName}
201
+ </span>
202
+ <div className="flex items-center gap-0.5 shrink-0">
203
+ <Tooltip>
204
+ <TooltipTrigger asChild>
205
+ <IconButton
206
+ aria-label="Navigate up"
207
+ aria-keyshortcuts="K"
208
+ onClick={handleSelectPrev}
209
+ disabled={!prevSpanId}
210
+ >
211
+ <ChevronUp className="w-4 h-4" />
212
+ </IconButton>
213
+ </TooltipTrigger>
214
+ {prevSpanId ? (
215
+ <TooltipContent>
216
+ Navigate up
217
+ <Kbd>K</Kbd>
218
+ </TooltipContent>
219
+ ) : null}
220
+ </Tooltip>
221
+ <Tooltip>
222
+ <TooltipTrigger asChild>
223
+ <IconButton
224
+ aria-label="Navigate down"
225
+ aria-keyshortcuts="J"
226
+ onClick={handleSelectNext}
227
+ disabled={!nextSpanId}
228
+ >
229
+ <ChevronDown className="w-4 h-4" />
230
+ </IconButton>
231
+ </TooltipTrigger>
232
+ {nextSpanId ? (
233
+ <TooltipContent>
234
+ Navigate down
235
+ <Kbd>J</Kbd>
236
+ </TooltipContent>
237
+ ) : null}
238
+ </Tooltip>
239
+ <div aria-hidden className="w-px h-4 bg-gray-alpha-400 mx-1" />
240
+ <IconButton
241
+ aria-label="Close span details"
242
+ aria-keyshortcuts="Escape"
243
+ onClick={onClose}
244
+ >
245
+ <X className="w-4 h-4" />
246
+ </IconButton>
247
+ </div>
248
+ </div>
249
+ {/* Panel body */}
250
+ <div className="flex-1 overflow-y-auto">
251
+ <ErrorBoundary>
252
+ <EntityDetailPanel
253
+ run={sidebar.run}
254
+ onStreamClick={sidebar.onStreamClick}
255
+ onRunClick={sidebar.onRunClick}
256
+ fetchSpanDetail={sidebar.fetchSpanDetail}
257
+ onWakeUpSleep={sidebar.onWakeUpSleep}
258
+ onLoadEventData={sidebar.onLoadEventData}
259
+ onResolveHook={sidebar.onResolveHook}
260
+ encryptionKey={sidebar.encryptionKey}
261
+ onDecrypt={sidebar.onDecrypt}
262
+ isDecrypting={sidebar.isDecrypting}
263
+ selectedSpan={selectedSpan}
264
+ showSeparateEventOccurrenceTimestamps={
265
+ sidebar.showSeparateEventOccurrenceTimestamps
266
+ }
267
+ getModuleSourceUrl={sidebar.getModuleSourceUrl}
268
+ />
269
+ </ErrorBoundary>
270
+ </div>
271
+ </aside>
272
+ );
273
+ }