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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +2 -10
  2. package/dist/components/error-boundary.js +1 -1
  3. package/dist/components/event-list-view.d.ts +46 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +228 -90
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +6 -2
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +5 -2
  10. package/dist/components/new-trace-viewer/components/copy-button.js +3 -3
  11. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts +34 -0
  12. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  13. package/dist/components/new-trace-viewer/components/detail-panel-width.js +67 -0
  14. package/dist/components/new-trace-viewer/components/detail-panel.d.ts +14 -0
  15. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +1 -0
  16. package/dist/components/new-trace-viewer/components/detail-panel.js +122 -0
  17. package/dist/components/new-trace-viewer/components/draggable-border.d.ts +31 -0
  18. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +1 -0
  19. package/dist/components/new-trace-viewer/components/draggable-border.js +140 -0
  20. package/dist/components/new-trace-viewer/components/event-list.d.ts +4 -2
  21. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
  22. package/dist/components/new-trace-viewer/components/event-list.js +22 -13
  23. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  27. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  28. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  29. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  30. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  31. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  32. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  33. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  34. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  35. package/dist/components/new-trace-viewer/components/minimap.d.ts +14 -0
  36. package/dist/components/new-trace-viewer/components/minimap.d.ts.map +1 -0
  37. package/dist/components/new-trace-viewer/components/minimap.js +337 -0
  38. package/dist/components/new-trace-viewer/components/pane-constants.d.ts +14 -0
  39. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +1 -0
  40. package/dist/components/new-trace-viewer/components/pane-constants.js +16 -0
  41. package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
  42. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
  43. package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
  44. package/dist/components/new-trace-viewer/components/split-pane.d.ts +3 -7
  45. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
  46. package/dist/components/new-trace-viewer/components/split-pane.js +25 -84
  47. package/dist/components/new-trace-viewer/components/timeline.d.ts +19 -15
  48. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  49. package/dist/components/new-trace-viewer/components/timeline.js +229 -111
  50. package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
  51. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  52. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  53. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +55 -0
  54. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  55. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  56. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  57. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +26 -0
  58. package/dist/components/new-trace-viewer/components/use-element-width.d.ts +8 -0
  59. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +1 -0
  60. package/dist/components/new-trace-viewer/components/use-element-width.js +25 -0
  61. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
  62. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
  63. package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
  64. package/dist/components/new-trace-viewer/context.d.ts +3 -1
  65. package/dist/components/new-trace-viewer/context.d.ts.map +1 -1
  66. package/dist/components/new-trace-viewer/context.js +9 -10
  67. package/dist/components/new-trace-viewer/icons.js +3 -3
  68. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  69. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  70. package/dist/components/new-trace-viewer/search.js +134 -0
  71. package/dist/components/new-trace-viewer/trace-viewer.d.ts +6 -3
  72. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  73. package/dist/components/new-trace-viewer/trace-viewer.js +167 -162
  74. package/dist/components/new-trace-viewer/types.d.ts +2 -0
  75. package/dist/components/new-trace-viewer/types.d.ts.map +1 -1
  76. package/dist/components/new-trace-viewer/types.js +2 -2
  77. package/dist/components/new-trace-viewer/utils.d.ts +48 -13
  78. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
  79. package/dist/components/new-trace-viewer/utils.js +135 -107
  80. package/dist/components/run-trace-view.d.ts +5 -7
  81. package/dist/components/run-trace-view.d.ts.map +1 -1
  82. package/dist/components/run-trace-view.js +3 -3
  83. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  84. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  85. package/dist/components/sidebar/attribute-panel.js +133 -113
  86. package/dist/components/sidebar/attributes-block.d.ts +40 -0
  87. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  88. package/dist/components/sidebar/attributes-block.js +140 -0
  89. package/dist/components/sidebar/conversation-view.js +1 -1
  90. package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
  91. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  92. package/dist/components/sidebar/copyable-data-block.js +17 -16
  93. package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
  94. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  95. package/dist/components/sidebar/entity-detail-panel.js +35 -69
  96. package/dist/components/sidebar/events-list.d.ts +6 -2
  97. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  98. package/dist/components/sidebar/events-list.js +76 -62
  99. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  100. package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
  101. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  102. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  103. package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
  104. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  105. package/dist/components/sidebar/span-detail-merge.js +92 -0
  106. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  107. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  108. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  109. package/dist/components/stream-viewer.js +1 -1
  110. package/dist/components/trace-viewer/components/map.d.ts +2 -2
  111. package/dist/components/trace-viewer/components/map.d.ts.map +1 -1
  112. package/dist/components/trace-viewer/components/map.js +1 -1
  113. package/dist/components/trace-viewer/components/markers.js +1 -1
  114. package/dist/components/trace-viewer/components/node.d.ts +7 -7
  115. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  116. package/dist/components/trace-viewer/components/node.js +2 -1
  117. package/dist/components/trace-viewer/components/search-input.js +1 -1
  118. package/dist/components/trace-viewer/components/search.js +1 -1
  119. package/dist/components/trace-viewer/components/span-content.js +1 -1
  120. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  121. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  122. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  123. package/dist/components/trace-viewer/components/ui.js +1 -1
  124. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  125. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  126. package/dist/components/trace-viewer/context.js +1 -1
  127. package/dist/components/trace-viewer/index.js +1 -1
  128. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  129. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  130. package/dist/components/trace-viewer/types.js +1 -1
  131. package/dist/components/trace-viewer/util/constants.js +1 -1
  132. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  133. package/dist/components/trace-viewer/util/timing.d.ts +3 -3
  134. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  135. package/dist/components/trace-viewer/util/timing.js +8 -11
  136. package/dist/components/trace-viewer/util/tree.js +1 -1
  137. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  138. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  139. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  140. package/dist/components/trace-viewer/worker.js +1 -1
  141. package/dist/components/trace-viewer-new.d.ts +5 -1
  142. package/dist/components/trace-viewer-new.d.ts.map +1 -1
  143. package/dist/components/trace-viewer-new.js +8 -10
  144. package/dist/components/ui/alert.js +2 -2
  145. package/dist/components/ui/button.d.ts +10 -0
  146. package/dist/components/ui/button.d.ts.map +1 -0
  147. package/dist/components/ui/button.js +46 -0
  148. package/dist/components/ui/card.js +2 -2
  149. package/dist/components/ui/collapsible.d.ts +46 -0
  150. package/dist/components/ui/collapsible.d.ts.map +1 -0
  151. package/dist/components/ui/collapsible.js +66 -0
  152. package/dist/components/ui/context-card.d.ts +47 -0
  153. package/dist/components/ui/context-card.d.ts.map +1 -0
  154. package/dist/components/ui/context-card.js +471 -0
  155. package/dist/components/ui/data-inspector.d.ts +7 -6
  156. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  157. package/dist/components/ui/data-inspector.js +232 -99
  158. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  159. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  160. package/dist/components/ui/data-inspector.styles.js +95 -0
  161. package/dist/components/ui/decrypt-button.js +1 -1
  162. package/dist/components/ui/error-card.js +2 -2
  163. package/dist/components/ui/error-stack-block.d.ts +17 -10
  164. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  165. package/dist/components/ui/error-stack-block.js +49 -30
  166. package/dist/components/ui/icon-button.d.ts +19 -0
  167. package/dist/components/ui/icon-button.d.ts.map +1 -0
  168. package/dist/components/ui/icon-button.js +29 -0
  169. package/dist/components/ui/kbd.d.ts +10 -0
  170. package/dist/components/ui/kbd.d.ts.map +1 -0
  171. package/dist/components/ui/kbd.js +25 -0
  172. package/dist/components/ui/load-more-button.js +1 -1
  173. package/dist/components/ui/menu-dropdown.js +1 -1
  174. package/dist/components/ui/skeleton.js +2 -2
  175. package/dist/components/ui/spinner.js +1 -1
  176. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  177. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  178. package/dist/components/ui/timestamp-tooltip.js +80 -132
  179. package/dist/components/ui/tooltip.d.ts +10 -0
  180. package/dist/components/ui/tooltip.d.ts.map +1 -0
  181. package/dist/components/ui/tooltip.js +12 -0
  182. package/dist/components/workflow-trace-view.d.ts +7 -8
  183. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  184. package/dist/components/workflow-trace-view.js +11 -16
  185. package/dist/components/workflow-traces/event-colors.d.ts +2 -1
  186. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  187. package/dist/components/workflow-traces/event-colors.js +15 -7
  188. package/dist/components/workflow-traces/trace-colors.d.ts.map +1 -1
  189. package/dist/components/workflow-traces/trace-colors.js +3 -4
  190. package/dist/components/workflow-traces/trace-span-construction.d.ts +7 -4
  191. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  192. package/dist/components/workflow-traces/trace-span-construction.js +87 -33
  193. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  194. package/dist/hooks/use-dark-mode.js +1 -1
  195. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  196. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  197. package/dist/hooks/use-intersection-observer.js +29 -0
  198. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  199. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  200. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  201. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  202. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  203. package/dist/hooks/use-reduced-motion.js +29 -0
  204. package/dist/index.d.ts +3 -2
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +4 -3
  207. package/dist/lib/cn.d.ts +10 -0
  208. package/dist/lib/cn.d.ts.map +1 -0
  209. package/dist/lib/cn.js +83 -0
  210. package/dist/lib/event-analysis.d.ts +1 -1
  211. package/dist/lib/event-analysis.d.ts.map +1 -1
  212. package/dist/lib/event-analysis.js +3 -2
  213. package/dist/lib/event-materialization.d.ts +1 -1
  214. package/dist/lib/event-materialization.d.ts.map +1 -1
  215. package/dist/lib/event-materialization.js +29 -21
  216. package/dist/lib/exact-event-search-id.d.ts +25 -0
  217. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  218. package/dist/lib/exact-event-search-id.js +39 -0
  219. package/dist/lib/hydration.d.ts +17 -2
  220. package/dist/lib/hydration.d.ts.map +1 -1
  221. package/dist/lib/hydration.js +185 -22
  222. package/dist/lib/stream-display.js +1 -1
  223. package/dist/lib/toast.js +1 -1
  224. package/dist/lib/trace-builder.d.ts +16 -4
  225. package/dist/lib/trace-builder.d.ts.map +1 -1
  226. package/dist/lib/trace-builder.js +34 -15
  227. package/dist/lib/utils.d.ts +23 -9
  228. package/dist/lib/utils.d.ts.map +1 -1
  229. package/dist/lib/utils.js +73 -33
  230. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  231. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  232. package/dist/lib/zstd-browser-decoder.js +41 -0
  233. package/dist/styles.css +14 -0
  234. package/package.json +10 -7
  235. package/src/components/event-list-view.tsx +375 -116
  236. package/src/components/index.ts +12 -5
  237. package/src/components/new-trace-viewer/components/copy-button.tsx +2 -2
  238. package/src/components/new-trace-viewer/components/detail-panel-width.test.ts +123 -0
  239. package/src/components/new-trace-viewer/components/detail-panel-width.ts +76 -0
  240. package/src/components/new-trace-viewer/components/detail-panel.tsx +273 -0
  241. package/src/components/new-trace-viewer/components/draggable-border.tsx +216 -0
  242. package/src/components/new-trace-viewer/components/event-list.tsx +57 -32
  243. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  244. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  245. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  246. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  247. package/src/components/new-trace-viewer/components/minimap.tsx +559 -0
  248. package/src/components/new-trace-viewer/components/pane-constants.ts +19 -0
  249. package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
  250. package/src/components/new-trace-viewer/components/split-pane.tsx +80 -135
  251. package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
  252. package/src/components/new-trace-viewer/components/timeline.tsx +603 -239
  253. package/src/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  254. package/src/components/new-trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  255. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
  256. package/src/components/new-trace-viewer/components/use-element-width.ts +29 -0
  257. package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
  258. package/src/components/new-trace-viewer/context.tsx +13 -14
  259. package/src/components/new-trace-viewer/icons.tsx +2 -2
  260. package/src/components/new-trace-viewer/search.ts +178 -0
  261. package/src/components/new-trace-viewer/trace-viewer.tsx +336 -293
  262. package/src/components/new-trace-viewer/types.ts +2 -0
  263. package/src/components/new-trace-viewer/utils.test.ts +247 -0
  264. package/src/components/new-trace-viewer/utils.ts +203 -134
  265. package/src/components/run-trace-view.tsx +10 -14
  266. package/src/components/sidebar/attribute-panel.tsx +276 -275
  267. package/src/components/sidebar/attributes-block.tsx +326 -0
  268. package/src/components/sidebar/copyable-data-block.tsx +50 -28
  269. package/src/components/sidebar/entity-detail-panel.tsx +89 -123
  270. package/src/components/sidebar/events-list.tsx +196 -178
  271. package/src/components/sidebar/sidebar-data-context.tsx +11 -11
  272. package/src/components/sidebar/span-detail-merge.ts +134 -0
  273. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  274. package/src/components/trace-viewer/components/node.tsx +3 -2
  275. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  276. package/src/components/trace-viewer/util/timing.ts +7 -11
  277. package/src/components/trace-viewer-new.tsx +21 -15
  278. package/src/components/ui/alert.tsx +1 -1
  279. package/src/components/ui/button.tsx +68 -0
  280. package/src/components/ui/card.tsx +1 -1
  281. package/src/components/ui/collapsible.tsx +219 -0
  282. package/src/components/ui/context-card.tsx +784 -0
  283. package/src/components/ui/data-inspector.styles.ts +96 -0
  284. package/src/components/ui/data-inspector.tsx +501 -204
  285. package/src/components/ui/error-card.tsx +1 -1
  286. package/src/components/ui/error-stack-block.tsx +84 -55
  287. package/src/components/ui/icon-button.tsx +53 -0
  288. package/src/components/ui/kbd.tsx +43 -0
  289. package/src/components/ui/skeleton.tsx +1 -1
  290. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  291. package/src/components/ui/tooltip.tsx +47 -0
  292. package/src/components/workflow-trace-view.tsx +31 -36
  293. package/src/components/workflow-traces/event-colors.ts +15 -11
  294. package/src/components/workflow-traces/trace-colors.ts +6 -6
  295. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  296. package/src/components/workflow-traces/trace-span-construction.ts +118 -35
  297. package/src/hooks/use-intersection-observer.ts +57 -0
  298. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  299. package/src/hooks/use-reduced-motion.ts +34 -0
  300. package/src/index.ts +9 -0
  301. package/src/lib/cn.ts +93 -0
  302. package/src/lib/event-analysis.ts +6 -4
  303. package/src/lib/event-materialization.ts +35 -21
  304. package/src/lib/exact-event-search-id.ts +67 -0
  305. package/src/lib/hydration.ts +203 -29
  306. package/src/lib/trace-builder.ts +44 -19
  307. package/src/lib/utils.test.ts +33 -0
  308. package/src/lib/utils.ts +82 -35
  309. package/src/lib/zstd-browser-decoder.ts +42 -0
  310. package/src/styles.css +14 -0
  311. package/dist/components/error-boundary.js.map +0 -1
  312. package/dist/components/event-list-view.js.map +0 -1
  313. package/dist/components/hook-actions.js.map +0 -1
  314. package/dist/components/index.js.map +0 -1
  315. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  316. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  317. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  318. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  319. package/dist/components/new-trace-viewer/context.js.map +0 -1
  320. package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
  321. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
  322. package/dist/components/new-trace-viewer/detail-panel.js +0 -11
  323. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  324. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  325. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  326. package/dist/components/new-trace-viewer/types.js.map +0 -1
  327. package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
  328. package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
  329. package/dist/components/new-trace-viewer/util/constants.js +0 -2
  330. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  331. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  332. package/dist/components/run-trace-view.js.map +0 -1
  333. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  334. package/dist/components/sidebar/conversation-view.js.map +0 -1
  335. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  336. package/dist/components/sidebar/detail-card.d.ts +0 -14
  337. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  338. package/dist/components/sidebar/detail-card.js +0 -20
  339. package/dist/components/sidebar/detail-card.js.map +0 -1
  340. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  341. package/dist/components/sidebar/events-list.js.map +0 -1
  342. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  343. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  344. package/dist/components/stream-viewer.js.map +0 -1
  345. package/dist/components/trace-viewer/components/map.js.map +0 -1
  346. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  347. package/dist/components/trace-viewer/components/node.js.map +0 -1
  348. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  349. package/dist/components/trace-viewer/components/search.js.map +0 -1
  350. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  351. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  352. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  353. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  354. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  355. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  356. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  357. package/dist/components/trace-viewer/context.js.map +0 -1
  358. package/dist/components/trace-viewer/index.js.map +0 -1
  359. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  360. package/dist/components/trace-viewer/types.js.map +0 -1
  361. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  362. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  363. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  364. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  365. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  366. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  367. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  368. package/dist/components/trace-viewer/worker.js.map +0 -1
  369. package/dist/components/trace-viewer-new.js.map +0 -1
  370. package/dist/components/ui/alert.js.map +0 -1
  371. package/dist/components/ui/card.js.map +0 -1
  372. package/dist/components/ui/data-inspector.js.map +0 -1
  373. package/dist/components/ui/decrypt-button.js.map +0 -1
  374. package/dist/components/ui/error-card.js.map +0 -1
  375. package/dist/components/ui/error-stack-block.js.map +0 -1
  376. package/dist/components/ui/inspector-theme.d.ts +0 -95
  377. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  378. package/dist/components/ui/inspector-theme.js +0 -82
  379. package/dist/components/ui/inspector-theme.js.map +0 -1
  380. package/dist/components/ui/load-more-button.js.map +0 -1
  381. package/dist/components/ui/menu-dropdown.js.map +0 -1
  382. package/dist/components/ui/skeleton.js.map +0 -1
  383. package/dist/components/ui/spinner.js.map +0 -1
  384. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  385. package/dist/components/workflow-trace-view.js.map +0 -1
  386. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  387. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  388. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  389. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  390. package/dist/hooks/use-dark-mode.js.map +0 -1
  391. package/dist/index.js.map +0 -1
  392. package/dist/lib/event-analysis.js.map +0 -1
  393. package/dist/lib/event-materialization.js.map +0 -1
  394. package/dist/lib/hydration.js.map +0 -1
  395. package/dist/lib/stream-display.js.map +0 -1
  396. package/dist/lib/toast.js.map +0 -1
  397. package/dist/lib/trace-builder.js.map +0 -1
  398. package/dist/lib/utils.js.map +0 -1
  399. package/src/components/new-trace-viewer/detail-panel.tsx +0 -57
  400. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  401. package/src/components/sidebar/detail-card.tsx +0 -65
  402. package/src/components/ui/inspector-theme.ts +0 -110
@@ -0,0 +1,134 @@
1
+ const hasField = (
2
+ value: object,
3
+ key: string
4
+ ): value is Record<string, unknown> => key in value;
5
+
6
+ const RESOURCES_WITH_FETCHED_DETAIL = new Set(['run', 'step', 'sleep']);
7
+
8
+ export function resourceNeedsFetchedDetail(
9
+ resource: string | undefined
10
+ ): boolean {
11
+ return resource !== undefined && RESOURCES_WITH_FETCHED_DETAIL.has(resource);
12
+ }
13
+
14
+ export type SpanDetailStatus = 'idle' | 'loading' | 'ready' | 'error';
15
+
16
+ export interface SpanDetailView {
17
+ status: SpanDetailStatus;
18
+ displayData: Record<string, unknown>;
19
+ detail: unknown;
20
+ error: Error | undefined;
21
+ }
22
+
23
+ export function deriveSpanDetailView(args: {
24
+ resource: string | undefined;
25
+ resourceId: string | undefined;
26
+ inlineData: unknown;
27
+ fetchedDetail: unknown;
28
+ fetchedError: Error | null;
29
+ }): SpanDetailView {
30
+ const { resource, resourceId, inlineData, fetchedDetail, fetchedError } =
31
+ args;
32
+
33
+ const matchedDetail = spanDetailMatchesSelection(
34
+ fetchedDetail,
35
+ resource,
36
+ resourceId
37
+ )
38
+ ? fetchedDetail
39
+ : null;
40
+ const displayData = mergeSpanDetail(inlineData, matchedDetail) as Record<
41
+ string,
42
+ unknown
43
+ >;
44
+
45
+ if (!resource || !resourceId) {
46
+ return { status: 'idle', displayData, detail: null, error: undefined };
47
+ }
48
+ if (fetchedError) {
49
+ return {
50
+ status: 'error',
51
+ displayData,
52
+ detail: matchedDetail,
53
+ error: fetchedError,
54
+ };
55
+ }
56
+ if (!resourceNeedsFetchedDetail(resource)) {
57
+ return {
58
+ status: 'ready',
59
+ displayData,
60
+ detail: matchedDetail,
61
+ error: undefined,
62
+ };
63
+ }
64
+ if (matchedDetail !== null) {
65
+ return {
66
+ status: 'ready',
67
+ displayData,
68
+ detail: matchedDetail,
69
+ error: undefined,
70
+ };
71
+ }
72
+ return { status: 'loading', displayData, detail: null, error: undefined };
73
+ }
74
+
75
+ /**
76
+ * Returns true when the fetched `detail` belongs to the current selection.
77
+ * The fetch lags selection, so it can briefly hold a previously selected span
78
+ * (even a different resource type); reject it before merging or its fields
79
+ * union into the wrong panel. Steps/hooks/waits carry their parent `runId`, so
80
+ * a `run` selection excludes objects identifiable as a child resource.
81
+ */
82
+ export function spanDetailMatchesSelection(
83
+ detail: unknown,
84
+ resource: string | undefined,
85
+ resourceId: string | undefined
86
+ ): boolean {
87
+ if (!detail || typeof detail !== 'object' || !resource || !resourceId) {
88
+ return false;
89
+ }
90
+ switch (resource) {
91
+ case 'step':
92
+ return hasField(detail, 'stepId') && detail.stepId === resourceId;
93
+ case 'hook':
94
+ return hasField(detail, 'hookId') && detail.hookId === resourceId;
95
+ case 'sleep':
96
+ return hasField(detail, 'waitId') && detail.waitId === resourceId;
97
+ case 'run':
98
+ return (
99
+ hasField(detail, 'runId') &&
100
+ !('stepId' in detail) &&
101
+ !('hookId' in detail) &&
102
+ !('waitId' in detail) &&
103
+ detail.runId === resourceId
104
+ );
105
+ default:
106
+ return false;
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Merges fetched `detail` over the span's own data. The detail supplies the
112
+ * heavy fields the trace strips (input/output/error/metadata, sleep resumeAt);
113
+ * the span's identity, status, and event-derived timestamps stay authoritative
114
+ * so they don't flicker to the backend row's millisecond-different values.
115
+ */
116
+ export function mergeSpanDetail(spanData: unknown, detail: unknown): unknown {
117
+ if (!detail || typeof detail !== 'object') {
118
+ return spanData;
119
+ }
120
+ if (!spanData || typeof spanData !== 'object') {
121
+ return detail;
122
+ }
123
+ // Skip `undefined` span fields so they don't clobber a value the detail
124
+ // legitimately provides (e.g. a step's optional startedAt).
125
+ const merged: Record<string, unknown> = { ...detail };
126
+ for (const [key, value] of Object.entries(
127
+ spanData as Record<string, unknown>
128
+ )) {
129
+ if (value !== undefined) {
130
+ merged[key] = value;
131
+ }
132
+ }
133
+ return merged;
134
+ }
@@ -0,0 +1,146 @@
1
+ 'use client';
2
+
3
+ import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
4
+ import { useEffect, useMemo, useRef, useState } from 'react';
5
+ import type {
6
+ SelectedSpanInfo,
7
+ SpanSelectionInfo,
8
+ } from './entity-detail-panel';
9
+ import {
10
+ deriveSpanDetailView,
11
+ resourceNeedsFetchedDetail,
12
+ type SpanDetailStatus,
13
+ } from './span-detail-merge';
14
+
15
+ export type DetailResource = WorkflowRun | Step | Hook | Event;
16
+
17
+ export type FetchSpanDetail = (
18
+ selection: SpanSelectionInfo
19
+ ) => Promise<DetailResource>;
20
+
21
+ function deriveSpanSelection(
22
+ selectedSpan: SelectedSpanInfo | null
23
+ ): SpanSelectionInfo | null {
24
+ if (!selectedSpan) return null;
25
+ const { resource, data } = selectedSpan;
26
+
27
+ if (
28
+ resource === 'step' &&
29
+ data &&
30
+ typeof data === 'object' &&
31
+ 'stepId' in data
32
+ ) {
33
+ const step = data as Step;
34
+ return { resource: 'step', resourceId: step.stepId, runId: step.runId };
35
+ }
36
+ if (
37
+ resource === 'run' &&
38
+ data &&
39
+ typeof data === 'object' &&
40
+ 'runId' in data
41
+ ) {
42
+ return { resource: 'run', resourceId: (data as WorkflowRun).runId };
43
+ }
44
+ if (
45
+ resource === 'hook' &&
46
+ data &&
47
+ typeof data === 'object' &&
48
+ 'hookId' in data
49
+ ) {
50
+ return { resource: 'hook', resourceId: (data as Hook).hookId };
51
+ }
52
+ if (resource === 'sleep') {
53
+ if (!selectedSpan.spanId) return null;
54
+ const waitData = data as { runId?: string } | undefined;
55
+ return {
56
+ resource: 'sleep',
57
+ resourceId: selectedSpan.spanId,
58
+ runId: waitData?.runId,
59
+ };
60
+ }
61
+ return null;
62
+ }
63
+
64
+ export interface SelectedSpanDetailResult {
65
+ status: SpanDetailStatus;
66
+ resource: SpanSelectionInfo['resource'] | undefined;
67
+ resourceId: string | undefined;
68
+ runId: string | undefined;
69
+ displayData: Record<string, unknown>;
70
+ detail: DetailResource | null;
71
+ error: Error | undefined;
72
+ }
73
+
74
+ export function useSelectedSpanDetail(
75
+ selectedSpan: SelectedSpanInfo | null,
76
+ fetchSpanDetail: FetchSpanDetail
77
+ ): SelectedSpanDetailResult {
78
+ const selection = useMemo(
79
+ () => deriveSpanSelection(selectedSpan),
80
+ [selectedSpan]
81
+ );
82
+ const resource = selection?.resource;
83
+ const resourceId = selection?.resourceId;
84
+ const runId = selection?.runId;
85
+ const selectionKey =
86
+ resource && resourceId ? `${resource}:${resourceId}` : null;
87
+ const needsFetch = resourceNeedsFetchedDetail(resource);
88
+
89
+ const [fetched, setFetched] = useState<{
90
+ detail: DetailResource | null;
91
+ error: Error | null;
92
+ errorKey: string | null;
93
+ }>({ detail: null, error: null, errorKey: null });
94
+
95
+ const tokenRef = useRef(0);
96
+ const selectionRef = useRef(selection);
97
+ selectionRef.current = selection;
98
+
99
+ useEffect(() => {
100
+ if (!selectionKey || !needsFetch) {
101
+ return;
102
+ }
103
+ const activeSelection = selectionRef.current;
104
+ if (!activeSelection) {
105
+ return;
106
+ }
107
+ const token = ++tokenRef.current;
108
+ fetchSpanDetail(activeSelection)
109
+ .then((detail) => {
110
+ if (tokenRef.current !== token) return;
111
+ setFetched({ detail, error: null, errorKey: null });
112
+ })
113
+ .catch((err: unknown) => {
114
+ if (tokenRef.current !== token) return;
115
+ setFetched({
116
+ detail: null,
117
+ error: err instanceof Error ? err : new Error(String(err)),
118
+ errorKey: selectionKey,
119
+ });
120
+ });
121
+ }, [selectionKey, runId, needsFetch, fetchSpanDetail]);
122
+
123
+ const scopedError = fetched.errorKey === selectionKey ? fetched.error : null;
124
+
125
+ const view = useMemo(
126
+ () =>
127
+ deriveSpanDetailView({
128
+ resource,
129
+ resourceId,
130
+ inlineData: selectedSpan?.data,
131
+ fetchedDetail: fetched.detail,
132
+ fetchedError: scopedError,
133
+ }),
134
+ [resource, resourceId, selectedSpan?.data, fetched.detail, scopedError]
135
+ );
136
+
137
+ return {
138
+ status: view.status,
139
+ resource,
140
+ resourceId,
141
+ runId,
142
+ displayData: view.displayData,
143
+ detail: view.detail as DetailResource | null,
144
+ error: view.error,
145
+ };
146
+ }
@@ -18,10 +18,10 @@ import { formatDuration, getHighResInMs } from '../util/timing';
18
18
  import { SpanContent } from './span-content';
19
19
  import { computeSegments } from './span-segments';
20
20
  import {
21
- type ResourceType,
22
- type SpanLayout,
23
21
  getResourceType,
24
22
  getSpanLayout,
23
+ type ResourceType,
24
+ type SpanLayout,
25
25
  } from './span-strategies';
26
26
 
27
27
  export const getSpanColorClassName = (node: SpanNode): string => {
@@ -362,6 +362,7 @@ const BOUNDARY_LABELS: Record<string, string> = {
362
362
  run_completed: 'Completed',
363
363
  run_failed: 'Run failed',
364
364
  step_completed: 'Completed',
365
+ attr_set: 'Attributes set',
365
366
  };
366
367
 
367
368
  export const SpanEventComponent = memo(function SpanEventComponent({
@@ -1314,10 +1314,10 @@
1314
1314
  .segQueued {
1315
1315
  background: repeating-linear-gradient(
1316
1316
  45deg,
1317
- var(--ds-gray-alpha-200),
1318
- var(--ds-gray-alpha-200) 6px,
1319
- var(--ds-gray-alpha-100) 6px,
1320
- var(--ds-gray-alpha-100) 12px
1317
+ var(--ds-gray-200),
1318
+ var(--ds-gray-200) 6px,
1319
+ var(--ds-gray-100) 6px,
1320
+ var(--ds-gray-100) 12px
1321
1321
  );
1322
1322
  }
1323
1323
 
@@ -1,6 +1,6 @@
1
- import { formatDuration } from '../../../lib/utils';
1
+ import { formatDuration, formatDurationPrecise } from '../../../lib/utils';
2
2
 
3
- export { formatDuration };
3
+ export { formatDuration, formatDurationPrecise };
4
4
 
5
5
  export function getHighResInMs([seconds, nanoseconds]: [
6
6
  number,
@@ -14,22 +14,18 @@ export function getMsInHighRes(ms: number): [number, number] {
14
14
  }
15
15
 
16
16
  /**
17
- * Formats a duration for timeline display (compact single-unit format).
17
+ * Formats a duration for timeline display (compact format).
18
18
  * @deprecated Use formatDuration(ms, true) instead.
19
19
  */
20
20
  export const formatDurationForTimeline = (ms: number): string =>
21
21
  formatDuration(ms, true);
22
22
 
23
- const timeSelectionFormatter = new Intl.NumberFormat(undefined, {
24
- minimumFractionDigits: 2,
25
- maximumFractionDigits: 2,
26
- });
27
-
28
23
  export function formatTimeSelection(ms: number): string {
29
- if (ms >= 1000) {
30
- return `${timeSelectionFormatter.format(ms / 1000)}s`;
24
+ const roundedMs = Math.round(ms);
25
+ if (roundedMs < 1000) {
26
+ return `${roundedMs}ms`;
31
27
  }
32
- return `${timeSelectionFormatter.format(ms)}ms`;
28
+ return `${Math.round(ms / 1000)}s`;
33
29
  }
34
30
 
35
31
  /**
@@ -1,46 +1,52 @@
1
- import { useMemo } from 'react';
2
1
  import type { WorkflowRun } from '@workflow/core/runtime';
3
2
  import type { Event } from '@workflow/world';
3
+ import { useMemo } from 'react';
4
4
  import { buildTrace, type TraceWithMeta } from '../lib/trace-builder';
5
+ import { TraceViewerSkeleton } from './new-trace-viewer/components/trace-viewer-skeleton';
5
6
  import { NewTraceViewer as NewTraceViewerComponent } from './new-trace-viewer/trace-viewer';
6
7
  import {
7
- SidebarDataProvider,
8
8
  type SidebarDataContextValue,
9
+ SidebarDataProvider,
9
10
  } from './sidebar/sidebar-data-context';
10
- import type { Trace } from './trace-viewer/types';
11
11
 
12
12
  const NewTraceViewer = ({
13
13
  run,
14
14
  events,
15
15
  sidebarData,
16
+ onLoadMore,
17
+ hasMore,
18
+ isLoadingMore,
19
+ loading = false,
16
20
  }: {
17
21
  run: WorkflowRun;
18
22
  events: Event[];
19
23
  sidebarData: SidebarDataContextValue;
24
+ onLoadMore?: () => void | Promise<void>;
25
+ hasMore?: boolean;
26
+ isLoadingMore?: boolean;
27
+ loading?: boolean;
20
28
  }) => {
21
- // Build trace only when actual data changes no timer-driven rebuilds.
22
- // Active span widths are animated imperatively by useLiveTick at 60fps.
23
- const traceWithMeta: TraceWithMeta | undefined = useMemo(() => {
29
+ const trace: TraceWithMeta | undefined = useMemo(() => {
24
30
  if (!run?.runId) {
25
31
  return undefined;
26
32
  }
27
33
  return buildTrace(run, events, new Date());
28
- // eslint-disable-next-line react-hooks/exhaustive-deps -- `new Date()` is intentionally not a dep; useLiveTick handles live growth
34
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- `new Date()` is intentionally not a dep
29
35
  }, [run, events]);
30
- const trace = traceWithMeta;
31
36
 
32
- if (!trace) {
33
- return (
34
- <div className="relative w-full h-full flex items-center justify-center">
35
- <div className="text-gray-500 text-sm">Loading trace…</div>
36
- </div>
37
- );
37
+ if (!trace || (loading && events.length === 0)) {
38
+ return <TraceViewerSkeleton />;
38
39
  }
39
40
 
40
41
  return (
41
42
  <SidebarDataProvider value={sidebarData}>
42
43
  <div className="relative w-full h-full flex">
43
- <NewTraceViewerComponent trace={trace as Trace} />
44
+ <NewTraceViewerComponent
45
+ trace={trace}
46
+ onLoadMore={onLoadMore}
47
+ hasMore={hasMore}
48
+ isLoadingMore={isLoadingMore}
49
+ />
44
50
  </div>
45
51
  </SidebarDataProvider>
46
52
  );
@@ -1,7 +1,7 @@
1
1
  import { cva, type VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
 
4
- import { cn } from '../../lib/utils';
4
+ import { cn } from '../../lib/cn';
5
5
 
6
6
  const alertVariants = cva(
7
7
  'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4',
@@ -0,0 +1,68 @@
1
+ import * as React from 'react';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+ import { cn } from '../../lib/cn';
4
+
5
+ const buttonVariants = cva(
6
+ [
7
+ 'outline-none m-0 border-0 align-baseline no-underline group/trigger',
8
+ 'relative cursor-pointer select-none transform translate-z-0',
9
+ 'inline-flex max-w-full items-center justify-center gap-x-1 whitespace-nowrap rounded-md font-medium',
10
+ '!text-gray-100',
11
+ 'bg-gray-1000',
12
+ 'transition-[border-color,background,color,transform,box-shadow] duration-150 ease-in-out',
13
+ // Geist invert hover: literal fallbacks (no token dep, so it resolves in any
14
+ // consuming app), darkened via ancestor theme class without a registered variant.
15
+ 'hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))]',
16
+ '[.dark-theme_&]:hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))]',
17
+ '[[data-theme=dark]_&]:hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))]',
18
+ // Geist focus ring as arbitrary properties (no bare `outline`/ambiguous
19
+ // arbitrary-color utilities, which differ between Tailwind v3 and v4).
20
+ 'focus-visible:[outline:2px_solid_var(--ds-focus-color)] focus-visible:[outline-offset:2px]',
21
+ // disabled styles
22
+ 'disabled:cursor-not-allowed aria-disabled:cursor-not-allowed',
23
+ 'disabled:bg-gray-100 disabled:!text-gray-700 disabled:hover:bg-gray-100',
24
+ 'aria-disabled:bg-gray-100 aria-disabled:text-gray-700 aria-disabled:hover:bg-gray-100',
25
+ ],
26
+ {
27
+ variants: {
28
+ variant: {
29
+ default: '',
30
+ secondary:
31
+ 'border border-gray-alpha-400 [--themed-bg:_var(--ds-background-100)] [--themed-fg:_var(--ds-gray-1000)] [--themed-hover-bg:_var(--ds-gray-alpha-200)]',
32
+ ghost:
33
+ '[--themed-bg:_transparent] [--themed-fg:_var(--ds-gray-1000)] [--themed-hover-bg:_var(--ds-gray-alpha-100)]',
34
+ },
35
+ size: {
36
+ default: 'h-10 px-4 text-[14px]',
37
+ sm: 'h-8 px-3 text-[14px]',
38
+ xs: 'h-6 px-1.5 py-0.5 text-button-12 rounded-[4px]',
39
+ icon: 'h-8 w-8',
40
+ },
41
+ },
42
+ defaultVariants: {
43
+ variant: 'default',
44
+ size: 'default',
45
+ },
46
+ }
47
+ );
48
+
49
+ export type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
50
+ VariantProps<typeof buttonVariants>;
51
+
52
+ export function Button({
53
+ className,
54
+ variant,
55
+ size,
56
+ type = 'button',
57
+ ...props
58
+ }: ButtonProps) {
59
+ return (
60
+ <button
61
+ type={type}
62
+ className={cn(buttonVariants({ variant, size, className }))}
63
+ {...props}
64
+ />
65
+ );
66
+ }
67
+
68
+ export { buttonVariants };
@@ -2,7 +2,7 @@
2
2
 
3
3
  import * as React from 'react';
4
4
 
5
- import { cn } from '../../lib/utils';
5
+ import { cn } from '../../lib/cn';
6
6
 
7
7
  const Card = React.forwardRef<
8
8
  HTMLDivElement,