@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.
Files changed (176) hide show
  1. package/dist/{Badge-TD55_qZJ.js → Badge-Bzn8Z-_I.js} +2 -2
  2. package/dist/Badge-Bzn8Z-_I.js.map +1 -0
  3. package/dist/{Badge-BEeYtjmv.cjs → Badge-DFNxcz-r.cjs} +2 -2
  4. package/dist/Badge-DFNxcz-r.cjs.map +1 -0
  5. package/dist/{ask-user-jDUt7hgT.js → ask-user-DtF4a9Vr.js} +2 -2
  6. package/dist/{ask-user-jDUt7hgT.js.map → ask-user-DtF4a9Vr.js.map} +1 -1
  7. package/dist/{ask-user-BPpgiE7k.cjs → ask-user-pPTuoPKI.cjs} +2 -2
  8. package/dist/{ask-user-BPpgiE7k.cjs.map → ask-user-pPTuoPKI.cjs.map} +1 -1
  9. package/dist/{chat-notification-CmdRGO_D.js → chat-notification-C4P2InUX.js} +2 -2
  10. package/dist/{chat-notification-CmdRGO_D.js.map → chat-notification-C4P2InUX.js.map} +1 -1
  11. package/dist/{chat-notification-DJykWtoj.cjs → chat-notification-HP18KxlS.cjs} +2 -2
  12. package/dist/{chat-notification-DJykWtoj.cjs.map → chat-notification-HP18KxlS.cjs.map} +1 -1
  13. package/dist/{chat-signal-xs3FkPts.cjs → chat-signal-BP9RN6Rh.cjs} +2 -2
  14. package/dist/{chat-signal-xs3FkPts.cjs.map → chat-signal-BP9RN6Rh.cjs.map} +1 -1
  15. package/dist/{chat-signal-Vg8pGXwH.js → chat-signal-CQnmFp3V.js} +2 -2
  16. package/dist/{chat-signal-Vg8pGXwH.js.map → chat-signal-CQnmFp3V.js.map} +1 -1
  17. package/dist/components/Badge.cjs.js +1 -1
  18. package/dist/components/Badge.es.js +1 -1
  19. package/dist/components/DataList.cjs.js +1 -1
  20. package/dist/components/DataList.es.js +1 -1
  21. package/dist/components/ItemList.cjs.js +1 -1
  22. package/dist/components/ItemList.es.js +1 -1
  23. package/dist/components/LogsDataList.cjs.js +1 -1
  24. package/dist/components/LogsDataList.es.js +1 -1
  25. package/dist/components/MetricsCard.cjs.js +1 -1
  26. package/dist/components/MetricsCard.es.js +1 -1
  27. package/dist/components/MetricsCardGroup.cjs.js +2 -11
  28. package/dist/components/MetricsCardGroup.cjs.js.map +1 -1
  29. package/dist/components/MetricsCardGroup.es.js +2 -11
  30. package/dist/components/MetricsCardGroup.es.js.map +1 -1
  31. package/dist/components/MetricsKpiCard.cjs.js +1 -1
  32. package/dist/components/MetricsKpiCard.es.js +1 -1
  33. package/dist/components/MetricsLineChart.cjs.js +2 -1
  34. package/dist/components/MetricsLineChart.cjs.js.map +1 -1
  35. package/dist/components/MetricsLineChart.es.js +1 -1
  36. package/dist/components/PageHeader.cjs.js +1 -1
  37. package/dist/components/PageHeader.es.js +1 -1
  38. package/dist/components/Workflow.cjs.js +1 -1
  39. package/dist/components/Workflow.es.js +1 -1
  40. package/dist/components/ai/ask-user.cjs.js +1 -1
  41. package/dist/components/ai/ask-user.es.js +1 -1
  42. package/dist/components/ai/chat-event.cjs.js +2 -2
  43. package/dist/components/ai/chat-event.es.js +3 -3
  44. package/dist/components/ai/plan.cjs.js +1 -1
  45. package/dist/components/ai/plan.es.js +1 -1
  46. package/dist/components/ai/task-list.cjs.js +370 -55
  47. package/dist/components/ai/task-list.cjs.js.map +1 -1
  48. package/dist/components/ai/task-list.es.js +374 -58
  49. package/dist/components/ai/task-list.es.js.map +1 -1
  50. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  51. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  52. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  53. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  54. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  55. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  56. package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
  57. package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
  58. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  59. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  60. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
  61. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
  62. package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
  63. package/dist/domains/logs/components/logs-list-view.es.js +1 -1
  64. package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
  65. package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
  66. package/dist/domains/metrics/components/latency-card-view.cjs.js +33 -24
  67. package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
  68. package/dist/domains/metrics/components/latency-card-view.es.js +34 -25
  69. package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
  70. package/dist/domains/metrics/components/memory-card-view.cjs.js +3 -3
  71. package/dist/domains/metrics/components/memory-card-view.cjs.js.map +1 -1
  72. package/dist/domains/metrics/components/memory-card-view.es.js +3 -3
  73. package/dist/domains/metrics/components/memory-card-view.es.js.map +1 -1
  74. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
  75. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
  76. package/dist/domains/metrics/components/scores-card-view.cjs.js +4 -4
  77. package/dist/domains/metrics/components/scores-card-view.cjs.js.map +1 -1
  78. package/dist/domains/metrics/components/scores-card-view.es.js +4 -4
  79. package/dist/domains/metrics/components/scores-card-view.es.js.map +1 -1
  80. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +3 -3
  81. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
  82. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +3 -3
  83. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
  84. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +10 -9
  85. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js.map +1 -1
  86. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +10 -9
  87. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js.map +1 -1
  88. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +4 -4
  89. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js.map +1 -1
  90. package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -4
  91. package/dist/domains/metrics/components/traces-volume-card-view.es.js.map +1 -1
  92. package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js +11 -11
  93. package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js.map +1 -1
  94. package/dist/domains/metrics/hooks/use-latency-metrics.es.js +12 -11
  95. package/dist/domains/metrics/hooks/use-latency-metrics.es.js.map +1 -1
  96. package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js +4 -12
  97. package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js.map +1 -1
  98. package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js +4 -12
  99. package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js.map +1 -1
  100. package/dist/domains/metrics/hooks.cjs.js +3 -0
  101. package/dist/domains/metrics/hooks.cjs.js.map +1 -1
  102. package/dist/domains/metrics/hooks.es.js +1 -0
  103. package/dist/domains/metrics/hooks.es.js.map +1 -1
  104. package/dist/domains/metrics/metrics-interval.cjs.js +18 -0
  105. package/dist/domains/metrics/metrics-interval.cjs.js.map +1 -0
  106. package/dist/domains/metrics/metrics-interval.d.ts +2 -0
  107. package/dist/domains/metrics/metrics-interval.es.js +13 -0
  108. package/dist/domains/metrics/metrics-interval.es.js.map +1 -0
  109. package/dist/domains/metrics.cjs.js +3 -0
  110. package/dist/domains/metrics.cjs.js.map +1 -1
  111. package/dist/domains/metrics.es.js +1 -0
  112. package/dist/domains/metrics.es.js.map +1 -1
  113. package/dist/domains/traces/components/span-type-legend.cjs.js +1 -1
  114. package/dist/domains/traces/components/span-type-legend.es.js +1 -1
  115. package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
  116. package/dist/domains/traces/components/traces-list-view.es.js +1 -1
  117. package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
  118. package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
  119. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
  120. package/dist/ee/signals/components/entity-index-list.es.js +1 -1
  121. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
  122. package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
  123. package/dist/{logs-data-list-YL9yLKF3.cjs → logs-data-list-BHvJOeec.cjs} +2 -2
  124. package/dist/{logs-data-list-YL9yLKF3.cjs.map → logs-data-list-BHvJOeec.cjs.map} +1 -1
  125. package/dist/{logs-data-list-5BAeLU57.js → logs-data-list-CgDcNIvS.js} +2 -2
  126. package/dist/{logs-data-list-5BAeLU57.js.map → logs-data-list-CgDcNIvS.js.map} +1 -1
  127. package/dist/{metrics-card-Bzm6m1dy.js → metrics-card-C2RTi5Ew.js} +7 -7
  128. package/dist/metrics-card-C2RTi5Ew.js.map +1 -0
  129. package/dist/{metrics-card-DCCHIG-z.cjs → metrics-card-DzcVJTAN.cjs} +7 -7
  130. package/dist/metrics-card-DzcVJTAN.cjs.map +1 -0
  131. package/dist/{metrics-kpi-card-BrnFhFQm.js → metrics-kpi-card-BVCuXeDa.js} +21 -10
  132. package/dist/metrics-kpi-card-BVCuXeDa.js.map +1 -0
  133. package/dist/{metrics-kpi-card-Bhb4R4z0.cjs → metrics-kpi-card-DoIeHfv6.cjs} +21 -10
  134. package/dist/metrics-kpi-card-DoIeHfv6.cjs.map +1 -0
  135. package/dist/{metrics-line-chart-0FR3SYSt.cjs → metrics-line-chart-BNNRRxM8.cjs} +61 -25
  136. package/dist/metrics-line-chart-BNNRRxM8.cjs.map +1 -0
  137. package/dist/{metrics-line-chart-knlgw8bV.js → metrics-line-chart-CT_pqJtC.js} +62 -27
  138. package/dist/metrics-line-chart-CT_pqJtC.js.map +1 -0
  139. package/dist/new/layout/page-header.cjs.js +1 -1
  140. package/dist/new/layout/page-header.es.js +1 -1
  141. package/dist/{page-header-CyXAezlZ.js → page-header-BGyZw13s.js} +2 -2
  142. package/dist/page-header-BGyZw13s.js.map +1 -0
  143. package/dist/{page-header-Dk3s3XtC.cjs → page-header-CqvBk1wE.cjs} +2 -2
  144. package/dist/page-header-CqvBk1wE.cjs.map +1 -0
  145. package/dist/src/domains/metrics/components/latency-card-view.d.ts +4 -1
  146. package/dist/src/domains/metrics/hooks/index.d.ts +1 -0
  147. package/dist/src/domains/metrics/hooks/use-latency-metrics.d.ts +2 -2
  148. package/dist/src/domains/metrics/hooks/use-token-usage-timeseries.d.ts +2 -1
  149. package/dist/src/domains/metrics/metrics-interval.d.ts +7 -0
  150. package/dist/src/ds/components/MetricsCardGroup/metrics-card-group.d.ts +3 -8
  151. package/dist/src/ds/components/MetricsLineChart/index.d.ts +1 -0
  152. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart-legend.d.ts +6 -0
  153. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +6 -4
  154. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.stories.d.ts +1 -0
  155. package/dist/src/ds/components/ai/task-list/task-graph-node.d.ts +8 -0
  156. package/dist/src/ds/components/ai/task-list/task-graph.d.ts +8 -0
  157. package/dist/src/ds/components/ai/task-list/task-list.d.ts +4 -8
  158. package/dist/src/ds/components/ai/task-list/task-list.stories.d.ts +1 -1
  159. package/dist/src/ds/components/ai/task-list/use-focused-row-scroll.d.ts +12 -0
  160. package/dist/src/ds/new/layout/page-header/page-header.stories.d.ts +1 -0
  161. package/dist/style.css +304 -14
  162. package/dist/{traces-data-list-Dvi0s56v.js → traces-data-list-B5MkMMBi.js} +2 -2
  163. package/dist/{traces-data-list-Dvi0s56v.js.map → traces-data-list-B5MkMMBi.js.map} +1 -1
  164. package/dist/{traces-data-list-Dam8-XW-.cjs → traces-data-list-D3k50j4n.cjs} +2 -2
  165. package/dist/{traces-data-list-Dam8-XW-.cjs.map → traces-data-list-D3k50j4n.cjs.map} +1 -1
  166. package/package.json +7 -7
  167. package/dist/Badge-BEeYtjmv.cjs.map +0 -1
  168. package/dist/Badge-TD55_qZJ.js.map +0 -1
  169. package/dist/metrics-card-Bzm6m1dy.js.map +0 -1
  170. package/dist/metrics-card-DCCHIG-z.cjs.map +0 -1
  171. package/dist/metrics-kpi-card-Bhb4R4z0.cjs.map +0 -1
  172. package/dist/metrics-kpi-card-BrnFhFQm.js.map +0 -1
  173. package/dist/metrics-line-chart-0FR3SYSt.cjs.map +0 -1
  174. package/dist/metrics-line-chart-knlgw8bV.js.map +0 -1
  175. package/dist/page-header-CyXAezlZ.js.map +0 -1
  176. package/dist/page-header-Dk3s3XtC.cjs.map +0 -1
@@ -5,20 +5,190 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const lucideReact = require('lucide-react');
7
7
  const React = require('react');
8
- const collapsible = require('../../collapsible-BFSJouuI.cjs');
8
+ const utils_cn = require('../../cn-DG0X1KEP.cjs');
9
9
  const scrollArea = require('../../scroll-area-BzOyuS8Y.cjs');
10
10
  const tooltip = require('../../tooltip-FvWL16Xn.cjs');
11
11
  const primitives_raisedSurface = require('../../primitives/raised-surface.cjs.js');
12
- const utils_cn = require('../../cn-DG0X1KEP.cjs');
12
+ const primitives_transitions = require('../../primitives/transitions.cjs.js');
13
13
 
14
- const TaskListContainer = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("section", { className: utils_cn.cn(primitives_raisedSurface.raisedSurfaceStyle, "rounded-2xl px-3 py-2.5", className), ...props });
15
- const TaskListHeader = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
16
- collapsible.CollapsibleTrigger,
17
- {
18
- className: utils_cn.cn("flex w-full cursor-pointer items-center gap-2 text-left text-muted-foreground", className),
19
- ...props
14
+ const TASK_ROW_HEIGHT = 28;
15
+ const TASK_GRAPH_MOTION_MS = 600;
16
+ const taskGraphMotion = "duration-[600ms] ease-(--resize-ease) motion-reduce:transition-none";
17
+ const taskGraphNodeClass = "absolute top-1/2 left-0.5 -translate-y-1/2 transition-[translate]";
18
+ const taskGraphLaneShift = {
19
+ completed: "translate-x-0",
20
+ in_progress: "translate-x-4",
21
+ pending: "translate-x-0"
22
+ };
23
+
24
+ const TRUNK_X = 8;
25
+ const LANE_X = 24;
26
+ const laneX = (status, singleLane) => status === "in_progress" && !singleLane ? LANE_X : TRUNK_X;
27
+ const rowCenter = (index) => index * TASK_ROW_HEIGHT + TASK_ROW_HEIGHT / 2;
28
+ const ink = {
29
+ completed: "var(--accent1)",
30
+ in_progress: "var(--accent6)",
31
+ pending: "color-mix(in oklab, var(--muted-foreground) 45%, transparent)"
32
+ };
33
+ const connectorPathData = (upper, lower, index, singleLane) => {
34
+ const fromY = rowCenter(index);
35
+ const toY = rowCenter(index + 1);
36
+ const midY = (fromY + toY) / 2;
37
+ const fromX = laneX(upper, singleLane);
38
+ const toX = laneX(lower, singleLane);
39
+ return `M ${fromX} ${fromY} C ${fromX} ${midY} ${toX} ${midY} ${toX} ${toY}`;
40
+ };
41
+ const TaskGraphSegment = ({ upper, lower, index, graphId, singleLane }) => {
42
+ const pathData = connectorPathData(upper, lower, index, singleLane);
43
+ const d = `path("${pathData}")`;
44
+ const reached = upper !== "pending" && lower !== "pending";
45
+ const touchesActive = upper === "in_progress" || lower === "in_progress";
46
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
47
+ /* @__PURE__ */ jsxRuntime.jsx(
48
+ "path",
49
+ {
50
+ d: pathData,
51
+ fill: "none",
52
+ strokeWidth: 1,
53
+ mask: `url(#${graphId}-future)`,
54
+ className: utils_cn.cn("transition-[d]", taskGraphMotion),
55
+ style: { d, stroke: ink.pending }
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsxRuntime.jsx(
59
+ "path",
60
+ {
61
+ d: pathData,
62
+ fill: "none",
63
+ strokeWidth: 1,
64
+ pathLength: 1,
65
+ strokeDasharray: "1 1",
66
+ className: utils_cn.cn("transition-[d,stroke-dashoffset,stroke]", taskGraphMotion),
67
+ style: { d, strokeDashoffset: reached ? 0 : 1, stroke: touchesActive ? ink.in_progress : ink.completed }
68
+ }
69
+ )
70
+ ] });
71
+ };
72
+ const TaskGraphLines = ({ statuses, singleLane = false }) => {
73
+ const graphId = `task-graph${React.useId().replace(/[^a-zA-Z0-9]/g, "")}`;
74
+ const height = statuses.length * TASK_ROW_HEIGHT;
75
+ const maskBox = { x: -8, y: 0, width: LANE_X + 24, height };
76
+ return /* @__PURE__ */ jsxRuntime.jsxs(
77
+ "svg",
78
+ {
79
+ "aria-hidden": true,
80
+ width: LANE_X + 8,
81
+ height,
82
+ className: "pointer-events-none absolute top-0 left-0 overflow-visible",
83
+ children: [
84
+ /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
85
+ /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: `${graphId}-fade`, gradientUnits: "userSpaceOnUse", x1: 0, x2: 0, y1: 0, y2: height, children: [
86
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0", stopColor: "white", stopOpacity: 1 }),
87
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "1", stopColor: "white", stopOpacity: 0.15 })
88
+ ] }),
89
+ /* @__PURE__ */ jsxRuntime.jsx("mask", { id: `${graphId}-future`, maskUnits: "userSpaceOnUse", ...maskBox, children: /* @__PURE__ */ jsxRuntime.jsx("rect", { ...maskBox, fill: `url(#${graphId}-fade)` }) }),
90
+ /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: `${graphId}-gap`, x1: 0, x2: 0, y1: 0, y2: 1, children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0.2", stopColor: "white", stopOpacity: 0 }),
92
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0.4", stopColor: "white", stopOpacity: 1 }),
93
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0.6", stopColor: "white", stopOpacity: 1 }),
94
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0.8", stopColor: "white", stopOpacity: 0 })
95
+ ] }),
96
+ /* @__PURE__ */ jsxRuntime.jsx(
97
+ "pattern",
98
+ {
99
+ id: `${graphId}-gaps`,
100
+ patternUnits: "userSpaceOnUse",
101
+ x: maskBox.x,
102
+ y: TASK_ROW_HEIGHT / 2,
103
+ width: maskBox.width,
104
+ height: TASK_ROW_HEIGHT,
105
+ children: /* @__PURE__ */ jsxRuntime.jsx("rect", { width: maskBox.width, height: TASK_ROW_HEIGHT, fill: `url(#${graphId}-gap)` })
106
+ }
107
+ ),
108
+ /* @__PURE__ */ jsxRuntime.jsx("mask", { id: `${graphId}-between-nodes`, maskUnits: "userSpaceOnUse", ...maskBox, children: /* @__PURE__ */ jsxRuntime.jsx("rect", { ...maskBox, fill: `url(#${graphId}-gaps)` }) })
109
+ ] }),
110
+ /* @__PURE__ */ jsxRuntime.jsx("g", { mask: `url(#${graphId}-between-nodes)`, children: statuses.map((status, index) => {
111
+ const next = statuses[index + 1];
112
+ if (!next) return null;
113
+ return /* @__PURE__ */ jsxRuntime.jsx(
114
+ TaskGraphSegment,
115
+ {
116
+ upper: status,
117
+ lower: next,
118
+ index,
119
+ graphId,
120
+ singleLane
121
+ },
122
+ index
123
+ );
124
+ }) })
125
+ ]
126
+ }
127
+ );
128
+ };
129
+
130
+ const prefersReducedMotion = () => window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
131
+ const easeOutQuint = (progress) => 1 - (1 - progress) ** 5;
132
+ const glideScrollTop = (viewport, top) => {
133
+ const start = viewport.scrollTop;
134
+ const distance = top - start;
135
+ if (prefersReducedMotion()) {
136
+ viewport.scrollTo({ top });
137
+ return () => {
138
+ };
20
139
  }
21
- );
140
+ let frame = 0;
141
+ const startedAt = performance.now();
142
+ const step = (now) => {
143
+ const progress = Math.min((now - startedAt) / TASK_GRAPH_MOTION_MS, 1);
144
+ viewport.scrollTo({ top: start + distance * easeOutQuint(progress) });
145
+ if (progress < 1) frame = requestAnimationFrame(step);
146
+ };
147
+ frame = requestAnimationFrame(step);
148
+ return () => cancelAnimationFrame(frame);
149
+ };
150
+ const revealedScrollTop = (rowIndex, currentTop, windowHeight) => {
151
+ const rowTop = rowIndex * TASK_ROW_HEIGHT;
152
+ const rowBottom = rowTop + TASK_ROW_HEIGHT;
153
+ if (rowTop < currentTop) return rowTop;
154
+ if (rowBottom > currentTop + windowHeight) return rowBottom - windowHeight;
155
+ return currentTop;
156
+ };
157
+ const EXPANDED_VISIBLE_ROWS = 4.5;
158
+ const taskWindowHeight = (rowCount, open) => open ? Math.min(rowCount, EXPANDED_VISIBLE_ROWS) * TASK_ROW_HEIGHT : TASK_ROW_HEIGHT;
159
+ const wantedScrollTop = (currentTop, { focusIndex, windowHeight, open, followFocus }) => {
160
+ if (!open) return focusIndex * TASK_ROW_HEIGHT;
161
+ if (!followFocus) return currentTop;
162
+ return revealedScrollTop(focusIndex, currentTop, windowHeight);
163
+ };
164
+ const clampScrollTop = (top, contentHeight, windowHeight) => Math.min(Math.max(top, 0), Math.max(contentHeight - windowHeight, 0));
165
+ const useFocusedRowScroll = ({ focusIndex, rowCount, open, followFocus }) => {
166
+ const viewportRef = React.useRef(null);
167
+ const cancelGlide = React.useRef(void 0);
168
+ const placedOnce = React.useRef(false);
169
+ const glideForOpen = (nextOpen) => {
170
+ const viewport = viewportRef.current;
171
+ if (!viewport || typeof viewport.scrollTo !== "function") return;
172
+ const windowHeight = taskWindowHeight(rowCount, nextOpen);
173
+ const wantedTop = wantedScrollTop(viewport.scrollTop, { focusIndex, windowHeight, open: nextOpen, followFocus });
174
+ const top = clampScrollTop(wantedTop, rowCount * TASK_ROW_HEIGHT, windowHeight);
175
+ cancelGlide.current?.();
176
+ if (!placedOnce.current) {
177
+ placedOnce.current = true;
178
+ viewport.scrollTo({ top });
179
+ return;
180
+ }
181
+ if (top !== viewport.scrollTop) cancelGlide.current = glideScrollTop(viewport, top);
182
+ };
183
+ const followFocusedRow = React.useEffectEvent(() => glideForOpen(open));
184
+ React.useEffect(() => {
185
+ followFocusedRow();
186
+ return () => cancelGlide.current?.();
187
+ }, [focusIndex]);
188
+ return { viewportRef, glideForOpen };
189
+ };
190
+
191
+ const TaskListContainer = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("section", { className: utils_cn.cn(primitives_raisedSurface.raisedSurfaceStyle, "overflow-hidden rounded-2xl", className), ...props });
22
192
  const barColors = {
23
193
  completed: "bg-positive1",
24
194
  in_progress: "bg-warning1",
@@ -43,7 +213,11 @@ const TaskListProgress = ({ tasks, className, ...props }) => {
43
213
  children: tasks.map((task) => /* @__PURE__ */ jsxRuntime.jsx(
44
214
  "span",
45
215
  {
46
- className: utils_cn.cn("h-full w-0.5 min-w-px shrink rounded-full", barColors[task.status])
216
+ className: utils_cn.cn(
217
+ "h-full w-0.5 min-w-px shrink rounded-full transition-colors",
218
+ taskGraphMotion,
219
+ barColors[task.status]
220
+ )
47
221
  },
48
222
  task.id
49
223
  ))
@@ -59,73 +233,214 @@ const TaskListProgress = ({ tasks, className, ...props }) => {
59
233
  ] })
60
234
  ] }) });
61
235
  };
62
- const icons = {
63
- completed: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle2, { className: "size-3.5 shrink-0 text-positive1" }),
64
- in_progress: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-3.5 shrink-0 text-warning1 motion-safe:animate-spin" }),
65
- pending: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Circle, { className: "size-3.5 shrink-0 text-muted-foreground" })
66
- };
67
236
  const statusLabels = {
68
237
  completed: "Completed",
69
238
  in_progress: "In progress",
70
239
  pending: "Pending"
71
240
  };
72
- const textClasses = {
73
- completed: "text-muted-foreground line-through",
74
- in_progress: "text-column text-warning1",
75
- pending: "text-foreground"
241
+ const ringClasses = {
242
+ completed: "size-[7px] border-accent1 bg-card",
243
+ in_progress: "size-2 border-accent6 bg-accent6/25",
244
+ pending: "size-1.5 border-muted-foreground/45 bg-card"
76
245
  };
77
- const taskLabel = (task) => task.status === "in_progress" ? task.activeForm : task.content;
78
- const TaskListStatusIcon = ({ status, className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-label": statusLabels[status], className: utils_cn.cn("flex pt-0.5", className), ...props, children: icons[status] });
79
- const TaskListRow = ({ task, className, ...props }) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: utils_cn.cn("flex items-start gap-2 py-0.5", className), ...props, children: [
80
- /* @__PURE__ */ jsxRuntime.jsx(TaskListStatusIcon, { status: task.status }),
81
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils_cn.cn("text-caption", textClasses[task.status]), children: taskLabel(task) })
82
- ] });
83
- const TaskListSummary = ({ task }) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
84
- /* @__PURE__ */ jsxRuntime.jsx(TaskListStatusIcon, { status: task.status, className: "pt-0" }),
85
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils_cn.cn("truncate text-caption", textClasses[task.status]), children: taskLabel(task) })
86
- ] });
87
- const TaskListTitle = ({ title }) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
88
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ListChecks, { className: "size-4 shrink-0 text-accent6" }),
89
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-column text-foreground", children: title })
246
+ const TaskListStatusIcon = ({ status, className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
247
+ "span",
248
+ {
249
+ role: "img",
250
+ "aria-label": statusLabels[status],
251
+ className: utils_cn.cn("grid size-3 shrink-0 place-items-center rounded-full", className),
252
+ ...props,
253
+ children: /* @__PURE__ */ jsxRuntime.jsx(
254
+ "span",
255
+ {
256
+ className: utils_cn.cn(
257
+ "rounded-full border-[1.5px] transition-[width,height,border-color,background-color]",
258
+ taskGraphMotion,
259
+ ringClasses[status]
260
+ )
261
+ }
262
+ )
263
+ }
264
+ );
265
+ const TaskListLabel = ({ task }) => {
266
+ const active = task.status === "in_progress";
267
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "grid min-w-0 text-caption", children: [
268
+ /* @__PURE__ */ jsxRuntime.jsx(
269
+ "span",
270
+ {
271
+ "aria-hidden": active,
272
+ className: utils_cn.cn(
273
+ "col-start-1 row-start-1 truncate transition-[opacity,color,translate,filter]",
274
+ taskGraphMotion,
275
+ task.status === "pending" ? "text-muted-foreground/70" : "text-muted-foreground",
276
+ active ? "-translate-y-1 opacity-0 blur-[2px]" : "translate-y-0 opacity-100 blur-none"
277
+ ),
278
+ children: /* @__PURE__ */ jsxRuntime.jsx(
279
+ "span",
280
+ {
281
+ className: utils_cn.cn(
282
+ "bg-[linear-gradient(currentColor,currentColor)] bg-no-repeat transition-[background-size]",
283
+ taskGraphMotion,
284
+ task.status === "completed" ? "bg-size-[100%_1px] bg-position-[left_55%]" : "bg-size-[0%_1px] bg-position-[right_55%]"
285
+ ),
286
+ children: task.content
287
+ }
288
+ )
289
+ }
290
+ ),
291
+ /* @__PURE__ */ jsxRuntime.jsx(
292
+ "span",
293
+ {
294
+ "aria-hidden": !active,
295
+ className: utils_cn.cn(
296
+ "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))]",
297
+ taskGraphMotion,
298
+ active ? "translate-y-0 bg-position-[0%_0] opacity-100 blur-none" : "translate-y-1 bg-position-[100%_0] opacity-0 blur-[2px]"
299
+ ),
300
+ children: task.activeForm
301
+ }
302
+ )
303
+ ] });
304
+ };
305
+ const TaskListRow = ({ task, className, style, ...props }) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: utils_cn.cn("relative flex items-center", className), style: { height: TASK_ROW_HEIGHT, ...style }, ...props, children: [
306
+ /* @__PURE__ */ jsxRuntime.jsx(
307
+ TaskListStatusIcon,
308
+ {
309
+ status: task.status,
310
+ className: utils_cn.cn(
311
+ taskGraphNodeClass,
312
+ taskGraphMotion,
313
+ taskGraphLaneShift[task.status],
314
+ "group-data-collapsed/task-list:translate-x-0"
315
+ )
316
+ }
317
+ ),
318
+ /* @__PURE__ */ jsxRuntime.jsx(
319
+ "span",
320
+ {
321
+ className: utils_cn.cn(
322
+ "flex min-w-0 transition-[padding-left]",
323
+ taskGraphMotion,
324
+ task.status === "in_progress" ? "pl-10 group-data-collapsed/task-list:pl-6" : "pl-6"
325
+ ),
326
+ children: /* @__PURE__ */ jsxRuntime.jsx(TaskListLabel, { task })
327
+ }
328
+ )
90
329
  ] });
91
- const scrollTaskIntoView = (node) => {
92
- if (typeof node?.scrollIntoView === "function") node.scrollIntoView({ block: "nearest" });
330
+ const LIST_INSET_Y = 10;
331
+ 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)]";
332
+ const edgeFadesWhenScrolled = "data-[overflow-y-end]:[--fade-bottom:2rem] data-[overflow-y-start]:[--fade-top:2rem]";
333
+ const focusedTaskIndex = (tasks) => {
334
+ const activeIndex = tasks.findIndex((task) => task.status === "in_progress");
335
+ if (activeIndex >= 0) return activeIndex;
336
+ const pendingIndex = tasks.findIndex((task) => task.status === "pending");
337
+ if (pendingIndex >= 0) return pendingIndex;
338
+ return tasks.length - 1;
93
339
  };
94
340
  const TaskList = ({
95
341
  tasks,
96
- title = "Tasks",
97
- hideWhenEmpty = true,
98
342
  hideWhenComplete = true,
99
343
  scrollActiveIntoView = true,
100
344
  defaultOpen = true,
345
+ className,
101
346
  ...props
102
347
  }) => {
103
348
  const [open, setOpen] = React.useState(defaultOpen);
104
- const activeTask = tasks.find((task) => task.status === "in_progress");
105
- const summaryTask = activeTask ?? tasks.find((task) => task.status === "pending");
349
+ const listId = React.useId();
106
350
  const completed = tasks.filter((task) => task.status === "completed").length;
107
351
  const total = tasks.length;
108
- if (hideWhenEmpty && total === 0 || hideWhenComplete && total > 0 && completed === total) return null;
109
- return /* @__PURE__ */ jsxRuntime.jsx(TaskListContainer, { "aria-label": "Task list", "data-testid": "task-list", ...props, children: /* @__PURE__ */ jsxRuntime.jsxs(collapsible.Collapsible, { open, onOpenChange: setOpen, children: [
110
- /* @__PURE__ */ jsxRuntime.jsxs(TaskListHeader, { children: [
111
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-3.5 shrink-0" }),
112
- open || !summaryTask ? /* @__PURE__ */ jsxRuntime.jsx(TaskListTitle, { title }) : /* @__PURE__ */ jsxRuntime.jsx(TaskListSummary, { task: summaryTask }),
113
- /* @__PURE__ */ jsxRuntime.jsx(TaskListProgress, { tasks })
114
- ] }),
115
- /* @__PURE__ */ jsxRuntime.jsx(collapsible.CollapsibleContent, { children: /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea, { maxHeight: "8rem", viewPortClassName: "pr-1", className: "mt-1", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-1", children: tasks.map((task) => /* @__PURE__ */ jsxRuntime.jsx(
116
- TaskListRow,
117
- {
118
- ref: scrollActiveIntoView && task.id === activeTask?.id ? scrollTaskIntoView : void 0,
119
- task
120
- },
121
- task.id
122
- )) }) }) })
123
- ] }) });
352
+ const focusIndex = focusedTaskIndex(tasks);
353
+ const windowHeight = taskWindowHeight(total, open);
354
+ const { viewportRef, glideForOpen } = useFocusedRowScroll({
355
+ focusIndex,
356
+ rowCount: total,
357
+ open,
358
+ followFocus: scrollActiveIntoView
359
+ });
360
+ const changeOpen = (nextOpen) => {
361
+ setOpen(nextOpen);
362
+ glideForOpen(nextOpen);
363
+ };
364
+ if (total === 0 || hideWhenComplete && completed === total) return null;
365
+ return /* @__PURE__ */ jsxRuntime.jsxs(
366
+ TaskListContainer,
367
+ {
368
+ "aria-label": "Task list",
369
+ "data-testid": "task-list",
370
+ "data-collapsed": open ? void 0 : "",
371
+ onClick: open ? void 0 : () => changeOpen(true),
372
+ className: utils_cn.cn("group/task-list relative", !open && "cursor-pointer", className),
373
+ ...props,
374
+ children: [
375
+ /* @__PURE__ */ jsxRuntime.jsx(
376
+ scrollArea.ScrollArea,
377
+ {
378
+ id: listId,
379
+ maxHeight: `${windowHeight + 2 * LIST_INSET_Y}px`,
380
+ mask: false,
381
+ viewPortClassName: utils_cn.cn(
382
+ edgeFades,
383
+ "transition-[max-height,mask-size]",
384
+ taskGraphMotion,
385
+ open ? edgeFadesWhenScrolled : "overflow-hidden!"
386
+ ),
387
+ viewportRef,
388
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3", style: { paddingBlock: LIST_INSET_Y }, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
389
+ /* @__PURE__ */ jsxRuntime.jsx(TaskGraphLines, { statuses: tasks.map((task) => task.status), singleLane: !open }),
390
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { children: tasks.map((task, index) => {
391
+ const clippedAway = !open && index !== focusIndex;
392
+ return /* @__PURE__ */ jsxRuntime.jsx(TaskListRow, { task, inert: clippedAway, "aria-hidden": clippedAway }, task.id);
393
+ }) })
394
+ ] }) })
395
+ }
396
+ ),
397
+ /* @__PURE__ */ jsxRuntime.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: [
398
+ /* @__PURE__ */ jsxRuntime.jsx(
399
+ "div",
400
+ {
401
+ inert: open,
402
+ "aria-hidden": open,
403
+ className: utils_cn.cn(
404
+ "grid transition-[grid-template-columns,opacity]",
405
+ taskGraphMotion,
406
+ open ? "grid-cols-[0fr] opacity-0" : "grid-cols-[1fr] opacity-100"
407
+ ),
408
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(TaskListProgress, { tasks, className: "mr-2" }) })
409
+ }
410
+ ),
411
+ /* @__PURE__ */ jsxRuntime.jsx(
412
+ "button",
413
+ {
414
+ type: "button",
415
+ "aria-label": open ? "Collapse tasks" : "Show all tasks",
416
+ "aria-expanded": open,
417
+ "aria-controls": listId,
418
+ onClick: (event) => {
419
+ event.stopPropagation();
420
+ changeOpen(!open);
421
+ },
422
+ className: utils_cn.cn(
423
+ "grid size-6 cursor-pointer place-items-center rounded-md text-muted-foreground hover:text-foreground",
424
+ primitives_transitions.transitions.colors,
425
+ primitives_transitions.focusRing.visible,
426
+ !open && "group-hover/task-list:text-foreground"
427
+ ),
428
+ children: /* @__PURE__ */ jsxRuntime.jsx(
429
+ lucideReact.ChevronDown,
430
+ {
431
+ className: utils_cn.cn("size-3.5 transition-[rotate]", taskGraphMotion, open ? "rotate-180" : "rotate-0")
432
+ }
433
+ )
434
+ }
435
+ )
436
+ ] })
437
+ ]
438
+ }
439
+ );
124
440
  };
125
441
 
126
442
  exports.TaskList = TaskList;
127
443
  exports.TaskListContainer = TaskListContainer;
128
- exports.TaskListHeader = TaskListHeader;
129
444
  exports.TaskListProgress = TaskListProgress;
130
445
  exports.TaskListRow = TaskListRow;
131
446
  exports.TaskListStatusIcon = TaskListStatusIcon;
@@ -1 +1 @@
1
- {"version":3,"file":"task-list.cjs.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":["jsx","cn","raisedSurfaceStyle","CollapsibleTrigger","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","CheckCircle2","Loader2","Circle","jsxs","ListChecks","useState","Collapsible","ChevronRight","CollapsibleContent","ScrollArea"],"mappings":";;;;;;;;;;;;;AAYO,MAAM,oBAAoB,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,qBACtDA,cAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAWC,YAAGC,2CAAA,EAAoB,yBAAA,EAA2B,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAGxF,MAAM,iBAAiB,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,qBACnDF,cAAA;AAAA,EAACG,8BAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAWF,WAAA,CAAG,+EAAA,EAAiF,SAAS,CAAA;AAAA,IACvG,GAAG;AAAA;AACN;AAGF,MAAM,SAAA,GAAoD;AAAA,EACxD,SAAA,EAAW,cAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;AAMO,MAAM,mBAAmB,CAAC,EAAE,OAAO,SAAA,EAAW,GAAG,OAAM,KAA6B;AACzF,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,UAAQ,IAAA,CAAK,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AACpE,EAAA,uBACED,cAAA,CAACI,uBAAA,EAAA,EAAgB,aAAA,EAAe,CAAA,EAC9B,0CAACC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAL,cAAA;AAAA,MAACM,sBAAA;AAAA,MAAA;AAAA,QACC,MAAA,kBACEN,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,aAAA;AAAA,YACL,YAAA,EAAW,iBAAA;AAAA,YACX,eAAA,EAAe,CAAA;AAAA,YACf,iBAAe,KAAA,CAAM,MAAA;AAAA,YACrB,eAAA,EAAe,SAAA;AAAA,YACf,SAAA,EAAWC,WAAA,CAAG,6EAAA,EAA+E,SAAS,CAAA;AAAA,YACrG,GAAG,KAAA;AAAA,YAEH,QAAA,EAAA,KAAA,CAAM,IAAI,CAAA,IAAA,qBACTD,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,WAAWC,WAAA,CAAG,2CAAA,EAA6C,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC;AAAA,eAAA;AAAA,cAD5E,IAAA,CAAK;AAAA,aAGb;AAAA;AAAA;AACH;AAAA,KAEJ;AAAA,oCACCM,sBAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,SAAA;AAAA,MAAU,GAAA;AAAA,MAAE,KAAA,CAAM,MAAA;AAAA,MAAO;AAAA,KAAA,EAC5B;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,MAAM,KAAA,GAAmD;AAAA,EACvD,SAAA,kBAAWP,cAAA,CAACQ,wBAAA,EAAA,EAAa,SAAA,EAAU,kCAAA,EAAmC,CAAA;AAAA,EACtE,WAAA,kBAAaR,cAAA,CAACS,mBAAA,EAAA,EAAQ,SAAA,EAAU,0DAAA,EAA2D,CAAA;AAAA,EAC3F,OAAA,kBAAST,cAAA,CAACU,kBAAA,EAAA,EAAO,SAAA,EAAU,yCAAA,EAA0C;AACvE,CAAA;AAEA,MAAM,YAAA,GAAuD;AAAA,EAC3D,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;AAEA,MAAM,WAAA,GAAsD;AAAA,EAC1D,SAAA,EAAW,oCAAA;AAAA,EACX,WAAA,EAAa,2BAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAwB,IAAA,CAAK,WAAW,aAAA,GAAgB,IAAA,CAAK,aAAa,IAAA,CAAK,OAAA;AAM3F,MAAM,kBAAA,GAAqB,CAAC,EAAE,MAAA,EAAQ,WAAW,GAAG,KAAA,EAAM,qBAC/DV,cAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAY,aAAa,MAAM,CAAA,EAAG,SAAA,EAAWC,WAAA,CAAG,aAAA,EAAe,SAAS,GAAI,GAAG,KAAA,EAClF,QAAA,EAAA,KAAA,CAAM,MAAM,CAAA,EACf;AAOK,MAAM,cAAc,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,GAAG,KAAA,EAAM,qBACtDU,eAAA,CAAC,IAAA,EAAA,EAAG,WAAWV,WAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA,EAAI,GAAG,KAAA,EACjE,QAAA,EAAA;AAAA,kBAAAD,cAAA,CAAC,kBAAA,EAAA,EAAmB,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,kBACzCA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,WAAA,CAAG,cAAA,EAAgB,WAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA,EAAI,QAAA,EAAA,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,CAAA,EAClF;AAGF,MAAM,eAAA,GAAkB,CAAC,EAAE,IAAA,uBACzBU,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EACd,QAAA,EAAA;AAAA,kBAAAX,cAAA,CAAC,kBAAA,EAAA,EAAmB,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,WAAU,MAAA,EAAO,CAAA;AAAA,kBAC1DA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,WAAA,CAAG,uBAAA,EAAyB,WAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA,EAAI,QAAA,EAAA,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,CAAA,EAC3F,CAAA;AAGF,MAAM,aAAA,GAAgB,CAAC,EAAE,KAAA,uBACvBU,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EACd,QAAA,EAAA;AAAA,kBAAAX,cAAA,CAACY,sBAAA,EAAA,EAAW,WAAU,8BAAA,EAA+B,CAAA;AAAA,kBACrDZ,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA,KAAA,EAAM;AAAA,CAAA,EAChE,CAAA;AAGF,MAAM,kBAAA,GAAqB,CAAC,IAAA,KAA+B;AACzD,EAAA,IAAI,OAAO,MAAM,cAAA,KAAmB,UAAA,OAAiB,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAC1F,CAAA;AAWO,MAAM,WAAW,CAAC;AAAA,EACvB,KAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR,aAAA,GAAgB,IAAA;AAAA,EAChB,gBAAA,GAAmB,IAAA;AAAA,EACnB,oBAAA,GAAuB,IAAA;AAAA,EACvB,WAAA,GAAc,IAAA;AAAA,EACd,GAAG;AACL,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIa,eAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,aAAa,CAAA;AACnE,EAAA,MAAM,cAAc,UAAA,IAAc,KAAA,CAAM,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,SAAS,CAAA;AAC9E,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,UAAQ,IAAA,CAAK,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AACpE,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAEpB,EAAA,IAAK,aAAA,IAAiB,UAAU,CAAA,IAAO,gBAAA,IAAoB,QAAQ,CAAA,IAAK,SAAA,KAAc,OAAQ,OAAO,IAAA;AAErG,EAAA,uBACEb,cAAA,CAAC,iBAAA,EAAA,EAAkB,YAAA,EAAW,WAAA,EAAY,aAAA,EAAY,WAAA,EAAa,GAAG,KAAA,EACpE,QAAA,kBAAAW,eAAA,CAACG,uBAAA,EAAA,EAAY,IAAA,EAAY,YAAA,EAAc,OAAA,EACrC,QAAA,EAAA;AAAA,oBAAAH,eAAA,CAAC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAX,cAAA,CAACe,wBAAA,EAAA,EAAa,WAAU,mBAAA,EAAoB,CAAA;AAAA,MAC3C,IAAA,IAAQ,CAAC,WAAA,mBAAcf,cAAA,CAAC,aAAA,EAAA,EAAc,OAAc,CAAA,mBAAKA,cAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,sBAC9FA,cAAA,CAAC,oBAAiB,KAAA,EAAc;AAAA,KAAA,EAClC,CAAA;AAAA,mCACCgB,8BAAA,EAAA,EACC,QAAA,kBAAAhB,cAAA,CAACiB,qBAAA,EAAA,EAAW,SAAA,EAAU,QAAO,iBAAA,EAAkB,MAAA,EAAO,SAAA,EAAU,MAAA,EAC9D,yCAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,QAAA,EAAA,KAAA,CAAM,IAAI,CAAA,IAAA,qBACTjB,cAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEC,KAAK,oBAAA,IAAwB,IAAA,CAAK,EAAA,KAAO,UAAA,EAAY,KAAK,kBAAA,GAAqB,MAAA;AAAA,QAC/E;AAAA,OAAA;AAAA,MAFK,IAAA,CAAK;AAAA,KAIb,CAAA,EACH,CAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;;;;;;;"}
1
+ {"version":3,"file":"task-list.cjs.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":["jsx","cn","useId","jsxs","useRef","useEffectEvent","useEffect","raisedSurfaceStyle","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","useState","ScrollArea","transitions","focusRing","ChevronDown"],"mappings":"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"}