@workflow/web-shared 5.0.0-beta.6 → 5.0.0-beta.7
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.
- package/dist/components/new-trace-viewer/components/event-list.js +1 -1
- package/dist/components/new-trace-viewer/components/event-list.js.map +1 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts +1 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/timeline.js +186 -102
- package/dist/components/new-trace-viewer/components/timeline.js.map +1 -1
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +9 -4
- package/dist/components/new-trace-viewer/trace-viewer.js.map +1 -1
- package/dist/components/new-trace-viewer/utils.d.ts +8 -4
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/utils.js +30 -5
- package/dist/components/new-trace-viewer/utils.js.map +1 -1
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/hooks/use-reduced-motion.js.map +1 -0
- package/package.json +4 -4
- package/src/components/new-trace-viewer/components/event-list.tsx +1 -1
- package/src/components/new-trace-viewer/components/timeline.tsx +353 -192
- package/src/components/new-trace-viewer/trace-viewer.tsx +11 -4
- package/src/components/new-trace-viewer/utils.ts +40 -8
- package/src/hooks/use-reduced-motion.ts +34 -0
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
useRef,
|
|
11
11
|
useState,
|
|
12
12
|
} from 'react';
|
|
13
|
+
import { useReducedMotion } from '../../hooks/use-reduced-motion';
|
|
13
14
|
import { ErrorBoundary } from '../error-boundary';
|
|
14
15
|
import {
|
|
15
16
|
EntityDetailPanel,
|
|
@@ -51,6 +52,7 @@ function useAnimatedViewport(initial: Viewport) {
|
|
|
51
52
|
} | null>(null);
|
|
52
53
|
const currentRef = useRef(initial);
|
|
53
54
|
currentRef.current = viewport;
|
|
55
|
+
const reducedMotion = useReducedMotion();
|
|
54
56
|
|
|
55
57
|
const cancel = useCallback(() => {
|
|
56
58
|
if (animRef.current) {
|
|
@@ -62,6 +64,13 @@ function useAnimatedViewport(initial: Viewport) {
|
|
|
62
64
|
const animateTo = useCallback(
|
|
63
65
|
(target: Viewport) => {
|
|
64
66
|
cancel();
|
|
67
|
+
|
|
68
|
+
if (reducedMotion) {
|
|
69
|
+
currentRef.current = target;
|
|
70
|
+
setViewportState(target);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
65
74
|
const from = currentRef.current;
|
|
66
75
|
const anim = { raf: 0, from, to: target, start: performance.now() };
|
|
67
76
|
|
|
@@ -79,7 +88,7 @@ function useAnimatedViewport(initial: Viewport) {
|
|
|
79
88
|
animRef.current = anim;
|
|
80
89
|
anim.raf = requestAnimationFrame(tick);
|
|
81
90
|
},
|
|
82
|
-
[cancel]
|
|
91
|
+
[cancel, reducedMotion]
|
|
83
92
|
);
|
|
84
93
|
|
|
85
94
|
const setViewport = useCallback(
|
|
@@ -587,9 +596,7 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
|
|
|
587
596
|
? 'bg-green-200 text-green-900'
|
|
588
597
|
: selectedResource === 'run'
|
|
589
598
|
? 'bg-blue-200 text-blue-900'
|
|
590
|
-
:
|
|
591
|
-
? 'bg-yellow-200 text-yellow-900'
|
|
592
|
-
: 'bg-gray-200 text-gray-900'
|
|
599
|
+
: 'bg-gray-200 text-gray-900'
|
|
593
600
|
}`}
|
|
594
601
|
>
|
|
595
602
|
{selectedResource.charAt(0).toUpperCase() +
|
|
@@ -130,18 +130,50 @@ export function computeSpanGaps(
|
|
|
130
130
|
|
|
131
131
|
export const RESOURCE_COLORS: Record<
|
|
132
132
|
string,
|
|
133
|
-
{
|
|
133
|
+
{
|
|
134
|
+
bg: string;
|
|
135
|
+
border: string;
|
|
136
|
+
errorBg?: string;
|
|
137
|
+
errorBorder?: string;
|
|
138
|
+
}
|
|
134
139
|
> = {
|
|
135
|
-
run: {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
144
|
-
|
|
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
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
const QUERY = '(prefers-reduced-motion: reduce)';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Hook that detects whether the user has requested reduced motion and reacts
|
|
9
|
+
* to changes. Mirrors the `prefers-reduced-motion: reduce` media query so
|
|
10
|
+
* components can skip or shorten animations for users with motion
|
|
11
|
+
* sensitivities (e.g. vestibular disorders).
|
|
12
|
+
*
|
|
13
|
+
* @returns `true` if the user prefers reduced motion, `false` otherwise
|
|
14
|
+
*/
|
|
15
|
+
export const useReducedMotion = (): boolean => {
|
|
16
|
+
const [reduced, setReduced] = useState(() => {
|
|
17
|
+
if (typeof window === 'undefined' || !window.matchMedia) return false;
|
|
18
|
+
return window.matchMedia(QUERY).matches;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (typeof window === 'undefined' || !window.matchMedia) return;
|
|
23
|
+
|
|
24
|
+
const media = window.matchMedia(QUERY);
|
|
25
|
+
const onChange = (): void => setReduced(media.matches);
|
|
26
|
+
|
|
27
|
+
media.addEventListener('change', onChange);
|
|
28
|
+
onChange();
|
|
29
|
+
|
|
30
|
+
return () => media.removeEventListener('change', onChange);
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
return reduced;
|
|
34
|
+
};
|