@mastra/playground-ui 40.0.1-alpha.1 → 40.0.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 40.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Added an embedded CodeEditor variant for borderless editor surfaces and aligned CodeEditor focus styling to use the container border instead of CodeMirror's internal outline. ([#19025](https://github.com/mastra-ai/mastra/pull/19025))
8
+
9
+ - Fixed signal details pages so their sidebars can scroll within the Studio route, removed the scatter plot tab, and cleaned up unused signal points APIs. ([#19005](https://github.com/mastra-ai/mastra/pull/19005))
10
+
11
+ - Updated dependencies [[`e900f25`](https://github.com/mastra-ai/mastra/commit/e900f25dfe2c9237f15b26cb109ac55aa9de3000), [`e8eaf3a`](https://github.com/mastra-ai/mastra/commit/e8eaf3aea09d51c131b5d369aee459442f416efc), [`d1c930f`](https://github.com/mastra-ai/mastra/commit/d1c930f713d1de09d5f3cd665cb79a8b7ebd7ec7), [`02634f7`](https://github.com/mastra-ai/mastra/commit/02634f700051e014a125d0d10165e3c9b8414e95), [`27492f2`](https://github.com/mastra-ai/mastra/commit/27492f24ee4960afefb1268a4d38201cd0779566), [`a940148`](https://github.com/mastra-ai/mastra/commit/a9401483e1bfe85c18a6e73d33c5949239d65a92)]:
12
+ - @mastra/core@1.50.1
13
+ - @mastra/memory@1.22.2
14
+ - @mastra/client-js@1.31.1
15
+ - @mastra/react@1.2.4
16
+
17
+ ## 40.0.1-alpha.2
18
+
19
+ ### Patch Changes
20
+
21
+ - Added an embedded CodeEditor variant for borderless editor surfaces and aligned CodeEditor focus styling to use the container border instead of CodeMirror's internal outline. ([#19025](https://github.com/mastra-ai/mastra/pull/19025))
22
+
23
+ - Updated dependencies [[`a940148`](https://github.com/mastra-ai/mastra/commit/a9401483e1bfe85c18a6e73d33c5949239d65a92)]:
24
+ - @mastra/core@1.50.1-alpha.2
25
+ - @mastra/client-js@1.31.1-alpha.2
26
+ - @mastra/react@1.2.4-alpha.2
27
+
3
28
  ## 40.0.1-alpha.1
4
29
 
5
30
  ### Patch Changes
@@ -11,6 +11,7 @@ const view = require('@codemirror/view');
11
11
  const highlight$1 = require('@lezer/highlight');
12
12
  const codemirrorThemeDracula = require('@uiw/codemirror-theme-dracula');
13
13
  const ReactCodeMirror = require('@uiw/react-codemirror');
14
+ const index = require('../index-C-Lt4Bx_.cjs');
14
15
  const React = require('react');
15
16
  const autocomplete = require('@codemirror/autocomplete');
16
17
  const copyButton = require('../copy-button-DN9mi_LV.cjs');
@@ -372,6 +373,48 @@ const useCodemirrorTheme = () => {
372
373
  const isDark = themeProvider.useTheme().resolvedTheme === "dark";
373
374
  return React.useMemo(() => isDark ? buildDarkTheme() : buildLightTheme(), [isDark]);
374
375
  };
376
+ const codeEditorVariants = index.cva(
377
+ utils_cn.cn(
378
+ "font-mono relative overflow-hidden outline-hidden focus:outline-hidden focus-within:outline-hidden",
379
+ "transition-colors duration-normal ease-out-custom"
380
+ ),
381
+ {
382
+ variants: {
383
+ variant: {
384
+ default: "rounded-md bg-surface3 border border-border1 p-1 focus-within:border-neutral6/20",
385
+ embedded: "rounded-none border-none bg-transparent p-0"
386
+ }
387
+ },
388
+ defaultVariants: {
389
+ variant: "default"
390
+ }
391
+ }
392
+ );
393
+ const editorFocusAttributes = state.Prec.highest(
394
+ view.EditorView.editorAttributes.of({
395
+ style: "outline: none"
396
+ })
397
+ );
398
+ const editorFocusTheme = state.Prec.highest(
399
+ view.EditorView.theme({
400
+ "&": {
401
+ outline: "none"
402
+ },
403
+ "&.cm-focused": {
404
+ outline: "none"
405
+ },
406
+ ".cm-scroller": {
407
+ outline: "none"
408
+ },
409
+ ".cm-content": {
410
+ outline: "none"
411
+ },
412
+ ".cm-content:focus": {
413
+ outline: "none"
414
+ }
415
+ })
416
+ );
417
+ const editorFocusExtensions = [editorFocusAttributes, editorFocusTheme];
375
418
  const CodeEditor = React.forwardRef(
376
419
  ({
377
420
  data,
@@ -387,12 +430,13 @@ const CodeEditor = React.forwardRef(
387
430
  lineNumbers = true,
388
431
  lineWrapping = true,
389
432
  editable,
433
+ variant,
390
434
  ...props
391
435
  }, ref) => {
392
436
  const theme = useCodemirrorTheme();
393
437
  const formattedCode = data ? JSON.stringify(data, null, 2) : value ?? "";
394
438
  const extensions = React.useMemo(() => {
395
- const exts = [];
439
+ const exts = [...editorFocusExtensions];
396
440
  if (lineWrapping) {
397
441
  exts.push(view.EditorView.lineWrapping);
398
442
  }
@@ -412,33 +456,26 @@ const CodeEditor = React.forwardRef(
412
456
  }
413
457
  return exts;
414
458
  }, [language, highlightVariables, schema, editable, lineWrapping]);
415
- return /* @__PURE__ */ jsxRuntime.jsxs(
416
- "div",
417
- {
418
- className: utils_cn.cn("rounded-md bg-surface3 p-1 font-mono relative border border-border1 overflow-hidden", className),
419
- ...props,
420
- children: [
421
- showCopyButton && /* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: formattedCode, className: "absolute top-2 right-2 z-20" }),
422
- /* @__PURE__ */ jsxRuntime.jsx(
423
- ReactCodeMirror,
424
- {
425
- ref,
426
- value: formattedCode,
427
- theme,
428
- extensions,
429
- onChange,
430
- editable,
431
- "aria-label": "Code editor",
432
- placeholder,
433
- height: "100%",
434
- style: { height: "100%" },
435
- autoFocus,
436
- basicSetup: { lineNumbers }
437
- }
438
- )
439
- ]
440
- }
441
- );
459
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils_cn.cn(codeEditorVariants({ variant }), className), ...props, children: [
460
+ showCopyButton && /* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: formattedCode, className: "absolute top-2 right-2 z-20" }),
461
+ /* @__PURE__ */ jsxRuntime.jsx(
462
+ ReactCodeMirror,
463
+ {
464
+ ref,
465
+ value: formattedCode,
466
+ theme,
467
+ extensions,
468
+ onChange,
469
+ editable,
470
+ "aria-label": "Code editor",
471
+ placeholder,
472
+ height: "100%",
473
+ style: { height: "100%" },
474
+ autoFocus,
475
+ basicSetup: { lineNumbers }
476
+ }
477
+ )
478
+ ] });
442
479
  }
443
480
  );
444
481
 
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.cjs.js","sources":["../../src/ds/components/CodeEditor/code-languages.ts","../../src/ds/components/CodeEditor/schema-to-variables.ts","../../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../../src/ds/components/CodeEditor/variable-highlight-extension.ts","../../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nfunction createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Check if }} already follows the cursor\n const afterCursor = view.state.sliceDoc(to, to + 2);\n const hasClosingBraces = afterCursor === '}}';\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { EditorState } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useTheme } from '@/ds/components/ThemeProvider';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\n\n/** Original dark theme — draculaInit + custom overrides. Unchanged from before light mode work. */\nfunction buildDarkTheme(): Extension {\n const baseTheme = draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: 'var(--neutral2)',\n background: 'transparent',\n foreground: 'var(--neutral6)',\n caret: 'var(--neutral6)',\n },\n styles: [\n { tag: [t.className, t.propertyName], color: 'var(--neutral6)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: t.emphasis, fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: t.strong, fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.quote, fontStyle: 'italic', color: 'var(--neutral2)' },\n ],\n });\n\n const customLineNumberTheme = EditorView.theme({\n '.cm-editor': {\n backgroundColor: 'transparent',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n color: 'var(--neutral3)',\n },\n '.cm-cursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '.cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--accent3) 22%, transparent)',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n return [baseTheme, customLineNumberTheme];\n}\n\nfunction buildLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--neutral3)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'color-mix(in srgb, var(--accent3) 22%, transparent) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: [t.emphasis], fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: [t.strong], fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: [t.deleted], color: 'var(--accent2)' },\n { tag: t.invalid, color: 'var(--error)' },\n { tag: [t.standard(t.tagName)], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (): Extension => {\n const isDark = useTheme().resolvedTheme === 'dark';\n return useMemo(() => (isDark ? buildDarkTheme() : buildLightTheme()), [isDark]);\n};\n\nexport type CodeEditorProps = {\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n className,\n language = 'json',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n ...props\n },\n ref,\n ) => {\n const theme = useCodemirrorTheme();\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n\n const extensions = useMemo(() => {\n const exts: Extension[] = [];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n return exts;\n }, [language, highlightVariables, schema, editable, lineWrapping]);\n\n return (\n <div\n className={cn('rounded-md bg-surface3 p-1 font-mono relative border border-border1 overflow-hidden', className)}\n {...props}\n >\n {showCopyButton && <CopyButton content={formattedCode} className=\"absolute top-2 right-2 z-20\" />}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label=\"Code editor\"\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers }}\n />\n </div>\n );\n },\n);\n"],"names":["LanguageSupport","StreamLanguage","LanguageDescription","autocompletion","Decoration","MatchDecorator","ViewPlugin","draculaInit","t","EditorView","HighlightStyle","syntaxHighlighting","useTheme","useMemo","forwardRef","jsonLanguage","markdown","markdownLanguage","EditorState","jsxs","cn","jsx","CopyButton","CodeMirror"],"mappings":"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"}
1
+ {"version":3,"file":"CodeEditor.cjs.js","sources":["../../src/ds/components/CodeEditor/code-languages.ts","../../src/ds/components/CodeEditor/schema-to-variables.ts","../../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../../src/ds/components/CodeEditor/variable-highlight-extension.ts","../../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nfunction createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Check if }} already follows the cursor\n const afterCursor = view.state.sliceDoc(to, to + 2);\n const hasClosingBraces = afterCursor === '}}';\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useTheme } from '@/ds/components/ThemeProvider';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\n\n/** Original dark theme — draculaInit + custom overrides. Unchanged from before light mode work. */\nfunction buildDarkTheme(): Extension {\n const baseTheme = draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: 'var(--neutral2)',\n background: 'transparent',\n foreground: 'var(--neutral6)',\n caret: 'var(--neutral6)',\n },\n styles: [\n { tag: [t.className, t.propertyName], color: 'var(--neutral6)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: t.emphasis, fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: t.strong, fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.quote, fontStyle: 'italic', color: 'var(--neutral2)' },\n ],\n });\n\n const customLineNumberTheme = EditorView.theme({\n '.cm-editor': {\n backgroundColor: 'transparent',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n color: 'var(--neutral3)',\n },\n '.cm-cursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '.cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--accent3) 22%, transparent)',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n return [baseTheme, customLineNumberTheme];\n}\n\nfunction buildLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--neutral3)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'color-mix(in srgb, var(--accent3) 22%, transparent) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: [t.emphasis], fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: [t.strong], fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: [t.deleted], color: 'var(--accent2)' },\n { tag: t.invalid, color: 'var(--error)' },\n { tag: [t.standard(t.tagName)], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (): Extension => {\n const isDark = useTheme().resolvedTheme === 'dark';\n return useMemo(() => (isDark ? buildDarkTheme() : buildLightTheme()), [isDark]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'font-mono relative overflow-hidden outline-hidden focus:outline-hidden focus-within:outline-hidden',\n 'transition-colors duration-normal ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: 'rounded-md bg-surface3 border border-border1 p-1 focus-within:border-neutral6/20',\n embedded: 'rounded-none border-none bg-transparent p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst editorFocusAttributes = Prec.highest(\n EditorView.editorAttributes.of({\n style: 'outline: none',\n }),\n);\n\nconst editorFocusTheme = Prec.highest(\n EditorView.theme({\n '&': {\n outline: 'none',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n outline: 'none',\n },\n '.cm-content': {\n outline: 'none',\n },\n '.cm-content:focus': {\n outline: 'none',\n },\n }),\n);\n\nconst editorFocusExtensions: Extension[] = [editorFocusAttributes, editorFocusTheme];\n\nexport type CodeEditorProps = {\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n} & VariantProps<typeof codeEditorVariants> &\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n className,\n language = 'json',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n variant,\n ...props\n },\n ref,\n ) => {\n const theme = useCodemirrorTheme();\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n\n const extensions = useMemo(() => {\n const exts: Extension[] = [...editorFocusExtensions];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n return exts;\n }, [language, highlightVariables, schema, editable, lineWrapping]);\n\n return (\n <div className={cn(codeEditorVariants({ variant }), className)} {...props}>\n {showCopyButton && <CopyButton content={formattedCode} className=\"absolute top-2 right-2 z-20\" />}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label=\"Code editor\"\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers }}\n />\n </div>\n );\n },\n);\n"],"names":["LanguageSupport","StreamLanguage","LanguageDescription","autocompletion","Decoration","MatchDecorator","ViewPlugin","draculaInit","t","EditorView","HighlightStyle","syntaxHighlighting","useTheme","useMemo","cva","cn","Prec","forwardRef","jsonLanguage","markdown","markdownLanguage","EditorState","jsxs","jsx","CopyButton","CodeMirror"],"mappings":"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"}
@@ -2,11 +2,12 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { jsonLanguage } from '@codemirror/lang-json';
3
3
  import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
4
4
  import { LanguageDescription, LanguageSupport, StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';
5
- import { EditorState } from '@codemirror/state';
5
+ import { EditorState, Prec } from '@codemirror/state';
6
6
  import { ViewPlugin, MatchDecorator, Decoration, EditorView } from '@codemirror/view';
7
7
  import { tags } from '@lezer/highlight';
8
8
  import { draculaInit } from '@uiw/codemirror-theme-dracula';
9
9
  import ReactCodeMirror from '@uiw/react-codemirror';
10
+ import { c as cva } from '../index-CSm06eOE.js';
10
11
  import { forwardRef, useMemo } from 'react';
11
12
  import { autocompletion } from '@codemirror/autocomplete';
12
13
  import { C as CopyButton } from '../copy-button-CJjjhHKN.js';
@@ -368,6 +369,48 @@ const useCodemirrorTheme = () => {
368
369
  const isDark = useTheme().resolvedTheme === "dark";
369
370
  return useMemo(() => isDark ? buildDarkTheme() : buildLightTheme(), [isDark]);
370
371
  };
372
+ const codeEditorVariants = cva(
373
+ cn(
374
+ "font-mono relative overflow-hidden outline-hidden focus:outline-hidden focus-within:outline-hidden",
375
+ "transition-colors duration-normal ease-out-custom"
376
+ ),
377
+ {
378
+ variants: {
379
+ variant: {
380
+ default: "rounded-md bg-surface3 border border-border1 p-1 focus-within:border-neutral6/20",
381
+ embedded: "rounded-none border-none bg-transparent p-0"
382
+ }
383
+ },
384
+ defaultVariants: {
385
+ variant: "default"
386
+ }
387
+ }
388
+ );
389
+ const editorFocusAttributes = Prec.highest(
390
+ EditorView.editorAttributes.of({
391
+ style: "outline: none"
392
+ })
393
+ );
394
+ const editorFocusTheme = Prec.highest(
395
+ EditorView.theme({
396
+ "&": {
397
+ outline: "none"
398
+ },
399
+ "&.cm-focused": {
400
+ outline: "none"
401
+ },
402
+ ".cm-scroller": {
403
+ outline: "none"
404
+ },
405
+ ".cm-content": {
406
+ outline: "none"
407
+ },
408
+ ".cm-content:focus": {
409
+ outline: "none"
410
+ }
411
+ })
412
+ );
413
+ const editorFocusExtensions = [editorFocusAttributes, editorFocusTheme];
371
414
  const CodeEditor = forwardRef(
372
415
  ({
373
416
  data,
@@ -383,12 +426,13 @@ const CodeEditor = forwardRef(
383
426
  lineNumbers = true,
384
427
  lineWrapping = true,
385
428
  editable,
429
+ variant,
386
430
  ...props
387
431
  }, ref) => {
388
432
  const theme = useCodemirrorTheme();
389
433
  const formattedCode = data ? JSON.stringify(data, null, 2) : value ?? "";
390
434
  const extensions = useMemo(() => {
391
- const exts = [];
435
+ const exts = [...editorFocusExtensions];
392
436
  if (lineWrapping) {
393
437
  exts.push(EditorView.lineWrapping);
394
438
  }
@@ -408,33 +452,26 @@ const CodeEditor = forwardRef(
408
452
  }
409
453
  return exts;
410
454
  }, [language, highlightVariables, schema, editable, lineWrapping]);
411
- return /* @__PURE__ */ jsxs(
412
- "div",
413
- {
414
- className: cn("rounded-md bg-surface3 p-1 font-mono relative border border-border1 overflow-hidden", className),
415
- ...props,
416
- children: [
417
- showCopyButton && /* @__PURE__ */ jsx(CopyButton, { content: formattedCode, className: "absolute top-2 right-2 z-20" }),
418
- /* @__PURE__ */ jsx(
419
- ReactCodeMirror,
420
- {
421
- ref,
422
- value: formattedCode,
423
- theme,
424
- extensions,
425
- onChange,
426
- editable,
427
- "aria-label": "Code editor",
428
- placeholder,
429
- height: "100%",
430
- style: { height: "100%" },
431
- autoFocus,
432
- basicSetup: { lineNumbers }
433
- }
434
- )
435
- ]
436
- }
437
- );
455
+ return /* @__PURE__ */ jsxs("div", { className: cn(codeEditorVariants({ variant }), className), ...props, children: [
456
+ showCopyButton && /* @__PURE__ */ jsx(CopyButton, { content: formattedCode, className: "absolute top-2 right-2 z-20" }),
457
+ /* @__PURE__ */ jsx(
458
+ ReactCodeMirror,
459
+ {
460
+ ref,
461
+ value: formattedCode,
462
+ theme,
463
+ extensions,
464
+ onChange,
465
+ editable,
466
+ "aria-label": "Code editor",
467
+ placeholder,
468
+ height: "100%",
469
+ style: { height: "100%" },
470
+ autoFocus,
471
+ basicSetup: { lineNumbers }
472
+ }
473
+ )
474
+ ] });
438
475
  }
439
476
  );
440
477
 
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.es.js","sources":["../../src/ds/components/CodeEditor/code-languages.ts","../../src/ds/components/CodeEditor/schema-to-variables.ts","../../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../../src/ds/components/CodeEditor/variable-highlight-extension.ts","../../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nfunction createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Check if }} already follows the cursor\n const afterCursor = view.state.sliceDoc(to, to + 2);\n const hasClosingBraces = afterCursor === '}}';\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { EditorState } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useTheme } from '@/ds/components/ThemeProvider';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\n\n/** Original dark theme — draculaInit + custom overrides. Unchanged from before light mode work. */\nfunction buildDarkTheme(): Extension {\n const baseTheme = draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: 'var(--neutral2)',\n background: 'transparent',\n foreground: 'var(--neutral6)',\n caret: 'var(--neutral6)',\n },\n styles: [\n { tag: [t.className, t.propertyName], color: 'var(--neutral6)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: t.emphasis, fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: t.strong, fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.quote, fontStyle: 'italic', color: 'var(--neutral2)' },\n ],\n });\n\n const customLineNumberTheme = EditorView.theme({\n '.cm-editor': {\n backgroundColor: 'transparent',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n color: 'var(--neutral3)',\n },\n '.cm-cursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '.cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--accent3) 22%, transparent)',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n return [baseTheme, customLineNumberTheme];\n}\n\nfunction buildLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--neutral3)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'color-mix(in srgb, var(--accent3) 22%, transparent) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: [t.emphasis], fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: [t.strong], fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: [t.deleted], color: 'var(--accent2)' },\n { tag: t.invalid, color: 'var(--error)' },\n { tag: [t.standard(t.tagName)], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (): Extension => {\n const isDark = useTheme().resolvedTheme === 'dark';\n return useMemo(() => (isDark ? buildDarkTheme() : buildLightTheme()), [isDark]);\n};\n\nexport type CodeEditorProps = {\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n className,\n language = 'json',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n ...props\n },\n ref,\n ) => {\n const theme = useCodemirrorTheme();\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n\n const extensions = useMemo(() => {\n const exts: Extension[] = [];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n return exts;\n }, [language, highlightVariables, schema, editable, lineWrapping]);\n\n return (\n <div\n className={cn('rounded-md bg-surface3 p-1 font-mono relative border border-border1 overflow-hidden', className)}\n {...props}\n >\n {showCopyButton && <CopyButton content={formattedCode} className=\"absolute top-2 right-2 z-20\" />}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label=\"Code editor\"\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers }}\n />\n </div>\n );\n },\n);\n"],"names":["t","CodeMirror"],"mappings":"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"}
1
+ {"version":3,"file":"CodeEditor.es.js","sources":["../../src/ds/components/CodeEditor/code-languages.ts","../../src/ds/components/CodeEditor/schema-to-variables.ts","../../src/ds/components/CodeEditor/variable-autocomplete-extension.ts","../../src/ds/components/CodeEditor/variable-highlight-extension.ts","../../src/ds/components/CodeEditor/code-editor.tsx"],"sourcesContent":["import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';\n\nfunction legacy(parser: Parameters<typeof StreamLanguage.define>[0]) {\n return new LanguageSupport(StreamLanguage.define(parser));\n}\n\n/**\n * A minimal subset of CodeMirror language descriptions used for fenced code\n * blocks inside markdown. Mirrors the relevant entries from\n * `@codemirror/language-data` but only the languages we actually support, so\n * bundlers don't have to emit a chunk for every known language.\n */\nexport const codeLanguages = [\n LanguageDescription.of({\n name: 'JavaScript',\n alias: ['ecmascript', 'js', 'node'],\n extensions: ['js', 'mjs', 'cjs'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript());\n },\n }),\n LanguageDescription.of({\n name: 'JSON',\n alias: ['json5'],\n extensions: ['json', 'map'],\n load() {\n return import('@codemirror/lang-json').then(m => m.json());\n },\n }),\n LanguageDescription.of({\n name: 'JSX',\n extensions: ['jsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Markdown',\n extensions: ['md', 'markdown', 'mkd'],\n load() {\n return import('@codemirror/lang-markdown').then(m => m.markdown());\n },\n }),\n LanguageDescription.of({\n name: 'TSX',\n extensions: ['tsx'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ jsx: true, typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'TypeScript',\n alias: ['ts'],\n extensions: ['ts', 'mts', 'cts'],\n load() {\n return import('@codemirror/lang-javascript').then(m => m.javascript({ typescript: true }));\n },\n }),\n LanguageDescription.of({\n name: 'Shell',\n alias: ['bash', 'sh', 'zsh'],\n extensions: ['sh', 'ksh', 'bash'],\n filename: /^PKGBUILD$/,\n load() {\n return import('@codemirror/legacy-modes/mode/shell').then(m => legacy(m.shell));\n },\n }),\n];\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\n/**\n * Represents a variable completion option derived from a schema\n */\nexport interface VariableCompletion {\n /** The dot-notation path (e.g., \"user.name\") */\n path: string;\n /** Display label for the autocomplete */\n label: string;\n /** Description from the schema, if available */\n description?: string;\n /** The type of the property */\n type?: string;\n}\n\n/**\n * Flattens a JSON Schema into a list of variable completions for autocomplete.\n * Recursively extracts property paths using dot-notation.\n *\n * @param schema - The JSON Schema to flatten\n * @param maxDepth - Maximum recursion depth (default: 5)\n * @returns Array of variable completions\n *\n * @example\n * ```ts\n * const schema = {\n * type: 'object',\n * properties: {\n * user: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * email: { type: 'string' }\n * }\n * }\n * }\n * };\n *\n * flattenSchemaToVariables(schema);\n * // Returns:\n * // [\n * // { path: 'user', label: 'user', type: 'object' },\n * // { path: 'user.name', label: 'user.name', type: 'string' },\n * // { path: 'user.email', label: 'user.email', type: 'string' }\n * // ]\n * ```\n */\nexport function flattenSchemaToVariables(schema: JsonSchema | undefined, maxDepth = 5): VariableCompletion[] {\n if (!schema?.properties) {\n return [];\n }\n\n const results: VariableCompletion[] = [];\n\n function processProperty(property: JsonSchemaProperty, path: string, depth: number): void {\n if (depth > maxDepth) {\n return;\n }\n\n const type = Array.isArray(property.type) ? property.type.join(' | ') : property.type;\n\n results.push({\n path,\n label: path,\n description: property.description ?? property.title,\n type,\n });\n\n // Recurse into nested object properties\n if (property.properties) {\n for (const [key, nestedProperty] of Object.entries(property.properties)) {\n processProperty(nestedProperty, `${path}.${key}`, depth + 1);\n }\n }\n\n // Handle array items if they have properties (array of objects)\n if (property.items?.properties) {\n // Add a placeholder for array item access (e.g., items[0].name)\n for (const [key, itemProperty] of Object.entries(property.items.properties)) {\n processProperty(itemProperty, `${path}[].${key}`, depth + 1);\n }\n }\n }\n\n for (const [key, property] of Object.entries(schema.properties)) {\n processProperty(property, key, 1);\n }\n\n return results;\n}\n","import { autocompletion } from '@codemirror/autocomplete';\nimport type { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\nimport { flattenSchemaToVariables } from './schema-to-variables';\nimport type { VariableCompletion } from './schema-to-variables';\nimport type { JsonSchema } from '@/lib/json-schema';\n\n/**\n * Creates a CodeMirror autocomplete extension for {{variable}} placeholders.\n * Triggers when the user types `{{` and shows suggestions derived from the schema.\n *\n * @param schema - JSON Schema to derive variable suggestions from\n * @returns CodeMirror Extension that provides variable autocomplete\n *\n * @example\n * ```tsx\n * const schema = {\n * type: 'object',\n * properties: {\n * user: { type: 'object', properties: { name: { type: 'string' } } }\n * }\n * };\n *\n * <CodeMirror extensions={[createVariableAutocomplete(schema)]} />\n * // Typing \"{{\" will show: user, user.name\n * ```\n */\nexport function createVariableAutocomplete(schema: JsonSchema | undefined): Extension {\n const variables = flattenSchemaToVariables(schema);\n\n return autocompletion({\n override: [createVariableCompletionSource(variables)],\n defaultKeymap: true,\n closeOnBlur: true,\n icons: false,\n });\n}\n\n/**\n * Creates a completion source function for CodeMirror's autocompletion.\n */\nfunction createVariableCompletionSource(\n variables: VariableCompletion[],\n): (context: CompletionContext) => CompletionResult | null {\n return (context: CompletionContext): CompletionResult | null => {\n // Look for {{ pattern before cursor\n const beforeCursor = context.state.sliceDoc(Math.max(0, context.pos - 50), context.pos);\n const match = beforeCursor.match(/\\{\\{([a-zA-Z0-9_.\\[\\]]*)?$/);\n\n if (!match) {\n return null;\n }\n\n // The text after {{ that we're matching against\n const prefix = match[1] ?? '';\n const startPos = context.pos - prefix.length;\n\n // Filter variables based on what the user has typed\n const filteredVariables = prefix\n ? variables.filter(v => v.path.toLowerCase().startsWith(prefix.toLowerCase()))\n : variables;\n\n if (filteredVariables.length === 0) {\n return null;\n }\n\n const completions: Completion[] = filteredVariables.map(variable => ({\n label: variable.path,\n displayLabel: variable.path,\n detail: variable.type,\n info: variable.description,\n apply: (view, completion, from, to) => {\n // Check if }} already follows the cursor\n const afterCursor = view.state.sliceDoc(to, to + 2);\n const hasClosingBraces = afterCursor === '}}';\n\n const insertText = hasClosingBraces ? completion.label : `${completion.label}}}`;\n\n view.dispatch({\n changes: { from, to, insert: insertText },\n selection: { anchor: from + insertText.length },\n });\n },\n }));\n\n return {\n from: startPos,\n options: completions,\n validFor: /^[a-zA-Z0-9_.\\[\\]]*$/,\n };\n };\n}\n","import type { DecorationSet, EditorView, ViewUpdate } from '@codemirror/view';\nimport { Decoration, MatchDecorator, ViewPlugin } from '@codemirror/view';\n\n/**\n * Regex pattern to match variable placeholders like {{variableName}} or {{user.name}}\n * Matches: {{ followed by a valid identifier path (with optional dot notation), then }}\n */\nexport const VARIABLE_PATTERN = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}\\}/g;\n\nconst variableDecoration = Decoration.mark({\n class: 'cm-variable-highlight',\n});\n\nconst variableMatcher = new MatchDecorator({\n regexp: VARIABLE_PATTERN,\n decoration: () => variableDecoration,\n});\n\nconst variableHighlightPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = variableMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = variableMatcher.updateDeco(update, this.decorations);\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\n/**\n * CodeMirror extension that highlights {{variableName}} patterns\n * with orange color and semibold weight\n */\nexport const variableHighlight = variableHighlightPlugin;\n","import { jsonLanguage } from '@codemirror/lang-json';\nimport { markdown, markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { EditorState, Prec } from '@codemirror/state';\nimport type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\nimport CodeMirror from '@uiw/react-codemirror';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport { forwardRef, useMemo } from 'react';\nimport type { HTMLAttributes } from 'react';\nimport { codeLanguages } from './code-languages';\nimport { createVariableAutocomplete } from './variable-autocomplete-extension';\nimport { variableHighlight } from './variable-highlight-extension';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { useTheme } from '@/ds/components/ThemeProvider';\nimport type { JsonSchema } from '@/lib/json-schema';\nimport { cn } from '@/lib/utils';\n\nexport type CodeEditorLanguage = 'json' | 'markdown';\n\n/** Original dark theme — draculaInit + custom overrides. Unchanged from before light mode work. */\nfunction buildDarkTheme(): Extension {\n const baseTheme = draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: 'var(--neutral2)',\n background: 'transparent',\n foreground: 'var(--neutral6)',\n caret: 'var(--neutral6)',\n },\n styles: [\n { tag: [t.className, t.propertyName], color: 'var(--neutral6)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: t.emphasis, fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: t.strong, fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.quote, fontStyle: 'italic', color: 'var(--neutral2)' },\n ],\n });\n\n const customLineNumberTheme = EditorView.theme({\n '.cm-editor': {\n backgroundColor: 'transparent',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n color: 'var(--neutral3)',\n },\n '.cm-cursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '.cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--accent3) 22%, transparent)',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n return [baseTheme, customLineNumberTheme];\n}\n\nfunction buildLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n color: 'var(--neutral2)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n color: 'var(--neutral3)',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection':\n {\n background: 'color-mix(in srgb, var(--accent3) 22%, transparent) !important',\n },\n '.cm-tooltip-autocomplete': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n borderRadius: '6px',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.2)',\n },\n '.cm-tooltip-autocomplete > ul': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-completionLabel': {\n color: 'var(--neutral6)',\n },\n '.cm-completionDetail': {\n color: 'var(--neutral3)',\n fontSize: '0.7rem',\n marginLeft: 'auto',\n paddingLeft: '12px',\n },\n '.cm-completionInfo': {\n backgroundColor: 'var(--surface2)',\n border: '1px solid var(--border1)',\n color: 'var(--neutral3)',\n padding: '8px 12px',\n },\n '.cm-completionIcon': {\n display: 'none',\n },\n 'ul.cm-completionList li[aria-selected]': {\n backgroundColor: 'var(--surface4)',\n color: 'var(--neutral6)',\n },\n '.cm-line .cm-variable-highlight': {\n color: 'var(--accent6) !important',\n fontWeight: '500',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n { tag: t.heading, color: 'var(--accent3)', fontWeight: 'bold' },\n {\n tag: [t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: 'var(--accent3)',\n fontWeight: 'bold',\n },\n { tag: [t.emphasis], fontStyle: 'italic', color: 'var(--neutral6)' },\n { tag: [t.strong], fontWeight: 'bold', color: 'var(--neutral6)' },\n { tag: t.link, color: 'var(--accent3)', textDecoration: 'underline' },\n { tag: t.url, color: 'var(--accent3)' },\n { tag: t.monospace, color: 'var(--neutral6)' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: [t.deleted], color: 'var(--accent2)' },\n { tag: t.invalid, color: 'var(--error)' },\n { tag: [t.standard(t.tagName)], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- shared hook intentionally co-located with the editor it themes\nexport const useCodemirrorTheme = (): Extension => {\n const isDark = useTheme().resolvedTheme === 'dark';\n return useMemo(() => (isDark ? buildDarkTheme() : buildLightTheme()), [isDark]);\n};\n\nconst codeEditorVariants = cva(\n cn(\n 'font-mono relative overflow-hidden outline-hidden focus:outline-hidden focus-within:outline-hidden',\n 'transition-colors duration-normal ease-out-custom',\n ),\n {\n variants: {\n variant: {\n default: 'rounded-md bg-surface3 border border-border1 p-1 focus-within:border-neutral6/20',\n embedded: 'rounded-none border-none bg-transparent p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nconst editorFocusAttributes = Prec.highest(\n EditorView.editorAttributes.of({\n style: 'outline: none',\n }),\n);\n\nconst editorFocusTheme = Prec.highest(\n EditorView.theme({\n '&': {\n outline: 'none',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n outline: 'none',\n },\n '.cm-content': {\n outline: 'none',\n },\n '.cm-content:focus': {\n outline: 'none',\n },\n }),\n);\n\nconst editorFocusExtensions: Extension[] = [editorFocusAttributes, editorFocusTheme];\n\nexport type CodeEditorProps = {\n data?: Record<string, unknown> | Array<Record<string, unknown>>;\n value?: string;\n onChange?: (value: string) => void;\n showCopyButton?: boolean;\n className?: string;\n highlightVariables?: boolean;\n language?: CodeEditorLanguage;\n placeholder?: string;\n /** JSON Schema to enable variable autocomplete for {{variable}} placeholders (markdown only) */\n schema?: JsonSchema;\n autoFocus?: boolean;\n /** Show line numbers in the gutter (default: true) */\n lineNumbers?: boolean;\n /** Wrap long lines within the editor viewport (default: true) */\n lineWrapping?: boolean;\n /** When false, makes the editor read-only */\n editable?: boolean;\n} & VariantProps<typeof codeEditorVariants> &\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;\n\nexport const CodeEditor = forwardRef<ReactCodeMirrorRef, CodeEditorProps>(\n (\n {\n data,\n value,\n onChange,\n showCopyButton = true,\n className,\n language = 'json',\n highlightVariables = false,\n placeholder,\n schema,\n autoFocus,\n lineNumbers = true,\n lineWrapping = true,\n editable,\n variant,\n ...props\n },\n ref,\n ) => {\n const theme = useCodemirrorTheme();\n const formattedCode = data ? JSON.stringify(data, null, 2) : (value ?? '');\n\n const extensions = useMemo(() => {\n const exts: Extension[] = [...editorFocusExtensions];\n\n if (lineWrapping) {\n exts.push(EditorView.lineWrapping);\n }\n\n if (language === 'json') {\n exts.push(jsonLanguage);\n } else if (language === 'markdown') {\n exts.push(markdown({ base: markdownLanguage, codeLanguages }));\n }\n\n if (highlightVariables && language === 'markdown') {\n exts.push(variableHighlight);\n }\n\n if (schema && language === 'markdown') {\n exts.push(createVariableAutocomplete(schema));\n }\n\n if (editable === false) {\n exts.push(EditorState.readOnly.of(true));\n }\n\n return exts;\n }, [language, highlightVariables, schema, editable, lineWrapping]);\n\n return (\n <div className={cn(codeEditorVariants({ variant }), className)} {...props}>\n {showCopyButton && <CopyButton content={formattedCode} className=\"absolute top-2 right-2 z-20\" />}\n <CodeMirror\n ref={ref}\n value={formattedCode}\n theme={theme}\n extensions={extensions}\n onChange={onChange}\n editable={editable}\n aria-label=\"Code editor\"\n placeholder={placeholder}\n height=\"100%\"\n style={{ height: '100%' }}\n autoFocus={autoFocus}\n basicSetup={{ lineNumbers }}\n />\n </div>\n );\n },\n);\n"],"names":["t","CodeMirror"],"mappings":"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"}
@@ -1,9 +1,13 @@
1
1
  import { Extension } from '@codemirror/state';
2
2
  import { ReactCodeMirrorRef } from '@uiw/react-codemirror';
3
+ import { VariantProps } from 'class-variance-authority';
3
4
  import { HTMLAttributes } from 'react';
4
5
  import { JsonSchema } from '../../../lib/json-schema';
5
6
  export type CodeEditorLanguage = 'json' | 'markdown';
6
7
  export declare const useCodemirrorTheme: () => Extension;
8
+ declare const codeEditorVariants: (props?: ({
9
+ variant?: "default" | "embedded" | null | undefined;
10
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
11
  export type CodeEditorProps = {
8
12
  data?: Record<string, unknown> | Array<Record<string, unknown>>;
9
13
  value?: string;
@@ -22,7 +26,7 @@ export type CodeEditorProps = {
22
26
  lineWrapping?: boolean;
23
27
  /** When false, makes the editor read-only */
24
28
  editable?: boolean;
25
- } & Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;
29
+ } & VariantProps<typeof codeEditorVariants> & Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>;
26
30
  export declare const CodeEditor: import('react').ForwardRefExoticComponent<{
27
31
  data?: Record<string, unknown> | Array<Record<string, unknown>>;
28
32
  value?: string;
@@ -41,4 +45,7 @@ export declare const CodeEditor: import('react').ForwardRefExoticComponent<{
41
45
  lineWrapping?: boolean;
42
46
  /** When false, makes the editor read-only */
43
47
  editable?: boolean;
44
- } & Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & import('react').RefAttributes<ReactCodeMirrorRef>>;
48
+ } & VariantProps<(props?: ({
49
+ variant?: "default" | "embedded" | null | undefined;
50
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string> & Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & import('react').RefAttributes<ReactCodeMirrorRef>>;
51
+ export {};
@@ -7,6 +7,9 @@ export declare const Default: Story;
7
7
  export declare const WithValue: Story;
8
8
  export declare const ComplexData: Story;
9
9
  export declare const ArrayData: Story;
10
+ export declare const FocusedDefault: Story;
11
+ export declare const FocusedEmbedded: Story;
12
+ export declare const FocusedEmbeddedInBlock: Story;
10
13
  export declare const WithoutCopyButton: Story;
11
14
  export declare const LargeContent: Story;
12
15
  export declare const WithoutLineWrapping: Story;
package/dist/style.css CHANGED
@@ -1671,6 +1671,10 @@
1671
1671
  min-height: var(--spacing-14);
1672
1672
  }
1673
1673
 
1674
+ .min-h-24 {
1675
+ min-height: var(--spacing-24);
1676
+ }
1677
+
1674
1678
  .min-h-32 {
1675
1679
  min-height: var(--spacing-32);
1676
1680
  }
@@ -6121,6 +6125,16 @@
6121
6125
  }
6122
6126
  }
6123
6127
 
6128
+ .focus-within\:border-neutral6\/20:focus-within {
6129
+ border-color: var(--color-neutral6);
6130
+ }
6131
+
6132
+ @supports (color: color-mix(in lab, red, red)) {
6133
+ .focus-within\:border-neutral6\/20:focus-within {
6134
+ border-color: color-mix(in oklab, var(--color-neutral6) 20%, transparent);
6135
+ }
6136
+ }
6137
+
6124
6138
  .focus-within\:bg-surface-overlay-strong:focus-within {
6125
6139
  background-color: var(--color-surface-overlay-strong);
6126
6140
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "40.0.1-alpha.1",
4
+ "version": "40.0.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.31.1-alpha.1",
154
- "@mastra/react": "1.2.4-alpha.1"
153
+ "@mastra/client-js": "^1.31.1",
154
+ "@mastra/react": "1.2.4"
155
155
  },
156
156
  "devDependencies": {
157
157
  "@storybook/addon-a11y": "^10.4.1",
@@ -168,7 +168,7 @@
168
168
  "@types/react": "^19.2.14",
169
169
  "@types/react-dom": "^19.2.3",
170
170
  "@vitejs/plugin-react": "^5.2.0",
171
- "@vitest/ui": "4.1.8",
171
+ "@vitest/ui": "4.1.9",
172
172
  "class-variance-authority": "^0.7.1",
173
173
  "clsx": "^2.1.1",
174
174
  "eslint-plugin-react-hooks": "^7.1.1",
@@ -187,12 +187,12 @@
187
187
  "vite": "^7.3.1",
188
188
  "vite-plugin-dts": "^4.5.4",
189
189
  "vite-plugin-lib-inject-css": "^2.2.2",
190
- "vitest": "4.1.8",
191
- "@internal/lint": "0.0.112",
192
- "@mastra/client-js": "^1.31.1-alpha.1",
193
- "@mastra/memory": "1.22.1",
194
- "@mastra/core": "1.50.1-alpha.1",
195
- "@mastra/react": "1.2.4-alpha.1"
190
+ "vitest": "4.1.9",
191
+ "@mastra/memory": "1.22.2",
192
+ "@internal/lint": "0.0.113",
193
+ "@mastra/react": "1.2.4",
194
+ "@mastra/client-js": "^1.31.1",
195
+ "@mastra/core": "1.50.1"
196
196
  },
197
197
  "homepage": "https://mastra.ai",
198
198
  "repository": {