@mastra/playground-ui 40.0.0-alpha.3 → 40.0.0-alpha.4
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/CHANGELOG.md +43 -0
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/MessageScroller.cjs.js +538 -0
- package/dist/components/MessageScroller.cjs.js.map +1 -0
- package/dist/components/MessageScroller.d.ts +2 -0
- package/dist/components/MessageScroller.es.js +505 -0
- package/dist/components/MessageScroller.es.js.map +1 -0
- package/dist/components/Tabs.cjs.js +1 -1
- package/dist/components/Tabs.es.js +1 -1
- package/dist/components/ThreadRail.cjs.js +432 -0
- package/dist/components/ThreadRail.cjs.js.map +1 -0
- package/dist/components/ThreadRail.d.ts +2 -0
- package/dist/components/ThreadRail.es.js +407 -0
- package/dist/components/ThreadRail.es.js.map +1 -0
- package/dist/components/Tree.cjs.js +2 -2
- package/dist/components/Tree.cjs.js.map +1 -1
- package/dist/components/Tree.es.js +1 -1
- package/dist/components/Tree.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card-view.cjs.js +64 -42
- package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card-view.es.js +65 -43
- package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/ee/signals/components/signal-details-page.cjs.js +1 -1
- package/dist/ee/signals/components/signal-details-page.es.js +1 -1
- package/dist/hooks/use-isomorphic-layout-effect.cjs.js +29 -0
- package/dist/hooks/use-isomorphic-layout-effect.cjs.js.map +1 -0
- package/dist/hooks/use-isomorphic-layout-effect.d.ts +2 -0
- package/dist/hooks/use-isomorphic-layout-effect.es.js +6 -0
- package/dist/hooks/use-isomorphic-layout-effect.es.js.map +1 -0
- package/dist/hooks/use-measured-auto-height.cjs.js +75 -0
- package/dist/hooks/use-measured-auto-height.cjs.js.map +1 -0
- package/dist/hooks/use-measured-auto-height.d.ts +2 -0
- package/dist/hooks/use-measured-auto-height.es.js +52 -0
- package/dist/hooks/use-measured-auto-height.es.js.map +1 -0
- package/dist/message-scroller-hooks-CdsHnth6.js +62 -0
- package/dist/message-scroller-hooks-CdsHnth6.js.map +1 -0
- package/dist/message-scroller-hooks-DdXqrmC2.cjs +98 -0
- package/dist/message-scroller-hooks-DdXqrmC2.cjs.map +1 -0
- package/dist/src/ds/components/MessageScroller/index.d.ts +2 -0
- package/dist/src/ds/components/MessageScroller/message-scroller-context.d.ts +38 -0
- package/dist/src/ds/components/MessageScroller/message-scroller-hooks.d.ts +26 -0
- package/dist/src/ds/components/MessageScroller/message-scroller.d.ts +44 -0
- package/dist/src/ds/components/Tabs/tabs-tab.d.ts +2 -1
- package/dist/src/ds/components/ThreadRail/index.d.ts +2 -0
- package/dist/src/ds/components/ThreadRail/thread-rail-turns.d.ts +11 -0
- package/dist/src/ds/components/ThreadRail/thread-rail.d.ts +12 -0
- package/dist/src/hooks/use-isomorphic-layout-effect.d.ts +2 -0
- package/dist/src/hooks/use-measured-auto-height.d.ts +8 -0
- package/dist/style.css +249 -5
- package/dist/{tabs-tab-CaZnZdY8.js → tabs-tab-1KGOybMG.js} +27 -17
- package/dist/tabs-tab-1KGOybMG.js.map +1 -0
- package/dist/{tabs-tab-BeUPTvaP.cjs → tabs-tab-DkeS2Iv0.cjs} +27 -17
- package/dist/tabs-tab-DkeS2Iv0.cjs.map +1 -0
- package/package.json +7 -7
- package/dist/tabs-tab-BeUPTvaP.cjs.map +0 -1
- package/dist/tabs-tab-CaZnZdY8.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useState
|
|
2
|
+
import { useState } from 'react';
|
|
3
3
|
import { M as MetricsCard } from '../../../metrics-card-BTBHMGM_.js';
|
|
4
4
|
import { M as MetricsLineChart } from '../../../metrics-line-chart-BUUqDQPW.js';
|
|
5
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-CaZnZdY8.js';
|
|
6
5
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
6
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
7
7
|
import { CHART_COLORS } from './metrics-utils.es.js';
|
|
8
8
|
|
|
9
9
|
const latencySeries = [
|
|
@@ -26,6 +26,9 @@ const latencySeries = [
|
|
|
26
26
|
})
|
|
27
27
|
}
|
|
28
28
|
];
|
|
29
|
+
function isLatencyTab(value) {
|
|
30
|
+
return value === "agents" || value === "workflows" || value === "tools";
|
|
31
|
+
}
|
|
29
32
|
function LatencyChart({ data, onPointClick }) {
|
|
30
33
|
if (data.length === 0) {
|
|
31
34
|
return /* @__PURE__ */ jsx(MetricsCard.NoData, { message: "No latency data yet" });
|
|
@@ -43,19 +46,17 @@ function LatencyChart({ data, onPointClick }) {
|
|
|
43
46
|
);
|
|
44
47
|
}
|
|
45
48
|
function LatencyCardView({ data, isLoading, isError, onPointClick, actions }) {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
}, [data, activeTab, initialTab]);
|
|
49
|
+
const agentsHasData = (data?.agentData.length ?? 0) > 0;
|
|
50
|
+
const workflowsHasData = (data?.workflowData.length ?? 0) > 0;
|
|
51
|
+
const toolsHasData = (data?.toolData.length ?? 0) > 0;
|
|
52
|
+
const tabHasData = {
|
|
53
|
+
agents: agentsHasData,
|
|
54
|
+
workflows: workflowsHasData,
|
|
55
|
+
tools: toolsHasData
|
|
56
|
+
};
|
|
57
|
+
const initialTab = agentsHasData ? "agents" : workflowsHasData ? "workflows" : toolsHasData ? "tools" : "agents";
|
|
58
|
+
const [selectedTab, setSelectedTab] = useState("agents");
|
|
59
|
+
const activeTab = tabHasData[selectedTab] ? selectedTab : initialTab;
|
|
59
60
|
const renderedActions = typeof actions === "function" ? actions(activeTab) : actions;
|
|
60
61
|
const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);
|
|
61
62
|
const p50Values = data ? Object.values(data).filter(Array.isArray).flat().map((d) => d.p50).filter((v) => typeof v === "number") : [];
|
|
@@ -66,34 +67,55 @@ function LatencyCardView({ data, isLoading, isError, onPointClick, actions }) {
|
|
|
66
67
|
hasData && /* @__PURE__ */ jsx(MetricsCard.Summary, { value: avgP50, label: "Avg p50" }),
|
|
67
68
|
renderedActions ? /* @__PURE__ */ jsx(MetricsCard.Actions, { children: renderedActions }) : null
|
|
68
69
|
] }),
|
|
69
|
-
isLoading ? /* @__PURE__ */ jsx(MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsx(MetricsCard.Error, { message: "Failed to load latency data" }) : /* @__PURE__ */ jsx(MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsx(MetricsCard.NoData, { message: "No latency data yet" }) : /* @__PURE__ */ jsxs(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
70
|
+
isLoading ? /* @__PURE__ */ jsx(MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsx(MetricsCard.Error, { message: "Failed to load latency data" }) : /* @__PURE__ */ jsx(MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsx(MetricsCard.NoData, { message: "No latency data yet" }) : /* @__PURE__ */ jsxs(
|
|
71
|
+
Tabs,
|
|
72
|
+
{
|
|
73
|
+
value: activeTab,
|
|
74
|
+
onValueChange: (value) => {
|
|
75
|
+
if (isLatencyTab(value) && tabHasData[value]) {
|
|
76
|
+
setSelectedTab(value);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
defaultTab: initialTab,
|
|
80
|
+
className: "overflow-visible",
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ jsxs(TabList, { children: [
|
|
83
|
+
/* @__PURE__ */ jsx(Tab, { value: "agents", disabled: !agentsHasData, disabledTooltip: "No agent latency data for this period", children: "Agents" }),
|
|
84
|
+
/* @__PURE__ */ jsx(
|
|
85
|
+
Tab,
|
|
86
|
+
{
|
|
87
|
+
value: "workflows",
|
|
88
|
+
disabled: !workflowsHasData,
|
|
89
|
+
disabledTooltip: "No workflow latency data for this period",
|
|
90
|
+
children: "Workflows"
|
|
91
|
+
}
|
|
92
|
+
),
|
|
93
|
+
/* @__PURE__ */ jsx(Tab, { value: "tools", disabled: !toolsHasData, disabledTooltip: "No tool latency data for this period", children: "Tools" })
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsx(TabContent, { value: "agents", children: /* @__PURE__ */ jsx(
|
|
96
|
+
LatencyChart,
|
|
97
|
+
{
|
|
98
|
+
data: data.agentData,
|
|
99
|
+
onPointClick: onPointClick ? (p) => onPointClick("agents", p) : void 0
|
|
100
|
+
}
|
|
101
|
+
) }),
|
|
102
|
+
/* @__PURE__ */ jsx(TabContent, { value: "workflows", children: /* @__PURE__ */ jsx(
|
|
103
|
+
LatencyChart,
|
|
104
|
+
{
|
|
105
|
+
data: data.workflowData,
|
|
106
|
+
onPointClick: onPointClick ? (p) => onPointClick("workflows", p) : void 0
|
|
107
|
+
}
|
|
108
|
+
) }),
|
|
109
|
+
/* @__PURE__ */ jsx(TabContent, { value: "tools", children: /* @__PURE__ */ jsx(
|
|
110
|
+
LatencyChart,
|
|
111
|
+
{
|
|
112
|
+
data: data.toolData,
|
|
113
|
+
onPointClick: onPointClick ? (p) => onPointClick("tools", p) : void 0
|
|
114
|
+
}
|
|
115
|
+
) })
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
) })
|
|
97
119
|
] });
|
|
98
120
|
}
|
|
99
121
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"latency-card-view.es.js","sources":["../../../../src/domains/metrics/components/latency-card-view.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { LatencyPoint } from '../hooks/use-latency-metrics';\nimport { CHART_COLORS } from './metrics-utils';\n\nconst latencySeries = [\n {\n dataKey: 'p50',\n label: 'p50',\n color: CHART_COLORS.blue,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p50 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n {\n dataKey: 'p95',\n label: 'p95',\n color: CHART_COLORS.yellow,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p95 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n];\n\nexport type LatencyTab = 'agents' | 'workflows' | 'tools';\n\nfunction LatencyChart({ data, onPointClick }: { data: LatencyPoint[]; onPointClick?: (point: LatencyPoint) => void }) {\n if (data.length === 0) {\n return <MetricsCard.NoData message=\"No latency data yet\" />;\n }\n return (\n <MetricsLineChart\n data={data}\n series={latencySeries}\n onPointClick={\n onPointClick\n ? point => {\n const p = point as LatencyPoint;\n if (typeof p?.tsMs === 'number' && Number.isFinite(p.tsMs)) onPointClick(p);\n }\n : undefined\n }\n />\n );\n}\n\nexport interface LatencyCardViewProps {\n data: { agentData: LatencyPoint[]; workflowData: LatencyPoint[]; toolData: LatencyPoint[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: invoked when a chart node is clicked. Container provides the navigation. */\n onPointClick?: (tab: LatencyTab, point: LatencyPoint) => void;\n /**\n * Optional slot for top-bar action buttons (e.g. \"View in Traces\").\n * Pass a function to receive the active tab so the action can scope itself to the current entity type.\n */\n actions?: ReactNode | ((tab: LatencyTab) => ReactNode);\n}\n\nexport function LatencyCardView({ data, isLoading, isError, onPointClick, actions }: LatencyCardViewProps) {\n const initialTab: LatencyTab = !data\n ? 'agents'\n : data.agentData.length > 0\n ? 'agents'\n : data.workflowData.length > 0\n ? 'workflows'\n : data.toolData.length > 0\n ? 'tools'\n : 'agents';\n const [activeTab, setActiveTab] = useState<LatencyTab>(initialTab);\n // Resync to a non-empty tab when async data finishes loading. Without this,\n // a card that mounts before data arrives stays stuck on `agents` even when\n // only workflow/tool data exists.\n useEffect(() => {\n if (!data) return;\n const tabHasData = {\n agents: data.agentData.length > 0,\n workflows: data.workflowData.length > 0,\n tools: data.toolData.length > 0,\n } as const;\n if (!tabHasData[activeTab] && tabHasData[initialTab]) {\n setActiveTab(initialTab);\n }\n }, [data, activeTab, initialTab]);\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const p50Values = data\n ? Object.values(data)\n .filter(Array.isArray)\n .flat()\n .map(d => d.p50)\n .filter((v): v is number => typeof v === 'number')\n : [];\n const avgP50 =\n p50Values.length > 0 ? `${Math.round(p50Values.reduce((s, v) => s + v, 0) / p50Values.length)}ms` : '—';\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Latency\" description=\"Hourly p50 and p95 latency.\" />\n {hasData && <MetricsCard.Summary value={avgP50} label=\"Avg p50\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load latency data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No latency data yet\" />\n ) : (\n <Tabs value={activeTab} onValueChange={setActiveTab} defaultTab={initialTab} className=\"overflow-visible\">\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\">\n <LatencyChart\n data={data.agentData}\n onPointClick={onPointClick ? p => onPointClick('agents', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"workflows\">\n <LatencyChart\n data={data.workflowData}\n onPointClick={onPointClick ? p => onPointClick('workflows', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"tools\">\n <LatencyChart\n data={data.toolData}\n onPointClick={onPointClick ? p => onPointClick('tools', p) : undefined}\n />\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"latency-card-view.es.js","sources":["../../../../src/domains/metrics/components/latency-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart/metrics-line-chart';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LatencyPoint } from '../hooks/use-latency-metrics';\nimport { CHART_COLORS } from './metrics-utils';\n\nconst latencySeries = [\n {\n dataKey: 'p50',\n label: 'p50',\n color: CHART_COLORS.blue,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p50 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n {\n dataKey: 'p95',\n label: 'p95',\n color: CHART_COLORS.yellow,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p95 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n];\n\nexport type LatencyTab = 'agents' | 'workflows' | 'tools';\n\nfunction isLatencyTab(value: string): value is LatencyTab {\n return value === 'agents' || value === 'workflows' || value === 'tools';\n}\n\nfunction LatencyChart({ data, onPointClick }: { data: LatencyPoint[]; onPointClick?: (point: LatencyPoint) => void }) {\n if (data.length === 0) {\n return <MetricsCard.NoData message=\"No latency data yet\" />;\n }\n return (\n <MetricsLineChart\n data={data}\n series={latencySeries}\n onPointClick={\n onPointClick\n ? point => {\n const p = point as LatencyPoint;\n if (typeof p?.tsMs === 'number' && Number.isFinite(p.tsMs)) onPointClick(p);\n }\n : undefined\n }\n />\n );\n}\n\nexport interface LatencyCardViewProps {\n data: { agentData: LatencyPoint[]; workflowData: LatencyPoint[]; toolData: LatencyPoint[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: invoked when a chart node is clicked. Container provides the navigation. */\n onPointClick?: (tab: LatencyTab, point: LatencyPoint) => void;\n /**\n * Optional slot for top-bar action buttons (e.g. \"View in Traces\").\n * Pass a function to receive the active tab so the action can scope itself to the current entity type.\n */\n actions?: ReactNode | ((tab: LatencyTab) => ReactNode);\n}\n\nexport function LatencyCardView({ data, isLoading, isError, onPointClick, actions }: LatencyCardViewProps) {\n const agentsHasData = (data?.agentData.length ?? 0) > 0;\n const workflowsHasData = (data?.workflowData.length ?? 0) > 0;\n const toolsHasData = (data?.toolData.length ?? 0) > 0;\n const tabHasData = {\n agents: agentsHasData,\n workflows: workflowsHasData,\n tools: toolsHasData,\n } as const;\n const initialTab: LatencyTab = agentsHasData\n ? 'agents'\n : workflowsHasData\n ? 'workflows'\n : toolsHasData\n ? 'tools'\n : 'agents';\n const [selectedTab, setSelectedTab] = useState<LatencyTab>('agents');\n const activeTab = tabHasData[selectedTab] ? selectedTab : initialTab;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const p50Values = data\n ? Object.values(data)\n .filter(Array.isArray)\n .flat()\n .map(d => d.p50)\n .filter((v): v is number => typeof v === 'number')\n : [];\n const avgP50 =\n p50Values.length > 0 ? `${Math.round(p50Values.reduce((s, v) => s + v, 0) / p50Values.length)}ms` : '—';\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Latency\" description=\"Hourly p50 and p95 latency.\" />\n {hasData && <MetricsCard.Summary value={avgP50} label=\"Avg p50\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load latency data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No latency data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={value => {\n if (isLatencyTab(value) && tabHasData[value]) {\n setSelectedTab(value);\n }\n }}\n defaultTab={initialTab}\n className=\"overflow-visible\"\n >\n <TabList>\n <Tab value=\"agents\" disabled={!agentsHasData} disabledTooltip=\"No agent latency data for this period\">\n Agents\n </Tab>\n <Tab\n value=\"workflows\"\n disabled={!workflowsHasData}\n disabledTooltip=\"No workflow latency data for this period\"\n >\n Workflows\n </Tab>\n <Tab value=\"tools\" disabled={!toolsHasData} disabledTooltip=\"No tool latency data for this period\">\n Tools\n </Tab>\n </TabList>\n <TabContent value=\"agents\">\n <LatencyChart\n data={data.agentData}\n onPointClick={onPointClick ? p => onPointClick('agents', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"workflows\">\n <LatencyChart\n data={data.workflowData}\n onPointClick={onPointClick ? p => onPointClick('workflows', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"tools\">\n <LatencyChart\n data={data.toolData}\n onPointClick={onPointClick ? p => onPointClick('tools', p) : undefined}\n />\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ const React = require('react');
|
|
|
7
7
|
const dataList = require('../../../data-list-DDQRmA6L.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-CriQ3I_h.cjs');
|
|
9
9
|
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
10
|
-
const tabsTab = require('../../../tabs-tab-
|
|
10
|
+
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
11
11
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
12
12
|
|
|
13
13
|
function isMemoryTab(value) {
|
|
@@ -3,7 +3,7 @@ import { useState } from 'react';
|
|
|
3
3
|
import { D as DataList } from '../../../data-list-D5uItcj6.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-BTBHMGM_.js';
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
6
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-
|
|
6
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
7
7
|
import { METRICS_DATA_LIST_PROPS, formatCompact, formatCost } from './metrics-utils.es.js';
|
|
8
8
|
|
|
9
9
|
function isMemoryTab(value) {
|
|
@@ -8,7 +8,7 @@ const dataList = require('../../../data-list-DDQRmA6L.cjs');
|
|
|
8
8
|
const metricsCard = require('../../../metrics-card-CriQ3I_h.cjs');
|
|
9
9
|
const metricsLineChart = require('../../../metrics-line-chart-D1ZGVepo.cjs');
|
|
10
10
|
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
11
|
-
const tabsTab = require('../../../tabs-tab-
|
|
11
|
+
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
12
12
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
13
13
|
|
|
14
14
|
const SERIES_COLORS = [
|
|
@@ -4,7 +4,7 @@ import { D as DataList } from '../../../data-list-D5uItcj6.js';
|
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-BTBHMGM_.js';
|
|
5
5
|
import { M as MetricsLineChart } from '../../../metrics-line-chart-BUUqDQPW.js';
|
|
6
6
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
7
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-
|
|
7
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
8
8
|
import { CHART_COLORS, METRICS_DATA_LIST_PROPS } from './metrics-utils.es.js';
|
|
9
9
|
|
|
10
10
|
const SERIES_COLORS = [
|
|
@@ -7,7 +7,7 @@ const React = require('react');
|
|
|
7
7
|
const horizontalBars = require('../../../horizontal-bars-CjZn3RnH.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-CriQ3I_h.cjs');
|
|
9
9
|
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
10
|
-
const tabsTab = require('../../../tabs-tab-
|
|
10
|
+
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
11
11
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
12
12
|
|
|
13
13
|
function isTokenUsageTab(value) {
|
|
@@ -3,7 +3,7 @@ import { useState } from 'react';
|
|
|
3
3
|
import { H as HorizontalBars } from '../../../horizontal-bars-D_1wypjd.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-BTBHMGM_.js';
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
6
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-
|
|
6
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
7
7
|
import { formatCost, formatCompact, CHART_COLORS } from './metrics-utils.es.js';
|
|
8
8
|
|
|
9
9
|
function isTokenUsageTab(value) {
|
|
@@ -6,7 +6,7 @@ const jsxRuntime = require('react/jsx-runtime');
|
|
|
6
6
|
const React = require('react');
|
|
7
7
|
const metricsCard = require('../../../metrics-card-CriQ3I_h.cjs');
|
|
8
8
|
const metricsLineChart = require('../../../metrics-line-chart-D1ZGVepo.cjs');
|
|
9
|
-
const tabsTab = require('../../../tabs-tab-
|
|
9
|
+
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
10
10
|
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
11
11
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
12
12
|
|
|
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { M as MetricsCard } from '../../../metrics-card-BTBHMGM_.js';
|
|
4
4
|
import { M as MetricsLineChart } from '../../../metrics-line-chart-BUUqDQPW.js';
|
|
5
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-
|
|
5
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
6
6
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
7
7
|
import { CHART_COLORS, formatCompact, formatCost } from './metrics-utils.es.js';
|
|
8
8
|
|
|
@@ -7,7 +7,7 @@ const React = require('react');
|
|
|
7
7
|
const horizontalBars = require('../../../horizontal-bars-CjZn3RnH.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-CriQ3I_h.cjs');
|
|
9
9
|
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
10
|
-
const tabsTab = require('../../../tabs-tab-
|
|
10
|
+
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
11
11
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
12
12
|
|
|
13
13
|
function VolumeBars({
|
|
@@ -3,7 +3,7 @@ import { useState } from 'react';
|
|
|
3
3
|
import { H as HorizontalBars } from '../../../horizontal-bars-D_1wypjd.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-BTBHMGM_.js';
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
6
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-
|
|
6
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
7
7
|
import { formatCompact, CHART_COLORS } from './metrics-utils.es.js';
|
|
8
8
|
|
|
9
9
|
function VolumeBars({
|
|
@@ -11,7 +11,7 @@ const buttonsGroup = require('../../../buttons-group-C0fJastT.cjs');
|
|
|
11
11
|
const dataKeysAndValues = require('../../../data-keys-and-values-B-K23j9Y.cjs');
|
|
12
12
|
const dataPanel = require('../../../data-panel-D7TbjekV.cjs');
|
|
13
13
|
const Notice = require('../../../Notice-h63wsfzJ.cjs');
|
|
14
|
-
const tabsTab = require('../../../tabs-tab-
|
|
14
|
+
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
15
15
|
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
16
16
|
|
|
17
17
|
function buildDialogTitle(sectionTitle, icon, span) {
|
|
@@ -7,7 +7,7 @@ import { B as ButtonsGroup } from '../../../buttons-group-b6an6uao.js';
|
|
|
7
7
|
import { D as DataKeysAndValues } from '../../../data-keys-and-values-Dly5DG8l.js';
|
|
8
8
|
import { D as DataPanel } from '../../../data-panel-BxX4ohtd.js';
|
|
9
9
|
import { N as Notice } from '../../../Notice-CiS1Dv3i.js';
|
|
10
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-
|
|
10
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
11
11
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
12
12
|
|
|
13
13
|
function buildDialogTitle(sectionTitle, icon, span) {
|
|
@@ -10,7 +10,7 @@ const dataList = require('../../../data-list-DDQRmA6L.cjs');
|
|
|
10
10
|
const inputGroup = require('../../../input-group-CF6DB97L.cjs');
|
|
11
11
|
const scatterPlotChart = require('../../../scatter-plot-chart-CFZO31md.cjs');
|
|
12
12
|
const skeleton = require('../../../skeleton-D5zq7rhk.cjs');
|
|
13
|
-
const tabsTab = require('../../../tabs-tab-
|
|
13
|
+
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
14
14
|
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
15
15
|
const utils_cn = require('../../../cn-vA5sWo9W.cjs');
|
|
16
16
|
const ee_topics_components_topicsLayout = require('../../topics/components/topics-layout.cjs.js');
|
|
@@ -6,7 +6,7 @@ import { D as DataList } from '../../../data-list-D5uItcj6.js';
|
|
|
6
6
|
import { I as InputGroup, a as InputGroupAddon, c as InputGroupInput } from '../../../input-group-DvVwUJwx.js';
|
|
7
7
|
import { S as ScatterPlotChart } from '../../../scatter-plot-chart-B3hfFMKS.js';
|
|
8
8
|
import { S as Skeleton } from '../../../skeleton-CUjhGPAx.js';
|
|
9
|
-
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-
|
|
9
|
+
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
|
|
10
10
|
import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
|
|
11
11
|
import { c as cn } from '../../../cn-BakJzhuv.js';
|
|
12
12
|
import { TopicsLayout } from '../../topics/components/topics-layout.es.js';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
const React = require('react');
|
|
6
|
+
|
|
7
|
+
function _interopNamespaceDefault(e) {
|
|
8
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
9
|
+
if (e) {
|
|
10
|
+
for (const k in e) {
|
|
11
|
+
if (k !== 'default') {
|
|
12
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: () => e[k]
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
n.default = e;
|
|
21
|
+
return Object.freeze(n);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
25
|
+
|
|
26
|
+
const useIsomorphicLayoutEffect = typeof window === "undefined" ? React__namespace.useEffect : React__namespace.useLayoutEffect;
|
|
27
|
+
|
|
28
|
+
exports.useIsomorphicLayoutEffect = useIsomorphicLayoutEffect;
|
|
29
|
+
//# sourceMappingURL=use-isomorphic-layout-effect.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-isomorphic-layout-effect.cjs.js","sources":["../../src/hooks/use-isomorphic-layout-effect.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,4BAA4B,OAAO,MAAA,KAAW,WAAA,GAAcA,gBAAA,CAAM,YAAYA,gBAAA,CAAM;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-isomorphic-layout-effect.es.js","sources":["../../src/hooks/use-isomorphic-layout-effect.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;\n"],"names":[],"mappings":";;AAEO,MAAM,4BAA4B,OAAO,MAAA,KAAW,WAAA,GAAc,KAAA,CAAM,YAAY,KAAA,CAAM;;;;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
const React = require('react');
|
|
6
|
+
const hooks_useIsomorphicLayoutEffect = require('./use-isomorphic-layout-effect.cjs.js');
|
|
7
|
+
|
|
8
|
+
function _interopNamespaceDefault(e) {
|
|
9
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
10
|
+
if (e) {
|
|
11
|
+
for (const k in e) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: () => e[k]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
26
|
+
|
|
27
|
+
const getElementHeight = (element) => {
|
|
28
|
+
const rectHeight = element.getBoundingClientRect().height;
|
|
29
|
+
const measuredHeight = rectHeight > 0 ? rectHeight : element.scrollHeight;
|
|
30
|
+
return Math.ceil(measuredHeight);
|
|
31
|
+
};
|
|
32
|
+
function useMeasuredAutoHeight() {
|
|
33
|
+
const [element, setElement] = React__namespace.useState(null);
|
|
34
|
+
const [height, setHeight] = React__namespace.useState(null);
|
|
35
|
+
const frameRef = React__namespace.useRef(null);
|
|
36
|
+
const measure = React__namespace.useCallback(() => {
|
|
37
|
+
if (!element) return null;
|
|
38
|
+
const nextHeight = getElementHeight(element);
|
|
39
|
+
setHeight((currentHeight) => currentHeight === nextHeight ? currentHeight : nextHeight);
|
|
40
|
+
return nextHeight;
|
|
41
|
+
}, [element]);
|
|
42
|
+
hooks_useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
|
|
43
|
+
if (!element) return void 0;
|
|
44
|
+
measure();
|
|
45
|
+
if (typeof ResizeObserver === "undefined") return void 0;
|
|
46
|
+
const scheduleMeasure = () => {
|
|
47
|
+
if (frameRef.current !== null) {
|
|
48
|
+
window.cancelAnimationFrame(frameRef.current);
|
|
49
|
+
}
|
|
50
|
+
frameRef.current = window.requestAnimationFrame(() => {
|
|
51
|
+
frameRef.current = null;
|
|
52
|
+
measure();
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
const resizeObserver = new ResizeObserver(scheduleMeasure);
|
|
56
|
+
resizeObserver.observe(element);
|
|
57
|
+
return () => {
|
|
58
|
+
resizeObserver.disconnect();
|
|
59
|
+
if (frameRef.current !== null) {
|
|
60
|
+
window.cancelAnimationFrame(frameRef.current);
|
|
61
|
+
frameRef.current = null;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}, [element, measure]);
|
|
65
|
+
const heightStyle = React__namespace.useMemo(() => height === null ? {} : { height }, [height]);
|
|
66
|
+
return {
|
|
67
|
+
ref: setElement,
|
|
68
|
+
height,
|
|
69
|
+
heightStyle,
|
|
70
|
+
measure
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.useMeasuredAutoHeight = useMeasuredAutoHeight;
|
|
75
|
+
//# sourceMappingURL=use-measured-auto-height.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-measured-auto-height.cjs.js","sources":["../../src/hooks/use-measured-auto-height.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';\n\nconst getElementHeight = (element: HTMLElement): number => {\n const rectHeight = element.getBoundingClientRect().height;\n const measuredHeight = rectHeight > 0 ? rectHeight : element.scrollHeight;\n return Math.ceil(measuredHeight);\n};\n\nexport interface UseMeasuredAutoHeightResult<TElement extends HTMLElement> {\n ref: React.RefCallback<TElement>;\n height: number | null;\n heightStyle: React.CSSProperties;\n measure: () => number | null;\n}\n\nexport function useMeasuredAutoHeight<\n TElement extends HTMLElement = HTMLDivElement,\n>(): UseMeasuredAutoHeightResult<TElement> {\n const [element, setElement] = React.useState<TElement | null>(null);\n const [height, setHeight] = React.useState<number | null>(null);\n const frameRef = React.useRef<number | null>(null);\n\n const measure = React.useCallback(() => {\n if (!element) return null;\n\n const nextHeight = getElementHeight(element);\n setHeight(currentHeight => (currentHeight === nextHeight ? currentHeight : nextHeight));\n return nextHeight;\n }, [element]);\n\n useIsomorphicLayoutEffect(() => {\n if (!element) return undefined;\n\n measure();\n\n if (typeof ResizeObserver === 'undefined') return undefined;\n\n const scheduleMeasure = () => {\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current);\n }\n\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = null;\n measure();\n });\n };\n\n const resizeObserver = new ResizeObserver(scheduleMeasure);\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.disconnect();\n\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n };\n }, [element, measure]);\n\n const heightStyle = React.useMemo<React.CSSProperties>(() => (height === null ? {} : { height }), [height]);\n\n return {\n ref: setElement,\n height,\n heightStyle,\n measure,\n };\n}\n"],"names":["React","useIsomorphicLayoutEffect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,gBAAA,GAAmB,CAAC,OAAA,KAAiC;AACzD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,qBAAA,EAAsB,CAAE,MAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,UAAA,GAAa,CAAA,GAAI,UAAA,GAAa,OAAA,CAAQ,YAAA;AAC7D,EAAA,OAAO,IAAA,CAAK,KAAK,cAAc,CAAA;AACjC,CAAA;AASO,SAAS,qBAAA,GAE2B;AACzC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAA,CAAM,SAA0B,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAAA,CAAM,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAWA,gBAAA,CAAM,MAAA,CAAsB,IAAI,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAUA,gBAAA,CAAM,WAAA,CAAY,MAAM;AACtC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,SAAA,CAAU,CAAA,aAAA,KAAkB,aAAA,KAAkB,UAAA,GAAa,aAAA,GAAgB,UAAW,CAAA;AACtF,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAC,yDAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,IAAA,OAAA,EAAQ;AAER,IAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,MAAA;AAElD,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA,MAAA,CAAO,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAAA,MAC9C;AAEA,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,qBAAA,CAAsB,MAAM;AACpD,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,eAAe,CAAA;AACzD,IAAA,cAAA,CAAe,QAAQ,OAAO,CAAA;AAE9B,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,CAAe,UAAA,EAAW;AAE1B,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA,MAAA,CAAO,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAC5C,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAErB,EAAA,MAAM,WAAA,GAAcD,gBAAA,CAAM,OAAA,CAA6B,MAAO,MAAA,KAAW,IAAA,GAAO,EAAC,GAAI,EAAE,MAAA,EAAO,EAAI,CAAC,MAAM,CAAC,CAAA;AAE1G,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,UAAA;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect.es.js';
|
|
3
|
+
|
|
4
|
+
const getElementHeight = (element) => {
|
|
5
|
+
const rectHeight = element.getBoundingClientRect().height;
|
|
6
|
+
const measuredHeight = rectHeight > 0 ? rectHeight : element.scrollHeight;
|
|
7
|
+
return Math.ceil(measuredHeight);
|
|
8
|
+
};
|
|
9
|
+
function useMeasuredAutoHeight() {
|
|
10
|
+
const [element, setElement] = React.useState(null);
|
|
11
|
+
const [height, setHeight] = React.useState(null);
|
|
12
|
+
const frameRef = React.useRef(null);
|
|
13
|
+
const measure = React.useCallback(() => {
|
|
14
|
+
if (!element) return null;
|
|
15
|
+
const nextHeight = getElementHeight(element);
|
|
16
|
+
setHeight((currentHeight) => currentHeight === nextHeight ? currentHeight : nextHeight);
|
|
17
|
+
return nextHeight;
|
|
18
|
+
}, [element]);
|
|
19
|
+
useIsomorphicLayoutEffect(() => {
|
|
20
|
+
if (!element) return void 0;
|
|
21
|
+
measure();
|
|
22
|
+
if (typeof ResizeObserver === "undefined") return void 0;
|
|
23
|
+
const scheduleMeasure = () => {
|
|
24
|
+
if (frameRef.current !== null) {
|
|
25
|
+
window.cancelAnimationFrame(frameRef.current);
|
|
26
|
+
}
|
|
27
|
+
frameRef.current = window.requestAnimationFrame(() => {
|
|
28
|
+
frameRef.current = null;
|
|
29
|
+
measure();
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const resizeObserver = new ResizeObserver(scheduleMeasure);
|
|
33
|
+
resizeObserver.observe(element);
|
|
34
|
+
return () => {
|
|
35
|
+
resizeObserver.disconnect();
|
|
36
|
+
if (frameRef.current !== null) {
|
|
37
|
+
window.cancelAnimationFrame(frameRef.current);
|
|
38
|
+
frameRef.current = null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}, [element, measure]);
|
|
42
|
+
const heightStyle = React.useMemo(() => height === null ? {} : { height }, [height]);
|
|
43
|
+
return {
|
|
44
|
+
ref: setElement,
|
|
45
|
+
height,
|
|
46
|
+
heightStyle,
|
|
47
|
+
measure
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { useMeasuredAutoHeight };
|
|
52
|
+
//# sourceMappingURL=use-measured-auto-height.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-measured-auto-height.es.js","sources":["../../src/hooks/use-measured-auto-height.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';\n\nconst getElementHeight = (element: HTMLElement): number => {\n const rectHeight = element.getBoundingClientRect().height;\n const measuredHeight = rectHeight > 0 ? rectHeight : element.scrollHeight;\n return Math.ceil(measuredHeight);\n};\n\nexport interface UseMeasuredAutoHeightResult<TElement extends HTMLElement> {\n ref: React.RefCallback<TElement>;\n height: number | null;\n heightStyle: React.CSSProperties;\n measure: () => number | null;\n}\n\nexport function useMeasuredAutoHeight<\n TElement extends HTMLElement = HTMLDivElement,\n>(): UseMeasuredAutoHeightResult<TElement> {\n const [element, setElement] = React.useState<TElement | null>(null);\n const [height, setHeight] = React.useState<number | null>(null);\n const frameRef = React.useRef<number | null>(null);\n\n const measure = React.useCallback(() => {\n if (!element) return null;\n\n const nextHeight = getElementHeight(element);\n setHeight(currentHeight => (currentHeight === nextHeight ? currentHeight : nextHeight));\n return nextHeight;\n }, [element]);\n\n useIsomorphicLayoutEffect(() => {\n if (!element) return undefined;\n\n measure();\n\n if (typeof ResizeObserver === 'undefined') return undefined;\n\n const scheduleMeasure = () => {\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current);\n }\n\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = null;\n measure();\n });\n };\n\n const resizeObserver = new ResizeObserver(scheduleMeasure);\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.disconnect();\n\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n };\n }, [element, measure]);\n\n const heightStyle = React.useMemo<React.CSSProperties>(() => (height === null ? {} : { height }), [height]);\n\n return {\n ref: setElement,\n height,\n heightStyle,\n measure,\n };\n}\n"],"names":[],"mappings":";;;AAIA,MAAM,gBAAA,GAAmB,CAAC,OAAA,KAAiC;AACzD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,qBAAA,EAAsB,CAAE,MAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,UAAA,GAAa,CAAA,GAAI,UAAA,GAAa,OAAA,CAAQ,YAAA;AAC7D,EAAA,OAAO,IAAA,CAAK,KAAK,cAAc,CAAA;AACjC,CAAA;AASO,SAAS,qBAAA,GAE2B;AACzC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,KAAA,CAAM,SAA0B,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,KAAA,CAAM,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAsB,IAAI,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,CAAY,MAAM;AACtC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,SAAA,CAAU,CAAA,aAAA,KAAkB,aAAA,KAAkB,UAAA,GAAa,aAAA,GAAgB,UAAW,CAAA;AACtF,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,IAAA,OAAA,EAAQ;AAER,IAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,MAAA;AAElD,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA,MAAA,CAAO,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAAA,MAC9C;AAEA,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,qBAAA,CAAsB,MAAM;AACpD,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,eAAe,CAAA;AACzD,IAAA,cAAA,CAAe,QAAQ,OAAO,CAAA;AAE9B,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,CAAe,UAAA,EAAW;AAE1B,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA,MAAA,CAAO,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAC5C,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAErB,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAA6B,MAAO,MAAA,KAAW,IAAA,GAAO,EAAC,GAAI,EAAE,MAAA,EAAO,EAAI,CAAC,MAAM,CAAC,CAAA;AAE1G,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,UAAA;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_SCROLLABLE = { start: false, end: false };
|
|
4
|
+
const DEFAULT_VISIBILITY = { currentAnchorId: void 0, visibleMessageIds: [] };
|
|
5
|
+
const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;
|
|
6
|
+
const DEFAULT_SCROLL_MARGIN = 0;
|
|
7
|
+
const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;
|
|
8
|
+
const MessageScrollerActionsContext = React.createContext(null);
|
|
9
|
+
const MessageScrollerScrollableContext = React.createContext(null);
|
|
10
|
+
const MessageScrollerVisibilityContext = React.createContext(null);
|
|
11
|
+
const useRequiredContext = (context, hookName) => {
|
|
12
|
+
const value = React.useContext(context);
|
|
13
|
+
if (!value) throw new Error(`${hookName} must be used within MessageScrollerProvider.`);
|
|
14
|
+
return value;
|
|
15
|
+
};
|
|
16
|
+
const useRequiredMessageScrollerActionsContext = (hookName) => useRequiredContext(MessageScrollerActionsContext, hookName);
|
|
17
|
+
const useRequiredMessageScrollerScrollableContext = (hookName) => useRequiredContext(MessageScrollerScrollableContext, hookName);
|
|
18
|
+
const useRequiredMessageScrollerVisibilityContext = (hookName) => useRequiredContext(MessageScrollerVisibilityContext, hookName);
|
|
19
|
+
|
|
20
|
+
const useMessageScroller = () => {
|
|
21
|
+
const { scrollToEnd, scrollToMessage, scrollToStart } = useRequiredMessageScrollerActionsContext("useMessageScroller");
|
|
22
|
+
return React.useMemo(
|
|
23
|
+
() => ({ scrollToEnd, scrollToMessage, scrollToStart }),
|
|
24
|
+
[scrollToEnd, scrollToMessage, scrollToStart]
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
const useOptionalMessageScroller = () => {
|
|
28
|
+
const context = React.useContext(MessageScrollerActionsContext);
|
|
29
|
+
return React.useMemo(() => {
|
|
30
|
+
if (!context) return void 0;
|
|
31
|
+
return {
|
|
32
|
+
scrollToEnd: context.scrollToEnd,
|
|
33
|
+
scrollToMessage: context.scrollToMessage,
|
|
34
|
+
scrollToStart: context.scrollToStart
|
|
35
|
+
};
|
|
36
|
+
}, [context]);
|
|
37
|
+
};
|
|
38
|
+
const useMessageScrollerScrollable = () => {
|
|
39
|
+
const { start, end } = useRequiredMessageScrollerScrollableContext("useMessageScrollerScrollable");
|
|
40
|
+
return React.useMemo(() => ({ start, end }), [end, start]);
|
|
41
|
+
};
|
|
42
|
+
const useOptionalMessageScrollerScrollable = () => {
|
|
43
|
+
const context = React.useContext(MessageScrollerScrollableContext);
|
|
44
|
+
return React.useMemo(() => context ? { start: context.start, end: context.end } : void 0, [context]);
|
|
45
|
+
};
|
|
46
|
+
const useMessageScrollerVisibility = () => {
|
|
47
|
+
const { currentAnchorId, visibleMessageIds } = useRequiredMessageScrollerVisibilityContext("useMessageScrollerVisibility");
|
|
48
|
+
return React.useMemo(() => ({ currentAnchorId, visibleMessageIds }), [currentAnchorId, visibleMessageIds]);
|
|
49
|
+
};
|
|
50
|
+
const useOptionalMessageScrollerVisibility = () => {
|
|
51
|
+
const context = React.useContext(MessageScrollerVisibilityContext);
|
|
52
|
+
return React.useMemo(
|
|
53
|
+
() => context ? {
|
|
54
|
+
currentAnchorId: context.currentAnchorId,
|
|
55
|
+
visibleMessageIds: context.visibleMessageIds
|
|
56
|
+
} : void 0,
|
|
57
|
+
[context]
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { DEFAULT_SCROLLABLE as D, MessageScrollerActionsContext as M, useRequiredMessageScrollerScrollableContext as a, DEFAULT_VISIBILITY as b, DEFAULT_SCROLL_EDGE_THRESHOLD as c, DEFAULT_SCROLL_MARGIN as d, DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK as e, MessageScrollerScrollableContext as f, MessageScrollerVisibilityContext as g, useMessageScroller as h, useMessageScrollerScrollable as i, useMessageScrollerVisibility as j, useOptionalMessageScroller as k, useOptionalMessageScrollerScrollable as l, useOptionalMessageScrollerVisibility as m, useRequiredMessageScrollerActionsContext as u };
|
|
62
|
+
//# sourceMappingURL=message-scroller-hooks-CdsHnth6.js.map
|