@workflow/web-shared 5.0.0-beta.34 → 5.0.0-beta.36

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 (26) hide show
  1. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
  2. package/dist/components/new-trace-viewer/components/event-list.js +10 -7
  3. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
  4. package/dist/components/new-trace-viewer/components/split-pane.js +5 -5
  5. package/dist/components/new-trace-viewer/components/timeline.d.ts +8 -2
  6. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  7. package/dist/components/new-trace-viewer/components/timeline.js +95 -26
  8. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +2 -2
  9. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  10. package/dist/components/new-trace-viewer/trace-viewer.js +14 -11
  11. package/dist/components/new-trace-viewer/utils.d.ts +29 -0
  12. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
  13. package/dist/components/new-trace-viewer/utils.js +49 -5
  14. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  15. package/dist/components/sidebar/attribute-panel.js +2 -1
  16. package/dist/components/sidebar/attributes-block.js +2 -2
  17. package/package.json +5 -5
  18. package/src/components/new-trace-viewer/components/event-list.tsx +21 -11
  19. package/src/components/new-trace-viewer/components/split-pane.tsx +14 -4
  20. package/src/components/new-trace-viewer/components/timeline.tsx +158 -47
  21. package/src/components/new-trace-viewer/components/trace-shortcut-helper.tsx +1 -1
  22. package/src/components/new-trace-viewer/trace-viewer.tsx +44 -38
  23. package/src/components/new-trace-viewer/utils.test.ts +211 -0
  24. package/src/components/new-trace-viewer/utils.ts +82 -4
  25. package/src/components/sidebar/attribute-panel.tsx +1 -0
  26. package/src/components/sidebar/attributes-block.tsx +1 -1
@@ -174,6 +174,11 @@ export interface SpanGap {
174
174
  rowIndex: number;
175
175
  }
176
176
 
177
+ /** Project an absolute time onto the viewport as a clamped [0, 1] fraction. */
178
+ function toViewportFrac(ms: number, viewStart: number, range: number): number {
179
+ return Math.min(Math.max((ms - viewStart) / range, 0), 1);
180
+ }
181
+
177
182
  export function computeSpanGaps(
178
183
  spans: Span[],
179
184
  viewStart: number,
@@ -189,8 +194,8 @@ export function computeSpanGaps(
189
194
  const gapMs = startTime - endTime;
190
195
  if (gapMs <= 0) continue;
191
196
 
192
- const leftFrac = Math.min(Math.max((endTime - viewStart) / range, 0), 1);
193
- const rightFrac = Math.min(Math.max((startTime - viewStart) / range, 0), 1);
197
+ const leftFrac = toViewportFrac(endTime, viewStart, range);
198
+ const rightFrac = toViewportFrac(startTime, viewStart, range);
194
199
  if (rightFrac - leftFrac < 0.001) continue;
195
200
 
196
201
  gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
@@ -198,6 +203,78 @@ export function computeSpanGaps(
198
203
  return gaps;
199
204
  }
200
205
 
206
+ export interface SpanDelta {
207
+ /** True measured time between the two spans, unaffected by clamping. */
208
+ deltaMs: number;
209
+ /** Viewport-clamped fraction of the anchor span's measured edge. */
210
+ anchorFrac: number;
211
+ /** Viewport-clamped fraction of the hovered span's measured edge. */
212
+ hoveredFrac: number;
213
+ /**
214
+ * Which edge of the anchor span the measurement runs from: its end when the
215
+ * spans are disjoint and the anchor comes first, otherwise its start.
216
+ */
217
+ anchorEdge: 'start' | 'end';
218
+ /**
219
+ * Set when the hovered span lies entirely outside the viewport on one side,
220
+ * i.e. its row renders an off-screen arrow the line should stop short of.
221
+ */
222
+ hoveredOffscreen: 'left' | 'right' | null;
223
+ }
224
+
225
+ /**
226
+ * Measure the temporal delta between an anchor (selected) span and a hovered
227
+ * span for the Alt+hover measurement overlay. Ordering the two spans by start
228
+ * time (E = earlier-starting, L = later-starting), the measurement runs to
229
+ * L's start from E's end when the spans are disjoint ("how long after E ended
230
+ * did L start"), or from E's start when they overlap ("how long after E
231
+ * started did L start"). Fractions are clamped to the viewport like
232
+ * `computeSpanGaps`; `deltaMs` is always the true duration. Returns null when
233
+ * the measurement lies entirely outside the viewport.
234
+ */
235
+ export function computeSpanDelta(
236
+ anchor: Span,
237
+ hovered: Span,
238
+ viewStart: number,
239
+ viewEnd: number
240
+ ): SpanDelta | null {
241
+ const range = viewEnd - viewStart;
242
+ if (range <= 0) return null;
243
+
244
+ const anchorStart = getHighResInMs(anchor.startTime);
245
+ const hoveredStart = getHighResInMs(hovered.startTime);
246
+ const anchorIsEarlier = anchorStart <= hoveredStart;
247
+ const earlierStart = anchorIsEarlier ? anchorStart : hoveredStart;
248
+ const earlierEnd = getHighResInMs(
249
+ anchorIsEarlier ? anchor.endTime : hovered.endTime
250
+ );
251
+ const laterStart = anchorIsEarlier ? hoveredStart : anchorStart;
252
+
253
+ const originMs = earlierEnd <= laterStart ? earlierEnd : earlierStart;
254
+ const deltaMs = laterStart - originMs;
255
+
256
+ // Entirely outside the viewport. Compared in time-space (not clamped
257
+ // fractions) so a zero-delta point sitting exactly on a viewport edge —
258
+ // e.g. the root span selected at default zoom — still renders.
259
+ if (laterStart < viewStart || originMs > viewEnd) {
260
+ return null;
261
+ }
262
+
263
+ const originFrac = toViewportFrac(originMs, viewStart, range);
264
+ const laterFrac = toViewportFrac(laterStart, viewStart, range);
265
+
266
+ const hoveredEnd = getHighResInMs(hovered.endTime);
267
+
268
+ return {
269
+ deltaMs,
270
+ anchorFrac: anchorIsEarlier ? originFrac : laterFrac,
271
+ hoveredFrac: anchorIsEarlier ? laterFrac : originFrac,
272
+ anchorEdge: anchorIsEarlier && earlierEnd <= laterStart ? 'end' : 'start',
273
+ hoveredOffscreen:
274
+ hoveredStart > viewEnd ? 'right' : hoveredEnd < viewStart ? 'left' : null,
275
+ };
276
+ }
277
+
201
278
  // ---------------------------------------------------------------------------
202
279
  // Resource colors
203
280
  // ---------------------------------------------------------------------------
@@ -223,9 +300,10 @@ export const RESOURCE_COLORS: Record<
223
300
  errorBg: 'var(--ds-red-200)',
224
301
  errorBorder: 'var(--ds-red-500)',
225
302
  },
303
+ // Passive spans (hooks) stay gray — matches event-list icons and the minimap.
226
304
  hook: {
227
- bg: 'var(--ds-amber-200)',
228
- border: 'var(--ds-amber-500)',
305
+ bg: 'var(--ds-gray-200)',
306
+ border: 'var(--ds-gray-500)',
229
307
  errorBg: 'var(--ds-red-200)',
230
308
  errorBorder: 'var(--ds-red-500)',
231
309
  },
@@ -679,6 +679,7 @@ const copyableBasicAttributes = new Set<AttributeKey>([
679
679
  'eventId',
680
680
  'deploymentId',
681
681
  'moduleSpecifier',
682
+ 'token',
682
683
  ]);
683
684
 
684
685
  const loadingSectionLabels: Partial<Record<AttributeKey, string>> = {
@@ -37,7 +37,7 @@ const rowValueVariants = cva(
37
37
  );
38
38
 
39
39
  const rowCopyValueVariants = cva(
40
- 'flex min-w-0 items-center justify-end gap-1 text-copy-13 text-gray-1000',
40
+ 'flex min-w-0 flex-1 items-center justify-end gap-1 overflow-hidden text-copy-13 text-gray-1000',
41
41
  {
42
42
  variants: {
43
43
  variant: {