diff --git a/crates/fresh-editor/plugins/theme_editor.i18n.json b/crates/fresh-editor/plugins/theme_editor.i18n.json index 64ef81092..59111c1ff 100644 --- a/crates/fresh-editor/plugins/theme_editor.i18n.json +++ b/crates/fresh-editor/plugins/theme_editor.i18n.json @@ -718,6 +718,20 @@ "field.line_number_bg_desc": "Line number gutter background", "field.ruler_bg": "Ruler Background", "field.ruler_bg_desc": "Vertical ruler line color", + "field.bracket_match_fg": "Bracket Match Foreground", + "field.bracket_match_fg_desc": "Matching bracket highlight color", + "field.bracket_rainbow_1": "Bracket Rainbow 1", + "field.bracket_rainbow_1_desc": "Rainbow bracket color (nesting level 1)", + "field.bracket_rainbow_2": "Bracket Rainbow 2", + "field.bracket_rainbow_2_desc": "Rainbow bracket color (nesting level 2)", + "field.bracket_rainbow_3": "Bracket Rainbow 3", + "field.bracket_rainbow_3_desc": "Rainbow bracket color (nesting level 3)", + "field.bracket_rainbow_4": "Bracket Rainbow 4", + "field.bracket_rainbow_4_desc": "Rainbow bracket color (nesting level 4)", + "field.bracket_rainbow_5": "Bracket Rainbow 5", + "field.bracket_rainbow_5_desc": "Rainbow bracket color (nesting level 5)", + "field.bracket_rainbow_6": "Bracket Rainbow 6", + "field.bracket_rainbow_6_desc": "Rainbow bracket color (nesting level 6)", "field.diff_add_bg": "Diff Added Background", "field.diff_add_bg_desc": "Diff added line background", "field.diff_remove_bg": "Diff Removed Background", @@ -4143,4 +4157,4 @@ "field.popup_selection_fg": "Primo piano selezione popup", "field.popup_selection_fg_desc": "Colore del testo dell elemento selezionato nel popup" } -} \ No newline at end of file +} diff --git a/crates/fresh-editor/src/view/bracket_highlight_overlay.rs b/crates/fresh-editor/src/view/bracket_highlight_overlay.rs index 48ee88e6e..efe6d21af 100644 --- a/crates/fresh-editor/src/view/bracket_highlight_overlay.rs +++ b/crates/fresh-editor/src/view/bracket_highlight_overlay.rs @@ -7,6 +7,7 @@ use crate::model::buffer::Buffer; use crate::model::marker::MarkerList; use crate::view::overlay::{Overlay, OverlayFace, OverlayManager, OverlayNamespace}; +use crate::view::theme::Theme; use ratatui::style::Color; /// Default rainbow bracket colors (cycle through these based on nesting depth) @@ -24,21 +25,31 @@ pub fn bracket_highlight_namespace() -> OverlayNamespace { OverlayNamespace::from_string("bracket-highlight".to_string()) } +/// Namespace for rainbow bracket colorization overlays +pub fn bracket_colorization_namespace() -> OverlayNamespace { + OverlayNamespace::from_string("bracket-colorization".to_string()) +} + /// Bracket types we match const BRACKET_PAIRS: &[(char, char)] = &[('(', ')'), ('[', ']'), ('{', '}'), ('<', '>')]; /// Check if a character is an opening bracket -#[cfg(test)] fn is_opening_bracket(ch: char) -> bool { BRACKET_PAIRS.iter().any(|(open, _)| *open == ch) } /// Check if a character is a closing bracket -#[cfg(test)] fn is_closing_bracket(ch: char) -> bool { BRACKET_PAIRS.iter().any(|(_, close)| *close == ch) } +/// Get the opening bracket for a closing bracket +fn opening_for_closing(ch: char) -> Option { + BRACKET_PAIRS + .iter() + .find_map(|(open, close)| if *close == ch { Some(*open) } else { None }) +} + /// Get the matching bracket pair for a character fn get_bracket_pair(ch: char) -> Option<(char, char, bool)> { for &(open, close) in BRACKET_PAIRS { @@ -59,7 +70,7 @@ pub struct BracketHighlightOverlay { /// Whether to use rainbow colors based on nesting depth pub rainbow_enabled: bool, /// Colors to use for rainbow brackets (cycles through) - pub rainbow_colors: Vec, + pub rainbow_colors: [Color; 6], /// Default bracket match highlight color (when rainbow is disabled) pub match_color: Color, /// Last cursor position where we computed brackets @@ -72,7 +83,7 @@ impl BracketHighlightOverlay { Self { enabled: true, rainbow_enabled: true, - rainbow_colors: DEFAULT_BRACKET_COLORS.to_vec(), + rainbow_colors: DEFAULT_BRACKET_COLORS, match_color: Color::Rgb(255, 215, 0), // Gold last_cursor_pos: None, } @@ -86,17 +97,56 @@ impl BracketHighlightOverlay { buffer: &Buffer, overlays: &mut OverlayManager, marker_list: &mut MarkerList, + theme: &Theme, cursor_position: usize, + viewport_start: usize, + viewport_end: usize, ) -> bool { - if !self.enabled { + if !self.enabled && !self.rainbow_enabled { return false; } + let new_match_color = theme.bracket_match_fg; + let new_rainbow_colors = [ + theme.bracket_rainbow_1, + theme.bracket_rainbow_2, + theme.bracket_rainbow_3, + theme.bracket_rainbow_4, + theme.bracket_rainbow_5, + theme.bracket_rainbow_6, + ]; + let colors_changed = + self.match_color != new_match_color || self.rainbow_colors != new_rainbow_colors; + if colors_changed { + self.match_color = new_match_color; + self.rainbow_colors = new_rainbow_colors; + } + + let mut updated = false; + + // Update full rainbow bracket colorization + if self.rainbow_enabled { + updated |= self.update_colorization( + buffer, + overlays, + marker_list, + viewport_start, + viewport_end, + ); + } else { + updated |= self.clear_colorization(overlays, marker_list); + } + // Check if cursor position changed - if self.last_cursor_pos == Some(cursor_position) { - return false; + if !self.enabled { + return updated; + } + + if self.last_cursor_pos == Some(cursor_position) && !colors_changed { + return updated; } self.last_cursor_pos = Some(cursor_position); + updated = true; // Clear existing bracket overlays let ns = bracket_highlight_namespace(); @@ -123,7 +173,7 @@ impl BracketHighlightOverlay { // Calculate nesting depth at cursor position for rainbow colors let depth = if self.rainbow_enabled { - self.calculate_nesting_depth(buffer, cursor_position, opening, closing, forward) + self.calculate_nesting_depth(buffer, cursor_position, forward) } else { 0 }; @@ -133,7 +183,7 @@ impl BracketHighlightOverlay { self.find_matching_bracket(buffer, cursor_position, opening, closing, forward); // Determine color based on depth - let color = if self.rainbow_enabled && !self.rainbow_colors.is_empty() { + let color = if self.rainbow_enabled { self.rainbow_colors[depth % self.rainbow_colors.len()] } else { self.match_color @@ -163,41 +213,39 @@ impl BracketHighlightOverlay { overlays.add(match_overlay); } - true + updated } /// Calculate the nesting depth of a bracket at a position - fn calculate_nesting_depth( - &self, - buffer: &Buffer, - position: usize, - opening: char, - closing: char, - is_opening: bool, - ) -> usize { - // Count how many unclosed opening brackets of the same type come before this position - let mut depth: usize = 0; + fn calculate_nesting_depth(&self, buffer: &Buffer, position: usize, is_opening: bool) -> usize { + // Track nesting depth across all bracket types (not just the current pair) + // so rainbow colors follow overall nesting level. + let mut stack: Vec = Vec::new(); let mut pos = 0; while pos < position { let bytes = buffer.slice_bytes(pos..pos + 1); - if !bytes.is_empty() { - let c = bytes[0] as char; - if c == opening { - depth += 1; - } else if c == closing { - depth = depth.saturating_sub(1); + if let Some(&byte) = bytes.first() { + let c = byte as char; + if is_opening_bracket(c) { + stack.push(c); + } else if is_closing_bracket(c) { + if let Some(expected_open) = opening_for_closing(c) { + if stack.last() == Some(&expected_open) { + stack.pop(); + } + } } } pos += 1; } - // For closing brackets, the depth is the current count - // For opening brackets, the depth is the current count (depth before this bracket) + // For opening brackets, depth is the current stack size. + // For closing brackets, depth is the stack size minus one (matching opening). if is_opening { - depth + stack.len() } else { - depth.saturating_sub(1) + stack.len().saturating_sub(1) } } @@ -257,8 +305,10 @@ impl BracketHighlightOverlay { /// Force clear all highlights (e.g., when switching buffers) pub fn clear(&mut self, overlays: &mut OverlayManager, marker_list: &mut MarkerList) { - let ns = bracket_highlight_namespace(); - overlays.clear_namespace(&ns, marker_list); + let highlight_ns = bracket_highlight_namespace(); + overlays.clear_namespace(&highlight_ns, marker_list); + let color_ns = bracket_colorization_namespace(); + overlays.clear_namespace(&color_ns, marker_list); self.last_cursor_pos = None; } @@ -266,6 +316,84 @@ impl BracketHighlightOverlay { pub fn invalidate(&mut self) { self.last_cursor_pos = None; } + + fn clear_colorization( + &mut self, + overlays: &mut OverlayManager, + marker_list: &mut MarkerList, + ) -> bool { + let ns = bracket_colorization_namespace(); + overlays.clear_namespace(&ns, marker_list); + true + } + + fn update_colorization( + &mut self, + buffer: &Buffer, + overlays: &mut OverlayManager, + marker_list: &mut MarkerList, + viewport_start: usize, + viewport_end: usize, + ) -> bool { + if viewport_start >= viewport_end || buffer.len() == 0 { + return self.clear_colorization(overlays, marker_list); + } + + let viewport_size = viewport_end.saturating_sub(viewport_start); + let scan_start = viewport_start.saturating_sub(viewport_size); + let scan_end = viewport_end.min(buffer.len()); + if scan_start >= scan_end { + return self.clear_colorization(overlays, marker_list); + } + + let bytes = buffer.slice_bytes(scan_start..scan_end); + if bytes.is_empty() { + return self.clear_colorization(overlays, marker_list); + } + + let ns = bracket_colorization_namespace(); + let mut stack: Vec = Vec::new(); + let mut new_overlays = Vec::new(); + + for (idx, byte) in bytes.iter().enumerate() { + let pos = scan_start + idx; + let c = *byte as char; + + if is_opening_bracket(c) { + let depth = stack.len(); + stack.push(c); + if pos >= viewport_start { + let color = self.rainbow_colors[depth % self.rainbow_colors.len()]; + let face = OverlayFace::Foreground { color }; + let overlay = + Overlay::with_namespace(marker_list, pos..pos + 1, face, ns.clone()) + .with_priority_value(6); + new_overlays.push(overlay); + } + continue; + } + + if is_closing_bracket(c) { + let depth = stack.len().saturating_sub(1); + if let Some(expected_open) = opening_for_closing(c) { + if stack.last() == Some(&expected_open) { + stack.pop(); + } + } + if pos >= viewport_start { + let color = self.rainbow_colors[depth % self.rainbow_colors.len()]; + let face = OverlayFace::Foreground { color }; + let overlay = + Overlay::with_namespace(marker_list, pos..pos + 1, face, ns.clone()) + .with_priority_value(6); + new_overlays.push(overlay); + } + } + } + + overlays.replace_range_in_namespace(&ns, &(0..buffer.len()), new_overlays, marker_list); + true + } } impl Default for BracketHighlightOverlay { @@ -341,21 +469,25 @@ mod tests { let overlay = BracketHighlightOverlay::new(); // Outermost opening bracket: depth 0 - assert_eq!( - overlay.calculate_nesting_depth(&buffer, 0, '(', ')', true), - 0 - ); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 0, true), 0); // Second level opening bracket: depth 1 - assert_eq!( - overlay.calculate_nesting_depth(&buffer, 1, '(', ')', true), - 1 - ); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 1, true), 1); // Third level opening bracket: depth 2 - assert_eq!( - overlay.calculate_nesting_depth(&buffer, 2, '(', ')', true), - 2 - ); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 2, true), 2); + } + + #[test] + fn test_nesting_depth_mixed_types() { + let buffer = Buffer::from_str_test("({[]})"); + let overlay = BracketHighlightOverlay::new(); + + assert_eq!(overlay.calculate_nesting_depth(&buffer, 0, true), 0); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 1, true), 1); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 2, true), 2); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 3, false), 2); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 4, false), 1); + assert_eq!(overlay.calculate_nesting_depth(&buffer, 5, false), 0); } } diff --git a/crates/fresh-editor/src/view/theme/types.rs b/crates/fresh-editor/src/view/theme/types.rs index f63472e3f..fb19cba30 100644 --- a/crates/fresh-editor/src/view/theme/types.rs +++ b/crates/fresh-editor/src/view/theme/types.rs @@ -221,6 +221,27 @@ pub struct EditorColors { /// Vertical ruler background color #[serde(default = "default_ruler_bg")] pub ruler_bg: ColorDef, + /// Bracket match highlight color (used when rainbow is disabled) + #[serde(default = "default_bracket_match_fg")] + pub bracket_match_fg: ColorDef, + /// Rainbow bracket color (nesting level 1) + #[serde(default = "default_bracket_rainbow_1")] + pub bracket_rainbow_1: ColorDef, + /// Rainbow bracket color (nesting level 2) + #[serde(default = "default_bracket_rainbow_2")] + pub bracket_rainbow_2: ColorDef, + /// Rainbow bracket color (nesting level 3) + #[serde(default = "default_bracket_rainbow_3")] + pub bracket_rainbow_3: ColorDef, + /// Rainbow bracket color (nesting level 4) + #[serde(default = "default_bracket_rainbow_4")] + pub bracket_rainbow_4: ColorDef, + /// Rainbow bracket color (nesting level 5) + #[serde(default = "default_bracket_rainbow_5")] + pub bracket_rainbow_5: ColorDef, + /// Rainbow bracket color (nesting level 6) + #[serde(default = "default_bracket_rainbow_6")] + pub bracket_rainbow_6: ColorDef, } // Default editor colors (for minimal themes) @@ -260,6 +281,27 @@ fn default_diff_modify_bg() -> ColorDef { fn default_ruler_bg() -> ColorDef { ColorDef::Rgb(50, 50, 50) // Subtle dark gray, slightly lighter than default editor bg } +fn default_bracket_match_fg() -> ColorDef { + ColorDef::Rgb(255, 215, 0) // Gold +} +fn default_bracket_rainbow_1() -> ColorDef { + ColorDef::Rgb(255, 215, 0) // Gold +} +fn default_bracket_rainbow_2() -> ColorDef { + ColorDef::Rgb(218, 112, 214) // Orchid +} +fn default_bracket_rainbow_3() -> ColorDef { + ColorDef::Rgb(50, 205, 50) // Lime Green +} +fn default_bracket_rainbow_4() -> ColorDef { + ColorDef::Rgb(30, 144, 255) // Dodger Blue +} +fn default_bracket_rainbow_5() -> ColorDef { + ColorDef::Rgb(255, 127, 80) // Coral +} +fn default_bracket_rainbow_6() -> ColorDef { + ColorDef::Rgb(147, 112, 219) // Medium Purple +} /// UI element colors (tabs, menus, status bar, etc.) #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] @@ -809,6 +851,15 @@ pub struct Theme { // Vertical ruler color pub ruler_bg: Color, + // Bracket matching colors + pub bracket_match_fg: Color, + pub bracket_rainbow_1: Color, + pub bracket_rainbow_2: Color, + pub bracket_rainbow_3: Color, + pub bracket_rainbow_4: Color, + pub bracket_rainbow_5: Color, + pub bracket_rainbow_6: Color, + // Diff highlighting colors pub diff_add_bg: Color, pub diff_remove_bg: Color, @@ -945,6 +996,13 @@ impl From for Theme { line_number_fg: file.editor.line_number_fg.into(), line_number_bg: file.editor.line_number_bg.into(), ruler_bg: file.editor.ruler_bg.into(), + bracket_match_fg: file.editor.bracket_match_fg.into(), + bracket_rainbow_1: file.editor.bracket_rainbow_1.into(), + bracket_rainbow_2: file.editor.bracket_rainbow_2.into(), + bracket_rainbow_3: file.editor.bracket_rainbow_3.into(), + bracket_rainbow_4: file.editor.bracket_rainbow_4.into(), + bracket_rainbow_5: file.editor.bracket_rainbow_5.into(), + bracket_rainbow_6: file.editor.bracket_rainbow_6.into(), diff_add_bg: file.editor.diff_add_bg.clone().into(), diff_remove_bg: file.editor.diff_remove_bg.clone().into(), diff_modify_bg: file.editor.diff_modify_bg.into(), @@ -1053,6 +1111,13 @@ impl From for ThemeFile { diff_remove_bg: theme.diff_remove_bg.into(), diff_modify_bg: theme.diff_modify_bg.into(), ruler_bg: theme.ruler_bg.into(), + bracket_match_fg: theme.bracket_match_fg.into(), + bracket_rainbow_1: theme.bracket_rainbow_1.into(), + bracket_rainbow_2: theme.bracket_rainbow_2.into(), + bracket_rainbow_3: theme.bracket_rainbow_3.into(), + bracket_rainbow_4: theme.bracket_rainbow_4.into(), + bracket_rainbow_5: theme.bracket_rainbow_5.into(), + bracket_rainbow_6: theme.bracket_rainbow_6.into(), }, ui: UiColors { tab_active_fg: theme.tab_active_fg.into(), @@ -1197,6 +1262,13 @@ impl Theme { "diff_remove_bg" => Some(self.diff_remove_bg), "diff_modify_bg" => Some(self.diff_modify_bg), "ruler_bg" => Some(self.ruler_bg), + "bracket_match_fg" => Some(self.bracket_match_fg), + "bracket_rainbow_1" => Some(self.bracket_rainbow_1), + "bracket_rainbow_2" => Some(self.bracket_rainbow_2), + "bracket_rainbow_3" => Some(self.bracket_rainbow_3), + "bracket_rainbow_4" => Some(self.bracket_rainbow_4), + "bracket_rainbow_5" => Some(self.bracket_rainbow_5), + "bracket_rainbow_6" => Some(self.bracket_rainbow_6), _ => None, }, "ui" => match field { diff --git a/crates/fresh-editor/src/view/ui/split_rendering.rs b/crates/fresh-editor/src/view/ui/split_rendering.rs index d40633e16..6515b7fed 100644 --- a/crates/fresh-editor/src/view/ui/split_rendering.rs +++ b/crates/fresh-editor/src/view/ui/split_rendering.rs @@ -3860,7 +3860,10 @@ impl SplitRenderer { &state.buffer, &mut state.overlays, &mut state.marker_list, + theme, primary_cursor_position, + viewport_start, + viewport_end, ); // Semantic tokens are stored as overlays so their ranges track edits. diff --git a/crates/fresh-editor/tests/e2e/theme.rs b/crates/fresh-editor/tests/e2e/theme.rs index aa2b43d8d..44ff79ab4 100644 --- a/crates/fresh-editor/tests/e2e/theme.rs +++ b/crates/fresh-editor/tests/e2e/theme.rs @@ -203,6 +203,79 @@ fn test_theme_syntax_highlighting_colors() { assert_eq!(theme.syntax_variable, Color::Rgb(156, 220, 254)); } +#[test] +fn test_bracket_highlight_uses_theme_colors() { + let config = Config { + theme: "dark".into(), + ..Default::default() + }; + + let mut harness = EditorTestHarness::with_config(80, 24, config).unwrap(); + + // Insert a simple bracket pair and place cursor on the closing bracket + harness.type_text("()").unwrap(); + harness.send_key(KeyCode::Left, KeyModifiers::NONE).unwrap(); + + let theme = harness.editor().theme(); + let buffer = &harness.editor().active_state().buffer; + let gutter_width = harness.editor().active_viewport().gutter_width(buffer) as u16; + let (content_first_row, _) = harness.content_area_rows(); + + // Verify we are looking at the opening bracket cell + assert_eq!( + harness.get_cell(gutter_width, content_first_row as u16), + Some("(".to_string()) + ); + + let open_bracket_style = harness + .get_cell_style(gutter_width, content_first_row as u16) + .expect("Expected style for opening bracket cell"); + + assert_eq!( + open_bracket_style.fg, + Some(theme.bracket_rainbow_1), + "Opening bracket should use theme rainbow color when matching is active" + ); +} + +#[test] +fn test_rainbow_bracket_colorization() { + let config = Config { + theme: "dark".into(), + ..Default::default() + }; + + let mut harness = EditorTestHarness::with_config(80, 24, config).unwrap(); + harness.type_text("({[]})").unwrap(); + harness.render().unwrap(); + + let theme = harness.editor().theme(); + let buffer = &harness.editor().active_state().buffer; + let gutter_width = harness.editor().active_viewport().gutter_width(buffer) as u16; + let (content_first_row, _) = harness.content_area_rows(); + + let expected_colors = [ + theme.bracket_rainbow_1, + theme.bracket_rainbow_2, + theme.bracket_rainbow_3, + theme.bracket_rainbow_3, + theme.bracket_rainbow_2, + theme.bracket_rainbow_1, + ]; + + for (col_offset, expected) in expected_colors.into_iter().enumerate() { + let x = gutter_width + col_offset as u16; + let style = harness + .get_cell_style(x, content_first_row as u16) + .expect("Expected style for bracket cell"); + assert_eq!( + style.fg, + Some(expected), + "Bracket at col {col_offset} should use rainbow color" + ); + } +} + #[test] fn test_all_available_themes_can_be_loaded() { let themes = vec!["dark", "light", "high-contrast"]; diff --git a/crates/fresh-editor/themes/dark.json b/crates/fresh-editor/themes/dark.json index 1621531c6..238eb2899 100644 --- a/crates/fresh-editor/themes/dark.json +++ b/crates/fresh-editor/themes/dark.json @@ -11,7 +11,14 @@ "line_number_bg": [30, 30, 30], "diff_add_bg": [35, 60, 35], "diff_remove_bg": [70, 35, 35], - "diff_modify_bg": [40, 38, 30] + "diff_modify_bg": [40, 38, 30], + "bracket_match_fg": [212, 212, 212], + "bracket_rainbow_1": [86, 156, 214], + "bracket_rainbow_2": [206, 145, 120], + "bracket_rainbow_3": [220, 220, 170], + "bracket_rainbow_4": [78, 201, 176], + "bracket_rainbow_5": [156, 220, 254], + "bracket_rainbow_6": [79, 193, 255] }, "ui": { "tab_active_fg": "Yellow", diff --git a/crates/fresh-editor/themes/dracula.json b/crates/fresh-editor/themes/dracula.json index fa95cf776..3ed6fde41 100644 --- a/crates/fresh-editor/themes/dracula.json +++ b/crates/fresh-editor/themes/dracula.json @@ -7,7 +7,14 @@ "selection_bg": [68, 71, 90], "current_line_bg": [50, 52, 66], "line_number_fg": [98, 114, 164], - "line_number_bg": [40, 42, 54] + "line_number_bg": [40, 42, 54], + "bracket_match_fg": [255, 121, 198], + "bracket_rainbow_1": [255, 121, 198], + "bracket_rainbow_2": [241, 250, 140], + "bracket_rainbow_3": [80, 250, 123], + "bracket_rainbow_4": [139, 233, 253], + "bracket_rainbow_5": [248, 248, 242], + "bracket_rainbow_6": [189, 147, 249] }, "ui": { "tab_active_fg": [248, 248, 242], diff --git a/crates/fresh-editor/themes/high-contrast.json b/crates/fresh-editor/themes/high-contrast.json index 1c5700148..45e9ab9c2 100644 --- a/crates/fresh-editor/themes/high-contrast.json +++ b/crates/fresh-editor/themes/high-contrast.json @@ -11,7 +11,14 @@ "line_number_bg": "Black", "diff_add_bg": [0, 80, 0], "diff_remove_bg": [100, 0, 0], - "diff_modify_bg": [25, 22, 0] + "diff_modify_bg": [25, 22, 0], + "bracket_match_fg": "White", + "bracket_rainbow_1": "Cyan", + "bracket_rainbow_2": "Green", + "bracket_rainbow_3": "Yellow", + "bracket_rainbow_4": "Magenta", + "bracket_rainbow_5": "White", + "bracket_rainbow_6": "LightBlue" }, "ui": { "tab_active_fg": "Black", diff --git a/crates/fresh-editor/themes/light.json b/crates/fresh-editor/themes/light.json index 7eb4c8424..01b0a43fe 100644 --- a/crates/fresh-editor/themes/light.json +++ b/crates/fresh-editor/themes/light.json @@ -11,7 +11,14 @@ "line_number_bg": [255, 255, 255], "diff_add_bg": [200, 255, 200], "diff_remove_bg": [255, 200, 200], - "diff_modify_bg": [255, 252, 240] + "diff_modify_bg": [255, 252, 240], + "bracket_match_fg": [0, 0, 0], + "bracket_rainbow_1": [175, 0, 219], + "bracket_rainbow_2": [163, 21, 21], + "bracket_rainbow_3": [121, 94, 38], + "bracket_rainbow_4": [0, 128, 128], + "bracket_rainbow_5": [0, 16, 128], + "bracket_rainbow_6": [0, 112, 193] }, "ui": { "tab_active_fg": [40, 40, 40], diff --git a/crates/fresh-editor/themes/nord.json b/crates/fresh-editor/themes/nord.json index 35606b9a1..af1aa5b46 100644 --- a/crates/fresh-editor/themes/nord.json +++ b/crates/fresh-editor/themes/nord.json @@ -7,7 +7,14 @@ "selection_bg": [67, 76, 94], "current_line_bg": [59, 66, 82], "line_number_fg": [76, 86, 106], - "line_number_bg": [46, 52, 64] + "line_number_bg": [46, 52, 64], + "bracket_match_fg": [129, 161, 193], + "bracket_rainbow_1": [129, 161, 193], + "bracket_rainbow_2": [163, 190, 140], + "bracket_rainbow_3": [136, 192, 208], + "bracket_rainbow_4": [143, 188, 187], + "bracket_rainbow_5": [216, 222, 233], + "bracket_rainbow_6": [180, 142, 173] }, "ui": { "tab_active_fg": [236, 239, 244], diff --git a/crates/fresh-editor/themes/nostalgia.json b/crates/fresh-editor/themes/nostalgia.json index 372dbc8f4..04a8886fd 100644 --- a/crates/fresh-editor/themes/nostalgia.json +++ b/crates/fresh-editor/themes/nostalgia.json @@ -11,7 +11,14 @@ "line_number_bg": [0, 0, 170], "diff_add_bg": [0, 100, 0], "diff_remove_bg": [170, 0, 0], - "diff_modify_bg": [20, 20, 140] + "diff_modify_bg": [20, 20, 140], + "bracket_match_fg": [170, 170, 170], + "bracket_rainbow_1": [255, 255, 255], + "bracket_rainbow_2": [0, 255, 255], + "bracket_rainbow_3": [255, 255, 0], + "bracket_rainbow_4": [0, 255, 0], + "bracket_rainbow_5": [255, 255, 85], + "bracket_rainbow_6": [255, 0, 255] }, "ui": { "tab_active_fg": [0, 0, 0], diff --git a/crates/fresh-editor/themes/solarized-dark.json b/crates/fresh-editor/themes/solarized-dark.json index 0b3775048..9fe0756be 100644 --- a/crates/fresh-editor/themes/solarized-dark.json +++ b/crates/fresh-editor/themes/solarized-dark.json @@ -7,7 +7,14 @@ "selection_bg": [7, 54, 66], "current_line_bg": [7, 54, 66], "line_number_fg": [88, 110, 117], - "line_number_bg": [0, 43, 54] + "line_number_bg": [0, 43, 54], + "bracket_match_fg": [131, 148, 150], + "bracket_rainbow_1": [133, 153, 0], + "bracket_rainbow_2": [42, 161, 152], + "bracket_rainbow_3": [38, 139, 210], + "bracket_rainbow_4": [181, 137, 0], + "bracket_rainbow_5": [131, 148, 150], + "bracket_rainbow_6": [203, 75, 22] }, "ui": { "tab_active_fg": [253, 246, 227],