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

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,34 @@
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
+ /** Floor for the detail panel — matches the previous `clamp(280px, …)` floor. */
9
+ export declare const PANEL_MIN_WIDTH = 280;
10
+ /**
11
+ * Absolute ceiling enforced at the storage layer so a corrupt or stale stored
12
+ * value can never wedge the layout open.
13
+ */
14
+ export declare const PANEL_HARD_MAX_WIDTH = 1300;
15
+ /** Default width — matches the previous fixed 360px column. */
16
+ export declare const PANEL_DEFAULT_WIDTH = 360;
17
+ /**
18
+ * Width the main (event list + timeline) area keeps while the panel is
19
+ * resized or the container shrinks. Below `PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`
20
+ * of container the panel gives way first, compressing below its own floor —
21
+ * the list and timeline stay usable at the panel's expense.
22
+ */
23
+ export declare const MAIN_MIN_WIDTH = 400;
24
+ export declare const PANEL_WIDTH_STORAGE_KEY = "workflow-trace-detail-panel-width";
25
+ export declare function computeMaxPanelWidth(availableWidth: number): number;
26
+ /**
27
+ * Note: when the container is too small to honor both floors
28
+ * (`availableWidth < PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`), the max wins and the
29
+ * panel compresses below `PANEL_MIN_WIDTH`.
30
+ */
31
+ export declare function clampPanelWidth(width: number, availableWidth: number): number;
32
+ export declare function readStoredPanelWidth(): number;
33
+ export declare function writeStoredPanelWidth(width: number): void;
34
+ //# sourceMappingURL=detail-panel-width.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-panel-width.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/detail-panel-width.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iFAAiF;AACjF,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,eAAO,MAAM,uBAAuB,sCAAsC,CAAC;AAM3E,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAY7C;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAUzD"}
@@ -0,0 +1,67 @@
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
+ /** Floor for the detail panel — matches the previous `clamp(280px, …)` floor. */
9
+ export const PANEL_MIN_WIDTH = 280;
10
+ /**
11
+ * Absolute ceiling enforced at the storage layer so a corrupt or stale stored
12
+ * value can never wedge the layout open.
13
+ */
14
+ export const PANEL_HARD_MAX_WIDTH = 1300;
15
+ /** Default width — matches the previous fixed 360px column. */
16
+ export const PANEL_DEFAULT_WIDTH = 360;
17
+ /**
18
+ * Width the main (event list + timeline) area keeps while the panel is
19
+ * resized or the container shrinks. Below `PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`
20
+ * of container the panel gives way first, compressing below its own floor —
21
+ * the list and timeline stay usable at the panel's expense.
22
+ */
23
+ export const MAIN_MIN_WIDTH = 400;
24
+ export const PANEL_WIDTH_STORAGE_KEY = 'workflow-trace-detail-panel-width';
25
+ function clamp(value, min, max) {
26
+ return Math.min(Math.max(value, min), max);
27
+ }
28
+ export function computeMaxPanelWidth(availableWidth) {
29
+ if (availableWidth <= 0)
30
+ return PANEL_HARD_MAX_WIDTH;
31
+ return Math.min(Math.max(availableWidth - MAIN_MIN_WIDTH, 0), PANEL_HARD_MAX_WIDTH);
32
+ }
33
+ /**
34
+ * Note: when the container is too small to honor both floors
35
+ * (`availableWidth < PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`), the max wins and the
36
+ * panel compresses below `PANEL_MIN_WIDTH`.
37
+ */
38
+ export function clampPanelWidth(width, availableWidth) {
39
+ return clamp(width, PANEL_MIN_WIDTH, computeMaxPanelWidth(availableWidth));
40
+ }
41
+ export function readStoredPanelWidth() {
42
+ if (typeof window === 'undefined')
43
+ return PANEL_DEFAULT_WIDTH;
44
+ try {
45
+ const raw = window.localStorage.getItem(PANEL_WIDTH_STORAGE_KEY);
46
+ const value = raw ? Number(raw) : Number.NaN;
47
+ if (!Number.isFinite(value))
48
+ return PANEL_DEFAULT_WIDTH;
49
+ // Only enforce absolute bounds at the storage layer; the container-relative
50
+ // max is applied at render time (see module docs).
51
+ return clamp(value, PANEL_MIN_WIDTH, PANEL_HARD_MAX_WIDTH);
52
+ }
53
+ catch {
54
+ return PANEL_DEFAULT_WIDTH;
55
+ }
56
+ }
57
+ export function writeStoredPanelWidth(width) {
58
+ if (typeof window === 'undefined')
59
+ return;
60
+ try {
61
+ window.localStorage.setItem(PANEL_WIDTH_STORAGE_KEY, String(Math.round(width)));
62
+ }
63
+ catch {
64
+ // Best-effort (private mode, quota).
65
+ }
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXBhbmVsLXdpZHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvZGV0YWlsLXBhbmVsLXdpZHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRW5DOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRXZDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxtQ0FBbUMsQ0FBQztBQUUzRSxTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsY0FBc0I7SUFDekQsSUFBSSxjQUFjLElBQUksQ0FBQztRQUFFLE9BQU8sb0JBQW9CLENBQUM7SUFDckQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFDNUMsb0JBQW9CLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYSxFQUFFLGNBQXNCO0lBQ25FLE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLG1CQUFtQixDQUFDO0lBQzlELElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDakUsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxtQkFBbUIsQ0FBQztRQUN4RCw0RUFBNEU7UUFDNUUsbURBQW1EO1FBQ25ELE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFhO0lBQ2pELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztRQUFFLE9BQU87SUFDMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQ3pCLHVCQUF1QixFQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHFDQUFxQztJQUN2QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2lkdGggbW9kZWwgZm9yIHRoZSBzcGFuIGRldGFpbCBwYW5lbDogdGhlIHN0b3JlZCB2YWx1ZSBpcyB0aGUgdXNlcidzXG4gKiBwcmVmZXJyZWQgd2lkdGggKGFic29sdXRlIHB4LCBwZXJzaXN0ZWQgdG8gbG9jYWxTdG9yYWdlIG9uIGV4cGxpY2l0XG4gKiBpbnRlcmFjdGlvbiBvbmx5KSwgd2hpbGUgdGhlIGNvbnRhaW5lci1yZWxhdGl2ZSBtYXhpbXVtIGlzIGFwcGxpZWQgYXRcbiAqIHJlbmRlciB0aW1lIOKAlCBzbyBhIHdpZHRoIHByZWZlcnJlZCBvbiBhIHdpZGUgc2NyZWVuIHN1cnZpdmVzIGEgbmFycm93ZXJcbiAqIHNlc3Npb24gYW5kIHJlc3RvcmVzIHdoZW4gdGhlIHZpZXdlciBncm93cyBhZ2Fpbi5cbiAqL1xuXG4vKiogRmxvb3IgZm9yIHRoZSBkZXRhaWwgcGFuZWwg4oCUIG1hdGNoZXMgdGhlIHByZXZpb3VzIGBjbGFtcCgyODBweCwg4oCmKWAgZmxvb3IuICovXG5leHBvcnQgY29uc3QgUEFORUxfTUlOX1dJRFRIID0gMjgwO1xuXG4vKipcbiAqIEFic29sdXRlIGNlaWxpbmcgZW5mb3JjZWQgYXQgdGhlIHN0b3JhZ2UgbGF5ZXIgc28gYSBjb3JydXB0IG9yIHN0YWxlIHN0b3JlZFxuICogdmFsdWUgY2FuIG5ldmVyIHdlZGdlIHRoZSBsYXlvdXQgb3Blbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFBBTkVMX0hBUkRfTUFYX1dJRFRIID0gMTMwMDtcblxuLyoqIERlZmF1bHQgd2lkdGgg4oCUIG1hdGNoZXMgdGhlIHByZXZpb3VzIGZpeGVkIDM2MHB4IGNvbHVtbi4gKi9cbmV4cG9ydCBjb25zdCBQQU5FTF9ERUZBVUxUX1dJRFRIID0gMzYwO1xuXG4vKipcbiAqIFdpZHRoIHRoZSBtYWluIChldmVudCBsaXN0ICsgdGltZWxpbmUpIGFyZWEga2VlcHMgd2hpbGUgdGhlIHBhbmVsIGlzXG4gKiByZXNpemVkIG9yIHRoZSBjb250YWluZXIgc2hyaW5rcy4gQmVsb3cgYFBBTkVMX01JTl9XSURUSCArIE1BSU5fTUlOX1dJRFRIYFxuICogb2YgY29udGFpbmVyIHRoZSBwYW5lbCBnaXZlcyB3YXkgZmlyc3QsIGNvbXByZXNzaW5nIGJlbG93IGl0cyBvd24gZmxvb3Ig4oCUXG4gKiB0aGUgbGlzdCBhbmQgdGltZWxpbmUgc3RheSB1c2FibGUgYXQgdGhlIHBhbmVsJ3MgZXhwZW5zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BSU5fTUlOX1dJRFRIID0gNDAwO1xuXG5leHBvcnQgY29uc3QgUEFORUxfV0lEVEhfU1RPUkFHRV9LRVkgPSAnd29ya2Zsb3ctdHJhY2UtZGV0YWlsLXBhbmVsLXdpZHRoJztcblxuZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCBtaW4pLCBtYXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU1heFBhbmVsV2lkdGgoYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChhdmFpbGFibGVXaWR0aCA8PSAwKSByZXR1cm4gUEFORUxfSEFSRF9NQVhfV0lEVEg7XG4gIHJldHVybiBNYXRoLm1pbihcbiAgICBNYXRoLm1heChhdmFpbGFibGVXaWR0aCAtIE1BSU5fTUlOX1dJRFRILCAwKSxcbiAgICBQQU5FTF9IQVJEX01BWF9XSURUSFxuICApO1xufVxuXG4vKipcbiAqIE5vdGU6IHdoZW4gdGhlIGNvbnRhaW5lciBpcyB0b28gc21hbGwgdG8gaG9ub3IgYm90aCBmbG9vcnNcbiAqIChgYXZhaWxhYmxlV2lkdGggPCBQQU5FTF9NSU5fV0lEVEggKyBNQUlOX01JTl9XSURUSGApLCB0aGUgbWF4IHdpbnMgYW5kIHRoZVxuICogcGFuZWwgY29tcHJlc3NlcyBiZWxvdyBgUEFORUxfTUlOX1dJRFRIYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wUGFuZWxXaWR0aCh3aWR0aDogbnVtYmVyLCBhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNsYW1wKHdpZHRoLCBQQU5FTF9NSU5fV0lEVEgsIGNvbXB1dGVNYXhQYW5lbFdpZHRoKGF2YWlsYWJsZVdpZHRoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU3RvcmVkUGFuZWxXaWR0aCgpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBQQU5FTF9ERUZBVUxUX1dJRFRIO1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShQQU5FTF9XSURUSF9TVE9SQUdFX0tFWSk7XG4gICAgY29uc3QgdmFsdWUgPSByYXcgPyBOdW1iZXIocmF3KSA6IE51bWJlci5OYU47XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gUEFORUxfREVGQVVMVF9XSURUSDtcbiAgICAvLyBPbmx5IGVuZm9yY2UgYWJzb2x1dGUgYm91bmRzIGF0IHRoZSBzdG9yYWdlIGxheWVyOyB0aGUgY29udGFpbmVyLXJlbGF0aXZlXG4gICAgLy8gbWF4IGlzIGFwcGxpZWQgYXQgcmVuZGVyIHRpbWUgKHNlZSBtb2R1bGUgZG9jcykuXG4gICAgcmV0dXJuIGNsYW1wKHZhbHVlLCBQQU5FTF9NSU5fV0lEVEgsIFBBTkVMX0hBUkRfTUFYX1dJRFRIKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFBBTkVMX0RFRkFVTFRfV0lEVEg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3RvcmVkUGFuZWxXaWR0aCh3aWR0aDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICB0cnkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgIFBBTkVMX1dJRFRIX1NUT1JBR0VfS0VZLFxuICAgICAgU3RyaW5nKE1hdGgucm91bmQod2lkdGgpKVxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEJlc3QtZWZmb3J0IChwcml2YXRlIG1vZGUsIHF1b3RhKS5cbiAgfVxufVxuIl19
@@ -0,0 +1,14 @@
1
+ import { type ReactNode, type RefObject } from 'react';
2
+ /**
3
+ * The span detail aside: content, prev/next/close header, J/K navigation, and
4
+ * the resizable left border with its width model (see detail-panel-width.ts).
5
+ *
6
+ * Always mounted — it renders null without a selection — so the panel width
7
+ * survives closing and reopening within a session.
8
+ */
9
+ export declare function TraceDetailPanel({ containerRef, onNavigateToSpan, onClose, }: {
10
+ containerRef: RefObject<HTMLDivElement | null>;
11
+ onNavigateToSpan: (spanId: string) => void;
12
+ onClose: () => void;
13
+ }): ReactNode;
14
+ //# sourceMappingURL=detail-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-panel.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/detail-panel.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAiDf;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,gBAAgB,EAChB,OAAO,GACR,EAAE;IACD,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,GAAG,SAAS,CAoMZ"}
@@ -0,0 +1,122 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
4
+ import { ChevronDown, ChevronUp, X } from 'lucide-react';
5
+ import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
6
+ import { filterSpanRawEvents } from '../../../lib/trace-builder';
7
+ import { ErrorBoundary } from '../../error-boundary';
8
+ import { EntityDetailPanel, } from '../../sidebar/entity-detail-panel';
9
+ import { useSidebarData } from '../../sidebar/sidebar-data-context';
10
+ import { IconButton } from '../../ui/icon-button';
11
+ import { Kbd } from '../../ui/kbd';
12
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/tooltip';
13
+ import { useActiveSpan } from '../context';
14
+ import { clampPanelWidth, computeMaxPanelWidth, PANEL_DEFAULT_WIDTH, PANEL_MIN_WIDTH, readStoredPanelWidth, writeStoredPanelWidth, } from './detail-panel-width';
15
+ import { DraggableBorder } from './draggable-border';
16
+ import { useElementWidth } from './use-element-width';
17
+ const DETAIL_PANEL_ID = 'trace-detail-panel';
18
+ /** Bridge ActiveSpanContext + SidebarDataContext → SelectedSpanInfo. */
19
+ function useSelectedSpanInfo() {
20
+ const { activeSpan } = useActiveSpan();
21
+ const sidebar = useSidebarData();
22
+ return useMemo(() => {
23
+ if (!activeSpan)
24
+ return null;
25
+ const resource = activeSpan.attributes?.resource;
26
+ const rawEvents = filterSpanRawEvents(sidebar.events, resource, activeSpan.spanId);
27
+ return {
28
+ data: activeSpan.attributes?.data,
29
+ resource,
30
+ spanId: activeSpan.spanId,
31
+ rawEvents,
32
+ };
33
+ }, [activeSpan, sidebar]);
34
+ }
35
+ /**
36
+ * The span detail aside: content, prev/next/close header, J/K navigation, and
37
+ * the resizable left border with its width model (see detail-panel-width.ts).
38
+ *
39
+ * Always mounted — it renders null without a selection — so the panel width
40
+ * survives closing and reopening within a session.
41
+ */
42
+ export function TraceDetailPanel({ containerRef, onNavigateToSpan, onClose, }) {
43
+ const { activeSpan, activeSpanId, spans } = useActiveSpan();
44
+ const sidebar = useSidebarData();
45
+ const selectedSpan = useSelectedSpanInfo();
46
+ const isOpen = Boolean(activeSpan);
47
+ const [storedWidth, setStoredWidth] = useState(() => readStoredPanelWidth());
48
+ const containerWidth = useElementWidth(containerRef, isOpen);
49
+ const asideRef = useRef(null);
50
+ const handleResize = useCallback((next) => {
51
+ const clamped = clampPanelWidth(next, containerWidth);
52
+ setStoredWidth(clamped);
53
+ writeStoredPanelWidth(clamped);
54
+ }, [containerWidth]);
55
+ const panelWidth = clampPanelWidth(storedWidth, containerWidth);
56
+ const panelMaxWidth = Math.max(PANEL_MIN_WIDTH, computeMaxPanelWidth(containerWidth));
57
+ const { prevSpanId, nextSpanId } = useMemo(() => {
58
+ if (!activeSpanId)
59
+ return { prevSpanId: null, nextSpanId: null };
60
+ const i = spans.findIndex((s) => s.spanId === activeSpanId);
61
+ if (i === -1)
62
+ return { prevSpanId: null, nextSpanId: null };
63
+ return {
64
+ prevSpanId: spans[i - 1]?.spanId ?? null,
65
+ nextSpanId: spans[i + 1]?.spanId ?? null,
66
+ };
67
+ }, [activeSpanId, spans]);
68
+ const handleSelectPrev = useCallback(() => {
69
+ if (prevSpanId)
70
+ onNavigateToSpan(prevSpanId);
71
+ }, [prevSpanId, onNavigateToSpan]);
72
+ const handleSelectNext = useCallback(() => {
73
+ if (nextSpanId)
74
+ onNavigateToSpan(nextSpanId);
75
+ }, [nextSpanId, onNavigateToSpan]);
76
+ useEffect(() => {
77
+ if (!isOpen)
78
+ return;
79
+ const onKeyDown = (e) => {
80
+ if (e.key !== 'j' &&
81
+ e.key !== 'k' &&
82
+ e.key !== 'ArrowDown' &&
83
+ e.key !== 'ArrowUp') {
84
+ return;
85
+ }
86
+ const target = e.target;
87
+ if (target instanceof HTMLInputElement ||
88
+ target instanceof HTMLTextAreaElement ||
89
+ target?.isContentEditable) {
90
+ return;
91
+ }
92
+ const targetId = e.key === 'k' || e.key === 'ArrowUp' ? prevSpanId : nextSpanId;
93
+ if (targetId) {
94
+ e.preventDefault();
95
+ onNavigateToSpan(targetId);
96
+ }
97
+ };
98
+ window.addEventListener('keydown', onKeyDown);
99
+ return () => window.removeEventListener('keydown', onKeyDown);
100
+ }, [isOpen, prevSpanId, nextSpanId, onNavigateToSpan]);
101
+ // Derive the selected span name for the panel header
102
+ const selectedSpanName = useMemo(() => {
103
+ if (!selectedSpan?.data)
104
+ return 'Details';
105
+ const data = selectedSpan.data;
106
+ if (selectedSpan.resource === 'hook') {
107
+ return data.token ?? data.hookId;
108
+ }
109
+ const stepName = data.stepName;
110
+ const workflowName = data.workflowName;
111
+ return ((stepName ? parseStepName(stepName)?.shortName : undefined) ??
112
+ (workflowName ? parseWorkflowName(workflowName)?.shortName : undefined) ??
113
+ stepName ??
114
+ workflowName ??
115
+ data.hookId ??
116
+ 'Details');
117
+ }, [selectedSpan?.data, selectedSpan?.resource]);
118
+ if (!activeSpan)
119
+ return null;
120
+ return (_jsxs("aside", { ref: asideRef, id: DETAIL_PANEL_ID, className: "relative flex flex-col h-full max-h-full shrink-0 bg-background-100 border-l border-gray-alpha-400", style: { width: panelWidth }, children: [_jsx(DraggableBorder, { element: asideRef, position: "left", onWidthChange: handleResize, onReset: () => handleResize(PANEL_DEFAULT_WIDTH), "aria-label": "Resize span details panel", "aria-controls": DETAIL_PANEL_ID, "aria-valuemin": PANEL_MIN_WIDTH, "aria-valuemax": panelMaxWidth, "aria-valuenow": Math.min(Math.max(Math.round(panelWidth), PANEL_MIN_WIDTH), panelMaxWidth) }), _jsxs("div", { className: "flex items-center justify-between gap-2 shrink-0 px-4 py-[7.5px]", children: [_jsx("span", { className: "text-label-14 font-medium text-gray-1000 truncate block", children: selectedSpanName }), _jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(IconButton, { "aria-label": "Navigate up", "aria-keyshortcuts": "K", onClick: handleSelectPrev, disabled: !prevSpanId, children: _jsx(ChevronUp, { className: "w-4 h-4" }) }) }), prevSpanId ? (_jsxs(TooltipContent, { children: ["Navigate up", _jsx(Kbd, { children: "K" })] })) : null] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(IconButton, { "aria-label": "Navigate down", "aria-keyshortcuts": "J", onClick: handleSelectNext, disabled: !nextSpanId, children: _jsx(ChevronDown, { className: "w-4 h-4" }) }) }), nextSpanId ? (_jsxs(TooltipContent, { children: ["Navigate down", _jsx(Kbd, { children: "J" })] })) : null] }), _jsx("div", { "aria-hidden": true, className: "w-px h-4 bg-gray-alpha-400 mx-1" }), _jsx(IconButton, { "aria-label": "Close span details", "aria-keyshortcuts": "Escape", onClick: onClose, children: _jsx(X, { className: "w-4 h-4" }) })] })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ErrorBoundary, { children: _jsx(EntityDetailPanel, { run: sidebar.run, onStreamClick: sidebar.onStreamClick, onRunClick: sidebar.onRunClick, fetchSpanDetail: sidebar.fetchSpanDetail, onWakeUpSleep: sidebar.onWakeUpSleep, onLoadEventData: sidebar.onLoadEventData, onResolveHook: sidebar.onResolveHook, encryptionKey: sidebar.encryptionKey, onDecrypt: sidebar.onDecrypt, isDecrypting: sidebar.isDecrypting, selectedSpan: selectedSpan, showSeparateEventOccurrenceTimestamps: sidebar.showSeparateEventOccurrenceTimestamps, getModuleSourceUrl: sidebar.getModuleSourceUrl }) }) })] }));
121
+ }
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvZGV0YWlsLXBhbmVsLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBR0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsaUJBQWlCLEdBRWxCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxl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RUFBRSxPQUFPLENBQUMsa0JBQWtCLEdBQzlDLEdBQ1ksR0FDWixJQUNBLENBQ1QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7IHBhcnNlU3RlcE5hbWUsIHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHsgQ2hldnJvbkRvd24sIENoZXZyb25VcCwgWCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQge1xuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdHlwZSBSZWZPYmplY3QsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpbHRlclNwYW5SYXdFdmVudHMgfSBmcm9tICcuLi8uLi8uLi9saWIvdHJhY2UtYnVpbGRlcic7XG5pbXBvcnQgeyBFcnJvckJvdW5kYXJ5IH0gZnJvbSAnLi4vLi4vZXJyb3ItYm91bmRhcnknO1xuaW1wb3J0IHtcbiAgRW50aXR5RGV0YWlsUGFuZWwsXG4gIHR5cGUgU2VsZWN0ZWRTcGFuSW5mbyxcbn0gZnJvbSAnLi4vLi4vc2lkZWJhci9lbnRpdHktZGV0YWlsLXBhbmVsJztcbmltcG9ydCB7IHVzZVNpZGViYXJEYXRhIH0gZnJvbSAnLi4vLi4vc2lkZWJhci9zaWRlYmFyLWRhdGEtY29udGV4dCc7XG5pbXBvcnQgeyBJY29uQnV0dG9uIH0gZnJvbSAnLi4vLi4vdWkvaWNvbi1idXR0b24nO1xuaW1wb3J0IHsgS2JkIH0gZnJvbSAnLi4vLi4vdWkva2JkJztcbmltcG9ydCB7IFRvb2x0aXAsIFRvb2x0aXBDb250ZW50LCBUb29sdGlwVHJpZ2dlciB9IGZyb20gJy4uLy4uL3VpL3Rvb2x0aXAnO1xuaW1wb3J0IHsgdXNlQWN0aXZlU3BhbiB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHtcbiAgY2xhbXBQYW5lbFdpZHRoLFxuICBjb21wdXRlTWF4UGFuZWxXaWR0aCxcbiAgUEFORUxfREVGQVVMVF9XSURUSCxcbiAgUEFORUxfTUlOX1dJRFRILFxuICByZWFkU3RvcmVkUGFuZWxXaWR0aCxcbiAgd3JpdGVTdG9yZWRQYW5lbFdpZHRoLFxufSBmcm9tICcuL2RldGFpbC1wYW5lbC13aWR0aCc7XG5pbXBvcnQgeyBEcmFnZ2FibGVCb3JkZXIgfSBmcm9tICcuL2RyYWdnYWJsZS1ib3JkZXInO1xuaW1wb3J0IHsgdXNlRWxlbWVudFdpZHRoIH0gZnJvbSAnLi91c2UtZWxlbWVudC13aWR0aCc7XG5cbmNvbnN0IERFVEFJTF9QQU5FTF9JRCA9ICd0cmFjZS1kZXRhaWwtcGFuZWwnO1xuXG4vKiogQnJpZGdlIEFjdGl2ZVNwYW5Db250ZXh0ICsgU2lkZWJhckRhdGFDb250ZXh0IOKGkiBTZWxlY3RlZFNwYW5JbmZvLiAqL1xuZnVuY3Rpb24gdXNlU2VsZWN0ZWRTcGFuSW5mbygpOiBTZWxlY3RlZFNwYW5JbmZvIHwgbnVsbCB7XG4gIGNvbnN0IHsgYWN0aXZlU3BhbiB9ID0gdXNlQWN0aXZlU3BhbigpO1xuICBjb25zdCBzaWRlYmFyID0gdXNlU2lkZWJhckRhdGEoKTtcblxuICByZXR1cm4gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFhY3RpdmVTcGFuKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJlc291cmNlID0gYWN0aXZlU3Bhbi5hdHRyaWJ1dGVzPy5yZXNvdXJjZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmF3RXZlbnRzID0gZmlsdGVyU3BhblJhd0V2ZW50cyhcbiAgICAgIHNpZGViYXIuZXZlbnRzLFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhY3RpdmVTcGFuLnNwYW5JZFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogYWN0aXZlU3Bhbi5hdHRyaWJ1dGVzPy5kYXRhLFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBzcGFuSWQ6IGFjdGl2ZVNwYW4uc3BhbklkLFxuICAgICAgcmF3RXZlbnRzLFxuICAgIH07XG4gIH0sIFthY3RpdmVTcGFuLCBzaWRlYmFyXSk7XG59XG5cbi8qKlxuICogVGhlIHNwYW4gZGV0YWlsIGFzaWRlOiBjb250ZW50LCBwcmV2L25leHQvY2xvc2UgaGVhZGVyLCBKL0sgbmF2aWdhdGlvbiwgYW5kXG4gKiB0aGUgcmVzaXphYmxlIGxlZnQgYm9yZGVyIHdpdGggaXRzIHdpZHRoIG1vZGVsIChzZWUgZGV0YWlsLXBhbmVsLXdpZHRoLnRzKS5cbiAqXG4gKiBBbHdheXMgbW91bnRlZCDigJQgaXQgcmVuZGVycyBudWxsIHdpdGhvdXQgYSBzZWxlY3Rpb24g4oCUIHNvIHRoZSBwYW5lbCB3aWR0aFxuICogc3Vydml2ZXMgY2xvc2luZyBhbmQgcmVvcGVuaW5nIHdpdGhpbiBhIHNlc3Npb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmFjZURldGFpbFBhbmVsKHtcbiAgY29udGFpbmVyUmVmLFxuICBvbk5hdmlnYXRlVG9TcGFuLFxuICBvbkNsb3NlLFxufToge1xuICBjb250YWluZXJSZWY6IFJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+O1xuICBvbk5hdmlnYXRlVG9TcGFuOiAoc3BhbklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBhY3RpdmVTcGFuLCBhY3RpdmVTcGFuSWQsIHNwYW5zIH0gPSB1c2VBY3RpdmVTcGFuKCk7XG4gIGNvbnN0IHNpZGViYXIgPSB1c2VTaWRlYmFyRGF0YSgpO1xuICBjb25zdCBzZWxlY3RlZFNwYW4gPSB1c2VTZWxlY3RlZFNwYW5JbmZvKCk7XG4gIGNvbnN0IGlzT3BlbiA9IEJvb2xlYW4oYWN0aXZlU3Bhbik7XG5cbiAgY29uc3QgW3N0b3JlZFdpZHRoLCBzZXRTdG9yZWRXaWR0aF0gPSB1c2VTdGF0ZTxudW1iZXI+KCgpID0+XG4gICAgcmVhZFN0b3JlZFBhbmVsV2lkdGgoKVxuICApO1xuICBjb25zdCBjb250YWluZXJXaWR0aCA9IHVzZUVsZW1lbnRXaWR0aChjb250YWluZXJSZWYsIGlzT3Blbik7XG4gIGNvbnN0IGFzaWRlUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgaGFuZGxlUmVzaXplID0gdXNlQ2FsbGJhY2soXG4gICAgKG5leHQ6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgY2xhbXBlZCA9IGNsYW1wUGFuZWxXaWR0aChuZXh0LCBjb250YWluZXJXaWR0aCk7XG4gICAgICBzZXRTdG9yZWRXaWR0aChjbGFtcGVkKTtcbiAgICAgIHdyaXRlU3RvcmVkUGFuZWxXaWR0aChjbGFtcGVkKTtcbiAgICB9LFxuICAgIFtjb250YWluZXJXaWR0aF1cbiAgKTtcblxuICBjb25zdCBwYW5lbFdpZHRoID0gY2xhbXBQYW5lbFdpZHRoKHN0b3JlZFdpZHRoLCBjb250YWluZXJXaWR0aCk7XG4gIGNvbnN0IHBhbmVsTWF4V2lkdGggPSBNYXRoLm1heChcbiAgICBQQU5FTF9NSU5fV0lEVEgsXG4gICAgY29tcHV0ZU1heFBhbmVsV2lkdGgoY29udGFpbmVyV2lkdGgpXG4gICk7XG5cbiAgY29uc3QgeyBwcmV2U3BhbklkLCBuZXh0U3BhbklkIH0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWFjdGl2ZVNwYW5JZCkgcmV0dXJuIHsgcHJldlNwYW5JZDogbnVsbCwgbmV4dFNwYW5JZDogbnVsbCB9O1xuICAgIGNvbnN0IGkgPSBzcGFucy5maW5kSW5kZXgoKHMpID0+IHMuc3BhbklkID09PSBhY3RpdmVTcGFuSWQpO1xuICAgIGlmIChpID09PSAtMSkgcmV0dXJuIHsgcHJldlNwYW5JZDogbnVsbCwgbmV4dFNwYW5JZDogbnVsbCB9O1xuICAgIHJldHVybiB7XG4gICAgICBwcmV2U3BhbklkOiBzcGFuc1tpIC0gMV0/LnNwYW5JZCA/PyBudWxsLFxuICAgICAgbmV4dFNwYW5JZDogc3BhbnNbaSArIDFdPy5zcGFuSWQgPz8gbnVsbCxcbiAgICB9O1xuICB9LCBbYWN0aXZlU3BhbklkLCBzcGFuc10pO1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFByZXYgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKHByZXZTcGFuSWQpIG9uTmF2aWdhdGVUb1NwYW4ocHJldlNwYW5JZCk7XG4gIH0sIFtwcmV2U3BhbklkLCBvbk5hdmlnYXRlVG9TcGFuXSk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0TmV4dCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAobmV4dFNwYW5JZCkgb25OYXZpZ2F0ZVRvU3BhbihuZXh0U3BhbklkKTtcbiAgfSwgW25leHRTcGFuSWQsIG9uTmF2aWdhdGVUb1NwYW5dKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNPcGVuKSByZXR1cm47XG5cbiAgICBjb25zdCBvbktleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBlLmtleSAhPT0gJ2onICYmXG4gICAgICAgIGUua2V5ICE9PSAnaycgJiZcbiAgICAgICAgZS5rZXkgIT09ICdBcnJvd0Rvd24nICYmXG4gICAgICAgIGUua2V5ICE9PSAnQXJyb3dVcCdcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoXG4gICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHxcbiAgICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICAgICAgICB0YXJnZXQ/LmlzQ29udGVudEVkaXRhYmxlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0SWQgPVxuICAgICAgICBlLmtleSA9PT0gJ2snIHx8IGUua2V5ID09PSAnQXJyb3dVcCcgPyBwcmV2U3BhbklkIDogbmV4dFNwYW5JZDtcbiAgICAgIGlmICh0YXJnZXRJZCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uTmF2aWdhdGVUb1NwYW4odGFyZ2V0SWQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duKTtcbiAgfSwgW2lzT3BlbiwgcHJldlNwYW5JZCwgbmV4dFNwYW5JZCwgb25OYXZpZ2F0ZVRvU3Bhbl0pO1xuXG4gIC8vIERlcml2ZSB0aGUgc2VsZWN0ZWQgc3BhbiBuYW1lIGZvciB0aGUgcGFuZWwgaGVhZGVyXG4gIGNvbnN0IHNlbGVjdGVkU3Bhbk5hbWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkU3Bhbj8uZGF0YSkgcmV0dXJuICdEZXRhaWxzJztcbiAgICBjb25zdCBkYXRhID0gc2VsZWN0ZWRTcGFuLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKHNlbGVjdGVkU3Bhbi5yZXNvdXJjZSA9PT0gJ2hvb2snKSB7XG4gICAgICByZXR1cm4gKGRhdGEudG9rZW4gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAoZGF0YS5ob29rSWQgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwTmFtZSA9IGRhdGEuc3RlcE5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IGRhdGEud29ya2Zsb3dOYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gKFxuICAgICAgKHN0ZXBOYW1lID8gcGFyc2VTdGVwTmFtZShzdGVwTmFtZSk/LnNob3J0TmFtZSA6IHVuZGVmaW5lZCkgPz9cbiAgICAgICh3b3JrZmxvd05hbWUgPyBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpPy5zaG9ydE5hbWUgOiB1bmRlZmluZWQpID8/XG4gICAgICBzdGVwTmFtZSA/P1xuICAgICAgd29ya2Zsb3dOYW1lID8/XG4gICAgICAoZGF0YS5ob29rSWQgYXMgc3RyaW5nKSA/P1xuICAgICAgJ0RldGFpbHMnXG4gICAgKTtcbiAgfSwgW3NlbGVjdGVkU3Bhbj8uZGF0YSwgc2VsZWN0ZWRTcGFuPy5yZXNvdXJjZV0pO1xuXG4gIGlmICghYWN0aXZlU3BhbikgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8YXNpZGVcbiAgICAgIHJlZj17YXNpZGVSZWZ9XG4gICAgICBpZD17REVUQUlMX1BBTkVMX0lEfVxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleCBmbGV4LWNvbCBoLWZ1bGwgbWF4LWgtZnVsbCBzaHJpbmstMCBiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXItbCBib3JkZXItZ3JheS1hbHBoYS00MDBcIlxuICAgICAgc3R5bGU9e3sgd2lkdGg6IHBhbmVsV2lkdGggfX1cbiAgICA+XG4gICAgICA8RHJhZ2dhYmxlQm9yZGVyXG4gICAgICAgIGVsZW1lbnQ9e2FzaWRlUmVmfVxuICAgICAgICBwb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICBvbldpZHRoQ2hhbmdlPXtoYW5kbGVSZXNpemV9XG4gICAgICAgIG9uUmVzZXQ9eygpID0+IGhhbmRsZVJlc2l6ZShQQU5FTF9ERUZBVUxUX1dJRFRIKX1cbiAgICAgICAgYXJpYS1sYWJlbD1cIlJlc2l6ZSBzcGFuIGRldGFpbHMgcGFuZWxcIlxuICAgICAgICBhcmlhLWNvbnRyb2xzPXtERVRBSUxfUEFORUxfSUR9XG4gICAgICAgIGFyaWEtdmFsdWVtaW49e1BBTkVMX01JTl9XSURUSH1cbiAgICAgICAgYXJpYS12YWx1ZW1heD17cGFuZWxNYXhXaWR0aH1cbiAgICAgICAgYXJpYS12YWx1ZW5vdz17TWF0aC5taW4oXG4gICAgICAgICAgTWF0aC5tYXgoTWF0aC5yb3VuZChwYW5lbFdpZHRoKSwgUEFORUxfTUlOX1dJRFRIKSxcbiAgICAgICAgICBwYW5lbE1heFdpZHRoXG4gICAgICAgICl9XG4gICAgICAvPlxuICAgICAgey8qIFBhbmVsIGhlYWRlciAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHNocmluay0wIHB4LTQgcHktWzcuNXB4XVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTE0IGZvbnQtbWVkaXVtIHRleHQtZ3JheS0xMDAwIHRydW5jYXRlIGJsb2NrXCI+XG4gICAgICAgICAge3NlbGVjdGVkU3Bhbk5hbWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMC41IHNocmluay0wXCI+XG4gICAgICAgICAgPFRvb2x0aXA+XG4gICAgICAgICAgICA8VG9vbHRpcFRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmF2aWdhdGUgdXBcIlxuICAgICAgICAgICAgICAgIGFyaWEta2V5c2hvcnRjdXRzPVwiS1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2VsZWN0UHJldn1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByZXZTcGFuSWR9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q2hldnJvblVwIGNsYXNzTmFtZT1cInctNCBoLTRcIiAvPlxuICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICAgICAgICA8L1Rvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAgICAge3ByZXZTcGFuSWQgPyAoXG4gICAgICAgICAgICAgIDxUb29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICBOYXZpZ2F0ZSB1cFxuICAgICAgICAgICAgICAgIDxLYmQ+SzwvS2JkPlxuICAgICAgICAgICAgICA8L1Rvb2x0aXBDb250ZW50PlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgIDxUb29sdGlwPlxuICAgICAgICAgICAgPFRvb2x0aXBUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5hdmlnYXRlIGRvd25cIlxuICAgICAgICAgICAgICAgIGFyaWEta2V5c2hvcnRjdXRzPVwiSlwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2VsZWN0TmV4dH1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IW5leHRTcGFuSWR9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q2hldnJvbkRvd24gY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgIDwvVG9vbHRpcFRyaWdnZXI+XG4gICAgICAgICAgICB7bmV4dFNwYW5JZCA/IChcbiAgICAgICAgICAgICAgPFRvb2x0aXBDb250ZW50PlxuICAgICAgICAgICAgICAgIE5hdmlnYXRlIGRvd25cbiAgICAgICAgICAgICAgICA8S2JkPko8L0tiZD5cbiAgICAgICAgICAgICAgPC9Ub29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICA8ZGl2IGFyaWEtaGlkZGVuIGNsYXNzTmFtZT1cInctcHggaC00IGJnLWdyYXktYWxwaGEtNDAwIG14LTFcIiAvPlxuICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2Ugc3BhbiBkZXRhaWxzXCJcbiAgICAgICAgICAgIGFyaWEta2V5c2hvcnRjdXRzPVwiRXNjYXBlXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFggY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgey8qIFBhbmVsIGJvZHkgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgPEVycm9yQm91bmRhcnk+XG4gICAgICAgICAgPEVudGl0eURldGFpbFBhbmVsXG4gICAgICAgICAgICBydW49e3NpZGViYXIucnVufVxuICAgICAgICAgICAgb25TdHJlYW1DbGljaz17c2lkZWJhci5vblN0cmVhbUNsaWNrfVxuICAgICAgICAgICAgb25SdW5DbGljaz17c2lkZWJhci5vblJ1bkNsaWNrfVxuICAgICAgICAgICAgZmV0Y2hTcGFuRGV0YWlsPXtzaWRlYmFyLmZldGNoU3BhbkRldGFpbH1cbiAgICAgICAgICAgIG9uV2FrZVVwU2xlZXA9e3NpZGViYXIub25XYWtlVXBTbGVlcH1cbiAgICAgICAgICAgIG9uTG9hZEV2ZW50RGF0YT17c2lkZWJhci5vbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICBvblJlc29sdmVIb29rPXtzaWRlYmFyLm9uUmVzb2x2ZUhvb2t9XG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5PXtzaWRlYmFyLmVuY3J5cHRpb25LZXl9XG4gICAgICAgICAgICBvbkRlY3J5cHQ9e3NpZGViYXIub25EZWNyeXB0fVxuICAgICAgICAgICAgaXNEZWNyeXB0aW5nPXtzaWRlYmFyLmlzRGVjcnlwdGluZ31cbiAgICAgICAgICAgIHNlbGVjdGVkU3Bhbj17c2VsZWN0ZWRTcGFufVxuICAgICAgICAgICAgc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wcz17XG4gICAgICAgICAgICAgIHNpZGViYXIuc2hvd1NlcGFyYXRlRXZlbnRPY2N1cnJlbmNlVGltZXN0YW1wc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0TW9kdWxlU291cmNlVXJsPXtzaWRlYmFyLmdldE1vZHVsZVNvdXJjZVVybH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Vycm9yQm91bmRhcnk+XG4gICAgICA8L2Rpdj5cbiAgICA8L2FzaWRlPlxuICApO1xufVxuIl19
@@ -0,0 +1,31 @@
1
+ import { type RefObject } from 'react';
2
+ interface DraggableBorderProps {
3
+ /** The panel whose width this border adjusts (measured on interaction). */
4
+ element: RefObject<HTMLElement | null>;
5
+ /** Which edge of the panel the border sits on. */
6
+ position: 'left' | 'right';
7
+ /**
8
+ * Called with the next width (px) while dragging or keyboard-resizing.
9
+ * The owner is responsible for clamping.
10
+ */
11
+ onWidthChange: (width: number) => void;
12
+ /** Double-click reset. */
13
+ onReset?: () => void;
14
+ 'aria-label': string;
15
+ 'aria-controls'?: string;
16
+ 'aria-valuemin'?: number;
17
+ 'aria-valuemax'?: number;
18
+ 'aria-valuenow'?: number;
19
+ }
20
+ /**
21
+ * Overlay drag handle straddling a panel edge: an invisible strip over the
22
+ * panel's border whose center line highlights on hover/drag, with
23
+ * double-click reset, pointer-capture dragging (works with touch/pen, no
24
+ * ghost image), and keyboard/ARIA window-splitter support.
25
+ *
26
+ * The panel's positioning ancestor must not clip overflow — the strip hangs
27
+ * ~8px past the panel edge.
28
+ */
29
+ export declare function DraggableBorder({ element, position, onWidthChange, onReset, 'aria-label': ariaLabel, 'aria-controls': ariaControls, 'aria-valuemin': ariaValueMin, 'aria-valuemax': ariaValueMax, 'aria-valuenow': ariaValueNow, }: DraggableBorderProps): import("react/jsx-runtime").JSX.Element;
30
+ export {};
31
+ //# sourceMappingURL=draggable-border.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draggable-border.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/draggable-border.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAGf,UAAU,oBAAoB;IAC5B,2EAA2E;IAC3E,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACvC,kDAAkD;IAClD,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B;;;OAGG;IACH,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,aAAa,EACb,OAAO,EACP,YAAY,EAAE,SAAS,EACvB,eAAe,EAAE,YAAY,EAC7B,eAAe,EAAE,YAAY,EAC7B,eAAe,EAAE,YAAY,EAC7B,eAAe,EAAE,YAAY,GAC9B,EAAE,oBAAoB,2CAqKtB"}
@@ -0,0 +1,140 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState, } from 'react';
4
+ import { cn } from '../../../lib/cn';
5
+ /**
6
+ * Overlay drag handle straddling a panel edge: an invisible strip over the
7
+ * panel's border whose center line highlights on hover/drag, with
8
+ * double-click reset, pointer-capture dragging (works with touch/pen, no
9
+ * ghost image), and keyboard/ARIA window-splitter support.
10
+ *
11
+ * The panel's positioning ancestor must not clip overflow — the strip hangs
12
+ * ~8px past the panel edge.
13
+ */
14
+ export function DraggableBorder({ element, position, onWidthChange, onReset, 'aria-label': ariaLabel, 'aria-controls': ariaControls, 'aria-valuemin': ariaValueMin, 'aria-valuemax': ariaValueMax, 'aria-valuenow': ariaValueNow, }) {
15
+ const [isDragging, setIsDragging] = useState(false);
16
+ const pointerIdRef = useRef(null);
17
+ const startXRef = useRef(0);
18
+ const startWidthRef = useRef(0);
19
+ const pendingWidthRef = useRef(0);
20
+ const rafRef = useRef(null);
21
+ const movedRef = useRef(false);
22
+ const lastDragEndAtRef = useRef(0);
23
+ useEffect(() => {
24
+ return () => {
25
+ if (rafRef.current)
26
+ cancelAnimationFrame(rafRef.current);
27
+ };
28
+ }, []);
29
+ // Suppress text selection for the duration of a drag. Effect cleanup also
30
+ // covers the handle unmounting mid-drag (e.g. Escape closing the panel).
31
+ useEffect(() => {
32
+ if (!isDragging)
33
+ return;
34
+ const previous = document.body.style.userSelect;
35
+ document.body.style.userSelect = 'none';
36
+ return () => {
37
+ document.body.style.userSelect = previous;
38
+ };
39
+ }, [isDragging]);
40
+ const stopDrag = () => {
41
+ pointerIdRef.current = null;
42
+ setIsDragging(false);
43
+ if (rafRef.current) {
44
+ cancelAnimationFrame(rafRef.current);
45
+ rafRef.current = null;
46
+ // Flush the final position that was still waiting on the next frame.
47
+ if (movedRef.current)
48
+ onWidthChange(pendingWidthRef.current);
49
+ }
50
+ if (movedRef.current) {
51
+ movedRef.current = false;
52
+ lastDragEndAtRef.current = performance.now();
53
+ }
54
+ };
55
+ const handlePointerDown = (e) => {
56
+ // Ignore secondary pointers (e.g. a second finger) while a drag is active
57
+ // so they can't re-baseline the gesture.
58
+ if (pointerIdRef.current !== null)
59
+ return;
60
+ const el = element.current;
61
+ if (!el)
62
+ return;
63
+ if (e.pointerType === 'mouse' && e.button !== 0)
64
+ return;
65
+ e.currentTarget.setPointerCapture(e.pointerId);
66
+ pointerIdRef.current = e.pointerId;
67
+ startXRef.current = e.clientX;
68
+ startWidthRef.current = el.offsetWidth;
69
+ movedRef.current = false;
70
+ setIsDragging(true);
71
+ };
72
+ // Pointer capture routes move/up events to the strip itself, so no
73
+ // document-level listeners are needed.
74
+ const handlePointerMove = (e) => {
75
+ if (pointerIdRef.current !== e.pointerId)
76
+ return;
77
+ if (Math.abs(e.clientX - startXRef.current) > 4) {
78
+ movedRef.current = true;
79
+ }
80
+ const delta = position === 'left'
81
+ ? startXRef.current - e.clientX
82
+ : e.clientX - startXRef.current;
83
+ pendingWidthRef.current = startWidthRef.current + delta;
84
+ if (!rafRef.current) {
85
+ rafRef.current = requestAnimationFrame(() => {
86
+ rafRef.current = null;
87
+ onWidthChange(pendingWidthRef.current);
88
+ });
89
+ }
90
+ };
91
+ const handlePointerEnd = (e) => {
92
+ if (pointerIdRef.current !== e.pointerId)
93
+ return;
94
+ stopDrag();
95
+ };
96
+ const handleLostPointerCapture = (e) => {
97
+ if (pointerIdRef.current !== null && e.pointerId !== pointerIdRef.current) {
98
+ return;
99
+ }
100
+ stopDrag();
101
+ };
102
+ const handleDoubleClick = () => {
103
+ // Pointer-capture drags still emit click/dblclick (unlike HTML5 drag), so
104
+ // a dblclick during or right after a real drag is two resize nudges, not
105
+ // a reset request.
106
+ if (movedRef.current ||
107
+ performance.now() - lastDragEndAtRef.current < 500) {
108
+ return;
109
+ }
110
+ onReset?.();
111
+ };
112
+ const handleKeyDown = (e) => {
113
+ const el = element.current;
114
+ if (!el)
115
+ return;
116
+ const step = e.shiftKey ? 64 : 16;
117
+ // Arrows move the border in screen direction: for a left-edge border,
118
+ // ArrowLeft grows the panel.
119
+ const grow = position === 'left' ? 1 : -1;
120
+ let next = null;
121
+ if (e.key === 'ArrowLeft') {
122
+ next = el.offsetWidth + grow * step;
123
+ }
124
+ else if (e.key === 'ArrowRight') {
125
+ next = el.offsetWidth - grow * step;
126
+ }
127
+ else if (e.key === 'Home' && ariaValueMin !== undefined) {
128
+ next = ariaValueMin;
129
+ }
130
+ else if (e.key === 'End' && ariaValueMax !== undefined) {
131
+ next = ariaValueMax;
132
+ }
133
+ if (next === null)
134
+ return;
135
+ e.preventDefault();
136
+ onWidthChange(next);
137
+ };
138
+ return (_jsx("div", { role: "separator", "aria-orientation": "vertical", "aria-label": ariaLabel, "aria-controls": ariaControls, "aria-valuemin": ariaValueMin, "aria-valuemax": ariaValueMax, "aria-valuenow": ariaValueNow, tabIndex: 0, className: cn('group absolute inset-y-0 z-10 w-[17px] cursor-col-resize touch-none outline-none', position === 'left' ? '-left-2' : '-right-2'), onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerEnd, onPointerCancel: handlePointerEnd, onLostPointerCapture: handleLostPointerCapture, onDoubleClick: handleDoubleClick, onKeyDown: handleKeyDown, children: _jsx("span", { "aria-hidden": true, className: cn('pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-transparent transition-colors delay-75 duration-100', 'group-hover:bg-gray-500 group-focus-visible:bg-[var(--ds-focus-color)]', isDragging && 'bg-gray-500') }) }));
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWJvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL2RyYWdnYWJsZS1ib3JkZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBSUwsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFxQnJDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxFQUM5QixPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDYixPQUFPLEVBQ1AsWUFBWSxFQUFFLFNBQVMsRUFDdkIsZUFBZSxFQUFFLFlBQVksRUFDN0IsZUFBZSxFQUFFLFlBQVksRUFDN0IsZUFBZSxFQUFFLFlBQVksRUFDN0IsZUFBZSxFQUFFLFlBQVksR0FDUjtJQUNyQixNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5DLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFD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QUNDLFVBQVUsZ0JBQ2YsU0FBUyxtQkFDTixZQUFZLG1CQUNaLFlBQVksbUJBQ1osWUFBWSxtQkFDWixZQUFZLEVBQzNCLFFBQVEsRUFBRSxDQUFDLEVBQ1gsU0FBUyxFQUFFLEVBQUUsQ0FDWCxrRkFBa0YsRUFDbEYsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQzdDLEVBQ0QsYUFBYSxFQUFFLGlCQUFpQixFQUNoQyxhQUFhLEVBQUUsaUJBQWlCLEVBQ2hDLFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0IsZUFBZSxFQUFFLGdCQUFnQixFQUNqQyxvQkFBb0IsRUFBRSx3QkFBd0IsRUFDOUMsYUFBYSxFQUFFLGlCQUFpQixFQUNoQyxTQUFTLEVBQUUsYUFBYSxZQVV4QixvQ0FFRSxTQUFTLEVBQUUsRUFBRSxDQUNYLDhIQUE4SCxFQUM5SCx3RUFBd0UsRUFDeEUsVUFBVSxJQUFJLGFBQWEsQ0FDNUIsR0FDRCxHQUNFLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIHR5cGUgS2V5Ym9hcmRFdmVudCBhcyBSZWFjdEtleWJvYXJkRXZlbnQsXG4gIHR5cGUgUG9pbnRlckV2ZW50IGFzIFJlYWN0UG9pbnRlckV2ZW50LFxuICB0eXBlIFJlZk9iamVjdCxcbiAgdXNlRWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uLy4uL2xpYi9jbic7XG5cbmludGVyZmFjZSBEcmFnZ2FibGVCb3JkZXJQcm9wcyB7XG4gIC8qKiBUaGUgcGFuZWwgd2hvc2Ugd2lkdGggdGhpcyBib3JkZXIgYWRqdXN0cyAobWVhc3VyZWQgb24gaW50ZXJhY3Rpb24pLiAqL1xuICBlbGVtZW50OiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPjtcbiAgLyoqIFdoaWNoIGVkZ2Ugb2YgdGhlIHBhbmVsIHRoZSBib3JkZXIgc2l0cyBvbi4gKi9cbiAgcG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCc7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2l0aCB0aGUgbmV4dCB3aWR0aCAocHgpIHdoaWxlIGRyYWdnaW5nIG9yIGtleWJvYXJkLXJlc2l6aW5nLlxuICAgKiBUaGUgb3duZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsYW1waW5nLlxuICAgKi9cbiAgb25XaWR0aENoYW5nZTogKHdpZHRoOiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBEb3VibGUtY2xpY2sgcmVzZXQuICovXG4gIG9uUmVzZXQ/OiAoKSA9PiB2b2lkO1xuICAnYXJpYS1sYWJlbCc6IHN0cmluZztcbiAgJ2FyaWEtY29udHJvbHMnPzogc3RyaW5nO1xuICAnYXJpYS12YWx1ZW1pbic/OiBudW1iZXI7XG4gICdhcmlhLXZhbHVlbWF4Jz86IG51bWJlcjtcbiAgJ2FyaWEtdmFsdWVub3cnPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIE92ZXJsYXkgZHJhZyBoYW5kbGUgc3RyYWRkbGluZyBhIHBhbmVsIGVkZ2U6IGFuIGludmlzaWJsZSBzdHJpcCBvdmVyIHRoZVxuICogcGFuZWwncyBib3JkZXIgd2hvc2UgY2VudGVyIGxpbmUgaGlnaGxpZ2h0cyBvbiBob3Zlci9kcmFnLCB3aXRoXG4gKiBkb3VibGUtY2xpY2sgcmVzZXQsIHBvaW50ZXItY2FwdHVyZSBkcmFnZ2luZyAod29ya3Mgd2l0aCB0b3VjaC9wZW4sIG5vXG4gKiBnaG9zdCBpbWFnZSksIGFuZCBrZXlib2FyZC9BUklBIHdpbmRvdy1zcGxpdHRlciBzdXBwb3J0LlxuICpcbiAqIFRoZSBwYW5lbCdzIHBvc2l0aW9uaW5nIGFuY2VzdG9yIG11c3Qgbm90IGNsaXAgb3ZlcmZsb3cg4oCUIHRoZSBzdHJpcCBoYW5nc1xuICogfjhweCBwYXN0IHRoZSBwYW5lbCBlZGdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRHJhZ2dhYmxlQm9yZGVyKHtcbiAgZWxlbWVudCxcbiAgcG9zaXRpb24sXG4gIG9uV2lkdGhDaGFuZ2UsXG4gIG9uUmVzZXQsXG4gICdhcmlhLWxhYmVsJzogYXJpYUxhYmVsLFxuICAnYXJpYS1jb250cm9scyc6IGFyaWFDb250cm9scyxcbiAgJ2FyaWEtdmFsdWVtaW4nOiBhcmlhVmFsdWVNaW4sXG4gICdhcmlhLXZhbHVlbWF4JzogYXJpYVZhbHVlTWF4LFxuICAnYXJpYS12YWx1ZW5vdyc6IGFyaWFWYWx1ZU5vdyxcbn06IERyYWdnYWJsZUJvcmRlclByb3BzKSB7XG4gIGNvbnN0IFtpc0RyYWdnaW5nLCBzZXRJc0RyYWdnaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgcG9pbnRlcklkUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBzdGFydFhSZWYgPSB1c2VSZWYoMCk7XG4gIGNvbnN0IHN0YXJ0V2lkdGhSZWYgPSB1c2VSZWYoMCk7XG4gIGNvbnN0IHBlbmRpbmdXaWR0aFJlZiA9IHVzZVJlZigwKTtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBtb3ZlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGxhc3REcmFnRW5kQXRSZWYgPSB1c2VSZWYoMCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50KSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vIFN1cHByZXNzIHRleHQgc2VsZWN0aW9uIGZvciB0aGUgZHVyYXRpb24gb2YgYSBkcmFnLiBFZmZlY3QgY2xlYW51cCBhbHNvXG4gIC8vIGNvdmVycyB0aGUgaGFuZGxlIHVubW91bnRpbmcgbWlkLWRyYWcgKGUuZy4gRXNjYXBlIGNsb3NpbmcgdGhlIHBhbmVsKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjtcbiAgICBjb25zdCBwcmV2aW91cyA9IGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdDtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9IHByZXZpb3VzO1xuICAgIH07XG4gIH0sIFtpc0RyYWdnaW5nXSk7XG5cbiAgY29uc3Qgc3RvcERyYWcgPSAoKSA9PiB7XG4gICAgcG9pbnRlcklkUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIHNldElzRHJhZ2dpbmcoZmFsc2UpO1xuICAgIGlmIChyYWZSZWYuY3VycmVudCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgLy8gRmx1c2ggdGhlIGZpbmFsIHBvc2l0aW9uIHRoYXQgd2FzIHN0aWxsIHdhaXRpbmcgb24gdGhlIG5leHQgZnJhbWUuXG4gICAgICBpZiAobW92ZWRSZWYuY3VycmVudCkgb25XaWR0aENoYW5nZShwZW5kaW5nV2lkdGhSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIGlmIChtb3ZlZFJlZi5jdXJyZW50KSB7XG4gICAgICBtb3ZlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBsYXN0RHJhZ0VuZEF0UmVmLmN1cnJlbnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUG9pbnRlckRvd24gPSAoZTogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgLy8gSWdub3JlIHNlY29uZGFyeSBwb2ludGVycyAoZS5nLiBhIHNlY29uZCBmaW5nZXIpIHdoaWxlIGEgZHJhZyBpcyBhY3RpdmVcbiAgICAvLyBzbyB0aGV5IGNhbid0IHJlLWJhc2VsaW5lIHRoZSBnZXN0dXJlLlxuICAgIGlmIChwb2ludGVySWRSZWYuY3VycmVudCAhPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gZWxlbWVudC5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAoZS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyAmJiBlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIGUuY3VycmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgcG9pbnRlcklkUmVmLmN1cnJlbnQgPSBlLnBvaW50ZXJJZDtcbiAgICBzdGFydFhSZWYuY3VycmVudCA9IGUuY2xpZW50WDtcbiAgICBzdGFydFdpZHRoUmVmLmN1cnJlbnQgPSBlbC5vZmZzZXRXaWR0aDtcbiAgICBtb3ZlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgc2V0SXNEcmFnZ2luZyh0cnVlKTtcbiAgfTtcblxuICAvLyBQb2ludGVyIGNhcHR1cmUgcm91dGVzIG1vdmUvdXAgZXZlbnRzIHRvIHRoZSBzdHJpcCBpdHNlbGYsIHNvIG5vXG4gIC8vIGRvY3VtZW50LWxldmVsIGxpc3RlbmVycyBhcmUgbmVlZGVkLlxuICBjb25zdCBoYW5kbGVQb2ludGVyTW92ZSA9IChlOiBSZWFjdFBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBpZiAocG9pbnRlcklkUmVmLmN1cnJlbnQgIT09IGUucG9pbnRlcklkKSByZXR1cm47XG4gICAgaWYgKE1hdGguYWJzKGUuY2xpZW50WCAtIHN0YXJ0WFJlZi5jdXJyZW50KSA+IDQpIHtcbiAgICAgIG1vdmVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBkZWx0YSA9XG4gICAgICBwb3NpdGlvbiA9PT0gJ2xlZnQnXG4gICAgICAgID8gc3RhcnRYUmVmLmN1cnJlbnQgLSBlLmNsaWVudFhcbiAgICAgICAgOiBlLmNsaWVudFggLSBzdGFydFhSZWYuY3VycmVudDtcbiAgICBwZW5kaW5nV2lkdGhSZWYuY3VycmVudCA9IHN0YXJ0V2lkdGhSZWYuY3VycmVudCArIGRlbHRhO1xuICAgIGlmICghcmFmUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBvbldpZHRoQ2hhbmdlKHBlbmRpbmdXaWR0aFJlZi5jdXJyZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyRW5kID0gKGU6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmIChwb2ludGVySWRSZWYuY3VycmVudCAhPT0gZS5wb2ludGVySWQpIHJldHVybjtcbiAgICBzdG9wRHJhZygpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUxvc3RQb2ludGVyQ2FwdHVyZSA9IChlOiBSZWFjdFBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBpZiAocG9pbnRlcklkUmVmLmN1cnJlbnQgIT09IG51bGwgJiYgZS5wb2ludGVySWQgIT09IHBvaW50ZXJJZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0b3BEcmFnKCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRG91YmxlQ2xpY2sgPSAoKSA9PiB7XG4gICAgLy8gUG9pbnRlci1jYXB0dXJlIGRyYWdzIHN0aWxsIGVtaXQgY2xpY2svZGJsY2xpY2sgKHVubGlrZSBIVE1MNSBkcmFnKSwgc29cbiAgICAvLyBhIGRibGNsaWNrIGR1cmluZyBvciByaWdodCBhZnRlciBhIHJlYWwgZHJhZyBpcyB0d28gcmVzaXplIG51ZGdlcywgbm90XG4gICAgLy8gYSByZXNldCByZXF1ZXN0LlxuICAgIGlmIChcbiAgICAgIG1vdmVkUmVmLmN1cnJlbnQgfHxcbiAgICAgIHBlcmZvcm1hbmNlLm5vdygpIC0gbGFzdERyYWdFbmRBdFJlZi5jdXJyZW50IDwgNTAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uUmVzZXQ/LigpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZTogUmVhY3RLZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IGVsID0gZWxlbWVudC5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gZS5zaGlmdEtleSA/IDY0IDogMTY7XG4gICAgLy8gQXJyb3dzIG1vdmUgdGhlIGJvcmRlciBpbiBzY3JlZW4gZGlyZWN0aW9uOiBmb3IgYSBsZWZ0LWVkZ2UgYm9yZGVyLFxuICAgIC8vIEFycm93TGVmdCBncm93cyB0aGUgcGFuZWwuXG4gICAgY29uc3QgZ3JvdyA9IHBvc2l0aW9uID09PSAnbGVmdCcgPyAxIDogLTE7XG4gICAgbGV0IG5leHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgIG5leHQgPSBlbC5vZmZzZXRXaWR0aCArIGdyb3cgKiBzdGVwO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgbmV4dCA9IGVsLm9mZnNldFdpZHRoIC0gZ3JvdyAqIHN0ZXA7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnICYmIGFyaWFWYWx1ZU1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXh0ID0gYXJpYVZhbHVlTWluO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbmQnICYmIGFyaWFWYWx1ZU1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXh0ID0gYXJpYVZhbHVlTWF4O1xuICAgIH1cbiAgICBpZiAobmV4dCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBvbldpZHRoQ2hhbmdlKG5leHQpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvYTExeS91c2VTZW1hbnRpY0VsZW1lbnRzOiB0aGUgV0FJLUFSSUEgd2luZG93LXNwbGl0dGVyIHBhdHRlcm4gcmVxdWlyZXMgYSBmb2N1c2FibGUgZGl2IHdpdGggcm9sZT1zZXBhcmF0b3I7IDxocj4gY2Fubm90IHJlY2VpdmUgZm9jdXMgb3IgZHJhZyBpbnRlcmFjdGlvbnNcbiAgICA8ZGl2XG4gICAgICByb2xlPVwic2VwYXJhdG9yXCJcbiAgICAgIGFyaWEtb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICBhcmlhLWxhYmVsPXthcmlhTGFiZWx9XG4gICAgICBhcmlhLWNvbnRyb2xzPXthcmlhQ29udHJvbHN9XG4gICAgICBhcmlhLXZhbHVlbWluPXthcmlhVmFsdWVNaW59XG4gICAgICBhcmlhLXZhbHVlbWF4PXthcmlhVmFsdWVNYXh9XG4gICAgICBhcmlhLXZhbHVlbm93PXthcmlhVmFsdWVOb3d9XG4gICAgICB0YWJJbmRleD17MH1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncm91cCBhYnNvbHV0ZSBpbnNldC15LTAgei0xMCB3LVsxN3B4XSBjdXJzb3ItY29sLXJlc2l6ZSB0b3VjaC1ub25lIG91dGxpbmUtbm9uZScsXG4gICAgICAgIHBvc2l0aW9uID09PSAnbGVmdCcgPyAnLWxlZnQtMicgOiAnLXJpZ2h0LTInXG4gICAgICApfVxuICAgICAgb25Qb2ludGVyRG93bj17aGFuZGxlUG9pbnRlckRvd259XG4gICAgICBvblBvaW50ZXJNb3ZlPXtoYW5kbGVQb2ludGVyTW92ZX1cbiAgICAgIG9uUG9pbnRlclVwPXtoYW5kbGVQb2ludGVyRW5kfVxuICAgICAgb25Qb2ludGVyQ2FuY2VsPXtoYW5kbGVQb2ludGVyRW5kfVxuICAgICAgb25Mb3N0UG9pbnRlckNhcHR1cmU9e2hhbmRsZUxvc3RQb2ludGVyQ2FwdHVyZX1cbiAgICAgIG9uRG91YmxlQ2xpY2s9e2hhbmRsZURvdWJsZUNsaWNrfVxuICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgID5cbiAgICAgIHsvKiBDZW50ZXIgbGluZTogc2l0cyBleGFjdGx5IG92ZXIgdGhlIHBhbmVsJ3MgMXB4IGJvcmRlciBhbmQgaGlnaGxpZ2h0c1xuICAgICAgICAgIG9uIGhvdmVyL2RyYWcvZm9jdXMgKGRlbGF5ZWQgc28gaW5jaWRlbnRhbCBtb3VzZS1vdmVycyBkb24ndCBmbGFzaCkuXG4gICAgICAgICAgcG9pbnRlci1ldmVudHMtbm9uZSBpcyBsb2FkLWJlYXJpbmc6IHdpdGhvdXQgaXQgdGhpcyAxcHggbGluZSBpcyBhXG4gICAgICAgICAgaGl0IHRhcmdldCwgc28gYSBkb3VibGUtY2xpY2sgYWltZWQgYXQgdGhlIGxpbmUgbGFuZHMgb25lIGNsaWNrIG9uXG4gICAgICAgICAgdGhlIGxpbmUgYW5kIChhZnRlciBzdWItcGl4ZWwgaml0dGVyKSB0aGUgb3RoZXIgb24gdGhlIHN0cmlwLiBBXG4gICAgICAgICAgbmF0aXZlIGRibGNsaWNrIG9ubHkgZmlyZXMgd2hlbiBib3RoIGNsaWNrcyBzaGFyZSBhIHRhcmdldCwgc28gdGhlXG4gICAgICAgICAgcmVzZXQgc2lsZW50bHkgZmFpbHMgb24gdGhlIGxpbmUgYnV0IHdvcmtzIGp1c3QgYmVzaWRlIGl0LiBLZWVwaW5nXG4gICAgICAgICAgdGhlIGxpbmUgaW5lcnQgbWFrZXMgdGhlIHNlcGFyYXRvciBkaXYgdGhlIHNvbGUgdGFyZ2V0IGV2ZXJ5d2hlcmUuICovfVxuICAgICAgPHNwYW5cbiAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0xLzIgdy1weCAtdHJhbnNsYXRlLXgtMS8yIGJnLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIGRlbGF5LTc1IGR1cmF0aW9uLTEwMCcsXG4gICAgICAgICAgJ2dyb3VwLWhvdmVyOmJnLWdyYXktNTAwIGdyb3VwLWZvY3VzLXZpc2libGU6YmctW3ZhcigtLWRzLWZvY3VzLWNvbG9yKV0nLFxuICAgICAgICAgIGlzRHJhZ2dpbmcgJiYgJ2JnLWdyYXktNTAwJ1xuICAgICAgICApfVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { type SpanSearchResult } from '../search';
2
+ import type { Span } from '../types';
3
+ declare const EventList: ({ spans, activeSpanId, searchResult, onSelectSpan, }: {
4
+ spans: Span[];
5
+ activeSpanId: string | null;
6
+ searchResult: SpanSearchResult;
7
+ onSelectSpan: (spanId: string) => void;
8
+ }) => import("react/jsx-runtime").JSX.Element;
9
+ export default EventList;
10
+ //# sourceMappingURL=event-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-list.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/event-list.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AA8FrC,QAAA,MAAM,SAAS,GAAI,sDAKhB;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,4CA0BA,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Circle } from 'lucide-react';
3
+ import { useRef } from 'react';
4
+ import { cn } from '../../../lib/cn';
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/tooltip';
6
+ import { SleepIcon, StepForwardIcon, WebhookIcon, WorkflowIcon, } from '../icons';
7
+ import { isSpanDimmedBySearch } from '../search';
8
+ import { formatDurationPrecise } from '../util/timing';
9
+ import { getSpanDurationMs, isSpanErrored } from '../utils';
10
+ import { MiddleTruncate } from './middle-truncate/middle-truncate';
11
+ import { ROW_HEIGHT_PX, useRowWindow } from './use-row-window';
12
+ const eventStyles = {
13
+ run: { icon: WorkflowIcon, className: 'text-blue-900', label: 'Workflow' },
14
+ step: { icon: StepForwardIcon, className: 'text-green-900', label: 'Step' },
15
+ hook: { icon: WebhookIcon, className: 'text-gray-900', label: 'Hook' },
16
+ sleep: { icon: SleepIcon, className: 'text-gray-900', label: 'Sleep' },
17
+ };
18
+ const defaultStyle = {
19
+ icon: Circle,
20
+ className: 'text-gray-900',
21
+ label: 'Event',
22
+ };
23
+ const ROW_HEIGHT_CLASS = 'h-10';
24
+ function getEventStyle(resource, isErrored) {
25
+ const style = eventStyles[resource] ?? defaultStyle;
26
+ return {
27
+ icon: style.icon,
28
+ className: cn(isErrored ? 'text-red-900' : style.className),
29
+ label: style.label,
30
+ };
31
+ }
32
+ const EventRow = ({ span, isSelected, isDimmed, onSelectSpan, }) => {
33
+ const durationMs = getSpanDurationMs(span);
34
+ const isErrored = isSpanErrored(span);
35
+ const { icon: Icon, className: tagClassName, label: iconLabel, } = getEventStyle(span.resource, isErrored);
36
+ return (_jsx("li", { className: cn('relative overflow-clip group transition-opacity', ROW_HEIGHT_CLASS, isDimmed && 'opacity-35'), role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, onClick: () => onSelectSpan(span.spanId), children: _jsx("div", { className: "h-full hover:bg-gray-100 group-aria-selected:bg-gray-100 group-aria-selected:hover:bg-gray-200", children: _jsxs("div", { className: "flex h-full min-w-0 items-center pl-4 pr-2", children: [_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [_jsxs(Tooltip, { delayDuration: 500, children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: cn('shrink-0', tagClassName), children: _jsx(Icon, { className: "w-4 h-4" }) }) }), _jsx(TooltipContent, { side: "top", children: iconLabel })] }), _jsx("span", { className: "min-w-0 text-label-14", children: _jsx(MiddleTruncate, { value: span.name }) })] }), _jsx("div", { className: "ml-2 shrink-0", children: _jsx("span", { className: "text-label-14 text-gray-900 tabular-nums", children: formatDurationPrecise(durationMs) }) })] }) }) }));
37
+ };
38
+ const EventList = ({ spans, activeSpanId, searchResult, onSelectSpan, }) => {
39
+ const listRef = useRef(null);
40
+ const { start, end } = useRowWindow(listRef, spans.length, ROW_HEIGHT_PX);
41
+ return (_jsx("ul", { ref: listRef, id: "event-list", role: "tree", className: "block min-h-0 overflow-visible divide-y divide-gray-400 border-b border-gray-400", style: {
42
+ paddingTop: start * ROW_HEIGHT_PX,
43
+ paddingBottom: (spans.length - end) * ROW_HEIGHT_PX,
44
+ }, children: spans.slice(start, end).map((span) => (_jsx(EventRow, { span: span, isSelected: span.spanId === activeSpanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelectSpan: onSelectSpan }, span.spanId))) }));
45
+ };
46
+ export default EventList;
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL2V2ZW50LWxpc3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEdBQ2IsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG9CQUFvQixFQUF5QixNQUFNLFdBQVcsQ0FBQztBQUV4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUS9ELE1BQU0sV0FBVyxHQUErQjtJQUM5QyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtJQUMxRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzNFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxL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QUNaLEVBQUUsRUFBQyxZQUFZLEVBQ2YsSUFBSSxFQUFDLE1BQU0sRUFDWCxTQUFTLEVBQUMsa0ZBQWtGLEVBQzVGLEtBQUssRUFBRTtZQUNMLFVBQVUsRUFBRSxLQUFLLEdBQUcsYUFBYTtZQUNqQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLGFBQWE7U0FDcEQsWUFFQSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQ3JDLEtBQUMsUUFBUSxJQUVQLElBQUksRUFBRSxJQUFJLEVBQ1YsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEtBQUssWUFBWSxFQUN4QyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFDekQsWUFBWSxFQUFFLFlBQVksSUFKckIsSUFBSSxDQUFDLE1BQU0sQ0FLaEIsQ0FDSCxDQUFDLEdBQ0MsQ0FDTixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsZUFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaXJjbGUgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi8uLi9saWIvY24nO1xuaW1wb3J0IHsgVG9vbHRpcCwgVG9vbHRpcENvbnRlbnQsIFRvb2x0aXBUcmlnZ2VyIH0gZnJvbSAnLi4vLi4vdWkvdG9vbHRpcCc7XG5pbXBvcnQge1xuICBTbGVlcEljb24sXG4gIFN0ZXBGb3J3YXJkSWNvbixcbiAgV2ViaG9va0ljb24sXG4gIFdvcmtmbG93SWNvbixcbn0gZnJvbSAnLi4vaWNvbnMnO1xuaW1wb3J0IHsgaXNTcGFuRGltbWVkQnlTZWFyY2gsIHR5cGUgU3BhblNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL3NlYXJjaCc7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvblByZWNpc2UgfSBmcm9tICcuLi91dGlsL3RpbWluZyc7XG5pbXBvcnQgeyBnZXRTcGFuRHVyYXRpb25NcywgaXNTcGFuRXJyb3JlZCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IE1pZGRsZVRydW5jYXRlIH0gZnJvbSAnLi9taWRkbGUtdHJ1bmNhdGUvbWlkZGxlLXRydW5jYXRlJztcbmltcG9ydCB7IFJPV19IRUlHSFRfUFgsIHVzZVJvd1dpbmRvdyB9IGZyb20gJy4vdXNlLXJvdy13aW5kb3cnO1xuXG5pbnRlcmZhY2UgRXZlbnRTdHlsZSB7XG4gIGljb246IFJlYWN0LkNvbXBvbmVudFR5cGU8eyBjbGFzc05hbWU/OiBzdHJpbmcgfT47XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG5jb25zdCBldmVudFN0eWxlczogUmVjb3JkPHN0cmluZywgRXZlbnRTdHlsZT4gPSB7XG4gIHJ1bjogeyBpY29uOiBXb3JrZmxvd0ljb24sIGNsYXNzTmFtZTogJ3RleHQtYmx1ZS05MDAnLCBsYWJlbDogJ1dvcmtmbG93JyB9LFxuICBzdGVwOiB7IGljb246IFN0ZXBGb3J3YXJkSWNvbiwgY2xhc3NOYW1lOiAndGV4dC1ncmVlbi05MDAnLCBsYWJlbDogJ1N0ZXAnIH0sXG4gIGhvb2s6IHsgaWNvbjogV2ViaG9va0ljb24sIGNsYXNzTmFtZTogJ3RleHQtZ3JheS05MDAnLCBsYWJlbDogJ0hvb2snIH0sXG4gIHNsZWVwOiB7IGljb246IFNsZWVwSWNvbiwgY2xhc3NOYW1lOiAndGV4dC1ncmF5LTkwMCcsIGxhYmVsOiAnU2xlZXAnIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0U3R5bGU6IEV2ZW50U3R5bGUgPSB7XG4gIGljb246IENpcmNsZSxcbiAgY2xhc3NOYW1lOiAndGV4dC1ncmF5LTkwMCcsXG4gIGxhYmVsOiAnRXZlbnQnLFxufTtcblxuY29uc3QgUk9XX0hFSUdIVF9DTEFTUyA9ICdoLTEwJztcblxuZnVuY3Rpb24gZ2V0RXZlbnRTdHlsZShyZXNvdXJjZTogc3RyaW5nLCBpc0Vycm9yZWQ6IGJvb2xlYW4pOiBFdmVudFN0eWxlIHtcbiAgY29uc3Qgc3R5bGUgPSBldmVudFN0eWxlc1tyZXNvdXJjZV0gPz8gZGVmYXVsdFN0eWxlO1xuICByZXR1cm4ge1xuICAgIGljb246IHN0eWxlLmljb24sXG4gICAgY2xhc3NOYW1lOiBjbihpc0Vycm9yZWQgPyAndGV4dC1yZWQtOTAwJyA6IHN0eWxlLmNsYXNzTmFtZSksXG4gICAgbGFiZWw6IHN0eWxlLmxhYmVsLFxuICB9O1xufVxuXG5jb25zdCBFdmVudFJvdyA9ICh7XG4gIHNwYW4sXG4gIGlzU2VsZWN0ZWQsXG4gIGlzRGltbWVkLFxuICBvblNlbGVjdFNwYW4sXG59OiB7XG4gIHNwYW46IFNwYW47XG4gIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGlzRGltbWVkPzogYm9vbGVhbjtcbiAgb25TZWxlY3RTcGFuOiAoc3BhbklkOiBzdHJpbmcpID0+IHZvaWQ7XG59KSA9PiB7XG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBnZXRTcGFuRHVyYXRpb25NcyhzcGFuKTtcbiAgY29uc3QgaXNFcnJvcmVkID0gaXNTcGFuRXJyb3JlZChzcGFuKTtcbiAgY29uc3Qge1xuICAgIGljb246IEljb24sXG4gICAgY2xhc3NOYW1lOiB0YWdDbGFzc05hbWUsXG4gICAgbGFiZWw6IGljb25MYWJlbCxcbiAgfSA9IGdldEV2ZW50U3R5bGUoc3Bhbi5yZXNvdXJjZSwgaXNFcnJvcmVkKTtcblxuICByZXR1cm4gKFxuICAgIDxsaVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ3JlbGF0aXZlIG92ZXJmbG93LWNsaXAgZ3JvdXAgdHJhbnNpdGlvbi1vcGFjaXR5JyxcbiAgICAgICAgUk9XX0hFSUdIVF9DTEFTUyxcbiAgICAgICAgaXNEaW1tZWQgJiYgJ29wYWNpdHktMzUnXG4gICAgICApfVxuICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgIGFyaWEtc2VsZWN0ZWQ9e2lzU2VsZWN0ZWR9XG4gICAgICBhcmlhLWV4cGFuZGVkPXtpc1NlbGVjdGVkfVxuICAgICAgYXJpYS1sZXZlbD17MX1cbiAgICAgIG9uQ2xpY2s9eygpID0+IG9uU2VsZWN0U3BhbihzcGFuLnNwYW5JZCl9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgaG92ZXI6YmctZ3JheS0xMDAgZ3JvdXAtYXJpYS1zZWxlY3RlZDpiZy1ncmF5LTEwMCBncm91cC1hcmlhLXNlbGVjdGVkOmhvdmVyOmJnLWdyYXktMjAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLWZ1bGwgbWluLXctMCBpdGVtcy1jZW50ZXIgcGwtNCBwci0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1pbi13LTAgZmxleC0xIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPFRvb2x0aXAgZGVsYXlEdXJhdGlvbj17NTAwfT5cbiAgICAgICAgICAgICAgPFRvb2x0aXBUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjbignc2hyaW5rLTAnLCB0YWdDbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICAgIDxJY29uIGNsYXNzTmFtZT1cInctNCBoLTRcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9Ub29sdGlwVHJpZ2dlcj5cbiAgICAgICAgICAgICAgPFRvb2x0aXBDb250ZW50IHNpZGU9XCJ0b3BcIj57aWNvbkxhYmVsfTwvVG9vbHRpcENvbnRlbnQ+XG4gICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtaW4tdy0wIHRleHQtbGFiZWwtMTRcIj5cbiAgICAgICAgICAgICAgPE1pZGRsZVRydW5jYXRlIHZhbHVlPXtzcGFuLm5hbWV9IC8+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtbC0yIHNocmluay0wXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTE0IHRleHQtZ3JheS05MDAgdGFidWxhci1udW1zXCI+XG4gICAgICAgICAgICAgIHtmb3JtYXREdXJhdGlvblByZWNpc2UoZHVyYXRpb25Ncyl9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9saT5cbiAgKTtcbn07XG5cbmNvbnN0IEV2ZW50TGlzdCA9ICh7XG4gIHNwYW5zLFxuICBhY3RpdmVTcGFuSWQsXG4gIHNlYXJjaFJlc3VsdCxcbiAgb25TZWxlY3RTcGFuLFxufToge1xuICBzcGFuczogU3BhbltdO1xuICBhY3RpdmVTcGFuSWQ6IHN0cmluZyB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU3BhblNlYXJjaFJlc3VsdDtcbiAgb25TZWxlY3RTcGFuOiAoc3BhbklkOiBzdHJpbmcpID0+IHZvaWQ7XG59KSA9PiB7XG4gIGNvbnN0IGxpc3RSZWYgPSB1c2VSZWY8SFRNTFVMaXN0RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdXNlUm93V2luZG93KGxpc3RSZWYsIHNwYW5zLmxlbmd0aCwgUk9XX0hFSUdIVF9QWCk7XG5cbiAgcmV0dXJuIChcbiAgICA8dWxcbiAgICAgIHJlZj17bGlzdFJlZn1cbiAgICAgIGlkPVwiZXZlbnQtbGlzdFwiXG4gICAgICByb2xlPVwidHJlZVwiXG4gICAgICBjbGFzc05hbWU9XCJibG9jayBtaW4taC0wIG92ZXJmbG93LXZpc2libGUgZGl2aWRlLXkgZGl2aWRlLWdyYXktNDAwIGJvcmRlci1iIGJvcmRlci1ncmF5LTQwMFwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwYWRkaW5nVG9wOiBzdGFydCAqIFJPV19IRUlHSFRfUFgsXG4gICAgICAgIHBhZGRpbmdCb3R0b206IChzcGFucy5sZW5ndGggLSBlbmQpICogUk9XX0hFSUdIVF9QWCxcbiAgICAgIH19XG4gICAgPlxuICAgICAge3NwYW5zLnNsaWNlKHN0YXJ0LCBlbmQpLm1hcCgoc3BhbikgPT4gKFxuICAgICAgICA8RXZlbnRSb3dcbiAgICAgICAgICBrZXk9e3NwYW4uc3BhbklkfVxuICAgICAgICAgIHNwYW49e3NwYW59XG4gICAgICAgICAgaXNTZWxlY3RlZD17c3Bhbi5zcGFuSWQgPT09IGFjdGl2ZVNwYW5JZH1cbiAgICAgICAgICBpc0RpbW1lZD17aXNTcGFuRGltbWVkQnlTZWFyY2goc3Bhbi5zcGFuSWQsIHNlYXJjaFJlc3VsdCl9XG4gICAgICAgICAgb25TZWxlY3RTcGFuPXtvblNlbGVjdFNwYW59XG4gICAgICAgIC8+XG4gICAgICApKX1cbiAgICA8L3VsPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRMaXN0O1xuIl19
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-selection.d.ts","sourceRoot":"","sources":["../../../../../src/components/trace-viewer/components/middle-truncate/copy-selection.ts"],"names":[],"mappings":"AAEA,UAAU,gCAAgC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,iDAAiD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iBAAS,yBAAyB,CAAC,EACjC,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,KAAK,GACN,EAAE,gCAAgC,GAAG,MAAM,GAAG,IAAI,CAqClD;AAED,iBAAS,0CAA0C,CAAC,EAClD,UAAU,EACV,aAAa,EACb,UAAU,EACV,KAAK,GACN,EAAE,iDAAiD,GAAG,MAAM,GAAG,IAAI,CAqCnE;AAED,OAAO,EACL,yBAAyB,EACzB,0CAA0C,GAC3C,CAAC;AACF,YAAY,EACV,iDAAiD,EACjD,gCAAgC,GACjC,CAAC"}