Start on laying out and painting `editor2` (#3250)

Antonio Scandurra created

![CleanShot 2023-11-07 at 13 16
28@2x](https://github.com/zed-industries/zed/assets/482957/a136a3d9-b518-4591-8307-e63cfe0e4310)


Release Notes:

- N/A

Change summary

Cargo.lock                                  |    2 
crates/editor2/Cargo.toml                   |    2 
crates/editor2/src/display_map.rs           |  120 +-
crates/editor2/src/editor.rs                |  173 +-
crates/editor2/src/element.rs               | 1158 +++++++++++-----------
crates/editor2/src/items.rs                 |   16 
crates/editor2/src/link_go_to_definition.rs |    2 
crates/gpui2/src/app.rs                     |    8 
crates/gpui2/src/color.rs                   |    9 
crates/gpui2/src/elements/text.rs           |    2 
crates/gpui2/src/geometry.rs                |   10 
crates/gpui2/src/style.rs                   |    8 
crates/gpui2/src/styled.rs                  |   22 
crates/gpui2/src/text_system/line.rs        |    4 
crates/gpui2/src/text_system/line_layout.rs |   12 
crates/theme2/src/colors.rs                 |   28 
crates/theme2/src/default_colors.rs         |   46 
crates/theme2/src/registry.rs               |    8 
crates/theme2/src/theme2.rs                 |   12 
crates/theme2/src/themes/andromeda.rs       |   80 
crates/theme2/src/themes/ayu.rs             |  119 +
crates/theme2/src/themes/dracula.rs         |   41 
crates/theme2/src/themes/gruvbox.rs         |  236 ++-
crates/theme2/src/themes/night_owl.rs       |   80 
crates/theme2/src/themes/nord.rs            |   41 
crates/theme2/src/themes/notctis.rs         |  431 +++++---
crates/theme2/src/themes/palenight.rs       |  119 +
crates/theme2/src/themes/rose_pine.rs       |  119 +
crates/theme2/src/themes/solarized.rs       |   80 
crates/theme2/src/themes/synthwave_84.rs    |   41 
crates/theme_importer/src/theme_printer.rs  |   36 
crates/ui2/src/to_extract/buffer.rs         |    2 
crates/zed2/src/main.rs                     |    3 
33 files changed, 1,755 insertions(+), 1,315 deletions(-)

Detailed changes

Cargo.lock πŸ”—

@@ -2677,7 +2677,7 @@ dependencies = [
  "env_logger 0.9.3",
  "futures 0.3.28",
  "fuzzy2",
- "git",
+ "git3",
  "gpui2",
  "indoc",
  "itertools 0.10.5",

crates/editor2/Cargo.toml πŸ”—

@@ -31,7 +31,7 @@ drag_and_drop = { path = "../drag_and_drop" }
 collections = { path = "../collections" }
 # context_menu = { path = "../context_menu" }
 fuzzy = { package = "fuzzy2", path = "../fuzzy2" }
-git = { path = "../git" }
+git = { package = "git3", path = "../git3" }
 gpui = { package = "gpui2", path = "../gpui2" }
 language = { package = "language2", path = "../language2" }
 lsp = { package = "lsp2", path = "../lsp2" }

crates/editor2/src/display_map.rs πŸ”—

@@ -4,6 +4,7 @@ mod inlay_map;
 mod tab_map;
 mod wrap_map;
 
+use crate::EditorStyle;
 use crate::{
     link_go_to_definition::InlayHighlight, movement::TextLayoutDetails, Anchor, AnchorRangeExt,
     InlayId, MultiBuffer, MultiBufferSnapshot, ToOffset, ToPoint,
@@ -11,14 +12,16 @@ use crate::{
 pub use block_map::{BlockMap, BlockPoint};
 use collections::{BTreeMap, HashMap, HashSet};
 use fold_map::FoldMap;
-use gpui::{Font, FontId, HighlightStyle, Hsla, Line, Model, ModelContext, Pixels};
+use gpui::{Font, FontId, HighlightStyle, Hsla, Line, Model, ModelContext, Pixels, UnderlineStyle};
 use inlay_map::InlayMap;
 use language::{
     language_settings::language_settings, OffsetUtf16, Point, Subscription as BufferSubscription,
 };
+use lsp::DiagnosticSeverity;
 use std::{any::TypeId, borrow::Cow, fmt::Debug, num::NonZeroU32, ops::Range, sync::Arc};
 use sum_tree::{Bias, TreeMap};
 use tab_map::TabMap;
+use theme::ThemeVariant;
 use wrap_map::WrapMap;
 
 pub use block_map::{
@@ -35,6 +38,8 @@ pub enum FoldStatus {
     Foldable,
 }
 
+const UNNECESSARY_CODE_FADE: f32 = 0.3;
+
 pub trait ToDisplayPoint {
     fn to_display_point(&self, map: &DisplaySnapshot) -> DisplayPoint;
 }
@@ -496,63 +501,62 @@ impl DisplaySnapshot {
         )
     }
 
-    // pub fn highlighted_chunks<'a>(
-    //     &'a self,
-    //     display_rows: Range<u32>,
-    //     language_aware: bool,
-    //     style: &'a EditorStyle,
-    // ) -> impl Iterator<Item = HighlightedChunk<'a>> {
-    //     self.chunks(
-    //         display_rows,
-    //         language_aware,
-    //         Some(style.theme.hint),
-    //         Some(style.theme.suggestion),
-    //     )
-    //     .map(|chunk| {
-    //         let mut highlight_style = chunk
-    //             .syntax_highlight_id
-    //             .and_then(|id| id.style(&style.syntax));
-
-    //         if let Some(chunk_highlight) = chunk.highlight_style {
-    //             if let Some(highlight_style) = highlight_style.as_mut() {
-    //                 highlight_style.highlight(chunk_highlight);
-    //             } else {
-    //                 highlight_style = Some(chunk_highlight);
-    //             }
-    //         }
-
-    //         let mut diagnostic_highlight = HighlightStyle::default();
-
-    //         if chunk.is_unnecessary {
-    //             diagnostic_highlight.fade_out = Some(style.unnecessary_code_fade);
-    //         }
-
-    //         if let Some(severity) = chunk.diagnostic_severity {
-    //             // Omit underlines for HINT/INFO diagnostics on 'unnecessary' code.
-    //             if severity <= DiagnosticSeverity::WARNING || !chunk.is_unnecessary {
-    //                 todo!()
-    //                 // let diagnostic_style = super::diagnostic_style(severity, true, style);
-    //                 // diagnostic_highlight.underline = Some(UnderlineStyle {
-    //                 //     color: Some(diagnostic_style.message.text.color),
-    //                 //     thickness: 1.0.into(),
-    //                 //     wavy: true,
-    //                 // });
-    //             }
-    //         }
-
-    //         if let Some(highlight_style) = highlight_style.as_mut() {
-    //             highlight_style.highlight(diagnostic_highlight);
-    //         } else {
-    //             highlight_style = Some(diagnostic_highlight);
-    //         }
-
-    //         HighlightedChunk {
-    //             chunk: chunk.text,
-    //             style: highlight_style,
-    //             is_tab: chunk.is_tab,
-    //         }
-    //     })
-    // }
+    pub fn highlighted_chunks<'a>(
+        &'a self,
+        display_rows: Range<u32>,
+        language_aware: bool,
+        theme: &'a ThemeVariant,
+    ) -> impl Iterator<Item = HighlightedChunk<'a>> {
+        self.chunks(
+            display_rows,
+            language_aware,
+            None, // todo!("add inlay highlight style")
+            None, // todo!("add suggestion highlight style")
+        )
+        .map(|chunk| {
+            let mut highlight_style = chunk
+                .syntax_highlight_id
+                .and_then(|id| id.style(&theme.styles.syntax));
+
+            if let Some(chunk_highlight) = chunk.highlight_style {
+                if let Some(highlight_style) = highlight_style.as_mut() {
+                    highlight_style.highlight(chunk_highlight);
+                } else {
+                    highlight_style = Some(chunk_highlight);
+                }
+            }
+
+            let mut diagnostic_highlight = HighlightStyle::default();
+
+            if chunk.is_unnecessary {
+                diagnostic_highlight.fade_out = Some(UNNECESSARY_CODE_FADE);
+            }
+
+            if let Some(severity) = chunk.diagnostic_severity {
+                // Omit underlines for HINT/INFO diagnostics on 'unnecessary' code.
+                if severity <= DiagnosticSeverity::WARNING || !chunk.is_unnecessary {
+                    let diagnostic_color = super::diagnostic_style(severity, true, theme);
+                    diagnostic_highlight.underline = Some(UnderlineStyle {
+                        color: Some(diagnostic_color),
+                        thickness: 1.0.into(),
+                        wavy: true,
+                    });
+                }
+            }
+
+            if let Some(highlight_style) = highlight_style.as_mut() {
+                highlight_style.highlight(diagnostic_highlight);
+            } else {
+                highlight_style = Some(diagnostic_highlight);
+            }
+
+            HighlightedChunk {
+                chunk: chunk.text,
+                style: highlight_style,
+                is_tab: chunk.is_tab,
+            }
+        })
+    }
 
     pub fn lay_out_line_for_row(
         &self,

crates/editor2/src/editor.rs πŸ”—

@@ -36,9 +36,9 @@ pub use element::{
 use futures::FutureExt;
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
-    div, AnyElement, AppContext, BackgroundExecutor, Context, Div, Element, EventEmitter,
-    FocusHandle, Hsla, Model, Pixels, Render, Styled, Subscription, Task, TextStyle, View,
-    ViewContext, VisualContext, WeakView, WindowContext,
+    div, px, AnyElement, AppContext, BackgroundExecutor, Context, Div, Element, EventEmitter,
+    FocusHandle, FontStyle, FontWeight, Hsla, Model, Pixels, Render, Styled, Subscription, Task,
+    TextStyle, View, ViewContext, VisualContext, WeakView, WindowContext,
 };
 use highlight_matching_bracket::refresh_matching_bracket_highlights;
 use hover_popover::{hide_hover, HoverState};
@@ -53,7 +53,7 @@ use language::{
     SelectionGoal, TransactionId,
 };
 use link_go_to_definition::{GoToDefinitionLink, InlayHighlight, LinkGoToDefinitionState};
-use lsp::{Documentation, LanguageServerId};
+use lsp::{DiagnosticSeverity, Documentation, LanguageServerId};
 pub use multi_buffer::{
     Anchor, AnchorRangeExt, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, ToOffset,
     ToPoint,
@@ -72,7 +72,7 @@ use smallvec::SmallVec;
 use std::{
     any::TypeId,
     borrow::Cow,
-    cmp::{self, Reverse},
+    cmp::{self, Ordering, Reverse},
     ops::{ControlFlow, Deref, DerefMut, Range},
     path::Path,
     sync::Arc,
@@ -81,7 +81,7 @@ use std::{
 pub use sum_tree::Bias;
 use sum_tree::TreeMap;
 use text::Rope;
-use theme::ThemeColors;
+use theme::{ActiveTheme, PlayerColor, ThemeColors, ThemeSettings, ThemeVariant};
 use util::{post_inc, RangeExt, ResultExt, TryFutureExt};
 use workspace::{ItemNavHistory, SplitDirection, ViewId, Workspace};
 
@@ -597,11 +597,11 @@ pub enum SoftWrap {
 
 #[derive(Clone)]
 pub struct EditorStyle {
+    pub background: Hsla,
+    pub local_player: PlayerColor,
     pub text: TextStyle,
     pub line_height_scalar: f32,
-    // pub placeholder_text: Option<TextStyle>,
-    //  pub theme: theme::Editor,
-    pub theme_id: usize,
+    pub scrollbar_width: Pixels,
 }
 
 type CompletionId = usize;
@@ -634,7 +634,6 @@ pub struct Editor {
     // override_text_style: Option<Box<OverrideTextStyle>>,
     project: Option<Model<Project>>,
     collaboration_hub: Option<Box<dyn CollaborationHub>>,
-    focused: bool,
     blink_manager: Model<BlinkManager>,
     pub show_local_selections: bool,
     mode: EditorMode,
@@ -1882,7 +1881,7 @@ impl Editor {
     ) -> Self {
         // let editor_view_id = cx.view_id();
         let style = cx.text_style();
-        let font_size = style.font_size * cx.rem_size();
+        let font_size = style.font_size.to_pixels(cx.rem_size());
         let display_map = cx.build_model(|cx| {
             // todo!()
             // let settings = settings::get::<ThemeSettings>(cx);
@@ -1940,7 +1939,6 @@ impl Editor {
             // get_field_editor_theme,
             collaboration_hub: project.clone().map(|project| Box::new(project) as _),
             project,
-            focused: false,
             blink_manager: blink_manager.clone(),
             show_local_selections: true,
             mode,
@@ -2211,7 +2209,7 @@ impl Editor {
         old_cursor_position: &Anchor,
         cx: &mut ViewContext<Self>,
     ) {
-        if self.focused && self.leader_peer_id.is_none() {
+        if self.focus_handle.is_focused(cx) && self.leader_peer_id.is_none() {
             self.buffer.update(cx, |buffer, cx| {
                 buffer.set_active_selections(
                     &self.selections.disjoint_anchors(),
@@ -2458,7 +2456,7 @@ impl Editor {
         click_count: usize,
         cx: &mut ViewContext<Self>,
     ) {
-        if !self.focused {
+        if !self.focus_handle.is_focused(cx) {
             cx.focus(&self.focus_handle);
         }
 
@@ -2524,7 +2522,7 @@ impl Editor {
         goal_column: u32,
         cx: &mut ViewContext<Self>,
     ) {
-        if !self.focused {
+        if !self.focus_handle.is_focused(cx) {
             cx.focus(&self.focus_handle);
         }
 
@@ -3631,7 +3629,7 @@ impl Editor {
                         _ => return,
                     }
 
-                    if this.focused && menu.is_some() {
+                    if this.focus_handle.is_focused(cx) && menu.is_some() {
                         let menu = menu.unwrap();
                         *context_menu = Some(ContextMenu::Completions(menu));
                         drop(context_menu);
@@ -4059,12 +4057,12 @@ impl Editor {
 
                     this.highlight_background::<DocumentHighlightRead>(
                         read_ranges,
-                        |theme| todo!("theme.editor.document_highlight_read_background"),
+                        |theme| theme.editor_document_highlight_read_background,
                         cx,
                     );
                     this.highlight_background::<DocumentHighlightWrite>(
                         write_ranges,
-                        |theme| todo!("theme.editor.document_highlight_write_background"),
+                        |theme| theme.editor_document_highlight_write_background,
                         cx,
                     );
                     cx.notify();
@@ -8445,13 +8443,13 @@ impl Editor {
     //         }
     //     }
 
-    //     pub fn highlight_rows(&mut self, rows: Option<Range<u32>>) {
-    //         self.highlighted_rows = rows;
-    //     }
+    pub fn highlight_rows(&mut self, rows: Option<Range<u32>>) {
+        self.highlighted_rows = rows;
+    }
 
-    //     pub fn highlighted_rows(&self) -> Option<Range<u32>> {
-    //         self.highlighted_rows.clone()
-    //     }
+    pub fn highlighted_rows(&self) -> Option<Range<u32>> {
+        self.highlighted_rows.clone()
+    }
 
     pub fn highlight_background<T: 'static>(
         &mut self,
@@ -8540,43 +8538,43 @@ impl Editor {
     //             })
     //     }
 
-    //     pub fn background_highlights_in_range(
-    //         &self,
-    //         search_range: Range<Anchor>,
-    //         display_snapshot: &DisplaySnapshot,
-    //         theme: &Theme,
-    //     ) -> Vec<(Range<DisplayPoint>, Color)> {
-    //         let mut results = Vec::new();
-    //         for (color_fetcher, ranges) in self.background_highlights.values() {
-    //             let color = color_fetcher(theme);
-    //             let start_ix = match ranges.binary_search_by(|probe| {
-    //                 let cmp = probe
-    //                     .end
-    //                     .cmp(&search_range.start, &display_snapshot.buffer_snapshot);
-    //                 if cmp.is_gt() {
-    //                     Ordering::Greater
-    //                 } else {
-    //                     Ordering::Less
-    //                 }
-    //             }) {
-    //                 Ok(i) | Err(i) => i,
-    //             };
-    //             for range in &ranges[start_ix..] {
-    //                 if range
-    //                     .start
-    //                     .cmp(&search_range.end, &display_snapshot.buffer_snapshot)
-    //                     .is_ge()
-    //                 {
-    //                     break;
-    //                 }
+    pub fn background_highlights_in_range(
+        &self,
+        search_range: Range<Anchor>,
+        display_snapshot: &DisplaySnapshot,
+        theme: &ThemeColors,
+    ) -> Vec<(Range<DisplayPoint>, Hsla)> {
+        let mut results = Vec::new();
+        for (color_fetcher, ranges) in self.background_highlights.values() {
+            let color = color_fetcher(theme);
+            let start_ix = match ranges.binary_search_by(|probe| {
+                let cmp = probe
+                    .end
+                    .cmp(&search_range.start, &display_snapshot.buffer_snapshot);
+                if cmp.is_gt() {
+                    Ordering::Greater
+                } else {
+                    Ordering::Less
+                }
+            }) {
+                Ok(i) | Err(i) => i,
+            };
+            for range in &ranges[start_ix..] {
+                if range
+                    .start
+                    .cmp(&search_range.end, &display_snapshot.buffer_snapshot)
+                    .is_ge()
+                {
+                    break;
+                }
 
-    //                 let start = range.start.to_display_point(&display_snapshot);
-    //                 let end = range.end.to_display_point(&display_snapshot);
-    //                 results.push((start..end, color))
-    //             }
-    //         }
-    //         results
-    //     }
+                let start = range.start.to_display_point(&display_snapshot);
+                let end = range.end.to_display_point(&display_snapshot);
+                results.push((start..end, color))
+            }
+        }
+        results
+    }
 
     //     pub fn background_highlight_row_ranges<T: 'static>(
     //         &self,
@@ -8693,9 +8691,9 @@ impl Editor {
         }
     }
 
-    //     pub fn show_local_cursors(&self, cx: &AppContext) -> bool {
-    //         self.blink_manager.read(cx).visible() && self.focused
-    //     }
+    pub fn show_local_cursors(&self, cx: &WindowContext) -> bool {
+        self.blink_manager.read(cx).visible() && self.focus_handle.is_focused(cx)
+    }
 
     fn on_buffer_changed(&mut self, _: Model<MultiBuffer>, cx: &mut ViewContext<Self>) {
         cx.notify();
@@ -9325,10 +9323,23 @@ impl Render for Editor {
     type Element = EditorElement;
 
     fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
+        let settings = ThemeSettings::get_global(cx);
+        let text_style = TextStyle {
+            color: cx.theme().colors().text,
+            font_family: settings.buffer_font.family.clone(),
+            font_features: settings.buffer_font.features,
+            font_size: settings.buffer_font_size.into(),
+            font_weight: FontWeight::NORMAL,
+            font_style: FontStyle::Normal,
+            line_height: Default::default(),
+            underline: None,
+        };
         EditorElement::new(EditorStyle {
-            text: cx.text_style(),
-            line_height_scalar: 1.,
-            theme_id: 0,
+            background: cx.theme().colors().editor_background,
+            local_player: cx.theme().players().local(),
+            text: text_style,
+            line_height_scalar: settings.buffer_line_height.value(),
+            scrollbar_width: px(12.),
         })
     }
 }
@@ -9951,23 +9962,19 @@ pub fn highlight_diagnostic_message(
     (message_without_backticks, highlights)
 }
 
-// pub fn diagnostic_style(
-//     severity: DiagnosticSeverity,
-//     valid: bool,
-//     theme: &theme::Editor,
-// ) -> DiagnosticStyle {
-//     match (severity, valid) {
-//         (DiagnosticSeverity::ERROR, true) => theme.error_diagnostic.clone(),
-//         (DiagnosticSeverity::ERROR, false) => theme.invalid_error_diagnostic.clone(),
-//         (DiagnosticSeverity::WARNING, true) => theme.warning_diagnostic.clone(),
-//         (DiagnosticSeverity::WARNING, false) => theme.invalid_warning_diagnostic.clone(),
-//         (DiagnosticSeverity::INFORMATION, true) => theme.information_diagnostic.clone(),
-//         (DiagnosticSeverity::INFORMATION, false) => theme.invalid_information_diagnostic.clone(),
-//         (DiagnosticSeverity::HINT, true) => theme.hint_diagnostic.clone(),
-//         (DiagnosticSeverity::HINT, false) => theme.invalid_hint_diagnostic.clone(),
-//         _ => theme.invalid_hint_diagnostic.clone(),
-//     }
-// }
+pub fn diagnostic_style(severity: DiagnosticSeverity, valid: bool, theme: &ThemeVariant) -> Hsla {
+    match (severity, valid) {
+        (DiagnosticSeverity::ERROR, true) => theme.status().error,
+        (DiagnosticSeverity::ERROR, false) => theme.status().error,
+        (DiagnosticSeverity::WARNING, true) => theme.status().warning,
+        (DiagnosticSeverity::WARNING, false) => theme.status().warning,
+        (DiagnosticSeverity::INFORMATION, true) => theme.status().info,
+        (DiagnosticSeverity::INFORMATION, false) => theme.status().info,
+        (DiagnosticSeverity::HINT, true) => theme.status().info,
+        (DiagnosticSeverity::HINT, false) => theme.status().info,
+        _ => theme.status().ignored,
+    }
+}
 
 // pub fn combine_syntax_and_fuzzy_match_highlights(
 //     text: &str,

crates/editor2/src/element.rs πŸ”—

@@ -1,20 +1,34 @@
-use super::{
-    display_map::ToDisplayPoint, DisplayPoint, Editor, EditorSnapshot, ToPoint, MAX_LINE_LEN,
-};
 use crate::{
-    display_map::{BlockStyle, DisplaySnapshot},
-    EditorMode, EditorStyle, SoftWrap,
+    display_map::{BlockStyle, DisplaySnapshot, FoldStatus, HighlightedChunk, ToDisplayPoint},
+    editor_settings::ShowScrollbar,
+    git::{diff_hunk_to_display, DisplayDiffHunk},
+    CursorShape, DisplayPoint, Editor, EditorMode, EditorSettings, EditorSnapshot, EditorStyle,
+    Point, Selection, SoftWrap, ToPoint, MAX_LINE_LEN,
 };
 use anyhow::Result;
+use collections::{BTreeMap, HashMap};
 use gpui::{
-    black, point, px, relative, size, AnyElement, Bounds, Element, Hsla, Line, Pixels, Size, Style,
-    TextRun, TextSystem, ViewContext,
+    black, hsla, point, px, relative, size, transparent_black, AnyElement, BorrowWindow, Bounds,
+    ContentMask, Corners, Edges, Element, Hsla, Line, Pixels, ShapedGlyph, Size, Style, TextRun,
+    TextStyle, TextSystem, ViewContext, WindowContext,
 };
-use language::{CursorShape, Selection};
+use itertools::Itertools;
+use language::language_settings::ShowWhitespaceSetting;
+use multi_buffer::Anchor;
+use project::project_settings::{GitGutterSetting, ProjectSettings};
+use settings::Settings;
 use smallvec::SmallVec;
-use std::{cmp, ops::Range, sync::Arc};
+use std::{
+    borrow::Cow,
+    cmp::{self, Ordering},
+    fmt::Write,
+    iter,
+    ops::Range,
+    sync::Arc,
+};
 use sum_tree::Bias;
-use theme::ActiveTheme;
+use theme::{ActiveTheme, PlayerColor};
+use workspace::item::Item;
 
 enum FoldMarkers {}
 
@@ -360,29 +374,29 @@ impl EditorElement {
     //     );
 
     //     if editor.has_pending_selection() {
-    //         let mut scroll_delta = gpui::Point<Pixels>::zero();
+    //         let mut scroll_delta = gpui::Point::<Pixels>::zero();
 
     //         let vertical_margin = position_map.line_height.min(text_bounds.height() / 3.0);
-    //         let top = text_bounds.origin_y() + vertical_margin;
-    //         let bottom = text_bounds.lower_left().y() - vertical_margin;
-    //         if position.y() < top {
-    //             scroll_delta.set_y(-scale_vertical_mouse_autoscroll_delta(top - position.y()))
+    //         let top = text_bounds.origin.y + vertical_margin;
+    //         let bottom = text_bounds.lower_left().y - vertical_margin;
+    //         if position.y < top {
+    //             scroll_delta.set_y(-scale_vertical_mouse_autoscroll_delta(top - position.y))
     //         }
-    //         if position.y() > bottom {
-    //             scroll_delta.set_y(scale_vertical_mouse_autoscroll_delta(position.y() - bottom))
+    //         if position.y > bottom {
+    //             scroll_delta.set_y(scale_vertical_mouse_autoscroll_delta(position.y - bottom))
     //         }
 
     //         let horizontal_margin = position_map.line_height.min(text_bounds.width() / 3.0);
-    //         let left = text_bounds.origin_x() + horizontal_margin;
-    //         let right = text_bounds.upper_right().x() - horizontal_margin;
-    //         if position.x() < left {
+    //         let left = text_bounds.origin.x + horizontal_margin;
+    //         let right = text_bounds.upper_right().x - horizontal_margin;
+    //         if position.x < left {
     //             scroll_delta.set_x(-scale_horizontal_mouse_autoscroll_delta(
-    //                 left - position.x(),
+    //                 left - position.x,
     //             ))
     //         }
-    //         if position.x() > right {
+    //         if position.x > right {
     //             scroll_delta.set_x(scale_horizontal_mouse_autoscroll_delta(
-    //                 position.x() - right,
+    //                 position.x - right,
     //             ))
     //         }
 
@@ -393,7 +407,7 @@ impl EditorElement {
     //                 position: point_for_position.previous_valid,
     //                 goal_column: point_for_position.exact_unclipped.column(),
     //                 scroll_position: (position_map.snapshot.scroll_position() + scroll_delta)
-    //                     .clamp(gpui::Point<Pixels>::zero(), position_map.scroll_max),
+    //                     .clamp(gpui::Point::<Pixels>::zero(), position_map.scroll_max),
     //             },
     //             cx,
     //         );
@@ -471,573 +485,591 @@ impl EditorElement {
     //         position_map.snapshot.ongoing_scroll.filter(&mut delta)
     //     } else {
     //         //Not trackpad
-    //         delta *= vec2f(max_glyph_width, line_height);
+    //         delta *= point(max_glyph_width, line_height);
     //         None //Resets ongoing scroll
     //     };
 
     //     let scroll_position = position_map.snapshot.scroll_position();
-    //     let x = (scroll_position.x() * max_glyph_width - delta.x()) / max_glyph_width;
-    //     let y = (scroll_position.y() * line_height - delta.y()) / line_height;
-    //     let scroll_position = vec2f(x, y).clamp(gpui::Point<Pixels>::zero(), position_map.scroll_max);
+    //     let x = (scroll_position.x * max_glyph_width - delta.x) / max_glyph_width;
+    //     let y = (scroll_position.y * line_height - delta.y) / line_height;
+    //     let scroll_position = point(x, y).clamp(gpui::Point::<Pixels>::zero(), position_map.scroll_max);
     //     editor.scroll(scroll_position, axis, cx);
 
     //     true
     // }
 
-    // fn paint_background(
-    //     &self,
-    //     gutter_bounds: Bounds<Pixels>,
-    //     text_bounds: Bounds<Pixels>,
-    //     layout: &LayoutState,
-    //     cx: &mut ViewContext<Editor>,
-    // ) {
-    //     let bounds = gutter_bounds.union_rect(text_bounds);
-    //     let scroll_top =
-    //         layout.position_map.snapshot.scroll_position().y() * layout.position_map.line_height;
-    //     cx.scene().push_quad(Quad {
-    //         bounds: gutter_bounds,
-    //         background: Some(self.style.gutter_background),
-    //         border: Border::new(0., Color::transparent_black()).into(),
-    //         corner_radii: Default::default(),
-    //     });
-    //     cx.scene().push_quad(Quad {
-    //         bounds: text_bounds,
-    //         background: Some(self.style.background),
-    //         border: Border::new(0., Color::transparent_black()).into(),
-    //         corner_radii: Default::default(),
-    //     });
-
-    //     if let EditorMode::Full = layout.mode {
-    //         let mut active_rows = layout.active_rows.iter().peekable();
-    //         while let Some((start_row, contains_non_empty_selection)) = active_rows.next() {
-    //             let mut end_row = *start_row;
-    //             while active_rows.peek().map_or(false, |r| {
-    //                 *r.0 == end_row + 1 && r.1 == contains_non_empty_selection
-    //             }) {
-    //                 active_rows.next().unwrap();
-    //                 end_row += 1;
-    //             }
-
-    //             if !contains_non_empty_selection {
-    //                 let origin = vec2f(
-    //                     bounds.origin_x(),
-    //                     bounds.origin_y() + (layout.position_map.line_height * *start_row as f32)
-    //                         - scroll_top,
-    //                 );
-    //                 let size = vec2f(
-    //                     bounds.width(),
-    //                     layout.position_map.line_height * (end_row - start_row + 1) as f32,
-    //                 );
-    //                 cx.scene().push_quad(Quad {
-    //                     bounds: Bounds<Pixels>::new(origin, size),
-    //                     background: Some(self.style.active_line_background),
-    //                     border: Border::default().into(),
-    //                     corner_radii: Default::default(),
-    //                 });
-    //             }
-    //         }
-
-    //         if let Some(highlighted_rows) = &layout.highlighted_rows {
-    //             let origin = vec2f(
-    //                 bounds.origin_x(),
-    //                 bounds.origin_y()
-    //                     + (layout.position_map.line_height * highlighted_rows.start as f32)
-    //                     - scroll_top,
-    //             );
-    //             let size = vec2f(
-    //                 bounds.width(),
-    //                 layout.position_map.line_height * highlighted_rows.len() as f32,
-    //             );
-    //             cx.scene().push_quad(Quad {
-    //                 bounds: Bounds<Pixels>::new(origin, size),
-    //                 background: Some(self.style.highlighted_line_background),
-    //                 border: Border::default().into(),
-    //                 corner_radii: Default::default(),
-    //             });
-    //         }
-
-    //         let scroll_left =
-    //             layout.position_map.snapshot.scroll_position().x() * layout.position_map.em_width;
-
-    //         for (wrap_position, active) in layout.wrap_guides.iter() {
-    //             let x =
-    //                 (text_bounds.origin_x() + wrap_position + layout.position_map.em_width / 2.)
-    //                     - scroll_left;
-
-    //             if x < text_bounds.origin_x()
-    //                 || (layout.show_scrollbars && x > self.scrollbar_left(&bounds))
-    //             {
-    //                 continue;
-    //             }
-
-    //             let color = if *active {
-    //                 self.style.active_wrap_guide
-    //             } else {
-    //                 self.style.wrap_guide
-    //             };
-    //             cx.scene().push_quad(Quad {
-    //                 bounds: Bounds<Pixels>::new(
-    //                     vec2f(x, text_bounds.origin_y()),
-    //                     vec2f(1., text_bounds.height()),
-    //                 ),
-    //                 background: Some(color),
-    //                 border: Border::new(0., Color::transparent_black()).into(),
-    //                 corner_radii: Default::default(),
-    //             });
-    //         }
-    //     }
-    // }
-
-    // fn paint_gutter(
-    //     &mut self,
-    //     bounds: Bounds<Pixels>,
-    //     visible_bounds: Bounds<Pixels>,
-    //     layout: &mut LayoutState,
-    //     editor: &mut Editor,
-    //     cx: &mut ViewContext<Editor>,
-    // ) {
-    //     let line_height = layout.position_map.line_height;
-
-    //     let scroll_position = layout.position_map.snapshot.scroll_position();
-    //     let scroll_top = scroll_position.y() * line_height;
-
-    //     let show_gutter = matches!(
-    //         settings::get::<ProjectSettings>(cx).git.git_gutter,
-    //         Some(GitGutterSetting::TrackedFiles)
-    //     );
-
-    //     if show_gutter {
-    //         Self::paint_diff_hunks(bounds, layout, cx);
-    //     }
-
-    //     for (ix, line) in layout.line_number_layouts.iter().enumerate() {
-    //         if let Some(line) = line {
-    //             let line_origin = bounds.origin()
-    //                 + vec2f(
-    //                     bounds.width() - line.width() - layout.gutter_padding,
-    //                     ix as f32 * line_height - (scroll_top % line_height),
-    //                 );
-
-    //             line.paint(line_origin, visible_bounds, line_height, cx);
-    //         }
-    //     }
-
-    //     for (ix, fold_indicator) in layout.fold_indicators.iter_mut().enumerate() {
-    //         if let Some(indicator) = fold_indicator.as_mut() {
-    //             let position = vec2f(
-    //                 bounds.width() - layout.gutter_padding,
-    //                 ix as f32 * line_height - (scroll_top % line_height),
-    //             );
-    //             let centering_offset = vec2f(
-    //                 (layout.gutter_padding + layout.gutter_margin - indicator.size().x()) / 2.,
-    //                 (line_height - indicator.size().y()) / 2.,
-    //             );
-
-    //             let indicator_origin = bounds.origin() + position + centering_offset;
-
-    //             indicator.paint(indicator_origin, visible_bounds, editor, cx);
-    //         }
-    //     }
-
-    //     if let Some((row, indicator)) = layout.code_actions_indicator.as_mut() {
-    //         let mut x = 0.;
-    //         let mut y = *row as f32 * line_height - scroll_top;
-    //         x += ((layout.gutter_padding + layout.gutter_margin) - indicator.size().x()) / 2.;
-    //         y += (line_height - indicator.size().y()) / 2.;
-    //         indicator.paint(bounds.origin() + vec2f(x, y), visible_bounds, editor, cx);
-    //     }
-    // }
-
-    // fn paint_diff_hunks(bounds: Bounds<Pixels>, layout: &mut LayoutState, cx: &mut ViewContext<Editor>) {
-    //     let diff_style = &theme::current(cx).editor.diff.clone();
-    //     let line_height = layout.position_map.line_height;
-
-    //     let scroll_position = layout.position_map.snapshot.scroll_position();
-    //     let scroll_top = scroll_position.y() * line_height;
-
-    //     for hunk in &layout.display_hunks {
-    //         let (display_row_range, status) = match hunk {
-    //             //TODO: This rendering is entirely a horrible hack
-    //             &DisplayDiffHunk::Folded { display_row: row } => {
-    //                 let start_y = row as f32 * line_height - scroll_top;
-    //                 let end_y = start_y + line_height;
-
-    //                 let width = diff_style.removed_width_em * line_height;
-    //                 let highlight_origin = bounds.origin() + vec2f(-width, start_y);
-    //                 let highlight_size = vec2f(width * 2., end_y - start_y);
-    //                 let highlight_bounds = Bounds<Pixels>::new(highlight_origin, highlight_size);
-
-    //                 cx.scene().push_quad(Quad {
-    //                     bounds: highlight_bounds,
-    //                     background: Some(diff_style.modified),
-    //                     border: Border::new(0., Color::transparent_black()).into(),
-    //                     corner_radii: (1. * line_height).into(),
-    //                 });
-
-    //                 continue;
-    //             }
-
-    //             DisplayDiffHunk::Unfolded {
-    //                 display_row_range,
-    //                 status,
-    //             } => (display_row_range, status),
-    //         };
-
-    //         let color = match status {
-    //             DiffHunkStatus::Added => diff_style.inserted,
-    //             DiffHunkStatus::Modified => diff_style.modified,
-
-    //             //TODO: This rendering is entirely a horrible hack
-    //             DiffHunkStatus::Removed => {
-    //                 let row = display_row_range.start;
-
-    //                 let offset = line_height / 2.;
-    //                 let start_y = row as f32 * line_height - offset - scroll_top;
-    //                 let end_y = start_y + line_height;
-
-    //                 let width = diff_style.removed_width_em * line_height;
-    //                 let highlight_origin = bounds.origin() + vec2f(-width, start_y);
-    //                 let highlight_size = vec2f(width * 2., end_y - start_y);
-    //                 let highlight_bounds = Bounds<Pixels>::new(highlight_origin, highlight_size);
-
-    //                 cx.scene().push_quad(Quad {
-    //                     bounds: highlight_bounds,
-    //                     background: Some(diff_style.deleted),
-    //                     border: Border::new(0., Color::transparent_black()).into(),
-    //                     corner_radii: (1. * line_height).into(),
-    //                 });
-
-    //                 continue;
-    //             }
-    //         };
-
-    //         let start_row = display_row_range.start;
-    //         let end_row = display_row_range.end;
-
-    //         let start_y = start_row as f32 * line_height - scroll_top;
-    //         let end_y = end_row as f32 * line_height - scroll_top;
-
-    //         let width = diff_style.width_em * line_height;
-    //         let highlight_origin = bounds.origin() + vec2f(-width, start_y);
-    //         let highlight_size = vec2f(width * 2., end_y - start_y);
-    //         let highlight_bounds = Bounds<Pixels>::new(highlight_origin, highlight_size);
-
-    //         cx.scene().push_quad(Quad {
-    //             bounds: highlight_bounds,
-    //             background: Some(color),
-    //             border: Border::new(0., Color::transparent_black()).into(),
-    //             corner_radii: (diff_style.corner_radius * line_height).into(),
-    //         });
-    //     }
-    // }
-
-    // fn paint_text(
-    //     &mut self,
-    //     bounds: Bounds<Pixels>,
-    //     visible_bounds: Bounds<Pixels>,
-    //     layout: &mut LayoutState,
-    //     editor: &mut Editor,
-    //     cx: &mut ViewContext<Editor>,
-    // ) {
-    //     let style = &self.style;
-    //     let scroll_position = layout.position_map.snapshot.scroll_position();
-    //     let start_row = layout.visible_display_row_range.start;
-    //     let scroll_top = scroll_position.y() * layout.position_map.line_height;
-    //     let max_glyph_width = layout.position_map.em_width;
-    //     let scroll_left = scroll_position.x() * max_glyph_width;
-    //     let content_origin = bounds.origin() + vec2f(layout.gutter_margin, 0.);
-    //     let line_end_overshoot = 0.15 * layout.position_map.line_height;
-    //     let whitespace_setting = editor.buffer.read(cx).settings_at(0, cx).show_whitespaces;
-
-    //     cx.scene().push_layer(Some(bounds));
-
-    //     cx.scene().push_cursor_region(CursorRegion {
-    //         bounds,
-    //         style: if !editor.link_go_to_definition_state.definitions.is_empty() {
-    //             CursorStyle::PointingHand
-    //         } else {
-    //             CursorStyle::IBeam
-    //         },
-    //     });
+    fn paint_background(
+        &self,
+        gutter_bounds: Bounds<Pixels>,
+        text_bounds: Bounds<Pixels>,
+        layout: &LayoutState,
+        cx: &mut ViewContext<Editor>,
+    ) {
+        let bounds = gutter_bounds.union(&text_bounds);
+        let scroll_top =
+            layout.position_map.snapshot.scroll_position().y * layout.position_map.line_height;
+        let gutter_bg = cx.theme().colors().editor_gutter_background;
+        cx.paint_quad(
+            gutter_bounds,
+            Corners::default(),
+            gutter_bg,
+            Edges::default(),
+            transparent_black(),
+        );
+        cx.paint_quad(
+            text_bounds,
+            Corners::default(),
+            self.style.background,
+            Edges::default(),
+            transparent_black(),
+        );
+
+        if let EditorMode::Full = layout.mode {
+            let mut active_rows = layout.active_rows.iter().peekable();
+            while let Some((start_row, contains_non_empty_selection)) = active_rows.next() {
+                let mut end_row = *start_row;
+                while active_rows.peek().map_or(false, |r| {
+                    *r.0 == end_row + 1 && r.1 == contains_non_empty_selection
+                }) {
+                    active_rows.next().unwrap();
+                    end_row += 1;
+                }
+
+                if !contains_non_empty_selection {
+                    let origin = point(
+                        bounds.origin.x,
+                        bounds.origin.y + (layout.position_map.line_height * *start_row as f32)
+                            - scroll_top,
+                    );
+                    let size = size(
+                        bounds.size.width,
+                        layout.position_map.line_height * (end_row - start_row + 1) as f32,
+                    );
+                    let active_line_bg = cx.theme().colors().editor_active_line_background;
+                    cx.paint_quad(
+                        Bounds { origin, size },
+                        Corners::default(),
+                        active_line_bg,
+                        Edges::default(),
+                        transparent_black(),
+                    );
+                }
+            }
 
-    //     let fold_corner_radius =
-    //         self.style.folds.ellipses.corner_radius_factor * layout.position_map.line_height;
-    //     for (id, range, color) in layout.fold_ranges.iter() {
-    //         self.paint_highlighted_range(
-    //             range.clone(),
-    //             *color,
-    //             fold_corner_radius,
-    //             fold_corner_radius * 2.,
-    //             layout,
-    //             content_origin,
-    //             scroll_top,
-    //             scroll_left,
-    //             bounds,
-    //             cx,
-    //         );
+            if let Some(highlighted_rows) = &layout.highlighted_rows {
+                let origin = point(
+                    bounds.origin.x,
+                    bounds.origin.y
+                        + (layout.position_map.line_height * highlighted_rows.start as f32)
+                        - scroll_top,
+                );
+                let size = size(
+                    bounds.size.width,
+                    layout.position_map.line_height * highlighted_rows.len() as f32,
+                );
+                let highlighted_line_bg = cx.theme().colors().editor_highlighted_line_background;
+                cx.paint_quad(
+                    Bounds { origin, size },
+                    Corners::default(),
+                    highlighted_line_bg,
+                    Edges::default(),
+                    transparent_black(),
+                );
+            }
 
-    //         for bound in range_to_bounds(
-    //             &range,
-    //             content_origin,
-    //             scroll_left,
-    //             scroll_top,
-    //             &layout.visible_display_row_range,
-    //             line_end_overshoot,
-    //             &layout.position_map,
-    //         ) {
-    //             cx.scene().push_cursor_region(CursorRegion {
-    //                 bounds: bound,
-    //                 style: CursorStyle::PointingHand,
-    //             });
-
-    //             let display_row = range.start.row();
-
-    //             let buffer_row = DisplayPoint::new(display_row, 0)
-    //                 .to_point(&layout.position_map.snapshot.display_snapshot)
-    //                 .row;
-
-    //             let view_id = cx.view_id();
-    //             cx.scene().push_mouse_region(
-    //                 MouseRegion::new::<FoldMarkers>(view_id, *id as usize, bound)
-    //                     .on_click(MouseButton::Left, move |_, editor: &mut Editor, cx| {
-    //                         editor.unfold_at(&UnfoldAt { buffer_row }, cx)
-    //                     })
-    //                     .with_notify_on_hover(true)
-    //                     .with_notify_on_click(true),
-    //             )
-    //         }
-    //     }
+            let scroll_left =
+                layout.position_map.snapshot.scroll_position().x * layout.position_map.em_width;
+
+            for (wrap_position, active) in layout.wrap_guides.iter() {
+                let x = (text_bounds.origin.x + *wrap_position + layout.position_map.em_width / 2.)
+                    - scroll_left;
+
+                if x < text_bounds.origin.x
+                    || (layout.show_scrollbars && x > self.scrollbar_left(&bounds))
+                {
+                    continue;
+                }
+
+                let color = if *active {
+                    cx.theme().colors().editor_active_wrap_guide
+                } else {
+                    cx.theme().colors().editor_wrap_guide
+                };
+                cx.paint_quad(
+                    Bounds {
+                        origin: point(x, text_bounds.origin.y),
+                        size: size(px(1.), text_bounds.size.height),
+                    },
+                    Corners::default(),
+                    color,
+                    Edges::default(),
+                    transparent_black(),
+                );
+            }
+        }
+    }
 
-    //     for (range, color) in &layout.highlighted_ranges {
-    //         self.paint_highlighted_range(
-    //             range.clone(),
-    //             *color,
-    //             0.,
-    //             line_end_overshoot,
-    //             layout,
-    //             content_origin,
-    //             scroll_top,
-    //             scroll_left,
-    //             bounds,
-    //             cx,
-    //         );
-    //     }
+    fn paint_gutter(
+        &mut self,
+        bounds: Bounds<Pixels>,
+        layout: &LayoutState,
+        editor: &mut Editor,
+        cx: &mut ViewContext<Editor>,
+    ) {
+        let line_height = layout.position_map.line_height;
 
-    //     let mut cursors = SmallVec::<[Cursor; 32]>::new();
-    //     let corner_radius = 0.15 * layout.position_map.line_height;
-    //     let mut invisible_display_ranges = SmallVec::<[Range<DisplayPoint>; 32]>::new();
-
-    //     for (selection_style, selections) in &layout.selections {
-    //         for selection in selections {
-    //             self.paint_highlighted_range(
-    //                 selection.range.clone(),
-    //                 selection_style.selection,
-    //                 corner_radius,
-    //                 corner_radius * 2.,
-    //                 layout,
-    //                 content_origin,
-    //                 scroll_top,
-    //                 scroll_left,
-    //                 bounds,
-    //                 cx,
-    //             );
+        let scroll_position = layout.position_map.snapshot.scroll_position();
+        let scroll_top = scroll_position.y * line_height;
 
-    //             if selection.is_local && !selection.range.is_empty() {
-    //                 invisible_display_ranges.push(selection.range.clone());
-    //             }
-    //             if !selection.is_local || editor.show_local_cursors(cx) {
-    //                 let cursor_position = selection.head;
-    //                 if layout
-    //                     .visible_display_row_range
-    //                     .contains(&cursor_position.row())
-    //                 {
-    //                     let cursor_row_layout = &layout.position_map.line_layouts
-    //                         [(cursor_position.row() - start_row) as usize]
-    //                         .line;
-    //                     let cursor_column = cursor_position.column() as usize;
-
-    //                     let cursor_character_x = cursor_row_layout.x_for_index(cursor_column);
-    //                     let mut block_width =
-    //                         cursor_row_layout.x_for_index(cursor_column + 1) - cursor_character_x;
-    //                     if block_width == 0.0 {
-    //                         block_width = layout.position_map.em_width;
-    //                     }
-    //                     let block_text = if let CursorShape::Block = selection.cursor_shape {
-    //                         layout
-    //                             .position_map
-    //                             .snapshot
-    //                             .chars_at(cursor_position)
-    //                             .next()
-    //                             .and_then(|(character, _)| {
-    //                                 let font_id =
-    //                                     cursor_row_layout.font_for_index(cursor_column)?;
-    //                                 let text = character.to_string();
-
-    //                                 Some(cx.text_layout_cache().layout_str(
-    //                                     &text,
-    //                                     cursor_row_layout.font_size(),
-    //                                     &[(
-    //                                         text.chars().count(),
-    //                                         RunStyle {
-    //                                             font_id,
-    //                                             color: style.background,
-    //                                             underline: Default::default(),
-    //                                         },
-    //                                     )],
-    //                                 ))
-    //                             })
-    //                     } else {
-    //                         None
-    //                     };
+        let show_gutter = matches!(
+            ProjectSettings::get_global(cx).git.git_gutter,
+            Some(GitGutterSetting::TrackedFiles)
+        );
 
-    //                     let x = cursor_character_x - scroll_left;
-    //                     let y = cursor_position.row() as f32 * layout.position_map.line_height
-    //                         - scroll_top;
-    //                     if selection.is_newest {
-    //                         editor.pixel_position_of_newest_cursor = Some(vec2f(
-    //                             bounds.origin_x() + x + block_width / 2.,
-    //                             bounds.origin_y() + y + layout.position_map.line_height / 2.,
-    //                         ));
-    //                     }
-    //                     cursors.push(Cursor {
-    //                         color: selection_style.cursor,
-    //                         block_width,
-    //                         origin: vec2f(x, y),
-    //                         line_height: layout.position_map.line_height,
-    //                         shape: selection.cursor_shape,
-    //                         block_text,
-    //                     });
-    //                 }
-    //             }
-    //         }
-    //     }
+        if show_gutter {
+            Self::paint_diff_hunks(bounds, layout, cx);
+        }
 
-    //     if let Some(visible_text_bounds) = bounds.intersection(visible_bounds) {
-    //         for (ix, line_with_invisibles) in layout.position_map.line_layouts.iter().enumerate() {
-    //             let row = start_row + ix as u32;
-    //             line_with_invisibles.draw(
-    //                 layout,
-    //                 row,
-    //                 scroll_top,
-    //                 content_origin,
-    //                 scroll_left,
-    //                 visible_text_bounds,
-    //                 whitespace_setting,
-    //                 &invisible_display_ranges,
-    //                 visible_bounds,
-    //                 cx,
-    //             )
-    //         }
-    //     }
+        for (ix, line) in layout.line_number_layouts.iter().enumerate() {
+            if let Some(line) = line {
+                let line_origin = bounds.origin
+                    + point(
+                        bounds.size.width - line.width - layout.gutter_padding,
+                        ix as f32 * line_height - (scroll_top % line_height),
+                    );
 
-    //     cx.scene().push_layer(Some(bounds));
-    //     for cursor in cursors {
-    //         cursor.paint(content_origin, cx);
-    //     }
-    //     cx.scene().pop_layer();
-
-    //     if let Some((position, context_menu)) = layout.context_menu.as_mut() {
-    //         cx.scene().push_stacking_context(None, None);
-    //         let cursor_row_layout =
-    //             &layout.position_map.line_layouts[(position.row() - start_row) as usize].line;
-    //         let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left;
-    //         let y = (position.row() + 1) as f32 * layout.position_map.line_height - scroll_top;
-    //         let mut list_origin = content_origin + vec2f(x, y);
-    //         let list_width = context_menu.size().x();
-    //         let list_height = context_menu.size().y();
-
-    //         // Snap the right edge of the list to the right edge of the window if
-    //         // its horizontal bounds overflow.
-    //         if list_origin.x() + list_width > cx.window_size().x() {
-    //             list_origin.set_x((cx.window_size().x() - list_width).max(0.));
-    //         }
+                line.paint(line_origin, line_height, cx);
+            }
+        }
 
-    //         if list_origin.y() + list_height > bounds.max_y() {
-    //             list_origin.set_y(list_origin.y() - layout.position_map.line_height - list_height);
-    //         }
+        // todo!("fold indicators")
+        // for (ix, fold_indicator) in layout.fold_indicators.iter_mut().enumerate() {
+        //     if let Some(indicator) = fold_indicator.as_mut() {
+        //         let position = point(
+        //             bounds.width() - layout.gutter_padding,
+        //             ix as f32 * line_height - (scroll_top % line_height),
+        //         );
+        //         let centering_offset = point(
+        //             (layout.gutter_padding + layout.gutter_margin - indicator.size().x) / 2.,
+        //             (line_height - indicator.size().y) / 2.,
+        //         );
+
+        //         let indicator_origin = bounds.origin + position + centering_offset;
+
+        //         indicator.paint(indicator_origin, visible_bounds, editor, cx);
+        //     }
+        // }
 
-    //         context_menu.paint(
-    //             list_origin,
-    //             Bounds<Pixels>::from_points(gpui::Point<Pixels>::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor
-    //             editor,
-    //             cx,
-    //         );
+        // todo!("code actions indicator")
+        // if let Some((row, indicator)) = layout.code_actions_indicator.as_mut() {
+        //     let mut x = 0.;
+        //     let mut y = *row as f32 * line_height - scroll_top;
+        //     x += ((layout.gutter_padding + layout.gutter_margin) - indicator.size().x) / 2.;
+        //     y += (line_height - indicator.size().y) / 2.;
+        //     indicator.paint(bounds.origin + point(x, y), visible_bounds, editor, cx);
+        // }
+    }
 
-    //         cx.scene().pop_stacking_context();
-    //     }
+    fn paint_diff_hunks(
+        bounds: Bounds<Pixels>,
+        layout: &LayoutState,
+        cx: &mut ViewContext<Editor>,
+    ) {
+        // todo!()
+        // let diff_style = &theme::current(cx).editor.diff.clone();
+        // let line_height = layout.position_map.line_height;
+
+        // let scroll_position = layout.position_map.snapshot.scroll_position();
+        // let scroll_top = scroll_position.y * line_height;
+
+        // for hunk in &layout.display_hunks {
+        //     let (display_row_range, status) = match hunk {
+        //         //TODO: This rendering is entirely a horrible hack
+        //         &DisplayDiffHunk::Folded { display_row: row } => {
+        //             let start_y = row as f32 * line_height - scroll_top;
+        //             let end_y = start_y + line_height;
+
+        //             let width = diff_style.removed_width_em * line_height;
+        //             let highlight_origin = bounds.origin + point(-width, start_y);
+        //             let highlight_size = point(width * 2., end_y - start_y);
+        //             let highlight_bounds = Bounds::<Pixels>::new(highlight_origin, highlight_size);
+
+        //             cx.paint_quad(Quad {
+        //                 bounds: highlight_bounds,
+        //                 background: Some(diff_style.modified),
+        //                 border: Border::new(0., Color::transparent_black()).into(),
+        //                 corner_radii: (1. * line_height).into(),
+        //             });
+
+        //             continue;
+        //         }
+
+        //         DisplayDiffHunk::Unfolded {
+        //             display_row_range,
+        //             status,
+        //         } => (display_row_range, status),
+        //     };
+
+        //     let color = match status {
+        //         DiffHunkStatus::Added => diff_style.inserted,
+        //         DiffHunkStatus::Modified => diff_style.modified,
+
+        //         //TODO: This rendering is entirely a horrible hack
+        //         DiffHunkStatus::Removed => {
+        //             let row = display_row_range.start;
+
+        //             let offset = line_height / 2.;
+        //             let start_y = row as f32 * line_height - offset - scroll_top;
+        //             let end_y = start_y + line_height;
+
+        //             let width = diff_style.removed_width_em * line_height;
+        //             let highlight_origin = bounds.origin + point(-width, start_y);
+        //             let highlight_size = point(width * 2., end_y - start_y);
+        //             let highlight_bounds = Bounds::<Pixels>::new(highlight_origin, highlight_size);
+
+        //             cx.paint_quad(Quad {
+        //                 bounds: highlight_bounds,
+        //                 background: Some(diff_style.deleted),
+        //                 border: Border::new(0., Color::transparent_black()).into(),
+        //                 corner_radii: (1. * line_height).into(),
+        //             });
+
+        //             continue;
+        //         }
+        //     };
+
+        //     let start_row = display_row_range.start;
+        //     let end_row = display_row_range.end;
+
+        //     let start_y = start_row as f32 * line_height - scroll_top;
+        //     let end_y = end_row as f32 * line_height - scroll_top;
+
+        //     let width = diff_style.width_em * line_height;
+        //     let highlight_origin = bounds.origin + point(-width, start_y);
+        //     let highlight_size = point(width * 2., end_y - start_y);
+        //     let highlight_bounds = Bounds::<Pixels>::new(highlight_origin, highlight_size);
+
+        //     cx.paint_quad(Quad {
+        //         bounds: highlight_bounds,
+        //         background: Some(color),
+        //         border: Border::new(0., Color::transparent_black()).into(),
+        //         corner_radii: (diff_style.corner_radius * line_height).into(),
+        //     });
+        // }
+    }
 
-    //     if let Some((position, hover_popovers)) = layout.hover_popovers.as_mut() {
-    //         cx.scene().push_stacking_context(None, None);
-
-    //         // This is safe because we check on layout whether the required row is available
-    //         let hovered_row_layout =
-    //             &layout.position_map.line_layouts[(position.row() - start_row) as usize].line;
-
-    //         // Minimum required size: Take the first popover, and add 1.5 times the minimum popover
-    //         // height. This is the size we will use to decide whether to render popovers above or below
-    //         // the hovered line.
-    //         let first_size = hover_popovers[0].size();
-    //         let height_to_reserve = first_size.y()
-    //             + 1.5 * MIN_POPOVER_LINE_HEIGHT as f32 * layout.position_map.line_height;
-
-    //         // Compute Hovered Point
-    //         let x = hovered_row_layout.x_for_index(position.column() as usize) - scroll_left;
-    //         let y = position.row() as f32 * layout.position_map.line_height - scroll_top;
-    //         let hovered_point = content_origin + vec2f(x, y);
-
-    //         if hovered_point.y() - height_to_reserve > 0.0 {
-    //             // There is enough space above. Render popovers above the hovered point
-    //             let mut current_y = hovered_point.y();
-    //             for hover_popover in hover_popovers {
-    //                 let size = hover_popover.size();
-    //                 let mut popover_origin = vec2f(hovered_point.x(), current_y - size.y());
-
-    //                 let x_out_of_bounds = bounds.max_x() - (popover_origin.x() + size.x());
-    //                 if x_out_of_bounds < 0.0 {
-    //                     popover_origin.set_x(popover_origin.x() + x_out_of_bounds);
-    //                 }
+    fn paint_text(
+        &mut self,
+        bounds: Bounds<Pixels>,
+        layout: &LayoutState,
+        editor: &mut Editor,
+        cx: &mut ViewContext<Editor>,
+    ) {
+        let scroll_position = layout.position_map.snapshot.scroll_position();
+        let start_row = layout.visible_display_row_range.start;
+        let scroll_top = scroll_position.y * layout.position_map.line_height;
+        let max_glyph_width = layout.position_map.em_width;
+        let scroll_left = scroll_position.x * max_glyph_width;
+        let content_origin = bounds.origin + point(layout.gutter_margin, Pixels::ZERO);
+        let line_end_overshoot = 0.15 * layout.position_map.line_height;
+        let whitespace_setting = editor.buffer.read(cx).settings_at(0, cx).show_whitespaces;
+
+        // todo!("cursor region")
+        // cx.scene().push_cursor_region(CursorRegion {
+        //     bounds,
+        //     style: if !editor.link_go_to_definition_state.definitions.is_empty {
+        //         CursorStyle::PointingHand
+        //     } else {
+        //         CursorStyle::IBeam
+        //     },
+        // });
+
+        // todo!("fold ranges")
+        // let fold_corner_radius =
+        //     self.style.folds.ellipses.corner_radius_factor * layout.position_map.line_height;
+        // for (id, range, color) in layout.fold_ranges.iter() {
+        //     self.paint_highlighted_range(
+        //         range.clone(),
+        //         *color,
+        //         fold_corner_radius,
+        //         fold_corner_radius * 2.,
+        //         layout,
+        //         content_origin,
+        //         scroll_top,
+        //         scroll_left,
+        //         bounds,
+        //         cx,
+        //     );
+
+        //     for bound in range_to_bounds(
+        //         &range,
+        //         content_origin,
+        //         scroll_left,
+        //         scroll_top,
+        //         &layout.visible_display_row_range,
+        //         line_end_overshoot,
+        //         &layout.position_map,
+        //     ) {
+        //         cx.scene().push_cursor_region(CursorRegion {
+        //             bounds: bound,
+        //             style: CursorStyle::PointingHand,
+        //         });
+
+        //         let display_row = range.start.row();
+
+        //         let buffer_row = DisplayPoint::new(display_row, 0)
+        //             .to_point(&layout.position_map.snapshot.display_snapshot)
+        //             .row;
+
+        //         let view_id = cx.view_id();
+        //         cx.scene().push_mouse_region(
+        //             MouseRegion::new::<FoldMarkers>(view_id, *id as usize, bound)
+        //                 .on_click(MouseButton::Left, move |_, editor: &mut Editor, cx| {
+        //                     editor.unfold_at(&UnfoldAt { buffer_row }, cx)
+        //                 })
+        //                 .with_notify_on_hover(true)
+        //                 .with_notify_on_click(true),
+        //         )
+        //     }
+        // }
 
-    //                 hover_popover.paint(
-    //                     popover_origin,
-    //                     Bounds<Pixels>::from_points(gpui::Point<Pixels>::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor
-    //                     editor,
-    //                     cx,
-    //                 );
+        for (range, color) in &layout.highlighted_ranges {
+            self.paint_highlighted_range(
+                range.clone(),
+                *color,
+                Pixels::ZERO,
+                line_end_overshoot,
+                layout,
+                content_origin,
+                scroll_top,
+                scroll_left,
+                bounds,
+                cx,
+            );
+        }
 
-    //                 current_y = popover_origin.y() - HOVER_POPOVER_GAP;
-    //             }
-    //         } else {
-    //             // There is not enough space above. Render popovers below the hovered point
-    //             let mut current_y = hovered_point.y() + layout.position_map.line_height;
-    //             for hover_popover in hover_popovers {
-    //                 let size = hover_popover.size();
-    //                 let mut popover_origin = vec2f(hovered_point.x(), current_y);
-
-    //                 let x_out_of_bounds = bounds.max_x() - (popover_origin.x() + size.x());
-    //                 if x_out_of_bounds < 0.0 {
-    //                     popover_origin.set_x(popover_origin.x() + x_out_of_bounds);
-    //                 }
+        let mut cursors = SmallVec::<[Cursor; 32]>::new();
+        let corner_radius = 0.15 * layout.position_map.line_height;
+        let mut invisible_display_ranges = SmallVec::<[Range<DisplayPoint>; 32]>::new();
+
+        for (selection_style, selections) in &layout.selections {
+            for selection in selections {
+                self.paint_highlighted_range(
+                    selection.range.clone(),
+                    selection_style.selection,
+                    corner_radius,
+                    corner_radius * 2.,
+                    layout,
+                    content_origin,
+                    scroll_top,
+                    scroll_left,
+                    bounds,
+                    cx,
+                );
 
-    //                 hover_popover.paint(
-    //                     popover_origin,
-    //                     Bounds<Pixels>::from_points(gpui::Point<Pixels>::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor
-    //                     editor,
-    //                     cx,
-    //                 );
+                if selection.is_local && !selection.range.is_empty() {
+                    invisible_display_ranges.push(selection.range.clone());
+                }
+
+                if !selection.is_local || editor.show_local_cursors(cx) {
+                    let cursor_position = selection.head;
+                    if layout
+                        .visible_display_row_range
+                        .contains(&cursor_position.row())
+                    {
+                        let cursor_row_layout = &layout.position_map.line_layouts
+                            [(cursor_position.row() - start_row) as usize]
+                            .line;
+                        let cursor_column = cursor_position.column() as usize;
+
+                        let cursor_character_x = cursor_row_layout.x_for_index(cursor_column);
+                        let mut block_width =
+                            cursor_row_layout.x_for_index(cursor_column + 1) - cursor_character_x;
+                        if block_width == Pixels::ZERO {
+                            block_width = layout.position_map.em_width;
+                        }
+                        let block_text = if let CursorShape::Block = selection.cursor_shape {
+                            layout
+                                .position_map
+                                .snapshot
+                                .chars_at(cursor_position)
+                                .next()
+                                .and_then(|(character, _)| {
+                                    let text = character.to_string();
+                                    cx.text_system()
+                                        .layout_text(
+                                            &text,
+                                            cursor_row_layout.font_size,
+                                            &[TextRun {
+                                                len: text.len(),
+                                                font: self.style.text.font(),
+                                                color: self.style.background,
+                                                underline: None,
+                                            }],
+                                            None,
+                                        )
+                                        .unwrap()
+                                        .pop()
+                                })
+                        } else {
+                            None
+                        };
+
+                        let x = cursor_character_x - scroll_left;
+                        let y = cursor_position.row() as f32 * layout.position_map.line_height
+                            - scroll_top;
+                        if selection.is_newest {
+                            editor.pixel_position_of_newest_cursor = Some(point(
+                                bounds.origin.x + x + block_width / 2.,
+                                bounds.origin.y + y + layout.position_map.line_height / 2.,
+                            ));
+                        }
+                        cursors.push(Cursor {
+                            color: selection_style.cursor,
+                            block_width,
+                            origin: point(x, y),
+                            line_height: layout.position_map.line_height,
+                            shape: selection.cursor_shape,
+                            block_text,
+                        });
+                    }
+                }
+            }
+        }
 
-    //                 current_y = popover_origin.y() + size.y() + HOVER_POPOVER_GAP;
-    //             }
-    //         }
+        for (ix, line_with_invisibles) in layout.position_map.line_layouts.iter().enumerate() {
+            let row = start_row + ix as u32;
+            line_with_invisibles.draw(
+                layout,
+                row,
+                scroll_top,
+                content_origin,
+                scroll_left,
+                whitespace_setting,
+                &invisible_display_ranges,
+                cx,
+            )
+        }
 
-    //         cx.scene().pop_stacking_context();
-    //     }
+        cx.stack(9999, |cx| {
+            for cursor in cursors {
+                cursor.paint(content_origin, cx);
+            }
+        });
+        // cx.scene().push_layer(Some(bounds));
+
+        // cx.scene().pop_layer();
+
+        // if let Some((position, context_menu)) = layout.context_menu.as_mut() {
+        //     cx.scene().push_stacking_context(None, None);
+        //     let cursor_row_layout =
+        //         &layout.position_map.line_layouts[(position.row() - start_row) as usize].line;
+        //     let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left;
+        //     let y = (position.row() + 1) as f32 * layout.position_map.line_height - scroll_top;
+        //     let mut list_origin = content_origin + point(x, y);
+        //     let list_width = context_menu.size().x;
+        //     let list_height = context_menu.size().y;
+
+        //     // Snap the right edge of the list to the right edge of the window if
+        //     // its horizontal bounds overflow.
+        //     if list_origin.x + list_width > cx.window_size().x {
+        //         list_origin.set_x((cx.window_size().x - list_width).max(0.));
+        //     }
+
+        //     if list_origin.y + list_height > bounds.max_y {
+        //         list_origin
+        //             .set_y(list_origin.y - layout.position_map.line_height - list_height);
+        //     }
+
+        //     context_menu.paint(
+        //         list_origin,
+        //         Bounds::<Pixels>::from_points(
+        //             gpui::Point::<Pixels>::zero(),
+        //             point(f32::MAX, f32::MAX),
+        //         ), // Let content bleed outside of editor
+        //         editor,
+        //         cx,
+        //     );
+
+        //     cx.scene().pop_stacking_context();
+        // }
 
-    //     cx.scene().pop_layer();
-    // }
+        // if let Some((position, hover_popovers)) = layout.hover_popovers.as_mut() {
+        //     cx.scene().push_stacking_context(None, None);
+
+        //     // This is safe because we check on layout whether the required row is available
+        //     let hovered_row_layout =
+        //         &layout.position_map.line_layouts[(position.row() - start_row) as usize].line;
+
+        //     // Minimum required size: Take the first popover, and add 1.5 times the minimum popover
+        //     // height. This is the size we will use to decide whether to render popovers above or below
+        //     // the hovered line.
+        //     let first_size = hover_popovers[0].size();
+        //     let height_to_reserve = first_size.y
+        //         + 1.5 * MIN_POPOVER_LINE_HEIGHT as f32 * layout.position_map.line_height;
+
+        //     // Compute Hovered Point
+        //     let x = hovered_row_layout.x_for_index(position.column() as usize) - scroll_left;
+        //     let y = position.row() as f32 * layout.position_map.line_height - scroll_top;
+        //     let hovered_point = content_origin + point(x, y);
+
+        //     if hovered_point.y - height_to_reserve > 0.0 {
+        //         // There is enough space above. Render popovers above the hovered point
+        //         let mut current_y = hovered_point.y;
+        //         for hover_popover in hover_popovers {
+        //             let size = hover_popover.size();
+        //             let mut popover_origin = point(hovered_point.x, current_y - size.y);
+
+        //             let x_out_of_bounds = bounds.max_x - (popover_origin.x + size.x);
+        //             if x_out_of_bounds < 0.0 {
+        //                 popover_origin.set_x(popover_origin.x + x_out_of_bounds);
+        //             }
+
+        //             hover_popover.paint(
+        //                 popover_origin,
+        //                 Bounds::<Pixels>::from_points(
+        //                     gpui::Point::<Pixels>::zero(),
+        //                     point(f32::MAX, f32::MAX),
+        //                 ), // Let content bleed outside of editor
+        //                 editor,
+        //                 cx,
+        //             );
+
+        //             current_y = popover_origin.y - HOVER_POPOVER_GAP;
+        //         }
+        //     } else {
+        //         // There is not enough space above. Render popovers below the hovered point
+        //         let mut current_y = hovered_point.y + layout.position_map.line_height;
+        //         for hover_popover in hover_popovers {
+        //             let size = hover_popover.size();
+        //             let mut popover_origin = point(hovered_point.x, current_y);
+
+        //             let x_out_of_bounds = bounds.max_x - (popover_origin.x + size.x);
+        //             if x_out_of_bounds < 0.0 {
+        //                 popover_origin.set_x(popover_origin.x + x_out_of_bounds);
+        //             }
+
+        //             hover_popover.paint(
+        //                 popover_origin,
+        //                 Bounds::<Pixels>::from_points(
+        //                     gpui::Point::<Pixels>::zero(),
+        //                     point(f32::MAX, f32::MAX),
+        //                 ), // Let content bleed outside of editor
+        //                 editor,
+        //                 cx,
+        //             );
+
+        //             current_y = popover_origin.y + size.y + HOVER_POPOVER_GAP;
+        //         }
+        //     }
+
+        //     cx.scene().pop_stacking_context();
+        // }
+    }
 
-    // fn scrollbar_left(&self, bounds: &Bounds<Pixels>) -> f32 {
-    //     bounds.max_x() - self.style.theme.scrollbar.width
-    // }
+    fn scrollbar_left(&self, bounds: &Bounds<Pixels>) -> Pixels {
+        bounds.upper_right().x - self.style.scrollbar_width
+    }
 
     // fn paint_scrollbar(
     //     &mut self,

crates/editor2/src/items.rs πŸ”—

@@ -159,16 +159,14 @@ impl FollowableItem for Editor {
             self.buffer.update(cx, |buffer, cx| {
                 buffer.remove_active_selections(cx);
             });
-        } else {
+        } else if self.focus_handle.is_focused(cx) {
             self.buffer.update(cx, |buffer, cx| {
-                if self.focused {
-                    buffer.set_active_selections(
-                        &self.selections.disjoint_anchors(),
-                        self.selections.line_mode,
-                        self.cursor_shape,
-                        cx,
-                    );
-                }
+                buffer.set_active_selections(
+                    &self.selections.disjoint_anchors(),
+                    self.selections.line_mode,
+                    self.cursor_shape,
+                    cx,
+                );
             });
         }
         cx.notify();
@@ -581,7 +581,7 @@ fn go_to_fetched_definition_of_kind(
 
     let is_correct_kind = cached_definitions_kind == Some(kind);
     if !cached_definitions.is_empty() && is_correct_kind {
-        if !editor.focused {
+        if !editor.focus_handle.is_focused(cx) {
             cx.focus(&editor.focus_handle);
         }
 

crates/gpui2/src/app.rs πŸ”—

@@ -48,15 +48,15 @@ pub struct AppCell {
 impl AppCell {
     #[track_caller]
     pub fn borrow(&self) -> AppRef {
-        let thread_id = std::thread::current().id();
-        eprintln!("borrowed {thread_id:?}");
+        // let thread_id = std::thread::current().id();
+        // eprintln!("borrowed {thread_id:?}");
         AppRef(self.app.borrow())
     }
 
     #[track_caller]
     pub fn borrow_mut(&self) -> AppRefMut {
-        let thread_id = std::thread::current().id();
-        eprintln!("borrowed {thread_id:?}");
+        // let thread_id = std::thread::current().id();
+        // eprintln!("borrowed {thread_id:?}");
         AppRefMut(self.app.borrow_mut())
     }
 }

crates/gpui2/src/color.rs πŸ”—

@@ -176,6 +176,15 @@ pub fn black() -> Hsla {
     }
 }
 
+pub fn transparent_black() -> Hsla {
+    Hsla {
+        h: 0.,
+        s: 0.,
+        l: 0.,
+        a: 0.,
+    }
+}
+
 pub fn white() -> Hsla {
     Hsla {
         h: 0.,

crates/gpui2/src/elements/text.rs πŸ”—

@@ -74,7 +74,7 @@ impl<V: 'static> Element<V> for Text<V> {
     ) -> LayoutId {
         let text_system = cx.text_system().clone();
         let text_style = cx.text_style();
-        let font_size = text_style.font_size * cx.rem_size();
+        let font_size = text_style.font_size.to_pixels(cx.rem_size());
         let line_height = text_style
             .line_height
             .to_pixels(font_size.into(), cx.rem_size());

crates/gpui2/src/geometry.rs πŸ”—

@@ -492,6 +492,15 @@ where
 impl<T: Clone + Default + Debug + Copy> Copy for Edges<T> {}
 
 impl<T: Clone + Default + Debug> Edges<T> {
+    pub fn all(value: T) -> Self {
+        Self {
+            top: value.clone(),
+            right: value.clone(),
+            bottom: value.clone(),
+            left: value,
+        }
+    }
+
     pub fn map<U>(&self, f: impl Fn(&T) -> U) -> Edges<U>
     where
         U: Clone + Default + Debug,
@@ -730,6 +739,7 @@ impl MulAssign<f32> for Pixels {
 }
 
 impl Pixels {
+    pub const ZERO: Pixels = Pixels(0.0);
     pub const MAX: Pixels = Pixels(f32::MAX);
 
     pub fn as_usize(&self) -> usize {

crates/gpui2/src/style.rs πŸ”—

@@ -1,8 +1,8 @@
 use crate::{
     black, phi, point, rems, AbsoluteLength, BorrowAppContext, BorrowWindow, Bounds, ContentMask,
     Corners, CornersRefinement, CursorStyle, DefiniteLength, Edges, EdgesRefinement, Font,
-    FontFeatures, FontStyle, FontWeight, Hsla, Length, Pixels, Point, PointRefinement, Rems,
-    Result, Rgba, SharedString, Size, SizeRefinement, Styled, TextRun, ViewContext, WindowContext,
+    FontFeatures, FontStyle, FontWeight, Hsla, Length, Pixels, Point, PointRefinement, Result,
+    Rgba, SharedString, Size, SizeRefinement, Styled, TextRun, ViewContext, WindowContext,
 };
 use refineable::{Cascade, Refineable};
 use smallvec::SmallVec;
@@ -134,7 +134,7 @@ pub struct TextStyle {
     pub color: Hsla,
     pub font_family: SharedString,
     pub font_features: FontFeatures,
-    pub font_size: Rems,
+    pub font_size: AbsoluteLength,
     pub line_height: DefiniteLength,
     pub font_weight: FontWeight,
     pub font_style: FontStyle,
@@ -147,7 +147,7 @@ impl Default for TextStyle {
             color: black(),
             font_family: "Helvetica".into(), // todo!("Get a font we know exists on the system")
             font_features: FontFeatures::default(),
-            font_size: rems(1.),
+            font_size: rems(1.).into(),
             line_height: phi(),
             font_weight: FontWeight::default(),
             font_style: FontStyle::default(),

crates/gpui2/src/styled.rs πŸ”—

@@ -1,7 +1,7 @@
 use crate::{
-    self as gpui, hsla, point, px, relative, rems, AlignItems, CursorStyle, DefiniteLength,
-    Display, Fill, FlexDirection, Hsla, JustifyContent, Length, Position, Rems, SharedString,
-    StyleRefinement, Visibility,
+    self as gpui, hsla, point, px, relative, rems, AbsoluteLength, AlignItems, CursorStyle,
+    DefiniteLength, Display, Fill, FlexDirection, Hsla, JustifyContent, Length, Position,
+    SharedString, StyleRefinement, Visibility,
 };
 use crate::{BoxShadow, TextStyleRefinement};
 use smallvec::smallvec;
@@ -433,7 +433,7 @@ pub trait Styled {
         self
     }
 
-    fn text_size(mut self, size: impl Into<Rems>) -> Self
+    fn text_size(mut self, size: impl Into<AbsoluteLength>) -> Self
     where
         Self: Sized,
     {
@@ -449,7 +449,7 @@ pub trait Styled {
     {
         self.text_style()
             .get_or_insert_with(Default::default)
-            .font_size = Some(rems(0.75));
+            .font_size = Some(rems(0.75).into());
         self
     }
 
@@ -459,7 +459,7 @@ pub trait Styled {
     {
         self.text_style()
             .get_or_insert_with(Default::default)
-            .font_size = Some(rems(0.875));
+            .font_size = Some(rems(0.875).into());
         self
     }
 
@@ -469,7 +469,7 @@ pub trait Styled {
     {
         self.text_style()
             .get_or_insert_with(Default::default)
-            .font_size = Some(rems(1.0));
+            .font_size = Some(rems(1.0).into());
         self
     }
 
@@ -479,7 +479,7 @@ pub trait Styled {
     {
         self.text_style()
             .get_or_insert_with(Default::default)
-            .font_size = Some(rems(1.125));
+            .font_size = Some(rems(1.125).into());
         self
     }
 
@@ -489,7 +489,7 @@ pub trait Styled {
     {
         self.text_style()
             .get_or_insert_with(Default::default)
-            .font_size = Some(rems(1.25));
+            .font_size = Some(rems(1.25).into());
         self
     }
 
@@ -499,7 +499,7 @@ pub trait Styled {
     {
         self.text_style()
             .get_or_insert_with(Default::default)
-            .font_size = Some(rems(1.5));
+            .font_size = Some(rems(1.5).into());
         self
     }
 
@@ -509,7 +509,7 @@ pub trait Styled {
     {
         self.text_style()
             .get_or_insert_with(Default::default)
-            .font_size = Some(rems(1.875));
+            .font_size = Some(rems(1.875).into());
         self
     }
 

crates/gpui2/src/text_system/line_layout.rs πŸ”—

@@ -82,18 +82,6 @@ impl LineLayout {
         self.width
     }
 
-    pub fn font_for_index(&self, index: usize) -> Option<FontId> {
-        for run in &self.runs {
-            for glyph in &run.glyphs {
-                if glyph.index >= index {
-                    return Some(run.font_id);
-                }
-            }
-        }
-
-        None
-    }
-
     fn compute_wrap_boundaries(
         &self,
         text: &str,

crates/theme2/src/colors.rs πŸ”—

@@ -21,6 +21,23 @@ pub struct PlayerColor {
 #[derive(Clone)]
 pub struct PlayerColors(pub Vec<PlayerColor>);
 
+impl PlayerColors {
+    pub fn local(&self) -> PlayerColor {
+        // todo!("use a valid color");
+        *self.0.first().unwrap()
+    }
+
+    pub fn absent(&self) -> PlayerColor {
+        // todo!("use a valid color");
+        *self.0.last().unwrap()
+    }
+
+    pub fn color_for_participant(&self, participant_index: u32) -> PlayerColor {
+        let len = self.0.len() - 1;
+        self.0[(participant_index as usize % len) + 1]
+    }
+}
+
 #[derive(Refineable, Clone, Debug)]
 #[refineable(debug)]
 pub struct StatusColors {
@@ -89,8 +106,17 @@ pub struct ThemeColors {
     pub tab_inactive_background: Hsla,
     pub tab_active_background: Hsla,
     pub editor_background: Hsla,
+    pub editor_gutter_background: Hsla,
     pub editor_subheader_background: Hsla,
-    pub editor_active_line: Hsla,
+    pub editor_active_line_background: Hsla,
+    pub editor_highlighted_line_background: Hsla,
+    pub editor_line_number: Hsla,
+    pub editor_active_line_number: Hsla,
+    pub editor_invisible: Hsla,
+    pub editor_wrap_guide: Hsla,
+    pub editor_active_wrap_guide: Hsla,
+    pub editor_document_highlight_read_background: Hsla,
+    pub editor_document_highlight_write_background: Hsla,
     pub terminal_background: Hsla,
     pub terminal_ansi_bright_black: Hsla,
     pub terminal_ansi_bright_red: Hsla,

crates/theme2/src/default_colors.rs πŸ”—

@@ -59,24 +59,24 @@ impl Default for PlayerColors {
     fn default() -> Self {
         Self(vec![
             PlayerColor {
-                cursor: hsla(0.0, 0.0, 0.0, 0.0),
-                background: hsla(0.0, 0.0, 0.0, 0.0),
-                selection: hsla(0.0, 0.0, 0.0, 0.0),
+                cursor: hsla(0.0, 0.0, 0.0, 1.0),
+                background: hsla(0.0, 0.0, 0.0, 1.0),
+                selection: hsla(0.0, 0.0, 0.0, 1.0),
             },
             PlayerColor {
-                cursor: hsla(0.0, 0.0, 0.0, 0.0),
-                background: hsla(0.0, 0.0, 0.0, 0.0),
-                selection: hsla(0.0, 0.0, 0.0, 0.0),
+                cursor: hsla(0.0, 0.0, 0.0, 1.0),
+                background: hsla(0.0, 0.0, 0.0, 1.0),
+                selection: hsla(0.0, 0.0, 0.0, 1.0),
             },
             PlayerColor {
-                cursor: hsla(0.0, 0.0, 0.0, 0.0),
-                background: hsla(0.0, 0.0, 0.0, 0.0),
-                selection: hsla(0.0, 0.0, 0.0, 0.0),
+                cursor: hsla(0.0, 0.0, 0.0, 1.0),
+                background: hsla(0.0, 0.0, 0.0, 1.0),
+                selection: hsla(0.0, 0.0, 0.0, 1.0),
             },
             PlayerColor {
-                cursor: hsla(0.0, 0.0, 0.0, 0.0),
-                background: hsla(0.0, 0.0, 0.0, 0.0),
-                selection: hsla(0.0, 0.0, 0.0, 0.0),
+                cursor: hsla(0.0, 0.0, 0.0, 1.0),
+                background: hsla(0.0, 0.0, 0.0, 1.0),
+                selection: hsla(0.0, 0.0, 0.0, 1.0),
             },
         ])
     }
@@ -240,8 +240,17 @@ impl ThemeColors {
             tab_active_background: neutral().light().step_1(),
             tab_inactive_background: neutral().light().step_2(),
             editor_background: neutral().light().step_1(),
+            editor_gutter_background: neutral().light().step_1(), // todo!("pick the right colors")
             editor_subheader_background: neutral().light().step_2(),
-            editor_active_line: neutral().light_alpha().step_3(),
+            editor_active_line_background: neutral().light_alpha().step_3(),
+            editor_line_number: neutral().light_alpha().step_3(), // todo!("pick the right colors")
+            editor_active_line_number: neutral().light_alpha().step_3(), // todo!("pick the right colors")
+            editor_highlighted_line_background: neutral().light_alpha().step_4(), // todo!("pick the right colors")
+            editor_invisible: neutral().light_alpha().step_4(), // todo!("pick the right colors")
+            editor_wrap_guide: neutral().light_alpha().step_4(), // todo!("pick the right colors")
+            editor_active_wrap_guide: neutral().light_alpha().step_4(), // todo!("pick the right colors")
+            editor_document_highlight_read_background: neutral().light_alpha().step_4(), // todo!("pick the right colors")
+            editor_document_highlight_write_background: neutral().light_alpha().step_4(), // todo!("pick the right colors")
             terminal_background: neutral().light().step_1(),
             terminal_ansi_black: black().light().step_12(),
             terminal_ansi_red: red().light().step_11(),
@@ -304,8 +313,17 @@ impl ThemeColors {
             tab_active_background: neutral().dark().step_1(),
             tab_inactive_background: neutral().dark().step_2(),
             editor_background: neutral().dark().step_1(),
+            editor_gutter_background: neutral().dark().step_1(), // todo!("pick the right colors")
             editor_subheader_background: neutral().dark().step_2(),
-            editor_active_line: neutral().dark_alpha().step_3(),
+            editor_active_line_background: neutral().dark_alpha().step_3(),
+            editor_line_number: neutral().dark_alpha().step_3(), // todo!("pick the right colors")
+            editor_active_line_number: neutral().dark_alpha().step_3(), // todo!("pick the right colors")
+            editor_highlighted_line_background: neutral().dark_alpha().step_4(), // todo!("pick the right colors")
+            editor_invisible: neutral().dark_alpha().step_4(), // todo!("pick the right colors")
+            editor_wrap_guide: neutral().dark_alpha().step_4(), // todo!("pick the right colors")
+            editor_active_wrap_guide: neutral().dark_alpha().step_4(), // todo!("pick the right colors")
+            editor_document_highlight_read_background: neutral().dark_alpha().step_4(), // todo!("pick the right colors")
+            editor_document_highlight_write_background: neutral().dark_alpha().step_4(), // todo!("pick the right colors")
             terminal_background: neutral().dark().step_1(),
             terminal_ansi_black: black().dark().step_12(),
             terminal_ansi_red: red().dark().step_11(),

crates/theme2/src/registry.rs πŸ”—

@@ -1,4 +1,4 @@
-use crate::{all_imported_themes, zed_pro_family, ThemeFamily, ThemeVariant};
+use crate::{zed_pro_family, ThemeFamily, ThemeVariant};
 use anyhow::{anyhow, Result};
 use gpui::SharedString;
 use std::{collections::HashMap, sync::Arc};
@@ -42,10 +42,8 @@ impl Default for ThemeRegistry {
             themes: HashMap::default(),
         };
 
-        let mut all_themes = vec![zed_pro_family()];
-        all_themes.extend(all_imported_themes());
-
-        this.insert_theme_families(all_themes);
+        this.insert_theme_families([zed_pro_family()]);
+        this.insert_theme_families(crate::all_imported_themes());
 
         this
     }

crates/theme2/src/theme2.rs πŸ”—

@@ -7,6 +7,8 @@ mod settings;
 mod syntax;
 mod themes;
 
+use std::sync::Arc;
+
 use ::settings::Settings;
 pub use colors::*;
 pub use default_colors::*;
@@ -31,11 +33,11 @@ pub fn init(cx: &mut AppContext) {
 }
 
 pub trait ActiveTheme {
-    fn theme(&self) -> &ThemeVariant;
+    fn theme(&self) -> &Arc<ThemeVariant>;
 }
 
 impl ActiveTheme for AppContext {
-    fn theme(&self) -> &ThemeVariant {
+    fn theme(&self) -> &Arc<ThemeVariant> {
         &ThemeSettings::get_global(self).active_theme
     }
 }
@@ -58,6 +60,12 @@ pub struct ThemeVariant {
 }
 
 impl ThemeVariant {
+    /// Returns the [`ThemeColors`] for the theme.
+    #[inline(always)]
+    pub fn players(&self) -> &PlayerColors {
+        &self.styles.player
+    }
+
     /// Returns the [`ThemeColors`] for the theme.
     #[inline(always)]
     pub fn colors(&self) -> &ThemeColors {

crates/theme2/src/themes/andromeda.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn andromeda() -> ThemeFamily {
     ThemeFamily {
-        id: "192bb9a2-a028-4c9a-b713-4c92330b3fab".into(),
+        id: "ecd46547-a042-424d-99ca-5f56c060f798".into(),
         name: "Andromeda".into(),
         author: "Eliver Lara (EliverLara)".into(),
         themes: vec![
             ThemeVariant {
-                id: "a3aaa73f-f225-41bd-8d52-77ca1df0b7f7".into(),
+                id: "3bfb3b6e-365a-4cd2-9a80-2d2c81434729".into(),
                 name: "Andromeda".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn andromeda() -> ThemeFamily {
                         border: rgba(0x1b1d23ff).into(),
                         border_variant: rgba(0x1b1d23ff).into(),
                         border_focused: rgba(0x1b1d23ff).into(),
-                        border_disabled: rgba(0x1b1d23ff).into(),
                         border_selected: rgba(0x1b1d23ff).into(),
                         border_transparent: rgba(0x1b1d23ff).into(),
+                        border_disabled: rgba(0x1b1d23ff).into(),
                         elevated_surface_background: rgba(0x23262eff).into(),
                         surface_background: rgba(0x23262eff).into(),
                         background: rgba(0x23262eff).into(),
@@ -61,8 +61,17 @@ pub fn andromeda() -> ThemeFamily {
                         tab_inactive_background: rgba(0x23262eff).into(),
                         tab_active_background: rgba(0x23262eff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x000000e6).into(),
                         terminal_ansi_bright_red: rgba(0xee5d42ff).into(),
@@ -104,24 +113,24 @@ pub fn andromeda() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn andromeda() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "91a17b19-1e74-487e-b0a0-56e2e5360ab8".into(),
+                id: "7bc92ac8-152c-46d5-b346-df68e4db2e7c".into(),
                 name: "Andromeda Bordered".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn andromeda() -> ThemeFamily {
                         border: rgba(0x1b1d23ff).into(),
                         border_variant: rgba(0x1b1d23ff).into(),
                         border_focused: rgba(0x1b1d23ff).into(),
-                        border_disabled: rgba(0x1b1d23ff).into(),
                         border_selected: rgba(0x1b1d23ff).into(),
                         border_transparent: rgba(0x1b1d23ff).into(),
+                        border_disabled: rgba(0x1b1d23ff).into(),
                         elevated_surface_background: rgba(0x23262eff).into(),
                         surface_background: rgba(0x23262eff).into(),
                         background: rgba(0x262933ff).into(),
@@ -219,8 +228,17 @@ pub fn andromeda() -> ThemeFamily {
                         tab_inactive_background: rgba(0x23262eff).into(),
                         tab_active_background: rgba(0x262933ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x000000e6).into(),
                         terminal_ansi_bright_red: rgba(0xee5d42ff).into(),
@@ -262,24 +280,24 @@ pub fn andromeda() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/ayu.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn ayu() -> ThemeFamily {
     ThemeFamily {
-        id: "5ace5bd5-0231-4f26-a69f-40a96dd4163e".into(),
+        id: "4faecf44-837e-4034-9197-7da909668498".into(),
         name: "Ayu".into(),
         author: "dempfi (Ike Ku)".into(),
         themes: vec![
             ThemeVariant {
-                id: "7781d65c-4575-421d-af3c-061ab0b0478a".into(),
+                id: "733aeb9b-98fd-4492-984e-d71540daf72e".into(),
                 name: "Ayu Light".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn ayu() -> ThemeFamily {
                         border: rgba(0x6b7d8f1f).into(),
                         border_variant: rgba(0x6b7d8f1f).into(),
                         border_focused: rgba(0x6b7d8f1f).into(),
-                        border_disabled: rgba(0x6b7d8f1f).into(),
                         border_selected: rgba(0x6b7d8f1f).into(),
                         border_transparent: rgba(0x6b7d8f1f).into(),
+                        border_disabled: rgba(0x6b7d8f1f).into(),
                         elevated_surface_background: rgba(0xf8f9faff).into(),
                         surface_background: rgba(0xf8f9faff).into(),
                         background: rgba(0xf8f9faff).into(),
@@ -61,8 +61,17 @@ pub fn ayu() -> ThemeFamily {
                         tab_inactive_background: rgba(0xf8f9faff).into(),
                         tab_active_background: rgba(0xf8f9faff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xf8f9faff).into(),
                         terminal_ansi_bright_black: rgba(0x686868ff).into(),
                         terminal_ansi_bright_red: rgba(0xef7070ff).into(),
@@ -104,24 +113,24 @@ pub fn ayu() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn ayu() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "68066666-5e56-4937-9434-510ffd0fe05f".into(),
+                id: "50f68427-2e1d-4bf1-981a-d08c6b38e846".into(),
                 name: "Ayu Mirage".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn ayu() -> ThemeFamily {
                         border: rgba(0x171a24ff).into(),
                         border_variant: rgba(0x171a24ff).into(),
                         border_focused: rgba(0x171a24ff).into(),
-                        border_disabled: rgba(0x171a24ff).into(),
                         border_selected: rgba(0x171a24ff).into(),
                         border_transparent: rgba(0x171a24ff).into(),
+                        border_disabled: rgba(0x171a24ff).into(),
                         elevated_surface_background: rgba(0x1f2430ff).into(),
                         surface_background: rgba(0x1f2430ff).into(),
                         background: rgba(0x1f2430ff).into(),
@@ -219,8 +228,17 @@ pub fn ayu() -> ThemeFamily {
                         tab_inactive_background: rgba(0x1f2430ff).into(),
                         tab_active_background: rgba(0x1f2430ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x1f2430ff).into(),
                         terminal_ansi_bright_black: rgba(0x686868ff).into(),
                         terminal_ansi_bright_red: rgba(0xf18678ff).into(),
@@ -262,24 +280,24 @@ pub fn ayu() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -328,7 +346,7 @@ pub fn ayu() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "d4f949b8-e5b9-4337-a52e-2ed1752a6c4f".into(),
+                id: "22d8dede-57da-46e1-946a-16876679b4d2".into(),
                 name: "Ayu Dark".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -342,9 +360,9 @@ pub fn ayu() -> ThemeFamily {
                         border: rgba(0x1e232bff).into(),
                         border_variant: rgba(0x1e232bff).into(),
                         border_focused: rgba(0x1e232bff).into(),
-                        border_disabled: rgba(0x1e232bff).into(),
                         border_selected: rgba(0x1e232bff).into(),
                         border_transparent: rgba(0x1e232bff).into(),
+                        border_disabled: rgba(0x1e232bff).into(),
                         elevated_surface_background: rgba(0x0b0e14ff).into(),
                         surface_background: rgba(0x0b0e14ff).into(),
                         background: rgba(0x0b0e14ff).into(),
@@ -377,8 +395,17 @@ pub fn ayu() -> ThemeFamily {
                         tab_inactive_background: rgba(0x0b0e14ff).into(),
                         tab_active_background: rgba(0x0b0e14ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x0b0e14ff).into(),
                         terminal_ansi_bright_black: rgba(0x686868ff).into(),
                         terminal_ansi_bright_red: rgba(0xef7077ff).into(),
@@ -420,24 +447,24 @@ pub fn ayu() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/dracula.rs πŸ”—

@@ -7,11 +7,11 @@ use crate::{
 
 pub fn dracula() -> ThemeFamily {
     ThemeFamily {
-        id: "20b9a8c0-0b74-483b-bed2-be7a053e1321".into(),
+        id: "0abb0e55-f034-45d9-a84d-e880dfd65711".into(),
         name: "Dracula".into(),
         author: "Zeno Rocha".into(),
         themes: vec![ThemeVariant {
-            id: "02f5624f-9b0a-48e0-8897-4557adc8f104".into(),
+            id: "d20497ef-85be-4ea2-9070-a182d03aac73".into(),
             name: "Dracula".into(),
             appearance: Appearance::Dark,
             styles: ThemeStyles {
@@ -25,9 +25,9 @@ pub fn dracula() -> ThemeFamily {
                     border: rgba(0xbd93f9ff).into(),
                     border_variant: rgba(0xbd93f9ff).into(),
                     border_focused: rgba(0xbd93f9ff).into(),
-                    border_disabled: rgba(0xbd93f9ff).into(),
                     border_selected: rgba(0xbd93f9ff).into(),
                     border_transparent: rgba(0xbd93f9ff).into(),
+                    border_disabled: rgba(0xbd93f9ff).into(),
                     elevated_surface_background: rgba(0x282a35ff).into(),
                     surface_background: rgba(0x282a35ff).into(),
                     background: rgba(0x282a35ff).into(),
@@ -60,8 +60,17 @@ pub fn dracula() -> ThemeFamily {
                     tab_inactive_background: rgba(0x21222cff).into(),
                     tab_active_background: rgba(0x282a35ff).into(),
                     editor_background: rgba(0x111113ff).into(),
+                    editor_gutter_background: rgba(0x111113ff).into(),
                     editor_subheader_background: rgba(0x18191bff).into(),
-                    editor_active_line: rgba(0xddeaf814).into(),
+                    editor_active_line_background: rgba(0xddeaf814).into(),
+                    editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                    editor_line_number: rgba(0xddeaf814).into(),
+                    editor_active_line_number: rgba(0xddeaf814).into(),
+                    editor_invisible: rgba(0xd3edf81d).into(),
+                    editor_wrap_guide: rgba(0xd3edf81d).into(),
+                    editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                    editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                    editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                     terminal_background: rgba(0x282a35ff).into(),
                     terminal_ansi_bright_black: rgba(0x6272a4ff).into(),
                     terminal_ansi_bright_red: rgba(0xff6d6dff).into(),
@@ -103,24 +112,24 @@ pub fn dracula() -> ThemeFamily {
                 },
                 player: PlayerColors(vec![
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                 ]),
                 syntax: SyntaxTheme {

crates/theme2/src/themes/gruvbox.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn gruvbox() -> ThemeFamily {
     ThemeFamily {
-        id: "c0b7f0e7-f261-4a33-a2bf-baf2e140aac4".into(),
+        id: "000a3e50-ccf1-430d-84e4-910583bd1064".into(),
         name: "Gruvbox".into(),
         author: "morhetz".into(),
         themes: vec![
             ThemeVariant {
-                id: "fb9f8f64-372b-4fda-8dbd-d610c97a9691".into(),
+                id: "0db938b2-2267-453b-af84-f82c5f3400e7".into(),
                 name: "Gruvbox Dark Hard".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn gruvbox() -> ThemeFamily {
                         border: rgba(0x3c3836ff).into(),
                         border_variant: rgba(0x3c3836ff).into(),
                         border_focused: rgba(0x3c3836ff).into(),
-                        border_disabled: rgba(0x3c3836ff).into(),
                         border_selected: rgba(0x3c3836ff).into(),
                         border_transparent: rgba(0x3c3836ff).into(),
+                        border_disabled: rgba(0x3c3836ff).into(),
                         elevated_surface_background: rgba(0x18191bff).into(),
                         surface_background: rgba(0x18191bff).into(),
                         background: rgba(0x1d2021ff).into(),
@@ -61,8 +61,17 @@ pub fn gruvbox() -> ThemeFamily {
                         tab_inactive_background: rgba(0x1d2021ff).into(),
                         tab_active_background: rgba(0x32302fff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x1d2021ff).into(),
                         terminal_ansi_bright_black: rgba(0x928374ff).into(),
                         terminal_ansi_bright_red: rgba(0xfb4833ff).into(),
@@ -104,24 +113,24 @@ pub fn gruvbox() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn gruvbox() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "72f0ea45-33bc-49d8-9f52-87540f858fb4".into(),
+                id: "8e1a1896-ed0f-40be-b127-6c389eacc9f1".into(),
                 name: "Gruvbox Dark Medium".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn gruvbox() -> ThemeFamily {
                         border: rgba(0x3c3836ff).into(),
                         border_variant: rgba(0x3c3836ff).into(),
                         border_focused: rgba(0x3c3836ff).into(),
-                        border_disabled: rgba(0x3c3836ff).into(),
                         border_selected: rgba(0x3c3836ff).into(),
                         border_transparent: rgba(0x3c3836ff).into(),
+                        border_disabled: rgba(0x3c3836ff).into(),
                         elevated_surface_background: rgba(0x18191bff).into(),
                         surface_background: rgba(0x18191bff).into(),
                         background: rgba(0x282828ff).into(),
@@ -219,8 +228,17 @@ pub fn gruvbox() -> ThemeFamily {
                         tab_inactive_background: rgba(0x282828ff).into(),
                         tab_active_background: rgba(0x3c3836ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x282828ff).into(),
                         terminal_ansi_bright_black: rgba(0x928374ff).into(),
                         terminal_ansi_bright_red: rgba(0xfb4833ff).into(),
@@ -262,24 +280,24 @@ pub fn gruvbox() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -328,7 +346,7 @@ pub fn gruvbox() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "5ea1cdf8-6ed0-4e54-b44a-14c6634701cf".into(),
+                id: "94410e6f-f4c4-4669-bb4d-5a20b4e4b1f3".into(),
                 name: "Gruvbox Dark Soft".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -342,9 +360,9 @@ pub fn gruvbox() -> ThemeFamily {
                         border: rgba(0x3c3836ff).into(),
                         border_variant: rgba(0x3c3836ff).into(),
                         border_focused: rgba(0x3c3836ff).into(),
-                        border_disabled: rgba(0x3c3836ff).into(),
                         border_selected: rgba(0x3c3836ff).into(),
                         border_transparent: rgba(0x3c3836ff).into(),
+                        border_disabled: rgba(0x3c3836ff).into(),
                         elevated_surface_background: rgba(0x18191bff).into(),
                         surface_background: rgba(0x18191bff).into(),
                         background: rgba(0x32302fff).into(),
@@ -377,8 +395,17 @@ pub fn gruvbox() -> ThemeFamily {
                         tab_inactive_background: rgba(0x32302fff).into(),
                         tab_active_background: rgba(0x504945ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x32302fff).into(),
                         terminal_ansi_bright_black: rgba(0x928374ff).into(),
                         terminal_ansi_bright_red: rgba(0xfb4833ff).into(),
@@ -420,24 +447,24 @@ pub fn gruvbox() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -486,7 +513,7 @@ pub fn gruvbox() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "b0c9082f-00c8-4a02-a4de-9fd7af97c7f2".into(),
+                id: "e4a58582-478a-4934-ad73-135e23a0d66e".into(),
                 name: "Gruvbox Light Hard".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -500,9 +527,9 @@ pub fn gruvbox() -> ThemeFamily {
                         border: rgba(0xebdbb2ff).into(),
                         border_variant: rgba(0xebdbb2ff).into(),
                         border_focused: rgba(0xebdbb2ff).into(),
-                        border_disabled: rgba(0xebdbb2ff).into(),
                         border_selected: rgba(0xebdbb2ff).into(),
                         border_transparent: rgba(0xebdbb2ff).into(),
+                        border_disabled: rgba(0xebdbb2ff).into(),
                         elevated_surface_background: rgba(0xf9f9fbff).into(),
                         surface_background: rgba(0xf9f9fbff).into(),
                         background: rgba(0xf9f5d7ff).into(),
@@ -535,8 +562,17 @@ pub fn gruvbox() -> ThemeFamily {
                         tab_inactive_background: rgba(0xf9f5d7ff).into(),
                         tab_active_background: rgba(0xf2e5bcff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xf9f5d7ff).into(),
                         terminal_ansi_bright_black: rgba(0x928374ff).into(),
                         terminal_ansi_bright_red: rgba(0x9d0006ff).into(),
@@ -578,24 +614,24 @@ pub fn gruvbox() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -644,7 +680,7 @@ pub fn gruvbox() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "172c281c-ff0a-496e-8794-880e2fc3aa49".into(),
+                id: "0e875280-93fa-4c76-8874-f858c7d985c1".into(),
                 name: "Gruvbox Light Medium".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -658,9 +694,9 @@ pub fn gruvbox() -> ThemeFamily {
                         border: rgba(0xebdbb2ff).into(),
                         border_variant: rgba(0xebdbb2ff).into(),
                         border_focused: rgba(0xebdbb2ff).into(),
-                        border_disabled: rgba(0xebdbb2ff).into(),
                         border_selected: rgba(0xebdbb2ff).into(),
                         border_transparent: rgba(0xebdbb2ff).into(),
+                        border_disabled: rgba(0xebdbb2ff).into(),
                         elevated_surface_background: rgba(0xf9f9fbff).into(),
                         surface_background: rgba(0xf9f9fbff).into(),
                         background: rgba(0xfbf1c7ff).into(),
@@ -693,8 +729,17 @@ pub fn gruvbox() -> ThemeFamily {
                         tab_inactive_background: rgba(0xfbf1c7ff).into(),
                         tab_active_background: rgba(0xebdbb2ff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xfbf1c7ff).into(),
                         terminal_ansi_bright_black: rgba(0x928374ff).into(),
                         terminal_ansi_bright_red: rgba(0x9d0006ff).into(),
@@ -736,24 +781,24 @@ pub fn gruvbox() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -802,7 +847,7 @@ pub fn gruvbox() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "b94f3305-b755-44f2-948c-cfd8c9d3158f".into(),
+                id: "914dbe6f-bc0f-4e6f-8d8c-5f4cabc1ca2d".into(),
                 name: "Gruvbox Light Soft".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -816,9 +861,9 @@ pub fn gruvbox() -> ThemeFamily {
                         border: rgba(0xebdbb2ff).into(),
                         border_variant: rgba(0xebdbb2ff).into(),
                         border_focused: rgba(0xebdbb2ff).into(),
-                        border_disabled: rgba(0xebdbb2ff).into(),
                         border_selected: rgba(0xebdbb2ff).into(),
                         border_transparent: rgba(0xebdbb2ff).into(),
+                        border_disabled: rgba(0xebdbb2ff).into(),
                         elevated_surface_background: rgba(0xf9f9fbff).into(),
                         surface_background: rgba(0xf9f9fbff).into(),
                         background: rgba(0xf2e5bcff).into(),
@@ -851,8 +896,17 @@ pub fn gruvbox() -> ThemeFamily {
                         tab_inactive_background: rgba(0xf2e5bcff).into(),
                         tab_active_background: rgba(0xd5c4a1ff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xf2e5bcff).into(),
                         terminal_ansi_bright_black: rgba(0x928374ff).into(),
                         terminal_ansi_bright_red: rgba(0x9d0006ff).into(),
@@ -894,24 +948,24 @@ pub fn gruvbox() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/night_owl.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn night_owl() -> ThemeFamily {
     ThemeFamily {
-        id: "b6469599-df68-4604-be9d-44f63d877d53".into(),
+        id: "19498197-1091-409d-b37a-a282998e5c31".into(),
         name: "Night Owl".into(),
         author: "Sarah Drasner (sdras)".into(),
         themes: vec![
             ThemeVariant {
-                id: "2a04e5fa-e266-475b-b965-3d92efe77ad9".into(),
+                id: "e5de91ed-fc95-46fb-a60b-ebd0602d04c7".into(),
                 name: "Night Owl".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn night_owl() -> ThemeFamily {
                         border: rgba(0x5f7e97ff).into(),
                         border_variant: rgba(0x5f7e97ff).into(),
                         border_focused: rgba(0x5f7e97ff).into(),
-                        border_disabled: rgba(0x5f7e97ff).into(),
                         border_selected: rgba(0x5f7e97ff).into(),
                         border_transparent: rgba(0x5f7e97ff).into(),
+                        border_disabled: rgba(0x5f7e97ff).into(),
                         elevated_surface_background: rgba(0x011526ff).into(),
                         surface_background: rgba(0x011526ff).into(),
                         background: rgba(0x011526ff).into(),
@@ -61,8 +61,17 @@ pub fn night_owl() -> ThemeFamily {
                         tab_inactive_background: rgba(0x01101cff).into(),
                         tab_active_background: rgba(0x0a2842ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x575656ff).into(),
                         terminal_ansi_bright_red: rgba(0xef524fff).into(),
@@ -104,24 +113,24 @@ pub fn night_owl() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn night_owl() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "91901d29-1c1f-49ef-ac69-c25639425f7c".into(),
+                id: "998fc053-40c1-4a32-a31f-a17c9c07949a".into(),
                 name: "Night Owl Light".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn night_owl() -> ThemeFamily {
                         border: rgba(0xd9d9d9ff).into(),
                         border_variant: rgba(0xd9d9d9ff).into(),
                         border_focused: rgba(0xd9d9d9ff).into(),
-                        border_disabled: rgba(0xd9d9d9ff).into(),
                         border_selected: rgba(0xd9d9d9ff).into(),
                         border_transparent: rgba(0xd9d9d9ff).into(),
+                        border_disabled: rgba(0xd9d9d9ff).into(),
                         elevated_surface_background: rgba(0xf0f0f0ff).into(),
                         surface_background: rgba(0xf0f0f0ff).into(),
                         background: rgba(0xfbfbfbff).into(),
@@ -219,8 +228,17 @@ pub fn night_owl() -> ThemeFamily {
                         tab_inactive_background: rgba(0xf0f0f0ff).into(),
                         tab_active_background: rgba(0xf6f6f6ff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xf6f6f6ff).into(),
                         terminal_ansi_bright_black: rgba(0x403f53ff).into(),
                         terminal_ansi_bright_red: rgba(0xde3c3aff).into(),
@@ -262,24 +280,24 @@ pub fn night_owl() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/nord.rs πŸ”—

@@ -7,11 +7,11 @@ use crate::{
 
 pub fn nord() -> ThemeFamily {
     ThemeFamily {
-        id: "dcd03133-f540-47e7-9360-91bb1c94d16e".into(),
+        id: "3295b94b-731f-41a8-8d5e-ad02638f8e0d".into(),
         name: "Nord".into(),
         author: "Sven Greb (svengreb)".into(),
         themes: vec![ThemeVariant {
-            id: "ed7e8c08-321a-41f0-bd22-ca92c0b42e0e".into(),
+            id: "dfdfd9f6-bc57-46dd-b919-42b18df35bdd".into(),
             name: "Nord".into(),
             appearance: Appearance::Dark,
             styles: ThemeStyles {
@@ -25,9 +25,9 @@ pub fn nord() -> ThemeFamily {
                     border: rgba(0x3b4252ff).into(),
                     border_variant: rgba(0x3b4252ff).into(),
                     border_focused: rgba(0x3b4252ff).into(),
-                    border_disabled: rgba(0x3b4252ff).into(),
                     border_selected: rgba(0x3b4252ff).into(),
                     border_transparent: rgba(0x3b4252ff).into(),
+                    border_disabled: rgba(0x3b4252ff).into(),
                     elevated_surface_background: rgba(0x2e3440ff).into(),
                     surface_background: rgba(0x2e3440ff).into(),
                     background: rgba(0x2e3440ff).into(),
@@ -60,8 +60,17 @@ pub fn nord() -> ThemeFamily {
                     tab_inactive_background: rgba(0x2e3440ff).into(),
                     tab_active_background: rgba(0x3b4252ff).into(),
                     editor_background: rgba(0x111113ff).into(),
+                    editor_gutter_background: rgba(0x111113ff).into(),
                     editor_subheader_background: rgba(0x18191bff).into(),
-                    editor_active_line: rgba(0xddeaf814).into(),
+                    editor_active_line_background: rgba(0xddeaf814).into(),
+                    editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                    editor_line_number: rgba(0xddeaf814).into(),
+                    editor_active_line_number: rgba(0xddeaf814).into(),
+                    editor_invisible: rgba(0xd3edf81d).into(),
+                    editor_wrap_guide: rgba(0xd3edf81d).into(),
+                    editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                    editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                    editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                     terminal_background: rgba(0x2e3440ff).into(),
                     terminal_ansi_bright_black: rgba(0x4c566aff).into(),
                     terminal_ansi_bright_red: rgba(0xbf616aff).into(),
@@ -103,24 +112,24 @@ pub fn nord() -> ThemeFamily {
                 },
                 player: PlayerColors(vec![
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                 ]),
                 syntax: SyntaxTheme {

crates/theme2/src/themes/notctis.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn notctis() -> ThemeFamily {
     ThemeFamily {
-        id: "077650e4-c11f-4cb5-96ec-73bc74923e95".into(),
+        id: "7fbf6904-517c-42e1-8eb3-a64b1e9218b9".into(),
         name: "Notctis".into(),
         author: "Liviu Schera (liviuschera)".into(),
         themes: vec![
             ThemeVariant {
-                id: "47135df9-e9b5-480c-a71b-c85052b8ff93".into(),
+                id: "2dc5fee8-30ff-4a50-bfae-c13bd19c9f89".into(),
                 name: "Noctis Azureus".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x1579b6ff).into(),
                         border_variant: rgba(0x1579b6ff).into(),
                         border_focused: rgba(0x1579b6ff).into(),
-                        border_disabled: rgba(0x1579b6ff).into(),
                         border_selected: rgba(0x1579b6ff).into(),
                         border_transparent: rgba(0x1579b6ff).into(),
+                        border_disabled: rgba(0x1579b6ff).into(),
                         elevated_surface_background: rgba(0x051b28ff).into(),
                         surface_background: rgba(0x051b28ff).into(),
                         background: rgba(0x07263aff).into(),
@@ -61,8 +61,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x08324eff).into(),
                         tab_active_background: rgba(0x07263aff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x051b28ff).into(),
                         terminal_ansi_bright_black: rgba(0x475e6cff).into(),
                         terminal_ansi_bright_red: rgba(0xe97749ff).into(),
@@ -104,24 +113,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "5a3842b1-2273-47ce-ab82-4179842362b1".into(),
+                id: "ba4f5a34-987a-4e2c-939c-7f1b02d0e432".into(),
                 name: "Noctis Bordo".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x997582ff).into(),
                         border_variant: rgba(0x997582ff).into(),
                         border_focused: rgba(0x997582ff).into(),
-                        border_disabled: rgba(0x997582ff).into(),
                         border_selected: rgba(0x997582ff).into(),
                         border_transparent: rgba(0x997582ff).into(),
+                        border_disabled: rgba(0x997582ff).into(),
                         elevated_surface_background: rgba(0x272022ff).into(),
                         surface_background: rgba(0x272022ff).into(),
                         background: rgba(0x322a2dff).into(),
@@ -219,8 +228,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x413036ff).into(),
                         tab_active_background: rgba(0x322a2dff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x272022ff).into(),
                         terminal_ansi_bright_black: rgba(0x69545bff).into(),
                         terminal_ansi_bright_red: rgba(0xe97749ff).into(),
@@ -262,24 +280,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -328,7 +346,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "a83c02b3-23f3-496b-8644-57df3314601e".into(),
+                id: "a2e4f327-82e8-41c1-a66f-bc7f27419c2e".into(),
                 name: "Noctus Hibernus".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -342,9 +360,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x00c6e0ff).into(),
                         border_variant: rgba(0x00c6e0ff).into(),
                         border_focused: rgba(0x00c6e0ff).into(),
-                        border_disabled: rgba(0x00c6e0ff).into(),
                         border_selected: rgba(0x00c6e0ff).into(),
                         border_transparent: rgba(0x00c6e0ff).into(),
+                        border_disabled: rgba(0x00c6e0ff).into(),
                         elevated_surface_background: rgba(0xe1eeefff).into(),
                         surface_background: rgba(0xe1eeefff).into(),
                         background: rgba(0xf4f6f6ff).into(),
@@ -377,8 +395,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0xcaedf2ff).into(),
                         tab_active_background: rgba(0xf4f6f6ff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xe1eeefff).into(),
                         terminal_ansi_bright_black: rgba(0x004d57ff).into(),
                         terminal_ansi_bright_red: rgba(0xff3f00ff).into(),
@@ -420,24 +447,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -486,7 +513,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "bda85aea-2260-455a-959a-c03b0a62b8f4".into(),
+                id: "2fde44fb-e5b2-4cc2-962f-f1c77a4eb12a".into(),
                 name: "Noctis Lilac".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -500,9 +527,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0xaea4f4ff).into(),
                         border_variant: rgba(0xaea4f4ff).into(),
                         border_focused: rgba(0xaea4f4ff).into(),
-                        border_disabled: rgba(0xaea4f4ff).into(),
                         border_selected: rgba(0xaea4f4ff).into(),
                         border_transparent: rgba(0xaea4f4ff).into(),
+                        border_disabled: rgba(0xaea4f4ff).into(),
                         elevated_surface_background: rgba(0xe9e7f3ff).into(),
                         surface_background: rgba(0xe9e7f3ff).into(),
                         background: rgba(0xf2f1f8ff).into(),
@@ -535,8 +562,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0xe2dff6ff).into(),
                         tab_active_background: rgba(0xf2f1f8ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0xe9e7f3ff).into(),
                         terminal_ansi_bright_black: rgba(0x0f0080ff).into(),
                         terminal_ansi_bright_red: rgba(0xff3f00ff).into(),
@@ -578,24 +614,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -644,7 +680,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "7720f487-6b09-4bb6-9add-272b030c013f".into(),
+                id: "2b89f218-c238-4905-9578-674d6995d2e0".into(),
                 name: "Noctis Lux".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -658,9 +694,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x00c6e0ff).into(),
                         border_variant: rgba(0x00c6e0ff).into(),
                         border_focused: rgba(0x00c6e0ff).into(),
-                        border_disabled: rgba(0x00c6e0ff).into(),
                         border_selected: rgba(0x00c6e0ff).into(),
                         border_transparent: rgba(0x00c6e0ff).into(),
+                        border_disabled: rgba(0x00c6e0ff).into(),
                         elevated_surface_background: rgba(0xf6eddaff).into(),
                         surface_background: rgba(0xf6eddaff).into(),
                         background: rgba(0xfef8ecff).into(),
@@ -693,8 +729,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0xf0e9d6ff).into(),
                         tab_active_background: rgba(0xfef8ecff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xf6eddaff).into(),
                         terminal_ansi_bright_black: rgba(0x004d57ff).into(),
                         terminal_ansi_bright_red: rgba(0xff3f00ff).into(),
@@ -736,24 +781,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -802,7 +847,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "51dfe842-b4e2-4d95-a306-8e579a3bb51c".into(),
+                id: "f88e2cd7-2415-4118-a638-5cfd3132ecf8".into(),
                 name: "Noctis Minimus".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -816,9 +861,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x496c83ff).into(),
                         border_variant: rgba(0x496c83ff).into(),
                         border_focused: rgba(0x496c83ff).into(),
-                        border_disabled: rgba(0x496c83ff).into(),
                         border_selected: rgba(0x496c83ff).into(),
                         border_transparent: rgba(0x496c83ff).into(),
+                        border_disabled: rgba(0x496c83ff).into(),
                         elevated_surface_background: rgba(0x0e1920ff).into(),
                         surface_background: rgba(0x0e1920ff).into(),
                         background: rgba(0x1b2932ff).into(),
@@ -851,8 +896,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x202d37ff).into(),
                         tab_active_background: rgba(0x1b2932ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x0e1920ff).into(),
                         terminal_ansi_bright_black: rgba(0x425866ff).into(),
                         terminal_ansi_bright_red: rgba(0xca8468ff).into(),
@@ -894,24 +948,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -960,7 +1014,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "75a67a53-afbe-4073-a7c0-85a40b56c2cc".into(),
+                id: "c4d43fc2-6166-47b7-8c5c-dd24afd4b735".into(),
                 name: "Noctis".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -974,9 +1028,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x0d6571ff).into(),
                         border_variant: rgba(0x0d6571ff).into(),
                         border_focused: rgba(0x0d6571ff).into(),
-                        border_disabled: rgba(0x0d6571ff).into(),
                         border_selected: rgba(0x0d6571ff).into(),
                         border_transparent: rgba(0x0d6571ff).into(),
+                        border_disabled: rgba(0x0d6571ff).into(),
                         elevated_surface_background: rgba(0x03181aff).into(),
                         surface_background: rgba(0x03181aff).into(),
                         background: rgba(0x052428ff).into(),
@@ -1009,8 +1063,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x052e32ff).into(),
                         tab_active_background: rgba(0x052428ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x03181aff).into(),
                         terminal_ansi_bright_black: rgba(0x47686cff).into(),
                         terminal_ansi_bright_red: rgba(0xe97749ff).into(),
@@ -1052,24 +1115,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -1118,7 +1181,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "0202afff-5703-473b-b6b6-e86ac3a70718".into(),
+                id: "7253a515-c612-403c-89de-5b62dc5cbac7".into(),
                 name: "Noctis Obscuro".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -1132,9 +1195,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x0d6571ff).into(),
                         border_variant: rgba(0x0d6571ff).into(),
                         border_focused: rgba(0x0d6571ff).into(),
-                        border_disabled: rgba(0x0d6571ff).into(),
                         border_selected: rgba(0x0d6571ff).into(),
                         border_transparent: rgba(0x0d6571ff).into(),
+                        border_disabled: rgba(0x0d6571ff).into(),
                         elevated_surface_background: rgba(0x020c0eff).into(),
                         surface_background: rgba(0x020c0eff).into(),
                         background: rgba(0x031316ff).into(),
@@ -1167,8 +1230,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x052e32ff).into(),
                         tab_active_background: rgba(0x031316ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x020c0eff).into(),
                         terminal_ansi_bright_black: rgba(0x47686cff).into(),
                         terminal_ansi_bright_red: rgba(0xe97749ff).into(),
@@ -1210,24 +1282,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -1276,7 +1348,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "213fd750-27ad-4762-8891-08282ed316c7".into(),
+                id: "b0f2d7b8-ac5f-466f-9bbf-e7cac242149c".into(),
                 name: "Noctis Sereno".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -1290,9 +1362,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x0d6571ff).into(),
                         border_variant: rgba(0x0d6571ff).into(),
                         border_focused: rgba(0x0d6571ff).into(),
-                        border_disabled: rgba(0x0d6571ff).into(),
                         border_selected: rgba(0x0d6571ff).into(),
                         border_transparent: rgba(0x0d6571ff).into(),
+                        border_disabled: rgba(0x0d6571ff).into(),
                         elevated_surface_background: rgba(0x020c0eff).into(),
                         surface_background: rgba(0x020c0eff).into(),
                         background: rgba(0x031316ff).into(),
@@ -1325,8 +1397,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x052e32ff).into(),
                         tab_active_background: rgba(0x031316ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x020c0eff).into(),
                         terminal_ansi_bright_black: rgba(0x47686cff).into(),
                         terminal_ansi_bright_red: rgba(0xe97749ff).into(),
@@ -1368,24 +1449,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -1434,7 +1515,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "0cc2c841-1c01-40a7-8396-1234dd077ede".into(),
+                id: "331ce3fd-8faf-4a46-ad89-2c678abc4cd3".into(),
                 name: "Noctis Uva".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -1448,9 +1529,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x6d66a7ff).into(),
                         border_variant: rgba(0x6d66a7ff).into(),
                         border_focused: rgba(0x6d66a7ff).into(),
-                        border_disabled: rgba(0x6d66a7ff).into(),
                         border_selected: rgba(0x6d66a7ff).into(),
                         border_transparent: rgba(0x6d66a7ff).into(),
+                        border_disabled: rgba(0x6d66a7ff).into(),
                         elevated_surface_background: rgba(0x1f1d30ff).into(),
                         surface_background: rgba(0x1f1d30ff).into(),
                         background: rgba(0x292640ff).into(),
@@ -1483,8 +1564,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x2f2c49ff).into(),
                         tab_active_background: rgba(0x292640ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x1f1d30ff).into(),
                         terminal_ansi_bright_black: rgba(0x504e65ff).into(),
                         terminal_ansi_bright_red: rgba(0xe97749ff).into(),
@@ -1526,24 +1616,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -1592,7 +1682,7 @@ pub fn notctis() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "090a97c7-ad25-4a35-96e6-2fce5e471e6b".into(),
+                id: "209964f1-6a61-4e40-a605-be245555c493".into(),
                 name: "Noctis Viola".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -1606,9 +1696,9 @@ pub fn notctis() -> ThemeFamily {
                         border: rgba(0x8666a7ff).into(),
                         border_variant: rgba(0x8666a7ff).into(),
                         border_focused: rgba(0x8666a7ff).into(),
-                        border_disabled: rgba(0x8666a7ff).into(),
                         border_selected: rgba(0x8666a7ff).into(),
                         border_transparent: rgba(0x8666a7ff).into(),
+                        border_disabled: rgba(0x8666a7ff).into(),
                         elevated_surface_background: rgba(0x291d35ff).into(),
                         surface_background: rgba(0x291d35ff).into(),
                         background: rgba(0x30243dff).into(),
@@ -1641,8 +1731,17 @@ pub fn notctis() -> ThemeFamily {
                         tab_inactive_background: rgba(0x3d2e4dff).into(),
                         tab_active_background: rgba(0x30243dff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x291d35ff).into(),
                         terminal_ansi_bright_black: rgba(0x594e65ff).into(),
                         terminal_ansi_bright_red: rgba(0xe97749ff).into(),
@@ -1684,24 +1783,24 @@ pub fn notctis() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/palenight.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn palenight() -> ThemeFamily {
     ThemeFamily {
-        id: "3187cd2f-29da-4bde-9621-83016df3b393".into(),
+        id: "16313d66-dab6-468a-82f6-e69759fdd8cf".into(),
         name: "Palenight".into(),
         author: "Olaolu Olawuyi (whizkydee)".into(),
         themes: vec![
             ThemeVariant {
-                id: "0eaa3098-3aa2-4b8e-b1df-92d9ebd9a0b8".into(),
+                id: "39fdf216-2c76-4b3d-b368-7c31f479d524".into(),
                 name: "Palenight".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn palenight() -> ThemeFamily {
                         border: rgba(0x282b3bff).into(),
                         border_variant: rgba(0x282b3bff).into(),
                         border_focused: rgba(0x282b3bff).into(),
-                        border_disabled: rgba(0x282b3bff).into(),
                         border_selected: rgba(0x282b3bff).into(),
                         border_transparent: rgba(0x282b3bff).into(),
+                        border_disabled: rgba(0x282b3bff).into(),
                         elevated_surface_background: rgba(0x292c3eff).into(),
                         surface_background: rgba(0x292c3eff).into(),
                         background: rgba(0x292c3eff).into(),
@@ -61,8 +61,17 @@ pub fn palenight() -> ThemeFamily {
                         tab_inactive_background: rgba(0x31364aff).into(),
                         tab_active_background: rgba(0x292c3eff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x676e95ff).into(),
                         terminal_ansi_bright_red: rgba(0xff5571ff).into(),
@@ -104,24 +113,24 @@ pub fn palenight() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn palenight() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "b6a27c72-c5b1-431b-8bfe-29e33dbcb337".into(),
+                id: "5ff8120f-37e9-4ad3-8bd0-c3e449ff1aa1".into(),
                 name: "Palenight Operator".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn palenight() -> ThemeFamily {
                         border: rgba(0x282b3bff).into(),
                         border_variant: rgba(0x282b3bff).into(),
                         border_focused: rgba(0x282b3bff).into(),
-                        border_disabled: rgba(0x282b3bff).into(),
                         border_selected: rgba(0x282b3bff).into(),
                         border_transparent: rgba(0x282b3bff).into(),
+                        border_disabled: rgba(0x282b3bff).into(),
                         elevated_surface_background: rgba(0x292c3eff).into(),
                         surface_background: rgba(0x292c3eff).into(),
                         background: rgba(0x292c3eff).into(),
@@ -219,8 +228,17 @@ pub fn palenight() -> ThemeFamily {
                         tab_inactive_background: rgba(0x31364aff).into(),
                         tab_active_background: rgba(0x292c3eff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x676e95ff).into(),
                         terminal_ansi_bright_red: rgba(0xff5571ff).into(),
@@ -262,24 +280,24 @@ pub fn palenight() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -328,7 +346,7 @@ pub fn palenight() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "4015bf85-061c-45ff-81ba-a31f017aac83".into(),
+                id: "cff26efb-72f8-4496-b33b-991080a47f1c".into(),
                 name: "Palenight (Mild Contrast)".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -342,9 +360,9 @@ pub fn palenight() -> ThemeFamily {
                         border: rgba(0x2c2f40ff).into(),
                         border_variant: rgba(0x2c2f40ff).into(),
                         border_focused: rgba(0x2c2f40ff).into(),
-                        border_disabled: rgba(0x2c2f40ff).into(),
                         border_selected: rgba(0x2c2f40ff).into(),
                         border_transparent: rgba(0x2c2f40ff).into(),
+                        border_disabled: rgba(0x2c2f40ff).into(),
                         elevated_surface_background: rgba(0x25283aff).into(),
                         surface_background: rgba(0x25283aff).into(),
                         background: rgba(0x292c3eff).into(),
@@ -377,8 +395,17 @@ pub fn palenight() -> ThemeFamily {
                         tab_inactive_background: rgba(0x31364aff).into(),
                         tab_active_background: rgba(0x25283aff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x676e95ff).into(),
                         terminal_ansi_bright_red: rgba(0xff5571ff).into(),
@@ -420,24 +447,24 @@ pub fn palenight() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/rose_pine.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn rose_pine() -> ThemeFamily {
     ThemeFamily {
-        id: "48c308b9-7dbe-4a52-b935-0b44d9dac00d".into(),
+        id: "9cf70eba-1185-4f3e-adb7-74f61c45c9dc".into(),
         name: "Rose Pine".into(),
         author: "RosΓ© Pine".into(),
         themes: vec![
             ThemeVariant {
-                id: "c2832e85-20cb-4a13-924f-026e68123068".into(),
+                id: "80a8f5dd-2ab5-4ee7-9b25-a60c8513234e".into(),
                 name: "Rose Pine".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn rose_pine() -> ThemeFamily {
                         border: rgba(0x000000ff).into(),
                         border_variant: rgba(0x000000ff).into(),
                         border_focused: rgba(0x000000ff).into(),
-                        border_disabled: rgba(0x000000ff).into(),
                         border_selected: rgba(0x000000ff).into(),
                         border_transparent: rgba(0x000000ff).into(),
+                        border_disabled: rgba(0x000000ff).into(),
                         elevated_surface_background: rgba(0x1f1d2eff).into(),
                         surface_background: rgba(0x1f1d2eff).into(),
                         background: rgba(0x191724ff).into(),
@@ -61,8 +61,17 @@ pub fn rose_pine() -> ThemeFamily {
                         tab_inactive_background: rgba(0x000000ff).into(),
                         tab_active_background: rgba(0x6e6a861a).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x908caaff).into(),
                         terminal_ansi_bright_red: rgba(0xeb6f92ff).into(),
@@ -104,24 +113,24 @@ pub fn rose_pine() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn rose_pine() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "3f6c3263-86f4-4a0e-92a6-144984aa2d38".into(),
+                id: "fe9e3c9e-954e-4f8e-849e-451ba5f6ceca".into(),
                 name: "Rose Moon".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn rose_pine() -> ThemeFamily {
                         border: rgba(0x000000ff).into(),
                         border_variant: rgba(0x000000ff).into(),
                         border_focused: rgba(0x000000ff).into(),
-                        border_disabled: rgba(0x000000ff).into(),
                         border_selected: rgba(0x000000ff).into(),
                         border_transparent: rgba(0x000000ff).into(),
+                        border_disabled: rgba(0x000000ff).into(),
                         elevated_surface_background: rgba(0x2a273eff).into(),
                         surface_background: rgba(0x2a273eff).into(),
                         background: rgba(0x232136ff).into(),
@@ -219,8 +228,17 @@ pub fn rose_pine() -> ThemeFamily {
                         tab_inactive_background: rgba(0x000000ff).into(),
                         tab_active_background: rgba(0x817c9c14).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x908caaff).into(),
                         terminal_ansi_bright_red: rgba(0xeb6f92ff).into(),
@@ -262,24 +280,24 @@ pub fn rose_pine() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -328,7 +346,7 @@ pub fn rose_pine() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "d171cda6-de3b-4528-8559-cd8fb71b2e7c".into(),
+                id: "00cc7f69-9658-443e-b643-1c8dbffa047d".into(),
                 name: "Rose Pine Dawn".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -342,9 +360,9 @@ pub fn rose_pine() -> ThemeFamily {
                         border: rgba(0x000000ff).into(),
                         border_variant: rgba(0x000000ff).into(),
                         border_focused: rgba(0x000000ff).into(),
-                        border_disabled: rgba(0x000000ff).into(),
                         border_selected: rgba(0x000000ff).into(),
                         border_transparent: rgba(0x000000ff).into(),
+                        border_disabled: rgba(0x000000ff).into(),
                         elevated_surface_background: rgba(0xfffaf3ff).into(),
                         surface_background: rgba(0xfffaf3ff).into(),
                         background: rgba(0xfaf4edff).into(),
@@ -377,8 +395,17 @@ pub fn rose_pine() -> ThemeFamily {
                         tab_inactive_background: rgba(0x000000ff).into(),
                         tab_active_background: rgba(0x6e6a860d).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xfcfcfdff).into(),
                         terminal_ansi_bright_black: rgba(0x797593ff).into(),
                         terminal_ansi_bright_red: rgba(0xb3627aff).into(),
@@ -420,24 +447,24 @@ pub fn rose_pine() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/solarized.rs πŸ”—

@@ -7,12 +7,12 @@ use crate::{
 
 pub fn solarized() -> ThemeFamily {
     ThemeFamily {
-        id: "9a6f18c9-520f-46ec-9bfb-a7ee73508139".into(),
+        id: "96299b3e-c749-478c-bfc9-c96cdaea8630".into(),
         name: "Solarized".into(),
         author: "Ethan Schoonover (altercation)".into(),
         themes: vec![
             ThemeVariant {
-                id: "74003db2-7f9a-4d26-8815-020c796bb551".into(),
+                id: "265f93c5-c8e7-4962-b083-8550f4b5c2ff".into(),
                 name: "Solarized Dark".into(),
                 appearance: Appearance::Dark,
                 styles: ThemeStyles {
@@ -26,9 +26,9 @@ pub fn solarized() -> ThemeFamily {
                         border: rgba(0x003847ff).into(),
                         border_variant: rgba(0x003847ff).into(),
                         border_focused: rgba(0x003847ff).into(),
-                        border_disabled: rgba(0x003847ff).into(),
                         border_selected: rgba(0x003847ff).into(),
                         border_transparent: rgba(0x003847ff).into(),
+                        border_disabled: rgba(0x003847ff).into(),
                         elevated_surface_background: rgba(0x18191bff).into(),
                         surface_background: rgba(0x18191bff).into(),
                         background: rgba(0x002a35ff).into(),
@@ -61,8 +61,17 @@ pub fn solarized() -> ThemeFamily {
                         tab_inactive_background: rgba(0x003f51ff).into(),
                         tab_active_background: rgba(0x002a36ff).into(),
                         editor_background: rgba(0x111113ff).into(),
+                        editor_gutter_background: rgba(0x111113ff).into(),
                         editor_subheader_background: rgba(0x18191bff).into(),
-                        editor_active_line: rgba(0xddeaf814).into(),
+                        editor_active_line_background: rgba(0xddeaf814).into(),
+                        editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                        editor_line_number: rgba(0xddeaf814).into(),
+                        editor_active_line_number: rgba(0xddeaf814).into(),
+                        editor_invisible: rgba(0xd3edf81d).into(),
+                        editor_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                        editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                         terminal_background: rgba(0x111113ff).into(),
                         terminal_ansi_bright_black: rgba(0x586e75ff).into(),
                         terminal_ansi_bright_red: rgba(0xcb4b15ff).into(),
@@ -104,24 +113,24 @@ pub fn solarized() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {
@@ -170,7 +179,7 @@ pub fn solarized() -> ThemeFamily {
                 },
             },
             ThemeVariant {
-                id: "43be149b-2604-4eb2-a9ce-c8f902ab3bb3".into(),
+                id: "40e2070d-5846-4182-9dc9-bf56badf019f".into(),
                 name: "Solarized Light".into(),
                 appearance: Appearance::Light,
                 styles: ThemeStyles {
@@ -184,9 +193,9 @@ pub fn solarized() -> ThemeFamily {
                         border: rgba(0xddd6c1ff).into(),
                         border_variant: rgba(0xddd6c1ff).into(),
                         border_focused: rgba(0xddd6c1ff).into(),
-                        border_disabled: rgba(0xddd6c1ff).into(),
                         border_selected: rgba(0xddd6c1ff).into(),
                         border_transparent: rgba(0xddd6c1ff).into(),
+                        border_disabled: rgba(0xddd6c1ff).into(),
                         elevated_surface_background: rgba(0xf9f9fbff).into(),
                         surface_background: rgba(0xf9f9fbff).into(),
                         background: rgba(0xfdf6e3ff).into(),
@@ -219,8 +228,17 @@ pub fn solarized() -> ThemeFamily {
                         tab_inactive_background: rgba(0xd3cbb7ff).into(),
                         tab_active_background: rgba(0xfdf6e3ff).into(),
                         editor_background: rgba(0xfcfcfdff).into(),
+                        editor_gutter_background: rgba(0xfcfcfdff).into(),
                         editor_subheader_background: rgba(0xf9f9fbff).into(),
-                        editor_active_line: rgba(0x0000320f).into(),
+                        editor_active_line_background: rgba(0x0000320f).into(),
+                        editor_highlighted_line_background: rgba(0x00002c17).into(),
+                        editor_line_number: rgba(0x0000320f).into(),
+                        editor_active_line_number: rgba(0x0000320f).into(),
+                        editor_invisible: rgba(0x00002c17).into(),
+                        editor_wrap_guide: rgba(0x00002c17).into(),
+                        editor_active_wrap_guide: rgba(0x00002c17).into(),
+                        editor_document_highlight_read_background: rgba(0x00002c17).into(),
+                        editor_document_highlight_write_background: rgba(0x00002c17).into(),
                         terminal_background: rgba(0xfcfcfdff).into(),
                         terminal_ansi_bright_black: rgba(0x657b83ff).into(),
                         terminal_ansi_bright_red: rgba(0xcb4b15ff).into(),
@@ -262,24 +280,24 @@ pub fn solarized() -> ThemeFamily {
                     },
                     player: PlayerColors(vec![
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                         PlayerColor {
-                            cursor: rgba(0x00000000).into(),
-                            background: rgba(0x00000000).into(),
-                            selection: rgba(0x00000000).into(),
+                            cursor: rgba(0x000000ff).into(),
+                            background: rgba(0x000000ff).into(),
+                            selection: rgba(0x000000ff).into(),
                         },
                     ]),
                     syntax: SyntaxTheme {

crates/theme2/src/themes/synthwave_84.rs πŸ”—

@@ -7,11 +7,11 @@ use crate::{
 
 pub fn synthwave_84() -> ThemeFamily {
     ThemeFamily {
-        id: "5e0f0cd5-5522-45cf-a652-caeb140eb3de".into(),
+        id: "161a14a0-533c-4df1-b909-2bac37ac807d".into(),
         name: "Synthwave 84".into(),
         author: "Robb Owen (robb0wen)".into(),
         themes: vec![ThemeVariant {
-            id: "83110d9e-dbf0-4f36-9a4c-6b396ce9a5a4".into(),
+            id: "7a7102b7-8778-4c24-ba79-7407857b4f8c".into(),
             name: "Synthwave 84".into(),
             appearance: Appearance::Dark,
             styles: ThemeStyles {
@@ -25,9 +25,9 @@ pub fn synthwave_84() -> ThemeFamily {
                     border: rgba(0x363a3fff).into(),
                     border_variant: rgba(0x2e3135ff).into(),
                     border_focused: rgba(0x004073ff).into(),
-                    border_disabled: rgba(0x212225ff).into(),
                     border_selected: rgba(0x004073ff).into(),
                     border_transparent: rgba(0x00000000).into(),
+                    border_disabled: rgba(0x212225ff).into(),
                     elevated_surface_background: rgba(0x18191bff).into(),
                     surface_background: rgba(0x18191bff).into(),
                     background: rgba(0x252334ff).into(),
@@ -60,8 +60,17 @@ pub fn synthwave_84() -> ThemeFamily {
                     tab_inactive_background: rgba(0x252334ff).into(),
                     tab_active_background: rgba(0x111113ff).into(),
                     editor_background: rgba(0x111113ff).into(),
+                    editor_gutter_background: rgba(0x111113ff).into(),
                     editor_subheader_background: rgba(0x18191bff).into(),
-                    editor_active_line: rgba(0xddeaf814).into(),
+                    editor_active_line_background: rgba(0xddeaf814).into(),
+                    editor_highlighted_line_background: rgba(0xd3edf81d).into(),
+                    editor_line_number: rgba(0xddeaf814).into(),
+                    editor_active_line_number: rgba(0xddeaf814).into(),
+                    editor_invisible: rgba(0xd3edf81d).into(),
+                    editor_wrap_guide: rgba(0xd3edf81d).into(),
+                    editor_active_wrap_guide: rgba(0xd3edf81d).into(),
+                    editor_document_highlight_read_background: rgba(0xd3edf81d).into(),
+                    editor_document_highlight_write_background: rgba(0xd3edf81d).into(),
                     terminal_background: rgba(0x111113ff).into(),
                     terminal_ansi_bright_black: rgba(0x000000e6).into(),
                     terminal_ansi_bright_red: rgba(0xfe444fff).into(),
@@ -103,24 +112,24 @@ pub fn synthwave_84() -> ThemeFamily {
                 },
                 player: PlayerColors(vec![
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                     PlayerColor {
-                        cursor: rgba(0x00000000).into(),
-                        background: rgba(0x00000000).into(),
-                        selection: rgba(0x00000000).into(),
+                        cursor: rgba(0x000000ff).into(),
+                        background: rgba(0x000000ff).into(),
+                        selection: rgba(0x000000ff).into(),
                     },
                 ]),
                 syntax: SyntaxTheme {

crates/theme_importer/src/theme_printer.rs πŸ”—

@@ -134,12 +134,12 @@ impl<'a> Debug for ThemeColorsPrinter<'a> {
             .field("border", &HslaPrinter(self.0.border))
             .field("border_variant", &HslaPrinter(self.0.border_variant))
             .field("border_focused", &HslaPrinter(self.0.border_focused))
-            .field("border_disabled", &HslaPrinter(self.0.border_disabled))
             .field("border_selected", &HslaPrinter(self.0.border_selected))
             .field(
                 "border_transparent",
                 &HslaPrinter(self.0.border_transparent),
             )
+            .field("border_disabled", &HslaPrinter(self.0.border_disabled))
             .field(
                 "elevated_surface_background",
                 &HslaPrinter(self.0.elevated_surface_background),
@@ -220,13 +220,43 @@ impl<'a> Debug for ThemeColorsPrinter<'a> {
                 &HslaPrinter(self.0.tab_active_background),
             )
             .field("editor_background", &HslaPrinter(self.0.editor_background))
+            .field(
+                "editor_gutter_background",
+                &HslaPrinter(self.0.editor_gutter_background),
+            )
             .field(
                 "editor_subheader_background",
                 &HslaPrinter(self.0.editor_subheader_background),
             )
             .field(
-                "editor_active_line",
-                &HslaPrinter(self.0.editor_active_line),
+                "editor_active_line_background",
+                &HslaPrinter(self.0.editor_active_line_background),
+            )
+            .field(
+                "editor_highlighted_line_background",
+                &HslaPrinter(self.0.editor_highlighted_line_background),
+            )
+            .field(
+                "editor_line_number",
+                &HslaPrinter(self.0.editor_line_number),
+            )
+            .field(
+                "editor_active_line_number",
+                &HslaPrinter(self.0.editor_active_line_number),
+            )
+            .field("editor_invisible", &HslaPrinter(self.0.editor_invisible))
+            .field("editor_wrap_guide", &HslaPrinter(self.0.editor_wrap_guide))
+            .field(
+                "editor_active_wrap_guide",
+                &HslaPrinter(self.0.editor_active_wrap_guide),
+            )
+            .field(
+                "editor_document_highlight_read_background",
+                &HslaPrinter(self.0.editor_document_highlight_read_background),
+            )
+            .field(
+                "editor_document_highlight_write_background",
+                &HslaPrinter(self.0.editor_document_highlight_write_background),
             )
             .field(
                 "terminal_background",

crates/ui2/src/to_extract/buffer.rs πŸ”—

@@ -156,7 +156,7 @@ impl Buffer {
 
     fn render_row<V: 'static>(row: BufferRow, cx: &WindowContext) -> impl Component<V> {
         let line_background = if row.current {
-            cx.theme().colors().editor_active_line
+            cx.theme().colors().editor_active_line_background
         } else {
             cx.theme().styles.system.transparent
         };

crates/zed2/src/main.rs πŸ”—

@@ -38,6 +38,7 @@ use std::{
     thread,
     time::{SystemTime, UNIX_EPOCH},
 };
+use theme::ActiveTheme;
 use util::{
     async_maybe,
     channel::{parse_zed_link, ReleaseChannel, RELEASE_CHANNEL},
@@ -164,7 +165,7 @@ fn main() {
         //     .detach();
         // watch_file_types(fs.clone(), cx);
 
-        // languages.set_theme(theme::current(cx).clone());
+        languages.set_theme(cx.theme().clone());
         // cx.observe_global::<SettingsStore, _>({
         //     let languages = languages.clone();
         //     move |cx| languages.set_theme(theme::current(cx).clone())