@mastra/playground-ui 48.0.0 → 48.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/Composer.css +2 -2
  3. package/dist/{code-C5KVVzOZ.js → code-Cj09LVys.js} +2 -2
  4. package/dist/{code-C5KVVzOZ.js.map → code-Cj09LVys.js.map} +1 -1
  5. package/dist/{code-B3WONxnA.cjs → code-FZwLnf_f.cjs} +2 -2
  6. package/dist/{code-B3WONxnA.cjs.map → code-FZwLnf_f.cjs.map} +1 -1
  7. package/dist/code-block-Dn0K3DkE.cjs +88 -0
  8. package/dist/code-block-Dn0K3DkE.cjs.map +1 -0
  9. package/dist/code-block-DqKXZajq.js +86 -0
  10. package/dist/code-block-DqKXZajq.js.map +1 -0
  11. package/dist/components/Code.cjs.js +1 -1
  12. package/dist/components/Code.es.js +1 -1
  13. package/dist/components/CodeBlock.cjs.js +3 -83
  14. package/dist/components/CodeBlock.cjs.js.map +1 -1
  15. package/dist/components/CodeBlock.es.js +1 -85
  16. package/dist/components/CodeBlock.es.js.map +1 -1
  17. package/dist/components/CodeEditor.cjs.js +2 -2
  18. package/dist/components/CodeEditor.es.js +2 -2
  19. package/dist/components/CopyButton.cjs.js +1 -1
  20. package/dist/components/CopyButton.es.js +1 -1
  21. package/dist/components/DataCodeSection.cjs.js +1 -1
  22. package/dist/components/DataCodeSection.es.js +1 -1
  23. package/dist/components/DataDetailsPanel.cjs.js +1 -1
  24. package/dist/components/DataDetailsPanel.es.js +1 -1
  25. package/dist/components/DataPanel.cjs.js +1 -1
  26. package/dist/components/DataPanel.es.js +1 -1
  27. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  28. package/dist/components/MarkdownRenderer.es.js +1 -1
  29. package/dist/components/SideDialog.cjs.js +1 -1
  30. package/dist/components/SideDialog.es.js +1 -1
  31. package/dist/components/Truncate.cjs.js +1 -1
  32. package/dist/components/Truncate.es.js +1 -1
  33. package/dist/components/ai/plan.cjs.js +2 -2
  34. package/dist/components/ai/plan.cjs.js.map +1 -1
  35. package/dist/components/ai/plan.es.js +2 -2
  36. package/dist/components/ai/plan.es.js.map +1 -1
  37. package/dist/components/ai/task-list.cjs.js +44 -18
  38. package/dist/components/ai/task-list.cjs.js.map +1 -1
  39. package/dist/components/ai/task-list.es.js +47 -21
  40. package/dist/components/ai/task-list.es.js.map +1 -1
  41. package/dist/{copy-button-B1GWIQ-x.js → copy-button-BLGUkVE8.js} +4 -2
  42. package/dist/copy-button-BLGUkVE8.js.map +1 -0
  43. package/dist/{copy-button-DwZ3c7D4.cjs → copy-button-BfawWA4t.cjs} +4 -2
  44. package/dist/copy-button-BfawWA4t.cjs.map +1 -0
  45. package/dist/{data-code-section-PJM5l3aS.js → data-code-section-DHbytoQ2.js} +2 -2
  46. package/dist/{data-code-section-PJM5l3aS.js.map → data-code-section-DHbytoQ2.js.map} +1 -1
  47. package/dist/{data-code-section-BjmFgJpC.cjs → data-code-section-bqvIovEN.cjs} +2 -2
  48. package/dist/{data-code-section-BjmFgJpC.cjs.map → data-code-section-bqvIovEN.cjs.map} +1 -1
  49. package/dist/{data-panel-BQqPr6ew.js → data-panel-BX_78wCj.js} +2 -2
  50. package/dist/{data-panel-BQqPr6ew.js.map → data-panel-BX_78wCj.js.map} +1 -1
  51. package/dist/{data-panel-C85h9XvH.cjs → data-panel-DT6LgTVX.cjs} +2 -2
  52. package/dist/{data-panel-C85h9XvH.cjs.map → data-panel-DT6LgTVX.cjs.map} +1 -1
  53. package/dist/domains/logs/components/log-details-view.cjs.js +1 -1
  54. package/dist/domains/logs/components/log-details-view.es.js +1 -1
  55. package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
  56. package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
  57. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
  58. package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
  59. package/dist/ee/signals/entity-learning-api.cjs.js +8 -2
  60. package/dist/ee/signals/entity-learning-api.cjs.js.map +1 -1
  61. package/dist/ee/signals/entity-learning-api.es.js +8 -3
  62. package/dist/ee/signals/entity-learning-api.es.js.map +1 -1
  63. package/dist/ee/signals/hooks/use-noise-examples.cjs.js +5 -3
  64. package/dist/ee/signals/hooks/use-noise-examples.cjs.js.map +1 -1
  65. package/dist/ee/signals/hooks/use-noise-examples.es.js +6 -4
  66. package/dist/ee/signals/hooks/use-noise-examples.es.js.map +1 -1
  67. package/dist/ee/signals/hooks/use-theme-examples.cjs.js +6 -3
  68. package/dist/ee/signals/hooks/use-theme-examples.cjs.js.map +1 -1
  69. package/dist/ee/signals/hooks/use-theme-examples.es.js +7 -4
  70. package/dist/ee/signals/hooks/use-theme-examples.es.js.map +1 -1
  71. package/dist/ee/signals/hooks/use-theme-paths.cjs.js +2 -2
  72. package/dist/ee/signals/hooks/use-theme-paths.cjs.js.map +1 -1
  73. package/dist/ee/signals/hooks/use-theme-paths.es.js +3 -3
  74. package/dist/ee/signals/hooks/use-theme-paths.es.js.map +1 -1
  75. package/dist/ee/signals/lifeline-row.cjs.js +1 -1
  76. package/dist/ee/signals/lifeline-row.cjs.js.map +1 -1
  77. package/dist/ee/signals/lifeline-row.es.js +1 -1
  78. package/dist/ee/signals/lifeline-row.es.js.map +1 -1
  79. package/dist/ee/signals/noise-detail-panel.cjs.js +18 -5
  80. package/dist/ee/signals/noise-detail-panel.cjs.js.map +1 -1
  81. package/dist/ee/signals/noise-detail-panel.es.js +18 -5
  82. package/dist/ee/signals/noise-detail-panel.es.js.map +1 -1
  83. package/dist/ee/signals/sankey-signals.cjs.js +50 -34
  84. package/dist/ee/signals/sankey-signals.cjs.js.map +1 -1
  85. package/dist/ee/signals/sankey-signals.es.js +52 -36
  86. package/dist/ee/signals/sankey-signals.es.js.map +1 -1
  87. package/dist/ee/signals/signal-delta-column.cjs.js +1 -1
  88. package/dist/ee/signals/signal-delta-column.cjs.js.map +1 -1
  89. package/dist/ee/signals/signal-delta-column.es.js +1 -1
  90. package/dist/ee/signals/signal-delta-column.es.js.map +1 -1
  91. package/dist/ee/signals/theme-detail-panel.cjs.js +11 -4
  92. package/dist/ee/signals/theme-detail-panel.cjs.js.map +1 -1
  93. package/dist/ee/signals/theme-detail-panel.es.js +11 -4
  94. package/dist/ee/signals/theme-detail-panel.es.js.map +1 -1
  95. package/dist/ee/signals/theme-drilldown-data.cjs.js +41 -13
  96. package/dist/ee/signals/theme-drilldown-data.cjs.js.map +1 -1
  97. package/dist/ee/signals/theme-drilldown-data.es.js +40 -14
  98. package/dist/ee/signals/theme-drilldown-data.es.js.map +1 -1
  99. package/dist/ee/signals/theme-filter-banner.cjs.js +53 -28
  100. package/dist/ee/signals/theme-filter-banner.cjs.js.map +1 -1
  101. package/dist/ee/signals/theme-filter-banner.es.js +53 -28
  102. package/dist/ee/signals/theme-filter-banner.es.js.map +1 -1
  103. package/dist/{highlight-C2uRVhiA.cjs → highlight-CEt2vhD8.cjs} +20 -3
  104. package/dist/highlight-CEt2vhD8.cjs.map +1 -0
  105. package/dist/{highlight-Dis62bkj.js → highlight-CSJjjoqh.js} +20 -3
  106. package/dist/highlight-CSJjjoqh.js.map +1 -0
  107. package/dist/markdown-renderer-D1vSFfp9.cjs +86 -0
  108. package/dist/markdown-renderer-D1vSFfp9.cjs.map +1 -0
  109. package/dist/markdown-renderer-DmYYQHxu.js +84 -0
  110. package/dist/markdown-renderer-DmYYQHxu.js.map +1 -0
  111. package/dist/markdown-renderer.css +182 -0
  112. package/dist/src/ds/components/CopyButton/copy-button.d.ts +2 -1
  113. package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +9 -5
  114. package/dist/src/ds/components/ai/task-list/task-list.d.ts +4 -2
  115. package/dist/src/ds/components/ai/task-list/task-list.stories.d.ts +2 -0
  116. package/dist/src/ee/signals/entity-learning-api.d.ts +4 -2
  117. package/dist/src/ee/signals/hooks/use-noise-examples.d.ts +2 -1
  118. package/dist/src/ee/signals/hooks/use-theme-examples.d.ts +2 -1
  119. package/dist/src/ee/signals/hooks/use-theme-paths.d.ts +1 -1
  120. package/dist/src/ee/signals/noise-detail-panel.d.ts +4 -1
  121. package/dist/src/ee/signals/theme-detail-panel.d.ts +5 -3
  122. package/dist/src/ee/signals/theme-drilldown-data.d.ts +17 -4
  123. package/dist/src/ee/signals/theme-filter-banner.d.ts +5 -3
  124. package/dist/style.css +5 -98
  125. package/package.json +7 -7
  126. package/dist/copy-button-B1GWIQ-x.js.map +0 -1
  127. package/dist/copy-button-DwZ3c7D4.cjs.map +0 -1
  128. package/dist/highlight-C2uRVhiA.cjs.map +0 -1
  129. package/dist/highlight-Dis62bkj.js.map +0 -1
  130. package/dist/markdown-renderer-DszxuuNM.js +0 -117
  131. package/dist/markdown-renderer-DszxuuNM.js.map +0 -1
  132. package/dist/markdown-renderer-g8xNLOc0.cjs +0 -119
  133. package/dist/markdown-renderer-g8xNLOc0.cjs.map +0 -1
@@ -0,0 +1,182 @@
1
+ /* Markdown typography. Plain CSS rather than one React wrapper per element:
2
+ * markers, task lists and tables need selectors no `[&_x]` class string carries
3
+ * readably. Declared in `@layer components`, so a surface that needs another
4
+ * tone or size overrides it with a utility on the renderer itself.
5
+ *
6
+ * A component stylesheet can load before the app's Tailwind entry, and the
7
+ * first sheet to name a layer fixes its rank. Restating the full order keeps
8
+ * preflight from winning over these rules whichever one lands first. */
9
+ @layer properties, theme, base, components, utilities;
10
+
11
+ @layer components {
12
+ .mastra-markdown {
13
+ color: var(--neutral5);
14
+ font-size: var(--text-ui-md);
15
+ line-height: 1.7;
16
+ overflow-wrap: break-word;
17
+ text-wrap: pretty;
18
+ }
19
+
20
+ .mastra-markdown > :first-child {
21
+ margin-top: 0;
22
+ }
23
+
24
+ .mastra-markdown > :last-child {
25
+ margin-bottom: 0;
26
+ }
27
+
28
+ /* `pre-wrap` keeps single newlines as line breaks, the way chat authors expect. */
29
+ .mastra-markdown p {
30
+ margin: 0.7em 0;
31
+ white-space: pre-wrap;
32
+ }
33
+
34
+ .mastra-markdown :is(h1, h2, h3, h4, h5, h6) {
35
+ margin: 1.6em 0 0.6em;
36
+ color: var(--neutral6);
37
+ font-weight: 600;
38
+ letter-spacing: -0.012em;
39
+ line-height: 1.35;
40
+ }
41
+
42
+ .mastra-markdown h1 {
43
+ font-size: 1.3em;
44
+ }
45
+
46
+ .mastra-markdown h2 {
47
+ font-size: 1.15em;
48
+ }
49
+
50
+ .mastra-markdown h3 {
51
+ font-size: 1.05em;
52
+ }
53
+
54
+ .mastra-markdown :is(h4, h5, h6) {
55
+ font-size: 1em;
56
+ }
57
+
58
+ .mastra-markdown strong {
59
+ color: var(--neutral6);
60
+ font-weight: 600;
61
+ }
62
+
63
+ .mastra-markdown em {
64
+ font-style: italic;
65
+ }
66
+
67
+ .mastra-markdown del {
68
+ color: var(--neutral3);
69
+ text-decoration: line-through;
70
+ }
71
+
72
+ .mastra-markdown a {
73
+ color: var(--accent1);
74
+ text-decoration: underline;
75
+ text-decoration-color: color-mix(in oklab, var(--accent1) 30%, transparent);
76
+ text-underline-offset: 0.15em;
77
+ }
78
+
79
+ .mastra-markdown a:hover {
80
+ text-decoration-color: currentcolor;
81
+ }
82
+
83
+ /* Tailwind's preflight drops list markers; markdown is the one place we want
84
+ * them back, per nesting level. */
85
+ .mastra-markdown :is(ul, ol) {
86
+ margin: 0.7em 0;
87
+ padding-left: 1.35em;
88
+ }
89
+
90
+ .mastra-markdown ul {
91
+ list-style: disc;
92
+ }
93
+
94
+ .mastra-markdown ol {
95
+ list-style: decimal;
96
+ }
97
+
98
+ .mastra-markdown ul ul {
99
+ list-style: circle;
100
+ }
101
+
102
+ .mastra-markdown ul ul ul {
103
+ list-style: square;
104
+ }
105
+
106
+ .mastra-markdown :is(ul, ol) :is(ul, ol) {
107
+ margin: 0.3em 0;
108
+ }
109
+
110
+ .mastra-markdown li {
111
+ margin: 0.3em 0;
112
+ }
113
+
114
+ .mastra-markdown li::marker {
115
+ color: var(--neutral3);
116
+ }
117
+
118
+ .mastra-markdown li > p {
119
+ margin: 0.3em 0;
120
+ }
121
+
122
+ .mastra-markdown .contains-task-list {
123
+ padding-left: 0.15em;
124
+ list-style: none;
125
+ }
126
+
127
+ .mastra-markdown .task-list-item input {
128
+ margin-right: 0.5em;
129
+ accent-color: var(--accent1);
130
+ }
131
+
132
+ .mastra-markdown blockquote {
133
+ margin: 0.9em 0;
134
+ border-left: 2px solid var(--border2);
135
+ padding-left: 0.9em;
136
+ color: var(--neutral4);
137
+ }
138
+
139
+ .mastra-markdown hr {
140
+ margin: 1.5em 0;
141
+ border: 0;
142
+ border-top: 1px solid var(--border1);
143
+ }
144
+
145
+ /* Fenced blocks render through the design-system CodeBlock, so this only ever
146
+ * matches inline spans. */
147
+ .mastra-markdown :not(pre) > code {
148
+ border-radius: 4px;
149
+ background: var(--surface-overlay-strong);
150
+ padding: 0.1em 0.35em;
151
+ color: var(--neutral6);
152
+ font-family: var(--font-mono);
153
+ font-size: 0.875em;
154
+ }
155
+
156
+ .mastra-markdown table {
157
+ display: block;
158
+ overflow-x: auto;
159
+ width: max-content;
160
+ max-width: 100%;
161
+ margin: 0.9em 0;
162
+ border-collapse: collapse;
163
+ font-size: 0.95em;
164
+ }
165
+
166
+ .mastra-markdown :is(th, td) {
167
+ border: 1px solid var(--border1);
168
+ padding: 0.4em 0.7em;
169
+ text-align: left;
170
+ }
171
+
172
+ .mastra-markdown th {
173
+ background: var(--surface-overlay-soft);
174
+ color: var(--neutral6);
175
+ font-weight: 600;
176
+ }
177
+
178
+ .mastra-markdown img {
179
+ max-width: 100%;
180
+ border-radius: 8px;
181
+ }
182
+ }
@@ -2,9 +2,10 @@ import { ButtonProps } from '../Button';
2
2
  export type CopyButtonProps = {
3
3
  content: string;
4
4
  copyMessage?: string;
5
+ showToast?: boolean;
5
6
  tooltip?: string;
6
7
  className?: string;
7
8
  size?: ButtonProps['size'];
8
9
  variant?: ButtonProps['variant'];
9
10
  };
10
- export declare function CopyButton({ content, copyMessage, tooltip, size, variant, className, }: CopyButtonProps): import("react").JSX.Element;
11
+ export declare function CopyButton({ content, copyMessage, showToast, tooltip, size, variant, className, }: CopyButtonProps): import("react").JSX.Element;
@@ -1,8 +1,12 @@
1
- import { default as React } from 'react';
2
1
  export type MarkdownExternalLinkTarget = 'tab' | 'window';
3
- export type MarkdownRendererProps = {
2
+ export interface MarkdownRendererProps {
4
3
  children: string;
4
+ className?: string;
5
5
  externalLinkTarget?: MarkdownExternalLinkTarget;
6
- };
7
- export declare function MarkdownRenderer({ children, externalLinkTarget }: MarkdownRendererProps): React.JSX.Element;
8
- export default MarkdownRenderer;
6
+ }
7
+ /**
8
+ * Renders a markdown string. Agent output can carry attacker-influenced text
9
+ * (file contents, tool output, web pages): react-markdown escapes raw HTML and
10
+ * drops dangerous link schemes, so nothing here reaches the DOM as markup.
11
+ */
12
+ export declare function MarkdownRenderer({ children, className, externalLinkTarget }: MarkdownRendererProps): import("react").JSX.Element;
@@ -1,8 +1,9 @@
1
1
  import { TaskItem } from '@mastra/core/signals';
2
2
  import { ComponentProps, ReactNode } from 'react';
3
+ import { CollapsibleTrigger } from '../../Collapsible';
3
4
  export type TaskListItem = TaskItem;
4
5
  export declare const TaskListContainer: ({ className, ...props }: ComponentProps<"section">) => import("react").JSX.Element;
5
- export declare const TaskListHeader: ({ className, ...props }: ComponentProps<"header">) => import("react").JSX.Element;
6
+ export declare const TaskListHeader: ({ className, ...props }: ComponentProps<typeof CollapsibleTrigger>) => import("react").JSX.Element;
6
7
  export interface TaskListCountProps extends ComponentProps<'span'> {
7
8
  completed: number;
8
9
  total: number;
@@ -27,5 +28,6 @@ export interface TaskListProps extends Omit<ComponentProps<typeof TaskListContai
27
28
  hideWhenEmpty?: boolean;
28
29
  hideWhenComplete?: boolean;
29
30
  scrollActiveIntoView?: boolean;
31
+ defaultOpen?: boolean;
30
32
  }
31
- export declare const TaskList: ({ tasks, title, hideWhenEmpty, hideWhenComplete, scrollActiveIntoView, ...props }: TaskListProps) => import("react").JSX.Element | null;
33
+ export declare const TaskList: ({ tasks, title, hideWhenEmpty, hideWhenComplete, scrollActiveIntoView, defaultOpen, ...props }: TaskListProps) => import("react").JSX.Element | null;
@@ -5,5 +5,7 @@ export default meta;
5
5
  type Story = StoryObj<typeof TaskList>;
6
6
  export declare const MixedProgress: Story;
7
7
  export declare const OneActiveTask: Story;
8
+ export declare const Collapsed: Story;
9
+ export declare const LongList: Story;
8
10
  export declare const Empty: Story;
9
11
  export declare const Completed: Story;
@@ -1,3 +1,4 @@
1
+ import { ThemeSelection } from './theme-drilldown-data';
1
2
  import { TraceIntelligenceRequest } from './trace-intelligence-context';
2
3
  import { NoiseResponse, ThemeDetailResponse, EntityLearningProgressResponse, ThemeEntitiesResponse, ThemeExamplesResponse, ThemeFlowResponse, ThemeHistoryResponse, ThemePathsResponse, ThemeSnapshotsResponse, TraceInsightResponse, TraceSignalName } from './types';
3
4
  export declare function fetchThemeEntities(request: TraceIntelligenceRequest, entityType: string): Promise<ThemeEntitiesResponse>;
@@ -5,9 +6,10 @@ export declare function fetchEntityLearningProgress(request: TraceIntelligenceRe
5
6
  export declare function fetchThemeSnapshots(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalNames: string[], dateFrom?: Date, dateTo?: Date, limit?: number): Promise<ThemeSnapshotsResponse>;
6
7
  export declare function fetchThemeFlow(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalNames: string[], snapshotId: string, themeLimitPerStage?: number): Promise<ThemeFlowResponse>;
7
8
  export declare function fetchThemeDetail(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string, themeId: string): Promise<ThemeDetailResponse>;
8
- export declare function fetchThemeExamples(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string, themeId: string, limit?: number, offset?: number): Promise<ThemeExamplesResponse>;
9
+ export declare function serializeThemeFilters(filters: ThemeSelection[]): string;
10
+ export declare function fetchThemeExamples(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string, themeId: string, limit?: number, offset?: number, filters?: ThemeSelection[]): Promise<ThemeExamplesResponse>;
9
11
  export declare function fetchThemeHistory(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalName: TraceSignalName, themeId: string, limit?: number): Promise<ThemeHistoryResponse>;
10
12
  export declare function fetchNoise(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string): Promise<NoiseResponse>;
11
- export declare function fetchNoiseExamples(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string, limit?: number, offset?: number): Promise<ThemeExamplesResponse>;
13
+ export declare function fetchNoiseExamples(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string, limit?: number, offset?: number, filters?: ThemeSelection[]): Promise<ThemeExamplesResponse>;
12
14
  export declare function fetchThemePaths(request: TraceIntelligenceRequest, entityId: string, entityType: string, signalNames: TraceSignalName[], snapshotId: string): Promise<ThemePathsResponse>;
13
15
  export declare function fetchTraceInsight(request: TraceIntelligenceRequest, traceId: string): Promise<TraceInsightResponse>;
@@ -1,2 +1,3 @@
1
+ import { ThemeSelection } from '../theme-drilldown-data';
1
2
  import { TraceSignalName } from '../types';
2
- export declare function useNoiseExamples(entityId: string, entityType: string, signalName: TraceSignalName | undefined, snapshotId: string | undefined, limit?: number, offset?: number): import('@tanstack/react-query').UseQueryResult<import('@mastra/client-js').ThemeExamplesResponse, Error>;
3
+ export declare function useNoiseExamples(entityId: string, entityType: string, signalName: TraceSignalName | undefined, snapshotId: string | undefined, limit?: number, offset?: number, filterThemes?: ThemeSelection[]): import('@tanstack/react-query').UseQueryResult<import('@mastra/client-js').ThemeExamplesResponse, Error>;
@@ -1,2 +1,3 @@
1
+ import { ThemeSelection } from '../theme-drilldown-data';
1
2
  import { TraceSignalName } from '../types';
2
- export declare function useThemeExamples(entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string | undefined, themeId: string | undefined, limit?: number, offset?: number): import('@tanstack/react-query').UseQueryResult<import('@mastra/client-js').ThemeExamplesResponse, Error>;
3
+ export declare function useThemeExamples(entityId: string, entityType: string, signalName: TraceSignalName, snapshotId: string | undefined, themeId: string | undefined, limit?: number, offset?: number, filterThemes?: ThemeSelection[]): import('@tanstack/react-query').UseQueryResult<import('@mastra/client-js').ThemeExamplesResponse, Error>;
@@ -1,2 +1,2 @@
1
1
  import { TraceSignalName } from '../types';
2
- export declare function useThemePaths(entityId: string, entityType: string, signalNames: TraceSignalName[], snapshotId: string | undefined, themeId: string | undefined): import('@tanstack/react-query').UseQueryResult<import('@mastra/client-js').ThemePathsResponse, Error>;
2
+ export declare function useThemePaths(entityId: string, entityType: string, signalNames: TraceSignalName[], snapshotId: string | undefined, enabled: boolean | undefined): import('@tanstack/react-query').UseQueryResult<import('@mastra/client-js').ThemePathsResponse, Error>;
@@ -1,10 +1,13 @@
1
+ import { ThemeSelection, ThemeSelectionStats } from './theme-drilldown-data';
1
2
  import { TraceSignalName } from './types';
2
3
  interface NoiseDetailPanelProps {
3
4
  entityId: string;
4
5
  entityType: string;
5
6
  snapshotId: string;
6
7
  signalName: TraceSignalName | undefined;
8
+ filters?: ThemeSelection[];
9
+ filteredStats?: ThemeSelectionStats;
7
10
  onClose: () => void;
8
11
  }
9
- export declare function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClose }: NoiseDetailPanelProps): import("react").JSX.Element;
12
+ export declare function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, filters, filteredStats, onClose, }: NoiseDetailPanelProps): import("react").JSX.Element;
10
13
  export {};
@@ -1,11 +1,13 @@
1
- import { ThemeSelection } from './theme-drilldown-data';
1
+ import { SelectedTheme, ThemeSelection, ThemeSelectionStats } from './theme-drilldown-data';
2
2
  interface ThemeDetailPanelProps {
3
3
  entityId: string;
4
4
  entityType: string;
5
5
  snapshotId: string;
6
6
  snapshotTotal: number;
7
- selection: ThemeSelection | undefined;
7
+ selection: SelectedTheme | undefined;
8
+ filters?: ThemeSelection[];
9
+ filteredStats?: ThemeSelectionStats;
8
10
  onClose: () => void;
9
11
  }
10
- export declare function ThemeDetailPanel({ entityId, entityType, snapshotId, snapshotTotal, selection, onClose, }: ThemeDetailPanelProps): import("react").JSX.Element;
12
+ export declare function ThemeDetailPanel({ entityId, entityType, snapshotId, snapshotTotal, selection, filters, filteredStats, onClose, }: ThemeDetailPanelProps): import("react").JSX.Element;
11
13
  export {};
@@ -1,10 +1,23 @@
1
1
  import { ThemeFlowResponse, ThemePathsResponse, TraceSignalName } from './types';
2
2
  export type ThemeSelection = {
3
+ kind: 'theme';
3
4
  signalName: TraceSignalName;
4
5
  themeId: string;
5
6
  label: string;
7
+ } | {
8
+ kind: 'noise';
9
+ signalName: TraceSignalName;
6
10
  };
7
- export declare function findThemeSelection(flow: ThemeFlowResponse, signalName: string, nodeId: string | number): ThemeSelection | undefined;
8
- /** Resolves a chart node to its trace signal when the node is that stage's noise bucket. */
9
- export declare function findNoiseSelection(flow: ThemeFlowResponse, signalName: string, nodeId: string | number): TraceSignalName | undefined;
10
- export declare function buildDrilledThemeFlow(flow: ThemeFlowResponse, pathsResponse: ThemePathsResponse, selection: ThemeSelection): ThemeFlowResponse;
11
+ export type SelectedTheme = Extract<ThemeSelection, {
12
+ kind: 'theme';
13
+ }>;
14
+ export interface ThemeSelectionStats {
15
+ traceCount: number;
16
+ stageShare: number;
17
+ }
18
+ export declare function findSelectionStats(flow: ThemeFlowResponse, drillStack: ThemeSelection[], selection: ThemeSelection | undefined): ThemeSelectionStats | undefined;
19
+ export declare function mergeVisibleSignalOrder(signalNames: TraceSignalName[], nextVisibleSignalNames: TraceSignalName[]): TraceSignalName[];
20
+ export declare function findThemeSelection(flow: ThemeFlowResponse, signalName: string, nodeId: string | number): SelectedTheme | undefined;
21
+ /** Resolves a chart node to a noise selection when the node is that stage's noise bucket. */
22
+ export declare function findNoiseSelection(flow: ThemeFlowResponse, signalName: string, nodeId: string | number): ThemeSelection | undefined;
23
+ export declare function buildDrilledThemeFlow(flow: ThemeFlowResponse, pathsResponse: ThemePathsResponse, selections: ThemeSelection[]): ThemeFlowResponse;
@@ -1,8 +1,10 @@
1
1
  import { ThemeSelection } from './theme-drilldown-data';
2
- export declare function ThemeFilterBanner({ selection, filteredTraceCount, totalTraceCount, onViewDetails, onClear, }: {
3
- selection: ThemeSelection;
2
+ export declare function ThemeFilterBanner({ selections, filteredTraceCount, totalTraceCount, isUnavailable, onViewDetails, onRemove, onClear, }: {
3
+ selections: ThemeSelection[];
4
4
  filteredTraceCount?: number;
5
5
  totalTraceCount: number;
6
- onViewDetails: () => void;
6
+ isUnavailable?: boolean;
7
+ onViewDetails: (selection: ThemeSelection) => void;
8
+ onRemove: (signalName: ThemeSelection['signalName']) => void;
7
9
  onClear: () => void;
8
10
  }): import("react").JSX.Element;
package/dist/style.css CHANGED
@@ -163,8 +163,6 @@
163
163
  --text-xs--line-height: calc(1 / .75);
164
164
  --text-sm: .875rem;
165
165
  --text-sm--line-height: calc(1.25 / .875);
166
- --text-base: 1rem;
167
- --text-base--line-height: calc(1.5 / 1);
168
166
  --text-lg: 1.125rem;
169
167
  --text-lg--line-height: calc(1.75 / 1.125);
170
168
  --text-xl: 1.25rem;
@@ -1051,14 +1049,14 @@
1051
1049
  margin-block: var(--spacing-1);
1052
1050
  }
1053
1051
 
1054
- .my-1\.5 {
1055
- margin-block: var(--spacing-1_5);
1056
- }
1057
-
1058
1052
  .my-2 {
1059
1053
  margin-block: var(--spacing-2);
1060
1054
  }
1061
1055
 
1056
+ .my-3 {
1057
+ margin-block: var(--spacing-3);
1058
+ }
1059
+
1062
1060
  .my-8 {
1063
1061
  margin-block: var(--spacing-8);
1064
1062
  }
@@ -1681,10 +1679,6 @@
1681
1679
  height: var(--height-table-header);
1682
1680
  }
1683
1681
 
1684
- .max-h-32 {
1685
- max-height: var(--spacing-32);
1686
- }
1687
-
1688
1682
  .max-h-64 {
1689
1683
  max-height: var(--spacing-64);
1690
1684
  }
@@ -2547,14 +2541,6 @@
2547
2541
  resize: vertical;
2548
2542
  }
2549
2543
 
2550
- .\[scrollbar-width\:none\] {
2551
- scrollbar-width: none;
2552
- }
2553
-
2554
- .list-decimal {
2555
- list-style-type: decimal;
2556
- }
2557
-
2558
2544
  .list-disc {
2559
2545
  list-style-type: disc;
2560
2546
  }
@@ -3061,10 +3047,6 @@
3061
3047
  overflow-x: hidden;
3062
3048
  }
3063
3049
 
3064
- .overflow-x-scroll {
3065
- overflow-x: scroll;
3066
- }
3067
-
3068
3050
  .overflow-y-auto {
3069
3051
  overflow-y: auto;
3070
3052
  }
@@ -3089,10 +3071,6 @@
3089
3071
  border-radius: .3125rem;
3090
3072
  }
3091
3073
 
3092
- .rounded-\[2px\] {
3093
- border-radius: 2px;
3094
- }
3095
-
3096
3074
  .rounded-\[22px\] {
3097
3075
  border-radius: 22px;
3098
3076
  }
@@ -3421,17 +3399,7 @@
3421
3399
  }
3422
3400
  }
3423
3401
 
3424
- .border-neutral6, .border-neutral6\/20 {
3425
- border-color: var(--color-neutral6);
3426
- }
3427
-
3428
- @supports (color: color-mix(in lab, red, red)) {
3429
- .border-neutral6\/20 {
3430
- border-color: color-mix(in oklab, var(--color-neutral6) 20%, transparent);
3431
- }
3432
- }
3433
-
3434
- .border-neutral6\/\[0\.06\] {
3402
+ .border-neutral6, .border-neutral6\/\[0\.06\] {
3435
3403
  border-color: var(--color-neutral6);
3436
3404
  }
3437
3405
 
@@ -4109,16 +4077,6 @@
4109
4077
  }
4110
4078
  }
4111
4079
 
4112
- .bg-surface1\/50 {
4113
- background-color: var(--color-surface1);
4114
- }
4115
-
4116
- @supports (color: color-mix(in lab, red, red)) {
4117
- .bg-surface1\/50 {
4118
- background-color: color-mix(in oklab, var(--color-surface1) 50%, transparent);
4119
- }
4120
- }
4121
-
4122
4080
  .bg-surface2, .bg-surface2\/60 {
4123
4081
  background-color: var(--color-surface2);
4124
4082
  }
@@ -4790,11 +4748,6 @@
4790
4748
  line-height: var(--tw-leading, var(--text-2xl--line-height));
4791
4749
  }
4792
4750
 
4793
- .text-base {
4794
- font-size: var(--text-base);
4795
- line-height: var(--tw-leading, var(--text-base--line-height));
4796
- }
4797
-
4798
4751
  .text-lg {
4799
4752
  font-size: var(--text-lg);
4800
4753
  line-height: var(--tw-leading, var(--text-lg--line-height));
@@ -5317,10 +5270,6 @@
5317
5270
  text-decoration-line: underline;
5318
5271
  }
5319
5272
 
5320
- .underline-offset-2 {
5321
- text-underline-offset: 2px;
5322
- }
5323
-
5324
5273
  .accent-current {
5325
5274
  accent-color: currentColor;
5326
5275
  }
@@ -5993,14 +5942,6 @@
5993
5942
  opacity: 1;
5994
5943
  }
5995
5944
 
5996
- .group-hover\/code\:visible:is(:where(.group\/code):hover *) {
5997
- visibility: visible;
5998
- }
5999
-
6000
- .group-hover\/code\:opacity-100:is(:where(.group\/code):hover *) {
6001
- opacity: 1;
6002
- }
6003
-
6004
5945
  .group-hover\/expand\:pointer-events-auto:is(:where(.group\/expand):hover *) {
6005
5946
  pointer-events: auto;
6006
5947
  }
@@ -6651,10 +6592,6 @@
6651
6592
  padding-right: var(--spacing-3);
6652
6593
  }
6653
6594
 
6654
- .even\:bg-surface4:nth-child(2n) {
6655
- background-color: var(--color-surface4);
6656
- }
6657
-
6658
6595
  .first-of-type\:mt-3:first-of-type {
6659
6596
  margin-top: var(--spacing-3);
6660
6597
  }
@@ -9445,14 +9382,6 @@
9445
9382
  opacity: 1;
9446
9383
  }
9447
9384
 
9448
- .\[\[align\=center\]\]\:text-center[align="center"] {
9449
- text-align: center;
9450
- }
9451
-
9452
- .\[\[align\=right\]\]\:text-right[align="right"] {
9453
- text-align: right;
9454
- }
9455
-
9456
9385
  :is(.\*\*\:\[\[cmdk-group-heading\]\]\:px-2 *)[cmdk-group-heading] {
9457
9386
  padding-inline: var(--spacing-2);
9458
9387
  }
@@ -10145,28 +10074,6 @@
10145
10074
  border-top-right-radius: var(--radius-none);
10146
10075
  }
10147
10076
 
10148
- :not(pre) > .\[\:not\(pre\)\>\&\]\:rounded-md {
10149
- border-radius: var(--radius-md);
10150
- }
10151
-
10152
- :not(pre) > .\[\:not\(pre\)\>\&\]\:bg-surface1\/50 {
10153
- background-color: var(--color-surface1);
10154
- }
10155
-
10156
- @supports (color: color-mix(in lab, red, red)) {
10157
- :not(pre) > .\[\:not\(pre\)\>\&\]\:bg-surface1\/50 {
10158
- background-color: color-mix(in oklab, var(--color-surface1) 50%, transparent);
10159
- }
10160
- }
10161
-
10162
- :not(pre) > .\[\:not\(pre\)\>\&\]\:px-1 {
10163
- padding-inline: var(--spacing-1);
10164
- }
10165
-
10166
- :not(pre) > .\[\:not\(pre\)\>\&\]\:py-0\.5 {
10167
- padding-block: var(--spacing-0_5);
10168
- }
10169
-
10170
10077
  [data-sidebar-mobile="false"] .\[\[data-sidebar-mobile\=\'false\'\]_\&\]\:hidden {
10171
10078
  display: none;
10172
10079
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "48.0.0",
4
+ "version": "48.1.0-alpha.1",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -150,8 +150,8 @@
150
150
  "react": ">=19.0.0",
151
151
  "react-dom": ">=19.0.0",
152
152
  "tailwindcss": "^4.0.0",
153
- "@mastra/client-js": "^1.39.0",
154
- "@mastra/react": "1.4.2"
153
+ "@mastra/client-js": "^1.39.1-alpha.1",
154
+ "@mastra/react": "1.4.3-alpha.1"
155
155
  },
156
156
  "devDependencies": {
157
157
  "@storybook/addon-a11y": "^10.4.1",
@@ -190,10 +190,10 @@
190
190
  "vite-plugin-lib-inject-css": "^2.2.2",
191
191
  "vitest": "4.1.10",
192
192
  "@internal/lint": "0.0.122",
193
- "@mastra/client-js": "^1.39.0",
194
- "@mastra/memory": "1.26.1",
195
- "@mastra/core": "1.58.0",
196
- "@mastra/react": "1.4.2"
193
+ "@mastra/client-js": "^1.39.1-alpha.1",
194
+ "@mastra/core": "1.59.0-alpha.1",
195
+ "@mastra/memory": "1.26.2-alpha.0",
196
+ "@mastra/react": "1.4.3-alpha.1"
197
197
  },
198
198
  "homepage": "https://mastra.ai",
199
199
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"copy-button-B1GWIQ-x.js","sources":["../src/ds/components/CopyButton/copy-button.tsx"],"sourcesContent":["import { CopyIcon, CheckIcon } from 'lucide-react';\nimport { useState } from 'react';\n\nimport type { ButtonProps } from '../Button';\nimport { Button } from '../Button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\n\nexport type CopyButtonProps = {\n content: string;\n copyMessage?: string;\n tooltip?: string;\n className?: string;\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nexport function CopyButton({\n content,\n copyMessage,\n tooltip = 'Copy to clipboard',\n size = 'sm',\n variant,\n className,\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const { handleCopy: originalHandleCopy } = useCopyToClipboard({\n text: content,\n copyMessage,\n });\n\n const handleCopy = () => {\n originalHandleCopy();\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n onClick={handleCopy}\n type=\"button\"\n size={size}\n variant={variant}\n className={className}\n aria-label={copied ? 'Copied!' : tooltip}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{copied ? 'Copied!' : tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAiBO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,mBAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,EAAE,UAAA,EAAY,kBAAA,EAAmB,GAAI,kBAAA,CAAmB;AAAA,IAC5D,IAAA,EAAM,OAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,kBAAA,EAAmB;AACnB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,4BACG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,IAAA,EAAK,QAAA;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA,EAAY,SAAS,SAAA,GAAY,OAAA;AAAA,QAEhC,QAAA,EAAA,MAAA,mBAAS,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,uBAAM,QAAA,EAAA,EAAS;AAAA;AAAA,KACtC,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,cAAA,EAAA,EAAgB,QAAA,EAAA,MAAA,GAAS,SAAA,GAAY,OAAA,EAAQ;AAAA,GAAA,EAChD,CAAA;AAEJ;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"copy-button-DwZ3c7D4.cjs","sources":["../src/ds/components/CopyButton/copy-button.tsx"],"sourcesContent":["import { CopyIcon, CheckIcon } from 'lucide-react';\nimport { useState } from 'react';\n\nimport type { ButtonProps } from '../Button';\nimport { Button } from '../Button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\n\nexport type CopyButtonProps = {\n content: string;\n copyMessage?: string;\n tooltip?: string;\n className?: string;\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nexport function CopyButton({\n content,\n copyMessage,\n tooltip = 'Copy to clipboard',\n size = 'sm',\n variant,\n className,\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const { handleCopy: originalHandleCopy } = useCopyToClipboard({\n text: content,\n copyMessage,\n });\n\n const handleCopy = () => {\n originalHandleCopy();\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n onClick={handleCopy}\n type=\"button\"\n size={size}\n variant={variant}\n className={className}\n aria-label={copied ? 'Copied!' : tooltip}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{copied ? 'Copied!' : tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n"],"names":["tooltip","useState","useCopyToClipboard","Tooltip","jsx","TooltipTrigger","Button","CheckIcon","CopyIcon","TooltipContent"],"mappings":";;;;;;;;;AAiBO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA,WAAA;AAAA,WACAA,SAAA,GAAU,mBAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,EAAE,UAAA,EAAY,kBAAA,EAAmB,GAAIC,2CAAA,CAAmB;AAAA,IAC5D,IAAA,EAAM,OAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,kBAAA,EAAmB;AACnB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,uCACGC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,sBAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAD,cAAA;AAAA,MAACE,aAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,IAAA,EAAK,QAAA;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA,EAAY,SAAS,SAAA,GAAYN,SAAA;AAAA,QAEhC,QAAA,EAAA,MAAA,mBAASI,cAAA,CAACG,qBAAA,EAAA,EAAU,CAAA,kCAAMC,oBAAA,EAAA,EAAS;AAAA;AAAA,KACtC,EACF,CAAA;AAAA,oBACAJ,cAAA,CAACK,sBAAA,EAAA,EAAgB,QAAA,EAAA,MAAA,GAAS,SAAA,GAAYT,SAAA,EAAQ;AAAA,GAAA,EAChD,CAAA;AAEJ;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"highlight-C2uRVhiA.cjs","sources":["../src/ds/components/CodeEditor/highlight.ts"],"sourcesContent":["import type { HighlighterCore, ThemedToken } from 'shiki/core';\n\n/**\n * Languages we support for syntax highlighting in code blocks. Kept in sync\n * with the CodeMirror `codeLanguages` set. Using fine-grained Shiki imports\n * (rather than the full `shiki` bundle) means only these grammars are bundled,\n * instead of a chunk for every language Shiki knows about.\n */\nconst langAliases: Record<string, string> = {\n js: 'javascript',\n javascript: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n node: 'javascript',\n ts: 'typescript',\n typescript: 'typescript',\n mts: 'typescript',\n cts: 'typescript',\n tsx: 'tsx',\n jsx: 'jsx',\n json: 'json',\n json5: 'json',\n md: 'markdown',\n markdown: 'markdown',\n py: 'python',\n python: 'python',\n sh: 'bash',\n bash: 'bash',\n shell: 'bash',\n zsh: 'bash',\n};\n\nlet highlighterPromise: Promise<HighlighterCore> | null = null;\n\nfunction getHighlighter(): Promise<HighlighterCore> {\n if (!highlighterPromise) {\n highlighterPromise = (async () => {\n const [{ createHighlighterCore }, { createJavaScriptRegexEngine }] = await Promise.all([\n import('shiki/core'),\n import('shiki/engine/javascript'),\n ]);\n\n return createHighlighterCore({\n themes: [import('shiki/themes/github-light.mjs'), import('shiki/themes/github-dark.mjs')],\n langs: [\n import('shiki/langs/javascript.mjs'),\n import('shiki/langs/typescript.mjs'),\n import('shiki/langs/tsx.mjs'),\n import('shiki/langs/jsx.mjs'),\n import('shiki/langs/json.mjs'),\n import('shiki/langs/bash.mjs'),\n import('shiki/langs/markdown.mjs'),\n import('shiki/langs/python.mjs'),\n ],\n engine: createJavaScriptRegexEngine(),\n });\n })();\n }\n\n return highlighterPromise;\n}\n\nexport async function highlight(code: string, language: string): Promise<ThemedToken[][] | null> {\n const lang = langAliases[language?.toLowerCase()];\n if (!lang) return null;\n\n const highlighter = await getHighlighter();\n\n const { tokens } = highlighter.codeToTokens(code, {\n lang,\n defaultColor: false,\n themes: {\n light: 'github-light',\n dark: 'github-dark',\n },\n });\n\n return tokens;\n}\n"],"names":[],"mappings":";;AAQA,MAAM,WAAA,GAAsC;AAAA,EAC1C,EAAA,EAAI,YAAA;AAAA,EACJ,UAAA,EAAY,YAAA;AAAA,EACZ,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,UAAA,EAAY,YAAA;AAAA,EACZ,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,EAAA,EAAI,UAAA;AAAA,EACJ,QAAA,EAAU,UAAA;AAAA,EACV,EAAA,EAAI,QAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,EAAA,EAAI,MAAA;AAAA,EACJ,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEA,IAAI,kBAAA,GAAsD,IAAA;AAE1D,SAAS,cAAA,GAA2C;AAClD,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,kBAAA,GAAA,CAAsB,YAAY;AAChC,MAAA,MAAM,CAAC,EAAE,qBAAA,EAAsB,EAAG,EAAE,6BAA6B,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QACrF,OAAO,YAAY,CAAA;AAAA,QACnB,OAAO,yBAAyB;AAAA,OACjC,CAAA;AAED,MAAA,OAAO,qBAAA,CAAsB;AAAA,QAC3B,QAAQ,CAAC,OAAO,+BAA+B,CAAA,EAAG,OAAO,8BAA8B,CAAC,CAAA;AAAA,QACxF,KAAA,EAAO;AAAA,UACL,OAAO,4BAA4B,CAAA;AAAA,UACnC,OAAO,4BAA4B,CAAA;AAAA,UACnC,OAAO,qBAAqB,CAAA;AAAA,UAC5B,OAAO,qBAAqB,CAAA;AAAA,UAC5B,OAAO,sBAAsB,CAAA;AAAA,UAC7B,OAAO,sBAAsB,CAAA;AAAA,UAC7B,OAAO,0BAA0B,CAAA;AAAA,UACjC,OAAO,wBAAwB;AAAA,SACjC;AAAA,QACA,QAAQ,2BAAA;AAA4B,OACrC,CAAA;AAAA,IACH,CAAA,GAAG;AAAA,EACL;AAEA,EAAA,OAAO,kBAAA;AACT;AAEA,eAAsB,SAAA,CAAU,MAAc,QAAA,EAAmD;AAC/F,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,EAAU,WAAA,EAAa,CAAA;AAChD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AAEzC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,WAAA,CAAY,aAAa,IAAA,EAAM;AAAA,IAChD,IAAA;AAAA,IACA,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM;AAAA;AACR,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"highlight-Dis62bkj.js","sources":["../src/ds/components/CodeEditor/highlight.ts"],"sourcesContent":["import type { HighlighterCore, ThemedToken } from 'shiki/core';\n\n/**\n * Languages we support for syntax highlighting in code blocks. Kept in sync\n * with the CodeMirror `codeLanguages` set. Using fine-grained Shiki imports\n * (rather than the full `shiki` bundle) means only these grammars are bundled,\n * instead of a chunk for every language Shiki knows about.\n */\nconst langAliases: Record<string, string> = {\n js: 'javascript',\n javascript: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n node: 'javascript',\n ts: 'typescript',\n typescript: 'typescript',\n mts: 'typescript',\n cts: 'typescript',\n tsx: 'tsx',\n jsx: 'jsx',\n json: 'json',\n json5: 'json',\n md: 'markdown',\n markdown: 'markdown',\n py: 'python',\n python: 'python',\n sh: 'bash',\n bash: 'bash',\n shell: 'bash',\n zsh: 'bash',\n};\n\nlet highlighterPromise: Promise<HighlighterCore> | null = null;\n\nfunction getHighlighter(): Promise<HighlighterCore> {\n if (!highlighterPromise) {\n highlighterPromise = (async () => {\n const [{ createHighlighterCore }, { createJavaScriptRegexEngine }] = await Promise.all([\n import('shiki/core'),\n import('shiki/engine/javascript'),\n ]);\n\n return createHighlighterCore({\n themes: [import('shiki/themes/github-light.mjs'), import('shiki/themes/github-dark.mjs')],\n langs: [\n import('shiki/langs/javascript.mjs'),\n import('shiki/langs/typescript.mjs'),\n import('shiki/langs/tsx.mjs'),\n import('shiki/langs/jsx.mjs'),\n import('shiki/langs/json.mjs'),\n import('shiki/langs/bash.mjs'),\n import('shiki/langs/markdown.mjs'),\n import('shiki/langs/python.mjs'),\n ],\n engine: createJavaScriptRegexEngine(),\n });\n })();\n }\n\n return highlighterPromise;\n}\n\nexport async function highlight(code: string, language: string): Promise<ThemedToken[][] | null> {\n const lang = langAliases[language?.toLowerCase()];\n if (!lang) return null;\n\n const highlighter = await getHighlighter();\n\n const { tokens } = highlighter.codeToTokens(code, {\n lang,\n defaultColor: false,\n themes: {\n light: 'github-light',\n dark: 'github-dark',\n },\n });\n\n return tokens;\n}\n"],"names":[],"mappings":"AAQA,MAAM,WAAA,GAAsC;AAAA,EAC1C,EAAA,EAAI,YAAA;AAAA,EACJ,UAAA,EAAY,YAAA;AAAA,EACZ,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,UAAA,EAAY,YAAA;AAAA,EACZ,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,EAAA,EAAI,UAAA;AAAA,EACJ,QAAA,EAAU,UAAA;AAAA,EACV,EAAA,EAAI,QAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,EAAA,EAAI,MAAA;AAAA,EACJ,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEA,IAAI,kBAAA,GAAsD,IAAA;AAE1D,SAAS,cAAA,GAA2C;AAClD,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,kBAAA,GAAA,CAAsB,YAAY;AAChC,MAAA,MAAM,CAAC,EAAE,qBAAA,EAAsB,EAAG,EAAE,6BAA6B,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QACrF,OAAO,YAAY,CAAA;AAAA,QACnB,OAAO,yBAAyB;AAAA,OACjC,CAAA;AAED,MAAA,OAAO,qBAAA,CAAsB;AAAA,QAC3B,QAAQ,CAAC,OAAO,+BAA+B,CAAA,EAAG,OAAO,8BAA8B,CAAC,CAAA;AAAA,QACxF,KAAA,EAAO;AAAA,UACL,OAAO,4BAA4B,CAAA;AAAA,UACnC,OAAO,4BAA4B,CAAA;AAAA,UACnC,OAAO,qBAAqB,CAAA;AAAA,UAC5B,OAAO,qBAAqB,CAAA;AAAA,UAC5B,OAAO,sBAAsB,CAAA;AAAA,UAC7B,OAAO,sBAAsB,CAAA;AAAA,UAC7B,OAAO,0BAA0B,CAAA;AAAA,UACjC,OAAO,wBAAwB;AAAA,SACjC;AAAA,QACA,QAAQ,2BAAA;AAA4B,OACrC,CAAA;AAAA,IACH,CAAA,GAAG;AAAA,EACL;AAEA,EAAA,OAAO,kBAAA;AACT;AAEA,eAAsB,SAAA,CAAU,MAAc,QAAA,EAAmD;AAC/F,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,EAAU,WAAA,EAAa,CAAA;AAChD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AAEzC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,WAAA,CAAY,aAAa,IAAA,EAAM;AAAA,IAChD,IAAA;AAAA,IACA,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM;AAAA;AACR,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}