@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
@@ -1,20 +1,190 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { ChevronRight, ListChecks, Circle, Loader2, CheckCircle2 } from 'lucide-react';
3
- import { useState } from 'react';
4
- import { C as Collapsible, a as CollapsibleContent, b as CollapsibleTrigger } from '../../collapsible-DhhP5p1j.js';
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 { c as cn } from '../../cn-65Adrsfj.js';
8
+ import { focusRing, transitions } from '../../primitives/transitions.es.js';
9
9
 
10
- const TaskListContainer = ({ className, ...props }) => /* @__PURE__ */ jsx("section", { className: cn(raisedSurfaceStyle, "rounded-2xl px-3 py-2.5", className), ...props });
11
- const TaskListHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
12
- CollapsibleTrigger,
13
- {
14
- className: cn("flex w-full cursor-pointer items-center gap-2 text-left text-muted-foreground", className),
15
- ...props
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("h-full w-0.5 min-w-px shrink rounded-full", barColors[task.status])
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 textClasses = {
69
- completed: "text-muted-foreground line-through",
70
- in_progress: "text-column text-warning1",
71
- pending: "text-foreground"
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 taskLabel = (task) => task.status === "in_progress" ? task.activeForm : task.content;
74
- const TaskListStatusIcon = ({ status, className, ...props }) => /* @__PURE__ */ jsx("span", { "aria-label": statusLabels[status], className: cn("flex pt-0.5", className), ...props, children: icons[status] });
75
- const TaskListRow = ({ task, className, ...props }) => /* @__PURE__ */ jsxs("li", { className: cn("flex items-start gap-2 py-0.5", className), ...props, children: [
76
- /* @__PURE__ */ jsx(TaskListStatusIcon, { status: task.status }),
77
- /* @__PURE__ */ jsx("span", { className: cn("text-caption", textClasses[task.status]), children: taskLabel(task) })
78
- ] });
79
- const TaskListSummary = ({ task }) => /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
80
- /* @__PURE__ */ jsx(TaskListStatusIcon, { status: task.status, className: "pt-0" }),
81
- /* @__PURE__ */ jsx("span", { className: cn("truncate text-caption", textClasses[task.status]), children: taskLabel(task) })
82
- ] });
83
- const TaskListTitle = ({ title }) => /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
84
- /* @__PURE__ */ jsx(ListChecks, { className: "size-4 shrink-0 text-accent6" }),
85
- /* @__PURE__ */ jsx("span", { className: "truncate text-column text-foreground", children: title })
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 scrollTaskIntoView = (node) => {
88
- if (typeof node?.scrollIntoView === "function") node.scrollIntoView({ block: "nearest" });
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 activeTask = tasks.find((task) => task.status === "in_progress");
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
- if (hideWhenEmpty && total === 0 || hideWhenComplete && total > 0 && completed === total) return null;
105
- return /* @__PURE__ */ jsx(TaskListContainer, { "aria-label": "Task list", "data-testid": "task-list", ...props, children: /* @__PURE__ */ jsxs(Collapsible, { open, onOpenChange: setOpen, children: [
106
- /* @__PURE__ */ jsxs(TaskListHeader, { children: [
107
- /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5 shrink-0" }),
108
- open || !summaryTask ? /* @__PURE__ */ jsx(TaskListTitle, { title }) : /* @__PURE__ */ jsx(TaskListSummary, { task: summaryTask }),
109
- /* @__PURE__ */ jsx(TaskListProgress, { tasks })
110
- ] }),
111
- /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx(ScrollArea, { maxHeight: "8rem", viewPortClassName: "pr-1", className: "mt-1", children: /* @__PURE__ */ jsx("ul", { className: "space-y-1", children: tasks.map((task) => /* @__PURE__ */ jsx(
112
- TaskListRow,
113
- {
114
- ref: scrollActiveIntoView && task.id === activeTask?.id ? scrollTaskIntoView : void 0,
115
- task
116
- },
117
- task.id
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, TaskListHeader, TaskListProgress, TaskListRow, TaskListStatusIcon };
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-DJykWtoj.cjs');
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-CmdRGO_D.js';
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-BEeYtjmv.cjs');
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-TD55_qZJ.js';
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-xs3FkPts.cjs');
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;