diff --git a/build.sh b/build.sh index 457e7fb..cc5b202 100755 --- a/build.sh +++ b/build.sh @@ -8,4 +8,18 @@ export RUSTUP_HOME="$HOME/tools/.rustup" export PATH="$CARGO_HOME/bin:$PATH" cd "$DIR" -npm run tauri build -- "$@" +npm run tauri build -- --bundles app "$@" + +# Dev-Bundle in ein .noindex-Verzeichnis schieben und aus Launch Services +# austragen — Spotlight indiziert .noindex-Ordner nicht, damit erscheint im +# Starter/Spotlight nur die installierte Kopie unter ~/Applications. +BUNDLE="$DIR/src-tauri/target/release/bundle/macos" +NOINDEX="$DIR/src-tauri/target/release/bundle/macos.noindex" +LSREGISTER=/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister +# lsregister -u meldet -10814, wenn das Bundle nicht registriert ist — +# erwartetes Ergebnis, kein Fehler. +"$LSREGISTER" -u "$BUNDLE/ai-control.app" || true +rm -rf "$NOINDEX/ai-control.app" +mkdir -p "$NOINDEX" +mv "$BUNDLE/ai-control.app" "$NOINDEX/" +"$LSREGISTER" -u "$NOINDEX/ai-control.app" || true diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index ad6a514..70668e0 100644 Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png index 325c5bf..2af5747 100644 Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png index 50ee6f8..b52bbc2 100644 Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png index c61abed..c6c5c4b 100644 Binary files a/src-tauri/icons/64x64.png and b/src-tauri/icons/64x64.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png index 3c6d9ea..8c18e13 100644 Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png index bb753db..a0684ba 100644 Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png index 0f73fdc..0ff8bb0 100644 Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png index bc5c3f2..557cb4f 100644 Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png index 977f5da..b837f1c 100644 Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png index 25006ff..930bf76 100644 Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png index 02edc72..1d0b8ce 100644 Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png index 9e8e78d..bebcaf7 100644 Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png index 26c29ae..896067e 100644 Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png index c4a5583..09d909f 100644 Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png index aea4aeb..7962230 100644 Binary files a/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png index cc60d2a..1299af4 100644 Binary files a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png index 1e429fc..6905e0b 100644 Binary files a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png index 46e424b..459b886 100644 Binary files a/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png index 0111b49..0179fe3 100644 Binary files a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png index 9fa83bc..49c57d6 100644 Binary files a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png index 14ac9bd..97b42d9 100644 Binary files a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png index 6fe00d1..e1358f3 100644 Binary files a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png index 4426a7b..046122b 100644 Binary files a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png index e15df5c..f6a4d14 100644 Binary files a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png index c0aa04c..bf7dd48 100644 Binary files a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png index e428d40..6d38c26 100644 Binary files a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png index 239ff6d..39f1f93 100644 Binary files a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png index bb7579b..1ab27f6 100644 Binary files a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png index cb62d2e..4ef7e03 100644 Binary files a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns index df4cf52..dfcd88f 100644 Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico index 8491165..f17e9b3 100644 Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png index aa8230b..ef22ce0 100644 Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@1x.png b/src-tauri/icons/ios/AppIcon-20x20@1x.png index 65fee58..062b48c 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@1x.png and b/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png index 0fdd8f9..d774a62 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png and b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x.png b/src-tauri/icons/ios/AppIcon-20x20@2x.png index 0fdd8f9..d774a62 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@2x.png and b/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@3x.png b/src-tauri/icons/ios/AppIcon-20x20@3x.png index b16c418..5a3cffc 100644 Binary files a/src-tauri/icons/ios/AppIcon-20x20@3x.png and b/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@1x.png b/src-tauri/icons/ios/AppIcon-29x29@1x.png index cf7a283..926ae0b 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@1x.png and b/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png index 1e75895..177f689 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@2x-1.png and b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x.png b/src-tauri/icons/ios/AppIcon-29x29@2x.png index 1e75895..177f689 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@2x.png and b/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@3x.png b/src-tauri/icons/ios/AppIcon-29x29@3x.png index bc6b95d..3c6b862 100644 Binary files a/src-tauri/icons/ios/AppIcon-29x29@3x.png and b/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@1x.png b/src-tauri/icons/ios/AppIcon-40x40@1x.png index 0fdd8f9..d774a62 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@1x.png and b/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png index bf83c93..12edd79 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@2x-1.png and b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x.png b/src-tauri/icons/ios/AppIcon-40x40@2x.png index bf83c93..12edd79 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@2x.png and b/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@3x.png b/src-tauri/icons/ios/AppIcon-40x40@3x.png index 18e5be7..69b1d84 100644 Binary files a/src-tauri/icons/ios/AppIcon-40x40@3x.png and b/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-512@2x.png b/src-tauri/icons/ios/AppIcon-512@2x.png index 8c8c79e..fd987a7 100644 Binary files a/src-tauri/icons/ios/AppIcon-512@2x.png and b/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@2x.png b/src-tauri/icons/ios/AppIcon-60x60@2x.png index 18e5be7..69b1d84 100644 Binary files a/src-tauri/icons/ios/AppIcon-60x60@2x.png and b/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@3x.png b/src-tauri/icons/ios/AppIcon-60x60@3x.png index 285871a..4850591 100644 Binary files a/src-tauri/icons/ios/AppIcon-60x60@3x.png and b/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@1x.png b/src-tauri/icons/ios/AppIcon-76x76@1x.png index 6fbdbdf..a42a9cf 100644 Binary files a/src-tauri/icons/ios/AppIcon-76x76@1x.png and b/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@2x.png b/src-tauri/icons/ios/AppIcon-76x76@2x.png index a4db5f8..03fbc0e 100644 Binary files a/src-tauri/icons/ios/AppIcon-76x76@2x.png and b/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png index e15e188..f6fd77b 100644 Binary files a/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png and b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/src-tauri/icons/trayTemplate.png b/src-tauri/icons/trayTemplate.png new file mode 100644 index 0000000..fd3d7b2 Binary files /dev/null and b/src-tauri/icons/trayTemplate.png differ diff --git a/src-tauri/src/terminal.rs b/src-tauri/src/terminal.rs index d9c1a15..b4dd5c3 100644 --- a/src-tauri/src/terminal.rs +++ b/src-tauri/src/terminal.rs @@ -123,17 +123,46 @@ pub fn term_start( let label = window.label().to_string(); let app = window.app_handle().clone(); + + // Output gebündelt emittieren statt pro read(): der Reader schiebt Chunks + // in einen Channel, der Emitter sammelt alles, was innerhalb von 8 ms + // ankommt, zu einem Event zusammen. Bei Output-Fluten (Scrollen, TUI- + // Redraws) sinkt die Zahl der IPC-Events um Größenordnungen; die 8 ms + // Zusatzlatenz beim Tasten-Echo liegen unter einem Frame. + let (tx, rx) = std::sync::mpsc::channel::>(); std::thread::spawn(move || { let mut buf = [0u8; 8192]; loop { match reader.read(&mut buf) { Ok(0) | Err(_) => break, Ok(n) => { - let _ = app.emit_to(&label, "pty-output", STANDARD.encode(&buf[..n])); + if tx.send(buf[..n].to_vec()).is_err() { + break; + } } } } let _ = child.wait(); + // tx wird hier gedroppt — der Emitter sieht den geschlossenen Channel + // erst, nachdem er alle Rest-Chunks emittiert hat. + }); + std::thread::spawn(move || { + const FLUSH: std::time::Duration = std::time::Duration::from_millis(8); + while let Ok(first) = rx.recv() { + let mut chunk = first; + let deadline = std::time::Instant::now() + FLUSH; + loop { + let now = std::time::Instant::now(); + if now >= deadline { + break; + } + match rx.recv_timeout(deadline - now) { + Ok(more) => chunk.extend_from_slice(&more), + Err(_) => break, + } + } + let _ = app.emit_to(&label, "pty-output", STANDARD.encode(&chunk)); + } let _ = app.emit_to(&label, "pty-exit", ()); }); diff --git a/src/style.css b/src/style.css index 1837f73..c4038eb 100644 --- a/src/style.css +++ b/src/style.css @@ -387,6 +387,19 @@ tbody tr:hover { background: color-mix(in srgb, var(--mantle) 60%, transparent); } +.name-row { + display: flex; + align-items: center; + gap: 0.4rem; +} + +.proj-icon { + width: 18px; + height: 18px; + border-radius: 4px; + flex: none; +} + .cell-name strong { font-family: var(--mono); font-size: 0.85rem; diff --git a/src/terminal.ts b/src/terminal.ts index 0b05f16..cb71523 100644 --- a/src/terminal.ts +++ b/src/terminal.ts @@ -5,6 +5,7 @@ import { LigaturesAddon } from "@xterm/addon-ligatures"; import "@xterm/xterm/css/xterm.css"; import "@fontsource/jetbrains-mono/400.css"; import "@fontsource/jetbrains-mono/500.css"; +import "@fontsource/jetbrains-mono/600.css"; import "@fontsource/jetbrains-mono/700.css"; import { invoke } from "@tauri-apps/api/core"; import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; @@ -28,8 +29,9 @@ window.addEventListener("unhandledrejection", (e) => const project = new URLSearchParams(location.search).get("project")!; const win = getCurrentWebviewWindow(); -// Fensterhintergründe je Theme stehen zusätzlich in terminal.rs -// (theme_background) — beide Stellen müssen zusammenpassen. +// Fensterhintergrund beim Öffnen kommt aus terminal.rs (theme_background); +// dort nicht gepflegte Themes fallen auf Mocha zurück (nur kurzer Moment +// bis die Webview lädt). const THEMES: Record< string, { header: string; border: string; xterm: Record } @@ -169,6 +171,222 @@ const THEMES: Record< brightWhite: "#ffffff", }, }, + "solarized-light": { + header: "#eee8d5", + border: "#93a1a1", + xterm: { + background: "#fdf6e3", + foreground: "#657b83", + cursor: "#657b83", + cursorAccent: "#fdf6e3", + selectionBackground: "#eee8d5b0", + black: "#073642", + red: "#dc322f", + green: "#859900", + yellow: "#b58900", + blue: "#268bd2", + magenta: "#d33682", + cyan: "#2aa198", + white: "#eee8d5", + brightBlack: "#002b36", + brightRed: "#cb4b16", + brightGreen: "#586e75", + brightYellow: "#657b83", + brightBlue: "#839496", + brightMagenta: "#6c71c4", + brightCyan: "#93a1a1", + brightWhite: "#fdf6e3", + }, + }, + "catppuccin-latte": { + header: "#e6e9ef", + border: "#ccd0da", + xterm: { + background: "#eff1f5", + foreground: "#4c4f69", + cursor: "#dc8a78", + cursorAccent: "#eff1f5", + selectionBackground: "#acb0be80", + black: "#5c5f77", + red: "#d20f39", + green: "#40a02b", + yellow: "#df8e1d", + blue: "#1e66f5", + magenta: "#ea76cb", + cyan: "#179299", + white: "#acb0be", + brightBlack: "#6c6f85", + brightRed: "#d20f39", + brightGreen: "#40a02b", + brightYellow: "#df8e1d", + brightBlue: "#1e66f5", + brightMagenta: "#ea76cb", + brightCyan: "#179299", + brightWhite: "#bcc0cc", + }, + }, + "one-light": { + header: "#eaeaeb", + border: "#d4d4d4", + xterm: { + background: "#fafafa", + foreground: "#383a42", + cursor: "#526eff", + cursorAccent: "#fafafa", + selectionBackground: "#e5e5e6b0", + black: "#383a42", + red: "#e45649", + green: "#50a14f", + yellow: "#c18401", + blue: "#4078f2", + magenta: "#a626a4", + cyan: "#0184bc", + white: "#a0a1a7", + brightBlack: "#696c77", + brightRed: "#e45649", + brightGreen: "#50a14f", + brightYellow: "#c18401", + brightBlue: "#4078f2", + brightMagenta: "#a626a4", + brightCyan: "#0184bc", + brightWhite: "#ffffff", + }, + }, + nord: { + header: "#3b4252", + border: "#4c566a", + xterm: { + background: "#2e3440", + foreground: "#d8dee9", + cursor: "#d8dee9", + cursorAccent: "#2e3440", + selectionBackground: "#434c5e80", + black: "#3b4252", + red: "#bf616a", + green: "#a3be8c", + yellow: "#ebcb8b", + blue: "#81a1c1", + magenta: "#b48ead", + cyan: "#88c0d0", + white: "#e5e9f0", + brightBlack: "#4c566a", + brightRed: "#bf616a", + brightGreen: "#a3be8c", + brightYellow: "#ebcb8b", + brightBlue: "#81a1c1", + brightMagenta: "#b48ead", + brightCyan: "#8fbcbb", + brightWhite: "#eceff4", + }, + }, + "tokyo-night": { + header: "#16161e", + border: "#292e42", + xterm: { + background: "#1a1b26", + foreground: "#c0caf5", + cursor: "#c0caf5", + cursorAccent: "#1a1b26", + selectionBackground: "#28345780", + black: "#15161e", + red: "#f7768e", + green: "#9ece6a", + yellow: "#e0af68", + blue: "#7aa2f7", + magenta: "#bb9af7", + cyan: "#7dcfff", + white: "#a9b1d6", + brightBlack: "#414868", + brightRed: "#f7768e", + brightGreen: "#9ece6a", + brightYellow: "#e0af68", + brightBlue: "#7aa2f7", + brightMagenta: "#bb9af7", + brightCyan: "#7dcfff", + brightWhite: "#c0caf5", + }, + }, + monokai: { + header: "#1e1f1c", + border: "#49483e", + xterm: { + background: "#272822", + foreground: "#f8f8f2", + cursor: "#f8f8f2", + cursorAccent: "#272822", + selectionBackground: "#49483e80", + black: "#272822", + red: "#f92672", + green: "#a6e22e", + yellow: "#e6db74", + blue: "#66d9ef", + magenta: "#ae81ff", + cyan: "#a1efe4", + white: "#f8f8f2", + brightBlack: "#75715e", + brightRed: "#f92672", + brightGreen: "#a6e22e", + brightYellow: "#f4bf75", + brightBlue: "#66d9ef", + brightMagenta: "#ae81ff", + brightCyan: "#a1efe4", + brightWhite: "#f9f8f5", + }, + }, + "rose-pine": { + header: "#1f1d2e", + border: "#26233a", + xterm: { + background: "#191724", + foreground: "#e0def4", + cursor: "#e0def4", + cursorAccent: "#191724", + selectionBackground: "#403d5280", + black: "#26233a", + red: "#eb6f92", + green: "#31748f", + yellow: "#f6c177", + blue: "#9ccfd8", + magenta: "#c4a7e7", + cyan: "#ebbcba", + white: "#e0def4", + brightBlack: "#6e6a86", + brightRed: "#eb6f92", + brightGreen: "#31748f", + brightYellow: "#f6c177", + brightBlue: "#9ccfd8", + brightMagenta: "#c4a7e7", + brightCyan: "#ebbcba", + brightWhite: "#e0def4", + }, + }, + everforest: { + header: "#232a2e", + border: "#475258", + xterm: { + background: "#2d353b", + foreground: "#d3c6aa", + cursor: "#d3c6aa", + cursorAccent: "#2d353b", + selectionBackground: "#47525880", + black: "#475258", + red: "#e67e80", + green: "#a7c080", + yellow: "#dbbc7f", + blue: "#7fbbb3", + magenta: "#d699b6", + cyan: "#83c092", + white: "#d3c6aa", + brightBlack: "#859289", + brightRed: "#e67e80", + brightGreen: "#a7c080", + brightYellow: "#dbbc7f", + brightBlue: "#7fbbb3", + brightMagenta: "#d699b6", + brightCyan: "#83c092", + brightWhite: "#d3c6aa", + }, + }, }; interface Project { @@ -199,7 +417,7 @@ const term = new Terminal({ fontFamily: '"JetBrains Mono", Menlo, monospace', fontSize: 13, fontWeightBold: "600", - lineHeight: 1.25, + lineHeight: 1.0, letterSpacing: 0, cursorBlink: true, cursorStyle: "bar", @@ -220,8 +438,10 @@ term.attachCustomKeyEventHandler((e) => { return true; }); -// Font muss geladen sein, bevor WebGL den Glyphen-Atlas aufbaut. +// Font muss geladen sein, bevor WebGL den Glyphen-Atlas aufbaut — +// beide verwendeten Gewichte (400 normal, 600 bold). await document.fonts.load('13px "JetBrains Mono"'); +await document.fonts.load('600 13px "JetBrains Mono"'); term.open(document.getElementById("term")!); // Reihenfolge laut Addon-Doku: Ligaturen vor WebGL aktivieren. term.loadAddon(new LigaturesAddon());