@sanity/code-input 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/lib/_chunks-cjs/CodeMirrorProxy.cjs +429 -0
  2. package/lib/_chunks-cjs/CodeMirrorProxy.cjs.map +1 -0
  3. package/lib/_chunks-cjs/index.cjs +5971 -0
  4. package/lib/_chunks-cjs/index.cjs.map +1 -0
  5. package/lib/_chunks-es/CodeMirrorProxy.js +417 -0
  6. package/lib/_chunks-es/CodeMirrorProxy.js.map +1 -0
  7. package/lib/_chunks-es/index.js +5970 -0
  8. package/lib/_chunks-es/index.js.map +1 -0
  9. package/lib/_legacy/CodeMirrorProxy.esm.js +417 -0
  10. package/lib/_legacy/CodeMirrorProxy.esm.js.map +1 -0
  11. package/lib/_legacy/index.esm.js +5970 -0
  12. package/lib/_legacy/index.esm.js.map +1 -0
  13. package/lib/index.cjs +3 -6
  14. package/lib/index.cjs.map +1 -1
  15. package/lib/index.d.cts +121 -0
  16. package/lib/index.d.ts +2 -2
  17. package/lib/index.esm.js +8 -0
  18. package/lib/index.esm.js.map +1 -0
  19. package/lib/index.js +7 -1
  20. package/lib/index.js.map +1 -1
  21. package/package.json +37 -42
  22. package/src/CodeInput.tsx +4 -3
  23. package/src/LanguageField.tsx +2 -1
  24. package/src/LanguageInput.tsx +3 -2
  25. package/src/PreviewCode.tsx +5 -4
  26. package/src/codemirror/CodeMirrorProxy.tsx +7 -6
  27. package/src/codemirror/CodeModeContext.tsx +2 -1
  28. package/src/codemirror/defaultCodeModes.ts +1 -1
  29. package/src/codemirror/extensions/backwardsCompatibleTone.ts +19 -0
  30. package/src/codemirror/extensions/highlightLineExtension.ts +12 -6
  31. package/src/codemirror/extensions/theme.ts +8 -4
  32. package/src/codemirror/extensions/useCodeMirrorTheme.ts +5 -4
  33. package/src/codemirror/extensions/useFontSize.ts +1 -1
  34. package/src/codemirror/useCodeMirror-client.test.tsx +10 -7
  35. package/src/codemirror/useCodeMirror-server.test.tsx +1 -0
  36. package/src/codemirror/useLanguageMode.tsx +11 -3
  37. package/src/index.ts +4 -7
  38. package/src/plugin.tsx +3 -2
  39. package/src/schema.tsx +3 -2
  40. package/lib/_chunks/CodeMirrorProxy-A8RWnbXx.js +0 -615
  41. package/lib/_chunks/CodeMirrorProxy-A8RWnbXx.js.map +0 -1
  42. package/lib/_chunks/CodeMirrorProxy-tci8hAnf.cjs +0 -623
  43. package/lib/_chunks/CodeMirrorProxy-tci8hAnf.cjs.map +0 -1
  44. package/lib/_chunks/index-0LQQ9tED.cjs +0 -4686
  45. package/lib/_chunks/index-0LQQ9tED.cjs.map +0 -1
  46. package/lib/_chunks/index-4cT0QYPN.js +0 -4672
  47. package/lib/_chunks/index-4cT0QYPN.js.map +0 -1
  48. package/lib/index.cjs.js +0 -7
  49. package/src/__workshop__/index.ts +0 -22
  50. package/src/__workshop__/lazy.tsx +0 -54
  51. package/src/__workshop__/preview.tsx +0 -24
  52. package/src/__workshop__/props.tsx +0 -24
@@ -0,0 +1,429 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __copyProps = (to, from, except, desc) => {
8
+ if (from && typeof from == "object" || typeof from == "function")
9
+ for (let key of __getOwnPropNames(from))
10
+ !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ return to;
12
+ };
13
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
14
+ // If the importer is in node compatibility mode or this is not an ESM
15
+ // file that has been converted to a CommonJS file using a Babel-
16
+ // compatible transform (i.e. "__esModule" has not been set), then set
17
+ // "default" to the CommonJS "module.exports" for node compatibility.
18
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: !0 }) : target,
19
+ mod
20
+ ));
21
+ var jsxRuntime = require("react/jsx-runtime"), view = require("@codemirror/view"), ui = require("@sanity/ui"), CodeMirror = require("@uiw/react-codemirror"), react = require("react"), index = require("./index.cjs"), language = require("@codemirror/language"), state = require("@codemirror/state"), theme = require("@sanity/ui/theme"), highlight = require("@lezer/highlight"), codemirrorThemes = require("@uiw/codemirror-themes");
22
+ function _interopDefaultCompat(e) {
23
+ return e && typeof e == "object" && "default" in e ? e : { default: e };
24
+ }
25
+ var CodeMirror__default = /* @__PURE__ */ _interopDefaultCompat(CodeMirror);
26
+ const defaultCodeModes = [
27
+ {
28
+ name: "groq",
29
+ loader: () => import("@codemirror/lang-javascript").then(({ javascriptLanguage }) => javascriptLanguage)
30
+ },
31
+ {
32
+ name: "javascript",
33
+ loader: () => import("@codemirror/lang-javascript").then(({ javascript }) => javascript({ jsx: !1 }))
34
+ },
35
+ {
36
+ name: "jsx",
37
+ loader: () => import("@codemirror/lang-javascript").then(({ javascript }) => javascript({ jsx: !0 }))
38
+ },
39
+ {
40
+ name: "typescript",
41
+ loader: () => import("@codemirror/lang-javascript").then(
42
+ ({ javascript }) => javascript({ jsx: !1, typescript: !0 })
43
+ )
44
+ },
45
+ {
46
+ name: "tsx",
47
+ loader: () => import("@codemirror/lang-javascript").then(
48
+ ({ javascript }) => javascript({ jsx: !0, typescript: !0 })
49
+ )
50
+ },
51
+ { name: "php", loader: () => import("@codemirror/lang-php").then(({ php }) => php()) },
52
+ { name: "sql", loader: () => import("@codemirror/lang-sql").then(({ sql }) => sql()) },
53
+ {
54
+ name: "mysql",
55
+ loader: () => import("@codemirror/lang-sql").then(({ sql, MySQL }) => sql({ dialect: MySQL }))
56
+ },
57
+ { name: "json", loader: () => import("@codemirror/lang-json").then(({ json }) => json()) },
58
+ {
59
+ name: "markdown",
60
+ loader: () => import("@codemirror/lang-markdown").then(({ markdown }) => markdown())
61
+ },
62
+ { name: "java", loader: () => import("@codemirror/lang-java").then(({ java }) => java()) },
63
+ { name: "html", loader: () => import("@codemirror/lang-html").then(({ html }) => html()) },
64
+ {
65
+ name: "csharp",
66
+ loader: () => import("@codemirror/legacy-modes/mode/clike").then(
67
+ ({ csharp }) => language.StreamLanguage.define(csharp)
68
+ )
69
+ },
70
+ {
71
+ name: "sh",
72
+ loader: () => import("@codemirror/legacy-modes/mode/shell").then(({ shell }) => language.StreamLanguage.define(shell))
73
+ },
74
+ {
75
+ name: "css",
76
+ loader: () => import("@codemirror/legacy-modes/mode/css").then(({ css }) => language.StreamLanguage.define(css))
77
+ },
78
+ {
79
+ name: "scss",
80
+ loader: () => import("@codemirror/legacy-modes/mode/css").then(({ css }) => language.StreamLanguage.define(css))
81
+ },
82
+ {
83
+ name: "sass",
84
+ loader: () => import("@codemirror/legacy-modes/mode/sass").then(({ sass }) => language.StreamLanguage.define(sass))
85
+ },
86
+ {
87
+ name: "ruby",
88
+ loader: () => import("@codemirror/legacy-modes/mode/ruby").then(({ ruby }) => language.StreamLanguage.define(ruby))
89
+ },
90
+ {
91
+ name: "python",
92
+ loader: () => import("@codemirror/legacy-modes/mode/python").then(
93
+ ({ python }) => language.StreamLanguage.define(python)
94
+ )
95
+ },
96
+ {
97
+ name: "xml",
98
+ loader: () => import("@codemirror/legacy-modes/mode/xml").then(({ xml }) => language.StreamLanguage.define(xml))
99
+ },
100
+ {
101
+ name: "yaml",
102
+ loader: () => import("@codemirror/legacy-modes/mode/yaml").then(({ yaml }) => language.StreamLanguage.define(yaml))
103
+ },
104
+ {
105
+ name: "golang",
106
+ loader: () => import("@codemirror/legacy-modes/mode/go").then(({ go }) => language.StreamLanguage.define(go))
107
+ },
108
+ { name: "text", loader: () => {
109
+ } },
110
+ { name: "batch", loader: () => {
111
+ } }
112
+ ];
113
+ function getBackwardsCompatibleTone(themeCtx) {
114
+ return themeCtx.tone !== "neutral" && themeCtx.tone !== "suggest" ? themeCtx.tone : themeCtx.tone === "neutral" ? "default" : "primary";
115
+ }
116
+ const highlightLineClass = "cm-highlight-line", addLineHighlight = state.StateEffect.define(), removeLineHighlight = state.StateEffect.define(), lineHighlightField = state.StateField.define({
117
+ create() {
118
+ return view.Decoration.none;
119
+ },
120
+ update(lines, tr) {
121
+ lines = lines.map(tr.changes);
122
+ for (const e of tr.effects)
123
+ e.is(addLineHighlight) && (lines = lines.update({ add: [lineHighlightMark.range(e.value)] })), e.is(removeLineHighlight) && (lines = lines.update({
124
+ filter: (from) => from !== e.value
125
+ }));
126
+ return lines;
127
+ },
128
+ toJSON(value, state2) {
129
+ const highlightLines = [], iter = value.iter();
130
+ for (; iter.value; ) {
131
+ const lineNumber = state2.doc.lineAt(iter.from).number;
132
+ highlightLines.includes(lineNumber) || highlightLines.push(lineNumber), iter.next();
133
+ }
134
+ return highlightLines;
135
+ },
136
+ fromJSON(value, state2) {
137
+ const lines = state2.doc.lines, highlights = value.filter((line) => line <= lines).map((line) => lineHighlightMark.range(state2.doc.line(line).from));
138
+ highlights.sort((a, b) => a.from - b.from);
139
+ try {
140
+ return view.Decoration.none.update({
141
+ add: highlights
142
+ });
143
+ } catch (e) {
144
+ return console.error(e), view.Decoration.none;
145
+ }
146
+ },
147
+ provide: (f) => view.EditorView.decorations.from(f)
148
+ }), lineHighlightMark = view.Decoration.line({
149
+ class: highlightLineClass
150
+ }), highlightState = {
151
+ highlight: lineHighlightField
152
+ };
153
+ function createCodeMirrorTheme(options) {
154
+ const { themeCtx } = options, fallbackTone = getBackwardsCompatibleTone(themeCtx), dark = { color: themeCtx.theme.color.dark[fallbackTone] }, light = { color: themeCtx.theme.color.light[fallbackTone] };
155
+ return view.EditorView.baseTheme({
156
+ ".cm-lineNumbers": {
157
+ cursor: "default"
158
+ },
159
+ ".cm-line.cm-line": {
160
+ position: "relative"
161
+ },
162
+ // need set background with pseudoelement so it does not render over selection color
163
+ [`.${highlightLineClass}::before`]: {
164
+ position: "absolute",
165
+ top: 0,
166
+ bottom: 0,
167
+ left: 0,
168
+ right: 0,
169
+ zIndex: -3,
170
+ content: "''",
171
+ boxSizing: "border-box"
172
+ },
173
+ [`&dark .${highlightLineClass}::before`]: {
174
+ background: theme.rgba(dark.color.muted.caution.pressed.bg, 0.5)
175
+ },
176
+ [`&light .${highlightLineClass}::before`]: {
177
+ background: theme.rgba(light.color.muted.caution.pressed.bg, 0.75)
178
+ }
179
+ });
180
+ }
181
+ const highlightLine = (config) => {
182
+ const highlightTheme = createCodeMirrorTheme({ themeCtx: config.theme });
183
+ return [
184
+ lineHighlightField,
185
+ config.readOnly ? [] : view.lineNumbers({
186
+ domEventHandlers: {
187
+ mousedown: (editorView, lineInfo) => {
188
+ const line = editorView.state.doc.lineAt(lineInfo.from);
189
+ let isHighlighted = !1;
190
+ return editorView.state.field(lineHighlightField).between(line.from, line.to, (from, to, value) => {
191
+ if (value)
192
+ return isHighlighted = !0, !1;
193
+ }), isHighlighted ? editorView.dispatch({ effects: removeLineHighlight.of(line.from) }) : editorView.dispatch({ effects: addLineHighlight.of(line.from) }), config != null && config.onHighlightChange && config.onHighlightChange(editorView.state.toJSON(highlightState).highlight), !0;
194
+ }
195
+ }
196
+ }),
197
+ highlightTheme
198
+ ];
199
+ };
200
+ function setHighlightedLines(view2, highlightLines) {
201
+ const doc = view2.state.doc, lines = doc.lines, allLineNumbers = Array.from({ length: lines }, (x, i) => i + 1);
202
+ view2.dispatch({
203
+ effects: allLineNumbers.map((lineNumber) => {
204
+ const line = doc.line(lineNumber);
205
+ return highlightLines != null && highlightLines.includes(lineNumber) ? addLineHighlight.of(line.from) : removeLineHighlight.of(line.from);
206
+ })
207
+ });
208
+ }
209
+ function useThemeExtension() {
210
+ const themeCtx = ui.useRootTheme();
211
+ return react.useMemo(() => {
212
+ const fallbackTone = getBackwardsCompatibleTone(themeCtx), dark = { color: themeCtx.theme.color.dark[fallbackTone] }, light = { color: themeCtx.theme.color.light[fallbackTone] };
213
+ return view.EditorView.baseTheme({
214
+ "&.cm-editor": {
215
+ height: "100%"
216
+ },
217
+ "&.cm-editor.cm-focused": {
218
+ outline: "none"
219
+ },
220
+ // Matching brackets
221
+ "&.cm-editor.cm-focused .cm-matchingBracket": {
222
+ backgroundColor: "transparent"
223
+ },
224
+ "&.cm-editor.cm-focused .cm-nonmatchingBracket": {
225
+ backgroundColor: "transparent"
226
+ },
227
+ "&dark.cm-editor.cm-focused .cm-matchingBracket": {
228
+ outline: `1px solid ${dark.color.base.border}`
229
+ },
230
+ "&dark.cm-editor.cm-focused .cm-nonmatchingBracket": {
231
+ outline: `1px solid ${dark.color.base.border}`
232
+ },
233
+ "&light.cm-editor.cm-focused .cm-matchingBracket": {
234
+ outline: `1px solid ${light.color.base.border}`
235
+ },
236
+ "&light.cm-editor.cm-focused .cm-nonmatchingBracket": {
237
+ outline: `1px solid ${light.color.base.border}`
238
+ },
239
+ // Size and padding of gutter
240
+ "& .cm-lineNumbers .cm-gutterElement": {
241
+ minWidth: "32px !important",
242
+ padding: "0 8px !important"
243
+ },
244
+ "& .cm-gutter.cm-foldGutter": {
245
+ width: "0px !important"
246
+ },
247
+ // Color of gutter
248
+ "&dark .cm-gutters": {
249
+ color: `${theme.rgba(dark.color.card.enabled.code.fg, 0.5)} !important`,
250
+ borderRight: `1px solid ${theme.rgba(dark.color.base.border, 0.5)}`
251
+ },
252
+ "&light .cm-gutters": {
253
+ color: `${theme.rgba(light.color.card.enabled.code.fg, 0.5)} !important`,
254
+ borderRight: `1px solid ${theme.rgba(light.color.base.border, 0.5)}`
255
+ }
256
+ });
257
+ }, [themeCtx]);
258
+ }
259
+ function useCodeMirrorTheme() {
260
+ const theme$1 = ui.useTheme();
261
+ return react.useMemo(() => {
262
+ const { code: codeFont } = theme$1.sanity.fonts, { base, card, dark, syntax } = theme$1.sanity.color;
263
+ return codemirrorThemes.createTheme({
264
+ theme: dark ? "dark" : "light",
265
+ settings: {
266
+ background: card.enabled.bg,
267
+ foreground: card.enabled.code.fg,
268
+ lineHighlight: card.enabled.bg,
269
+ fontFamily: codeFont.family,
270
+ caret: base.focusRing,
271
+ selection: theme.rgba(base.focusRing, 0.2),
272
+ selectionMatch: theme.rgba(base.focusRing, 0.4),
273
+ gutterBackground: card.disabled.bg,
274
+ gutterForeground: card.disabled.code.fg,
275
+ gutterActiveForeground: card.enabled.fg
276
+ },
277
+ styles: [
278
+ {
279
+ tag: [highlight.tags.heading, highlight.tags.heading2, highlight.tags.heading3, highlight.tags.heading4, highlight.tags.heading5, highlight.tags.heading6],
280
+ color: card.enabled.fg
281
+ },
282
+ { tag: highlight.tags.angleBracket, color: card.enabled.code.fg },
283
+ { tag: highlight.tags.atom, color: syntax.keyword },
284
+ { tag: highlight.tags.attributeName, color: syntax.attrName },
285
+ { tag: highlight.tags.bool, color: syntax.boolean },
286
+ { tag: highlight.tags.bracket, color: card.enabled.code.fg },
287
+ { tag: highlight.tags.className, color: syntax.className },
288
+ { tag: highlight.tags.comment, color: syntax.comment },
289
+ { tag: highlight.tags.definition(highlight.tags.typeName), color: syntax.function },
290
+ {
291
+ tag: [
292
+ highlight.tags.definition(highlight.tags.variableName),
293
+ highlight.tags.function(highlight.tags.variableName),
294
+ highlight.tags.className,
295
+ highlight.tags.attributeName
296
+ ],
297
+ color: syntax.function
298
+ },
299
+ { tag: [highlight.tags.function(highlight.tags.propertyName), highlight.tags.propertyName], color: syntax.function },
300
+ { tag: highlight.tags.keyword, color: syntax.keyword },
301
+ { tag: highlight.tags.null, color: syntax.number },
302
+ { tag: highlight.tags.number, color: syntax.number },
303
+ { tag: highlight.tags.meta, color: card.enabled.code.fg },
304
+ { tag: highlight.tags.operator, color: syntax.operator },
305
+ { tag: highlight.tags.propertyName, color: syntax.property },
306
+ { tag: [highlight.tags.string, highlight.tags.special(highlight.tags.brace)], color: syntax.string },
307
+ { tag: highlight.tags.tagName, color: syntax.className },
308
+ { tag: highlight.tags.typeName, color: syntax.keyword }
309
+ ]
310
+ });
311
+ }, [theme$1]);
312
+ }
313
+ function useFontSizeExtension(props) {
314
+ const { fontSize: fontSizeProp } = props, theme2 = ui.useTheme();
315
+ return react.useMemo(() => {
316
+ const { code: codeFont } = theme2.sanity.fonts, { fontSize, lineHeight } = codeFont.sizes[fontSizeProp] || codeFont.sizes[2];
317
+ return view.EditorView.baseTheme({
318
+ "&": {
319
+ fontSize: ui.rem(fontSize)
320
+ },
321
+ "& .cm-scroller": {
322
+ lineHeight: `${lineHeight / fontSize} !important`
323
+ }
324
+ });
325
+ }, [fontSizeProp, theme2]);
326
+ }
327
+ var __defProp2 = Object.defineProperty, __defProps = Object.defineProperties, __getOwnPropDescs = Object.getOwnPropertyDescriptors, __getOwnPropSymbols = Object.getOwnPropertySymbols, __hasOwnProp2 = Object.prototype.hasOwnProperty, __propIsEnum = Object.prototype.propertyIsEnumerable, __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: !0, configurable: !0, writable: !0, value }) : obj[key] = value, __spreadValues = (a, b) => {
328
+ for (var prop in b || (b = {}))
329
+ __hasOwnProp2.call(b, prop) && __defNormalProp(a, prop, b[prop]);
330
+ if (__getOwnPropSymbols)
331
+ for (var prop of __getOwnPropSymbols(b))
332
+ __propIsEnum.call(b, prop) && __defNormalProp(a, prop, b[prop]);
333
+ return a;
334
+ }, __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)), __objRest = (source, exclude) => {
335
+ var target = {};
336
+ for (var prop in source)
337
+ __hasOwnProp2.call(source, prop) && exclude.indexOf(prop) < 0 && (target[prop] = source[prop]);
338
+ if (source != null && __getOwnPropSymbols)
339
+ for (var prop of __getOwnPropSymbols(source))
340
+ exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop) && (target[prop] = source[prop]);
341
+ return target;
342
+ };
343
+ const CodeMirrorProxy = react.forwardRef(
344
+ function(props, ref) {
345
+ const _a = props, {
346
+ basicSetup: basicSetupProp,
347
+ highlightLines,
348
+ languageMode,
349
+ onHighlightChange,
350
+ readOnly,
351
+ value
352
+ } = _a, codeMirrorProps = __objRest(_a, [
353
+ "basicSetup",
354
+ "highlightLines",
355
+ "languageMode",
356
+ "onHighlightChange",
357
+ "readOnly",
358
+ "value"
359
+ ]), themeCtx = ui.useRootTheme(), codeMirrorTheme = useCodeMirrorTheme(), [editorView, setEditorView] = react.useState(void 0), themeExtension = useThemeExtension(), fontSizeExtension = useFontSizeExtension({ fontSize: 1 }), languageExtension = useLanguageExtension(languageMode), highlightLineExtension = react.useMemo(
360
+ () => highlightLine({
361
+ onHighlightChange,
362
+ readOnly,
363
+ theme: themeCtx
364
+ }),
365
+ [onHighlightChange, readOnly, themeCtx]
366
+ ), extensions = react.useMemo(() => {
367
+ const baseExtensions = [
368
+ themeExtension,
369
+ fontSizeExtension,
370
+ highlightLineExtension,
371
+ view.EditorView.lineWrapping
372
+ ];
373
+ return languageExtension ? [...baseExtensions, languageExtension] : baseExtensions;
374
+ }, [fontSizeExtension, highlightLineExtension, languageExtension, themeExtension]);
375
+ react.useEffect(() => {
376
+ editorView && setHighlightedLines(editorView, highlightLines != null ? highlightLines : []);
377
+ }, [editorView, highlightLines, value]);
378
+ const initialState = react.useMemo(() => ({
379
+ json: {
380
+ doc: value != null ? value : "",
381
+ selection: {
382
+ main: 0,
383
+ ranges: [{ anchor: 0, head: 0 }]
384
+ },
385
+ highlight: highlightLines != null ? highlightLines : []
386
+ },
387
+ fields: highlightState
388
+ }), []), handleCreateEditor = react.useCallback((view2) => {
389
+ setEditorView(view2);
390
+ }, []), basicSetup = react.useMemo(
391
+ () => basicSetupProp != null ? basicSetupProp : {
392
+ highlightActiveLine: !1
393
+ },
394
+ [basicSetupProp]
395
+ );
396
+ return /* @__PURE__ */ jsxRuntime.jsx(
397
+ CodeMirror__default.default,
398
+ __spreadProps(__spreadValues({}, codeMirrorProps), {
399
+ value,
400
+ ref,
401
+ extensions,
402
+ theme: codeMirrorTheme,
403
+ onCreateEditor: handleCreateEditor,
404
+ initialState,
405
+ basicSetup
406
+ })
407
+ );
408
+ }
409
+ );
410
+ function useLanguageExtension(mode) {
411
+ const codeConfig = react.useContext(index.CodeInputConfigContext), [languageExtension, setLanguageExtension] = react.useState();
412
+ return react.useEffect(() => {
413
+ var _a;
414
+ const codeMode = [...(_a = codeConfig == null ? void 0 : codeConfig.codeModes) != null ? _a : [], ...defaultCodeModes].find((m) => m.name === mode);
415
+ codeMode != null && codeMode.loader || console.warn(
416
+ `Found no codeMode for language mode ${mode}, syntax highlighting will be disabled.`
417
+ );
418
+ let active = !0;
419
+ return Promise.resolve(codeMode == null ? void 0 : codeMode.loader()).then((extension) => {
420
+ active && setLanguageExtension(extension);
421
+ }).catch((e) => {
422
+ console.error(`Failed to load language mode ${mode}`, e), active && setLanguageExtension(void 0);
423
+ }), () => {
424
+ active = !1;
425
+ };
426
+ }, [mode, codeConfig]), languageExtension;
427
+ }
428
+ exports.default = CodeMirrorProxy;
429
+ //# sourceMappingURL=CodeMirrorProxy.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeMirrorProxy.cjs","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 {StreamLanguage} from '@codemirror/language'\nimport type {Extension} from '@codemirror/state'\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","/* eslint-disable no-param-reassign */\n\nimport {type Extension, StateEffect, StateField} from '@codemirror/state'\nimport {Decoration, type DecorationSet, EditorView, lineNumbers} from '@codemirror/view'\nimport type {ThemeContextValue} from '@sanity/ui'\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'\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'\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'\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'\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 = useMemo(() => {\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 // only need to calculate this on initial render\n // eslint-disable-next-line react-hooks/exhaustive-deps\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 })\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":["StreamLanguage","StateEffect","StateField","Decoration","state","EditorView","rgba","lineNumbers","view","useRootTheme","useMemo","theme","useTheme","createTheme","t","rem","forwardRef","useState","useEffect","useCallback","jsx","CodeMirror","useContext","CodeInputConfigContext"],"mappings":"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"}