* fix(web-shared): use UTC tooltips for trace viewer markers Replace the relative-time context card on hook and attribute ticks with the shared tooltip, labeled `Hook received [UTC] …` and `Attribute set [UTC] …`. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Mitul Shah <mitulxshah@gmail.com> * fix(web-shared): format marker helpers and drop invalid aria-label Biome requires the kind filter ternary on one line, and aria-label is not valid on the tooltip trigger span. Signed-off-by: Cursor Agent <cursoragent@cursor.com> * fix(web-shared): prefix marker context cards with event kind Restore the relative-time context card on hook and attribute ticks, and prefix the relative time with "Hook received" or "Attribute set". Signed-off-by: Cursor Agent <cursoragent@cursor.com> * refactor(web-shared): slim marker context-card prefix Drop the label helper, type guard, and unused DefaultTimeText prefix path. Keep kind on the marker, map copy at the tick, and prefix only the card heading. Signed-off-by: Cursor Agent <cursoragent@cursor.com> * refactor(web-shared): drop prefix comments and generic event-mark helper Leave sortedEventMarks as a plain string filter. The prefix prop does not need a JSDoc restatement. Signed-off-by: Cursor Agent <cursoragent@cursor.com> --------- Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com>
@workflow/web-shared
Workflow Observability UI primitives. See Workflow SDK for more information.
Usage
This package contains:
- pre-styled, prop-driven UI components (no data fetching)
If you want a full observability experience with server actions already wired, take a look at
@workflow/web instead.
It comes with pre-styled UI components that accept data + callbacks:
import { TraceViewer } from '@workflow/web-shared';
export default function MyRunDetailView({ run, events, fetchSpanDetail }) {
return (
<TraceViewer
run={run}
events={events}
sidebarData={{ run, events, fetchSpanDetail }}
/>
);
}
Server actions and data fetching are intentionally not part of web-shared. Implement those in your app
and pass data + callbacks into these components. If you need world run helpers, use @workflow/core/runtime.
Security notice: If you implement server-side data fetching using
@workflow/world-vercelor similar backends, ensure that user-supplied IDs (runId, stepId, etc.) are validated before passing them to world functions. The server actions in@workflow/webdo not include authentication — see that package's README for details on securing self-hosted deployments.
Styling
In order for tailwind classes to be picked up correctly, you might need to configure your NextJS app to use the correct CSS processor. E.g. if you're using PostCSS with TailwindCSS, you can do the following:
// postcss.config.mjs in your NextJS app
const config = {
plugins: ['@tailwindcss/postcss'],
};
export default config;