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