@mastra/playground-ui 38.0.0-alpha.5 → 38.0.0-alpha.7
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 +19 -0
- package/dist/components/Columns.cjs.js +1 -1
- package/dist/components/Columns.es.js +1 -1
- package/dist/ee/signals/components/signal-details-page.cjs.js +1 -0
- package/dist/ee/signals/components/signal-details-page.cjs.js.map +1 -1
- package/dist/ee/signals/components/signal-details-page.es.js +1 -0
- package/dist/ee/signals/components/signal-details-page.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +1 -1
- package/dist/{multi-column-BR3a4MvZ.js → multi-column-DzAz6aWn.js} +2 -1
- package/dist/{multi-column-BR3a4MvZ.js.map → multi-column-DzAz6aWn.js.map} +1 -1
- package/dist/{multi-column-DGAsiBPq.cjs → multi-column-IfbHfooJ.cjs} +2 -1
- package/dist/{multi-column-DGAsiBPq.cjs.map → multi-column-IfbHfooJ.cjs.map} +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @mastra/playground-ui
|
|
2
2
|
|
|
3
|
+
## 38.0.0-alpha.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`8be63b0`](https://github.com/mastra-ai/mastra/commit/8be63b015fb8d72cea1220f05e7dc3bb997cc249), [`345eecc`](https://github.com/mastra-ai/mastra/commit/345eecce6ba519b5d987f0e10b5de4c8e5734580), [`ee14cae`](https://github.com/mastra-ai/mastra/commit/ee14cae244805783bde518a6142de28b744b169c)]:
|
|
8
|
+
- @mastra/core@1.48.0-alpha.7
|
|
9
|
+
- @mastra/client-js@1.29.0-alpha.7
|
|
10
|
+
- @mastra/react@1.2.1-alpha.7
|
|
11
|
+
|
|
12
|
+
## 38.0.0-alpha.6
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Updated dependencies [[`b33c77d`](https://github.com/mastra-ai/mastra/commit/b33c77d5293f14a794f3ec38dc947a6676de2764), [`1009f77`](https://github.com/mastra-ai/mastra/commit/1009f772aa40016b49267c8566d0c29f6a16aa3c), [`6a4a466`](https://github.com/mastra-ai/mastra/commit/6a4a466495279c2add2b0fd0afe6989fe7ae352a), [`23c31de`](https://github.com/mastra-ai/mastra/commit/23c31de96ed8153402dcf092ac84b27a0c3638c1), [`0368766`](https://github.com/mastra-ai/mastra/commit/0368766744c7ea3df4d6059e2cc15f7bdf55f5a6), [`2866f04`](https://github.com/mastra-ai/mastra/commit/2866f04953edb78c1637fa45cc53abe24122edcb)]:
|
|
17
|
+
- @mastra/core@1.48.0-alpha.6
|
|
18
|
+
- @mastra/client-js@1.29.0-alpha.6
|
|
19
|
+
- @mastra/react@1.2.1-alpha.6
|
|
20
|
+
- @mastra/memory@1.21.3-alpha.2
|
|
21
|
+
|
|
3
22
|
## 38.0.0-alpha.5
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { C as Column, a as Columns, M as MultiColumn } from '../multi-column-
|
|
1
|
+
export { C as Column, a as Columns, M as MultiColumn } from '../multi-column-DzAz6aWn.js';
|
|
2
2
|
//# sourceMappingURL=Columns.es.js.map
|
|
@@ -6,6 +6,7 @@ const jsxRuntime = require('react/jsx-runtime');
|
|
|
6
6
|
const React = require('react');
|
|
7
7
|
require('@mastra/react');
|
|
8
8
|
require('@tanstack/react-query');
|
|
9
|
+
require('../../../toast-Bh4WQDyj.cjs');
|
|
9
10
|
const domains_traces_hooks_useTraces = require('../../../domains/traces/hooks/use-traces.cjs.js');
|
|
10
11
|
require('../../../domains/traces/trace-filters.cjs.js');
|
|
11
12
|
const scatterPlotChart = require('../../../scatter-plot-chart-CFZO31md.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-details-page.cjs.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useTraces } from '../../../domains/traces/hooks';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { stringToColor } from '../../../lib/colors';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicTraceSummaryList, TopicsLayout } from '../../topics';\nimport { getSignalChartData } from '../signals-chart-data';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\nconst SignalTraceSummaryList = TopicTraceSummaryList;\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction findClusterByTraceId(signal: Signal | undefined, traceId: string | undefined) {\n if (!signal || !traceId) return undefined;\n return signal.clusters.find(cluster => cluster.traceSummaries.some(trace => trace.id === traceId));\n}\n\ninterface SignalClusterSidebarProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterSelect: (clusterId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n signal,\n selectedClusterIds,\n onClusterSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {signal.clusters.map(cluster => {\n const selected = selectedClusterIds.includes(cluster.id);\n return (\n <li key={cluster.id}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onClusterSelect(cluster.id)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: stringToColor(cluster.name) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {cluster.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {cluster.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nexport function SignalTraceListTab({\n cluster,\n selectedTraceId,\n onTraceSelect,\n}: {\n cluster: SignalCluster;\n selectedTraceId: string | null;\n onTraceSelect: () => void;\n}) {\n return (\n <SignalTraceSummaryList\n traces={cluster.traceSummaries}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n );\n}\n\ninterface SignalChartTabProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterToggle: (clusterId: string) => void;\n}\n\nexport function SignalChartTab({ signal, selectedClusterIds, onClusterToggle }: SignalChartTabProps) {\n const selectedClusters = useMemo(\n () => signal.clusters.filter(cluster => selectedClusterIds.includes(cluster.id)),\n [signal.clusters, selectedClusterIds],\n );\n const chartData = useMemo(() => getSignalChartData(selectedClusters), [selectedClusters]);\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={selectedClusterIds}\n onClusterSelect={onClusterToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"duration\"\n yKey=\"spans\"\n nameKey=\"name\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"Duration\"\n yLabel=\"Spans\"\n formatX={value => `${value}ms`}\n formatY={value => `${value} spans`}\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n signal: Signal;\n selectedCluster: SignalCluster;\n selectedTraceId: string | null;\n selectedChartClusterIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onClusterSelect: (clusterId: string) => void;\n onChartClusterToggle: (clusterId: string) => void;\n onTraceSelect: () => void;\n}\n\nexport function SignalClusterTabs({\n signal,\n selectedCluster,\n selectedTraceId,\n selectedChartClusterIds,\n activeTab,\n onActiveTabChange,\n onClusterSelect,\n onChartClusterToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={[selectedCluster.id]}\n onClusterSelect={onClusterSelect}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n cluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n signal={signal}\n selectedClusterIds={selectedChartClusterIds}\n onClusterToggle={onChartClusterToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n selectedTraceId: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({ signalId, selectedTraceId, tracePanel, onTraceSelect }: SignalDetailsPageProps) {\n const selectedSignal = useMemo(() => signals.find(signal => signal.id === signalId), [signalId]);\n const initialCluster =\n findClusterByTraceId(selectedSignal, selectedTraceId ?? undefined) ?? selectedSignal?.clusters[0];\n const [selectedClusterId, setSelectedClusterId] = useState<string | null>(() => initialCluster?.id ?? null);\n const [selectedChartClusterIds, setSelectedChartClusterIds] = useState<string[]>(\n () => selectedSignal?.clusters.map(cluster => cluster.id) ?? [],\n );\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n const selectedCluster = selectedSignal?.clusters.find(cluster => cluster.id === selectedClusterId) ?? initialCluster;\n const { data: tracesData } = useTraces({});\n const resolvedTraceId = tracesData?.spans[0]?.traceId ?? null;\n\n const handleTraceSelect = () => {\n if (!selectedSignal || !resolvedTraceId) return;\n\n onTraceSelect(selectedSignal.id, resolvedTraceId);\n };\n\n const handleChartClusterToggle = (clusterId: string) => {\n setSelectedChartClusterIds(current =>\n current.includes(clusterId) ? current.filter(id => id !== clusterId) : [...current, clusterId],\n );\n };\n\n if (!selectedSignal || !selectedCluster) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{selectedSignal.name}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n signal={selectedSignal}\n selectedCluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n selectedChartClusterIds={selectedChartClusterIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onClusterSelect={setSelectedClusterId}\n onChartClusterToggle={handleChartClusterToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":["TopicTraceSummaryList","TopicTraceDetailsPanel","TopicsLayout","jsx","jsxs","cn","stringToColor","useMemo","getSignalChartData","ScatterPlotChart","Tabs","TabList","Tab","TabContent","signals","useState","useTraces"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signal-details-page.cjs.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useTraces } from '../../../domains/traces/hooks';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { stringToColor } from '../../../lib/colors';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicTraceSummaryList, TopicsLayout } from '../../topics';\nimport { getSignalChartData } from '../signals-chart-data';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\nconst SignalTraceSummaryList = TopicTraceSummaryList;\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction findClusterByTraceId(signal: Signal | undefined, traceId: string | undefined) {\n if (!signal || !traceId) return undefined;\n return signal.clusters.find(cluster => cluster.traceSummaries.some(trace => trace.id === traceId));\n}\n\ninterface SignalClusterSidebarProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterSelect: (clusterId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n signal,\n selectedClusterIds,\n onClusterSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {signal.clusters.map(cluster => {\n const selected = selectedClusterIds.includes(cluster.id);\n return (\n <li key={cluster.id}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onClusterSelect(cluster.id)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: stringToColor(cluster.name) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {cluster.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {cluster.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nexport function SignalTraceListTab({\n cluster,\n selectedTraceId,\n onTraceSelect,\n}: {\n cluster: SignalCluster;\n selectedTraceId: string | null;\n onTraceSelect: () => void;\n}) {\n return (\n <SignalTraceSummaryList\n traces={cluster.traceSummaries}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n );\n}\n\ninterface SignalChartTabProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterToggle: (clusterId: string) => void;\n}\n\nexport function SignalChartTab({ signal, selectedClusterIds, onClusterToggle }: SignalChartTabProps) {\n const selectedClusters = useMemo(\n () => signal.clusters.filter(cluster => selectedClusterIds.includes(cluster.id)),\n [signal.clusters, selectedClusterIds],\n );\n const chartData = useMemo(() => getSignalChartData(selectedClusters), [selectedClusters]);\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={selectedClusterIds}\n onClusterSelect={onClusterToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"duration\"\n yKey=\"spans\"\n nameKey=\"name\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"Duration\"\n yLabel=\"Spans\"\n formatX={value => `${value}ms`}\n formatY={value => `${value} spans`}\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n signal: Signal;\n selectedCluster: SignalCluster;\n selectedTraceId: string | null;\n selectedChartClusterIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onClusterSelect: (clusterId: string) => void;\n onChartClusterToggle: (clusterId: string) => void;\n onTraceSelect: () => void;\n}\n\nexport function SignalClusterTabs({\n signal,\n selectedCluster,\n selectedTraceId,\n selectedChartClusterIds,\n activeTab,\n onActiveTabChange,\n onClusterSelect,\n onChartClusterToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={[selectedCluster.id]}\n onClusterSelect={onClusterSelect}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n cluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n signal={signal}\n selectedClusterIds={selectedChartClusterIds}\n onClusterToggle={onChartClusterToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n selectedTraceId: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({ signalId, selectedTraceId, tracePanel, onTraceSelect }: SignalDetailsPageProps) {\n const selectedSignal = useMemo(() => signals.find(signal => signal.id === signalId), [signalId]);\n const initialCluster =\n findClusterByTraceId(selectedSignal, selectedTraceId ?? undefined) ?? selectedSignal?.clusters[0];\n const [selectedClusterId, setSelectedClusterId] = useState<string | null>(() => initialCluster?.id ?? null);\n const [selectedChartClusterIds, setSelectedChartClusterIds] = useState<string[]>(\n () => selectedSignal?.clusters.map(cluster => cluster.id) ?? [],\n );\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n const selectedCluster = selectedSignal?.clusters.find(cluster => cluster.id === selectedClusterId) ?? initialCluster;\n const { data: tracesData } = useTraces({});\n const resolvedTraceId = tracesData?.spans[0]?.traceId ?? null;\n\n const handleTraceSelect = () => {\n if (!selectedSignal || !resolvedTraceId) return;\n\n onTraceSelect(selectedSignal.id, resolvedTraceId);\n };\n\n const handleChartClusterToggle = (clusterId: string) => {\n setSelectedChartClusterIds(current =>\n current.includes(clusterId) ? current.filter(id => id !== clusterId) : [...current, clusterId],\n );\n };\n\n if (!selectedSignal || !selectedCluster) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{selectedSignal.name}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n signal={selectedSignal}\n selectedCluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n selectedChartClusterIds={selectedChartClusterIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onClusterSelect={setSelectedClusterId}\n onChartClusterToggle={handleChartClusterToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":["TopicTraceSummaryList","TopicTraceDetailsPanel","TopicsLayout","jsx","jsxs","cn","stringToColor","useMemo","getSignalChartData","ScatterPlotChart","Tabs","TabList","Tab","TabContent","signals","useState","useTraces"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useMemo, useState } from 'react';
|
|
3
3
|
import '@mastra/react';
|
|
4
4
|
import '@tanstack/react-query';
|
|
5
|
+
import '../../../toast-BKsfnapA.js';
|
|
5
6
|
import { useTraces } from '../../../domains/traces/hooks/use-traces.es.js';
|
|
6
7
|
import '../../../domains/traces/trace-filters.es.js';
|
|
7
8
|
import { S as ScatterPlotChart } from '../../../scatter-plot-chart-B3hfFMKS.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-details-page.es.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useTraces } from '../../../domains/traces/hooks';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { stringToColor } from '../../../lib/colors';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicTraceSummaryList, TopicsLayout } from '../../topics';\nimport { getSignalChartData } from '../signals-chart-data';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\nconst SignalTraceSummaryList = TopicTraceSummaryList;\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction findClusterByTraceId(signal: Signal | undefined, traceId: string | undefined) {\n if (!signal || !traceId) return undefined;\n return signal.clusters.find(cluster => cluster.traceSummaries.some(trace => trace.id === traceId));\n}\n\ninterface SignalClusterSidebarProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterSelect: (clusterId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n signal,\n selectedClusterIds,\n onClusterSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {signal.clusters.map(cluster => {\n const selected = selectedClusterIds.includes(cluster.id);\n return (\n <li key={cluster.id}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onClusterSelect(cluster.id)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: stringToColor(cluster.name) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {cluster.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {cluster.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nexport function SignalTraceListTab({\n cluster,\n selectedTraceId,\n onTraceSelect,\n}: {\n cluster: SignalCluster;\n selectedTraceId: string | null;\n onTraceSelect: () => void;\n}) {\n return (\n <SignalTraceSummaryList\n traces={cluster.traceSummaries}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n );\n}\n\ninterface SignalChartTabProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterToggle: (clusterId: string) => void;\n}\n\nexport function SignalChartTab({ signal, selectedClusterIds, onClusterToggle }: SignalChartTabProps) {\n const selectedClusters = useMemo(\n () => signal.clusters.filter(cluster => selectedClusterIds.includes(cluster.id)),\n [signal.clusters, selectedClusterIds],\n );\n const chartData = useMemo(() => getSignalChartData(selectedClusters), [selectedClusters]);\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={selectedClusterIds}\n onClusterSelect={onClusterToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"duration\"\n yKey=\"spans\"\n nameKey=\"name\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"Duration\"\n yLabel=\"Spans\"\n formatX={value => `${value}ms`}\n formatY={value => `${value} spans`}\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n signal: Signal;\n selectedCluster: SignalCluster;\n selectedTraceId: string | null;\n selectedChartClusterIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onClusterSelect: (clusterId: string) => void;\n onChartClusterToggle: (clusterId: string) => void;\n onTraceSelect: () => void;\n}\n\nexport function SignalClusterTabs({\n signal,\n selectedCluster,\n selectedTraceId,\n selectedChartClusterIds,\n activeTab,\n onActiveTabChange,\n onClusterSelect,\n onChartClusterToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={[selectedCluster.id]}\n onClusterSelect={onClusterSelect}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n cluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n signal={signal}\n selectedClusterIds={selectedChartClusterIds}\n onClusterToggle={onChartClusterToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n selectedTraceId: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({ signalId, selectedTraceId, tracePanel, onTraceSelect }: SignalDetailsPageProps) {\n const selectedSignal = useMemo(() => signals.find(signal => signal.id === signalId), [signalId]);\n const initialCluster =\n findClusterByTraceId(selectedSignal, selectedTraceId ?? undefined) ?? selectedSignal?.clusters[0];\n const [selectedClusterId, setSelectedClusterId] = useState<string | null>(() => initialCluster?.id ?? null);\n const [selectedChartClusterIds, setSelectedChartClusterIds] = useState<string[]>(\n () => selectedSignal?.clusters.map(cluster => cluster.id) ?? [],\n );\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n const selectedCluster = selectedSignal?.clusters.find(cluster => cluster.id === selectedClusterId) ?? initialCluster;\n const { data: tracesData } = useTraces({});\n const resolvedTraceId = tracesData?.spans[0]?.traceId ?? null;\n\n const handleTraceSelect = () => {\n if (!selectedSignal || !resolvedTraceId) return;\n\n onTraceSelect(selectedSignal.id, resolvedTraceId);\n };\n\n const handleChartClusterToggle = (clusterId: string) => {\n setSelectedChartClusterIds(current =>\n current.includes(clusterId) ? current.filter(id => id !== clusterId) : [...current, clusterId],\n );\n };\n\n if (!selectedSignal || !selectedCluster) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{selectedSignal.name}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n signal={selectedSignal}\n selectedCluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n selectedChartClusterIds={selectedChartClusterIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onClusterSelect={setSelectedClusterId}\n onChartClusterToggle={handleChartClusterToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signal-details-page.es.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useTraces } from '../../../domains/traces/hooks';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { stringToColor } from '../../../lib/colors';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicTraceSummaryList, TopicsLayout } from '../../topics';\nimport { getSignalChartData } from '../signals-chart-data';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\nconst SignalTraceSummaryList = TopicTraceSummaryList;\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction findClusterByTraceId(signal: Signal | undefined, traceId: string | undefined) {\n if (!signal || !traceId) return undefined;\n return signal.clusters.find(cluster => cluster.traceSummaries.some(trace => trace.id === traceId));\n}\n\ninterface SignalClusterSidebarProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterSelect: (clusterId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n signal,\n selectedClusterIds,\n onClusterSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {signal.clusters.map(cluster => {\n const selected = selectedClusterIds.includes(cluster.id);\n return (\n <li key={cluster.id}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onClusterSelect(cluster.id)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: stringToColor(cluster.name) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {cluster.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {cluster.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nexport function SignalTraceListTab({\n cluster,\n selectedTraceId,\n onTraceSelect,\n}: {\n cluster: SignalCluster;\n selectedTraceId: string | null;\n onTraceSelect: () => void;\n}) {\n return (\n <SignalTraceSummaryList\n traces={cluster.traceSummaries}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n );\n}\n\ninterface SignalChartTabProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterToggle: (clusterId: string) => void;\n}\n\nexport function SignalChartTab({ signal, selectedClusterIds, onClusterToggle }: SignalChartTabProps) {\n const selectedClusters = useMemo(\n () => signal.clusters.filter(cluster => selectedClusterIds.includes(cluster.id)),\n [signal.clusters, selectedClusterIds],\n );\n const chartData = useMemo(() => getSignalChartData(selectedClusters), [selectedClusters]);\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={selectedClusterIds}\n onClusterSelect={onClusterToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"duration\"\n yKey=\"spans\"\n nameKey=\"name\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"Duration\"\n yLabel=\"Spans\"\n formatX={value => `${value}ms`}\n formatY={value => `${value} spans`}\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n signal: Signal;\n selectedCluster: SignalCluster;\n selectedTraceId: string | null;\n selectedChartClusterIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onClusterSelect: (clusterId: string) => void;\n onChartClusterToggle: (clusterId: string) => void;\n onTraceSelect: () => void;\n}\n\nexport function SignalClusterTabs({\n signal,\n selectedCluster,\n selectedTraceId,\n selectedChartClusterIds,\n activeTab,\n onActiveTabChange,\n onClusterSelect,\n onChartClusterToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={[selectedCluster.id]}\n onClusterSelect={onClusterSelect}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n cluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n signal={signal}\n selectedClusterIds={selectedChartClusterIds}\n onClusterToggle={onChartClusterToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n selectedTraceId: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({ signalId, selectedTraceId, tracePanel, onTraceSelect }: SignalDetailsPageProps) {\n const selectedSignal = useMemo(() => signals.find(signal => signal.id === signalId), [signalId]);\n const initialCluster =\n findClusterByTraceId(selectedSignal, selectedTraceId ?? undefined) ?? selectedSignal?.clusters[0];\n const [selectedClusterId, setSelectedClusterId] = useState<string | null>(() => initialCluster?.id ?? null);\n const [selectedChartClusterIds, setSelectedChartClusterIds] = useState<string[]>(\n () => selectedSignal?.clusters.map(cluster => cluster.id) ?? [],\n );\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n const selectedCluster = selectedSignal?.clusters.find(cluster => cluster.id === selectedClusterId) ?? initialCluster;\n const { data: tracesData } = useTraces({});\n const resolvedTraceId = tracesData?.spans[0]?.traceId ?? null;\n\n const handleTraceSelect = () => {\n if (!selectedSignal || !resolvedTraceId) return;\n\n onTraceSelect(selectedSignal.id, resolvedTraceId);\n };\n\n const handleChartClusterToggle = (clusterId: string) => {\n setSelectedChartClusterIds(current =>\n current.includes(clusterId) ? current.filter(id => id !== clusterId) : [...current, clusterId],\n );\n };\n\n if (!selectedSignal || !selectedCluster) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{selectedSignal.name}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n signal={selectedSignal}\n selectedCluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n selectedChartClusterIds={selectedChartClusterIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onClusterSelect={setSelectedClusterId}\n onChartClusterToggle={handleChartClusterToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -82,7 +82,7 @@ const tabsTab = require('./tabs-tab-B7Ziuuh8.cjs');
|
|
|
82
82
|
const tabsContent = require('./tabs-content-ohtjaVdC.cjs');
|
|
83
83
|
const getShortId = require('./get-short-id-BD2mSqtQ.cjs');
|
|
84
84
|
const contentBlock = require('./content-block-Csb01oxE.cjs');
|
|
85
|
-
const multiColumn = require('./multi-column-
|
|
85
|
+
const multiColumn = require('./multi-column-IfbHfooJ.cjs');
|
|
86
86
|
const codeDiff = require('./code-diff-C2vuR6Ti.cjs');
|
|
87
87
|
const helpers = require('./helpers-DyNelEvl.cjs');
|
|
88
88
|
const Notice = require('./Notice-h63wsfzJ.cjs');
|
package/dist/index.es.js
CHANGED
|
@@ -78,7 +78,7 @@ export { T as Tab, a as TabList, b as Tabs } from './tabs-tab-XnMoa1fn.js';
|
|
|
78
78
|
export { T as TabContent } from './tabs-content--uzXt5ch.js';
|
|
79
79
|
export { T as TextAndIcon, g as getShortId } from './get-short-id-ZED99MfC.js';
|
|
80
80
|
export { C as ContentBlock, a as ContentBlocks } from './content-block-BTpK7gPz.js';
|
|
81
|
-
export { C as Column, a as Columns, M as MultiColumn } from './multi-column-
|
|
81
|
+
export { C as Column, a as Columns, M as MultiColumn } from './multi-column-DzAz6aWn.js';
|
|
82
82
|
export { C as CodeDiff } from './code-diff-lktH1err.js';
|
|
83
83
|
export { I as ItemList, a as ItemListSkeleton, g as getItemListColumnTemplate, b as getToNextItemFn, c as getToPreviousItemFn } from './helpers-3p9MxQbh.js';
|
|
84
84
|
export { N as Notice } from './Notice-CiS1Dv3i.js';
|
|
@@ -5,6 +5,7 @@ import { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';
|
|
|
5
5
|
import { useRef, useState, useCallback, useEffect } from 'react';
|
|
6
6
|
import './components/DataDetailsPanel.es.js';
|
|
7
7
|
import { c as cn } from './cn-BakJzhuv.js';
|
|
8
|
+
import './toast-BKsfnapA.js';
|
|
8
9
|
import 'react-resizable-panels';
|
|
9
10
|
import './resize/panel-icon-button.es.js';
|
|
10
11
|
import './resize/separator.es.js';
|
|
@@ -148,4 +149,4 @@ function ScrollArrow({ direction, onClick }) {
|
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
export { Column as C, MultiColumn as M, Columns as a };
|
|
151
|
-
//# sourceMappingURL=multi-column-
|
|
152
|
+
//# sourceMappingURL=multi-column-DzAz6aWn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-column-BR3a4MvZ.js","sources":["../src/ds/components/Columns/column-content.tsx","../src/ds/components/Columns/column-root.tsx","../src/ds/components/Columns/column-toolbar.tsx","../src/ds/components/Columns/column.tsx","../src/ds/components/Columns/columns.tsx","../src/ds/components/Columns/multi-column.tsx"],"sourcesContent":["import { cn } from '@/index';\n\nexport type ColumnProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnContent({ children, className }: ColumnProps) {\n return <div className={cn(`grid overflow-y-auto gap-8 content-start`, className)}>{children}</div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnProps = {\n children: React.ReactNode;\n className?: string;\n withRightSeparator?: boolean;\n withLeftSeparator?: boolean;\n};\n\nexport function ColumnRoot({ children, className, withLeftSeparator, withRightSeparator }: ColumnProps) {\n return (\n <div className=\"flex overflow-y-auto w-full\">\n {withLeftSeparator && <Separator />}\n\n <div className={cn(`grid gap-8 content-start w-full overflow-y-auto`, className)}>{children}</div>\n\n {withRightSeparator && <Separator />}\n </div>\n );\n}\n\nfunction Separator() {\n return <div className={cn('bg-surface5 w-[3px] shrink-0 mx-[1.5vw]')}></div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnToolbarProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnToolbar({ children, className }: ColumnToolbarProps) {\n return (\n <div className={cn(`flex items-center justify-between w-full flex-wrap gap-4 gap-x-6`, className)}>{children}</div>\n );\n}\n","import { ColumnContent } from './column-content';\nimport { ColumnRoot } from './column-root';\nimport { ColumnToolbar } from './column-toolbar';\n\nexport const Column = Object.assign(ColumnRoot, {\n Content: ColumnContent,\n Toolbar: ColumnToolbar,\n});\n","import { cn } from '@/index';\n\nexport type ColumnsProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport function Columns({ children, className }: ColumnsProps) {\n return <div className={cn(`grid w-full h-full grid-cols-1 overflow-y-auto`, className)}>{children}</div>;\n}\n","'use client';\n\nimport { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '../Button';\nimport { cn } from '@/lib/utils';\n\nexport type MultiColumnProps = {\n children?: React.ReactNode;\n numOfColumns?: number;\n minColumnWidth?: string;\n};\n\nexport function MultiColumn({ children, numOfColumns = 1, minColumnWidth }: MultiColumnProps): React.JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const updateScrollState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const { scrollLeft, scrollWidth, clientWidth } = el;\n setCanScrollLeft(scrollLeft > 1);\n setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n }, []);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n\n updateScrollState();\n\n el.addEventListener('scroll', updateScrollState, { passive: true });\n\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(el);\n\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n observer.disconnect();\n };\n }, [updateScrollState]);\n\n const prevColumnsRef = useRef(numOfColumns);\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n if (numOfColumns > prevColumnsRef.current) {\n // New column added — scroll to the right end so it's visible\n requestAnimationFrame(() => {\n el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });\n });\n }\n prevColumnsRef.current = numOfColumns;\n }, [numOfColumns]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault();\n scrollToColumn(e.key === 'ArrowLeft' ? 'left' : 'right');\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const scrollToColumn = (direction: 'left' | 'right') => {\n const el = scrollRef.current;\n if (!el) return;\n\n const columns = Array.from(el.children) as HTMLElement[];\n const containerLeft = el.scrollLeft;\n const containerRight = containerLeft + el.clientWidth;\n\n if (direction === 'right') {\n // Find the first column whose right edge is past the container's right edge\n const target = columns.find(col => col.offsetLeft + col.offsetWidth > containerRight + 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft + target.offsetWidth - el.clientWidth, behavior: 'smooth' });\n }\n } else {\n // Find the last column whose left edge is before the container's left edge\n const target = [...columns].reverse().find(col => col.offsetLeft < containerLeft - 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft, behavior: 'smooth' });\n }\n }\n };\n\n return (\n <div className={cn('MULTI_COLUMN relative w-full h-full overflow-hidden')}>\n {canScrollLeft && <ScrollArrow direction=\"left\" onClick={() => scrollToColumn('left')} />}\n {canScrollRight && <ScrollArrow direction=\"right\" onClick={() => scrollToColumn('right')} />}\n <div\n ref={scrollRef}\n className=\"grid overflow-x-auto w-full overflow-y-auto h-full\"\n style={{\n gridTemplateColumns: `repeat(${numOfColumns}, minmax(${minColumnWidth ?? '0'}, 1fr))`,\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nfunction ScrollArrow({ direction, onClick }: { direction: 'left' | 'right'; onClick: () => void }) {\n const Icon = direction === 'left' ? ChevronLeftIcon : ChevronRightIcon;\n const isLeft = direction === 'left';\n\n return (\n <div\n className={cn(\n 'absolute top-0 bottom-0 z-20 w-20 flex items-center justify-center px-5 bg-surface2',\n isLeft ? 'left-0' : 'right-0',\n )}\n >\n <Button onClick={onClick} className=\"w-full h-full px-0\" aria-label={`Scroll ${direction}`}>\n <Icon />\n </Button>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-column-DzAz6aWn.js","sources":["../src/ds/components/Columns/column-content.tsx","../src/ds/components/Columns/column-root.tsx","../src/ds/components/Columns/column-toolbar.tsx","../src/ds/components/Columns/column.tsx","../src/ds/components/Columns/columns.tsx","../src/ds/components/Columns/multi-column.tsx"],"sourcesContent":["import { cn } from '@/index';\n\nexport type ColumnProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnContent({ children, className }: ColumnProps) {\n return <div className={cn(`grid overflow-y-auto gap-8 content-start`, className)}>{children}</div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnProps = {\n children: React.ReactNode;\n className?: string;\n withRightSeparator?: boolean;\n withLeftSeparator?: boolean;\n};\n\nexport function ColumnRoot({ children, className, withLeftSeparator, withRightSeparator }: ColumnProps) {\n return (\n <div className=\"flex overflow-y-auto w-full\">\n {withLeftSeparator && <Separator />}\n\n <div className={cn(`grid gap-8 content-start w-full overflow-y-auto`, className)}>{children}</div>\n\n {withRightSeparator && <Separator />}\n </div>\n );\n}\n\nfunction Separator() {\n return <div className={cn('bg-surface5 w-[3px] shrink-0 mx-[1.5vw]')}></div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnToolbarProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnToolbar({ children, className }: ColumnToolbarProps) {\n return (\n <div className={cn(`flex items-center justify-between w-full flex-wrap gap-4 gap-x-6`, className)}>{children}</div>\n );\n}\n","import { ColumnContent } from './column-content';\nimport { ColumnRoot } from './column-root';\nimport { ColumnToolbar } from './column-toolbar';\n\nexport const Column = Object.assign(ColumnRoot, {\n Content: ColumnContent,\n Toolbar: ColumnToolbar,\n});\n","import { cn } from '@/index';\n\nexport type ColumnsProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport function Columns({ children, className }: ColumnsProps) {\n return <div className={cn(`grid w-full h-full grid-cols-1 overflow-y-auto`, className)}>{children}</div>;\n}\n","'use client';\n\nimport { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '../Button';\nimport { cn } from '@/lib/utils';\n\nexport type MultiColumnProps = {\n children?: React.ReactNode;\n numOfColumns?: number;\n minColumnWidth?: string;\n};\n\nexport function MultiColumn({ children, numOfColumns = 1, minColumnWidth }: MultiColumnProps): React.JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const updateScrollState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const { scrollLeft, scrollWidth, clientWidth } = el;\n setCanScrollLeft(scrollLeft > 1);\n setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n }, []);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n\n updateScrollState();\n\n el.addEventListener('scroll', updateScrollState, { passive: true });\n\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(el);\n\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n observer.disconnect();\n };\n }, [updateScrollState]);\n\n const prevColumnsRef = useRef(numOfColumns);\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n if (numOfColumns > prevColumnsRef.current) {\n // New column added — scroll to the right end so it's visible\n requestAnimationFrame(() => {\n el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });\n });\n }\n prevColumnsRef.current = numOfColumns;\n }, [numOfColumns]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault();\n scrollToColumn(e.key === 'ArrowLeft' ? 'left' : 'right');\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const scrollToColumn = (direction: 'left' | 'right') => {\n const el = scrollRef.current;\n if (!el) return;\n\n const columns = Array.from(el.children) as HTMLElement[];\n const containerLeft = el.scrollLeft;\n const containerRight = containerLeft + el.clientWidth;\n\n if (direction === 'right') {\n // Find the first column whose right edge is past the container's right edge\n const target = columns.find(col => col.offsetLeft + col.offsetWidth > containerRight + 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft + target.offsetWidth - el.clientWidth, behavior: 'smooth' });\n }\n } else {\n // Find the last column whose left edge is before the container's left edge\n const target = [...columns].reverse().find(col => col.offsetLeft < containerLeft - 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft, behavior: 'smooth' });\n }\n }\n };\n\n return (\n <div className={cn('MULTI_COLUMN relative w-full h-full overflow-hidden')}>\n {canScrollLeft && <ScrollArrow direction=\"left\" onClick={() => scrollToColumn('left')} />}\n {canScrollRight && <ScrollArrow direction=\"right\" onClick={() => scrollToColumn('right')} />}\n <div\n ref={scrollRef}\n className=\"grid overflow-x-auto w-full overflow-y-auto h-full\"\n style={{\n gridTemplateColumns: `repeat(${numOfColumns}, minmax(${minColumnWidth ?? '0'}, 1fr))`,\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nfunction ScrollArrow({ direction, onClick }: { direction: 'left' | 'right'; onClick: () => void }) {\n const Icon = direction === 'left' ? ChevronLeftIcon : ChevronRightIcon;\n const isLeft = direction === 'left';\n\n return (\n <div\n className={cn(\n 'absolute top-0 bottom-0 z-20 w-20 flex items-center justify-center px-5 bg-surface2',\n isLeft ? 'left-0' : 'right-0',\n )}\n >\n <Button onClick={onClick} className=\"w-full h-full px-0\" aria-label={`Scroll ${direction}`}>\n <Icon />\n </Button>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ const lucideReact = require('lucide-react');
|
|
|
7
7
|
const React = require('react');
|
|
8
8
|
require('./components/DataDetailsPanel.cjs.js');
|
|
9
9
|
const utils_cn = require('./cn-vA5sWo9W.cjs');
|
|
10
|
+
require('./toast-Bh4WQDyj.cjs');
|
|
10
11
|
require('react-resizable-panels');
|
|
11
12
|
require('./resize/panel-icon-button.cjs.js');
|
|
12
13
|
require('./resize/separator.cjs.js');
|
|
@@ -152,4 +153,4 @@ function ScrollArrow({ direction, onClick }) {
|
|
|
152
153
|
exports.Column = Column;
|
|
153
154
|
exports.Columns = Columns;
|
|
154
155
|
exports.MultiColumn = MultiColumn;
|
|
155
|
-
//# sourceMappingURL=multi-column-
|
|
156
|
+
//# sourceMappingURL=multi-column-IfbHfooJ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-column-DGAsiBPq.cjs","sources":["../src/ds/components/Columns/column-content.tsx","../src/ds/components/Columns/column-root.tsx","../src/ds/components/Columns/column-toolbar.tsx","../src/ds/components/Columns/column.tsx","../src/ds/components/Columns/columns.tsx","../src/ds/components/Columns/multi-column.tsx"],"sourcesContent":["import { cn } from '@/index';\n\nexport type ColumnProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnContent({ children, className }: ColumnProps) {\n return <div className={cn(`grid overflow-y-auto gap-8 content-start`, className)}>{children}</div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnProps = {\n children: React.ReactNode;\n className?: string;\n withRightSeparator?: boolean;\n withLeftSeparator?: boolean;\n};\n\nexport function ColumnRoot({ children, className, withLeftSeparator, withRightSeparator }: ColumnProps) {\n return (\n <div className=\"flex overflow-y-auto w-full\">\n {withLeftSeparator && <Separator />}\n\n <div className={cn(`grid gap-8 content-start w-full overflow-y-auto`, className)}>{children}</div>\n\n {withRightSeparator && <Separator />}\n </div>\n );\n}\n\nfunction Separator() {\n return <div className={cn('bg-surface5 w-[3px] shrink-0 mx-[1.5vw]')}></div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnToolbarProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnToolbar({ children, className }: ColumnToolbarProps) {\n return (\n <div className={cn(`flex items-center justify-between w-full flex-wrap gap-4 gap-x-6`, className)}>{children}</div>\n );\n}\n","import { ColumnContent } from './column-content';\nimport { ColumnRoot } from './column-root';\nimport { ColumnToolbar } from './column-toolbar';\n\nexport const Column = Object.assign(ColumnRoot, {\n Content: ColumnContent,\n Toolbar: ColumnToolbar,\n});\n","import { cn } from '@/index';\n\nexport type ColumnsProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport function Columns({ children, className }: ColumnsProps) {\n return <div className={cn(`grid w-full h-full grid-cols-1 overflow-y-auto`, className)}>{children}</div>;\n}\n","'use client';\n\nimport { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '../Button';\nimport { cn } from '@/lib/utils';\n\nexport type MultiColumnProps = {\n children?: React.ReactNode;\n numOfColumns?: number;\n minColumnWidth?: string;\n};\n\nexport function MultiColumn({ children, numOfColumns = 1, minColumnWidth }: MultiColumnProps): React.JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const updateScrollState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const { scrollLeft, scrollWidth, clientWidth } = el;\n setCanScrollLeft(scrollLeft > 1);\n setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n }, []);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n\n updateScrollState();\n\n el.addEventListener('scroll', updateScrollState, { passive: true });\n\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(el);\n\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n observer.disconnect();\n };\n }, [updateScrollState]);\n\n const prevColumnsRef = useRef(numOfColumns);\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n if (numOfColumns > prevColumnsRef.current) {\n // New column added — scroll to the right end so it's visible\n requestAnimationFrame(() => {\n el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });\n });\n }\n prevColumnsRef.current = numOfColumns;\n }, [numOfColumns]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault();\n scrollToColumn(e.key === 'ArrowLeft' ? 'left' : 'right');\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const scrollToColumn = (direction: 'left' | 'right') => {\n const el = scrollRef.current;\n if (!el) return;\n\n const columns = Array.from(el.children) as HTMLElement[];\n const containerLeft = el.scrollLeft;\n const containerRight = containerLeft + el.clientWidth;\n\n if (direction === 'right') {\n // Find the first column whose right edge is past the container's right edge\n const target = columns.find(col => col.offsetLeft + col.offsetWidth > containerRight + 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft + target.offsetWidth - el.clientWidth, behavior: 'smooth' });\n }\n } else {\n // Find the last column whose left edge is before the container's left edge\n const target = [...columns].reverse().find(col => col.offsetLeft < containerLeft - 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft, behavior: 'smooth' });\n }\n }\n };\n\n return (\n <div className={cn('MULTI_COLUMN relative w-full h-full overflow-hidden')}>\n {canScrollLeft && <ScrollArrow direction=\"left\" onClick={() => scrollToColumn('left')} />}\n {canScrollRight && <ScrollArrow direction=\"right\" onClick={() => scrollToColumn('right')} />}\n <div\n ref={scrollRef}\n className=\"grid overflow-x-auto w-full overflow-y-auto h-full\"\n style={{\n gridTemplateColumns: `repeat(${numOfColumns}, minmax(${minColumnWidth ?? '0'}, 1fr))`,\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nfunction ScrollArrow({ direction, onClick }: { direction: 'left' | 'right'; onClick: () => void }) {\n const Icon = direction === 'left' ? ChevronLeftIcon : ChevronRightIcon;\n const isLeft = direction === 'left';\n\n return (\n <div\n className={cn(\n 'absolute top-0 bottom-0 z-20 w-20 flex items-center justify-center px-5 bg-surface2',\n isLeft ? 'left-0' : 'right-0',\n )}\n >\n <Button onClick={onClick} className=\"w-full h-full px-0\" aria-label={`Scroll ${direction}`}>\n <Icon />\n </Button>\n </div>\n );\n}\n"],"names":["cn","jsxs","jsx","useRef","useState","useCallback","useEffect","ChevronLeftIcon","ChevronRightIcon","Button"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgB;AAClE,EAAA,sCAAQ,KAAA,EAAA,EAAI,SAAA,EAAWA,YAAG,CAAA,wCAAA,CAAA,EAA4C,SAAS,GAAI,QAAA,EAAS,CAAA;AAC9F;;ACAO,SAAS,WAAW,EAAE,QAAA,EAAU,SAAA,EAAW,iBAAA,EAAmB,oBAAmB,EAAgB;AACtG,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,iBAAA,mCAAsB,SAAA,EAAA,EAAU,CAAA;AAAA,mCAEhC,KAAA,EAAA,EAAI,SAAA,EAAWD,YAAG,CAAA,+CAAA,CAAA,EAAmD,SAAS,GAAI,QAAA,EAAS,CAAA;AAAA,IAE3F,kBAAA,mCAAuB,SAAA,EAAA,EAAU;AAAA,GAAA,EACpC,CAAA;AAEJ;AAEA,SAAS,SAAA,GAAY;AACnB,EAAA,uBAAOE,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWF,WAAA,CAAG,yCAAyC,CAAA,EAAG,CAAA;AACxE;;AChBO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAU,EAAuB;AACzE,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAWA,YAAG,CAAA,gEAAA,CAAA,EAAoE,SAAS,GAAI,QAAA,EAAS,CAAA;AAEjH;;ACPO,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AAAA,EAC9C,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAC;;ACAM,SAAS,OAAA,CAAQ,EAAE,QAAA,EAAU,SAAA,EAAU,EAAiB;AAC7D,EAAA,sCAAQ,KAAA,EAAA,EAAI,SAAA,EAAWA,YAAG,CAAA,8CAAA,CAAA,EAAkD,SAAS,GAAI,QAAA,EAAS,CAAA;AACpG;;ACIO,SAAS,YAAY,EAAE,QAAA,EAAU,YAAA,GAAe,CAAA,EAAG,gBAAe,EAAwC;AAC/G,EAAA,MAAM,SAAA,GAAYG,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,iBAAA,GAAoBC,kBAAY,MAAM;AAC1C,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAa,WAAA,EAAY,GAAI,EAAA;AACjD,IAAA,gBAAA,CAAiB,aAAa,CAAC,CAAA;AAC/B,IAAA,iBAAA,CAAkB,UAAA,GAAa,WAAA,GAAc,WAAA,GAAc,CAAC,CAAA;AAAA,EAC9D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,iBAAA,EAAkB;AAElB,IAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,iBAAA,EAAmB,EAAE,OAAA,EAAS,MAAM,CAAA;AAElE,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,iBAAiB,CAAA;AACrD,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AAEnB,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;AAClD,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,cAAA,GAAiBH,aAAO,YAAY,CAAA;AAC1C,EAAAG,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAI,YAAA,GAAe,eAAe,OAAA,EAAS;AAEzC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,EAAA,CAAG,SAAS,EAAE,IAAA,EAAM,GAAG,WAAA,EAAa,QAAA,EAAU,UAAU,CAAA;AAAA,MAC1D,CAAC,CAAA;AAAA,IACH;AACA,IAAA,cAAA,CAAe,OAAA,GAAU,YAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,YAAA,EAAc;AACnD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,cAAA,CAAe,CAAA,CAAE,GAAA,KAAQ,WAAA,GAAc,MAAA,GAAS,OAAO,CAAA;AAAA,MACzD;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,KAAgC;AACtD,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA;AACtC,IAAA,MAAM,gBAAgB,EAAA,CAAG,UAAA;AACzB,IAAA,MAAM,cAAA,GAAiB,gBAAgB,EAAA,CAAG,WAAA;AAE1C,IAAA,IAAI,cAAc,OAAA,EAAS;AAEzB,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,UAAA,GAAa,GAAA,CAAI,WAAA,GAAc,cAAA,GAAiB,CAAC,CAAA;AACxF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,EAAA,CAAG,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,WAAA,GAAc,EAAA,CAAG,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,MACnG;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,UAAA,GAAa,aAAA,GAAgB,CAAC,CAAA;AACpF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,EAAA,CAAG,SAAS,EAAE,IAAA,EAAM,OAAO,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEL,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWD,WAAA,CAAG,qDAAqD,CAAA,EACrE,QAAA,EAAA;AAAA,IAAA,aAAA,oBAAiBE,cAAA,CAAC,eAAY,SAAA,EAAU,MAAA,EAAO,SAAS,MAAM,cAAA,CAAe,MAAM,CAAA,EAAG,CAAA;AAAA,IACtF,cAAA,mCAAmB,WAAA,EAAA,EAAY,SAAA,EAAU,SAAQ,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA,EAAG,CAAA;AAAA,oBAC1FA,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAU,oDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,mBAAA,EAAqB,CAAA,OAAA,EAAU,YAAY,CAAA,SAAA,EAAY,kBAAkB,GAAG,CAAA,OAAA;AAAA,SAC9E;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,OAAA,EAAQ,EAAyD;AACjG,EAAA,MAAM,IAAA,GAAO,SAAA,KAAc,MAAA,GAASK,2BAAA,GAAkBC,4BAAA;AACtD,EAAA,MAAM,SAAS,SAAA,KAAc,MAAA;AAE7B,EAAA,uBACEN,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWF,WAAA;AAAA,QACT,qFAAA;AAAA,QACA,SAAS,QAAA,GAAW;AAAA,OACtB;AAAA,MAEA,QAAA,kBAAAE,cAAA,CAACO,aAAA,EAAA,EAAO,OAAA,EAAkB,SAAA,EAAU,oBAAA,EAAqB,YAAA,EAAY,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACtF,QAAA,kBAAAP,cAAA,CAAC,IAAA,EAAA,EAAK,CAAA,EACR;AAAA;AAAA,GACF;AAEJ;;;;;;"}
|
|
1
|
+
{"version":3,"file":"multi-column-IfbHfooJ.cjs","sources":["../src/ds/components/Columns/column-content.tsx","../src/ds/components/Columns/column-root.tsx","../src/ds/components/Columns/column-toolbar.tsx","../src/ds/components/Columns/column.tsx","../src/ds/components/Columns/columns.tsx","../src/ds/components/Columns/multi-column.tsx"],"sourcesContent":["import { cn } from '@/index';\n\nexport type ColumnProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnContent({ children, className }: ColumnProps) {\n return <div className={cn(`grid overflow-y-auto gap-8 content-start`, className)}>{children}</div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnProps = {\n children: React.ReactNode;\n className?: string;\n withRightSeparator?: boolean;\n withLeftSeparator?: boolean;\n};\n\nexport function ColumnRoot({ children, className, withLeftSeparator, withRightSeparator }: ColumnProps) {\n return (\n <div className=\"flex overflow-y-auto w-full\">\n {withLeftSeparator && <Separator />}\n\n <div className={cn(`grid gap-8 content-start w-full overflow-y-auto`, className)}>{children}</div>\n\n {withRightSeparator && <Separator />}\n </div>\n );\n}\n\nfunction Separator() {\n return <div className={cn('bg-surface5 w-[3px] shrink-0 mx-[1.5vw]')}></div>;\n}\n","import { cn } from '@/index';\n\nexport type ColumnToolbarProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ColumnToolbar({ children, className }: ColumnToolbarProps) {\n return (\n <div className={cn(`flex items-center justify-between w-full flex-wrap gap-4 gap-x-6`, className)}>{children}</div>\n );\n}\n","import { ColumnContent } from './column-content';\nimport { ColumnRoot } from './column-root';\nimport { ColumnToolbar } from './column-toolbar';\n\nexport const Column = Object.assign(ColumnRoot, {\n Content: ColumnContent,\n Toolbar: ColumnToolbar,\n});\n","import { cn } from '@/index';\n\nexport type ColumnsProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport function Columns({ children, className }: ColumnsProps) {\n return <div className={cn(`grid w-full h-full grid-cols-1 overflow-y-auto`, className)}>{children}</div>;\n}\n","'use client';\n\nimport { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '../Button';\nimport { cn } from '@/lib/utils';\n\nexport type MultiColumnProps = {\n children?: React.ReactNode;\n numOfColumns?: number;\n minColumnWidth?: string;\n};\n\nexport function MultiColumn({ children, numOfColumns = 1, minColumnWidth }: MultiColumnProps): React.JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const updateScrollState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const { scrollLeft, scrollWidth, clientWidth } = el;\n setCanScrollLeft(scrollLeft > 1);\n setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n }, []);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n\n updateScrollState();\n\n el.addEventListener('scroll', updateScrollState, { passive: true });\n\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(el);\n\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n observer.disconnect();\n };\n }, [updateScrollState]);\n\n const prevColumnsRef = useRef(numOfColumns);\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n if (numOfColumns > prevColumnsRef.current) {\n // New column added — scroll to the right end so it's visible\n requestAnimationFrame(() => {\n el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });\n });\n }\n prevColumnsRef.current = numOfColumns;\n }, [numOfColumns]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault();\n scrollToColumn(e.key === 'ArrowLeft' ? 'left' : 'right');\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n const scrollToColumn = (direction: 'left' | 'right') => {\n const el = scrollRef.current;\n if (!el) return;\n\n const columns = Array.from(el.children) as HTMLElement[];\n const containerLeft = el.scrollLeft;\n const containerRight = containerLeft + el.clientWidth;\n\n if (direction === 'right') {\n // Find the first column whose right edge is past the container's right edge\n const target = columns.find(col => col.offsetLeft + col.offsetWidth > containerRight + 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft + target.offsetWidth - el.clientWidth, behavior: 'smooth' });\n }\n } else {\n // Find the last column whose left edge is before the container's left edge\n const target = [...columns].reverse().find(col => col.offsetLeft < containerLeft - 1);\n if (target) {\n el.scrollTo({ left: target.offsetLeft, behavior: 'smooth' });\n }\n }\n };\n\n return (\n <div className={cn('MULTI_COLUMN relative w-full h-full overflow-hidden')}>\n {canScrollLeft && <ScrollArrow direction=\"left\" onClick={() => scrollToColumn('left')} />}\n {canScrollRight && <ScrollArrow direction=\"right\" onClick={() => scrollToColumn('right')} />}\n <div\n ref={scrollRef}\n className=\"grid overflow-x-auto w-full overflow-y-auto h-full\"\n style={{\n gridTemplateColumns: `repeat(${numOfColumns}, minmax(${minColumnWidth ?? '0'}, 1fr))`,\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nfunction ScrollArrow({ direction, onClick }: { direction: 'left' | 'right'; onClick: () => void }) {\n const Icon = direction === 'left' ? ChevronLeftIcon : ChevronRightIcon;\n const isLeft = direction === 'left';\n\n return (\n <div\n className={cn(\n 'absolute top-0 bottom-0 z-20 w-20 flex items-center justify-center px-5 bg-surface2',\n isLeft ? 'left-0' : 'right-0',\n )}\n >\n <Button onClick={onClick} className=\"w-full h-full px-0\" aria-label={`Scroll ${direction}`}>\n <Icon />\n </Button>\n </div>\n );\n}\n"],"names":["cn","jsxs","jsx","useRef","useState","useCallback","useEffect","ChevronLeftIcon","ChevronRightIcon","Button"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgB;AAClE,EAAA,sCAAQ,KAAA,EAAA,EAAI,SAAA,EAAWA,YAAG,CAAA,wCAAA,CAAA,EAA4C,SAAS,GAAI,QAAA,EAAS,CAAA;AAC9F;;ACAO,SAAS,WAAW,EAAE,QAAA,EAAU,SAAA,EAAW,iBAAA,EAAmB,oBAAmB,EAAgB;AACtG,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,iBAAA,mCAAsB,SAAA,EAAA,EAAU,CAAA;AAAA,mCAEhC,KAAA,EAAA,EAAI,SAAA,EAAWD,YAAG,CAAA,+CAAA,CAAA,EAAmD,SAAS,GAAI,QAAA,EAAS,CAAA;AAAA,IAE3F,kBAAA,mCAAuB,SAAA,EAAA,EAAU;AAAA,GAAA,EACpC,CAAA;AAEJ;AAEA,SAAS,SAAA,GAAY;AACnB,EAAA,uBAAOE,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWF,WAAA,CAAG,yCAAyC,CAAA,EAAG,CAAA;AACxE;;AChBO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAU,EAAuB;AACzE,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAWA,YAAG,CAAA,gEAAA,CAAA,EAAoE,SAAS,GAAI,QAAA,EAAS,CAAA;AAEjH;;ACPO,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AAAA,EAC9C,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAC;;ACAM,SAAS,OAAA,CAAQ,EAAE,QAAA,EAAU,SAAA,EAAU,EAAiB;AAC7D,EAAA,sCAAQ,KAAA,EAAA,EAAI,SAAA,EAAWA,YAAG,CAAA,8CAAA,CAAA,EAAkD,SAAS,GAAI,QAAA,EAAS,CAAA;AACpG;;ACIO,SAAS,YAAY,EAAE,QAAA,EAAU,YAAA,GAAe,CAAA,EAAG,gBAAe,EAAwC;AAC/G,EAAA,MAAM,SAAA,GAAYG,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,iBAAA,GAAoBC,kBAAY,MAAM;AAC1C,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAa,WAAA,EAAY,GAAI,EAAA;AACjD,IAAA,gBAAA,CAAiB,aAAa,CAAC,CAAA;AAC/B,IAAA,iBAAA,CAAkB,UAAA,GAAa,WAAA,GAAc,WAAA,GAAc,CAAC,CAAA;AAAA,EAC9D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,iBAAA,EAAkB;AAElB,IAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,iBAAA,EAAmB,EAAE,OAAA,EAAS,MAAM,CAAA;AAElE,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,iBAAiB,CAAA;AACrD,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AAEnB,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;AAClD,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,cAAA,GAAiBH,aAAO,YAAY,CAAA;AAC1C,EAAAG,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAI,YAAA,GAAe,eAAe,OAAA,EAAS;AAEzC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,EAAA,CAAG,SAAS,EAAE,IAAA,EAAM,GAAG,WAAA,EAAa,QAAA,EAAU,UAAU,CAAA;AAAA,MAC1D,CAAC,CAAA;AAAA,IACH;AACA,IAAA,cAAA,CAAe,OAAA,GAAU,YAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,YAAA,EAAc;AACnD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,cAAA,CAAe,CAAA,CAAE,GAAA,KAAQ,WAAA,GAAc,MAAA,GAAS,OAAO,CAAA;AAAA,MACzD;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,KAAgC;AACtD,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA;AACtC,IAAA,MAAM,gBAAgB,EAAA,CAAG,UAAA;AACzB,IAAA,MAAM,cAAA,GAAiB,gBAAgB,EAAA,CAAG,WAAA;AAE1C,IAAA,IAAI,cAAc,OAAA,EAAS;AAEzB,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,UAAA,GAAa,GAAA,CAAI,WAAA,GAAc,cAAA,GAAiB,CAAC,CAAA;AACxF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,EAAA,CAAG,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,WAAA,GAAc,EAAA,CAAG,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,MACnG;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,UAAA,GAAa,aAAA,GAAgB,CAAC,CAAA;AACpF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,EAAA,CAAG,SAAS,EAAE,IAAA,EAAM,OAAO,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEL,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWD,WAAA,CAAG,qDAAqD,CAAA,EACrE,QAAA,EAAA;AAAA,IAAA,aAAA,oBAAiBE,cAAA,CAAC,eAAY,SAAA,EAAU,MAAA,EAAO,SAAS,MAAM,cAAA,CAAe,MAAM,CAAA,EAAG,CAAA;AAAA,IACtF,cAAA,mCAAmB,WAAA,EAAA,EAAY,SAAA,EAAU,SAAQ,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA,EAAG,CAAA;AAAA,oBAC1FA,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAU,oDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,mBAAA,EAAqB,CAAA,OAAA,EAAU,YAAY,CAAA,SAAA,EAAY,kBAAkB,GAAG,CAAA,OAAA;AAAA,SAC9E;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,OAAA,EAAQ,EAAyD;AACjG,EAAA,MAAM,IAAA,GAAO,SAAA,KAAc,MAAA,GAASK,2BAAA,GAAkBC,4BAAA;AACtD,EAAA,MAAM,SAAS,SAAA,KAAc,MAAA;AAE7B,EAAA,uBACEN,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWF,WAAA;AAAA,QACT,qFAAA;AAAA,QACA,SAAS,QAAA,GAAW;AAAA,OACtB;AAAA,MAEA,QAAA,kBAAAE,cAAA,CAACO,aAAA,EAAA,EAAO,OAAA,EAAkB,SAAA,EAAU,oBAAA,EAAqB,YAAA,EAAY,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EACtF,QAAA,kBAAAP,cAAA,CAAC,IAAA,EAAA,EAAK,CAAA,EACR;AAAA;AAAA,GACF;AAEJ;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/playground-ui",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "38.0.0-alpha.
|
|
4
|
+
"version": "38.0.0-alpha.7",
|
|
5
5
|
"description": "Mastra Playground components",
|
|
6
6
|
"main": "dist/index.umd.js",
|
|
7
7
|
"module": "dist/index.es.js",
|
|
@@ -169,8 +169,8 @@
|
|
|
169
169
|
"react": ">=19.0.0",
|
|
170
170
|
"react-dom": ">=19.0.0",
|
|
171
171
|
"tailwindcss": "^4.0.0",
|
|
172
|
-
"@mastra/client-js": "^1.29.0-alpha.
|
|
173
|
-
"@mastra/react": "1.2.1-alpha.
|
|
172
|
+
"@mastra/client-js": "^1.29.0-alpha.7",
|
|
173
|
+
"@mastra/react": "1.2.1-alpha.7"
|
|
174
174
|
},
|
|
175
175
|
"devDependencies": {
|
|
176
176
|
"@storybook/addon-a11y": "^10.4.1",
|
|
@@ -207,11 +207,11 @@
|
|
|
207
207
|
"vite-plugin-dts": "^4.5.4",
|
|
208
208
|
"vite-plugin-lib-inject-css": "^2.2.2",
|
|
209
209
|
"vitest": "4.1.8",
|
|
210
|
+
"@mastra/client-js": "^1.29.0-alpha.7",
|
|
210
211
|
"@internal/lint": "0.0.109",
|
|
211
|
-
"@mastra/
|
|
212
|
-
"@mastra/
|
|
213
|
-
"@mastra/
|
|
214
|
-
"@mastra/react": "1.2.1-alpha.5"
|
|
212
|
+
"@mastra/core": "1.48.0-alpha.7",
|
|
213
|
+
"@mastra/react": "1.2.1-alpha.7",
|
|
214
|
+
"@mastra/memory": "1.21.3-alpha.2"
|
|
215
215
|
},
|
|
216
216
|
"homepage": "https://mastra.ai",
|
|
217
217
|
"repository": {
|