@workflow/web-shared 5.0.0-beta.6 → 5.0.0-beta.8

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 (200) hide show
  1. package/dist/components/error-boundary.js +1 -1
  2. package/dist/components/event-list-view.d.ts +12 -0
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +26 -13
  5. package/dist/components/hook-actions.js +1 -1
  6. package/dist/components/index.js +1 -1
  7. package/dist/components/new-trace-viewer/components/copy-button.js +2 -2
  8. package/dist/components/new-trace-viewer/components/event-list.js +3 -3
  9. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +1 -1
  10. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +1 -1
  11. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +1 -1
  12. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +1 -1
  13. package/dist/components/new-trace-viewer/components/split-pane.js +1 -1
  14. package/dist/components/new-trace-viewer/components/timeline.d.ts +1 -1
  15. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  16. package/dist/components/new-trace-viewer/components/timeline.js +187 -103
  17. package/dist/components/new-trace-viewer/context.js +1 -1
  18. package/dist/components/new-trace-viewer/detail-panel.js +2 -2
  19. package/dist/components/new-trace-viewer/icons.js +1 -1
  20. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  21. package/dist/components/new-trace-viewer/trace-viewer.js +53 -26
  22. package/dist/components/new-trace-viewer/types.js +1 -1
  23. package/dist/components/new-trace-viewer/util/constants.js +1 -1
  24. package/dist/components/new-trace-viewer/utils.d.ts +8 -4
  25. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
  26. package/dist/components/new-trace-viewer/utils.js +31 -6
  27. package/dist/components/run-trace-view.js +1 -1
  28. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  29. package/dist/components/sidebar/attribute-panel.js +99 -73
  30. package/dist/components/sidebar/conversation-view.js +1 -1
  31. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  32. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  33. package/dist/components/sidebar/copyable-data-block.js +16 -15
  34. package/dist/components/sidebar/detail-card.d.ts +5 -6
  35. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  36. package/dist/components/sidebar/detail-card.js +32 -16
  37. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  38. package/dist/components/sidebar/entity-detail-panel.js +6 -3
  39. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  40. package/dist/components/sidebar/events-list.js +21 -15
  41. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  42. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  43. package/dist/components/stream-viewer.js +1 -1
  44. package/dist/components/trace-viewer/components/map.js +1 -1
  45. package/dist/components/trace-viewer/components/markers.js +1 -1
  46. package/dist/components/trace-viewer/components/node.js +1 -1
  47. package/dist/components/trace-viewer/components/search-input.js +1 -1
  48. package/dist/components/trace-viewer/components/search.js +1 -1
  49. package/dist/components/trace-viewer/components/span-content.js +1 -1
  50. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  51. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  52. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  53. package/dist/components/trace-viewer/components/ui.js +1 -1
  54. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  55. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  56. package/dist/components/trace-viewer/context.js +1 -1
  57. package/dist/components/trace-viewer/index.js +1 -1
  58. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  59. package/dist/components/trace-viewer/types.js +1 -1
  60. package/dist/components/trace-viewer/util/constants.js +1 -1
  61. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  62. package/dist/components/trace-viewer/util/timing.js +1 -1
  63. package/dist/components/trace-viewer/util/tree.js +1 -1
  64. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  65. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  66. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  67. package/dist/components/trace-viewer/worker.js +1 -1
  68. package/dist/components/trace-viewer-new.js +1 -1
  69. package/dist/components/ui/alert.js +1 -1
  70. package/dist/components/ui/button.d.ts +10 -0
  71. package/dist/components/ui/button.d.ts.map +1 -0
  72. package/dist/components/ui/button.js +39 -0
  73. package/dist/components/ui/card.js +1 -1
  74. package/dist/components/ui/data-inspector.d.ts +1 -0
  75. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  76. package/dist/components/ui/data-inspector.js +4 -9
  77. package/dist/components/ui/decrypt-button.js +1 -1
  78. package/dist/components/ui/error-card.js +1 -1
  79. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  80. package/dist/components/ui/error-stack-block.js +4 -18
  81. package/dist/components/ui/inspector-theme.js +1 -1
  82. package/dist/components/ui/load-more-button.js +1 -1
  83. package/dist/components/ui/menu-dropdown.js +1 -1
  84. package/dist/components/ui/skeleton.js +1 -1
  85. package/dist/components/ui/spinner.js +1 -1
  86. package/dist/components/ui/timestamp-tooltip.js +1 -1
  87. package/dist/components/workflow-trace-view.js +1 -1
  88. package/dist/components/workflow-traces/event-colors.js +1 -1
  89. package/dist/components/workflow-traces/trace-colors.js +1 -1
  90. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  91. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  92. package/dist/hooks/use-dark-mode.js +1 -1
  93. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  94. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  95. package/dist/hooks/use-reduced-motion.js +29 -0
  96. package/dist/index.js +1 -1
  97. package/dist/lib/event-analysis.js +1 -1
  98. package/dist/lib/event-materialization.js +1 -1
  99. package/dist/lib/hydration.js +1 -1
  100. package/dist/lib/stream-display.js +1 -1
  101. package/dist/lib/toast.js +1 -1
  102. package/dist/lib/trace-builder.js +1 -1
  103. package/dist/lib/utils.js +1 -1
  104. package/package.json +5 -5
  105. package/src/components/event-list-view.tsx +29 -13
  106. package/src/components/new-trace-viewer/components/copy-button.tsx +1 -1
  107. package/src/components/new-trace-viewer/components/event-list.tsx +2 -2
  108. package/src/components/new-trace-viewer/components/timeline.tsx +353 -192
  109. package/src/components/new-trace-viewer/detail-panel.tsx +1 -1
  110. package/src/components/new-trace-viewer/trace-viewer.tsx +93 -59
  111. package/src/components/new-trace-viewer/utils.ts +40 -8
  112. package/src/components/sidebar/attribute-panel.tsx +212 -235
  113. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  114. package/src/components/sidebar/detail-card.tsx +119 -41
  115. package/src/components/sidebar/entity-detail-panel.tsx +28 -28
  116. package/src/components/sidebar/events-list.tsx +51 -79
  117. package/src/components/ui/button.tsx +61 -0
  118. package/src/components/ui/data-inspector.tsx +9 -18
  119. package/src/components/ui/error-stack-block.tsx +7 -26
  120. package/src/hooks/use-reduced-motion.ts +34 -0
  121. package/dist/components/error-boundary.js.map +0 -1
  122. package/dist/components/event-list-view.js.map +0 -1
  123. package/dist/components/hook-actions.js.map +0 -1
  124. package/dist/components/index.js.map +0 -1
  125. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  126. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  127. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
  128. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
  129. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
  130. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
  131. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  132. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  133. package/dist/components/new-trace-viewer/context.js.map +0 -1
  134. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  135. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  136. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  137. package/dist/components/new-trace-viewer/types.js.map +0 -1
  138. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  139. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  140. package/dist/components/run-trace-view.js.map +0 -1
  141. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  142. package/dist/components/sidebar/conversation-view.js.map +0 -1
  143. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  144. package/dist/components/sidebar/detail-card.js.map +0 -1
  145. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  146. package/dist/components/sidebar/events-list.js.map +0 -1
  147. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  148. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  149. package/dist/components/stream-viewer.js.map +0 -1
  150. package/dist/components/trace-viewer/components/map.js.map +0 -1
  151. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  152. package/dist/components/trace-viewer/components/node.js.map +0 -1
  153. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  154. package/dist/components/trace-viewer/components/search.js.map +0 -1
  155. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  156. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  157. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  158. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  159. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  160. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  161. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  162. package/dist/components/trace-viewer/context.js.map +0 -1
  163. package/dist/components/trace-viewer/index.js.map +0 -1
  164. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  165. package/dist/components/trace-viewer/types.js.map +0 -1
  166. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  167. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  168. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  169. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  170. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  171. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  172. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  173. package/dist/components/trace-viewer/worker.js.map +0 -1
  174. package/dist/components/trace-viewer-new.js.map +0 -1
  175. package/dist/components/ui/alert.js.map +0 -1
  176. package/dist/components/ui/card.js.map +0 -1
  177. package/dist/components/ui/data-inspector.js.map +0 -1
  178. package/dist/components/ui/decrypt-button.js.map +0 -1
  179. package/dist/components/ui/error-card.js.map +0 -1
  180. package/dist/components/ui/error-stack-block.js.map +0 -1
  181. package/dist/components/ui/inspector-theme.js.map +0 -1
  182. package/dist/components/ui/load-more-button.js.map +0 -1
  183. package/dist/components/ui/menu-dropdown.js.map +0 -1
  184. package/dist/components/ui/skeleton.js.map +0 -1
  185. package/dist/components/ui/spinner.js.map +0 -1
  186. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  187. package/dist/components/workflow-trace-view.js.map +0 -1
  188. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  189. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  190. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  191. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  192. package/dist/hooks/use-dark-mode.js.map +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/lib/event-analysis.js.map +0 -1
  195. package/dist/lib/event-materialization.js.map +0 -1
  196. package/dist/lib/hydration.js.map +0 -1
  197. package/dist/lib/stream-display.js.map +0 -1
  198. package/dist/lib/toast.js.map +0 -1
  199. package/dist/lib/trace-builder.js.map +0 -1
  200. package/dist/lib/utils.js.map +0 -1
@@ -1,7 +1,15 @@
1
1
  'use client';
2
2
 
3
3
  import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
4
- import { RotateCcw, Search, X, ZoomIn, ZoomOut } from 'lucide-react';
4
+ import {
5
+ ChevronDown,
6
+ ChevronUp,
7
+ RotateCcw,
8
+ Search,
9
+ X,
10
+ ZoomIn,
11
+ ZoomOut,
12
+ } from 'lucide-react';
5
13
  import {
6
14
  type ReactNode,
7
15
  useCallback,
@@ -10,6 +18,7 @@ import {
10
18
  useRef,
11
19
  useState,
12
20
  } from 'react';
21
+ import { useReducedMotion } from '../../hooks/use-reduced-motion';
13
22
  import { ErrorBoundary } from '../error-boundary';
14
23
  import {
15
24
  EntityDetailPanel,
@@ -18,7 +27,6 @@ import {
18
27
  import { useSidebarDataOptional } from '../sidebar/sidebar-data-context';
19
28
  import type { Trace } from '../trace-viewer/types';
20
29
  import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
21
- import { CopyButton } from './components/copy-button';
22
30
  import EventList from './components/event-list';
23
31
  import { SplitPane } from './components/split-pane';
24
32
  import {
@@ -51,6 +59,7 @@ function useAnimatedViewport(initial: Viewport) {
51
59
  } | null>(null);
52
60
  const currentRef = useRef(initial);
53
61
  currentRef.current = viewport;
62
+ const reducedMotion = useReducedMotion();
54
63
 
55
64
  const cancel = useCallback(() => {
56
65
  if (animRef.current) {
@@ -62,6 +71,13 @@ function useAnimatedViewport(initial: Viewport) {
62
71
  const animateTo = useCallback(
63
72
  (target: Viewport) => {
64
73
  cancel();
74
+
75
+ if (reducedMotion) {
76
+ currentRef.current = target;
77
+ setViewportState(target);
78
+ return;
79
+ }
80
+
65
81
  const from = currentRef.current;
66
82
  const anim = { raf: 0, from, to: target, start: performance.now() };
67
83
 
@@ -79,7 +95,7 @@ function useAnimatedViewport(initial: Viewport) {
79
95
  animRef.current = anim;
80
96
  anim.raf = requestAnimationFrame(tick);
81
97
  },
82
- [cancel]
98
+ [cancel, reducedMotion]
83
99
  );
84
100
 
85
101
  const setViewport = useCallback(
@@ -298,13 +314,31 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
298
314
  const [altHeld, setAltHeld] = useState(false);
299
315
 
300
316
  useEffect(() => {
317
+ const handleSidebarNavKey = (e: KeyboardEvent): void => {
318
+ const target = e.target as HTMLElement | null;
319
+ if (
320
+ target instanceof HTMLInputElement ||
321
+ target instanceof HTMLTextAreaElement ||
322
+ target?.isContentEditable
323
+ ) {
324
+ return;
325
+ }
326
+ const targetId =
327
+ e.key === 'k' ? prevSpanIdRef.current : nextSpanIdRef.current;
328
+ if (targetId) {
329
+ e.preventDefault();
330
+ handleSelectSpanRef.current(targetId);
331
+ }
332
+ };
333
+
301
334
  const onKeyDown = (e: KeyboardEvent): void => {
302
335
  if (e.key === 'Escape') {
303
336
  clearActiveSpan();
304
- }
305
- if (e.key === 'Alt') {
337
+ } else if (e.key === 'Alt') {
306
338
  e.preventDefault();
307
339
  setAltHeld(true);
340
+ } else if (e.key === 'j' || e.key === 'k') {
341
+ handleSidebarNavKey(e);
308
342
  }
309
343
  };
310
344
  const onKeyUp = (e: KeyboardEvent): void => {
@@ -459,21 +493,30 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
459
493
  );
460
494
  }, [selectedSpan?.data, selectedSpan?.resource]);
461
495
 
462
- const selectedResource = selectedSpan?.resource as string | undefined;
463
- const selectedResourceId = useMemo(() => {
464
- if (!selectedSpan?.data) return undefined;
465
- const data = selectedSpan.data as Record<string, unknown>;
466
- if (selectedSpan.resource === 'hook') {
467
- return (data.hookId as string | undefined) ?? selectedSpan.spanId;
468
- }
496
+ const { prevSpanId, nextSpanId } = useMemo(() => {
497
+ if (!activeSpanId) return { prevSpanId: null, nextSpanId: null };
498
+ const i = filteredSpans.findIndex((s) => s.spanId === activeSpanId);
499
+ if (i === -1) return { prevSpanId: null, nextSpanId: null };
500
+ return {
501
+ prevSpanId: filteredSpans[i - 1]?.spanId ?? null,
502
+ nextSpanId: filteredSpans[i + 1]?.spanId ?? null,
503
+ };
504
+ }, [activeSpanId, filteredSpans]);
469
505
 
470
- return (
471
- (data.stepId as string) ??
472
- (data.runId as string) ??
473
- (data.hookId as string) ??
474
- selectedSpan.spanId
475
- );
476
- }, [selectedSpan?.data, selectedSpan?.resource, selectedSpan?.spanId]);
506
+ const handleSelectPrevSpan = useCallback(() => {
507
+ if (prevSpanId) handleSelectSpan(prevSpanId);
508
+ }, [prevSpanId, handleSelectSpan]);
509
+
510
+ const handleSelectNextSpan = useCallback(() => {
511
+ if (nextSpanId) handleSelectSpan(nextSpanId);
512
+ }, [nextSpanId, handleSelectSpan]);
513
+
514
+ const prevSpanIdRef = useRef(prevSpanId);
515
+ const nextSpanIdRef = useRef(nextSpanId);
516
+ const handleSelectSpanRef = useRef(handleSelectSpan);
517
+ prevSpanIdRef.current = prevSpanId;
518
+ nextSpanIdRef.current = nextSpanId;
519
+ handleSelectSpanRef.current = handleSelectSpan;
477
520
 
478
521
  return (
479
522
  <div
@@ -487,7 +530,7 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
487
530
  >
488
531
  <SplitPane
489
532
  startHeader={
490
- <div className="bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center px-2 gap-1.5">
533
+ <div className="bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center pl-4 pr-2 gap-1.5">
491
534
  <Search className="w-3.5 h-3.5 shrink-0 text-gray-800" />
492
535
  <input
493
536
  id="trace-viewer-search"
@@ -502,6 +545,7 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
502
545
  {searchQuery && (
503
546
  <button
504
547
  type="button"
548
+ aria-label="Clear search"
505
549
  onClick={() => setSearchQuery('')}
506
550
  className="shrink-0 p-0.5 rounded-sm text-gray-800 hover:text-gray-1000 hover:bg-gray-200 transition-colors"
507
551
  >
@@ -572,47 +616,37 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
572
616
  {activeSpan && sidebar ? (
573
617
  <aside className="flex flex-col h-full max-h-full bg-background-100 border-l border-gray-alpha-400 overflow-auto">
574
618
  {/* Panel header */}
575
- <div className="flex-shrink-0 px-4 pt-4 pb-3">
576
- <div className="flex items-start justify-between gap-2">
577
- <div className="min-w-0 flex-1">
578
- <span className="text-[15px] font-semibold text-gray-1000 truncate block">
579
- {selectedSpanName}
580
- </span>
581
- {selectedResourceId && (
582
- <div className="mt-1 flex items-center gap-2">
583
- {selectedResource && (
584
- <span
585
- className={`inline-flex items-center rounded-md px-1.5 py-0.5 text-[11px] font-medium leading-none shrink-0 ${
586
- selectedResource === 'step'
587
- ? 'bg-green-200 text-green-900'
588
- : selectedResource === 'run'
589
- ? 'bg-blue-200 text-blue-900'
590
- : selectedResource === 'hook'
591
- ? 'bg-yellow-200 text-yellow-900'
592
- : 'bg-gray-200 text-gray-900'
593
- }`}
594
- >
595
- {selectedResource.charAt(0).toUpperCase() +
596
- selectedResource.slice(1)}
597
- </span>
598
- )}
599
- <div
600
- className="flex items-center gap-1 text-[13px] font-mono text-gray-700 min-w-0"
601
- title={selectedResourceId}
602
- >
603
- <span className="truncate">{selectedResourceId}</span>
604
- <CopyButton
605
- copyText={selectedResourceId}
606
- ariaLabel="Copy ID"
607
- className="shrink-0"
608
- />
609
- </div>
610
- </div>
611
- )}
612
- </div>
619
+ <div className="flex items-center justify-between gap-2 shrink-0 px-4 pt-3 pb-3">
620
+ <span className="text-label-14 font-medium text-gray-1000 truncate block">
621
+ {selectedSpanName}
622
+ </span>
623
+ <div className="flex items-center gap-0.5 shrink-0">
624
+ <button
625
+ type="button"
626
+ aria-label="Navigate to previous span"
627
+ aria-keyshortcuts="K"
628
+ onClick={handleSelectPrevSpan}
629
+ disabled={!prevSpanId}
630
+ className="p-1 rounded text-gray-1000 transition-colors enabled:hover:bg-gray-alpha-100 disabled:opacity-40 disabled:cursor-not-allowed"
631
+ >
632
+ <ChevronUp className="w-4 h-4" />
633
+ </button>
634
+ <button
635
+ type="button"
636
+ aria-label="Navigate to next span"
637
+ aria-keyshortcuts="J"
638
+ onClick={handleSelectNextSpan}
639
+ disabled={!nextSpanId}
640
+ className="p-1 rounded text-gray-1000 transition-colors enabled:hover:bg-gray-alpha-100 disabled:opacity-40 disabled:cursor-not-allowed"
641
+ >
642
+ <ChevronDown className="w-4 h-4" />
643
+ </button>
644
+ <div aria-hidden className="w-px h-4 bg-gray-alpha-400 mx-1" />
613
645
  <button
614
646
  type="button"
615
- className="p-1 rounded-md text-gray-900 hover:text-gray-1000 hover:bg-gray-alpha-200 transition-colors shrink-0"
647
+ aria-label="Close span details"
648
+ aria-keyshortcuts="Escape"
649
+ className="p-1 rounded text-gray-1000 hover:bg-gray-alpha-100 transition-colors"
616
650
  onClick={clearActiveSpan}
617
651
  >
618
652
  <X className="w-4 h-4" />
@@ -130,18 +130,50 @@ export function computeSpanGaps(
130
130
 
131
131
  export const RESOURCE_COLORS: Record<
132
132
  string,
133
- { bar: string; errorBar?: string }
133
+ {
134
+ bg: string;
135
+ border: string;
136
+ errorBg?: string;
137
+ errorBorder?: string;
138
+ }
134
139
  > = {
135
- run: { bar: 'var(--ds-blue-700)', errorBar: 'var(--ds-red-700)' },
136
- step: { bar: 'var(--ds-green-700)', errorBar: 'var(--ds-red-700)' },
137
- hook: { bar: 'var(--ds-amber-700)', errorBar: 'var(--ds-red-700)' },
138
- sleep: { bar: 'var(--ds-purple-700)', errorBar: 'var(--ds-red-700)' },
139
- default: { bar: 'var(--ds-gray-500)', errorBar: 'var(--ds-red-700)' },
140
+ run: {
141
+ bg: 'var(--ds-blue-200)',
142
+ border: 'var(--ds-blue-500)',
143
+ errorBg: 'var(--ds-red-200)',
144
+ errorBorder: 'var(--ds-red-500)',
145
+ },
146
+ step: {
147
+ bg: 'var(--ds-green-200)',
148
+ border: 'var(--ds-green-500)',
149
+ errorBg: 'var(--ds-red-200)',
150
+ errorBorder: 'var(--ds-red-500)',
151
+ },
152
+ hook: {
153
+ bg: 'var(--ds-amber-200)',
154
+ border: 'var(--ds-amber-500)',
155
+ errorBg: 'var(--ds-red-200)',
156
+ errorBorder: 'var(--ds-red-500)',
157
+ },
158
+ sleep: {
159
+ bg: 'var(--ds-purple-200)',
160
+ border: 'var(--ds-purple-500)',
161
+ errorBg: 'var(--ds-red-200)',
162
+ errorBorder: 'var(--ds-red-500)',
163
+ },
164
+ default: {
165
+ bg: 'var(--ds-gray-200)',
166
+ border: 'var(--ds-gray-500)',
167
+ errorBg: 'var(--ds-red-200)',
168
+ errorBorder: 'var(--ds-red-500)',
169
+ },
140
170
  };
141
171
 
142
172
  export function getResourceColor(resource: string): {
143
- bar: string;
144
- errorBar?: string;
173
+ bg: string;
174
+ border: string;
175
+ errorBg?: string;
176
+ errorBorder?: string;
145
177
  } {
146
178
  return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;
147
179
  }