ConceptPortal-public/rsconcept/frontend/src/components/RSInput/bracketMatching.ts

45 lines
1.2 KiB
TypeScript
Raw Normal View History

2023-08-14 23:02:41 +03:00
import { bracketMatching, MatchResult } from '@codemirror/language';
import { Decoration, EditorView } from '@codemirror/view';
2023-08-15 00:41:09 +03:00
const matchingMark = Decoration.mark({class: "cc-matchingBracket"});
const nonmatchingMark = Decoration.mark({class: "cc-nonmatchingBracket"});
2023-08-14 23:02:41 +03:00
function bracketRender(match: MatchResult) {
2023-08-15 00:41:09 +03:00
const decorations = [];
const mark = match.matched ? matchingMark : nonmatchingMark;
decorations.push(mark.range(match.start.from, match.start.to));
if (match.end) {
decorations.push(mark.range(match.end.from, match.end.to));
}
return decorations;
2023-08-14 23:02:41 +03:00
}
2023-08-15 00:41:09 +03:00
const darkTheme = EditorView.baseTheme({
'.cc-matchingBracket': {
fontWeight: 600,
},
'.cc-nonmatchingBracket': {
color: '#ef4444',
fontWeight: 700,
},
'&.cm-focused .cc-matchingBracket': {
backgroundColor: '#734f00',
},
});
const lightTheme = EditorView.baseTheme({
'.cc-matchingBracket': {
fontWeight: 600,
},
'.cc-nonmatchingBracket': {
color: '#ef4444',
fontWeight: 700,
},
'&.cm-focused .cc-matchingBracket': {
backgroundColor: '#dae6f2',
},
});
2023-08-14 23:02:41 +03:00
2023-08-15 00:41:09 +03:00
export function ccBracketMatching(darkMode: boolean) {
return [bracketMatching({ renderMatch: bracketRender }), darkMode ? darkTheme : lightTheme];
2023-08-14 23:02:41 +03:00
}