@workflow/web-shared 5.0.0-beta.1 → 5.0.0-beta.11

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 (298) hide show
  1. package/README.md +1 -1
  2. package/dist/components/error-boundary.js +1 -1
  3. package/dist/components/event-list-view.d.ts +18 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +219 -125
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +5 -1
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +6 -2
  10. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  11. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  12. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  13. package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
  14. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  15. package/dist/components/new-trace-viewer/components/event-list.js +44 -0
  16. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  17. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  18. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  19. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  20. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  21. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  22. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  23. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  27. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  28. package/dist/components/new-trace-viewer/components/split-pane.d.ts +15 -0
  29. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  30. package/dist/components/new-trace-viewer/components/split-pane.js +105 -0
  31. package/dist/components/new-trace-viewer/components/timeline.d.ts +34 -0
  32. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  33. package/dist/components/new-trace-viewer/components/timeline.js +221 -0
  34. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  35. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  36. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +19 -0
  37. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +20 -0
  38. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
  39. package/dist/components/new-trace-viewer/components/use-row-window.js +69 -0
  40. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  41. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  42. package/dist/components/new-trace-viewer/context.js +47 -0
  43. package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
  44. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
  45. package/dist/components/new-trace-viewer/detail-panel.js +13 -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 +400 -0
  55. package/dist/components/new-trace-viewer/types.d.ts +1 -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/util/constants.d.ts +1 -0
  59. package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
  60. package/dist/components/new-trace-viewer/util/constants.js +2 -0
  61. package/dist/components/new-trace-viewer/utils.d.ts +46 -0
  62. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  63. package/dist/components/new-trace-viewer/utils.js +330 -0
  64. package/dist/components/run-trace-view.d.ts +2 -1
  65. package/dist/components/run-trace-view.d.ts.map +1 -1
  66. package/dist/components/run-trace-view.js +3 -3
  67. package/dist/components/sidebar/attribute-panel.d.ts +7 -1
  68. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  69. package/dist/components/sidebar/attribute-panel.js +131 -70
  70. package/dist/components/sidebar/conversation-view.js +1 -1
  71. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  72. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  73. package/dist/components/sidebar/copyable-data-block.js +16 -15
  74. package/dist/components/sidebar/detail-card.d.ts +5 -6
  75. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  76. package/dist/components/sidebar/detail-card.js +32 -16
  77. package/dist/components/sidebar/entity-detail-panel.d.ts +3 -1
  78. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  79. package/dist/components/sidebar/entity-detail-panel.js +20 -37
  80. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  81. package/dist/components/sidebar/events-list.js +21 -15
  82. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  83. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  84. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  85. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  86. package/dist/components/stream-viewer.d.ts +1 -1
  87. package/dist/components/stream-viewer.d.ts.map +1 -1
  88. package/dist/components/stream-viewer.js +3 -27
  89. package/dist/components/trace-viewer/components/map.js +1 -1
  90. package/dist/components/trace-viewer/components/markers.js +1 -1
  91. package/dist/components/trace-viewer/components/node.js +1 -1
  92. package/dist/components/trace-viewer/components/search-input.js +1 -1
  93. package/dist/components/trace-viewer/components/search.js +1 -1
  94. package/dist/components/trace-viewer/components/span-content.js +1 -1
  95. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  96. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  97. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  98. package/dist/components/trace-viewer/components/ui.js +1 -1
  99. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  100. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  101. package/dist/components/trace-viewer/context.js +1 -1
  102. package/dist/components/trace-viewer/index.js +1 -1
  103. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  104. package/dist/components/trace-viewer/types.js +1 -1
  105. package/dist/components/trace-viewer/util/constants.js +1 -1
  106. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  107. package/dist/components/trace-viewer/util/timing.d.ts +1 -1
  108. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  109. package/dist/components/trace-viewer/util/timing.js +6 -9
  110. package/dist/components/trace-viewer/util/tree.js +1 -1
  111. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  112. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  113. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  114. package/dist/components/trace-viewer/worker.js +1 -1
  115. package/dist/components/trace-viewer-new.d.ts +14 -0
  116. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  117. package/dist/components/trace-viewer-new.js +22 -0
  118. package/dist/components/ui/alert.js +1 -1
  119. package/dist/components/ui/button.d.ts +10 -0
  120. package/dist/components/ui/button.d.ts.map +1 -0
  121. package/dist/components/ui/button.js +46 -0
  122. package/dist/components/ui/card.js +1 -1
  123. package/dist/components/ui/data-inspector.d.ts +39 -1
  124. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  125. package/dist/components/ui/data-inspector.js +207 -22
  126. package/dist/components/ui/decrypt-button.js +1 -1
  127. package/dist/components/ui/error-card.js +1 -1
  128. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  129. package/dist/components/ui/error-stack-block.js +27 -19
  130. package/dist/components/ui/icon-button.d.ts +19 -0
  131. package/dist/components/ui/icon-button.d.ts.map +1 -0
  132. package/dist/components/ui/icon-button.js +29 -0
  133. package/dist/components/ui/inspector-theme.d.ts +9 -10
  134. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  135. package/dist/components/ui/inspector-theme.js +39 -72
  136. package/dist/components/ui/kbd.d.ts +6 -0
  137. package/dist/components/ui/kbd.d.ts.map +1 -0
  138. package/dist/components/ui/kbd.js +6 -0
  139. package/dist/components/ui/load-more-button.js +1 -1
  140. package/dist/components/ui/menu-dropdown.js +1 -1
  141. package/dist/components/ui/skeleton.js +1 -1
  142. package/dist/components/ui/spinner.js +1 -1
  143. package/dist/components/ui/timestamp-tooltip.js +1 -1
  144. package/dist/components/ui/tooltip.d.ts +10 -0
  145. package/dist/components/ui/tooltip.d.ts.map +1 -0
  146. package/dist/components/ui/tooltip.js +12 -0
  147. package/dist/components/workflow-trace-view.d.ts +3 -1
  148. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  149. package/dist/components/workflow-trace-view.js +10 -5
  150. package/dist/components/workflow-traces/event-colors.js +1 -1
  151. package/dist/components/workflow-traces/trace-colors.js +1 -1
  152. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
  153. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  154. package/dist/components/workflow-traces/trace-span-construction.js +19 -6
  155. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  156. package/dist/hooks/use-dark-mode.js +1 -1
  157. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  158. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  159. package/dist/hooks/use-intersection-observer.js +29 -0
  160. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  161. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  162. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  163. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  164. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  165. package/dist/hooks/use-reduced-motion.js +29 -0
  166. package/dist/index.d.ts +3 -1
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +3 -2
  169. package/dist/lib/event-analysis.js +1 -1
  170. package/dist/lib/event-materialization.js +1 -1
  171. package/dist/lib/exact-event-search-id.d.ts +25 -0
  172. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  173. package/dist/lib/exact-event-search-id.js +39 -0
  174. package/dist/lib/hydration.d.ts +14 -1
  175. package/dist/lib/hydration.d.ts.map +1 -1
  176. package/dist/lib/hydration.js +157 -4
  177. package/dist/lib/stream-display.d.ts +18 -0
  178. package/dist/lib/stream-display.d.ts.map +1 -0
  179. package/dist/lib/stream-display.js +30 -0
  180. package/dist/lib/toast.js +1 -1
  181. package/dist/lib/trace-builder.d.ts.map +1 -1
  182. package/dist/lib/trace-builder.js +3 -2
  183. package/dist/lib/utils.d.ts +9 -9
  184. package/dist/lib/utils.d.ts.map +1 -1
  185. package/dist/lib/utils.js +27 -32
  186. package/dist/styles.css +475 -1
  187. package/package.json +6 -4
  188. package/src/components/event-list-view.tsx +421 -262
  189. package/src/components/index.ts +13 -1
  190. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  191. package/src/components/new-trace-viewer/components/event-list.tsx +135 -0
  192. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  193. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  194. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  195. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  196. package/src/components/new-trace-viewer/components/split-pane.tsx +198 -0
  197. package/src/components/new-trace-viewer/components/timeline.tsx +560 -0
  198. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +94 -0
  199. package/src/components/new-trace-viewer/components/use-row-window.ts +93 -0
  200. package/src/components/new-trace-viewer/context.tsx +90 -0
  201. package/src/components/new-trace-viewer/detail-panel.tsx +55 -0
  202. package/src/components/new-trace-viewer/icons.tsx +79 -0
  203. package/src/components/new-trace-viewer/search.ts +178 -0
  204. package/src/components/new-trace-viewer/trace-viewer.tsx +762 -0
  205. package/src/components/new-trace-viewer/types.ts +0 -0
  206. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  207. package/src/components/new-trace-viewer/utils.ts +482 -0
  208. package/src/components/run-trace-view.tsx +3 -0
  209. package/src/components/sidebar/attribute-panel.tsx +240 -196
  210. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  211. package/src/components/sidebar/detail-card.tsx +119 -59
  212. package/src/components/sidebar/entity-detail-panel.tsx +92 -148
  213. package/src/components/sidebar/events-list.tsx +51 -76
  214. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  215. package/src/components/stream-viewer.tsx +18 -40
  216. package/src/components/trace-viewer/util/timing.ts +5 -9
  217. package/src/components/trace-viewer-new.tsx +57 -0
  218. package/src/components/ui/button.tsx +68 -0
  219. package/src/components/ui/data-inspector.tsx +427 -31
  220. package/src/components/ui/error-stack-block.tsx +39 -30
  221. package/src/components/ui/icon-button.tsx +53 -0
  222. package/src/components/ui/inspector-theme.ts +39 -81
  223. package/src/components/ui/kbd.tsx +21 -0
  224. package/src/components/ui/tooltip.tsx +47 -0
  225. package/src/components/workflow-trace-view.tsx +12 -2
  226. package/src/components/workflow-traces/trace-span-construction.ts +24 -6
  227. package/src/hooks/use-intersection-observer.ts +57 -0
  228. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  229. package/src/hooks/use-reduced-motion.ts +34 -0
  230. package/src/index.ts +9 -0
  231. package/src/lib/exact-event-search-id.ts +67 -0
  232. package/src/lib/hydration.ts +169 -1
  233. package/src/lib/stream-display.ts +48 -0
  234. package/src/lib/trace-builder.ts +2 -1
  235. package/src/lib/utils.ts +27 -32
  236. package/src/styles.css +475 -1
  237. package/dist/components/error-boundary.js.map +0 -1
  238. package/dist/components/event-list-view.js.map +0 -1
  239. package/dist/components/hook-actions.js.map +0 -1
  240. package/dist/components/index.js.map +0 -1
  241. package/dist/components/run-trace-view.js.map +0 -1
  242. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  243. package/dist/components/sidebar/conversation-view.js.map +0 -1
  244. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  245. package/dist/components/sidebar/detail-card.js.map +0 -1
  246. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  247. package/dist/components/sidebar/events-list.js.map +0 -1
  248. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  249. package/dist/components/stream-viewer.js.map +0 -1
  250. package/dist/components/trace-viewer/components/map.js.map +0 -1
  251. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  252. package/dist/components/trace-viewer/components/node.js.map +0 -1
  253. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  254. package/dist/components/trace-viewer/components/search.js.map +0 -1
  255. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  256. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  257. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  258. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  259. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  260. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  261. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  262. package/dist/components/trace-viewer/context.js.map +0 -1
  263. package/dist/components/trace-viewer/index.js.map +0 -1
  264. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  265. package/dist/components/trace-viewer/types.js.map +0 -1
  266. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  267. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  268. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  269. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  270. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  271. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  272. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  273. package/dist/components/trace-viewer/worker.js.map +0 -1
  274. package/dist/components/ui/alert.js.map +0 -1
  275. package/dist/components/ui/card.js.map +0 -1
  276. package/dist/components/ui/data-inspector.js.map +0 -1
  277. package/dist/components/ui/decrypt-button.js.map +0 -1
  278. package/dist/components/ui/error-card.js.map +0 -1
  279. package/dist/components/ui/error-stack-block.js.map +0 -1
  280. package/dist/components/ui/inspector-theme.js.map +0 -1
  281. package/dist/components/ui/load-more-button.js.map +0 -1
  282. package/dist/components/ui/menu-dropdown.js.map +0 -1
  283. package/dist/components/ui/skeleton.js.map +0 -1
  284. package/dist/components/ui/spinner.js.map +0 -1
  285. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  286. package/dist/components/workflow-trace-view.js.map +0 -1
  287. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  288. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  289. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  290. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  291. package/dist/hooks/use-dark-mode.js.map +0 -1
  292. package/dist/index.js.map +0 -1
  293. package/dist/lib/event-analysis.js.map +0 -1
  294. package/dist/lib/event-materialization.js.map +0 -1
  295. package/dist/lib/hydration.js.map +0 -1
  296. package/dist/lib/toast.js.map +0 -1
  297. package/dist/lib/trace-builder.js.map +0 -1
  298. package/dist/lib/utils.js.map +0 -1
@@ -0,0 +1,221 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ArrowLeft, ArrowRight } from 'lucide-react';
4
+ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
5
+ import { cn } from '../../../lib/utils';
6
+ import { formatDuration, getHighResInMs } from '../../trace-viewer/util/timing';
7
+ import { isSpanDimmedBySearch } from '../search';
8
+ import { computeSpanGaps, computeSpanSegments, getResourceColor, getSpanDurationMs, } from '../utils';
9
+ import { ROW_HEIGHT_PX, useRowWindow } from './use-row-window';
10
+ // ---------------------------------------------------------------------------
11
+ // Constants
12
+ // ---------------------------------------------------------------------------
13
+ const TINY_BAR_BOX_SIZE_PX = 24;
14
+ const TINY_BAR_WIDTH_PX = 4;
15
+ export const TIMELINE_PADDING_PX = 16;
16
+ const SEGMENT_CLASSES = {
17
+ queued: 'bg-gray-400 border border-gray-500',
18
+ retrying: 'bg-gray-400 border border-gray-500',
19
+ waiting: 'bg-gray-400 border border-gray-500',
20
+ running: 'bg-blue-200 border border-blue-500',
21
+ failed: 'bg-red-200 border border-red-500',
22
+ succeeded: 'bg-green-200 border border-green-500',
23
+ sleeping: 'bg-gray-400 border border-gray-500',
24
+ received: 'bg-blue-200 border border-blue-500',
25
+ };
26
+ const TIMELINE_INSET_STYLE = {
27
+ left: TIMELINE_PADDING_PX,
28
+ right: TIMELINE_PADDING_PX,
29
+ };
30
+ /**
31
+ * Compute the bar's geometry inside the timeline viewport. Percentages are
32
+ * always in [0, 100] so we never emit CSS values that exceed browser layout
33
+ * limits at extreme zoom.
34
+ */
35
+ function computeBarGeometry(startMs, endMs, viewStart, viewEnd, containerWidth) {
36
+ const viewDuration = viewEnd - viewStart;
37
+ const visibleStartMs = Math.max(startMs, viewStart);
38
+ const visibleEndMs = Math.min(endMs, viewEnd);
39
+ const visibleDurationMs = Math.max(0, visibleEndMs - visibleStartMs);
40
+ const widthFrac = viewDuration > 0 ? visibleDurationMs / viewDuration : 0;
41
+ const visiblePixelWidth = widthFrac * containerWidth;
42
+ const isTiny = containerWidth > 0 && visiblePixelWidth < TINY_BAR_BOX_SIZE_PX;
43
+ const extendsOffLeft = startMs < viewStart;
44
+ const extendsOffRight = endMs > viewEnd;
45
+ const mode = isTiny && (extendsOffLeft || extendsOffRight)
46
+ ? { kind: 'arrow', direction: extendsOffRight ? 'right' : 'left' }
47
+ : isTiny
48
+ ? { kind: 'tiny' }
49
+ : { kind: 'full' };
50
+ return {
51
+ mode,
52
+ leftPct: viewDuration > 0
53
+ ? ((visibleStartMs - viewStart) / viewDuration) * 100
54
+ : 0,
55
+ widthPct: widthFrac * 100,
56
+ visibleStartMs,
57
+ visibleEndMs,
58
+ visiblePixelWidth,
59
+ };
60
+ }
61
+ function getBarPositionStyle(geometry) {
62
+ switch (geometry.mode.kind) {
63
+ case 'arrow':
64
+ return {
65
+ left: geometry.mode.direction === 'right'
66
+ ? `calc(100% - ${TINY_BAR_BOX_SIZE_PX}px)`
67
+ : '0px',
68
+ width: `${TINY_BAR_BOX_SIZE_PX}px`,
69
+ };
70
+ case 'tiny':
71
+ return {
72
+ left: `min(${geometry.leftPct}%, calc(100% - ${TINY_BAR_WIDTH_PX}px))`,
73
+ width: `${TINY_BAR_WIDTH_PX}px`,
74
+ };
75
+ case 'full':
76
+ return {
77
+ left: `${geometry.leftPct}%`,
78
+ width: `max(${geometry.widthPct}%, 4px)`,
79
+ };
80
+ }
81
+ }
82
+ /**
83
+ * Project status segments onto the visible portion of a bar. Segments fully
84
+ * outside the visible window are dropped; segments crossing the edge are
85
+ * clipped to [0%, 100%] of the visible bar.
86
+ */
87
+ function projectSegments(segments, spanStartMs, spanDurationMs, geometry) {
88
+ const visibleDurationMs = geometry.visibleEndMs - geometry.visibleStartMs;
89
+ if (visibleDurationMs <= 0)
90
+ return [];
91
+ return segments.flatMap((seg) => {
92
+ const segStartMs = spanStartMs + seg.startFraction * spanDurationMs;
93
+ const segEndMs = spanStartMs + seg.endFraction * spanDurationMs;
94
+ const startMs = Math.max(segStartMs, geometry.visibleStartMs);
95
+ const endMs = Math.min(segEndMs, geometry.visibleEndMs);
96
+ if (endMs <= startMs)
97
+ return [];
98
+ const widthFrac = (endMs - startMs) / visibleDurationMs;
99
+ return [
100
+ {
101
+ status: seg.status,
102
+ leftPct: ((startMs - geometry.visibleStartMs) / visibleDurationMs) * 100,
103
+ widthPct: widthFrac * 100,
104
+ pixelWidth: widthFrac * geometry.visiblePixelWidth,
105
+ fullDurationMs: (seg.endFraction - seg.startFraction) * spanDurationMs,
106
+ },
107
+ ];
108
+ });
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // Small render helpers
112
+ // ---------------------------------------------------------------------------
113
+ function DurationLabel({ label }) {
114
+ return (_jsx("span", { className: "pointer-events-none absolute inset-0 flex items-center justify-start overflow-hidden px-1 text-[10px] font-mono font-medium leading-none whitespace-nowrap text-left text-gray-1000 tabular-nums opacity-0 group-hover/timeline-row:opacity-100", children: label }));
115
+ }
116
+ function BoundaryArrow({ direction, }) {
117
+ const Icon = direction === 'right' ? ArrowRight : ArrowLeft;
118
+ return (_jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-[0.25rem]", children: _jsx(Icon, { className: "size-3 text-gray-900" }) }));
119
+ }
120
+ function PlainBar({ bg, border, label, }) {
121
+ return (_jsx("div", { className: "relative h-6 w-full min-w-1 rounded-[0.25rem] border", style: { background: bg, borderColor: border }, children: label ? _jsx(DurationLabel, { label: label }) : null }));
122
+ }
123
+ function SegmentBar({ segments }) {
124
+ return (_jsx("div", { className: "relative h-6 w-full", children: segments.map((seg, i) => {
125
+ const label = formatDuration(seg.fullDurationMs);
126
+ // Only render the label when there's enough room for it without clipping.
127
+ const showLabel = seg.pixelWidth >= Math.max(40, label.length * 6 + 12);
128
+ // Beef up the queued segment when it's too narrow to read.
129
+ const isNarrowQueued = seg.status === 'queued' && seg.pixelWidth < 20;
130
+ const overrideBg = isNarrowQueued ? 'var(--ds-gray-400)' : undefined;
131
+ const overrideBorder = isNarrowQueued
132
+ ? 'var(--ds-gray-500)'
133
+ : undefined;
134
+ return (_jsx("div", { className: cn('absolute h-full rounded-[0.25rem]', SEGMENT_CLASSES[seg.status]), style: {
135
+ // 1px gap between adjacent segments, distributed equally.
136
+ left: `calc(${seg.leftPct}% + 0.5px)`,
137
+ width: `calc(${seg.widthPct}% - 1px)`,
138
+ minWidth: 1,
139
+ background: overrideBg,
140
+ borderColor: overrideBorder,
141
+ }, children: showLabel ? _jsx(DurationLabel, { label: label }) : null }, `${seg.status}-${i}`));
142
+ }) }));
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // TimelineBar
146
+ // ---------------------------------------------------------------------------
147
+ const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, }) {
148
+ const startMs = getHighResInMs(span.startTime);
149
+ const endMs = getHighResInMs(span.endTime);
150
+ const totalDurationMs = getSpanDurationMs(span);
151
+ const geometry = useMemo(() => computeBarGeometry(startMs, endMs, viewStart, viewStart + viewDuration, containerWidth), [startMs, endMs, viewStart, viewDuration, containerWidth]);
152
+ const baseSegments = useMemo(() => computeSpanSegments(span), [span]);
153
+ const segments = useMemo(() => geometry.mode.kind === 'full'
154
+ ? projectSegments(baseSegments, startMs, totalDurationMs, geometry)
155
+ : [], [geometry, baseSegments, startMs, totalDurationMs]);
156
+ const workflowStatus = span.attributes.data
157
+ ?.status;
158
+ const isErrored = span.status.code === 2 || workflowStatus === 'failed';
159
+ const colors = getResourceColor(span.resource);
160
+ const fallbackBg = isErrored
161
+ ? (colors.errorBg ?? 'var(--ds-red-200)')
162
+ : colors.bg;
163
+ const fallbackBorder = isErrored
164
+ ? (colors.errorBorder ?? 'var(--ds-red-500)')
165
+ : colors.border;
166
+ const totalLabel = formatDuration(totalDurationMs);
167
+ const showTotalLabel = geometry.visiblePixelWidth >= Math.max(40, totalLabel.length * 6 + 12);
168
+ const handleClick = useCallback(() => {
169
+ onSelect(span.spanId);
170
+ }, [onSelect, span.spanId]);
171
+ return (_jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: cn('group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity', isDimmed && 'opacity-35'), onClick: handleClick, children: _jsx("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2 rounded-[0.25rem]", style: getBarPositionStyle(geometry), children: geometry.mode.kind === 'arrow' ? (_jsx(BoundaryArrow, { direction: geometry.mode.direction })) : geometry.mode.kind === 'tiny' ? (_jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } })) : segments.length > 0 ? (_jsx(SegmentBar, { segments: segments })) : (_jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null })) }) }) }));
172
+ });
173
+ export { TimelineBar };
174
+ // ---------------------------------------------------------------------------
175
+ // DeltaIndicator (Alt-key gap overlay)
176
+ // ---------------------------------------------------------------------------
177
+ const DELTA_CAP_HEIGHT_PX = 8;
178
+ // Vertical offset to sit the indicator inside the gap between row N and N+1,
179
+ // aligned with where the bar starts in the next row (rows center a 24px bar
180
+ // inside 40px, so bars start ~8px from the top of the row).
181
+ const DELTA_ROW_OFFSET_PX = 8;
182
+ const DeltaIndicator = memo(function DeltaIndicator({ leftFrac, rightFrac, label, rowIndex, }) {
183
+ const centerY = DELTA_ROW_OFFSET_PX + (rowIndex + 1) * ROW_HEIGHT_PX;
184
+ return (_jsxs("div", { className: "absolute pointer-events-none", style: {
185
+ left: `${leftFrac * 100}%`,
186
+ width: `${(rightFrac - leftFrac) * 100}%`,
187
+ top: centerY - DELTA_CAP_HEIGHT_PX / 2,
188
+ height: DELTA_CAP_HEIGHT_PX,
189
+ }, children: [_jsx("div", { className: "absolute left-0 top-0 w-px h-full bg-amber-800" }), _jsx("div", { className: "absolute left-0 right-0 top-1/2 h-px bg-amber-800" }), _jsx("div", { className: "absolute right-0 top-0 w-px h-full bg-amber-800" }), _jsx("span", { className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 text-label-12 leading-none whitespace-nowrap rounded-xs px-1 py-0.5 text-gray-100 bg-amber-800", children: label })] }));
190
+ });
191
+ // ---------------------------------------------------------------------------
192
+ // TimelineHeader
193
+ // ---------------------------------------------------------------------------
194
+ export function TimelineHeader({ markers, hoverInfo, }) {
195
+ return (_jsx("div", { className: "relative bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-end px-4 pb-1", children: _jsxs("div", { className: "relative h-full flex-1", children: [markers.map((m) => (_jsx("span", { className: "absolute bottom-1 font-mono text-xs font-normal leading-4 text-gray-900 whitespace-nowrap", style: { left: `${m.position * 100}%` }, children: m.label }, `${m.position}-${m.label}`))), hoverInfo && (_jsx("span", { className: "absolute top-1 pointer-events-none z-10 font-mono text-[11px] leading-4 text-gray-1000 whitespace-nowrap bg-background-100 border border-gray-alpha-400 rounded px-1 -translate-x-1/2", style: { left: `${hoverInfo.fraction * 100}%` }, children: hoverInfo.label }))] }) }));
196
+ }
197
+ // ---------------------------------------------------------------------------
198
+ // Timeline
199
+ // ---------------------------------------------------------------------------
200
+ export function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, hoverFraction, altHeld = false, }) {
201
+ const containerRef = useRef(null);
202
+ const [containerWidth, setContainerWidth] = useState(0);
203
+ const viewDuration = viewEnd - viewStart;
204
+ const timelineWidth = Math.max(0, containerWidth - TIMELINE_PADDING_PX * 2);
205
+ const { start, end } = useRowWindow(containerRef, spans.length, ROW_HEIGHT_PX);
206
+ useEffect(() => {
207
+ const el = containerRef.current;
208
+ if (!el)
209
+ return;
210
+ const ro = new ResizeObserver(([entry]) => {
211
+ setContainerWidth(entry.contentRect.width);
212
+ });
213
+ ro.observe(el);
214
+ return () => ro.disconnect();
215
+ }, []);
216
+ const gaps = useMemo(() => computeSpanGaps(spans, viewStart, viewEnd), [spans, viewStart, viewEnd]);
217
+ return (_jsxs("div", { ref: containerRef, className: "relative h-full overflow-hidden", style: { minHeight: spans.length * ROW_HEIGHT_PX }, children: [_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: markers.map((marker) =>
218
+ // Skip the "0s" origin marker since the left edge already implies it.
219
+ Math.abs(marker.value) > 0.000001 ? (_jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-300", style: { left: `${marker.position * 100}%` } }, `${marker.position}-${marker.label}`)) : null) }), hoverFraction != null && (_jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hoverFraction * 100}%` } }) })), _jsx("div", { style: { transform: `translateY(${start * ROW_HEIGHT_PX}px)` }, children: spans.slice(start, end).map((span) => (_jsx(TimelineBar, { span: span, viewStart: viewStart, viewDuration: viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelect: onSelect }, span.spanId))) }), altHeld && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gaps.map((gap) => (_jsx(DeltaIndicator, { leftFrac: gap.leftFrac, rightFrac: gap.rightFrac, label: formatDuration(gap.gapMs, true), rowIndex: gap.rowIndex }, gap.rowIndex))) }))] }));
220
+ }
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvdGltZWxpbmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLG9CQUFvQixFQUF5QixNQUFNLFdBQVcsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0QsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDNUIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBRXRDLE1BQU0sZUFBZSxHQUFrQztJQUNyRCxNQUFNLEVBQUUsb0NBQW9DO0lBQzVDLFFBQVEsRUFBRSxvQ0FBb0M7SUFDOUMsT0FBTyxFQUFFLG9DQUFvQztJQUM3QyxPQUFPLEVBQUUsb0NBQW9DO0lBQzdDLE1BQU0sRUFBRSxrQ0FBa0M7SUFDMUMsU0FBUyxFQUFFLHNDQUFzQztJQUNqRCxRQUFR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QyxLQUFDLFdBQVcsSUFFVixJQUFJLEVBQUUsSUFBSSxFQUNWLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLFlBQVksRUFBRSxZQUFZLEVBQzFCLGNBQWMsRUFBRSxhQUFhLEVBQzdCLFVBQVUsRUFBRSxVQUFVLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFDdEMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQ3pELFFBQVEsRUFBRSxRQUFRLElBUGIsSUFBSSxDQUFDLE1BQU0sQ0FRaEIsQ0FDSCxDQUFDLEdBQ0UsRUFDTCxPQUFPLElBQUksQ0FDVixtQ0FFRSxTQUFTLEVBQUMsd0NBQXdDLEVBQ2xELEtBQUssRUFBRSxvQkFBb0IsWUFFMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FDakIsS0FBQyxjQUFjLElBRWIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQ3RCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUN4QixLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQ3RDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxJQUpqQixHQUFHLENBQUMsUUFBUSxDQUtqQixDQUNILENBQUMsR0FDRSxDQUNQLElBQ0csQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgQXJyb3dMZWZ0LCBBcnJvd1JpZ2h0IH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJy4uLy4uL3RyYWNlLXZpZXdlci90eXBlcyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgZ2V0SGlnaFJlc0luTXMgfSBmcm9tICcuLi8uLi90cmFjZS12aWV3ZXIvdXRpbC90aW1pbmcnO1xuaW1wb3J0IHsgaXNTcGFuRGltbWVkQnlTZWFyY2gsIHR5cGUgU3BhblNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL3NlYXJjaCc7XG5pbXBvcnQgdHlwZSB7IFNlZ21lbnQsIFNlZ21lbnRTdGF0dXMsIFRpbWVNYXJrZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBjb21wdXRlU3BhbkdhcHMsXG4gIGNvbXB1dGVTcGFuU2VnbWVudHMsXG4gIGdldFJlc291cmNlQ29sb3IsXG4gIGdldFNwYW5EdXJhdGlvbk1zLFxufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBST1dfSEVJR0hUX1BYLCB1c2VSb3dXaW5kb3cgfSBmcm9tICcuL3VzZS1yb3ctd2luZG93JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBUSU5ZX0JBUl9CT1hfU0laRV9QWCA9IDI0O1xuY29uc3QgVElOWV9CQVJfV0lEVEhfUFggPSA0O1xuZXhwb3J0IGNvbnN0IFRJTUVMSU5FX1BBRERJTkdfUFggPSAxNjtcblxuY29uc3QgU0VHTUVOVF9DTEFTU0VTOiBSZWNvcmQ8U2VnbWVudFN0YXR1cywgc3RyaW5nPiA9IHtcbiAgcXVldWVkOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHJldHJ5aW5nOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHdhaXRpbmc6ICdiZy1ncmF5LTQwMCBib3JkZXIgYm9yZGVyLWdyYXktNTAwJyxcbiAgcnVubmluZzogJ2JnLWJsdWUtMjAwIGJvcmRlciBib3JkZXItYmx1ZS01MDAnLFxuICBmYWlsZWQ6ICdiZy1yZWQtMjAwIGJvcmRlciBib3JkZXItcmVkLTUwMCcsXG4gIHN1Y2NlZWRlZDogJ2JnLWdyZWVuLTIwMCBib3JkZXIgYm9yZGVyLWdyZWVuLTUwMCcsXG4gIHNsZWVwaW5nOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHJlY2VpdmVkOiAnYmctYmx1ZS0yMDAgYm9yZGVyIGJvcmRlci1ibHVlLTUwMCcsXG59O1xuXG5jb25zdCBUSU1FTElORV9JTlNFVF9TVFlMRTogQ1NTUHJvcGVydGllcyA9IHtcbiAgbGVmdDogVElNRUxJTkVfUEFERElOR19QWCxcbiAgcmlnaHQ6IFRJTUVMSU5FX1BBRERJTkdfUFgsXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJhciBnZW9tZXRyeVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgQmFyTW9kZSA9XG4gIHwgeyBraW5kOiAnYXJyb3cnOyBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcgfVxuICB8IHsga2luZDogJ3RpbnknIH1cbiAgfCB7IGtpbmQ6ICdmdWxsJyB9O1xuXG5pbnRlcmZhY2UgQmFyR2VvbWV0cnkge1xuICBtb2RlOiBCYXJNb2RlO1xuICBsZWZ0UGN0OiBudW1iZXI7XG4gIHdpZHRoUGN0OiBudW1iZXI7XG4gIHZpc2libGVTdGFydE1zOiBudW1iZXI7XG4gIHZpc2libGVFbmRNczogbnVtYmVyO1xuICB2aXNpYmxlUGl4ZWxXaWR0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIGJhcidzIGdlb21ldHJ5IGluc2lkZSB0aGUgdGltZWxpbmUgdmlld3BvcnQuIFBlcmNlbnRhZ2VzIGFyZVxuICogYWx3YXlzIGluIFswLCAxMDBdIHNvIHdlIG5ldmVyIGVtaXQgQ1NTIHZhbHVlcyB0aGF0IGV4Y2VlZCBicm93c2VyIGxheW91dFxuICogbGltaXRzIGF0IGV4dHJlbWUgem9vbS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUJhckdlb21ldHJ5KFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGVuZE1zOiBudW1iZXIsXG4gIHZpZXdTdGFydDogbnVtYmVyLFxuICB2aWV3RW5kOiBudW1iZXIsXG4gIGNvbnRhaW5lcldpZHRoOiBudW1iZXJcbik6IEJhckdlb21ldHJ5IHtcbiAgY29uc3Qgdmlld0R1cmF0aW9uID0gdmlld0VuZCAtIHZpZXdTdGFydDtcbiAgY29uc3QgdmlzaWJsZVN0YXJ0TXMgPSBNYXRoLm1heChzdGFydE1zLCB2aWV3U3RhcnQpO1xuICBjb25zdCB2aXNpYmxlRW5kTXMgPSBNYXRoLm1pbihlbmRNcywgdmlld0VuZCk7XG4gIGNvbnN0IHZpc2libGVEdXJhdGlvbk1zID0gTWF0aC5tYXgoMCwgdmlzaWJsZUVuZE1zIC0gdmlzaWJsZVN0YXJ0TXMpO1xuICBjb25zdCB3aWR0aEZyYWMgPSB2aWV3RHVyYXRpb24gPiAwID8gdmlzaWJsZUR1cmF0aW9uTXMgLyB2aWV3RHVyYXRpb24gOiAwO1xuICBjb25zdCB2aXNpYmxlUGl4ZWxXaWR0aCA9IHdpZHRoRnJhYyAqIGNvbnRhaW5lcldpZHRoO1xuXG4gIGNvbnN0IGlzVGlueSA9IGNvbnRhaW5lcldpZHRoID4gMCAmJiB2aXNpYmxlUGl4ZWxXaWR0aCA8IFRJTllfQkFSX0JPWF9TSVpFX1BYO1xuICBjb25zdCBleHRlbmRzT2ZmTGVmdCA9IHN0YXJ0TXMgPCB2aWV3U3RhcnQ7XG4gIGNvbnN0IGV4dGVuZHNPZmZSaWdodCA9IGVuZE1zID4gdmlld0VuZDtcblxuICBjb25zdCBtb2RlOiBCYXJNb2RlID1cbiAgICBpc1RpbnkgJiYgKGV4dGVuZHNPZmZMZWZ0IHx8IGV4dGVuZHNPZmZSaWdodClcbiAgICAgID8geyBraW5kOiAnYXJyb3cnLCBkaXJlY3Rpb246IGV4dGVuZHNPZmZSaWdodCA/ICdyaWdodCcgOiAnbGVmdCcgfVxuICAgICAgOiBpc1RpbnlcbiAgICAgICAgPyB7IGtpbmQ6ICd0aW55JyB9XG4gICAgICAgIDogeyBraW5kOiAnZnVsbCcgfTtcblxuICByZXR1cm4ge1xuICAgIG1vZGUsXG4gICAgbGVmdFBjdDpcbiAgICAgIHZpZXdEdXJhdGlvbiA+IDBcbiAgICAgICAgPyAoKHZpc2libGVTdGFydE1zIC0gdmlld1N0YXJ0KSAvIHZpZXdEdXJhdGlvbikgKiAxMDBcbiAgICAgICAgOiAwLFxuICAgIHdpZHRoUGN0OiB3aWR0aEZyYWMgKiAxMDAsXG4gICAgdmlzaWJsZVN0YXJ0TXMsXG4gICAgdmlzaWJsZUVuZE1zLFxuICAgIHZpc2libGVQaXhlbFdpZHRoLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRCYXJQb3NpdGlvblN0eWxlKGdlb21ldHJ5OiBCYXJHZW9tZXRyeSk6IHtcbiAgbGVmdDogc3RyaW5nO1xuICB3aWR0aDogc3RyaW5nO1xufSB7XG4gIHN3aXRjaCAoZ2VvbWV0cnkubW9kZS5raW5kKSB7XG4gICAgY2FzZSAnYXJyb3cnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDpcbiAgICAgICAgICBnZW9tZXRyeS5tb2RlLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0J1xuICAgICAgICAgICAgPyBgY2FsYygxMDAlIC0gJHtUSU5ZX0JBUl9CT1hfU0laRV9QWH1weClgXG4gICAgICAgICAgICA6ICcwcHgnLFxuICAgICAgICB3aWR0aDogYCR7VElOWV9CQVJfQk9YX1NJWkVfUFh9cHhgLFxuICAgICAgfTtcbiAgICBjYXNlICd0aW55JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IGBtaW4oJHtnZW9tZXRyeS5sZWZ0UGN0fSUsIGNhbGMoMTAwJSAtICR7VElOWV9CQVJfV0lEVEhfUFh9cHgpKWAsXG4gICAgICAgIHdpZHRoOiBgJHtUSU5ZX0JBUl9XSURUSF9QWH1weGAsXG4gICAgICB9O1xuICAgIGNhc2UgJ2Z1bGwnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogYCR7Z2VvbWV0cnkubGVmdFBjdH0lYCxcbiAgICAgICAgd2lkdGg6IGBtYXgoJHtnZW9tZXRyeS53aWR0aFBjdH0lLCA0cHgpYCxcbiAgICAgIH07XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZWdtZW50IHByb2plY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgVmlzaWJsZVNlZ21lbnQge1xuICBzdGF0dXM6IFNlZ21lbnRTdGF0dXM7XG4gIGxlZnRQY3Q6IG51bWJlcjtcbiAgd2lkdGhQY3Q6IG51bWJlcjtcbiAgcGl4ZWxXaWR0aDogbnVtYmVyO1xuICBmdWxsRHVyYXRpb25NczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb2plY3Qgc3RhdHVzIHNlZ21lbnRzIG9udG8gdGhlIHZpc2libGUgcG9ydGlvbiBvZiBhIGJhci4gU2VnbWVudHMgZnVsbHlcbiAqIG91dHNpZGUgdGhlIHZpc2libGUgd2luZG93IGFyZSBkcm9wcGVkOyBzZWdtZW50cyBjcm9zc2luZyB0aGUgZWRnZSBhcmVcbiAqIGNsaXBwZWQgdG8gWzAlLCAxMDAlXSBvZiB0aGUgdmlzaWJsZSBiYXIuXG4gKi9cbmZ1bmN0aW9uIHByb2plY3RTZWdtZW50cyhcbiAgc2VnbWVudHM6IFNlZ21lbnRbXSxcbiAgc3BhblN0YXJ0TXM6IG51bWJlcixcbiAgc3BhbkR1cmF0aW9uTXM6IG51bWJlcixcbiAgZ2VvbWV0cnk6IEJhckdlb21ldHJ5XG4pOiBWaXNpYmxlU2VnbWVudFtdIHtcbiAgY29uc3QgdmlzaWJsZUR1cmF0aW9uTXMgPSBnZW9tZXRyeS52aXNpYmxlRW5kTXMgLSBnZW9tZXRyeS52aXNpYmxlU3RhcnRNcztcbiAgaWYgKHZpc2libGVEdXJhdGlvbk1zIDw9IDApIHJldHVybiBbXTtcblxuICByZXR1cm4gc2VnbWVudHMuZmxhdE1hcCgoc2VnKSA9PiB7XG4gICAgY29uc3Qgc2VnU3RhcnRNcyA9IHNwYW5TdGFydE1zICsgc2VnLnN0YXJ0RnJhY3Rpb24gKiBzcGFuRHVyYXRpb25NcztcbiAgICBjb25zdCBzZWdFbmRNcyA9IHNwYW5TdGFydE1zICsgc2VnLmVuZEZyYWN0aW9uICogc3BhbkR1cmF0aW9uTXM7XG4gICAgY29uc3Qgc3RhcnRNcyA9IE1hdGgubWF4KHNlZ1N0YXJ0TXMsIGdlb21ldHJ5LnZpc2libGVTdGFydE1zKTtcbiAgICBjb25zdCBlbmRNcyA9IE1hdGgubWluKHNlZ0VuZE1zLCBnZW9tZXRyeS52aXNpYmxlRW5kTXMpO1xuICAgIGlmIChlbmRNcyA8PSBzdGFydE1zKSByZXR1cm4gW107XG5cbiAgICBjb25zdCB3aWR0aEZyYWMgPSAoZW5kTXMgLSBzdGFydE1zKSAvIHZpc2libGVEdXJhdGlvbk1zO1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHN0YXR1czogc2VnLnN0YXR1cyxcbiAgICAgICAgbGVmdFBjdDpcbiAgICAgICAgICAoKHN0YXJ0TXMgLSBnZW9tZXRyeS52aXNpYmxlU3RhcnRNcykgLyB2aXNpYmxlRHVyYXRpb25NcykgKiAxMDAsXG4gICAgICAgIHdpZHRoUGN0OiB3aWR0aEZyYWMgKiAxMDAsXG4gICAgICAgIHBpeGVsV2lkdGg6IHdpZHRoRnJhYyAqIGdlb21ldHJ5LnZpc2libGVQaXhlbFdpZHRoLFxuICAgICAgICBmdWxsRHVyYXRpb25NczogKHNlZy5lbmRGcmFjdGlvbiAtIHNlZy5zdGFydEZyYWN0aW9uKSAqIHNwYW5EdXJhdGlvbk1zLFxuICAgICAgfSxcbiAgICBdO1xuICB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTbWFsbCByZW5kZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIER1cmF0aW9uTGFiZWwoeyBsYWJlbCB9OiB7IGxhYmVsOiBzdHJpbmcgfSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPHNwYW4gY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktc3RhcnQgb3ZlcmZsb3ctaGlkZGVuIHB4LTEgdGV4dC1bMTBweF0gZm9udC1tb25vIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZSB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LWxlZnQgdGV4dC1ncmF5LTEwMDAgdGFidWxhci1udW1zIG9wYWNpdHktMCBncm91cC1ob3Zlci90aW1lbGluZS1yb3c6b3BhY2l0eS0xMDBcIj5cbiAgICAgIHtsYWJlbH1cbiAgICA8L3NwYW4+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEJvdW5kYXJ5QXJyb3coe1xuICBkaXJlY3Rpb24sXG59OiB7XG4gIGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0Jztcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBJY29uID0gZGlyZWN0aW9uID09PSAncmlnaHQnID8gQXJyb3dSaWdodCA6IEFycm93TGVmdDtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1bMC4yNXJlbV1cIj5cbiAgICAgIDxJY29uIGNsYXNzTmFtZT1cInNpemUtMyB0ZXh0LWdyYXktOTAwXCIgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gUGxhaW5CYXIoe1xuICBiZyxcbiAgYm9yZGVyLFxuICBsYWJlbCxcbn06IHtcbiAgYmc6IHN0cmluZztcbiAgYm9yZGVyOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xufSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC02IHctZnVsbCBtaW4tdy0xIHJvdW5kZWQtWzAuMjVyZW1dIGJvcmRlclwiXG4gICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kOiBiZywgYm9yZGVyQ29sb3I6IGJvcmRlciB9fVxuICAgID5cbiAgICAgIHtsYWJlbCA/IDxEdXJhdGlvbkxhYmVsIGxhYmVsPXtsYWJlbH0gLz4gOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBTZWdtZW50QmFyKHsgc2VnbWVudHMgfTogeyBzZWdtZW50czogVmlzaWJsZVNlZ21lbnRbXSB9KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtNiB3LWZ1bGxcIj5cbiAgICAgIHtzZWdtZW50cy5tYXAoKHNlZywgaSkgPT4ge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGZvcm1hdER1cmF0aW9uKHNlZy5mdWxsRHVyYXRpb25Ncyk7XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyIHRoZSBsYWJlbCB3aGVuIHRoZXJlJ3MgZW5vdWdoIHJvb20gZm9yIGl0IHdpdGhvdXQgY2xpcHBpbmcuXG4gICAgICAgIGNvbnN0IHNob3dMYWJlbCA9IHNlZy5waXhlbFdpZHRoID49IE1hdGgubWF4KDQwLCBsYWJlbC5sZW5ndGggKiA2ICsgMTIpO1xuICAgICAgICAvLyBCZWVmIHVwIHRoZSBxdWV1ZWQgc2VnbWVudCB3aGVuIGl0J3MgdG9vIG5hcnJvdyB0byByZWFkLlxuICAgICAgICBjb25zdCBpc05hcnJvd1F1ZXVlZCA9IHNlZy5zdGF0dXMgPT09ICdxdWV1ZWQnICYmIHNlZy5waXhlbFdpZHRoIDwgMjA7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlQmcgPSBpc05hcnJvd1F1ZXVlZCA/ICd2YXIoLS1kcy1ncmF5LTQwMCknIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBvdmVycmlkZUJvcmRlciA9IGlzTmFycm93UXVldWVkXG4gICAgICAgICAgPyAndmFyKC0tZHMtZ3JheS01MDApJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgJHtzZWcuc3RhdHVzfS0ke2l9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdhYnNvbHV0ZSBoLWZ1bGwgcm91bmRlZC1bMC4yNXJlbV0nLFxuICAgICAgICAgICAgICBTRUdNRU5UX0NMQVNTRVNbc2VnLnN0YXR1c11cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAvLyAxcHggZ2FwIGJldHdlZW4gYWRqYWNlbnQgc2VnbWVudHMsIGRpc3RyaWJ1dGVkIGVxdWFsbHkuXG4gICAgICAgICAgICAgIGxlZnQ6IGBjYWxjKCR7c2VnLmxlZnRQY3R9JSArIDAuNXB4KWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke3NlZy53aWR0aFBjdH0lIC0gMXB4KWAsXG4gICAgICAgICAgICAgIG1pbldpZHRoOiAxLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBvdmVycmlkZUJnLFxuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogb3ZlcnJpZGVCb3JkZXIsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtzaG93TGFiZWwgPyA8RHVyYXRpb25MYWJlbCBsYWJlbD17bGFiZWx9IC8+IDogbnVsbH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWVsaW5lQmFyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVGltZWxpbmVCYXIgPSBtZW1vKGZ1bmN0aW9uIFRpbWVsaW5lQmFyKHtcbiAgc3BhbixcbiAgdmlld1N0YXJ0LFxuICB2aWV3RHVyYXRpb24sXG4gIGNvbnRhaW5lcldpZHRoLFxuICBpc1NlbGVjdGVkLFxuICBpc0RpbW1lZCxcbiAgb25TZWxlY3QsXG59OiB7XG4gIHNwYW46IFNwYW47XG4gIHZpZXdTdGFydDogbnVtYmVyO1xuICB2aWV3RHVyYXRpb246IG51bWJlcjtcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlcjtcbiAgaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgaXNEaW1tZWQ/OiBib29sZWFuO1xuICBvblNlbGVjdDogKHNwYW5JZDogc3RyaW5nKSA9PiB2b2lkO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IHN0YXJ0TXMgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGVuZE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5lbmRUaW1lKTtcbiAgY29uc3QgdG90YWxEdXJhdGlvbk1zID0gZ2V0U3BhbkR1cmF0aW9uTXMoc3Bhbik7XG5cbiAgY29uc3QgZ2VvbWV0cnkgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBjb21wdXRlQmFyR2VvbWV0cnkoXG4gICAgICAgIHN0YXJ0TXMsXG4gICAgICAgIGVuZE1zLFxuICAgICAgICB2aWV3U3RhcnQsXG4gICAgICAgIHZpZXdTdGFydCArIHZpZXdEdXJhdGlvbixcbiAgICAgICAgY29udGFpbmVyV2lkdGhcbiAgICAgICksXG4gICAgW3N0YXJ0TXMsIGVuZE1zLCB2aWV3U3RhcnQsIHZpZXdEdXJhdGlvbiwgY29udGFpbmVyV2lkdGhdXG4gICk7XG5cbiAgY29uc3QgYmFzZVNlZ21lbnRzID0gdXNlTWVtbygoKSA9PiBjb21wdXRlU3BhblNlZ21lbnRzKHNwYW4pLCBbc3Bhbl0pO1xuICBjb25zdCBzZWdtZW50cyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGdlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ2Z1bGwnXG4gICAgICAgID8gcHJvamVjdFNlZ21lbnRzKGJhc2VTZWdtZW50cywgc3RhcnRNcywgdG90YWxEdXJhdGlvbk1zLCBnZW9tZXRyeSlcbiAgICAgICAgOiBbXSxcbiAgICBbZ2VvbWV0cnksIGJhc2VTZWdtZW50cywgc3RhcnRNcywgdG90YWxEdXJhdGlvbk1zXVxuICApO1xuXG4gIGNvbnN0IHdvcmtmbG93U3RhdHVzID0gKHNwYW4uYXR0cmlidXRlcy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgID8uc3RhdHVzIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNFcnJvcmVkID0gc3Bhbi5zdGF0dXMuY29kZSA9PT0gMiB8fCB3b3JrZmxvd1N0YXR1cyA9PT0gJ2ZhaWxlZCc7XG4gIGNvbnN0IGNvbG9ycyA9IGdldFJlc291cmNlQ29sb3Ioc3Bhbi5yZXNvdXJjZSk7XG4gIGNvbnN0IGZhbGxiYWNrQmcgPSBpc0Vycm9yZWRcbiAgICA/IChjb2xvcnMuZXJyb3JCZyA/PyAndmFyKC0tZHMtcmVkLTIwMCknKVxuICAgIDogY29sb3JzLmJnO1xuICBjb25zdCBmYWxsYmFja0JvcmRlciA9IGlzRXJyb3JlZFxuICAgID8gKGNvbG9ycy5lcnJvckJvcmRlciA/PyAndmFyKC0tZHMtcmVkLTUwMCknKVxuICAgIDogY29sb3JzLmJvcmRlcjtcblxuICBjb25zdCB0b3RhbExhYmVsID0gZm9ybWF0RHVyYXRpb24odG90YWxEdXJhdGlvbk1zKTtcbiAgY29uc3Qgc2hvd1RvdGFsTGFiZWwgPVxuICAgIGdlb21ldHJ5LnZpc2libGVQaXhlbFdpZHRoID49IE1hdGgubWF4KDQwLCB0b3RhbExhYmVsLmxlbmd0aCAqIDYgKyAxMik7XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgb25TZWxlY3Qoc3Bhbi5zcGFuSWQpO1xuICB9LCBbb25TZWxlY3QsIHNwYW4uc3BhbklkXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgYXJpYS1zZWxlY3RlZD17aXNTZWxlY3RlZH1cbiAgICAgIGFyaWEtZXhwYW5kZWQ9e2lzU2VsZWN0ZWR9XG4gICAgICBhcmlhLWxldmVsPXsxfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2dyb3VwL3RpbWVsaW5lLXJvdyBoLTEwIHJlbGF0aXZlIGZsZXggaXRlbXMtY2VudGVyIGhvdmVyOmJnLWdyYXktMTAwIGFyaWEtc2VsZWN0ZWQ6YmctZ3JheS0xMDAgYXJpYS1zZWxlY3RlZDpob3ZlcjpiZy1ncmF5LTIwMCB0cmFuc2l0aW9uLW9wYWNpdHknLFxuICAgICAgICBpc0RpbW1lZCAmJiAnb3BhY2l0eS0zNSdcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMFwiIHN0eWxlPXtUSU1FTElORV9JTlNFVF9TVFlMRX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIGgtNiAtdHJhbnNsYXRlLXktMS8yIHJvdW5kZWQtWzAuMjVyZW1dXCJcbiAgICAgICAgICBzdHlsZT17Z2V0QmFyUG9zaXRpb25TdHlsZShnZW9tZXRyeSl9XG4gICAgICAgID5cbiAgICAgICAgICB7Z2VvbWV0cnkubW9kZS5raW5kID09PSAnYXJyb3cnID8gKFxuICAgICAgICAgICAgPEJvdW5kYXJ5QXJyb3cgZGlyZWN0aW9uPXtnZW9tZXRyeS5tb2RlLmRpcmVjdGlvbn0gLz5cbiAgICAgICAgICApIDogZ2VvbWV0cnkubW9kZS5raW5kID09PSAndGlueScgPyAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtNiByb3VuZGVkLVswLjI1cmVtXSBib3JkZXJcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kOiBmYWxsYmFja0JnLCBib3JkZXJDb2xvcjogZmFsbGJhY2tCb3JkZXIgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IHNlZ21lbnRzLmxlbmd0aCA+IDAgPyAoXG4gICAgICAgICAgICA8U2VnbWVudEJhciBzZWdtZW50cz17c2VnbWVudHN9IC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxQbGFpbkJhclxuICAgICAgICAgICAgICBiZz17ZmFsbGJhY2tCZ31cbiAgICAgICAgICAgICAgYm9yZGVyPXtmYWxsYmFja0JvcmRlcn1cbiAgICAgICAgICAgICAgbGFiZWw9e3Nob3dUb3RhbExhYmVsID8gdG90YWxMYWJlbCA6IG51bGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59KTtcblxuZXhwb3J0IHsgVGltZWxpbmVCYXIgfTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWx0YUluZGljYXRvciAoQWx0LWtleSBnYXAgb3ZlcmxheSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBERUxUQV9DQVBfSEVJR0hUX1BYID0gODtcbi8vIFZlcnRpY2FsIG9mZnNldCB0byBzaXQgdGhlIGluZGljYXRvciBpbnNpZGUgdGhlIGdhcCBiZXR3ZWVuIHJvdyBOIGFuZCBOKzEsXG4vLyBhbGlnbmVkIHdpdGggd2hlcmUgdGhlIGJhciBzdGFydHMgaW4gdGhlIG5leHQgcm93IChyb3dzIGNlbnRlciBhIDI0cHggYmFyXG4vLyBpbnNpZGUgNDBweCwgc28gYmFycyBzdGFydCB+OHB4IGZyb20gdGhlIHRvcCBvZiB0aGUgcm93KS5cbmNvbnN0IERFTFRBX1JPV19PRkZTRVRfUFggPSA4O1xuXG5jb25zdCBEZWx0YUluZGljYXRvciA9IG1lbW8oZnVuY3Rpb24gRGVsdGFJbmRpY2F0b3Ioe1xuICBsZWZ0RnJhYyxcbiAgcmlnaHRGcmFjLFxuICBsYWJlbCxcbiAgcm93SW5kZXgsXG59OiB7XG4gIGxlZnRGcmFjOiBudW1iZXI7XG4gIHJpZ2h0RnJhYzogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xuICByb3dJbmRleDogbnVtYmVyO1xufSkge1xuICBjb25zdCBjZW50ZXJZID0gREVMVEFfUk9XX09GRlNFVF9QWCArIChyb3dJbmRleCArIDEpICogUk9XX0hFSUdIVF9QWDtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgbGVmdDogYCR7bGVmdEZyYWMgKiAxMDB9JWAsXG4gICAgICAgIHdpZHRoOiBgJHsocmlnaHRGcmFjIC0gbGVmdEZyYWMpICogMTAwfSVgLFxuICAgICAgICB0b3A6IGNlbnRlclkgLSBERUxUQV9DQVBfSEVJR0hUX1BYIC8gMixcbiAgICAgICAgaGVpZ2h0OiBERUxUQV9DQVBfSEVJR0hUX1BYLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtMCB0b3AtMCB3LXB4IGgtZnVsbCBiZy1hbWJlci04MDBcIiAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTAgcmlnaHQtMCB0b3AtMS8yIGgtcHggYmctYW1iZXItODAwXCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCB3LXB4IGgtZnVsbCBiZy1hbWJlci04MDBcIiAvPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0xLzIgdG9wLTEvMiAtdHJhbnNsYXRlLXgtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC1sYWJlbC0xMiBsZWFkaW5nLW5vbmUgd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC14cyBweC0xIHB5LTAuNSB0ZXh0LWdyYXktMTAwIGJnLWFtYmVyLTgwMFwiPlxuICAgICAgICB7bGFiZWx9XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICk7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaW1lbGluZUhlYWRlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lbGluZUhlYWRlcih7XG4gIG1hcmtlcnMsXG4gIGhvdmVySW5mbyxcbn06IHtcbiAgbWFya2VyczogVGltZU1hcmtlcltdO1xuICBob3ZlckluZm8/OiB7IGZyYWN0aW9uOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfSB8IG51bGw7XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGJnLWJhY2tncm91bmQtMTAwIGJvcmRlci1iIGJvcmRlci1ncmF5LWFscGhhLTQwMCBoLTEwIG1pbi1oLTEwIGZsZXggaXRlbXMtZW5kIHB4LTQgcGItMVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLWZ1bGwgZmxleC0xXCI+XG4gICAgICAgIHttYXJrZXJzLm1hcCgobSkgPT4gKFxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBrZXk9e2Ake20ucG9zaXRpb259LSR7bS5sYWJlbH1gfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTEgZm9udC1tb25vIHRleHQteHMgZm9udC1ub3JtYWwgbGVhZGluZy00IHRleHQtZ3JheS05MDAgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7bS5wb3NpdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHttLmxhYmVsfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKSl9XG4gICAgICAgIHtob3ZlckluZm8gJiYgKFxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMSBwb2ludGVyLWV2ZW50cy1ub25lIHotMTAgZm9udC1tb25vIHRleHQtWzExcHhdIGxlYWRpbmctNCB0ZXh0LWdyYXktMTAwMCB3aGl0ZXNwYWNlLW5vd3JhcCBiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIHJvdW5kZWQgcHgtMSAtdHJhbnNsYXRlLXgtMS8yXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke2hvdmVySW5mby5mcmFjdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtob3ZlckluZm8ubGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGltZWxpbmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZWxpbmUoe1xuICBzcGFucyxcbiAgdmlld1N0YXJ0LFxuICB2aWV3RW5kLFxuICBtYXJrZXJzLFxuICBzZWxlY3RlZElkLFxuICBzZWFyY2hSZXN1bHQsXG4gIG9uU2VsZWN0LFxuICBob3ZlckZyYWN0aW9uLFxuICBhbHRIZWxkID0gZmFsc2UsXG59OiB7XG4gIHNwYW5zOiBTcGFuW107XG4gIHZpZXdTdGFydDogbnVtYmVyO1xuICB2aWV3RW5kOiBudW1iZXI7XG4gIG1hcmtlcnM6IFRpbWVNYXJrZXJbXTtcbiAgc2VsZWN0ZWRJZDogc3RyaW5nIHwgbnVsbDtcbiAgc2VhcmNoUmVzdWx0OiBTcGFuU2VhcmNoUmVzdWx0O1xuICBvblNlbGVjdDogKHNwYW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICBob3ZlckZyYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgYWx0SGVsZD86IGJvb2xlYW47XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgW2NvbnRhaW5lcldpZHRoLCBzZXRDb250YWluZXJXaWR0aF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3Qgdmlld0R1cmF0aW9uID0gdmlld0VuZCAtIHZpZXdTdGFydDtcbiAgY29uc3QgdGltZWxpbmVXaWR0aCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lcldpZHRoIC0gVElNRUxJTkVfUEFERElOR19QWCAqIDIpO1xuICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHVzZVJvd1dpbmRvdyhcbiAgICBjb250YWluZXJSZWYsXG4gICAgc3BhbnMubGVuZ3RoLFxuICAgIFJPV19IRUlHSFRfUFhcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKChbZW50cnldKSA9PiB7XG4gICAgICBzZXRDb250YWluZXJXaWR0aChlbnRyeS5jb250ZW50UmVjdC53aWR0aCk7XG4gICAgfSk7XG4gICAgcm8ub2JzZXJ2ZShlbCk7XG4gICAgcmV0dXJuICgpID0+IHJvLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGdhcHMgPSB1c2VNZW1vKFxuICAgICgpID0+IGNvbXB1dGVTcGFuR2FwcyhzcGFucywgdmlld1N0YXJ0LCB2aWV3RW5kKSxcbiAgICBbc3BhbnMsIHZpZXdTdGFydCwgdmlld0VuZF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Y29udGFpbmVyUmVmfVxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC1mdWxsIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6IHNwYW5zLmxlbmd0aCAqIFJPV19IRUlHSFRfUFggfX1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgPlxuICAgICAgICB7bWFya2Vycy5tYXAoKG1hcmtlcikgPT5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBcIjBzXCIgb3JpZ2luIG1hcmtlciBzaW5jZSB0aGUgbGVmdCBlZGdlIGFscmVhZHkgaW1wbGllcyBpdC5cbiAgICAgICAgICBNYXRoLmFicyhtYXJrZXIudmFsdWUpID4gMC4wMDAwMDEgPyAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17YCR7bWFya2VyLnBvc2l0aW9ufS0ke21hcmtlci5sYWJlbH1gfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCB3LXB4IGJnLWdyYXktYWxwaGEtMzAwXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7bWFya2VyLnBvc2l0aW9uICogMTAwfSVgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtob3ZlckZyYWN0aW9uICE9IG51bGwgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIHBvaW50ZXItZXZlbnRzLW5vbmUgei0xMFwiXG4gICAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgdy1weCBiZy1ncmF5LWFscGhhLTUwMFwiXG4gICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHtob3ZlckZyYWN0aW9uICogMTAwfSVgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAgPGRpdiBzdHlsZT17eyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7c3RhcnQgKiBST1dfSEVJR0hUX1BYfXB4KWAgfX0+XG4gICAgICAgIHtzcGFucy5zbGljZShzdGFydCwgZW5kKS5tYXAoKHNwYW4pID0+IChcbiAgICAgICAgICA8VGltZWxpbmVCYXJcbiAgICAgICAgICAgIGtleT17c3Bhbi5zcGFuSWR9XG4gICAgICAgICAgICBzcGFuPXtzcGFufVxuICAgICAgICAgICAgdmlld1N0YXJ0PXt2aWV3U3RhcnR9XG4gICAgICAgICAgICB2aWV3RHVyYXRpb249e3ZpZXdEdXJhdGlvbn1cbiAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoPXt0aW1lbGluZVdpZHRofVxuICAgICAgICAgICAgaXNTZWxlY3RlZD17c2VsZWN0ZWRJZCA9PT0gc3Bhbi5zcGFuSWR9XG4gICAgICAgICAgICBpc0RpbW1lZD17aXNTcGFuRGltbWVkQnlTZWFyY2goc3Bhbi5zcGFuSWQsIHNlYXJjaFJlc3VsdCl9XG4gICAgICAgICAgICBvblNlbGVjdD17b25TZWxlY3R9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHthbHRIZWxkICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIHBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgIHN0eWxlPXtUSU1FTElORV9JTlNFVF9TVFlMRX1cbiAgICAgICAgPlxuICAgICAgICAgIHtnYXBzLm1hcCgoZ2FwKSA9PiAoXG4gICAgICAgICAgICA8RGVsdGFJbmRpY2F0b3JcbiAgICAgICAgICAgICAga2V5PXtnYXAucm93SW5kZXh9XG4gICAgICAgICAgICAgIGxlZnRGcmFjPXtnYXAubGVmdEZyYWN9XG4gICAgICAgICAgICAgIHJpZ2h0RnJhYz17Z2FwLnJpZ2h0RnJhY31cbiAgICAgICAgICAgICAgbGFiZWw9e2Zvcm1hdER1cmF0aW9uKGdhcC5nYXBNcywgdHJ1ZSl9XG4gICAgICAgICAgICAgIHJvd0luZGV4PXtnYXAucm93SW5kZXh9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export declare function TraceViewerSkeleton(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=trace-viewer-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-viewer-skeleton.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,mBAAmB,4CAsElC"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Skeleton } from '../../ui/skeleton';
3
+ const COL_TEMPLATE = '340px 1px minmax(50px, 1fr)';
4
+ const ROWS = [
5
+ { id: 'r0', name: 62, off: 0, bar: 72 },
6
+ { id: 'r1', name: 78, off: 6, bar: 48 },
7
+ { id: 'r2', name: 50, off: 10, bar: 55 },
8
+ { id: 'r3', name: 84, off: 18, bar: 30 },
9
+ { id: 'r4', name: 45, off: 18, bar: 42 },
10
+ { id: 'r5', name: 66, off: 34, bar: 38 },
11
+ { id: 'r6', name: 55, off: 41, bar: 25 },
12
+ { id: 'r7', name: 40, off: 50, bar: 30 },
13
+ ];
14
+ const HEADER_MARKERS = ['m0', 'm1', 'm2', 'm3'];
15
+ const HeaderDivider = () => (_jsx("div", { className: "flex justify-center", children: _jsx("span", { "aria-hidden": true, className: "h-full w-px bg-gray-alpha-400" }) }));
16
+ export function TraceViewerSkeleton() {
17
+ return (_jsxs("output", { "aria-busy": "true", "aria-label": "Loading trace", className: "flex flex-col w-full h-full min-h-0 bg-background-100", children: [_jsx("span", { className: "sr-only", children: "Loading trace\u2026" }), _jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: COL_TEMPLATE }, children: [_jsxs("div", { className: "h-10 min-h-10 flex items-center border-b border-gray-alpha-400 pl-4 pr-2 gap-1.5", children: [_jsx(Skeleton, { className: "w-3.5 h-3.5 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3.5 w-40" })] }), _jsx(HeaderDivider, {}), _jsx("div", { className: "h-10 min-h-10 flex items-end border-b border-gray-alpha-400 px-4 pb-1 gap-2", children: _jsx("div", { className: "relative flex-1 flex items-end justify-between", children: HEADER_MARKERS.map((id) => (_jsx(Skeleton, { className: "h-3.5 w-9" }, id))) }) })] }), _jsxs("div", { className: "grid flex-1 min-h-0 overflow-hidden", style: { gridTemplateColumns: COL_TEMPLATE }, children: [_jsx("div", { className: "block overflow-visible", children: _jsx("ul", { className: "block divide-y divide-gray-alpha-400 border-b border-gray-alpha-400", children: ROWS.map((row) => (_jsxs("li", { className: "h-10 flex items-center pl-4 pr-2", children: [_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [_jsx(Skeleton, { className: "w-4 h-4 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3.5", style: { width: `${row.name}%` } })] }), _jsx(Skeleton, { className: "ml-2 h-3.5 w-10 shrink-0" })] }, row.id))) }) }), _jsx("span", { "aria-hidden": true, className: "h-full w-px bg-gray-alpha-400" }), _jsx("div", { className: "relative min-h-0", children: ROWS.map((row) => (_jsx("div", { className: "relative h-10", children: _jsx("div", { className: "absolute inset-x-4 inset-y-0", children: _jsx(Skeleton, { className: "absolute top-1/2 -translate-y-1/2 h-6 rounded-[0.25rem]", style: { left: `${row.off}%`, width: `${row.bar}%` } }) }) }, row.id))) })] })] }));
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utdmlld2VyLXNrZWxldG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL3RyYWNlLXZpZXdlci1za2VsZXRvbi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxNQUFNLFlBQVksR0FBRyw2QkFBNkIsQ0FBQztBQUVuRCxNQUFNLElBQUksR0FBNkQ7SUFDckUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ3ZDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtJQUN2QyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDeEMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ3hDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtJQUN4QyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDeEMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ3hDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtDQUN6QyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVoRCxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUMxQixjQUFLLFNBQVMsRUFBQyxxQkFBcUIsWUFDbEMsb0NBQWtCLFNBQVMsRUFBQywrQkFBK0IsR0FBRyxHQUMxRCxDQUNQLENBQUM7QUFFRixNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU8sQ0FDTCwrQkFDWSxNQUFNLGdCQUNMLGVBQWUsRUFDMUIsU0FBUyxFQUFDLHVEQUF1RCxhQUVqRSxlQUFNLFNBQVMsRUFBQyxTQUFTLG9DQUFzQixFQUcvQyxlQUNFLFNBQVMsRUFBQyxlQUFlLEVBQ3pCLEtBQUssRUFBRSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxhQUU1QyxlQUFLLFNBQVMsRUFBQyxrRkFBa0YsYUFDL0YsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLGlDQUFpQyxHQUFHLEVBQ3hELEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyxZQUFZLEdBQUcsSUFDL0IsRUFDTixLQUFDLGFBQWEsS0FBRyxFQUNqQixjQUFLLFNBQVMsRUFBQyw2RUFBNkUsWUFDMUYsY0FBSyxTQUFTLEVBQUMsZ0RBQWdELFlBQzVELGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQzFCLEtBQUMsUUFBUSxJQUFVLFNBQVMsRUFBQyxXQUFXLElBQXpCLEVBQUUsQ0FBMEIsQ0FDNUMsQ0FBQyxHQUNFLEdBQ0YsSUFDRixFQUdOLGVBQ0UsU0FBUyxFQUFDLHFDQUFxQyxFQUMvQyxLQUFLLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsYUFHNUMsY0FBSyxTQUFTLEVBQUMsd0JBQXdCLFlBQ3JDLGFBQUksU0FBUyxFQUFDLHFFQUFxRSxZQUNoRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUNqQixjQUFpQixTQUFTLEVBQUMsa0NBQWtDLGFBQzNELGVBQUssU0FBUyxFQUFDLHdDQUF3QyxhQUNyRCxLQUFDLFFBQVEsSUFBQyxTQUFTLEVBQUMsNkJBQTZCLEdBQUcsRUFDcEQsS0FBQyxRQUFRLElBQ1AsU0FBUyxFQUFDLE9BQU8sRUFDakIsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQ2hDLElBQ0UsRUFDTixLQUFDLFFBQVEsSUFBQyxTQUFTLEVBQUMsMEJBQTBCLEdBQUcsS0FSMUMsR0FBRyxDQUFDLEVBQUUsQ0FTVixDQUNOLENBQUMsR0FDQyxHQUNELEVBR04sb0NBQWtCLFNBQVMsRUFBQywrQkFBK0IsR0FBRyxFQUc5RCxjQUFLLFNBQVMsRUFBQyxrQkFBa0IsWUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FDakIsY0FBa0IsU0FBUyxFQUFDLGVBQWUsWUFDekMsY0FBSyxTQUFTLEVBQUMsOEJBQThCLFlBQzNDLEtBQUMsUUFBUSxJQUNQLFNBQVMsRUFBQyx5REFBeUQsRUFDbkUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUNwRCxHQUNFLElBTkUsR0FBRyxDQUFDLEVBQUUsQ0FPVixDQUNQLENBQUMsR0FDRSxJQUNGLElBQ0MsQ0FDVixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi4vLi4vdWkvc2tlbGV0b24nO1xuXG5jb25zdCBDT0xfVEVNUExBVEUgPSAnMzQwcHggMXB4IG1pbm1heCg1MHB4LCAxZnIpJztcblxuY29uc3QgUk9XUzogeyBpZDogc3RyaW5nOyBuYW1lOiBudW1iZXI7IG9mZjogbnVtYmVyOyBiYXI6IG51bWJlciB9W10gPSBbXG4gIHsgaWQ6ICdyMCcsIG5hbWU6IDYyLCBvZmY6IDAsIGJhcjogNzIgfSxcbiAgeyBpZDogJ3IxJywgbmFtZTogNzgsIG9mZjogNiwgYmFyOiA0OCB9LFxuICB7IGlkOiAncjInLCBuYW1lOiA1MCwgb2ZmOiAxMCwgYmFyOiA1NSB9LFxuICB7IGlkOiAncjMnLCBuYW1lOiA4NCwgb2ZmOiAxOCwgYmFyOiAzMCB9LFxuICB7IGlkOiAncjQnLCBuYW1lOiA0NSwgb2ZmOiAxOCwgYmFyOiA0MiB9LFxuICB7IGlkOiAncjUnLCBuYW1lOiA2Niwgb2ZmOiAzNCwgYmFyOiAzOCB9LFxuICB7IGlkOiAncjYnLCBuYW1lOiA1NSwgb2ZmOiA0MSwgYmFyOiAyNSB9LFxuICB7IGlkOiAncjcnLCBuYW1lOiA0MCwgb2ZmOiA1MCwgYmFyOiAzMCB9LFxuXTtcblxuY29uc3QgSEVBREVSX01BUktFUlMgPSBbJ20wJywgJ20xJywgJ20yJywgJ20zJ107XG5cbmNvbnN0IEhlYWRlckRpdmlkZXIgPSAoKSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIDxzcGFuIGFyaWEtaGlkZGVuIGNsYXNzTmFtZT1cImgtZnVsbCB3LXB4IGJnLWdyYXktYWxwaGEtNDAwXCIgLz5cbiAgPC9kaXY+XG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhY2VWaWV3ZXJTa2VsZXRvbigpIHtcbiAgcmV0dXJuIChcbiAgICA8b3V0cHV0XG4gICAgICBhcmlhLWJ1c3k9XCJ0cnVlXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJMb2FkaW5nIHRyYWNlXCJcbiAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCBtaW4taC0wIGJnLWJhY2tncm91bmQtMTAwXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+TG9hZGluZyB0cmFjZeKApjwvc3Bhbj5cblxuICAgICAgey8qIEhlYWRlciByb3c6IHNlYXJjaCBoZWFkZXIgfCBkaXZpZGVyIHwgdGltZWxpbmUgaGVhZGVyICovfVxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJzaHJpbmstMCBncmlkXCJcbiAgICAgICAgc3R5bGU9e3sgZ3JpZFRlbXBsYXRlQ29sdW1uczogQ09MX1RFTVBMQVRFIH19XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC0xMCBtaW4taC0xMCBmbGV4IGl0ZW1zLWNlbnRlciBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgcGwtNCBwci0yIGdhcC0xLjVcIj5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwidy0zLjUgaC0zLjUgc2hyaW5rLTAgcm91bmRlZC1zbVwiIC8+XG4gICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtMy41IHctNDBcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPEhlYWRlckRpdmlkZXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLTEwIG1pbi1oLTEwIGZsZXggaXRlbXMtZW5kIGJvcmRlci1iIGJvcmRlci1ncmF5LWFscGhhLTQwMCBweC00IHBiLTEgZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXgtMSBmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgIHtIRUFERVJfTUFSS0VSUy5tYXAoKGlkKSA9PiAoXG4gICAgICAgICAgICAgIDxTa2VsZXRvbiBrZXk9e2lkfSBjbGFzc05hbWU9XCJoLTMuNSB3LTlcIiAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBDb250ZW50IHJvdzogZXZlbnQgbGlzdCB8IGd1dHRlciB8IHRpbWVsaW5lICovfVxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJncmlkIGZsZXgtMSBtaW4taC0wIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgIHN0eWxlPXt7IGdyaWRUZW1wbGF0ZUNvbHVtbnM6IENPTF9URU1QTEFURSB9fVxuICAgICAgPlxuICAgICAgICB7LyogU2lkZWJhciBldmVudCByb3dzICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJsb2NrIG92ZXJmbG93LXZpc2libGVcIj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwiYmxvY2sgZGl2aWRlLXkgZGl2aWRlLWdyYXktYWxwaGEtNDAwIGJvcmRlci1iIGJvcmRlci1ncmF5LWFscGhhLTQwMFwiPlxuICAgICAgICAgICAge1JPV1MubWFwKChyb3cpID0+IChcbiAgICAgICAgICAgICAgPGxpIGtleT17cm93LmlkfSBjbGFzc05hbWU9XCJoLTEwIGZsZXggaXRlbXMtY2VudGVyIHBsLTQgcHItMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtaW4tdy0wIGZsZXgtMSBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJ3LTQgaC00IHNocmluay0wIHJvdW5kZWQtc21cIiAvPlxuICAgICAgICAgICAgICAgICAgPFNrZWxldG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMy41XCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6IGAke3Jvdy5uYW1lfSVgIH19XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJtbC0yIGgtMy41IHctMTAgc2hyaW5rLTBcIiAvPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEd1dHRlciAqL31cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW4gY2xhc3NOYW1lPVwiaC1mdWxsIHctcHggYmctZ3JheS1hbHBoYS00MDBcIiAvPlxuXG4gICAgICAgIHsvKiBUaW1lbGluZSBiYXJzICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIG1pbi1oLTBcIj5cbiAgICAgICAgICB7Uk9XUy5tYXAoKHJvdykgPT4gKFxuICAgICAgICAgICAgPGRpdiBrZXk9e3Jvdy5pZH0gY2xhc3NOYW1lPVwicmVsYXRpdmUgaC0xMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXgtNCBpbnNldC15LTBcIj5cbiAgICAgICAgICAgICAgICA8U2tlbGV0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBoLTYgcm91bmRlZC1bMC4yNXJlbV1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7cm93Lm9mZn0lYCwgd2lkdGg6IGAke3Jvdy5iYXJ9JWAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvb3V0cHV0PlxuICApO1xufVxuIl19
@@ -0,0 +1,20 @@
1
+ import { type RefObject } from 'react';
2
+ export interface RowWindow {
3
+ /** First visible row index (inclusive), already padded by overscan. */
4
+ start: number;
5
+ /** Last visible row index (exclusive), already padded by overscan. */
6
+ end: number;
7
+ }
8
+ /**
9
+ * Fixed-height windowing over a shared scroll container.
10
+ *
11
+ * The events list and timeline both render one `rowHeight`-tall row per span
12
+ * and scroll together inside the same `SplitPane`. Each caller passes a ref to
13
+ * its own root; the hook walks up to the shared scrollable ancestor, so the
14
+ * scroll container doesn't have to be threaded through props. Same scroll
15
+ * position + same row height means both panes window to the same range.
16
+ */
17
+ export declare function useRowWindow(ref: RefObject<HTMLElement | null>, rowCount: number, rowHeight: number, overscan?: number): RowWindow;
18
+ /** Row height (px) shared by the events list and timeline rows (`h-10`). */
19
+ export declare const ROW_HEIGHT_PX = 40;
20
+ //# sourceMappingURL=use-row-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-row-window.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/use-row-window.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAK5D,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;CACb;AAaD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,SAAK,GACZ,SAAS,CAkDX;AAED,4EAA4E;AAC5E,eAAO,MAAM,aAAa,KAAK,CAAC"}
@@ -0,0 +1,69 @@
1
+ 'use client';
2
+ import { useEffect, useState } from 'react';
3
+ /** Rows rendered on the first paint, before the container has been measured. */
4
+ const INITIAL_VISIBLE_ROWS = 60;
5
+ /** Nearest scrollable ancestor of `el` (the shared `SplitPane` container). */
6
+ function getScrollParent(el) {
7
+ let node = el?.parentElement ?? null;
8
+ while (node) {
9
+ const overflowY = getComputedStyle(node).overflowY;
10
+ if (overflowY === 'auto' || overflowY === 'scroll')
11
+ return node;
12
+ node = node.parentElement;
13
+ }
14
+ return null;
15
+ }
16
+ /**
17
+ * Fixed-height windowing over a shared scroll container.
18
+ *
19
+ * The events list and timeline both render one `rowHeight`-tall row per span
20
+ * and scroll together inside the same `SplitPane`. Each caller passes a ref to
21
+ * its own root; the hook walks up to the shared scrollable ancestor, so the
22
+ * scroll container doesn't have to be threaded through props. Same scroll
23
+ * position + same row height means both panes window to the same range.
24
+ */
25
+ export function useRowWindow(ref, rowCount, rowHeight, overscan = 12) {
26
+ // Bound the pre-measurement window so the first paint of a large trace
27
+ // doesn't render every row before the effect narrows it down.
28
+ const [range, setRange] = useState(() => ({
29
+ start: 0,
30
+ end: Math.min(rowCount, INITIAL_VISIBLE_ROWS),
31
+ }));
32
+ useEffect(() => {
33
+ const self = ref.current;
34
+ const el = getScrollParent(self);
35
+ if (!self || !el)
36
+ return;
37
+ let raf = 0;
38
+ const measure = () => {
39
+ raf = 0;
40
+ // Offset of the list's top within the scroll container's content, so the
41
+ // window stays correct even if the list isn't flush with the top.
42
+ const offset = self.getBoundingClientRect().top -
43
+ el.getBoundingClientRect().top +
44
+ el.scrollTop;
45
+ const top = el.scrollTop - offset;
46
+ const start = Math.max(0, Math.floor(top / rowHeight) - overscan);
47
+ const end = Math.min(rowCount, Math.ceil((top + el.clientHeight) / rowHeight) + overscan);
48
+ setRange((prev) => prev.start === start && prev.end === end ? prev : { start, end });
49
+ };
50
+ const onScroll = () => {
51
+ if (!raf)
52
+ raf = requestAnimationFrame(measure);
53
+ };
54
+ measure();
55
+ el.addEventListener('scroll', onScroll, { passive: true });
56
+ const ro = new ResizeObserver(measure);
57
+ ro.observe(el);
58
+ return () => {
59
+ el.removeEventListener('scroll', onScroll);
60
+ ro.disconnect();
61
+ if (raf)
62
+ cancelAnimationFrame(raf);
63
+ };
64
+ }, [ref, rowCount, rowHeight, overscan]);
65
+ return range;
66
+ }
67
+ /** Row height (px) shared by the events list and timeline rows (`h-10`). */
68
+ export const ROW_HEIGHT_PX = 40;
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXJvdy13aW5kb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvdXNlLXJvdy13aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBRWIsT0FBTyxFQUFrQixTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTVELGdGQUFnRjtBQUNoRixNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQVNoQyw4RUFBOEU7QUFDOUUsU0FBUyxlQUFlLENBQUMsRUFBc0I7SUFDN0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUM7SUFDckMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNuRCxJQUFJLFNBQVMsS0FBSyxNQUFNLElBQUksU0FBUyxLQUFLLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoRSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUFrQyxFQUNsQyxRQUFnQixFQUNoQixTQUFpQixFQUNqQixRQUFRLEdBQUcsRUFBRTtJQUViLHVFQUF1RTtJQUN2RSw4REFBOEQ7SUFDOUQsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxRQUFRLENBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNuRCxLQUFLLEVBQUUsQ0FBQztRQUNSLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQztLQUM5QyxDQUFDLENBQUMsQ0FBQztJQUVKLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFFekIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ25CLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDUix5RUFBeUU7WUFDekUsa0VBQWtFO1lBQ2xFLE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUc7Z0JBQ2hDLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUc7Z0JBQzlCLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDZixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUNsRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNsQixRQUFRLEVBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUMxRCxDQUFDO1lBQ0YsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDaEIsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQ2pFLENBQUM7UUFDSixDQUFDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsR0FBRyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQztRQUVGLE9BQU8sRUFBRSxDQUFDO1FBQ1YsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRCxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWYsT0FBTyxHQUFHLEVBQUU7WUFDVixFQUFFLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixJQUFJLEdBQUc7Z0JBQUUsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUV6QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgdHlwZSBSZWZPYmplY3QsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbi8qKiBSb3dzIHJlbmRlcmVkIG9uIHRoZSBmaXJzdCBwYWludCwgYmVmb3JlIHRoZSBjb250YWluZXIgaGFzIGJlZW4gbWVhc3VyZWQuICovXG5jb25zdCBJTklUSUFMX1ZJU0lCTEVfUk9XUyA9IDYwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvd1dpbmRvdyB7XG4gIC8qKiBGaXJzdCB2aXNpYmxlIHJvdyBpbmRleCAoaW5jbHVzaXZlKSwgYWxyZWFkeSBwYWRkZWQgYnkgb3ZlcnNjYW4uICovXG4gIHN0YXJ0OiBudW1iZXI7XG4gIC8qKiBMYXN0IHZpc2libGUgcm93IGluZGV4IChleGNsdXNpdmUpLCBhbHJlYWR5IHBhZGRlZCBieSBvdmVyc2Nhbi4gKi9cbiAgZW5kOiBudW1iZXI7XG59XG5cbi8qKiBOZWFyZXN0IHNjcm9sbGFibGUgYW5jZXN0b3Igb2YgYGVsYCAodGhlIHNoYXJlZCBgU3BsaXRQYW5lYCBjb250YWluZXIpLiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICBsZXQgbm9kZSA9IGVsPy5wYXJlbnRFbGVtZW50ID8/IG51bGw7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgY29uc3Qgb3ZlcmZsb3dZID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5vdmVyZmxvd1k7XG4gICAgaWYgKG92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IG92ZXJmbG93WSA9PT0gJ3Njcm9sbCcpIHJldHVybiBub2RlO1xuICAgIG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogRml4ZWQtaGVpZ2h0IHdpbmRvd2luZyBvdmVyIGEgc2hhcmVkIHNjcm9sbCBjb250YWluZXIuXG4gKlxuICogVGhlIGV2ZW50cyBsaXN0IGFuZCB0aW1lbGluZSBib3RoIHJlbmRlciBvbmUgYHJvd0hlaWdodGAtdGFsbCByb3cgcGVyIHNwYW5cbiAqIGFuZCBzY3JvbGwgdG9nZXRoZXIgaW5zaWRlIHRoZSBzYW1lIGBTcGxpdFBhbmVgLiBFYWNoIGNhbGxlciBwYXNzZXMgYSByZWYgdG9cbiAqIGl0cyBvd24gcm9vdDsgdGhlIGhvb2sgd2Fsa3MgdXAgdG8gdGhlIHNoYXJlZCBzY3JvbGxhYmxlIGFuY2VzdG9yLCBzbyB0aGVcbiAqIHNjcm9sbCBjb250YWluZXIgZG9lc24ndCBoYXZlIHRvIGJlIHRocmVhZGVkIHRocm91Z2ggcHJvcHMuIFNhbWUgc2Nyb2xsXG4gKiBwb3NpdGlvbiArIHNhbWUgcm93IGhlaWdodCBtZWFucyBib3RoIHBhbmVzIHdpbmRvdyB0byB0aGUgc2FtZSByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJvd1dpbmRvdyhcbiAgcmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPixcbiAgcm93Q291bnQ6IG51bWJlcixcbiAgcm93SGVpZ2h0OiBudW1iZXIsXG4gIG92ZXJzY2FuID0gMTJcbik6IFJvd1dpbmRvdyB7XG4gIC8vIEJvdW5kIHRoZSBwcmUtbWVhc3VyZW1lbnQgd2luZG93IHNvIHRoZSBmaXJzdCBwYWludCBvZiBhIGxhcmdlIHRyYWNlXG4gIC8vIGRvZXNuJ3QgcmVuZGVyIGV2ZXJ5IHJvdyBiZWZvcmUgdGhlIGVmZmVjdCBuYXJyb3dzIGl0IGRvd24uXG4gIGNvbnN0IFtyYW5nZSwgc2V0UmFuZ2VdID0gdXNlU3RhdGU8Um93V2luZG93PigoKSA9PiAoe1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogTWF0aC5taW4ocm93Q291bnQsIElOSVRJQUxfVklTSUJMRV9ST1dTKSxcbiAgfSkpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZiA9IHJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGVsID0gZ2V0U2Nyb2xsUGFyZW50KHNlbGYpO1xuICAgIGlmICghc2VsZiB8fCAhZWwpIHJldHVybjtcblxuICAgIGxldCByYWYgPSAwO1xuICAgIGNvbnN0IG1lYXN1cmUgPSAoKSA9PiB7XG4gICAgICByYWYgPSAwO1xuICAgICAgLy8gT2Zmc2V0IG9mIHRoZSBsaXN0J3MgdG9wIHdpdGhpbiB0aGUgc2Nyb2xsIGNvbnRhaW5lcidzIGNvbnRlbnQsIHNvIHRoZVxuICAgICAgLy8gd2luZG93IHN0YXlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgbGlzdCBpc24ndCBmbHVzaCB3aXRoIHRoZSB0b3AuXG4gICAgICBjb25zdCBvZmZzZXQgPVxuICAgICAgICBzZWxmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtXG4gICAgICAgIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArXG4gICAgICAgIGVsLnNjcm9sbFRvcDtcbiAgICAgIGNvbnN0IHRvcCA9IGVsLnNjcm9sbFRvcCAtIG9mZnNldDtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcih0b3AgLyByb3dIZWlnaHQpIC0gb3ZlcnNjYW4pO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oXG4gICAgICAgIHJvd0NvdW50LFxuICAgICAgICBNYXRoLmNlaWwoKHRvcCArIGVsLmNsaWVudEhlaWdodCkgLyByb3dIZWlnaHQpICsgb3ZlcnNjYW5cbiAgICAgICk7XG4gICAgICBzZXRSYW5nZSgocHJldikgPT5cbiAgICAgICAgcHJldi5zdGFydCA9PT0gc3RhcnQgJiYgcHJldi5lbmQgPT09IGVuZCA/IHByZXYgOiB7IHN0YXJ0LCBlbmQgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25TY3JvbGwgPSAoKSA9PiB7XG4gICAgICBpZiAoIXJhZikgcmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG1lYXN1cmUpO1xuICAgIH07XG5cbiAgICBtZWFzdXJlKCk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcihtZWFzdXJlKTtcbiAgICByby5vYnNlcnZlKGVsKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgICByby5kaXNjb25uZWN0KCk7XG4gICAgICBpZiAocmFmKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWYpO1xuICAgIH07XG4gIH0sIFtyZWYsIHJvd0NvdW50LCByb3dIZWlnaHQsIG92ZXJzY2FuXSk7XG5cbiAgcmV0dXJuIHJhbmdlO1xufVxuXG4vKiogUm93IGhlaWdodCAocHgpIHNoYXJlZCBieSB0aGUgZXZlbnRzIGxpc3QgYW5kIHRpbWVsaW5lIHJvd3MgKGBoLTEwYCkuICovXG5leHBvcnQgY29uc3QgUk9XX0hFSUdIVF9QWCA9IDQwO1xuIl19
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Span } from '../trace-viewer/types';
3
+ interface ActiveSpanContextValue {
4
+ activeSpanId: string | null;
5
+ activeSpan: Span | null;
6
+ setActiveSpan: (spanId: string) => void;
7
+ clearActiveSpan: () => void;
8
+ }
9
+ export declare function ActiveSpanProvider({ spans, children, }: {
10
+ spans: Span[];
11
+ children: ReactNode;
12
+ }): import("react/jsx-runtime").JSX.Element;
13
+ export declare const useActiveSpan: () => ActiveSpanContextValue;
14
+ export {};
15
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAElD,UAAU,sBAAsB;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAKD,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAmDA;AAED,eAAO,MAAM,aAAa,QAAO,sBAOhC,CAAC"}
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
4
+ const ActiveSpanContext = createContext(null);
5
+ ActiveSpanContext.displayName = 'ActiveSpanContext';
6
+ export function ActiveSpanProvider({ spans, children, }) {
7
+ const [activeSpanId, setActiveSpanId] = useState(null);
8
+ useEffect(() => {
9
+ setActiveSpanId((currentSpanId) => {
10
+ if (!currentSpanId) {
11
+ return null;
12
+ }
13
+ const hasCurrentSpan = spans.some((span) => span.spanId === currentSpanId);
14
+ if (hasCurrentSpan) {
15
+ return currentSpanId;
16
+ }
17
+ return null;
18
+ });
19
+ }, [spans]);
20
+ const activeSpan = useMemo(() => {
21
+ if (!activeSpanId) {
22
+ return null;
23
+ }
24
+ return spans.find((span) => span.spanId === activeSpanId) ?? null;
25
+ }, [activeSpanId, spans]);
26
+ const setActiveSpan = useCallback((spanId) => {
27
+ setActiveSpanId(spanId);
28
+ }, []);
29
+ const clearActiveSpan = useCallback(() => {
30
+ setActiveSpanId(null);
31
+ }, []);
32
+ const value = useMemo(() => ({
33
+ activeSpanId,
34
+ activeSpan,
35
+ setActiveSpan,
36
+ clearActiveSpan,
37
+ }), [activeSpanId, activeSpan, setActiveSpan, clearActiveSpan]);
38
+ return (_jsx(ActiveSpanContext.Provider, { value: value, children: children }));
39
+ }
40
+ export const useActiveSpan = () => {
41
+ const context = useContext(ActiveSpanContext);
42
+ if (!context) {
43
+ throw new Error('useActiveSpan must be used within ActiveSpanProvider');
44
+ }
45
+ return context;
46
+ };
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25ldy10cmFjZS12aWV3ZXIvY29udGV4dC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFDTCxhQUFhLEVBRWIsV0FBVyxFQUNYLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQVVmLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFnQyxJQUFJLENBQUMsQ0FBQztBQUM3RSxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEVBQ2pDLEtBQUssRUFDTCxRQUFRLEdBSVQ7SUFDQyxNQUFNLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxHQUFHLFFBQVEsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFdEUsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLGVBQWUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDL0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUN4QyxDQUFDO1lBQ0YsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRVosTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNwRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUUxQixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtRQUNuRCxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUN2QyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUNuQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ0wsWUFBWTtRQUNaLFVBQVU7UUFDVixhQUFhO1FBQ2IsZUFBZTtLQUNoQixDQUFDLEVBQ0YsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FDM0QsQ0FBQztJQUVGLE9BQU8sQ0FDTCxLQUFDLGlCQUFpQixDQUFDLFFBQVEsSUFBQyxLQUFLLEVBQUUsS0FBSyxZQUNyQyxRQUFRLEdBQ2tCLENBQzlCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQTJCLEVBQUU7SUFDeEQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnLi4vdHJhY2Utdmlld2VyL3R5cGVzJztcblxuaW50ZXJmYWNlIEFjdGl2ZVNwYW5Db250ZXh0VmFsdWUge1xuICBhY3RpdmVTcGFuSWQ6IHN0cmluZyB8IG51bGw7XG4gIGFjdGl2ZVNwYW46IFNwYW4gfCBudWxsO1xuICBzZXRBY3RpdmVTcGFuOiAoc3BhbklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQWN0aXZlU3BhbjogKCkgPT4gdm9pZDtcbn1cblxuY29uc3QgQWN0aXZlU3BhbkNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEFjdGl2ZVNwYW5Db250ZXh0VmFsdWUgfCBudWxsPihudWxsKTtcbkFjdGl2ZVNwYW5Db250ZXh0LmRpc3BsYXlOYW1lID0gJ0FjdGl2ZVNwYW5Db250ZXh0JztcblxuZXhwb3J0IGZ1bmN0aW9uIEFjdGl2ZVNwYW5Qcm92aWRlcih7XG4gIHNwYW5zLFxuICBjaGlsZHJlbixcbn06IHtcbiAgc3BhbnM6IFNwYW5bXTtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn0pIHtcbiAgY29uc3QgW2FjdGl2ZVNwYW5JZCwgc2V0QWN0aXZlU3BhbklkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0QWN0aXZlU3BhbklkKChjdXJyZW50U3BhbklkKSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnRTcGFuSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0N1cnJlbnRTcGFuID0gc3BhbnMuc29tZShcbiAgICAgICAgKHNwYW4pID0+IHNwYW4uc3BhbklkID09PSBjdXJyZW50U3BhbklkXG4gICAgICApO1xuICAgICAgaWYgKGhhc0N1cnJlbnRTcGFuKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3BhbklkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfSwgW3NwYW5zXSk7XG5cbiAgY29uc3QgYWN0aXZlU3BhbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghYWN0aXZlU3BhbklkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhbnMuZmluZCgoc3BhbikgPT4gc3Bhbi5zcGFuSWQgPT09IGFjdGl2ZVNwYW5JZCkgPz8gbnVsbDtcbiAgfSwgW2FjdGl2ZVNwYW5JZCwgc3BhbnNdKTtcblxuICBjb25zdCBzZXRBY3RpdmVTcGFuID0gdXNlQ2FsbGJhY2soKHNwYW5JZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0QWN0aXZlU3BhbklkKHNwYW5JZCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBjbGVhckFjdGl2ZVNwYW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0QWN0aXZlU3BhbklkKG51bGwpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vPEFjdGl2ZVNwYW5Db250ZXh0VmFsdWU+KFxuICAgICgpID0+ICh7XG4gICAgICBhY3RpdmVTcGFuSWQsXG4gICAgICBhY3RpdmVTcGFuLFxuICAgICAgc2V0QWN0aXZlU3BhbixcbiAgICAgIGNsZWFyQWN0aXZlU3BhbixcbiAgICB9KSxcbiAgICBbYWN0aXZlU3BhbklkLCBhY3RpdmVTcGFuLCBzZXRBY3RpdmVTcGFuLCBjbGVhckFjdGl2ZVNwYW5dXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QWN0aXZlU3BhbkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0FjdGl2ZVNwYW5Db250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgY29uc3QgdXNlQWN0aXZlU3BhbiA9ICgpOiBBY3RpdmVTcGFuQ29udGV4dFZhbHVlID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQWN0aXZlU3BhbkNvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUFjdGl2ZVNwYW4gbXVzdCBiZSB1c2VkIHdpdGhpbiBBY3RpdmVTcGFuUHJvdmlkZXInKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0O1xufTtcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { Span } from '../trace-viewer/types';
3
+ interface DetailPanelProps {
4
+ span: Span;
5
+ rootStart: number;
6
+ onClose: () => void;
7
+ }
8
+ export declare function DetailPanel({ span, rootStart, onClose, }: DetailPanelProps): ReactNode;
9
+ export {};
10
+ //# sourceMappingURL=detail-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-panel.d.ts","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/detail-panel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAKlD,UAAU,gBAAgB;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,OAAO,GACR,EAAE,gBAAgB,GAAG,SAAS,CAmC9B"}
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { X } from 'lucide-react';
4
+ import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
5
+ import { IconButton } from '../ui/icon-button';
6
+ import { getSpanDurationMs } from './utils';
7
+ export function DetailPanel({ span, rootStart, onClose, }) {
8
+ const startMs = getHighResInMs(span.startTime);
9
+ const durationMs = getSpanDurationMs(span);
10
+ const offsetMs = startMs - rootStart;
11
+ return (_jsxs("aside", { className: "grid h-full max-h-full grid-rows-[2.5rem_1fr] bg-background-200", children: [_jsxs("div", { className: "flex items-center justify-between px-3 border-b border-gray-alpha-400", children: [_jsx("span", { className: "text-sm font-medium text-gray-1000 truncate", children: span.name }), _jsx(IconButton, { "aria-label": "Close span details", onClick: onClose, children: _jsx(X, { className: "w-4 h-4" }) })] }), _jsx("div", { className: "overflow-y-auto p-3 space-y-3", children: _jsxs("dl", { className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-1.5 text-sm", children: [_jsx("dt", { className: "text-gray-900", children: "Resource" }), _jsx("dd", { className: "text-gray-1000 font-mono", children: span.resource }), _jsx("dt", { className: "text-gray-900", children: "Duration" }), _jsx("dd", { className: "text-gray-1000 tabular-nums font-mono", children: formatDuration(durationMs) }), _jsx("dt", { className: "text-gray-900", children: "Offset" }), _jsxs("dd", { className: "text-gray-1000 tabular-nums font-mono", children: ["+", formatDuration(offsetMs)] }), _jsx("dt", { className: "text-gray-900", children: "Status" }), _jsx("dd", { className: "text-gray-1000 font-mono", children: span.status.code === 2 ? 'Error' : 'OK' })] }) })] }));
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbmV3LXRyYWNlLXZpZXdlci9kZXRhaWwtcGFuZWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBR2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQVE1QyxNQUFNLFVBQVUsV0FBVyxDQUFDLEVBQzFCLElBQUksRUFDSixTQUFTLEVBQ1QsT0FBTyxHQUNVO0lBQ2pCLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUVyQyxPQUFPLENBQ0wsaUJBQU8sU0FBUyxFQUFDLGlFQUFpRSxhQUNoRixlQUFLLFNBQVMsRUFBQyx1RUFBdUUsYUFDcEYsZUFBTSxTQUFTLEVBQUMsNkNBQTZDLFlBQzFELElBQUksQ0FBQyxJQUFJLEdBQ0wsRUFDUCxLQUFDLFVBQVUsa0JBQVksb0JBQW9CLEVBQUMsT0FBTyxFQUFFLE9BQU8sWUFDMUQsS0FBQyxDQUFDLElBQUMsU0FBUyxFQUFDLFNBQVMsR0FBRyxHQUNkLElBQ1QsRUFDTixjQUFLLFNBQVMsRUFBQywrQkFBK0IsWUFDNUMsY0FBSSxTQUFTLEVBQUMscURBQXFELGFBQ2pFLGFBQUksU0FBUyxFQUFDLGVBQWUseUJBQWMsRUFDM0MsYUFBSSxTQUFTLEVBQUMsMEJBQTBCLFlBQUUsSUFBSSxDQUFDLFFBQVEsR0FBTSxFQUM3RCxhQUFJLFNBQVMsRUFBQyxlQUFlLHlCQUFjLEVBQzNDLGFBQUksU0FBUyxFQUFDLHVDQUF1QyxZQUNsRCxjQUFjLENBQUMsVUFBVSxDQUFDLEdBQ3hCLEVBQ0wsYUFBSSxTQUFTLEVBQUMsZUFBZSx1QkFBWSxFQUN6QyxjQUFJLFNBQVMsRUFBQyx1Q0FBdUMsa0JBQ2pELGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFDdkIsRUFDTCxhQUFJLFNBQVMsRUFBQyxlQUFlLHVCQUFZLEVBQ3pDLGFBQUksU0FBUyxFQUFDLDBCQUEwQixZQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUNyQyxJQUNGLEdBQ0QsSUFDQSxDQUNULENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBYIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnLi4vdHJhY2Utdmlld2VyL3R5cGVzJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uLCBnZXRIaWdoUmVzSW5NcyB9IGZyb20gJy4uL3RyYWNlLXZpZXdlci91dGlsL3RpbWluZyc7XG5pbXBvcnQgeyBJY29uQnV0dG9uIH0gZnJvbSAnLi4vdWkvaWNvbi1idXR0b24nO1xuaW1wb3J0IHsgZ2V0U3BhbkR1cmF0aW9uTXMgfSBmcm9tICcuL3V0aWxzJztcblxuaW50ZXJmYWNlIERldGFpbFBhbmVsUHJvcHMge1xuICBzcGFuOiBTcGFuO1xuICByb290U3RhcnQ6IG51bWJlcjtcbiAgb25DbG9zZTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERldGFpbFBhbmVsKHtcbiAgc3BhbixcbiAgcm9vdFN0YXJ0LFxuICBvbkNsb3NlLFxufTogRGV0YWlsUGFuZWxQcm9wcyk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IHN0YXJ0TXMgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBnZXRTcGFuRHVyYXRpb25NcyhzcGFuKTtcbiAgY29uc3Qgb2Zmc2V0TXMgPSBzdGFydE1zIC0gcm9vdFN0YXJ0O1xuXG4gIHJldHVybiAoXG4gICAgPGFzaWRlIGNsYXNzTmFtZT1cImdyaWQgaC1mdWxsIG1heC1oLWZ1bGwgZ3JpZC1yb3dzLVsyLjVyZW1fMWZyXSBiZy1iYWNrZ3JvdW5kLTIwMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtMyBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktMTAwMCB0cnVuY2F0ZVwiPlxuICAgICAgICAgIHtzcGFuLm5hbWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPEljb25CdXR0b24gYXJpYS1sYWJlbD1cIkNsb3NlIHNwYW4gZGV0YWlsc1wiIG9uQ2xpY2s9e29uQ2xvc2V9PlxuICAgICAgICAgIDxYIGNsYXNzTmFtZT1cInctNCBoLTRcIiAvPlxuICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3ZlcmZsb3cteS1hdXRvIHAtMyBzcGFjZS15LTNcIj5cbiAgICAgICAgPGRsIGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLVthdXRvXzFmcl0gZ2FwLXgtMyBnYXAteS0xLjUgdGV4dC1zbVwiPlxuICAgICAgICAgIDxkdCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktOTAwXCI+UmVzb3VyY2U8L2R0PlxuICAgICAgICAgIDxkZCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktMTAwMCBmb250LW1vbm9cIj57c3Bhbi5yZXNvdXJjZX08L2RkPlxuICAgICAgICAgIDxkdCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktOTAwXCI+RHVyYXRpb248L2R0PlxuICAgICAgICAgIDxkZCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktMTAwMCB0YWJ1bGFyLW51bXMgZm9udC1tb25vXCI+XG4gICAgICAgICAgICB7Zm9ybWF0RHVyYXRpb24oZHVyYXRpb25Ncyl9XG4gICAgICAgICAgPC9kZD5cbiAgICAgICAgICA8ZHQgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMFwiPk9mZnNldDwvZHQ+XG4gICAgICAgICAgPGRkIGNsYXNzTmFtZT1cInRleHQtZ3JheS0xMDAwIHRhYnVsYXItbnVtcyBmb250LW1vbm9cIj5cbiAgICAgICAgICAgICt7Zm9ybWF0RHVyYXRpb24ob2Zmc2V0TXMpfVxuICAgICAgICAgIDwvZGQ+XG4gICAgICAgICAgPGR0IGNsYXNzTmFtZT1cInRleHQtZ3JheS05MDBcIj5TdGF0dXM8L2R0PlxuICAgICAgICAgIDxkZCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktMTAwMCBmb250LW1vbm9cIj5cbiAgICAgICAgICAgIHtzcGFuLnN0YXR1cy5jb2RlID09PSAyID8gJ0Vycm9yJyA6ICdPSyd9XG4gICAgICAgICAgPC9kZD5cbiAgICAgICAgPC9kbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvYXNpZGU+XG4gICk7XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ declare const WorkflowIcon: () => import("react/jsx-runtime").JSX.Element;
2
+ declare const WebhookIcon: () => import("react/jsx-runtime").JSX.Element;
3
+ declare const SleepIcon: () => import("react/jsx-runtime").JSX.Element;
4
+ declare const StepForwardIcon: () => import("react/jsx-runtime").JSX.Element;
5
+ export { WorkflowIcon, WebhookIcon, SleepIcon, StepForwardIcon };
6
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/icons.tsx"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY,+CAgBjB,CAAC;AAEF,QAAA,MAAM,WAAW,+CAkBhB,CAAC;AAEF,QAAA,MAAM,SAAS,+CAkBd,CAAC;AAEF,QAAA,MAAM,eAAe,+CAkBpB,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC"}