@mastra/playground-ui 58.0.0 → 58.1.0-alpha.0
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/{Badge-TD55_qZJ.js → Badge-Bzn8Z-_I.js} +2 -2
- package/dist/Badge-Bzn8Z-_I.js.map +1 -0
- package/dist/{Badge-BEeYtjmv.cjs → Badge-DFNxcz-r.cjs} +2 -2
- package/dist/Badge-DFNxcz-r.cjs.map +1 -0
- package/dist/{ask-user-jDUt7hgT.js → ask-user-DtF4a9Vr.js} +2 -2
- package/dist/{ask-user-jDUt7hgT.js.map → ask-user-DtF4a9Vr.js.map} +1 -1
- package/dist/{ask-user-BPpgiE7k.cjs → ask-user-pPTuoPKI.cjs} +2 -2
- package/dist/{ask-user-BPpgiE7k.cjs.map → ask-user-pPTuoPKI.cjs.map} +1 -1
- package/dist/{chat-notification-CmdRGO_D.js → chat-notification-C4P2InUX.js} +2 -2
- package/dist/{chat-notification-CmdRGO_D.js.map → chat-notification-C4P2InUX.js.map} +1 -1
- package/dist/{chat-notification-DJykWtoj.cjs → chat-notification-HP18KxlS.cjs} +2 -2
- package/dist/{chat-notification-DJykWtoj.cjs.map → chat-notification-HP18KxlS.cjs.map} +1 -1
- package/dist/{chat-signal-xs3FkPts.cjs → chat-signal-BP9RN6Rh.cjs} +2 -2
- package/dist/{chat-signal-xs3FkPts.cjs.map → chat-signal-BP9RN6Rh.cjs.map} +1 -1
- package/dist/{chat-signal-Vg8pGXwH.js → chat-signal-CQnmFp3V.js} +2 -2
- package/dist/{chat-signal-Vg8pGXwH.js.map → chat-signal-CQnmFp3V.js.map} +1 -1
- package/dist/components/Badge.cjs.js +1 -1
- package/dist/components/Badge.es.js +1 -1
- package/dist/components/DataList.cjs.js +1 -1
- package/dist/components/DataList.es.js +1 -1
- package/dist/components/ItemList.cjs.js +1 -1
- package/dist/components/ItemList.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +1 -1
- package/dist/components/LogsDataList.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsCardGroup.cjs.js +2 -11
- package/dist/components/MetricsCardGroup.cjs.js.map +1 -1
- package/dist/components/MetricsCardGroup.es.js +2 -11
- package/dist/components/MetricsCardGroup.es.js.map +1 -1
- package/dist/components/MetricsKpiCard.cjs.js +1 -1
- package/dist/components/MetricsKpiCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +2 -1
- package/dist/components/MetricsLineChart.cjs.js.map +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/PageHeader.cjs.js +1 -1
- package/dist/components/PageHeader.es.js +1 -1
- package/dist/components/Workflow.cjs.js +1 -1
- package/dist/components/Workflow.es.js +1 -1
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/components/ai/chat-event.cjs.js +2 -2
- package/dist/components/ai/chat-event.es.js +3 -3
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/task-list.cjs.js +370 -55
- package/dist/components/ai/task-list.cjs.js.map +1 -1
- package/dist/components/ai/task-list.es.js +374 -58
- package/dist/components/ai/task-list.es.js.map +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
- package/dist/domains/metrics/components/latency-card-view.cjs.js +33 -24
- package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card-view.es.js +34 -25
- package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +4 -4
- package/dist/domains/metrics/components/scores-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +4 -4
- package/dist/domains/metrics/components/scores-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +3 -3
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +10 -9
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +10 -9
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +4 -4
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -4
- package/dist/domains/metrics/components/traces-volume-card-view.es.js.map +1 -1
- package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js +11 -11
- package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-latency-metrics.es.js +12 -11
- package/dist/domains/metrics/hooks/use-latency-metrics.es.js.map +1 -1
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js +4 -12
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js +4 -12
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js.map +1 -1
- package/dist/domains/metrics/hooks.cjs.js +3 -0
- package/dist/domains/metrics/hooks.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks.es.js +1 -0
- package/dist/domains/metrics/hooks.es.js.map +1 -1
- package/dist/domains/metrics/metrics-interval.cjs.js +18 -0
- package/dist/domains/metrics/metrics-interval.cjs.js.map +1 -0
- package/dist/domains/metrics/metrics-interval.d.ts +2 -0
- package/dist/domains/metrics/metrics-interval.es.js +13 -0
- package/dist/domains/metrics/metrics-interval.es.js.map +1 -0
- package/dist/domains/metrics.cjs.js +3 -0
- package/dist/domains/metrics.cjs.js.map +1 -1
- package/dist/domains/metrics.es.js +1 -0
- package/dist/domains/metrics.es.js.map +1 -1
- package/dist/domains/traces/components/span-type-legend.cjs.js +1 -1
- package/dist/domains/traces/components/span-type-legend.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +1 -1
- package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
- package/dist/{logs-data-list-YL9yLKF3.cjs → logs-data-list-BHvJOeec.cjs} +2 -2
- package/dist/{logs-data-list-YL9yLKF3.cjs.map → logs-data-list-BHvJOeec.cjs.map} +1 -1
- package/dist/{logs-data-list-5BAeLU57.js → logs-data-list-CgDcNIvS.js} +2 -2
- package/dist/{logs-data-list-5BAeLU57.js.map → logs-data-list-CgDcNIvS.js.map} +1 -1
- package/dist/{metrics-card-Bzm6m1dy.js → metrics-card-C2RTi5Ew.js} +7 -7
- package/dist/metrics-card-C2RTi5Ew.js.map +1 -0
- package/dist/{metrics-card-DCCHIG-z.cjs → metrics-card-DzcVJTAN.cjs} +7 -7
- package/dist/metrics-card-DzcVJTAN.cjs.map +1 -0
- package/dist/{metrics-kpi-card-BrnFhFQm.js → metrics-kpi-card-BVCuXeDa.js} +21 -10
- package/dist/metrics-kpi-card-BVCuXeDa.js.map +1 -0
- package/dist/{metrics-kpi-card-Bhb4R4z0.cjs → metrics-kpi-card-DoIeHfv6.cjs} +21 -10
- package/dist/metrics-kpi-card-DoIeHfv6.cjs.map +1 -0
- package/dist/{metrics-line-chart-0FR3SYSt.cjs → metrics-line-chart-BNNRRxM8.cjs} +61 -25
- package/dist/metrics-line-chart-BNNRRxM8.cjs.map +1 -0
- package/dist/{metrics-line-chart-knlgw8bV.js → metrics-line-chart-CT_pqJtC.js} +62 -27
- package/dist/metrics-line-chart-CT_pqJtC.js.map +1 -0
- package/dist/new/layout/page-header.cjs.js +1 -1
- package/dist/new/layout/page-header.es.js +1 -1
- package/dist/{page-header-CyXAezlZ.js → page-header-BGyZw13s.js} +2 -2
- package/dist/page-header-BGyZw13s.js.map +1 -0
- package/dist/{page-header-Dk3s3XtC.cjs → page-header-CqvBk1wE.cjs} +2 -2
- package/dist/page-header-CqvBk1wE.cjs.map +1 -0
- package/dist/src/domains/metrics/components/latency-card-view.d.ts +4 -1
- package/dist/src/domains/metrics/hooks/index.d.ts +1 -0
- package/dist/src/domains/metrics/hooks/use-latency-metrics.d.ts +2 -2
- package/dist/src/domains/metrics/hooks/use-token-usage-timeseries.d.ts +2 -1
- package/dist/src/domains/metrics/metrics-interval.d.ts +7 -0
- package/dist/src/ds/components/MetricsCardGroup/metrics-card-group.d.ts +3 -8
- package/dist/src/ds/components/MetricsLineChart/index.d.ts +1 -0
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart-legend.d.ts +6 -0
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +6 -4
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.stories.d.ts +1 -0
- package/dist/src/ds/components/ai/task-list/task-graph-node.d.ts +8 -0
- package/dist/src/ds/components/ai/task-list/task-graph.d.ts +8 -0
- package/dist/src/ds/components/ai/task-list/task-list.d.ts +4 -8
- package/dist/src/ds/components/ai/task-list/task-list.stories.d.ts +1 -1
- package/dist/src/ds/components/ai/task-list/use-focused-row-scroll.d.ts +12 -0
- package/dist/src/ds/new/layout/page-header/page-header.stories.d.ts +1 -0
- package/dist/style.css +304 -14
- package/dist/{traces-data-list-Dvi0s56v.js → traces-data-list-B5MkMMBi.js} +2 -2
- package/dist/{traces-data-list-Dvi0s56v.js.map → traces-data-list-B5MkMMBi.js.map} +1 -1
- package/dist/{traces-data-list-Dam8-XW-.cjs → traces-data-list-D3k50j4n.cjs} +2 -2
- package/dist/{traces-data-list-Dam8-XW-.cjs.map → traces-data-list-D3k50j4n.cjs.map} +1 -1
- package/package.json +7 -7
- package/dist/Badge-BEeYtjmv.cjs.map +0 -1
- package/dist/Badge-TD55_qZJ.js.map +0 -1
- package/dist/metrics-card-Bzm6m1dy.js.map +0 -1
- package/dist/metrics-card-DCCHIG-z.cjs.map +0 -1
- package/dist/metrics-kpi-card-Bhb4R4z0.cjs.map +0 -1
- package/dist/metrics-kpi-card-BrnFhFQm.js.map +0 -1
- package/dist/metrics-line-chart-0FR3SYSt.cjs.map +0 -1
- package/dist/metrics-line-chart-knlgw8bV.js.map +0 -1
- package/dist/page-header-CyXAezlZ.js.map +0 -1
- package/dist/page-header-Dk3s3XtC.cjs.map +0 -1
|
@@ -1,20 +1,190 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { useState } from 'react';
|
|
4
|
-
import {
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { ChevronDown } from 'lucide-react';
|
|
3
|
+
import { useId, useRef, useEffectEvent, useEffect, useState } from 'react';
|
|
4
|
+
import { c as cn } from '../../cn-65Adrsfj.js';
|
|
5
5
|
import { S as ScrollArea } from '../../scroll-area-DyTZoISq.js';
|
|
6
6
|
import { b as TooltipProvider, T as Tooltip, c as TooltipTrigger, a as TooltipContent } from '../../tooltip-BrDiP0RI.js';
|
|
7
7
|
import { raisedSurfaceStyle } from '../../primitives/raised-surface.es.js';
|
|
8
|
-
import {
|
|
8
|
+
import { focusRing, transitions } from '../../primitives/transitions.es.js';
|
|
9
9
|
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
const TASK_ROW_HEIGHT = 28;
|
|
11
|
+
const TASK_GRAPH_MOTION_MS = 600;
|
|
12
|
+
const taskGraphMotion = "duration-[600ms] ease-(--resize-ease) motion-reduce:transition-none";
|
|
13
|
+
const taskGraphNodeClass = "absolute top-1/2 left-0.5 -translate-y-1/2 transition-[translate]";
|
|
14
|
+
const taskGraphLaneShift = {
|
|
15
|
+
completed: "translate-x-0",
|
|
16
|
+
in_progress: "translate-x-4",
|
|
17
|
+
pending: "translate-x-0"
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const TRUNK_X = 8;
|
|
21
|
+
const LANE_X = 24;
|
|
22
|
+
const laneX = (status, singleLane) => status === "in_progress" && !singleLane ? LANE_X : TRUNK_X;
|
|
23
|
+
const rowCenter = (index) => index * TASK_ROW_HEIGHT + TASK_ROW_HEIGHT / 2;
|
|
24
|
+
const ink = {
|
|
25
|
+
completed: "var(--accent1)",
|
|
26
|
+
in_progress: "var(--accent6)",
|
|
27
|
+
pending: "color-mix(in oklab, var(--muted-foreground) 45%, transparent)"
|
|
28
|
+
};
|
|
29
|
+
const connectorPathData = (upper, lower, index, singleLane) => {
|
|
30
|
+
const fromY = rowCenter(index);
|
|
31
|
+
const toY = rowCenter(index + 1);
|
|
32
|
+
const midY = (fromY + toY) / 2;
|
|
33
|
+
const fromX = laneX(upper, singleLane);
|
|
34
|
+
const toX = laneX(lower, singleLane);
|
|
35
|
+
return `M ${fromX} ${fromY} C ${fromX} ${midY} ${toX} ${midY} ${toX} ${toY}`;
|
|
36
|
+
};
|
|
37
|
+
const TaskGraphSegment = ({ upper, lower, index, graphId, singleLane }) => {
|
|
38
|
+
const pathData = connectorPathData(upper, lower, index, singleLane);
|
|
39
|
+
const d = `path("${pathData}")`;
|
|
40
|
+
const reached = upper !== "pending" && lower !== "pending";
|
|
41
|
+
const touchesActive = upper === "in_progress" || lower === "in_progress";
|
|
42
|
+
return /* @__PURE__ */ jsxs("g", { children: [
|
|
43
|
+
/* @__PURE__ */ jsx(
|
|
44
|
+
"path",
|
|
45
|
+
{
|
|
46
|
+
d: pathData,
|
|
47
|
+
fill: "none",
|
|
48
|
+
strokeWidth: 1,
|
|
49
|
+
mask: `url(#${graphId}-future)`,
|
|
50
|
+
className: cn("transition-[d]", taskGraphMotion),
|
|
51
|
+
style: { d, stroke: ink.pending }
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"path",
|
|
56
|
+
{
|
|
57
|
+
d: pathData,
|
|
58
|
+
fill: "none",
|
|
59
|
+
strokeWidth: 1,
|
|
60
|
+
pathLength: 1,
|
|
61
|
+
strokeDasharray: "1 1",
|
|
62
|
+
className: cn("transition-[d,stroke-dashoffset,stroke]", taskGraphMotion),
|
|
63
|
+
style: { d, strokeDashoffset: reached ? 0 : 1, stroke: touchesActive ? ink.in_progress : ink.completed }
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
] });
|
|
67
|
+
};
|
|
68
|
+
const TaskGraphLines = ({ statuses, singleLane = false }) => {
|
|
69
|
+
const graphId = `task-graph${useId().replace(/[^a-zA-Z0-9]/g, "")}`;
|
|
70
|
+
const height = statuses.length * TASK_ROW_HEIGHT;
|
|
71
|
+
const maskBox = { x: -8, y: 0, width: LANE_X + 24, height };
|
|
72
|
+
return /* @__PURE__ */ jsxs(
|
|
73
|
+
"svg",
|
|
74
|
+
{
|
|
75
|
+
"aria-hidden": true,
|
|
76
|
+
width: LANE_X + 8,
|
|
77
|
+
height,
|
|
78
|
+
className: "pointer-events-none absolute top-0 left-0 overflow-visible",
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsxs("defs", { children: [
|
|
81
|
+
/* @__PURE__ */ jsxs("linearGradient", { id: `${graphId}-fade`, gradientUnits: "userSpaceOnUse", x1: 0, x2: 0, y1: 0, y2: height, children: [
|
|
82
|
+
/* @__PURE__ */ jsx("stop", { offset: "0", stopColor: "white", stopOpacity: 1 }),
|
|
83
|
+
/* @__PURE__ */ jsx("stop", { offset: "1", stopColor: "white", stopOpacity: 0.15 })
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsx("mask", { id: `${graphId}-future`, maskUnits: "userSpaceOnUse", ...maskBox, children: /* @__PURE__ */ jsx("rect", { ...maskBox, fill: `url(#${graphId}-fade)` }) }),
|
|
86
|
+
/* @__PURE__ */ jsxs("linearGradient", { id: `${graphId}-gap`, x1: 0, x2: 0, y1: 0, y2: 1, children: [
|
|
87
|
+
/* @__PURE__ */ jsx("stop", { offset: "0.2", stopColor: "white", stopOpacity: 0 }),
|
|
88
|
+
/* @__PURE__ */ jsx("stop", { offset: "0.4", stopColor: "white", stopOpacity: 1 }),
|
|
89
|
+
/* @__PURE__ */ jsx("stop", { offset: "0.6", stopColor: "white", stopOpacity: 1 }),
|
|
90
|
+
/* @__PURE__ */ jsx("stop", { offset: "0.8", stopColor: "white", stopOpacity: 0 })
|
|
91
|
+
] }),
|
|
92
|
+
/* @__PURE__ */ jsx(
|
|
93
|
+
"pattern",
|
|
94
|
+
{
|
|
95
|
+
id: `${graphId}-gaps`,
|
|
96
|
+
patternUnits: "userSpaceOnUse",
|
|
97
|
+
x: maskBox.x,
|
|
98
|
+
y: TASK_ROW_HEIGHT / 2,
|
|
99
|
+
width: maskBox.width,
|
|
100
|
+
height: TASK_ROW_HEIGHT,
|
|
101
|
+
children: /* @__PURE__ */ jsx("rect", { width: maskBox.width, height: TASK_ROW_HEIGHT, fill: `url(#${graphId}-gap)` })
|
|
102
|
+
}
|
|
103
|
+
),
|
|
104
|
+
/* @__PURE__ */ jsx("mask", { id: `${graphId}-between-nodes`, maskUnits: "userSpaceOnUse", ...maskBox, children: /* @__PURE__ */ jsx("rect", { ...maskBox, fill: `url(#${graphId}-gaps)` }) })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsx("g", { mask: `url(#${graphId}-between-nodes)`, children: statuses.map((status, index) => {
|
|
107
|
+
const next = statuses[index + 1];
|
|
108
|
+
if (!next) return null;
|
|
109
|
+
return /* @__PURE__ */ jsx(
|
|
110
|
+
TaskGraphSegment,
|
|
111
|
+
{
|
|
112
|
+
upper: status,
|
|
113
|
+
lower: next,
|
|
114
|
+
index,
|
|
115
|
+
graphId,
|
|
116
|
+
singleLane
|
|
117
|
+
},
|
|
118
|
+
index
|
|
119
|
+
);
|
|
120
|
+
}) })
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const prefersReducedMotion = () => window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
|
|
127
|
+
const easeOutQuint = (progress) => 1 - (1 - progress) ** 5;
|
|
128
|
+
const glideScrollTop = (viewport, top) => {
|
|
129
|
+
const start = viewport.scrollTop;
|
|
130
|
+
const distance = top - start;
|
|
131
|
+
if (prefersReducedMotion()) {
|
|
132
|
+
viewport.scrollTo({ top });
|
|
133
|
+
return () => {
|
|
134
|
+
};
|
|
16
135
|
}
|
|
17
|
-
|
|
136
|
+
let frame = 0;
|
|
137
|
+
const startedAt = performance.now();
|
|
138
|
+
const step = (now) => {
|
|
139
|
+
const progress = Math.min((now - startedAt) / TASK_GRAPH_MOTION_MS, 1);
|
|
140
|
+
viewport.scrollTo({ top: start + distance * easeOutQuint(progress) });
|
|
141
|
+
if (progress < 1) frame = requestAnimationFrame(step);
|
|
142
|
+
};
|
|
143
|
+
frame = requestAnimationFrame(step);
|
|
144
|
+
return () => cancelAnimationFrame(frame);
|
|
145
|
+
};
|
|
146
|
+
const revealedScrollTop = (rowIndex, currentTop, windowHeight) => {
|
|
147
|
+
const rowTop = rowIndex * TASK_ROW_HEIGHT;
|
|
148
|
+
const rowBottom = rowTop + TASK_ROW_HEIGHT;
|
|
149
|
+
if (rowTop < currentTop) return rowTop;
|
|
150
|
+
if (rowBottom > currentTop + windowHeight) return rowBottom - windowHeight;
|
|
151
|
+
return currentTop;
|
|
152
|
+
};
|
|
153
|
+
const EXPANDED_VISIBLE_ROWS = 4.5;
|
|
154
|
+
const taskWindowHeight = (rowCount, open) => open ? Math.min(rowCount, EXPANDED_VISIBLE_ROWS) * TASK_ROW_HEIGHT : TASK_ROW_HEIGHT;
|
|
155
|
+
const wantedScrollTop = (currentTop, { focusIndex, windowHeight, open, followFocus }) => {
|
|
156
|
+
if (!open) return focusIndex * TASK_ROW_HEIGHT;
|
|
157
|
+
if (!followFocus) return currentTop;
|
|
158
|
+
return revealedScrollTop(focusIndex, currentTop, windowHeight);
|
|
159
|
+
};
|
|
160
|
+
const clampScrollTop = (top, contentHeight, windowHeight) => Math.min(Math.max(top, 0), Math.max(contentHeight - windowHeight, 0));
|
|
161
|
+
const useFocusedRowScroll = ({ focusIndex, rowCount, open, followFocus }) => {
|
|
162
|
+
const viewportRef = useRef(null);
|
|
163
|
+
const cancelGlide = useRef(void 0);
|
|
164
|
+
const placedOnce = useRef(false);
|
|
165
|
+
const glideForOpen = (nextOpen) => {
|
|
166
|
+
const viewport = viewportRef.current;
|
|
167
|
+
if (!viewport || typeof viewport.scrollTo !== "function") return;
|
|
168
|
+
const windowHeight = taskWindowHeight(rowCount, nextOpen);
|
|
169
|
+
const wantedTop = wantedScrollTop(viewport.scrollTop, { focusIndex, windowHeight, open: nextOpen, followFocus });
|
|
170
|
+
const top = clampScrollTop(wantedTop, rowCount * TASK_ROW_HEIGHT, windowHeight);
|
|
171
|
+
cancelGlide.current?.();
|
|
172
|
+
if (!placedOnce.current) {
|
|
173
|
+
placedOnce.current = true;
|
|
174
|
+
viewport.scrollTo({ top });
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (top !== viewport.scrollTop) cancelGlide.current = glideScrollTop(viewport, top);
|
|
178
|
+
};
|
|
179
|
+
const followFocusedRow = useEffectEvent(() => glideForOpen(open));
|
|
180
|
+
useEffect(() => {
|
|
181
|
+
followFocusedRow();
|
|
182
|
+
return () => cancelGlide.current?.();
|
|
183
|
+
}, [focusIndex]);
|
|
184
|
+
return { viewportRef, glideForOpen };
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const TaskListContainer = ({ className, ...props }) => /* @__PURE__ */ jsx("section", { className: cn(raisedSurfaceStyle, "overflow-hidden rounded-2xl", className), ...props });
|
|
18
188
|
const barColors = {
|
|
19
189
|
completed: "bg-positive1",
|
|
20
190
|
in_progress: "bg-warning1",
|
|
@@ -39,7 +209,11 @@ const TaskListProgress = ({ tasks, className, ...props }) => {
|
|
|
39
209
|
children: tasks.map((task) => /* @__PURE__ */ jsx(
|
|
40
210
|
"span",
|
|
41
211
|
{
|
|
42
|
-
className: cn(
|
|
212
|
+
className: cn(
|
|
213
|
+
"h-full w-0.5 min-w-px shrink rounded-full transition-colors",
|
|
214
|
+
taskGraphMotion,
|
|
215
|
+
barColors[task.status]
|
|
216
|
+
)
|
|
43
217
|
},
|
|
44
218
|
task.id
|
|
45
219
|
))
|
|
@@ -55,69 +229,211 @@ const TaskListProgress = ({ tasks, className, ...props }) => {
|
|
|
55
229
|
] })
|
|
56
230
|
] }) });
|
|
57
231
|
};
|
|
58
|
-
const icons = {
|
|
59
|
-
completed: /* @__PURE__ */ jsx(CheckCircle2, { className: "size-3.5 shrink-0 text-positive1" }),
|
|
60
|
-
in_progress: /* @__PURE__ */ jsx(Loader2, { className: "size-3.5 shrink-0 text-warning1 motion-safe:animate-spin" }),
|
|
61
|
-
pending: /* @__PURE__ */ jsx(Circle, { className: "size-3.5 shrink-0 text-muted-foreground" })
|
|
62
|
-
};
|
|
63
232
|
const statusLabels = {
|
|
64
233
|
completed: "Completed",
|
|
65
234
|
in_progress: "In progress",
|
|
66
235
|
pending: "Pending"
|
|
67
236
|
};
|
|
68
|
-
const
|
|
69
|
-
completed: "
|
|
70
|
-
in_progress: "
|
|
71
|
-
pending: "
|
|
237
|
+
const ringClasses = {
|
|
238
|
+
completed: "size-[7px] border-accent1 bg-card",
|
|
239
|
+
in_progress: "size-2 border-accent6 bg-accent6/25",
|
|
240
|
+
pending: "size-1.5 border-muted-foreground/45 bg-card"
|
|
72
241
|
};
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
242
|
+
const TaskListStatusIcon = ({ status, className, ...props }) => /* @__PURE__ */ jsx(
|
|
243
|
+
"span",
|
|
244
|
+
{
|
|
245
|
+
role: "img",
|
|
246
|
+
"aria-label": statusLabels[status],
|
|
247
|
+
className: cn("grid size-3 shrink-0 place-items-center rounded-full", className),
|
|
248
|
+
...props,
|
|
249
|
+
children: /* @__PURE__ */ jsx(
|
|
250
|
+
"span",
|
|
251
|
+
{
|
|
252
|
+
className: cn(
|
|
253
|
+
"rounded-full border-[1.5px] transition-[width,height,border-color,background-color]",
|
|
254
|
+
taskGraphMotion,
|
|
255
|
+
ringClasses[status]
|
|
256
|
+
)
|
|
257
|
+
}
|
|
258
|
+
)
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
const TaskListLabel = ({ task }) => {
|
|
262
|
+
const active = task.status === "in_progress";
|
|
263
|
+
return /* @__PURE__ */ jsxs("span", { className: "grid min-w-0 text-caption", children: [
|
|
264
|
+
/* @__PURE__ */ jsx(
|
|
265
|
+
"span",
|
|
266
|
+
{
|
|
267
|
+
"aria-hidden": active,
|
|
268
|
+
className: cn(
|
|
269
|
+
"col-start-1 row-start-1 truncate transition-[opacity,color,translate,filter]",
|
|
270
|
+
taskGraphMotion,
|
|
271
|
+
task.status === "pending" ? "text-muted-foreground/70" : "text-muted-foreground",
|
|
272
|
+
active ? "-translate-y-1 opacity-0 blur-[2px]" : "translate-y-0 opacity-100 blur-none"
|
|
273
|
+
),
|
|
274
|
+
children: /* @__PURE__ */ jsx(
|
|
275
|
+
"span",
|
|
276
|
+
{
|
|
277
|
+
className: cn(
|
|
278
|
+
"bg-[linear-gradient(currentColor,currentColor)] bg-no-repeat transition-[background-size]",
|
|
279
|
+
taskGraphMotion,
|
|
280
|
+
task.status === "completed" ? "bg-size-[100%_1px] bg-position-[left_55%]" : "bg-size-[0%_1px] bg-position-[right_55%]"
|
|
281
|
+
),
|
|
282
|
+
children: task.content
|
|
283
|
+
}
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
),
|
|
287
|
+
/* @__PURE__ */ jsx(
|
|
288
|
+
"span",
|
|
289
|
+
{
|
|
290
|
+
"aria-hidden": !active,
|
|
291
|
+
className: cn(
|
|
292
|
+
"col-start-1 row-start-1 truncate bg-linear-to-r from-accent6 to-foreground to-30% bg-size-[200%_100%] bg-clip-text font-medium text-transparent transition-[opacity,translate,filter,background-position] dark:from-[color-mix(in_oklab,var(--accent6)_60%,var(--foreground))]",
|
|
293
|
+
taskGraphMotion,
|
|
294
|
+
active ? "translate-y-0 bg-position-[0%_0] opacity-100 blur-none" : "translate-y-1 bg-position-[100%_0] opacity-0 blur-[2px]"
|
|
295
|
+
),
|
|
296
|
+
children: task.activeForm
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
] });
|
|
300
|
+
};
|
|
301
|
+
const TaskListRow = ({ task, className, style, ...props }) => /* @__PURE__ */ jsxs("li", { className: cn("relative flex items-center", className), style: { height: TASK_ROW_HEIGHT, ...style }, ...props, children: [
|
|
302
|
+
/* @__PURE__ */ jsx(
|
|
303
|
+
TaskListStatusIcon,
|
|
304
|
+
{
|
|
305
|
+
status: task.status,
|
|
306
|
+
className: cn(
|
|
307
|
+
taskGraphNodeClass,
|
|
308
|
+
taskGraphMotion,
|
|
309
|
+
taskGraphLaneShift[task.status],
|
|
310
|
+
"group-data-collapsed/task-list:translate-x-0"
|
|
311
|
+
)
|
|
312
|
+
}
|
|
313
|
+
),
|
|
314
|
+
/* @__PURE__ */ jsx(
|
|
315
|
+
"span",
|
|
316
|
+
{
|
|
317
|
+
className: cn(
|
|
318
|
+
"flex min-w-0 transition-[padding-left]",
|
|
319
|
+
taskGraphMotion,
|
|
320
|
+
task.status === "in_progress" ? "pl-10 group-data-collapsed/task-list:pl-6" : "pl-6"
|
|
321
|
+
),
|
|
322
|
+
children: /* @__PURE__ */ jsx(TaskListLabel, { task })
|
|
323
|
+
}
|
|
324
|
+
)
|
|
86
325
|
] });
|
|
87
|
-
const
|
|
88
|
-
|
|
326
|
+
const LIST_INSET_Y = 10;
|
|
327
|
+
const edgeFades = "mask-no-repeat [--fade-bottom:0.875rem] [--fade-top:0.875rem] [mask-composite:subtract,add] [mask-image:linear-gradient(black,black),linear-gradient(to_bottom,black_40%,transparent),linear-gradient(to_top,black_40%,transparent)] [mask-position:0_0,0_0,0_100%] [mask-size:100%_100%,100%_var(--fade-top),100%_var(--fade-bottom)]";
|
|
328
|
+
const edgeFadesWhenScrolled = "data-[overflow-y-end]:[--fade-bottom:2rem] data-[overflow-y-start]:[--fade-top:2rem]";
|
|
329
|
+
const focusedTaskIndex = (tasks) => {
|
|
330
|
+
const activeIndex = tasks.findIndex((task) => task.status === "in_progress");
|
|
331
|
+
if (activeIndex >= 0) return activeIndex;
|
|
332
|
+
const pendingIndex = tasks.findIndex((task) => task.status === "pending");
|
|
333
|
+
if (pendingIndex >= 0) return pendingIndex;
|
|
334
|
+
return tasks.length - 1;
|
|
89
335
|
};
|
|
90
336
|
const TaskList = ({
|
|
91
337
|
tasks,
|
|
92
|
-
title = "Tasks",
|
|
93
|
-
hideWhenEmpty = true,
|
|
94
338
|
hideWhenComplete = true,
|
|
95
339
|
scrollActiveIntoView = true,
|
|
96
340
|
defaultOpen = true,
|
|
341
|
+
className,
|
|
97
342
|
...props
|
|
98
343
|
}) => {
|
|
99
344
|
const [open, setOpen] = useState(defaultOpen);
|
|
100
|
-
const
|
|
101
|
-
const summaryTask = activeTask ?? tasks.find((task) => task.status === "pending");
|
|
345
|
+
const listId = useId();
|
|
102
346
|
const completed = tasks.filter((task) => task.status === "completed").length;
|
|
103
347
|
const total = tasks.length;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
348
|
+
const focusIndex = focusedTaskIndex(tasks);
|
|
349
|
+
const windowHeight = taskWindowHeight(total, open);
|
|
350
|
+
const { viewportRef, glideForOpen } = useFocusedRowScroll({
|
|
351
|
+
focusIndex,
|
|
352
|
+
rowCount: total,
|
|
353
|
+
open,
|
|
354
|
+
followFocus: scrollActiveIntoView
|
|
355
|
+
});
|
|
356
|
+
const changeOpen = (nextOpen) => {
|
|
357
|
+
setOpen(nextOpen);
|
|
358
|
+
glideForOpen(nextOpen);
|
|
359
|
+
};
|
|
360
|
+
if (total === 0 || hideWhenComplete && completed === total) return null;
|
|
361
|
+
return /* @__PURE__ */ jsxs(
|
|
362
|
+
TaskListContainer,
|
|
363
|
+
{
|
|
364
|
+
"aria-label": "Task list",
|
|
365
|
+
"data-testid": "task-list",
|
|
366
|
+
"data-collapsed": open ? void 0 : "",
|
|
367
|
+
onClick: open ? void 0 : () => changeOpen(true),
|
|
368
|
+
className: cn("group/task-list relative", !open && "cursor-pointer", className),
|
|
369
|
+
...props,
|
|
370
|
+
children: [
|
|
371
|
+
/* @__PURE__ */ jsx(
|
|
372
|
+
ScrollArea,
|
|
373
|
+
{
|
|
374
|
+
id: listId,
|
|
375
|
+
maxHeight: `${windowHeight + 2 * LIST_INSET_Y}px`,
|
|
376
|
+
mask: false,
|
|
377
|
+
viewPortClassName: cn(
|
|
378
|
+
edgeFades,
|
|
379
|
+
"transition-[max-height,mask-size]",
|
|
380
|
+
taskGraphMotion,
|
|
381
|
+
open ? edgeFadesWhenScrolled : "overflow-hidden!"
|
|
382
|
+
),
|
|
383
|
+
viewportRef,
|
|
384
|
+
children: /* @__PURE__ */ jsx("div", { className: "px-3", style: { paddingBlock: LIST_INSET_Y }, children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
385
|
+
/* @__PURE__ */ jsx(TaskGraphLines, { statuses: tasks.map((task) => task.status), singleLane: !open }),
|
|
386
|
+
/* @__PURE__ */ jsx("ul", { children: tasks.map((task, index) => {
|
|
387
|
+
const clippedAway = !open && index !== focusIndex;
|
|
388
|
+
return /* @__PURE__ */ jsx(TaskListRow, { task, inert: clippedAway, "aria-hidden": clippedAway }, task.id);
|
|
389
|
+
}) })
|
|
390
|
+
] }) })
|
|
391
|
+
}
|
|
392
|
+
),
|
|
393
|
+
/* @__PURE__ */ jsxs("div", { className: "absolute top-2.5 right-3 flex h-7 items-center bg-linear-to-r from-transparent to-card to-[1.5rem] pl-6", children: [
|
|
394
|
+
/* @__PURE__ */ jsx(
|
|
395
|
+
"div",
|
|
396
|
+
{
|
|
397
|
+
inert: open,
|
|
398
|
+
"aria-hidden": open,
|
|
399
|
+
className: cn(
|
|
400
|
+
"grid transition-[grid-template-columns,opacity]",
|
|
401
|
+
taskGraphMotion,
|
|
402
|
+
open ? "grid-cols-[0fr] opacity-0" : "grid-cols-[1fr] opacity-100"
|
|
403
|
+
),
|
|
404
|
+
children: /* @__PURE__ */ jsx("div", { className: "min-w-0 overflow-hidden", children: /* @__PURE__ */ jsx(TaskListProgress, { tasks, className: "mr-2" }) })
|
|
405
|
+
}
|
|
406
|
+
),
|
|
407
|
+
/* @__PURE__ */ jsx(
|
|
408
|
+
"button",
|
|
409
|
+
{
|
|
410
|
+
type: "button",
|
|
411
|
+
"aria-label": open ? "Collapse tasks" : "Show all tasks",
|
|
412
|
+
"aria-expanded": open,
|
|
413
|
+
"aria-controls": listId,
|
|
414
|
+
onClick: (event) => {
|
|
415
|
+
event.stopPropagation();
|
|
416
|
+
changeOpen(!open);
|
|
417
|
+
},
|
|
418
|
+
className: cn(
|
|
419
|
+
"grid size-6 cursor-pointer place-items-center rounded-md text-muted-foreground hover:text-foreground",
|
|
420
|
+
transitions.colors,
|
|
421
|
+
focusRing.visible,
|
|
422
|
+
!open && "group-hover/task-list:text-foreground"
|
|
423
|
+
),
|
|
424
|
+
children: /* @__PURE__ */ jsx(
|
|
425
|
+
ChevronDown,
|
|
426
|
+
{
|
|
427
|
+
className: cn("size-3.5 transition-[rotate]", taskGraphMotion, open ? "rotate-180" : "rotate-0")
|
|
428
|
+
}
|
|
429
|
+
)
|
|
430
|
+
}
|
|
431
|
+
)
|
|
432
|
+
] })
|
|
433
|
+
]
|
|
434
|
+
}
|
|
435
|
+
);
|
|
120
436
|
};
|
|
121
437
|
|
|
122
|
-
export { TaskList, TaskListContainer,
|
|
438
|
+
export { TaskList, TaskListContainer, TaskListProgress, TaskListRow, TaskListStatusIcon };
|
|
123
439
|
//# sourceMappingURL=task-list.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-list.es.js","sources":["../../../src/ds/components/ai/task-list/task-list.tsx"],"sourcesContent":["import type { TaskItem } from '@mastra/core/signals';\nimport { CheckCircle2, ChevronRight, Circle, ListChecks, Loader2 } from 'lucide-react';\nimport { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { ScrollArea } from '@/ds/components/ScrollArea';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { cn } from '@/lib/utils';\n\nexport type TaskListItem = TaskItem;\n\nexport const TaskListContainer = ({ className, ...props }: ComponentProps<'section'>) => (\n <section className={cn(raisedSurfaceStyle, 'rounded-2xl px-3 py-2.5', className)} {...props} />\n);\n\nexport const TaskListHeader = ({ className, ...props }: ComponentProps<typeof CollapsibleTrigger>) => (\n <CollapsibleTrigger\n className={cn('flex w-full cursor-pointer items-center gap-2 text-left text-muted-foreground', className)}\n {...props}\n />\n);\n\nconst barColors: Record<TaskListItem['status'], string> = {\n completed: 'bg-positive1',\n in_progress: 'bg-warning1',\n pending: 'bg-fill-hover',\n};\n\nexport interface TaskListProgressProps extends Omit<ComponentProps<'span'>, 'children'> {\n tasks: TaskListItem[];\n}\n\nexport const TaskListProgress = ({ tasks, className, ...props }: TaskListProgressProps) => {\n const completed = tasks.filter(task => task.status === 'completed').length;\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger\n render={\n <span\n role=\"progressbar\"\n aria-label=\"Task completion\"\n aria-valuemin={0}\n aria-valuemax={tasks.length}\n aria-valuenow={completed}\n className={cn('ml-auto flex h-4 w-fit max-w-40 shrink-0 items-center gap-1 overflow-hidden', className)}\n {...props}\n >\n {tasks.map(task => (\n <span\n key={task.id}\n className={cn('h-full w-0.5 min-w-px shrink rounded-full', barColors[task.status])}\n />\n ))}\n </span>\n }\n />\n <TooltipContent>\n {completed}/{tasks.length} completed\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nconst icons: Record<TaskListItem['status'], ReactNode> = {\n completed: <CheckCircle2 className=\"size-3.5 shrink-0 text-positive1\" />,\n in_progress: <Loader2 className=\"size-3.5 shrink-0 text-warning1 motion-safe:animate-spin\" />,\n pending: <Circle className=\"size-3.5 shrink-0 text-muted-foreground\" />,\n};\n\nconst statusLabels: Record<TaskListItem['status'], string> = {\n completed: 'Completed',\n in_progress: 'In progress',\n pending: 'Pending',\n};\n\nconst textClasses: Record<TaskListItem['status'], string> = {\n completed: 'text-muted-foreground line-through',\n in_progress: 'text-column text-warning1',\n pending: 'text-foreground',\n};\n\nconst taskLabel = (task: TaskListItem) => (task.status === 'in_progress' ? task.activeForm : task.content);\n\nexport interface TaskListStatusIconProps extends ComponentProps<'span'> {\n status: TaskListItem['status'];\n}\n\nexport const TaskListStatusIcon = ({ status, className, ...props }: TaskListStatusIconProps) => (\n <span aria-label={statusLabels[status]} className={cn('flex pt-0.5', className)} {...props}>\n {icons[status]}\n </span>\n);\n\nexport interface TaskListRowProps extends ComponentProps<'li'> {\n task: TaskListItem;\n}\n\nexport const TaskListRow = ({ task, className, ...props }: TaskListRowProps) => (\n <li className={cn('flex items-start gap-2 py-0.5', className)} {...props}>\n <TaskListStatusIcon status={task.status} />\n <span className={cn('text-caption', textClasses[task.status])}>{taskLabel(task)}</span>\n </li>\n);\n\nconst TaskListSummary = ({ task }: { task: TaskListItem }) => (\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n <TaskListStatusIcon status={task.status} className=\"pt-0\" />\n <span className={cn('truncate text-caption', textClasses[task.status])}>{taskLabel(task)}</span>\n </span>\n);\n\nconst TaskListTitle = ({ title }: { title: ReactNode }) => (\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ListChecks className=\"size-4 shrink-0 text-accent6\" />\n <span className=\"truncate text-column text-foreground\">{title}</span>\n </span>\n);\n\nconst scrollTaskIntoView = (node: HTMLLIElement | null) => {\n if (typeof node?.scrollIntoView === 'function') node.scrollIntoView({ block: 'nearest' });\n};\n\nexport interface TaskListProps extends Omit<ComponentProps<typeof TaskListContainer>, 'children' | 'title'> {\n tasks: TaskListItem[];\n title?: ReactNode;\n hideWhenEmpty?: boolean;\n hideWhenComplete?: boolean;\n scrollActiveIntoView?: boolean;\n defaultOpen?: boolean;\n}\n\nexport const TaskList = ({\n tasks,\n title = 'Tasks',\n hideWhenEmpty = true,\n hideWhenComplete = true,\n scrollActiveIntoView = true,\n defaultOpen = true,\n ...props\n}: TaskListProps) => {\n const [open, setOpen] = useState(defaultOpen);\n const activeTask = tasks.find(task => task.status === 'in_progress');\n const summaryTask = activeTask ?? tasks.find(task => task.status === 'pending');\n const completed = tasks.filter(task => task.status === 'completed').length;\n const total = tasks.length;\n\n if ((hideWhenEmpty && total === 0) || (hideWhenComplete && total > 0 && completed === total)) return null;\n\n return (\n <TaskListContainer aria-label=\"Task list\" data-testid=\"task-list\" {...props}>\n <Collapsible open={open} onOpenChange={setOpen}>\n <TaskListHeader>\n <ChevronRight className=\"size-3.5 shrink-0\" />\n {open || !summaryTask ? <TaskListTitle title={title} /> : <TaskListSummary task={summaryTask} />}\n <TaskListProgress tasks={tasks} />\n </TaskListHeader>\n <CollapsibleContent>\n <ScrollArea maxHeight=\"8rem\" viewPortClassName=\"pr-1\" className=\"mt-1\">\n <ul className=\"space-y-1\">\n {tasks.map(task => (\n <TaskListRow\n key={task.id}\n ref={scrollActiveIntoView && task.id === activeTask?.id ? scrollTaskIntoView : undefined}\n task={task}\n />\n ))}\n </ul>\n </ScrollArea>\n </CollapsibleContent>\n </Collapsible>\n </TaskListContainer>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"task-list.es.js","sources":["../../../src/ds/components/ai/task-list/task-graph-node.ts","../../../src/ds/components/ai/task-list/task-graph.tsx","../../../src/ds/components/ai/task-list/use-focused-row-scroll.ts","../../../src/ds/components/ai/task-list/task-list.tsx"],"sourcesContent":["import type { TaskItem } from '@mastra/core/signals';\n\ntype TaskStatus = TaskItem['status'];\n\nexport const TASK_ROW_HEIGHT = 28;\nexport const TASK_GRAPH_MOTION_MS = 600;\n\n/* One timing for nodes and lines, so a line end never detaches from its node mid-move. */\nexport const taskGraphMotion = 'duration-[600ms] ease-(--resize-ease) motion-reduce:transition-none';\n\n/* left-0.5 centres the 12px node on the trunk (x=8); translate-x-4 lands it on the lane (x=24). */\nexport const taskGraphNodeClass = 'absolute top-1/2 left-0.5 -translate-y-1/2 transition-[translate]';\nexport const taskGraphLaneShift: Record<TaskStatus, string> = {\n completed: 'translate-x-0',\n in_progress: 'translate-x-4',\n pending: 'translate-x-0',\n};\n","import type { TaskItem } from '@mastra/core/signals';\nimport { useId } from 'react';\nimport { TASK_ROW_HEIGHT, taskGraphMotion } from './task-graph-node';\nimport { cn } from '@/lib/utils';\n\ntype TaskStatus = TaskItem['status'];\n\nconst TRUNK_X = 8;\nconst LANE_X = 24;\n\nconst laneX = (status: TaskStatus, singleLane: boolean) => (status === 'in_progress' && !singleLane ? LANE_X : TRUNK_X);\nconst rowCenter = (index: number) => index * TASK_ROW_HEIGHT + TASK_ROW_HEIGHT / 2;\n\nconst ink: Record<TaskStatus, string> = {\n completed: 'var(--accent1)',\n in_progress: 'var(--accent6)',\n pending: 'color-mix(in oklab, var(--muted-foreground) 45%, transparent)',\n};\n\nconst connectorPathData = (upper: TaskStatus, lower: TaskStatus, index: number, singleLane: boolean) => {\n const fromY = rowCenter(index);\n const toY = rowCenter(index + 1);\n const midY = (fromY + toY) / 2;\n const fromX = laneX(upper, singleLane);\n const toX = laneX(lower, singleLane);\n return `M ${fromX} ${fromY} C ${fromX} ${midY} ${toX} ${midY} ${toX} ${toY}`;\n};\n\ninterface TaskGraphSegmentProps {\n upper: TaskStatus;\n lower: TaskStatus;\n index: number;\n graphId: string;\n singleLane: boolean;\n}\n\nconst TaskGraphSegment = ({ upper, lower, index, graphId, singleLane }: TaskGraphSegmentProps) => {\n const pathData = connectorPathData(upper, lower, index, singleLane);\n const d = `path(\"${pathData}\")`;\n const reached = upper !== 'pending' && lower !== 'pending';\n const touchesActive = upper === 'in_progress' || lower === 'in_progress';\n\n return (\n <g>\n <path\n d={pathData}\n fill=\"none\"\n strokeWidth={1}\n mask={`url(#${graphId}-future)`}\n className={cn('transition-[d]', taskGraphMotion)}\n style={{ d, stroke: ink.pending }}\n />\n <path\n d={pathData}\n fill=\"none\"\n strokeWidth={1}\n pathLength={1}\n strokeDasharray=\"1 1\"\n className={cn('transition-[d,stroke-dashoffset,stroke]', taskGraphMotion)}\n style={{ d, strokeDashoffset: reached ? 0 : 1, stroke: touchesActive ? ink.in_progress : ink.completed }}\n />\n </g>\n );\n};\n\ninterface TaskGraphLinesProps {\n statuses: TaskStatus[];\n singleLane?: boolean;\n}\n\nexport const TaskGraphLines = ({ statuses, singleLane = false }: TaskGraphLinesProps) => {\n const graphId = `task-graph${useId().replace(/[^a-zA-Z0-9]/g, '')}`;\n const height = statuses.length * TASK_ROW_HEIGHT;\n const maskBox = { x: -8, y: 0, width: LANE_X + 24, height };\n\n return (\n <svg\n aria-hidden\n width={LANE_X + 8}\n height={height}\n className=\"pointer-events-none absolute top-0 left-0 overflow-visible\"\n >\n <defs>\n <linearGradient id={`${graphId}-fade`} gradientUnits=\"userSpaceOnUse\" x1={0} x2={0} y1={0} y2={height}>\n <stop offset=\"0\" stopColor=\"white\" stopOpacity={1} />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity={0.15} />\n </linearGradient>\n <mask id={`${graphId}-future`} maskUnits=\"userSpaceOnUse\" {...maskBox}>\n <rect {...maskBox} fill={`url(#${graphId}-fade)`} />\n </mask>\n <linearGradient id={`${graphId}-gap`} x1={0} x2={0} y1={0} y2={1}>\n <stop offset=\"0.2\" stopColor=\"white\" stopOpacity={0} />\n <stop offset=\"0.4\" stopColor=\"white\" stopOpacity={1} />\n <stop offset=\"0.6\" stopColor=\"white\" stopOpacity={1} />\n <stop offset=\"0.8\" stopColor=\"white\" stopOpacity={0} />\n </linearGradient>\n <pattern\n id={`${graphId}-gaps`}\n patternUnits=\"userSpaceOnUse\"\n x={maskBox.x}\n y={TASK_ROW_HEIGHT / 2}\n width={maskBox.width}\n height={TASK_ROW_HEIGHT}\n >\n <rect width={maskBox.width} height={TASK_ROW_HEIGHT} fill={`url(#${graphId}-gap)`} />\n </pattern>\n <mask id={`${graphId}-between-nodes`} maskUnits=\"userSpaceOnUse\" {...maskBox}>\n <rect {...maskBox} fill={`url(#${graphId}-gaps)`} />\n </mask>\n </defs>\n <g mask={`url(#${graphId}-between-nodes)`}>\n {statuses.map((status, index) => {\n const next = statuses[index + 1];\n if (!next) return null;\n return (\n <TaskGraphSegment\n key={index}\n upper={status}\n lower={next}\n index={index}\n graphId={graphId}\n singleLane={singleLane}\n />\n );\n })}\n </g>\n </svg>\n );\n};\n","import { useEffect, useEffectEvent, useRef } from 'react';\nimport { TASK_GRAPH_MOTION_MS, TASK_ROW_HEIGHT } from './task-graph-node';\n\nconst prefersReducedMotion = () => window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n\nconst easeOutQuint = (progress: number) => 1 - (1 - progress) ** 5;\n\n/* Scroll position is not a CSS property, so the glide is tweened to match the max-height transition. */\nconst glideScrollTop = (viewport: HTMLElement, top: number) => {\n const start = viewport.scrollTop;\n const distance = top - start;\n if (prefersReducedMotion()) {\n viewport.scrollTo({ top });\n return () => {};\n }\n let frame = 0;\n const startedAt = performance.now();\n const step = (now: number) => {\n const progress = Math.min((now - startedAt) / TASK_GRAPH_MOTION_MS, 1);\n viewport.scrollTo({ top: start + distance * easeOutQuint(progress) });\n if (progress < 1) frame = requestAnimationFrame(step);\n };\n frame = requestAnimationFrame(step);\n return () => cancelAnimationFrame(frame);\n};\n\nconst revealedScrollTop = (rowIndex: number, currentTop: number, windowHeight: number) => {\n const rowTop = rowIndex * TASK_ROW_HEIGHT;\n const rowBottom = rowTop + TASK_ROW_HEIGHT;\n if (rowTop < currentTop) return rowTop;\n if (rowBottom > currentTop + windowHeight) return rowBottom - windowHeight;\n return currentTop;\n};\n\nconst EXPANDED_VISIBLE_ROWS = 4.5;\n\nexport const taskWindowHeight = (rowCount: number, open: boolean) =>\n open ? Math.min(rowCount, EXPANDED_VISIBLE_ROWS) * TASK_ROW_HEIGHT : TASK_ROW_HEIGHT;\n\ninterface ScrollTarget {\n focusIndex: number;\n windowHeight: number;\n open: boolean;\n followFocus: boolean;\n}\n\nconst wantedScrollTop = (currentTop: number, { focusIndex, windowHeight, open, followFocus }: ScrollTarget) => {\n if (!open) return focusIndex * TASK_ROW_HEIGHT;\n if (!followFocus) return currentTop;\n return revealedScrollTop(focusIndex, currentTop, windowHeight);\n};\n\nconst clampScrollTop = (top: number, contentHeight: number, windowHeight: number) =>\n Math.min(Math.max(top, 0), Math.max(contentHeight - windowHeight, 0));\n\ninterface FocusedRowScrollOptions {\n focusIndex: number;\n rowCount: number;\n open: boolean;\n followFocus: boolean;\n}\n\nexport const useFocusedRowScroll = ({ focusIndex, rowCount, open, followFocus }: FocusedRowScrollOptions) => {\n const viewportRef = useRef<HTMLDivElement>(null);\n const cancelGlide = useRef<() => void>(undefined);\n const placedOnce = useRef(false);\n\n const glideForOpen = (nextOpen: boolean) => {\n const viewport = viewportRef.current;\n if (!viewport || typeof viewport.scrollTo !== 'function') return;\n const windowHeight = taskWindowHeight(rowCount, nextOpen);\n const wantedTop = wantedScrollTop(viewport.scrollTop, { focusIndex, windowHeight, open: nextOpen, followFocus });\n const top = clampScrollTop(wantedTop, rowCount * TASK_ROW_HEIGHT, windowHeight);\n cancelGlide.current?.();\n if (!placedOnce.current) {\n placedOnce.current = true;\n viewport.scrollTo({ top });\n return;\n }\n if (top !== viewport.scrollTop) cancelGlide.current = glideScrollTop(viewport, top);\n };\n\n const followFocusedRow = useEffectEvent(() => glideForOpen(open));\n\n useEffect(() => {\n followFocusedRow();\n return () => cancelGlide.current?.();\n }, [focusIndex]);\n\n return { viewportRef, glideForOpen };\n};\n","import type { TaskItem } from '@mastra/core/signals';\nimport { ChevronDown } from 'lucide-react';\nimport { useId, useState } from 'react';\nimport type { ComponentProps } from 'react';\nimport { TaskGraphLines } from './task-graph';\nimport { TASK_ROW_HEIGHT, taskGraphLaneShift, taskGraphMotion, taskGraphNodeClass } from './task-graph-node';\nimport { taskWindowHeight, useFocusedRowScroll } from './use-focused-row-scroll';\nimport { ScrollArea } from '@/ds/components/ScrollArea';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRing, transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type TaskListItem = TaskItem;\n\nexport const TaskListContainer = ({ className, ...props }: ComponentProps<'section'>) => (\n <section className={cn(raisedSurfaceStyle, 'overflow-hidden rounded-2xl', className)} {...props} />\n);\n\nconst barColors: Record<TaskListItem['status'], string> = {\n completed: 'bg-positive1',\n in_progress: 'bg-warning1',\n pending: 'bg-fill-hover',\n};\n\nexport interface TaskListProgressProps extends Omit<ComponentProps<'span'>, 'children'> {\n tasks: TaskListItem[];\n}\n\nexport const TaskListProgress = ({ tasks, className, ...props }: TaskListProgressProps) => {\n const completed = tasks.filter(task => task.status === 'completed').length;\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger\n render={\n <span\n role=\"progressbar\"\n aria-label=\"Task completion\"\n aria-valuemin={0}\n aria-valuemax={tasks.length}\n aria-valuenow={completed}\n className={cn('ml-auto flex h-4 w-fit max-w-40 shrink-0 items-center gap-1 overflow-hidden', className)}\n {...props}\n >\n {tasks.map(task => (\n <span\n key={task.id}\n className={cn(\n 'h-full w-0.5 min-w-px shrink rounded-full transition-colors',\n taskGraphMotion,\n barColors[task.status],\n )}\n />\n ))}\n </span>\n }\n />\n <TooltipContent>\n {completed}/{tasks.length} completed\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nconst statusLabels: Record<TaskListItem['status'], string> = {\n completed: 'Completed',\n in_progress: 'In progress',\n pending: 'Pending',\n};\n\nconst ringClasses: Record<TaskListItem['status'], string> = {\n completed: 'size-[7px] border-accent1 bg-card',\n in_progress: 'size-2 border-accent6 bg-accent6/25',\n pending: 'size-1.5 border-muted-foreground/45 bg-card',\n};\n\nexport interface TaskListStatusIconProps extends ComponentProps<'span'> {\n status: TaskListItem['status'];\n}\n\nexport const TaskListStatusIcon = ({ status, className, ...props }: TaskListStatusIconProps) => (\n <span\n role=\"img\"\n aria-label={statusLabels[status]}\n className={cn('grid size-3 shrink-0 place-items-center rounded-full', className)}\n {...props}\n >\n <span\n className={cn(\n 'rounded-full border-[1.5px] transition-[width,height,border-color,background-color]',\n taskGraphMotion,\n ringClasses[status],\n )}\n />\n </span>\n);\n\nconst TaskListLabel = ({ task }: { task: TaskListItem }) => {\n const active = task.status === 'in_progress';\n return (\n <span className=\"grid min-w-0 text-caption\">\n <span\n aria-hidden={active}\n className={cn(\n 'col-start-1 row-start-1 truncate transition-[opacity,color,translate,filter]',\n taskGraphMotion,\n task.status === 'pending' ? 'text-muted-foreground/70' : 'text-muted-foreground',\n active ? '-translate-y-1 opacity-0 blur-[2px]' : 'translate-y-0 opacity-100 blur-none',\n )}\n >\n <span\n className={cn(\n 'bg-[linear-gradient(currentColor,currentColor)] bg-no-repeat transition-[background-size]',\n taskGraphMotion,\n task.status === 'completed'\n ? 'bg-size-[100%_1px] bg-position-[left_55%]'\n : 'bg-size-[0%_1px] bg-position-[right_55%]',\n )}\n >\n {task.content}\n </span>\n </span>\n <span\n aria-hidden={!active}\n className={cn(\n 'col-start-1 row-start-1 truncate bg-linear-to-r from-accent6 to-foreground to-30% bg-size-[200%_100%] bg-clip-text font-medium text-transparent transition-[opacity,translate,filter,background-position] dark:from-[color-mix(in_oklab,var(--accent6)_60%,var(--foreground))]',\n taskGraphMotion,\n active\n ? 'translate-y-0 bg-position-[0%_0] opacity-100 blur-none'\n : 'translate-y-1 bg-position-[100%_0] opacity-0 blur-[2px]',\n )}\n >\n {task.activeForm}\n </span>\n </span>\n );\n};\n\nexport interface TaskListRowProps extends ComponentProps<'li'> {\n task: TaskListItem;\n}\n\nexport const TaskListRow = ({ task, className, style, ...props }: TaskListRowProps) => (\n <li className={cn('relative flex items-center', className)} style={{ height: TASK_ROW_HEIGHT, ...style }} {...props}>\n <TaskListStatusIcon\n status={task.status}\n className={cn(\n taskGraphNodeClass,\n taskGraphMotion,\n taskGraphLaneShift[task.status],\n 'group-data-collapsed/task-list:translate-x-0',\n )}\n />\n <span\n className={cn(\n 'flex min-w-0 transition-[padding-left]',\n taskGraphMotion,\n task.status === 'in_progress' ? 'pl-10 group-data-collapsed/task-list:pl-6' : 'pl-6',\n )}\n >\n <TaskListLabel task={task} />\n </span>\n </li>\n);\n\nconst LIST_INSET_Y = 10;\n\n/* A full layer minus one fade per edge; the fades are sized by mask-size, so their depth animates. */\nconst edgeFades =\n 'mask-no-repeat [--fade-bottom:0.875rem] [--fade-top:0.875rem] [mask-composite:subtract,add] [mask-image:linear-gradient(black,black),linear-gradient(to_bottom,black_40%,transparent),linear-gradient(to_top,black_40%,transparent)] [mask-position:0_0,0_0,0_100%] [mask-size:100%_100%,100%_var(--fade-top),100%_var(--fade-bottom)]';\nconst edgeFadesWhenScrolled = 'data-[overflow-y-end]:[--fade-bottom:2rem] data-[overflow-y-start]:[--fade-top:2rem]';\n\nconst focusedTaskIndex = (tasks: TaskListItem[]) => {\n const activeIndex = tasks.findIndex(task => task.status === 'in_progress');\n if (activeIndex >= 0) return activeIndex;\n const pendingIndex = tasks.findIndex(task => task.status === 'pending');\n if (pendingIndex >= 0) return pendingIndex;\n return tasks.length - 1;\n};\n\nexport interface TaskListProps extends Omit<ComponentProps<typeof TaskListContainer>, 'children'> {\n tasks: TaskListItem[];\n hideWhenComplete?: boolean;\n scrollActiveIntoView?: boolean;\n defaultOpen?: boolean;\n}\n\nexport const TaskList = ({\n tasks,\n hideWhenComplete = true,\n scrollActiveIntoView = true,\n defaultOpen = true,\n className,\n ...props\n}: TaskListProps) => {\n const [open, setOpen] = useState(defaultOpen);\n const listId = useId();\n const completed = tasks.filter(task => task.status === 'completed').length;\n const total = tasks.length;\n const focusIndex = focusedTaskIndex(tasks);\n const windowHeight = taskWindowHeight(total, open);\n const { viewportRef, glideForOpen } = useFocusedRowScroll({\n focusIndex,\n rowCount: total,\n open,\n followFocus: scrollActiveIntoView,\n });\n\n const changeOpen = (nextOpen: boolean) => {\n setOpen(nextOpen);\n glideForOpen(nextOpen);\n };\n\n if (total === 0 || (hideWhenComplete && completed === total)) return null;\n\n return (\n <TaskListContainer\n aria-label=\"Task list\"\n data-testid=\"task-list\"\n data-collapsed={open ? undefined : ''}\n onClick={open ? undefined : () => changeOpen(true)}\n className={cn('group/task-list relative', !open && 'cursor-pointer', className)}\n {...props}\n >\n <ScrollArea\n id={listId}\n maxHeight={`${windowHeight + 2 * LIST_INSET_Y}px`}\n mask={false}\n viewPortClassName={cn(\n edgeFades,\n 'transition-[max-height,mask-size]',\n taskGraphMotion,\n open ? edgeFadesWhenScrolled : 'overflow-hidden!',\n )}\n viewportRef={viewportRef}\n >\n <div className=\"px-3\" style={{ paddingBlock: LIST_INSET_Y }}>\n <div className=\"relative\">\n <TaskGraphLines statuses={tasks.map(task => task.status)} singleLane={!open} />\n <ul>\n {tasks.map((task, index) => {\n const clippedAway = !open && index !== focusIndex;\n return <TaskListRow key={task.id} task={task} inert={clippedAway} aria-hidden={clippedAway} />;\n })}\n </ul>\n </div>\n </div>\n </ScrollArea>\n <div className=\"absolute top-2.5 right-3 flex h-7 items-center bg-linear-to-r from-transparent to-card to-[1.5rem] pl-6\">\n <div\n inert={open}\n aria-hidden={open}\n className={cn(\n 'grid transition-[grid-template-columns,opacity]',\n taskGraphMotion,\n open ? 'grid-cols-[0fr] opacity-0' : 'grid-cols-[1fr] opacity-100',\n )}\n >\n <div className=\"min-w-0 overflow-hidden\">\n <TaskListProgress tasks={tasks} className=\"mr-2\" />\n </div>\n </div>\n <button\n type=\"button\"\n aria-label={open ? 'Collapse tasks' : 'Show all tasks'}\n aria-expanded={open}\n aria-controls={listId}\n onClick={event => {\n event.stopPropagation();\n changeOpen(!open);\n }}\n className={cn(\n 'grid size-6 cursor-pointer place-items-center rounded-md text-muted-foreground hover:text-foreground',\n transitions.colors,\n focusRing.visible,\n !open && 'group-hover/task-list:text-foreground',\n )}\n >\n <ChevronDown\n className={cn('size-3.5 transition-[rotate]', taskGraphMotion, open ? 'rotate-180' : 'rotate-0')}\n />\n </button>\n </div>\n </TaskListContainer>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const domains_chat_messages_signalData = require('./signal-data.cjs.js');
|
|
7
|
-
const chatNotification = require('../../../chat-notification-
|
|
7
|
+
const chatNotification = require('../../../chat-notification-HP18KxlS.cjs');
|
|
8
8
|
|
|
9
9
|
const getNotificationTitle = (signal) => {
|
|
10
10
|
const notification = domains_chat_messages_signalData.getNotificationMetadata(signal);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { getNotificationMetadata, formatSignalValue, signalContentsToText } from './signal-data.es.js';
|
|
3
|
-
import { C as ChatNotification } from '../../../chat-notification-
|
|
3
|
+
import { C as ChatNotification } from '../../../chat-notification-C4P2InUX.js';
|
|
4
4
|
|
|
5
5
|
const getNotificationTitle = (signal) => {
|
|
6
6
|
const notification = getNotificationMetadata(signal);
|
|
@@ -7,7 +7,7 @@ const lucideReact = require('lucide-react');
|
|
|
7
7
|
const React = require('react');
|
|
8
8
|
const domains_chat_messages_tripwireNotice = require('../tripwire-notice.cjs.js');
|
|
9
9
|
const domains_chat_messages_renderers_messageTextKind = require('./message-text-kind.cjs.js');
|
|
10
|
-
const Badge = require('../../../../Badge-
|
|
10
|
+
const Badge = require('../../../../Badge-DFNxcz-r.cjs');
|
|
11
11
|
const markdownRenderer = require('../../../../markdown-renderer-DtH58325.cjs');
|
|
12
12
|
const Notice = require('../../../../Notice-AUNd8fqT.cjs');
|
|
13
13
|
const icons_Icon = require('../../../../icons/Icon.cjs.js');
|
|
@@ -3,7 +3,7 @@ import { ChevronUpIcon, CheckCircleIcon } from 'lucide-react';
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { TripwireNotice } from '../tripwire-notice.es.js';
|
|
5
5
|
import { messageTextKind, errorMessage } from './message-text-kind.es.js';
|
|
6
|
-
import { B as Badge } from '../../../../Badge-
|
|
6
|
+
import { B as Badge } from '../../../../Badge-Bzn8Z-_I.js';
|
|
7
7
|
import { M as MarkdownRenderer } from '../../../../markdown-renderer-Ces7VyRK.js';
|
|
8
8
|
import { N as Notice } from '../../../../Notice-WT8G4OA6.js';
|
|
9
9
|
import { Icon } from '../../../../icons/Icon.es.js';
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const domains_chat_messages_notificationSignalNotice = require('./notification-signal-notice.cjs.js');
|
|
7
7
|
const domains_chat_messages_signalData = require('./signal-data.cjs.js');
|
|
8
|
-
const chatSignal = require('../../../chat-signal-
|
|
8
|
+
const chatSignal = require('../../../chat-signal-BP9RN6Rh.cjs');
|
|
9
9
|
|
|
10
10
|
const getStateLabel = (signal) => {
|
|
11
11
|
const state = domains_chat_messages_signalData.isRecord(signal.metadata?.state) ? signal.metadata.state : void 0;
|