@workflow/web-shared 5.0.0-beta.4 → 5.0.0-beta.41

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 (517) hide show
  1. package/README.md +5 -13
  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 +235 -97
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +8 -5
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +6 -4
  10. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  11. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  12. package/dist/components/sidebar/attribute-panel.js +173 -119
  13. package/dist/components/sidebar/attributes-block.d.ts +40 -0
  14. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  15. package/dist/components/sidebar/attributes-block.js +140 -0
  16. package/dist/components/sidebar/conversation-view.js +1 -1
  17. package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
  18. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  19. package/dist/components/sidebar/copyable-data-block.js +17 -16
  20. package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
  21. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  22. package/dist/components/sidebar/entity-detail-panel.js +37 -71
  23. package/dist/components/sidebar/events-list.d.ts +6 -2
  24. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  25. package/dist/components/sidebar/events-list.js +77 -63
  26. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  27. package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
  28. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  29. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  30. package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
  31. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  32. package/dist/components/sidebar/span-detail-merge.js +92 -0
  33. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  34. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  35. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  36. package/dist/components/stream-viewer-skeleton.d.ts +2 -0
  37. package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
  38. package/dist/components/stream-viewer-skeleton.js +12 -0
  39. package/dist/components/stream-viewer.d.ts +1 -1
  40. package/dist/components/stream-viewer.d.ts.map +1 -1
  41. package/dist/components/stream-viewer.js +9 -26
  42. package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/copy-button.js +27 -0
  44. package/dist/components/trace-viewer/components/detail-panel-width.d.ts +34 -0
  45. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  46. package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
  47. package/dist/components/trace-viewer/components/detail-panel.d.ts +14 -0
  48. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/detail-panel.js +122 -0
  50. package/dist/components/trace-viewer/components/draggable-border.d.ts +31 -0
  51. package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
  52. package/dist/components/trace-viewer/components/draggable-border.js +140 -0
  53. package/dist/components/trace-viewer/components/event-list.d.ts +10 -0
  54. package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
  55. package/dist/components/trace-viewer/components/event-list.js +47 -0
  56. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  57. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  58. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  59. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  60. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +1 -1
  61. package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  62. package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
  63. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  64. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  65. package/dist/components/trace-viewer/components/minimap.d.ts +14 -0
  66. package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
  67. package/dist/components/trace-viewer/components/minimap.js +337 -0
  68. package/dist/components/trace-viewer/components/pane-constants.d.ts +14 -0
  69. package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
  70. package/dist/components/trace-viewer/components/pane-constants.js +16 -0
  71. package/dist/components/trace-viewer/components/span-markers.d.ts +46 -0
  72. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
  73. package/dist/components/trace-viewer/components/span-markers.js +85 -0
  74. package/dist/components/trace-viewer/components/split-pane.d.ts +10 -0
  75. package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
  76. package/dist/components/trace-viewer/components/split-pane.js +41 -0
  77. package/dist/components/trace-viewer/components/timeline.d.ts +42 -0
  78. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
  79. package/dist/components/trace-viewer/components/timeline.js +321 -0
  80. package/dist/components/trace-viewer/components/timeline.module.css +46 -0
  81. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  82. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  83. package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
  84. package/dist/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  85. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  86. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  87. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
  88. package/dist/components/trace-viewer/components/use-element-width.d.ts +8 -0
  89. package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
  90. package/dist/components/trace-viewer/components/use-element-width.js +25 -0
  91. package/dist/components/trace-viewer/components/use-row-window.d.ts +34 -0
  92. package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
  93. package/dist/components/trace-viewer/components/use-row-window.js +107 -0
  94. package/dist/components/trace-viewer/context.d.ts +14 -182
  95. package/dist/components/trace-viewer/context.d.ts.map +1 -1
  96. package/dist/components/trace-viewer/context.js +44 -351
  97. package/dist/components/trace-viewer/icons.d.ts.map +1 -0
  98. package/dist/components/trace-viewer/icons.js +15 -0
  99. package/dist/components/trace-viewer/search.d.ts +19 -0
  100. package/dist/components/trace-viewer/search.d.ts.map +1 -0
  101. package/dist/components/trace-viewer/search.js +134 -0
  102. package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
  103. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  104. package/dist/components/trace-viewer/trace-viewer.js +306 -356
  105. package/dist/components/trace-viewer/types.d.ts +2 -211
  106. package/dist/components/trace-viewer/types.d.ts.map +1 -1
  107. package/dist/components/trace-viewer/types.js +1 -1
  108. package/dist/components/trace-viewer/util/timing.d.ts +2 -2
  109. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  110. package/dist/components/trace-viewer/util/timing.js +3 -3
  111. package/dist/components/trace-viewer/utils.d.ts +111 -0
  112. package/dist/components/trace-viewer/utils.d.ts.map +1 -0
  113. package/dist/components/trace-viewer/utils.js +430 -0
  114. package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +7 -3
  115. package/dist/components/trace-viewer.d.ts.map +1 -0
  116. package/dist/components/trace-viewer.js +21 -0
  117. package/dist/components/ui/alert.js +3 -3
  118. package/dist/components/ui/button.d.ts +10 -0
  119. package/dist/components/ui/button.d.ts.map +1 -0
  120. package/dist/components/ui/button.js +46 -0
  121. package/dist/components/ui/card.d.ts.map +1 -1
  122. package/dist/components/ui/card.js +4 -4
  123. package/dist/components/ui/collapsible.d.ts +46 -0
  124. package/dist/components/ui/collapsible.d.ts.map +1 -0
  125. package/dist/components/ui/collapsible.js +66 -0
  126. package/dist/components/ui/context-card.d.ts +47 -0
  127. package/dist/components/ui/context-card.d.ts.map +1 -0
  128. package/dist/components/ui/context-card.js +471 -0
  129. package/dist/components/ui/data-inspector.d.ts +7 -6
  130. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  131. package/dist/components/ui/data-inspector.js +232 -99
  132. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  133. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  134. package/dist/components/ui/data-inspector.styles.js +95 -0
  135. package/dist/components/ui/decrypt-button.js +1 -1
  136. package/dist/components/ui/error-card.js +3 -3
  137. package/dist/components/ui/error-stack-block.d.ts +17 -10
  138. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  139. package/dist/components/ui/error-stack-block.js +49 -30
  140. package/dist/components/ui/icon-button.d.ts +19 -0
  141. package/dist/components/ui/icon-button.d.ts.map +1 -0
  142. package/dist/components/ui/icon-button.js +29 -0
  143. package/dist/components/ui/kbd.d.ts +10 -0
  144. package/dist/components/ui/kbd.d.ts.map +1 -0
  145. package/dist/components/ui/kbd.js +25 -0
  146. package/dist/components/ui/load-more-button.js +1 -1
  147. package/dist/components/ui/menu-dropdown.js +1 -1
  148. package/dist/components/ui/skeleton.js +2 -2
  149. package/dist/components/ui/spinner.js +1 -1
  150. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  151. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  152. package/dist/components/ui/timestamp-tooltip.js +80 -132
  153. package/dist/components/ui/tooltip.d.ts +10 -0
  154. package/dist/components/ui/tooltip.d.ts.map +1 -0
  155. package/dist/components/ui/tooltip.js +12 -0
  156. package/dist/components/workflow-traces/event-colors.d.ts +2 -1
  157. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  158. package/dist/components/workflow-traces/event-colors.js +15 -7
  159. package/dist/components/workflow-traces/trace-span-construction.d.ts +6 -3
  160. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  161. package/dist/components/workflow-traces/trace-span-construction.js +71 -30
  162. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  163. package/dist/hooks/use-dark-mode.js +1 -1
  164. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  165. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  166. package/dist/hooks/use-intersection-observer.js +29 -0
  167. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  168. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  169. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  170. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  171. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  172. package/dist/hooks/use-reduced-motion.js +29 -0
  173. package/dist/index.d.ts +4 -3
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +4 -3
  176. package/dist/lib/cn.d.ts +10 -0
  177. package/dist/lib/cn.d.ts.map +1 -0
  178. package/dist/lib/cn.js +83 -0
  179. package/dist/lib/event-analysis.d.ts +1 -1
  180. package/dist/lib/event-analysis.d.ts.map +1 -1
  181. package/dist/lib/event-analysis.js +3 -2
  182. package/dist/lib/event-materialization.d.ts +1 -1
  183. package/dist/lib/event-materialization.d.ts.map +1 -1
  184. package/dist/lib/event-materialization.js +29 -21
  185. package/dist/lib/exact-event-search-id.d.ts +25 -0
  186. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  187. package/dist/lib/exact-event-search-id.js +39 -0
  188. package/dist/lib/hydration.d.ts +17 -2
  189. package/dist/lib/hydration.d.ts.map +1 -1
  190. package/dist/lib/hydration.js +194 -23
  191. package/dist/lib/stream-display.js +1 -1
  192. package/dist/lib/toast.js +1 -1
  193. package/dist/lib/trace-builder.d.ts +17 -5
  194. package/dist/lib/trace-builder.d.ts.map +1 -1
  195. package/dist/lib/trace-builder.js +32 -14
  196. package/dist/lib/trace-types.d.ts +54 -0
  197. package/dist/lib/trace-types.d.ts.map +1 -0
  198. package/dist/lib/trace-types.js +2 -0
  199. package/dist/lib/utils.d.ts +14 -2
  200. package/dist/lib/utils.d.ts.map +1 -1
  201. package/dist/lib/utils.js +46 -6
  202. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  203. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  204. package/dist/lib/zstd-browser-decoder.js +41 -0
  205. package/dist/styles.css +210 -139
  206. package/package.json +11 -8
  207. package/src/components/event-list-view.tsx +385 -123
  208. package/src/components/index.ts +14 -8
  209. package/src/components/sidebar/attribute-panel.tsx +331 -282
  210. package/src/components/sidebar/attributes-block.tsx +326 -0
  211. package/src/components/sidebar/copyable-data-block.tsx +50 -28
  212. package/src/components/sidebar/entity-detail-panel.tsx +92 -126
  213. package/src/components/sidebar/events-list.tsx +197 -179
  214. package/src/components/sidebar/sidebar-data-context.tsx +11 -11
  215. package/src/components/sidebar/span-detail-merge.ts +134 -0
  216. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  217. package/src/components/stream-viewer-skeleton.tsx +34 -0
  218. package/src/components/stream-viewer.tsx +34 -106
  219. package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +2 -2
  220. package/src/components/trace-viewer/components/detail-panel-width.test.ts +123 -0
  221. package/src/components/trace-viewer/components/detail-panel-width.ts +76 -0
  222. package/src/components/trace-viewer/components/detail-panel.tsx +273 -0
  223. package/src/components/trace-viewer/components/draggable-border.tsx +216 -0
  224. package/src/components/trace-viewer/components/event-list.tsx +144 -0
  225. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +8 -8
  226. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +1 -1
  227. package/src/components/trace-viewer/components/minimap.tsx +556 -0
  228. package/src/components/trace-viewer/components/pane-constants.ts +19 -0
  229. package/src/components/trace-viewer/components/span-markers.tsx +173 -0
  230. package/src/components/trace-viewer/components/split-pane.tsx +141 -0
  231. package/src/components/trace-viewer/components/timeline.module.css +46 -0
  232. package/src/components/trace-viewer/components/timeline.tsx +850 -0
  233. package/src/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  234. package/src/components/trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  235. package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
  236. package/src/components/trace-viewer/components/use-element-width.ts +29 -0
  237. package/src/components/trace-viewer/components/use-row-window.ts +140 -0
  238. package/src/components/trace-viewer/context.tsx +63 -656
  239. package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +2 -2
  240. package/src/components/trace-viewer/search.ts +178 -0
  241. package/src/components/trace-viewer/trace-viewer.tsx +563 -531
  242. package/src/components/trace-viewer/types.ts +2 -234
  243. package/src/components/trace-viewer/util/timing.ts +2 -2
  244. package/src/components/trace-viewer/utils.test.ts +458 -0
  245. package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +271 -50
  246. package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +24 -18
  247. package/src/components/ui/alert.tsx +2 -2
  248. package/src/components/ui/button.tsx +68 -0
  249. package/src/components/ui/card.tsx +3 -10
  250. package/src/components/ui/collapsible.tsx +219 -0
  251. package/src/components/ui/context-card.tsx +784 -0
  252. package/src/components/ui/data-inspector.styles.ts +96 -0
  253. package/src/components/ui/data-inspector.tsx +501 -204
  254. package/src/components/ui/error-card.tsx +4 -4
  255. package/src/components/ui/error-stack-block.tsx +84 -55
  256. package/src/components/ui/icon-button.tsx +53 -0
  257. package/src/components/ui/kbd.tsx +43 -0
  258. package/src/components/ui/skeleton.tsx +1 -1
  259. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  260. package/src/components/ui/tooltip.tsx +47 -0
  261. package/src/components/workflow-traces/event-colors.ts +15 -11
  262. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  263. package/src/components/workflow-traces/trace-span-construction.ts +97 -32
  264. package/src/hooks/use-intersection-observer.ts +57 -0
  265. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  266. package/src/hooks/use-reduced-motion.ts +34 -0
  267. package/src/index.ts +10 -4
  268. package/src/lib/cn.ts +93 -0
  269. package/src/lib/event-analysis.ts +6 -4
  270. package/src/lib/event-materialization.ts +35 -21
  271. package/src/lib/exact-event-search-id.ts +67 -0
  272. package/src/lib/hydration.ts +210 -30
  273. package/src/lib/trace-builder.ts +43 -19
  274. package/src/lib/trace-types.ts +56 -0
  275. package/src/lib/utils.test.ts +33 -0
  276. package/src/lib/utils.ts +53 -6
  277. package/src/lib/zstd-browser-decoder.ts +42 -0
  278. package/src/styles.css +210 -139
  279. package/dist/components/error-boundary.js.map +0 -1
  280. package/dist/components/event-list-view.js.map +0 -1
  281. package/dist/components/hook-actions.js.map +0 -1
  282. package/dist/components/index.js.map +0 -1
  283. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
  284. package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
  285. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  286. package/dist/components/new-trace-viewer/components/event-list.d.ts +0 -8
  287. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
  288. package/dist/components/new-trace-viewer/components/event-list.js +0 -38
  289. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  290. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
  291. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
  292. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
  293. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
  294. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
  295. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
  296. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
  297. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
  298. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
  299. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
  300. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
  301. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
  302. package/dist/components/new-trace-viewer/components/split-pane.d.ts +0 -14
  303. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
  304. package/dist/components/new-trace-viewer/components/split-pane.js +0 -99
  305. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  306. package/dist/components/new-trace-viewer/components/timeline.d.ts +0 -31
  307. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
  308. package/dist/components/new-trace-viewer/components/timeline.js +0 -138
  309. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  310. package/dist/components/new-trace-viewer/context.d.ts +0 -15
  311. package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
  312. package/dist/components/new-trace-viewer/context.js +0 -47
  313. package/dist/components/new-trace-viewer/context.js.map +0 -1
  314. package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
  315. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
  316. package/dist/components/new-trace-viewer/detail-panel.js +0 -12
  317. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  318. package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
  319. package/dist/components/new-trace-viewer/icons.js +0 -15
  320. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  321. package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -8
  322. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
  323. package/dist/components/new-trace-viewer/trace-viewer.js +0 -349
  324. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  325. package/dist/components/new-trace-viewer/types.d.ts +0 -1
  326. package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
  327. package/dist/components/new-trace-viewer/types.js +0 -2
  328. package/dist/components/new-trace-viewer/types.js.map +0 -1
  329. package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
  330. package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
  331. package/dist/components/new-trace-viewer/util/constants.js +0 -2
  332. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  333. package/dist/components/new-trace-viewer/utils.d.ts +0 -42
  334. package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
  335. package/dist/components/new-trace-viewer/utils.js +0 -305
  336. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  337. package/dist/components/run-trace-view.d.ts +0 -25
  338. package/dist/components/run-trace-view.d.ts.map +0 -1
  339. package/dist/components/run-trace-view.js +0 -11
  340. package/dist/components/run-trace-view.js.map +0 -1
  341. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  342. package/dist/components/sidebar/conversation-view.js.map +0 -1
  343. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  344. package/dist/components/sidebar/detail-card.d.ts +0 -14
  345. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  346. package/dist/components/sidebar/detail-card.js +0 -20
  347. package/dist/components/sidebar/detail-card.js.map +0 -1
  348. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  349. package/dist/components/sidebar/events-list.js.map +0 -1
  350. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  351. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  352. package/dist/components/stream-viewer.js.map +0 -1
  353. package/dist/components/trace-viewer/components/map.d.ts +0 -8
  354. package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
  355. package/dist/components/trace-viewer/components/map.js +0 -162
  356. package/dist/components/trace-viewer/components/map.js.map +0 -1
  357. package/dist/components/trace-viewer/components/markers.d.ts +0 -23
  358. package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
  359. package/dist/components/trace-viewer/components/markers.js +0 -416
  360. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  361. package/dist/components/trace-viewer/components/node.d.ts +0 -35
  362. package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
  363. package/dist/components/trace-viewer/components/node.js +0 -285
  364. package/dist/components/trace-viewer/components/node.js.map +0 -1
  365. package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
  366. package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
  367. package/dist/components/trace-viewer/components/search-input.js +0 -9
  368. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  369. package/dist/components/trace-viewer/components/search.d.ts +0 -3
  370. package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
  371. package/dist/components/trace-viewer/components/search.js +0 -25
  372. package/dist/components/trace-viewer/components/search.js.map +0 -1
  373. package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
  374. package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
  375. package/dist/components/trace-viewer/components/span-content.js +0 -137
  376. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  377. package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
  378. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  379. package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
  380. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  381. package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
  382. package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
  383. package/dist/components/trace-viewer/components/span-segments.js +0 -445
  384. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  385. package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
  386. package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
  387. package/dist/components/trace-viewer/components/span-strategies.js +0 -108
  388. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  389. package/dist/components/trace-viewer/components/ui.d.ts +0 -28
  390. package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
  391. package/dist/components/trace-viewer/components/ui.js +0 -39
  392. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  393. package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
  394. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
  395. package/dist/components/trace-viewer/components/zoom-button.js +0 -29
  396. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  397. package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
  398. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  399. package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
  400. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  401. package/dist/components/trace-viewer/context.js.map +0 -1
  402. package/dist/components/trace-viewer/index.d.ts +0 -5
  403. package/dist/components/trace-viewer/index.d.ts.map +0 -1
  404. package/dist/components/trace-viewer/index.js +0 -4
  405. package/dist/components/trace-viewer/index.js.map +0 -1
  406. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  407. package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
  408. package/dist/components/trace-viewer/types.js.map +0 -1
  409. package/dist/components/trace-viewer/util/constants.d.ts +0 -9
  410. package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
  411. package/dist/components/trace-viewer/util/constants.js +0 -9
  412. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  413. package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
  414. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  415. package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
  416. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  417. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  418. package/dist/components/trace-viewer/util/tree.d.ts +0 -13
  419. package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
  420. package/dist/components/trace-viewer/util/tree.js +0 -227
  421. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  422. package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
  423. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  424. package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
  425. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  426. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
  427. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  428. package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
  429. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  430. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
  431. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  432. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
  433. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  434. package/dist/components/trace-viewer/worker.d.ts +0 -2
  435. package/dist/components/trace-viewer/worker.d.ts.map +0 -1
  436. package/dist/components/trace-viewer/worker.js +0 -109
  437. package/dist/components/trace-viewer/worker.js.map +0 -1
  438. package/dist/components/trace-viewer-new.d.ts.map +0 -1
  439. package/dist/components/trace-viewer-new.js +0 -23
  440. package/dist/components/trace-viewer-new.js.map +0 -1
  441. package/dist/components/ui/alert.js.map +0 -1
  442. package/dist/components/ui/card.js.map +0 -1
  443. package/dist/components/ui/data-inspector.js.map +0 -1
  444. package/dist/components/ui/decrypt-button.js.map +0 -1
  445. package/dist/components/ui/error-card.js.map +0 -1
  446. package/dist/components/ui/error-stack-block.js.map +0 -1
  447. package/dist/components/ui/inspector-theme.d.ts +0 -95
  448. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  449. package/dist/components/ui/inspector-theme.js +0 -82
  450. package/dist/components/ui/inspector-theme.js.map +0 -1
  451. package/dist/components/ui/load-more-button.js.map +0 -1
  452. package/dist/components/ui/menu-dropdown.js.map +0 -1
  453. package/dist/components/ui/skeleton.js.map +0 -1
  454. package/dist/components/ui/spinner.js.map +0 -1
  455. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  456. package/dist/components/workflow-trace-view.d.ts +0 -40
  457. package/dist/components/workflow-trace-view.d.ts.map +0 -1
  458. package/dist/components/workflow-trace-view.js +0 -695
  459. package/dist/components/workflow-trace-view.js.map +0 -1
  460. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  461. package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
  462. package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
  463. package/dist/components/workflow-traces/trace-colors.js +0 -87
  464. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  465. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  466. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  467. package/dist/hooks/use-dark-mode.js.map +0 -1
  468. package/dist/index.js.map +0 -1
  469. package/dist/lib/event-analysis.js.map +0 -1
  470. package/dist/lib/event-materialization.js.map +0 -1
  471. package/dist/lib/hydration.js.map +0 -1
  472. package/dist/lib/stream-display.js.map +0 -1
  473. package/dist/lib/toast.js.map +0 -1
  474. package/dist/lib/trace-builder.js.map +0 -1
  475. package/dist/lib/utils.js.map +0 -1
  476. package/src/components/new-trace-viewer/components/event-list.tsx +0 -116
  477. package/src/components/new-trace-viewer/components/split-pane.tsx +0 -185
  478. package/src/components/new-trace-viewer/components/timeline.tsx +0 -382
  479. package/src/components/new-trace-viewer/context.tsx +0 -92
  480. package/src/components/new-trace-viewer/detail-panel.tsx +0 -58
  481. package/src/components/new-trace-viewer/trace-viewer.tsx +0 -645
  482. package/src/components/new-trace-viewer/types.ts +0 -0
  483. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  484. package/src/components/run-trace-view.tsx +0 -84
  485. package/src/components/sidebar/detail-card.tsx +0 -65
  486. package/src/components/trace-viewer/components/map.tsx +0 -226
  487. package/src/components/trace-viewer/components/markers.tsx +0 -612
  488. package/src/components/trace-viewer/components/node.tsx +0 -505
  489. package/src/components/trace-viewer/components/search-input.tsx +0 -52
  490. package/src/components/trace-viewer/components/search.tsx +0 -47
  491. package/src/components/trace-viewer/components/span-content.tsx +0 -247
  492. package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
  493. package/src/components/trace-viewer/components/span-segments.ts +0 -585
  494. package/src/components/trace-viewer/components/span-strategies.ts +0 -205
  495. package/src/components/trace-viewer/components/ui.tsx +0 -156
  496. package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
  497. package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
  498. package/src/components/trace-viewer/index.tsx +0 -4
  499. package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
  500. package/src/components/trace-viewer/util/constants.ts +0 -8
  501. package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
  502. package/src/components/trace-viewer/util/tree.ts +0 -277
  503. package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
  504. package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
  505. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
  506. package/src/components/trace-viewer/worker.ts +0 -131
  507. package/src/components/ui/inspector-theme.ts +0 -110
  508. package/src/components/workflow-trace-view.tsx +0 -1171
  509. package/src/components/workflow-traces/trace-colors.ts +0 -112
  510. /package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
  511. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
  512. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
  513. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
  514. /package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
  515. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
  516. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
  517. /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
@@ -0,0 +1,556 @@
1
+ 'use client';
2
+
3
+ import type { ReactNode } from 'react';
4
+ import {
5
+ memo,
6
+ useCallback,
7
+ useEffect,
8
+ useLayoutEffect,
9
+ useRef,
10
+ useState,
11
+ } from 'react';
12
+ import { cn } from '../../../lib/cn';
13
+ import type { Span } from '../types';
14
+ import { formatDurationPrecise, getHighResInMs } from '../util/timing';
15
+ import {
16
+ clampViewportToRoot,
17
+ isSpanErrored,
18
+ type RootBounds,
19
+ type ViewportRange,
20
+ wheelDeltaToPixels,
21
+ wheelZoomScaleFactor,
22
+ } from '../utils';
23
+ import { TIMELINE_PADDING_PX } from './timeline';
24
+
25
+ // ---------------------------------------------------------------------------
26
+ // Constants
27
+ // ---------------------------------------------------------------------------
28
+
29
+ const CANVAS_PAD_Y_PX = 6;
30
+ const MIN_LINE_HEIGHT_PX = 1.5;
31
+ const MAX_LINE_HEIGHT_PX = 3;
32
+ const MIN_LINE_WIDTH_PX = 2;
33
+ /** Pointer travel below this is treated as a click rather than a drag. */
34
+ const CLICK_DRAG_THRESHOLD_PX = 3;
35
+ const MIN_BRUSH_WIDTH_PX = 6;
36
+ /** Fraction of the current window that arrow keys pan by. */
37
+ const KEYBOARD_PAN_FRACTION = 0.1;
38
+
39
+ /**
40
+ * Line colors resolved from the design-system tokens on the container, so the
41
+ * canvas follows the active theme. Runs and steps carry the accent hues;
42
+ * passive spans (hooks, sleeps) stay gray like their event-list icons.
43
+ */
44
+ const RESOURCE_LINE_TOKENS: Record<string, string> = {
45
+ run: '--ds-blue-400',
46
+ step: '--ds-green-400',
47
+ hook: '--ds-gray-400',
48
+ sleep: '--ds-gray-400',
49
+ };
50
+ const DEFAULT_LINE_TOKEN = '--ds-gray-400';
51
+ const ERROR_LINE_TOKEN = '--ds-red-400';
52
+
53
+ // ---------------------------------------------------------------------------
54
+ // Density layer geometry
55
+ // ---------------------------------------------------------------------------
56
+
57
+ interface DensityLayout {
58
+ lineHeight: number;
59
+ /** [x, y, width] rects grouped by color token, one fill pass per color. */
60
+ rectsByToken: Map<string, [number, number, number][]>;
61
+ }
62
+
63
+ function computeDensityLayout(
64
+ spans: Span[],
65
+ rootStartMs: number,
66
+ rootDurationMs: number,
67
+ contentWidth: number,
68
+ contentHeight: number
69
+ ): DensityLayout {
70
+ const count = spans.length;
71
+ const lineHeight = Math.max(
72
+ MIN_LINE_HEIGHT_PX,
73
+ Math.min(MAX_LINE_HEIGHT_PX, contentHeight / count)
74
+ );
75
+ // Distribute rows across the strip; never spread a handful of spans further
76
+ // apart than one line + 1px gap.
77
+ const rowStep =
78
+ count > 1
79
+ ? Math.min((contentHeight - lineHeight) / (count - 1), lineHeight + 1)
80
+ : 0;
81
+
82
+ const rectsByToken = new Map<string, [number, number, number][]>();
83
+ spans.forEach((span, index) => {
84
+ const token = isSpanErrored(span)
85
+ ? ERROR_LINE_TOKEN
86
+ : (RESOURCE_LINE_TOKENS[span.resource] ?? DEFAULT_LINE_TOKEN);
87
+ const startMs = getHighResInMs(span.startTime);
88
+ const endMs = getHighResInMs(span.endTime);
89
+ const x =
90
+ TIMELINE_PADDING_PX +
91
+ ((startMs - rootStartMs) / rootDurationMs) * contentWidth;
92
+ const w = Math.max(
93
+ MIN_LINE_WIDTH_PX,
94
+ ((endMs - startMs) / rootDurationMs) * contentWidth
95
+ );
96
+ const y = CANVAS_PAD_Y_PX + index * rowStep;
97
+ const rects = rectsByToken.get(token) ?? [];
98
+ rects.push([x, y, w]);
99
+ rectsByToken.set(token, rects);
100
+ });
101
+
102
+ return { lineHeight, rectsByToken };
103
+ }
104
+
105
+ // ---------------------------------------------------------------------------
106
+ // Hooks
107
+ // ---------------------------------------------------------------------------
108
+
109
+ /** Track the display's device pixel ratio (changes when moving monitors). */
110
+ function useDpr(): number {
111
+ const [dpr, setDpr] = useState(1);
112
+ useLayoutEffect(() => {
113
+ const onChange = (): void => setDpr(window.devicePixelRatio || 1);
114
+ const media = matchMedia(`(resolution: ${dpr}dppx)`);
115
+ media.addEventListener('change', onChange);
116
+ onChange();
117
+ return () => media.removeEventListener('change', onChange);
118
+ }, [dpr]);
119
+ return dpr;
120
+ }
121
+
122
+ /** Bump a counter when the theme (html class/data-theme) changes. */
123
+ function useThemeVersion(): number {
124
+ const [version, setVersion] = useState(0);
125
+ useEffect(() => {
126
+ const observer = new MutationObserver(() => setVersion((v) => v + 1));
127
+ observer.observe(document.documentElement, {
128
+ attributes: true,
129
+ attributeFilter: ['class', 'data-theme', 'style'],
130
+ });
131
+ return () => observer.disconnect();
132
+ }, []);
133
+ return version;
134
+ }
135
+
136
+ // ---------------------------------------------------------------------------
137
+ // Minimap
138
+ // ---------------------------------------------------------------------------
139
+
140
+ type DragState =
141
+ | { mode: 'pan'; grabOffsetMs: number }
142
+ | { mode: 'resize-left' }
143
+ | { mode: 'resize-right' }
144
+ | { mode: 'select'; originX: number; originMs: number };
145
+
146
+ export const Minimap = memo(function Minimap({
147
+ spans,
148
+ root,
149
+ viewport,
150
+ minViewportMs,
151
+ onViewportChange,
152
+ onAnimateTo,
153
+ }: {
154
+ spans: Span[];
155
+ root: RootBounds;
156
+ viewport: ViewportRange;
157
+ minViewportMs: number;
158
+ /** Immediate viewport update (used while dragging). */
159
+ onViewportChange: (viewport: ViewportRange) => void;
160
+ /** Eased viewport transition (used for click-to-jump and selections). */
161
+ onAnimateTo: (viewport: ViewportRange) => void;
162
+ }): ReactNode {
163
+ const {
164
+ startTime: rootStartMs,
165
+ endTime: rootEndMs,
166
+ duration: rootDurationMs,
167
+ } = root;
168
+
169
+ const containerRef = useRef<HTMLDivElement>(null);
170
+ const canvasRef = useRef<HTMLCanvasElement>(null);
171
+ const dpr = useDpr();
172
+ const themeVersion = useThemeVersion();
173
+
174
+ // Latest viewport for pointer handlers, without re-binding them per frame.
175
+ const viewportRef = useRef<ViewportRange>(viewport);
176
+ viewportRef.current = viewport;
177
+
178
+ const [drag, setDrag] = useState<DragState | null>(null);
179
+ const [selection, setSelection] = useState<{ x0: number; x1: number } | null>(
180
+ null
181
+ );
182
+
183
+ const xToTime = useCallback(
184
+ (x: number, contentWidth: number): number => {
185
+ if (contentWidth <= 0) return rootStartMs;
186
+ const fraction = (x - TIMELINE_PADDING_PX) / contentWidth;
187
+ return Math.min(
188
+ Math.max(rootStartMs + fraction * rootDurationMs, rootStartMs),
189
+ rootEndMs
190
+ );
191
+ },
192
+ [rootStartMs, rootDurationMs, rootEndMs]
193
+ );
194
+
195
+ const clamp = useCallback(
196
+ (next: ViewportRange): ViewportRange =>
197
+ clampViewportToRoot(next, rootStartMs, rootEndMs, minViewportMs),
198
+ [rootStartMs, rootEndMs, minViewportMs]
199
+ );
200
+
201
+ // Density canvas: one thin line per span across the full run. Sizing is
202
+ // read live and redraws run straight from the ResizeObserver (which fires
203
+ // before paint), so layout changes — e.g. the detail panel opening — never
204
+ // paint a frame with a stale, stretched bitmap.
205
+ // biome-ignore lint/correctness/useExhaustiveDependencies: themeVersion is a redraw trigger — the canvas re-resolves its token colors when the theme flips
206
+ useLayoutEffect(() => {
207
+ const canvas = canvasRef.current;
208
+ const container = containerRef.current;
209
+ const ctx = canvas?.getContext('2d');
210
+ if (!canvas || !container || !ctx) return;
211
+
212
+ const draw = (): void => {
213
+ const width = canvas.clientWidth;
214
+ const height = canvas.clientHeight;
215
+ const contentWidth = width - TIMELINE_PADDING_PX * 2;
216
+ if (width <= 0 || height <= 0 || contentWidth <= 0) return;
217
+
218
+ canvas.width = Math.round(width * dpr);
219
+ canvas.height = Math.round(height * dpr);
220
+ ctx.scale(dpr, dpr);
221
+ ctx.clearRect(0, 0, width, height);
222
+ if (spans.length === 0 || rootDurationMs <= 0) return;
223
+
224
+ const { lineHeight, rectsByToken } = computeDensityLayout(
225
+ spans,
226
+ rootStartMs,
227
+ rootDurationMs,
228
+ contentWidth,
229
+ height - CANVAS_PAD_Y_PX * 2
230
+ );
231
+
232
+ const style = getComputedStyle(container);
233
+ const drawToken = (token: string): void => {
234
+ const rects = rectsByToken.get(token);
235
+ if (!rects) return;
236
+ ctx.fillStyle =
237
+ style.getPropertyValue(token).trim() || 'rgb(160,160,160)';
238
+ ctx.beginPath();
239
+ for (const [x, y, w] of rects) {
240
+ ctx.roundRect(x, y, w, lineHeight, lineHeight / 2);
241
+ }
242
+ ctx.fill();
243
+ };
244
+ // Errored spans are drawn last so red never disappears under neighbors.
245
+ for (const token of rectsByToken.keys()) {
246
+ if (token !== ERROR_LINE_TOKEN) drawToken(token);
247
+ }
248
+ drawToken(ERROR_LINE_TOKEN);
249
+ };
250
+
251
+ draw();
252
+ const observer = new ResizeObserver(draw);
253
+ observer.observe(container);
254
+ return () => observer.disconnect();
255
+ }, [spans, rootStartMs, rootDurationMs, dpr, themeVersion]);
256
+
257
+ // Content width is read from the live rect at event time, so pointer math
258
+ // stays exact while the strip is being resized mid-gesture.
259
+ const pointerFrame = useCallback(
260
+ (e: React.PointerEvent<HTMLDivElement>): { x: number; cw: number } => {
261
+ const rect = e.currentTarget.getBoundingClientRect();
262
+ return {
263
+ x: e.clientX - rect.left,
264
+ cw: rect.width - TIMELINE_PADDING_PX * 2,
265
+ };
266
+ },
267
+ []
268
+ );
269
+
270
+ const resolveDragState = useCallback(
271
+ (target: HTMLElement, x: number, cw: number): DragState => {
272
+ if (target.closest('[data-minimap-handle="left"]')) {
273
+ return { mode: 'resize-left' };
274
+ }
275
+ if (target.closest('[data-minimap-handle="right"]')) {
276
+ return { mode: 'resize-right' };
277
+ }
278
+ // Panning a full-extent window is a no-op, so let a drag on the brush
279
+ // start a selection instead — the natural first gesture on the map.
280
+ const { start, end } = viewportRef.current;
281
+ const isFullExtent =
282
+ start - rootStartMs < rootDurationMs * 0.001 &&
283
+ rootEndMs - end < rootDurationMs * 0.001;
284
+ if (target.closest('[data-minimap-brush]') && !isFullExtent) {
285
+ return { mode: 'pan', grabOffsetMs: xToTime(x, cw) - start };
286
+ }
287
+ return { mode: 'select', originX: x, originMs: xToTime(x, cw) };
288
+ },
289
+ [xToTime, rootStartMs, rootDurationMs, rootEndMs]
290
+ );
291
+
292
+ const handlePointerDown = useCallback(
293
+ (e: React.PointerEvent<HTMLDivElement>) => {
294
+ if (e.button !== 0) return;
295
+ const { x, cw } = pointerFrame(e);
296
+ if (cw <= 0) return;
297
+ e.currentTarget.setPointerCapture(e.pointerId);
298
+ setDrag(resolveDragState(e.target as HTMLElement, x, cw));
299
+ },
300
+ [pointerFrame, resolveDragState]
301
+ );
302
+
303
+ const handlePointerMove = useCallback(
304
+ (e: React.PointerEvent<HTMLDivElement>) => {
305
+ if (!drag) return;
306
+ const { x, cw } = pointerFrame(e);
307
+ const t = xToTime(x, cw);
308
+ const { start, end } = viewportRef.current;
309
+
310
+ if (drag.mode === 'pan') {
311
+ const duration = end - start;
312
+ onViewportChange(
313
+ clamp({
314
+ start: t - drag.grabOffsetMs,
315
+ end: t - drag.grabOffsetMs + duration,
316
+ })
317
+ );
318
+ } else if (drag.mode === 'resize-left') {
319
+ onViewportChange({ start: Math.min(t, end - minViewportMs), end });
320
+ } else if (drag.mode === 'resize-right') {
321
+ onViewportChange({ start, end: Math.max(t, start + minViewportMs) });
322
+ } else if (
323
+ selection ||
324
+ Math.abs(x - drag.originX) > CLICK_DRAG_THRESHOLD_PX
325
+ ) {
326
+ setSelection({
327
+ x0: Math.min(drag.originX, x),
328
+ x1: Math.max(drag.originX, x),
329
+ });
330
+ }
331
+ },
332
+ [
333
+ drag,
334
+ selection,
335
+ pointerFrame,
336
+ xToTime,
337
+ onViewportChange,
338
+ clamp,
339
+ minViewportMs,
340
+ ]
341
+ );
342
+
343
+ const endDrag = useCallback(
344
+ (e: React.PointerEvent<HTMLDivElement>) => {
345
+ if (!drag) return;
346
+ if (drag.mode === 'select') {
347
+ const { x, cw } = pointerFrame(e);
348
+ const t = xToTime(x, cw);
349
+ if (selection) {
350
+ onAnimateTo(
351
+ clamp({
352
+ start: Math.min(drag.originMs, t),
353
+ end: Math.max(drag.originMs, t),
354
+ })
355
+ );
356
+ } else {
357
+ // Plain click: keep the current zoom, center the window there.
358
+ const { start, end } = viewportRef.current;
359
+ const duration = end - start;
360
+ onAnimateTo(
361
+ clamp({ start: t - duration / 2, end: t + duration / 2 })
362
+ );
363
+ }
364
+ }
365
+ setSelection(null);
366
+ setDrag(null);
367
+ },
368
+ [drag, selection, pointerFrame, xToTime, onAnimateTo, clamp]
369
+ );
370
+
371
+ const handleLostPointerCapture = useCallback(() => {
372
+ setSelection(null);
373
+ setDrag(null);
374
+ }, []);
375
+
376
+ const handleDoubleClick = useCallback(() => {
377
+ onAnimateTo({ start: rootStartMs, end: rootEndMs });
378
+ }, [onAnimateTo, rootStartMs, rootEndMs]);
379
+
380
+ // Wheel: same gestures as the timeline, mapped through the full extent.
381
+ useEffect(() => {
382
+ const el = containerRef.current;
383
+ if (!el || rootDurationMs <= 0) return;
384
+
385
+ // The minimap's x axis is the full run, so zoom around the absolute time
386
+ // under the cursor rather than a viewport fraction.
387
+ const zoomAtCursor = (e: WheelEvent, cw: number, left: number): void => {
388
+ const scaleFactor = wheelZoomScaleFactor(e);
389
+ const { start, end } = viewportRef.current;
390
+ const duration = end - start;
391
+ const cursorFraction = Math.min(
392
+ Math.max((e.clientX - left - TIMELINE_PADDING_PX) / cw, 0),
393
+ 1
394
+ );
395
+ const cursorMs = rootStartMs + cursorFraction * rootDurationMs;
396
+ const anchor = Math.min(
397
+ Math.max(duration > 0 ? (cursorMs - start) / duration : 0.5, 0),
398
+ 1
399
+ );
400
+ const newDuration = duration * scaleFactor;
401
+ onViewportChange(
402
+ clamp({
403
+ start: cursorMs - anchor * newDuration,
404
+ end: cursorMs + (1 - anchor) * newDuration,
405
+ })
406
+ );
407
+ };
408
+
409
+ // Pan in map coordinates: one map pixel is one full-extent fraction.
410
+ const panByMapPixels = (e: WheelEvent, cw: number): void => {
411
+ const dx = wheelDeltaToPixels(e.deltaX, e.deltaMode);
412
+ const panMs = (dx / cw) * rootDurationMs;
413
+ const { start, end } = viewportRef.current;
414
+ onViewportChange(clamp({ start: start + panMs, end: end + panMs }));
415
+ };
416
+
417
+ const onWheel = (e: WheelEvent): void => {
418
+ const isZoomGesture = e.ctrlKey || e.metaKey;
419
+ const hasDeltaX = Math.abs(e.deltaX) > Math.abs(e.deltaY);
420
+ if (!isZoomGesture && !hasDeltaX) return;
421
+ e.preventDefault();
422
+
423
+ const rect = el.getBoundingClientRect();
424
+ const cw = rect.width - TIMELINE_PADDING_PX * 2;
425
+ if (cw <= 0) return;
426
+ if (isZoomGesture) zoomAtCursor(e, cw, rect.left);
427
+ else panByMapPixels(e, cw);
428
+ };
429
+
430
+ el.addEventListener('wheel', onWheel, { passive: false });
431
+ return () => el.removeEventListener('wheel', onWheel);
432
+ }, [rootStartMs, rootDurationMs, onViewportChange, clamp]);
433
+
434
+ // Arrow keys pan the focused brush; Home/End jump to the ends.
435
+ const handleKeyDown = useCallback(
436
+ (e: React.KeyboardEvent<HTMLDivElement>) => {
437
+ const { start, end } = viewportRef.current;
438
+ const duration = end - start;
439
+ const pan = duration * KEYBOARD_PAN_FRACTION;
440
+ if (e.key === 'ArrowLeft') {
441
+ onViewportChange(clamp({ start: start - pan, end: end - pan }));
442
+ } else if (e.key === 'ArrowRight') {
443
+ onViewportChange(clamp({ start: start + pan, end: end + pan }));
444
+ } else if (e.key === 'Home') {
445
+ onViewportChange(
446
+ clamp({ start: rootStartMs, end: rootStartMs + duration })
447
+ );
448
+ } else if (e.key === 'End') {
449
+ onViewportChange(
450
+ clamp({ start: rootEndMs - duration, end: rootEndMs })
451
+ );
452
+ } else {
453
+ return;
454
+ }
455
+ e.preventDefault();
456
+ },
457
+ [onViewportChange, clamp, rootStartMs, rootEndMs]
458
+ );
459
+
460
+ // Brush geometry in CSS calc() from time fractions, so the thumb reflows in
461
+ // the same frame as any container resize instead of lagging a state update.
462
+ const startFraction = (viewport.start - rootStartMs) / rootDurationMs;
463
+ const endFraction = (viewport.end - rootStartMs) / rootDurationMs;
464
+ const trackWidth = `(100% - ${TIMELINE_PADDING_PX * 2}px)`;
465
+ const brushStyle = {
466
+ left: `calc(${TIMELINE_PADDING_PX}px + ${startFraction} * ${trackWidth})`,
467
+ width: `max(${MIN_BRUSH_WIDTH_PX}px, calc(${
468
+ endFraction - startFraction
469
+ } * ${trackWidth}))`,
470
+ };
471
+
472
+ const viewDuration = viewport.end - viewport.start;
473
+ const scrollableMs = Math.max(rootDurationMs - viewDuration, 0);
474
+ const scrollPercent =
475
+ scrollableMs > 0
476
+ ? Math.round(((viewport.start - rootStartMs) / scrollableMs) * 100)
477
+ : 0;
478
+
479
+ return (
480
+ // biome-ignore lint/a11y/noStaticElementInteractions: pointer gestures are a mouse-only enhancement; the brush inside is keyboard-operable
481
+ <div
482
+ ref={containerRef}
483
+ className={cn(
484
+ 'relative h-10 min-h-10 w-full border-b border-gray-alpha-400 bg-background-100 select-none overflow-hidden touch-none',
485
+ drag?.mode === 'select' && 'cursor-crosshair'
486
+ )}
487
+ onPointerDown={handlePointerDown}
488
+ onPointerMove={handlePointerMove}
489
+ onPointerUp={endDrag}
490
+ onPointerCancel={endDrag}
491
+ onLostPointerCapture={handleLostPointerCapture}
492
+ onDoubleClick={handleDoubleClick}
493
+ >
494
+ {/* Multiply on light themes / screen on dark, so overlapping span lines
495
+ deepen instead of occluding and the glass thumb reads through them. */}
496
+ <canvas
497
+ ref={canvasRef}
498
+ aria-hidden
499
+ className="pointer-events-none absolute inset-0 h-full w-full mix-blend-multiply [.dark-theme_&]:mix-blend-screen [.dark_&]:mix-blend-screen [[data-theme=dark]_&]:mix-blend-screen"
500
+ />
501
+ {selection ? (
502
+ <div
503
+ aria-hidden
504
+ className="pointer-events-none absolute inset-y-0 border border-blue-500 bg-blue-300 opacity-40"
505
+ style={{ left: selection.x0, width: selection.x1 - selection.x0 }}
506
+ />
507
+ ) : null}
508
+ <div
509
+ data-minimap-brush
510
+ role="scrollbar"
511
+ aria-controls="trace-timeline"
512
+ aria-orientation="horizontal"
513
+ aria-valuemin={0}
514
+ aria-valuemax={100}
515
+ aria-valuenow={scrollPercent}
516
+ aria-valuetext={`Viewing ${formatDurationPrecise(
517
+ viewport.start - rootStartMs
518
+ )} to ${formatDurationPrecise(
519
+ viewport.end - rootStartMs
520
+ )} of ${formatDurationPrecise(rootDurationMs)}`}
521
+ aria-label="Timeline overview"
522
+ tabIndex={0}
523
+ onKeyDown={handleKeyDown}
524
+ className={cn(
525
+ // Glass thumb, matching the legacy trace viewer's map window.
526
+ 'group/minimap-brush absolute top-0.5 bottom-0.5 rounded-[3px] border border-gray-alpha-400 bg-gray-alpha-200 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--ds-focus-color)]',
527
+ drag?.mode === 'pan' ? 'cursor-grabbing' : 'cursor-grab'
528
+ )}
529
+ style={brushStyle}
530
+ >
531
+ <div
532
+ data-minimap-handle="left"
533
+ className="absolute inset-y-0 -left-1 flex w-2.5 cursor-ew-resize items-center justify-center"
534
+ >
535
+ <span
536
+ className={cn(
537
+ 'h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100',
538
+ drag && 'opacity-100'
539
+ )}
540
+ />
541
+ </div>
542
+ <div
543
+ data-minimap-handle="right"
544
+ className="absolute inset-y-0 -right-1 flex w-2.5 cursor-ew-resize items-center justify-center"
545
+ >
546
+ <span
547
+ className={cn(
548
+ 'h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100',
549
+ drag && 'opacity-100'
550
+ )}
551
+ />
552
+ </div>
553
+ </div>
554
+ </div>
555
+ );
556
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Layout constants shared by SplitPane and TraceViewerSkeleton. Kept in a
3
+ * module without 'use client' so the skeleton's import chain stays
4
+ * server-component-safe for external consumers.
5
+ */
6
+
7
+ /** Width (px) of the draggable gutter column between the list and timeline. */
8
+ export const GUTTER_PX = 1;
9
+
10
+ /** Minimum width (px) of either SplitPane pane. */
11
+ export const MIN_PX = 50;
12
+
13
+ /** Default width (px) of the start (event list) pane. */
14
+ export const DEFAULT_START_PX = 340;
15
+
16
+ /** Grid column template for the [list | gutter | timeline] split. */
17
+ export function paneColTemplate(startPx: number): string {
18
+ return `${startPx}px ${GUTTER_PX}px minmax(${MIN_PX}px, 1fr)`;
19
+ }