Styling von CodeMirror v6 mit Material UI

DevLog 005

Im letzten Beitrag habe ich CodeMirror v6 mit einer Reaktionskomponente versehen. Es sah jedoch immer noch wie eine Ebene aus, <textarea>wenn es wie ein Code-Editor aussehen sollte.

Das Basis-Setup von CodeMirror enthält Erweiterungen im Wert eines Lebensmittelgeschäfts, um mit dem vollwertigen Code-Editor zu beginnen. Ich habe ein viel bescheideneres Ziel, also habe ich die beiden Erweiterungen ausgewählt, von denen ich dachte, dass sie auf meinen Anwendungsfall anwendbar sind:

  • @ Codemirror / Highlight
  • @ codemirror / matchbrackets

npm i \
@codemirror/highlight \
@codemirror/matchbrackets \
@codemirror/lang-javascript

import { javascript } from "@codemirror/lang-javascript";
import { defaultHighlightStyle } from "@codemirror/highlight";
import { bracketMatching } from "@codemirror/matchbrackets";

export const extensions = [
  bracketMatching(),
  defaultHighlightStyle.fallback,
  javascript(),
];

import { extensions } from "./extensions";
/* ... */
const state = EditorState.create({
  doc: "console.log('hello there')",
  extensions,
});
/* ... */

Verknüpfung mit der Material-Benutzeroberfläche

Eine einheitliche Farbpalette für die Site und den Code-Editor zu haben, scheint eine vernünftige Voraussetzung zu sein. Das Thema der Material-Benutzeroberfläche enthält viele Farben, aus denen ich auswählen kann .

Mit CodeMirror 6 können Sie den Hervorhebungsstil auf einfache Weise ändern.

import {tags, HighlightStyle} from "@codemirror/highlight"

const myHighlightStyle = HighlightStyle.define([
  {tag: tags.keyword, color: "#fc6"},
  {tag: tags.comment, color: "#f5d", fontStyle: "italic"}
])

/* Note: In this case using a `Map` was not the best choice */
const tagColorMap = new Map<Tag, Omit<TagStyle, "tag">>([
  [tags.angleBracket, { color: theme.palette.primary.light }],
  /* ... */
])

Ich muss das tagColorMapin das Array von TagStyleObjekten konvertieren , das HighlightStyle.definebenötigt wird.

const specs = Array.from(tagColorMap.entries()).map(([tag, style]) => ({
  tag,
  ...style,
}))
export const highlightStyle = HighlightStyle.define(specs)

import { highlightStyle } from "./highlight-style";
/* ... */
export const extensions = [
  highlightStyle,
  /* ... */
];

      

Ich bemerkte, dass lange Schlangen die Ausgabebox vom Bildschirm drückten. Um den Zeilenumbruch zu aktivieren, EditorView.linewrappingmuss der hinzugefügt werden extensions.

Ursprünglich dachte ich, dass die Nummerierung der Dachrinnen nicht gut aussehen würde, aber ich habe es mir anders überlegt. Alles was benötigt wird ist die @codemirror/gutterBibliothek.

// ~/components/editor/extensions.ts
import { EditorView } from "@codemirror/view";
import { lineNumbers } from "@codemirror/gutter";
/* ... */
export const extensions = [
  EditorView.lineWrapping
  lineNumbers(),
  /* ... */
];

Wenn Sie EditorView.themedas zweite Objekt verwenden und auf setzen { dark: true }, wird die Kompatibilität mit dunklen Themen aktiviert. Am auffälligsten ist, dass die Rinnennummern und der Cursor heller werden.

// ~/components/editor/extensions.ts
/* ... */
export const extensions = [
  EditorView.theme({}, { dark: true });
  /* ... */
];

TL; DR

CodeMirror v6 wurde mithilfe von CodeMirror-Erweiterungen und dem Designobjekt der Material-Benutzeroberfläche ein benutzerdefiniertes Styling hinzugefügt.

Ursprünglich aus:

Dies ist nur für die Miniaturansicht

Suggested posts

Wie füge ich dunkle/helle oder Multi-Theme-Farben nur mit CSS hinzu?

Wie füge ich dunkle/helle oder Multi-Theme-Farben nur mit CSS hinzu?

Die Implementierung von Dark/Light-Themes oder Multi-Theme-Funktionen, wie sie Twitter anbietet, ist heutzutage eine der Grundfunktionen jeder kleinen/mittleren/großen Web-/Mobilanwendung, da die überwiegende Mehrheit der Benutzer dieser Apps höchstwahrscheinlich eine haben wird Farbpräferenzen und Sie sollten Ihre App so entwickeln, dass sie deren Anforderungen erfüllen können, um eine bessere Benutzererfahrung in Ihrer gesamten Anwendung zu schaffen, egal ob im Web oder auf mobilen Geräten. TLDR; Lassen Sie uns ohne weiteres mit der Implementierung dieser Funktion in einer React-App beginnen, aber beachten Sie, dass diese Funktion reine CSS-Funktionen und DOM-Manipulation verwendet, sodass Sie sie in jedem Framework/Bibliothek oder reinen HTML/CSS-Anwendung verwenden können.

Bedingte SX-Requisiten Mui V5

So verwenden Sie sx props (mui v5) bedingt. Die sx-Requisite ist eine Verknüpfung zum Definieren benutzerdefinierter Stile, die Zugriff auf das Thema hat.

Related posts

Wie man den Planeten rettet und Geld verdient

Wie man den Planeten rettet und Geld verdient

Wie oft haben Sie ohne nachzudenken eine Plastikflasche, ein Glas, eine Aluminiumdose oder ein Öko-Energiepaket weggeworfen? Wie oft haben Sie sich gewünscht, dass Sie für das Recycling etwas zurückbekommen könnten? Wenn Sie wie die meisten Menschen sind, lautet die Antwort wahrscheinlich „vielfach“. Recycling wird oft als Ärger, lästige Pflicht oder Pflicht angesehen, die keinen unmittelbaren oder greifbaren Nutzen bringt.

Zwei Jahre im Design – Das Gute, das Schlechte und das Hässliche…

Zwei Jahre im Design – Das Gute, das Schlechte und das Hässliche…

„Hey Siri, spiel Me Dive von Olivia Dean.“ Es war Mai 2021, als ich mein Praktikum bei der Future Academy Africa in Akure, Nigeria, begann.

GRENZENLOSES LEBEN

Wenn man erwachsen wird, wird einem oft gesagt, dass die Welt so ist, wie sie ist, und dass das Leben nur darin besteht, sein Leben in der Welt zu leben, niemals sein Leben zu riskieren, einfach einem festgelegten Weg zu folgen und am Ende zu sterben, und versucht, es nicht zu tun Schlage zu viel gegen die Wände. Aber das ist ein sehr begrenztes Leben.

Verfolgen Sie jeden mit nur einer Telefonnummer | OSINT-Untersuchung

Verfolgen Sie jeden mit nur einer Telefonnummer | OSINT-Untersuchung

Sie können ein OSINT-Ermittler, ein CTF-Spieler oder einfach jemand sein, der Spam-Anrufe erhält. Jemand, der versucht, die Nummer zu bestätigen, die Sie in einer Anzeige gesehen haben.