@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.21

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 (321) hide show
  1. package/dist/components/error-boundary.js +1 -1
  2. package/dist/components/event-list-view.d.ts +16 -1
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +196 -85
  5. package/dist/components/hook-actions.js +1 -1
  6. package/dist/components/index.d.ts +4 -0
  7. package/dist/components/index.d.ts.map +1 -1
  8. package/dist/components/index.js +5 -1
  9. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  10. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  11. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  12. package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
  13. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  14. package/dist/components/new-trace-viewer/components/event-list.js +46 -0
  15. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  16. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  17. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  18. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  19. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  20. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  21. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  22. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  23. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  27. package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
  28. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
  29. package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
  30. package/dist/components/new-trace-viewer/components/split-pane.d.ts +15 -0
  31. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  32. package/dist/components/new-trace-viewer/components/split-pane.js +105 -0
  33. package/dist/components/new-trace-viewer/components/timeline.d.ts +36 -0
  34. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  35. package/dist/components/new-trace-viewer/components/timeline.js +254 -0
  36. package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
  37. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  38. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  39. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +19 -0
  40. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
  41. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
  42. package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
  43. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  44. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  45. package/dist/components/new-trace-viewer/context.js +47 -0
  46. package/dist/components/new-trace-viewer/icons.d.ts +6 -0
  47. package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
  48. package/dist/components/new-trace-viewer/icons.js +15 -0
  49. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  50. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  51. package/dist/components/new-trace-viewer/search.js +134 -0
  52. package/dist/components/new-trace-viewer/trace-viewer.d.ts +11 -0
  53. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
  54. package/dist/components/new-trace-viewer/trace-viewer.js +462 -0
  55. package/dist/components/new-trace-viewer/types.d.ts +3 -0
  56. package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
  57. package/dist/components/new-trace-viewer/types.js +2 -0
  58. package/dist/components/new-trace-viewer/utils.d.ts +61 -0
  59. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  60. package/dist/components/new-trace-viewer/utils.js +345 -0
  61. package/dist/components/run-trace-view.js +1 -1
  62. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  63. package/dist/components/sidebar/attribute-panel.js +129 -102
  64. package/dist/components/sidebar/attributes-block.d.ts +28 -0
  65. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  66. package/dist/components/sidebar/attributes-block.js +81 -0
  67. package/dist/components/sidebar/conversation-view.js +1 -1
  68. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  69. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  70. package/dist/components/sidebar/copyable-data-block.js +16 -15
  71. package/dist/components/sidebar/detail-card.d.ts +5 -6
  72. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  73. package/dist/components/sidebar/detail-card.js +32 -16
  74. package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
  75. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  76. package/dist/components/sidebar/entity-detail-panel.js +17 -35
  77. package/dist/components/sidebar/events-list.d.ts +3 -1
  78. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  79. package/dist/components/sidebar/events-list.js +36 -22
  80. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  81. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  82. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  83. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  84. package/dist/components/sidebar/span-detail-merge.d.ts +16 -0
  85. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  86. package/dist/components/sidebar/span-detail-merge.js +53 -0
  87. package/dist/components/stream-viewer.d.ts +1 -1
  88. package/dist/components/stream-viewer.d.ts.map +1 -1
  89. package/dist/components/stream-viewer.js +3 -27
  90. package/dist/components/trace-viewer/components/map.js +1 -1
  91. package/dist/components/trace-viewer/components/markers.js +1 -1
  92. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  93. package/dist/components/trace-viewer/components/node.js +2 -1
  94. package/dist/components/trace-viewer/components/search-input.js +1 -1
  95. package/dist/components/trace-viewer/components/search.js +1 -1
  96. package/dist/components/trace-viewer/components/span-content.js +1 -1
  97. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  98. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  99. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  100. package/dist/components/trace-viewer/components/ui.js +1 -1
  101. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  102. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  103. package/dist/components/trace-viewer/context.js +1 -1
  104. package/dist/components/trace-viewer/index.js +1 -1
  105. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  106. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  107. package/dist/components/trace-viewer/types.js +1 -1
  108. package/dist/components/trace-viewer/util/constants.js +1 -1
  109. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  110. package/dist/components/trace-viewer/util/timing.d.ts +3 -3
  111. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  112. package/dist/components/trace-viewer/util/timing.js +8 -11
  113. package/dist/components/trace-viewer/util/tree.js +1 -1
  114. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  115. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  116. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  117. package/dist/components/trace-viewer/worker.js +1 -1
  118. package/dist/components/trace-viewer-new.d.ts +14 -0
  119. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  120. package/dist/components/trace-viewer-new.js +21 -0
  121. package/dist/components/ui/alert.js +1 -1
  122. package/dist/components/ui/button.d.ts +10 -0
  123. package/dist/components/ui/button.d.ts.map +1 -0
  124. package/dist/components/ui/button.js +46 -0
  125. package/dist/components/ui/card.js +1 -1
  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 +22 -0
  130. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  131. package/dist/components/ui/data-inspector.js +103 -13
  132. package/dist/components/ui/decrypt-button.js +1 -1
  133. package/dist/components/ui/error-card.js +1 -1
  134. package/dist/components/ui/error-stack-block.d.ts +17 -10
  135. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  136. package/dist/components/ui/error-stack-block.js +49 -30
  137. package/dist/components/ui/icon-button.d.ts +19 -0
  138. package/dist/components/ui/icon-button.d.ts.map +1 -0
  139. package/dist/components/ui/icon-button.js +29 -0
  140. package/dist/components/ui/inspector-theme.d.ts +9 -10
  141. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  142. package/dist/components/ui/inspector-theme.js +39 -72
  143. package/dist/components/ui/kbd.d.ts +6 -0
  144. package/dist/components/ui/kbd.d.ts.map +1 -0
  145. package/dist/components/ui/kbd.js +6 -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 +1 -1
  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-trace-view.d.ts +1 -3
  157. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  158. package/dist/components/workflow-trace-view.js +11 -13
  159. package/dist/components/workflow-traces/event-colors.d.ts +1 -0
  160. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  161. package/dist/components/workflow-traces/event-colors.js +12 -1
  162. package/dist/components/workflow-traces/trace-colors.js +1 -1
  163. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
  164. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  165. package/dist/components/workflow-traces/trace-span-construction.js +19 -5
  166. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  167. package/dist/hooks/use-dark-mode.js +1 -1
  168. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  169. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  170. package/dist/hooks/use-intersection-observer.js +29 -0
  171. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  172. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  173. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  174. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  175. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  176. package/dist/hooks/use-reduced-motion.js +29 -0
  177. package/dist/index.d.ts +3 -1
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +3 -2
  180. package/dist/lib/event-analysis.js +1 -1
  181. package/dist/lib/event-materialization.js +1 -1
  182. package/dist/lib/exact-event-search-id.d.ts +25 -0
  183. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  184. package/dist/lib/exact-event-search-id.js +39 -0
  185. package/dist/lib/hydration.d.ts +6 -0
  186. package/dist/lib/hydration.d.ts.map +1 -1
  187. package/dist/lib/hydration.js +154 -2
  188. package/dist/lib/stream-display.d.ts +18 -0
  189. package/dist/lib/stream-display.d.ts.map +1 -0
  190. package/dist/lib/stream-display.js +30 -0
  191. package/dist/lib/toast.js +1 -1
  192. package/dist/lib/trace-builder.d.ts +15 -0
  193. package/dist/lib/trace-builder.d.ts.map +1 -1
  194. package/dist/lib/trace-builder.js +29 -3
  195. package/dist/lib/utils.d.ts +20 -9
  196. package/dist/lib/utils.d.ts.map +1 -1
  197. package/dist/lib/utils.js +74 -31
  198. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  199. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  200. package/dist/lib/zstd-browser-decoder.js +41 -0
  201. package/dist/styles.css +484 -1
  202. package/package.json +10 -5
  203. package/src/components/event-list-view.tsx +279 -104
  204. package/src/components/index.ts +7 -0
  205. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  206. package/src/components/new-trace-viewer/components/event-list.tsx +136 -0
  207. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  208. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  209. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  210. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  211. package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
  212. package/src/components/new-trace-viewer/components/split-pane.tsx +198 -0
  213. package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
  214. package/src/components/new-trace-viewer/components/timeline.tsx +744 -0
  215. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +94 -0
  216. package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
  217. package/src/components/new-trace-viewer/context.tsx +90 -0
  218. package/src/components/new-trace-viewer/icons.tsx +79 -0
  219. package/src/components/new-trace-viewer/search.ts +178 -0
  220. package/src/components/new-trace-viewer/trace-viewer.tsx +843 -0
  221. package/src/components/new-trace-viewer/types.ts +2 -0
  222. package/src/components/new-trace-viewer/utils.test.ts +182 -0
  223. package/src/components/new-trace-viewer/utils.ts +519 -0
  224. package/src/components/sidebar/attribute-panel.tsx +194 -240
  225. package/src/components/sidebar/attributes-block.tsx +173 -0
  226. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  227. package/src/components/sidebar/detail-card.tsx +119 -59
  228. package/src/components/sidebar/entity-detail-panel.tsx +55 -111
  229. package/src/components/sidebar/events-list.tsx +85 -96
  230. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  231. package/src/components/sidebar/span-detail-merge.ts +65 -0
  232. package/src/components/stream-viewer.tsx +18 -40
  233. package/src/components/trace-viewer/components/node.tsx +3 -2
  234. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  235. package/src/components/trace-viewer/util/timing.ts +7 -11
  236. package/src/components/trace-viewer-new.tsx +55 -0
  237. package/src/components/ui/button.tsx +68 -0
  238. package/src/components/ui/context-card.tsx +784 -0
  239. package/src/components/ui/data-inspector.tsx +244 -22
  240. package/src/components/ui/error-stack-block.tsx +84 -55
  241. package/src/components/ui/icon-button.tsx +53 -0
  242. package/src/components/ui/inspector-theme.ts +39 -81
  243. package/src/components/ui/kbd.tsx +21 -0
  244. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  245. package/src/components/ui/tooltip.tsx +47 -0
  246. package/src/components/workflow-trace-view.tsx +19 -15
  247. package/src/components/workflow-traces/event-colors.ts +12 -0
  248. package/src/components/workflow-traces/trace-span-construction.ts +24 -5
  249. package/src/hooks/use-intersection-observer.ts +57 -0
  250. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  251. package/src/hooks/use-reduced-motion.ts +34 -0
  252. package/src/index.ts +9 -0
  253. package/src/lib/exact-event-search-id.ts +67 -0
  254. package/src/lib/hydration.ts +166 -1
  255. package/src/lib/stream-display.ts +48 -0
  256. package/src/lib/trace-builder.ts +34 -2
  257. package/src/lib/utils.ts +83 -31
  258. package/src/lib/zstd-browser-decoder.ts +42 -0
  259. package/src/styles.css +484 -1
  260. package/dist/components/error-boundary.js.map +0 -1
  261. package/dist/components/event-list-view.js.map +0 -1
  262. package/dist/components/hook-actions.js.map +0 -1
  263. package/dist/components/index.js.map +0 -1
  264. package/dist/components/run-trace-view.js.map +0 -1
  265. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  266. package/dist/components/sidebar/conversation-view.js.map +0 -1
  267. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  268. package/dist/components/sidebar/detail-card.js.map +0 -1
  269. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  270. package/dist/components/sidebar/events-list.js.map +0 -1
  271. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  272. package/dist/components/stream-viewer.js.map +0 -1
  273. package/dist/components/trace-viewer/components/map.js.map +0 -1
  274. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  275. package/dist/components/trace-viewer/components/node.js.map +0 -1
  276. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  277. package/dist/components/trace-viewer/components/search.js.map +0 -1
  278. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  279. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  280. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  281. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  282. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  283. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  284. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  285. package/dist/components/trace-viewer/context.js.map +0 -1
  286. package/dist/components/trace-viewer/index.js.map +0 -1
  287. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  288. package/dist/components/trace-viewer/types.js.map +0 -1
  289. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  290. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  291. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  292. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  293. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  294. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  295. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  296. package/dist/components/trace-viewer/worker.js.map +0 -1
  297. package/dist/components/ui/alert.js.map +0 -1
  298. package/dist/components/ui/card.js.map +0 -1
  299. package/dist/components/ui/data-inspector.js.map +0 -1
  300. package/dist/components/ui/decrypt-button.js.map +0 -1
  301. package/dist/components/ui/error-card.js.map +0 -1
  302. package/dist/components/ui/error-stack-block.js.map +0 -1
  303. package/dist/components/ui/inspector-theme.js.map +0 -1
  304. package/dist/components/ui/load-more-button.js.map +0 -1
  305. package/dist/components/ui/menu-dropdown.js.map +0 -1
  306. package/dist/components/ui/skeleton.js.map +0 -1
  307. package/dist/components/ui/spinner.js.map +0 -1
  308. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  309. package/dist/components/workflow-trace-view.js.map +0 -1
  310. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  311. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  312. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  313. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  314. package/dist/hooks/use-dark-mode.js.map +0 -1
  315. package/dist/index.js.map +0 -1
  316. package/dist/lib/event-analysis.js.map +0 -1
  317. package/dist/lib/event-materialization.js.map +0 -1
  318. package/dist/lib/hydration.js.map +0 -1
  319. package/dist/lib/toast.js.map +0 -1
  320. package/dist/lib/trace-builder.js.map +0 -1
  321. package/dist/lib/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/components/trace-viewer/context.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,OAAO,EACP,UAAU,EACV,MAAM,GACP,MAAM,OAAO,CAAC;AAYf,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAmM9D,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,EAAE;KACb;IACD,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,EAAE;IACf,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,cAAc,EAAE,GAAG;IACnB,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,cAAc,EAAE,CAAC;IACjB,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;IAC9B,iBAAiB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;IACzC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE;IACpC,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE;IACvB,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAuB,EAAU,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAA0B;IACvE,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,GAAG,EAAE;QACb,OAAO;IACT,CAAC;CACF,CAAC,CAAC;AACH,kBAAkB,CAAC,WAAW,GAAG,oBAAoB,CAAC;AAEtD,MAAM,OAAO,GAAiD,CAC5D,KAAK,EACL,MAAM,EACN,EAAE;IACF,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACZ,KAAK,CAAC,iBAAiB,CAAC,OAAO,GAAG,SAAS,CAAC;YAC5C,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,WAAW,CAC7B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CACnE;aACF,EACD;gBACE,IAAI,EAAE,iBAAiB;aACxB,CACF,CAAC;QACJ,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,CAAC,GAAG,UAAU,CAAC;YAE9D,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;YAExD,IAAI,QAAQ,GAAG;gBACb,GAAG,KAAK;gBACR,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,aAAa,EACX,MAAM,CAAC,KAAK;oBACZ,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC7D,KAAK,CAAC,UAAU;gBACpB,cAAc,EAAE,WAAW;gBAC3B,WAAW,EAAE,WAAW;gBACxB,QAAQ;aACT,CAAC;YAEF,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE;oBAC3B,IAAI,EAAE,iBAAiB;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,GAAG,EACH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAC1C,CAAC;YACF,MAAM,aAAa,GACjB,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAClD,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU;gBAC1B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YAClB,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,aAAa;gBACb,UAAU;aACX,EACD;gBACE,IAAI,EAAE,iBAAiB;aACxB,CACF,CAAC;QACJ,CAAC;QACD,KAAK,WAAW;YACd,OAAO;gBACL,GAAG,KAAK;gBACR,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,KAAK,CAAC,KAAK;aAC3B,EACD;gBACE,IAAI,EAAE,iBAAiB;aACxB,CACF,CAAC;QACJ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,QAAQ,EAAE,IAAI;gBACd,aAAa,EACX,KAAK,CAAC,KAAK;oBACX,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;aAC9D,EACD;gBACE,IAAI,EAAE,iBAAiB;aACxB,CACF,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,OAAO,CAAC,KAAK,EAAE;oBACpB,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,OAAO,CAAC,KAAK,EAAE;gBACpB,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE;oBAC3B,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC9C,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,OAAO,OAAO,CAAC,QAAQ,EAAE;gBACvB,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;QACL,CAAC;QACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,SAAS,GACb,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;YAErE,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,SAAS;gBACT,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC,UAAU;aACpC,EACD;gBACE,IAAI,EAAE,UAAU;aACjB,CACF,CAAC;QACJ,CAAC;QACD,KAAK,UAAU;YACb,OAAO;gBACL,GAAG,KAAK;gBACR,UAAU,EAAE,MAAM,CAAC,KAAK;gBACxB,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK;aACtC,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,KAAK,EAAE;gBACpB,IAAI,EAAE,cAAc;gBACpB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS;gBACxB,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,OAAO,CACZ,OAAO,CAAC,KAAK,EAAE;gBACb,IAAI,EAAE,UAAU;gBAChB,KAAK,EACH,CAAC,KAAK,CAAC,KAAK;oBACV,KAAK,CAAC,cAAc;oBACpB,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9D,IAAI,CAAC,QAAQ;oBACb,KAAK,CAAC,SAAS;aAClB,CAAC,EACF;gBACE,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS;gBAC9C,OAAO,EAAE,CAAC;aACX,CACF,CAAC;QACJ,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;YAEjD,OAAO,OAAO,CACZ,OAAO,CAAC,KAAK,EAAE;gBACb,IAAI,EAAE,UAAU;gBAChB,KAAK,EACH,CAAC,KAAK,CAAC,KAAK;oBACV,KAAK,CAAC,cAAc;oBACpB,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7D,QAAQ;oBACR,KAAK,CAAC,SAAS;aAClB,CAAC,EACF;gBACE,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS;gBAC9D,OAAO,EAAE,CAAC;aACX,CACF,CAAC;QACJ,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;YAC3B,QAAQ,MAAM,CAAC,SAAS,EAAE,CAAC;gBACzB,KAAK,CAAC,CAAC;oBACL,UAAU,IAAI,GAAG,CAAC;oBAClB,MAAM;gBACR,KAAK,CAAC;oBACJ,UAAU,IAAI,IAAI,CAAC;oBACnB,MAAM;gBACR;oBACE,UAAU,GAAG,CAAC,CAAC;oBACf,MAAM;YACV,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;YAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;YAE9C,OAAO,OAAO,CACZ,OAAO,CACL;gBACE,GAAG,KAAK;gBACR,UAAU;gBACV,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG,UAAU;aACpC,EACD;gBACE,IAAI,EAAE,UAAU;aACjB,CACF,EACD;gBACE,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,CAAC,UAAU,GAAG,WAAW,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK;gBACvD,OAAO,EAAE,WAAW,GAAG,GAAG;aAC3B,CACF,CAAC;QACJ,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;YAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,aAAa,EACb,KAAK,CAAC,UAAU;gBACd,CAAC,CAAC;oBACA,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACvE,CAAC;YAEF,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,UAAU;gBACV,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG,UAAU;aACpC,EACD;gBACE,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CACF,CAAC;QACJ,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,KAAK,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC1C,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,UAAU,EAAE,QAAQ,GAAG,KAAK,CAAC,SAAS;aACvC,CAAC;QACJ,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;YAC5C,IAAI,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAE7B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAEpC,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;YACnD,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;YAChC,MAAM,QAAQ,GACZ,CAAC,SAAS,GAAG,aAAa,GAAG,gBAAgB,CAAC;gBAC9C,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;YAC7B,MAAM,MAAM,GACV,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC;YAE1E,KAAK,CAAC,iBAAiB,CAAC,OAAO,GAAG;gBAChC,OAAO;gBACP,OAAO;gBACP,UAAU;gBACV,SAAS;gBACT,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,KAAK;gBAC1D,OAAO,EACL,KAAK,CAAC,IAAI,CAAC,SAAS;oBACpB,CAAC,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,KAAK;gBAClD,QAAQ;gBACR,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC;YAEF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YACvD,MAAM,aAAa,GACjB,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ;gBACnD,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU;gBAChC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YAClB,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa;aACd,EACD;gBACE,IAAI,EAAE,iBAAiB;aACxB,CACF,CAAC;QACJ,CAAC;QACD,KAAK,aAAa;YAChB,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvC,OAAO;gBACL,GAAG,KAAK;aACT,CAAC;QACJ,KAAK,YAAY;YACf,mEAAmE;YACnE,mDAAmD;YACnD,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvC,OAAO,OAAO,CACZ;gBACE,GAAG,KAAK;gBACR,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,WAAW,CAC7B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CACnE;aACF,EACD;gBACE,IAAI,EAAE,iBAAiB;aACxB,CACF,CAAC;IACN,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,EACzC,aAAa,EACb,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,GAAG,IAAI,GAQ5B;IACC,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACjD,MAAM,iBAAiB,GAAG,MAAM,CAAiB,SAAS,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/C,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IACzC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,EAAwB,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,GAAG,EAAuB,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE;QACtE,OAAO;YACL,GAAG,OAAO;YACV,cAAc,EAAE,oBAAoB,EAAE;YACtC,WAAW;YACX,iBAAiB;YACjB,uBAAuB;YACvB,4BAA4B;YAC5B,YAAY;YACZ,SAAS;YACT,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC7B,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvD,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;gBAE9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrD,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC7C,OAAO,KAAK,CAAC;YACf,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,SAAS,CACP,GAAG,EAAE,CACH,QAAQ,CAAC;QACP,IAAI,EAAE,cAAc;QACpB,SAAS;KACV,CAAC,EACJ,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,KAAK,GAA4B,OAAO,CAC5C,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAC3B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB,CAAC;IAEF,OAAO,CACL,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,oBAAoB,YACtD,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACtC,QAAQ,GACmB,GACF,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,GAA4B,EAAE,CAC1D,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAEjC;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,aAAa,CAAmB,IAAI,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAqB,EAAE,CAC5D,UAAU,CAAC,kBAAkB,CAAC,CAAC","sourcesContent":["'use client';\n\nimport type { Dispatch, MutableRefObject, ReactNode, Reducer } from 'react';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport type {\n GetQuickLinks,\n MemoCache,\n MemoCacheKey,\n QuickLink,\n Resource,\n RootNode,\n ScrollSnapshot,\n SpanNode,\n VisibleSpanEvent,\n} from './types';\nimport {\n MAP_HEIGHT,\n MARKER_HEIGHT,\n ROW_HEIGHT,\n ROW_PADDING,\n SEARCH_GAP,\n SEARCH_HEIGHT,\n TIMELINE_PADDING,\n} from './util/constants';\nimport { detectScrollbarWidth } from './util/scrollbar-width';\n\nexport interface TraceViewerState {\n /**\n * The root node for the tree\n */\n root: RootNode;\n /**\n * A map of spanId to span nodes\n */\n spanMap: Record<string, SpanNode>;\n /**\n * A map of resource name to resource\n */\n resourceMap: Record<string, Resource['attributes']>;\n /**\n * The current (debounced) search input value\n */\n filter: string;\n /**\n * The span that is currently focused and visible in the panel\n */\n selected: SpanNode | null;\n /**\n * The initial scale of the trace. At this scale the entire trace is visible\n */\n baseScale: number;\n /**\n * The multiplier of the base scale to get the current scale\n */\n scaleRatio: number;\n /**\n * The scale of 1ms in pixels\n */\n scale: number;\n /**\n * The width of the entire trace viewer in pixels\n */\n width: number;\n /**\n * The height of the entire trace viewer in pixels\n */\n height: number;\n /**\n * The width of the timeline view in pixels\n */\n timelineWidth: number;\n /**\n * The height of the timeline view in pixels\n */\n timelineHeight: number;\n /**\n * The width of the side panel in pixels\n */\n panelWidth: number;\n /**\n * The height of the side panel in pixels\n */\n panelHeight: number;\n /**\n * The width of scrollbars on this device\n */\n scrollbarWidth: number;\n /**\n * A ref for the timeline element\n */\n timelineRef: MutableRefObject<HTMLDivElement | null>;\n /**\n * A ref for updating timeline scroll position immediately after a scale operation\n */\n scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;\n /**\n * A reference for the last time each node was mutated. Used for more efficent control\n * of what React re-renders and when.\n */\n memoCacheRef: MutableRefObject<MemoCache>;\n /**\n * A constant, wrapped version of the getQuickLinks property with caching\n */\n getQuickLinks: GetQuickLinks;\n /**\n * Whether the panel is being rendered attached to the timeline\n */\n withPanel: boolean;\n /**\n * Whether the trace viewer is small enough that it should be in mobile mode\n */\n isMobile: boolean;\n /**\n * A function to provide custom class names for spans.\n */\n customSpanClassNameFunc?: (span: SpanNode) => string;\n /**\n * A function to provide custom class names for span events.\n */\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n}\n\nexport type TraceViewerAction =\n | {\n type: 'setRoot';\n root: RootNode;\n spanMap: Record<string, SpanNode>;\n resources: Resource[];\n }\n | {\n type: 'setSize';\n width: number;\n height: number;\n }\n | {\n type: 'setPanelWidth';\n width: number;\n }\n | {\n type: 'setFilter';\n filter: string;\n }\n | {\n type: 'deselect';\n }\n | {\n type: 'select';\n id: string;\n }\n | {\n type: 'escape';\n }\n | {\n type: 'toggleSelection';\n id: string;\n }\n | {\n type: 'detectBaseScale';\n }\n | {\n type: 'setScale';\n scale: number;\n }\n | {\n type: 'resetScale';\n }\n | {\n type: 'scaleToNode';\n id: string;\n }\n | {\n type: 'scaleToRange';\n t1: number;\n t2: number;\n }\n | {\n type: 'adjustScaleRatio';\n direction: -1 | 0 | 1;\n }\n | {\n type: 'trackpadScale';\n delta: number;\n anchorT: number;\n anchorX: number;\n }\n | {\n type: 'minScale';\n }\n | {\n type: 'setScrollSnapshot';\n /**\n * The time that will remain the same location after scaling\n */\n anchorT: number;\n /**\n * The anchor point relative to the timeline's left position\n */\n anchorX: number;\n }\n | {\n type: 'setWithPanel';\n withPanel: boolean;\n }\n | {\n type: 'forceRender';\n }\n | {\n /** Like setRoot but preserves scroll position and memo cache (for incremental data updates) */\n type: 'updateRoot';\n root: RootNode;\n spanMap: Record<string, SpanNode>;\n resources: Resource[];\n };\n\nexport interface TraceViewerContextProps {\n state: TraceViewerState;\n dispatch: Dispatch<TraceViewerAction>;\n}\n\nexport const initialState: TraceViewerState = {\n root: {\n startTime: 0,\n endTime: 1,\n duration: 1,\n depth: 0,\n children: [],\n },\n spanMap: {},\n resourceMap: {},\n filter: '',\n selected: null,\n baseScale: 1,\n scaleRatio: 1,\n scale: 1,\n width: 640,\n height: 480,\n timelineWidth: 640,\n timelineHeight: 480,\n panelWidth: 380,\n panelHeight: 480,\n scrollbarWidth: 0,\n timelineRef: { current: null },\n scrollSnapshotRef: { current: undefined },\n memoCacheRef: { current: new Map() },\n getQuickLinks: () => [],\n withPanel: false,\n isMobile: false,\n};\n\nconst getMinScale = (state: TraceViewerState): number => {\n return (state.timelineWidth - state.scrollbarWidth) / state.root.duration;\n};\n\nexport const TraceViewerContext = createContext<TraceViewerContextProps>({\n state: initialState,\n dispatch: () => {\n // noop\n },\n});\nTraceViewerContext.displayName = 'TraceViewerContext';\n\nconst reducer: Reducer<TraceViewerState, TraceViewerAction> = (\n state,\n action\n) => {\n switch (action.type) {\n case 'setRoot':\n state.scrollSnapshotRef.current = undefined;\n state.memoCacheRef.current.clear();\n return reducer(\n {\n ...state,\n root: action.root,\n spanMap: action.spanMap,\n resourceMap: Object.fromEntries(\n action.resources.map(({ name, attributes }) => [name, attributes])\n ),\n },\n {\n type: 'detectBaseScale',\n }\n );\n case 'setSize': {\n const lowerHeight =\n action.height - MAP_HEIGHT - SEARCH_HEIGHT - 3 * SEARCH_GAP;\n\n const isMobile = state.withPanel && action.width <= 768;\n\n let newState = {\n ...state,\n width: action.width,\n height: action.height,\n timelineWidth:\n action.width -\n Number(Boolean(state.selected && state.withPanel && !isMobile)) *\n state.panelWidth,\n timelineHeight: lowerHeight,\n panelHeight: lowerHeight,\n isMobile,\n };\n\n if (newState.width !== state.width) {\n newState = reducer(newState, {\n type: 'detectBaseScale',\n });\n }\n\n return newState;\n }\n case 'setPanelWidth': {\n const panelWidth = Math.max(\n 240,\n Math.min(action.width, state.width - 240)\n );\n const timelineWidth =\n state.withPanel && state.selected && !state.isMobile\n ? state.width - panelWidth\n : state.width;\n return reducer(\n {\n ...state,\n timelineWidth,\n panelWidth,\n },\n {\n type: 'detectBaseScale',\n }\n );\n }\n case 'setFilter':\n return {\n ...state,\n filter: action.filter,\n };\n case 'deselect':\n return reducer(\n {\n ...state,\n selected: null,\n timelineWidth: state.width,\n },\n {\n type: 'detectBaseScale',\n }\n );\n case 'select': {\n const node = state.spanMap[action.id];\n if (!node) {\n return state;\n }\n\n return reducer(\n {\n ...state,\n selected: node,\n timelineWidth:\n state.width -\n (state.withPanel && !state.isMobile ? state.panelWidth : 0),\n },\n {\n type: 'detectBaseScale',\n }\n );\n }\n case 'escape': {\n if (state.selected) {\n return reducer(state, {\n type: 'deselect',\n });\n }\n return reducer(state, {\n type: 'resetScale',\n });\n }\n case 'toggleSelection': {\n let newState = state;\n if (state.selected) {\n newState = reducer(newState, {\n type: 'deselect',\n });\n }\n if (state.selected?.span.spanId === action.id) {\n return newState;\n }\n return reducer(newState, {\n type: 'select',\n id: action.id,\n });\n }\n case 'detectBaseScale': {\n const baseScale =\n (state.timelineWidth - state.scrollbarWidth) / state.root.duration;\n\n return reducer(\n {\n ...state,\n baseScale,\n scale: baseScale * state.scaleRatio,\n },\n {\n type: 'minScale',\n }\n );\n }\n case 'setScale':\n return {\n ...state,\n scaleRatio: action.scale,\n scale: state.baseScale * action.scale,\n };\n case 'resetScale':\n return reducer(state, {\n type: 'scaleToRange',\n t1: state.root.startTime,\n t2: state.root.endTime,\n });\n case 'scaleToNode': {\n const node = state.spanMap[action.id];\n if (!node) {\n return state;\n }\n return reducer(\n reducer(state, {\n type: 'setScale',\n scale:\n (state.width -\n state.scrollbarWidth -\n (state.withPanel && !state.isMobile ? state.panelWidth : 0)) /\n node.duration /\n state.baseScale,\n }),\n {\n type: 'setScrollSnapshot',\n anchorT: node.startTime - state.root.startTime,\n anchorX: 0,\n }\n );\n }\n case 'scaleToRange': {\n const duration = Math.abs(action.t1 - action.t2);\n\n return reducer(\n reducer(state, {\n type: 'setScale',\n scale:\n (state.width -\n state.scrollbarWidth -\n (state.selected && state.withPanel ? state.panelWidth : 0)) /\n duration /\n state.baseScale,\n }),\n {\n type: 'setScrollSnapshot',\n anchorT: Math.min(action.t1, action.t2) - state.root.startTime,\n anchorX: 0,\n }\n );\n }\n case 'adjustScaleRatio': {\n let { scaleRatio } = state;\n switch (action.direction) {\n case -1:\n scaleRatio *= 0.8;\n break;\n case 1:\n scaleRatio *= 1.25;\n break;\n default:\n scaleRatio = 1;\n break;\n }\n\n const $timeline = state.timelineRef.current;\n if (!$timeline) {\n console.warn('timelineRef is null');\n return state;\n }\n\n const { clientWidth, scrollLeft } = $timeline;\n\n return reducer(\n reducer(\n {\n ...state,\n scaleRatio,\n scale: state.baseScale * scaleRatio,\n },\n {\n type: 'minScale',\n }\n ),\n {\n type: 'setScrollSnapshot',\n anchorT: (scrollLeft + clientWidth * 0.5) / state.scale,\n anchorX: clientWidth * 0.5,\n }\n );\n }\n case 'trackpadScale': {\n const minScaleRatio = getMinScale(state) / state.baseScale;\n const scaleRatio = Math.max(\n minScaleRatio,\n state.scaleRatio *\n (1 +\n 0.2 * Math.sign(action.delta) * Math.sqrt(Math.abs(action.delta)))\n );\n\n return reducer(\n {\n ...state,\n scaleRatio,\n scale: state.baseScale * scaleRatio,\n },\n {\n type: 'setScrollSnapshot',\n anchorT: action.anchorT,\n anchorX: action.anchorX,\n }\n );\n }\n case 'minScale': {\n const minScale = getMinScale(state);\n if (state.scale >= minScale) return state;\n return {\n ...state,\n scale: minScale,\n scaleRatio: minScale / state.baseScale,\n };\n }\n case 'setScrollSnapshot': {\n const $timeline = state.timelineRef.current;\n if (!$timeline) return state;\n\n const { anchorT, anchorX } = action;\n\n const scrollLeft = anchorT * state.scale - anchorX;\n const { scrollTop } = $timeline;\n const startRow =\n (scrollTop - MARKER_HEIGHT - TIMELINE_PADDING) /\n (ROW_HEIGHT + ROW_PADDING);\n const endRow =\n startRow + Math.ceil(state.timelineHeight / (ROW_HEIGHT + ROW_PADDING));\n\n state.scrollSnapshotRef.current = {\n anchorT,\n anchorX,\n scrollLeft,\n scrollTop,\n startTime: state.root.startTime + scrollLeft / state.scale,\n endTime:\n state.root.startTime +\n (scrollLeft + state.timelineWidth) / state.scale,\n startRow,\n endRow,\n scale: state.scale,\n };\n\n return state;\n }\n case 'setWithPanel': {\n if (state.withPanel === action.withPanel) return state;\n const timelineWidth =\n action.withPanel && state.selected && !state.isMobile\n ? state.width - state.panelWidth\n : state.width;\n return reducer(\n {\n ...state,\n withPanel: action.withPanel,\n timelineWidth,\n },\n {\n type: 'detectBaseScale',\n }\n );\n }\n case 'forceRender':\n state.memoCacheRef.current.set('', {});\n return {\n ...state,\n };\n case 'updateRoot':\n // Incremental update: preserve scroll snapshot and only invalidate\n // memo cache for spans whose data may have changed\n state.memoCacheRef.current.set('', {});\n return reducer(\n {\n ...state,\n root: action.root,\n spanMap: action.spanMap,\n resourceMap: Object.fromEntries(\n action.resources.map(({ name, attributes }) => [name, attributes])\n ),\n },\n {\n type: 'detectBaseScale',\n }\n );\n }\n};\n\nexport function TraceViewerContextProvider({\n getQuickLinks,\n withPanel = false,\n children,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n customPanelComponent = null,\n}: {\n getQuickLinks?: GetQuickLinks;\n withPanel?: boolean;\n children: ReactNode;\n customSpanClassNameFunc?: (span: SpanNode) => string;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n customPanelComponent?: ReactNode;\n}): ReactNode {\n const timelineRef = useRef<HTMLDivElement>(null);\n const scrollSnapshotRef = useRef<ScrollSnapshot>(undefined);\n const getQuickLinksRef = useRef(getQuickLinks);\n getQuickLinksRef.current = getQuickLinks;\n const memoCacheRef = useRef(new Map<string, MemoCacheKey>());\n const quickLinksCache = useRef(new Map<string, QuickLink[]>());\n const [state, dispatch] = useReducer(reducer, initialState, (initial) => {\n return {\n ...initial,\n scrollbarWidth: detectScrollbarWidth(),\n timelineRef,\n scrollSnapshotRef,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n memoCacheRef,\n withPanel,\n getQuickLinks: (span) => {\n const cacheKey = span.spanId;\n const existing = quickLinksCache.current.get(cacheKey);\n if (existing) return existing;\n\n const value = getQuickLinksRef.current?.(span) || [];\n quickLinksCache.current.set(cacheKey, value);\n return value;\n },\n };\n });\n\n useEffect(\n () =>\n dispatch({\n type: 'setWithPanel',\n withPanel,\n }),\n [withPanel]\n );\n\n const value: TraceViewerContextProps = useMemo(\n () => ({ state, dispatch }),\n [state, dispatch]\n );\n\n return (\n <CustomPanelContext.Provider value={customPanelComponent}>\n <TraceViewerContext.Provider value={value}>\n {children}\n </TraceViewerContext.Provider>\n </CustomPanelContext.Provider>\n );\n}\n\nexport const useTraceViewer = (): TraceViewerContextProps =>\n useContext(TraceViewerContext);\n\n/**\n * Separate context for the custom panel component. This is intentionally\n * outside the useReducer state so that the panel re-renders reactively\n * when props like spanDetailData change.\n */\nconst CustomPanelContext = createContext<ReactNode | null>(null);\n\nexport const useCustomPanelComponent = (): ReactNode | null =>\n useContext(CustomPanelContext);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/trace-viewer/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvE,cAAc,gBAAgB,CAAC","sourcesContent":["export { PanelResizer } from './components/span-detail-panel';\nexport { TraceViewerContextProvider, useTraceViewer } from './context';\nexport * from './trace-viewer';\nexport type { Trace } from './types';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace-viewer.js","sourceRoot":"","sources":["../../../src/components/trace-viewer/trace-viewer.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAE/C,OAAO,EACL,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAgB/D,MAAM,UAAU,mBAAmB,CAAC,EAClC,aAAa,EACb,QAAQ,GAGT;IACC,OAAO,CACL,KAAC,0BAA0B,IAAC,aAAa,EAAE,aAAa,YACrD,QAAQ,GACkB,CAC9B,CAAC;AACJ,CAAC;AASD,MAAM,aAAa,GAAU;IAC3B,OAAO,EAAE,UAAU;IACnB,KAAK,EAAE;QACL;YACE,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,gBAAgB;YAC1B,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACnB,OAAO,EAAE;gBACP,IAAI,EAAE,aAAa;aACpB;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC;aACR;YACD,UAAU,EAAE;gBACV,gBAAgB,EAAE,UAAU;aAC7B;YACD,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;SACV;KACF;IACD,SAAS,EAAE;QACT;YACE,IAAI,EAAE,gBAAgB;YACtB,UAAU,EAAE,EAAE;SACf;KACF;IACD,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,GAAG,aAAa,EACrB,SAAS,GAAG,EAAE,EACd,UAAU,GAAG,KAAK,EAClB,MAAM,EACN,SAAS,GAAG,KAAK,EACjB,gBAAgB,EAChB,WAAW,GAAG,KAAK,EACnB,MAAM,GAAG,KAAK,EACd,MAAM,EACN,eAAe,EACf,WAAW,GAAG,KAAK,GAOpB;IACC,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa,CAAC;IAC3C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IAC7C,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;IAC7C,MAAM,aAAa,GAAG,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,MAAM,CACxB,IAAI,CACL,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,CAAuC,EAAE,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,MAAM,CAA2C,IAAI,CAAC,CAAC;IAE3E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAC7C,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;QAEjC,uEAAuE;QACvE,6EAA6E;QAC7E,sEAAsE;QACtE,qEAAqE;QACrE,6EAA6E;QAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;aACpC,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YACV,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrD,MAAM,cAAc,GAAG,GAAG,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;YACvI,OAAO,GAAG,EAAE,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;QAC5C,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,IACE,CAAC,SAAS;YACV,OAAO,KAAK,cAAc,CAAC,OAAO;YAClC,WAAW,CAAC,OAAO,EACnB,CAAC;YACD,0DAA0D;YAC1D,sEAAsE;YACtE,gCAAgC;YAChC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YACpC,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC;YAC1C,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,IACE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;gBACnC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACrC,CAAC;gBACD,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;gBAClC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACpC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YAED,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvD,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,OAAO,EAAE,CAAC;oBACZ,IACE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;wBACnC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACrC,CAAC;wBACD,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;wBAClC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;wBACpC,SAAS,GAAG,IAAI,CAAC;oBACnB,CAAC;oBACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,mEAAmE;YACnE,oEAAoE;YACpE,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,+EAA+E;QAC/E,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;QACjC,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,cAAc,CAAC,OAAO,GAAG,UAAU,CAAC;QACpC,QAAQ,CAAC;YACP,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;YAC1C,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;SACjC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,CACtD,gBAAgB,EAChB,WAAW,CACZ,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,MAAM,OAAO,GAAG,CAAC,GAAG,gBAAgB,CAAC;YACrC,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACvC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;YAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC;YAErC,IACE,QAAQ;gBACR,QAAQ,CAAC,KAAK,KAAK,SAAS;gBAC5B,QAAQ,CAAC,MAAM,KAAK,UAAU,EAC9B,CAAC;gBACD,OAAO;YACT,CAAC;YACD,WAAW,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAE/D,QAAQ,CAAC;gBACP,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,QAAQ,EAAE,CAAC;QAEX,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9C,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE5C,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,YAAY,GAAG,MAAM,CAAe;QACxC,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC;QACL,MAAM,EAAE,EAAE;KACX,CAAC,CAAC;IACH,MAAM,OAAO,GAAsB,WAAW,CAC5C,CAAC,KAAK,EAAE,EAAE;QACR,0FAA0F;QAC1F,0FAA0F;QAC1F,0FAA0F;QAC1F,oFAAoF;QACpF,oDAAoD;QACpD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,eAAe;QACf,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,QAAQ,CAAC;oBACP,IAAI,EAAE,YAAY;iBACnB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,QAAQ,CAAC;gBACP,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,IAAI,CAAC,MAAM;aAChB,CAAC,CAAC;YACH,QAAQ,CAAC;gBACP,IAAI,EAAE,aAAa;gBACnB,EAAE,EAAE,IAAI,CAAC,MAAM;aAChB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAoB,gBAAgB,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QAC7C,YAAY,CAAC,OAAO,GAAG;YACrB,CAAC;YACD,CAAC;YACD,CAAC;YACD,MAAM;SACP,CAAC;QACF,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,QAAQ,CAAC;YACP,IAAI,EAAE,iBAAiB;YACvB,EAAE,EAAE,MAAM;SACX,CAAC,CAAC;QACH,KAAK,CAAC,eAAe,EAAE,CAAC;IAC1B,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,yEAAyE;IACzE,qEAAqE;IACrE,mEAAmE;IACnE,uEAAuE;IACvE,oCAAoC;IACpC,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,UAAU,GAAG,QAAQ,CAAC,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;YACnE,iBAAiB,CAAC,OAAO,GAAG,SAAS,CAAC;QACxC,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IAE5C,mBAAmB;IACnB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;YAC5C,MAAM,KAAK,GAAG,SAAS,EAAE,aAAa,CAAC,kBAAkB,MAAM,IAAI,CAAC,CAAC;YACrE,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEjC,MAAM,QAAQ,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;YAE/C,0EAA0E;YAC1E,IACE,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK;gBAC/B,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;oBAC5B,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK;oBAC/B,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG;oBAC3B,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,EACpC,CAAC;gBACD,KAAK,CAAC,cAAc,CAAC;oBACnB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAExC,4BAA4B;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAQ,EAAE;YAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,QAAQ,CAAC;oBACP,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE9C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,iBAAiB;IACjB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE5B,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;QAC9B,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;QAE9B,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE;YACvC,IAAI,KAAK,EAAE,UAAU,EAAE,CAAC;gBACtB,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC;oBACd,IAAI,EAAE,CAAC;oBACP,GAAG,EAAE,CAAC;oBACN,QAAQ,EAAE,SAAS;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE;YAC1C,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;YAC1B,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,EAC3C,aAAa;QACX,WAAW;QACX,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC;QACxC,WAAW;QACX,iFAAiF;QACjF,mDAAmD;QACnD,EAAE,CACL,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAExD,OAAO,CACL,eACE,SAAS,EAAE,IAAI,CACb,MAAM,CAAC,WAAW,EAClB,UAAU,IAAI,MAAM,CAAC,QAAQ,EAC7B,SAAS,CACV,EACD,cAAc,EAAE,OAAO,EACvB,GAAG,EAAE,GAAG,EACR,KAAK,EACH;YACE,MAAM;YACN,oBAAoB,EAAE,GAAG,gBAAgB,IAAI;YAC7C,cAAc,EAAE,GAAG,UAAU,IAAI;YACjC,eAAe,EAAE,GAAG,WAAW,IAAI;YACnC,iBAAiB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;YAC5D,cAAc,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;YACtD,cAAc,EAAE,GAAG,UAAU,IAAI;YACjC,kBAAkB,EAAE,GAAG,KAAK,CAAC,aAAa,IAAI;YAC9C,mBAAmB,EAAE,GAAG,KAAK,CAAC,cAAc,IAAI;YAChD,yBAAyB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI;YAC/E,eAAe,EAAE,GAAG,KAAK,CAAC,UAAU,IAAI;YACxC,gBAAgB,EAAE,GAAG,KAAK,CAAC,WAAW,IAAI;YAC1C,UAAU,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI;YAC/B,mBAAmB,EAAE,GAAG,KAAK,CAAC,cAAc,IAAI;YAChD,iBAAiB,EAAE,GAAG,aAAa,IAAI;YACvC,uBAAuB,EAAE,GAAG,mBAAmB,IAAI;SACnC,aAGnB,CAAC,aAAa,CAAC,CAAC,CAAC,KAAC,SAAS,KAAG,CAAC,CAAC,CAAC,IAAI,EACtC,KAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,GAAI,EAC/D,eAAK,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,aACpE,eAAK,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,aAC/C,cACE,KAAK,EAAE;oCACL,QAAQ,EAAE,UAAU;oCACpB,KAAK,EAAE,KAAK,CAAC,aAAa;oCAC1B,SAAS,EAAE,KAAK,CAAC,cAAc,GAAG,gBAAgB,GAAG,CAAC;oCACtD,OAAO,EAAE,gBAAgB;oCACzB,aAAa,EAAE,CAAC;iCACjB,YAED,eACE,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,KAAK,EAAE;wCACL,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,IAAI,SAAS;wCAC/C,MAAM,EAAE,cAAc,GAAG,gBAAgB,GAAG,CAAC;qCAC9C,aAED,KAAC,OAAO,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAI,EACzC,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAI,EAChE,KAAC,YAAY,IACX,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,GACxB,EACF,KAAC,SAAS,IACR,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,SAAS,EAChB,uBAAuB,EAAE,KAAK,CAAC,uBAAuB,EACtD,4BAA4B,EAC1B,KAAK,CAAC,4BAA4B,EAEpC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,KAAK,GACZ,EAID,eAAe,IAAI,IAAI;4CACtB,eAAe,GAAG,CAAC;4CACnB,CAAC,WAAW,IAAI,MAAM,CAAC;4CACvB,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC;4CACvB,CAAC,GAAG,EAAE;gDACJ,MAAM,OAAO,GAAG,eAAe,GAAG,KAAK,CAAC;gDACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gDAC5C,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;gDACvC,uDAAuD;gDACvD,IAAI,YAAY,GAAG,CAAC;oDAAE,OAAO,IAAI,CAAC;gDAClC,+DAA+D;gDAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;gDAClD,OAAO,CACL,cACE,KAAK,EAAE;wDACL,QAAQ,EAAE,UAAU;wDACpB,GAAG,EAAE,CAAC;wDACN,IAAI,EAAE,OAAO,GAAG,OAAO;wDACvB,KAAK,EAAE,YAAY,GAAG,OAAO;wDAC7B,MAAM,EAAE,MAAM;wDACd,aAAa,EAAE,MAAM;wDACrB,MAAM,EAAE,CAAC;wDACT,SAAS,EACP,qDAAqD;wDACvD,eAAe,EACb,qDAAqD;wDACvD,UAAU,EACR,gJAAgJ;qDACnJ,GACD,CACH,CAAC;4CACJ,CAAC,CAAC,EAAE,IACF,GACF,EACL,MAAM,IACH,EACN,cAAK,SAAS,EAAE,MAAM,CAAC,qBAAqB,YAC1C,KAAC,UAAU,KAAG,GACV,IACF,EACL,SAAS,CAAC,CAAC,CAAC,CACX,cACE,SAAS,EAAE,IAAI,CACb,MAAM,CAAC,0BAA0B,EACjC,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAChC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAChC,YAED,KAAC,eAAe,IAAC,QAAQ,SAAG,GACxB,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,SAAS,GAAG,EAAE,EACd,QAAQ,GAAG,IAAI,GAIhB;IACC,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE,CAAC;IAEnC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,CACL,cACE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,SAAS,CAAC,EAC7D,KAAK,EACH;YACE,QAAQ,EAAE,UAAU;YACpB,iBAAiB,EAAE,GAAG;YACtB,cAAc,EAAE,GAAG;YACnB,cAAc,EAAE,GAAG;YACnB,eAAe,EAAE,MAAM;YACvB,gBAAgB,EAAE,MAAM;YACxB,UAAU,EAAE,MAAM;YAClB,mBAAmB,EAAE,GAAG,KAAK,CAAC,cAAc,IAAI;SAChC,YAGpB,KAAC,eAAe,KAAG,GACf,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,OAAO,CACL,KAAC,0BAA0B,IAAC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,kBACvE,KAAC,mBAAmB,IAAC,SAAS,WAAK,KAAK,GAAI,GACjB,CAC9B,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { clsx } from 'clsx';\nimport type { CSSProperties, MouseEventHandler, ReactNode } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\nimport { MiniMap } from './components/map';\nimport { CursorMarker, EventMarkers, Markers } from './components/markers';\nimport { SpanNodes } from './components/node';\nimport { SearchBar } from './components/search';\nimport { SpanDetailPanel } from './components/span-detail-panel';\nimport { ZoomButton } from './components/zoom-button';\nimport { TraceViewerContextProvider, useTraceViewer } from './context';\nimport styles from './trace-viewer.module.css';\nimport type { GetQuickLinks, Trace } from './types';\nimport {\n MAP_HEIGHT,\n MARKER_HEIGHT,\n MARKER_NOTCH_HEIGHT,\n ROW_HEIGHT,\n ROW_PADDING,\n SEARCH_GAP,\n SEARCH_HEIGHT,\n TIMELINE_PADDING,\n} from './util/constants';\nimport { parseTrace } from './util/tree';\nimport { useStreamingSpans } from './util/use-streaming-spans';\n\ninterface TraceViewerProps {\n trace?: Trace;\n className?: string;\n scrollLock?: boolean;\n height?: string | number;\n withPanel?: boolean;\n getQuickLinks?: GetQuickLinks;\n highlightedSpans?: string[];\n /** Render all spans immediately (no progressive streaming). */\n eagerRender?: boolean;\n /** Whether the trace is live (for continuous tick updates). */\n isLive?: boolean;\n}\n\nexport function TraceViewerProvider({\n getQuickLinks,\n children,\n}: Pick<TraceViewerProps, 'getQuickLinks'> & {\n children: ReactNode;\n}): ReactNode {\n return (\n <TraceViewerContextProvider getQuickLinks={getQuickLinks}>\n {children}\n </TraceViewerContextProvider>\n );\n}\n\ninterface LastClickRef {\n x: number;\n y: number;\n t: number;\n spanId: string;\n}\n\nconst skeletonTrace: Trace = {\n traceId: 'skeleton',\n spans: [\n {\n parentSpanId: '',\n spanId: 'root',\n name: 'root span',\n kind: 1,\n resource: 'vercel.runtime',\n startTime: [5000, 0],\n endTime: [6000, 0],\n duration: [1000, 0],\n library: {\n name: 'vercel-site',\n },\n status: {\n code: 1,\n },\n attributes: {\n 'vercel.ownerId': 'team_abc',\n },\n traceFlags: 1,\n events: [],\n links: [],\n },\n ],\n resources: [\n {\n name: 'vercel.runtime',\n attributes: {},\n },\n ],\n rootSpanId: 'root',\n};\n\nexport function TraceViewerTimeline({\n trace = skeletonTrace,\n className = '',\n scrollLock = false,\n height,\n withPanel = false,\n highlightedSpans,\n eagerRender = false,\n isLive = false,\n footer,\n knownDurationMs,\n hasMoreData = false,\n}: Omit<TraceViewerProps, 'getQuickLinks'> & {\n footer?: ReactNode;\n /** Duration in ms from trace start to the latest known event. Used to render the unknown-time overlay. */\n knownDurationMs?: number;\n /** Whether more data pages are expected. Controls the unknown-data overlay visibility. */\n hasMoreData?: boolean;\n}): ReactNode {\n const isSkeleton = trace === skeletonTrace;\n const { state, dispatch } = useTraceViewer();\n const { timelineRef, scrollSnapshotRef } = state;\n const memoCache = state.memoCacheRef.current;\n const hideSearchBar = (highlightedSpans?.length ?? 0) > 0;\n\n const hasInitializedRef = useRef(false);\n const prevSpanKeyRef = useRef('');\n const prevRootRef = useRef<ReturnType<typeof parseTrace>['root'] | null>(\n null\n );\n const prevSpanMapRef = useRef<ReturnType<typeof parseTrace>['map']>({});\n const prevSizeRef = useRef<{ width: number; height: number } | null>(null);\n\n useEffect(() => {\n const { root: newRoot, map: newSpanMap } = parseTrace(trace);\n const isInitial = !hasInitializedRef.current;\n hasInitializedRef.current = true;\n\n // Build a structural key from span IDs + lightweight event signatures.\n // When only timing changes (same spans and boundary events), we can skip the\n // worker restart. When events change (step completed, etc.) we need a\n // full update because the VisibleSpan objects rendered by React hold\n // copies of the events from the worker — in-place mutation won't reach them.\n const spanKey = Object.keys(newSpanMap)\n .sort()\n .map((id) => {\n const events = newSpanMap[id].events;\n const count = events?.length ?? 0;\n const first = count ? events?.[0] : undefined;\n const last = count ? events?.[count - 1] : undefined;\n const eventSignature = `${first?.event.name ?? 'none'}@${first?.timestamp ?? 0}|${last?.event.name ?? 'none'}@${last?.timestamp ?? 0}`;\n return `${id}:${count}:${eventSignature}`;\n })\n .join(',');\n\n if (\n !isInitial &&\n spanKey === prevSpanKeyRef.current &&\n prevRootRef.current\n ) {\n // Same span set, same event counts — only timing changed.\n // Mutate in-place so the worker effect (which depends on root/spanMap\n // references) does NOT restart.\n const oldRoot = prevRootRef.current;\n const oldSpanMap = prevSpanMapRef.current;\n let didChange = false;\n\n if (\n oldRoot.endTime !== newRoot.endTime ||\n oldRoot.duration !== newRoot.duration\n ) {\n oldRoot.endTime = newRoot.endTime;\n oldRoot.duration = newRoot.duration;\n didChange = true;\n }\n\n for (const [id, newNode] of Object.entries(newSpanMap)) {\n const oldNode = oldSpanMap[id];\n if (oldNode) {\n if (\n oldNode.endTime !== newNode.endTime ||\n oldNode.duration !== newNode.duration\n ) {\n oldNode.endTime = newNode.endTime;\n oldNode.duration = newNode.duration;\n didChange = true;\n }\n Object.assign(oldNode.span, newNode.span);\n }\n }\n\n if (!didChange) {\n return;\n }\n\n // Trigger re-render (scale/markers) without restarting the worker.\n // useLiveTick handles continuous scale recalculation for live runs.\n dispatch({ type: 'forceRender' });\n return;\n }\n\n // Structure changed or initial load — full dispatch (worker computes new rows)\n prevSpanKeyRef.current = spanKey;\n prevRootRef.current = newRoot;\n prevSpanMapRef.current = newSpanMap;\n dispatch({\n type: isInitial ? 'setRoot' : 'updateRoot',\n root: newRoot,\n spanMap: newSpanMap,\n resources: trace.resources || [],\n });\n }, [dispatch, trace]);\n\n const { rows, spans, events, scale } = useStreamingSpans(\n highlightedSpans,\n eagerRender\n );\n\n const ref = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const $el = ref.current;\n if (!$el) return;\n\n const onResize = (): void => {\n const padding = 2 * TIMELINE_PADDING;\n const rect = $el.getBoundingClientRect();\n const nextWidth = rect.width - padding;\n const nextHeight = rect.height;\n const prevSize = prevSizeRef.current;\n\n if (\n prevSize &&\n prevSize.width === nextWidth &&\n prevSize.height === nextHeight\n ) {\n return;\n }\n prevSizeRef.current = { width: nextWidth, height: nextHeight };\n\n dispatch({\n type: 'setSize',\n width: nextWidth,\n height: nextHeight,\n });\n };\n\n onResize();\n\n const observer = new ResizeObserver(onResize);\n observer.observe($el);\n window.addEventListener('resize', onResize);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', onResize);\n };\n }, [dispatch]);\n\n const lastClickRef = useRef<LastClickRef>({\n t: 0,\n x: -1,\n y: -1,\n spanId: '',\n });\n const onClick: MouseEventHandler = useCallback(\n (event) => {\n // NOTE(wits): We manually implement double-click logic here so that we can support double\n // clicking a span even if the first click moves the span that the user is clicking on due\n // to the panel opening. If we used a regular double click listener we would need to delay\n // the opening of the panel artificially. This implementation allows us to always be\n // FAST while also avoiding a FRUSTRATING situation.\n const prev = lastClickRef.current;\n const t = Date.now();\n const { clientX: x, clientY: y } = event;\n const d = Math.sqrt((x - prev.x) ** 2 + (y - prev.y) ** 2);\n // double click\n if (t - prev.t <= 500 && d <= 8) {\n event.stopPropagation();\n event.preventDefault();\n if (!prev.spanId) {\n dispatch({\n type: 'resetScale',\n });\n return;\n }\n dispatch({\n type: 'select',\n id: prev.spanId,\n });\n dispatch({\n type: 'scaleToNode',\n id: prev.spanId,\n });\n return;\n }\n const target = event.target as HTMLElement;\n if (!target.closest(`.${String(styles.timeline)}`)) return;\n const $button = target.closest<HTMLButtonElement>('[data-span-id]');\n const spanId = $button?.dataset.spanId || '';\n lastClickRef.current = {\n x,\n y,\n t,\n spanId,\n };\n if (!spanId) return;\n dispatch({\n type: 'toggleSelection',\n id: spanId,\n });\n event.stopPropagation();\n },\n [dispatch]\n );\n\n // Zoom helper — apply the scroll snapshot once after a zoom operation so\n // the anchor point stays at the same screen position, then clear it.\n // Without clearing, live runs (where scale changes every frame via\n // detectBaseScale) would continuously reset scrollLeft and prevent the\n // user from scrolling horizontally.\n useLayoutEffect(() => {\n const $timeline = timelineRef.current;\n if (!$timeline) return;\n\n const snapshot = scrollSnapshotRef.current;\n if (snapshot) {\n $timeline.scrollLeft = snapshot.anchorT * scale - snapshot.anchorX;\n scrollSnapshotRef.current = undefined;\n }\n }, [scrollSnapshotRef, timelineRef, scale]);\n\n // Selection helper\n useEffect(() => {\n const spanId = state.selected?.span.spanId;\n if (!spanId) return;\n\n const timeout = setTimeout(() => {\n const $timeline = state.timelineRef.current;\n const $span = $timeline?.querySelector(`[data-span-id=\"${spanId}\"]`);\n if (!$timeline || !$span) return;\n\n const viewRect = $timeline.getBoundingClientRect();\n const spanRect = $span.getBoundingClientRect();\n\n // If the selected span is narrower than the timeline, scroll it into view\n if (\n spanRect.width < viewRect.width &&\n (spanRect.left < viewRect.left ||\n spanRect.right > viewRect.right ||\n spanRect.top < viewRect.top ||\n spanRect.bottom > viewRect.bottom)\n ) {\n $span.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n }, 500);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [state.selected, state.timelineRef]);\n\n // Global keyboard shortcuts\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n dispatch({\n type: 'escape',\n });\n }\n };\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [dispatch]);\n\n // Scroll locking\n useEffect(() => {\n if (!scrollLock) return;\n\n const $html = document.documentElement;\n const $body = document.body;\n\n $html.style.overflow = 'clip';\n $body.style.overflow = 'clip';\n\n const onScroll = (event?: Event): void => {\n if (event?.cancelable) {\n event.preventDefault();\n } else {\n window.scrollTo({\n left: 0,\n top: 0,\n behavior: 'instant',\n });\n }\n };\n onScroll();\n window.addEventListener('scroll', onScroll, {\n passive: false,\n });\n\n return () => {\n $html.style.overflow = '';\n $body.style.overflow = '';\n window.removeEventListener('scroll', onScroll);\n };\n }, [scrollLock]);\n\n const timelineHeight = Math.max(\n state.timelineHeight - state.scrollbarWidth,\n MARKER_HEIGHT +\n ROW_PADDING +\n rows.length * (ROW_HEIGHT + ROW_PADDING) -\n ROW_PADDING +\n // When there are enough spans to be near the bottom edge, add some extra padding\n // to avoid overlapping with the zoom buttons, etc.\n 84\n );\n\n const inert = Boolean(state.isMobile && state.selected);\n\n return (\n <div\n className={clsx(\n styles.traceViewer,\n isSkeleton && styles.skeleton,\n className\n )}\n onClickCapture={onClick}\n ref={ref}\n style={\n {\n height,\n '--timeline-padding': `${TIMELINE_PADDING}px`,\n '--row-height': `${ROW_HEIGHT}px`,\n '--row-padding': `${ROW_PADDING}px`,\n '--search-height': `${!hideSearchBar ? SEARCH_HEIGHT : 0}px`,\n '--search-gap': `${!hideSearchBar ? SEARCH_GAP : 2}px`,\n '--map-height': `${MAP_HEIGHT}px`,\n '--timeline-width': `${state.timelineWidth}px`,\n '--timeline-height': `${state.timelineHeight}px`,\n '--timeline-scroll-width': `${Math.round(state.root.duration * state.scale)}px`,\n '--panel-width': `${state.panelWidth}px`,\n '--panel-height': `${state.panelHeight}px`,\n '--height': `${state.height}px`,\n '--scrollbar-width': `${state.scrollbarWidth}px`,\n '--marker-height': `${MARKER_HEIGHT}px`,\n '--marker-notch-height': `${MARKER_NOTCH_HEIGHT}px`,\n } as CSSProperties\n }\n >\n {!hideSearchBar ? <SearchBar /> : null}\n <MiniMap rows={rows} scale={scale} timelineRef={timelineRef} />\n <div className={clsx(styles.traceViewerContent, inert && styles.inert)}>\n <div className={styles.timeline} ref={timelineRef}>\n <div\n style={{\n position: 'relative',\n width: state.timelineWidth,\n minHeight: state.timelineHeight - TIMELINE_PADDING * 2,\n padding: TIMELINE_PADDING,\n paddingBottom: 0,\n }}\n >\n <div\n className={styles.traceNode}\n style={{\n width: state.root.duration * scale || undefined,\n height: timelineHeight - TIMELINE_PADDING * 2,\n }}\n >\n <Markers scale={scale} isLive={isLive} />\n <EventMarkers events={events} root={state.root} scale={scale} />\n <CursorMarker\n dispatch={dispatch}\n events={events}\n memoCacheRef={state.memoCacheRef}\n root={state.root}\n scale={scale}\n scrollSnapshotRef={scrollSnapshotRef}\n spans={spans}\n timelineRef={timelineRef}\n />\n <SpanNodes\n cacheKey={memoCache.get('')}\n cache={memoCache}\n customSpanClassNameFunc={state.customSpanClassNameFunc}\n customSpanEventClassNameFunc={\n state.customSpanEventClassNameFunc\n }\n isLive={isLive}\n root={state.root}\n scale={scale}\n scrollSnapshotRef={scrollSnapshotRef}\n spans={spans}\n />\n {/* Horizontal \"unknown time\" overlay — covers the region to the\n right of the latest known event, indicating data beyond this\n point hasn't been loaded yet. */}\n {knownDurationMs != null &&\n knownDurationMs > 0 &&\n (hasMoreData || isLive) &&\n state.root.duration > 0 &&\n (() => {\n const knownPx = knownDurationMs * scale;\n const totalPx = state.root.duration * scale;\n const unknownWidth = totalPx - knownPx;\n // Only show if the unknown region is meaningfully wide\n if (unknownWidth < 4) return null;\n // Offset ~5% into the unknown region so it doesn't touch spans\n const insetPx = Math.min(unknownWidth * 0.05, 20);\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: knownPx + insetPx,\n width: unknownWidth - insetPx,\n height: '100%',\n pointerEvents: 'none',\n zIndex: 1,\n maskImage:\n 'linear-gradient(to right, transparent 1%, black 3%)',\n WebkitMaskImage:\n 'linear-gradient(to right, transparent 1%, black 3%)',\n background:\n 'repeating-linear-gradient(-45deg, var(--ds-background-200) 0, var(--ds-background-200) 11px, var(--ds-gray-200) 11px, var(--ds-gray-200) 12px)',\n }}\n />\n );\n })()}\n </div>\n </div>\n {footer}\n </div>\n <div className={styles.zoomButtonTraceViewer}>\n <ZoomButton />\n </div>\n </div>\n {withPanel ? (\n <div\n className={clsx(\n styles.spanDetailPanelTraceViewer,\n !state.selected && styles.hidden,\n state.isMobile && styles.mobile\n )}\n >\n <SpanDetailPanel attached />\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function TraceViewerPanel({\n className = '',\n children = null,\n}: {\n className?: string;\n children?: ReactNode;\n}): ReactNode {\n const { state } = useTraceViewer();\n\n if (!state.selected) {\n return children;\n }\n\n return (\n <div\n className={clsx(styles.spanDetailPanelTraceViewer, className)}\n style={\n {\n position: 'relative',\n '--search-height': '0',\n '--search-gap': '0',\n '--map-height': '0',\n '--panel-width': `100%`,\n '--panel-height': `100%`,\n '--height': `100%`,\n '--scrollbar-width': `${state.scrollbarWidth}px`,\n } as CSSProperties\n }\n >\n <SpanDetailPanel />\n </div>\n );\n}\n\nexport function TraceViewer(props: TraceViewerProps): ReactNode {\n return (\n <TraceViewerContextProvider getQuickLinks={props.getQuickLinks} withPanel>\n <TraceViewerTimeline withPanel {...props} />\n </TraceViewerContextProvider>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/trace-viewer/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { MutableRefObject, ReactNode } from 'react';\n\nexport type MemoCacheKey = Record<string, never>;\nexport type MemoCache = Map<string, MemoCacheKey>;\n\nexport interface Span {\n name: string;\n kind: number;\n resource: string;\n library: {\n name: string;\n version?: string;\n };\n spanId: string;\n parentSpanId?: string;\n status: {\n code: number;\n };\n traceFlags: number;\n attributes: Record<string, unknown>;\n links: Record<string, unknown>[];\n events: SpanEvent[];\n startTime: [number, number];\n endTime: [number, number];\n duration: [number, number];\n /**\n * The time when the span became active/started executing (optional).\n * If provided and different from startTime, the portion between startTime\n * and activeStartTime will be rendered as a \"queued\" period with different styling.\n */\n activeStartTime?: [number, number];\n}\n\nexport interface SpanEvent {\n name: string;\n timestamp: [number, number];\n attributes: Record<string, unknown>;\n /**\n * Optional custom color for this event marker (workflow-specific feature).\n * If provided, this color will be used for the event marker line/diamond.\n */\n color?: string;\n /**\n * Whether to show a vertical line for this event in the timeline (workflow-specific feature).\n * If false, only the diamond marker on the span will be shown.\n * Defaults to true if not specified.\n */\n showVerticalLine?: boolean;\n}\n\nexport interface Resource {\n name: string;\n attributes: Record<string, string>;\n}\n\nexport interface Trace {\n traceId: string;\n resources?: Resource[];\n spans: Span[];\n rootSpanId?: string;\n}\n\ninterface EveryNode {\n startTime: number;\n endTime: number;\n duration: number;\n /**\n * How deep is this node within the tree\n */\n depth: number;\n /**\n * All direct child nodes of this node\n */\n children: SpanNode[];\n}\n\nexport interface RootNode extends EveryNode {\n /**\n * The depth is always 0 for the root node\n */\n depth: 0;\n}\n\nexport interface SpanNode extends EveryNode {\n /**\n * This original Span that this node is based on\n */\n span: Span;\n /**\n * The immediate parent of this node\n */\n parent: RootNode | SpanNode;\n /**\n * A generated label to use (overrides the span.name) if present\n */\n label?: string;\n /**\n * OTEL events that are present on this span (e.g. TTFB)\n */\n events?: SpanNodeEvent[];\n /**\n * Whether this span originated in Vercel's infrastructure.\n */\n isVercel: boolean;\n /**\n * Whether this span matches the current search filter\n */\n isHighlighted?: boolean;\n /**\n * Whether this span is a placeholder to hint at where user spans\n * would appear if proper instrumentation were available\n */\n isInstrumentationHint?: boolean;\n /**\n * The index of the resource that this node belongs to (used for color)\n */\n resourceIndex: number;\n /**\n * The time when execution actually started (in milliseconds).\n * If present and greater than startTime, represents a \"queued\" period.\n */\n activeStartTime?: number;\n}\n\nexport interface SpanNodeEvent {\n /** A unique key for this event to help with rendering in React */\n key: string;\n /** The timestamp of this event in milliseconds */\n timestamp: number;\n /** The original event model */\n event: SpanEvent;\n}\n\nexport type TraceNode = RootNode | SpanNode;\n\nexport interface VisibleSpan extends SpanNode {\n /**\n * The ref for this span's element in the DOM\n */\n ref?: MutableRefObject<HTMLButtonElement | null>;\n /**\n * The y position of this span (in # of rows)\n */\n row: number;\n /**\n * Whether the CursorMarker is intersecting this span\n */\n isHovered: boolean;\n /**\n * Whether this is the selected span\n */\n isSelected: boolean;\n /**\n * Whether this node is visible (based on its size on screen)\n */\n isVisible: boolean;\n /**\n * Events also need to be able to hold a ref to their element in the DOM\n */\n events?: VisibleSpanEvent[];\n}\n\nexport interface VisibleSpanEvent extends SpanNodeEvent {\n /**\n * The ref for this span's element in the DOM\n */\n ref?: MutableRefObject<HTMLDivElement | null>;\n /**\n * Whether the CursorMarker is intersecting this span\n */\n isHovered: boolean;\n}\n\nexport interface ScrollSnapshot {\n anchorT: number;\n anchorX: number;\n scrollLeft: number;\n scrollTop: number;\n startTime: number;\n endTime: number;\n startRow: number;\n endRow: number;\n scale: number;\n}\n\nexport type WorkerRequest = {\n requestId: number;\n} & (\n | {\n type: 'calculateSpanPositions';\n root: RootNode;\n }\n | {\n type: 'filterSpans';\n root: RootNode;\n filter: string;\n }\n);\n\nexport type WorkerResponse = {\n requestId: number;\n} & (\n | {\n type: 'setRowsResult';\n rows: VisibleSpan[][];\n isEnd: boolean;\n }\n | {\n type: 'updateHighlight';\n matches: Set<string>;\n }\n);\n\n/**\n * Represents one link to a page related to the selected\n * span in the detail panel.\n */\nexport interface QuickLink {\n /** Used as a React key and the user-facing name for the link */\n key: string;\n /** Until this Promise is fulfilled, the row will render with a skeleton for the value. */\n value: Promise<QuickLinkValue>;\n}\n\nexport interface QuickLinkValue {\n /** The visible components for the right side of this link */\n label: ReactNode;\n /** A special suffix to show for this link, defaults to the ExternalLink icon */\n icon?: ReactNode;\n /** The href that this link will open when clicked */\n href: string;\n}\n\nexport type GetQuickLinks = (node: Span) => QuickLink[];\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC","sourcesContent":["export const SEARCH_HEIGHT = 40;\nexport const SEARCH_GAP = 8;\nexport const MAP_HEIGHT = 56;\nexport const TIMELINE_PADDING = 8;\nexport const ROW_PADDING = 2;\nexport const ROW_HEIGHT = 24;\nexport const MARKER_HEIGHT = 24;\nexport const MARKER_NOTCH_HEIGHT = 8;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scrollbar-width.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/scrollbar-width.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAW,EAAE;IAC/C,IAAI,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC;IACjB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC;IACpC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC;IACrC,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACpD,SAAS,CAAC,MAAM,EAAE,CAAC;IAEnB,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC","sourcesContent":["export const detectScrollbarWidth = (): number => {\n if (!('document' in globalThis)) return 0;\n const size = 400;\n const container = document.createElement('div');\n container.style.width = `${size}px`;\n container.style.height = `${size}px`;\n container.style.overflow = 'scroll';\n document.body.appendChild(container);\n const scrollbarWidth = size - container.scrollWidth;\n container.remove();\n\n return scrollbarWidth;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"timing.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,MAAM,UAAU,cAAc,CAAC,CAAC,OAAO,EAAE,WAAW,CAGnD;IACC,OAAO,OAAO,GAAG,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EAAU,EAAU,EAAE,CAC9D,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAE3B,MAAM,sBAAsB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;IAC9D,qBAAqB,EAAE,CAAC;IACxB,qBAAqB,EAAE,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QACf,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1B,CAAC","sourcesContent":["import { formatDuration } from '../../../lib/utils';\n\nexport { formatDuration };\n\nexport function getHighResInMs([seconds, nanoseconds]: [\n number,\n number,\n]): number {\n return seconds * 1000 + nanoseconds / 1e6;\n}\n\nexport function getMsInHighRes(ms: number): [number, number] {\n return [Math.floor(ms / 1000), (ms % 1000) * 1000];\n}\n\n/**\n * Formats a duration for timeline display (compact single-unit format).\n * @deprecated Use formatDuration(ms, true) instead.\n */\nexport const formatDurationForTimeline = (ms: number): string =>\n formatDuration(ms, true);\n\nconst timeSelectionFormatter = new Intl.NumberFormat(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n});\n\nexport function formatTimeSelection(ms: number): string {\n if (ms >= 1000) {\n return `${timeSelectionFormatter.format(ms / 1000)}s`;\n }\n return `${timeSelectionFormatter.format(ms)}ms`;\n}\n\n/**\n * Format an epoch-millisecond timestamp as a local wall-clock time.\n * Returns a compact HH:MM:SS.mmm string (24-hour format).\n */\nexport function formatWallClockTime(epochMs: number): string {\n const d = new Date(epochMs);\n const h = String(d.getHours()).padStart(2, '0');\n const m = String(d.getMinutes()).padStart(2, '0');\n const s = String(d.getSeconds()).padStart(2, '0');\n return `${h}:${m}:${s}`;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/tree.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RootNode,\n Span,\n SpanNode,\n SpanNodeEvent,\n Trace,\n TraceNode,\n VisibleSpan,\n} from '../types';\nimport { getHighResInMs, getMsInHighRes } from './timing';\n\nexport const parseTrace = (\n trace: Trace\n): { root: RootNode; map: Record<string, SpanNode> } => {\n const { spans } = trace;\n const root: RootNode = {\n startTime: 0,\n endTime: 0,\n duration: 0,\n depth: 0,\n children: [],\n };\n const map: Record<string, SpanNode> = {};\n\n const resourceIndices = new Map<string, number>();\n const getResourceIndex = (resource: string): number => {\n const existing = resourceIndices.get(resource);\n if (existing) return existing;\n\n const index = resourceIndices.size + 1;\n resourceIndices.set(resource, index);\n return index;\n };\n\n let hasUserSpans = false;\n for (const span of spans) {\n const startTime = getHighResInMs(span.startTime);\n const endTime = getHighResInMs(span.endTime);\n const duration = getHighResInMs(span.duration);\n if (endTime > root.endTime) {\n root.endTime = endTime;\n root.duration = endTime - root.startTime;\n }\n if (root.startTime === 0 || startTime < root.startTime) {\n root.startTime = startTime;\n root.duration = root.endTime - startTime;\n }\n const isVercelResource = span.resource.startsWith('vercel.');\n if (!isVercelResource) {\n hasUserSpans = true;\n }\n\n const isVercel =\n isVercelResource &&\n (span.resource !== 'vercel.serverless-runtime' ||\n !('http.method' in span.attributes));\n\n const resourceIndex = isVercel ? 0 : getResourceIndex(span.resource);\n\n let label: string | undefined;\n if (isVercel) {\n label = `▲ ${span.name}`;\n }\n map[span.spanId] = {\n parent: null as unknown as SpanNode,\n startTime,\n endTime,\n duration,\n span,\n depth: 0,\n label,\n events: parseEvents(span),\n isVercel,\n children: [],\n resourceIndex,\n // Pass through activeStartTime if present (for showing queued period)\n activeStartTime: span.activeStartTime\n ? getHighResInMs(span.activeStartTime)\n : undefined,\n };\n }\n\n const addTo = (node: SpanNode, parentId?: string): void => {\n let parent: TraceNode | undefined;\n if (parentId) {\n parent = map[parentId];\n if (!parent) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Could not find parent span with spanId: %s', parentId);\n }\n parent = root;\n }\n } else {\n parent = root;\n }\n node.parent = parent;\n parent.children.push(node);\n };\n\n const updateDepth = (node: TraceNode): void => {\n if ('parent' in node) {\n node.depth = node.parent.depth + 1;\n }\n for (const child of node.children) {\n updateDepth(child);\n }\n };\n\n let hintIdCounter = 1;\n const addInstrumentationHint = (node: TraceNode, name: string): boolean => {\n if ('parent' in node) {\n if (node.span.name === name) {\n let waitUntilStart = node.endTime;\n // Detect the parent that's most likely to be at the bottom of the UI\n const findParent = (span: SpanNode): SpanNode => {\n if (!span.children.length) {\n if (span.span.name === 'waitUntil') {\n waitUntilStart = span.startTime;\n return span.parent as SpanNode;\n }\n return span;\n }\n\n return (\n span.children\n .map(findParent)\n .sort((a, b) => a.duration - b.duration)[0] || span\n );\n };\n const parent = findParent(node);\n\n const spanId = `instrumentation-hint-${hintIdCounter++}`;\n const offset = node.duration * 0.05;\n const startTime = node.startTime + offset;\n const endTime = Math.max(\n startTime + offset,\n Math.min(waitUntilStart - node.duration * 0.01, node.endTime - offset)\n );\n const duration = endTime - startTime;\n const hint: SpanNode = {\n parent,\n startTime,\n endTime,\n duration,\n span: {\n spanId,\n name: 'Add your spans here',\n resource: '',\n kind: 0,\n library: {\n name: '',\n },\n status: {\n code: 200,\n },\n traceFlags: 0,\n attributes: {},\n links: [],\n events: [],\n startTime: getMsInHighRes(startTime),\n endTime: getMsInHighRes(endTime),\n duration: getMsInHighRes(duration),\n },\n depth: node.depth + 1,\n isVercel: false,\n isInstrumentationHint: true,\n children: [],\n resourceIndex: 1,\n };\n parent.children.push(hint);\n map[spanId] = hint;\n return true;\n }\n }\n for (const child of node.children) {\n if (addInstrumentationHint(child, name)) return true;\n }\n return false;\n };\n\n // Create tree by matching nodes to their parents\n for (const node of Object.values(map)) {\n addTo(node, node.span.parentSpanId);\n }\n\n // Adjust depth of each node now that the tree is fully constructed\n updateDepth(root);\n\n // Add hints in the places where user spans would appear\n if (!hasUserSpans) {\n for (const name of [\n 'Invoke Function',\n 'Invoke Middleware',\n 'Vercel Runtime',\n ]) {\n if (addInstrumentationHint(root, name)) break;\n }\n }\n\n return { root, map };\n};\n\nconst parseEvents = (span: Span): SpanNodeEvent[] | undefined => {\n if (!span.events.length) return;\n\n const keyPrefix = `${span.spanId}:ev`;\n\n return span.events\n .map<SpanNodeEvent>((event, index) => ({\n key: `${keyPrefix}${index}`,\n timestamp: getHighResInMs(event.timestamp),\n event,\n }))\n .sort((a, b) => a.timestamp - b.timestamp);\n};\n\n/**\n * Adds a node to a row and attempts to find the ideal placement\n * within an existing row, creating a new one if necessary\n */\nexport const addToRow = (\n placed: VisibleSpan[][],\n node: VisibleSpan,\n precision: number\n): void => {\n const parent = node.parent as VisibleSpan | undefined;\n for (let y = (parent?.row || -1) + 1; ; ++y) {\n let row = placed[y];\n if (!row) {\n row = [];\n placed.push(row);\n } else if (\n !row.every(\n ({ startTime, endTime }) =>\n startTime + precision > node.endTime ||\n endTime - precision < node.startTime\n )\n ) {\n continue;\n }\n node.row = y;\n row.push(node);\n break;\n }\n};\n\nexport const spanVisiblityHelper = (\n node: TraceNode,\n scale: number,\n visible: VisibleSpan[]\n): void => {\n if ('parent' in node) {\n const n = node as VisibleSpan;\n n.row = -1;\n // Always make spans visible regardless of width\n n.isVisible = true;\n n.isHovered = false;\n if (!n.isVisible) return;\n\n visible.push(n);\n }\n\n for (const child of node.children) {\n spanVisiblityHelper(child, scale, visible);\n }\n};\n\nexport const adjustSpanVisibility = (\n span: VisibleSpan,\n _scale: number\n): boolean => {\n // Always make spans visible regardless of width\n span.isVisible = true;\n span.isHovered = false;\n\n return span.isVisible;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-immediate-style.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/use-immediate-style.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAU5C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAyC;IAEzC,MAAM,QAAQ,GAAG,MAAM,CAAgB,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE;QACtB,oEAAoE;QACpE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;AAChE,CAAC","sourcesContent":["'use client';\n\nimport type { CSSProperties, MutableRefObject } from 'react';\nimport { useCallback, useRef } from 'react';\n\ntype SetStyle = (propertyName: string, value: string | undefined) => void;\n\ninterface ImmediateStyle {\n setStyle: SetStyle;\n styleRef: MutableRefObject<CSSProperties>;\n style: CSSProperties;\n}\n\n/**\n * Update an element's style without forcing renders, but in a way that is still\n * safe if the element re-renders for another reason.\n * @returns The current style & a method to update the style\n */\nexport function useImmediateStyle(\n ref: MutableRefObject<HTMLElement | null>\n): ImmediateStyle {\n const styleRef = useRef<CSSProperties>({});\n const setStyle = useCallback<SetStyle>(\n (propertyName, value) => {\n // @ts-expect-error typeof keyof CSSProperties is too big of a union\n styleRef.current[propertyName] = value;\n if (!ref.current) return;\n if (!value) {\n ref.current.style.removeProperty(propertyName);\n return;\n }\n ref.current.style.setProperty(propertyName, value);\n },\n [ref]\n );\n\n return { setStyle, styleRef, style: { ...styleRef.current } };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-streaming-spans.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/use-streaming-spans.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,OAAO,EACL,aAAa,EACb,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAW9C,SAAS,cAAc;IACrB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,gBAA2B,EAC3B,WAAW,GAAG,KAAK,EAMnB,EAAE;IACF,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IAC7C,MAAM,EACJ,IAAI,EACJ,MAAM,EAAE,SAAS,EACjB,KAAK,EACL,WAAW,EACX,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,YAAY,GACb,GAAG,KAAK,CAAC;IACV,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAkB,cAAc,CAAC,CAAC;IAClE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GACnC,QAAQ,CAAgB,cAAc,CAAC,CAAC;IAC1C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GACrC,QAAQ,CAAqB,cAAc,CAAC,CAAC;IAC/C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,MAAM,eAAe,GAAG,MAAM,CAAe,SAAS,CAAC,CAAC;IACxD,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,gBAAgB,EAAE,MAAM;YAAE,OAAO;QAEtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;gBACvB,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClE,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa;oBAAE,SAAS;gBACnD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;gBACnC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,QAAQ,CAAC;YACP,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAErD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC/D,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QACH,IAAI,SAAS,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC;QACrC,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB,CAAC;YAE1C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,IAAI,IAAI,EAAE,SAAS,KAAK,SAAS;wBAAE,OAAO;oBAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BAC5B,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;gCACvB,sEAAsE;gCACtE,8BAA8B;gCAC9B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;4BAC3D,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnB,MAAM;gBACR,CAAC;gBACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;oBACvB,IAAI,IAAI,EAAE,SAAS,KAAK,SAAS;wBAAE,OAAO;oBAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;oBACzB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;wBACnB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;4BAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;gCACvB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gCACpD,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa;oCAAE,SAAS;gCACnD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;gCACnC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;4BACjD,CAAC;wBACH,CAAC;wBACD,OAAO,QAAQ,CAAC;oBAClB,CAAC,CAAC,CAAC;oBACH,QAAQ,CAAC;wBACP,IAAI,EAAE,aAAa;qBACpB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD;oBACE,MAAM;YACV,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE9C,MAAM,OAAO,GAAkB;YAC7B,SAAS;YACT,IAAI,EAAE,wBAAwB;YAC9B,IAAI;SACL,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE5B,eAAe,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACnB,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACf,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC/B,OAAO;wBACL,GAAG,IAAI;qBACR,CAAC;gBACJ,CAAC,CAAC,CACH,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,SAAS,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC;YACjC,MAAM,aAAa,GAAkB;gBACnC,IAAI,EAAE,aAAa;gBACnB,SAAS;gBACT,IAAI;gBACJ,MAAM;aACP,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAkB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;oBACvB,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;wBAAE,SAAS;oBACjD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;YACH,CAAC;YACD,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC;QACtC,IAAI,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;QACzC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAsB,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErE,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,MAAM,GAAG,IAAI,CAAC;YAEd,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,MAAM,CAAC,iBAAiB,CAAC,EACtE,IAAI,CAAC,MAAM,CACZ,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,GAAI,CAAC;gBAC5B,IAAI,KAAK,CAAC,CAAC,CAAC;oBAAE,SAAS;gBACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;oBAClC,MAAM,GAAG,KAAK,CAAC;oBACf,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;wBACjB,SAAS;oBACX,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,MAAM,QAAQ,GAAiB,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAEnB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;oBACvB,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC;wBAAE,SAAS;oBAEjD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC5B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBAEzB,QAAQ,CAAC,IAAI,CAAC;wBACZ,CAAC;wBACD,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;gBAED,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;YAC1C,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC;YAExB,IAAI,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC5B,OAAO,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACjC,CAAC;iBAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,CAAC;YAED,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,IAAiB,EAAU,EAAE;YAChD,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC;YAExB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACtC,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;YAChD,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC7C,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC;YAChD,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAElD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC;YAEvC,OAAO,IAAI,CAAC,IAAI,CACd,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CACvE,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,GAAS,EAAE;YAChC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;YAC5C,MAAM,OAAO,GAAG,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;YACnC,MAAM,QAAQ,GACZ,CAAC,SAAS,GAAG,aAAa,GAAG,gBAAgB,CAAC;gBAC9C,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;YAC7B,MAAM,MAAM,GACV,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC;YAEpE,QAAQ,GAAG;gBACT,OAAO;gBACP,OAAO;gBACP,UAAU;gBACV,SAAS;gBACT,SAAS,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,KAAK;gBAC9C,OAAO,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,KAAK;gBAC9D,QAAQ;gBACR,MAAM;gBACN,KAAK;aACN,CAAC;YACF,iBAAiB,CAAC,OAAO,GAAG,QAAQ,CAAC;YAErC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,GAAI,CAAC;gBACjC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,WAAW,GAAG,KAAK,CAAC;gBACpB,cAAc,EAAE,CAAC;YACnB,CAAC;YACD,UAAU,EAAE,CAAC;YACb,MAAM,OAAO,GAAkB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAEnB,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;oBAC9B,IAAI,CAAC,GAAG,QAAQ;wBAAE,SAAS;oBAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;gBACxD,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC;gBAC9C,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;YAED,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,OAAO,EAAE,CAAC;QAEV,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAQ,EAAE;YAC1C,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QACF,SAAS,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,EAAE;gBAAE,OAAO;YAEvC,WAAW,GAAG,IAAI,CAAC;YACnB,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChC,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC;QACF,SAAS,EAAE,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEhD,OAAO,GAAG,EAAE;YACV,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChC,SAAS,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,iBAAiB;QACjB,WAAW;QACX,aAAa;QACb,cAAc;QACd,WAAW;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,IAA6B,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC3C,IAAI,GAAG,CAAC,CAAC;gBACT,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;QACjC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QAE5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAExC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,KAAK,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7B,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,WAAW;KACnB,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,SAAS,cAAc,CAAI,KAAQ;IACjC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO;QAE7B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC;gBACtB,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC;QACF,OAAO,EAAE,CAAC;QAEV,OAAO,GAAG,EAAE;YACV,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpB,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useTraceViewer } from '../context';\nimport type {\n VisibleSpan,\n VisibleSpanEvent,\n WorkerRequest,\n WorkerResponse,\n} from '../types';\nimport {\n MARKER_HEIGHT,\n ROW_HEIGHT,\n ROW_PADDING,\n TIMELINE_PADDING,\n} from './constants';\nimport { adjustSpanVisibility } from './tree';\n\ntype UpdateFilter = (filter: string) => void;\n\ninterface QueuedSpan {\n /** The distance from this span to the viewport */\n d: number;\n /** The span that's waiting to be rendered */\n span: VisibleSpan;\n}\n\nfunction emptyArrayInit<T>(): T[] {\n return [];\n}\n\nexport const useStreamingSpans = (\n highlightedSpans?: string[],\n eagerRender = false\n): {\n rows: VisibleSpan[][];\n spans: VisibleSpan[];\n events: VisibleSpanEvent[];\n scale: number;\n} => {\n const { state, dispatch } = useTraceViewer();\n const {\n root,\n filter: ctxFilter,\n scale,\n timelineRef,\n timelineWidth,\n spanMap,\n scrollSnapshotRef,\n selected,\n memoCacheRef,\n } = state;\n const timelineHeight = useStableValue(state.timelineHeight);\n const counterRef = useRef(0);\n const [rows, setRows] = useState<VisibleSpan[][]>(emptyArrayInit);\n const [visibleSpans, setVisibleSpans] =\n useState<VisibleSpan[]>(emptyArrayInit);\n const [visibleEvents, setVisibleEvents] =\n useState<VisibleSpanEvent[]>(emptyArrayInit);\n const [resultScale, setResultScale] = useState(-1);\n\n const updateFilterRef = useRef<UpdateFilter>(undefined);\n useEffect(() => updateFilterRef.current?.(ctxFilter), [ctxFilter]);\n\n useEffect(() => {\n if (!highlightedSpans?.length) return;\n\n for (const row of rows) {\n for (const node of row) {\n const isHighlighted = highlightedSpans.includes(node.span.spanId);\n if (node.isHighlighted === isHighlighted) continue;\n node.isHighlighted = isHighlighted;\n memoCacheRef.current.set(node.span.spanId, {});\n }\n }\n dispatch({\n type: 'forceRender',\n });\n }, [rows, highlightedSpans, dispatch, memoCacheRef]);\n\n useEffect(() => {\n if (!root.startTime) return;\n\n const worker = new Worker(new URL('../worker', import.meta.url), {\n type: 'module',\n });\n let requestId = ++counterRef.current;\n const onMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerResponse;\n\n switch (data.type) {\n case 'setRowsResult': {\n if (data?.requestId !== requestId) return;\n if (data.isEnd) {\n for (const row of data.rows) {\n for (const node of row) {\n // Ensure that we remap to the original span to reduce memory overhead\n // and confusion down the line\n node.span = spanMap[node.span.spanId]?.span ?? node.span;\n }\n }\n }\n setRows(data.rows);\n break;\n }\n case 'updateHighlight': {\n if (data?.requestId !== requestId) return;\n const { matches } = data;\n setRows((previous) => {\n for (const row of previous) {\n for (const node of row) {\n const isHighlighted = matches.has(node.span.spanId);\n if (node.isHighlighted === isHighlighted) continue;\n node.isHighlighted = isHighlighted;\n memoCacheRef.current.set(node.span.spanId, {});\n }\n }\n return previous;\n });\n dispatch({\n type: 'forceRender',\n });\n break;\n }\n default:\n break;\n }\n };\n worker.addEventListener('message', onMessage);\n\n const message: WorkerRequest = {\n requestId,\n type: 'calculateSpanPositions',\n root,\n };\n worker.postMessage(message);\n\n updateFilterRef.current = (_filter) => {\n const filter = _filter.trim().toLocaleLowerCase();\n if (!filter) {\n setRows((previous) =>\n previous.map((row) =>\n row.map((node) => {\n node.isHighlighted = undefined;\n return {\n ...node,\n };\n })\n )\n );\n return;\n }\n\n requestId = ++counterRef.current;\n const filterMessage: WorkerRequest = {\n type: 'filterSpans',\n requestId,\n root,\n filter,\n };\n worker.postMessage(filterMessage);\n };\n\n return () => {\n worker.terminate();\n };\n }, [root, spanMap, dispatch, memoCacheRef]);\n\n useEffect(() => {\n if (!rows.length) return;\n\n if (eagerRender) {\n const visible: VisibleSpan[] = [];\n const events: VisibleSpanEvent[] = [];\n for (const row of rows) {\n for (const span of row) {\n if (!adjustSpanVisibility(span, scale)) continue;\n visible.push(span);\n if (span.events) {\n events.push(...span.events);\n }\n }\n }\n setVisibleSpans(visible);\n setVisibleEvents(events);\n setResultScale(scale);\n return;\n }\n\n const $timeline = timelineRef.current;\n let snapshot = scrollSnapshotRef.current;\n let hasScrolled = false;\n let isDone = false;\n let maxD = 0;\n let currentD = 0;\n const overscan = Math.max(500, timelineWidth * 0.5);\n const queue = new Array<QueuedSpan[] | null>(rows.length).fill(null);\n\n const buildQueue = (): void => {\n isDone = true;\n\n const lastRow = Math.min(\n 1 + currentD + Math.ceil(snapshot?.endRow ?? Number.POSITIVE_INFINITY),\n rows.length\n );\n for (let i = lastRow; i--; ) {\n if (queue[i]) continue;\n const rowDelta = getRowDelta(i);\n if (Math.abs(rowDelta) > currentD) {\n isDone = false;\n if (rowDelta > 0) {\n continue;\n } else {\n break;\n }\n }\n\n const queueRow: QueuedSpan[] = [];\n const row = rows[i];\n if (!row) continue;\n\n for (const span of row) {\n if (!adjustSpanVisibility(span, scale)) continue;\n\n const d = getDistance(span);\n maxD = Math.max(d, maxD);\n\n queueRow.push({\n d,\n span,\n });\n }\n\n queue[i] = queueRow;\n }\n };\n\n /**\n * This returns the signed distance between the row and the targeted rows\n */\n const getRowDelta = (row: number): number => {\n if (!snapshot) return 0;\n\n if (row < snapshot.startRow) {\n return row - snapshot.startRow;\n } else if (row > snapshot.endRow) {\n return row - snapshot.endRow;\n }\n\n return 0;\n };\n\n const getDistance = (span: VisibleSpan): number => {\n if (!snapshot) return 0;\n\n let xDistance = 0;\n if (span.endTime < snapshot.startTime) {\n xDistance = snapshot.startTime - span.endTime;\n } else if (span.startTime > snapshot.endTime) {\n xDistance = span.startTime - snapshot.endTime;\n }\n\n const yDistance = Math.abs(getRowDelta(span.row));\n\n if (!xDistance && !yDistance) return 0;\n\n return Math.sqrt(\n (xDistance / scale) ** 2 + (yDistance * ROW_HEIGHT + ROW_PADDING) ** 2\n );\n };\n\n const updateSnapshot = (): void => {\n if (!$timeline) return;\n\n const { scrollLeft, scrollTop } = $timeline;\n const anchorX = 0;\n const anchorT = scrollLeft / scale;\n const startRow =\n (scrollTop - MARKER_HEIGHT - TIMELINE_PADDING) /\n (ROW_HEIGHT + ROW_PADDING);\n const endRow =\n startRow + Math.ceil(timelineHeight / (ROW_HEIGHT + ROW_PADDING));\n\n snapshot = {\n anchorT,\n anchorX,\n scrollLeft,\n scrollTop,\n startTime: root.startTime + scrollLeft / scale,\n endTime: root.startTime + (scrollLeft + timelineWidth) / scale,\n startRow,\n endRow,\n scale,\n };\n scrollSnapshotRef.current = snapshot;\n\n for (let i = queue.length; i--; ) {\n queue[i] = null;\n }\n };\n\n let nextFrame = 0;\n const onFrame = (): void => {\n if (hasScrolled || !snapshot) {\n hasScrolled = false;\n updateSnapshot();\n }\n buildQueue();\n const visible: VisibleSpan[] = [];\n const events: VisibleSpanEvent[] = [];\n for (const row of queue) {\n if (!row) continue;\n\n for (const { d, span } of row) {\n if (d > currentD) continue;\n visible.push(span);\n if (span.events) {\n events.push(...span.events);\n }\n }\n }\n\n if (currentD < overscan && (!isDone || currentD < maxD)) {\n currentD = Math.min(overscan, currentD + 100);\n nextFrame = requestAnimationFrame(onFrame);\n }\n\n setVisibleSpans(visible);\n setVisibleEvents(events);\n setResultScale(scale);\n };\n onFrame();\n\n let ignoreT = Date.now();\n const onWheel = (event: WheelEvent): void => {\n if (event.ctrlKey || event.metaKey) {\n ignoreT = Date.now();\n }\n };\n $timeline?.addEventListener('wheel', onWheel);\n\n const onScroll = (): void => {\n if (Date.now() - ignoreT <= 50) return;\n\n hasScrolled = true;\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n $timeline?.addEventListener('scroll', onScroll);\n\n return () => {\n cancelAnimationFrame(nextFrame);\n $timeline?.removeEventListener('wheel', onWheel);\n $timeline?.removeEventListener('scroll', onScroll);\n };\n }, [\n rows,\n root,\n scale,\n scrollSnapshotRef,\n timelineRef,\n timelineWidth,\n timelineHeight,\n eagerRender,\n ]);\n\n useEffect(() => {\n if (!selected) return;\n\n let span: VisibleSpan | undefined;\n for (const x of visibleSpans) {\n if (x.span.spanId === selected.span.spanId) {\n span = x;\n break;\n }\n }\n\n const $span = span?.ref?.current;\n if (!span || !$span) return;\n\n span.isSelected = true;\n $span.setAttribute('data-selected', '');\n\n return () => {\n span.isSelected = false;\n $span.removeAttribute('data-selected');\n };\n }, [visibleSpans, selected]);\n\n return {\n rows,\n spans: visibleSpans,\n events: visibleEvents,\n scale: resultScale,\n };\n};\n\n/**\n * This hook keeps returning the same value until the current value\n * has been stable for a few frames in a row\n */\nfunction useStableValue<T>(value: T): T {\n const [cached, setCached] = useState(value);\n\n useEffect(() => {\n if (cached === value) return;\n\n let frameCount = 0;\n let nextFrame = 0;\n const onFrame = (): void => {\n if (++frameCount <= 3) {\n nextFrame = requestAnimationFrame(onFrame);\n return;\n }\n\n setCached(value);\n };\n onFrame();\n\n return () => {\n cancelAnimationFrame(nextFrame);\n };\n }, [cached, value]);\n\n return cached;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-trackpad-zoom.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/use-trackpad-zoom.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAO1C,MAAM,UAAU,eAAe,CAAC,OAA4B;IAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACjC,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAQ,EAAE;YAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO;YAE7C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAE1B,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC;gBACxB,KAAK,UAAU,CAAC,cAAc;oBAC5B,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;oBAC5B,MAAM;gBACR,KAAK,UAAU,CAAC,cAAc;oBAC5B,KAAK,IAAI,EAAE,CAAC;oBACZ,MAAM;gBACR;oBACE,MAAM;YACV,CAAC;YAED,YAAY,IAAI,KAAK,CAAC;YACtB,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChC,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9D,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC","sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * The delta is positive while zooming in, negative while zooming out\n */\nexport type TrackpadZoomHandler = (delta: number) => void;\n\nexport function useTrackpadZoom(handler: TrackpadZoomHandler): void {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n let pendingDelta = 0;\n let nextFrame = 0;\n const onFrame = (): void => {\n handlerRef.current(pendingDelta);\n pendingDelta = 0;\n };\n\n const onWheel = (event: WheelEvent): void => {\n if (!event.ctrlKey && !event.metaKey) return;\n\n event.preventDefault();\n let delta = -event.deltaY;\n\n switch (event.deltaMode) {\n case WheelEvent.DOM_DELTA_PAGE:\n delta *= window.innerHeight;\n break;\n case WheelEvent.DOM_DELTA_LINE:\n delta *= 20;\n break;\n default:\n break;\n }\n\n pendingDelta += delta;\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n\n window.addEventListener('wheel', onWheel, { passive: false });\n\n return () => {\n window.removeEventListener('wheel', onWheel);\n cancelAnimationFrame(nextFrame);\n };\n }, []);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/components/trace-viewer/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RootNode,\n Span,\n TraceNode,\n VisibleSpan,\n WorkerRequest,\n WorkerResponse,\n} from './types';\nimport { addToRow } from './util/tree';\n\n// The most recent requestId\nlet requestId = 0;\n\nself.addEventListener('message', (event) => {\n const data = event.data as WorkerRequest;\n requestId = Math.max(requestId, data?.requestId || 0);\n\n switch (data.type) {\n case 'calculateSpanPositions':\n calculateSpanPositions(data.root);\n break;\n case 'filterSpans':\n filterSpans(data.root, data.filter);\n break;\n default:\n break;\n }\n});\n\nconst positionHelper = (node: TraceNode, pending: VisibleSpan[]): void => {\n if ('parent' in node) {\n const n = node as VisibleSpan;\n n.row = -1;\n n.isVisible = true;\n pending.push(n);\n }\n\n const sortedChildren = node.children\n .slice()\n .sort((a, b) => a.startTime - b.startTime || b.duration - a.duration);\n for (const child of sortedChildren) {\n positionHelper(child, pending);\n }\n};\n\nconst calculateSpanPositions = (root: RootNode): void => {\n const responseId = requestId;\n const placed: VisibleSpan[][] = [];\n const pending: VisibleSpan[] = [];\n\n positionHelper(root, pending);\n\n let lastFlushT = Date.now() - 10;\n let lastFlushC = -64;\n let count = 0;\n const flush = (): void => {\n for (const row of placed) {\n row.sort((a, b) => a.startTime - b.startTime);\n }\n const message: WorkerResponse = {\n requestId: responseId,\n type: 'setRowsResult',\n rows: placed,\n isEnd: !pending.length,\n };\n postMessage(message);\n lastFlushT = Date.now();\n lastFlushC = count;\n };\n\n while (true) {\n const node = pending.shift();\n if (!node) {\n flush();\n return;\n }\n addToRow(placed, node, 0.001);\n ++count;\n if (Date.now() - lastFlushT >= 15 || count - lastFlushC >= 256) {\n flush();\n }\n }\n};\n\nconst ATTR_FILTER_REGEX = /(?<=^|\\s)(?<pair>(?<key>[\\w.]+):(?<value>\\S*))/g;\n\nconst filterSpans = (root: RootNode, filter: string): void => {\n const responseId = requestId;\n\n const matches = new Set<string>();\n\n const name = filter\n .replace(ATTR_FILTER_REGEX, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n const attrs: [string, string][] = [];\n for (const m of filter.matchAll(ATTR_FILTER_REGEX)) {\n const { key = '', value = '' } = m.groups || {};\n attrs.push([key, value.toLocaleLowerCase()]);\n }\n\n const match = (span: Span): boolean => {\n const nameMatch =\n span.name.toLocaleLowerCase().includes(name) ||\n span.spanId.toLocaleLowerCase().includes(name);\n if (!nameMatch) return false;\n // TODO: support resource attribute filtering\n return attrs.every(([key, value]) => {\n const v = span.attributes[key];\n if (!v) return false;\n return String(v).toLocaleLowerCase().includes(value);\n });\n };\n\n const helper = (node: TraceNode): void => {\n for (const child of node.children) {\n if (match(child.span)) {\n matches.add(child.span.spanId);\n }\n helper(child);\n }\n };\n helper(root);\n\n const message: WorkerResponse = {\n requestId: responseId,\n type: 'updateHighlight',\n matches,\n };\n postMessage(message);\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/components/ui/alert.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,MAAM,aAAa,GAAG,GAAG,CACvB,mIAAmI,EACnI;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,EAAE;YACX,WAAW,EACT,sEAAsE;SACzE;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;KACnB;CACF,CACF,CAAC;AAEF,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAG5B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAC3C,cACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KAChD,KAAK,GACT,CACH,CAAC,CAAC;AACH,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;AAE5B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,KACpE,KAAK,GACT,CACH,CAAC,CAAC;AACH,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;AAEtC,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAGvC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,CACH,CAAC,CAAC;AACH,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4',\n {\n variants: {\n variant: {\n default: '',\n destructive:\n 'border-red-400 text-red-900 dark:border-red-700 [&>svg]:text-red-900',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = 'Alert';\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn('mb-1 font-medium leading-none tracking-tight', className)}\n {...props}\n />\n));\nAlertTitle.displayName = 'AlertTitle';\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('text-sm [&_p]:leading-relaxed', className)}\n {...props}\n />\n));\nAlertDescription.displayName = 'AlertDescription';\n\nexport { Alert, AlertTitle, AlertDescription };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"card.js","sourceRoot":"","sources":["../../../src/components/ui/card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAG3B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,KACnD,KAAK,GACT,CACH,CAAC,CAAC;AACH,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;AAE1B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,CACH,CAAC,CAAC;AACH,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;AAEtC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,oDAAoD,EACpD,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAGtC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EACnC,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAClC,KAAK,GACT,CACH,CAAC,CAAC;AACH,eAAe,CAAC,WAAW,GAAG,iBAAiB,CAAC;AAEhD,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CACnE,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,KAClD,KAAK,GACT,CACH,CAAC,CAAC;AACH,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;AAEtC,OAAO,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,GACZ,CAAC","sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-lg border shadow-sm', className)}\n {...props}\n />\n));\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n));\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('text-sm', className)}\n style={{ color: 'var(--ds-gray-900)' }}\n {...props}\n />\n));\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n));\nCardContent.displayName = 'CardContent';\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n));\nCardFooter.displayName = 'CardFooter';\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-inspector.js","sourceRoot":"","sources":["../../../src/components/ui/data-inspector.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\n/**\n * Reusable data inspector component built on react-inspector.\n *\n * All data rendering in the o11y UI should use this component to ensure\n * consistent theming, custom type handling (StreamRef, ClassInstanceRef),\n * and expand behavior.\n */\n\nimport { Lock } from 'lucide-react';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n ObjectInspector,\n ObjectLabel,\n ObjectName,\n ObjectRootLabel,\n ObjectValue,\n} from 'react-inspector';\nimport { useDarkMode } from '../../hooks/use-dark-mode';\nimport { ENCRYPTED_DISPLAY_NAME } from '../../lib/hydration';\nimport {\n type InspectorThemeExtended,\n inspectorThemeDark,\n inspectorThemeExtendedDark,\n inspectorThemeExtendedLight,\n inspectorThemeLight,\n} from './inspector-theme';\nimport { Spinner } from './spinner';\n\n// ---------------------------------------------------------------------------\n// StreamRef / ClassInstanceRef type detection\n// (inline to avoid circular deps with hydration module)\n// ---------------------------------------------------------------------------\n\nconst STREAM_REF_TYPE = '__workflow_stream_ref__';\nconst CLASS_INSTANCE_REF_TYPE = '__workflow_class_instance_ref__';\nconst RUN_REF_TYPE = '__workflow_run_ref__';\n\ninterface StreamRef {\n __type: typeof STREAM_REF_TYPE;\n streamId: string;\n}\n\ninterface RunRef {\n __type: typeof RUN_REF_TYPE;\n runId: string;\n}\n\nfunction isStreamRef(value: unknown): value is StreamRef {\n if (value === null || typeof value !== 'object') return false;\n // Check both enumerable and non-enumerable __type (opaque refs use non-enumerable)\n const desc = Object.getOwnPropertyDescriptor(value, '__type');\n return desc?.value === STREAM_REF_TYPE;\n}\n\nfunction isRunRef(value: unknown): value is RunRef {\n if (value === null || typeof value !== 'object') return false;\n const desc = Object.getOwnPropertyDescriptor(value, '__type');\n return desc?.value === RUN_REF_TYPE;\n}\n\nfunction isClassInstanceRef(value: unknown): value is {\n __type: string;\n className: string;\n classId: string;\n data: unknown;\n} {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__type' in value &&\n (value as Record<string, unknown>).__type === CLASS_INSTANCE_REF_TYPE\n );\n}\n\n// ---------------------------------------------------------------------------\n// Stream click context (passed through from the panel)\n// ---------------------------------------------------------------------------\n\n/**\n * Context for passing stream click handlers down to DataInspector instances.\n * Exported so that parent components (e.g., AttributePanel) can provide the handler.\n */\nexport const StreamClickContext = createContext<\n ((streamId: string) => void) | undefined\n>(undefined);\n\n/**\n * Context for passing a decrypt handler down to DataInspector instances.\n * When provided, encrypted markers become clickable buttons that trigger decryption.\n */\nexport type DecryptClickContextValue = {\n onDecrypt: () => void;\n isDecrypting: boolean;\n};\n\nexport const DecryptClickContext = createContext<\n DecryptClickContextValue | undefined\n>(undefined);\n\nexport const RunClickContext = createContext<\n ((runId: string) => void) | undefined\n>(undefined);\n\nfunction EncryptedInlineLabel() {\n const ctx = useContext(DecryptClickContext);\n if (ctx) {\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[11px] cursor-pointer\"\n style={{\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-700)',\n border: '1px solid var(--ds-gray-400)',\n fontStyle: 'italic',\n opacity: ctx.isDecrypting ? 0.6 : 1,\n }}\n disabled={ctx.isDecrypting}\n onClick={(e) => {\n e.stopPropagation();\n ctx.onDecrypt();\n }}\n title=\"Click to decrypt\"\n >\n {ctx.isDecrypting ? (\n <Spinner size={12} />\n ) : (\n <Lock\n className=\"h-3 w-3\"\n style={{ display: 'inline', flexShrink: 0 }}\n />\n )}\n <span>{ctx.isDecrypting ? 'Decrypting…' : 'Decrypt'}</span>\n </button>\n );\n }\n return (\n <span style={{ color: 'var(--ds-gray-600)', fontStyle: 'italic' }}>\n <Lock\n className=\"h-3 w-3\"\n style={{\n display: 'inline',\n verticalAlign: 'middle',\n marginRight: '3px',\n marginTop: '-1px',\n }}\n />\n Encrypted\n </span>\n );\n}\nfunction StreamRefInline({ streamRef }: { streamRef: StreamRef }) {\n const onStreamClick = useContext(StreamClickContext);\n const [hovered, setHovered] = useState(false);\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors\"\n style={{\n backgroundColor: hovered ? 'var(--ds-blue-200)' : 'var(--ds-blue-100)',\n color: 'var(--ds-blue-900)',\n border: '1px solid var(--ds-blue-300)',\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={(e) => {\n e.stopPropagation();\n onStreamClick?.(streamRef.streamId);\n }}\n title={`View stream: ${streamRef.streamId}`}\n >\n <span>📡</span>\n <span>{streamRef.streamId}</span>\n </button>\n );\n}\n\nfunction RunRefInline({ runRef }: { runRef: RunRef }) {\n const onRunClick = useContext(RunClickContext);\n const [hovered, setHovered] = useState(false);\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors\"\n style={{\n backgroundColor: hovered\n ? 'var(--ds-purple-200)'\n : 'var(--ds-purple-100)',\n color: 'var(--ds-purple-900)',\n border: '1px solid var(--ds-purple-300)',\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={(e) => {\n e.stopPropagation();\n onRunClick?.(runRef.runId);\n }}\n title={`View run: ${runRef.runId}`}\n >\n <span>{runRef.runId}</span>\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Extended theme context (for colors react-inspector doesn't support natively)\n// ---------------------------------------------------------------------------\n\nconst ExtendedThemeContext = createContext<InspectorThemeExtended>(\n inspectorThemeExtendedLight\n);\n\n// ---------------------------------------------------------------------------\n// Custom nodeRenderer\n// ---------------------------------------------------------------------------\n\n/**\n * Extends the default react-inspector nodeRenderer with special handling\n * for ClassInstanceRef, StreamRef, and Date types.\n *\n * react-inspector renders Date instances as unstyled plain text (no theme\n * key exists for them), so we intercept here and apply the magenta color\n * from our extended theme — matching Node.js util.inspect()'s date style.\n *\n * Default nodeRenderer reference:\n * https://github.com/storybookjs/react-inspector/blob/main/README.md#noderenderer\n */\nfunction NodeRenderer({\n depth,\n name,\n data,\n isNonenumerable,\n}: {\n depth: number;\n name?: string;\n data: unknown;\n isNonenumerable?: boolean;\n expanded?: boolean;\n}) {\n const extendedTheme = useContext(ExtendedThemeContext);\n\n // Encrypted marker → flat label with Lock icon, clickable when onDecrypt is available\n if (\n data !== null &&\n typeof data === 'object' &&\n data.constructor?.name === ENCRYPTED_DISPLAY_NAME\n ) {\n const label = <EncryptedInlineLabel />;\n if (depth === 0) {\n return label;\n }\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n {label}\n </span>\n );\n }\n\n // StreamRef → inline clickable badge\n if (isStreamRef(data)) {\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <StreamRefInline streamRef={data} />\n </span>\n );\n }\n\n // RunRef → inline clickable badge linking to the target run\n if (isRunRef(data)) {\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <RunRefInline runRef={data} />\n </span>\n );\n }\n\n // ClassInstanceRef → show className as type, data as the inspectable value\n if (isClassInstanceRef(data)) {\n if (depth === 0) {\n return <ObjectRootLabel name={data.className} data={data.data} />;\n }\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <span style={{ fontStyle: 'italic' }}>{data.className} </span>\n <ObjectValue object={data.data} />\n </span>\n );\n }\n\n // Date → magenta color (Node.js: 'date' → 'magenta')\n // react-inspector has no OBJECT_VALUE_DATE_COLOR theme key, so we handle it here.\n if (data instanceof Date) {\n const dateStr = data.toISOString();\n if (depth === 0) {\n return (\n <span style={{ color: extendedTheme.OBJECT_VALUE_DATE_COLOR }}>\n {dateStr}\n </span>\n );\n }\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <span style={{ color: extendedTheme.OBJECT_VALUE_DATE_COLOR }}>\n {dateStr}\n </span>\n </span>\n );\n }\n\n // Default rendering (same as react-inspector's built-in)\n if (depth === 0) {\n return <ObjectRootLabel name={name} data={data} />;\n }\n return (\n <ObjectLabel name={name} data={data} isNonenumerable={isNonenumerable} />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\n/**\n * Create a non-expandable wrapper that carries ref data as non-enumerable\n * properties. ObjectInspector won't render children for objects with no\n * enumerable keys, but our NodeRenderer can still detect them.\n */\nfunction makeOpaqueRef(ref: Record<string, unknown>): unknown {\n const opaque = Object.create(null);\n for (const [key, value] of Object.entries(ref)) {\n Object.defineProperty(opaque, key, { value, enumerable: false });\n }\n return opaque;\n}\n\n/**\n * Recursively walk data and replace RunRef/StreamRef objects with\n * non-expandable versions so ObjectInspector doesn't show their internals.\n * Only recurses into plain objects and arrays to avoid stripping class\n * instances (Date, Error, Map, Set, URL, Headers, etc.) that have their\n * own rendering in NodeRenderer.\n */\nfunction collapseRefs(data: unknown): unknown {\n if (data === null || typeof data !== 'object') return data;\n if (isRunRef(data) || isStreamRef(data))\n return makeOpaqueRef(data as unknown as Record<string, unknown>);\n if (Array.isArray(data)) return data.map(collapseRefs);\n // Only recurse into plain objects — leave class instances untouched\n const proto = Object.getPrototypeOf(data);\n if (proto !== Object.prototype && proto !== null) return data;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n result[key] = collapseRefs(value);\n }\n return result;\n}\n\nexport interface DataInspectorProps {\n /** The data to inspect */\n data: unknown;\n /** Initial expand depth (default: 2) */\n expandLevel?: number;\n /** Optional name for the root node */\n name?: string;\n /** Callback when a stream reference is clicked */\n onStreamClick?: (streamId: string) => void;\n /** Callback when a run reference is clicked */\n onRunClick?: (runId: string) => void;\n /** Callback when an encrypted marker is clicked (triggers decryption) */\n onDecrypt?: () => void;\n /** Whether decryption is currently in progress */\n isDecrypting?: boolean;\n}\n\nexport function DataInspector({\n data,\n expandLevel = 2,\n name,\n onStreamClick,\n onRunClick,\n onDecrypt,\n isDecrypting = false,\n}: DataInspectorProps) {\n const collapsedData = useMemo(() => collapseRefs(data), [data]);\n const stableData = useStableInspectorData(collapsedData);\n const [initialExpandLevel, setInitialExpandLevel] = useState(expandLevel);\n const isDark = useDarkMode();\n const extendedTheme = isDark\n ? inspectorThemeExtendedDark\n : inspectorThemeExtendedLight;\n\n useEffect(() => {\n // react-inspector reapplies expandLevel on every data change, which can\n // reopen paths the user manually collapsed. Apply it only on mount.\n setInitialExpandLevel(0);\n }, []);\n\n const content = (\n <ExtendedThemeContext.Provider value={extendedTheme}>\n <ObjectInspector\n data={stableData}\n name={name}\n // @ts-expect-error react-inspector accepts theme objects at runtime despite\n // types declaring string only — see https://github.com/storybookjs/react-inspector/blob/main/README.md#theme\n theme={isDark ? inspectorThemeDark : inspectorThemeLight}\n expandLevel={initialExpandLevel}\n nodeRenderer={NodeRenderer}\n />\n </ExtendedThemeContext.Provider>\n );\n\n let wrapped = content;\n\n if (onStreamClick) {\n wrapped = (\n <StreamClickContext.Provider value={onStreamClick}>\n {wrapped}\n </StreamClickContext.Provider>\n );\n }\n if (onRunClick) {\n wrapped = (\n <RunClickContext.Provider value={onRunClick}>\n {wrapped}\n </RunClickContext.Provider>\n );\n }\n if (onDecrypt) {\n wrapped = (\n <DecryptClickContext.Provider value={{ onDecrypt, isDecrypting }}>\n {wrapped}\n </DecryptClickContext.Provider>\n );\n }\n\n return wrapped;\n}\n\nfunction useStableInspectorData<T>(next: T): T {\n const previousRef = useRef<T>(next);\n if (!isDeepEqual(previousRef.current, next)) {\n previousRef.current = next;\n }\n return previousRef.current;\n}\n\nfunction isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isDeepEqual(a: unknown, b: unknown, seen = new WeakMap()): boolean {\n if (Object.is(a, b)) return true;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [key, value] of a.entries()) {\n if (!b.has(key) || !isDeepEqual(value, b.get(key), seen)) return false;\n }\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const value of a.values()) {\n if (!b.has(value)) return false;\n }\n return true;\n }\n\n if (!isObjectLike(a) || !isObjectLike(b)) {\n return false;\n }\n\n if (seen.get(a) === b) return true;\n seen.set(a, b);\n\n const aIsArray = Array.isArray(a);\n const bIsArray = Array.isArray(b);\n if (aIsArray !== bIsArray) return false;\n\n if (aIsArray && bIsArray) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n if (!isDeepEqual(a[i], b[i], seen)) return false;\n }\n return true;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!Object.hasOwn(b, key)) return false;\n if (!isDeepEqual(a[key], b[key], seen)) return false;\n }\n\n return true;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"decrypt-button.js","sourceRoot":"","sources":["../../../src/components/ui/decrypt-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,2lBAA2lB,CAAC;AAW3mB;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,KAAK,EACf,OAAO,GACY;IACnB,OAAO,CACL,8BACE,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EACxC,QAAQ,EAAE,SAAS,IAAI,OAAO,EAC9B,SAAS,EAAE,kBAAkB,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,EAAE,aAE/E,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,GAAI,CACtB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CACd,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,EACd,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,aAEtB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAC1D,eAAM,CAAC,EAAC,yBAAyB,GAAG,IAChC,CACP,CAAC,CAAC,CAAC,CACF,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,EACd,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,aAEtB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAC1D,eAAM,CAAC,EAAC,0BAA0B,GAAG,IACjC,CACP,EACA,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,IACvD,IACR,CACJ,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { Spinner } from './spinner';\n\nconst STYLES = `.wf-decrypt-btn{appearance:none;-webkit-appearance:none;border:none;display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 12px;border-radius:6px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;white-space:nowrap;gap:6px;transition:background 150ms}.wf-decrypt-idle{color:var(--ds-gray-1000);background:var(--ds-background-100);box-shadow:0 0 0 1px var(--ds-gray-400)}.wf-decrypt-idle:hover{background:var(--ds-gray-alpha-200)}.wf-decrypt-done{color:var(--ds-green-900);background:var(--ds-green-100);box-shadow:0 0 0 1px var(--ds-green-400);cursor:default}`;\n\ninterface DecryptButtonProps {\n /** Whether an encryption key has been obtained (decryption is active). */\n decrypted?: boolean;\n /** Whether the key is currently being fetched. */\n loading?: boolean;\n /** Called when the user clicks to initiate decryption. */\n onClick?: () => void;\n}\n\n/**\n * Decrypt/Decrypted button using Geist secondary style.\n * Three states: idle (secondary gray), decrypting (spinner), decrypted (green success).\n */\nexport function DecryptButton({\n decrypted = false,\n loading = false,\n onClick,\n}: DecryptButtonProps) {\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: STYLES }} />\n <button\n type=\"button\"\n onClick={decrypted ? undefined : onClick}\n disabled={decrypted || loading}\n className={`wf-decrypt-btn ${decrypted ? 'wf-decrypt-done' : 'wf-decrypt-idle'}`}\n >\n {loading ? (\n <Spinner size={14} />\n ) : decrypted ? (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 9.9-1\" />\n </svg>\n ) : (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n )}\n {loading ? 'Decrypting…' : decrypted ? 'Decrypted' : 'Decrypt'}\n </button>\n </>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-card.js","sourceRoot":"","sources":["../../../src/components/ui/error-card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAWrC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,SAAS,EACT,OAAO,GAAG,eAAe,GACV;IACf,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,eACE,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,SAAS,CACV,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,aAE1C,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,EACzC,SAAS,EAAC,sFAAsF,EAChG,KAAK,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,aAErC,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,WAAW,IAAC,SAAS,EAAC,kBAAkB,GAAG,EAC5C,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,IAChD,EACN,eAAK,SAAS,EAAC,sCAAsC,aACnD,eAAM,SAAS,EAAC,SAAS,sCAA6B,EACtD,KAAC,WAAW,IACV,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,UAAU,IAAI,YAAY,CAC3B,GACD,IACE,IACC,EAER,UAAU,IAAI,OAAO,IAAI,CACxB,cACE,SAAS,EAAC,WAAW,EACrB,KAAK,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,YAEnD,cACE,SAAS,EAAC,qFAAqF,EAC/F,KAAK,EAAE;4BACL,UAAU,EAAE,mBAAmB;4BAC/B,KAAK,EAAE,mBAAmB;yBAC3B,YAEA,OAAO,GACJ,GACF,CACP,IACG,GACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { AlertCircle, ChevronDown } from 'lucide-react';\nimport { useState } from 'react';\nimport { cn } from '../../lib/utils';\n\ninterface ErrorCardProps {\n /** Title shown in the header */\n title: string;\n /** Error message or details to show when expanded */\n details?: string;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * A collapsible error card that shows a title with an error icon,\n * and expands to reveal details when clicked.\n */\nexport function ErrorCard({\n title,\n className,\n details = 'Unknown error',\n}: ErrorCardProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n <div className=\"flex justify-center w-full\">\n <div\n className={cn(\n 'rounded-lg border border-red-400 w-full max-w-[800px]',\n className\n )}\n style={{ background: 'var(--ds-red-100)' }}\n >\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full px-4 py-3 flex items-center justify-between gap-2 text-left transition-colors\"\n style={{ color: 'var(--ds-red-900)' }}\n >\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span className=\"font-medium text-sm\">{title}</span>\n </div>\n <div className=\"flex items-center gap-1.5 opacity-70\">\n <span className=\"text-xs\">Click to show details</span>\n <ChevronDown\n className={cn(\n 'h-4 w-4 transition-transform duration-200',\n isExpanded && 'rotate-180'\n )}\n />\n </div>\n </button>\n\n {isExpanded && details && (\n <div\n className=\"px-4 pb-3\"\n style={{ borderTop: '1px solid var(--ds-red-400)' }}\n >\n <pre\n className=\"mt-3 p-3 rounded-md text-xs font-mono whitespace-pre-wrap break-words overflow-auto\"\n style={{\n background: 'var(--ds-red-200)',\n color: 'var(--ds-red-900)',\n }}\n >\n {details}\n </pre>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-stack-block.js","sourceRoot":"","sources":["../../../src/components/ui/error-stack-block.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,OAAO,CACL,KAAK,IAAI,IAAI;QACb,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,IAAI,KAAK;QAChB,OAAQ,KAAiC,CAAC,KAAK,KAAK,QAAQ,CAC7D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,GAGN;IACC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5D,OAAO,CACL,eACE,SAAS,EAAC,4CAA4C,EACtD,KAAK,EAAE;YACL,WAAW,EAAE,mBAAmB;YAChC,UAAU,EAAE,mBAAmB;SAChC,aAED,iBACE,IAAI,EAAC,QAAQ,gBACF,YAAY,EACvB,KAAK,EAAC,MAAM,EACZ,SAAS,EAAC,gMAAgM,EAC1M,KAAK,EAAE;oBACL,WAAW,EAAE,mBAAmB;oBAChC,UAAU,EAAE,mBAAmB;oBAC/B,KAAK,EAAE,mBAAmB;iBAC3B,EACD,OAAO,EAAE,GAAG,EAAE;oBACZ,SAAS,CAAC,SAAS;yBAChB,SAAS,CAAC,QAAQ,CAAC;yBACnB,IAAI,CAAC,GAAG,EAAE;wBACT,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;oBACvC,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE;wBACV,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;gBACP,CAAC,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,GACX,EAER,OAAO,IAAI,CACV,eACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE;oBACL,KAAK,EAAE,mBAAmB;oBAC1B,YAAY,EAAE,6BAA6B;iBAC5C,aAED,KAAC,WAAW,IAAC,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,GAAI,EACrE,YAAG,SAAS,EAAC,uCAAuC,YAAE,OAAO,GAAK,IAC9D,CACP,EACD,cACE,SAAS,EAAC,iFAAiF,EAC3F,KAAK,EAAE;oBACL,KAAK,EAAE,mBAAmB;oBAC1B,UAAU,EAAE,mBAAmB;iBAChC,YAEA,KAAK,GACF,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { AlertCircle, Copy } from 'lucide-react';\nimport { useToast } from '../../lib/toast';\n\n/**\n * Check whether `value` looks like a structured error object with a `stack`\n * field that we can render as pre-formatted text.\n */\nexport function isStructuredErrorWithStack(\n value: unknown\n): value is Record<string, unknown> & { stack: string } {\n return (\n value != null &&\n typeof value === 'object' &&\n 'stack' in value &&\n typeof (value as Record<string, unknown>).stack === 'string'\n );\n}\n\n/**\n * Renders an error with a `stack` field as a visually distinct error block.\n * Shows the error message with an alert icon at the top, separated from\n * the stack trace below.\n */\nexport function ErrorStackBlock({\n value,\n}: {\n value: Record<string, unknown> & { stack: string };\n}) {\n const toast = useToast();\n const stack = value.stack;\n const message = typeof value.message === 'string' ? value.message : undefined;\n const copyText = message ? `${message}\\n\\n${stack}` : stack;\n\n return (\n <div\n className=\"relative overflow-hidden rounded-md border\"\n style={{\n borderColor: 'var(--ds-red-400)',\n background: 'var(--ds-red-100)',\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Copy error\"\n title=\"Copy\"\n className=\"!absolute !right-2 !top-2 !flex !h-6 !w-6 !items-center !justify-center !rounded-md !border transition-transform transition-colors duration-100 hover:!bg-[var(--ds-red-200)] active:!scale-95\"\n style={{\n borderColor: 'var(--ds-red-400)',\n background: 'var(--ds-red-100)',\n color: 'var(--ds-red-900)',\n }}\n onClick={() => {\n navigator.clipboard\n .writeText(copyText)\n .then(() => {\n toast.success('Copied to clipboard');\n })\n .catch(() => {\n toast.error('Failed to copy');\n });\n }}\n >\n <Copy size={12} />\n </button>\n\n {message && (\n <div\n className=\"flex items-start gap-2 px-3 py-2.5 pr-10\"\n style={{\n color: 'var(--ds-red-900)',\n borderBottom: '1px solid var(--ds-red-400)',\n }}\n >\n <AlertCircle className=\"h-4 w-4 shrink-0\" style={{ marginTop: 1 }} />\n <p className=\"text-xs font-semibold m-0 break-words\">{message}</p>\n </div>\n )}\n <pre\n className=\"px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0\"\n style={{\n color: 'var(--ds-red-900)',\n background: 'var(--ds-red-200)',\n }}\n >\n {stack}\n </pre>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspector-theme.js","sourceRoot":"","sources":["../../../src/components/ui/inspector-theme.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared theme configuration for react-inspector's ObjectInspector.\n *\n * Color choices are inspired by Node.js `util.inspect()` ANSI stylizing:\n * - property names: unstyled (default foreground — dark text on light, light text on dark)\n * - strings / symbols: green\n * - numbers / booleans / bigint: yellow\n * - null: bold (foreground)\n * - undefined: grey\n * - regexp: red\n * - functions (special): cyan\n * - date: magenta\n *\n * See: https://github.com/nodejs/node/blob/main/lib/internal/util/inspect.js\n */\n\n// ---------------------------------------------------------------------------\n// Extended color tokens not supported by react-inspector's built-in theme\n// system, applied via our custom nodeRenderer in data-inspector.tsx.\n// ---------------------------------------------------------------------------\n\nexport interface InspectorThemeExtended {\n /** Color for Date values (Node: 'magenta') */\n OBJECT_VALUE_DATE_COLOR: string;\n}\n\nexport const inspectorThemeExtendedLight: InspectorThemeExtended = {\n OBJECT_VALUE_DATE_COLOR: '#a21caf', // fuchsia-700\n};\n\nexport const inspectorThemeExtendedDark: InspectorThemeExtended = {\n OBJECT_VALUE_DATE_COLOR: '#e879f9', // fuchsia-400\n};\n\n// ---------------------------------------------------------------------------\n// Shared structural values (same in both themes)\n// ---------------------------------------------------------------------------\n\nconst shared = {\n BASE_FONT_SIZE: '11px',\n BASE_LINE_HEIGHT: 1.4,\n BASE_BACKGROUND_COLOR: 'transparent',\n OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES: 10,\n OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES: 5,\n HTML_TAGNAME_TEXT_TRANSFORM: 'lowercase' as const,\n ARROW_MARGIN_RIGHT: 3,\n ARROW_FONT_SIZE: 12,\n TREENODE_FONT_FAMILY: 'var(--font-mono)',\n TREENODE_FONT_SIZE: '11px',\n TREENODE_LINE_HEIGHT: 1.4,\n TREENODE_PADDING_LEFT: 12,\n TABLE_DATA_BACKGROUND_IMAGE: 'none',\n TABLE_DATA_BACKGROUND_SIZE: '0',\n};\n\n// ---------------------------------------------------------------------------\n// Light theme\n// ---------------------------------------------------------------------------\n\nexport const inspectorThemeLight = {\n ...shared,\n\n // Base text\n BASE_COLOR: 'var(--ds-gray-1000)',\n\n // Property names — unstyled, same as base foreground (Node: no style)\n OBJECT_NAME_COLOR: 'var(--ds-gray-900)',\n\n // Strings & symbols — green (Node: 'green')\n OBJECT_VALUE_STRING_COLOR: '#16a34a', // green-600\n OBJECT_VALUE_SYMBOL_COLOR: '#16a34a',\n\n // Numbers & booleans — yellow/amber (Node: 'yellow')\n OBJECT_VALUE_NUMBER_COLOR: '#b45309', // amber-700 (readable on white)\n OBJECT_VALUE_BOOLEAN_COLOR: '#b45309',\n\n // null — bold foreground (Node: 'bold')\n OBJECT_VALUE_NULL_COLOR: 'var(--ds-gray-900)',\n\n // undefined — grey (Node: 'grey')\n OBJECT_VALUE_UNDEFINED_COLOR: 'var(--ds-gray-500)',\n\n // RegExp — red (Node regexp base uses green/red/yellow palette)\n OBJECT_VALUE_REGEXP_COLOR: '#dc2626', // red-600\n\n // Functions — cyan (Node: 'special' → 'cyan')\n OBJECT_VALUE_FUNCTION_PREFIX_COLOR: '#0891b2', // cyan-600\n\n // HTML (less relevant for data inspection, but reasonable defaults)\n HTML_TAG_COLOR: 'var(--ds-gray-500)',\n HTML_TAGNAME_COLOR: '#0891b2',\n HTML_ATTRIBUTE_NAME_COLOR: '#b45309',\n HTML_ATTRIBUTE_VALUE_COLOR: '#16a34a',\n HTML_COMMENT_COLOR: 'var(--ds-gray-400)',\n HTML_DOCTYPE_COLOR: 'var(--ds-gray-400)',\n\n // Structural\n ARROW_COLOR: 'var(--ds-gray-500)',\n TABLE_BORDER_COLOR: 'var(--ds-gray-300)',\n TABLE_TH_BACKGROUND_COLOR: 'var(--ds-gray-100)',\n TABLE_TH_HOVER_COLOR: 'var(--ds-gray-200)',\n TABLE_SORT_ICON_COLOR: 'var(--ds-gray-500)',\n};\n\n// ---------------------------------------------------------------------------\n// Dark theme\n// ---------------------------------------------------------------------------\n\nexport const inspectorThemeDark = {\n ...shared,\n\n // Base text\n BASE_COLOR: 'var(--ds-gray-1000)',\n\n // Property names — white/light foreground (Node: unstyled = white in dark terminal)\n OBJECT_NAME_COLOR: 'var(--ds-gray-900)',\n\n // Strings & symbols — green (Node: 'green')\n OBJECT_VALUE_STRING_COLOR: '#4ade80', // green-400\n OBJECT_VALUE_SYMBOL_COLOR: '#4ade80',\n\n // Numbers & booleans — yellow (Node: 'yellow')\n OBJECT_VALUE_NUMBER_COLOR: '#facc15', // yellow-400\n OBJECT_VALUE_BOOLEAN_COLOR: '#facc15',\n\n // null — bold foreground / white (Node: 'bold')\n OBJECT_VALUE_NULL_COLOR: 'var(--ds-gray-1000)',\n\n // undefined — grey (Node: 'grey')\n OBJECT_VALUE_UNDEFINED_COLOR: 'var(--ds-gray-500)',\n\n // RegExp — red (Node regexp palette)\n OBJECT_VALUE_REGEXP_COLOR: '#f87171', // red-400\n\n // Functions — cyan (Node: 'special' → 'cyan')\n OBJECT_VALUE_FUNCTION_PREFIX_COLOR: '#22d3ee', // cyan-400\n\n // HTML\n HTML_TAG_COLOR: 'var(--ds-gray-500)',\n HTML_TAGNAME_COLOR: '#22d3ee',\n HTML_ATTRIBUTE_NAME_COLOR: '#facc15',\n HTML_ATTRIBUTE_VALUE_COLOR: '#4ade80',\n HTML_COMMENT_COLOR: 'var(--ds-gray-500)',\n HTML_DOCTYPE_COLOR: 'var(--ds-gray-500)',\n\n // Structural\n ARROW_COLOR: 'var(--ds-gray-500)',\n TABLE_BORDER_COLOR: 'var(--ds-gray-300)',\n TABLE_TH_BACKGROUND_COLOR: 'var(--ds-gray-100)',\n TABLE_TH_HOVER_COLOR: 'var(--ds-gray-200)',\n TABLE_SORT_ICON_COLOR: 'var(--ds-gray-500)',\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-more-button.js","sourceRoot":"","sources":["../../../src/components/ui/load-more-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,qjBAAqjB,CAAC;AASrkB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,GAAG,KAAK,EACf,OAAO,EACP,KAAK,GAAG,WAAW,EACnB,YAAY,GAAG,YAAY,GACP;IACpB,OAAO,CACL,8BACE,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,cAAc,aAEvB,OAAO,IAAI,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,GAAI,EAChC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IACxB,IACR,CACJ,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { Spinner } from './spinner';\n\nconst STYLES = `.wf-load-more{appearance:none;-webkit-appearance:none;border:none;display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;border-radius:6px;font-size:13px;font-weight:500;line-height:20px;color:var(--ds-gray-1000);background:var(--ds-background-100);box-shadow:0 0 0 1px var(--ds-gray-400);cursor:pointer;white-space:nowrap;gap:6px;transition:background 150ms}.wf-load-more:hover{background:var(--ds-gray-alpha-200)}.wf-load-more:disabled{opacity:.6;cursor:default}.wf-load-more:disabled:hover{background:var(--ds-background-100)}`;\n\ninterface LoadMoreButtonProps {\n loading?: boolean;\n onClick?: () => void;\n label?: string;\n loadingLabel?: string;\n}\n\n/**\n * A \"Load more\" button matching Geist's Button type=\"secondary\" size=\"small\"\n * with a spinner prefix when loading.\n */\nexport function LoadMoreButton({\n loading = false,\n onClick,\n label = 'Load more',\n loadingLabel = 'Loading...',\n}: LoadMoreButtonProps) {\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: STYLES }} />\n <button\n type=\"button\"\n onClick={onClick}\n disabled={loading}\n className=\"wf-load-more\"\n >\n {loading && <Spinner size={14} />}\n {loading ? loadingLabel : label}\n </button>\n </>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu-dropdown.js","sourceRoot":"","sources":["../../../src/components/ui/menu-dropdown.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\nconst STYLES = `.wf-menu-btn{appearance:none;-webkit-appearance:none;border:none;display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 12px;border-radius:6px;font-size:14px;font-weight:500;line-height:20px;color:var(--ds-gray-1000);background:var(--ds-background-100);box-shadow:0 0 0 1px var(--ds-gray-400);cursor:pointer;white-space:nowrap;transition:background 150ms}.wf-menu-btn:hover{background:var(--ds-gray-alpha-200)}.wf-menu-item{appearance:none;-webkit-appearance:none;border:none;display:flex;align-items:center;width:100%;height:40px;padding:0 8px;border-radius:6px;font-size:14px;color:var(--ds-gray-1000);background:transparent;cursor:pointer;transition:background 150ms}.wf-menu-item:hover{background:var(--ds-gray-alpha-100)}`;\n\nexport interface MenuDropdownOption<T extends string = string> {\n value: T;\n label: string;\n}\n\ninterface MenuDropdownProps<T extends string = string> {\n options: MenuDropdownOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\n/**\n * A dropdown menu that matches Geist's MenuButton (secondary) + Menu styling.\n * Uses CSS classes with proper :hover specificity (no inline background).\n */\nexport function MenuDropdown<T extends string = string>({\n options,\n value,\n onChange,\n}: MenuDropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const label =\n options.find((o) => o.value === value)?.label ?? options[0]?.label ?? '';\n\n useEffect(() => {\n if (!open) return;\n function handleClickOutside(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [open]);\n\n return (\n <div ref={ref} style={{ position: 'relative', flexShrink: 0 }}>\n <style dangerouslySetInnerHTML={{ __html: STYLES }} />\n\n <button\n type=\"button\"\n className=\"wf-menu-btn\"\n onClick={() => setOpen(!open)}\n >\n <span>{label}</span>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{\n marginLeft: 16,\n marginRight: -4,\n color: 'var(--ds-gray-900)',\n }}\n >\n <path\n d=\"M4.5 6L8 9.5L11.5 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {open && (\n <div\n style={{\n position: 'absolute',\n right: 0,\n top: '100%',\n marginTop: 4,\n minWidth: 140,\n padding: 4,\n borderRadius: 12,\n background: 'var(--ds-background-100)',\n boxShadow: 'var(--ds-shadow-menu, var(--ds-shadow-medium))',\n zIndex: 2001,\n }}\n role=\"menu\"\n >\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitem\"\n className=\"wf-menu-item\"\n style={{\n fontWeight: option.value === value ? 500 : 400,\n }}\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../src/components/ui/skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,SAAS,QAAQ,CAAC,EAChB,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EAC6B;IACrC,OAAO,CACL,iBACM,KAAK,EACT,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,EACtC,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,KAAK,EAAE,GAC1D,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import { cn } from '../../lib/utils';\n\nfunction Skeleton({\n className,\n style,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn('rounded-md', className)}\n style={{ backgroundColor: 'var(--ds-gray-200)', ...style }}\n />\n );\n}\n\nexport { Skeleton };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/components/ui/spinner.tsx"],"names":[],"mappings":";AAAA,MAAM,SAAS,GAAG,4DAA4D,CAAC;AAE/E;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,IAAI,GAAG,EAAE,EACT,KAAK,GAIN;IACC,MAAM,MAAM,GACV,IAAI,IAAI,EAAE;QACR,CAAC,CAAC;YACE,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACrD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,GAAG;SACX;QACH,CAAC,CAAC,IAAI,IAAI,EAAE;YACV,CAAC,CAAC;gBACE,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBACjE,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,GAAG;aACX;YACH,CAAC,CAAC;gBACE,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE;oBACN,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG;oBAC5D,CAAC,GAAG,EAAE,CAAC;iBACR;gBACD,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,IAAI,GAAG,IAAI;gBAClB,KAAK,EAAE,IAAI,GAAG,IAAI;aACnB,CAAC;IAEV,OAAO,CACL,gBACE,KAAK,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;SACb,aAED,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAI,EACxD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,eAEE,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,IAAI,EAAE,KAAK;oBACX,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,KAAK;oBACpB,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAC7B,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAC5B,YAAY,EAAE,CAAC;oBACf,eAAe,EAAE,KAAK,IAAI,oBAAoB;oBAC9C,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,kBAAkB,IAAI,GAAG,IAAI,KAAK;oBACvE,SAAS,EAAE,mBAAmB,MAAM,CAAC,QAAQ,oBAAoB;oBACjE,cAAc,EAAE,GAAG,KAAK,IAAI;iBAC7B,IAdI,KAAK,CAeV,CACH,CAAC,IACG,CACR,CAAC;AACJ,CAAC","sourcesContent":["const KEYFRAMES = `@keyframes wf-spinner-fade{0%{opacity:1}100%{opacity:.15}}`;\n\n/**\n * Spinner matching Geist's multi-line fade spinner.\n * At size ≤12: 8 lines, ≤16: 10 lines, else: 12 lines.\n */\nexport function Spinner({\n size = 14,\n color,\n}: {\n size?: number;\n color?: string;\n}) {\n const config =\n size <= 12\n ? {\n count: 8,\n angle: 45,\n delays: [-875, -750, -625, -500, -375, -250, -125, 0],\n duration: 1000,\n lineW: 3,\n lineH: 1.5,\n }\n : size <= 16\n ? {\n count: 10,\n angle: 36,\n delays: [-900, -800, -700, -600, -500, -400, -300, -200, -100, 0],\n duration: 1000,\n lineW: 4,\n lineH: 1.5,\n }\n : {\n count: 12,\n angle: 30,\n delays: [\n -1100, -1000, -900, -800, -700, -600, -500, -400, -300, -200,\n -100, 0,\n ],\n duration: 1200,\n lineW: size * 0.24,\n lineH: size * 0.08,\n };\n\n return (\n <span\n style={{\n display: 'inline-flex',\n position: 'relative',\n width: size,\n height: size,\n }}\n >\n <style dangerouslySetInnerHTML={{ __html: KEYFRAMES }} />\n {config.delays.map((delay, i) => (\n <span\n key={delay}\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n width: config.lineW,\n height: config.lineH,\n marginLeft: -config.lineW / 2,\n marginTop: -config.lineH / 2,\n borderRadius: 1,\n backgroundColor: color ?? 'var(--ds-gray-700)',\n transform: `rotate(${i * config.angle}deg) translate(${size * 0.36}px)`,\n animation: `wf-spinner-fade ${config.duration}ms linear infinite`,\n animationDelay: `${delay}ms`,\n }}\n />\n ))}\n </span>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"timestamp-tooltip.js","sourceRoot":"","sources":["../../../src/components/ui/timestamp-tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAWzC,MAAM,UAAU,GAAe;IAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE;IACjC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE;IACjC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE;IAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE;IAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE;IAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE;CAC7B,CAAC;AAEF,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzD,SAAS,IAAI,EAAE,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;IACjC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAC/B,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC7C,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC,CAAC;QACF,MAAM,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,eAAe,CAAC,EACvB,IAAI,EACJ,IAAI,GAIL;IACC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/B,MAAM,aAAa,GACjB,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC/B,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,OAAO;KACtB,CAAC;SACC,aAAa,CAAC,OAAO,CAAC;SACtB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAEjE,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE;QACpD,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACxD,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IAEH,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,eAAe;YAC/B,GAAG,EAAE,EAAE;SACR,aAED,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC3D,cACE,KAAK,EAAE;4BACL,OAAO,EAAE,aAAa;4BACtB,UAAU,EAAE,QAAQ;4BACpB,cAAc,EAAE,QAAQ;4BACxB,MAAM,EAAE,EAAE;4BACV,OAAO,EAAE,OAAO;4BAChB,eAAe,EAAE,oBAAoB;4BACrC,YAAY,EAAE,CAAC;4BACf,QAAQ,EAAE,EAAE;4BACZ,UAAU,EAAE,6BAA6B;4BACzC,UAAU,EAAE,GAAG;4BACf,KAAK,EAAE,oBAAoB;4BAC3B,UAAU,EAAE,QAAQ;yBACrB,YAEA,aAAa,GACV,EACN,eACE,KAAK,EAAE;4BACL,QAAQ,EAAE,EAAE;4BACZ,KAAK,EAAE,qBAAqB;4BAC5B,UAAU,EAAE,QAAQ;yBACrB,YAEA,aAAa,GACT,IACH,EACN,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,6BAA6B;oBACzC,kBAAkB,EAAE,cAAc;oBAClC,KAAK,EAAE,oBAAoB;oBAC3B,UAAU,EAAE,QAAQ;iBACrB,YAEA,aAAa,GACT,IACH,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,uBAAuB,CAAC,EAAE,IAAI,EAAoB;IACzD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,GAAG,EAAE,EAAE;YACP,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,WAAW;SACrB,aAED,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,kBAAkB,EAAE,cAAc;oBAClC,KAAK,EAAE,oBAAoB;iBAC5B,YAEA,OAAO,GACH,EACP,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC9D,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,KAAK,GAAG,EAC1C,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,GAAI,IAChD,IACF,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,SAAS,aAAa,CAAC,EACrB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,IAAI,GAML;IACC,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAsB;QACtD,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;QAEzD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;QAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;QAErC,IAAI,IAAI,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CACb,YAAY,EACZ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC,CACrD,CAAC;QAEF,IAAI,GAAW,CAAC;QAChB,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,GAAG,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;gBACvB,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,YAAY,EAAE,CAAC;gBAChD,GAAG,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,QAAQ,CAAC;YACP,QAAQ,EAAE,OAAO;YACjB,IAAI;YACJ,GAAG;YACH,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,oCAAoC;YAC5C,eAAe,EAAE,0BAA0B;YAC3C,SAAS,EAAE,yDAAyD;YACpE,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO,YAAY;IACjB,yEAAyE;IACzE,cACE,GAAG,EAAE,UAAU,EACf,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,KAAK,YAEZ,KAAC,uBAAuB,IAAC,IAAI,EAAE,IAAI,GAAI,GACnC,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,IAAI,EACJ,QAAQ,GAIT;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,UAAU,CAAC,OAAO;gBAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,EAAE,GACN,IAAI,IAAI,IAAI;QACV,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ;YACxB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAEjC,IAAI,EAAE,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAC;IAE3D,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,WAAW,EAAE,CAAC;QACd,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,WAAW,EAAE,CAAC;QACd,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO;IACL,sEAAsE;IACtE,gBACE,GAAG,EAAE,UAAU,EACf,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,aAAa,EAC3B,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,aAEhC,QAAQ,EACR,IAAI,IAAI,WAAW,IAAI,CACtB,KAAC,aAAa,IACZ,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,aAAa,EAC3B,IAAI,EAAE,EAAE,GACR,CACH,IACI,CACR,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\n// ---------------------------------------------------------------------------\n// Time formatting helpers\n// ---------------------------------------------------------------------------\n\ninterface TimeUnit {\n unit: string;\n ms: number;\n}\n\nconst TIME_UNITS: TimeUnit[] = [\n { unit: 'year', ms: 31536000000 },\n { unit: 'month', ms: 2628000000 },\n { unit: 'day', ms: 86400000 },\n { unit: 'hour', ms: 3600000 },\n { unit: 'minute', ms: 60000 },\n { unit: 'second', ms: 1000 },\n];\n\nfunction formatTimeDifference(diff: number): string {\n let remaining = Math.abs(diff);\n const result: string[] = [];\n\n for (const { unit, ms } of TIME_UNITS) {\n const value = Math.floor(remaining / ms);\n if (value > 0 || result.length > 0) {\n result.push(`${value} ${unit}${value !== 1 ? 's' : ''}`);\n remaining %= ms;\n }\n if (result.length === 3) break;\n }\n\n return result.join(', ');\n}\n\nfunction useTimeAgo(date: number): string {\n const [timeAgo, setTimeAgo] = useState<string>('');\n\n useEffect(() => {\n const update = (): void => {\n const diff = Date.now() - date;\n const formatted = formatTimeDifference(diff);\n setTimeAgo(formatted ? `${formatted} ago` : 'Just now');\n };\n update();\n const timer = setInterval(update, 1000);\n return () => clearInterval(timer);\n }, [date]);\n\n return timeAgo;\n}\n\n// ---------------------------------------------------------------------------\n// Timezone row\n// ---------------------------------------------------------------------------\n\nfunction ZoneDateTimeRow({\n date,\n zone,\n}: {\n zone: string;\n date: number;\n}): ReactNode {\n const dateObj = new Date(date);\n\n const formattedZone =\n new Intl.DateTimeFormat('en-US', {\n timeZone: zone,\n timeZoneName: 'short',\n })\n .formatToParts(dateObj)\n .find((part) => part.type === 'timeZoneName')?.value || zone;\n\n const formattedDate = dateObj.toLocaleString('en-US', {\n timeZone: zone,\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n\n const formattedTime = dateObj.toLocaleTimeString('en-US', {\n timeZone: zone,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 16,\n padding: '0 6px',\n backgroundColor: 'var(--ds-gray-200)',\n borderRadius: 3,\n fontSize: 11,\n fontFamily: 'var(--font-mono, monospace)',\n fontWeight: 500,\n color: 'var(--ds-gray-900)',\n whiteSpace: 'nowrap',\n }}\n >\n {formattedZone}\n </div>\n <span\n style={{\n fontSize: 13,\n color: 'var(--ds-gray-1000)',\n whiteSpace: 'nowrap',\n }}\n >\n {formattedDate}\n </span>\n </div>\n <span\n style={{\n fontSize: 11,\n fontFamily: 'var(--font-mono, monospace)',\n fontVariantNumeric: 'tabular-nums',\n color: 'var(--ds-gray-900)',\n whiteSpace: 'nowrap',\n }}\n >\n {formattedTime}\n </span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip card content\n// ---------------------------------------------------------------------------\n\nfunction TimestampTooltipContent({ date }: { date: number }): ReactNode {\n const localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const timeAgo = useTimeAgo(date);\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n minWidth: 300,\n padding: '12px 14px',\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontVariantNumeric: 'tabular-nums',\n color: 'var(--ds-gray-900)',\n }}\n >\n {timeAgo}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <ZoneDateTimeRow date={date} zone=\"UTC\" />\n <ZoneDateTimeRow date={date} zone={localTimezone} />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hover tooltip wrapper\n// ---------------------------------------------------------------------------\n\nconst TOOLTIP_WIDTH = 330;\nconst VIEWPORT_PAD = 8;\n\nfunction TooltipPortal({\n triggerRect,\n onMouseEnter,\n onMouseLeave,\n date,\n}: {\n triggerRect: DOMRect;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n date: number;\n}): ReactNode {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n zIndex: 9999,\n visibility: 'hidden',\n });\n\n useEffect(() => {\n const placement = triggerRect.top > 240 ? 'above' : 'below';\n const centerX = triggerRect.left + triggerRect.width / 2;\n\n const el = tooltipRef.current;\n const w = el ? el.offsetWidth : TOOLTIP_WIDTH;\n const h = el ? el.offsetHeight : 100;\n\n let left = centerX - w / 2;\n left = Math.max(\n VIEWPORT_PAD,\n Math.min(left, window.innerWidth - w - VIEWPORT_PAD)\n );\n\n let top: number;\n if (placement === 'above') {\n top = triggerRect.top - h - 6;\n if (top < VIEWPORT_PAD) {\n top = triggerRect.bottom + 6;\n }\n } else {\n top = triggerRect.bottom + 6;\n if (top + h > window.innerHeight - VIEWPORT_PAD) {\n top = triggerRect.top - h - 6;\n }\n }\n\n setStyle({\n position: 'fixed',\n left,\n top,\n zIndex: 9999,\n borderRadius: 10,\n border: '1px solid var(--ds-gray-alpha-200)',\n backgroundColor: 'var(--ds-background-100)',\n boxShadow: '0 4px 12px rgba(0,0,0,0.08), 0 1px 3px rgba(0,0,0,0.06)',\n visibility: 'visible',\n });\n }, [triggerRect]);\n\n return createPortal(\n // biome-ignore lint/a11y/noStaticElementInteractions: tooltip hover zone\n <div\n ref={tooltipRef}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={style}\n >\n <TimestampTooltipContent date={date} />\n </div>,\n document.body\n );\n}\n\nexport function TimestampTooltip({\n date,\n children,\n}: {\n date: number | Date | string | null | undefined;\n children: ReactNode;\n}): ReactNode {\n const [open, setOpen] = useState(false);\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (closeTimer.current) clearTimeout(closeTimer.current);\n };\n }, []);\n\n const ts =\n date == null\n ? null\n : typeof date === 'number'\n ? date\n : new Date(date).getTime();\n\n if (ts == null || Number.isNaN(ts)) return <>{children}</>;\n\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n\n const scheduleClose = () => {\n cancelClose();\n closeTimer.current = setTimeout(() => setOpen(false), 120);\n };\n\n const handleOpen = () => {\n cancelClose();\n if (triggerRef.current) {\n setTriggerRect(triggerRef.current.getBoundingClientRect());\n }\n setOpen(true);\n };\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: tooltip trigger\n <span\n ref={triggerRef}\n onMouseEnter={handleOpen}\n onMouseLeave={scheduleClose}\n style={{ display: 'inline-flex' }}\n >\n {children}\n {open && triggerRect && (\n <TooltipPortal\n triggerRect={triggerRect}\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n date={ts}\n />\n )}\n </span>\n );\n}\n"]}