diff --git a/app/Services/Tmux/TmuxLayoutBuilder.php b/app/Services/Tmux/TmuxLayoutBuilder.php index 548ac0fd4..28be586c6 100644 --- a/app/Services/Tmux/TmuxLayoutBuilder.php +++ b/app/Services/Tmux/TmuxLayoutBuilder.php @@ -6,6 +6,8 @@ use App\Models\Settings; /** * Service for building tmux window layouts based on sequential mode + * + * Uses Nerd Font icons for pane names to provide a modern visual experience. */ class TmuxLayoutBuilder { @@ -15,6 +17,43 @@ class TmuxLayoutBuilder protected string $sessionName; + /** + * Pane name icons mapping - uses Nerd Font symbols + * Requires a Nerd Font to display properly (FiraCode NF, JetBrains Mono NF, etc.) + */ + protected array $paneIcons = [ + // Core processing + 'Monitor' => '󰍹 Monitor', + 'update_binaries' => ' Binaries', + 'backfill' => '󰑓 Backfill', + 'update_releases' => ' Releases', + 'sequential' => '󰒿 Sequential', + + // Utilities + 'fixReleaseNames' => '󰯃 Fix Names', + 'removeCrapReleases' => '󰆴 Remove Crap', + + // Postprocessing + 'postprocessing_additional' => ' Additional', + 'postprocessing_tv' => '󰟴 TV/Anime', + 'postprocessing_amazon' => ' Amazon', + 'postprocessing_movies' => ' Movies', + 'postprocessing_xxx' => '󰞋 XXX', + + // IRC + 'scrapeIRC' => '󰻞 IRC Scraper', + + // Monitoring tools + 'htop' => ' htop', + 'nmon' => '󰨇 nmon', + 'vnstat' => '󰛳 vnstat', + 'tcptrack' => '󱘖 tcptrack', + 'bwm-ng' => '󰾆 bwm-ng', + 'mytop' => ' mytop', + 'redis' => ' Redis', + 'bash' => ' Console', + ]; + public function __construct(TmuxSessionManager $sessionManager) { $this->sessionManager = $sessionManager; @@ -22,6 +61,14 @@ class TmuxLayoutBuilder $this->paneManager = new TmuxPaneManager($this->sessionName); } + /** + * Get the display name with icon for a pane + */ + protected function getPaneDisplayName(string $name): string + { + return $this->paneIcons[$name] ?? $name; + } + /** * Build the appropriate layout based on sequential mode */ @@ -40,43 +87,43 @@ class TmuxLayoutBuilder protected function buildFullLayout(): bool { // Window 0: Monitor + Binaries + Backfill + Releases - if (! $this->sessionManager->createSession('Monitor')) { + if (! $this->sessionManager->createSession($this->getPaneDisplayName('Monitor'))) { return false; } // Select pane 0.0, then split for binaries (right side, 67%) $this->paneManager->selectPane('0.0'); - $this->paneManager->splitHorizontal('0', '67%', 'update_binaries'); + $this->paneManager->splitHorizontal('0', '67%', $this->getPaneDisplayName('update_binaries')); // Select pane 0.1 (binaries), then split for backfill (bottom, 67%) $this->paneManager->selectPane('0.1'); - $this->paneManager->splitVertical('0', '67%', 'backfill'); + $this->paneManager->splitVertical('0', '67%', $this->getPaneDisplayName('backfill')); // Split again for releases (bottom, 50%) - $this->paneManager->splitVertical('0', '50%', 'update_releases'); + $this->paneManager->splitVertical('0', '50%', $this->getPaneDisplayName('update_releases')); // Window 1: Fix names + Remove crap - $this->paneManager->createWindow(1, 'utils'); - $this->paneManager->setPaneTitle('1.0', 'fixReleaseNames'); + $this->paneManager->createWindow(1, ' Utils'); + $this->paneManager->setPaneTitle('1.0', $this->getPaneDisplayName('fixReleaseNames')); $this->paneManager->selectPane('1.0'); - $this->paneManager->splitHorizontal('1', '50%', 'removeCrapReleases'); + $this->paneManager->splitHorizontal('1', '50%', $this->getPaneDisplayName('removeCrapReleases')); // Window 2: Postprocessing (Left: Additional + TV + Amazon, Right: Movies + XXX) - $this->paneManager->createWindow(2, 'post'); - $this->paneManager->setPaneTitle('2.0', 'postprocessing_additional'); + $this->paneManager->createWindow(2, ' Post'); + $this->paneManager->setPaneTitle('2.0', $this->getPaneDisplayName('postprocessing_additional')); // Split horizontally to create left and right halves (don't set title yet) $this->paneManager->splitHorizontal('2', '50%', ''); // Left side (2.0): split vertically for TV and Amazon $this->paneManager->selectPane('2.0'); - $this->paneManager->splitVertical('2', '67%', 'postprocessing_tv'); - $this->paneManager->splitVertical('2', '50%', 'postprocessing_amazon'); + $this->paneManager->splitVertical('2', '67%', $this->getPaneDisplayName('postprocessing_tv')); + $this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_amazon')); // Right side: After left splits, right side is now 2.3 $this->paneManager->selectPane('2.3'); - $this->paneManager->setPaneTitle('2.3', 'postprocessing_movies'); - $this->paneManager->splitVertical('2', '50%', 'postprocessing_xxx'); + $this->paneManager->setPaneTitle('2.3', $this->getPaneDisplayName('postprocessing_movies')); + $this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_xxx')); // Window 3: IRC Scraper $this->createIRCScraperWindow(); @@ -93,36 +140,36 @@ class TmuxLayoutBuilder protected function buildBasicLayout(): bool { // Window 0: Monitor + Releases - if (! $this->sessionManager->createSession('Monitor')) { + if (! $this->sessionManager->createSession($this->getPaneDisplayName('Monitor'))) { return false; } // Select pane 0.0, then split for releases $this->paneManager->selectPane('0.0'); - $this->paneManager->splitHorizontal('0', '67%', 'update_releases'); + $this->paneManager->splitHorizontal('0', '67%', $this->getPaneDisplayName('update_releases')); // Window 1: Utils (Fix names + Remove crap) - $this->paneManager->createWindow(1, 'utils'); - $this->paneManager->setPaneTitle('1.0', 'fixReleaseNames'); + $this->paneManager->createWindow(1, ' Utils'); + $this->paneManager->setPaneTitle('1.0', $this->getPaneDisplayName('fixReleaseNames')); $this->paneManager->selectPane('1.0'); - $this->paneManager->splitHorizontal('1', '50%', 'removeCrapReleases'); + $this->paneManager->splitHorizontal('1', '50%', $this->getPaneDisplayName('removeCrapReleases')); // Window 2: Postprocessing (Left: Additional + TV + Amazon, Right: Movies + XXX) - $this->paneManager->createWindow(2, 'post'); - $this->paneManager->setPaneTitle('2.0', 'postprocessing_additional'); + $this->paneManager->createWindow(2, ' Post'); + $this->paneManager->setPaneTitle('2.0', $this->getPaneDisplayName('postprocessing_additional')); // Split horizontally to create left and right halves (don't set title yet) $this->paneManager->splitHorizontal('2', '50%', ''); // Left side (2.0): split vertically for TV and Amazon $this->paneManager->selectPane('2.0'); - $this->paneManager->splitVertical('2', '67%', 'postprocessing_tv'); - $this->paneManager->splitVertical('2', '50%', 'postprocessing_amazon'); + $this->paneManager->splitVertical('2', '67%', $this->getPaneDisplayName('postprocessing_tv')); + $this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_amazon')); // Right side: After left splits, right side is now 2.3 $this->paneManager->selectPane('2.3'); - $this->paneManager->setPaneTitle('2.3', 'postprocessing_movies'); - $this->paneManager->splitVertical('2', '50%', 'postprocessing_xxx'); + $this->paneManager->setPaneTitle('2.3', $this->getPaneDisplayName('postprocessing_movies')); + $this->paneManager->splitVertical('2', '50%', $this->getPaneDisplayName('postprocessing_xxx')); // Window 3: IRC Scraper $this->createIRCScraperWindow(); @@ -138,19 +185,19 @@ class TmuxLayoutBuilder protected function buildStrippedLayout(): bool { // Window 0: Monitor + Sequential - if (! $this->sessionManager->createSession('Monitor')) { + if (! $this->sessionManager->createSession($this->getPaneDisplayName('Monitor'))) { return false; } // Select pane 0.0, then split for sequential $this->paneManager->selectPane('0.0'); - $this->paneManager->splitHorizontal('0', '67%', 'sequential'); + $this->paneManager->splitHorizontal('0', '67%', $this->getPaneDisplayName('sequential')); // Window 1: Amazon postprocessing - $this->paneManager->createWindow(1, 'utils'); - $this->paneManager->setPaneTitle('1.0', 'fixReleaseNames'); + $this->paneManager->createWindow(1, ' Utils'); + $this->paneManager->setPaneTitle('1.0', $this->getPaneDisplayName('fixReleaseNames')); $this->paneManager->selectPane('1.0'); - $this->paneManager->splitHorizontal('1', '50%', 'postprocessing_amazon'); + $this->paneManager->splitHorizontal('1', '50%', $this->getPaneDisplayName('postprocessing_amazon')); // Window 2: IRC Scraper $this->createIRCScraperWindow(); @@ -165,8 +212,8 @@ class TmuxLayoutBuilder */ protected function createIRCScraperWindow(): bool { - $this->paneManager->createWindow(3, 'IRCScraper'); - $this->paneManager->setPaneTitle('3.0', 'scrapeIRC'); + $this->paneManager->createWindow(3, '󰻞 IRC'); + $this->paneManager->setPaneTitle('3.0', $this->getPaneDisplayName('scrapeIRC')); return true; } @@ -190,14 +237,14 @@ class TmuxLayoutBuilder // htop if ((int) Settings::settingValue('htop') === 1 && $this->commandExists('htop')) { - $this->paneManager->createWindow($windowIndex, 'htop'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('htop')); $this->paneManager->respawnPane("{$windowIndex}.0", 'htop'); $windowIndex++; } // nmon if ((int) Settings::settingValue('nmon') === 1 && $this->commandExists('nmon')) { - $this->paneManager->createWindow($windowIndex, 'nmon'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('nmon')); $this->paneManager->respawnPane("{$windowIndex}.0", 'nmon -t'); $windowIndex++; } @@ -205,7 +252,7 @@ class TmuxLayoutBuilder // vnstat if ((int) Settings::settingValue('vnstat') === 1 && $this->commandExists('vnstat')) { $vnstatArgs = Settings::settingValue('vnstat_args') ?? ''; - $this->paneManager->createWindow($windowIndex, 'vnstat'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('vnstat')); $this->paneManager->respawnPane("{$windowIndex}.0", "watch -n10 'vnstat {$vnstatArgs}'"); $windowIndex++; } @@ -213,21 +260,21 @@ class TmuxLayoutBuilder // tcptrack if ((int) Settings::settingValue('tcptrack') === 1 && $this->commandExists('tcptrack')) { $tcptrackArgs = Settings::settingValue('tcptrack_args') ?? ''; - $this->paneManager->createWindow($windowIndex, 'tcptrack'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('tcptrack')); $this->paneManager->respawnPane("{$windowIndex}.0", "tcptrack {$tcptrackArgs}"); $windowIndex++; } // bwm-ng if ((int) Settings::settingValue('bwmng') === 1 && $this->commandExists('bwm-ng')) { - $this->paneManager->createWindow($windowIndex, 'bwm-ng'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('bwm-ng')); $this->paneManager->respawnPane("{$windowIndex}.0", 'bwm-ng'); $windowIndex++; } // mytop if ((int) Settings::settingValue('mytop') === 1 && $this->commandExists('mytop')) { - $this->paneManager->createWindow($windowIndex, 'mytop'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('mytop')); $this->paneManager->respawnPane("{$windowIndex}.0", 'mytop -u'); $windowIndex++; } @@ -237,7 +284,7 @@ class TmuxLayoutBuilder $redisArgs = Settings::settingValue('redis_args') ?? ''; $refreshInterval = 30; - $this->paneManager->createWindow($windowIndex, 'redis'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('redis')); // Check if custom args provided for simple redis-cli output if (! empty($redisArgs) && $redisArgs !== 'NULL' && $this->commandExists('redis-cli')) { @@ -268,7 +315,7 @@ class TmuxLayoutBuilder // bash console if ((int) Settings::settingValue('console') === 1) { - $this->paneManager->createWindow($windowIndex, 'bash'); + $this->paneManager->createWindow($windowIndex, $this->getPaneDisplayName('bash')); $this->paneManager->respawnPane("{$windowIndex}.0", 'bash -i'); } } diff --git a/app/Services/Tmux/TmuxPaneManager.php b/app/Services/Tmux/TmuxPaneManager.php index a93a3e1f8..cc04ff5ce 100644 --- a/app/Services/Tmux/TmuxPaneManager.php +++ b/app/Services/Tmux/TmuxPaneManager.php @@ -21,8 +21,11 @@ class TmuxPaneManager */ public function createWindow(int $index, string $name): bool { + // Escape single quotes in the name for shell + $escapedName = str_replace("'", "'\\''", $name); + $result = Process::timeout(10)->run( - "tmux new-window -t {$this->sessionName}:{$index} -n {$name} 'printf \"\\033]2;{$name}\\033\"'" + "tmux new-window -t {$this->sessionName}:{$index} -n '{$escapedName}' 'printf \"\\033]2;{$escapedName}\\033\"'" ); return $result->successful(); @@ -33,7 +36,9 @@ class TmuxPaneManager */ public function splitHorizontal(string $target, string $percentage, string $title = ''): bool { - $titleCmd = $title ? "printf \"\\033]2;{$title}\\033\"" : ''; + // Escape single quotes in the title for shell + $escapedTitle = str_replace("'", "'\\''", $title); + $titleCmd = $title ? "printf \"\\033]2;{$escapedTitle}\\033\"" : ''; $result = Process::timeout(10)->run( "tmux splitw -t {$this->sessionName}:{$target} -h -l {$percentage} '{$titleCmd}'" @@ -47,7 +52,9 @@ class TmuxPaneManager */ public function splitVertical(string $target, string $percentage, string $title = ''): bool { - $titleCmd = $title ? "printf \"\\033]2;{$title}\\033\"" : ''; + // Escape single quotes in the title for shell + $escapedTitle = str_replace("'", "'\\''", $title); + $titleCmd = $title ? "printf \"\\033]2;{$escapedTitle}\\033\"" : ''; $result = Process::timeout(10)->run( "tmux splitw -t {$this->sessionName}:{$target} -v -l {$percentage} '{$titleCmd}'" @@ -129,8 +136,11 @@ class TmuxPaneManager */ public function setPaneTitle(string $target, string $title): bool { + // Escape single quotes in the title for shell + $escapedTitle = str_replace("'", "'\\''", $title); + $result = Process::timeout(5)->run( - "tmux select-pane -t {$this->sessionName}:{$target} -T '{$title}'" + "tmux select-pane -t {$this->sessionName}:{$target} -T '{$escapedTitle}'" ); return $result->successful(); diff --git a/app/Services/Tmux/TmuxSessionManager.php b/app/Services/Tmux/TmuxSessionManager.php index 8f101b576..98058818e 100644 --- a/app/Services/Tmux/TmuxSessionManager.php +++ b/app/Services/Tmux/TmuxSessionManager.php @@ -52,8 +52,11 @@ class TmuxSessionManager $configOption = file_exists($this->configFile) ? "-f {$this->configFile}" : ''; + // Escape single quotes in the window name for shell + $escapedWindowName = str_replace("'", "'\\''", $windowName); + $result = Process::timeout(30)->run( - "tmux {$configOption} new-session -d -s {$this->sessionName} -n {$windowName} 'printf \"\\033]2;{$windowName}\\033\"'" + "tmux {$configOption} new-session -d -s {$this->sessionName} -n '{$escapedWindowName}' 'printf \"\\033]2;{$escapedWindowName}\\033\"'" ); return $result->successful(); diff --git a/config/tmux.conf b/config/tmux.conf index f7e75a5b1..847ddf55e 100644 --- a/config/tmux.conf +++ b/config/tmux.conf @@ -1,6 +1,8 @@ -# NNTmux Tmux Configuration -# This file is now managed in the config/ directory -# Enhanced with modern styling and powerline fonts +# ╭──────────────────────────────────────────────────────────────────────────────╮ +# │ NNTmux Tmux Configuration │ +# │ Modern styling with Nerd Font icons and Catppuccin-inspired colors │ +# │ Requires: Nerd Font (FiraCode, JetBrains Mono, etc.) │ +# ╰──────────────────────────────────────────────────────────────────────────────╯ # GNU-Screen compatible prefix set -g prefix2 C-a @@ -20,55 +22,82 @@ set -ga terminal-overrides ",xterm-256color:Tc" set-hook -g client-attached 'select-window -t 0; select-pane -t 0.0' #============================================================================== -# STATUS BAR - Modern Design with Powerline Symbols +# 🎨 COLOR PALETTE - Catppuccin Mocha Inspired #============================================================================== -# Status bar colors -set -g status-bg colour235 -set -g status-fg colour250 +# Base colors +# bg_dark = colour234 (crust) +# bg = colour235 (base) +# bg_light = colour237 (surface0) +# fg = colour255 (text) +# fg_dim = colour250 (subtext0) +# accent = colour75 (sapphire) +# green = colour114 (green) +# yellow = colour221 (yellow) +# red = colour210 (red) +# purple = colour141 (mauve) +# pink = colour218 (pink) +# peach = colour215 (peach) +# teal = colour116 (teal) + +#============================================================================== +# 📊 STATUS BAR - Modern Glassmorphism Style +#============================================================================== + +# Status bar colors - darker base for contrast +set -g status-bg colour234 +set -g status-fg colour255 # Status bar positioning and update interval set -g status-position bottom set -g status-interval 5 set -g status-justify left -# Left status - Session name with powerline arrow -set -g status-left-length 40 -set -g status-left "#[fg=colour234,bg=colour39,bold] ❐ #S #[fg=colour39,bg=colour235,nobold]" +# Left status - Session name with rounded powerline and icon +set -g status-left-length 50 +set -g status-left "#[fg=colour234,bg=colour75,bold] #S #[fg=colour75,bg=colour237]#[fg=colour255,bg=colour237] #{session_windows} #[fg=colour237,bg=colour234]" -# Right status - System info with powerline style -set -g status-right-length 150 -set -g status-right "#[fg=colour238,bg=colour235]#[fg=colour250,bg=colour238] #(free -h | grep 'Mem' | awk '{print \" \"$3\"/\"$2}') #[fg=colour244,bg=colour238]#[fg=colour250,bg=colour244] #(uptime | cut -d',' -f 3- | sed 's/^ *//;s/ load//')#[fg=colour39,bg=colour244]#[fg=colour234,bg=colour39,bold] %H:%M %d-%b-%y " +# Right status - System info with modern icons +# Shows: RAM | Current Load | Avg Load (5m) | Uptime | Time | Date +set -g status-right-length 200 +set -g status-right "#[fg=colour237,bg=colour234]#[fg=colour116,bg=colour237] #(free -h | grep 'Mem' | awk '{print $3\"/\"$2}') #[fg=colour238,bg=colour237]│#[fg=colour221,bg=colour237] #(cat /proc/loadavg | awk '{print $1}') #[fg=colour238,bg=colour237]│#[fg=colour215,bg=colour237] 󰇙 #(cat /proc/loadavg | awk '{print $2}') #[fg=colour238,bg=colour237]│#[fg=colour114,bg=colour237] 󰥔 #(uptime -p | sed 's/up //' | sed 's/,.*//') #[fg=colour75,bg=colour237]#[fg=colour234,bg=colour75,bold] %H:%M %d %b " -# Window status format -setw -g window-status-format "#[fg=colour244,bg=colour235] #I:#W " -setw -g window-status-current-format "#[fg=colour235,bg=colour39]#[fg=colour234,bg=colour39,bold] #I:#W #[fg=colour39,bg=colour235,nobold]" +# Window status format - inactive windows +setw -g window-status-format "#[fg=colour234,bg=colour236]#[fg=colour250,bg=colour236] #I #W #[fg=colour236,bg=colour234]" + +# Window status format - active window with accent color +setw -g window-status-current-format "#[fg=colour234,bg=colour75]#[fg=colour234,bg=colour75,bold] #I #W #[fg=colour75,bg=colour234]" # Window status separator -setw -g window-status-separator "" +setw -g window-status-separator " " #============================================================================== -# PANE BORDERS - Modern rounded style +# 🔲 PANE BORDERS - Modern Rounded Style with Icons #============================================================================== -# Pane border colors +# Use rounded corners for pane borders (requires font with box-drawing chars) +set -g pane-border-lines heavy + +# Pane border colors - subtle inactive, vibrant active set -g pane-border-style fg=colour238 -set -g pane-active-border-style fg=colour39 +set -g pane-active-border-style fg=colour75 -# Pane border format (requires tmux 3.2+) -set -g pane-border-format "#{?pane_active,#[fg=colour39]#[bg=colour235],#[fg=colour238]#[bg=colour235]} #{pane_index} #{pane_title} " +# Pane border format with status indicator and icons (requires tmux 3.2+) +set -g pane-border-format "#{?pane_active,#[fg=colour75]#[bg=colour235] ,#[fg=colour245]#[bg=colour235] }#[bold]#{pane_index}#[nobold] │ #{pane_title} #{?pane_active,#[fg=colour114]●,#[fg=colour238]○} " set -g pane-border-status top #============================================================================== -# MESSAGE STYLING +# 💬 MESSAGE STYLING #============================================================================== -# Command message styling -set -g message-style bg=colour39,fg=colour234,bold -set -g message-command-style bg=colour238,fg=colour250 +# Command message styling - accent color with bold +set -g message-style bg=colour75,fg=colour234,bold + +# Command prompt styling +set -g message-command-style bg=colour237,fg=colour255 #============================================================================== -# WINDOW OPTIONS +# 🪟 WINDOW OPTIONS #============================================================================== # Constrain window size to the maximum size of any client connected to that window @@ -78,11 +107,21 @@ setw -g aggressive-resize on setw -g monitor-activity on set -g visual-activity off +# Window status activity styling - subtle notification +setw -g window-status-activity-style fg=colour221,bg=colour236,none + # Window status bell styling -setw -g window-status-bell-style fg=colour210,bg=colour235,bold +setw -g window-status-bell-style fg=colour210,bg=colour236,bold #============================================================================== -# MOUSE & HISTORY +# 🔄 COPY MODE STYLING +#============================================================================== + +# Copy mode colors +setw -g mode-style bg=colour75,fg=colour234,bold + +#============================================================================== +# 🖱️ MOUSE & HISTORY #============================================================================== # Enable mouse support @@ -95,14 +134,14 @@ set -g history-limit 6000 set -g remain-on-exit on #============================================================================== -# KEY BINDINGS +# ⌨️ KEY BINDINGS #============================================================================== # Rename pane -bind t command-prompt -p "(rename-pane)" -I "#T" "select-pane -T '%%'" +bind t command-prompt -p " (rename-pane)" -I "#T" "select-pane -T '%%'" # Reload config -bind r source-file ~/.tmux.conf \; display-message "Config reloaded!" +bind r source-file ~/.tmux.conf \; display-message " Config reloaded!" # Split panes using | and - bind | split-window -h @@ -116,3 +155,11 @@ bind -n M-Right select-pane -R bind -n M-Up select-pane -U bind -n M-Down select-pane -D +#============================================================================== +# 📦 POPUP STYLING (tmux 3.2+) +#============================================================================== + +# Popup border style +set -g popup-border-style fg=colour75 +set -g popup-border-lines rounded + diff --git a/config/tmux.php b/config/tmux.php index b3b5b983e..03e47832b 100644 --- a/config/tmux.php +++ b/config/tmux.php @@ -38,16 +38,46 @@ return [ 'fonts' => [ // Popular Nerd Fonts / Powerline fonts - // Install with: sudo apt-get install fonts-powerline + // Install with: ./install-tmux-fonts.sh or see TMUX_FONTS_GUIDE.md 'use_nerd_fonts' => env('TMUX_USE_NERD_FONTS', true), 'symbols' => [ - 'separator_left' => '', // Powerline arrow - 'separator_right' => '', // Powerline arrow - 'branch' => '', // Git branch - 'lock' => '', // Lock symbol + // Powerline arrows (rounded style) + 'separator_left' => '', // Rounded powerline arrow left + 'separator_right' => '', // Rounded powerline arrow right + 'separator_thin_left' => '', // Thin separator + 'separator_thin_right' => '', // Thin separator + + // Status icons + 'session' => '', // Terminal/session icon + 'window' => '', // Window icon + 'pane_active' => '●', // Active pane indicator + 'pane_inactive' => '○', // Inactive pane indicator + + // System monitoring 'cpu' => '', // CPU symbol 'ram' => '', // RAM symbol + 'disk' => '󰋊', // Disk symbol + 'network' => '󰛳', // Network symbol 'clock' => '', // Clock symbol + 'calendar' => '', // Calendar symbol + 'uptime' => '󰥔', // Uptime symbol + + // Processing icons + 'download' => '', // Download/binaries + 'sync' => '󰑓', // Sync/backfill + 'release' => '', // Release + 'fix' => '󰯃', // Fix/wrench + 'trash' => '󰆴', // Trash/remove + 'tv' => '󰟴', // TV + 'movie' => '', // Movie + 'amazon' => '', // Amazon/shopping + 'irc' => '󰻞', // Chat/IRC + + // Monitoring tools + 'htop' => '', // Process monitor + 'database' => '', // Database + 'redis' => '', // Redis + 'console' => '', // Console/terminal ], ], @@ -56,24 +86,29 @@ return [ 'remain_on_exit' => true, 'aggressive_resize' => true, 'monitor_activity' => true, - 'border_style' => 'rounded', // rounded, heavy, double, simple - 'active_border_color' => 'colour39', // Bright blue - 'inactive_border_color' => 'colour238', // Dark grey + 'border_style' => 'heavy', // heavy for bolder lines + 'active_border_color' => 'colour75', // Sapphire blue (Catppuccin) + 'inactive_border_color' => 'colour238', // Dark grey ], 'colors' => [ - // Modern color scheme (Dracula-inspired) - 'background' => 'colour235', - 'foreground' => 'colour250', - 'selection' => 'colour238', - 'comment' => 'colour244', - 'cyan' => 'colour117', - 'green' => 'colour114', - 'orange' => 'colour215', - 'pink' => 'colour212', - 'purple' => 'colour141', - 'red' => 'colour210', - 'yellow' => 'colour228', + // Modern color scheme (Catppuccin Mocha inspired) + 'base' => 'colour234', // Darkest background (crust) + 'background' => 'colour235', // Main background (base) + 'surface' => 'colour237', // Surface for elevated elements + 'foreground' => 'colour255', // Main text (text) + 'subtext' => 'colour250', // Dimmed text (subtext0) + 'overlay' => 'colour238', // Overlay elements + + // Accent colors (Catppuccin) + 'sapphire' => 'colour75', // Primary accent + 'teal' => 'colour116', // Secondary accent + 'green' => 'colour114', // Success + 'yellow' => 'colour221', // Warning + 'peach' => 'colour215', // Attention + 'red' => 'colour210', // Error/danger + 'pink' => 'colour218', // Special + 'mauve' => 'colour141', // Purple ], 'keys' => [