@scalar/use-codemirror 0.14.8 → 0.14.10

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.
@@ -1,58 +1,62 @@
1
- import { watch } from "vue";
2
- function useDropdown(params) {
3
- const { codeMirror, query, showDropdown, dropdownPosition } = params;
4
- function getCursorPos() {
5
- return codeMirror.value?.state.selection.main.head || 0;
6
- }
7
- function getCoordsAtPos(pos) {
8
- return codeMirror.value?.coordsAtPos(pos);
9
- }
10
- function updateDropdownPosition() {
11
- const cursorPos = getCursorPos();
12
- requestAnimationFrame(() => {
13
- const coords = getCoordsAtPos(cursorPos - query.value.length - 2);
14
- if (coords) {
15
- dropdownPosition.value = {
16
- left: coords.left,
17
- top: Math.max(coords.bottom)
18
- };
19
- }
20
- });
21
- }
22
- watch(query, updateDropdownPosition);
23
- function handleDropdownSelect(item) {
24
- const formattedItem = `{{${item}}}`;
25
- const cursor = getCursorPos();
26
- const from = Math.max(0, cursor - query.value.length - 2);
27
- const to = cursor;
28
- codeMirror.value?.dispatch({
29
- changes: { from, to, insert: formattedItem }
30
- });
31
- showDropdown.value = false;
32
- }
33
- function updateDropdownVisibility() {
34
- const cursor = getCursorPos();
35
- const text = codeMirror.value?.state.doc.sliceString(0, cursor) || "";
36
- const lastOpenBraceIndex = text.lastIndexOf("{{");
37
- const lastCloseBraceIndex = text.lastIndexOf("}}");
38
- if (lastOpenBraceIndex > lastCloseBraceIndex) {
39
- query.value = text.slice(lastOpenBraceIndex + 2);
40
- showDropdown.value = true;
41
- dropdownPosition.value = getCoordsAtPos(cursor) || { left: 0, top: 0 };
42
- if (query.value === "") {
43
- updateDropdownPosition();
44
- }
45
- } else {
46
- showDropdown.value = false;
1
+ import { watch } from 'vue';
2
+ /** Custom hook to manage a dropdown in a CodeMirror editor */
3
+ export function useDropdown(params) {
4
+ const { codeMirror, query, showDropdown, dropdownPosition } = params;
5
+ function getCursorPos() {
6
+ return codeMirror.value?.state.selection.main.head || 0;
47
7
  }
48
- }
49
- watch(() => codeMirror.value?.state.doc.toString(), updateDropdownVisibility);
50
- return {
51
- handleDropdownSelect,
52
- updateDropdownVisibility
53
- };
8
+ function getCoordsAtPos(pos) {
9
+ return codeMirror.value?.coordsAtPos(pos);
10
+ }
11
+ /** Updates position of the dropdown based on the current cursor position */
12
+ function updateDropdownPosition() {
13
+ const cursorPos = getCursorPos();
14
+ requestAnimationFrame(() => {
15
+ const coords = getCoordsAtPos(cursorPos - query.value.length - 2);
16
+ if (coords) {
17
+ dropdownPosition.value = {
18
+ left: coords.left,
19
+ top: Math.max(coords.bottom),
20
+ };
21
+ }
22
+ });
23
+ }
24
+ // Watch for changes in the query and update the dropdown position
25
+ watch(query, updateDropdownPosition);
26
+ /** Inserts selected item at the current cursor position */
27
+ function handleDropdownSelect(item) {
28
+ const formattedItem = `{{${item}}}`;
29
+ const cursor = getCursorPos();
30
+ const from = Math.max(0, cursor - query.value.length - 2);
31
+ const to = cursor;
32
+ codeMirror.value?.dispatch({
33
+ changes: { from, to, insert: formattedItem },
34
+ });
35
+ showDropdown.value = false;
36
+ }
37
+ /** Updates dropdown visibility based on current cursor position */
38
+ function updateDropdownVisibility() {
39
+ const cursor = getCursorPos();
40
+ const text = codeMirror.value?.state.doc.sliceString(0, cursor) || '';
41
+ const lastOpenBraceIndex = text.lastIndexOf('{{');
42
+ const lastCloseBraceIndex = text.lastIndexOf('}}');
43
+ if (lastOpenBraceIndex > lastCloseBraceIndex) {
44
+ query.value = text.slice(lastOpenBraceIndex + 2);
45
+ showDropdown.value = true;
46
+ dropdownPosition.value = getCoordsAtPos(cursor) || { left: 0, top: 0 };
47
+ // Ensures dropdown position even if the query is empty
48
+ if (query.value === '') {
49
+ updateDropdownPosition();
50
+ }
51
+ }
52
+ else {
53
+ showDropdown.value = false;
54
+ }
55
+ }
56
+ // Watch for changes in the content and update the dropdown visibility
57
+ watch(() => codeMirror.value?.state.doc.toString(), updateDropdownVisibility);
58
+ return {
59
+ handleDropdownSelect,
60
+ updateDropdownVisibility,
61
+ };
54
62
  }
55
- export {
56
- useDropdown
57
- };
58
- //# sourceMappingURL=useDropdown.js.map
@@ -1,33 +1,21 @@
1
- import {
2
- Decoration,
3
- EditorView,
4
- MatchDecorator,
5
- ViewPlugin
6
- } from "@codemirror/view";
1
+ import { Decoration, EditorView, MatchDecorator, ViewPlugin, } from '@codemirror/view';
7
2
  const variableHighlighterDecoration = new MatchDecorator({
8
- regexp: /(\{[^}]+\})/g,
9
- decoration: () => Decoration.mark({
10
- attributes: {
11
- class: "api-client-url-variable"
12
- }
13
- })
3
+ regexp: /(\{[^}]+\})/g,
4
+ decoration: () => Decoration.mark({
5
+ attributes: {
6
+ class: 'api-client-url-variable',
7
+ },
8
+ }),
14
9
  });
15
- const variables = () => ViewPlugin.fromClass(
16
- class {
10
+ export const variables = () => ViewPlugin.fromClass(class {
17
11
  variables;
18
12
  constructor(view) {
19
- this.variables = variableHighlighterDecoration.createDeco(view);
13
+ this.variables = variableHighlighterDecoration.createDeco(view);
20
14
  }
21
15
  update(update) {
22
- this.variables = variableHighlighterDecoration.updateDeco(update, this.variables);
16
+ this.variables = variableHighlighterDecoration.updateDeco(update, this.variables);
23
17
  }
24
- },
25
- {
18
+ }, {
26
19
  decorations: (instance) => instance.variables,
27
- provide: (plugin) => EditorView.atomicRanges.of((view) => view.plugin(plugin)?.variables || Decoration.none)
28
- }
29
- );
30
- export {
31
- variables
32
- };
33
- //# sourceMappingURL=variables.js.map
20
+ provide: (plugin) => EditorView.atomicRanges.of((view) => view.plugin(plugin)?.variables || Decoration.none),
21
+ });
package/dist/index.js CHANGED
@@ -1,29 +1,5 @@
1
- import {
2
- EditorState,
3
- RangeSetBuilder,
4
- StateEffect
5
- } from "@codemirror/state";
6
- import {
7
- Decoration,
8
- EditorView,
9
- ViewPlugin,
10
- WidgetType
11
- } from "@codemirror/view";
12
- import { colorPicker } from "@replit/codemirror-css-color-picker";
13
- import {
14
- useCodeMirror
15
- } from "./hooks/useCodeMirror.js";
16
- import { useDropdown } from "./hooks/useDropdown.js";
17
- export {
18
- Decoration,
19
- EditorState,
20
- EditorView,
21
- RangeSetBuilder,
22
- StateEffect,
23
- ViewPlugin,
24
- WidgetType,
25
- colorPicker,
26
- useCodeMirror,
27
- useDropdown
28
- };
29
- //# sourceMappingURL=index.js.map
1
+ export { EditorState, RangeSetBuilder, StateEffect, } from '@codemirror/state';
2
+ export { Decoration, EditorView, ViewPlugin, WidgetType, } from '@codemirror/view';
3
+ export { colorPicker } from '@replit/codemirror-css-color-picker';
4
+ export { useCodeMirror, } from './hooks/useCodeMirror.js';
5
+ export { useDropdown } from './hooks/useDropdown.js';
@@ -1,76 +1,82 @@
1
- import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
2
- import { EditorView } from "@codemirror/view";
3
- const createCodeMirrorTheme = ({ theme, settings = {}, styles = [] }) => {
4
- const themeOptions = {
5
- ".cm-gutters": {}
6
- };
7
- const baseStyle = {};
8
- if (settings.background) {
9
- baseStyle.backgroundColor = settings.background;
10
- }
11
- if (settings.backgroundImage) {
12
- baseStyle.backgroundImage = settings.backgroundImage;
13
- }
14
- if (settings.foreground) {
15
- baseStyle.color = settings.foreground;
16
- }
17
- if (settings.fontSize) {
18
- baseStyle.fontSize = settings.fontSize;
19
- }
20
- if (settings.background || settings.foreground) {
21
- themeOptions["&"] = baseStyle;
22
- }
23
- if (settings.fontFamily) {
24
- themeOptions["&.cm-editor .cm-scroller"] = {
25
- fontFamily: settings.fontFamily
1
+ /**
2
+ * This file is copied from @uiw/codemirror-themes.
3
+ * We've had issues with the import (something to do with CJS/ESM).
4
+ *
5
+ * @see https://github.com/uiwjs/react-codemirror
6
+ * @see https://github.com/scalar/scalar/issues/4222
7
+ */
8
+ import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
9
+ import { EditorView } from '@codemirror/view';
10
+ /**
11
+ * Creates a CodeMirror theme from a set of options.
12
+ */
13
+ export const createCodeMirrorTheme = ({ theme, settings = {}, styles = [] }) => {
14
+ const themeOptions = {
15
+ '.cm-gutters': {},
26
16
  };
27
- }
28
- if (settings.gutterBackground && themeOptions[".cm-gutters"]) {
29
- themeOptions[".cm-gutters"].backgroundColor = settings.gutterBackground;
30
- }
31
- if (settings.gutterForeground && themeOptions[".cm-gutters"]) {
32
- themeOptions[".cm-gutters"].color = settings.gutterForeground;
33
- }
34
- if (settings.gutterBorder && themeOptions[".cm-gutters"]) {
35
- themeOptions[".cm-gutters"].borderRightColor = settings.gutterBorder;
36
- }
37
- if (settings.caret) {
38
- themeOptions[".cm-content"] = {
39
- caretColor: settings.caret
40
- };
41
- themeOptions[".cm-cursor, .cm-dropCursor"] = {
42
- borderLeftColor: settings.caret
43
- };
44
- }
45
- const activeLineGutterStyle = {};
46
- if (settings.gutterActiveForeground) {
47
- activeLineGutterStyle.color = settings.gutterActiveForeground;
48
- }
49
- if (settings.lineHighlight) {
50
- themeOptions[".cm-activeLine"] = {
51
- backgroundColor: settings.lineHighlight
52
- };
53
- activeLineGutterStyle.backgroundColor = settings.lineHighlight;
54
- }
55
- themeOptions[".cm-activeLineGutter"] = activeLineGutterStyle;
56
- if (settings.selection) {
57
- themeOptions["&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection"] = {
58
- background: settings.selection + " !important"
59
- };
60
- }
61
- if (settings.selectionMatch) {
62
- themeOptions["& .cm-selectionMatch"] = {
63
- backgroundColor: settings.selectionMatch
64
- };
65
- }
66
- const themeExtension = EditorView.theme(themeOptions, {
67
- dark: theme === "dark"
68
- });
69
- const highlightStyle = HighlightStyle.define(styles);
70
- const extension = [themeExtension, syntaxHighlighting(highlightStyle)];
71
- return extension;
72
- };
73
- export {
74
- createCodeMirrorTheme
17
+ const baseStyle = {};
18
+ if (settings.background) {
19
+ baseStyle.backgroundColor = settings.background;
20
+ }
21
+ if (settings.backgroundImage) {
22
+ baseStyle.backgroundImage = settings.backgroundImage;
23
+ }
24
+ if (settings.foreground) {
25
+ baseStyle.color = settings.foreground;
26
+ }
27
+ if (settings.fontSize) {
28
+ baseStyle.fontSize = settings.fontSize;
29
+ }
30
+ if (settings.background || settings.foreground) {
31
+ themeOptions['&'] = baseStyle;
32
+ }
33
+ if (settings.fontFamily) {
34
+ themeOptions['&.cm-editor .cm-scroller'] = {
35
+ fontFamily: settings.fontFamily,
36
+ };
37
+ }
38
+ if (settings.gutterBackground && themeOptions['.cm-gutters']) {
39
+ themeOptions['.cm-gutters'].backgroundColor = settings.gutterBackground;
40
+ }
41
+ if (settings.gutterForeground && themeOptions['.cm-gutters']) {
42
+ themeOptions['.cm-gutters'].color = settings.gutterForeground;
43
+ }
44
+ if (settings.gutterBorder && themeOptions['.cm-gutters']) {
45
+ themeOptions['.cm-gutters'].borderRightColor = settings.gutterBorder;
46
+ }
47
+ if (settings.caret) {
48
+ themeOptions['.cm-content'] = {
49
+ caretColor: settings.caret,
50
+ };
51
+ themeOptions['.cm-cursor, .cm-dropCursor'] = {
52
+ borderLeftColor: settings.caret,
53
+ };
54
+ }
55
+ const activeLineGutterStyle = {};
56
+ if (settings.gutterActiveForeground) {
57
+ activeLineGutterStyle.color = settings.gutterActiveForeground;
58
+ }
59
+ if (settings.lineHighlight) {
60
+ themeOptions['.cm-activeLine'] = {
61
+ backgroundColor: settings.lineHighlight,
62
+ };
63
+ activeLineGutterStyle.backgroundColor = settings.lineHighlight;
64
+ }
65
+ themeOptions['.cm-activeLineGutter'] = activeLineGutterStyle;
66
+ if (settings.selection) {
67
+ themeOptions['&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection'] = {
68
+ background: settings.selection + ' !important',
69
+ };
70
+ }
71
+ if (settings.selectionMatch) {
72
+ themeOptions['& .cm-selectionMatch'] = {
73
+ backgroundColor: settings.selectionMatch,
74
+ };
75
+ }
76
+ const themeExtension = EditorView.theme(themeOptions, {
77
+ dark: theme === 'dark',
78
+ });
79
+ const highlightStyle = HighlightStyle.define(styles);
80
+ const extension = [themeExtension, syntaxHighlighting(highlightStyle)];
81
+ return extension;
75
82
  };
76
- //# sourceMappingURL=createCodeMirrorTheme.js.map
@@ -1,92 +1,88 @@
1
- import { tags as t } from "@lezer/highlight";
2
- import { createCodeMirrorTheme } from "./createCodeMirrorTheme.js";
3
- const customTheme = createCodeMirrorTheme({
4
- theme: "light",
5
- settings: {
6
- background: "var(--scalar-background-2)",
7
- foreground: "var(--scalar-color-1)",
8
- caret: "var(--scalar-color-1)",
9
- // Selection likely needs a hardcoded color due to it not accepting variables
10
- selectionMatch: "#e3dcce",
11
- gutterBackground: "var(--scalar-background-2)",
12
- gutterForeground: "var(--scalar-color-3)",
13
- gutterBorder: "transparent",
14
- lineHighlight: "var(--scalar-background-3)",
15
- fontFamily: "var(--scalar-font-code)"
16
- },
17
- styles: [
18
- {
19
- tag: [t.standard(t.tagName), t.tagName],
20
- color: "var(--scalar-color-purple)"
1
+ import { tags as t } from '@lezer/highlight';
2
+ import { createCodeMirrorTheme } from './createCodeMirrorTheme.js';
3
+ export const customTheme = createCodeMirrorTheme({
4
+ theme: 'light',
5
+ settings: {
6
+ background: 'var(--scalar-background-2)',
7
+ foreground: 'var(--scalar-color-1)',
8
+ caret: 'var(--scalar-color-1)',
9
+ // Selection likely needs a hardcoded color due to it not accepting variables
10
+ selectionMatch: '#e3dcce',
11
+ gutterBackground: 'var(--scalar-background-2)',
12
+ gutterForeground: 'var(--scalar-color-3)',
13
+ gutterBorder: 'transparent',
14
+ lineHighlight: 'var(--scalar-background-3)',
15
+ fontFamily: 'var(--scalar-font-code)',
21
16
  },
22
- {
23
- tag: [t.comment],
24
- color: "var(--scalar-color-3)"
25
- },
26
- {
27
- tag: [t.className],
28
- color: "var(--scalar-color-orange)"
29
- },
30
- {
31
- tag: [t.variableName, t.propertyName, t.attributeName],
32
- color: "var(--scalar-color-1)"
33
- },
34
- {
35
- tag: [t.operator],
36
- color: "var(--scalar-color-2)"
37
- },
38
- {
39
- tag: [t.keyword, t.typeName, t.typeOperator],
40
- color: "var(--scalar-color-green)"
41
- },
42
- {
43
- tag: [t.string],
44
- color: "var(--scalar-color-blue)"
45
- },
46
- {
47
- tag: [t.bracket, t.regexp, t.meta],
48
- color: "var(--scalar-color-3)"
49
- },
50
- {
51
- tag: [t.number],
52
- color: "var(--scalar-color-orange)"
53
- },
54
- {
55
- tag: [t.name, t.quote],
56
- color: "var(--scalar-color-3)"
57
- },
58
- {
59
- tag: [t.heading],
60
- color: "var(--scalar-color-3)",
61
- fontWeight: "bold"
62
- },
63
- {
64
- tag: [t.emphasis],
65
- color: "var(--scalar-color-3)",
66
- fontStyle: "italic"
67
- },
68
- {
69
- tag: [t.deleted],
70
- color: "var(--scalar-color-3)",
71
- backgroundColor: "transparent"
72
- },
73
- {
74
- tag: [t.atom, t.bool, t.special(t.variableName)],
75
- color: "var(--scalar-color-3)"
76
- },
77
- {
78
- tag: [t.url, t.escape, t.regexp, t.link],
79
- color: "var(--scalar-color-1)"
80
- },
81
- { tag: t.link, textDecoration: "underline" },
82
- { tag: t.strikethrough, textDecoration: "line-through" },
83
- {
84
- tag: t.invalid,
85
- color: "var(--scalar-color-3)"
86
- }
87
- ]
17
+ styles: [
18
+ {
19
+ tag: [t.standard(t.tagName), t.tagName],
20
+ color: 'var(--scalar-color-purple)',
21
+ },
22
+ {
23
+ tag: [t.comment],
24
+ color: 'var(--scalar-color-3)',
25
+ },
26
+ {
27
+ tag: [t.className],
28
+ color: 'var(--scalar-color-orange)',
29
+ },
30
+ {
31
+ tag: [t.variableName, t.propertyName, t.attributeName],
32
+ color: 'var(--scalar-color-1)',
33
+ },
34
+ {
35
+ tag: [t.operator],
36
+ color: 'var(--scalar-color-2)',
37
+ },
38
+ {
39
+ tag: [t.keyword, t.typeName, t.typeOperator],
40
+ color: 'var(--scalar-color-green)',
41
+ },
42
+ {
43
+ tag: [t.string],
44
+ color: 'var(--scalar-color-blue)',
45
+ },
46
+ {
47
+ tag: [t.bracket, t.regexp, t.meta],
48
+ color: 'var(--scalar-color-3)',
49
+ },
50
+ {
51
+ tag: [t.number],
52
+ color: 'var(--scalar-color-orange)',
53
+ },
54
+ {
55
+ tag: [t.name, t.quote],
56
+ color: 'var(--scalar-color-3)',
57
+ },
58
+ {
59
+ tag: [t.heading],
60
+ color: 'var(--scalar-color-3)',
61
+ fontWeight: 'bold',
62
+ },
63
+ {
64
+ tag: [t.emphasis],
65
+ color: 'var(--scalar-color-3)',
66
+ fontStyle: 'italic',
67
+ },
68
+ {
69
+ tag: [t.deleted],
70
+ color: 'var(--scalar-color-3)',
71
+ backgroundColor: 'transparent',
72
+ },
73
+ {
74
+ tag: [t.atom, t.bool, t.special(t.variableName)],
75
+ color: 'var(--scalar-color-3)',
76
+ },
77
+ {
78
+ tag: [t.url, t.escape, t.regexp, t.link],
79
+ color: 'var(--scalar-color-1)',
80
+ },
81
+ { tag: t.link, textDecoration: 'underline' },
82
+ { tag: t.strikethrough, textDecoration: 'line-through' },
83
+ {
84
+ tag: t.invalid,
85
+ color: 'var(--scalar-color-3)',
86
+ },
87
+ ],
88
88
  });
89
- export {
90
- customTheme
91
- };
92
- //# sourceMappingURL=index.js.map
package/dist/types.js CHANGED
@@ -1 +1 @@
1
- //# sourceMappingURL=types.js.map
1
+ export {};
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "vue",
17
17
  "vue3"
18
18
  ],
19
- "version": "0.14.8",
19
+ "version": "0.14.10",
20
20
  "engines": {
21
21
  "node": ">=22"
22
22
  },
@@ -54,24 +54,20 @@
54
54
  "@lezer/common": "^1.2.3",
55
55
  "@lezer/highlight": "^1.2.1",
56
56
  "@replit/codemirror-css-color-picker": "^6.3.0",
57
- "vue": "^3.5.26",
58
- "@scalar/components": "0.20.8"
57
+ "vue": "^3.5.26"
59
58
  },
60
59
  "devDependencies": {
61
60
  "@vitejs/plugin-vue": "^6.0.3",
62
- "vite": "^7.3.1",
63
- "vitest": "4.0.16",
61
+ "vite": "8.0.0",
62
+ "vitest": "4.1.0",
64
63
  "vue": "^3.5.26",
65
- "@scalar/themes": "0.15.0",
66
- "@scalar/build-tooling": "0.5.0"
64
+ "vue-tsc": "^3.2.4",
65
+ "@scalar/themes": "0.15.1"
67
66
  },
68
67
  "scripts": {
69
- "build": "scalar-build-esbuild",
68
+ "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
70
69
  "dev": "vite .",
71
- "lint:check": "scalar-lint-check",
72
- "lint:fix": "scalar-lint-fix",
73
70
  "test": "vitest",
74
- "types:build": "scalar-types-build",
75
- "types:check": "scalar-types-check-vue"
71
+ "types:check": "vue-tsc --noEmit"
76
72
  }
77
73
  }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/hooks/useCodeMirror.ts"],
4
- "sourcesContent": ["import { autocompletion, closeBrackets, closeBracketsKeymap, completionKeymap } from '@codemirror/autocomplete'\nimport { history, historyKeymap, indentWithTab, insertNewline } from '@codemirror/commands'\nimport { css } from '@codemirror/lang-css'\nimport { html } from '@codemirror/lang-html'\nimport { json } from '@codemirror/lang-json'\nimport { xml } from '@codemirror/lang-xml'\nimport { yaml } from '@codemirror/lang-yaml'\nimport {\n type LanguageSupport,\n type StreamLanguage,\n bracketMatching,\n defaultHighlightStyle,\n foldGutter,\n indentOnInput,\n syntaxHighlighting,\n} from '@codemirror/language'\nimport { type Diagnostic, linter } from '@codemirror/lint'\nimport { type Extension, StateEffect } from '@codemirror/state'\nimport {\n EditorView,\n type KeyBinding,\n highlightSpecialChars,\n keymap,\n lineNumbers as lineNumbersExtension,\n placeholder as placeholderExtension,\n} from '@codemirror/view'\nimport { ScalarIcon } from '@scalar/components'\nimport { type MaybeRefOrGetter, type Ref, computed, h, onBeforeUnmount, ref, render, toValue, watch } from 'vue'\n\nimport { customTheme } from '../themes'\nimport type { CodeMirrorLanguage } from '../types'\nimport { variables } from './variables'\n\ntype BaseParameters = {\n /** Element Ref to mount codemirror to */\n codeMirrorRef: Ref<HTMLDivElement | null>\n /** List of optional extensions for the instance */\n extensions?: MaybeRefOrGetter<Extension[]>\n /** Whether to load a theme.*/\n withoutTheme?: MaybeRefOrGetter<boolean | undefined>\n /** Languages to support for syntax highlighting */\n language: MaybeRefOrGetter<CodeMirrorLanguage | undefined>\n /** Class names to apply to the instance */\n classes?: MaybeRefOrGetter<string[] | undefined>\n /** Put the editor into read-only mode */\n readOnly?: MaybeRefOrGetter<boolean | undefined>\n /** Disable indent with tab */\n disableTabIndent?: MaybeRefOrGetter<boolean | undefined>\n /** Option to show line numbers in the editor */\n lineNumbers?: MaybeRefOrGetter<boolean | undefined>\n withVariables?: MaybeRefOrGetter<boolean | undefined>\n forceFoldGutter?: MaybeRefOrGetter<boolean | undefined>\n disableEnter?: MaybeRefOrGetter<boolean | undefined>\n disableCloseBrackets?: MaybeRefOrGetter<boolean | undefined>\n /** Option to lint and show error in the editor */\n lint?: MaybeRefOrGetter<boolean | undefined>\n onBlur?: (v: string) => void\n onFocus?: (v: string) => void\n placeholder?: MaybeRefOrGetter<string | undefined>\n}\n\nexport type UseCodeMirrorParameters =\n | (BaseParameters & {\n /** Prefill the content. Will be ignored when a provider is given. */\n content: MaybeRefOrGetter<string | undefined>\n onChange?: (v: string) => void\n })\n | (BaseParameters & {\n provider: MaybeRefOrGetter<Extension | null>\n content?: MaybeRefOrGetter<string | undefined>\n onChange?: (v: string) => void\n })\n\n/** Check if the hook has a provider. In provider mode we ignore the content variable */\nconst hasProvider = (\n params: UseCodeMirrorParameters,\n): params is BaseParameters & {\n content?: MaybeRefOrGetter<string | undefined>\n provider: MaybeRefOrGetter<Extension>\n} => 'provider' in params && !!toValue(params.provider)\n\nconst selectAllKeyBinding: KeyBinding = {\n key: 'Mod-a',\n run: (view) => {\n // Select the entire content\n view.dispatch({\n selection: { anchor: 0, head: view.state.doc.length },\n scrollIntoView: false,\n })\n return true\n },\n}\n\n/** Reactive CodeMirror Integration */\nexport const useCodeMirror = (\n params: UseCodeMirrorParameters,\n): {\n setCodeMirrorContent: (content?: string) => void\n codeMirror: Ref<EditorView | null>\n} => {\n const codeMirror: Ref<EditorView | null> = ref(null)\n\n /** Set the codemirror content value */\n const setCodeMirrorContent = (newValue = '') => {\n if (!codeMirror.value) {\n return\n }\n\n // No need to set the CodeMirror content if nothing has changed\n if (codeMirror.value.state.doc.toString() === newValue) {\n return\n }\n\n codeMirror.value.dispatch({\n changes: {\n from: 0,\n to: codeMirror.value.state.doc.length,\n insert: newValue,\n },\n selection: {\n anchor: Math.min(codeMirror.value.state.selection.main.anchor, newValue.length),\n },\n })\n }\n\n // All options except provider\n const extensionConfig = computed(() => ({\n onChange: params.onChange,\n onBlur: params.onBlur,\n onFocus: params.onFocus,\n disableTabIndent: toValue(params.disableTabIndent),\n language: toValue(params.language),\n classes: toValue(params.classes),\n readOnly: toValue(params.readOnly),\n lineNumbers: toValue(params.lineNumbers),\n withVariables: toValue(params.withVariables),\n forceFoldGutter: toValue(params.forceFoldGutter),\n disableEnter: toValue(params.disableEnter),\n disableCloseBrackets: toValue(params.disableCloseBrackets),\n withoutTheme: toValue(params.withoutTheme),\n lint: toValue(params.lint),\n additionalExtensions: toValue(params.extensions),\n placeholder: toValue(params.placeholder),\n }))\n\n // Unmounts CodeMirror if it's mounted already, and mounts CodeMirror, if the given ref exists.\n watch(\n params.codeMirrorRef,\n () => {\n codeMirror.value?.destroy()\n mountCodeMirror()\n },\n { immediate: true },\n )\n\n // Cleanup codemirror\n onBeforeUnmount(() => codeMirror.value?.destroy())\n\n // Initializes CodeMirror.\n function mountCodeMirror() {\n if (params.codeMirrorRef.value) {\n const provider = hasProvider(params) ? toValue(params.provider) : null\n const extensions = getCodeMirrorExtensions({\n ...extensionConfig.value,\n provider,\n })\n\n codeMirror.value = new EditorView({\n parent: params.codeMirrorRef.value,\n extensions,\n })\n\n // Set the initial content if a provider is not in use\n if (!hasProvider(params)) {\n setCodeMirrorContent(toValue(params.content))\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n\n // Provider must be watched separately because we need to restart codemirror if the provider changes\n watch(\n () => (hasProvider(params) ? toValue(params.provider) : null),\n () => {\n if (hasProvider(params)) {\n codeMirror.value?.destroy()\n mountCodeMirror()\n }\n },\n )\n\n // Update the extensions whenever parameters changes\n watch(\n extensionConfig,\n () => {\n if (!codeMirror.value) {\n return\n }\n // If a provider is\n\n const provider = hasProvider(params) ? toValue(params.provider) : null\n const extensions = getCodeMirrorExtensions({\n ...extensionConfig.value,\n provider,\n })\n\n requestAnimationFrame(() => {\n codeMirror.value?.dispatch({\n effects: StateEffect.reconfigure.of(extensions),\n })\n })\n },\n { immediate: true },\n )\n\n // ---------------------------------------------------------------------------\n\n // Keep the content in sync when the content is managed externally\n watch(\n () => toValue(params.content),\n () => {\n // When a provider is in use we do not map the content value back to the codemirror instance\n if (hasProvider(params)) {\n return\n }\n\n setCodeMirrorContent(toValue(params.content))\n },\n { immediate: true },\n )\n\n return {\n /** Replaces the current content with the given value. */\n setCodeMirrorContent,\n /** Codemirror instance */\n codeMirror,\n }\n}\n\n// ---------------------------------------------------------------------------\n\nconst languageExtensions: {\n [lang in CodeMirrorLanguage]: () => LanguageSupport | StreamLanguage<any>\n} = {\n html: html,\n json: json,\n yaml: yaml,\n css: css,\n xml: xml,\n}\n\n/** Generate the list of extension from parameters */\nfunction getCodeMirrorExtensions({\n onChange,\n onBlur,\n onFocus,\n provider,\n language,\n classes = [],\n readOnly = false,\n lineNumbers = false,\n withVariables = false,\n forceFoldGutter = false,\n disableEnter = false,\n disableCloseBrackets = false,\n disableTabIndent = false,\n withoutTheme = false,\n lint = false,\n additionalExtensions = [],\n placeholder,\n}: {\n classes?: string[]\n language?: CodeMirrorLanguage\n readOnly?: boolean\n lineNumbers?: boolean\n disableCloseBrackets?: boolean\n disableTabIndent?: boolean\n withVariables?: boolean\n disableEnter?: boolean\n forceFoldGutter?: boolean\n onChange?: (val: string) => void\n onFocus?: (val: string) => void\n onBlur?: (val: string) => void\n withoutTheme?: boolean\n provider: Extension | null\n lint?: boolean\n additionalExtensions?: Extension[]\n placeholder?: string\n}) {\n const extensions: Extension[] = [\n highlightSpecialChars(),\n history(),\n keymap.of(historyKeymap),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n EditorView.theme({\n '.cm-line': {\n lineHeight: '22px',\n padding: '0 2px 0 4px',\n },\n '.cm-gutterElement': {\n lineHeight: '22px',\n },\n '.cm-tooltip': {\n border: '1px solid #f5c6cb',\n fontSize: '12px',\n },\n '.cm-tooltip-lint': {\n backgroundColor: '#ffffff',\n },\n '.cm-diagnostic-error': {\n borderLeft: '0',\n color: '#dc1b19',\n },\n '.cm-foldPlaceholder': {\n background: 'var(--scalar-background-1)',\n border: 'none',\n fontFamily: 'var(--scalar-font)',\n },\n }),\n // Listen to updates\n EditorView.updateListener.of((v) => {\n if (!v.docChanged) {\n return\n }\n onChange?.(v.state.doc.toString())\n }),\n EditorView.domEventHandlers({\n blur: (_event, view) => {\n onBlur?.(view.state.doc.toString())\n },\n focus: (_event, view) => {\n onFocus?.(view.state.doc.toString())\n },\n }),\n // Add Classes\n EditorView.editorAttributes.of({ class: classes.join(' ') }),\n ...additionalExtensions,\n ]\n\n // Enable the provider\n if (provider) {\n extensions.push(provider)\n }\n\n // Add the theme as needed\n if (!withoutTheme) {\n extensions.push(customTheme)\n }\n\n // Read only\n if (readOnly) {\n extensions.push(EditorView.editable.of(false))\n } else {\n extensions.push(\n indentOnInput(),\n bracketMatching(),\n autocompletion(),\n keymap.of([...completionKeymap, selectAllKeyBinding]),\n bracketMatching(),\n )\n\n if (!disableCloseBrackets) {\n extensions.push(closeBrackets(), keymap.of([...closeBracketsKeymap]))\n }\n\n if (disableTabIndent) {\n extensions.push(\n keymap.of([\n {\n key: 'Tab',\n run: () => false, // Prevent default Tab behavior\n shift: () => false, // Prevent default Shift+Tab behavior\n },\n ]),\n )\n } else {\n extensions.push(keymap.of([indentWithTab]))\n }\n }\n\n // Add placeholder extension if placeholder is provided\n if (placeholder) {\n extensions.push(placeholderExtension(placeholder))\n }\n\n // Line numbers\n if (lineNumbers) {\n extensions.push(lineNumbersExtension())\n }\n\n if (forceFoldGutter) {\n extensions.push(\n foldGutter({\n markerDOM: (open) => {\n const icon = document.createElement('div')\n icon.classList.add('cm-foldMarker')\n const vnode = h(ScalarIcon, {\n icon: open ? 'ChevronDown' : 'ChevronRight',\n size: 'md',\n })\n render(vnode, icon)\n return icon\n },\n }),\n )\n }\n\n // Syntax highlighting\n if (language && languageExtensions[language]) {\n extensions.push(languageExtensions[language]())\n if (!forceFoldGutter) {\n extensions.push(\n foldGutter({\n markerDOM: (open) => {\n const icon = document.createElement('div')\n icon.classList.add('cm-foldMarker')\n const vnode = h(ScalarIcon, {\n icon: open ? 'ChevronDown' : 'ChevronRight',\n size: 'md',\n })\n render(vnode, icon)\n return icon\n },\n }),\n )\n }\n }\n\n // JSON Linter\n if (lint && language === 'json') {\n const jsonLinter = linter((view) => {\n const diagnostics: Diagnostic[] = []\n const content = view.state.doc.toString()\n if (content.trim()) {\n try {\n JSON.parse(content)\n } catch (e) {\n if (e instanceof Error) {\n diagnostics.push({\n from: 0,\n to: view.state.doc.length,\n severity: 'error',\n message: e.message,\n })\n }\n }\n }\n return diagnostics\n })\n extensions.push(jsonLinter)\n }\n\n // Highlight variables\n if (withVariables) {\n extensions.push(variables())\n }\n\n if (disableEnter) {\n extensions.push(\n keymap.of([\n {\n key: 'Enter',\n run: () => {\n return true\n },\n },\n {\n key: 'Ctrl-Enter',\n mac: 'Cmd-Enter',\n run: () => {\n return true\n },\n },\n {\n key: 'Shift-Enter',\n run: () => {\n return true\n },\n },\n ]),\n )\n } else {\n extensions.push(\n keymap.of([\n {\n key: 'Enter',\n run: insertNewline,\n },\n ]),\n )\n }\n\n return extensions\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }