commit b1ed54da530d603897f18da9d188c2129671a2bc Author: Michael Wesemann Date: Sun Aug 16 13:06:32 2026 +0200 initial commit [141.14.140.180,mike] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7f023f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +.AppleDouble +.LSOverride +._* +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes diff --git a/README.md b/README.md new file mode 100644 index 0000000..ec3ad79 --- /dev/null +++ b/README.md @@ -0,0 +1,240 @@ +# mwxcol + +Eine Farbpalette und die Themes, die sie auf die benutzten Werkzeuge übertragen. + +Quelle der Wahrheit ist `mwxcol.go` — alles andere ist davon abgeleitet. +`go run mwxcol.go` druckt die Palette zur Sichtprüfung ins Terminal. + +## Palette + +| Name | Hex | Dezimal | Rolle | +|--------|-----------|---------------|-------| +| white | `#F0F0EA` | 240,240,234 | normaler Text, Vordergrund | +| yellow | `#F9E2AF` | 249,226,175 | Änderung, Warnung, Build-Dateien | +| orange | `#FAB387` | 250,179,135 | Archive, Präprozessor | +| red | `#F38BA8` | 243,139,168 | Fehler, Löschung, Strings | +| green | `#94E2D5` | 148,226,213 | ausführbar, neu, ok (eigentlich ein Mint/Teal) | +| blue | `#B4BEFE` | 180,190,254 | Verzeichnisse, Quelltext, Datum | +| pink | `#F5B2F7` | 245,178,247 | Symlinks, Keywords, Treffer | +| violet | `#CBA6F7` | 203,166,247 | Typen, Bilder, Sonderdateien | +| grey | `#AAAABB` | 170,170,187 | Sekundärtext, Kommentare | +| dark | `#777788` | 119,119,136 | Attribute, deaktiviert | +| darker | `#444455` | 68,68,85 | Trenner, Rahmen, Hintergrundakzent | + +Die Palette enthält **keine Hintergrundfarbe**. Als Terminal-Hintergrund dient +`#252528` (iTerm2-Profil „Default"); wo ein Theme einen Hintergrund braucht, +steht dieser Wert oder `darker`. + +## Installation auf einem neuen Rechner + +```sh +git clone ~/src/mwxcol +cd ~/src/mwxcol +./install.sh --check # zeigt erst, was passieren würde +./install.sh # kopiert, sichert Vorhandenes nach .bak +exec zsh +``` + +`./install.sh --link` symlinkt statt zu kopieren. Das ist die bessere Variante, +wenn das Repo dauerhaft an seinem Platz bleibt: dann können installierte Datei +und Repo-Kopie nicht mehr auseinanderlaufen. `--check` sagt jederzeit, ob sie +es doch getan haben. + +Nova muss nach der Installation einmal neu gestartet werden; das Theme steht +dann unter *Einstellungen > Themes > mwx*. + +## Was wo landet + +| Werkzeug | Repo | Ziel | Wie es geladen wird | +|---|---|---|---| +| eza | `themes/eza/theme.yml` | `~/.config/eza/theme.yml` | automatisch aus dem Config-Verzeichnis | +| joe | `themes/joe/default.jcf` | `~/.joe/colors/default.jcf` | Schema `default`, verdeckt die System-Version | +| fzf | `themes/fzf/colors.zsh` | `~/.config/mwxcol/fzf-colors.zsh` | `source` in `~/.zshrc` → `FZF_DEFAULT_OPTS` | +| iTerm2 | `themes/iterm/mwxcol.itermcolors` | `~/.config/mwxcol/mwxcol.itermcolors` | einmalig importieren, siehe unten | +| Nova | `themes/nova/mwx.novaextension` | `~/Library/.../Nova/Extensions/org.mwx` | Nova-Extension, Theme `mwx` | +| Xcode | `themes/xcode/mwxcol.xccolortheme` | `~/Library/Developer/Xcode/UserData/FontAndColorThemes/` | Theme `mwxcol`, einmal auswählen, siehe unten | +| Claude Code | `themes/claude-code/mwxcol.json` | `~/.claude/themes/mwxcol.json` | `"theme": "custom:mwxcol"` in `settings.json` | + +Getestet mit eza 0.23.5, joe 4.6, fzf 0.70.0 (und 0.58.0), iTerm2 3.6.11, +Nova, Xcode 26.6 und Claude Code 2.1.220 auf macOS. + +## iTerm2 + +Die Palette deckt die 16 ANSI-Slots nicht von sich aus ab: ein Cyan fehlt, und +eigene bright-Varianten gibt es auch nicht. Die fehlenden sechs Werte sind +**nicht neu erfunden**, sondern wörtlich aus dem Nova-Theme übernommen, das +dieselbe Lücke bereits geschlossen hatte — dadurch sehen Novas Terminal und +iTerm2 identisch aus. Abgeleitete Werte sind unten mit \* markiert. + +| Slot | Farbe | | Slot | Farbe | | +|---|---|---|---|---|---| +| 0 black | `#444455` | darker | 8 br-black | `#777788` | dark | +| 1 red | `#F38BA8` | red | 9 br-red | `#F7B5C8` | \* | +| 2 green | `#94E2D5` | green | 10 br-green | `#B8EAE1` | \* | +| 3 yellow | `#F9E2AF` | yellow | 11 br-yellow | `#FCEECB` | \* | +| 4 blue | `#B4BEFE` | blue | 12 br-blue | `#CDD4FE` | \* | +| 5 magenta | `#CBA6F7` | violet | 13 br-magenta| `#F5B2F7` | pink | +| 6 cyan | `#94DAE0` | \* | 14 br-cyan | `#B8E7EB` | \* | +| 7 white | `#AAAABB` | grey | 15 br-white | `#F0F0EA` | white | + +Dazu Vordergrund `white`, Hintergrund `#252528` (unverändert), Cursor `red` mit +dunklem Cursor-Text, Auswahl `darker`, Links `blue`. + +**Import** — iTerm2 hält seine Einstellungen im Speicher und schreibt sie beim +Beenden zurück. Eine direkt bearbeitete Plist wäre also wieder weg; der Import +muss durch die Oberfläche: + + Einstellungen > Profiles > Colors > Color Presets… > Import… + ~/.config/mwxcol/mwxcol.itermcolors + +Danach im selben Menü `mwxcol` auswählen. Der Preset-Name kommt aus dem +Dateinamen. Die älteren Presets `mwx` und `mwxdark` bleiben unangetastet — sie +tragen noch die grellen Standard-ANSI-Töne und sind *nicht* diese Palette. + +`themes/iterm/preview.sh` setzt die Palette per Escape-Sequenz in der laufenden +Session, ohne etwas zu speichern — zum Ansehen vor dem Import. Ein neuer Tab +hat wieder die alten Farben. + +## Xcode + +Xcode liest jede `.xccolortheme` aus dem Ordner oben und zeigt sie unter dem +Dateinamen an — das Theme heißt also `mwxcol`, wie das iTerm2-Preset. Die +älteren Themes `mwx` und `mwxdark` bleiben unangetastet. + +Auswählen: **Einstellungen > Themes > mwxcol**. Xcode führt hell und dunkel +getrennt (`XCFontAndColorCurrentTheme` bzw. `…CurrentDarkTheme`), das Theme +also in beiden Erscheinungsbildern wählen, wenn es überall gelten soll. +`./install.sh --check` liest beide Werte und sagt, was gerade aktiv ist. + +Ein laufendes Xcode sieht die neue Datei erst nach einem Neustart. + +Die Zuordnung folgt dem Nova-Theme, damit beide Editoren gleich aussehen: + +| Xcode-Element | Farbe | | Xcode-Element | Farbe | +|---|---|---|---|---| +| Plain Text, Variablen | white | | Keywords | violet | +| Kommentare, Doc-Kommentare | dark | | Strings | green | +| Doc-Schlüsselwörter, `MARK:` | grey | | Attribute (`@State`) | green | +| Typen und Klassen | yellow | | Zahlen, Zeichen | orange | +| Typ-Deklaration | yellow | | Präprozessor, Makros | orange | +| Funktionen, andere Deklarationen | blue | | Konstanten | orange | +| URLs | blue | | Reguläre Ausdrücke | pink | + +Unsichtbare Zeichen sind `darker`, der Cursor ist `red` wie im iTerm2-Preset, +die Zeile mit dem Debugger `green` mit 25 % Deckkraft. Marker im Scrollbalken +folgen der Palette: Fehler `red`, Warnung `yellow`, Laufzeitproblem `orange`, +Analyzer `violet`, Breakpoint `blue`, Diff `grey`. + +Die Flächen sind die einzigen Werte außerhalb der Palette. Der Editor ist +`#15151C` — dunkler als der Terminal-Hintergrund und anders als überall sonst +hier, weil er in Xcode so eingestellt wurde; Auswahl und aktuelle Zeile sind +`#20202B`, die Konsole behält `#252528` aus dem iTerm2-Profil und der +Quick-Help-Kasten `#2E2E35` (`darker` mit 30 % über `#252528`). + +Drei Dinge, die man beim Anpassen wissen muss: + +**Xcode unterscheidet eigene und fremde Symbole, dieses Theme nicht.** Für +Klassen, Typen, Funktionen, Variablen, Konstanten und Makros gibt es jeweils +einen Schlüssel für Projekt-Symbole und einen mit `.system` für Symbole aus +Frameworks. Beide tragen hier denselben Wert, weil die Palette keine freien +Farbtöne mehr hat, mit denen die Unterscheidung nicht wie eine zweite Bedeutung +aussähe. Wer sie doch will, setzt die sechs `.system`-Schlüssel auf `violet` +`#CBA6F7` — dann sind Framework-Symbole durchgehend violett wie in Xcodes +eigenem Dark-Theme, kollidieren aber mit den Keywords. + +**Schriften stehen mit im Theme, nicht nur Farben.** Alle Syntax-Schlüssel +tragen `HackNFM-Regular - 15.0` (Hack Nerd Font Mono), der Quick-Help-Text +`.SFNS-Regular - 14.0`. Andere Schrift gewünscht: die Werte in +`DVTSourceTextSyntaxFonts` ersetzen — Xcode erwartet den PostScript-Namen +(`HackNFM-Regular`), nicht den Anzeigenamen („Hack Nerd Font Mono"). Fette +Schnitte für Keywords und Deklarationen hat das Theme absichtlich nicht mehr: +Xcode ebnet sie beim nächsten Zurückschreiben ohnehin ein, siehe unten. + +**Wer das Theme in den Einstellungen anfasst, schreibt die Datei um.** Xcode +speichert dann seine eigene Fassung, und die ist nicht nur ohne Kommentare — +beobachtet an Xcode 26.6 nach einer Größenänderung in der Oberfläche: + +* `DVTFontSizeModifier` verschwindet und wird in die Schriftgrößen eingerechnet, +* die Schnitte werden eingeebnet, `HackNFM-Bold` wird überall zu `-Regular`, +* Schlüssel, die Xcodes eigenes Theme-Modell nicht führt, fallen heraus — + hier `xcode.syntax.markup.aside.kind` und `DVTDebuggerInstructionPointerColor` + (letzterer steht nur im Theme der `SourceEditor.framework`). + +`--check` meldet die installierte Datei danach als „WEICHT AB"; wer die +Änderung behalten will, überträgt sie von Hand ins Repo, sonst überschreibt der +nächste `./install.sh` sie kommentarlos (das Backup liegt als `.bak` daneben). +Bei `--link` ersetzt Xcode womöglich den Symlink durch eine echte Datei, dann +ist die Verbindung ganz aufgehoben. + +## Claude Code + +Ab Version 2.1.220 liest Claude Code eigene Themes aus `~/.claude/themes/*.json` +(mit `CLAUDE_CONFIG_DIR` verschiebt sich das Verzeichnis mit). Aufbau: + +```json +{ "name": "mwxcol", "base": "dark", "overrides": { "text": "#F0F0EA", … } } +``` + +`base` ist eines der eingebauten Themes, `overrides` überschreibt einzelne +Farbschlüssel davon. Erlaubt sind `#RRGGBB`, `#RGB`, `rgb(r,g,b)`, `ansi256(n)` +und `ansi:`; unbekannte Schlüssel und ungültige Werte werden still +verworfen. Ausgewählt wird das Theme über `/theme` oder direkt mit +`"theme": "custom:mwxcol"` in `~/.claude/settings.json` — der Dateiname ist der +Slug. Claude Code beobachtet das Verzeichnis, Änderungen greifen sofort. + +Dieses Theme setzt **alle** 72 Schlüssel des `dark`-Themes, damit keine Farbe +aus dem Original durchschlägt: + +| Element | Farbe | | Element | Farbe | +|---|---|---|---|---| +| Fließtext | white | | Erfolg, Plan-Modus | green | +| Sekundärtext, inaktiv | grey | | Fehler | red | +| Prompt-Rahmen | dark | | Warnung | yellow | +| Auswahl, Flächen | darker | | Claude selbst, Fast Mode | orange | +| Rechte, Vorschläge, IDE | blue | | Bash-Rahmen | pink | +| Auto-Accept, Skills | violet | | | | + +Die Shimmer-Varianten (die hellere Farbe der Laufanimation) nehmen, wo es sie +gibt, die abgeleiteten Hellwerte aus der iTerm2-Tabelle oben — `blue` schimmert +also nach `#CDD4FE`, `violet` nach `pink`. + +Die Diff-Hintergründe sind die einzigen gemischten Werte: `green` bzw. `red` +mit 30 % Deckkraft über `#252528` (`#465E5C` / `#63444E`), auf Wortebene mit +50 %, für die gedimmte Fassung mit 15 %. Nachrichtenflächen sind `darker` mit +30 % über `#252528` (`#2E2E35`). + +**Ein einfacherer Weg, der die Palette nicht braucht:** das eingebaute Theme +`dark-ansi` nimmt die 16 ANSI-Farben des Terminals — nach dem iTerm2-Import +sind das ohnehin die Farben von hier, dann aber gerundet auf die 16 Slots. +`custom:mwxcol` ist genauer und gilt auch in Terminals ohne das Preset. + +## Fallstricke + +Vier Dinge, die beim Übertragen Zeit gekostet haben und beim nächsten Mal Zeit +sparen: + +**eza mergt über sein eingebautes Theme, es ersetzt es nicht.** Wer nur +`foreground` setzt, erbt `is_bold` und `is_underline` aus eza's Default. Genau +so entstand die Unterstreichung bei `README.md` und `Makefile` — die stecken in +`file_type: build`, und dessen Default ist *bold + underline*. Deshalb steht im +Theme an mehreren Stellen ein explizites `is_underline: false`, das sonst +überflüssig aussähe. Beim Ergänzen neuer Klassen daran denken. + +**joes Statuszeile bleibt invers, egal was `-status` sagt.** Das kommt aus dem +`\i` (= Inverse, joe(1)) am Anfang von `-lmsg` in `~/.joerc`. Wer dort die +Palette sehen will, muss das `\i` entfernen — nicht am Theme drehen. + +**`FZF_DEFAULT_OPTS` hängt an, es überschreibt nicht.** Die Zeile lautet +`FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS'…'`. Zweimal sourcen hängt den Block zweimal +an; funktional gewinnt zwar das letzte `--color`, sauber ist es nicht. Nach +Änderungen `exec zsh` statt `source ~/.zshrc`. + +**joe `-term 0..15` reicht auf die Terminal-Palette durch.** Das Theme lässt die +16 nummerierten Farben absichtlich auf der Identität (`-term 0 0` …), damit alte +Syntax-Dateien, die Farben per Nummer angeben, die Terminal-Palette benutzen. +Das ist erst korrekt, *nachdem* das iTerm2-Preset importiert ist — vorher landen +solche Dateien auf den grellen Standard-ANSI-Tönen. Auf einem Rechner mit einem +anderen, nicht angepassten Terminal gilt dasselbe: dann entweder dort die +Palette setzen oder im joe-Theme `-term 1 $F38BA8`, `-term 2 $94E2D5` usw. auf +Hex ziehen. Betroffen sind wenige Dateitypen — die mitgelieferten Syntax-Dateien +von joe 4.6 benutzen überwiegend Klassennamen statt Nummern. diff --git a/bin/mwxcol b/bin/mwxcol new file mode 100755 index 0000000..92fc818 Binary files /dev/null and b/bin/mwxcol differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..85eaada --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module mwxcol + +go 1.26.1 + +require ( + github.com/fatih/color v1.19.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + golang.org/x/sys v0.42.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..3d002f3 --- /dev/null +++ b/go.sum @@ -0,0 +1,9 @@ +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..8b8d00a --- /dev/null +++ b/install.sh @@ -0,0 +1,214 @@ +#!/bin/sh +# mwxcol — Farbschema auf diesem Rechner installieren. +# Siehe README.md für die Palette und die einzelnen Zuordnungen. + +set -eu + +REPO=$(cd "$(dirname "$0")" && pwd) +MODE=install +USE_LINK=0 + +usage() { + cat <&2; usage >&2; exit 2 ;; + esac + shift +done + +say() { printf ' %-6s %-46s %s\n' "$1" "$2" "$3"; } + +# Kürzt $HOME zu ~ für die Ausgabe. +tilde() { printf '%s' "$1" | sed "s|^$HOME|~|"; } + +# install_path +# Funktioniert für Dateien und Verzeichnisse. +install_path() { + name=$1; src=$2; dst=$3 + short=$(tilde "$dst") + + if [ ! -e "$src" ]; then + say "$name" "$short" "QUELLE FEHLT: $src" + return 0 + fi + + if [ -L "$dst" ] && [ "$(readlink "$dst")" = "$src" ]; then + say "$name" "$short" "ok (Symlink ins Repo)" + [ "$MODE" = check ] && return 0 + [ "$USE_LINK" = 1 ] && return 0 + fi + + if [ -e "$dst" ] && diff -r -q "$src" "$dst" >/dev/null 2>&1; then + say "$name" "$short" "ok (identisch)" + [ "$MODE" = check ] && return 0 + [ "$USE_LINK" = 0 ] && return 0 + fi + + if [ "$MODE" = check ]; then + if [ -e "$dst" ]; then + say "$name" "$short" "WEICHT AB" + else + say "$name" "$short" "fehlt" + fi + return 0 + fi + + mkdir -p "$(dirname "$dst")" + + if [ -e "$dst" ] && [ ! -L "$dst" ]; then + rm -rf "$dst.bak" + cp -R "$dst" "$dst.bak" + note="Backup: $(basename "$dst").bak" + else + note="" + fi + + rm -rf "$dst" + if [ "$USE_LINK" = 1 ]; then + ln -sfn "$src" "$dst" + say "$name" "$short" "verlinkt $note" + else + cp -R "$src" "$dst" + say "$name" "$short" "kopiert $note" + fi +} + +echo "mwxcol aus $REPO" +[ "$MODE" = check ] && echo "(nur Prüfung — es wird nichts verändert)" +echo + +install_path eza "$REPO/themes/eza/theme.yml" "$HOME/.config/eza/theme.yml" +install_path joe "$REPO/themes/joe/default.jcf" "$HOME/.joe/colors/default.jcf" +install_path fzf "$REPO/themes/fzf/colors.zsh" "$HOME/.config/mwxcol/fzf-colors.zsh" + +if [ "$(uname)" = "Darwin" ]; then + install_path iterm "$REPO/themes/iterm/mwxcol.itermcolors" \ + "$HOME/.config/mwxcol/mwxcol.itermcolors" +else + say iterm "-" "übersprungen (nur macOS)" +fi + +if [ "$(uname)" = "Darwin" ]; then + install_path nova "$REPO/themes/nova/mwx.novaextension" \ + "$HOME/Library/Application Support/Nova/Extensions/org.mwx" +else + say nova "-" "übersprungen (nur macOS)" +fi + +if [ "$(uname)" = "Darwin" ]; then + install_path xcode "$REPO/themes/xcode/mwxcol.xccolortheme" \ + "$HOME/Library/Developer/Xcode/UserData/FontAndColorThemes/mwxcol.xccolortheme" +else + say xcode "-" "übersprungen (nur macOS)" +fi + +# Claude Code liest ~/.claude/themes/*.json und benennt das Theme nach dem +# Dateinamen; CLAUDE_CONFIG_DIR verschiebt das Verzeichnis. +install_path cc "$REPO/themes/claude-code/mwxcol.json" \ + "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/themes/mwxcol.json" + +# fzf wird nicht über eine Theme-Datei geladen, sondern über eine Umgebungs- +# variable — die Datei oben muss also von der Shell gesourct werden. +echo +SRC_LINE='[ -f ~/.config/mwxcol/fzf-colors.zsh ] && source ~/.config/mwxcol/fzf-colors.zsh' +if [ -f "$HOME/.zshrc" ] && grep -q 'mwxcol/fzf-colors.zsh' "$HOME/.zshrc"; then + echo "fzf: ~/.zshrc sourct die Farbdatei bereits." +elif [ -f "$HOME/.zshrc" ] && grep -q '# fzf — Palette aus mwxcol.go' "$HOME/.zshrc"; then + echo "fzf: ~/.zshrc enthält den Farbblock bereits direkt — nichts zu tun." + echo " (Wer stattdessen die Repo-Datei sourcen will: Block löschen und" + echo " diese Zeile eintragen)" + echo " $SRC_LINE" +else + echo "fzf: noch nicht in ~/.zshrc verdrahtet. Diese Zeile eintragen:" + echo " $SRC_LINE" +fi + +# iTerm2 hält seine Einstellungen im Speicher und schreibt sie beim Beenden +# zurück — eine direkt bearbeitete Plist wäre also wieder weg. Deshalb wird +# das Preset nur bereitgelegt und einmalig von Hand importiert. +if [ "$(uname)" = "Darwin" ] && [ -e "$HOME/Library/Preferences/com.googlecode.iterm2.plist" ]; then + echo + themed=$(python3 - <<'PY' 2>/dev/null || true +import plistlib, subprocess, os +p = os.path.expanduser("~/Library/Preferences/com.googlecode.iterm2.plist") +xml = subprocess.run(["plutil","-convert","xml1","-o","-",p], + capture_output=True).stdout +d = plistlib.loads(xml) +for prof in d.get("New Bookmarks", []): + if prof.get("Name") != "Default": + continue + c = prof.get("Ansi 1 Color") or {} + hx = "%02X%02X%02X" % tuple(round(c.get(k, 0) * 255) + for k in ("Red Component", "Green Component", "Blue Component")) + print("ja" if hx == "F38BA8" else "nein") +PY +) + if [ "$themed" = "ja" ]; then + echo "iTerm2: Profil \"Default\" trägt die Palette bereits." + else + echo "iTerm2: Profil \"Default\" trägt noch nicht die Palette. Einmalig:" + echo " Einstellungen > Profiles > Colors > Color Presets… > Import…" + echo " $(tilde "$HOME/.config/mwxcol/mwxcol.itermcolors")" + echo " danach im selben Menü \"mwxcol\" auswählen." + echo " Vorher ansehen: $(tilde "$REPO")/themes/iterm/preview.sh" + fi +fi + +# Claude Code merkt sich das Theme in den Settings, nicht am Dateinamen. +CC_SETTINGS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/settings.json" +if [ -f "$CC_SETTINGS" ]; then + echo + if grep -q '"theme"[[:space:]]*:[[:space:]]*"custom:mwxcol"' "$CC_SETTINGS"; then + echo "Claude Code: Theme mwxcol ist gewählt." + else + echo "Claude Code: Theme noch nicht gewählt — /theme > mwxcol, oder in" + echo " $(tilde "$CC_SETTINGS") eintragen: \"theme\": \"custom:mwxcol\"" + fi +fi + +# Xcode führt hell und dunkel getrennt (XCFontAndColorCurrentTheme und +# …CurrentDarkTheme). Die Datei bereitzulegen reicht also nicht, sie muss in +# den Einstellungen ausgewählt werden — und ein laufendes Xcode sieht eine neu +# hinzugekommene Theme-Datei erst nach dem Neustart. +if [ "$(uname)" = "Darwin" ] && [ -d "$HOME/Library/Developer/Xcode" ]; then + echo + light=$(defaults read com.apple.dt.Xcode XCFontAndColorCurrentTheme 2>/dev/null || echo "—") + dark=$(defaults read com.apple.dt.Xcode XCFontAndColorCurrentDarkTheme 2>/dev/null || echo "—") + if [ "$light" = "mwxcol.xccolortheme" ] && [ "$dark" = "mwxcol.xccolortheme" ]; then + echo "Xcode: mwxcol ist gewählt (hell und dunkel)." + else + echo "Xcode: mwxcol noch nicht überall gewählt." + echo " aktuell hell: $light" + echo " aktuell dunkel: $dark" + echo " Einstellungen > Themes > mwxcol (Xcode ggf. vorher neu starten)." + fi +fi + +if [ "$MODE" != check ]; then + echo + echo "Danach: exec zsh — Nova-Theme unter Einstellungen > Themes > mwx wählen." +fi diff --git a/mwxcol b/mwxcol new file mode 100755 index 0000000..92fc818 Binary files /dev/null and b/mwxcol differ diff --git a/mwxcol.go b/mwxcol.go new file mode 100644 index 0000000..9ee7945 --- /dev/null +++ b/mwxcol.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + + "github.com/fatih/color" +) + +type rgb struct{ r, g, b int } + +func (c rgb) hex() string { return fmt.Sprintf("#%02X%02X%02X", c.r, c.g, c.b) } + +func (c rgb) dec() string { return fmt.Sprintf("%d,%d,%d", c.r, c.g, c.b) } + +func main() { + + var white = rgb{0xf0, 0xf0, 0xea} + var yellow = rgb{0xf9, 0xe2, 0xaf} + var orange = rgb{0xfa, 0xb3, 0x87} + var red = rgb{0xf3, 0x8b, 0xa8} + var green = rgb{0x94, 0xe2, 0xd5} + var blue = rgb{0xb4, 0xbe, 0xfe} + var pink = rgb{0xf5, 0xb2, 0xf7} + var violet = rgb{0xcb, 0xa6, 0xf7} + var grey = rgb{0xaa, 0xaa, 0xbb} + var dark = rgb{0x77, 0x77, 0x88} + var darker = rgb{0x44, 0x44, 0x55} + + mwxcol(white, "white") + mwxcol(yellow, "yellow") + mwxcol(orange, "orange") + mwxcol(red, "red") + mwxcol(green, "green") + mwxcol(blue, "blue") + mwxcol(pink, "pink") + mwxcol(violet, "violet") + mwxcol(grey, "grey") + mwxcol(dark, "dark") + mwxcol(darker, "darker") + +} + +func mwxcol(col rgb, txt string) { + + + + c := color.RGB(col.r,col.g,col.b) + bc := color.New(color.Bold).AddRGB(col.r,col.g,col.b) + + bc.Printf("%-8s",txt) + c.Printf(" %s ", col.hex()) + c.Printf(" %-11s ", col.dec()) + + c.Print(" Hallo World 1234567890._\\/^:|!@#$€π ") + bc.Println("BOLD world") + +} + diff --git a/themes/claude-code/mwxcol.json b/themes/claude-code/mwxcol.json new file mode 100644 index 0000000..aa9adea --- /dev/null +++ b/themes/claude-code/mwxcol.json @@ -0,0 +1,78 @@ +{ + "name": "mwxcol", + "base": "dark", + "overrides": { + "autoAccept": "#CBA6F7", + "autoAcceptShimmer": "#F5B2F7", + "background": "#94DAE0", + "bashBorder": "#F5B2F7", + "bashMessageBackgroundColor": "#3E3641", + "blue_FOR_SUBAGENTS_ONLY": "#B4BEFE", + "briefLabelClaude": "#FAB387", + "briefLabelYou": "#B4BEFE", + "chromeYellow": "#F9E2AF", + "claude": "#FAB387", + "claudeBlueShimmer_FOR_SYSTEM_SPINNER": "#CDD4FE", + "claudeBlue_FOR_SYSTEM_SPINNER": "#B4BEFE", + "claudeShimmer": "#F9E2AF", + "clawd_background": "#252528", + "clawd_body": "#FAB387", + "composerSidebarBackground": "#2E2E35", + "cyan_FOR_SUBAGENTS_ONLY": "#94DAE0", + "diffAdded": "#465E5C", + "diffAddedDimmed": "#364142", + "diffAddedWord": "#5C847E", + "diffRemoved": "#63444E", + "diffRemovedDimmed": "#44343B", + "diffRemovedWord": "#8C5868", + "effortUltra": "#CBA6F7", + "error": "#F38BA8", + "fastMode": "#FAB387", + "fastModeShimmer": "#F9E2AF", + "green_FOR_SUBAGENTS_ONLY": "#94E2D5", + "ide": "#B4BEFE", + "inactive": "#AAAABB", + "inactiveShimmer": "#F0F0EA", + "inverseText": "#252528", + "memoryBackgroundColor": "#363742", + "merged": "#CBA6F7", + "orange_FOR_SUBAGENTS_ONLY": "#FAB387", + "permission": "#B4BEFE", + "permissionShimmer": "#CDD4FE", + "pink_FOR_SUBAGENTS_ONLY": "#F5B2F7", + "planMode": "#94E2D5", + "professionalBlue": "#B4BEFE", + "promptBorder": "#777788", + "promptBorderShimmer": "#AAAABB", + "purple_FOR_SUBAGENTS_ONLY": "#CBA6F7", + "rainbow_blue": "#B4BEFE", + "rainbow_blue_shimmer": "#CDD4FE", + "rainbow_green": "#94E2D5", + "rainbow_green_shimmer": "#B8EAE1", + "rainbow_indigo": "#CBA6F7", + "rainbow_indigo_shimmer": "#F5B2F7", + "rainbow_orange": "#FAB387", + "rainbow_orange_shimmer": "#F9E2AF", + "rainbow_red": "#F38BA8", + "rainbow_red_shimmer": "#F7B5C8", + "rainbow_violet": "#F5B2F7", + "rainbow_violet_shimmer": "#F5B2F7", + "rainbow_yellow": "#F9E2AF", + "rainbow_yellow_shimmer": "#FCEECB", + "rate_limit_empty": "#444455", + "rate_limit_fill": "#B4BEFE", + "red_FOR_SUBAGENTS_ONLY": "#F38BA8", + "remember": "#B4BEFE", + "selectionBg": "#444455", + "skill": "#CBA6F7", + "subtle": "#777788", + "success": "#94E2D5", + "suggestion": "#B4BEFE", + "text": "#F0F0EA", + "userMessageBackground": "#2E2E35", + "userMessageBackgroundHover": "#444455", + "warning": "#F9E2AF", + "warningShimmer": "#FCEECB", + "yellow_FOR_SUBAGENTS_ONLY": "#F9E2AF" + } +} diff --git a/themes/eza/theme.yml b/themes/eza/theme.yml new file mode 100644 index 0000000..5787a96 --- /dev/null +++ b/themes/eza/theme.yml @@ -0,0 +1,123 @@ +# eza theme — Palette aus coltest.go +# +# white #F0F0EA pink #F5B2F7 +# yellow #F9E2AF violet #CBA6F7 +# orange #FAB387 grey #AAAABB +# red #F38BA8 dark #777788 +# green #94E2D5 darker #444455 +# blue #B4BEFE +# +# Ort: ~/.config/eza/theme.yml (oder $EZA_CONFIG_DIR/theme.yml) +# Getestet mit eza 0.23.5. + +colourful: true + +filekinds: + normal: {foreground: "#F0F0EA"} # white + directory: {foreground: "#B4BEFE", is_bold: true} # blue + symlink: {foreground: "#F5B2F7", is_underline: false} # pink + pipe: {foreground: "#CBA6F7"} # violet + block_device: {foreground: "#FAB387"} # orange + char_device: {foreground: "#F9E2AF"} # yellow + socket: {foreground: "#F5B2F7", is_bold: true} # pink + special: {foreground: "#CBA6F7"} # violet + executable: {foreground: "#94E2D5", is_bold: true} # green + mount_point: {foreground: "#B4BEFE", is_underline: false} + +perms: + user_read: {foreground: "#94E2D5"} # green + user_write: {foreground: "#F9E2AF"} # yellow + user_execute_file: {foreground: "#F38BA8", is_underline: false} # red + user_execute_other: {foreground: "#F38BA8", is_underline: false} # red + group_read: {foreground: "#94E2D5"} + group_write: {foreground: "#F9E2AF"} + group_execute: {foreground: "#F38BA8", is_underline: false} + other_read: {foreground: "#94E2D5"} + other_write: {foreground: "#F9E2AF"} + other_execute: {foreground: "#F38BA8", is_underline: false} + special_user_file: {foreground: "#F5B2F7", is_underline: false} # pink — setuid + special_other: {foreground: "#F5B2F7", is_underline: false} # pink + attribute: {foreground: "#777788"} # dark — @ / xattr + +size: + number_byte: {foreground: "#94E2D5"} # green + number_kilo: {foreground: "#94E2D5"} + number_mega: {foreground: "#F9E2AF"} # yellow + number_giga: {foreground: "#FAB387"} # orange + number_huge: {foreground: "#F38BA8"} # red + unit_byte: {foreground: "#94E2D5"} + unit_kilo: {foreground: "#94E2D5"} + unit_mega: {foreground: "#F9E2AF"} + unit_giga: {foreground: "#FAB387"} + unit_huge: {foreground: "#F38BA8"} + major: {foreground: "#CBA6F7"} # violet — Device-Nummern + minor: {foreground: "#F5B2F7"} # pink + +users: + user_you: {foreground: "#F0F0EA"} # white + user_root: {foreground: "#F38BA8"} # red + user_other: {foreground: "#AAAABB"} # grey + group_yours: {foreground: "#AAAABB"} # grey + group_other: {foreground: "#777788"} # dark + group_root: {foreground: "#F38BA8"} # red + +links: + normal: {foreground: "#F5B2F7"} # pink + multi_link_file: {foreground: "#CBA6F7"} # violet + +git: + new: {foreground: "#94E2D5"} # green + modified: {foreground: "#F9E2AF"} # yellow + deleted: {foreground: "#F38BA8"} # red + renamed: {foreground: "#CBA6F7"} # violet + typechange: {foreground: "#FAB387"} # orange + ignored: {foreground: "#444455"} # darker + conflicted: {foreground: "#F5B2F7"} # pink + +git_repo: + branch_main: {foreground: "#94E2D5"} # green + branch_other: {foreground: "#CBA6F7"} # violet + git_clean: {foreground: "#94E2D5"} # green + git_dirty: {foreground: "#F9E2AF"} # yellow + +security_context: + none: {foreground: "#777788"} # dark + selinux: + colon: {foreground: "#444455"} + user: {foreground: "#B4BEFE"} + role: {foreground: "#CBA6F7"} + typ: {foreground: "#F5B2F7"} + range: {foreground: "#F9E2AF"} + +file_type: + image: {foreground: "#CBA6F7"} # violet + video: {foreground: "#F5B2F7"} # pink + music: {foreground: "#94E2D5"} # green + lossless: {foreground: "#94E2D5"} # green + crypto: {foreground: "#F38BA8"} # red + document: {foreground: "#F0F0EA"} # white + compressed: {foreground: "#FAB387"} # orange + temp: {foreground: "#444455"} # darker + compiled: {foreground: "#AAAABB"} # grey + build: {foreground: "#F9E2AF", is_underline: false} # yellow — README, Makefile, … + source: {foreground: "#B4BEFE"} # blue + +punctuation: {foreground: "#444455"} # darker — die - in rwx +date: {foreground: "#B4BEFE"} # blue +inode: {foreground: "#F5B2F7"} # pink +blocks: {foreground: "#777788"} # dark +header: {foreground: "#AAAABB", is_underline: false} # grey +octal: {foreground: "#777788"} # dark +flags: {foreground: "#FAB387"} # orange +symlink_path: {foreground: "#CBA6F7", is_underline: false} # violet +control_char: {foreground: "#F38BA8"} # red +broken_symlink: {foreground: "#F38BA8", is_underline: false} # red +broken_path_overlay: {foreground: "#F38BA8", is_underline: false} + +# Eigene Regeln pro Dateiname / Endung — das, was lsd nicht kann: +# +# filenames: +# Makefile: {filename: {foreground: "#F38BA8", is_bold: true}} +# extensions: +# go: {filename: {foreground: "#94E2D5"}} +# md: {filename: {foreground: "#B4BEFE"}} diff --git a/themes/fzf/colors.zsh b/themes/fzf/colors.zsh new file mode 100644 index 0000000..1176dfb --- /dev/null +++ b/themes/fzf/colors.zsh @@ -0,0 +1,9 @@ +# fzf — Palette aus mwxcol.go +export FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS' + --color=fg:#AAAABB,bg:#252528,hl:#F5B2F7 + --color=fg+:#F0F0EA,bg+:#444455,hl+:#F5B2F7 + --color=info:#94E2D5,prompt:#F38BA8,pointer:#CBA6F7 + --color=marker:#94E2D5,spinner:#CBA6F7,header:#AAAABB + --color=query:#F0F0EA,disabled:#777788,gutter:#252528 + --color=border:#444455,separator:#444455,scrollbar:#777788 + --color=label:#AAAABB,preview-fg:#F0F0EA,preview-bg:#252528' diff --git a/themes/iterm/mwxcol.itermcolors b/themes/iterm/mwxcol.itermcolors new file mode 100644 index 0000000..ff18d97 --- /dev/null +++ b/themes/iterm/mwxcol.itermcolors @@ -0,0 +1,357 @@ + + + + + Ansi 0 Color + + Alpha Component + 1.0 + Blue Component + 0.3333333333333333 + Color Space + sRGB + Green Component + 0.26666666666666666 + Red Component + 0.26666666666666666 + + Ansi 1 Color + + Alpha Component + 1.0 + Blue Component + 0.6588235294117647 + Color Space + sRGB + Green Component + 0.5450980392156862 + Red Component + 0.9529411764705882 + + Ansi 10 Color + + Alpha Component + 1.0 + Blue Component + 0.8823529411764706 + Color Space + sRGB + Green Component + 0.9176470588235294 + Red Component + 0.7215686274509804 + + Ansi 11 Color + + Alpha Component + 1.0 + Blue Component + 0.796078431372549 + Color Space + sRGB + Green Component + 0.9333333333333333 + Red Component + 0.9882352941176471 + + Ansi 12 Color + + Alpha Component + 1.0 + Blue Component + 0.996078431372549 + Color Space + sRGB + Green Component + 0.8313725490196079 + Red Component + 0.803921568627451 + + Ansi 13 Color + + Alpha Component + 1.0 + Blue Component + 0.9686274509803922 + Color Space + sRGB + Green Component + 0.6980392156862745 + Red Component + 0.9607843137254902 + + Ansi 14 Color + + Alpha Component + 1.0 + Blue Component + 0.9215686274509803 + Color Space + sRGB + Green Component + 0.9058823529411765 + Red Component + 0.7215686274509804 + + Ansi 15 Color + + Alpha Component + 1.0 + Blue Component + 0.9176470588235294 + Color Space + sRGB + Green Component + 0.9411764705882353 + Red Component + 0.9411764705882353 + + Ansi 2 Color + + Alpha Component + 1.0 + Blue Component + 0.8352941176470589 + Color Space + sRGB + Green Component + 0.8862745098039215 + Red Component + 0.5803921568627451 + + Ansi 3 Color + + Alpha Component + 1.0 + Blue Component + 0.6862745098039216 + Color Space + sRGB + Green Component + 0.8862745098039215 + Red Component + 0.9764705882352941 + + Ansi 4 Color + + Alpha Component + 1.0 + Blue Component + 0.996078431372549 + Color Space + sRGB + Green Component + 0.7450980392156863 + Red Component + 0.7058823529411765 + + Ansi 5 Color + + Alpha Component + 1.0 + Blue Component + 0.9686274509803922 + Color Space + sRGB + Green Component + 0.6509803921568628 + Red Component + 0.796078431372549 + + Ansi 6 Color + + Alpha Component + 1.0 + Blue Component + 0.8784313725490196 + Color Space + sRGB + Green Component + 0.8549019607843137 + Red Component + 0.5803921568627451 + + Ansi 7 Color + + Alpha Component + 1.0 + Blue Component + 0.7333333333333333 + Color Space + sRGB + Green Component + 0.6666666666666666 + Red Component + 0.6666666666666666 + + Ansi 8 Color + + Alpha Component + 1.0 + Blue Component + 0.5333333333333333 + Color Space + sRGB + Green Component + 0.4666666666666667 + Red Component + 0.4666666666666667 + + Ansi 9 Color + + Alpha Component + 1.0 + Blue Component + 0.7843137254901961 + Color Space + sRGB + Green Component + 0.7098039215686275 + Red Component + 0.9686274509803922 + + Background Color + + Alpha Component + 1.0 + Blue Component + 0.1568627450980392 + Color Space + sRGB + Green Component + 0.1450980392156863 + Red Component + 0.1450980392156863 + + Badge Color + + Alpha Component + 1.0 + Blue Component + 0.6588235294117647 + Color Space + sRGB + Green Component + 0.5450980392156862 + Red Component + 0.9529411764705882 + + Bold Color + + Alpha Component + 1.0 + Blue Component + 0.9176470588235294 + Color Space + sRGB + Green Component + 0.9411764705882353 + Red Component + 0.9411764705882353 + + Cursor Color + + Alpha Component + 1.0 + Blue Component + 0.6588235294117647 + Color Space + sRGB + Green Component + 0.5450980392156862 + Red Component + 0.9529411764705882 + + Cursor Guide Color + + Alpha Component + 1.0 + Blue Component + 0.3333333333333333 + Color Space + sRGB + Green Component + 0.26666666666666666 + Red Component + 0.26666666666666666 + + Cursor Text Color + + Alpha Component + 1.0 + Blue Component + 0.1568627450980392 + Color Space + sRGB + Green Component + 0.1450980392156863 + Red Component + 0.1450980392156863 + + Foreground Color + + Alpha Component + 1.0 + Blue Component + 0.9176470588235294 + Color Space + sRGB + Green Component + 0.9411764705882353 + Red Component + 0.9411764705882353 + + Link Color + + Alpha Component + 1.0 + Blue Component + 0.996078431372549 + Color Space + sRGB + Green Component + 0.7450980392156863 + Red Component + 0.7058823529411765 + + Selected Text Color + + Alpha Component + 1.0 + Blue Component + 0.9176470588235294 + Color Space + sRGB + Green Component + 0.9411764705882353 + Red Component + 0.9411764705882353 + + Selection Color + + Alpha Component + 1.0 + Blue Component + 0.3333333333333333 + Color Space + sRGB + Green Component + 0.26666666666666666 + Red Component + 0.26666666666666666 + + Tab Color + + Alpha Component + 1.0 + Blue Component + 0.3333333333333333 + Color Space + sRGB + Green Component + 0.26666666666666666 + Red Component + 0.26666666666666666 + + + diff --git a/themes/iterm/preview.sh b/themes/iterm/preview.sh new file mode 100755 index 0000000..cdf8128 --- /dev/null +++ b/themes/iterm/preview.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# Setzt die mwxcol-Palette per Escape-Sequenz in der LAUFENDEN iTerm2-Session. +# Nur zum Ansehen: nichts wird gespeichert, ein neuer Tab hat wieder die alten +# Farben. Für dauerhaft siehe mwxcol.itermcolors + README. + +set -eu + +[ "${TERM_PROGRAM:-}" = "iTerm.app" ] || { + echo "Das ist keine iTerm2-Session (TERM_PROGRAM=${TERM_PROGRAM:-leer})." >&2 + exit 1 +} + +set_color() { printf '\033]1337;SetColors=%s=%s\a' "$1" "$2"; } + +set_color black 444455 +set_color red F38BA8 +set_color green 94E2D5 +set_color yellow F9E2AF +set_color blue B4BEFE +set_color magenta CBA6F7 +set_color cyan 94DAE0 +set_color white AAAABB +set_color br_black 777788 +set_color br_red F7B5C8 +set_color br_green B8EAE1 +set_color br_yellow FCEECB +set_color br_blue CDD4FE +set_color br_magenta F5B2F7 +set_color br_cyan B8E7EB +set_color br_white F0F0EA + +set_color fg F0F0EA +set_color bg 252528 +set_color bold F0F0EA +set_color link B4BEFE +set_color curbg F38BA8 +set_color curfg 252528 +set_color selbg 444455 +set_color selfg F0F0EA + +echo "mwxcol-Vorschau aktiv — nur diese Session." +echo +i=0 +while [ $i -lt 8 ]; do printf '\033[4%dm \033[0m' $i; i=$((i+1)); done +printf ' normal\n' +i=0 +while [ $i -lt 8 ]; do printf '\033[10%dm \033[0m' $i; i=$((i+1)); done +printf ' bright\n' diff --git a/themes/nova/mwx.novaextension/CHANGELOG.md b/themes/nova/mwx.novaextension/CHANGELOG.md new file mode 100644 index 0000000..dea1f9d --- /dev/null +++ b/themes/nova/mwx.novaextension/CHANGELOG.md @@ -0,0 +1,3 @@ +## Version 1.0 + +Erste Fassung: dunkles Theme aus der mwxcol-Palette, inkl. Terminal-Farben. diff --git a/themes/nova/mwx.novaextension/README.md b/themes/nova/mwx.novaextension/README.md new file mode 100644 index 0000000..69c4999 --- /dev/null +++ b/themes/nova/mwx.novaextension/README.md @@ -0,0 +1,48 @@ +# mwx — Nova Theme + +Dunkles Theme für [Nova](https://nova.app) mit der Palette aus `mwxcol.go` +(dieselben Farben wie das eza-Theme in `root@eternity`). + +| Name | Hex | Einsatz im Theme | +| ------ | --------- | ------------------------------------------------------- | +| white | `#F0F0EA` | Fließtext, Variablen, Element-Selektoren | +| yellow | `#F9E2AF` | Typen, Attributnamen, CSS-Klassen, `markup.bold` | +| orange | `#FAB387` | Zahlen, Konstanten, Listenpunkte, CSS-IDs | +| red | `#F38BA8` | `self`/`this`, Argumente, Regex-Escapes, `invalid` | +| green | `#94E2D5` | Strings, Dekoratoren, Farbwerte, `markup.italic` | +| blue | `#B4BEFE` | Funktionen/Methoden, Tag-Namen, Links | +| pink | `#F5B2F7` | Properties/Keys, String-Escapes, Regex, Cursor | +| violet | `#CBA6F7` | Schlüsselwörter, Überschriften, `@`-Regeln | +| grey | `#AAAABB` | Operatoren, Klammern, Präfixe, Titelleiste | +| dark | `#777788` | Kommentare, Zeilennummern, Tag-Klammern | +| darker | `#444455` | Unsichtbare Zeichen, Einrückungshilfen, Terminal-Schwarz | + +Hintergründe setzen die Reihe unterhalb von `darker` fort (alle Hue 240): +`#33333F` Ränder · `#26262F` Fenster · `#24242E` aktuelle Zeile · +`#1C1C25` Editor · `#14141B` Textfelder · `#35354F` Auswahl. + +Für die 16 Terminal-Slots fehlen der Palette ein Cyan und die hellen +Varianten — die sind aus den Palettenfarben abgeleitet (gleicher Farbton, +höhere Helligkeit) und in `Themes/mwx.css` als `abgeleitet` markiert. + +## Installieren + +Ordner in Nova öffnen und im Menü **Extensions → Activate Project as Extension** +wählen. Danach unter **Settings → Themes** „mwx" auswählen. + +Alternativ dauerhaft ablegen: + +```sh +cp -R mwx.novaextension ~/Library/"Application Support"/Nova/Extensions/org.mwx +``` + +(Nova danach neu starten.) + +Achtung: Bezeichner und Zielordner sind identisch mit der bereits installierten +Extension `org.mwx` — der Kopierbefehl überschreibt das dortige `Themes/mwx.css`. + +## Anpassen + +Alle Farben stehen direkt als Hex-Werte in `Themes/mwx.css`, gruppiert nach +Fenster, Dokument, Syntax und Terminal. Bei aktiviertem „Activate Project as +Extension" übernimmt Nova Änderungen an der CSS-Datei sofort. diff --git a/themes/nova/mwx.novaextension/Themes/mwx.css b/themes/nova/mwx.novaextension/Themes/mwx.css new file mode 100644 index 0000000..e58b91c --- /dev/null +++ b/themes/nova/mwx.novaextension/Themes/mwx.css @@ -0,0 +1,563 @@ +/* + * mwx — Nova Theme, Palette aus mwxcol.go + * + * white #F0F0EA pink #F5B2F7 + * yellow #F9E2AF violet #CBA6F7 + * orange #FAB387 grey #AAAABB + * red #F38BA8 dark #777788 + * green #94E2D5 darker #444455 + * blue #B4BEFE + * + * Hintergrundstufen (aus darker #444455 nach unten fortgesetzt, Hue 240): + * #33333F Ränder, Buttons + * #26262F Fensterhintergrund (Sidebar, Titelleiste) + * #24242E aktuelle Zeile + * #1C1C25 Editor / Dokument + * #14141B Textfelder + * #35354F Auswahl + * + * Terminal-Slots ohne Entsprechung in der Palette sind als "abgeleitet" + * markiert (cyan sowie alle bright-Varianten der Buntfarben). + */ + +meta { + -theme-display-name: "mwx"; + -theme-interface-style: dark; + -theme-vibrancy: none; + -theme-accent-color: auto; +} + + +/* + * Fenster + */ +meta.window { + background-color: #26262F; + border-color: #14141B; +} + +meta.titlebar { + color: #AAAABB; + background-color: #26262F; + border-color: #14141B; +} +meta.titlebar.inactive { + color: #777788; +} + +meta.divider { + border-color: #14141B; +} + +meta.button { + background: linear-gradient(#33333F, #2B2B36); + border: linear-gradient(#191921, #14141B); + color: #F0F0EA; +} +meta.button.highlighted { + background: linear-gradient(#3E3E4C, #35354F); + color: #F0F0EA; +} +meta.button.selected { + color: #F0F0EA; +} +meta.button.highlighted.selected { + color: #F0F0EA; +} +meta.button.disabled { + color: #777788; +} + +meta.textfield { + background-color: #14141B; + border-color: #33333F; +} +meta.textfield.highlighted { + background-color: #14141B; + border-color: #444455; +} + + +/* + * Dokument + */ +meta.document { + background-color: #1C1C25; + border-color: #14141B; +} + +meta.document.button { + background: linear-gradient(#2B2B36, #24242E); + border: linear-gradient(#191921, #14141B); + color: #F0F0EA; +} +meta.document.button.disabled { + background: linear-gradient(rgba(43, 43, 54, 0.3), rgba(36, 36, 46, 0.3)); + color: #777788; +} +meta.document.button.highlighted { + background: linear-gradient(#3E3E4C, #33333F); +} + +meta.document.textfield { + background-color: #14141B; + border-color: #33333F; +} +meta.document.textfield.highlighted { + background-color: #14141B; + border-color: #444455; +} + +/* Text */ +meta.text { + color: #F0F0EA; +} +meta.text.invisible { + color: #444455; +} +meta.text.selected { + background-color: #35354F; +} + +/* Aktuelle Zeile + Cursor */ +meta.cursor { + background-color: #24242E; + border-color: #F5B2F7; +} + +/* Einrückungshilfen */ +meta.indentguide { + border-color: rgba(68, 68, 85, 0.7); +} + +/* Zeilennummern */ +meta.gutter { + color: #777788; +} +meta.gutter.selected { + background-color: #24242E; + color: #F0F0EA; +} + + +/* + * Syntax + */ +comment { + color: #777788; +} +comment.delimiter { + color: #444455; +} +comment.doctag { + color: #AAAABB; +} +processing { + color: #FAB387; +} +processing.argument { + color: #F9E2AF; +} +declaration { + color: #777788; +} +bracket { + color: #AAAABB; +} +operator { + color: #AAAABB; +} +link { + color: #B4BEFE; +} +invalid { + background-color: rgba(243, 139, 168, 0.2); + color: #F38BA8; +} + +/* Schlüsselwörter */ +keyword { + color: #CBA6F7; +} +keyword.modifier { + color: #CBA6F7; + font-style: italic; +} +keyword.condition { + color: #CBA6F7; +} +keyword.construct { + color: #CBA6F7; +} +keyword.statement { + color: #CBA6F7; +} +keyword.self { + color: #F38BA8; +} +keyword.self.prefix { + color: #F5B2F7; +} + +/* Werte */ +value.boolean { + color: #FAB387; +} +value.null { + color: #FAB387; +} +value.number { + color: #FAB387; +} +value.number.prefix { + color: #777788; +} +value.entity { + color: #FAB387; +} +value.symbol { + color: #FAB387; +} + +/* Bezeichner */ +identifier.type { + color: #F9E2AF; +} +identifier.type.declare { + color: #F9E2AF; + font-weight: bold; +} +identifier.variable { + color: #F0F0EA; +} +identifier.variable.prefix { + color: #AAAABB; +} +identifier.constant { + color: #FAB387; +} +identifier.constant.prefix { + color: #AAAABB; +} +identifier.global { + color: #F5B2F7; +} +identifier.global.prefix { + color: #AAAABB; +} +identifier.property { + color: #F5B2F7; +} +identifier.property.prefix { + color: #AAAABB; +} +identifier.key { + color: #F5B2F7; +} +identifier.argument { + color: #F38BA8; +} +identifier.argument.prefix { + color: #AAAABB; +} +identifier.decorator { + color: #94E2D5; +} +identifier.decorator.prefix { + color: #94E2D5; +} +identifier.function, +identifier.method { + color: #B4BEFE; +} +identifier.function.prefix, +identifier.method.prefix { + color: #AAAABB; +} + +/* Strings */ +string { + color: #94E2D5; +} +string.delimiter { + color: #94E2D5; +} +string.escape { + color: #F5B2F7; +} +string.key { + color: #F5B2F7; +} +string-keyword { + color: #F9E2AF; +} +string-template { + color: #F9E2AF; +} +regex { + color: #F5B2F7; +} +regex.bracket { + color: #CBA6F7; +} +regex.character { + color: #94E2D5; +} +regex.delimiter { + color: #CBA6F7; +} +regex.escape { + color: #F38BA8; +} +regex.operator { + color: #CBA6F7; +} + +/* Markup */ +markup.heading { + color: #CBA6F7; + font-weight: bold; +} +markup.heading.prefix { + color: #777788; +} +markup.line { + color: #777788; +} +markup.bold { + color: #F9E2AF; + font-weight: bold; +} +markup.bold.delimiter { + color: #777788; +} +markup.italic { + color: #94E2D5; + font-style: italic; +} +markup.italic.delimiter { + color: #777788; +} +markup.strikethrough { + color: #777788; + text-decoration: line-through rgba(119, 119, 136, 0.7); +} +markup.strikethrough.delimiter { + color: #444455; +} +markup.list.item { + color: #FAB387; +} +markup.code { + background-color: rgba(68, 68, 85, 0.5); + color: #F0F0EA; +} +markup.code.delimiter { + color: #777788; +} +markup.code-block.delimiter { + color: #777788; +} +markup.code-block.language { + color: #CBA6F7; +} +markup.link { + color: #B4BEFE; +} +markup.link-label { + color: #F5B2F7; +} +markup.link-label.bracket { + color: #777788; +} +markup.link-label.value.number { + color: #FAB387; +} + +/* Definitionen */ +definition.class.name, +definition.type.name, +definition.package.name, +definition.enum.name, +definition.union.name, +definition.struct.name { + color: #F9E2AF; + font-weight: bold; +} +definition.property.name { + color: #F5B2F7; +} +definition.function.name, +definition.method.name { + color: #B4BEFE; + font-weight: bold; +} + +/* Tags */ +tag { + color: #777788; +} +tag.name { + color: #B4BEFE; +} +tag.attribute.name { + color: #F9E2AF; +} +tag.attribute.operator { + color: #AAAABB; +} +tag.attribute.value { + color: #94E2D5; +} +tag.attribute.value.delimiter { + color: #94E2D5; +} +tag.attribute.value.link { + color: #B4BEFE; +} +tag.framework { + color: #777788; +} +tag.framework.name { + color: #CBA6F7; +} +tag.framework.name.prefix { + color: #F5B2F7; +} +tag.framework.attribute.name { + color: #F5B2F7; +} +cdata { + color: #94E2D5; +} +cdata.delimiter { + color: #777788; +} +cdata.label { + color: #CBA6F7; +} + +/* Stylesheets */ +style.at { + color: #CBA6F7; + font-weight: bold; +} +style.selector.universal { + color: #AAAABB; +} +style.selector.nesting { + color: #AAAABB; +} +style.selector.element { + color: #F0F0EA; + font-weight: bold; +} +style.selector.id, +style.selector.identifier.id { + color: #FAB387; +} +style.selector.id.prefix { + color: #FAB387; +} +style.selector.class, +style.selector.identifier.class { + color: #F9E2AF; +} +style.selector.class.prefix { + color: #F9E2AF; +} +style.selector.pseudoclass { + color: #F5B2F7; +} +style.selector.pseudoclass.prefix { + color: #F5B2F7; +} +style.selector.pseudoelement { + color: #CBA6F7; +} +style.selector.pseudoelement.prefix { + color: #CBA6F7; +} +style.selector.placeholder { + color: #B4BEFE; +} +style.selector.placeholder.prefix { + color: #B4BEFE; +} +style.attribute.name { + color: #B4BEFE; +} +style.value.number { + color: #FAB387; +} +style.value.number.unit { + color: #777788; +} +style.value.color.hex { + color: #94E2D5; +} +style.value.color.hex.prefix { + color: #94E2D5; +} +style.value.color.named { + color: #94E2D5; +} +style.value.keyword { + color: #CBA6F7; +} +style.value.identifier.function { + color: #B4BEFE; +} + + +/* + * Terminal + */ +terminal.black { + color: #444455; /* darker */ +} +terminal.red { + color: #F38BA8; /* red */ +} +terminal.green { + color: #94E2D5; /* green */ +} +terminal.yellow { + color: #F9E2AF; /* yellow */ +} +terminal.blue { + color: #B4BEFE; /* blue */ +} +terminal.magenta { + color: #CBA6F7; /* violet */ +} +terminal.cyan { + color: #94DAE0; /* abgeleitet: green nach cyan gedreht */ +} +terminal.white { + color: #AAAABB; /* grey */ +} +terminal.bright-black { + color: #777788; /* dark */ +} +terminal.bright-red { + color: #F7B5C8; /* abgeleitet: red heller */ +} +terminal.bright-green { + color: #B8EAE1; /* abgeleitet: green heller */ +} +terminal.bright-yellow { + color: #FCEECB; /* abgeleitet: yellow heller */ +} +terminal.bright-blue { + color: #CDD4FE; /* abgeleitet: blue heller */ +} +terminal.bright-magenta { + color: #F5B2F7; /* pink */ +} +terminal.bright-cyan { + color: #B8E7EB; /* abgeleitet: cyan heller */ +} +terminal.bright-white { + color: #F0F0EA; /* white */ +} diff --git a/themes/nova/mwx.novaextension/extension.json b/themes/nova/mwx.novaextension/extension.json new file mode 100644 index 0000000..7324d95 --- /dev/null +++ b/themes/nova/mwx.novaextension/extension.json @@ -0,0 +1,8 @@ +{ + "identifier": "org.mwx", + "name": "mwx", + "organization": "mwx", + "description": "Dunkles Theme auf Basis der mwxcol-Palette — Fenster, Editor, Syntax und Terminal.", + "version": "1.0", + "categories": ["themes"] +} diff --git a/themes/xcode/mwxcol.xccolortheme b/themes/xcode/mwxcol.xccolortheme new file mode 100644 index 0000000..3d07f05 --- /dev/null +++ b/themes/xcode/mwxcol.xccolortheme @@ -0,0 +1,263 @@ + + + + + + DVTConsoleDebuggerInputTextColor + 0.941176 0.941176 0.917647 1 + DVTConsoleDebuggerInputTextFont + HackNFM-Regular - 15.0 + DVTConsoleDebuggerOutputTextColor + 0.666667 0.666667 0.733333 1 + DVTConsoleDebuggerOutputTextFont + HackNFM-Regular - 15.0 + DVTConsoleDebuggerPromptTextColor + 0.580392 0.886275 0.835294 1 + DVTConsoleDebuggerPromptTextFont + HackNFM-Regular - 15.0 + DVTConsoleExectuableInputTextColor + 0.666667 0.666667 0.733333 1 + DVTConsoleExectuableInputTextFont + HackNFM-Regular - 15.0 + DVTConsoleExectuableOutputTextColor + 0.941176 0.941176 0.917647 1 + DVTConsoleExectuableOutputTextFont + HackNFM-Regular - 15.0 + DVTConsoleTextBackgroundColor + 0.145098 0.145098 0.156863 1 + DVTConsoleTextInsertionPointColor + 0.952941 0.545098 0.658824 1 + DVTConsoleTextSelectionColor + 0.266667 0.266667 0.333333 1 + DVTDebuggerInstructionPointerColor + 0.580392 0.886275 0.835294 0.25 + DVTFontAndColorVersion + 1 + DVTLineSpacing + 1 + DVTMarkupTextBackgroundColor + 0.180392 0.180392 0.207843 1 + DVTMarkupTextBorderColor + 0.266667 0.266667 0.333333 1 + DVTMarkupTextCodeFont + HackNFM-Regular - 14.0 + DVTMarkupTextEmphasisColor + 0.941176 0.941176 0.917647 1 + DVTMarkupTextEmphasisFont + .SFNS-RegularItalic - 14.0 + DVTMarkupTextInlineCodeColor + 0.666667 0.666667 0.733333 1 + DVTMarkupTextLinkColor + 0.705882 0.745098 0.996078 1 + DVTMarkupTextLinkFont + .SFNS-Regular - 14.0 + DVTMarkupTextNormalColor + 0.941176 0.941176 0.917647 1 + DVTMarkupTextNormalFont + .SFNS-Regular - 14.0 + DVTMarkupTextOtherHeadingColor + 0.666667 0.666667 0.733333 1 + DVTMarkupTextOtherHeadingFont + .SFNS-Regular - 19.2 + DVTMarkupTextPrimaryHeadingColor + 0.941176 0.941176 0.917647 1 + DVTMarkupTextPrimaryHeadingFont + .SFNS-Regular - 32.2 + DVTMarkupTextSecondaryHeadingColor + 0.941176 0.941176 0.917647 1 + DVTMarkupTextSecondaryHeadingFont + .SFNS-Regular - 24.4 + DVTMarkupTextStrongColor + 0.941176 0.941176 0.917647 1 + DVTMarkupTextStrongFont + .SFNS-Bold - 14.0 + DVTScrollbarMarkerAnalyzerColor + 0.796078 0.65098 0.968627 1 + DVTScrollbarMarkerBreakpointColor + 0.705882 0.745098 0.996078 1 + DVTScrollbarMarkerDiffColor + 0.666667 0.666667 0.733333 1 + DVTScrollbarMarkerDiffConflictColor + 0.952941 0.545098 0.658824 1 + DVTScrollbarMarkerErrorColor + 0.952941 0.545098 0.658824 1 + DVTScrollbarMarkerRuntimeIssueColor + 0.980392 0.701961 0.529412 1 + DVTScrollbarMarkerWarningColor + 0.976471 0.886275 0.686275 1 + DVTSourceTextBackground + 0.082353 0.082353 0.109804 1 + DVTSourceTextBlockDimBackgroundColor + 0.466667 0.466667 0.533333 1 + DVTSourceTextCurrentLineHighlightColor + 0.125490 0.125490 0.168627 1 + DVTSourceTextInsertionPointColor + 0.952941 0.545098 0.658824 1 + DVTSourceTextInvisiblesColor + 0.266667 0.266667 0.333333 1 + DVTSourceTextSelectionColor + 0.125490 0.125490 0.168627 1 + DVTSourceTextSyntaxColors + + xcode.syntax.attribute + 0.580392 0.886275 0.835294 1 + xcode.syntax.character + 0.980392 0.701961 0.529412 1 + xcode.syntax.comment + 0.466667 0.466667 0.533333 1 + xcode.syntax.comment.doc + 0.466667 0.466667 0.533333 1 + xcode.syntax.comment.doc.keyword + 0.666667 0.666667 0.733333 1 + xcode.syntax.declaration.other + 0.705882 0.745098 0.996078 1 + xcode.syntax.declaration.type + 0.976471 0.886275 0.686275 1 + xcode.syntax.identifier.class + 0.976471 0.886275 0.686275 1 + xcode.syntax.identifier.class.system + 0.976471 0.886275 0.686275 1 + xcode.syntax.identifier.constant + 0.980392 0.701961 0.529412 1 + xcode.syntax.identifier.constant.system + 0.980392 0.701961 0.529412 1 + xcode.syntax.identifier.function + 0.705882 0.745098 0.996078 1 + xcode.syntax.identifier.function.system + 0.705882 0.745098 0.996078 1 + xcode.syntax.identifier.macro + 0.980392 0.701961 0.529412 1 + xcode.syntax.identifier.macro.system + 0.980392 0.701961 0.529412 1 + xcode.syntax.identifier.type + 0.976471 0.886275 0.686275 1 + xcode.syntax.identifier.type.system + 0.976471 0.886275 0.686275 1 + xcode.syntax.identifier.variable + 0.941176 0.941176 0.917647 1 + xcode.syntax.identifier.variable.system + 0.941176 0.941176 0.917647 1 + xcode.syntax.keyword + 0.796078 0.65098 0.968627 1 + xcode.syntax.mark + 0.666667 0.666667 0.733333 1 + xcode.syntax.markup.aside.kind + 0.976471 0.886275 0.686275 1 + xcode.syntax.markup.code + 0.666667 0.666667 0.733333 1 + xcode.syntax.number + 0.980392 0.701961 0.529412 1 + xcode.syntax.plain + 0.941176 0.941176 0.917647 1 + xcode.syntax.preprocessor + 0.980392 0.701961 0.529412 1 + xcode.syntax.regex + 0.960784 0.698039 0.968627 1 + xcode.syntax.regex.capturename + 0.580392 0.886275 0.835294 1 + xcode.syntax.regex.charname + 0.952941 0.545098 0.658824 1 + xcode.syntax.regex.number + 0.980392 0.701961 0.529412 1 + xcode.syntax.regex.other + 0.796078 0.65098 0.968627 1 + xcode.syntax.string + 0.580392 0.886275 0.835294 1 + xcode.syntax.url + 0.705882 0.745098 0.996078 1 + + DVTSourceTextSyntaxFonts + + xcode.syntax.attribute + HackNFM-Regular - 15.0 + xcode.syntax.character + HackNFM-Regular - 15.0 + xcode.syntax.comment + HackNFM-Regular - 15.0 + xcode.syntax.comment.doc + HackNFM-Regular - 15.0 + xcode.syntax.comment.doc.keyword + HackNFM-Regular - 15.0 + xcode.syntax.declaration.other + HackNFM-Regular - 15.0 + xcode.syntax.declaration.type + HackNFM-Regular - 15.0 + xcode.syntax.identifier.class + HackNFM-Regular - 15.0 + xcode.syntax.identifier.class.system + HackNFM-Regular - 15.0 + xcode.syntax.identifier.constant + HackNFM-Regular - 15.0 + xcode.syntax.identifier.constant.system + HackNFM-Regular - 15.0 + xcode.syntax.identifier.function + HackNFM-Regular - 15.0 + xcode.syntax.identifier.function.system + HackNFM-Regular - 15.0 + xcode.syntax.identifier.macro + HackNFM-Regular - 15.0 + xcode.syntax.identifier.macro.system + HackNFM-Regular - 15.0 + xcode.syntax.identifier.type + HackNFM-Regular - 15.0 + xcode.syntax.identifier.type.system + HackNFM-Regular - 15.0 + xcode.syntax.identifier.variable + HackNFM-Regular - 15.0 + xcode.syntax.identifier.variable.system + HackNFM-Regular - 15.0 + xcode.syntax.keyword + HackNFM-Regular - 15.0 + xcode.syntax.mark + HackNFM-Regular - 15.0 + xcode.syntax.markup.aside.kind + HackNFM-Regular - 15.0 + xcode.syntax.markup.code + HackNFM-Regular - 15.0 + xcode.syntax.number + HackNFM-Regular - 15.0 + xcode.syntax.plain + HackNFM-Regular - 15.0 + xcode.syntax.preprocessor + HackNFM-Regular - 15.0 + xcode.syntax.regex + HackNFM-Regular - 15.0 + xcode.syntax.regex.capturename + HackNFM-Regular - 15.0 + xcode.syntax.regex.charname + HackNFM-Regular - 15.0 + xcode.syntax.regex.number + HackNFM-Regular - 15.0 + xcode.syntax.regex.other + HackNFM-Regular - 15.0 + xcode.syntax.string + HackNFM-Regular - 15.0 + xcode.syntax.url + HackNFM-Regular - 15.0 + + +