@workflow/web-shared 5.0.0-beta.37 → 5.0.0-beta.38

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.
@@ -9,6 +9,7 @@ export type { SelectedSpanInfo, SpanSelectionInfo, } from './sidebar/entity-deta
9
9
  export { type SidebarDataContextValue, SidebarDataProvider, } from './sidebar/sidebar-data-context';
10
10
  export type { DetailResource, FetchSpanDetail, } from './sidebar/use-selected-span-detail';
11
11
  export { type StreamChunk, StreamViewer } from './stream-viewer';
12
+ export { StreamViewerSkeleton } from './stream-viewer-skeleton';
12
13
  export type { Span, SpanEvent } from './trace-viewer/types';
13
14
  export { NewTraceViewer } from './trace-viewer-new';
14
15
  export { DataInspector, type DataInspectorProps, DecryptClickContext, type DecryptClickContextValue, } from './ui/data-inspector';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,uBAAuB,EAC5B,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,cAAc,EACd,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,uBAAuB,EAC5B,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,cAAc,EACd,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -6,6 +6,7 @@ export { RunTraceView } from './run-trace-view';
6
6
  export { ConversationView } from './sidebar/conversation-view';
7
7
  export { SidebarDataProvider, } from './sidebar/sidebar-data-context';
8
8
  export { StreamViewer } from './stream-viewer';
9
+ export { StreamViewerSkeleton } from './stream-viewer-skeleton';
9
10
  export { NewTraceViewer } from './trace-viewer-new';
10
11
  export { DataInspector, DecryptClickContext, } from './ui/data-inspector';
11
12
  export { DecryptButton } from './ui/decrypt-button';
@@ -15,4 +16,4 @@ export { LoadMoreButton } from './ui/load-more-button';
15
16
  export { MenuDropdown } from './ui/menu-dropdown';
16
17
  export { Spinner } from './ui/spinner';
17
18
  export { WorkflowTraceViewer } from './workflow-trace-view';
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBUWxELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFLL0QsT0FBTyxFQUVMLG1CQUFtQixHQUNwQixNQUFNLGdDQUFnQyxDQUFDO0FBS3hDLE9BQU8sRUFBb0IsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxhQUFhLEVBRWIsbUJBQW1CLEdBRXBCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUEyQixNQUFNLG9CQUFvQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBFcnJvckJvdW5kYXJ5IH0gZnJvbSAnLi9lcnJvci1ib3VuZGFyeSc7XG5leHBvcnQgeyBFdmVudExpc3RWaWV3IH0gZnJvbSAnLi9ldmVudC1saXN0LXZpZXcnO1xuZXhwb3J0IHR5cGUge1xuICBIb29rQWN0aW9uQ2FsbGJhY2tzLFxuICBIb29rQWN0aW9uc0Ryb3Bkb3duSXRlbVByb3BzLFxuICBIb29rUmVzb2x2ZU1vZGFsUHJvcHMsXG4gIFVzZUhvb2tBY3Rpb25zT3B0aW9ucyxcbiAgVXNlSG9va0FjdGlvbnNSZXR1cm4sXG59IGZyb20gJy4vaG9vay1hY3Rpb25zJztcbmV4cG9ydCB7XG4gIEhvb2tSZXNvbHZlTW9kYWxXcmFwcGVyLFxuICBSZXNvbHZlSG9va0Ryb3Bkb3duSXRlbSxcbiAgUmVzb2x2ZUhvb2tNb2RhbCxcbiAgdXNlSG9va0FjdGlvbnMsXG59IGZyb20gJy4vaG9vay1hY3Rpb25zJztcbmV4cG9ydCB7IFRyYWNlVmlld2VyU2tlbGV0b24gfSBmcm9tICcuL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy90cmFjZS12aWV3ZXItc2tlbGV0b24nO1xuZXhwb3J0IHsgUnVuVHJhY2VWaWV3IH0gZnJvbSAnLi9ydW4tdHJhY2Utdmlldyc7XG5leHBvcnQgeyBDb252ZXJzYXRpb25WaWV3IH0gZnJvbSAnLi9zaWRlYmFyL2NvbnZlcnNhdGlvbi12aWV3JztcbmV4cG9ydCB0eXBlIHtcbiAgU2VsZWN0ZWRTcGFuSW5mbyxcbiAgU3BhblNlbGVjdGlvbkluZm8sXG59IGZyb20gJy4vc2lkZWJhci9lbnRpdHktZGV0YWlsLXBhbmVsJztcbmV4cG9ydCB7XG4gIHR5cGUgU2lkZWJhckRhdGFDb250ZXh0VmFsdWUsXG4gIFNpZGViYXJEYXRhUHJvdmlkZXIsXG59IGZyb20gJy4vc2lkZWJhci9zaWRlYmFyLWRhdGEtY29udGV4dCc7XG5leHBvcnQgdHlwZSB7XG4gIERldGFpbFJlc291cmNlLFxuICBGZXRjaFNwYW5EZXRhaWwsXG59IGZyb20gJy4vc2lkZWJhci91c2Utc2VsZWN0ZWQtc3Bhbi1kZXRhaWwnO1xuZXhwb3J0IHsgdHlwZSBTdHJlYW1DaHVuaywgU3RyZWFtVmlld2VyIH0gZnJvbSAnLi9zdHJlYW0tdmlld2VyJztcbmV4cG9ydCB0eXBlIHsgU3BhbiwgU3BhbkV2ZW50IH0gZnJvbSAnLi90cmFjZS12aWV3ZXIvdHlwZXMnO1xuZXhwb3J0IHsgTmV3VHJhY2VWaWV3ZXIgfSBmcm9tICcuL3RyYWNlLXZpZXdlci1uZXcnO1xuZXhwb3J0IHtcbiAgRGF0YUluc3BlY3RvcixcbiAgdHlwZSBEYXRhSW5zcGVjdG9yUHJvcHMsXG4gIERlY3J5cHRDbGlja0NvbnRleHQsXG4gIHR5cGUgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlLFxufSBmcm9tICcuL3VpL2RhdGEtaW5zcGVjdG9yJztcbmV4cG9ydCB7IERlY3J5cHRCdXR0b24gfSBmcm9tICcuL3VpL2RlY3J5cHQtYnV0dG9uJztcbmV4cG9ydCB7IEljb25CdXR0b24gfSBmcm9tICcuL3VpL2ljb24tYnV0dG9uJztcbmV4cG9ydCB7IEtiZCB9IGZyb20gJy4vdWkva2JkJztcbmV4cG9ydCB7IExvYWRNb3JlQnV0dG9uIH0gZnJvbSAnLi91aS9sb2FkLW1vcmUtYnV0dG9uJztcbmV4cG9ydCB7IE1lbnVEcm9wZG93biwgdHlwZSBNZW51RHJvcGRvd25PcHRpb24gfSBmcm9tICcuL3VpL21lbnUtZHJvcGRvd24nO1xuZXhwb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4vdWkvc3Bpbm5lcic7XG5leHBvcnQgeyBXb3JrZmxvd1RyYWNlVmlld2VyIH0gZnJvbSAnLi93b3JrZmxvdy10cmFjZS12aWV3JztcbiJdfQ==
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBUWxELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFLL0QsT0FBTyxFQUVMLG1CQUFtQixHQUNwQixNQUFNLGdDQUFnQyxDQUFDO0FBS3hDLE9BQU8sRUFBb0IsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxhQUFhLEVBRWIsbUJBQW1CLEdBRXBCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUEyQixNQUFNLG9CQUFvQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBFcnJvckJvdW5kYXJ5IH0gZnJvbSAnLi9lcnJvci1ib3VuZGFyeSc7XG5leHBvcnQgeyBFdmVudExpc3RWaWV3IH0gZnJvbSAnLi9ldmVudC1saXN0LXZpZXcnO1xuZXhwb3J0IHR5cGUge1xuICBIb29rQWN0aW9uQ2FsbGJhY2tzLFxuICBIb29rQWN0aW9uc0Ryb3Bkb3duSXRlbVByb3BzLFxuICBIb29rUmVzb2x2ZU1vZGFsUHJvcHMsXG4gIFVzZUhvb2tBY3Rpb25zT3B0aW9ucyxcbiAgVXNlSG9va0FjdGlvbnNSZXR1cm4sXG59IGZyb20gJy4vaG9vay1hY3Rpb25zJztcbmV4cG9ydCB7XG4gIEhvb2tSZXNvbHZlTW9kYWxXcmFwcGVyLFxuICBSZXNvbHZlSG9va0Ryb3Bkb3duSXRlbSxcbiAgUmVzb2x2ZUhvb2tNb2RhbCxcbiAgdXNlSG9va0FjdGlvbnMsXG59IGZyb20gJy4vaG9vay1hY3Rpb25zJztcbmV4cG9ydCB7IFRyYWNlVmlld2VyU2tlbGV0b24gfSBmcm9tICcuL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy90cmFjZS12aWV3ZXItc2tlbGV0b24nO1xuZXhwb3J0IHsgUnVuVHJhY2VWaWV3IH0gZnJvbSAnLi9ydW4tdHJhY2Utdmlldyc7XG5leHBvcnQgeyBDb252ZXJzYXRpb25WaWV3IH0gZnJvbSAnLi9zaWRlYmFyL2NvbnZlcnNhdGlvbi12aWV3JztcbmV4cG9ydCB0eXBlIHtcbiAgU2VsZWN0ZWRTcGFuSW5mbyxcbiAgU3BhblNlbGVjdGlvbkluZm8sXG59IGZyb20gJy4vc2lkZWJhci9lbnRpdHktZGV0YWlsLXBhbmVsJztcbmV4cG9ydCB7XG4gIHR5cGUgU2lkZWJhckRhdGFDb250ZXh0VmFsdWUsXG4gIFNpZGViYXJEYXRhUHJvdmlkZXIsXG59IGZyb20gJy4vc2lkZWJhci9zaWRlYmFyLWRhdGEtY29udGV4dCc7XG5leHBvcnQgdHlwZSB7XG4gIERldGFpbFJlc291cmNlLFxuICBGZXRjaFNwYW5EZXRhaWwsXG59IGZyb20gJy4vc2lkZWJhci91c2Utc2VsZWN0ZWQtc3Bhbi1kZXRhaWwnO1xuZXhwb3J0IHsgdHlwZSBTdHJlYW1DaHVuaywgU3RyZWFtVmlld2VyIH0gZnJvbSAnLi9zdHJlYW0tdmlld2VyJztcbmV4cG9ydCB7IFN0cmVhbVZpZXdlclNrZWxldG9uIH0gZnJvbSAnLi9zdHJlYW0tdmlld2VyLXNrZWxldG9uJztcbmV4cG9ydCB0eXBlIHsgU3BhbiwgU3BhbkV2ZW50IH0gZnJvbSAnLi90cmFjZS12aWV3ZXIvdHlwZXMnO1xuZXhwb3J0IHsgTmV3VHJhY2VWaWV3ZXIgfSBmcm9tICcuL3RyYWNlLXZpZXdlci1uZXcnO1xuZXhwb3J0IHtcbiAgRGF0YUluc3BlY3RvcixcbiAgdHlwZSBEYXRhSW5zcGVjdG9yUHJvcHMsXG4gIERlY3J5cHRDbGlja0NvbnRleHQsXG4gIHR5cGUgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlLFxufSBmcm9tICcuL3VpL2RhdGEtaW5zcGVjdG9yJztcbmV4cG9ydCB7IERlY3J5cHRCdXR0b24gfSBmcm9tICcuL3VpL2RlY3J5cHQtYnV0dG9uJztcbmV4cG9ydCB7IEljb25CdXR0b24gfSBmcm9tICcuL3VpL2ljb24tYnV0dG9uJztcbmV4cG9ydCB7IEtiZCB9IGZyb20gJy4vdWkva2JkJztcbmV4cG9ydCB7IExvYWRNb3JlQnV0dG9uIH0gZnJvbSAnLi91aS9sb2FkLW1vcmUtYnV0dG9uJztcbmV4cG9ydCB7IE1lbnVEcm9wZG93biwgdHlwZSBNZW51RHJvcGRvd25PcHRpb24gfSBmcm9tICcuL3VpL21lbnUtZHJvcGRvd24nO1xuZXhwb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4vdWkvc3Bpbm5lcic7XG5leHBvcnQgeyBXb3JrZmxvd1RyYWNlVmlld2VyIH0gZnJvbSAnLi93b3JrZmxvdy10cmFjZS12aWV3JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export declare function StreamViewerSkeleton(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=stream-viewer-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-viewer-skeleton.d.ts","sourceRoot":"","sources":["../../src/components/stream-viewer-skeleton.tsx"],"names":[],"mappings":"AASA,wBAAgB,oBAAoB,4CAwBnC"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Skeleton } from './ui/skeleton';
3
+ const STREAM_SKELETON_ROWS = [
4
+ { id: 'stream-skeleton-row-1', width: '72%' },
5
+ { id: 'stream-skeleton-row-2', width: '58%' },
6
+ { id: 'stream-skeleton-row-3', width: '80%' },
7
+ { id: 'stream-skeleton-row-4', width: '64%' },
8
+ ];
9
+ export function StreamViewerSkeleton() {
10
+ return (_jsxs("output", { "aria-busy": "true", "aria-label": "Loading stream", className: "flex h-full min-h-0 w-full flex-col overflow-hidden bg-background-100", children: [_jsx("span", { className: "sr-only", children: "Loading stream\u2026" }), _jsx("div", { className: "flex h-10 min-h-10 items-center border-b border-gray-alpha-400 px-3", children: _jsx(Skeleton, { className: "h-3 w-10" }) }), _jsx("div", { className: "flex flex-col", children: STREAM_SKELETON_ROWS.map((row) => (_jsxs("div", { className: "flex h-10 items-center gap-2 border-b border-gray-alpha-400 px-3", children: [_jsx(Skeleton, { className: "h-3", style: { width: row.width } }), _jsx(Skeleton, { className: "h-4 w-4 shrink-0 rounded-sm" })] }, row.id))) })] }));
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLXZpZXdlci1za2VsZXRvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3N0cmVhbS12aWV3ZXItc2tlbGV0b24udHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtJQUM3QyxFQUFFLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzdDLEVBQUUsRUFBRSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7SUFDN0MsRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtDQUM5QyxDQUFDO0FBRUYsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPLENBQ0wsK0JBQ1ksTUFBTSxnQkFDTCxnQkFBZ0IsRUFDM0IsU0FBUyxFQUFDLHVFQUF1RSxhQUVqRixlQUFNLFNBQVMsRUFBQyxTQUFTLHFDQUF1QixFQUNoRCxjQUFLLFNBQVMsRUFBQyxxRUFBcUUsWUFDbEYsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLFVBQVUsR0FBRyxHQUM3QixFQUNOLGNBQUssU0FBUyxFQUFDLGVBQWUsWUFDM0Isb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUNqQyxlQUVFLFNBQVMsRUFBQyxrRUFBa0UsYUFFNUUsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFJLEVBQ3pELEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyw2QkFBNkIsR0FBRyxLQUovQyxHQUFHLENBQUMsRUFBRSxDQUtQLENBQ1AsQ0FBQyxHQUNFLElBQ0MsQ0FDVixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi91aS9za2VsZXRvbic7XG5cbmNvbnN0IFNUUkVBTV9TS0VMRVRPTl9ST1dTID0gW1xuICB7IGlkOiAnc3RyZWFtLXNrZWxldG9uLXJvdy0xJywgd2lkdGg6ICc3MiUnIH0sXG4gIHsgaWQ6ICdzdHJlYW0tc2tlbGV0b24tcm93LTInLCB3aWR0aDogJzU4JScgfSxcbiAgeyBpZDogJ3N0cmVhbS1za2VsZXRvbi1yb3ctMycsIHdpZHRoOiAnODAlJyB9LFxuICB7IGlkOiAnc3RyZWFtLXNrZWxldG9uLXJvdy00Jywgd2lkdGg6ICc2NCUnIH0sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gU3RyZWFtVmlld2VyU2tlbGV0b24oKSB7XG4gIHJldHVybiAoXG4gICAgPG91dHB1dFxuICAgICAgYXJpYS1idXN5PVwidHJ1ZVwiXG4gICAgICBhcmlhLWxhYmVsPVwiTG9hZGluZyBzdHJlYW1cIlxuICAgICAgY2xhc3NOYW1lPVwiZmxleCBoLWZ1bGwgbWluLWgtMCB3LWZ1bGwgZmxleC1jb2wgb3ZlcmZsb3ctaGlkZGVuIGJnLWJhY2tncm91bmQtMTAwXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+TG9hZGluZyBzdHJlYW3igKY8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC0xMCBtaW4taC0xMCBpdGVtcy1jZW50ZXIgYm9yZGVyLWIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIHB4LTNcIj5cbiAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtMyB3LTEwXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIHtTVFJFQU1fU0tFTEVUT05fUk9XUy5tYXAoKHJvdykgPT4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17cm93LmlkfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBoLTEwIGl0ZW1zLWNlbnRlciBnYXAtMiBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgcHgtM1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtM1wiIHN0eWxlPXt7IHdpZHRoOiByb3cud2lkdGggfX0gLz5cbiAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTQgdy00IHNocmluay0wIHJvdW5kZWQtc21cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvb3V0cHV0PlxuICApO1xufVxuIl19
@@ -10,7 +10,7 @@ interface StreamViewerProps {
10
10
  error?: string | null;
11
11
  /** True while the initial stream connection is being established */
12
12
  isLoading?: boolean;
13
- /** Called when the user scrolls near the bottom, for triggering pagination */
13
+ /** Called when the user scrolls near the rendered end. */
14
14
  onScrollEnd?: () => void;
15
15
  }
16
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"stream-viewer.d.ts","sourceRoot":"","sources":["../../src/components/stream-viewer.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,KAAK,KAAK,GAAG,WAAW,CAAC;AAEzB,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAgED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EAAE,SAAS,EACnB,MAAM,EACN,MAAM,EACN,KAAK,EACL,SAAS,EACT,WAAW,GACZ,EAAE,iBAAiB,2CAmGnB"}
1
+ {"version":3,"file":"stream-viewer.d.ts","sourceRoot":"","sources":["../../src/components/stream-viewer.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,KAAK,KAAK,GAAG,WAAW,CAAC;AAEzB,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AA+BD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EAAE,SAAS,EACnB,MAAM,EACN,MAAM,EACN,KAAK,EACL,SAAS,EACT,WAAW,GACZ,EAAE,iBAAiB,2CA0DnB"}
@@ -1,25 +1,18 @@
1
1
  'use client';
2
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import React, { useEffect, useRef } from 'react';
4
4
  import { Virtuoso } from 'react-virtuoso';
5
+ import { CopyButton } from './new-trace-viewer/components/copy-button';
6
+ import { serializeForClipboard } from './sidebar/copyable-data-block';
7
+ import { StreamViewerSkeleton } from './stream-viewer-skeleton';
5
8
  import { DataInspector } from './ui/data-inspector';
6
- import { Skeleton } from './ui/skeleton';
7
9
  // ──────────────────────────────────────────────────────────────────────────
8
10
  // Chunk row — memoized to prevent remounts during polling
9
11
  // ──────────────────────────────────────────────────────────────────────────
10
- const ChunkRow = React.memo(function ChunkRow({ chunk, index, }) {
11
- return (_jsx("div", { className: "text-[11px] rounded-md border p-3", style: {
12
- borderColor: 'var(--ds-gray-300)',
13
- backgroundColor: 'var(--ds-gray-100)',
14
- }, children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsxs("span", { className: "select-none pt-px", style: { color: 'var(--ds-gray-500)' }, children: ["[", index, "]"] }), _jsx("div", { className: "min-w-0 flex-1", children: typeof chunk.value === 'string' ? (_jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-gray-1000)' }, children: chunk.value })) : (_jsx(DataInspector, { data: chunk.value, expandLevel: 1 })) })] }) }));
12
+ const ChunkRow = React.memo(function ChunkRow({ chunk }) {
13
+ return (_jsxs("div", { className: "flex w-full items-start gap-1 border-b border-gray-alpha-400 px-3 py-2", children: [_jsx("div", { className: "min-w-0 flex-1", children: typeof chunk.value === 'string' ? (_jsx("span", { className: "whitespace-pre-wrap break-words text-label-12 font-mono text-gray-1000", children: chunk.value })) : (_jsx(DataInspector, { data: chunk.value, expandLevel: 1 })) }), _jsx(CopyButton, { copyText: serializeForClipboard(chunk.value), ariaLabel: "Copy chunk", className: "shrink-0 -mr-1 [&>div]:h-4 [&>div]:w-4 [&_svg]:h-4 [&_svg]:w-4" })] }));
15
14
  });
16
15
  // ──────────────────────────────────────────────────────────────────────────
17
- // Skeleton loading
18
- // ──────────────────────────────────────────────────────────────────────────
19
- function StreamSkeleton() {
20
- return (_jsxs("div", { className: "flex flex-col gap-3 animate-in fade-in", children: [_jsx(Skeleton, { style: { width: 120, height: 16, borderRadius: 4 } }), [1, 2, 3, 4].map((i) => (_jsx(Skeleton, { style: { height: 56, borderRadius: 6 } }, i)))] }));
21
- }
22
- // ──────────────────────────────────────────────────────────────────────────
23
16
  // Main component
24
17
  // ──────────────────────────────────────────────────────────────────────────
25
18
  /**
@@ -30,7 +23,6 @@ function StreamSkeleton() {
30
23
  export function StreamViewer({ streamId: _streamId, chunks, isLive, error, isLoading, onScrollEnd, }) {
31
24
  const virtuosoRef = useRef(null);
32
25
  const prevChunkCountRef = useRef(0);
33
- // Auto-scroll to bottom when new chunks arrive (live streaming)
34
26
  useEffect(() => {
35
27
  if (chunks.length > prevChunkCountRef.current && chunks.length > 0) {
36
28
  virtuosoRef.current?.scrollToIndex({
@@ -40,18 +32,9 @@ export function StreamViewer({ streamId: _streamId, chunks, isLive, error, isLoa
40
32
  }
41
33
  prevChunkCountRef.current = chunks.length;
42
34
  }, [chunks.length]);
43
- // Show skeleton when loading and no chunks have arrived yet
44
35
  if (isLoading && chunks.length === 0) {
45
- return (_jsx("div", { className: "flex flex-col h-full", children: _jsx(StreamSkeleton, {}) }));
36
+ return _jsx(StreamViewerSkeleton, {});
46
37
  }
47
- return (_jsxs("div", { className: "flex flex-col h-full", children: [isLive && (_jsxs("div", { className: "flex items-center gap-1.5 mb-2 px-1", children: [_jsx("span", { className: "inline-block w-2 h-2 rounded-full", style: { backgroundColor: 'var(--ds-green-600)' } }), _jsx("span", { className: "text-xs", style: { color: 'var(--ds-green-700)' }, children: "Live" })] })), chunks.length > 0 && (_jsxs("div", { className: "flex items-center gap-2 mb-2 px-1", children: [_jsx("span", { className: "text-[13px] font-medium", style: { color: 'var(--ds-gray-900)' }, children: "Stream Chunks" }), _jsxs("span", { className: "text-xs tabular-nums", style: { color: 'var(--ds-gray-600)' }, children: ["(", chunks.length, ")"] })] })), _jsx("div", { className: "flex-1 min-h-0", children: error ? (_jsxs("div", { className: "text-[11px] rounded-md border p-3", style: {
48
- borderColor: 'var(--ds-red-300)',
49
- backgroundColor: 'var(--ds-red-100)',
50
- color: 'var(--ds-red-700)',
51
- }, children: [_jsx("div", { children: "Error reading stream:" }), _jsx("div", { children: error })] })) : chunks.length === 0 ? (_jsx("div", { className: "text-[11px] rounded-md border p-3", style: {
52
- borderColor: 'var(--ds-gray-300)',
53
- backgroundColor: 'var(--ds-gray-100)',
54
- color: 'var(--ds-gray-600)',
55
- }, children: isLive ? 'Waiting for stream data...' : 'Stream is empty' })) : (_jsx(Virtuoso, { ref: virtuosoRef, totalCount: chunks.length, overscan: 10, endReached: () => onScrollEnd?.(), itemContent: (index) => (_jsx("div", { style: { paddingBottom: 8 }, children: _jsx(ChunkRow, { chunk: chunks[index], index: index }) })), style: { flex: 1, minHeight: 0 } })) })] }));
38
+ return (_jsxs("div", { className: "flex h-full w-full flex-col overflow-hidden bg-background-100", children: [_jsx("div", { className: "flex h-10 min-h-10 items-center gap-1.5 border-b border-gray-alpha-400 px-3", children: isLive && (_jsxs(_Fragment, { children: [_jsx("span", { className: "inline-block h-2 w-2 rounded-full bg-green-600" }), _jsx("span", { className: "text-label-12 text-green-700", children: "Live" })] })) }), _jsx("div", { className: "flex-1 min-h-0", children: error ? (_jsxs("div", { className: "border-b border-red-400 bg-red-100 px-3 py-2 text-label-12 text-red-900", children: [_jsx("div", { children: "Error reading stream:" }), _jsx("div", { children: error })] })) : chunks.length === 0 ? (_jsx("div", { className: "flex h-10 items-center border-b border-gray-alpha-400 bg-background-200 px-3 text-label-12 text-gray-900", children: isLive ? 'Waiting for stream data...' : 'Stream is empty' })) : (_jsx(Virtuoso, { ref: virtuosoRef, totalCount: chunks.length, overscan: 10, endReached: () => onScrollEnd?.(), itemContent: (index) => (_jsx("div", { className: "w-full", children: _jsx(ChunkRow, { chunk: chunks[index] }) })), style: { flex: 1, minHeight: 0 } })) })] }));
56
39
  }
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLXZpZXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3N0cmVhbS12aWV3ZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXdCekMsNkVBQTZFO0FBQzdFLDBEQUEwRDtBQUMxRCw2RUFBNkU7QUFFN0UsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxFQUM1QyxLQUFLLEVBQ0wsS0FBSyxHQUlOO0lBQ0MsT0FBTyxDQUNMLGNBQ0UsU0FBUyxFQUFDLG1DQUFtQyxFQUM3QyxLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsb0JBQW9CO1lBQ2pDLGVBQWUsRUFBRSxvQkFBb0I7U0FDdEMsWUFFRCxlQUFLLFNBQVMsRUFBQyx3QkFBd0IsYUFDckMsZ0JBQ0UsU0FBUyxFQUFDLG1CQUFtQixFQUM3QixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsa0JBRXBDLEtBQUssU0FDRixFQUNQLGNBQUssU0FBUyxFQUFDLGdCQUFnQixZQUM1QixPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUNqQyxlQUNFLFNBQVMsRUFBQyxpQ0FBaUMsRUFDM0MsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLFlBRXRDLEtBQUssQ0FBQyxLQUFLLEdBQ1AsQ0FDUixDQUFDLENBQUMsQ0FBQyxDQUNGLEtBQUMsYUFBYSxJQUFDLElBQUksRUFB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fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBWaXJ0dW9zbywgdHlwZSBWaXJ0dW9zb0hhbmRsZSB9IGZyb20gJ3JlYWN0LXZpcnR1b3NvJztcbmltcG9ydCB7IERhdGFJbnNwZWN0b3IgfSBmcm9tICcuL3VpL2RhdGEtaW5zcGVjdG9yJztcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi91aS9za2VsZXRvbic7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbUNodW5rIHtcbiAgaWQ6IG51bWJlcjtcbiAgdmFsdWU6IHVua25vd247XG59XG5cbnR5cGUgQ2h1bmsgPSBTdHJlYW1DaHVuaztcblxuaW50ZXJmYWNlIFN0cmVhbVZpZXdlclByb3BzIHtcbiAgc3RyZWFtSWQ6IHN0cmluZztcbiAgY2h1bmtzOiBDaHVua1tdO1xuICBpc0xpdmU6IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRydWUgd2hpbGUgdGhlIGluaXRpYWwgc3RyZWFtIGNvbm5lY3Rpb24gaXMgYmVpbmcgZXN0YWJsaXNoZWQgKi9cbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgbmVhciB0aGUgYm90dG9tLCBmb3IgdHJpZ2dlcmluZyBwYWdpbmF0aW9uICovXG4gIG9uU2Nyb2xsRW5kPzogKCkgPT4gdm9pZDtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDaHVuayByb3cg4oCUIG1lbW9pemVkIHRvIHByZXZlbnQgcmVtb3VudHMgZHVyaW5nIHBvbGxpbmdcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBDaHVua1JvdyA9IFJlYWN0Lm1lbW8oZnVuY3Rpb24gQ2h1bmtSb3coe1xuICBjaHVuayxcbiAgaW5kZXgsXG59OiB7XG4gIGNodW5rOiBDaHVuaztcbiAgaW5kZXg6IG51bWJlcjtcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSByb3VuZGVkLW1kIGJvcmRlciBwLTNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQgZ2FwLTJcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzc05hbWU9XCJzZWxlY3Qtbm9uZSBwdC1weFwiXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTUwMCknIH19XG4gICAgICAgID5cbiAgICAgICAgICBbe2luZGV4fV1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTAgZmxleC0xXCI+XG4gICAgICAgICAge3R5cGVvZiBjaHVuay52YWx1ZSA9PT0gJ3N0cmluZycgPyAoXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3aGl0ZXNwYWNlLXByZS13cmFwIGJyZWFrLXdvcmRzXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMDApJyB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7Y2h1bmsudmFsdWV9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxEYXRhSW5zcGVjdG9yIGRhdGE9e2NodW5rLnZhbHVlfSBleHBhbmRMZXZlbD17MX0gLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufSk7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2tlbGV0b24gbG9hZGluZ1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIFN0cmVhbVNrZWxldG9uKCkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMyBhbmltYXRlLWluIGZhZGUtaW5cIj5cbiAgICAgIDxTa2VsZXRvbiBzdHlsZT17eyB3aWR0aDogMTIwLCBoZWlnaHQ6IDE2LCBib3JkZXJSYWRpdXM6IDQgfX0gLz5cbiAgICAgIHtbMSwgMiwgMywgNF0ubWFwKChpKSA9PiAoXG4gICAgICAgIDxTa2VsZXRvbiBrZXk9e2l9IHN0eWxlPXt7IGhlaWdodDogNTYsIGJvcmRlclJhZGl1czogNiB9fSAvPlxuICAgICAgKSl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gTWFpbiBjb21wb25lbnRcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFN0cmVhbVZpZXdlciBjb21wb25lbnQgdGhhdCBkaXNwbGF5cyByZWFsLXRpbWUgc3RyZWFtIGRhdGEuXG4gKiBFYWNoIGNodW5rIGlzIHJlbmRlcmVkIHdpdGggRGF0YUluc3BlY3RvciBmb3IgcHJvcGVyIGRpc3BsYXlcbiAqIG9mIGNvbXBsZXggdHlwZXMgKE1hcCwgU2V0LCBEYXRlLCBjdXN0b20gY2xhc3NlcywgZXRjLikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTdHJlYW1WaWV3ZXIoe1xuICBzdHJlYW1JZDogX3N0cmVhbUlkLFxuICBjaHVua3MsXG4gIGlzTGl2ZSxcbiAgZXJyb3IsXG4gIGlzTG9hZGluZyxcbiAgb25TY3JvbGxFbmQsXG59OiBTdHJlYW1WaWV3ZXJQcm9wcykge1xuICBjb25zdCB2aXJ0dW9zb1JlZiA9IHVzZVJlZjxWaXJ0dW9zb0hhbmRsZT4obnVsbCk7XG4gIGNvbnN0IHByZXZDaHVua0NvdW50UmVmID0gdXNlUmVmKDApO1xuXG4gIC8vIEF1dG8tc2Nyb2xsIHRvIGJvdHRvbSB3aGVuIG5ldyBjaHVua3MgYXJyaXZlIChsaXZlIHN0cmVhbWluZylcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2h1bmtzLmxlbmd0aCA+IHByZXZDaHVua0NvdW50UmVmLmN1cnJlbnQgJiYgY2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZpcnR1b3NvUmVmLmN1cnJlbnQ/LnNjcm9sbFRvSW5kZXgoe1xuICAgICAgICBpbmRleDogY2h1bmtzLmxlbmd0aCAtIDEsXG4gICAgICAgIGFsaWduOiAnZW5kJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBwcmV2Q2h1bmtDb3VudFJlZi5jdXJyZW50ID0gY2h1bmtzLmxlbmd0aDtcbiAgfSwgW2NodW5rcy5sZW5ndGhdKTtcblxuICAvLyBTaG93IHNrZWxldG9uIHdoZW4gbG9hZGluZyBhbmQgbm8gY2h1bmtzIGhhdmUgYXJyaXZlZCB5ZXRcbiAgaWYgKGlzTG9hZGluZyAmJiBjaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBoLWZ1bGxcIj5cbiAgICAgICAgPFN0cmVhbVNrZWxldG9uIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaC1mdWxsXCI+XG4gICAgICB7LyogTGl2ZSBpbmRpY2F0b3IgKi99XG4gICAgICB7aXNMaXZlICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IG1iLTIgcHgtMVwiPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtYmxvY2sgdy0yIGgtMiByb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtZ3JlZW4tNjAwKScgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIiBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyZWVuLTcwMCknIH19PlxuICAgICAgICAgICAgTGl2ZVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7LyogSGVhZGVyICovfVxuICAgICAge2NodW5rcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0yIHB4LTFcIj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gZm9udC1tZWRpdW1cIlxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTkwMCknIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgU3RyZWFtIENodW5rc1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0YWJ1bGFyLW51bXNcIlxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTYwMCknIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgKHtjaHVua3MubGVuZ3RofSlcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIENvbnRlbnQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4taC0wXCI+XG4gICAgICAgIHtlcnJvciA/IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSByb3VuZGVkLW1kIGJvcmRlciBwLTNcIlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1yZWQtMzAwKScsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLXJlZC0xMDApJyxcbiAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1yZWQtNzAwKScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXY+RXJyb3IgcmVhZGluZyBzdHJlYW06PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PntlcnJvcn08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IGNodW5rcy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gcm91bmRlZC1tZCBib3JkZXIgcC0zXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDApJyxcbiAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTYwMCknLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7aXNMaXZlID8gJ1dhaXRpbmcgZm9yIHN0cmVhbSBkYXRhLi4uJyA6ICdTdHJlYW0gaXMgZW1wdHknfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxWaXJ0dW9zb1xuICAgICAgICAgICAgcmVmPXt2aXJ0dW9zb1JlZn1cbiAgICAgICAgICAgIHRvdGFsQ291bnQ9e2NodW5rcy5sZW5ndGh9XG4gICAgICAgICAgICBvdmVyc2Nhbj17MTB9XG4gICAgICAgICAgICBlbmRSZWFjaGVkPXsoKSA9PiBvblNjcm9sbEVuZD8uKCl9XG4gICAgICAgICAgICBpdGVtQ29udGVudD17KGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgcGFkZGluZ0JvdHRvbTogOCB9fT5cbiAgICAgICAgICAgICAgICA8Q2h1bmtSb3cgY2h1bms9e2NodW5rc1tpbmRleF19IGluZGV4PXtpbmRleH0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgc3R5bGU9e3sgZmxleDogMSwgbWluSGVpZ2h0OiAwIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLXZpZXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3N0cmVhbS12aWV3ZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBd0JwRCw2RUFBNkU7QUFDN0UsMERBQTBEO0FBQzFELDZFQUE2RTtBQUU3RSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFvQjtJQUN2RSxPQUFPLENBQ0wsZUFBSyxTQUFTLEVBQUMsd0VBQXdFLGFBQ3JGLGNBQUssU0FBUyxFQUFDLGdCQUFnQixZQUM1QixPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUNqQyxlQUFNLFNBQVMsRUFBQyx3RUFBd0UsWUFDckYsS0FBSyxDQUFDLEtBQUssR0FDUCxDQUNSLENBQUMsQ0FBQyxDQUFDLENBQ0YsS0FBQyxhQUFhLElBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBSSxDQUNyRCxHQUNHLEVBQ04sS0FBQyxVQUFVLElBQ1QsUUFBUSxFQUFFLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDNUMsU0FBUyxFQUFDLFlBQVksRUFDdEIsU0FBUyxFQUFDLGdFQUFnRSxHQUMxRSxJQUNFLENBQ1AsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUNqQiw2RUFBNkU7QUFFN0U7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsRUFDM0IsUUFBUSxFQUFFLFNBQVMsRUFDbkIsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFdBQVcsR0FDTztJQUNsQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXBDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkUsV0FBVyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7Z0JBQ2pDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ3hCLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELGlCQUFpQixDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzVDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRXBCLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxLQUFDLG9CQUFvQixLQUFHLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBQywrREFBK0QsYUFFNUUsY0FBSyxTQUFTLEVBQUMsNkVBQTZFLFlBQ3pGLE1BQU0sSUFBSSxDQUNULDhCQUNFLGVBQU0sU0FBUyxFQUFDLGdEQUFnRCxHQUFHLEVBQ25FLGVBQU0sU0FBUyxFQUFDLDhCQUE4QixxQkFBWSxJQUN6RCxDQUNKLEdBQ0csRUFHTixjQUFLLFNBQVMsRUFBQyxnQkFBZ0IsWUFDNUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNQLGVBQUssU0FBUyxFQUFDLHlFQUF5RSxhQUN0RixrREFBZ0MsRUFDaEMsd0JBQU0sS0FBSyxHQUFPLElBQ2QsQ0FDUCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDeEIsY0FBSyxTQUFTLEVBQUMsMEdBQTBHLFlBQ3RILE1BQU0sQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixHQUN0RCxDQUNQLENBQUMsQ0FBQyxDQUFDLENBQ0YsS0FBQyxRQUFRLElBQ1AsR0FBRyxFQUFFLFdBQVcsRUFDaEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQ3pCLFFBQVEsRUFBRSxFQUFFLEVBQ1osVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQ2pDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDdEIsY0FBSyxTQUFTLEVBQUMsUUFBUSxZQUNyQixLQUFDLFFBQVEsSUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFJLEdBQzlCLENBQ1AsRUFDRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FDaEMsQ0FDSCxHQUNHLElBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVmlydHVvc28sIHR5cGUgVmlydHVvc29IYW5kbGUgfSBmcm9tICdyZWFjdC12aXJ0dW9zbyc7XG5pbXBvcnQgeyBDb3B5QnV0dG9uIH0gZnJvbSAnLi9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvY29weS1idXR0b24nO1xuaW1wb3J0IHsgc2VyaWFsaXplRm9yQ2xpcGJvYXJkIH0gZnJvbSAnLi9zaWRlYmFyL2NvcHlhYmxlLWRhdGEtYmxvY2snO1xuaW1wb3J0IHsgU3RyZWFtVmlld2VyU2tlbGV0b24gfSBmcm9tICcuL3N0cmVhbS12aWV3ZXItc2tlbGV0b24nO1xuaW1wb3J0IHsgRGF0YUluc3BlY3RvciB9IGZyb20gJy4vdWkvZGF0YS1pbnNwZWN0b3InO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1DaHVuayB7XG4gIGlkOiBudW1iZXI7XG4gIHZhbHVlOiB1bmtub3duO1xufVxuXG50eXBlIENodW5rID0gU3RyZWFtQ2h1bms7XG5cbmludGVyZmFjZSBTdHJlYW1WaWV3ZXJQcm9wcyB7XG4gIHN0cmVhbUlkOiBzdHJpbmc7XG4gIGNodW5rczogQ2h1bmtbXTtcbiAgaXNMaXZlOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBpbml0aWFsIHN0cmVhbSBjb25uZWN0aW9uIGlzIGJlaW5nIGVzdGFibGlzaGVkICovXG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzY3JvbGxzIG5lYXIgdGhlIHJlbmRlcmVkIGVuZC4gKi9cbiAgb25TY3JvbGxFbmQ/OiAoKSA9PiB2b2lkO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENodW5rIHJvdyDigJQgbWVtb2l6ZWQgdG8gcHJldmVudCByZW1vdW50cyBkdXJpbmcgcG9sbGluZ1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IENodW5rUm93ID0gUmVhY3QubWVtbyhmdW5jdGlvbiBDaHVua1Jvdyh7IGNodW5rIH06IHsgY2h1bms6IENodW5rIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGl0ZW1zLXN0YXJ0IGdhcC0xIGJvcmRlci1iIGJvcmRlci1ncmF5LWFscGhhLTQwMCBweC0zIHB5LTJcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMCBmbGV4LTFcIj5cbiAgICAgICAge3R5cGVvZiBjaHVuay52YWx1ZSA9PT0gJ3N0cmluZycgPyAoXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwid2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3JkcyB0ZXh0LWxhYmVsLTEyIGZvbnQtbW9ubyB0ZXh0LWdyYXktMTAwMFwiPlxuICAgICAgICAgICAge2NodW5rLnZhbHVlfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8RGF0YUluc3BlY3RvciBkYXRhPXtjaHVuay52YWx1ZX0gZXhwYW5kTGV2ZWw9ezF9IC8+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxDb3B5QnV0dG9uXG4gICAgICAgIGNvcHlUZXh0PXtzZXJpYWxpemVGb3JDbGlwYm9hcmQoY2h1bmsudmFsdWUpfVxuICAgICAgICBhcmlhTGFiZWw9XCJDb3B5IGNodW5rXCJcbiAgICAgICAgY2xhc3NOYW1lPVwic2hyaW5rLTAgLW1yLTEgWyY+ZGl2XTpoLTQgWyY+ZGl2XTp3LTQgWyZfc3ZnXTpoLTQgWyZfc3ZnXTp3LTRcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIE1haW4gY29tcG9uZW50XG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTdHJlYW1WaWV3ZXIgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgcmVhbC10aW1lIHN0cmVhbSBkYXRhLlxuICogRWFjaCBjaHVuayBpcyByZW5kZXJlZCB3aXRoIERhdGFJbnNwZWN0b3IgZm9yIHByb3BlciBkaXNwbGF5XG4gKiBvZiBjb21wbGV4IHR5cGVzIChNYXAsIFNldCwgRGF0ZSwgY3VzdG9tIGNsYXNzZXMsIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3RyZWFtVmlld2VyKHtcbiAgc3RyZWFtSWQ6IF9zdHJlYW1JZCxcbiAgY2h1bmtzLFxuICBpc0xpdmUsXG4gIGVycm9yLFxuICBpc0xvYWRpbmcsXG4gIG9uU2Nyb2xsRW5kLFxufTogU3RyZWFtVmlld2VyUHJvcHMpIHtcbiAgY29uc3QgdmlydHVvc29SZWYgPSB1c2VSZWY8VmlydHVvc29IYW5kbGU+KG51bGwpO1xuICBjb25zdCBwcmV2Q2h1bmtDb3VudFJlZiA9IHVzZVJlZigwKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjaHVua3MubGVuZ3RoID4gcHJldkNodW5rQ291bnRSZWYuY3VycmVudCAmJiBjaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgdmlydHVvc29SZWYuY3VycmVudD8uc2Nyb2xsVG9JbmRleCh7XG4gICAgICAgIGluZGV4OiBjaHVua3MubGVuZ3RoIC0gMSxcbiAgICAgICAgYWxpZ246ICdlbmQnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByZXZDaHVua0NvdW50UmVmLmN1cnJlbnQgPSBjaHVua3MubGVuZ3RoO1xuICB9LCBbY2h1bmtzLmxlbmd0aF0pO1xuXG4gIGlmIChpc0xvYWRpbmcgJiYgY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiA8U3RyZWFtVmlld2VyU2tlbGV0b24gLz47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLWZ1bGwgdy1mdWxsIGZsZXgtY29sIG92ZXJmbG93LWhpZGRlbiBiZy1iYWNrZ3JvdW5kLTEwMFwiPlxuICAgICAgey8qIFN0YXR1cyBoZWFkZXIgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC0xMCBtaW4taC0xMCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgcHgtM1wiPlxuICAgICAgICB7aXNMaXZlICYmIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaW5saW5lLWJsb2NrIGgtMiB3LTIgcm91bmRlZC1mdWxsIGJnLWdyZWVuLTYwMFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTEyIHRleHQtZ3JlZW4tNzAwXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ29udGVudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi1oLTBcIj5cbiAgICAgICAge2Vycm9yID8gKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXJlZC00MDAgYmctcmVkLTEwMCBweC0zIHB5LTIgdGV4dC1sYWJlbC0xMiB0ZXh0LXJlZC05MDBcIj5cbiAgICAgICAgICAgIDxkaXY+RXJyb3IgcmVhZGluZyBzdHJlYW06PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PntlcnJvcn08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IGNodW5rcy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtMTAgaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ncmF5LWFscGhhLTQwMCBiZy1iYWNrZ3JvdW5kLTIwMCBweC0zIHRleHQtbGFiZWwtMTIgdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAge2lzTGl2ZSA/ICdXYWl0aW5nIGZvciBzdHJlYW0gZGF0YS4uLicgOiAnU3RyZWFtIGlzIGVtcHR5J31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8VmlydHVvc29cbiAgICAgICAgICAgIHJlZj17dmlydHVvc29SZWZ9XG4gICAgICAgICAgICB0b3RhbENvdW50PXtjaHVua3MubGVuZ3RofVxuICAgICAgICAgICAgb3ZlcnNjYW49ezEwfVxuICAgICAgICAgICAgZW5kUmVhY2hlZD17KCkgPT4gb25TY3JvbGxFbmQ/LigpfVxuICAgICAgICAgICAgaXRlbUNvbnRlbnQ9eyhpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxDaHVua1JvdyBjaHVuaz17Y2h1bmtzW2luZGV4XX0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgc3R5bGU9e3sgZmxleDogMSwgbWluSGVpZ2h0OiAwIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "5.0.0-beta.37",
4
+ "version": "5.0.0-beta.38",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -55,8 +55,8 @@
55
55
  "streamdown": "2.3.0",
56
56
  "tailwind-merge": "3.5.0",
57
57
  "tailwindcss": "4",
58
- "@workflow/utils": "5.0.0-beta.7",
59
- "@workflow/core": "5.0.0-beta.37",
58
+ "@workflow/core": "5.0.0-beta.38",
59
+ "@workflow/utils": "5.0.0-beta.8",
60
60
  "@workflow/world": "5.0.0-beta.23"
61
61
  },
62
62
  "devDependencies": {
@@ -67,7 +67,7 @@
67
67
  "ai": "6.0.116",
68
68
  "typescript": "^6.0.3",
69
69
  "vitest": "^4.1.10",
70
- "@workflow/errors": "5.0.0-beta.13",
70
+ "@workflow/errors": "5.0.0-beta.14",
71
71
  "@workflow/tsconfig": "5.0.0-beta.0"
72
72
  },
73
73
  "scripts": {
@@ -29,6 +29,7 @@ export type {
29
29
  FetchSpanDetail,
30
30
  } from './sidebar/use-selected-span-detail';
31
31
  export { type StreamChunk, StreamViewer } from './stream-viewer';
32
+ export { StreamViewerSkeleton } from './stream-viewer-skeleton';
32
33
  export type { Span, SpanEvent } from './trace-viewer/types';
33
34
  export { NewTraceViewer } from './trace-viewer-new';
34
35
  export {
@@ -0,0 +1,34 @@
1
+ import { Skeleton } from './ui/skeleton';
2
+
3
+ const STREAM_SKELETON_ROWS = [
4
+ { id: 'stream-skeleton-row-1', width: '72%' },
5
+ { id: 'stream-skeleton-row-2', width: '58%' },
6
+ { id: 'stream-skeleton-row-3', width: '80%' },
7
+ { id: 'stream-skeleton-row-4', width: '64%' },
8
+ ];
9
+
10
+ export function StreamViewerSkeleton() {
11
+ return (
12
+ <output
13
+ aria-busy="true"
14
+ aria-label="Loading stream"
15
+ className="flex h-full min-h-0 w-full flex-col overflow-hidden bg-background-100"
16
+ >
17
+ <span className="sr-only">Loading stream…</span>
18
+ <div className="flex h-10 min-h-10 items-center border-b border-gray-alpha-400 px-3">
19
+ <Skeleton className="h-3 w-10" />
20
+ </div>
21
+ <div className="flex flex-col">
22
+ {STREAM_SKELETON_ROWS.map((row) => (
23
+ <div
24
+ key={row.id}
25
+ className="flex h-10 items-center gap-2 border-b border-gray-alpha-400 px-3"
26
+ >
27
+ <Skeleton className="h-3" style={{ width: row.width }} />
28
+ <Skeleton className="h-4 w-4 shrink-0 rounded-sm" />
29
+ </div>
30
+ ))}
31
+ </div>
32
+ </output>
33
+ );
34
+ }
@@ -2,8 +2,10 @@
2
2
 
3
3
  import React, { useEffect, useRef } from 'react';
4
4
  import { Virtuoso, type VirtuosoHandle } from 'react-virtuoso';
5
+ import { CopyButton } from './new-trace-viewer/components/copy-button';
6
+ import { serializeForClipboard } from './sidebar/copyable-data-block';
7
+ import { StreamViewerSkeleton } from './stream-viewer-skeleton';
5
8
  import { DataInspector } from './ui/data-inspector';
6
- import { Skeleton } from './ui/skeleton';
7
9
 
8
10
  // ──────────────────────────────────────────────────────────────────────────
9
11
  // Types
@@ -23,7 +25,7 @@ interface StreamViewerProps {
23
25
  error?: string | null;
24
26
  /** True while the initial stream connection is being established */
25
27
  isLoading?: boolean;
26
- /** Called when the user scrolls near the bottom, for triggering pagination */
28
+ /** Called when the user scrolls near the rendered end. */
27
29
  onScrollEnd?: () => void;
28
30
  }
29
31
 
@@ -31,60 +33,27 @@ interface StreamViewerProps {
31
33
  // Chunk row — memoized to prevent remounts during polling
32
34
  // ──────────────────────────────────────────────────────────────────────────
33
35
 
34
- const ChunkRow = React.memo(function ChunkRow({
35
- chunk,
36
- index,
37
- }: {
38
- chunk: Chunk;
39
- index: number;
40
- }) {
36
+ const ChunkRow = React.memo(function ChunkRow({ chunk }: { chunk: Chunk }) {
41
37
  return (
42
- <div
43
- className="text-[11px] rounded-md border p-3"
44
- style={{
45
- borderColor: 'var(--ds-gray-300)',
46
- backgroundColor: 'var(--ds-gray-100)',
47
- }}
48
- >
49
- <div className="flex items-start gap-2">
50
- <span
51
- className="select-none pt-px"
52
- style={{ color: 'var(--ds-gray-500)' }}
53
- >
54
- [{index}]
55
- </span>
56
- <div className="min-w-0 flex-1">
57
- {typeof chunk.value === 'string' ? (
58
- <span
59
- className="whitespace-pre-wrap break-words"
60
- style={{ color: 'var(--ds-gray-1000)' }}
61
- >
62
- {chunk.value}
63
- </span>
64
- ) : (
65
- <DataInspector data={chunk.value} expandLevel={1} />
66
- )}
67
- </div>
38
+ <div className="flex w-full items-start gap-1 border-b border-gray-alpha-400 px-3 py-2">
39
+ <div className="min-w-0 flex-1">
40
+ {typeof chunk.value === 'string' ? (
41
+ <span className="whitespace-pre-wrap break-words text-label-12 font-mono text-gray-1000">
42
+ {chunk.value}
43
+ </span>
44
+ ) : (
45
+ <DataInspector data={chunk.value} expandLevel={1} />
46
+ )}
68
47
  </div>
48
+ <CopyButton
49
+ copyText={serializeForClipboard(chunk.value)}
50
+ ariaLabel="Copy chunk"
51
+ className="shrink-0 -mr-1 [&>div]:h-4 [&>div]:w-4 [&_svg]:h-4 [&_svg]:w-4"
52
+ />
69
53
  </div>
70
54
  );
71
55
  });
72
56
 
73
- // ──────────────────────────────────────────────────────────────────────────
74
- // Skeleton loading
75
- // ──────────────────────────────────────────────────────────────────────────
76
-
77
- function StreamSkeleton() {
78
- return (
79
- <div className="flex flex-col gap-3 animate-in fade-in">
80
- <Skeleton style={{ width: 120, height: 16, borderRadius: 4 }} />
81
- {[1, 2, 3, 4].map((i) => (
82
- <Skeleton key={i} style={{ height: 56, borderRadius: 6 }} />
83
- ))}
84
- </div>
85
- );
86
- }
87
-
88
57
  // ──────────────────────────────────────────────────────────────────────────
89
58
  // Main component
90
59
  // ──────────────────────────────────────────────────────────────────────────
@@ -105,7 +74,6 @@ export function StreamViewer({
105
74
  const virtuosoRef = useRef<VirtuosoHandle>(null);
106
75
  const prevChunkCountRef = useRef(0);
107
76
 
108
- // Auto-scroll to bottom when new chunks arrive (live streaming)
109
77
  useEffect(() => {
110
78
  if (chunks.length > prevChunkCountRef.current && chunks.length > 0) {
111
79
  virtuosoRef.current?.scrollToIndex({
@@ -116,71 +84,31 @@ export function StreamViewer({
116
84
  prevChunkCountRef.current = chunks.length;
117
85
  }, [chunks.length]);
118
86
 
119
- // Show skeleton when loading and no chunks have arrived yet
120
87
  if (isLoading && chunks.length === 0) {
121
- return (
122
- <div className="flex flex-col h-full">
123
- <StreamSkeleton />
124
- </div>
125
- );
88
+ return <StreamViewerSkeleton />;
126
89
  }
127
90
 
128
91
  return (
129
- <div className="flex flex-col h-full">
130
- {/* Live indicator */}
131
- {isLive && (
132
- <div className="flex items-center gap-1.5 mb-2 px-1">
133
- <span
134
- className="inline-block w-2 h-2 rounded-full"
135
- style={{ backgroundColor: 'var(--ds-green-600)' }}
136
- />
137
- <span className="text-xs" style={{ color: 'var(--ds-green-700)' }}>
138
- Live
139
- </span>
140
- </div>
141
- )}
142
-
143
- {/* Header */}
144
- {chunks.length > 0 && (
145
- <div className="flex items-center gap-2 mb-2 px-1">
146
- <span
147
- className="text-[13px] font-medium"
148
- style={{ color: 'var(--ds-gray-900)' }}
149
- >
150
- Stream Chunks
151
- </span>
152
- <span
153
- className="text-xs tabular-nums"
154
- style={{ color: 'var(--ds-gray-600)' }}
155
- >
156
- ({chunks.length})
157
- </span>
158
- </div>
159
- )}
92
+ <div className="flex h-full w-full flex-col overflow-hidden bg-background-100">
93
+ {/* Status header */}
94
+ <div className="flex h-10 min-h-10 items-center gap-1.5 border-b border-gray-alpha-400 px-3">
95
+ {isLive && (
96
+ <>
97
+ <span className="inline-block h-2 w-2 rounded-full bg-green-600" />
98
+ <span className="text-label-12 text-green-700">Live</span>
99
+ </>
100
+ )}
101
+ </div>
160
102
 
161
103
  {/* Content */}
162
104
  <div className="flex-1 min-h-0">
163
105
  {error ? (
164
- <div
165
- className="text-[11px] rounded-md border p-3"
166
- style={{
167
- borderColor: 'var(--ds-red-300)',
168
- backgroundColor: 'var(--ds-red-100)',
169
- color: 'var(--ds-red-700)',
170
- }}
171
- >
106
+ <div className="border-b border-red-400 bg-red-100 px-3 py-2 text-label-12 text-red-900">
172
107
  <div>Error reading stream:</div>
173
108
  <div>{error}</div>
174
109
  </div>
175
110
  ) : chunks.length === 0 ? (
176
- <div
177
- className="text-[11px] rounded-md border p-3"
178
- style={{
179
- borderColor: 'var(--ds-gray-300)',
180
- backgroundColor: 'var(--ds-gray-100)',
181
- color: 'var(--ds-gray-600)',
182
- }}
183
- >
111
+ <div className="flex h-10 items-center border-b border-gray-alpha-400 bg-background-200 px-3 text-label-12 text-gray-900">
184
112
  {isLive ? 'Waiting for stream data...' : 'Stream is empty'}
185
113
  </div>
186
114
  ) : (
@@ -190,8 +118,8 @@ export function StreamViewer({
190
118
  overscan={10}
191
119
  endReached={() => onScrollEnd?.()}
192
120
  itemContent={(index) => (
193
- <div style={{ paddingBottom: 8 }}>
194
- <ChunkRow chunk={chunks[index]} index={index} />
121
+ <div className="w-full">
122
+ <ChunkRow chunk={chunks[index]} />
195
123
  </div>
196
124
  )}
197
125
  style={{ flex: 1, minHeight: 0 }}