@mastra/playground-ui 58.0.0 → 58.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Badge-TD55_qZJ.js → Badge-Bzn8Z-_I.js} +2 -2
- package/dist/Badge-Bzn8Z-_I.js.map +1 -0
- package/dist/{Badge-BEeYtjmv.cjs → Badge-DFNxcz-r.cjs} +2 -2
- package/dist/Badge-DFNxcz-r.cjs.map +1 -0
- package/dist/{ask-user-jDUt7hgT.js → ask-user-DtF4a9Vr.js} +2 -2
- package/dist/{ask-user-jDUt7hgT.js.map → ask-user-DtF4a9Vr.js.map} +1 -1
- package/dist/{ask-user-BPpgiE7k.cjs → ask-user-pPTuoPKI.cjs} +2 -2
- package/dist/{ask-user-BPpgiE7k.cjs.map → ask-user-pPTuoPKI.cjs.map} +1 -1
- package/dist/{chat-notification-CmdRGO_D.js → chat-notification-C4P2InUX.js} +2 -2
- package/dist/{chat-notification-CmdRGO_D.js.map → chat-notification-C4P2InUX.js.map} +1 -1
- package/dist/{chat-notification-DJykWtoj.cjs → chat-notification-HP18KxlS.cjs} +2 -2
- package/dist/{chat-notification-DJykWtoj.cjs.map → chat-notification-HP18KxlS.cjs.map} +1 -1
- package/dist/{chat-signal-xs3FkPts.cjs → chat-signal-BP9RN6Rh.cjs} +2 -2
- package/dist/{chat-signal-xs3FkPts.cjs.map → chat-signal-BP9RN6Rh.cjs.map} +1 -1
- package/dist/{chat-signal-Vg8pGXwH.js → chat-signal-CQnmFp3V.js} +2 -2
- package/dist/{chat-signal-Vg8pGXwH.js.map → chat-signal-CQnmFp3V.js.map} +1 -1
- package/dist/components/Badge.cjs.js +1 -1
- package/dist/components/Badge.es.js +1 -1
- package/dist/components/DataList.cjs.js +1 -1
- package/dist/components/DataList.es.js +1 -1
- package/dist/components/ItemList.cjs.js +1 -1
- package/dist/components/ItemList.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +1 -1
- package/dist/components/LogsDataList.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsCardGroup.cjs.js +2 -11
- package/dist/components/MetricsCardGroup.cjs.js.map +1 -1
- package/dist/components/MetricsCardGroup.es.js +2 -11
- package/dist/components/MetricsCardGroup.es.js.map +1 -1
- package/dist/components/MetricsKpiCard.cjs.js +1 -1
- package/dist/components/MetricsKpiCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +2 -1
- package/dist/components/MetricsLineChart.cjs.js.map +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/PageHeader.cjs.js +1 -1
- package/dist/components/PageHeader.es.js +1 -1
- package/dist/components/Workflow.cjs.js +1 -1
- package/dist/components/Workflow.es.js +1 -1
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/components/ai/chat-event.cjs.js +2 -2
- package/dist/components/ai/chat-event.es.js +3 -3
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/task-list.cjs.js +370 -55
- package/dist/components/ai/task-list.cjs.js.map +1 -1
- package/dist/components/ai/task-list.es.js +374 -58
- package/dist/components/ai/task-list.es.js.map +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
- package/dist/domains/metrics/components/latency-card-view.cjs.js +33 -24
- package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card-view.es.js +34 -25
- package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +4 -4
- package/dist/domains/metrics/components/scores-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +4 -4
- package/dist/domains/metrics/components/scores-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +3 -3
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +10 -9
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +10 -9
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +4 -4
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -4
- package/dist/domains/metrics/components/traces-volume-card-view.es.js.map +1 -1
- package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js +11 -11
- package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-latency-metrics.es.js +12 -11
- package/dist/domains/metrics/hooks/use-latency-metrics.es.js.map +1 -1
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js +4 -12
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js +4 -12
- package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js.map +1 -1
- package/dist/domains/metrics/hooks.cjs.js +3 -0
- package/dist/domains/metrics/hooks.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks.es.js +1 -0
- package/dist/domains/metrics/hooks.es.js.map +1 -1
- package/dist/domains/metrics/metrics-interval.cjs.js +18 -0
- package/dist/domains/metrics/metrics-interval.cjs.js.map +1 -0
- package/dist/domains/metrics/metrics-interval.d.ts +2 -0
- package/dist/domains/metrics/metrics-interval.es.js +13 -0
- package/dist/domains/metrics/metrics-interval.es.js.map +1 -0
- package/dist/domains/metrics.cjs.js +3 -0
- package/dist/domains/metrics.cjs.js.map +1 -1
- package/dist/domains/metrics.es.js +1 -0
- package/dist/domains/metrics.es.js.map +1 -1
- package/dist/domains/traces/components/span-type-legend.cjs.js +1 -1
- package/dist/domains/traces/components/span-type-legend.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +1 -1
- package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
- package/dist/{logs-data-list-YL9yLKF3.cjs → logs-data-list-BHvJOeec.cjs} +2 -2
- package/dist/{logs-data-list-YL9yLKF3.cjs.map → logs-data-list-BHvJOeec.cjs.map} +1 -1
- package/dist/{logs-data-list-5BAeLU57.js → logs-data-list-CgDcNIvS.js} +2 -2
- package/dist/{logs-data-list-5BAeLU57.js.map → logs-data-list-CgDcNIvS.js.map} +1 -1
- package/dist/{metrics-card-Bzm6m1dy.js → metrics-card-C2RTi5Ew.js} +7 -7
- package/dist/metrics-card-C2RTi5Ew.js.map +1 -0
- package/dist/{metrics-card-DCCHIG-z.cjs → metrics-card-DzcVJTAN.cjs} +7 -7
- package/dist/metrics-card-DzcVJTAN.cjs.map +1 -0
- package/dist/{metrics-kpi-card-BrnFhFQm.js → metrics-kpi-card-BVCuXeDa.js} +21 -10
- package/dist/metrics-kpi-card-BVCuXeDa.js.map +1 -0
- package/dist/{metrics-kpi-card-Bhb4R4z0.cjs → metrics-kpi-card-DoIeHfv6.cjs} +21 -10
- package/dist/metrics-kpi-card-DoIeHfv6.cjs.map +1 -0
- package/dist/{metrics-line-chart-0FR3SYSt.cjs → metrics-line-chart-BNNRRxM8.cjs} +61 -25
- package/dist/metrics-line-chart-BNNRRxM8.cjs.map +1 -0
- package/dist/{metrics-line-chart-knlgw8bV.js → metrics-line-chart-CT_pqJtC.js} +62 -27
- package/dist/metrics-line-chart-CT_pqJtC.js.map +1 -0
- package/dist/new/layout/page-header.cjs.js +1 -1
- package/dist/new/layout/page-header.es.js +1 -1
- package/dist/{page-header-CyXAezlZ.js → page-header-BGyZw13s.js} +2 -2
- package/dist/page-header-BGyZw13s.js.map +1 -0
- package/dist/{page-header-Dk3s3XtC.cjs → page-header-CqvBk1wE.cjs} +2 -2
- package/dist/page-header-CqvBk1wE.cjs.map +1 -0
- package/dist/src/domains/metrics/components/latency-card-view.d.ts +4 -1
- package/dist/src/domains/metrics/hooks/index.d.ts +1 -0
- package/dist/src/domains/metrics/hooks/use-latency-metrics.d.ts +2 -2
- package/dist/src/domains/metrics/hooks/use-token-usage-timeseries.d.ts +2 -1
- package/dist/src/domains/metrics/metrics-interval.d.ts +7 -0
- package/dist/src/ds/components/MetricsCardGroup/metrics-card-group.d.ts +3 -8
- package/dist/src/ds/components/MetricsLineChart/index.d.ts +1 -0
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart-legend.d.ts +6 -0
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +6 -4
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.stories.d.ts +1 -0
- package/dist/src/ds/components/ai/task-list/task-graph-node.d.ts +8 -0
- package/dist/src/ds/components/ai/task-list/task-graph.d.ts +8 -0
- package/dist/src/ds/components/ai/task-list/task-list.d.ts +4 -8
- package/dist/src/ds/components/ai/task-list/task-list.stories.d.ts +1 -1
- package/dist/src/ds/components/ai/task-list/use-focused-row-scroll.d.ts +12 -0
- package/dist/src/ds/new/layout/page-header/page-header.stories.d.ts +1 -0
- package/dist/style.css +304 -14
- package/dist/{traces-data-list-Dvi0s56v.js → traces-data-list-B5MkMMBi.js} +2 -2
- package/dist/{traces-data-list-Dvi0s56v.js.map → traces-data-list-B5MkMMBi.js.map} +1 -1
- package/dist/{traces-data-list-Dam8-XW-.cjs → traces-data-list-D3k50j4n.cjs} +2 -2
- package/dist/{traces-data-list-Dam8-XW-.cjs.map → traces-data-list-D3k50j4n.cjs.map} +1 -1
- package/package.json +7 -7
- package/dist/Badge-BEeYtjmv.cjs.map +0 -1
- package/dist/Badge-TD55_qZJ.js.map +0 -1
- package/dist/metrics-card-Bzm6m1dy.js.map +0 -1
- package/dist/metrics-card-DCCHIG-z.cjs.map +0 -1
- package/dist/metrics-kpi-card-Bhb4R4z0.cjs.map +0 -1
- package/dist/metrics-kpi-card-BrnFhFQm.js.map +0 -1
- package/dist/metrics-line-chart-0FR3SYSt.cjs.map +0 -1
- package/dist/metrics-line-chart-knlgw8bV.js.map +0 -1
- package/dist/page-header-CyXAezlZ.js.map +0 -1
- package/dist/page-header-Dk3s3XtC.cjs.map +0 -1
|
@@ -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
|
|
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
|
|
12
|
+
const primitives_transitions = require('../../primitives/transitions.cjs.js');
|
|
13
13
|
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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(
|
|
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
|
|
73
|
-
completed: "
|
|
74
|
-
in_progress: "
|
|
75
|
-
pending: "
|
|
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
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
|
92
|
-
|
|
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
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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":"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"}
|
|
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":";;;;;;;;;;;;;AAIO,MAAM,eAAA,GAAkB,EAAA;AACxB,MAAM,oBAAA,GAAuB,GAAA;AAG7B,MAAM,eAAA,GAAkB,qEAAA;AAGxB,MAAM,kBAAA,GAAqB,mEAAA;AAC3B,MAAM,kBAAA,GAAiD;AAAA,EAC5D,SAAA,EAAW,eAAA;AAAA,EACX,WAAA,EAAa,eAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;;ACTA,MAAM,OAAA,GAAU,CAAA;AAChB,MAAM,MAAA,GAAS,EAAA;AAEf,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAoB,UAAA,KAAyB,WAAW,aAAA,IAAiB,CAAC,aAAa,MAAA,GAAS,OAAA;AAC/G,MAAM,SAAA,GAAY,CAAC,KAAA,KAAkB,KAAA,GAAQ,kBAAkB,eAAA,GAAkB,CAAA;AAEjF,MAAM,GAAA,GAAkC;AAAA,EACtC,SAAA,EAAW,gBAAA;AAAA,EACX,WAAA,EAAa,gBAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;AAEA,MAAM,iBAAA,GAAoB,CAAC,KAAA,EAAmB,KAAA,EAAmB,OAAe,UAAA,KAAwB;AACtG,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAK,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,KAAA,GAAQ,CAAC,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAA,CAAQ,QAAQ,GAAA,IAAO,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA;AACnC,EAAA,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,KAAK,MAAM,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA;AAC5E,CAAA;AAUA,MAAM,gBAAA,GAAmB,CAAC,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,OAAA,EAAS,YAAW,KAA6B;AAChG,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,KAAA,EAAO,KAAA,EAAO,OAAO,UAAU,CAAA;AAClE,EAAA,MAAM,CAAA,GAAI,SAAS,QAAQ,CAAA,EAAA,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,SAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,KAAA,KAAU,aAAA,IAAiB,KAAA,KAAU,aAAA;AAE3D,EAAA,uCACG,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,QAAA;AAAA,QACH,IAAA,EAAK,MAAA;AAAA,QACL,WAAA,EAAa,CAAA;AAAA,QACb,IAAA,EAAM,QAAQ,OAAO,CAAA,QAAA,CAAA;AAAA,QACrB,SAAA,EAAWC,WAAA,CAAG,gBAAA,EAAkB,eAAe,CAAA;AAAA,QAC/C,KAAA,EAAO,EAAE,CAAA,EAAG,MAAA,EAAQ,IAAI,OAAA;AAAQ;AAAA,KAClC;AAAA,oBACAD,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,QAAA;AAAA,QACH,IAAA,EAAK,MAAA;AAAA,QACL,WAAA,EAAa,CAAA;AAAA,QACb,UAAA,EAAY,CAAA;AAAA,QACZ,eAAA,EAAgB,KAAA;AAAA,QAChB,SAAA,EAAWC,WAAA,CAAG,yCAAA,EAA2C,eAAe,CAAA;AAAA,QACxE,KAAA,EAAO,EAAE,CAAA,EAAG,gBAAA,EAAkB,OAAA,GAAU,CAAA,GAAI,CAAA,EAAG,MAAA,EAAQ,aAAA,GAAgB,GAAA,CAAI,WAAA,GAAc,GAAA,CAAI,SAAA;AAAU;AAAA;AACzG,GAAA,EACF,CAAA;AAEJ,CAAA;AAOO,MAAM,iBAAiB,CAAC,EAAE,QAAA,EAAU,UAAA,GAAa,OAAM,KAA2B;AACvF,EAAA,MAAM,UAAU,CAAA,UAAA,EAAaC,WAAA,GAAQ,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAC,CAAA,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,GAAS,eAAA;AACjC,EAAA,MAAM,OAAA,GAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,KAAA,EAAO,MAAA,GAAS,EAAA,EAAI,MAAA,EAAO;AAE1D,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,OAAO,MAAA,GAAS,CAAA;AAAA,MAChB,MAAA;AAAA,MACA,SAAA,EAAU,4DAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAA,eAAA,CAAC,gBAAA,EAAA,EAAe,EAAA,EAAI,CAAA,EAAG,OAAO,SAAS,aAAA,EAAc,gBAAA,EAAiB,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAI,MAAA,EAC7F,QAAA,EAAA;AAAA,4BAAAH,cAAA,CAAC,UAAK,MAAA,EAAO,GAAA,EAAI,SAAA,EAAU,OAAA,EAAQ,aAAa,CAAA,EAAG,CAAA;AAAA,2CAClD,MAAA,EAAA,EAAK,MAAA,EAAO,KAAI,SAAA,EAAU,OAAA,EAAQ,aAAa,IAAA,EAAM;AAAA,WAAA,EACxD,CAAA;AAAA,yCACC,MAAA,EAAA,EAAK,EAAA,EAAI,GAAG,OAAO,CAAA,OAAA,CAAA,EAAW,WAAU,gBAAA,EAAkB,GAAG,OAAA,EAC5D,QAAA,kBAAAA,cAAA,CAAC,UAAM,GAAG,OAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,OAAO,UAAU,CAAA,EACpD,CAAA;AAAA,0BACAG,eAAA,CAAC,gBAAA,EAAA,EAAe,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAC7D,QAAA,EAAA;AAAA,4BAAAH,cAAA,CAAC,UAAK,MAAA,EAAO,KAAA,EAAM,SAAA,EAAU,OAAA,EAAQ,aAAa,CAAA,EAAG,CAAA;AAAA,2CACpD,MAAA,EAAA,EAAK,MAAA,EAAO,OAAM,SAAA,EAAU,OAAA,EAAQ,aAAa,CAAA,EAAG,CAAA;AAAA,2CACpD,MAAA,EAAA,EAAK,MAAA,EAAO,OAAM,SAAA,EAAU,OAAA,EAAQ,aAAa,CAAA,EAAG,CAAA;AAAA,2CACpD,MAAA,EAAA,EAAK,MAAA,EAAO,OAAM,SAAA,EAAU,OAAA,EAAQ,aAAa,CAAA,EAAG;AAAA,WAAA,EACvD,CAAA;AAAA,0BACAA,cAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,GAAG,OAAO,CAAA,KAAA,CAAA;AAAA,cACd,YAAA,EAAa,gBAAA;AAAA,cACb,GAAG,OAAA,CAAQ,CAAA;AAAA,cACX,GAAG,eAAA,GAAkB,CAAA;AAAA,cACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,cACf,MAAA,EAAQ,eAAA;AAAA,cAER,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,QAAQ,eAAA,EAAiB,IAAA,EAAM,CAAA,KAAA,EAAQ,OAAO,CAAA,KAAA,CAAA,EAAS;AAAA;AAAA,WACrF;AAAA,yCACC,MAAA,EAAA,EAAK,EAAA,EAAI,GAAG,OAAO,CAAA,cAAA,CAAA,EAAkB,WAAU,gBAAA,EAAkB,GAAG,OAAA,EACnE,QAAA,kBAAAA,cAAA,CAAC,UAAM,GAAG,OAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,OAAO,UAAU,CAAA,EACpD;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,cAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,CAAA,KAAA,EAAQ,OAAO,mBACrB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC/B,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,GAAQ,CAAC,CAAA;AAC/B,UAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,UAAA,uBACEA,cAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAO,MAAA;AAAA,cACP,KAAA,EAAO,IAAA;AAAA,cACP,KAAA;AAAA,cACA,OAAA;AAAA,cACA;AAAA,aAAA;AAAA,YALK;AAAA,WAMP;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ,CAAA;;AC7HA,MAAM,uBAAuB,MAAM,MAAA,CAAO,UAAA,GAAa,kCAAkC,EAAE,OAAA,IAAW,KAAA;AAEtG,MAAM,YAAA,GAAe,CAAC,QAAA,KAAqB,CAAA,GAAA,CAAK,IAAI,QAAA,KAAa,CAAA;AAGjE,MAAM,cAAA,GAAiB,CAAC,QAAA,EAAuB,GAAA,KAAgB;AAC7D,EAAA,MAAM,QAAQ,QAAA,CAAS,SAAA;AACvB,EAAA,MAAM,WAAW,GAAA,GAAM,KAAA;AACvB,EAAA,IAAI,sBAAqB,EAAG;AAC1B,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,GAAA,EAAK,CAAA;AACzB,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AACA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,GAAM,SAAA,IAAa,sBAAsB,CAAC,CAAA;AACrE,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,GAAA,EAAK,KAAA,GAAQ,WAAW,YAAA,CAAa,QAAQ,GAAG,CAAA;AACpE,IAAA,IAAI,QAAA,GAAW,CAAA,EAAG,KAAA,GAAQ,qBAAA,CAAsB,IAAI,CAAA;AAAA,EACtD,CAAA;AACA,EAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAClC,EAAA,OAAO,MAAM,qBAAqB,KAAK,CAAA;AACzC,CAAA;AAEA,MAAM,iBAAA,GAAoB,CAAC,QAAA,EAAkB,UAAA,EAAoB,YAAA,KAAyB;AACxF,EAAA,MAAM,SAAS,QAAA,GAAW,eAAA;AAC1B,EAAA,MAAM,YAAY,MAAA,GAAS,eAAA;AAC3B,EAAA,IAAI,MAAA,GAAS,YAAY,OAAO,MAAA;AAChC,EAAA,IAAI,SAAA,GAAY,UAAA,GAAa,YAAA,EAAc,OAAO,SAAA,GAAY,YAAA;AAC9D,EAAA,OAAO,UAAA;AACT,CAAA;AAEA,MAAM,qBAAA,GAAwB,GAAA;AAEvB,MAAM,gBAAA,GAAmB,CAAC,QAAA,EAAkB,IAAA,KACjD,IAAA,GAAO,KAAK,GAAA,CAAI,QAAA,EAAU,qBAAqB,CAAA,GAAI,eAAA,GAAkB,eAAA;AASvE,MAAM,eAAA,GAAkB,CAAC,UAAA,EAAoB,EAAE,YAAY,YAAA,EAAc,IAAA,EAAM,aAAY,KAAoB;AAC7G,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,UAAA,GAAa,eAAA;AAC/B,EAAA,IAAI,CAAC,aAAa,OAAO,UAAA;AACzB,EAAA,OAAO,iBAAA,CAAkB,UAAA,EAAY,UAAA,EAAY,YAAY,CAAA;AAC/D,CAAA;AAEA,MAAM,iBAAiB,CAAC,GAAA,EAAa,aAAA,EAAuB,YAAA,KAC1D,KAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,aAAA,GAAgB,YAAA,EAAc,CAAC,CAAC,CAAA;AAS/D,MAAM,sBAAsB,CAAC,EAAE,YAAY,QAAA,EAAU,IAAA,EAAM,aAAY,KAA+B;AAC3G,EAAA,MAAM,WAAA,GAAcI,aAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,WAAA,GAAcA,aAAmB,MAAS,CAAA;AAChD,EAAA,MAAM,UAAA,GAAaA,aAAO,KAAK,CAAA;AAE/B,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAsB;AAC1C,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,CAAS,aAAa,UAAA,EAAY;AAC1D,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAA;AACxD,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,QAAA,CAAS,SAAA,EAAW,EAAE,YAAY,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,CAAA;AAC/G,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,SAAA,EAAW,QAAA,GAAW,iBAAiB,YAAY,CAAA;AAC9E,IAAA,WAAA,CAAY,OAAA,IAAU;AACtB,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,QAAA,CAAS,QAAA,CAAS,EAAE,GAAA,EAAK,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,QAAA,CAAS,SAAA,cAAuB,OAAA,GAAU,cAAA,CAAe,UAAU,GAAG,CAAA;AAAA,EACpF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmBC,oBAAA,CAAe,MAAM,YAAA,CAAa,IAAI,CAAC,CAAA;AAEhE,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,gBAAA,EAAiB;AACjB,IAAA,OAAO,MAAM,YAAY,OAAA,IAAU;AAAA,EACrC,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO,EAAE,aAAa,YAAA,EAAa;AACrC,CAAA;;AC3EO,MAAM,oBAAoB,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,qBACtDN,cAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAWC,YAAGM,2CAAA,EAAoB,6BAAA,EAA+B,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAGnG,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,uBACEP,cAAA,CAACQ,uBAAA,EAAA,EAAgB,aAAA,EAAe,CAAA,EAC9B,0CAACC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAT,cAAA;AAAA,MAACU,sBAAA;AAAA,MAAA;AAAA,QACC,MAAA,kBACEV,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,SAAA,EAAWC,WAAA;AAAA,kBACT,6DAAA;AAAA,kBACA,eAAA;AAAA,kBACA,SAAA,CAAU,KAAK,MAAM;AAAA;AACvB,eAAA;AAAA,cALK,IAAA,CAAK;AAAA,aAOb;AAAA;AAAA;AACH;AAAA,KAEJ;AAAA,oCACCU,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,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,mCAAA;AAAA,EACX,WAAA,EAAa,qCAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;AAMO,MAAM,qBAAqB,CAAC,EAAE,QAAQ,SAAA,EAAW,GAAG,OAAM,qBAC/DX,cAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAK,KAAA;AAAA,IACL,YAAA,EAAY,aAAa,MAAM,CAAA;AAAA,IAC/B,SAAA,EAAWC,WAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,IAC9E,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAAD,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,WAAA;AAAA,UACT,qFAAA;AAAA,UACA,eAAA;AAAA,UACA,YAAY,MAAM;AAAA;AACpB;AAAA;AACF;AACF;AAGF,MAAM,aAAA,GAAgB,CAAC,EAAE,IAAA,EAAK,KAA8B;AAC1D,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,KAAW,aAAA;AAC/B,EAAA,uBACEE,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EACd,QAAA,EAAA;AAAA,oBAAAH,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAWC,WAAA;AAAA,UACT,8EAAA;AAAA,UACA,eAAA;AAAA,UACA,IAAA,CAAK,MAAA,KAAW,SAAA,GAAY,0BAAA,GAA6B,uBAAA;AAAA,UACzD,SAAS,qCAAA,GAAwC;AAAA,SACnD;AAAA,QAEA,QAAA,kBAAAD,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWC,WAAA;AAAA,cACT,2FAAA;AAAA,cACA,eAAA;AAAA,cACA,IAAA,CAAK,MAAA,KAAW,WAAA,GACZ,2CAAA,GACA;AAAA,aACN;AAAA,YAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR;AAAA,KACF;AAAA,oBACAD,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,eAAa,CAAC,MAAA;AAAA,QACd,SAAA,EAAWC,WAAA;AAAA,UACT,gRAAA;AAAA,UACA,eAAA;AAAA,UACA,SACI,wDAAA,GACA;AAAA,SACN;AAAA,QAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR,GAAA,EACF,CAAA;AAEJ,CAAA;AAMO,MAAM,WAAA,GAAc,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,GAAG,KAAA,EAAM,qBAC7DE,eAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAWF,YAAG,4BAAA,EAA8B,SAAS,CAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,iBAAiB,GAAG,KAAA,EAAM,EAAI,GAAG,KAAA,EAC5G,QAAA,EAAA;AAAA,kBAAAD,cAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAWC,WAAA;AAAA,QACT,kBAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,QAC9B;AAAA;AACF;AAAA,GACF;AAAA,kBACAD,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,WAAA;AAAA,QACT,wCAAA;AAAA,QACA,eAAA;AAAA,QACA,IAAA,CAAK,MAAA,KAAW,aAAA,GAAgB,2CAAA,GAA8C;AAAA,OAChF;AAAA,MAEA,QAAA,kBAAAD,cAAA,CAAC,iBAAc,IAAA,EAAY;AAAA;AAAA;AAC7B,CAAA,EACF;AAGF,MAAM,YAAA,GAAe,EAAA;AAGrB,MAAM,SAAA,GACJ,wUAAA;AACF,MAAM,qBAAA,GAAwB,sFAAA;AAE9B,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAA0B;AAClD,EAAA,MAAM,cAAc,KAAA,CAAM,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,aAAa,CAAA;AACzE,EAAA,IAAI,WAAA,IAAe,GAAG,OAAO,WAAA;AAC7B,EAAA,MAAM,eAAe,KAAA,CAAM,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,SAAS,CAAA;AACtE,EAAA,IAAI,YAAA,IAAgB,GAAG,OAAO,YAAA;AAC9B,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA;AACxB,CAAA;AASO,MAAM,WAAW,CAAC;AAAA,EACvB,KAAA;AAAA,EACA,gBAAA,GAAmB,IAAA;AAAA,EACnB,oBAAA,GAAuB,IAAA;AAAA,EACvB,WAAA,GAAc,IAAA;AAAA,EACd,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIY,eAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,SAASV,WAAA,EAAM;AACrB,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,UAAQ,IAAA,CAAK,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AACpE,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,EAAA,MAAM,UAAA,GAAa,iBAAiB,KAAK,CAAA;AACzC,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACjD,EAAA,MAAM,EAAE,WAAA,EAAa,YAAA,EAAa,GAAI,mBAAA,CAAoB;AAAA,IACxD,UAAA;AAAA,IACA,QAAA,EAAU,KAAA;AAAA,IACV,IAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,CAAC,QAAA,KAAsB;AACxC,IAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,IAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,IAAI,KAAA,KAAU,CAAA,IAAM,gBAAA,IAAoB,SAAA,KAAc,OAAQ,OAAO,IAAA;AAErE,EAAA,uBACEC,eAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,WAAA;AAAA,MACX,aAAA,EAAY,WAAA;AAAA,MACZ,gBAAA,EAAgB,OAAO,MAAA,GAAY,EAAA;AAAA,MACnC,OAAA,EAAS,IAAA,GAAO,MAAA,GAAY,MAAM,WAAW,IAAI,CAAA;AAAA,MACjD,WAAWF,WAAA,CAAG,0BAAA,EAA4B,CAAC,IAAA,IAAQ,kBAAkB,SAAS,CAAA;AAAA,MAC7E,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAD,cAAA;AAAA,UAACa,qBAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,MAAA;AAAA,YACJ,SAAA,EAAW,CAAA,EAAG,YAAA,GAAe,CAAA,GAAI,YAAY,CAAA,EAAA,CAAA;AAAA,YAC7C,IAAA,EAAM,KAAA;AAAA,YACN,iBAAA,EAAmBZ,WAAA;AAAA,cACjB,SAAA;AAAA,cACA,mCAAA;AAAA,cACA,eAAA;AAAA,cACA,OAAO,qBAAA,GAAwB;AAAA,aACjC;AAAA,YACA,WAAA;AAAA,YAEA,QAAA,kBAAAD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO,KAAA,EAAO,EAAE,YAAA,EAAc,YAAA,EAAa,EACxD,QAAA,kBAAAG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,8BAAAH,cAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,MAAM,CAAA,EAAG,UAAA,EAAY,CAAC,IAAA,EAAM,CAAA;AAAA,6CAC5E,IAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC1B,gBAAA,MAAM,WAAA,GAAc,CAAC,IAAA,IAAQ,KAAA,KAAU,UAAA;AACvC,gBAAA,uBAAOA,cAAA,CAAC,eAA0B,IAAA,EAAY,KAAA,EAAO,aAAa,aAAA,EAAa,WAAA,EAAA,EAAtD,KAAK,EAA8D,CAAA;AAAA,cAC9F,CAAC,CAAA,EACH;AAAA,aAAA,EACF,CAAA,EACF;AAAA;AAAA,SACF;AAAA,wBACAG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yGAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,IAAA;AAAA,cACP,aAAA,EAAa,IAAA;AAAA,cACb,SAAA,EAAWC,WAAA;AAAA,gBACT,iDAAA;AAAA,gBACA,eAAA;AAAA,gBACA,OAAO,2BAAA,GAA8B;AAAA,eACvC;AAAA,cAEA,QAAA,kBAAAD,cAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EACb,yCAAC,gBAAA,EAAA,EAAiB,KAAA,EAAc,SAAA,EAAU,MAAA,EAAO,CAAA,EACnD;AAAA;AAAA,WACF;AAAA,0BACAA,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,OAAO,gBAAA,GAAmB,gBAAA;AAAA,cACtC,eAAA,EAAe,IAAA;AAAA,cACf,eAAA,EAAe,MAAA;AAAA,cACf,SAAS,CAAA,KAAA,KAAS;AAChB,gBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,gBAAA,UAAA,CAAW,CAAC,IAAI,CAAA;AAAA,cAClB,CAAA;AAAA,cACA,SAAA,EAAWC,WAAA;AAAA,gBACT,sGAAA;AAAA,gBACAa,kCAAA,CAAY,MAAA;AAAA,gBACZC,gCAAA,CAAU,OAAA;AAAA,gBACV,CAAC,IAAA,IAAQ;AAAA,eACX;AAAA,cAEA,QAAA,kBAAAf,cAAA;AAAA,gBAACgB,uBAAA;AAAA,gBAAA;AAAA,kBACC,WAAWf,WAAA,CAAG,8BAAA,EAAgC,eAAA,EAAiB,IAAA,GAAO,eAAe,UAAU;AAAA;AAAA;AACjG;AAAA;AACF,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;;;;;;"}
|