Update CodeMirror (#1891)

* Package updates

* Updates

* Keep fonts import

* Update

* Update

* Update snapshot

* Install more packages

* Start work on theming

* Fix build

* Set theme settings

* Set theme styles

* Remove theme prop and update Editor usage

Removed theme prop from Editor and updated usage to wrap in Container for theme context.

* Updates
This commit is contained in:
Nathan Bierema 2026-03-07 11:27:04 -05:00 committed by GitHub
parent 12e561c24f
commit d61d31a690
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 413 additions and 422 deletions

View File

@ -0,0 +1,5 @@
---
'@redux-devtools/ui': major
---
Remove theme prop from Editor. Wrap any usage of Editor in Container to provide theme through context.

View File

@ -42,13 +42,17 @@
},
"dependencies": {
"@babel/runtime": "^7.28.6",
"@codemirror/lang-javascript": "^6.2.4",
"@codemirror/view": "^6.39.7",
"@lezer/highlight": "^1.2.3",
"@rjsf/core": "^6.3.1",
"@rjsf/utils": "^6.3.1",
"@rjsf/validator-ajv8": "^6.3.1",
"@types/codemirror": "^5.60.17",
"@types/json-schema": "^7.0.15",
"@types/simple-element-resize-detector": "^1.3.3",
"codemirror": "^5.65.21",
"@uiw/codemirror-themes": "^4.25.7",
"@uiw/react-codemirror": "^4.25.4",
"color": "^5.0.3",
"react-base16-styling": "workspace:^",
"react-icons": "^5.6.0",

View File

@ -22,7 +22,7 @@ export const MainContainerWrapper = styled.div`
font-family: ${(props) => props.theme.fontFamily || 'monaco, monospace'};
}
.CodeMirror div,
.cm-editor div,
pre,
.monitor div,
.slider div {

View File

@ -24,15 +24,12 @@ export const Default: Story = {
args: {
value,
lineNumbers: true,
lineWrapping: false,
foldGutter: true,
readOnly: false,
autofocus: true,
},
argTypes: {
autofocus: { control: { disable: true } },
mode: { control: { disable: true } },
theme: { control: { disable: true } },
onChange: { control: { disable: true } },
},
};
@ -45,8 +42,6 @@ export const WithTabs: StoryObj<WithTabsProps> = {
},
argTypes: {
value: { control: { disable: true } },
mode: { control: { disable: true } },
lineWrapping: { control: { disable: true } },
readOnly: { control: { disable: true } },
theme: { control: { disable: true } },
foldGutter: { control: { disable: true } },

View File

@ -1,108 +1,101 @@
import React, { Component } from 'react';
import React from 'react';
import styled from '@emotion/styled';
import CodeMirror, { EditorChange } from 'codemirror';
import type { Base16Theme } from 'react-base16-styling';
import { defaultStyle, themedStyle } from './styles';
import { Theme } from '../themes/default';
import 'codemirror/mode/javascript/javascript';
import 'codemirror/addon/fold/foldgutter';
import 'codemirror/addon/fold/foldcode';
import 'codemirror/addon/fold/brace-fold';
import CodeMirror from '@uiw/react-codemirror';
import { createTheme } from '@uiw/codemirror-themes';
import { javascript } from '@codemirror/lang-javascript';
import type { ViewUpdate } from '@codemirror/view';
import { tags as t } from '@lezer/highlight';
import { useTheme } from '@emotion/react';
import type { ThemeFromProvider } from '../utils/theme';
import { defaultStyle } from './styles';
import '../../fonts/index.css';
import 'codemirror/lib/codemirror.css';
import 'codemirror/addon/fold/foldgutter.css';
const EditorContainer = styled.div(
'' as unknown as TemplateStringsArray,
({ theme }: { theme?: Base16Theme }) =>
theme!.scheme === 'default' && (theme as Theme).light
? defaultStyle
: themedStyle(theme!),
defaultStyle,
);
export interface EditorProps {
value: string;
mode: string;
lineNumbers: boolean;
lineWrapping: boolean;
readOnly: boolean;
theme?: Base16Theme;
foldGutter: boolean;
autofocus: boolean;
onChange?: (value: string, change: EditorChange) => void;
value?: string;
lineNumbers?: boolean;
readOnly?: boolean;
foldGutter?: boolean;
autofocus?: boolean;
onChange?: (value: string, viewUpdate: ViewUpdate) => void;
}
/**
* Based on [CodeMirror](http://codemirror.net/).
*/
export default class Editor extends Component<EditorProps> {
cm?: CodeMirror.Editor | null;
node?: HTMLDivElement | null;
export default function Editor({
value = '',
lineNumbers = true,
readOnly = false,
foldGutter = true,
autofocus = false,
onChange,
}: EditorProps) {
const theme = useTheme() as ThemeFromProvider;
componentDidMount() {
this.cm = CodeMirror(this.node!, {
value: this.props.value,
mode: this.props.mode,
lineNumbers: this.props.lineNumbers,
lineWrapping: this.props.lineWrapping,
readOnly: this.props.readOnly,
autofocus: this.props.autofocus,
foldGutter: this.props.foldGutter,
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
});
const myTheme =
theme.scheme === 'default' && theme.light
? undefined
: createTheme({
theme: theme.light ? 'light' : 'dark',
settings: {
background: theme.base00,
foreground: theme.base04,
selection: theme.base01,
selectionMatch: 'transparent',
gutterBackground: theme.base01,
gutterForeground: theme.base05,
gutterBorder: 'transparent',
gutterActiveForeground: theme.base05,
lineHighlight: 'transparent',
},
styles: [
{ tag: t.heading, color: theme.base05 },
{ tag: t.quote, color: theme.base09 },
{ tag: t.keyword, color: theme.base0F },
{ tag: t.atom, color: theme.base0F },
{ tag: t.number, color: theme.base0F },
{ tag: t.definition(t.variableName), color: theme.base0D },
{ tag: t.variableName, color: theme.base05 },
{ tag: t.propertyName, color: theme.base0C },
{ tag: t.operator, color: theme.base0E },
{ tag: t.comment, color: theme.base05, fontStyle: 'italic' },
{ tag: t.string, color: theme.base0B },
{ tag: t.meta, color: theme.base0B },
{ tag: t.tagName, color: theme.base02 },
{ tag: t.attributeName, color: theme.base0C },
{ tag: t.attributeName, color: theme.base02, cursor: 'pointer' },
{
tag: t.emphasis,
color: '#999',
textDecoration: 'underline',
textDecorationStyle: 'dotted',
},
{ tag: t.strong, color: theme.base01 },
{
tag: t.invalid,
color: theme.base05,
borderBottom: `1px dotted ${theme.base08}`,
},
],
});
if (this.props.onChange) {
this.cm.on('change', (doc, change) => {
this.props.onChange!(doc.getValue(), change);
});
}
}
UNSAFE_componentWillReceiveProps(nextProps: EditorProps) {
if (nextProps.value !== this.cm!.getValue()) {
this.cm!.setValue(nextProps.value);
}
if (nextProps.readOnly !== this.props.readOnly) {
this.cm!.setOption('readOnly', nextProps.readOnly);
}
if (nextProps.lineNumbers !== this.props.lineNumbers) {
this.cm!.setOption('lineNumbers', nextProps.lineNumbers);
}
if (nextProps.lineWrapping !== this.props.lineWrapping) {
this.cm!.setOption('lineWrapping', nextProps.lineWrapping);
}
if (nextProps.foldGutter !== this.props.foldGutter) {
this.cm!.setOption('foldGutter', nextProps.foldGutter);
}
}
shouldComponentUpdate() {
return false;
}
componentWillUnmount() {
const node = this.node!;
node.removeChild(node.children[0]);
this.cm = null;
}
getRef: React.RefCallback<HTMLDivElement> = (node) => {
this.node = node;
};
render() {
return <EditorContainer ref={this.getRef} theme={this.props.theme} />;
}
static defaultProps = {
value: '',
mode: 'javascript',
lineNumbers: true,
lineWrapping: false,
readOnly: false,
foldGutter: true,
autofocus: false,
};
return (
<EditorContainer>
<CodeMirror
value={value}
theme={myTheme}
extensions={[javascript()]}
onChange={onChange}
readOnly={readOnly}
autoFocus={autofocus}
basicSetup={{
lineNumbers,
foldGutter,
}}
/>
</EditorContainer>
);
}

View File

@ -20,7 +20,6 @@ interface TabProps {
lineNumbers: boolean;
}
/* eslint-disable react/prop-types */
export default class WithTabs extends Component<WithTabsProps> {
state = {
selected: 'Function 1',

View File

@ -1,184 +1,10 @@
import { css } from '@emotion/react';
import { Base16Theme } from 'react-base16-styling';
export const defaultStyle = `
height: 100%;
overflow: auto;
> div {
.cm-theme,
.cm-editor {
height: 100%;
line-height: 1.45em;
}
`;
export const themedStyle = (theme: Base16Theme) => css`
height: 100%;
> div {
height: 100%;
line-height: 1.45em;
background-color: ${theme.base00};
color: ${theme.base04};
.cm-header {
color: ${theme.base05};
}
.cm-quote {
color: ${theme.base09};
}
.cm-keyword {
color: ${theme.base0F};
}
.cm-atom {
color: ${theme.base0F};
}
.cm-number {
color: ${theme.base0F};
}
.cm-def {
color: ${theme.base0D};
}
.cm-variable {
color: ${theme.base05};
}
.cm-variable-2 {
color: ${theme.base0A};
}
.cm-variable-3 {
color: ${theme.base0E};
}
.cm-property {
color: ${theme.base0C};
}
.cm-operator {
color: ${theme.base0E};
}
.cm-comment {
color: ${theme.base05};
font-style: italic;
}
.cm-string {
color: ${theme.base0B};
}
.cm-string-2 {
color: ${theme.base0A};
}
.cm-meta {
color: ${theme.base0B};
}
.cm-qualifier {
color: ${theme.base0A};
}
.cm-builtin {
color: ${theme.base0F};
}
.cm-bracket {
color: ${theme.base09};
}
.CodeMirror-matchingbracket {
color: ${theme.base0B};
}
.CodeMirror-nonmatchingbracket {
color: ${theme.base08};
}
.cm-tag {
color: ${theme.base02};
}
.cm-attribute {
color: ${theme.base0C};
}
.cm-hr {
color: transparent;
border-top: 1px solid ${theme.base05};
display: block;
}
.cm-link {
color: ${theme.base02};
cursor: pointer;
}
.cm-special {
color: ${theme.base0E};
}
.cm-em {
color: #999;
text-decoration: underline;
text-decoration-style: dotted;
}
.cm-strong {
color: ${theme.base01};
}
.cm-error,
.cm-invalidchar {
color: ${theme.base05};
border-bottom: 1px dotted ${theme.base08};
}
div.CodeMirror-selected {
background: ${theme.base01};
}
.CodeMirror-line::selection,
.CodeMirror-line > span::selection,
.CodeMirror-line > span > span::selection {
background: ${theme.base01};
}
.CodeMirror {
box-shadow: inset 7px 0 12px -6px #000;
}
.CodeMirror-gutters {
border-right: 0;
}
.CodeMirror-gutters {
background-color: ${theme.base01};
}
.CodeMirror-linenumber {
color: ${theme.base03};
}
.CodeMirror-linenumber {
padding: 0 5px;
}
.CodeMirror-guttermarker-subtle {
color: ${theme.base05};
}
.CodeMirror-guttermarker {
color: ${theme.base09};
}
.CodeMirror-gutter .CodeMirror-gutter-text {
color: ${theme.base05};
}
.CodeMirror-cursor {
border-left: 1px solid #819090;
}
.cm-fat-cursor .CodeMirror-cursor {
background: ${theme.base02};
}
.cm-animate-fat-cursor {
background-color: ${theme.base02};
}
.CodeMirror-activeline-background {
background: ${theme.base07};
}
}
`;

View File

@ -1,40 +1,11 @@
import React from 'react';
import { render } from '@testing-library/react';
import { Editor } from '../src';
import 'codemirror/mode/javascript/javascript';
describe('Editor', function () {
const getBoundingClientRect = jest.fn();
const getClientRects = jest.fn();
// See https://github.com/jsdom/jsdom/issues/3002
document.createRange = () => {
const range = new Range();
range.getBoundingClientRect = getBoundingClientRect;
range.getClientRects = () => {
getClientRects();
return {
item: () => null,
length: 0,
[Symbol.iterator]: jest.fn(),
};
};
return range;
};
const { container } = render(<Editor value="var a = 1;" />);
it('renders correctly', () => {
expect(container.firstChild).toMatchSnapshot();
});
it('calls getBoundingClientRect', () => {
expect(getBoundingClientRect).toHaveBeenCalled();
});
it('calls getClientRects', () => {
expect(getClientRects).toHaveBeenCalled();
});
});

View File

@ -2,7 +2,7 @@
exports[`Container renders correctly 1`] = `
<div
class="css-83ymb"
class="css-jqr1ii"
>
Text
</div>

View File

@ -2,135 +2,113 @@
exports[`Editor renders correctly 1`] = `
<div
class="css-1u3pnvo"
class="css-17hzfkk"
>
<div
class="CodeMirror cm-s-default"
translate="no"
class="cm-theme"
>
<div
style="overflow: hidden; position: relative; width: 3px; height: 0px;"
>
<textarea
autocapitalize="off"
autocorrect="off"
spellcheck="false"
style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; min-height: 1em; outline: none;"
tabindex="0"
/>
</div>
<div
class="CodeMirror-vscrollbar"
cm-not-content="true"
tabindex="-1"
class="cm-editor ͼ1 ͼ3 ͼ4 ͼ1q ͼ16"
>
<div
style="min-width: 1px;"
aria-live="polite"
class="cm-announced"
/>
</div>
<div
class="CodeMirror-hscrollbar"
cm-not-content="true"
tabindex="-1"
>
<div
style="height: 100%; min-height: 1px;"
/>
</div>
<div
class="CodeMirror-scrollbar-filler"
cm-not-content="true"
/>
<div
class="CodeMirror-gutter-filler"
cm-not-content="true"
/>
<div
class="CodeMirror-scroll"
tabindex="-1"
>
<div
class="CodeMirror-sizer"
style="margin-left: 0px; min-width: 3px;"
class="cm-scroller"
tabindex="-1"
>
<div
style="position: relative;"
aria-hidden="true"
class="cm-gutters cm-gutters-before"
style="min-height: 14px; position: sticky;"
>
<div
class="CodeMirror-lines"
role="presentation"
class="cm-gutter cm-lineNumbers"
>
<div
role="presentation"
style="position: relative; outline: none;"
class="cm-gutterElement"
style="height: 0px; visibility: hidden; pointer-events: none;"
>
<div
class="CodeMirror-measure"
/>
<div
class="CodeMirror-measure"
>
<pre
class="CodeMirror-line"
role="presentation"
>
<span
role="presentation"
style="padding-right: 0.1px;"
>
<span
class="cm-keyword"
>
var
</span>
<span
class="cm-def"
>
a
</span>
<span
class="cm-operator"
>
=
</span>
<span
class="cm-number"
>
1
</span>
;
</span>
</pre>
</div>
<div
style="position: relative; z-index: 1;"
/>
<div
class="CodeMirror-cursors"
/>
<div
class="CodeMirror-code"
role="presentation"
/>
9
</div>
<div
class="cm-gutterElement cm-activeLineGutter"
style="height: 14px;"
>
1
</div>
</div>
<div
class="cm-gutter cm-foldGutter"
>
<div
class="cm-gutterElement"
style="height: 0px; visibility: hidden; pointer-events: none;"
>
<span
title="Unfold line"
>
</span>
</div>
<div
class="cm-gutterElement cm-activeLineGutter"
style="height: 14px;"
/>
</div>
</div>
</div>
<div
style="position: absolute; height: 50px; width: 1px;"
/>
<div
class="CodeMirror-gutters"
>
<div
class="CodeMirror-gutter CodeMirror-linenumbers"
style="width: 1px;"
aria-multiline="true"
autocapitalize="off"
autocorrect="off"
class="cm-content"
contenteditable="true"
data-language="javascript"
role="textbox"
spellcheck="false"
style="tab-size: 4;"
translate="no"
writingsuggestions="false"
>
<div
class="cm-line cm-activeLine"
>
<span
class="ͼ19"
>
var
</span>
<span
class="ͼ1c"
>
a
</span>
<span
class="ͼ1f"
>
=
</span>
<span
class="ͼ1b"
>
1
</span>
;
</div>
</div>
<div
aria-hidden="true"
class="cm-layer cm-layer-above cm-cursorLayer"
style="z-index: 150; animation-duration: 1200ms;"
/>
<div
class="CodeMirror-gutter CodeMirror-foldgutter"
aria-hidden="true"
class="cm-layer cm-selectionLayer"
style="z-index: -2;"
/>
</div>
</div>

View File

@ -2354,6 +2354,15 @@ importers:
'@babel/runtime':
specifier: ^7.28.6
version: 7.28.6
'@codemirror/lang-javascript':
specifier: ^6.2.4
version: 6.2.5
'@codemirror/view':
specifier: ^6.39.7
version: 6.39.16
'@lezer/highlight':
specifier: ^1.2.3
version: 1.2.3
'@rjsf/core':
specifier: ^6.3.1
version: 6.3.1(@rjsf/utils@6.3.1(react@19.2.4))(react@19.2.4)
@ -2372,9 +2381,12 @@ importers:
'@types/simple-element-resize-detector':
specifier: ^1.3.3
version: 1.3.3
codemirror:
specifier: ^5.65.21
version: 5.65.21
'@uiw/codemirror-themes':
specifier: ^4.25.7
version: 4.25.7(@codemirror/language@6.12.2)(@codemirror/state@6.5.4)(@codemirror/view@6.39.16)
'@uiw/react-codemirror':
specifier: ^4.25.4
version: 4.25.7(@babel/runtime@7.28.6)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.16)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
color:
specifier: ^5.0.3
version: 5.0.3
@ -3541,6 +3553,33 @@ packages:
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
'@codemirror/autocomplete@6.20.1':
resolution: {integrity: sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==}
'@codemirror/commands@6.10.2':
resolution: {integrity: sha512-vvX1fsih9HledO1c9zdotZYUZnE4xV0m6i3m25s5DIfXofuprk6cRcLUZvSk3CASUbwjQX21tOGbkY2BH8TpnQ==}
'@codemirror/lang-javascript@6.2.5':
resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==}
'@codemirror/language@6.12.2':
resolution: {integrity: sha512-jEPmz2nGGDxhRTg3lTpzmIyGKxz3Gp3SJES4b0nAuE5SWQoKdT5GoQ69cwMmFd+wvFUhYirtDTr0/DRHpQAyWg==}
'@codemirror/lint@6.9.5':
resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==}
'@codemirror/search@6.6.0':
resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==}
'@codemirror/state@6.5.4':
resolution: {integrity: sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw==}
'@codemirror/theme-one-dark@6.1.3':
resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==}
'@codemirror/view@6.39.16':
resolution: {integrity: sha512-m6S22fFpKtOWhq8HuhzsI1WzUP/hB9THbDj0Tl5KX4gbO6Y91hwBl7Yky33NdvB6IffuRFiBxf1R8kJMyXmA4Q==}
'@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
@ -4241,12 +4280,27 @@ packages:
'@leichtgewicht/ip-codec@2.0.5':
resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
'@lezer/common@1.5.1':
resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==}
'@lezer/highlight@1.2.3':
resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
'@lezer/javascript@1.5.4':
resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==}
'@lezer/lr@1.4.8':
resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==}
'@manypkg/find-root@1.1.0':
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
'@manypkg/get-packages@1.1.3':
resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
'@marijn/find-cluster-break@1.0.2':
resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
'@mswjs/data@0.16.2':
resolution: {integrity: sha512-/C0d/PBcJyQJokUhcjO4HiZPc67hzllKlRtD1XELygl2t991/ATAAQJVcStn4YtVALsNodruzOHT0JIvgr0hnA==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
@ -5245,6 +5299,35 @@ packages:
resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@uiw/codemirror-extensions-basic-setup@4.25.7':
resolution: {integrity: sha512-tPV/AGjF4yM22D5mnyH7EuYBkWO05wF5Y4x3lmQJo6LuHmhjh0RQsVDjqeIgNOkXT3UO9OdkL4dzxw465/JZVg==}
peerDependencies:
'@codemirror/autocomplete': '>=6.0.0'
'@codemirror/commands': '>=6.0.0'
'@codemirror/language': '>=6.0.0'
'@codemirror/lint': '>=6.0.0'
'@codemirror/search': '>=6.0.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
'@uiw/codemirror-themes@4.25.7':
resolution: {integrity: sha512-Rcx1XiQiMOJzk/efVuZioCv3VuswUb2CPmiM1NIXY5N4vEMmWLY3N8T4/WkPzJ8ZZuk7o3OH2VI5bj7729fDYg==}
peerDependencies:
'@codemirror/language': '>=6.0.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
'@uiw/react-codemirror@4.25.7':
resolution: {integrity: sha512-s/EbEe0dFANWEgfLbfdIrrOGv0R7M1XhkKG3ShroBeH6uP9pVNQy81YHOLRCSVcytTp9zAWRNfXR/+XxZTvV7w==}
peerDependencies:
'@babel/runtime': '>=7.11.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/theme-one-dark': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
codemirror: '>=6.0.0'
react: '>=17.0.0'
react-dom: '>=17.0.0'
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
@ -6214,8 +6297,8 @@ packages:
resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
codemirror@5.65.21:
resolution: {integrity: sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==}
codemirror@6.0.2:
resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==}
collect-v8-coverage@1.0.3:
resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==}
@ -6384,6 +6467,9 @@ packages:
create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
crelt@1.0.6:
resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
cross-env@10.1.0:
resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==}
engines: {node: '>=20'}
@ -9753,6 +9839,9 @@ packages:
peerDependencies:
webpack: ^5.27.0
style-mod@4.1.3:
resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==}
stylis@4.2.0:
resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
@ -10248,6 +10337,9 @@ packages:
resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
engines: {node: '>=0.10.0'}
w3c-keyname@2.2.8:
resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
@ -11685,6 +11777,69 @@ snapshots:
human-id: 4.1.3
prettier: 2.8.8
'@codemirror/autocomplete@6.20.1':
dependencies:
'@codemirror/language': 6.12.2
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
'@lezer/common': 1.5.1
'@codemirror/commands@6.10.2':
dependencies:
'@codemirror/language': 6.12.2
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
'@lezer/common': 1.5.1
'@codemirror/lang-javascript@6.2.5':
dependencies:
'@codemirror/autocomplete': 6.20.1
'@codemirror/language': 6.12.2
'@codemirror/lint': 6.9.5
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
'@lezer/common': 1.5.1
'@lezer/javascript': 1.5.4
'@codemirror/language@6.12.2':
dependencies:
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
'@lezer/common': 1.5.1
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.8
style-mod: 4.1.3
'@codemirror/lint@6.9.5':
dependencies:
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
crelt: 1.0.6
'@codemirror/search@6.6.0':
dependencies:
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
crelt: 1.0.6
'@codemirror/state@6.5.4':
dependencies:
'@marijn/find-cluster-break': 1.0.2
'@codemirror/theme-one-dark@6.1.3':
dependencies:
'@codemirror/language': 6.12.2
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
'@lezer/highlight': 1.2.3
'@codemirror/view@6.39.16':
dependencies:
'@codemirror/state': 6.5.4
crelt: 1.0.6
style-mod: 4.1.3
w3c-keyname: 2.2.8
'@cspotcode/source-map-support@0.8.1':
dependencies:
'@jridgewell/trace-mapping': 0.3.9
@ -12467,6 +12622,22 @@ snapshots:
'@leichtgewicht/ip-codec@2.0.5': {}
'@lezer/common@1.5.1': {}
'@lezer/highlight@1.2.3':
dependencies:
'@lezer/common': 1.5.1
'@lezer/javascript@1.5.4':
dependencies:
'@lezer/common': 1.5.1
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.8
'@lezer/lr@1.4.8':
dependencies:
'@lezer/common': 1.5.1
'@manypkg/find-root@1.1.0':
dependencies:
'@babel/runtime': 7.28.6
@ -12483,6 +12654,8 @@ snapshots:
globby: 11.1.0
read-yaml-file: 1.1.0
'@marijn/find-cluster-break@1.0.2': {}
'@mswjs/data@0.16.2(@types/node@24.11.0)(typescript@5.9.3)':
dependencies:
'@types/lodash': 4.17.24
@ -13640,6 +13813,39 @@ snapshots:
'@typescript-eslint/types': 8.56.1
eslint-visitor-keys: 5.0.1
'@uiw/codemirror-extensions-basic-setup@4.25.7(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.2)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/view@6.39.16)':
dependencies:
'@codemirror/autocomplete': 6.20.1
'@codemirror/commands': 6.10.2
'@codemirror/language': 6.12.2
'@codemirror/lint': 6.9.5
'@codemirror/search': 6.6.0
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
'@uiw/codemirror-themes@4.25.7(@codemirror/language@6.12.2)(@codemirror/state@6.5.4)(@codemirror/view@6.39.16)':
dependencies:
'@codemirror/language': 6.12.2
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
'@uiw/react-codemirror@4.25.7(@babel/runtime@7.28.6)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.16)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@babel/runtime': 7.28.6
'@codemirror/commands': 6.10.2
'@codemirror/state': 6.5.4
'@codemirror/theme-one-dark': 6.1.3
'@codemirror/view': 6.39.16
'@uiw/codemirror-extensions-basic-setup': 4.25.7(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.2)(@codemirror/language@6.12.2)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.5.4)(@codemirror/view@6.39.16)
codemirror: 6.0.2
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
transitivePeerDependencies:
- '@codemirror/autocomplete'
- '@codemirror/language'
- '@codemirror/lint'
- '@codemirror/search'
'@ungap/structured-clone@1.3.0': {}
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
@ -15040,7 +15246,15 @@ snapshots:
co@4.6.0: {}
codemirror@5.65.21: {}
codemirror@6.0.2:
dependencies:
'@codemirror/autocomplete': 6.20.1
'@codemirror/commands': 6.10.2
'@codemirror/language': 6.12.2
'@codemirror/lint': 6.9.5
'@codemirror/search': 6.6.0
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.16
collect-v8-coverage@1.0.3: {}
@ -15187,6 +15401,8 @@ snapshots:
create-require@1.1.1: {}
crelt@1.0.6: {}
cross-env@10.1.0:
dependencies:
'@epic-web/invariant': 1.0.0
@ -19239,6 +19455,8 @@ snapshots:
dependencies:
webpack: 5.105.3(esbuild@0.27.3)(webpack-cli@6.0.1)
style-mod@4.1.3: {}
stylis@4.2.0: {}
sumchecker@3.0.1:
@ -19739,6 +19957,8 @@ snapshots:
void-elements@3.1.0: {}
w3c-keyname@2.2.8: {}
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0