@sanity/code-input 6.0.4 → 7.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/README.md +1 -16
- package/assets/all-options.png +0 -0
- package/assets/basic-input.png +0 -0
- package/dist/_chunks-es/CodeMirrorProxy.js +510 -0
- package/dist/_chunks-es/CodeMirrorProxy.js.map +1 -0
- package/dist/_chunks-es/index.js +427 -0
- package/dist/_chunks-es/index.js.map +1 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/package.json +37 -94
- package/lib/_chunks-cjs/CodeMirrorProxy.cjs +0 -407
- package/lib/_chunks-cjs/CodeMirrorProxy.cjs.map +0 -1
- package/lib/_chunks-cjs/index.cjs +0 -433
- package/lib/_chunks-cjs/index.cjs.map +0 -1
- package/lib/_chunks-es/CodeMirrorProxy.js +0 -395
- package/lib/_chunks-es/CodeMirrorProxy.js.map +0 -1
- package/lib/_chunks-es/index.js +0 -437
- package/lib/_chunks-es/index.js.map +0 -1
- package/lib/index.cjs +0 -8
- package/lib/index.cjs.map +0 -1
- package/lib/index.d.cts +0 -121
- package/lib/index.d.ts +0 -121
- package/sanity.json +0 -8
- package/src/CodeInput.tsx +0 -181
- package/src/LanguageField.tsx +0 -41
- package/src/LanguageInput.tsx +0 -35
- package/src/PreviewCode.tsx +0 -71
- package/src/codemirror/CodeMirrorProxy.tsx +0 -159
- package/src/codemirror/CodeModeContext.tsx +0 -5
- package/src/codemirror/defaultCodeModes.ts +0 -109
- package/src/codemirror/extensions/backwardsCompatibleTone.ts +0 -19
- package/src/codemirror/extensions/highlightLineExtension.ts +0 -175
- package/src/codemirror/extensions/theme.ts +0 -65
- package/src/codemirror/extensions/useCodeMirrorTheme.ts +0 -64
- package/src/codemirror/extensions/useFontSize.ts +0 -24
- package/src/codemirror/useCodeMirror-client.test.tsx +0 -51
- package/src/codemirror/useCodeMirror-server.test.tsx +0 -18
- package/src/codemirror/useCodeMirror.tsx +0 -11
- package/src/codemirror/useLanguageMode.tsx +0 -60
- package/src/config.ts +0 -35
- package/src/getMedia.tsx +0 -93
- package/src/index.ts +0 -8
- package/src/plugin.tsx +0 -40
- package/src/sanity-ui.d.ts +0 -5
- package/src/schema.tsx +0 -86
- package/src/types.ts +0 -35
- package/src/ui/focusRingStyle.ts +0 -27
- package/src/useFieldMember.ts +0 -16
- package/v2-incompatible.js +0 -11
- /package/{lib → dist}/index.js +0 -0
- /package/{lib → dist}/index.js.map +0 -0
package/README.md
CHANGED
|
@@ -75,7 +75,7 @@ defineField({
|
|
|
75
75
|
|
|
76
76
|
## Add support for more languages
|
|
77
77
|
|
|
78
|
-
Only a subset of languages are have syntax highlighting support by default (see full list [here](https://github.com/sanity-io/
|
|
78
|
+
Only a subset of languages are have syntax highlighting support by default (see full list [here](https://github.com/sanity-io/plugins/blob/main/plugins/@sanity/code-input/src/codemirror/defaultCodeModes.ts)).
|
|
79
79
|
|
|
80
80
|
### Mode: Reuse an existing language
|
|
81
81
|
|
|
@@ -235,18 +235,3 @@ Other syntax highlighters include:
|
|
|
235
235
|
## License
|
|
236
236
|
|
|
237
237
|
MIT-licensed. See LICENSE.
|
|
238
|
-
|
|
239
|
-
## Develop & test
|
|
240
|
-
|
|
241
|
-
This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
|
|
242
|
-
with default configuration for build & watch scripts.
|
|
243
|
-
|
|
244
|
-
See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
|
|
245
|
-
on how to run this plugin with hotreload in the studio.
|
|
246
|
-
|
|
247
|
-
### UI Workshop
|
|
248
|
-
|
|
249
|
-
Run
|
|
250
|
-
`workshop dev`
|
|
251
|
-
|
|
252
|
-
To test the CodeMirror lazy component.
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { c } from "react/compiler-runtime";
|
|
3
|
+
import { lineNumbers, EditorView, Decoration } from "@codemirror/view";
|
|
4
|
+
import { useRootTheme, useTheme, rem } from "@sanity/ui";
|
|
5
|
+
import CodeMirror from "@uiw/react-codemirror";
|
|
6
|
+
import { forwardRef, useState, useEffect, useContext } from "react";
|
|
7
|
+
import { CodeInputConfigContext } from "./index.js";
|
|
8
|
+
import { StreamLanguage } from "@codemirror/language";
|
|
9
|
+
import { StateField, StateEffect } from "@codemirror/state";
|
|
10
|
+
import { rgba } from "@sanity/ui/theme";
|
|
11
|
+
import { tags } from "@lezer/highlight";
|
|
12
|
+
import { createTheme } from "@uiw/codemirror-themes";
|
|
13
|
+
const defaultCodeModes = [{
|
|
14
|
+
name: "groq",
|
|
15
|
+
loader: () => import("@codemirror/lang-javascript").then(({
|
|
16
|
+
javascriptLanguage
|
|
17
|
+
}) => javascriptLanguage)
|
|
18
|
+
}, {
|
|
19
|
+
name: "javascript",
|
|
20
|
+
loader: () => import("@codemirror/lang-javascript").then(({
|
|
21
|
+
javascript
|
|
22
|
+
}) => javascript({
|
|
23
|
+
jsx: !1
|
|
24
|
+
}))
|
|
25
|
+
}, {
|
|
26
|
+
name: "jsx",
|
|
27
|
+
loader: () => import("@codemirror/lang-javascript").then(({
|
|
28
|
+
javascript
|
|
29
|
+
}) => javascript({
|
|
30
|
+
jsx: !0
|
|
31
|
+
}))
|
|
32
|
+
}, {
|
|
33
|
+
name: "typescript",
|
|
34
|
+
loader: () => import("@codemirror/lang-javascript").then(({
|
|
35
|
+
javascript
|
|
36
|
+
}) => javascript({
|
|
37
|
+
jsx: !1,
|
|
38
|
+
typescript: !0
|
|
39
|
+
}))
|
|
40
|
+
}, {
|
|
41
|
+
name: "tsx",
|
|
42
|
+
loader: () => import("@codemirror/lang-javascript").then(({
|
|
43
|
+
javascript
|
|
44
|
+
}) => javascript({
|
|
45
|
+
jsx: !0,
|
|
46
|
+
typescript: !0
|
|
47
|
+
}))
|
|
48
|
+
}, {
|
|
49
|
+
name: "php",
|
|
50
|
+
loader: () => import("@codemirror/lang-php").then(({
|
|
51
|
+
php
|
|
52
|
+
}) => php())
|
|
53
|
+
}, {
|
|
54
|
+
name: "sql",
|
|
55
|
+
loader: () => import("@codemirror/lang-sql").then(({
|
|
56
|
+
sql
|
|
57
|
+
}) => sql())
|
|
58
|
+
}, {
|
|
59
|
+
name: "mysql",
|
|
60
|
+
loader: () => import("@codemirror/lang-sql").then(({
|
|
61
|
+
sql,
|
|
62
|
+
MySQL
|
|
63
|
+
}) => sql({
|
|
64
|
+
dialect: MySQL
|
|
65
|
+
}))
|
|
66
|
+
}, {
|
|
67
|
+
name: "json",
|
|
68
|
+
loader: () => import("@codemirror/lang-json").then(({
|
|
69
|
+
json
|
|
70
|
+
}) => json())
|
|
71
|
+
}, {
|
|
72
|
+
name: "markdown",
|
|
73
|
+
loader: () => import("@codemirror/lang-markdown").then(({
|
|
74
|
+
markdown
|
|
75
|
+
}) => markdown())
|
|
76
|
+
}, {
|
|
77
|
+
name: "java",
|
|
78
|
+
loader: () => import("@codemirror/lang-java").then(({
|
|
79
|
+
java
|
|
80
|
+
}) => java())
|
|
81
|
+
}, {
|
|
82
|
+
name: "html",
|
|
83
|
+
loader: () => import("@codemirror/lang-html").then(({
|
|
84
|
+
html
|
|
85
|
+
}) => html())
|
|
86
|
+
}, {
|
|
87
|
+
name: "csharp",
|
|
88
|
+
loader: () => import("@codemirror/legacy-modes/mode/clike").then(({
|
|
89
|
+
csharp
|
|
90
|
+
}) => StreamLanguage.define(csharp))
|
|
91
|
+
}, {
|
|
92
|
+
name: "sh",
|
|
93
|
+
loader: () => import("@codemirror/legacy-modes/mode/shell").then(({
|
|
94
|
+
shell
|
|
95
|
+
}) => StreamLanguage.define(shell))
|
|
96
|
+
}, {
|
|
97
|
+
name: "css",
|
|
98
|
+
loader: () => import("@codemirror/legacy-modes/mode/css").then(({
|
|
99
|
+
css
|
|
100
|
+
}) => StreamLanguage.define(css))
|
|
101
|
+
}, {
|
|
102
|
+
name: "scss",
|
|
103
|
+
loader: () => import("@codemirror/legacy-modes/mode/css").then(({
|
|
104
|
+
css
|
|
105
|
+
}) => StreamLanguage.define(css))
|
|
106
|
+
}, {
|
|
107
|
+
name: "sass",
|
|
108
|
+
loader: () => import("@codemirror/legacy-modes/mode/sass").then(({
|
|
109
|
+
sass
|
|
110
|
+
}) => StreamLanguage.define(sass))
|
|
111
|
+
}, {
|
|
112
|
+
name: "ruby",
|
|
113
|
+
loader: () => import("@codemirror/legacy-modes/mode/ruby").then(({
|
|
114
|
+
ruby
|
|
115
|
+
}) => StreamLanguage.define(ruby))
|
|
116
|
+
}, {
|
|
117
|
+
name: "python",
|
|
118
|
+
loader: () => import("@codemirror/legacy-modes/mode/python").then(({
|
|
119
|
+
python
|
|
120
|
+
}) => StreamLanguage.define(python))
|
|
121
|
+
}, {
|
|
122
|
+
name: "xml",
|
|
123
|
+
loader: () => import("@codemirror/legacy-modes/mode/xml").then(({
|
|
124
|
+
xml
|
|
125
|
+
}) => StreamLanguage.define(xml))
|
|
126
|
+
}, {
|
|
127
|
+
name: "yaml",
|
|
128
|
+
loader: () => import("@codemirror/legacy-modes/mode/yaml").then(({
|
|
129
|
+
yaml
|
|
130
|
+
}) => StreamLanguage.define(yaml))
|
|
131
|
+
}, {
|
|
132
|
+
name: "golang",
|
|
133
|
+
loader: () => import("@codemirror/legacy-modes/mode/go").then(({
|
|
134
|
+
go
|
|
135
|
+
}) => StreamLanguage.define(go))
|
|
136
|
+
}, {
|
|
137
|
+
name: "text",
|
|
138
|
+
loader: () => {
|
|
139
|
+
}
|
|
140
|
+
}, {
|
|
141
|
+
name: "batch",
|
|
142
|
+
loader: () => {
|
|
143
|
+
}
|
|
144
|
+
}];
|
|
145
|
+
function getBackwardsCompatibleTone(themeCtx) {
|
|
146
|
+
return themeCtx.tone !== "neutral" && themeCtx.tone !== "suggest" ? themeCtx.tone : themeCtx.tone === "neutral" ? "default" : "primary";
|
|
147
|
+
}
|
|
148
|
+
const highlightLineClass = "cm-highlight-line", addLineHighlight = StateEffect.define(), removeLineHighlight = StateEffect.define(), lineHighlightField = StateField.define({
|
|
149
|
+
create() {
|
|
150
|
+
return Decoration.none;
|
|
151
|
+
},
|
|
152
|
+
update(lines, tr) {
|
|
153
|
+
lines = lines.map(tr.changes);
|
|
154
|
+
for (const e of tr.effects)
|
|
155
|
+
e.is(addLineHighlight) && (lines = lines.update({
|
|
156
|
+
add: [lineHighlightMark.range(e.value)]
|
|
157
|
+
})), e.is(removeLineHighlight) && (lines = lines.update({
|
|
158
|
+
filter: (from) => from !== e.value
|
|
159
|
+
}));
|
|
160
|
+
return lines;
|
|
161
|
+
},
|
|
162
|
+
toJSON(value, state) {
|
|
163
|
+
const highlightLines = [], iter = value.iter();
|
|
164
|
+
for (; iter.value; ) {
|
|
165
|
+
const lineNumber = state.doc.lineAt(iter.from).number;
|
|
166
|
+
highlightLines.includes(lineNumber) || highlightLines.push(lineNumber), iter.next();
|
|
167
|
+
}
|
|
168
|
+
return highlightLines;
|
|
169
|
+
},
|
|
170
|
+
fromJSON(value, state) {
|
|
171
|
+
const lines = state.doc.lines, highlights = value.filter((line) => line <= lines).map((line) => lineHighlightMark.range(state.doc.line(line).from));
|
|
172
|
+
highlights.sort((a, b) => a.from - b.from);
|
|
173
|
+
try {
|
|
174
|
+
return Decoration.none.update({
|
|
175
|
+
add: highlights
|
|
176
|
+
});
|
|
177
|
+
} catch (e) {
|
|
178
|
+
return console.error(e), Decoration.none;
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
provide: (f) => EditorView.decorations.from(f)
|
|
182
|
+
}), lineHighlightMark = Decoration.line({
|
|
183
|
+
class: highlightLineClass
|
|
184
|
+
}), highlightState = {
|
|
185
|
+
highlight: lineHighlightField
|
|
186
|
+
};
|
|
187
|
+
function createCodeMirrorTheme(options) {
|
|
188
|
+
const {
|
|
189
|
+
themeCtx
|
|
190
|
+
} = options, fallbackTone = getBackwardsCompatibleTone(themeCtx), dark = {
|
|
191
|
+
color: themeCtx.theme.color.dark[fallbackTone]
|
|
192
|
+
}, light = {
|
|
193
|
+
color: themeCtx.theme.color.light[fallbackTone]
|
|
194
|
+
};
|
|
195
|
+
return EditorView.baseTheme({
|
|
196
|
+
".cm-lineNumbers": {
|
|
197
|
+
cursor: "default"
|
|
198
|
+
},
|
|
199
|
+
".cm-line.cm-line": {
|
|
200
|
+
position: "relative"
|
|
201
|
+
},
|
|
202
|
+
// need set background with pseudoelement so it does not render over selection color
|
|
203
|
+
[`.${highlightLineClass}::before`]: {
|
|
204
|
+
position: "absolute",
|
|
205
|
+
top: 0,
|
|
206
|
+
bottom: 0,
|
|
207
|
+
left: 0,
|
|
208
|
+
right: 0,
|
|
209
|
+
zIndex: -3,
|
|
210
|
+
content: "''",
|
|
211
|
+
boxSizing: "border-box"
|
|
212
|
+
},
|
|
213
|
+
[`&dark .${highlightLineClass}::before`]: {
|
|
214
|
+
background: rgba(dark.color.muted.caution.pressed.bg, 0.5)
|
|
215
|
+
},
|
|
216
|
+
[`&light .${highlightLineClass}::before`]: {
|
|
217
|
+
background: rgba(light.color.muted.caution.pressed.bg, 0.75)
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
const highlightLine = (config) => {
|
|
222
|
+
const highlightTheme = createCodeMirrorTheme({
|
|
223
|
+
themeCtx: config.theme
|
|
224
|
+
});
|
|
225
|
+
return [lineHighlightField, config.readOnly ? [] : lineNumbers({
|
|
226
|
+
domEventHandlers: {
|
|
227
|
+
mousedown: (editorView, lineInfo) => {
|
|
228
|
+
const line = editorView.state.doc.lineAt(lineInfo.from);
|
|
229
|
+
let isHighlighted = !1;
|
|
230
|
+
return editorView.state.field(lineHighlightField).between(line.from, line.to, (_from, _to, value) => {
|
|
231
|
+
if (value)
|
|
232
|
+
return isHighlighted = !0, !1;
|
|
233
|
+
}), isHighlighted ? editorView.dispatch({
|
|
234
|
+
effects: removeLineHighlight.of(line.from)
|
|
235
|
+
}) : editorView.dispatch({
|
|
236
|
+
effects: addLineHighlight.of(line.from)
|
|
237
|
+
}), config?.onHighlightChange && config.onHighlightChange(editorView.state.toJSON(highlightState).highlight), !0;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}), highlightTheme];
|
|
241
|
+
};
|
|
242
|
+
function setHighlightedLines(view, highlightLines) {
|
|
243
|
+
const doc = view.state.doc, lines = doc.lines, allLineNumbers = Array.from({
|
|
244
|
+
length: lines
|
|
245
|
+
}, (_x, i) => i + 1);
|
|
246
|
+
view.dispatch({
|
|
247
|
+
effects: allLineNumbers.map((lineNumber) => {
|
|
248
|
+
const line = doc.line(lineNumber);
|
|
249
|
+
return highlightLines?.includes(lineNumber) ? addLineHighlight.of(line.from) : removeLineHighlight.of(line.from);
|
|
250
|
+
})
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
function useThemeExtension() {
|
|
254
|
+
const $ = c(6), themeCtx = useRootTheme();
|
|
255
|
+
let t0;
|
|
256
|
+
$[0] !== themeCtx ? (t0 = getBackwardsCompatibleTone(themeCtx), $[0] = themeCtx, $[1] = t0) : t0 = $[1];
|
|
257
|
+
const fallbackTone = t0, t1 = themeCtx.theme.color.dark[fallbackTone];
|
|
258
|
+
let t2;
|
|
259
|
+
if ($[2] !== fallbackTone || $[3] !== t1 || $[4] !== themeCtx.theme.color.light) {
|
|
260
|
+
const dark = {
|
|
261
|
+
color: t1
|
|
262
|
+
}, light = {
|
|
263
|
+
color: themeCtx.theme.color.light[fallbackTone]
|
|
264
|
+
};
|
|
265
|
+
t2 = EditorView.baseTheme({
|
|
266
|
+
"&.cm-editor": {
|
|
267
|
+
height: "100%"
|
|
268
|
+
},
|
|
269
|
+
"&.cm-editor.cm-focused": {
|
|
270
|
+
outline: "none"
|
|
271
|
+
},
|
|
272
|
+
"&.cm-editor.cm-focused .cm-matchingBracket": {
|
|
273
|
+
backgroundColor: "transparent"
|
|
274
|
+
},
|
|
275
|
+
"&.cm-editor.cm-focused .cm-nonmatchingBracket": {
|
|
276
|
+
backgroundColor: "transparent"
|
|
277
|
+
},
|
|
278
|
+
"&dark.cm-editor.cm-focused .cm-matchingBracket": {
|
|
279
|
+
outline: `1px solid ${dark.color.base.border}`
|
|
280
|
+
},
|
|
281
|
+
"&dark.cm-editor.cm-focused .cm-nonmatchingBracket": {
|
|
282
|
+
outline: `1px solid ${dark.color.base.border}`
|
|
283
|
+
},
|
|
284
|
+
"&light.cm-editor.cm-focused .cm-matchingBracket": {
|
|
285
|
+
outline: `1px solid ${light.color.base.border}`
|
|
286
|
+
},
|
|
287
|
+
"&light.cm-editor.cm-focused .cm-nonmatchingBracket": {
|
|
288
|
+
outline: `1px solid ${light.color.base.border}`
|
|
289
|
+
},
|
|
290
|
+
"& .cm-lineNumbers .cm-gutterElement": {
|
|
291
|
+
minWidth: "32px !important",
|
|
292
|
+
padding: "0 8px !important"
|
|
293
|
+
},
|
|
294
|
+
"& .cm-gutter.cm-foldGutter": {
|
|
295
|
+
width: "0px !important"
|
|
296
|
+
},
|
|
297
|
+
"&dark .cm-gutters": {
|
|
298
|
+
color: `${rgba(dark.color.card.enabled.code.fg, 0.5)} !important`,
|
|
299
|
+
borderRight: `1px solid ${rgba(dark.color.base.border, 0.5)}`
|
|
300
|
+
},
|
|
301
|
+
"&light .cm-gutters": {
|
|
302
|
+
color: `${rgba(light.color.card.enabled.code.fg, 0.5)} !important`,
|
|
303
|
+
borderRight: `1px solid ${rgba(light.color.base.border, 0.5)}`
|
|
304
|
+
}
|
|
305
|
+
}), $[2] = fallbackTone, $[3] = t1, $[4] = themeCtx.theme.color.light, $[5] = t2;
|
|
306
|
+
} else
|
|
307
|
+
t2 = $[5];
|
|
308
|
+
return t2;
|
|
309
|
+
}
|
|
310
|
+
function useCodeMirrorTheme() {
|
|
311
|
+
const $ = c(19), theme = useTheme(), {
|
|
312
|
+
code: codeFont
|
|
313
|
+
} = theme.sanity.fonts, {
|
|
314
|
+
base,
|
|
315
|
+
card,
|
|
316
|
+
dark,
|
|
317
|
+
syntax
|
|
318
|
+
} = theme.sanity.color, t0 = dark ? "dark" : "light";
|
|
319
|
+
let t1;
|
|
320
|
+
return $[0] !== base.focusRing || $[1] !== card.disabled.bg || $[2] !== card.disabled.code.fg || $[3] !== card.enabled.bg || $[4] !== card.enabled.code.fg || $[5] !== card.enabled.fg || $[6] !== codeFont.family || $[7] !== syntax.attrName || $[8] !== syntax.boolean || $[9] !== syntax.className || $[10] !== syntax.comment || $[11] !== syntax.function || $[12] !== syntax.keyword || $[13] !== syntax.number || $[14] !== syntax.operator || $[15] !== syntax.property || $[16] !== syntax.string || $[17] !== t0 ? (t1 = createTheme({
|
|
321
|
+
theme: t0,
|
|
322
|
+
settings: {
|
|
323
|
+
background: card.enabled.bg,
|
|
324
|
+
foreground: card.enabled.code.fg,
|
|
325
|
+
lineHighlight: card.enabled.bg,
|
|
326
|
+
fontFamily: codeFont.family,
|
|
327
|
+
caret: base.focusRing,
|
|
328
|
+
selection: rgba(base.focusRing, 0.2),
|
|
329
|
+
selectionMatch: rgba(base.focusRing, 0.4),
|
|
330
|
+
gutterBackground: card.disabled.bg,
|
|
331
|
+
gutterForeground: card.disabled.code.fg,
|
|
332
|
+
gutterActiveForeground: card.enabled.fg
|
|
333
|
+
},
|
|
334
|
+
styles: [{
|
|
335
|
+
tag: [tags.heading, tags.heading2, tags.heading3, tags.heading4, tags.heading5, tags.heading6],
|
|
336
|
+
color: card.enabled.fg
|
|
337
|
+
}, {
|
|
338
|
+
tag: tags.angleBracket,
|
|
339
|
+
color: card.enabled.code.fg
|
|
340
|
+
}, {
|
|
341
|
+
tag: tags.atom,
|
|
342
|
+
color: syntax.keyword
|
|
343
|
+
}, {
|
|
344
|
+
tag: tags.attributeName,
|
|
345
|
+
color: syntax.attrName
|
|
346
|
+
}, {
|
|
347
|
+
tag: tags.bool,
|
|
348
|
+
color: syntax.boolean
|
|
349
|
+
}, {
|
|
350
|
+
tag: tags.bracket,
|
|
351
|
+
color: card.enabled.code.fg
|
|
352
|
+
}, {
|
|
353
|
+
tag: tags.className,
|
|
354
|
+
color: syntax.className
|
|
355
|
+
}, {
|
|
356
|
+
tag: tags.comment,
|
|
357
|
+
color: syntax.comment
|
|
358
|
+
}, {
|
|
359
|
+
tag: tags.definition(tags.typeName),
|
|
360
|
+
color: syntax.function
|
|
361
|
+
}, {
|
|
362
|
+
tag: [tags.definition(tags.variableName), tags.function(tags.variableName), tags.className, tags.attributeName],
|
|
363
|
+
color: syntax.function
|
|
364
|
+
}, {
|
|
365
|
+
tag: [tags.function(tags.propertyName), tags.propertyName],
|
|
366
|
+
color: syntax.function
|
|
367
|
+
}, {
|
|
368
|
+
tag: tags.keyword,
|
|
369
|
+
color: syntax.keyword
|
|
370
|
+
}, {
|
|
371
|
+
tag: tags.null,
|
|
372
|
+
color: syntax.number
|
|
373
|
+
}, {
|
|
374
|
+
tag: tags.number,
|
|
375
|
+
color: syntax.number
|
|
376
|
+
}, {
|
|
377
|
+
tag: tags.meta,
|
|
378
|
+
color: card.enabled.code.fg
|
|
379
|
+
}, {
|
|
380
|
+
tag: tags.operator,
|
|
381
|
+
color: syntax.operator
|
|
382
|
+
}, {
|
|
383
|
+
tag: tags.propertyName,
|
|
384
|
+
color: syntax.property
|
|
385
|
+
}, {
|
|
386
|
+
tag: [tags.string, tags.special(tags.brace)],
|
|
387
|
+
color: syntax.string
|
|
388
|
+
}, {
|
|
389
|
+
tag: tags.tagName,
|
|
390
|
+
color: syntax.className
|
|
391
|
+
}, {
|
|
392
|
+
tag: tags.typeName,
|
|
393
|
+
color: syntax.keyword
|
|
394
|
+
}]
|
|
395
|
+
}), $[0] = base.focusRing, $[1] = card.disabled.bg, $[2] = card.disabled.code.fg, $[3] = card.enabled.bg, $[4] = card.enabled.code.fg, $[5] = card.enabled.fg, $[6] = codeFont.family, $[7] = syntax.attrName, $[8] = syntax.boolean, $[9] = syntax.className, $[10] = syntax.comment, $[11] = syntax.function, $[12] = syntax.keyword, $[13] = syntax.number, $[14] = syntax.operator, $[15] = syntax.property, $[16] = syntax.string, $[17] = t0, $[18] = t1) : t1 = $[18], t1;
|
|
396
|
+
}
|
|
397
|
+
function useFontSizeExtension(props) {
|
|
398
|
+
const $ = c(3), {
|
|
399
|
+
fontSize: fontSizeProp
|
|
400
|
+
} = props, theme = useTheme(), {
|
|
401
|
+
code: codeFont
|
|
402
|
+
} = theme.sanity.fonts, {
|
|
403
|
+
fontSize,
|
|
404
|
+
lineHeight
|
|
405
|
+
} = codeFont.sizes[fontSizeProp] || codeFont.sizes[2];
|
|
406
|
+
let t0;
|
|
407
|
+
return $[0] !== fontSize || $[1] !== lineHeight ? (t0 = EditorView.baseTheme({
|
|
408
|
+
"&": {
|
|
409
|
+
fontSize: rem(fontSize)
|
|
410
|
+
},
|
|
411
|
+
"& .cm-scroller": {
|
|
412
|
+
lineHeight: `${lineHeight / fontSize} !important`
|
|
413
|
+
}
|
|
414
|
+
}), $[0] = fontSize, $[1] = lineHeight, $[2] = t0) : t0 = $[2], t0;
|
|
415
|
+
}
|
|
416
|
+
const CodeMirrorProxy = forwardRef(function(props, ref) {
|
|
417
|
+
const $ = c(41);
|
|
418
|
+
let basicSetupProp, codeMirrorProps, highlightLines, languageMode, onHighlightChange, readOnly, value;
|
|
419
|
+
$[0] !== props ? ({
|
|
420
|
+
basicSetup: basicSetupProp,
|
|
421
|
+
highlightLines,
|
|
422
|
+
languageMode,
|
|
423
|
+
onHighlightChange,
|
|
424
|
+
readOnly,
|
|
425
|
+
value,
|
|
426
|
+
...codeMirrorProps
|
|
427
|
+
} = props, $[0] = props, $[1] = basicSetupProp, $[2] = codeMirrorProps, $[3] = highlightLines, $[4] = languageMode, $[5] = onHighlightChange, $[6] = readOnly, $[7] = value) : (basicSetupProp = $[1], codeMirrorProps = $[2], highlightLines = $[3], languageMode = $[4], onHighlightChange = $[5], readOnly = $[6], value = $[7]);
|
|
428
|
+
const themeCtx = useRootTheme(), codeMirrorTheme = useCodeMirrorTheme(), [editorView, setEditorView] = useState(void 0), themeExtension = useThemeExtension();
|
|
429
|
+
let t0;
|
|
430
|
+
$[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = {
|
|
431
|
+
fontSize: 1
|
|
432
|
+
}, $[8] = t0) : t0 = $[8];
|
|
433
|
+
const fontSizeExtension = useFontSizeExtension(t0), languageExtension = useLanguageExtension(languageMode);
|
|
434
|
+
let t1;
|
|
435
|
+
$[9] !== onHighlightChange || $[10] !== readOnly || $[11] !== themeCtx ? (t1 = highlightLine({
|
|
436
|
+
onHighlightChange,
|
|
437
|
+
readOnly,
|
|
438
|
+
theme: themeCtx
|
|
439
|
+
}), $[9] = onHighlightChange, $[10] = readOnly, $[11] = themeCtx, $[12] = t1) : t1 = $[12];
|
|
440
|
+
const highlightLineExtension = t1;
|
|
441
|
+
let t2;
|
|
442
|
+
bb0: {
|
|
443
|
+
let t32;
|
|
444
|
+
$[13] !== fontSizeExtension || $[14] !== highlightLineExtension || $[15] !== themeExtension ? (t32 = [themeExtension, fontSizeExtension, highlightLineExtension, EditorView.lineWrapping], $[13] = fontSizeExtension, $[14] = highlightLineExtension, $[15] = themeExtension, $[16] = t32) : t32 = $[16];
|
|
445
|
+
const baseExtensions = t32;
|
|
446
|
+
if (languageExtension) {
|
|
447
|
+
let t42;
|
|
448
|
+
$[17] !== baseExtensions || $[18] !== languageExtension ? (t42 = [...baseExtensions, languageExtension], $[17] = baseExtensions, $[18] = languageExtension, $[19] = t42) : t42 = $[19], t2 = t42;
|
|
449
|
+
break bb0;
|
|
450
|
+
}
|
|
451
|
+
t2 = baseExtensions;
|
|
452
|
+
}
|
|
453
|
+
const extensions = t2;
|
|
454
|
+
let t3;
|
|
455
|
+
$[20] !== editorView || $[21] !== highlightLines ? (t3 = () => {
|
|
456
|
+
editorView && setHighlightedLines(editorView, highlightLines ?? []);
|
|
457
|
+
}, $[20] = editorView, $[21] = highlightLines, $[22] = t3) : t3 = $[22];
|
|
458
|
+
let t4;
|
|
459
|
+
$[23] !== editorView || $[24] !== highlightLines || $[25] !== value ? (t4 = [editorView, highlightLines, value], $[23] = editorView, $[24] = highlightLines, $[25] = value, $[26] = t4) : t4 = $[26], useEffect(t3, t4);
|
|
460
|
+
let t5;
|
|
461
|
+
$[27] !== highlightLines || $[28] !== value ? (t5 = () => ({
|
|
462
|
+
json: {
|
|
463
|
+
doc: value ?? "",
|
|
464
|
+
selection: {
|
|
465
|
+
main: 0,
|
|
466
|
+
ranges: [{
|
|
467
|
+
anchor: 0,
|
|
468
|
+
head: 0
|
|
469
|
+
}]
|
|
470
|
+
},
|
|
471
|
+
highlight: highlightLines ?? []
|
|
472
|
+
},
|
|
473
|
+
fields: highlightState
|
|
474
|
+
}), $[27] = highlightLines, $[28] = value, $[29] = t5) : t5 = $[29];
|
|
475
|
+
const [initialState] = useState(t5);
|
|
476
|
+
let t6;
|
|
477
|
+
$[30] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t6 = (view) => {
|
|
478
|
+
setEditorView(view);
|
|
479
|
+
}, $[30] = t6) : t6 = $[30];
|
|
480
|
+
const handleCreateEditor = t6;
|
|
481
|
+
let t7;
|
|
482
|
+
$[31] !== basicSetupProp ? (t7 = basicSetupProp ?? {
|
|
483
|
+
highlightActiveLine: !1
|
|
484
|
+
}, $[31] = basicSetupProp, $[32] = t7) : t7 = $[32];
|
|
485
|
+
const basicSetup = t7;
|
|
486
|
+
let t8;
|
|
487
|
+
return $[33] !== basicSetup || $[34] !== codeMirrorProps || $[35] !== codeMirrorTheme || $[36] !== extensions || $[37] !== initialState || $[38] !== ref || $[39] !== value ? (t8 = /* @__PURE__ */ jsx(CodeMirror, { ...codeMirrorProps, value, ref, extensions, theme: codeMirrorTheme, onCreateEditor: handleCreateEditor, initialState, basicSetup }), $[33] = basicSetup, $[34] = codeMirrorProps, $[35] = codeMirrorTheme, $[36] = extensions, $[37] = initialState, $[38] = ref, $[39] = value, $[40] = t8) : t8 = $[40], t8;
|
|
488
|
+
});
|
|
489
|
+
function useLanguageExtension(mode) {
|
|
490
|
+
const $ = c(6), codeConfig = useContext(CodeInputConfigContext), [languageExtension, setLanguageExtension] = useState();
|
|
491
|
+
let t0;
|
|
492
|
+
$[0] !== codeConfig?.codeModes || $[1] !== mode ? (t0 = () => {
|
|
493
|
+
const codeMode = [...codeConfig?.codeModes ?? [], ...defaultCodeModes].find((m) => m.name === mode);
|
|
494
|
+
codeMode?.loader || console.warn(`Found no codeMode for language mode ${mode}, syntax highlighting will be disabled.`);
|
|
495
|
+
let active = !0;
|
|
496
|
+
return Promise.resolve(codeMode?.loader()).then((extension) => {
|
|
497
|
+
active && setLanguageExtension(extension);
|
|
498
|
+
}).catch((e) => {
|
|
499
|
+
console.error(`Failed to load language mode ${mode}`, e), active && setLanguageExtension(void 0);
|
|
500
|
+
}), () => {
|
|
501
|
+
active = !1;
|
|
502
|
+
};
|
|
503
|
+
}, $[0] = codeConfig?.codeModes, $[1] = mode, $[2] = t0) : t0 = $[2];
|
|
504
|
+
let t1;
|
|
505
|
+
return $[3] !== codeConfig || $[4] !== mode ? (t1 = [mode, codeConfig], $[3] = codeConfig, $[4] = mode, $[5] = t1) : t1 = $[5], useEffect(t0, t1), languageExtension;
|
|
506
|
+
}
|
|
507
|
+
export {
|
|
508
|
+
CodeMirrorProxy as default
|
|
509
|
+
};
|
|
510
|
+
//# sourceMappingURL=CodeMirrorProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeMirrorProxy.js","sources":["../../src/codemirror/defaultCodeModes.ts","../../src/codemirror/extensions/backwardsCompatibleTone.ts","../../src/codemirror/extensions/highlightLineExtension.ts","../../src/codemirror/extensions/theme.ts","../../src/codemirror/extensions/useCodeMirrorTheme.ts","../../src/codemirror/extensions/useFontSize.ts","../../src/codemirror/CodeMirrorProxy.tsx"],"sourcesContent":["import type {Extension} from '@codemirror/state'\n\nimport {StreamLanguage} from '@codemirror/language'\n\nexport interface CodeMode {\n name: string\n loader: ModeLoader\n}\nexport type ModeLoader = () => Promise<Extension | undefined> | Extension | undefined\n\nexport const defaultCodeModes: CodeMode[] = [\n {\n name: 'groq',\n loader: () =>\n import('@codemirror/lang-javascript').then(({javascriptLanguage}) => javascriptLanguage),\n },\n {\n name: 'javascript',\n loader: () =>\n import('@codemirror/lang-javascript').then(({javascript}) => javascript({jsx: false})),\n },\n {\n name: 'jsx',\n loader: () =>\n import('@codemirror/lang-javascript').then(({javascript}) => javascript({jsx: true})),\n },\n {\n name: 'typescript',\n loader: () =>\n import('@codemirror/lang-javascript').then(({javascript}) =>\n javascript({jsx: false, typescript: true}),\n ),\n },\n {\n name: 'tsx',\n loader: () =>\n import('@codemirror/lang-javascript').then(({javascript}) =>\n javascript({jsx: true, typescript: true}),\n ),\n },\n {name: 'php', loader: () => import('@codemirror/lang-php').then(({php}) => php())},\n {name: 'sql', loader: () => import('@codemirror/lang-sql').then(({sql}) => sql())},\n {\n name: 'mysql',\n loader: () => import('@codemirror/lang-sql').then(({sql, MySQL}) => sql({dialect: MySQL})),\n },\n {name: 'json', loader: () => import('@codemirror/lang-json').then(({json}) => json())},\n {\n name: 'markdown',\n loader: () => import('@codemirror/lang-markdown').then(({markdown}) => markdown()),\n },\n {name: 'java', loader: () => import('@codemirror/lang-java').then(({java}) => java())},\n {name: 'html', loader: () => import('@codemirror/lang-html').then(({html}) => html())},\n {\n name: 'csharp',\n loader: () =>\n import('@codemirror/legacy-modes/mode/clike').then(({csharp}) =>\n StreamLanguage.define(csharp),\n ),\n },\n {\n name: 'sh',\n loader: () =>\n import('@codemirror/legacy-modes/mode/shell').then(({shell}) => StreamLanguage.define(shell)),\n },\n {\n name: 'css',\n loader: () =>\n import('@codemirror/legacy-modes/mode/css').then(({css}) => StreamLanguage.define(css)),\n },\n {\n name: 'scss',\n loader: () =>\n import('@codemirror/legacy-modes/mode/css').then(({css}) => StreamLanguage.define(css)),\n },\n {\n name: 'sass',\n loader: () =>\n import('@codemirror/legacy-modes/mode/sass').then(({sass}) => StreamLanguage.define(sass)),\n },\n {\n name: 'ruby',\n loader: () =>\n import('@codemirror/legacy-modes/mode/ruby').then(({ruby}) => StreamLanguage.define(ruby)),\n },\n {\n name: 'python',\n loader: () =>\n import('@codemirror/legacy-modes/mode/python').then(({python}) =>\n StreamLanguage.define(python),\n ),\n },\n {\n name: 'xml',\n loader: () =>\n import('@codemirror/legacy-modes/mode/xml').then(({xml}) => StreamLanguage.define(xml)),\n },\n {\n name: 'yaml',\n loader: () =>\n import('@codemirror/legacy-modes/mode/yaml').then(({yaml}) => StreamLanguage.define(yaml)),\n },\n {\n name: 'golang',\n loader: () =>\n import('@codemirror/legacy-modes/mode/go').then(({go}) => StreamLanguage.define(go)),\n },\n {name: 'text', loader: () => undefined},\n {name: 'batch', loader: () => undefined},\n]\n","import type {ThemeContextValue} from '@sanity/ui'\n\n/**\n * `@sanity/ui@v2.9` introduced two new tones; \"neutral\" and \"suggest\",\n * which maps to \"default\" and \"primary\" respectively in the old theme.\n * This function returns the \"backwards compatible\" tone value.\n *\n * @returns The tone value that is backwards compatible with the old theme.\n * @internal\n */\nexport function getBackwardsCompatibleTone(\n themeCtx: ThemeContextValue,\n): Exclude<ThemeContextValue['tone'], 'neutral' | 'suggest'> {\n if (themeCtx.tone !== 'neutral' && themeCtx.tone !== 'suggest') {\n return themeCtx.tone\n }\n\n return themeCtx.tone === 'neutral' ? 'default' : 'primary'\n}\n","import type {ThemeContextValue} from '@sanity/ui'\n\nimport {type Extension, StateEffect, StateField} from '@codemirror/state'\nimport {Decoration, type DecorationSet, EditorView, lineNumbers} from '@codemirror/view'\nimport {rgba} from '@sanity/ui/theme'\n\nimport {getBackwardsCompatibleTone} from './backwardsCompatibleTone'\n\nconst highlightLineClass = 'cm-highlight-line'\n\nexport const addLineHighlight = StateEffect.define<number>()\nexport const removeLineHighlight = StateEffect.define<number>()\n\nexport const lineHighlightField = StateField.define({\n create() {\n return Decoration.none\n },\n update(lines, tr) {\n lines = lines.map(tr.changes)\n for (const e of tr.effects) {\n if (e.is(addLineHighlight)) {\n lines = lines.update({add: [lineHighlightMark.range(e.value)]})\n }\n if (e.is(removeLineHighlight)) {\n lines = lines.update({\n filter: (from) => {\n // removeLineHighlight value is lineStart for the highlight, so keep other effects\n return from !== e.value\n },\n })\n }\n }\n return lines\n },\n toJSON(value, state) {\n const highlightLines: number[] = []\n const iter = value.iter()\n while (iter.value) {\n const lineNumber = state.doc.lineAt(iter.from).number\n if (!highlightLines.includes(lineNumber)) {\n highlightLines.push(lineNumber)\n }\n iter.next()\n }\n return highlightLines\n },\n fromJSON(value: number[], state) {\n const lines = state.doc.lines\n const highlights = value\n .filter((line) => line <= lines) // one-indexed\n .map((line) => lineHighlightMark.range(state.doc.line(line).from))\n highlights.sort((a, b) => a.from - b.from)\n try {\n return Decoration.none.update({\n add: highlights,\n })\n } catch (e) {\n console.error(e)\n return Decoration.none\n }\n },\n provide: (f) => EditorView.decorations.from(f),\n})\n\nconst lineHighlightMark = Decoration.line({\n class: highlightLineClass,\n})\n\nexport const highlightState: {\n [prop: string]: StateField<DecorationSet>\n} = {\n highlight: lineHighlightField,\n}\n\nexport interface HighlightLineConfig {\n onHighlightChange?: (lines: number[]) => void\n readOnly?: boolean\n theme: ThemeContextValue\n}\n\nfunction createCodeMirrorTheme(options: {themeCtx: ThemeContextValue}) {\n const {themeCtx} = options\n\n const fallbackTone = getBackwardsCompatibleTone(themeCtx)\n\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n const light = {color: themeCtx.theme.color.light[fallbackTone]}\n\n return EditorView.baseTheme({\n '.cm-lineNumbers': {\n cursor: 'default',\n },\n '.cm-line.cm-line': {\n position: 'relative',\n },\n\n // need set background with pseudoelement so it does not render over selection color\n [`.${highlightLineClass}::before`]: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: -3,\n content: \"''\",\n boxSizing: 'border-box',\n },\n [`&dark .${highlightLineClass}::before`]: {\n background: rgba(dark.color.muted.caution.pressed.bg, 0.5),\n },\n [`&light .${highlightLineClass}::before`]: {\n background: rgba(light.color.muted.caution.pressed.bg, 0.75),\n },\n })\n}\n\nexport const highlightLine = (config: HighlightLineConfig): Extension => {\n const highlightTheme = createCodeMirrorTheme({themeCtx: config.theme})\n\n return [\n lineHighlightField,\n config.readOnly\n ? []\n : lineNumbers({\n domEventHandlers: {\n mousedown: (editorView, lineInfo) => {\n // Determine if the line for the clicked gutter line number has highlighted state or not\n const line = editorView.state.doc.lineAt(lineInfo.from)\n let isHighlighted = false\n editorView.state\n .field(lineHighlightField)\n .between(line.from, line.to, (_from, _to, value) => {\n if (value) {\n isHighlighted = true\n return false // stop iteration\n }\n return undefined\n })\n\n if (isHighlighted) {\n editorView.dispatch({effects: removeLineHighlight.of(line.from)})\n } else {\n editorView.dispatch({effects: addLineHighlight.of(line.from)})\n }\n if (config?.onHighlightChange) {\n config.onHighlightChange(editorView.state.toJSON(highlightState).highlight)\n }\n return true\n },\n },\n }),\n highlightTheme,\n ]\n}\n\n/**\n * Adds and removes highlights to the provided view using highlightLines\n * @param view\n * @param highlightLines\n */\nexport function setHighlightedLines(view: EditorView, highlightLines: number[]): void {\n const doc = view.state.doc\n const lines = doc.lines\n //1-based line numbers\n const allLineNumbers = Array.from({length: lines}, (_x, i) => i + 1)\n view.dispatch({\n effects: allLineNumbers.map((lineNumber) => {\n const line = doc.line(lineNumber)\n if (highlightLines?.includes(lineNumber)) {\n return addLineHighlight.of(line.from)\n }\n return removeLineHighlight.of(line.from)\n }),\n })\n}\n","import type {Extension} from '@codemirror/state'\n\nimport {EditorView} from '@codemirror/view'\nimport {useRootTheme} from '@sanity/ui'\nimport {rgba} from '@sanity/ui/theme'\nimport {useMemo} from 'react'\n\nimport {getBackwardsCompatibleTone} from './backwardsCompatibleTone'\n\nexport function useThemeExtension(): Extension {\n const themeCtx = useRootTheme()\n\n return useMemo(() => {\n const fallbackTone = getBackwardsCompatibleTone(themeCtx)\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n const light = {color: themeCtx.theme.color.light[fallbackTone]}\n\n return EditorView.baseTheme({\n '&.cm-editor': {\n height: '100%',\n },\n '&.cm-editor.cm-focused': {\n outline: 'none',\n },\n\n // Matching brackets\n '&.cm-editor.cm-focused .cm-matchingBracket': {\n backgroundColor: 'transparent',\n },\n '&.cm-editor.cm-focused .cm-nonmatchingBracket': {\n backgroundColor: 'transparent',\n },\n '&dark.cm-editor.cm-focused .cm-matchingBracket': {\n outline: `1px solid ${dark.color.base.border}`,\n },\n '&dark.cm-editor.cm-focused .cm-nonmatchingBracket': {\n outline: `1px solid ${dark.color.base.border}`,\n },\n '&light.cm-editor.cm-focused .cm-matchingBracket': {\n outline: `1px solid ${light.color.base.border}`,\n },\n '&light.cm-editor.cm-focused .cm-nonmatchingBracket': {\n outline: `1px solid ${light.color.base.border}`,\n },\n\n // Size and padding of gutter\n '& .cm-lineNumbers .cm-gutterElement': {\n minWidth: `32px !important`,\n padding: `0 8px !important`,\n },\n '& .cm-gutter.cm-foldGutter': {\n width: `0px !important`,\n },\n\n // Color of gutter\n '&dark .cm-gutters': {\n color: `${rgba(dark.color.card.enabled.code.fg, 0.5)} !important`,\n borderRight: `1px solid ${rgba(dark.color.base.border, 0.5)}`,\n },\n '&light .cm-gutters': {\n color: `${rgba(light.color.card.enabled.code.fg, 0.5)} !important`,\n borderRight: `1px solid ${rgba(light.color.base.border, 0.5)}`,\n },\n })\n }, [themeCtx])\n}\n","import type {Extension} from '@codemirror/state'\n\nimport {tags as t} from '@lezer/highlight'\nimport {useTheme} from '@sanity/ui'\nimport {rgba} from '@sanity/ui/theme'\nimport {createTheme} from '@uiw/codemirror-themes'\nimport {useMemo} from 'react'\n\nexport function useCodeMirrorTheme(): Extension {\n const theme = useTheme()\n\n return useMemo(() => {\n const {code: codeFont} = theme.sanity.fonts\n const {base, card, dark, syntax} = theme.sanity.color\n\n return createTheme({\n theme: dark ? 'dark' : 'light',\n settings: {\n background: card.enabled.bg,\n foreground: card.enabled.code.fg,\n lineHighlight: card.enabled.bg,\n fontFamily: codeFont.family,\n caret: base.focusRing,\n selection: rgba(base.focusRing, 0.2),\n selectionMatch: rgba(base.focusRing, 0.4),\n gutterBackground: card.disabled.bg,\n gutterForeground: card.disabled.code.fg,\n gutterActiveForeground: card.enabled.fg,\n },\n styles: [\n {\n tag: [t.heading, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6],\n color: card.enabled.fg,\n },\n {tag: t.angleBracket, color: card.enabled.code.fg},\n {tag: t.atom, color: syntax.keyword},\n {tag: t.attributeName, color: syntax.attrName},\n {tag: t.bool, color: syntax.boolean},\n {tag: t.bracket, color: card.enabled.code.fg},\n {tag: t.className, color: syntax.className},\n {tag: t.comment, color: syntax.comment},\n {tag: t.definition(t.typeName), color: syntax.function},\n {\n tag: [\n t.definition(t.variableName),\n t.function(t.variableName),\n t.className,\n t.attributeName,\n ],\n color: syntax.function,\n },\n {tag: [t.function(t.propertyName), t.propertyName], color: syntax.function},\n {tag: t.keyword, color: syntax.keyword},\n {tag: t.null, color: syntax.number},\n {tag: t.number, color: syntax.number},\n {tag: t.meta, color: card.enabled.code.fg},\n {tag: t.operator, color: syntax.operator},\n {tag: t.propertyName, color: syntax.property},\n {tag: [t.string, t.special(t.brace)], color: syntax.string},\n {tag: t.tagName, color: syntax.className},\n {tag: t.typeName, color: syntax.keyword},\n ],\n })\n }, [theme])\n}\n","import type {Extension} from '@codemirror/state'\n\nimport {EditorView} from '@codemirror/view'\nimport {rem, useTheme} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nexport function useFontSizeExtension(props: {fontSize: number}): Extension {\n const {fontSize: fontSizeProp} = props\n const theme = useTheme()\n\n return useMemo(() => {\n const {code: codeFont} = theme.sanity.fonts\n const {fontSize, lineHeight} = codeFont.sizes[fontSizeProp] || codeFont.sizes[2]!\n\n return EditorView.baseTheme({\n '&': {\n fontSize: rem(fontSize),\n },\n\n '& .cm-scroller': {\n lineHeight: `${lineHeight / fontSize} !important`,\n },\n })\n }, [fontSizeProp, theme])\n}\n","import type {Extension} from '@codemirror/state'\n\nimport {EditorView} from '@codemirror/view'\nimport {useRootTheme} from '@sanity/ui'\nimport CodeMirror, {type ReactCodeMirrorProps, type ReactCodeMirrorRef} from '@uiw/react-codemirror'\nimport {forwardRef, useCallback, useContext, useEffect, useMemo, useState} from 'react'\n\nimport {CodeInputConfigContext} from './CodeModeContext'\nimport {defaultCodeModes} from './defaultCodeModes'\nimport {\n highlightLine,\n highlightState,\n setHighlightedLines,\n} from './extensions/highlightLineExtension'\nimport {useThemeExtension} from './extensions/theme'\nimport {useCodeMirrorTheme} from './extensions/useCodeMirrorTheme'\nimport {useFontSizeExtension} from './extensions/useFontSize'\n\nexport interface CodeMirrorProps extends ReactCodeMirrorProps {\n highlightLines?: number[]\n languageMode?: string\n onHighlightChange?: (lines: number[]) => void\n}\n\n/**\n * CodeMirrorProxy is a wrapper component around CodeMirror that we lazy load to reduce initial bundle size.\n *\n * It is also responsible for integrating any CodeMirror extensions.\n */\nconst CodeMirrorProxy = forwardRef<ReactCodeMirrorRef, CodeMirrorProps>(\n function CodeMirrorProxy(props, ref) {\n const {\n basicSetup: basicSetupProp,\n highlightLines,\n languageMode,\n onHighlightChange,\n readOnly,\n value,\n ...codeMirrorProps\n } = props\n\n const themeCtx = useRootTheme()\n const codeMirrorTheme = useCodeMirrorTheme()\n const [editorView, setEditorView] = useState<EditorView | undefined>(undefined)\n\n // Resolve extensions\n const themeExtension = useThemeExtension()\n const fontSizeExtension = useFontSizeExtension({fontSize: 1})\n const languageExtension = useLanguageExtension(languageMode)\n const highlightLineExtension = useMemo(\n () =>\n highlightLine({\n onHighlightChange,\n readOnly,\n theme: themeCtx,\n }),\n [onHighlightChange, readOnly, themeCtx],\n )\n\n const extensions = useMemo(() => {\n const baseExtensions = [\n themeExtension,\n fontSizeExtension,\n highlightLineExtension,\n EditorView.lineWrapping,\n ]\n if (languageExtension) {\n return [...baseExtensions, languageExtension]\n }\n return baseExtensions\n }, [fontSizeExtension, highlightLineExtension, languageExtension, themeExtension])\n\n useEffect(() => {\n if (editorView) {\n setHighlightedLines(editorView, highlightLines ?? [])\n }\n }, [editorView, highlightLines, value])\n\n const [initialState] = useState(() => {\n return {\n json: {\n doc: value ?? '',\n selection: {\n main: 0,\n ranges: [{anchor: 0, head: 0}],\n },\n highlight: highlightLines ?? [],\n },\n fields: highlightState,\n }\n })\n\n const handleCreateEditor = useCallback((view: EditorView) => {\n setEditorView(view)\n }, [])\n\n const basicSetup = useMemo(\n () =>\n basicSetupProp ?? {\n highlightActiveLine: false,\n },\n [basicSetupProp],\n )\n\n return (\n <CodeMirror\n {...codeMirrorProps}\n value={value}\n ref={ref}\n extensions={extensions}\n theme={codeMirrorTheme}\n onCreateEditor={handleCreateEditor}\n initialState={initialState}\n basicSetup={basicSetup}\n />\n )\n },\n)\n\nfunction useLanguageExtension(mode?: string) {\n const codeConfig = useContext(CodeInputConfigContext)\n\n const [languageExtension, setLanguageExtension] = useState<Extension | undefined>()\n\n useEffect(() => {\n const customModes = codeConfig?.codeModes ?? []\n const modes = [...customModes, ...defaultCodeModes]\n\n const codeMode = modes.find((m) => m.name === mode)\n if (!codeMode?.loader) {\n console.warn(\n `Found no codeMode for language mode ${mode}, syntax highlighting will be disabled.`,\n )\n }\n let active = true\n Promise.resolve(codeMode?.loader())\n .then((extension) => {\n if (active) {\n setLanguageExtension(extension)\n }\n return undefined\n })\n .catch((e) => {\n console.error(`Failed to load language mode ${mode}`, e)\n if (active) {\n setLanguageExtension(undefined)\n }\n })\n return () => {\n active = false\n }\n }, [mode, codeConfig])\n\n return languageExtension\n}\n\nexport default CodeMirrorProxy\n"],"names":["defaultCodeModes","name","loader","then","javascriptLanguage","javascript","jsx","typescript","php","sql","MySQL","dialect","json","markdown","java","html","csharp","StreamLanguage","define","shell","css","sass","ruby","python","xml","yaml","go","getBackwardsCompatibleTone","themeCtx","tone","highlightLineClass","addLineHighlight","StateEffect","removeLineHighlight","lineHighlightField","StateField","create","Decoration","none","update","lines","tr","map","changes","e","effects","is","add","lineHighlightMark","range","value","filter","from","toJSON","state","highlightLines","iter","lineNumber","doc","lineAt","number","includes","push","next","fromJSON","highlights","line","sort","a","b","console","error","provide","f","EditorView","decorations","class","highlightState","highlight","createCodeMirrorTheme","options","fallbackTone","dark","color","theme","light","baseTheme","cursor","position","top","bottom","left","right","zIndex","content","boxSizing","background","rgba","muted","caution","pressed","bg","highlightLine","config","highlightTheme","readOnly","lineNumbers","domEventHandlers","mousedown","editorView","lineInfo","isHighlighted","field","between","to","_from","_to","dispatch","of","onHighlightChange","setHighlightedLines","view","allLineNumbers","Array","length","_x","i","useThemeExtension","$","_c","useRootTheme","t0","t1","t2","height","outline","backgroundColor","base","border","minWidth","padding","width","card","enabled","code","fg","borderRight","useCodeMirrorTheme","useTheme","codeFont","sanity","fonts","syntax","focusRing","disabled","family","attrName","boolean","className","comment","function","keyword","operator","property","string","createTheme","settings","foreground","lineHighlight","fontFamily","caret","selection","selectionMatch","gutterBackground","gutterForeground","gutterActiveForeground","styles","tag","t","heading","heading2","heading3","heading4","heading5","heading6","angleBracket","atom","attributeName","bool","bracket","definition","typeName","variableName","propertyName","null","meta","special","brace","tagName","useFontSizeExtension","props","fontSize","fontSizeProp","lineHeight","sizes","rem","CodeMirrorProxy","forwardRef","ref","basicSetupProp","codeMirrorProps","languageMode","basicSetup","codeMirrorTheme","setEditorView","useState","undefined","themeExtension","for","fontSizeExtension","languageExtension","useLanguageExtension","highlightLineExtension","bb0","t3","lineWrapping","baseExtensions","t4","extensions","useEffect","t5","main","ranges","anchor","head","fields","initialState","t6","Symbol","handleCreateEditor","t7","highlightActiveLine","t8","mode","codeConfig","useContext","CodeInputConfigContext","setLanguageExtension","codeModes","codeMode","find","m","warn","active","Promise","resolve","extension","catch"],"mappings":"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"}
|