@sanity/code-input 7.3.13 → 7.3.14
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/dist/{CodeMirrorProxy-VeTh1vQ-.js → CodeMirrorProxy-Cs-jYdPY.js} +70 -26
- package/dist/CodeMirrorProxy-Cs-jYdPY.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +124 -108
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/CodeMirrorProxy-VeTh1vQ-.js.map +0 -1
|
@@ -4,9 +4,9 @@ import { rem, useRootTheme, useTheme } from "@sanity/ui";
|
|
|
4
4
|
import { useContext, useEffect, useState } from "react";
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
6
|
import { Decoration, EditorView, lineNumbers } from "@codemirror/view";
|
|
7
|
-
import CodeMirror from "@uiw/react-codemirror";
|
|
7
|
+
import CodeMirror, { ExternalChange } from "@uiw/react-codemirror";
|
|
8
8
|
import { StreamLanguage } from "@codemirror/language";
|
|
9
|
-
import { StateEffect, StateField } from "@codemirror/state";
|
|
9
|
+
import { EditorState, StateEffect, StateField } from "@codemirror/state";
|
|
10
10
|
import { rgba } from "@sanity/ui/theme";
|
|
11
11
|
import { tags } from "@lezer/highlight";
|
|
12
12
|
import { createTheme } from "@uiw/codemirror-themes";
|
|
@@ -125,34 +125,79 @@ const defaultCodeModes = [
|
|
|
125
125
|
function getBackwardsCompatibleTone(themeCtx) {
|
|
126
126
|
return themeCtx.tone !== "neutral" && themeCtx.tone !== "suggest" ? themeCtx.tone : themeCtx.tone === "neutral" ? "default" : "primary";
|
|
127
127
|
}
|
|
128
|
-
const highlightLineClass = "cm-highlight-line", addLineHighlight = StateEffect.define(), removeLineHighlight = StateEffect.define(), lineHighlightField = StateField.define({
|
|
128
|
+
const highlightLineClass = "cm-highlight-line", addLineHighlight = StateEffect.define(), removeLineHighlight = StateEffect.define(), setLineHighlights = StateEffect.define(), lineHighlightField = StateField.define({
|
|
129
129
|
create() {
|
|
130
130
|
return Decoration.none;
|
|
131
131
|
},
|
|
132
132
|
update(lines, tr) {
|
|
133
|
-
lines = lines
|
|
134
|
-
for (let e of tr.effects) e.is(addLineHighlight) && (lines = lines.update({ add: [lineHighlightMark.range(e.value)] })), e.is(removeLineHighlight) && (lines = lines.update({ filter: (from) => from !== e.value }));
|
|
133
|
+
tr.docChanged && (lines = mapLineHighlights(lines, tr));
|
|
134
|
+
for (let e of tr.effects) e.is(setLineHighlights) && (lines = createLineHighlights(e.value, tr.newDoc)), e.is(addLineHighlight) && (lines = lines.update({ add: [lineHighlightMark.range(e.value)] })), e.is(removeLineHighlight) && (lines = lines.update({ filter: (from) => from !== e.value }));
|
|
135
135
|
return lines;
|
|
136
136
|
},
|
|
137
137
|
toJSON(value, state) {
|
|
138
|
-
|
|
139
|
-
for (; iter.value;) {
|
|
140
|
-
let lineNumber = state.doc.lineAt(iter.from).number;
|
|
141
|
-
highlightLines.includes(lineNumber) || highlightLines.push(lineNumber), iter.next();
|
|
142
|
-
}
|
|
143
|
-
return highlightLines;
|
|
138
|
+
return getHighlightedLines(value, state.doc);
|
|
144
139
|
},
|
|
145
140
|
fromJSON(value, state) {
|
|
146
|
-
|
|
147
|
-
highlights.sort((a, b) => a.from - b.from);
|
|
148
|
-
try {
|
|
149
|
-
return Decoration.none.update({ add: highlights });
|
|
150
|
-
} catch (e) {
|
|
151
|
-
return console.error(e), Decoration.none;
|
|
152
|
-
}
|
|
141
|
+
return createLineHighlights(value, state.doc);
|
|
153
142
|
},
|
|
154
143
|
provide: (f) => EditorView.decorations.from(f)
|
|
155
|
-
}), lineHighlightMark = Decoration.line({ class: highlightLineClass })
|
|
144
|
+
}), lineHighlightMark = Decoration.line({ class: highlightLineClass });
|
|
145
|
+
function createLineHighlights(lineNumbers, doc) {
|
|
146
|
+
return Decoration.set(lineNumbers.filter((line) => Number.isInteger(line) && line >= 1 && line <= doc.lines).map((line) => lineHighlightMark.range(doc.line(line).from)), !0);
|
|
147
|
+
}
|
|
148
|
+
function isRemoved(changes, from, to) {
|
|
149
|
+
let pos = from;
|
|
150
|
+
return changes.iterChangedRanges((fromA, toA) => {
|
|
151
|
+
fromA <= pos && toA > pos && (pos = toA);
|
|
152
|
+
}), pos >= to;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Moves highlights to the line their content ends up on, and drops them only when their line
|
|
156
|
+
* is deleted (its content and one of its line breaks are removed). `DecorationSet.map` keeps
|
|
157
|
+
* line decorations in front of text inserted at the start of the line, and drops them when
|
|
158
|
+
* the line break before the line is deleted.
|
|
159
|
+
*/
|
|
160
|
+
function mapLineHighlights(lines, tr) {
|
|
161
|
+
let { changes, startState } = tr, doc = startState.doc, ranges = [], iter = lines.iter();
|
|
162
|
+
for (; iter.value;) {
|
|
163
|
+
let line = doc.lineAt(iter.from);
|
|
164
|
+
if (!(line.from > 0 && isRemoved(changes, line.from - 1, line.from) || line.to < doc.length && isRemoved(changes, line.to, line.to + 1)) || !isRemoved(changes, line.from, line.to)) {
|
|
165
|
+
let from = tr.newDoc.lineAt(changes.mapPos(line.from, 1)).from;
|
|
166
|
+
ranges.at(-1)?.from !== from && ranges.push(lineHighlightMark.range(from));
|
|
167
|
+
}
|
|
168
|
+
iter.next();
|
|
169
|
+
}
|
|
170
|
+
return Decoration.set(ranges);
|
|
171
|
+
}
|
|
172
|
+
function getHighlightedLines(lines, doc) {
|
|
173
|
+
let highlightLines = [], iter = lines.iter();
|
|
174
|
+
for (; iter.value;) {
|
|
175
|
+
let lineNumber = doc.lineAt(iter.from).number;
|
|
176
|
+
highlightLines.includes(lineNumber) || highlightLines.push(lineNumber), iter.next();
|
|
177
|
+
}
|
|
178
|
+
return highlightLines;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Reports highlighted lines that moved because the code was edited, so the stored line
|
|
182
|
+
* numbers follow the highlighted content.
|
|
183
|
+
*/
|
|
184
|
+
function highlightChangeListener(onHighlightChange) {
|
|
185
|
+
return EditorView.updateListener.of((update) => {
|
|
186
|
+
if (!update.docChanged || update.transactions.some((tr) => tr.annotation(ExternalChange))) return;
|
|
187
|
+
let previous = getHighlightedLines(update.startState.field(lineHighlightField), update.startState.doc), next = getHighlightedLines(update.state.field(lineHighlightField), update.state.doc);
|
|
188
|
+
(previous.length !== next.length || previous.some((line, i) => line !== next[i])) && onHighlightChange(next);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** The highlighted lines last set from outside the editor, with `setHighlightedLines` */
|
|
192
|
+
const syncedHighlightLinesField = StateField.define({
|
|
193
|
+
create() {
|
|
194
|
+
return [];
|
|
195
|
+
},
|
|
196
|
+
update(lines, tr) {
|
|
197
|
+
for (let e of tr.effects) e.is(setLineHighlights) && (lines = e.value);
|
|
198
|
+
return lines;
|
|
199
|
+
}
|
|
200
|
+
}), externalValueHighlights = EditorState.transactionExtender.of((tr) => tr.annotation(ExternalChange) ? { effects: setLineHighlights.of(tr.startState.field(syncedHighlightLinesField)) } : null), highlightState = { highlight: lineHighlightField };
|
|
156
201
|
function createCodeMirrorTheme(options) {
|
|
157
202
|
let { themeCtx } = options, fallbackTone = getBackwardsCompatibleTone(themeCtx), dark = { color: themeCtx.theme.color.dark[fallbackTone] }, light = { color: themeCtx.theme.color.light[fallbackTone] };
|
|
158
203
|
return EditorView.baseTheme({
|
|
@@ -182,20 +227,19 @@ const highlightLine = (config) => {
|
|
|
182
227
|
if (value) return isHighlighted = !0, !1;
|
|
183
228
|
}), 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;
|
|
184
229
|
} } }),
|
|
230
|
+
config.readOnly || !config.onHighlightChange ? [] : highlightChangeListener(config.onHighlightChange),
|
|
231
|
+
syncedHighlightLinesField,
|
|
232
|
+
externalValueHighlights,
|
|
185
233
|
highlightTheme
|
|
186
234
|
];
|
|
187
235
|
};
|
|
188
236
|
/**
|
|
189
|
-
*
|
|
237
|
+
* Replaces the highlights of the provided view with highlightLines
|
|
190
238
|
* @param view
|
|
191
239
|
* @param highlightLines
|
|
192
240
|
*/
|
|
193
241
|
function setHighlightedLines(view, highlightLines) {
|
|
194
|
-
|
|
195
|
-
view.dispatch({ effects: allLineNumbers.map((lineNumber) => {
|
|
196
|
-
let line = doc.line(lineNumber);
|
|
197
|
-
return highlightLines?.includes(lineNumber) ? addLineHighlight.of(line.from) : removeLineHighlight.of(line.from);
|
|
198
|
-
}) });
|
|
242
|
+
view.dispatch({ effects: setLineHighlights.of(highlightLines) });
|
|
199
243
|
}
|
|
200
244
|
function useThemeExtension() {
|
|
201
245
|
let $ = c(6), themeCtx = useRootTheme(), t0;
|
|
@@ -444,4 +488,4 @@ function useLanguageExtension(mode) {
|
|
|
444
488
|
}
|
|
445
489
|
export { CodeMirrorProxy as default };
|
|
446
490
|
|
|
447
|
-
//# sourceMappingURL=CodeMirrorProxy-
|
|
491
|
+
//# sourceMappingURL=CodeMirrorProxy-Cs-jYdPY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeMirrorProxy-Cs-jYdPY.js","names":["getBackwardsCompatibleTone(themeCtx)","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 })","themeCtx.theme.color.dark[fallbackTone]","light","useMemo(() => {\n const fallbackTone = getBackwardsCompatibleTone(themeCtx)\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n // oxlint-disable-next-line typescript/no-deprecated\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])","_c","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 })","focusRing","bg","fg","family","attrName","boolean","className","comment","function","keyword","number","operator","property","string","dark ? 'dark' : 'light'","useMemo(() => {\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const {code: codeFont} = theme.sanity.fonts\n // oxlint-disable-next-line typescript/no-deprecated\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])","_c","t","EditorView.baseTheme({\n '&': {\n fontSize: rem(fontSize),\n },\n\n '& .cm-scroller': {\n lineHeight: `${lineHeight / fontSize} !important`,\n },\n })","useMemo(() => {\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\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])","_c","{fontSize: 1}","highlightLine({\n onHighlightChange,\n readOnly,\n theme: themeCtx,\n })","useMemo(\n () =>\n highlightLine({\n onHighlightChange,\n readOnly,\n theme: themeCtx,\n }),\n [onHighlightChange, readOnly, themeCtx],\n )","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 themeExtension,\n fontSizeExtension,\n highlightLineExtension,\n EditorView.lineWrapping,\n ]","[...baseExtensions, languageExtension]","() => {\n if (editorView) {\n setHighlightedLines(editorView, highlightLines ?? [])\n }\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }","[editorView, highlightLines, value]","() => {\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 }","(view: EditorView) => {\n setEditorView(view)\n }","useCallback((view: EditorView) => {\n setEditorView(view)\n }, [])","basicSetupProp ?? {\n highlightActiveLine: false,\n }","useMemo(\n () =>\n basicSetupProp ?? {\n highlightActiveLine: false,\n },\n [basicSetupProp],\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 readOnly={readOnly}\n />","() => {\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 }","codeModes","[mode, codeConfig]","_c"],"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: () => import('@sanity/lezer-groq').then(({groq}) => groq()),\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 {\n type ChangeDesc,\n EditorState,\n type Extension,\n type Range,\n StateEffect,\n StateField,\n type Text,\n type Transaction,\n} from '@codemirror/state'\nimport {Decoration, type DecorationSet, EditorView, lineNumbers} from '@codemirror/view'\nimport type {ThemeContextValue} from '@sanity/ui'\nimport {rgba} from '@sanity/ui/theme'\nimport {ExternalChange} from '@uiw/react-codemirror'\n\nimport {getBackwardsCompatibleTone} from './backwardsCompatibleTone'\n\nconst highlightLineClass = 'cm-highlight-line'\n\nconst addLineHighlight = StateEffect.define<number>()\nconst removeLineHighlight = StateEffect.define<number>()\n/** Replaces all highlights, with line numbers in the document the transaction produces */\nconst setLineHighlights = StateEffect.define<number[]>()\n\nconst lineHighlightField = StateField.define({\n create() {\n return Decoration.none\n },\n update(lines, tr) {\n if (tr.docChanged) {\n lines = mapLineHighlights(lines, tr)\n }\n for (const e of tr.effects) {\n if (e.is(setLineHighlights)) {\n lines = createLineHighlights(e.value, tr.newDoc)\n }\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 return getHighlightedLines(value, state.doc)\n },\n fromJSON(value: number[], state) {\n return createLineHighlights(value, state.doc)\n },\n provide: (f) => EditorView.decorations.from(f),\n})\n\nconst lineHighlightMark = Decoration.line({\n class: highlightLineClass,\n})\n\nfunction createLineHighlights(lineNumbers: number[], doc: Text): DecorationSet {\n return Decoration.set(\n lineNumbers\n .filter((line) => Number.isInteger(line) && line >= 1 && line <= doc.lines)\n .map((line) => lineHighlightMark.range(doc.line(line).from)),\n true,\n )\n}\n\nfunction isRemoved(changes: ChangeDesc, from: number, to: number): boolean {\n let pos = from\n changes.iterChangedRanges((fromA, toA) => {\n if (fromA <= pos && toA > pos) {\n pos = toA\n }\n })\n return pos >= to\n}\n\n/**\n * Moves highlights to the line their content ends up on, and drops them only when their line\n * is deleted (its content and one of its line breaks are removed). `DecorationSet.map` keeps\n * line decorations in front of text inserted at the start of the line, and drops them when\n * the line break before the line is deleted.\n */\nfunction mapLineHighlights(lines: DecorationSet, tr: Transaction): DecorationSet {\n const {changes, startState} = tr\n const doc = startState.doc\n const ranges: Range<Decoration>[] = []\n const iter = lines.iter()\n while (iter.value) {\n const line = doc.lineAt(iter.from)\n const lineBreakRemoved =\n (line.from > 0 && isRemoved(changes, line.from - 1, line.from)) ||\n (line.to < doc.length && isRemoved(changes, line.to, line.to + 1))\n if (!lineBreakRemoved || !isRemoved(changes, line.from, line.to)) {\n const from = tr.newDoc.lineAt(changes.mapPos(line.from, 1)).from\n if (ranges.at(-1)?.from !== from) {\n ranges.push(lineHighlightMark.range(from))\n }\n }\n iter.next()\n }\n return Decoration.set(ranges)\n}\n\nfunction getHighlightedLines(lines: DecorationSet, doc: Text): number[] {\n const highlightLines: number[] = []\n const iter = lines.iter()\n while (iter.value) {\n const lineNumber = doc.lineAt(iter.from).number\n if (!highlightLines.includes(lineNumber)) {\n highlightLines.push(lineNumber)\n }\n iter.next()\n }\n return highlightLines\n}\n\n/**\n * Reports highlighted lines that moved because the code was edited, so the stored line\n * numbers follow the highlighted content.\n */\nfunction highlightChangeListener(onHighlightChange: (lines: number[]) => void): Extension {\n return EditorView.updateListener.of((update) => {\n // Values synced from outside the editor come with their own highlighted lines\n if (!update.docChanged || update.transactions.some((tr) => tr.annotation(ExternalChange))) {\n return\n }\n const previous = getHighlightedLines(\n update.startState.field(lineHighlightField),\n update.startState.doc,\n )\n const next = getHighlightedLines(update.state.field(lineHighlightField), update.state.doc)\n if (previous.length !== next.length || previous.some((line, i) => line !== next[i])) {\n onHighlightChange(next)\n }\n })\n}\n\n/** The highlighted lines last set from outside the editor, with `setHighlightedLines` */\nconst syncedHighlightLinesField = StateField.define<number[]>({\n create() {\n return []\n },\n update(lines, tr) {\n for (const e of tr.effects) {\n if (e.is(setLineHighlights)) {\n lines = e.value\n }\n }\n return lines\n },\n})\n\n/**\n * Values synced from outside the editor replace the whole document, which drops the\n * highlights. They can also land after the highlighted lines that belong to them were set,\n * since `@uiw/react-codemirror` holds them back while the user is typing. So the latest\n * highlighted lines are applied in the same transaction.\n */\nconst externalValueHighlights = EditorState.transactionExtender.of((tr) =>\n tr.annotation(ExternalChange)\n ? {effects: setLineHighlights.of(tr.startState.field(syncedHighlightLinesField))}\n : null,\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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n // oxlint-disable-next-line typescript/no-deprecated\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 config.readOnly || !config.onHighlightChange\n ? []\n : highlightChangeListener(config.onHighlightChange),\n syncedHighlightLinesField,\n externalValueHighlights,\n highlightTheme,\n ]\n}\n\n/**\n * Replaces the highlights of the provided view with highlightLines\n * @param view\n * @param highlightLines\n */\nexport function setHighlightedLines(view: EditorView, highlightLines: number[]): void {\n view.dispatch({effects: setLineHighlights.of(highlightLines)})\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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n // oxlint-disable-next-line typescript/no-deprecated\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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const {code: codeFont} = theme.sanity.fonts\n // oxlint-disable-next-line typescript/no-deprecated\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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\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 {type Ref, 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 */\nfunction CodeMirrorProxy(props: CodeMirrorProps & {ref?: Ref<ReactCodeMirrorRef>}) {\n const {\n basicSetup: basicSetupProp,\n highlightLines,\n languageMode,\n onHighlightChange,\n readOnly,\n value,\n ref,\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 // oxlint-disable-next-line react/exhaustive-effect-dependencies\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 readOnly={readOnly}\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"],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/CodeInput.tsx","../src/PreviewCode.tsx","../src/schema.tsx","../src/config.ts","../src/codemirror/defaultCodeModes.ts","../src/plugin.tsx"],"mappings":";;;UAEiB;EACf;EACA;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;EACA;;;;;UAKe;EACf;EACA;EACA,uBAAuB;EACvB;EACA;;;;;;EAMA;;;;;UAMe,uBAAuB,KAAK;EAC3C,UAAU;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/CodeInput.tsx","../src/PreviewCode.tsx","../src/schema.tsx","../src/config.ts","../src/codemirror/defaultCodeModes.ts","../src/plugin.tsx"],"mappings":";;;UAEiB;EACf;EACA;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;EACA;;;;;UAKe;EACf;EACA;EACA,uBAAuB;EACvB;EACA;;;;;;EAMA;;;;;UAMe,uBAAuB,KAAK;EAC3C,UAAU;;;;;UCvBK,uBAAuB,iBAAiB,gBAAgB;;iBAGzD,UAAU,OAAO,iBAAiB,MAAM,IAAI;;;;UCc3C,yBAAyB;EACxC,YAAY;;;;;wBAuBE,YAAY,OAAO,mBAAmB,MAAM,IAAI;;;;qBC9CnD;;;;UAKI,uBAAuB,KAAK;EAC3C,aAAa;EACb,UAAU;;;YAKO;IACf,MAAM;;;;;;qBAOG;;;;;IAIE,cAAK;IAAa,gBAAO;;;;;;;;;;;;;;;;;;;;;;;IA+BpC;MACE;MACA;MACA;MACA;;IAEF,UAAO;MACL;MACA;MACA;MACA;;;;;QAHW;QACJ;QACI;QACQ;;;;;qBCzEZ,qBAAqB;qBA2BrB,kBAAkB;UC3Bd;EACf;EACA,QAAQ;;KAEE,mBAAmB,QAAQ,yBAAyB;UCD/C;EACf,YAAY;;;;;qBAMD,WAAW,OAAO"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,119 @@ import { ExpandIcon } from "@sanity/icons/Expand";
|
|
|
10
10
|
import { Tooltip } from "@sanity/ui/tooltip";
|
|
11
11
|
import { css, styled } from "styled-components";
|
|
12
12
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
const SUPPORTED_LANGUAGES = [
|
|
14
|
+
{
|
|
15
|
+
title: "Batch file",
|
|
16
|
+
value: "batchfile"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
title: "C#",
|
|
20
|
+
value: "csharp"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
title: "CSS",
|
|
24
|
+
value: "css"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: "Go",
|
|
28
|
+
value: "golang"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: "GROQ",
|
|
32
|
+
value: "groq"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
title: "HTML",
|
|
36
|
+
value: "html"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
title: "Java",
|
|
40
|
+
value: "java"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
title: "JavaScript",
|
|
44
|
+
value: "javascript"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
title: "JSON",
|
|
48
|
+
value: "json"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
title: "JSX",
|
|
52
|
+
value: "jsx"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
title: "Markdown",
|
|
56
|
+
value: "markdown"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
title: "MySQL",
|
|
60
|
+
value: "mysql"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
title: "PHP",
|
|
64
|
+
value: "php"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
title: "Plain text",
|
|
68
|
+
value: "text"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
title: "Python",
|
|
72
|
+
value: "python"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
title: "Ruby",
|
|
76
|
+
value: "ruby"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
title: "SASS",
|
|
80
|
+
value: "sass"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
title: "SCSS",
|
|
84
|
+
value: "scss"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
title: "sh",
|
|
88
|
+
value: "sh"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
title: "SQL",
|
|
92
|
+
value: "sql"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title: "TSX",
|
|
96
|
+
value: "tsx"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
title: "TypeScript",
|
|
100
|
+
value: "typescript"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
title: "XML",
|
|
104
|
+
value: "xml"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
title: "YAML",
|
|
108
|
+
value: "yaml"
|
|
109
|
+
}
|
|
110
|
+
], LANGUAGE_ALIASES = { js: "javascript" }, PATH_CODE = ["code"], PATH_LANGUAGE = ["language"];
|
|
111
|
+
/**
|
|
112
|
+
* Patches for a code editor change.
|
|
113
|
+
*
|
|
114
|
+
* `selectedLanguage` is the language the control is showing: the stored value,
|
|
115
|
+
* `options.language`, or plain text when neither is set.
|
|
116
|
+
*
|
|
117
|
+
* Studio prepends `setIfMissing({_type})` before these patches, so a language
|
|
118
|
+
* nested inside that object is ignored once the object exists. A field-level
|
|
119
|
+
* `setIfMissing` still fills `language` when it is absent, and leaves a value
|
|
120
|
+
* already present when the patch is applied.
|
|
121
|
+
*/
|
|
122
|
+
function codeChangePatches({ code, typeName, selectedLanguage }) {
|
|
123
|
+
let patches = [setIfMissing({ _type: typeName })];
|
|
124
|
+
return selectedLanguage && patches.push(setIfMissing(selectedLanguage, PATH_LANGUAGE)), patches.push(code ? set(code, PATH_CODE) : unset(PATH_CODE)), patches;
|
|
125
|
+
}
|
|
13
126
|
/** @internal */
|
|
14
127
|
function focusRingBorderStyle(border) {
|
|
15
128
|
return `inset 0 0 0 ${border.width}px ${border.color}`;
|
|
@@ -166,111 +279,14 @@ function FullscreenEditor(t0) {
|
|
|
166
279
|
}) }) })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [toggleButton, children({ isFullscreen: showFullscreen })] })
|
|
167
280
|
}), $[19] = children, $[20] = fullscreenStyle, $[21] = placeholderHeight, $[22] = showFullscreen, $[23] = toggleButton, $[24] = t11) : t11 = $[24], t11;
|
|
168
281
|
}
|
|
169
|
-
const CodeMirrorProxy = lazy(() => import("./CodeMirrorProxy-
|
|
282
|
+
const CodeMirrorProxy = lazy(() => import("./CodeMirrorProxy-Cs-jYdPY.js"));
|
|
170
283
|
function useMounted() {
|
|
171
284
|
let $ = c(2), [mounted, setMounted] = useState(!1), t0, t1;
|
|
172
285
|
return $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = () => {
|
|
173
286
|
requestAnimationFrame(() => startTransition(() => setMounted(!0)));
|
|
174
287
|
}, t1 = [], $[0] = t0, $[1] = t1) : (t0 = $[0], t1 = $[1]), useEffect(t0, t1), mounted;
|
|
175
288
|
}
|
|
176
|
-
const
|
|
177
|
-
{
|
|
178
|
-
title: "Batch file",
|
|
179
|
-
value: "batchfile"
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
title: "C#",
|
|
183
|
-
value: "csharp"
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
title: "CSS",
|
|
187
|
-
value: "css"
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
title: "Go",
|
|
191
|
-
value: "golang"
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
title: "GROQ",
|
|
195
|
-
value: "groq"
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
title: "HTML",
|
|
199
|
-
value: "html"
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
title: "Java",
|
|
203
|
-
value: "java"
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
title: "JavaScript",
|
|
207
|
-
value: "javascript"
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
title: "JSON",
|
|
211
|
-
value: "json"
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
title: "JSX",
|
|
215
|
-
value: "jsx"
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
title: "Markdown",
|
|
219
|
-
value: "markdown"
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
title: "MySQL",
|
|
223
|
-
value: "mysql"
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
title: "PHP",
|
|
227
|
-
value: "php"
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
title: "Plain text",
|
|
231
|
-
value: "text"
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
title: "Python",
|
|
235
|
-
value: "python"
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
title: "Ruby",
|
|
239
|
-
value: "ruby"
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
title: "SASS",
|
|
243
|
-
value: "sass"
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
title: "SCSS",
|
|
247
|
-
value: "scss"
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
title: "sh",
|
|
251
|
-
value: "sh"
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
title: "SQL",
|
|
255
|
-
value: "sql"
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
title: "TSX",
|
|
259
|
-
value: "tsx"
|
|
260
|
-
},
|
|
261
|
-
{
|
|
262
|
-
title: "TypeScript",
|
|
263
|
-
value: "typescript"
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
title: "XML",
|
|
267
|
-
value: "xml"
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
title: "YAML",
|
|
271
|
-
value: "yaml"
|
|
272
|
-
}
|
|
273
|
-
], LANGUAGE_ALIASES = { js: "javascript" }, PATH_CODE = ["code"], defaultLanguageMode = "text";
|
|
289
|
+
const defaultLanguageMode = "text";
|
|
274
290
|
function useLanguageMode(schemaType, value) {
|
|
275
291
|
let $ = c(12), languages = useLanguageAlternatives(schemaType), fixedLanguage = schemaType.options?.language, language = value?.language ?? fixedLanguage ?? defaultLanguageMode, t0;
|
|
276
292
|
if ($[0] !== language || $[1] !== languages) {
|
|
@@ -373,17 +389,17 @@ function CodeInput(props) {
|
|
|
373
389
|
$[0] === onPathFocus ? t0 = $[1] : (t0 = () => {
|
|
374
390
|
onPathFocus(PATH_CODE);
|
|
375
391
|
}, $[0] = onPathFocus, $[1] = t0);
|
|
376
|
-
let handleCodeFocus = t0, t1;
|
|
392
|
+
let handleCodeFocus = t0, { languages, language, languageMode } = useLanguageMode(props.schemaType, props.value), t1;
|
|
377
393
|
$[2] === onChange ? t1 = $[3] : (t1 = (lines) => onChange(set(lines, ["highlightedLines"])), $[2] = onChange, $[3] = t1);
|
|
378
394
|
let onHighlightChange = t1, t2;
|
|
379
|
-
$[4] !==
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
})
|
|
385
|
-
}, $[4] =
|
|
386
|
-
let handleCodeChange = t2,
|
|
395
|
+
$[4] !== language || $[5] !== onChange || $[6] !== type.name ? (t2 = (code) => {
|
|
396
|
+
onChange(codeChangePatches({
|
|
397
|
+
code,
|
|
398
|
+
typeName: type.name,
|
|
399
|
+
selectedLanguage: language
|
|
400
|
+
}));
|
|
401
|
+
}, $[4] = language, $[5] = onChange, $[6] = type.name, $[7] = t2) : t2 = $[7];
|
|
402
|
+
let handleCodeChange = t2, mounted = useMounted(), fullscreenEnabled = !type.options?.disableFullscreen, t3;
|
|
387
403
|
$[8] !== elementProps.onBlur || $[9] !== fullscreenEnabled || $[10] !== handleCodeChange || $[11] !== handleCodeFocus || $[12] !== languageMode || $[13] !== mounted || $[14] !== onHighlightChange || $[15] !== readOnly || $[16] !== value?.highlightedLines ? (t3 = (inputProps) => /* @__PURE__ */ jsx(FullscreenEditor, {
|
|
388
404
|
enabled: fullscreenEnabled,
|
|
389
405
|
children: (t4) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["{enabled, children}: FullscreenEditorProps","(node: HTMLDivElement | null) => {\n overlayRef.current = node\n setOverlayElement(node)\n }","useCallback((node: HTMLDivElement | null) => {\n overlayRef.current = node\n setOverlayElement(node)\n }, [])","() => {\n setPaneRect(null)\n setIsFullscreen(false)\n }","useCallback(() => {\n setPaneRect(null)\n setIsFullscreen(false)\n }, [])","() => {\n if (isFullscreen) {\n collapse()\n return\n }\n setPlaceholderHeight(rootRef.current?.offsetHeight ?? EDITOR_HEIGHT)\n setIsFullscreen(true)\n }","useCallback(() => {\n if (isFullscreen) {\n collapse()\n return\n }\n setPlaceholderHeight(rootRef.current?.offsetHeight ?? EDITOR_HEIGHT)\n setIsFullscreen(true)\n }, [isFullscreen, collapse])","(event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n event.nativeEvent.stopImmediatePropagation()\n collapse()\n }\n }","useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n event.nativeEvent.stopImmediatePropagation()\n collapse()\n }\n },\n [collapse],\n )","() => {\n if (!isFullscreen) return undefined\n\n // Fall back to the viewport if the pane can't be found.\n const paneElement = getDocumentPaneElement(rootRef.current)\n\n const update = () => {\n const {top, left, width, height} = paneElement\n ? paneElement.getBoundingClientRect()\n : {top: 0, left: 0, width: window.innerWidth, height: window.innerHeight}\n // Skip unchanged bounds so scroll events don't cause needless re-renders.\n setPaneRect((prev) =>\n prev &&\n prev.top === top &&\n prev.left === left &&\n prev.width === width &&\n prev.height === height\n ? prev\n : {top, left, width, height},\n )\n }\n\n // Defer so we don't setState synchronously.\n const raf = requestAnimationFrame(update)\n let resizeObserver: ResizeObserver | undefined\n if (paneElement) {\n resizeObserver = new ResizeObserver(update)\n resizeObserver.observe(paneElement)\n }\n window.addEventListener('resize', update)\n window.addEventListener('scroll', update, true)\n\n return () => {\n cancelAnimationFrame(raf)\n resizeObserver?.disconnect()\n window.removeEventListener('resize', update)\n window.removeEventListener('scroll', update, true)\n }\n }","[isFullscreen]","() => {\n if (!showFullscreen) return undefined\n\n const raf = requestAnimationFrame(() => {\n const overlay = overlayRef.current\n if (!overlay) return\n const editable = overlay.querySelector<HTMLElement>('.cm-content')\n ;(editable ?? overlay).focus()\n })\n\n return () => cancelAnimationFrame(raf)\n }","[showFullscreen]","raf","enabled && (\n <ToggleButtonBox padding={1}>\n <Tooltip\n animate\n arrow={false}\n // Constrain to the overlay so a surrounding modal's boundary doesn't\n // shift the tooltip; falls back to the viewport when not expanded.\n boundaryElement={overlayElement}\n content={<Text size={1}>{showFullscreen ? 'Collapse editor' : 'Expand editor'}</Text>}\n delay={TOOLTIP_DELAY}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={showFullscreen ? 'Collapse editor' : 'Expand editor'}\n icon={showFullscreen ? CollapseIcon : ExpandIcon}\n mode=\"ghost\"\n onClick={handleToggle}\n padding={2}\n />\n </Tooltip>\n </ToggleButtonBox>\n )","showFullscreen && paneRect\n ? {\n position: 'fixed',\n top: paneRect.top,\n left: paneRect.left,\n width: paneRect.width,\n height: paneRect.height,\n }\n : undefined","<FullscreenRoot ref={rootRef}>\n {showFullscreen ? (\n // Hold the editor's spot in the form layout so sibling fields and the\n // document scroll position don't shift while it's portaled away.\n <>\n <div aria-hidden style={{height: placeholderHeight}} />\n {/* Portal out of any modal so position:fixed is viewport-relative;\n Layer stacks it above the modal. */}\n <Portal>\n <Layer>\n <FullscreenOverlay\n onKeyDown={handleKeyDown}\n ref={setOverlayRef}\n style={fullscreenStyle}\n tabIndex={-1}\n >\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </FullscreenOverlay>\n </Layer>\n </Portal>\n </>\n ) : (\n <>\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </>\n )}\n </FullscreenRoot>","_c","_Fragment","() => {\n requestAnimationFrame(() => startTransition(() => setMounted(true)))\n }","[]","_c","languages.find((entry) => entry.value === language)","(entry) => entry.value === language","configured?.mode ?? resolveAliasedLanguage(language) ?? defaultLanguageMode","mode","{language, languageMode, languages}","useMemo((): CodeInputLanguage[] => {\n const languageAlternatives = type.options?.languageAlternatives\n if (!languageAlternatives) {\n return SUPPORTED_LANGUAGES\n }\n\n if (!Array.isArray(languageAlternatives)) {\n throw new Error(\n `'options.languageAlternatives' should be an array, got ${typeof languageAlternatives}`,\n )\n }\n\n return languageAlternatives.reduce((acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }, [])\n }, [type])","languageAlternatives.reduce((acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }, [])","(acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }","{title, value: val, mode}","_c","_temp","(e: ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.currentTarget.value\n onChange(newValue ? set(newValue) : unset())\n }","useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.currentTarget.value\n onChange(newValue ? set(newValue) : unset())\n },\n [onChange],\n )","languages.map((lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n ))","(lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n )","<Select {...elementProps} value={language} onChange={handleChange}>\n {languages.map((lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n ))}\n </Select>","_c","({elementProps, onChange}: Omit<InputProps, 'renderDefault'>) => {\n return (\n <LanguageInput\n onChange={onChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n elementProps={elementProps as PrimitiveInputElementProps}\n language={language}\n languages={languages}\n />\n )\n }","{elementProps, onChange}: Omit<InputProps, 'renderDefault'>","useCallback(\n ({elementProps, onChange}: Omit<InputProps, 'renderDefault'>) => {\n return (\n <LanguageInput\n onChange={onChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n elementProps={elementProps as PrimitiveInputElementProps}\n language={language}\n languages={languages}\n />\n )\n },\n [languages, language],\n )","<MemberField\n member={member}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />","_c","members.find(\n (member): member is FieldMember => member.kind === 'field' && member.name === fieldName,\n )","(member): member is FieldMember => member.kind === 'field' && member.name === fieldName","useMemo(\n () =>\n members.find(\n (member): member is FieldMember => member.kind === 'field' && member.name === fieldName,\n ),\n [members, fieldName],\n )","_c","() => {\n onPathFocus(PATH_CODE)\n }","useCallback(() => {\n onPathFocus(PATH_CODE)\n }, [onPathFocus])","(lines: number[]) => onChange(set(lines, ['highlightedLines']))","useCallback(\n (lines: number[]) => onChange(set(lines, ['highlightedLines'])),\n [onChange],\n )","(code: string) => {\n const path = PATH_CODE\n const fixedLanguage = type.options?.language\n\n onChange([\n setIfMissing({_type: type.name, language: fixedLanguage}),\n code ? set(code, path) : unset(path),\n ])\n }","name","language","path","useCallback(\n (code: string) => {\n const path = PATH_CODE\n const fixedLanguage = type.options?.language\n\n onChange([\n setIfMissing({_type: type.name, language: fixedLanguage}),\n code ? set(code, path) : unset(path),\n ])\n },\n [onChange, type],\n )","(inputProps) => (\n <FullscreenEditor enabled={fullscreenEnabled}>\n {({isFullscreen}) => (\n <EditorContainer\n $fullscreen={isFullscreen}\n border={!isFullscreen}\n overflow=\"hidden\"\n radius={1}\n sizing=\"border\"\n readOnly={readOnly}\n >\n {mounted && (\n <Suspense\n fallback={\n <Box padding={3}>\n <Text>Loading code editor...</Text>\n </Box>\n }\n >\n <CodeMirrorProxy\n languageMode={languageMode}\n onChange={handleCodeChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n value={inputProps.value as string}\n highlightLines={value?.highlightedLines}\n onHighlightChange={onHighlightChange}\n readOnly={readOnly}\n onFocus={handleCodeFocus}\n onBlur={elementProps.onBlur}\n />\n </Suspense>\n )}\n </EditorContainer>\n )}\n </FullscreenEditor>\n )","onBlur","highlightedLines","{isFullscreen}","useCallback(\n (inputProps) => (\n <FullscreenEditor enabled={fullscreenEnabled}>\n {({isFullscreen}) => (\n <EditorContainer\n $fullscreen={isFullscreen}\n border={!isFullscreen}\n overflow=\"hidden\"\n radius={1}\n sizing=\"border\"\n readOnly={readOnly}\n >\n {mounted && (\n <Suspense\n fallback={\n <Box padding={3}>\n <Text>Loading code editor...</Text>\n </Box>\n }\n >\n <CodeMirrorProxy\n languageMode={languageMode}\n onChange={handleCodeChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n value={inputProps.value as string}\n highlightLines={value?.highlightedLines}\n onHighlightChange={onHighlightChange}\n readOnly={readOnly}\n onFocus={handleCodeFocus}\n onBlur={elementProps.onBlur}\n />\n </Suspense>\n )}\n </EditorContainer>\n )}\n </FullscreenEditor>\n ),\n [\n fullscreenEnabled,\n readOnly,\n mounted,\n languageMode,\n handleCodeChange,\n value?.highlightedLines,\n onHighlightChange,\n handleCodeFocus,\n elementProps.onBlur,\n ],\n )","languageFieldMember && (\n <LanguageField\n member={languageFieldMember}\n language={language}\n languages={languages}\n renderField={renderField}\n renderItem={renderItem}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )","type.options?.withFilename && filenameMember && (\n <MemberField\n member={filenameMember}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )","withFilename","codeFieldMember && (\n <MemberField\n member={codeFieldMember}\n renderInput={renderCodeInput}\n renderItem={renderItem}\n renderField={renderField}\n renderPreview={renderPreview}\n />\n )","<Stack gap={4}>\n {languageFieldMember && (\n <LanguageField\n member={languageFieldMember}\n language={language}\n languages={languages}\n renderField={renderField}\n renderItem={renderItem}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {type.options?.withFilename && filenameMember && (\n <MemberField\n member={filenameMember}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {codeFieldMember && (\n <MemberField\n member={codeFieldMember}\n renderInput={renderCodeInput}\n renderItem={renderItem}\n renderField={renderField}\n renderPreview={renderPreview}\n />\n )}\n </Stack>","_c","inlineCodeLabel(props)","<InlineCodeLabel data-testid=\"inline-code-preview\">{inlineCodeLabel(props)}</InlineCodeLabel>","selection?.filename || selection?.language ? (\n <Card\n paddingBottom={4}\n marginBottom={selection.code ? 4 : 0}\n borderBottom={!!selection.code}\n >\n <Flex align=\"center\" justify=\"flex-end\">\n {selection?.filename ? (\n <Box flex={1}>\n <Text>\n <code>{selection.filename}</code>\n </Text>\n </Box>\n ) : null}\n {selection?.language ? <Label muted>{selection.language}</Label> : null}\n </Flex>\n </Card>\n ) : null","selection?.filename","mounted && (\n <Suspense fallback={<Card padding={2}>Loading code preview...</Card>}>\n <CodeMirrorProxy\n readOnly\n editable={false}\n value={selection?.code || ''}\n highlightLines={selection?.highlightedLines || []}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n highlightSelectionMatches: false,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n }}\n languageMode={languageMode}\n />\n </Suspense>\n )","code","highlightedLines","<PreviewContainer>\n <Card padding={4}>\n {selection?.filename || selection?.language ? (\n <Card\n paddingBottom={4}\n marginBottom={selection.code ? 4 : 0}\n borderBottom={!!selection.code}\n >\n <Flex align=\"center\" justify=\"flex-end\">\n {selection?.filename ? (\n <Box flex={1}>\n <Text>\n <code>{selection.filename}</code>\n </Text>\n </Box>\n ) : null}\n {selection?.language ? <Label muted>{selection.language}</Label> : null}\n </Flex>\n </Card>\n ) : null}\n {mounted && (\n <Suspense fallback={<Card padding={2}>Loading code preview...</Card>}>\n <CodeMirrorProxy\n readOnly\n editable={false}\n value={selection?.code || ''}\n highlightLines={selection?.highlightedLines || []}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n highlightSelectionMatches: false,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n }}\n languageMode={languageMode}\n />\n </Suspense>\n )}\n </Card>\n </PreviewContainer>","_c"],"sources":["../src/ui/focusRingStyle.ts","../src/CodeInputFullscreen.tsx","../src/codemirror/useCodeMirror.tsx","../src/config.ts","../src/codemirror/useLanguageMode.tsx","../src/LanguageInput.tsx","../src/LanguageField.tsx","../src/useFieldMember.ts","../src/CodeInput.tsx","../src/getMedia.tsx","../src/PreviewCode.tsx","../src/schema.tsx","../src/plugin.tsx"],"sourcesContent":["/** @internal */\n// todo: import from @sanity/ui instead\nexport function focusRingBorderStyle(border: {color: string; width: number}): string {\n return `inset 0 0 0 ${border.width}px ${border.color}`\n}\n\n/** @internal */\n// todo: import from @sanity/ui instead\nexport function focusRingStyle(opts: {\n base?: {bg: string}\n border?: {color: string; width: number}\n focusRing: {offset: number; width: number}\n}): string {\n const {base, border, focusRing} = opts\n const focusRingOutsetWidth = focusRing.offset + focusRing.width\n const focusRingInsetWidth = 0 - focusRing.offset\n const bgColor = base ? base.bg : 'var(--card-bg-color)'\n\n return [\n focusRingInsetWidth > 0 && `inset 0 0 0 ${focusRingInsetWidth}px var(--card-focus-ring-color)`,\n border && focusRingBorderStyle(border),\n focusRingInsetWidth < 0 && `0 0 0 ${0 - focusRingInsetWidth}px ${bgColor}`,\n focusRingOutsetWidth > 0 && `0 0 0 ${focusRingOutsetWidth}px var(--card-focus-ring-color)`,\n ]\n .filter(Boolean)\n .join(',')\n}\n","import {CollapseIcon} from '@sanity/icons/Collapse'\nimport {ExpandIcon} from '@sanity/icons/Expand'\nimport {Box, Button, Card, Layer, Portal, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type CSSProperties, type ReactNode, useCallback, useEffect, useRef, useState} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {focusRingBorderStyle, focusRingStyle} from './ui/focusRingStyle'\n\n// Match the Studio's tooltip timing (TOOLTIP_DELAY_PROPS in `sanity`)\nconst TOOLTIP_DELAY = {open: 400}\n\n// Default editor height; also the placeholder height while expanded.\nconst EDITOR_HEIGHT = 250\n\n// Studio DOM markers for the document pane and its scroll container\nconst DOCUMENT_PANE_SELECTOR = '[data-testid=\"document-pane\"]'\nconst DOCUMENT_PANEL_SCROLLER_SELECTOR = '[data-testid=\"document-panel-scroller\"]'\n// Selected pane — disambiguates split-view layouts\nconst SELECTED_PANE_SCROLLER_SELECTOR = `${DOCUMENT_PANE_SELECTOR}[data-pane-selected=\"true\"] ${DOCUMENT_PANEL_SCROLLER_SELECTOR}`\n\n// Nearest scrollable ancestor — last-resort pane fallback.\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n let current = node?.parentElement ?? null\n while (current) {\n const {overflowY} = window.getComputedStyle(current)\n if (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') {\n return current\n }\n current = current.parentElement\n }\n return null\n}\n\n// Resolve the document pane's scroll container so the overlay fills the pane —\n// not the viewport, and not a surrounding modal (rendered in a portal).\nfunction getDocumentPaneElement(node: HTMLElement | null): HTMLElement | null {\n if (!node) return null\n\n const ownPane = node.closest(DOCUMENT_PANE_SELECTOR)\n if (ownPane instanceof HTMLElement) {\n const scroller = ownPane.querySelector(DOCUMENT_PANEL_SCROLLER_SELECTOR)\n return scroller instanceof HTMLElement ? scroller : ownPane\n }\n\n // In a portal (modal): can't walk up. Prefer selected pane, then any pane,\n // then the nearest scrollable ancestor.\n const selectedScroller = document.querySelector(SELECTED_PANE_SCROLLER_SELECTOR)\n if (selectedScroller instanceof HTMLElement) return selectedScroller\n\n const scroller = document.querySelector(DOCUMENT_PANEL_SCROLLER_SELECTOR)\n if (scroller instanceof HTMLElement) return scroller\n\n return getScrollParent(node)\n}\n\n// In-place anchor; also the reference for locating the document pane.\nconst FullscreenRoot = styled.div`\n position: relative;\n`\n\n// Portaled container, pinned to the pane bounds via inline style. Draws the\n// top/bottom divider (flush with the pane sides).\nconst FullscreenOverlay = styled.div(({theme}) => {\n // oxlint-disable-next-line typescript/no-deprecated\n const {input} = theme.sanity\n // oxlint-disable-next-line typescript/no-deprecated\n const borderColor = theme.sanity.color.input.default.enabled.border\n\n return css`\n box-sizing: border-box;\n overflow: hidden;\n border-top: ${input.border.width}px solid ${borderColor};\n border-bottom: ${input.border.width}px solid ${borderColor};\n `\n})\n\nconst ToggleButtonBox = styled(Box)`\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n`\n\n/** Editor container; fills its parent when `$fullscreen`. */\nexport const EditorContainer = styled(Card)<{$fullscreen: boolean}>(({theme, $fullscreen}) => {\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const {focusRing, input} = theme.sanity\n // oxlint-disable-next-line typescript/no-deprecated\n const base = theme.sanity.color.base\n // oxlint-disable-next-line typescript/no-deprecated\n const color = theme.sanity.color.input\n const border = {\n color: color.default.enabled.border,\n width: input.border.width,\n }\n\n return css`\n --input-box-shadow: ${focusRingBorderStyle(border)};\n\n box-shadow: var(--input-box-shadow);\n height: ${EDITOR_HEIGHT}px;\n min-height: 80px;\n overflow-y: auto;\n position: relative;\n resize: vertical;\n z-index: 0;\n\n & > .cm-theme {\n height: 100%;\n }\n\n &:focus-within {\n --input-box-shadow: ${focusRingStyle({\n base,\n border,\n focusRing,\n })};\n }\n\n ${\n $fullscreen &&\n css`\n height: 100%;\n border-radius: 0;\n resize: none;\n background-color: ${base.bg};\n /* Divider drawn on the overlay so the sides sit flush with the pane */\n box-shadow: none;\n `\n }\n `\n})\n\ninterface FullscreenEditorProps {\n /** When false, renders children without the expand button. */\n enabled: boolean\n children: (state: {isFullscreen: boolean}) => ReactNode\n}\n\n/** Wraps the editor with an \"Expand editor\" toggle that fills the document pane. */\nexport function FullscreenEditor({enabled, children}: FullscreenEditorProps): React.JSX.Element {\n const [isFullscreen, setIsFullscreen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n const overlayRef = useRef<HTMLDivElement>(null)\n // Overlay node in state too — used as the tooltip's boundary element.\n const [overlayElement, setOverlayElement] = useState<HTMLDivElement | null>(null)\n const setOverlayRef = useCallback((node: HTMLDivElement | null) => {\n overlayRef.current = node\n setOverlayElement(node)\n }, [])\n // Document pane bounds, used to size the overlay.\n const [paneRect, setPaneRect] = useState<{\n top: number\n left: number\n width: number\n height: number\n } | null>(null)\n // Editor height captured when expanding, so the in-place placeholder keeps the\n // surrounding fields from shifting while the editor is portaled away.\n const [placeholderHeight, setPlaceholderHeight] = useState(EDITOR_HEIGHT)\n\n // Only treat as fullscreen once the pane is measured.\n const showFullscreen = isFullscreen && paneRect !== null\n\n // Reset paneRect alongside isFullscreen so the next expand re-measures (rather\n // than rendering at stale coordinates). Done here, not in the effect cleanup,\n // to avoid a state update when the component unmounts while expanded.\n const collapse = useCallback(() => {\n setPaneRect(null)\n setIsFullscreen(false)\n }, [])\n\n const handleToggle = useCallback(() => {\n if (isFullscreen) {\n collapse()\n return\n }\n setPlaceholderHeight(rootRef.current?.offsetHeight ?? EDITOR_HEIGHT)\n setIsFullscreen(true)\n }, [isFullscreen, collapse])\n\n // Exit on Escape, scoped to the overlay so other Studio UI keeps its own\n // handling; stopImmediatePropagation keeps a surrounding modal open.\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n event.nativeEvent.stopImmediatePropagation()\n collapse()\n }\n },\n [collapse],\n )\n\n // Track the pane bounds while fullscreen so the overlay fills the pane.\n useEffect(() => {\n if (!isFullscreen) return undefined\n\n // Fall back to the viewport if the pane can't be found.\n const paneElement = getDocumentPaneElement(rootRef.current)\n\n const update = () => {\n const {top, left, width, height} = paneElement\n ? paneElement.getBoundingClientRect()\n : {top: 0, left: 0, width: window.innerWidth, height: window.innerHeight}\n // Skip unchanged bounds so scroll events don't cause needless re-renders.\n setPaneRect((prev) =>\n prev &&\n prev.top === top &&\n prev.left === left &&\n prev.width === width &&\n prev.height === height\n ? prev\n : {top, left, width, height},\n )\n }\n\n // Defer so we don't setState synchronously.\n const raf = requestAnimationFrame(update)\n let resizeObserver: ResizeObserver | undefined\n if (paneElement) {\n resizeObserver = new ResizeObserver(update)\n resizeObserver.observe(paneElement)\n }\n window.addEventListener('resize', update)\n window.addEventListener('scroll', update, true)\n\n return () => {\n cancelAnimationFrame(raf)\n resizeObserver?.disconnect()\n window.removeEventListener('resize', update)\n window.removeEventListener('scroll', update, true)\n }\n }, [isFullscreen])\n\n // Portaling drops focus to <body>; move it into the overlay so Escape and\n // typing work.\n useEffect(() => {\n if (!showFullscreen) return undefined\n\n const raf = requestAnimationFrame(() => {\n const overlay = overlayRef.current\n if (!overlay) return\n const editable = overlay.querySelector<HTMLElement>('.cm-content')\n ;(editable ?? overlay).focus()\n })\n\n return () => cancelAnimationFrame(raf)\n }, [showFullscreen])\n\n const toggleButton = enabled && (\n <ToggleButtonBox padding={1}>\n <Tooltip\n animate\n arrow={false}\n // Constrain to the overlay so a surrounding modal's boundary doesn't\n // shift the tooltip; falls back to the viewport when not expanded.\n boundaryElement={overlayElement}\n content={<Text size={1}>{showFullscreen ? 'Collapse editor' : 'Expand editor'}</Text>}\n delay={TOOLTIP_DELAY}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={showFullscreen ? 'Collapse editor' : 'Expand editor'}\n icon={showFullscreen ? CollapseIcon : ExpandIcon}\n mode=\"ghost\"\n onClick={handleToggle}\n padding={2}\n />\n </Tooltip>\n </ToggleButtonBox>\n )\n\n const fullscreenStyle: CSSProperties | undefined =\n showFullscreen && paneRect\n ? {\n position: 'fixed',\n top: paneRect.top,\n left: paneRect.left,\n width: paneRect.width,\n height: paneRect.height,\n }\n : undefined\n\n return (\n <FullscreenRoot ref={rootRef}>\n {showFullscreen ? (\n // Hold the editor's spot in the form layout so sibling fields and the\n // document scroll position don't shift while it's portaled away.\n <>\n <div aria-hidden style={{height: placeholderHeight}} />\n {/* Portal out of any modal so position:fixed is viewport-relative;\n Layer stacks it above the modal. */}\n <Portal>\n <Layer>\n <FullscreenOverlay\n onKeyDown={handleKeyDown}\n ref={setOverlayRef}\n style={fullscreenStyle}\n tabIndex={-1}\n >\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </FullscreenOverlay>\n </Layer>\n </Portal>\n </>\n ) : (\n <>\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </>\n )}\n </FullscreenRoot>\n )\n}\n","import {lazy, startTransition, useEffect, useState} from 'react'\n\nexport const CodeMirrorProxy = lazy(() => import('./CodeMirrorProxy'))\n\nexport function useMounted() {\n const [mounted, setMounted] = useState(false)\n useEffect(() => {\n requestAnimationFrame(() => startTransition(() => setMounted(true)))\n }, [])\n return mounted\n}\n","import type {CodeInputLanguage} from './types'\n\n// NOTE: MAKE SURE THESE ALIGN WITH CODE MODES IN ./codemirror/defaultCodeModes.ts\nexport const SUPPORTED_LANGUAGES: CodeInputLanguage[] = [\n {title: 'Batch file', value: 'batchfile'},\n {title: 'C#', value: 'csharp'},\n {title: 'CSS', value: 'css'},\n {title: 'Go', value: 'golang'},\n {title: 'GROQ', value: 'groq'},\n {title: 'HTML', value: 'html'},\n {title: 'Java', value: 'java'},\n {title: 'JavaScript', value: 'javascript'},\n {title: 'JSON', value: 'json'},\n {title: 'JSX', value: 'jsx'},\n {title: 'Markdown', value: 'markdown'},\n {title: 'MySQL', value: 'mysql'},\n {title: 'PHP', value: 'php'},\n {title: 'Plain text', value: 'text'},\n {title: 'Python', value: 'python'},\n {title: 'Ruby', value: 'ruby'},\n {title: 'SASS', value: 'sass'},\n {title: 'SCSS', value: 'scss'},\n {title: 'sh', value: 'sh'},\n {title: 'SQL', value: 'sql'},\n {title: 'TSX', value: 'tsx'},\n {title: 'TypeScript', value: 'typescript'},\n {title: 'XML', value: 'xml'},\n {title: 'YAML', value: 'yaml'},\n]\n\nexport const LANGUAGE_ALIASES: Record<string, string | undefined> = {js: 'javascript'}\n\nexport const PATH_CODE = ['code']\n","import {useMemo} from 'react'\n\nimport {LANGUAGE_ALIASES, SUPPORTED_LANGUAGES} from '../config'\nimport type {CodeInputLanguage, CodeInputValue, CodeSchemaType} from '../types'\n\nconst defaultLanguageMode = 'text'\n\nexport function useLanguageMode(\n schemaType: CodeSchemaType,\n value?: CodeInputValue,\n): {\n language: string\n languageMode: string\n languages: CodeInputLanguage[]\n} {\n const languages = useLanguageAlternatives(schemaType)\n const fixedLanguage = schemaType.options?.language\n const language = value?.language ?? fixedLanguage ?? defaultLanguageMode\n\n // the language config from the schema\n const configured = languages.find((entry) => entry.value === language)\n const languageMode = configured?.mode ?? resolveAliasedLanguage(language) ?? defaultLanguageMode\n\n return {language, languageMode, languages}\n}\n\nfunction resolveAliasedLanguage(lang?: string) {\n return (lang && LANGUAGE_ALIASES[lang]) ?? lang\n}\n\nfunction useLanguageAlternatives(type: CodeSchemaType) {\n return useMemo((): CodeInputLanguage[] => {\n const languageAlternatives = type.options?.languageAlternatives\n if (!languageAlternatives) {\n return SUPPORTED_LANGUAGES\n }\n\n if (!Array.isArray(languageAlternatives)) {\n throw new Error(\n `'options.languageAlternatives' should be an array, got ${typeof languageAlternatives}`,\n )\n }\n\n return languageAlternatives.reduce((acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }, [])\n }, [type])\n}\n","import {Select} from '@sanity/ui'\nimport {type ChangeEvent, useCallback} from 'react'\nimport {set, type StringInputProps, unset} from 'sanity'\n\nimport type {CodeInputLanguage} from './types'\n\nexport interface LanguageInputProps {\n language: string\n languages: CodeInputLanguage[]\n onChange: StringInputProps['onChange']\n elementProps: StringInputProps['elementProps']\n}\n\n/** @internal */\nexport function LanguageInput(props: LanguageInputProps) {\n const {language, languages, onChange, elementProps} = props\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.currentTarget.value\n onChange(newValue ? set(newValue) : unset())\n },\n [onChange],\n )\n\n return (\n <Select {...elementProps} value={language} onChange={handleChange}>\n {languages.map((lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n ))}\n </Select>\n )\n}\n","import {useCallback} from 'react'\nimport {\n type FieldMember,\n type InputProps,\n MemberField,\n type MemberFieldProps,\n type PrimitiveInputElementProps,\n} from 'sanity'\n\nimport {LanguageInput} from './LanguageInput'\nimport type {CodeInputLanguage} from './types'\n\nexport function LanguageField(\n props: MemberFieldProps & {member: FieldMember; language: string; languages: CodeInputLanguage[]},\n) {\n const {member, languages, language, renderItem, renderField, renderPreview} = props\n\n const renderInput = useCallback(\n ({elementProps, onChange}: Omit<InputProps, 'renderDefault'>) => {\n return (\n <LanguageInput\n onChange={onChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n elementProps={elementProps as PrimitiveInputElementProps}\n language={language}\n languages={languages}\n />\n )\n },\n [languages, language],\n )\n\n return (\n <MemberField\n member={member}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )\n}\n","import {useMemo} from 'react'\nimport type {FieldMember, ObjectMember} from 'sanity'\n\n/** @internal */\nexport function useFieldMember(\n members: ObjectMember[],\n fieldName: string,\n): FieldMember | undefined {\n return useMemo(\n () =>\n members.find(\n (member): member is FieldMember => member.kind === 'field' && member.name === fieldName,\n ),\n [members, fieldName],\n )\n}\n","import {Box, Stack, Text} from '@sanity/ui'\nimport {Suspense, useCallback} from 'react'\nimport {\n MemberField,\n type ObjectInputProps,\n type RenderInputCallback,\n set,\n setIfMissing,\n unset,\n} from 'sanity'\n\nimport {EditorContainer, FullscreenEditor} from './CodeInputFullscreen'\nimport {CodeMirrorProxy, useMounted} from './codemirror/useCodeMirror'\nimport {useLanguageMode} from './codemirror/useLanguageMode'\nimport {PATH_CODE} from './config'\nimport {LanguageField} from './LanguageField'\nimport type {CodeInputValue, CodeSchemaType} from './types'\nimport {useFieldMember} from './useFieldMember'\n\n/**\n * @public\n */\nexport interface CodeInputProps extends ObjectInputProps<CodeInputValue, CodeSchemaType> {}\n\n/** @public */\nexport function CodeInput(props: CodeInputProps): React.JSX.Element {\n const {\n members,\n elementProps,\n onChange,\n readOnly,\n renderField,\n renderInput,\n renderItem,\n renderPreview,\n schemaType: type,\n value,\n onPathFocus,\n } = props\n\n const languageFieldMember = useFieldMember(members, 'language')\n const filenameMember = useFieldMember(members, 'filename')\n const codeFieldMember = useFieldMember(members, 'code')\n\n const handleCodeFocus = useCallback(() => {\n onPathFocus(PATH_CODE)\n }, [onPathFocus])\n\n const onHighlightChange = useCallback(\n (lines: number[]) => onChange(set(lines, ['highlightedLines'])),\n [onChange],\n )\n\n const handleCodeChange = useCallback(\n (code: string) => {\n const path = PATH_CODE\n const fixedLanguage = type.options?.language\n\n onChange([\n setIfMissing({_type: type.name, language: fixedLanguage}),\n code ? set(code, path) : unset(path),\n ])\n },\n [onChange, type],\n )\n const {languages, language, languageMode} = useLanguageMode(props.schemaType, props.value)\n\n const mounted = useMounted()\n\n const fullscreenEnabled = !type.options?.disableFullscreen\n\n const renderCodeInput: RenderInputCallback = useCallback(\n (inputProps) => (\n <FullscreenEditor enabled={fullscreenEnabled}>\n {({isFullscreen}) => (\n <EditorContainer\n $fullscreen={isFullscreen}\n border={!isFullscreen}\n overflow=\"hidden\"\n radius={1}\n sizing=\"border\"\n readOnly={readOnly}\n >\n {mounted && (\n <Suspense\n fallback={\n <Box padding={3}>\n <Text>Loading code editor...</Text>\n </Box>\n }\n >\n <CodeMirrorProxy\n languageMode={languageMode}\n onChange={handleCodeChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n value={inputProps.value as string}\n highlightLines={value?.highlightedLines}\n onHighlightChange={onHighlightChange}\n readOnly={readOnly}\n onFocus={handleCodeFocus}\n onBlur={elementProps.onBlur}\n />\n </Suspense>\n )}\n </EditorContainer>\n )}\n </FullscreenEditor>\n ),\n [\n fullscreenEnabled,\n readOnly,\n mounted,\n languageMode,\n handleCodeChange,\n value?.highlightedLines,\n onHighlightChange,\n handleCodeFocus,\n elementProps.onBlur,\n ],\n )\n\n return (\n <Stack gap={4}>\n {languageFieldMember && (\n <LanguageField\n member={languageFieldMember}\n language={language}\n languages={languages}\n renderField={renderField}\n renderItem={renderItem}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {type.options?.withFilename && filenameMember && (\n <MemberField\n member={filenameMember}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {codeFieldMember && (\n <MemberField\n member={codeFieldMember}\n renderInput={renderCodeInput}\n renderItem={renderItem}\n renderField={renderField}\n renderPreview={renderPreview}\n />\n )}\n </Stack>\n )\n}\n","export function getMedia(language?: string) {\n if (language === 'jsx') {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 128 128\">\n <g fill=\"#61DAFB\">\n <circle cx=\"64\" cy=\"64\" r=\"11.4\" />\n <path d=\"M107.3 45.2c-2.2-.8-4.5-1.6-6.9-2.3.6-2.4 1.1-4.8 1.5-7.1 2.1-13.2-.2-22.5-6.6-26.1-1.9-1.1-4-1.6-6.4-1.6-7 0-15.9 5.2-24.9 13.9-9-8.7-17.9-13.9-24.9-13.9-2.4 0-4.5.5-6.4 1.6-6.4 3.7-8.7 13-6.6 26.1.4 2.3.9 4.7 1.5 7.1-2.4.7-4.7 1.4-6.9 2.3C8.2 50 1.4 56.6 1.4 64s6.9 14 19.3 18.8c2.2.8 4.5 1.6 6.9 2.3-.6 2.4-1.1 4.8-1.5 7.1-2.1 13.2.2 22.5 6.6 26.1 1.9 1.1 4 1.6 6.4 1.6 7.1 0 16-5.2 24.9-13.9 9 8.7 17.9 13.9 24.9 13.9 2.4 0 4.5-.5 6.4-1.6 6.4-3.7 8.7-13 6.6-26.1-.4-2.3-.9-4.7-1.5-7.1 2.4-.7 4.7-1.4 6.9-2.3 12.5-4.8 19.3-11.4 19.3-18.8s-6.8-14-19.3-18.8zM92.5 14.7c4.1 2.4 5.5 9.8 3.8 20.3-.3 2.1-.8 4.3-1.4 6.6-5.2-1.2-10.7-2-16.5-2.5-3.4-4.8-6.9-9.1-10.4-13 7.4-7.3 14.9-12.3 21-12.3 1.3 0 2.5.3 3.5.9zM81.3 74c-1.8 3.2-3.9 6.4-6.1 9.6-3.7.3-7.4.4-11.2.4-3.9 0-7.6-.1-11.2-.4-2.2-3.2-4.2-6.4-6-9.6-1.9-3.3-3.7-6.7-5.3-10 1.6-3.3 3.4-6.7 5.3-10 1.8-3.2 3.9-6.4 6.1-9.6 3.7-.3 7.4-.4 11.2-.4 3.9 0 7.6.1 11.2.4 2.2 3.2 4.2 6.4 6 9.6 1.9 3.3 3.7 6.7 5.3 10-1.7 3.3-3.4 6.6-5.3 10zm8.3-3.3c1.5 3.5 2.7 6.9 3.8 10.3-3.4.8-7 1.4-10.8 1.9 1.2-1.9 2.5-3.9 3.6-6 1.2-2.1 2.3-4.2 3.4-6.2zM64 97.8c-2.4-2.6-4.7-5.4-6.9-8.3 2.3.1 4.6.2 6.9.2 2.3 0 4.6-.1 6.9-.2-2.2 2.9-4.5 5.7-6.9 8.3zm-18.6-15c-3.8-.5-7.4-1.1-10.8-1.9 1.1-3.3 2.3-6.8 3.8-10.3 1.1 2 2.2 4.1 3.4 6.1 1.2 2.2 2.4 4.1 3.6 6.1zm-7-25.5c-1.5-3.5-2.7-6.9-3.8-10.3 3.4-.8 7-1.4 10.8-1.9-1.2 1.9-2.5 3.9-3.6 6-1.2 2.1-2.3 4.2-3.4 6.2zM64 30.2c2.4 2.6 4.7 5.4 6.9 8.3-2.3-.1-4.6-.2-6.9-.2-2.3 0-4.6.1-6.9.2 2.2-2.9 4.5-5.7 6.9-8.3zm22.2 21l-3.6-6c3.8.5 7.4 1.1 10.8 1.9-1.1 3.3-2.3 6.8-3.8 10.3-1.1-2.1-2.2-4.2-3.4-6.2zM31.7 35c-1.7-10.5-.3-17.9 3.8-20.3 1-.6 2.2-.9 3.5-.9 6 0 13.5 4.9 21 12.3-3.5 3.8-7 8.2-10.4 13-5.8.5-11.3 1.4-16.5 2.5-.6-2.3-1-4.5-1.4-6.6zM7 64c0-4.7 5.7-9.7 15.7-13.4 2-.8 4.2-1.5 6.4-2.1 1.6 5 3.6 10.3 6 15.6-2.4 5.3-4.5 10.5-6 15.5C15.3 75.6 7 69.6 7 64zm28.5 49.3c-4.1-2.4-5.5-9.8-3.8-20.3.3-2.1.8-4.3 1.4-6.6 5.2 1.2 10.7 2 16.5 2.5 3.4 4.8 6.9 9.1 10.4 13-7.4 7.3-14.9 12.3-21 12.3-1.3 0-2.5-.3-3.5-.9zM96.3 93c1.7 10.5.3 17.9-3.8 20.3-1 .6-2.2.9-3.5.9-6 0-13.5-4.9-21-12.3 3.5-3.8 7-8.2 10.4-13 5.8-.5 11.3-1.4 16.5-2.5.6 2.3 1 4.5 1.4 6.6zm9-15.6c-2 .8-4.2 1.5-6.4 2.1-1.6-5-3.6-10.3-6-15.6 2.4-5.3 4.5-10.5 6-15.5 13.8 4 22.1 10 22.1 15.6 0 4.7-5.8 9.7-15.7 13.4z\" />\n </g>\n </svg>\n )\n }\n\n if (language === 'javascript') {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 128 128\">\n <path fill=\"#F0DB4F\" d=\"M1.408 1.408h125.184v125.185H1.408z\" />\n <path\n fill=\"#323330\"\n d=\"M116.347 96.736c-.917-5.711-4.641-10.508-15.672-14.981-3.832-1.761-8.104-3.022-9.377-5.926-.452-1.69-.512-2.642-.226-3.665.821-3.32 4.784-4.355 7.925-3.403 2.023.678 3.938 2.237 5.093 4.724 5.402-3.498 5.391-3.475 9.163-5.879-1.381-2.141-2.118-3.129-3.022-4.045-3.249-3.629-7.676-5.498-14.756-5.355l-3.688.477c-3.534.893-6.902 2.748-8.877 5.235-5.926 6.724-4.236 18.492 2.975 23.335 7.104 5.332 17.54 6.545 18.873 11.531 1.297 6.104-4.486 8.08-10.234 7.378-4.236-.881-6.592-3.034-9.139-6.949-4.688 2.713-4.688 2.713-9.508 5.485 1.143 2.499 2.344 3.63 4.26 5.795 9.068 9.198 31.76 8.746 35.83-5.176.165-.478 1.261-3.666.38-8.581zM69.462 58.943H57.753l-.048 30.272c0 6.438.333 12.34-.714 14.149-1.713 3.558-6.152 3.117-8.175 2.427-2.059-1.012-3.106-2.451-4.319-4.485-.333-.584-.583-1.036-.667-1.071l-9.52 5.83c1.583 3.249 3.915 6.069 6.902 7.901 4.462 2.678 10.459 3.499 16.731 2.059 4.082-1.189 7.604-3.652 9.448-7.401 2.666-4.915 2.094-10.864 2.07-17.444.06-10.735.001-21.468.001-32.237z\"\n />\n </svg>\n )\n }\n\n if (language === 'php') {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 800 400\">\n <g transform=\"translate(-44.632 -141.55)\">\n <g transform=\"matrix(8.3528 0 0 8.3119 -727.13 -3759.5)\">\n <path d=\"m99.974 479.48h14.204c4.1693 0.0354 7.1903 1.2367 9.063 3.604 1.8726 2.3674 2.491 5.6004 1.855 9.699-0.24737 1.8727-0.79504 3.71-1.643 5.512-0.8127 1.802-1.9434 3.4273-3.392 4.876-1.7667 1.8373-3.657 3.0033-5.671 3.498-2.014 0.49467-4.0987 0.742-6.254 0.742h-6.36l-2.014 10.07h-7.367l7.579-38.001m6.201 6.042-3.18 15.9c0.21198 0.0353 0.42398 0.053 0.636 0.053h0.742c3.392 0.0353 6.2186-0.30033 8.48-1.007 2.2613-0.74199 3.7806-3.3213 4.558-7.738 0.63597-3.71-0.00003-5.8476-1.908-6.413-1.8727-0.56531-4.2224-0.83031-7.049-0.795-0.42402 0.0353-0.83035 0.053-1.219 0.053-0.35335 0.00002-0.72435 0.00002-1.113 0l0.053-0.053\" />\n <path d=\"m133.49 469.36h7.314l-2.067 10.123h6.572c3.604 0.0707 6.2893 0.81269 8.056 2.226 1.802 1.4134 2.332 4.0987 1.59 8.056l-3.551 17.649h-7.42l3.392-16.854c0.35328-1.7666 0.2473-3.021-0.318-3.763-0.56536-0.74198-1.7844-1.113-3.657-1.113l-5.883-0.053-4.346 21.783h-7.314l7.632-38.054\" />\n <path d=\"m162.81 479.48h14.204c4.1693 0.0354 7.1903 1.2367 9.063 3.604 1.8726 2.3674 2.491 5.6004 1.855 9.699-0.24737 1.8727-0.79503 3.71-1.643 5.512-0.8127 1.802-1.9434 3.4273-3.392 4.876-1.7667 1.8373-3.657 3.0033-5.671 3.498-2.014 0.49467-4.0987 0.742-6.254 0.742h-6.36l-2.014 10.07h-7.367l7.579-38.001m6.201 6.042-3.18 15.9c0.21199 0.0353 0.42399 0.053 0.636 0.053h0.742c3.392 0.0353 6.2186-0.30033 8.48-1.007 2.2613-0.74199 3.7806-3.3213 4.558-7.738 0.63597-3.71-0.00003-5.8476-1.908-6.413-1.8727-0.56531-4.2224-0.83031-7.049-0.795-0.42402 0.0353-0.83035 0.053-1.219 0.053-0.35335 0.00002-0.72435 0.00002-1.113 0l0.053-0.053\" />\n </g>\n </g>\n </svg>\n )\n }\n\n if (language === 'json') {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 0 160 160\"\n >\n <defs>\n <linearGradient id=\"a\">\n <stop offset=\"0\" />\n <stop offset=\"1\" stopColor=\"#fff\" />\n </linearGradient>\n <linearGradient\n x1=\"-553.27\"\n y1=\"525.908\"\n x2=\"-666.116\"\n y2=\"413.045\"\n id=\"c\"\n xlinkHref=\"#a\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(.99884 0 0 .9987 689.008 -388.844)\"\n />\n <linearGradient\n x1=\"-666.117\"\n y1=\"413.045\"\n x2=\"-553.27\"\n y2=\"525.908\"\n id=\"b\"\n xlinkHref=\"#a\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(.99884 0 0 .9987 689.008 -388.844)\"\n />\n </defs>\n <path\n d=\"M79.865 119.1c35.397 48.255 70.04-13.469 69.988-50.587-.06-43.886-44.54-68.414-70.017-68.414C38.943.1 0 33.895 0 80.135 0 131.531 44.64 160 79.836 160c-7.965-1.147-34.507-6.834-34.863-67.967-.24-41.346 13.487-57.865 34.805-50.599.477.177 23.514 9.265 23.514 38.95 0 29.56-23.427 38.716-23.427 38.716z\"\n style={{marker: 'none'}}\n color=\"#000\"\n fill=\"url(#b)\"\n fillRule=\"evenodd\"\n overflow=\"visible\"\n />\n <path\n d=\"M79.823 41.4C56.433 33.34 27.78 52.618 27.78 91.23c0 63.048 46.72 68.77 52.384 68.77C121.057 160 160 126.204 160 79.964 160 28.568 115.36.1 80.164.1c9.749-1.35 52.541 10.55 52.541 69.037 0 38.141-31.953 58.905-52.735 50.033-.478-.177-23.514-9.264-23.514-38.95 0-29.56 23.367-38.818 23.367-38.818z\"\n style={{marker: 'none'}}\n color=\"#000\"\n fill=\"url(#c)\"\n fillRule=\"evenodd\"\n overflow=\"visible\"\n />\n </svg>\n )\n }\n\n return undefined\n}\n","import {Box, Card, Flex, Label, Text} from '@sanity/ui'\nimport {Suspense} from 'react'\nimport type {PreviewProps} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {CodeMirrorProxy, useMounted} from './codemirror/useCodeMirror'\nimport {useLanguageMode} from './codemirror/useLanguageMode'\nimport type {CodeInputValue, CodeSchemaType} from './types'\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n`\n\n// Studio's inline object chip is `height: calc(1em - 1px)`. 13/16em matches\n// Studio's inline preview text and fits in that content box.\nconst InlineCodeLabel = styled.span`\n box-sizing: border-box;\n display: block;\n font-size: 0.8125em;\n font-weight: 500;\n line-height: 1;\n margin: 0;\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n`\n\n/**\n * @public\n */\nexport interface PreviewCodeProps extends PreviewProps {\n selection?: CodeInputValue\n}\n\nconst inlineCodePreviewMaxLength = 20\n\nfunction capInlineCodePreview(value: string): string {\n if (value.length <= inlineCodePreviewMaxLength) return value\n return `${value.slice(0, inlineCodePreviewMaxLength - 1)}…`\n}\n\nfunction inlineCodeLabel(props: PreviewCodeProps): string {\n const firstLine = props.selection?.code?.split('\\n')[0]?.trim()\n if (firstLine) return capInlineCodePreview(firstLine)\n\n const language = props.selection?.language?.trim()\n if (language) return capInlineCodePreview(language.toUpperCase())\n\n return 'UNKNOWN'\n}\n\n/**\n * @public\n */\nexport function PreviewCode(props: PreviewCodeProps): React.JSX.Element {\n const {selection, schemaType: type, layout} = props\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n const {languageMode} = useLanguageMode(type as CodeSchemaType, props.selection)\n\n const mounted = useMounted()\n\n if (layout === 'inline') {\n return (\n <InlineCodeLabel data-testid=\"inline-code-preview\">{inlineCodeLabel(props)}</InlineCodeLabel>\n )\n }\n\n return (\n <PreviewContainer>\n <Card padding={4}>\n {selection?.filename || selection?.language ? (\n <Card\n paddingBottom={4}\n marginBottom={selection.code ? 4 : 0}\n borderBottom={!!selection.code}\n >\n <Flex align=\"center\" justify=\"flex-end\">\n {selection?.filename ? (\n <Box flex={1}>\n <Text>\n <code>{selection.filename}</code>\n </Text>\n </Box>\n ) : null}\n {selection?.language ? <Label muted>{selection.language}</Label> : null}\n </Flex>\n </Card>\n ) : null}\n {mounted && (\n <Suspense fallback={<Card padding={2}>Loading code preview...</Card>}>\n <CodeMirrorProxy\n readOnly\n editable={false}\n value={selection?.code || ''}\n highlightLines={selection?.highlightedLines || []}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n highlightSelectionMatches: false,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n }}\n languageMode={languageMode}\n />\n </Suspense>\n )}\n </Card>\n </PreviewContainer>\n )\n}\n","import {CodeBlockIcon} from '@sanity/icons/CodeBlock'\nimport {defineType, type ObjectDefinition} from 'sanity'\n\nimport {CodeInput} from './CodeInput'\nimport {getMedia} from './getMedia'\nimport {PreviewCode} from './PreviewCode'\nimport type {CodeOptions} from './types'\n\n/**\n * @public\n */\nexport const codeTypeName = 'code'\n\n/**\n * @public\n */\nexport interface CodeDefinition extends Omit<ObjectDefinition, 'type' | 'fields' | 'options'> {\n type: typeof codeTypeName\n options?: CodeOptions\n}\n\ndeclare module 'sanity' {\n // makes type: 'code' narrow correctly when using defineType/defineField/defineArrayMember\n export interface IntrinsicDefinitions {\n code: CodeDefinition\n }\n}\n\n/**\n * @public\n */\nexport const codeSchema = defineType({\n name: 'code',\n type: 'object',\n title: 'Code',\n components: {input: CodeInput, preview: PreviewCode},\n icon: CodeBlockIcon,\n fields: [\n {\n name: 'language',\n title: 'Language',\n type: 'string',\n },\n {\n name: 'filename',\n title: 'Filename',\n type: 'string',\n },\n {\n title: 'Code',\n name: 'code',\n type: 'text',\n },\n {\n title: 'Highlighted lines',\n name: 'highlightedLines',\n type: 'array',\n of: [\n {\n type: 'number',\n title: 'Highlighted line',\n },\n ],\n },\n ],\n preview: {\n select: {\n language: 'language',\n code: 'code',\n filename: 'filename',\n highlightedLines: 'highlightedLines',\n },\n prepare: (value: {\n language?: string\n code?: string\n filename?: string\n highlightedLines?: number[]\n }) => {\n return {\n title: value.filename || (value.language || 'unknown').toUpperCase(),\n media: getMedia(value?.language),\n selection: value,\n }\n },\n },\n})\n","import {definePlugin, type Plugin} from 'sanity'\n\nimport {CodeInputConfigContext} from './codemirror/CodeModeContext'\nimport type {CodeMode} from './codemirror/defaultCodeModes'\nimport {codeSchema} from './schema'\n\nexport interface CodeInputConfig {\n codeModes?: CodeMode[]\n}\n\n/**\n * @public\n */\nexport const codeInput: Plugin<CodeInputConfig | void> = definePlugin<CodeInputConfig | void>(\n (config) => {\n const codeModes = config && config.codeModes\n const basePlugin = {\n name: '@sanity/code-input',\n schema: {types: [codeSchema]},\n }\n if (!codeModes) {\n return basePlugin\n }\n return {\n ...basePlugin,\n form: {\n components: {\n input: (props) => {\n if (props.id !== 'root') {\n return props.renderDefault(props)\n }\n return (\n <CodeInputConfigContext.Provider value={config}>\n {props.renderDefault(props)}\n </CodeInputConfigContext.Provider>\n )\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["{enabled, children}: FullscreenEditorProps","(node: HTMLDivElement | null) => {\n overlayRef.current = node\n setOverlayElement(node)\n }","useCallback((node: HTMLDivElement | null) => {\n overlayRef.current = node\n setOverlayElement(node)\n }, [])","() => {\n setPaneRect(null)\n setIsFullscreen(false)\n }","useCallback(() => {\n setPaneRect(null)\n setIsFullscreen(false)\n }, [])","() => {\n if (isFullscreen) {\n collapse()\n return\n }\n setPlaceholderHeight(rootRef.current?.offsetHeight ?? EDITOR_HEIGHT)\n setIsFullscreen(true)\n }","useCallback(() => {\n if (isFullscreen) {\n collapse()\n return\n }\n setPlaceholderHeight(rootRef.current?.offsetHeight ?? EDITOR_HEIGHT)\n setIsFullscreen(true)\n }, [isFullscreen, collapse])","(event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n event.nativeEvent.stopImmediatePropagation()\n collapse()\n }\n }","useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n event.nativeEvent.stopImmediatePropagation()\n collapse()\n }\n },\n [collapse],\n )","() => {\n if (!isFullscreen) return undefined\n\n // Fall back to the viewport if the pane can't be found.\n const paneElement = getDocumentPaneElement(rootRef.current)\n\n const update = () => {\n const {top, left, width, height} = paneElement\n ? paneElement.getBoundingClientRect()\n : {top: 0, left: 0, width: window.innerWidth, height: window.innerHeight}\n // Skip unchanged bounds so scroll events don't cause needless re-renders.\n setPaneRect((prev) =>\n prev &&\n prev.top === top &&\n prev.left === left &&\n prev.width === width &&\n prev.height === height\n ? prev\n : {top, left, width, height},\n )\n }\n\n // Defer so we don't setState synchronously.\n const raf = requestAnimationFrame(update)\n let resizeObserver: ResizeObserver | undefined\n if (paneElement) {\n resizeObserver = new ResizeObserver(update)\n resizeObserver.observe(paneElement)\n }\n window.addEventListener('resize', update)\n window.addEventListener('scroll', update, true)\n\n return () => {\n cancelAnimationFrame(raf)\n resizeObserver?.disconnect()\n window.removeEventListener('resize', update)\n window.removeEventListener('scroll', update, true)\n }\n }","[isFullscreen]","() => {\n if (!showFullscreen) return undefined\n\n const raf = requestAnimationFrame(() => {\n const overlay = overlayRef.current\n if (!overlay) return\n const editable = overlay.querySelector<HTMLElement>('.cm-content')\n ;(editable ?? overlay).focus()\n })\n\n return () => cancelAnimationFrame(raf)\n }","[showFullscreen]","raf","enabled && (\n <ToggleButtonBox padding={1}>\n <Tooltip\n animate\n arrow={false}\n // Constrain to the overlay so a surrounding modal's boundary doesn't\n // shift the tooltip; falls back to the viewport when not expanded.\n boundaryElement={overlayElement}\n content={<Text size={1}>{showFullscreen ? 'Collapse editor' : 'Expand editor'}</Text>}\n delay={TOOLTIP_DELAY}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={showFullscreen ? 'Collapse editor' : 'Expand editor'}\n icon={showFullscreen ? CollapseIcon : ExpandIcon}\n mode=\"ghost\"\n onClick={handleToggle}\n padding={2}\n />\n </Tooltip>\n </ToggleButtonBox>\n )","showFullscreen && paneRect\n ? {\n position: 'fixed',\n top: paneRect.top,\n left: paneRect.left,\n width: paneRect.width,\n height: paneRect.height,\n }\n : undefined","<FullscreenRoot ref={rootRef}>\n {showFullscreen ? (\n // Hold the editor's spot in the form layout so sibling fields and the\n // document scroll position don't shift while it's portaled away.\n <>\n <div aria-hidden style={{height: placeholderHeight}} />\n {/* Portal out of any modal so position:fixed is viewport-relative;\n Layer stacks it above the modal. */}\n <Portal>\n <Layer>\n <FullscreenOverlay\n onKeyDown={handleKeyDown}\n ref={setOverlayRef}\n style={fullscreenStyle}\n tabIndex={-1}\n >\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </FullscreenOverlay>\n </Layer>\n </Portal>\n </>\n ) : (\n <>\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </>\n )}\n </FullscreenRoot>","_c","_Fragment","() => {\n requestAnimationFrame(() => startTransition(() => setMounted(true)))\n }","[]","_c","languages.find((entry) => entry.value === language)","(entry) => entry.value === language","configured?.mode ?? resolveAliasedLanguage(language) ?? defaultLanguageMode","mode","{language, languageMode, languages}","useMemo((): CodeInputLanguage[] => {\n const languageAlternatives = type.options?.languageAlternatives\n if (!languageAlternatives) {\n return SUPPORTED_LANGUAGES\n }\n\n if (!Array.isArray(languageAlternatives)) {\n throw new Error(\n `'options.languageAlternatives' should be an array, got ${typeof languageAlternatives}`,\n )\n }\n\n return languageAlternatives.reduce((acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }, [])\n }, [type])","languageAlternatives.reduce((acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }, [])","(acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }","{title, value: val, mode}","_c","_temp","(e: ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.currentTarget.value\n onChange(newValue ? set(newValue) : unset())\n }","useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.currentTarget.value\n onChange(newValue ? set(newValue) : unset())\n },\n [onChange],\n )","languages.map((lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n ))","(lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n )","<Select {...elementProps} value={language} onChange={handleChange}>\n {languages.map((lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n ))}\n </Select>","_c","({elementProps, onChange}: Omit<InputProps, 'renderDefault'>) => {\n return (\n <LanguageInput\n onChange={onChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n elementProps={elementProps as PrimitiveInputElementProps}\n language={language}\n languages={languages}\n />\n )\n }","{elementProps, onChange}: Omit<InputProps, 'renderDefault'>","useCallback(\n ({elementProps, onChange}: Omit<InputProps, 'renderDefault'>) => {\n return (\n <LanguageInput\n onChange={onChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n elementProps={elementProps as PrimitiveInputElementProps}\n language={language}\n languages={languages}\n />\n )\n },\n [languages, language],\n )","<MemberField\n member={member}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />","_c","members.find(\n (member): member is FieldMember => member.kind === 'field' && member.name === fieldName,\n )","(member): member is FieldMember => member.kind === 'field' && member.name === fieldName","useMemo(\n () =>\n members.find(\n (member): member is FieldMember => member.kind === 'field' && member.name === fieldName,\n ),\n [members, fieldName],\n )","_c","() => {\n onPathFocus(PATH_CODE)\n }","useCallback(() => {\n onPathFocus(PATH_CODE)\n }, [onPathFocus])","(lines: number[]) => onChange(set(lines, ['highlightedLines']))","useCallback(\n (lines: number[]) => onChange(set(lines, ['highlightedLines'])),\n [onChange],\n )","(code: string) => {\n onChange(\n codeChangePatches({\n code,\n typeName: type.name,\n selectedLanguage: language,\n }),\n )\n }","name","useCallback(\n (code: string) => {\n onChange(\n codeChangePatches({\n code,\n typeName: type.name,\n selectedLanguage: language,\n }),\n )\n },\n [language, onChange, type.name],\n )","(inputProps) => (\n <FullscreenEditor enabled={fullscreenEnabled}>\n {({isFullscreen}) => (\n <EditorContainer\n $fullscreen={isFullscreen}\n border={!isFullscreen}\n overflow=\"hidden\"\n radius={1}\n sizing=\"border\"\n readOnly={readOnly}\n >\n {mounted && (\n <Suspense\n fallback={\n <Box padding={3}>\n <Text>Loading code editor...</Text>\n </Box>\n }\n >\n <CodeMirrorProxy\n languageMode={languageMode}\n onChange={handleCodeChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n value={inputProps.value as string}\n highlightLines={value?.highlightedLines}\n onHighlightChange={onHighlightChange}\n readOnly={readOnly}\n onFocus={handleCodeFocus}\n onBlur={elementProps.onBlur}\n />\n </Suspense>\n )}\n </EditorContainer>\n )}\n </FullscreenEditor>\n )","onBlur","highlightedLines","{isFullscreen}","useCallback(\n (inputProps) => (\n <FullscreenEditor enabled={fullscreenEnabled}>\n {({isFullscreen}) => (\n <EditorContainer\n $fullscreen={isFullscreen}\n border={!isFullscreen}\n overflow=\"hidden\"\n radius={1}\n sizing=\"border\"\n readOnly={readOnly}\n >\n {mounted && (\n <Suspense\n fallback={\n <Box padding={3}>\n <Text>Loading code editor...</Text>\n </Box>\n }\n >\n <CodeMirrorProxy\n languageMode={languageMode}\n onChange={handleCodeChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n value={inputProps.value as string}\n highlightLines={value?.highlightedLines}\n onHighlightChange={onHighlightChange}\n readOnly={readOnly}\n onFocus={handleCodeFocus}\n onBlur={elementProps.onBlur}\n />\n </Suspense>\n )}\n </EditorContainer>\n )}\n </FullscreenEditor>\n ),\n [\n fullscreenEnabled,\n readOnly,\n mounted,\n languageMode,\n handleCodeChange,\n value?.highlightedLines,\n onHighlightChange,\n handleCodeFocus,\n elementProps.onBlur,\n ],\n )","languageFieldMember && (\n <LanguageField\n member={languageFieldMember}\n language={language}\n languages={languages}\n renderField={renderField}\n renderItem={renderItem}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )","type.options?.withFilename && filenameMember && (\n <MemberField\n member={filenameMember}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )","withFilename","codeFieldMember && (\n <MemberField\n member={codeFieldMember}\n renderInput={renderCodeInput}\n renderItem={renderItem}\n renderField={renderField}\n renderPreview={renderPreview}\n />\n )","<Stack gap={4}>\n {languageFieldMember && (\n <LanguageField\n member={languageFieldMember}\n language={language}\n languages={languages}\n renderField={renderField}\n renderItem={renderItem}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {type.options?.withFilename && filenameMember && (\n <MemberField\n member={filenameMember}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {codeFieldMember && (\n <MemberField\n member={codeFieldMember}\n renderInput={renderCodeInput}\n renderItem={renderItem}\n renderField={renderField}\n renderPreview={renderPreview}\n />\n )}\n </Stack>","_c","inlineCodeLabel(props)","<InlineCodeLabel data-testid=\"inline-code-preview\">{inlineCodeLabel(props)}</InlineCodeLabel>","selection?.filename || selection?.language ? (\n <Card\n paddingBottom={4}\n marginBottom={selection.code ? 4 : 0}\n borderBottom={!!selection.code}\n >\n <Flex align=\"center\" justify=\"flex-end\">\n {selection?.filename ? (\n <Box flex={1}>\n <Text>\n <code>{selection.filename}</code>\n </Text>\n </Box>\n ) : null}\n {selection?.language ? <Label muted>{selection.language}</Label> : null}\n </Flex>\n </Card>\n ) : null","selection?.filename","mounted && (\n <Suspense fallback={<Card padding={2}>Loading code preview...</Card>}>\n <CodeMirrorProxy\n readOnly\n editable={false}\n value={selection?.code || ''}\n highlightLines={selection?.highlightedLines || []}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n highlightSelectionMatches: false,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n }}\n languageMode={languageMode}\n />\n </Suspense>\n )","code","highlightedLines","<PreviewContainer>\n <Card padding={4}>\n {selection?.filename || selection?.language ? (\n <Card\n paddingBottom={4}\n marginBottom={selection.code ? 4 : 0}\n borderBottom={!!selection.code}\n >\n <Flex align=\"center\" justify=\"flex-end\">\n {selection?.filename ? (\n <Box flex={1}>\n <Text>\n <code>{selection.filename}</code>\n </Text>\n </Box>\n ) : null}\n {selection?.language ? <Label muted>{selection.language}</Label> : null}\n </Flex>\n </Card>\n ) : null}\n {mounted && (\n <Suspense fallback={<Card padding={2}>Loading code preview...</Card>}>\n <CodeMirrorProxy\n readOnly\n editable={false}\n value={selection?.code || ''}\n highlightLines={selection?.highlightedLines || []}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n highlightSelectionMatches: false,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n }}\n languageMode={languageMode}\n />\n </Suspense>\n )}\n </Card>\n </PreviewContainer>","_c"],"sources":["../src/config.ts","../src/codeChangePatches.ts","../src/ui/focusRingStyle.ts","../src/CodeInputFullscreen.tsx","../src/codemirror/useCodeMirror.tsx","../src/codemirror/useLanguageMode.tsx","../src/LanguageInput.tsx","../src/LanguageField.tsx","../src/useFieldMember.ts","../src/CodeInput.tsx","../src/getMedia.tsx","../src/PreviewCode.tsx","../src/schema.tsx","../src/plugin.tsx"],"sourcesContent":["import type {CodeInputLanguage} from './types'\n\n// NOTE: MAKE SURE THESE ALIGN WITH CODE MODES IN ./codemirror/defaultCodeModes.ts\nexport const SUPPORTED_LANGUAGES: CodeInputLanguage[] = [\n {title: 'Batch file', value: 'batchfile'},\n {title: 'C#', value: 'csharp'},\n {title: 'CSS', value: 'css'},\n {title: 'Go', value: 'golang'},\n {title: 'GROQ', value: 'groq'},\n {title: 'HTML', value: 'html'},\n {title: 'Java', value: 'java'},\n {title: 'JavaScript', value: 'javascript'},\n {title: 'JSON', value: 'json'},\n {title: 'JSX', value: 'jsx'},\n {title: 'Markdown', value: 'markdown'},\n {title: 'MySQL', value: 'mysql'},\n {title: 'PHP', value: 'php'},\n {title: 'Plain text', value: 'text'},\n {title: 'Python', value: 'python'},\n {title: 'Ruby', value: 'ruby'},\n {title: 'SASS', value: 'sass'},\n {title: 'SCSS', value: 'scss'},\n {title: 'sh', value: 'sh'},\n {title: 'SQL', value: 'sql'},\n {title: 'TSX', value: 'tsx'},\n {title: 'TypeScript', value: 'typescript'},\n {title: 'XML', value: 'xml'},\n {title: 'YAML', value: 'yaml'},\n]\n\nexport const LANGUAGE_ALIASES: Record<string, string | undefined> = {js: 'javascript'}\n\nexport const PATH_CODE = ['code']\n","import {type FormPatch, set, setIfMissing, unset} from 'sanity'\n\nimport {PATH_CODE} from './config'\n\nconst PATH_LANGUAGE = ['language']\n\n/**\n * Patches for a code editor change.\n *\n * `selectedLanguage` is the language the control is showing: the stored value,\n * `options.language`, or plain text when neither is set.\n *\n * Studio prepends `setIfMissing({_type})` before these patches, so a language\n * nested inside that object is ignored once the object exists. A field-level\n * `setIfMissing` still fills `language` when it is absent, and leaves a value\n * already present when the patch is applied.\n */\nexport function codeChangePatches({\n code,\n typeName,\n selectedLanguage,\n}: {\n code: string\n typeName: string\n selectedLanguage: string\n}): FormPatch[] {\n const patches: FormPatch[] = [setIfMissing({_type: typeName})]\n\n if (selectedLanguage) {\n patches.push(setIfMissing(selectedLanguage, PATH_LANGUAGE))\n }\n\n patches.push(code ? set(code, PATH_CODE) : unset(PATH_CODE))\n return patches\n}\n","/** @internal */\n// todo: import from @sanity/ui instead\nexport function focusRingBorderStyle(border: {color: string; width: number}): string {\n return `inset 0 0 0 ${border.width}px ${border.color}`\n}\n\n/** @internal */\n// todo: import from @sanity/ui instead\nexport function focusRingStyle(opts: {\n base?: {bg: string}\n border?: {color: string; width: number}\n focusRing: {offset: number; width: number}\n}): string {\n const {base, border, focusRing} = opts\n const focusRingOutsetWidth = focusRing.offset + focusRing.width\n const focusRingInsetWidth = 0 - focusRing.offset\n const bgColor = base ? base.bg : 'var(--card-bg-color)'\n\n return [\n focusRingInsetWidth > 0 && `inset 0 0 0 ${focusRingInsetWidth}px var(--card-focus-ring-color)`,\n border && focusRingBorderStyle(border),\n focusRingInsetWidth < 0 && `0 0 0 ${0 - focusRingInsetWidth}px ${bgColor}`,\n focusRingOutsetWidth > 0 && `0 0 0 ${focusRingOutsetWidth}px var(--card-focus-ring-color)`,\n ]\n .filter(Boolean)\n .join(',')\n}\n","import {CollapseIcon} from '@sanity/icons/Collapse'\nimport {ExpandIcon} from '@sanity/icons/Expand'\nimport {Box, Button, Card, Layer, Portal, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type CSSProperties, type ReactNode, useCallback, useEffect, useRef, useState} from 'react'\nimport {css, styled} from 'styled-components'\n\nimport {focusRingBorderStyle, focusRingStyle} from './ui/focusRingStyle'\n\n// Match the Studio's tooltip timing (TOOLTIP_DELAY_PROPS in `sanity`)\nconst TOOLTIP_DELAY = {open: 400}\n\n// Default editor height; also the placeholder height while expanded.\nconst EDITOR_HEIGHT = 250\n\n// Studio DOM markers for the document pane and its scroll container\nconst DOCUMENT_PANE_SELECTOR = '[data-testid=\"document-pane\"]'\nconst DOCUMENT_PANEL_SCROLLER_SELECTOR = '[data-testid=\"document-panel-scroller\"]'\n// Selected pane — disambiguates split-view layouts\nconst SELECTED_PANE_SCROLLER_SELECTOR = `${DOCUMENT_PANE_SELECTOR}[data-pane-selected=\"true\"] ${DOCUMENT_PANEL_SCROLLER_SELECTOR}`\n\n// Nearest scrollable ancestor — last-resort pane fallback.\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n let current = node?.parentElement ?? null\n while (current) {\n const {overflowY} = window.getComputedStyle(current)\n if (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') {\n return current\n }\n current = current.parentElement\n }\n return null\n}\n\n// Resolve the document pane's scroll container so the overlay fills the pane —\n// not the viewport, and not a surrounding modal (rendered in a portal).\nfunction getDocumentPaneElement(node: HTMLElement | null): HTMLElement | null {\n if (!node) return null\n\n const ownPane = node.closest(DOCUMENT_PANE_SELECTOR)\n if (ownPane instanceof HTMLElement) {\n const scroller = ownPane.querySelector(DOCUMENT_PANEL_SCROLLER_SELECTOR)\n return scroller instanceof HTMLElement ? scroller : ownPane\n }\n\n // In a portal (modal): can't walk up. Prefer selected pane, then any pane,\n // then the nearest scrollable ancestor.\n const selectedScroller = document.querySelector(SELECTED_PANE_SCROLLER_SELECTOR)\n if (selectedScroller instanceof HTMLElement) return selectedScroller\n\n const scroller = document.querySelector(DOCUMENT_PANEL_SCROLLER_SELECTOR)\n if (scroller instanceof HTMLElement) return scroller\n\n return getScrollParent(node)\n}\n\n// In-place anchor; also the reference for locating the document pane.\nconst FullscreenRoot = styled.div`\n position: relative;\n`\n\n// Portaled container, pinned to the pane bounds via inline style. Draws the\n// top/bottom divider (flush with the pane sides).\nconst FullscreenOverlay = styled.div(({theme}) => {\n // oxlint-disable-next-line typescript/no-deprecated\n const {input} = theme.sanity\n // oxlint-disable-next-line typescript/no-deprecated\n const borderColor = theme.sanity.color.input.default.enabled.border\n\n return css`\n box-sizing: border-box;\n overflow: hidden;\n border-top: ${input.border.width}px solid ${borderColor};\n border-bottom: ${input.border.width}px solid ${borderColor};\n `\n})\n\nconst ToggleButtonBox = styled(Box)`\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n`\n\n/** Editor container; fills its parent when `$fullscreen`. */\nexport const EditorContainer = styled(Card)<{$fullscreen: boolean}>(({theme, $fullscreen}) => {\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const {focusRing, input} = theme.sanity\n // oxlint-disable-next-line typescript/no-deprecated\n const base = theme.sanity.color.base\n // oxlint-disable-next-line typescript/no-deprecated\n const color = theme.sanity.color.input\n const border = {\n color: color.default.enabled.border,\n width: input.border.width,\n }\n\n return css`\n --input-box-shadow: ${focusRingBorderStyle(border)};\n\n box-shadow: var(--input-box-shadow);\n height: ${EDITOR_HEIGHT}px;\n min-height: 80px;\n overflow-y: auto;\n position: relative;\n resize: vertical;\n z-index: 0;\n\n & > .cm-theme {\n height: 100%;\n }\n\n &:focus-within {\n --input-box-shadow: ${focusRingStyle({\n base,\n border,\n focusRing,\n })};\n }\n\n ${\n $fullscreen &&\n css`\n height: 100%;\n border-radius: 0;\n resize: none;\n background-color: ${base.bg};\n /* Divider drawn on the overlay so the sides sit flush with the pane */\n box-shadow: none;\n `\n }\n `\n})\n\ninterface FullscreenEditorProps {\n /** When false, renders children without the expand button. */\n enabled: boolean\n children: (state: {isFullscreen: boolean}) => ReactNode\n}\n\n/** Wraps the editor with an \"Expand editor\" toggle that fills the document pane. */\nexport function FullscreenEditor({enabled, children}: FullscreenEditorProps): React.JSX.Element {\n const [isFullscreen, setIsFullscreen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n const overlayRef = useRef<HTMLDivElement>(null)\n // Overlay node in state too — used as the tooltip's boundary element.\n const [overlayElement, setOverlayElement] = useState<HTMLDivElement | null>(null)\n const setOverlayRef = useCallback((node: HTMLDivElement | null) => {\n overlayRef.current = node\n setOverlayElement(node)\n }, [])\n // Document pane bounds, used to size the overlay.\n const [paneRect, setPaneRect] = useState<{\n top: number\n left: number\n width: number\n height: number\n } | null>(null)\n // Editor height captured when expanding, so the in-place placeholder keeps the\n // surrounding fields from shifting while the editor is portaled away.\n const [placeholderHeight, setPlaceholderHeight] = useState(EDITOR_HEIGHT)\n\n // Only treat as fullscreen once the pane is measured.\n const showFullscreen = isFullscreen && paneRect !== null\n\n // Reset paneRect alongside isFullscreen so the next expand re-measures (rather\n // than rendering at stale coordinates). Done here, not in the effect cleanup,\n // to avoid a state update when the component unmounts while expanded.\n const collapse = useCallback(() => {\n setPaneRect(null)\n setIsFullscreen(false)\n }, [])\n\n const handleToggle = useCallback(() => {\n if (isFullscreen) {\n collapse()\n return\n }\n setPlaceholderHeight(rootRef.current?.offsetHeight ?? EDITOR_HEIGHT)\n setIsFullscreen(true)\n }, [isFullscreen, collapse])\n\n // Exit on Escape, scoped to the overlay so other Studio UI keeps its own\n // handling; stopImmediatePropagation keeps a surrounding modal open.\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n event.nativeEvent.stopImmediatePropagation()\n collapse()\n }\n },\n [collapse],\n )\n\n // Track the pane bounds while fullscreen so the overlay fills the pane.\n useEffect(() => {\n if (!isFullscreen) return undefined\n\n // Fall back to the viewport if the pane can't be found.\n const paneElement = getDocumentPaneElement(rootRef.current)\n\n const update = () => {\n const {top, left, width, height} = paneElement\n ? paneElement.getBoundingClientRect()\n : {top: 0, left: 0, width: window.innerWidth, height: window.innerHeight}\n // Skip unchanged bounds so scroll events don't cause needless re-renders.\n setPaneRect((prev) =>\n prev &&\n prev.top === top &&\n prev.left === left &&\n prev.width === width &&\n prev.height === height\n ? prev\n : {top, left, width, height},\n )\n }\n\n // Defer so we don't setState synchronously.\n const raf = requestAnimationFrame(update)\n let resizeObserver: ResizeObserver | undefined\n if (paneElement) {\n resizeObserver = new ResizeObserver(update)\n resizeObserver.observe(paneElement)\n }\n window.addEventListener('resize', update)\n window.addEventListener('scroll', update, true)\n\n return () => {\n cancelAnimationFrame(raf)\n resizeObserver?.disconnect()\n window.removeEventListener('resize', update)\n window.removeEventListener('scroll', update, true)\n }\n }, [isFullscreen])\n\n // Portaling drops focus to <body>; move it into the overlay so Escape and\n // typing work.\n useEffect(() => {\n if (!showFullscreen) return undefined\n\n const raf = requestAnimationFrame(() => {\n const overlay = overlayRef.current\n if (!overlay) return\n const editable = overlay.querySelector<HTMLElement>('.cm-content')\n ;(editable ?? overlay).focus()\n })\n\n return () => cancelAnimationFrame(raf)\n }, [showFullscreen])\n\n const toggleButton = enabled && (\n <ToggleButtonBox padding={1}>\n <Tooltip\n animate\n arrow={false}\n // Constrain to the overlay so a surrounding modal's boundary doesn't\n // shift the tooltip; falls back to the viewport when not expanded.\n boundaryElement={overlayElement}\n content={<Text size={1}>{showFullscreen ? 'Collapse editor' : 'Expand editor'}</Text>}\n delay={TOOLTIP_DELAY}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={showFullscreen ? 'Collapse editor' : 'Expand editor'}\n icon={showFullscreen ? CollapseIcon : ExpandIcon}\n mode=\"ghost\"\n onClick={handleToggle}\n padding={2}\n />\n </Tooltip>\n </ToggleButtonBox>\n )\n\n const fullscreenStyle: CSSProperties | undefined =\n showFullscreen && paneRect\n ? {\n position: 'fixed',\n top: paneRect.top,\n left: paneRect.left,\n width: paneRect.width,\n height: paneRect.height,\n }\n : undefined\n\n return (\n <FullscreenRoot ref={rootRef}>\n {showFullscreen ? (\n // Hold the editor's spot in the form layout so sibling fields and the\n // document scroll position don't shift while it's portaled away.\n <>\n <div aria-hidden style={{height: placeholderHeight}} />\n {/* Portal out of any modal so position:fixed is viewport-relative;\n Layer stacks it above the modal. */}\n <Portal>\n <Layer>\n <FullscreenOverlay\n onKeyDown={handleKeyDown}\n ref={setOverlayRef}\n style={fullscreenStyle}\n tabIndex={-1}\n >\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </FullscreenOverlay>\n </Layer>\n </Portal>\n </>\n ) : (\n <>\n {toggleButton}\n {children({isFullscreen: showFullscreen})}\n </>\n )}\n </FullscreenRoot>\n )\n}\n","import {lazy, startTransition, useEffect, useState} from 'react'\n\nexport const CodeMirrorProxy = lazy(() => import('./CodeMirrorProxy'))\n\nexport function useMounted() {\n const [mounted, setMounted] = useState(false)\n useEffect(() => {\n requestAnimationFrame(() => startTransition(() => setMounted(true)))\n }, [])\n return mounted\n}\n","import {useMemo} from 'react'\n\nimport {LANGUAGE_ALIASES, SUPPORTED_LANGUAGES} from '../config'\nimport type {CodeInputLanguage, CodeInputValue, CodeSchemaType} from '../types'\n\nconst defaultLanguageMode = 'text'\n\nexport function useLanguageMode(\n schemaType: CodeSchemaType,\n value?: CodeInputValue,\n): {\n language: string\n languageMode: string\n languages: CodeInputLanguage[]\n} {\n const languages = useLanguageAlternatives(schemaType)\n const fixedLanguage = schemaType.options?.language\n const language = value?.language ?? fixedLanguage ?? defaultLanguageMode\n\n // the language config from the schema\n const configured = languages.find((entry) => entry.value === language)\n const languageMode = configured?.mode ?? resolveAliasedLanguage(language) ?? defaultLanguageMode\n\n return {language, languageMode, languages}\n}\n\nfunction resolveAliasedLanguage(lang?: string) {\n return (lang && LANGUAGE_ALIASES[lang]) ?? lang\n}\n\nfunction useLanguageAlternatives(type: CodeSchemaType) {\n return useMemo((): CodeInputLanguage[] => {\n const languageAlternatives = type.options?.languageAlternatives\n if (!languageAlternatives) {\n return SUPPORTED_LANGUAGES\n }\n\n if (!Array.isArray(languageAlternatives)) {\n throw new Error(\n `'options.languageAlternatives' should be an array, got ${typeof languageAlternatives}`,\n )\n }\n\n return languageAlternatives.reduce((acc: CodeInputLanguage[], {title, value: val, mode}) => {\n const alias = LANGUAGE_ALIASES[val]\n if (alias) {\n console.warn(\n `'options.languageAlternatives' lists a language with value \"%s\", which is an alias of \"%s\" - please replace the value to read \"%s\"`,\n val,\n alias,\n alias,\n )\n\n return acc.concat({title, value: alias, mode: mode})\n }\n return acc.concat({title, value: val, mode})\n }, [])\n }, [type])\n}\n","import {Select} from '@sanity/ui'\nimport {type ChangeEvent, useCallback} from 'react'\nimport {set, type StringInputProps, unset} from 'sanity'\n\nimport type {CodeInputLanguage} from './types'\n\nexport interface LanguageInputProps {\n language: string\n languages: CodeInputLanguage[]\n onChange: StringInputProps['onChange']\n elementProps: StringInputProps['elementProps']\n}\n\n/** @internal */\nexport function LanguageInput(props: LanguageInputProps) {\n const {language, languages, onChange, elementProps} = props\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.currentTarget.value\n onChange(newValue ? set(newValue) : unset())\n },\n [onChange],\n )\n\n return (\n <Select {...elementProps} value={language} onChange={handleChange}>\n {languages.map((lang: {title: string; value: string}) => (\n <option key={lang.value} value={lang.value}>\n {lang.title}\n </option>\n ))}\n </Select>\n )\n}\n","import {useCallback} from 'react'\nimport {\n type FieldMember,\n type InputProps,\n MemberField,\n type MemberFieldProps,\n type PrimitiveInputElementProps,\n} from 'sanity'\n\nimport {LanguageInput} from './LanguageInput'\nimport type {CodeInputLanguage} from './types'\n\nexport function LanguageField(\n props: MemberFieldProps & {member: FieldMember; language: string; languages: CodeInputLanguage[]},\n) {\n const {member, languages, language, renderItem, renderField, renderPreview} = props\n\n const renderInput = useCallback(\n ({elementProps, onChange}: Omit<InputProps, 'renderDefault'>) => {\n return (\n <LanguageInput\n onChange={onChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n elementProps={elementProps as PrimitiveInputElementProps}\n language={language}\n languages={languages}\n />\n )\n },\n [languages, language],\n )\n\n return (\n <MemberField\n member={member}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )\n}\n","import {useMemo} from 'react'\nimport type {FieldMember, ObjectMember} from 'sanity'\n\n/** @internal */\nexport function useFieldMember(\n members: ObjectMember[],\n fieldName: string,\n): FieldMember | undefined {\n return useMemo(\n () =>\n members.find(\n (member): member is FieldMember => member.kind === 'field' && member.name === fieldName,\n ),\n [members, fieldName],\n )\n}\n","import {Box, Stack, Text} from '@sanity/ui'\nimport {Suspense, useCallback} from 'react'\nimport {MemberField, type ObjectInputProps, type RenderInputCallback, set} from 'sanity'\n\nimport {codeChangePatches} from './codeChangePatches'\nimport {EditorContainer, FullscreenEditor} from './CodeInputFullscreen'\nimport {CodeMirrorProxy, useMounted} from './codemirror/useCodeMirror'\nimport {useLanguageMode} from './codemirror/useLanguageMode'\nimport {PATH_CODE} from './config'\nimport {LanguageField} from './LanguageField'\nimport type {CodeInputValue, CodeSchemaType} from './types'\nimport {useFieldMember} from './useFieldMember'\n\n/**\n * @public\n */\nexport interface CodeInputProps extends ObjectInputProps<CodeInputValue, CodeSchemaType> {}\n\n/** @public */\nexport function CodeInput(props: CodeInputProps): React.JSX.Element {\n const {\n members,\n elementProps,\n onChange,\n readOnly,\n renderField,\n renderInput,\n renderItem,\n renderPreview,\n schemaType: type,\n value,\n onPathFocus,\n } = props\n\n const languageFieldMember = useFieldMember(members, 'language')\n const filenameMember = useFieldMember(members, 'filename')\n const codeFieldMember = useFieldMember(members, 'code')\n\n const handleCodeFocus = useCallback(() => {\n onPathFocus(PATH_CODE)\n }, [onPathFocus])\n\n const {languages, language, languageMode} = useLanguageMode(props.schemaType, props.value)\n\n const onHighlightChange = useCallback(\n (lines: number[]) => onChange(set(lines, ['highlightedLines'])),\n [onChange],\n )\n\n const handleCodeChange = useCallback(\n (code: string) => {\n onChange(\n codeChangePatches({\n code,\n typeName: type.name,\n selectedLanguage: language,\n }),\n )\n },\n [language, onChange, type.name],\n )\n\n const mounted = useMounted()\n\n const fullscreenEnabled = !type.options?.disableFullscreen\n\n const renderCodeInput: RenderInputCallback = useCallback(\n (inputProps) => (\n <FullscreenEditor enabled={fullscreenEnabled}>\n {({isFullscreen}) => (\n <EditorContainer\n $fullscreen={isFullscreen}\n border={!isFullscreen}\n overflow=\"hidden\"\n radius={1}\n sizing=\"border\"\n readOnly={readOnly}\n >\n {mounted && (\n <Suspense\n fallback={\n <Box padding={3}>\n <Text>Loading code editor...</Text>\n </Box>\n }\n >\n <CodeMirrorProxy\n languageMode={languageMode}\n onChange={handleCodeChange}\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n value={inputProps.value as string}\n highlightLines={value?.highlightedLines}\n onHighlightChange={onHighlightChange}\n readOnly={readOnly}\n onFocus={handleCodeFocus}\n onBlur={elementProps.onBlur}\n />\n </Suspense>\n )}\n </EditorContainer>\n )}\n </FullscreenEditor>\n ),\n [\n fullscreenEnabled,\n readOnly,\n mounted,\n languageMode,\n handleCodeChange,\n value?.highlightedLines,\n onHighlightChange,\n handleCodeFocus,\n elementProps.onBlur,\n ],\n )\n\n return (\n <Stack gap={4}>\n {languageFieldMember && (\n <LanguageField\n member={languageFieldMember}\n language={language}\n languages={languages}\n renderField={renderField}\n renderItem={renderItem}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {type.options?.withFilename && filenameMember && (\n <MemberField\n member={filenameMember}\n renderItem={renderItem}\n renderField={renderField}\n renderInput={renderInput}\n renderPreview={renderPreview}\n />\n )}\n\n {codeFieldMember && (\n <MemberField\n member={codeFieldMember}\n renderInput={renderCodeInput}\n renderItem={renderItem}\n renderField={renderField}\n renderPreview={renderPreview}\n />\n )}\n </Stack>\n )\n}\n","export function getMedia(language?: string) {\n if (language === 'jsx') {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 128 128\">\n <g fill=\"#61DAFB\">\n <circle cx=\"64\" cy=\"64\" r=\"11.4\" />\n <path d=\"M107.3 45.2c-2.2-.8-4.5-1.6-6.9-2.3.6-2.4 1.1-4.8 1.5-7.1 2.1-13.2-.2-22.5-6.6-26.1-1.9-1.1-4-1.6-6.4-1.6-7 0-15.9 5.2-24.9 13.9-9-8.7-17.9-13.9-24.9-13.9-2.4 0-4.5.5-6.4 1.6-6.4 3.7-8.7 13-6.6 26.1.4 2.3.9 4.7 1.5 7.1-2.4.7-4.7 1.4-6.9 2.3C8.2 50 1.4 56.6 1.4 64s6.9 14 19.3 18.8c2.2.8 4.5 1.6 6.9 2.3-.6 2.4-1.1 4.8-1.5 7.1-2.1 13.2.2 22.5 6.6 26.1 1.9 1.1 4 1.6 6.4 1.6 7.1 0 16-5.2 24.9-13.9 9 8.7 17.9 13.9 24.9 13.9 2.4 0 4.5-.5 6.4-1.6 6.4-3.7 8.7-13 6.6-26.1-.4-2.3-.9-4.7-1.5-7.1 2.4-.7 4.7-1.4 6.9-2.3 12.5-4.8 19.3-11.4 19.3-18.8s-6.8-14-19.3-18.8zM92.5 14.7c4.1 2.4 5.5 9.8 3.8 20.3-.3 2.1-.8 4.3-1.4 6.6-5.2-1.2-10.7-2-16.5-2.5-3.4-4.8-6.9-9.1-10.4-13 7.4-7.3 14.9-12.3 21-12.3 1.3 0 2.5.3 3.5.9zM81.3 74c-1.8 3.2-3.9 6.4-6.1 9.6-3.7.3-7.4.4-11.2.4-3.9 0-7.6-.1-11.2-.4-2.2-3.2-4.2-6.4-6-9.6-1.9-3.3-3.7-6.7-5.3-10 1.6-3.3 3.4-6.7 5.3-10 1.8-3.2 3.9-6.4 6.1-9.6 3.7-.3 7.4-.4 11.2-.4 3.9 0 7.6.1 11.2.4 2.2 3.2 4.2 6.4 6 9.6 1.9 3.3 3.7 6.7 5.3 10-1.7 3.3-3.4 6.6-5.3 10zm8.3-3.3c1.5 3.5 2.7 6.9 3.8 10.3-3.4.8-7 1.4-10.8 1.9 1.2-1.9 2.5-3.9 3.6-6 1.2-2.1 2.3-4.2 3.4-6.2zM64 97.8c-2.4-2.6-4.7-5.4-6.9-8.3 2.3.1 4.6.2 6.9.2 2.3 0 4.6-.1 6.9-.2-2.2 2.9-4.5 5.7-6.9 8.3zm-18.6-15c-3.8-.5-7.4-1.1-10.8-1.9 1.1-3.3 2.3-6.8 3.8-10.3 1.1 2 2.2 4.1 3.4 6.1 1.2 2.2 2.4 4.1 3.6 6.1zm-7-25.5c-1.5-3.5-2.7-6.9-3.8-10.3 3.4-.8 7-1.4 10.8-1.9-1.2 1.9-2.5 3.9-3.6 6-1.2 2.1-2.3 4.2-3.4 6.2zM64 30.2c2.4 2.6 4.7 5.4 6.9 8.3-2.3-.1-4.6-.2-6.9-.2-2.3 0-4.6.1-6.9.2 2.2-2.9 4.5-5.7 6.9-8.3zm22.2 21l-3.6-6c3.8.5 7.4 1.1 10.8 1.9-1.1 3.3-2.3 6.8-3.8 10.3-1.1-2.1-2.2-4.2-3.4-6.2zM31.7 35c-1.7-10.5-.3-17.9 3.8-20.3 1-.6 2.2-.9 3.5-.9 6 0 13.5 4.9 21 12.3-3.5 3.8-7 8.2-10.4 13-5.8.5-11.3 1.4-16.5 2.5-.6-2.3-1-4.5-1.4-6.6zM7 64c0-4.7 5.7-9.7 15.7-13.4 2-.8 4.2-1.5 6.4-2.1 1.6 5 3.6 10.3 6 15.6-2.4 5.3-4.5 10.5-6 15.5C15.3 75.6 7 69.6 7 64zm28.5 49.3c-4.1-2.4-5.5-9.8-3.8-20.3.3-2.1.8-4.3 1.4-6.6 5.2 1.2 10.7 2 16.5 2.5 3.4 4.8 6.9 9.1 10.4 13-7.4 7.3-14.9 12.3-21 12.3-1.3 0-2.5-.3-3.5-.9zM96.3 93c1.7 10.5.3 17.9-3.8 20.3-1 .6-2.2.9-3.5.9-6 0-13.5-4.9-21-12.3 3.5-3.8 7-8.2 10.4-13 5.8-.5 11.3-1.4 16.5-2.5.6 2.3 1 4.5 1.4 6.6zm9-15.6c-2 .8-4.2 1.5-6.4 2.1-1.6-5-3.6-10.3-6-15.6 2.4-5.3 4.5-10.5 6-15.5 13.8 4 22.1 10 22.1 15.6 0 4.7-5.8 9.7-15.7 13.4z\" />\n </g>\n </svg>\n )\n }\n\n if (language === 'javascript') {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 128 128\">\n <path fill=\"#F0DB4F\" d=\"M1.408 1.408h125.184v125.185H1.408z\" />\n <path\n fill=\"#323330\"\n d=\"M116.347 96.736c-.917-5.711-4.641-10.508-15.672-14.981-3.832-1.761-8.104-3.022-9.377-5.926-.452-1.69-.512-2.642-.226-3.665.821-3.32 4.784-4.355 7.925-3.403 2.023.678 3.938 2.237 5.093 4.724 5.402-3.498 5.391-3.475 9.163-5.879-1.381-2.141-2.118-3.129-3.022-4.045-3.249-3.629-7.676-5.498-14.756-5.355l-3.688.477c-3.534.893-6.902 2.748-8.877 5.235-5.926 6.724-4.236 18.492 2.975 23.335 7.104 5.332 17.54 6.545 18.873 11.531 1.297 6.104-4.486 8.08-10.234 7.378-4.236-.881-6.592-3.034-9.139-6.949-4.688 2.713-4.688 2.713-9.508 5.485 1.143 2.499 2.344 3.63 4.26 5.795 9.068 9.198 31.76 8.746 35.83-5.176.165-.478 1.261-3.666.38-8.581zM69.462 58.943H57.753l-.048 30.272c0 6.438.333 12.34-.714 14.149-1.713 3.558-6.152 3.117-8.175 2.427-2.059-1.012-3.106-2.451-4.319-4.485-.333-.584-.583-1.036-.667-1.071l-9.52 5.83c1.583 3.249 3.915 6.069 6.902 7.901 4.462 2.678 10.459 3.499 16.731 2.059 4.082-1.189 7.604-3.652 9.448-7.401 2.666-4.915 2.094-10.864 2.07-17.444.06-10.735.001-21.468.001-32.237z\"\n />\n </svg>\n )\n }\n\n if (language === 'php') {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 800 400\">\n <g transform=\"translate(-44.632 -141.55)\">\n <g transform=\"matrix(8.3528 0 0 8.3119 -727.13 -3759.5)\">\n <path d=\"m99.974 479.48h14.204c4.1693 0.0354 7.1903 1.2367 9.063 3.604 1.8726 2.3674 2.491 5.6004 1.855 9.699-0.24737 1.8727-0.79504 3.71-1.643 5.512-0.8127 1.802-1.9434 3.4273-3.392 4.876-1.7667 1.8373-3.657 3.0033-5.671 3.498-2.014 0.49467-4.0987 0.742-6.254 0.742h-6.36l-2.014 10.07h-7.367l7.579-38.001m6.201 6.042-3.18 15.9c0.21198 0.0353 0.42398 0.053 0.636 0.053h0.742c3.392 0.0353 6.2186-0.30033 8.48-1.007 2.2613-0.74199 3.7806-3.3213 4.558-7.738 0.63597-3.71-0.00003-5.8476-1.908-6.413-1.8727-0.56531-4.2224-0.83031-7.049-0.795-0.42402 0.0353-0.83035 0.053-1.219 0.053-0.35335 0.00002-0.72435 0.00002-1.113 0l0.053-0.053\" />\n <path d=\"m133.49 469.36h7.314l-2.067 10.123h6.572c3.604 0.0707 6.2893 0.81269 8.056 2.226 1.802 1.4134 2.332 4.0987 1.59 8.056l-3.551 17.649h-7.42l3.392-16.854c0.35328-1.7666 0.2473-3.021-0.318-3.763-0.56536-0.74198-1.7844-1.113-3.657-1.113l-5.883-0.053-4.346 21.783h-7.314l7.632-38.054\" />\n <path d=\"m162.81 479.48h14.204c4.1693 0.0354 7.1903 1.2367 9.063 3.604 1.8726 2.3674 2.491 5.6004 1.855 9.699-0.24737 1.8727-0.79503 3.71-1.643 5.512-0.8127 1.802-1.9434 3.4273-3.392 4.876-1.7667 1.8373-3.657 3.0033-5.671 3.498-2.014 0.49467-4.0987 0.742-6.254 0.742h-6.36l-2.014 10.07h-7.367l7.579-38.001m6.201 6.042-3.18 15.9c0.21199 0.0353 0.42399 0.053 0.636 0.053h0.742c3.392 0.0353 6.2186-0.30033 8.48-1.007 2.2613-0.74199 3.7806-3.3213 4.558-7.738 0.63597-3.71-0.00003-5.8476-1.908-6.413-1.8727-0.56531-4.2224-0.83031-7.049-0.795-0.42402 0.0353-0.83035 0.053-1.219 0.053-0.35335 0.00002-0.72435 0.00002-1.113 0l0.053-0.053\" />\n </g>\n </g>\n </svg>\n )\n }\n\n if (language === 'json') {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 0 160 160\"\n >\n <defs>\n <linearGradient id=\"a\">\n <stop offset=\"0\" />\n <stop offset=\"1\" stopColor=\"#fff\" />\n </linearGradient>\n <linearGradient\n x1=\"-553.27\"\n y1=\"525.908\"\n x2=\"-666.116\"\n y2=\"413.045\"\n id=\"c\"\n xlinkHref=\"#a\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(.99884 0 0 .9987 689.008 -388.844)\"\n />\n <linearGradient\n x1=\"-666.117\"\n y1=\"413.045\"\n x2=\"-553.27\"\n y2=\"525.908\"\n id=\"b\"\n xlinkHref=\"#a\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"matrix(.99884 0 0 .9987 689.008 -388.844)\"\n />\n </defs>\n <path\n d=\"M79.865 119.1c35.397 48.255 70.04-13.469 69.988-50.587-.06-43.886-44.54-68.414-70.017-68.414C38.943.1 0 33.895 0 80.135 0 131.531 44.64 160 79.836 160c-7.965-1.147-34.507-6.834-34.863-67.967-.24-41.346 13.487-57.865 34.805-50.599.477.177 23.514 9.265 23.514 38.95 0 29.56-23.427 38.716-23.427 38.716z\"\n style={{marker: 'none'}}\n color=\"#000\"\n fill=\"url(#b)\"\n fillRule=\"evenodd\"\n overflow=\"visible\"\n />\n <path\n d=\"M79.823 41.4C56.433 33.34 27.78 52.618 27.78 91.23c0 63.048 46.72 68.77 52.384 68.77C121.057 160 160 126.204 160 79.964 160 28.568 115.36.1 80.164.1c9.749-1.35 52.541 10.55 52.541 69.037 0 38.141-31.953 58.905-52.735 50.033-.478-.177-23.514-9.264-23.514-38.95 0-29.56 23.367-38.818 23.367-38.818z\"\n style={{marker: 'none'}}\n color=\"#000\"\n fill=\"url(#c)\"\n fillRule=\"evenodd\"\n overflow=\"visible\"\n />\n </svg>\n )\n }\n\n return undefined\n}\n","import {Box, Card, Flex, Label, Text} from '@sanity/ui'\nimport {Suspense} from 'react'\nimport type {PreviewProps} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {CodeMirrorProxy, useMounted} from './codemirror/useCodeMirror'\nimport {useLanguageMode} from './codemirror/useLanguageMode'\nimport type {CodeInputValue, CodeSchemaType} from './types'\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n`\n\n// Studio's inline object chip is `height: calc(1em - 1px)`. 13/16em matches\n// Studio's inline preview text and fits in that content box.\nconst InlineCodeLabel = styled.span`\n box-sizing: border-box;\n display: block;\n font-size: 0.8125em;\n font-weight: 500;\n line-height: 1;\n margin: 0;\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n`\n\n/**\n * @public\n */\nexport interface PreviewCodeProps extends PreviewProps {\n selection?: CodeInputValue\n}\n\nconst inlineCodePreviewMaxLength = 20\n\nfunction capInlineCodePreview(value: string): string {\n if (value.length <= inlineCodePreviewMaxLength) return value\n return `${value.slice(0, inlineCodePreviewMaxLength - 1)}…`\n}\n\nfunction inlineCodeLabel(props: PreviewCodeProps): string {\n const firstLine = props.selection?.code?.split('\\n')[0]?.trim()\n if (firstLine) return capInlineCodePreview(firstLine)\n\n const language = props.selection?.language?.trim()\n if (language) return capInlineCodePreview(language.toUpperCase())\n\n return 'UNKNOWN'\n}\n\n/**\n * @public\n */\nexport function PreviewCode(props: PreviewCodeProps): React.JSX.Element {\n const {selection, schemaType: type, layout} = props\n // oxlint-disable-next-line no-unsafe-type-assertion - fix later\n const {languageMode} = useLanguageMode(type as CodeSchemaType, props.selection)\n\n const mounted = useMounted()\n\n if (layout === 'inline') {\n return (\n <InlineCodeLabel data-testid=\"inline-code-preview\">{inlineCodeLabel(props)}</InlineCodeLabel>\n )\n }\n\n return (\n <PreviewContainer>\n <Card padding={4}>\n {selection?.filename || selection?.language ? (\n <Card\n paddingBottom={4}\n marginBottom={selection.code ? 4 : 0}\n borderBottom={!!selection.code}\n >\n <Flex align=\"center\" justify=\"flex-end\">\n {selection?.filename ? (\n <Box flex={1}>\n <Text>\n <code>{selection.filename}</code>\n </Text>\n </Box>\n ) : null}\n {selection?.language ? <Label muted>{selection.language}</Label> : null}\n </Flex>\n </Card>\n ) : null}\n {mounted && (\n <Suspense fallback={<Card padding={2}>Loading code preview...</Card>}>\n <CodeMirrorProxy\n readOnly\n editable={false}\n value={selection?.code || ''}\n highlightLines={selection?.highlightedLines || []}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n highlightSelectionMatches: false,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n }}\n languageMode={languageMode}\n />\n </Suspense>\n )}\n </Card>\n </PreviewContainer>\n )\n}\n","import {CodeBlockIcon} from '@sanity/icons/CodeBlock'\nimport {defineType, type ObjectDefinition} from 'sanity'\n\nimport {CodeInput} from './CodeInput'\nimport {getMedia} from './getMedia'\nimport {PreviewCode} from './PreviewCode'\nimport type {CodeOptions} from './types'\n\n/**\n * @public\n */\nexport const codeTypeName = 'code'\n\n/**\n * @public\n */\nexport interface CodeDefinition extends Omit<ObjectDefinition, 'type' | 'fields' | 'options'> {\n type: typeof codeTypeName\n options?: CodeOptions\n}\n\ndeclare module 'sanity' {\n // makes type: 'code' narrow correctly when using defineType/defineField/defineArrayMember\n export interface IntrinsicDefinitions {\n code: CodeDefinition\n }\n}\n\n/**\n * @public\n */\nexport const codeSchema = defineType({\n name: 'code',\n type: 'object',\n title: 'Code',\n components: {input: CodeInput, preview: PreviewCode},\n icon: CodeBlockIcon,\n fields: [\n {\n name: 'language',\n title: 'Language',\n type: 'string',\n },\n {\n name: 'filename',\n title: 'Filename',\n type: 'string',\n },\n {\n title: 'Code',\n name: 'code',\n type: 'text',\n },\n {\n title: 'Highlighted lines',\n name: 'highlightedLines',\n type: 'array',\n of: [\n {\n type: 'number',\n title: 'Highlighted line',\n },\n ],\n },\n ],\n preview: {\n select: {\n language: 'language',\n code: 'code',\n filename: 'filename',\n highlightedLines: 'highlightedLines',\n },\n prepare: (value: {\n language?: string\n code?: string\n filename?: string\n highlightedLines?: number[]\n }) => {\n return {\n title: value.filename || (value.language || 'unknown').toUpperCase(),\n media: getMedia(value?.language),\n selection: value,\n }\n },\n },\n})\n","import {definePlugin, type Plugin} from 'sanity'\n\nimport {CodeInputConfigContext} from './codemirror/CodeModeContext'\nimport type {CodeMode} from './codemirror/defaultCodeModes'\nimport {codeSchema} from './schema'\n\nexport interface CodeInputConfig {\n codeModes?: CodeMode[]\n}\n\n/**\n * @public\n */\nexport const codeInput: Plugin<CodeInputConfig | void> = definePlugin<CodeInputConfig | void>(\n (config) => {\n const codeModes = config && config.codeModes\n const basePlugin = {\n name: '@sanity/code-input',\n schema: {types: [codeSchema]},\n }\n if (!codeModes) {\n return basePlugin\n }\n return {\n ...basePlugin,\n form: {\n components: {\n input: (props) => {\n if (props.id !== 'root') {\n return props.renderDefault(props)\n }\n return (\n <CodeInputConfigContext.Provider value={config}>\n {props.renderDefault(props)}\n </CodeInputConfigContext.Provider>\n )\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/code-input",
|
|
3
|
-
"version": "7.3.
|
|
3
|
+
"version": "7.3.14",
|
|
4
4
|
"description": "Sanity input component for code, powered by CodeMirror",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cms",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"oxc-transform-react": "^0.154.0",
|
|
63
63
|
"react": "^19.3.1",
|
|
64
64
|
"react-dom": "^19.3.1",
|
|
65
|
-
"sanity": "^6.
|
|
65
|
+
"sanity": "^6.19.0",
|
|
66
66
|
"styled-components": "^6.6.0",
|
|
67
67
|
"tsdown": "^0.23.1"
|
|
68
68
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CodeMirrorProxy-VeTh1vQ-.js","names":["getBackwardsCompatibleTone(themeCtx)","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 })","themeCtx.theme.color.dark[fallbackTone]","light","useMemo(() => {\n const fallbackTone = getBackwardsCompatibleTone(themeCtx)\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n // oxlint-disable-next-line typescript/no-deprecated\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])","_c","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 })","focusRing","bg","fg","family","attrName","boolean","className","comment","function","keyword","number","operator","property","string","dark ? 'dark' : 'light'","useMemo(() => {\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const {code: codeFont} = theme.sanity.fonts\n // oxlint-disable-next-line typescript/no-deprecated\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])","_c","t","EditorView.baseTheme({\n '&': {\n fontSize: rem(fontSize),\n },\n\n '& .cm-scroller': {\n lineHeight: `${lineHeight / fontSize} !important`,\n },\n })","useMemo(() => {\n // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\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])","_c","{fontSize: 1}","highlightLine({\n onHighlightChange,\n readOnly,\n theme: themeCtx,\n })","useMemo(\n () =>\n highlightLine({\n onHighlightChange,\n readOnly,\n theme: themeCtx,\n }),\n [onHighlightChange, readOnly, themeCtx],\n )","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 themeExtension,\n fontSizeExtension,\n highlightLineExtension,\n EditorView.lineWrapping,\n ]","[...baseExtensions, languageExtension]","() => {\n if (editorView) {\n setHighlightedLines(editorView, highlightLines ?? [])\n }\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }","[editorView, highlightLines, value]","() => {\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 }","(view: EditorView) => {\n setEditorView(view)\n }","useCallback((view: EditorView) => {\n setEditorView(view)\n }, [])","basicSetupProp ?? {\n highlightActiveLine: false,\n }","useMemo(\n () =>\n basicSetupProp ?? {\n highlightActiveLine: false,\n },\n [basicSetupProp],\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 readOnly={readOnly}\n />","() => {\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 }","codeModes","[mode, codeConfig]","_c"],"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: () => import('@sanity/lezer-groq').then(({groq}) => groq()),\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\nconst addLineHighlight = StateEffect.define<number>()\nconst removeLineHighlight = StateEffect.define<number>()\n\nconst 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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n // oxlint-disable-next-line typescript/no-deprecated\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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const dark = {color: themeCtx.theme.color.dark[fallbackTone]}\n // oxlint-disable-next-line typescript/no-deprecated\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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\n const {code: codeFont} = theme.sanity.fonts\n // oxlint-disable-next-line typescript/no-deprecated\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 // TODO: when upgrading to @sanity/ui@4 start using the new tokens\n // oxlint-disable-next-line typescript/no-deprecated\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 {type Ref, 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 */\nfunction CodeMirrorProxy(props: CodeMirrorProps & {ref?: Ref<ReactCodeMirrorRef>}) {\n const {\n basicSetup: basicSetupProp,\n highlightLines,\n languageMode,\n onHighlightChange,\n readOnly,\n value,\n ref,\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 // oxlint-disable-next-line react/exhaustive-effect-dependencies\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 readOnly={readOnly}\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"],"mappings":"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"}
|