Merge branch 'main' into command_palette2

This commit is contained in:
Conrad Irwin 2023-11-09 20:58:54 -07:00
commit a73265ace4
63 changed files with 9172 additions and 2344 deletions

9
Cargo.lock generated
View file

@ -4457,6 +4457,12 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "json_comments"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105"
[[package]] [[package]]
name = "jwt" name = "jwt"
version = "0.16.0" version = "0.16.0"
@ -9180,10 +9186,13 @@ dependencies = [
"anyhow", "anyhow",
"convert_case 0.6.0", "convert_case 0.6.0",
"gpui2", "gpui2",
"indexmap 1.9.3",
"json_comments",
"log", "log",
"rust-embed", "rust-embed",
"serde", "serde",
"simplelog", "simplelog",
"strum",
"theme2", "theme2",
"uuid 1.4.1", "uuid 1.4.1",
] ]

View file

@ -102,6 +102,16 @@
"selections": true "selections": true
}, },
"relative_line_numbers": false, "relative_line_numbers": false,
// When to populate a new search's query based on the text under the cursor.
// This setting can take the following three values:
//
// 1. Always populate the search query with the word under the cursor (default).
// "always"
// 2. Only populate the search query when there is text selected
// "selection"
// 3. Never populate the search query
// "never"
"seed_search_query_from_cursor": "always",
// Inlay hint related settings // Inlay hint related settings
"inlay_hints": { "inlay_hints": {
// Global switch to toggle hints on and off, switched off by default. // Global switch to toggle hints on and off, switched off by default.

View file

@ -423,7 +423,10 @@
} }
}, },
{ {
"scope": ["string.interpolated.dollar.shell", "string.interpolated.backtick.shell"], "scope": [
"string.interpolated.dollar.shell",
"string.interpolated.backtick.shell"
],
"settings": { "settings": {
"foreground": "#8ec07c" "foreground": "#8ec07c"
} }
@ -489,13 +492,19 @@
{ {
"name": "coloring of the Java import and package identifiers", "name": "coloring of the Java import and package identifiers",
"scope": ["storage.modifier.import.java", "storage.modifier.package.java"], "scope": [
"storage.modifier.import.java",
"storage.modifier.package.java"
],
"settings": { "settings": {
"foreground": "#bdae93" "foreground": "#bdae93"
} }
}, },
{ {
"scope": ["keyword.other.import.java", "keyword.other.package.java"], "scope": [
"keyword.other.import.java",
"keyword.other.package.java"
],
"settings": { "settings": {
"foreground": "#8ec07c" "foreground": "#8ec07c"
} }
@ -628,7 +637,9 @@
}, },
{ {
"name": "JSON Level 0", "name": "JSON Level 0",
"scope": ["source.json meta.structure.dictionary.json support.type.property-name.json"], "scope": [
"source.json meta.structure.dictionary.json support.type.property-name.json"
],
"settings": { "settings": {
"foreground": "#b8bb26" "foreground": "#b8bb26"
} }
@ -761,7 +772,10 @@
} }
}, },
{ {
"scope": ["source.go keyword.interface", "source.go keyword.struct"], "scope": [
"source.go keyword.interface",
"source.go keyword.struct"
],
"settings": { "settings": {
"foreground": "#83a598" "foreground": "#83a598"
} }
@ -788,7 +802,10 @@
{ {
"name": "ReasonML String", "name": "ReasonML String",
"scope": ["source.reason string.double", "source.reason string.regexp"], "scope": [
"source.reason string.double",
"source.reason string.regexp"
],
"settings": { "settings": {
"foreground": "#b8bb26" "foreground": "#b8bb26"
} }
@ -809,7 +826,10 @@
}, },
{ {
"name": "ReasonML property", "name": "ReasonML property",
"scope": ["source.reason support.property-value", "source.reason entity.name.filename"], "scope": [
"source.reason support.property-value",
"source.reason entity.name.filename"
],
"settings": { "settings": {
"foreground": "#fe8019" "foreground": "#fe8019"
} }
@ -831,7 +851,9 @@
}, },
{ {
"name": "Powershell function attribute", "name": "Powershell function attribute",
"scope": ["source.powershell support.function.attribute.powershell"], "scope": [
"source.powershell support.function.attribute.powershell"
],
"settings": { "settings": {
"foreground": "#bdae93" "foreground": "#bdae93"
} }

View file

@ -423,7 +423,10 @@
} }
}, },
{ {
"scope": ["string.interpolated.dollar.shell", "string.interpolated.backtick.shell"], "scope": [
"string.interpolated.dollar.shell",
"string.interpolated.backtick.shell"
],
"settings": { "settings": {
"foreground": "#8ec07c" "foreground": "#8ec07c"
} }
@ -489,13 +492,19 @@
{ {
"name": "coloring of the Java import and package identifiers", "name": "coloring of the Java import and package identifiers",
"scope": ["storage.modifier.import.java", "storage.modifier.package.java"], "scope": [
"storage.modifier.import.java",
"storage.modifier.package.java"
],
"settings": { "settings": {
"foreground": "#bdae93" "foreground": "#bdae93"
} }
}, },
{ {
"scope": ["keyword.other.import.java", "keyword.other.package.java"], "scope": [
"keyword.other.import.java",
"keyword.other.package.java"
],
"settings": { "settings": {
"foreground": "#8ec07c" "foreground": "#8ec07c"
} }
@ -628,7 +637,9 @@
}, },
{ {
"name": "JSON Level 0", "name": "JSON Level 0",
"scope": ["source.json meta.structure.dictionary.json support.type.property-name.json"], "scope": [
"source.json meta.structure.dictionary.json support.type.property-name.json"
],
"settings": { "settings": {
"foreground": "#b8bb26" "foreground": "#b8bb26"
} }
@ -761,7 +772,10 @@
} }
}, },
{ {
"scope": ["source.go keyword.interface", "source.go keyword.struct"], "scope": [
"source.go keyword.interface",
"source.go keyword.struct"
],
"settings": { "settings": {
"foreground": "#83a598" "foreground": "#83a598"
} }
@ -788,7 +802,10 @@
{ {
"name": "ReasonML String", "name": "ReasonML String",
"scope": ["source.reason string.double", "source.reason string.regexp"], "scope": [
"source.reason string.double",
"source.reason string.regexp"
],
"settings": { "settings": {
"foreground": "#b8bb26" "foreground": "#b8bb26"
} }
@ -809,7 +826,10 @@
}, },
{ {
"name": "ReasonML property", "name": "ReasonML property",
"scope": ["source.reason support.property-value", "source.reason entity.name.filename"], "scope": [
"source.reason support.property-value",
"source.reason entity.name.filename"
],
"settings": { "settings": {
"foreground": "#fe8019" "foreground": "#fe8019"
} }
@ -831,7 +851,9 @@
}, },
{ {
"name": "Powershell function attribute", "name": "Powershell function attribute",
"scope": ["source.powershell support.function.attribute.powershell"], "scope": [
"source.powershell support.function.attribute.powershell"
],
"settings": { "settings": {
"foreground": "#bdae93" "foreground": "#bdae93"
} }

View file

@ -423,7 +423,10 @@
} }
}, },
{ {
"scope": ["string.interpolated.dollar.shell", "string.interpolated.backtick.shell"], "scope": [
"string.interpolated.dollar.shell",
"string.interpolated.backtick.shell"
],
"settings": { "settings": {
"foreground": "#8ec07c" "foreground": "#8ec07c"
} }
@ -489,13 +492,19 @@
{ {
"name": "coloring of the Java import and package identifiers", "name": "coloring of the Java import and package identifiers",
"scope": ["storage.modifier.import.java", "storage.modifier.package.java"], "scope": [
"storage.modifier.import.java",
"storage.modifier.package.java"
],
"settings": { "settings": {
"foreground": "#bdae93" "foreground": "#bdae93"
} }
}, },
{ {
"scope": ["keyword.other.import.java", "keyword.other.package.java"], "scope": [
"keyword.other.import.java",
"keyword.other.package.java"
],
"settings": { "settings": {
"foreground": "#8ec07c" "foreground": "#8ec07c"
} }
@ -628,7 +637,9 @@
}, },
{ {
"name": "JSON Level 0", "name": "JSON Level 0",
"scope": ["source.json meta.structure.dictionary.json support.type.property-name.json"], "scope": [
"source.json meta.structure.dictionary.json support.type.property-name.json"
],
"settings": { "settings": {
"foreground": "#b8bb26" "foreground": "#b8bb26"
} }
@ -761,7 +772,10 @@
} }
}, },
{ {
"scope": ["source.go keyword.interface", "source.go keyword.struct"], "scope": [
"source.go keyword.interface",
"source.go keyword.struct"
],
"settings": { "settings": {
"foreground": "#83a598" "foreground": "#83a598"
} }
@ -788,7 +802,10 @@
{ {
"name": "ReasonML String", "name": "ReasonML String",
"scope": ["source.reason string.double", "source.reason string.regexp"], "scope": [
"source.reason string.double",
"source.reason string.regexp"
],
"settings": { "settings": {
"foreground": "#b8bb26" "foreground": "#b8bb26"
} }
@ -809,7 +826,10 @@
}, },
{ {
"name": "ReasonML property", "name": "ReasonML property",
"scope": ["source.reason support.property-value", "source.reason entity.name.filename"], "scope": [
"source.reason support.property-value",
"source.reason entity.name.filename"
],
"settings": { "settings": {
"foreground": "#fe8019" "foreground": "#fe8019"
} }
@ -831,7 +851,9 @@
}, },
{ {
"name": "Powershell function attribute", "name": "Powershell function attribute",
"scope": ["source.powershell support.function.attribute.powershell"], "scope": [
"source.powershell support.function.attribute.powershell"
],
"settings": { "settings": {
"foreground": "#bdae93" "foreground": "#bdae93"
} }

View file

@ -422,7 +422,10 @@
} }
}, },
{ {
"scope": ["string.interpolated.dollar.shell", "string.interpolated.backtick.shell"], "scope": [
"string.interpolated.dollar.shell",
"string.interpolated.backtick.shell"
],
"settings": { "settings": {
"foreground": "#427b58" "foreground": "#427b58"
} }
@ -488,13 +491,19 @@
{ {
"name": "coloring of the Java import and package identifiers", "name": "coloring of the Java import and package identifiers",
"scope": ["storage.modifier.import.java", "storage.modifier.package.java"], "scope": [
"storage.modifier.import.java",
"storage.modifier.package.java"
],
"settings": { "settings": {
"foreground": "#665c54" "foreground": "#665c54"
} }
}, },
{ {
"scope": ["keyword.other.import.java", "keyword.other.package.java"], "scope": [
"keyword.other.import.java",
"keyword.other.package.java"
],
"settings": { "settings": {
"foreground": "#427b58" "foreground": "#427b58"
} }
@ -627,7 +636,9 @@
}, },
{ {
"name": "JSON Level 0", "name": "JSON Level 0",
"scope": ["source.json meta.structure.dictionary.json support.type.property-name.json"], "scope": [
"source.json meta.structure.dictionary.json support.type.property-name.json"
],
"settings": { "settings": {
"foreground": "#79740e" "foreground": "#79740e"
} }
@ -760,7 +771,10 @@
} }
}, },
{ {
"scope": ["source.go keyword.interface", "source.go keyword.struct"], "scope": [
"source.go keyword.interface",
"source.go keyword.struct"
],
"settings": { "settings": {
"foreground": "#076678" "foreground": "#076678"
} }
@ -787,7 +801,10 @@
{ {
"name": "ReasonML String", "name": "ReasonML String",
"scope": ["source.reason string.double", "source.reason string.regexp"], "scope": [
"source.reason string.double",
"source.reason string.regexp"
],
"settings": { "settings": {
"foreground": "#79740e" "foreground": "#79740e"
} }
@ -808,7 +825,10 @@
}, },
{ {
"name": "ReasonML property", "name": "ReasonML property",
"scope": ["source.reason support.property-value", "source.reason entity.name.filename"], "scope": [
"source.reason support.property-value",
"source.reason entity.name.filename"
],
"settings": { "settings": {
"foreground": "#af3a03" "foreground": "#af3a03"
} }
@ -830,7 +850,9 @@
}, },
{ {
"name": "Powershell function attribute", "name": "Powershell function attribute",
"scope": ["source.powershell support.function.attribute.powershell"], "scope": [
"source.powershell support.function.attribute.powershell"
],
"settings": { "settings": {
"foreground": "#665c54" "foreground": "#665c54"
} }

View file

@ -422,7 +422,10 @@
} }
}, },
{ {
"scope": ["string.interpolated.dollar.shell", "string.interpolated.backtick.shell"], "scope": [
"string.interpolated.dollar.shell",
"string.interpolated.backtick.shell"
],
"settings": { "settings": {
"foreground": "#427b58" "foreground": "#427b58"
} }
@ -488,13 +491,19 @@
{ {
"name": "coloring of the Java import and package identifiers", "name": "coloring of the Java import and package identifiers",
"scope": ["storage.modifier.import.java", "storage.modifier.package.java"], "scope": [
"storage.modifier.import.java",
"storage.modifier.package.java"
],
"settings": { "settings": {
"foreground": "#665c54" "foreground": "#665c54"
} }
}, },
{ {
"scope": ["keyword.other.import.java", "keyword.other.package.java"], "scope": [
"keyword.other.import.java",
"keyword.other.package.java"
],
"settings": { "settings": {
"foreground": "#427b58" "foreground": "#427b58"
} }
@ -627,7 +636,9 @@
}, },
{ {
"name": "JSON Level 0", "name": "JSON Level 0",
"scope": ["source.json meta.structure.dictionary.json support.type.property-name.json"], "scope": [
"source.json meta.structure.dictionary.json support.type.property-name.json"
],
"settings": { "settings": {
"foreground": "#79740e" "foreground": "#79740e"
} }
@ -760,7 +771,10 @@
} }
}, },
{ {
"scope": ["source.go keyword.interface", "source.go keyword.struct"], "scope": [
"source.go keyword.interface",
"source.go keyword.struct"
],
"settings": { "settings": {
"foreground": "#076678" "foreground": "#076678"
} }
@ -787,7 +801,10 @@
{ {
"name": "ReasonML String", "name": "ReasonML String",
"scope": ["source.reason string.double", "source.reason string.regexp"], "scope": [
"source.reason string.double",
"source.reason string.regexp"
],
"settings": { "settings": {
"foreground": "#79740e" "foreground": "#79740e"
} }
@ -808,7 +825,10 @@
}, },
{ {
"name": "ReasonML property", "name": "ReasonML property",
"scope": ["source.reason support.property-value", "source.reason entity.name.filename"], "scope": [
"source.reason support.property-value",
"source.reason entity.name.filename"
],
"settings": { "settings": {
"foreground": "#af3a03" "foreground": "#af3a03"
} }
@ -830,7 +850,9 @@
}, },
{ {
"name": "Powershell function attribute", "name": "Powershell function attribute",
"scope": ["source.powershell support.function.attribute.powershell"], "scope": [
"source.powershell support.function.attribute.powershell"
],
"settings": { "settings": {
"foreground": "#665c54" "foreground": "#665c54"
} }

View file

@ -422,7 +422,10 @@
} }
}, },
{ {
"scope": ["string.interpolated.dollar.shell", "string.interpolated.backtick.shell"], "scope": [
"string.interpolated.dollar.shell",
"string.interpolated.backtick.shell"
],
"settings": { "settings": {
"foreground": "#427b58" "foreground": "#427b58"
} }
@ -488,13 +491,19 @@
{ {
"name": "coloring of the Java import and package identifiers", "name": "coloring of the Java import and package identifiers",
"scope": ["storage.modifier.import.java", "storage.modifier.package.java"], "scope": [
"storage.modifier.import.java",
"storage.modifier.package.java"
],
"settings": { "settings": {
"foreground": "#665c54" "foreground": "#665c54"
} }
}, },
{ {
"scope": ["keyword.other.import.java", "keyword.other.package.java"], "scope": [
"keyword.other.import.java",
"keyword.other.package.java"
],
"settings": { "settings": {
"foreground": "#427b58" "foreground": "#427b58"
} }
@ -627,7 +636,9 @@
}, },
{ {
"name": "JSON Level 0", "name": "JSON Level 0",
"scope": ["source.json meta.structure.dictionary.json support.type.property-name.json"], "scope": [
"source.json meta.structure.dictionary.json support.type.property-name.json"
],
"settings": { "settings": {
"foreground": "#79740e" "foreground": "#79740e"
} }
@ -760,7 +771,10 @@
} }
}, },
{ {
"scope": ["source.go keyword.interface", "source.go keyword.struct"], "scope": [
"source.go keyword.interface",
"source.go keyword.struct"
],
"settings": { "settings": {
"foreground": "#076678" "foreground": "#076678"
} }
@ -787,7 +801,10 @@
{ {
"name": "ReasonML String", "name": "ReasonML String",
"scope": ["source.reason string.double", "source.reason string.regexp"], "scope": [
"source.reason string.double",
"source.reason string.regexp"
],
"settings": { "settings": {
"foreground": "#79740e" "foreground": "#79740e"
} }
@ -808,7 +825,10 @@
}, },
{ {
"name": "ReasonML property", "name": "ReasonML property",
"scope": ["source.reason support.property-value", "source.reason entity.name.filename"], "scope": [
"source.reason support.property-value",
"source.reason entity.name.filename"
],
"settings": { "settings": {
"foreground": "#af3a03" "foreground": "#af3a03"
} }
@ -830,7 +850,9 @@
}, },
{ {
"name": "Powershell function attribute", "name": "Powershell function attribute",
"scope": ["source.powershell support.function.attribute.powershell"], "scope": [
"source.powershell support.function.attribute.powershell"
],
"settings": { "settings": {
"foreground": "#665c54" "foreground": "#665c54"
} }

View file

@ -1,61 +1,61 @@
{ {
"name": "Notctis", "name": "Noctis",
"author": "Liviu Schera (liviuschera)", "author": "Liviu Schera (liviuschera)",
"themes": [ "themes": [
{ {
"name": "Noctis Azureus", "name": "Noctis Azureus",
"file_name": "azureus.json", "file_name": "azureus.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctis Bordo", "name": "Noctis Bordo",
"file_name": "bordo.json", "file_name": "bordo.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctus Hibernus", "name": "Noctus Hibernus",
"file_name": "hibernus.json", "file_name": "hibernus.json",
"appearance": "light" "appearance": "light"
}, },
{ {
"name": "Noctis Lilac", "name": "Noctis Lilac",
"file_name": "lilac.json", "file_name": "lilac.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctis Lux", "name": "Noctis Lux",
"file_name": "lux.json", "file_name": "lux.json",
"appearance": "light" "appearance": "light"
}, },
{ {
"name": "Noctis Minimus", "name": "Noctis Minimus",
"file_name": "minimus.json", "file_name": "minimus.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctis", "name": "Noctis",
"file_name": "noctis.json", "file_name": "noctis.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctis Obscuro", "name": "Noctis Obscuro",
"file_name": "obscuro.json", "file_name": "obscuro.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctis Sereno", "name": "Noctis Sereno",
"file_name": "obscuro.json", "file_name": "obscuro.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctis Uva", "name": "Noctis Uva",
"file_name": "uva.json", "file_name": "uva.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Noctis Viola", "name": "Noctis Viola",
"file_name": "viola.json", "file_name": "viola.json",
"appearance": "dark" "appearance": "dark"
} }
] ]
} }

View file

@ -1,21 +1,21 @@
{ {
"name": "Rose Pine", "name": "Rose Pine",
"author": "Rosé Pine", "author": "Rosé Pine",
"themes": [ "themes": [
{ {
"name": "Rose Pine", "name": "Rose Pine",
"file_name": "rose-pine.json", "file_name": "rose-pine.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Rose Moon", "name": "Rose Pine Moon",
"file_name": "rose-pine-moon.json", "file_name": "rose-pine-moon.json",
"appearance": "dark" "appearance": "dark"
}, },
{ {
"name": "Rose Pine Dawn", "name": "Rose Pine Dawn",
"file_name": "rose-pine-dawn.json", "file_name": "rose-pine-dawn.json",
"appearance": "light" "appearance": "light"
} }
] ]
} }

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@ use schemars::JsonSchema;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use settings::Setting; use settings::Setting;
#[derive(Deserialize)] #[derive(Clone, Deserialize)]
pub struct EditorSettings { pub struct EditorSettings {
pub cursor_blink: bool, pub cursor_blink: bool,
pub hover_popover_enabled: bool, pub hover_popover_enabled: bool,
@ -11,6 +11,15 @@ pub struct EditorSettings {
pub use_on_type_format: bool, pub use_on_type_format: bool,
pub scrollbar: Scrollbar, pub scrollbar: Scrollbar,
pub relative_line_numbers: bool, pub relative_line_numbers: bool,
pub seed_search_query_from_cursor: SeedQuerySetting,
}
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SeedQuerySetting {
Always,
Selection,
Never,
} }
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
@ -38,6 +47,7 @@ pub struct EditorSettingsContent {
pub use_on_type_format: Option<bool>, pub use_on_type_format: Option<bool>,
pub scrollbar: Option<ScrollbarContent>, pub scrollbar: Option<ScrollbarContent>,
pub relative_line_numbers: Option<bool>, pub relative_line_numbers: Option<bool>,
pub seed_search_query_from_cursor: Option<SeedQuerySetting>,
} }
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]

View file

@ -1,7 +1,7 @@
use crate::{ use crate::{
display_map::ToDisplayPoint, link_go_to_definition::hide_link_definition, editor_settings::SeedQuerySetting, link_go_to_definition::hide_link_definition,
movement::surrounding_word, persistence::DB, scroll::ScrollAnchor, Anchor, Autoscroll, Editor, persistence::DB, scroll::ScrollAnchor, Anchor, Autoscroll, Editor, EditorSettings, Event,
Event, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, NavigationData, ToPoint as _, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, NavigationData, ToPoint as _,
}; };
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use collections::HashSet; use collections::HashSet;
@ -13,8 +13,8 @@ use gpui::{
ViewHandle, WeakViewHandle, ViewHandle, WeakViewHandle,
}; };
use language::{ use language::{
proto::serialize_anchor as serialize_text_anchor, Bias, Buffer, OffsetRangeExt, Point, proto::serialize_anchor as serialize_text_anchor, Bias, Buffer, CharKind, OffsetRangeExt,
SelectionGoal, Point, SelectionGoal,
}; };
use project::{search::SearchQuery, FormatTrigger, Item as _, Project, ProjectPath}; use project::{search::SearchQuery, FormatTrigger, Item as _, Project, ProjectPath};
use rpc::proto::{self, update_view, PeerId}; use rpc::proto::{self, update_view, PeerId};
@ -937,24 +937,28 @@ impl SearchableItem for Editor {
} }
fn query_suggestion(&mut self, cx: &mut ViewContext<Self>) -> String { fn query_suggestion(&mut self, cx: &mut ViewContext<Self>) -> String {
let display_map = self.snapshot(cx).display_snapshot; let setting = settings::get::<EditorSettings>(cx).seed_search_query_from_cursor;
let snapshot = &self.snapshot(cx).buffer_snapshot;
let selection = self.selections.newest::<usize>(cx); let selection = self.selections.newest::<usize>(cx);
if selection.start == selection.end {
let point = selection.start.to_display_point(&display_map); match setting {
let range = surrounding_word(&display_map, point); SeedQuerySetting::Never => String::new(),
let range = range.start.to_offset(&display_map, Bias::Left) SeedQuerySetting::Selection | SeedQuerySetting::Always if !selection.is_empty() => {
..range.end.to_offset(&display_map, Bias::Right); snapshot
let text: String = display_map.buffer_snapshot.text_for_range(range).collect(); .text_for_range(selection.start..selection.end)
if text.trim().is_empty() { .collect()
String::new() }
} else { SeedQuerySetting::Selection => String::new(),
text SeedQuerySetting::Always => {
let (range, kind) = snapshot.surrounding_word(selection.start);
if kind == Some(CharKind::Word) {
let text: String = snapshot.text_for_range(range).collect();
if !text.trim().is_empty() {
return text;
}
}
String::new()
} }
} else {
display_map
.buffer_snapshot
.text_for_range(selection.start..selection.end)
.collect()
} }
} }

View file

@ -11,6 +11,15 @@ pub struct EditorSettings {
pub use_on_type_format: bool, pub use_on_type_format: bool,
pub scrollbar: Scrollbar, pub scrollbar: Scrollbar,
pub relative_line_numbers: bool, pub relative_line_numbers: bool,
pub seed_search_query_from_cursor: SeedQuerySetting,
}
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SeedQuerySetting {
Always,
Selection,
Never,
} }
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
@ -38,6 +47,7 @@ pub struct EditorSettingsContent {
pub use_on_type_format: Option<bool>, pub use_on_type_format: Option<bool>,
pub scrollbar: Option<ScrollbarContent>, pub scrollbar: Option<ScrollbarContent>,
pub relative_line_numbers: Option<bool>, pub relative_line_numbers: Option<bool>,
pub seed_search_query_from_cursor: Option<SeedQuerySetting>,
} }
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]

View file

@ -1,7 +1,8 @@
use crate::{ use crate::{
display_map::ToDisplayPoint, link_go_to_definition::hide_link_definition, editor_settings::SeedQuerySetting, link_go_to_definition::hide_link_definition,
movement::surrounding_word, persistence::DB, scroll::ScrollAnchor, Anchor, Autoscroll, Editor, movement::surrounding_word, persistence::DB, scroll::ScrollAnchor, Anchor, Autoscroll, Editor,
Event, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, NavigationData, ToPoint as _, EditorSettings, Event, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot,
NavigationData, ToPoint as _,
}; };
use anyhow::{anyhow, Context, Result}; use anyhow::{anyhow, Context, Result};
use collections::HashSet; use collections::HashSet;
@ -12,11 +13,12 @@ use gpui::{
ViewContext, VisualContext, WeakView, ViewContext, VisualContext, WeakView,
}; };
use language::{ use language::{
proto::serialize_anchor as serialize_text_anchor, Bias, Buffer, OffsetRangeExt, Point, proto::serialize_anchor as serialize_text_anchor, Bias, Buffer, CharKind, OffsetRangeExt,
SelectionGoal, Point, SelectionGoal,
}; };
use project::{search::SearchQuery, FormatTrigger, Item as _, Project, ProjectPath}; use project::{search::SearchQuery, FormatTrigger, Item as _, Project, ProjectPath};
use rpc::proto::{self, update_view, PeerId}; use rpc::proto::{self, update_view, PeerId};
use settings::Settings;
use smallvec::SmallVec; use smallvec::SmallVec;
use std::{ use std::{
borrow::Cow, borrow::Cow,
@ -918,24 +920,28 @@ impl SearchableItem for Editor {
} }
fn query_suggestion(&mut self, cx: &mut ViewContext<Self>) -> String { fn query_suggestion(&mut self, cx: &mut ViewContext<Self>) -> String {
let display_map = self.snapshot(cx).display_snapshot; let setting = EditorSettings::get_global(cx).seed_search_query_from_cursor;
let snapshot = &self.snapshot(cx).buffer_snapshot;
let selection = self.selections.newest::<usize>(cx); let selection = self.selections.newest::<usize>(cx);
if selection.start == selection.end {
let point = selection.start.to_display_point(&display_map); match setting {
let range = surrounding_word(&display_map, point); SeedQuerySetting::Never => String::new(),
let range = range.start.to_offset(&display_map, Bias::Left) SeedQuerySetting::Selection | SeedQuerySetting::Always if !selection.is_empty() => {
..range.end.to_offset(&display_map, Bias::Right); snapshot
let text: String = display_map.buffer_snapshot.text_for_range(range).collect(); .text_for_range(selection.start..selection.end)
if text.trim().is_empty() { .collect()
String::new() }
} else { SeedQuerySetting::Selection => String::new(),
text SeedQuerySetting::Always => {
let (range, kind) = snapshot.surrounding_word(selection.start);
if kind == Some(CharKind::Word) {
let text: String = snapshot.text_for_range(range).collect();
if !text.trim().is_empty() {
return text;
}
}
String::new()
} }
} else {
display_map
.buffer_snapshot
.text_for_range(selection.start..selection.end)
.collect()
} }
} }

View file

@ -39,12 +39,6 @@ pub struct GoToLine {
_subscriptions: Vec<Subscription>, _subscriptions: Vec<Subscription>,
} }
pub enum Event {
Dismissed,
}
impl EventEmitter<Event> for GoToLine {}
impl EventEmitter<ModalEvent> for GoToLine {} impl EventEmitter<ModalEvent> for GoToLine {}
impl Modal for GoToLine { impl Modal for GoToLine {
fn focus(&self, cx: &mut WindowContext) { fn focus(&self, cx: &mut WindowContext) {
@ -81,7 +75,6 @@ impl GoToLine {
fn release(&mut self, cx: &mut WindowContext) { fn release(&mut self, cx: &mut WindowContext) {
let scroll_position = self.prev_scroll_position.take(); let scroll_position = self.prev_scroll_position.take();
self.active_editor.update(cx, |editor, cx| { self.active_editor.update(cx, |editor, cx| {
editor.focus(cx);
editor.highlight_rows(None); editor.highlight_rows(None);
if let Some(scroll_position) = scroll_position { if let Some(scroll_position) = scroll_position {
editor.set_scroll_position(scroll_position, cx); editor.set_scroll_position(scroll_position, cx);
@ -98,7 +91,7 @@ impl GoToLine {
) { ) {
match event { match event {
// todo!() this isn't working... // todo!() this isn't working...
editor::Event::Blurred => cx.emit(Event::Dismissed), editor::Event::Blurred => cx.emit(ModalEvent::Dismissed),
editor::Event::BufferEdited { .. } => self.highlight_current_line(cx), editor::Event::BufferEdited { .. } => self.highlight_current_line(cx),
_ => {} _ => {}
} }
@ -133,22 +126,28 @@ impl GoToLine {
} }
fn cancel(&mut self, _: &menu::Cancel, cx: &mut ViewContext<Self>) { fn cancel(&mut self, _: &menu::Cancel, cx: &mut ViewContext<Self>) {
cx.emit(Event::Dismissed); self.active_editor.update(cx, |editor, cx| {
editor.focus(cx);
cx.notify();
});
cx.emit(ModalEvent::Dismissed);
} }
fn confirm(&mut self, _: &menu::Confirm, cx: &mut ViewContext<Self>) { fn confirm(&mut self, _: &menu::Confirm, cx: &mut ViewContext<Self>) {
if let Some(point) = self.point_from_query(cx) { if let Some(point) = self.point_from_query(cx) {
self.active_editor.update(cx, |active_editor, cx| { self.active_editor.update(cx, |editor, cx| {
let snapshot = active_editor.snapshot(cx).display_snapshot; let snapshot = editor.snapshot(cx).display_snapshot;
let point = snapshot.buffer_snapshot.clip_point(point, Bias::Left); let point = snapshot.buffer_snapshot.clip_point(point, Bias::Left);
active_editor.change_selections(Some(Autoscroll::center()), cx, |s| { editor.change_selections(Some(Autoscroll::center()), cx, |s| {
s.select_ranges([point..point]) s.select_ranges([point..point])
}); });
editor.focus(cx);
cx.notify();
}); });
self.prev_scroll_position.take(); self.prev_scroll_position.take();
} }
cx.emit(Event::Dismissed); cx.emit(ModalEvent::Dismissed);
} }
} }

View file

@ -136,7 +136,7 @@ impl ToJson for RectF {
} }
#[derive(Refineable, Debug)] #[derive(Refineable, Debug)]
#[refineable(debug)] #[refineable(Debug)]
pub struct Point<T: Clone + Default + Debug> { pub struct Point<T: Clone + Default + Debug> {
pub x: T, pub x: T,
pub y: T, pub y: T,
@ -161,7 +161,7 @@ impl<T: Clone + Default + Debug> Into<taffy::geometry::Point<T>> for Point<T> {
} }
#[derive(Refineable, Clone, Debug)] #[derive(Refineable, Clone, Debug)]
#[refineable(debug)] #[refineable(Debug)]
pub struct Size<T: Clone + Default + Debug> { pub struct Size<T: Clone + Default + Debug> {
pub width: T, pub width: T,
pub height: T, pub height: T,
@ -227,7 +227,7 @@ impl Size<Length> {
} }
#[derive(Clone, Default, Refineable, Debug)] #[derive(Clone, Default, Refineable, Debug)]
#[refineable(debug)] #[refineable(Debug)]
pub struct Edges<T: Clone + Default + Debug> { pub struct Edges<T: Clone + Default + Debug> {
pub top: T, pub top: T,
pub right: T, pub right: T,

View file

@ -1,8 +1,8 @@
#![allow(dead_code)] #![allow(dead_code)]
use anyhow::bail;
use serde::de::{self, Deserialize, Deserializer, Visitor}; use serde::de::{self, Deserialize, Deserializer, Visitor};
use std::fmt; use std::fmt;
use std::num::ParseIntError;
pub fn rgb<C: From<Rgba>>(hex: u32) -> C { pub fn rgb<C: From<Rgba>>(hex: u32) -> C {
let r = ((hex >> 16) & 0xFF) as f32 / 255.0; let r = ((hex >> 16) & 0xFF) as f32 / 255.0;
@ -19,7 +19,7 @@ pub fn rgba(hex: u32) -> Rgba {
Rgba { r, g, b, a } Rgba { r, g, b, a }
} }
#[derive(Clone, Copy, Default)] #[derive(PartialEq, Clone, Copy, Default)]
pub struct Rgba { pub struct Rgba {
pub r: f32, pub r: f32,
pub g: f32, pub g: f32,
@ -70,21 +70,7 @@ impl<'de> Visitor<'de> for RgbaVisitor {
} }
fn visit_str<E: de::Error>(self, value: &str) -> Result<Rgba, E> { fn visit_str<E: de::Error>(self, value: &str) -> Result<Rgba, E> {
if value.len() == 7 || value.len() == 9 { Rgba::try_from(value).map_err(E::custom)
let r = u8::from_str_radix(&value[1..3], 16).unwrap() as f32 / 255.0;
let g = u8::from_str_radix(&value[3..5], 16).unwrap() as f32 / 255.0;
let b = u8::from_str_radix(&value[5..7], 16).unwrap() as f32 / 255.0;
let a = if value.len() == 9 {
u8::from_str_radix(&value[7..9], 16).unwrap() as f32 / 255.0
} else {
1.0
};
Ok(Rgba { r, g, b, a })
} else {
Err(E::custom(
"Bad format for RGBA. Expected #rrggbb or #rrggbbaa.",
))
}
} }
} }
@ -125,19 +111,59 @@ impl From<Hsla> for Rgba {
} }
impl TryFrom<&'_ str> for Rgba { impl TryFrom<&'_ str> for Rgba {
type Error = ParseIntError; type Error = anyhow::Error;
fn try_from(value: &'_ str) -> Result<Self, Self::Error> { fn try_from(value: &'_ str) -> Result<Self, Self::Error> {
let r = u8::from_str_radix(&value[1..3], 16)? as f32 / 255.0; const RGB: usize = "rgb".len();
let g = u8::from_str_radix(&value[3..5], 16)? as f32 / 255.0; const RGBA: usize = "rgba".len();
let b = u8::from_str_radix(&value[5..7], 16)? as f32 / 255.0; const RRGGBB: usize = "rrggbb".len();
let a = if value.len() > 7 { const RRGGBBAA: usize = "rrggbbaa".len();
u8::from_str_radix(&value[7..9], 16)? as f32 / 255.0
} else { const EXPECTED_FORMATS: &'static str = "Expected #rgb, #rgba, #rrggbb, or #rrggbbaa";
1.0
let Some(("", hex)) = value.trim().split_once('#') else {
bail!("invalid RGBA hex color: '{value}'. {EXPECTED_FORMATS}");
}; };
Ok(Rgba { r, g, b, a }) let (r, g, b, a) = match hex.len() {
RGB | RGBA => {
let r = u8::from_str_radix(&hex[0..1], 16)?;
let g = u8::from_str_radix(&hex[1..2], 16)?;
let b = u8::from_str_radix(&hex[2..3], 16)?;
let a = if hex.len() == RGBA {
u8::from_str_radix(&hex[3..4], 16)?
} else {
0xf
};
/// Duplicates a given hex digit.
/// E.g., `0xf` -> `0xff`.
const fn duplicate(value: u8) -> u8 {
value << 4 | value
}
(duplicate(r), duplicate(g), duplicate(b), duplicate(a))
}
RRGGBB | RRGGBBAA => {
let r = u8::from_str_radix(&hex[0..2], 16)?;
let g = u8::from_str_radix(&hex[2..4], 16)?;
let b = u8::from_str_radix(&hex[4..6], 16)?;
let a = if hex.len() == RRGGBBAA {
u8::from_str_radix(&hex[6..8], 16)?
} else {
0xff
};
(r, g, b, a)
}
_ => bail!("invalid RGBA hex color: '{value}'. {EXPECTED_FORMATS}"),
};
Ok(Rgba {
r: r as f32 / 255.,
g: g as f32 / 255.,
b: b as f32 / 255.,
a: a as f32 / 255.,
})
} }
} }
@ -311,3 +337,52 @@ impl<'de> Deserialize<'de> for Hsla {
Ok(Hsla::from(rgba)) Ok(Hsla::from(rgba))
} }
} }
#[cfg(test)]
mod tests {
use serde_json::json;
use super::*;
#[test]
fn test_deserialize_three_value_hex_to_rgba() {
let actual: Rgba = serde_json::from_value(json!("#f09")).unwrap();
assert_eq!(actual, rgba(0xff0099ff))
}
#[test]
fn test_deserialize_four_value_hex_to_rgba() {
let actual: Rgba = serde_json::from_value(json!("#f09f")).unwrap();
assert_eq!(actual, rgba(0xff0099ff))
}
#[test]
fn test_deserialize_six_value_hex_to_rgba() {
let actual: Rgba = serde_json::from_value(json!("#ff0099")).unwrap();
assert_eq!(actual, rgba(0xff0099ff))
}
#[test]
fn test_deserialize_eight_value_hex_to_rgba() {
let actual: Rgba = serde_json::from_value(json!("#ff0099ff")).unwrap();
assert_eq!(actual, rgba(0xff0099ff))
}
#[test]
fn test_deserialize_eight_value_hex_with_padding_to_rgba() {
let actual: Rgba = serde_json::from_value(json!(" #f5f5f5ff ")).unwrap();
assert_eq!(actual, rgba(0xf5f5f5ff))
}
#[test]
fn test_deserialize_eight_value_hex_with_mixed_case_to_rgba() {
let actual: Rgba = serde_json::from_value(json!("#DeAdbEeF")).unwrap();
assert_eq!(actual, rgba(0xdeadbeef))
}
}

View file

@ -9,7 +9,7 @@ use std::{
}; };
#[derive(Refineable, Default, Add, AddAssign, Sub, SubAssign, Copy, Debug, PartialEq, Eq, Hash)] #[derive(Refineable, Default, Add, AddAssign, Sub, SubAssign, Copy, Debug, PartialEq, Eq, Hash)]
#[refineable(debug)] #[refineable(Debug)]
#[repr(C)] #[repr(C)]
pub struct Point<T: Default + Clone + Debug> { pub struct Point<T: Default + Clone + Debug> {
pub x: T, pub x: T,
@ -140,7 +140,7 @@ impl<T: Clone + Default + Debug> Clone for Point<T> {
} }
#[derive(Refineable, Default, Clone, Copy, PartialEq, Div, Hash, Serialize, Deserialize)] #[derive(Refineable, Default, Clone, Copy, PartialEq, Div, Hash, Serialize, Deserialize)]
#[refineable(debug)] #[refineable(Debug)]
#[repr(C)] #[repr(C)]
pub struct Size<T: Clone + Default + Debug> { pub struct Size<T: Clone + Default + Debug> {
pub width: T, pub width: T,
@ -313,7 +313,7 @@ impl Size<Length> {
} }
#[derive(Refineable, Clone, Default, Debug, Eq, PartialEq)] #[derive(Refineable, Clone, Default, Debug, Eq, PartialEq)]
#[refineable(debug)] #[refineable(Debug)]
#[repr(C)] #[repr(C)]
pub struct Bounds<T: Clone + Default + Debug> { pub struct Bounds<T: Clone + Default + Debug> {
pub origin: Point<T>, pub origin: Point<T>,
@ -477,7 +477,7 @@ impl Bounds<Pixels> {
impl<T: Clone + Debug + Copy + Default> Copy for Bounds<T> {} impl<T: Clone + Debug + Copy + Default> Copy for Bounds<T> {}
#[derive(Refineable, Clone, Default, Debug, Eq, PartialEq)] #[derive(Refineable, Clone, Default, Debug, Eq, PartialEq)]
#[refineable(debug)] #[refineable(Debug)]
#[repr(C)] #[repr(C)]
pub struct Edges<T: Clone + Default + Debug> { pub struct Edges<T: Clone + Default + Debug> {
pub top: T, pub top: T,
@ -619,7 +619,7 @@ impl Edges<Pixels> {
} }
#[derive(Refineable, Clone, Default, Debug, Eq, PartialEq)] #[derive(Refineable, Clone, Default, Debug, Eq, PartialEq)]
#[refineable(debug)] #[refineable(Debug)]
#[repr(C)] #[repr(C)]
pub struct Corners<T: Clone + Default + Debug> { pub struct Corners<T: Clone + Default + Debug> {
pub top_left: T, pub top_left: T,

View file

@ -14,7 +14,7 @@ pub use taffy::style::{
pub type StyleCascade = Cascade<Style>; pub type StyleCascade = Cascade<Style>;
#[derive(Clone, Refineable, Debug)] #[derive(Clone, Refineable, Debug)]
#[refineable(debug)] #[refineable(Debug)]
pub struct Style { pub struct Style {
/// What layout strategy should be used? /// What layout strategy should be used?
pub display: Display, pub display: Display,
@ -129,7 +129,7 @@ pub struct BoxShadow {
} }
#[derive(Refineable, Clone, Debug)] #[derive(Refineable, Clone, Debug)]
#[refineable(debug)] #[refineable(Debug)]
pub struct TextStyle { pub struct TextStyle {
pub color: Hsla, pub color: Hsla,
pub font_family: SharedString, pub font_family: SharedString,
@ -353,7 +353,7 @@ impl Default for Style {
} }
#[derive(Refineable, Copy, Clone, Default, Debug, PartialEq, Eq)] #[derive(Refineable, Copy, Clone, Default, Debug, PartialEq, Eq)]
#[refineable(debug)] #[refineable(Debug)]
pub struct UnderlineStyle { pub struct UnderlineStyle {
pub thickness: Pixels, pub thickness: Pixels,
pub color: Option<Hsla>, pub color: Option<Hsla>,

View file

@ -1692,14 +1692,25 @@ fn test_language_scope_at_with_javascript(cx: &mut AppContext) {
r#" r#"
(jsx_element) @element (jsx_element) @element
(string) @string (string) @string
[
(jsx_opening_element)
(jsx_closing_element)
(jsx_expression)
] @default
"#, "#,
) )
.unwrap(); .unwrap();
let text = r#"a["b"] = <C d="e"></C>;"#; let text = r#"
a["b"] = <C d="e">
<F></F>
{ g() }
</C>;
"#
.unindent();
let buffer = let buffer =
Buffer::new(0, cx.model_id() as u64, text).with_language(Arc::new(language), cx); Buffer::new(0, cx.model_id() as u64, &text).with_language(Arc::new(language), cx);
let snapshot = buffer.snapshot(); let snapshot = buffer.snapshot();
let config = snapshot.language_scope_at(0).unwrap(); let config = snapshot.language_scope_at(0).unwrap();
@ -1710,7 +1721,9 @@ fn test_language_scope_at_with_javascript(cx: &mut AppContext) {
&[true, true] &[true, true]
); );
let string_config = snapshot.language_scope_at(3).unwrap(); let string_config = snapshot
.language_scope_at(text.find("b\"").unwrap())
.unwrap();
assert_eq!(string_config.line_comment_prefix().unwrap().as_ref(), "// "); assert_eq!(string_config.line_comment_prefix().unwrap().as_ref(), "// ");
// Second bracket pair is disabled // Second bracket pair is disabled
assert_eq!( assert_eq!(
@ -1718,18 +1731,49 @@ fn test_language_scope_at_with_javascript(cx: &mut AppContext) {
&[true, false] &[true, false]
); );
let element_config = snapshot.language_scope_at(10).unwrap(); // In between JSX tags: use the `element` override.
let element_config = snapshot
.language_scope_at(text.find("<F>").unwrap())
.unwrap();
assert_eq!(element_config.line_comment_prefix(), None); assert_eq!(element_config.line_comment_prefix(), None);
assert_eq!( assert_eq!(
element_config.block_comment_delimiters(), element_config.block_comment_delimiters(),
Some((&"{/*".into(), &"*/}".into())) Some((&"{/*".into(), &"*/}".into()))
); );
// Both bracket pairs are enabled
assert_eq!( assert_eq!(
element_config.brackets().map(|e| e.1).collect::<Vec<_>>(), element_config.brackets().map(|e| e.1).collect::<Vec<_>>(),
&[true, true] &[true, true]
); );
// Within a JSX tag: use the default config.
let tag_config = snapshot
.language_scope_at(text.find(" d=").unwrap() + 1)
.unwrap();
assert_eq!(tag_config.line_comment_prefix().unwrap().as_ref(), "// ");
assert_eq!(
tag_config.brackets().map(|e| e.1).collect::<Vec<_>>(),
&[true, true]
);
// In a JSX expression: use the default config.
let expression_in_element_config = snapshot
.language_scope_at(text.find("{").unwrap() + 1)
.unwrap();
assert_eq!(
expression_in_element_config
.line_comment_prefix()
.unwrap()
.as_ref(),
"// "
);
assert_eq!(
expression_in_element_config
.brackets()
.map(|e| e.1)
.collect::<Vec<_>>(),
&[true, true]
);
buffer buffer
}); });
} }

View file

@ -1696,14 +1696,25 @@ fn test_language_scope_at_with_javascript(cx: &mut AppContext) {
r#" r#"
(jsx_element) @element (jsx_element) @element
(string) @string (string) @string
[
(jsx_opening_element)
(jsx_closing_element)
(jsx_expression)
] @default
"#, "#,
) )
.unwrap(); .unwrap();
let text = r#"a["b"] = <C d="e"></C>;"#; let text = r#"
a["b"] = <C d="e">
<F></F>
{ g() }
</C>;
"#
.unindent();
let buffer = let buffer =
Buffer::new(0, cx.entity_id().as_u64(), text).with_language(Arc::new(language), cx); Buffer::new(0, cx.entity_id().as_u64(), &text).with_language(Arc::new(language), cx);
let snapshot = buffer.snapshot(); let snapshot = buffer.snapshot();
let config = snapshot.language_scope_at(0).unwrap(); let config = snapshot.language_scope_at(0).unwrap();
@ -1714,7 +1725,9 @@ fn test_language_scope_at_with_javascript(cx: &mut AppContext) {
&[true, true] &[true, true]
); );
let string_config = snapshot.language_scope_at(3).unwrap(); let string_config = snapshot
.language_scope_at(text.find("b\"").unwrap())
.unwrap();
assert_eq!(string_config.line_comment_prefix().unwrap().as_ref(), "// "); assert_eq!(string_config.line_comment_prefix().unwrap().as_ref(), "// ");
// Second bracket pair is disabled // Second bracket pair is disabled
assert_eq!( assert_eq!(
@ -1722,18 +1735,49 @@ fn test_language_scope_at_with_javascript(cx: &mut AppContext) {
&[true, false] &[true, false]
); );
let element_config = snapshot.language_scope_at(10).unwrap(); // In between JSX tags: use the `element` override.
let element_config = snapshot
.language_scope_at(text.find("<F>").unwrap())
.unwrap();
assert_eq!(element_config.line_comment_prefix(), None); assert_eq!(element_config.line_comment_prefix(), None);
assert_eq!( assert_eq!(
element_config.block_comment_delimiters(), element_config.block_comment_delimiters(),
Some((&"{/*".into(), &"*/}".into())) Some((&"{/*".into(), &"*/}".into()))
); );
// Both bracket pairs are enabled
assert_eq!( assert_eq!(
element_config.brackets().map(|e| e.1).collect::<Vec<_>>(), element_config.brackets().map(|e| e.1).collect::<Vec<_>>(),
&[true, true] &[true, true]
); );
// Within a JSX tag: use the default config.
let tag_config = snapshot
.language_scope_at(text.find(" d=").unwrap() + 1)
.unwrap();
assert_eq!(tag_config.line_comment_prefix().unwrap().as_ref(), "// ");
assert_eq!(
tag_config.brackets().map(|e| e.1).collect::<Vec<_>>(),
&[true, true]
);
// In a JSX expression: use the default config.
let expression_in_element_config = snapshot
.language_scope_at(text.find("{").unwrap() + 1)
.unwrap();
assert_eq!(
expression_in_element_config
.line_comment_prefix()
.unwrap()
.as_ref(),
"// "
);
assert_eq!(
expression_in_element_config
.brackets()
.map(|e| e.1)
.collect::<Vec<_>>(),
&[true, true]
);
buffer buffer
}); });
} }

View file

@ -1,3 +1,4 @@
use std::ops::ControlFlow;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::Arc; use std::sync::Arc;
@ -58,11 +59,17 @@ impl Prettier {
fs: &dyn Fs, fs: &dyn Fs,
installed_prettiers: &HashSet<PathBuf>, installed_prettiers: &HashSet<PathBuf>,
locate_from: &Path, locate_from: &Path,
) -> anyhow::Result<Option<PathBuf>> { ) -> anyhow::Result<ControlFlow<(), Option<PathBuf>>> {
let mut path_to_check = locate_from let mut path_to_check = locate_from
.components() .components()
.take_while(|component| component.as_os_str().to_string_lossy() != "node_modules") .take_while(|component| component.as_os_str().to_string_lossy() != "node_modules")
.collect::<PathBuf>(); .collect::<PathBuf>();
if path_to_check != locate_from {
log::debug!(
"Skipping prettier location for path {path_to_check:?} that is inside node_modules"
);
return Ok(ControlFlow::Break(()));
}
let path_to_check_metadata = fs let path_to_check_metadata = fs
.metadata(&path_to_check) .metadata(&path_to_check)
.await .await
@ -76,14 +83,14 @@ impl Prettier {
loop { loop {
if installed_prettiers.contains(&path_to_check) { if installed_prettiers.contains(&path_to_check) {
log::debug!("Found prettier path {path_to_check:?} in installed prettiers"); log::debug!("Found prettier path {path_to_check:?} in installed prettiers");
return Ok(Some(path_to_check)); return Ok(ControlFlow::Continue(Some(path_to_check)));
} else if let Some(package_json_contents) = } else if let Some(package_json_contents) =
read_package_json(fs, &path_to_check).await? read_package_json(fs, &path_to_check).await?
{ {
if has_prettier_in_package_json(&package_json_contents) { if has_prettier_in_package_json(&package_json_contents) {
if has_prettier_in_node_modules(fs, &path_to_check).await? { if has_prettier_in_node_modules(fs, &path_to_check).await? {
log::debug!("Found prettier path {path_to_check:?} in both package.json and node_modules"); log::debug!("Found prettier path {path_to_check:?} in both package.json and node_modules");
return Ok(Some(path_to_check)); return Ok(ControlFlow::Continue(Some(path_to_check)));
} else if project_path_with_prettier_dependency.is_none() { } else if project_path_with_prettier_dependency.is_none() {
project_path_with_prettier_dependency = Some(path_to_check.clone()); project_path_with_prettier_dependency = Some(path_to_check.clone());
} }
@ -109,7 +116,7 @@ impl Prettier {
}) { }) {
anyhow::ensure!(has_prettier_in_node_modules(fs, &path_to_check).await?, "Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}, but it's not installed into workspace root's node_modules"); anyhow::ensure!(has_prettier_in_node_modules(fs, &path_to_check).await?, "Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}, but it's not installed into workspace root's node_modules");
log::info!("Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}"); log::info!("Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}");
return Ok(Some(path_to_check)); return Ok(ControlFlow::Continue(Some(path_to_check)));
} else { } else {
log::warn!("Skipping path {path_to_check:?} that has prettier in its 'node_modules' subdirectory, but is not included in its package.json workspaces {workspaces:?}"); log::warn!("Skipping path {path_to_check:?} that has prettier in its 'node_modules' subdirectory, but is not included in its package.json workspaces {workspaces:?}");
} }
@ -132,7 +139,7 @@ impl Prettier {
} }
None => { None => {
log::debug!("Found no prettier in ancestors of {locate_from:?}"); log::debug!("Found no prettier in ancestors of {locate_from:?}");
return Ok(None); return Ok(ControlFlow::Continue(None));
} }
} }
} }
@ -497,37 +504,40 @@ mod tests {
.await; .await;
assert!( assert!(
Prettier::locate_prettier_installation( matches!(
fs.as_ref(), Prettier::locate_prettier_installation(
&HashSet::default(), fs.as_ref(),
Path::new("/root/.config/zed/settings.json"), &HashSet::default(),
) Path::new("/root/.config/zed/settings.json"),
.await )
.unwrap() .await,
.is_none(), Ok(ControlFlow::Continue(None))
),
"Should successfully find no prettier for path hierarchy without it" "Should successfully find no prettier for path hierarchy without it"
); );
assert!( assert!(
Prettier::locate_prettier_installation( matches!(
fs.as_ref(), Prettier::locate_prettier_installation(
&HashSet::default(), fs.as_ref(),
Path::new("/root/work/project/src/index.js") &HashSet::default(),
) Path::new("/root/work/project/src/index.js")
.await )
.unwrap() .await,
.is_none(), Ok(ControlFlow::Continue(None))
),
"Should successfully find no prettier for path hierarchy that has node_modules with prettier, but no package.json mentions of it" "Should successfully find no prettier for path hierarchy that has node_modules with prettier, but no package.json mentions of it"
); );
assert!( assert!(
Prettier::locate_prettier_installation( matches!(
fs.as_ref(), Prettier::locate_prettier_installation(
&HashSet::default(), fs.as_ref(),
Path::new("/root/work/project/node_modules/expect/build/print.js") &HashSet::default(),
) Path::new("/root/work/project/node_modules/expect/build/print.js")
.await )
.unwrap() .await,
.is_none(), Ok(ControlFlow::Break(()))
"Even though it has package.json with prettier in it and no prettier on node_modules along the path, nothing should fail since declared inside node_modules" ),
"Should not format files inside node_modules/"
); );
} }
@ -580,7 +590,7 @@ mod tests {
) )
.await .await
.unwrap(), .unwrap(),
Some(PathBuf::from("/root/web_blog")), ControlFlow::Continue(Some(PathBuf::from("/root/web_blog"))),
"Should find a preinstalled prettier in the project root" "Should find a preinstalled prettier in the project root"
); );
assert_eq!( assert_eq!(
@ -591,8 +601,8 @@ mod tests {
) )
.await .await
.unwrap(), .unwrap(),
Some(PathBuf::from("/root/web_blog")), ControlFlow::Break(()),
"Should find a preinstalled prettier in the project root even for node_modules files" "Should not allow formatting node_modules/ contents"
); );
} }
@ -604,6 +614,18 @@ mod tests {
json!({ json!({
"work": { "work": {
"web_blog": { "web_blog": {
"node_modules": {
"expect": {
"build": {
"print.js": "// print.js file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.5.1"
}
}"#,
},
},
"pages": { "pages": {
"[slug].tsx": "// [slug].tsx file contents", "[slug].tsx": "// [slug].tsx file contents",
}, },
@ -624,33 +646,55 @@ mod tests {
) )
.await; .await;
let path = "/root/work/web_blog/node_modules/pages/[slug].tsx";
match Prettier::locate_prettier_installation( match Prettier::locate_prettier_installation(
fs.as_ref(), fs.as_ref(),
&HashSet::default(), &HashSet::default(),
Path::new(path) Path::new("/root/work/web_blog/pages/[slug].tsx")
) )
.await { .await {
Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"), Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"),
Err(e) => { Err(e) => {
let message = e.to_string(); let message = e.to_string();
assert!(message.contains(path), "Error message should mention which start file was used for location"); assert!(message.contains("/root/work/web_blog"), "Error message should mention which project had prettier defined");
assert!(message.contains("/root/work/web_blog"), "Error message should mention potential candidates without prettier node_modules contents");
}, },
}; };
assert_eq!( assert_eq!(
Prettier::locate_prettier_installation( Prettier::locate_prettier_installation(
fs.as_ref(), fs.as_ref(),
&HashSet::from_iter( &HashSet::from_iter(
[PathBuf::from("/root"), PathBuf::from("/root/work")].into_iter() [PathBuf::from("/root"), PathBuf::from("/root/work")].into_iter()
), ),
Path::new("/root/work/web_blog/node_modules/pages/[slug].tsx") Path::new("/root/work/web_blog/pages/[slug].tsx")
) )
.await .await
.unwrap(), .unwrap(),
Some(PathBuf::from("/root/work")), ControlFlow::Continue(Some(PathBuf::from("/root/work"))),
"Should return first cached value found without path checks" "Should return closest cached value found without path checks"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/web_blog/node_modules/expect/build/print.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should not allow formatting files inside node_modules/"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::from_iter(
[PathBuf::from("/root"), PathBuf::from("/root/work")].into_iter()
),
Path::new("/root/work/web_blog/node_modules/expect/build/print.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should ignore cache lookup for files inside node_modules/"
); );
} }
@ -674,7 +718,9 @@ mod tests {
}, },
}, },
}, },
"node_modules": {}, "node_modules": {
"test.js": "// test.js contents",
},
"package.json": r#"{ "package.json": r#"{
"devDependencies": { "devDependencies": {
"prettier": "^3.0.3" "prettier": "^3.0.3"
@ -703,9 +749,32 @@ mod tests {
&HashSet::default(), &HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx"), Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx"),
).await.unwrap(), ).await.unwrap(),
Some(PathBuf::from("/root/work/full-stack-foundations")), ControlFlow::Continue(Some(PathBuf::from("/root/work/full-stack-foundations"))),
"Should ascend to the multi-workspace root and find the prettier there", "Should ascend to the multi-workspace root and find the prettier there",
); );
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/node_modules/prettier/index.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should not allow formatting files inside root node_modules/"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/node_modules/test.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should not allow formatting files inside submodule's node_modules/"
);
} }
#[gpui::test] #[gpui::test]

View file

@ -7,6 +7,7 @@ use lsp::{LanguageServer, LanguageServerId};
use node_runtime::NodeRuntime; use node_runtime::NodeRuntime;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{ use std::{
ops::ControlFlow,
path::{Path, PathBuf}, path::{Path, PathBuf},
sync::Arc, sync::Arc,
}; };
@ -58,11 +59,17 @@ impl Prettier {
fs: &dyn Fs, fs: &dyn Fs,
installed_prettiers: &HashSet<PathBuf>, installed_prettiers: &HashSet<PathBuf>,
locate_from: &Path, locate_from: &Path,
) -> anyhow::Result<Option<PathBuf>> { ) -> anyhow::Result<ControlFlow<(), Option<PathBuf>>> {
let mut path_to_check = locate_from let mut path_to_check = locate_from
.components() .components()
.take_while(|component| component.as_os_str().to_string_lossy() != "node_modules") .take_while(|component| component.as_os_str().to_string_lossy() != "node_modules")
.collect::<PathBuf>(); .collect::<PathBuf>();
if path_to_check != locate_from {
log::debug!(
"Skipping prettier location for path {path_to_check:?} that is inside node_modules"
);
return Ok(ControlFlow::Break(()));
}
let path_to_check_metadata = fs let path_to_check_metadata = fs
.metadata(&path_to_check) .metadata(&path_to_check)
.await .await
@ -76,14 +83,14 @@ impl Prettier {
loop { loop {
if installed_prettiers.contains(&path_to_check) { if installed_prettiers.contains(&path_to_check) {
log::debug!("Found prettier path {path_to_check:?} in installed prettiers"); log::debug!("Found prettier path {path_to_check:?} in installed prettiers");
return Ok(Some(path_to_check)); return Ok(ControlFlow::Continue(Some(path_to_check)));
} else if let Some(package_json_contents) = } else if let Some(package_json_contents) =
read_package_json(fs, &path_to_check).await? read_package_json(fs, &path_to_check).await?
{ {
if has_prettier_in_package_json(&package_json_contents) { if has_prettier_in_package_json(&package_json_contents) {
if has_prettier_in_node_modules(fs, &path_to_check).await? { if has_prettier_in_node_modules(fs, &path_to_check).await? {
log::debug!("Found prettier path {path_to_check:?} in both package.json and node_modules"); log::debug!("Found prettier path {path_to_check:?} in both package.json and node_modules");
return Ok(Some(path_to_check)); return Ok(ControlFlow::Continue(Some(path_to_check)));
} else if project_path_with_prettier_dependency.is_none() { } else if project_path_with_prettier_dependency.is_none() {
project_path_with_prettier_dependency = Some(path_to_check.clone()); project_path_with_prettier_dependency = Some(path_to_check.clone());
} }
@ -109,7 +116,7 @@ impl Prettier {
}) { }) {
anyhow::ensure!(has_prettier_in_node_modules(fs, &path_to_check).await?, "Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}, but it's not installed into workspace root's node_modules"); anyhow::ensure!(has_prettier_in_node_modules(fs, &path_to_check).await?, "Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}, but it's not installed into workspace root's node_modules");
log::info!("Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}"); log::info!("Found prettier path {path_to_check:?} in the workspace root for project in {project_path_with_prettier_dependency:?}");
return Ok(Some(path_to_check)); return Ok(ControlFlow::Continue(Some(path_to_check)));
} else { } else {
log::warn!("Skipping path {path_to_check:?} that has prettier in its 'node_modules' subdirectory, but is not included in its package.json workspaces {workspaces:?}"); log::warn!("Skipping path {path_to_check:?} that has prettier in its 'node_modules' subdirectory, but is not included in its package.json workspaces {workspaces:?}");
} }
@ -132,7 +139,7 @@ impl Prettier {
} }
None => { None => {
log::debug!("Found no prettier in ancestors of {locate_from:?}"); log::debug!("Found no prettier in ancestors of {locate_from:?}");
return Ok(None); return Ok(ControlFlow::Continue(None));
} }
} }
} }
@ -527,37 +534,40 @@ mod tests {
.await; .await;
assert!( assert!(
Prettier::locate_prettier_installation( matches!(
fs.as_ref(), Prettier::locate_prettier_installation(
&HashSet::default(), fs.as_ref(),
Path::new("/root/.config/zed/settings.json"), &HashSet::default(),
) Path::new("/root/.config/zed/settings.json"),
.await )
.unwrap() .await,
.is_none(), Ok(ControlFlow::Continue(None))
),
"Should successfully find no prettier for path hierarchy without it" "Should successfully find no prettier for path hierarchy without it"
); );
assert!( assert!(
Prettier::locate_prettier_installation( matches!(
fs.as_ref(), Prettier::locate_prettier_installation(
&HashSet::default(), fs.as_ref(),
Path::new("/root/work/project/src/index.js") &HashSet::default(),
) Path::new("/root/work/project/src/index.js")
.await )
.unwrap() .await,
.is_none(), Ok(ControlFlow::Continue(None))
),
"Should successfully find no prettier for path hierarchy that has node_modules with prettier, but no package.json mentions of it" "Should successfully find no prettier for path hierarchy that has node_modules with prettier, but no package.json mentions of it"
); );
assert!( assert!(
Prettier::locate_prettier_installation( matches!(
fs.as_ref(), Prettier::locate_prettier_installation(
&HashSet::default(), fs.as_ref(),
Path::new("/root/work/project/node_modules/expect/build/print.js") &HashSet::default(),
) Path::new("/root/work/project/node_modules/expect/build/print.js")
.await )
.unwrap() .await,
.is_none(), Ok(ControlFlow::Break(()))
"Even though it has package.json with prettier in it and no prettier on node_modules along the path, nothing should fail since declared inside node_modules" ),
"Should not format files inside node_modules/"
); );
} }
@ -610,7 +620,7 @@ mod tests {
) )
.await .await
.unwrap(), .unwrap(),
Some(PathBuf::from("/root/web_blog")), ControlFlow::Continue(Some(PathBuf::from("/root/web_blog"))),
"Should find a preinstalled prettier in the project root" "Should find a preinstalled prettier in the project root"
); );
assert_eq!( assert_eq!(
@ -621,8 +631,8 @@ mod tests {
) )
.await .await
.unwrap(), .unwrap(),
Some(PathBuf::from("/root/web_blog")), ControlFlow::Break(()),
"Should find a preinstalled prettier in the project root even for node_modules files" "Should not allow formatting node_modules/ contents"
); );
} }
@ -634,6 +644,18 @@ mod tests {
json!({ json!({
"work": { "work": {
"web_blog": { "web_blog": {
"node_modules": {
"expect": {
"build": {
"print.js": "// print.js file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.5.1"
}
}"#,
},
},
"pages": { "pages": {
"[slug].tsx": "// [slug].tsx file contents", "[slug].tsx": "// [slug].tsx file contents",
}, },
@ -654,18 +676,16 @@ mod tests {
) )
.await; .await;
let path = "/root/work/web_blog/node_modules/pages/[slug].tsx";
match Prettier::locate_prettier_installation( match Prettier::locate_prettier_installation(
fs.as_ref(), fs.as_ref(),
&HashSet::default(), &HashSet::default(),
Path::new(path) Path::new("/root/work/web_blog/pages/[slug].tsx")
) )
.await { .await {
Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"), Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"),
Err(e) => { Err(e) => {
let message = e.to_string(); let message = e.to_string();
assert!(message.contains(path), "Error message should mention which start file was used for location"); assert!(message.contains("/root/work/web_blog"), "Error message should mention which project had prettier defined");
assert!(message.contains("/root/work/web_blog"), "Error message should mention potential candidates without prettier node_modules contents");
}, },
}; };
@ -675,12 +695,37 @@ mod tests {
&HashSet::from_iter( &HashSet::from_iter(
[PathBuf::from("/root"), PathBuf::from("/root/work")].into_iter() [PathBuf::from("/root"), PathBuf::from("/root/work")].into_iter()
), ),
Path::new("/root/work/web_blog/node_modules/pages/[slug].tsx") Path::new("/root/work/web_blog/pages/[slug].tsx")
) )
.await .await
.unwrap(), .unwrap(),
Some(PathBuf::from("/root/work")), ControlFlow::Continue(Some(PathBuf::from("/root/work"))),
"Should return first cached value found without path checks" "Should return closest cached value found without path checks"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/web_blog/node_modules/expect/build/print.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should not allow formatting files inside node_modules/"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::from_iter(
[PathBuf::from("/root"), PathBuf::from("/root/work")].into_iter()
),
Path::new("/root/work/web_blog/node_modules/expect/build/print.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should ignore cache lookup for files inside node_modules/"
); );
} }
@ -704,7 +749,9 @@ mod tests {
}, },
}, },
}, },
"node_modules": {}, "node_modules": {
"test.js": "// test.js contents",
},
"package.json": r#"{ "package.json": r#"{
"devDependencies": { "devDependencies": {
"prettier": "^3.0.3" "prettier": "^3.0.3"
@ -733,9 +780,32 @@ mod tests {
&HashSet::default(), &HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx"), Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx"),
).await.unwrap(), ).await.unwrap(),
Some(PathBuf::from("/root/work/full-stack-foundations")), ControlFlow::Continue(Some(PathBuf::from("/root/work/full-stack-foundations"))),
"Should ascend to the multi-workspace root and find the prettier there", "Should ascend to the multi-workspace root and find the prettier there",
); );
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/node_modules/prettier/index.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should not allow formatting files inside root node_modules/"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/node_modules/test.js")
)
.await
.unwrap(),
ControlFlow::Break(()),
"Should not allow formatting files inside submodule's node_modules/"
);
} }
#[gpui::test] #[gpui::test]

View file

@ -69,7 +69,7 @@ use std::{
hash::Hash, hash::Hash,
mem, mem,
num::NonZeroU32, num::NonZeroU32,
ops::Range, ops::{ControlFlow, Range},
path::{self, Component, Path, PathBuf}, path::{self, Component, Path, PathBuf},
process::Stdio, process::Stdio,
str, str,
@ -8442,7 +8442,10 @@ impl Project {
}) })
.await .await
{ {
Ok(None) => { Ok(ControlFlow::Break(())) => {
return None;
}
Ok(ControlFlow::Continue(None)) => {
let started_default_prettier = let started_default_prettier =
project.update(&mut cx, |project, _| { project.update(&mut cx, |project, _| {
project project
@ -8466,7 +8469,7 @@ impl Project {
} }
} }
} }
Ok(Some(prettier_dir)) => { Ok(ControlFlow::Continue(Some(prettier_dir))) => {
project.update(&mut cx, |project, _| { project.update(&mut cx, |project, _| {
project project
.prettiers_per_worktree .prettiers_per_worktree
@ -8593,7 +8596,7 @@ impl Project {
.await .await
}) })
} }
None => Task::ready(Ok(None)), None => Task::ready(Ok(ControlFlow::Break(()))),
}; };
let mut plugins_to_install = prettier_plugins; let mut plugins_to_install = prettier_plugins;
let previous_installation_process = let previous_installation_process =
@ -8622,8 +8625,9 @@ impl Project {
.context("locate prettier installation") .context("locate prettier installation")
.map_err(Arc::new)? .map_err(Arc::new)?
{ {
Some(_non_default_prettier) => return Ok(()), ControlFlow::Break(()) => return Ok(()),
None => { ControlFlow::Continue(Some(_non_default_prettier)) => return Ok(()),
ControlFlow::Continue(None) => {
let mut needs_install = match previous_installation_process { let mut needs_install = match previous_installation_process {
Some(previous_installation_process) => { Some(previous_installation_process) => {
previous_installation_process.await.is_err() previous_installation_process.await.is_err()

View file

@ -69,7 +69,7 @@ use std::{
hash::Hash, hash::Hash,
mem, mem,
num::NonZeroU32, num::NonZeroU32,
ops::Range, ops::{ControlFlow, Range},
path::{self, Component, Path, PathBuf}, path::{self, Component, Path, PathBuf},
process::Stdio, process::Stdio,
str, str,
@ -8488,7 +8488,10 @@ impl Project {
}) })
.await .await
{ {
Ok(None) => { Ok(ControlFlow::Break(())) => {
return None;
}
Ok(ControlFlow::Continue(None)) => {
match project.update(&mut cx, |project, _| { match project.update(&mut cx, |project, _| {
project project
.prettiers_per_worktree .prettiers_per_worktree
@ -8520,7 +8523,7 @@ impl Project {
.shared())), .shared())),
} }
} }
Ok(Some(prettier_dir)) => { Ok(ControlFlow::Continue(Some(prettier_dir))) => {
match project.update(&mut cx, |project, _| { match project.update(&mut cx, |project, _| {
project project
.prettiers_per_worktree .prettiers_per_worktree
@ -8662,7 +8665,7 @@ impl Project {
.await .await
}) })
} }
None => Task::ready(Ok(None)), None => Task::ready(Ok(ControlFlow::Break(()))),
}; };
let mut plugins_to_install = prettier_plugins; let mut plugins_to_install = prettier_plugins;
let previous_installation_process = let previous_installation_process =
@ -8692,8 +8695,9 @@ impl Project {
.context("locate prettier installation") .context("locate prettier installation")
.map_err(Arc::new)? .map_err(Arc::new)?
{ {
Some(_non_default_prettier) => return Ok(()), ControlFlow::Break(()) => return Ok(()),
None => { ControlFlow::Continue(Some(_non_default_prettier)) => return Ok(()),
ControlFlow::Continue(None) => {
let mut needs_install = match previous_installation_process { let mut needs_install = match previous_installation_process {
Some(previous_installation_process) => { Some(previous_installation_process) => {
previous_installation_process.await.is_err() previous_installation_process.await.is_err()

View file

@ -19,8 +19,7 @@ pub fn derive_refineable(input: TokenStream) -> TokenStream {
let refineable_attr = attrs.iter().find(|attr| attr.path.is_ident("refineable")); let refineable_attr = attrs.iter().find(|attr| attr.path.is_ident("refineable"));
let mut impl_debug_on_refinement = false; let mut impl_debug_on_refinement = false;
let mut derive_serialize_on_refinement = false; let mut refinement_traits_to_derive = vec![];
let mut derive_deserialize_on_refinement = false;
if let Some(refineable_attr) = refineable_attr { if let Some(refineable_attr) = refineable_attr {
if let Ok(syn::Meta::List(meta_list)) = refineable_attr.parse_meta() { if let Ok(syn::Meta::List(meta_list)) = refineable_attr.parse_meta() {
@ -29,16 +28,10 @@ pub fn derive_refineable(input: TokenStream) -> TokenStream {
continue; continue;
}; };
if path.is_ident("debug") { if path.is_ident("Debug") {
impl_debug_on_refinement = true; impl_debug_on_refinement = true;
} } else {
refinement_traits_to_derive.push(path);
if path.is_ident("serialize") {
derive_serialize_on_refinement = true;
}
if path.is_ident("deserialize") {
derive_deserialize_on_refinement = true;
} }
} }
} }
@ -259,22 +252,14 @@ pub fn derive_refineable(input: TokenStream) -> TokenStream {
quote! {} quote! {}
}; };
let derive_serialize = if derive_serialize_on_refinement { let mut derive_stream = quote! {};
quote! { #[derive(serde::Serialize)]} for trait_to_derive in refinement_traits_to_derive {
} else { derive_stream.extend(quote! { #[derive(#trait_to_derive)] })
quote! {} }
};
let derive_deserialize = if derive_deserialize_on_refinement {
quote! { #[derive(serde::Deserialize)]}
} else {
quote! {}
};
let gen = quote! { let gen = quote! {
#[derive(Clone)] #[derive(Clone)]
#derive_serialize #derive_stream
#derive_deserialize
pub struct #refinement_ident #impl_generics { pub struct #refinement_ident #impl_generics {
#( #field_visibilities #field_names: #wrapped_types ),* #( #field_visibilities #field_names: #wrapped_types ),*
} }

View file

@ -6,6 +6,7 @@ publish = false
[features] [features]
default = ["stories"] default = ["stories"]
importing-themes = []
stories = ["dep:itertools"] stories = ["dep:itertools"]
test-support = [ test-support = [
"gpui/test-support", "gpui/test-support",

View file

@ -1,9 +1,7 @@
use std::sync::Arc; use crate::{PlayerColors, SyntaxTheme};
use gpui::Hsla; use gpui::Hsla;
use refineable::Refineable; use refineable::Refineable;
use std::sync::Arc;
use crate::{PlayerColors, SyntaxTheme};
#[derive(Clone)] #[derive(Clone)]
pub struct SystemColors { pub struct SystemColors {
@ -14,7 +12,7 @@ pub struct SystemColors {
} }
#[derive(Refineable, Clone, Debug)] #[derive(Refineable, Clone, Debug)]
#[refineable(debug)] #[refineable(Debug, serde::Deserialize)]
pub struct StatusColors { pub struct StatusColors {
pub conflict: Hsla, pub conflict: Hsla,
pub created: Hsla, pub created: Hsla,
@ -30,7 +28,7 @@ pub struct StatusColors {
} }
#[derive(Refineable, Clone, Debug)] #[derive(Refineable, Clone, Debug)]
#[refineable(debug, deserialize)] #[refineable(Debug, serde::Deserialize)]
pub struct ThemeColors { pub struct ThemeColors {
pub border: Hsla, pub border: Hsla,
/// Border color. Used for deemphasized borders, like a visual divider between two sections /// Border color. Used for deemphasized borders, like a visual divider between two sections

View file

@ -1,5 +1,3 @@
use std::num::ParseIntError;
use gpui::{hsla, Hsla, Rgba}; use gpui::{hsla, Hsla, Rgba};
use crate::colors::{StatusColors, SystemColors, ThemeColors}; use crate::colors::{StatusColors, SystemColors, ThemeColors};
@ -142,24 +140,24 @@ impl SyntaxTheme {
("boolean".into(), tomato().light().step_11().into()), ("boolean".into(), tomato().light().step_11().into()),
("comment".into(), neutral().light().step_11().into()), ("comment".into(), neutral().light().step_11().into()),
("comment.doc".into(), iris().light().step_12().into()), ("comment.doc".into(), iris().light().step_12().into()),
("constant".into(), red().light().step_7().into()), ("constant".into(), red().light().step_9().into()),
("constructor".into(), red().light().step_7().into()), ("constructor".into(), red().light().step_9().into()),
("embedded".into(), red().light().step_7().into()), ("embedded".into(), red().light().step_9().into()),
("emphasis".into(), red().light().step_7().into()), ("emphasis".into(), red().light().step_9().into()),
("emphasis.strong".into(), red().light().step_7().into()), ("emphasis.strong".into(), red().light().step_9().into()),
("enum".into(), red().light().step_7().into()), ("enum".into(), red().light().step_9().into()),
("function".into(), red().light().step_7().into()), ("function".into(), red().light().step_9().into()),
("hint".into(), red().light().step_7().into()), ("hint".into(), red().light().step_9().into()),
("keyword".into(), orange().light().step_11().into()), ("keyword".into(), orange().light().step_11().into()),
("label".into(), red().light().step_7().into()), ("label".into(), red().light().step_9().into()),
("link_text".into(), red().light().step_7().into()), ("link_text".into(), red().light().step_9().into()),
("link_uri".into(), red().light().step_7().into()), ("link_uri".into(), red().light().step_9().into()),
("number".into(), red().light().step_7().into()), ("number".into(), red().light().step_9().into()),
("operator".into(), red().light().step_7().into()), ("operator".into(), red().light().step_9().into()),
("predictive".into(), red().light().step_7().into()), ("predictive".into(), red().light().step_9().into()),
("preproc".into(), red().light().step_7().into()), ("preproc".into(), red().light().step_9().into()),
("primary".into(), red().light().step_7().into()), ("primary".into(), red().light().step_9().into()),
("property".into(), red().light().step_7().into()), ("property".into(), red().light().step_9().into()),
("punctuation".into(), neutral().light().step_11().into()), ("punctuation".into(), neutral().light().step_11().into()),
( (
"punctuation.bracket".into(), "punctuation.bracket".into(),
@ -173,22 +171,22 @@ impl SyntaxTheme {
"punctuation.list_marker".into(), "punctuation.list_marker".into(),
blue().light().step_11().into(), blue().light().step_11().into(),
), ),
("punctuation.special".into(), red().light().step_7().into()), ("punctuation.special".into(), red().light().step_9().into()),
("string".into(), jade().light().step_11().into()), ("string".into(), jade().light().step_11().into()),
("string.escape".into(), red().light().step_7().into()), ("string.escape".into(), red().light().step_9().into()),
("string.regex".into(), tomato().light().step_11().into()), ("string.regex".into(), tomato().light().step_11().into()),
("string.special".into(), red().light().step_7().into()), ("string.special".into(), red().light().step_9().into()),
( (
"string.special.symbol".into(), "string.special.symbol".into(),
red().light().step_7().into(), red().light().step_9().into(),
), ),
("tag".into(), red().light().step_7().into()), ("tag".into(), red().light().step_9().into()),
("text.literal".into(), red().light().step_7().into()), ("text.literal".into(), red().light().step_9().into()),
("title".into(), red().light().step_7().into()), ("title".into(), red().light().step_9().into()),
("type".into(), red().light().step_7().into()), ("type".into(), red().light().step_9().into()),
("variable".into(), red().light().step_7().into()), ("variable".into(), red().light().step_9().into()),
("variable.special".into(), red().light().step_7().into()), ("variable.special".into(), red().light().step_9().into()),
("variant".into(), red().light().step_7().into()), ("variant".into(), red().light().step_9().into()),
], ],
inlay_style: tomato().light().step_1().into(), // todo!("nate: use a proper style") inlay_style: tomato().light().step_1().into(), // todo!("nate: use a proper style")
suggestion_style: orange().light().step_1().into(), // todo!("nate: use proper style") suggestion_style: orange().light().step_1().into(), // todo!("nate: use proper style")
@ -198,28 +196,28 @@ impl SyntaxTheme {
pub fn default_dark() -> Self { pub fn default_dark() -> Self {
Self { Self {
highlights: vec![ highlights: vec![
("attribute".into(), cyan().dark().step_11().into()), ("attribute".into(), tomato().dark().step_11().into()),
("boolean".into(), tomato().dark().step_11().into()), ("boolean".into(), tomato().dark().step_11().into()),
("comment".into(), neutral().dark().step_11().into()), ("comment".into(), neutral().dark().step_11().into()),
("comment.doc".into(), iris().dark().step_12().into()), ("comment.doc".into(), iris().dark().step_12().into()),
("constant".into(), red().dark().step_7().into()), ("constant".into(), orange().dark().step_11().into()),
("constructor".into(), red().dark().step_7().into()), ("constructor".into(), gold().dark().step_11().into()),
("embedded".into(), red().dark().step_7().into()), ("embedded".into(), red().dark().step_11().into()),
("emphasis".into(), red().dark().step_7().into()), ("emphasis".into(), red().dark().step_11().into()),
("emphasis.strong".into(), red().dark().step_7().into()), ("emphasis.strong".into(), red().dark().step_11().into()),
("enum".into(), red().dark().step_7().into()), ("enum".into(), yellow().dark().step_11().into()),
("function".into(), red().dark().step_7().into()), ("function".into(), blue().dark().step_11().into()),
("hint".into(), red().dark().step_7().into()), ("hint".into(), indigo().dark().step_11().into()),
("keyword".into(), orange().dark().step_11().into()), ("keyword".into(), plum().dark().step_11().into()),
("label".into(), red().dark().step_7().into()), ("label".into(), red().dark().step_11().into()),
("link_text".into(), red().dark().step_7().into()), ("link_text".into(), red().dark().step_11().into()),
("link_uri".into(), red().dark().step_7().into()), ("link_uri".into(), red().dark().step_11().into()),
("number".into(), red().dark().step_7().into()), ("number".into(), red().dark().step_11().into()),
("operator".into(), red().dark().step_7().into()), ("operator".into(), red().dark().step_11().into()),
("predictive".into(), red().dark().step_7().into()), ("predictive".into(), red().dark().step_11().into()),
("preproc".into(), red().dark().step_7().into()), ("preproc".into(), red().dark().step_11().into()),
("primary".into(), red().dark().step_7().into()), ("primary".into(), red().dark().step_11().into()),
("property".into(), red().dark().step_7().into()), ("property".into(), red().dark().step_11().into()),
("punctuation".into(), neutral().dark().step_11().into()), ("punctuation".into(), neutral().dark().step_11().into()),
( (
"punctuation.bracket".into(), "punctuation.bracket".into(),
@ -233,22 +231,25 @@ impl SyntaxTheme {
"punctuation.list_marker".into(), "punctuation.list_marker".into(),
blue().dark().step_11().into(), blue().dark().step_11().into(),
), ),
("punctuation.special".into(), red().dark().step_7().into()), ("punctuation.special".into(), red().dark().step_11().into()),
("string".into(), jade().dark().step_11().into()), ("string".into(), lime().dark().step_11().into()),
("string.escape".into(), red().dark().step_7().into()), ("string.escape".into(), orange().dark().step_11().into()),
("string.regex".into(), tomato().dark().step_11().into()), ("string.regex".into(), tomato().dark().step_11().into()),
("string.special".into(), red().dark().step_7().into()), ("string.special".into(), red().dark().step_11().into()),
("string.special.symbol".into(), red().dark().step_7().into()), (
("tag".into(), red().dark().step_7().into()), "string.special.symbol".into(),
("text.literal".into(), red().dark().step_7().into()), red().dark().step_11().into(),
("title".into(), red().dark().step_7().into()), ),
("type".into(), red().dark().step_7().into()), ("tag".into(), red().dark().step_11().into()),
("variable".into(), red().dark().step_7().into()), ("text.literal".into(), purple().dark().step_11().into()),
("variable.special".into(), red().dark().step_7().into()), ("title".into(), sky().dark().step_11().into()),
("variant".into(), red().dark().step_7().into()), ("type".into(), mint().dark().step_11().into()),
("variable".into(), red().dark().step_11().into()),
("variable.special".into(), red().dark().step_11().into()),
("variant".into(), red().dark().step_11().into()),
], ],
inlay_style: tomato().dark().step_1().into(), // todo!("nate: use a proper style") inlay_style: neutral().dark().step_11().into(), // todo!("nate: use a proper style")
suggestion_style: orange().dark().step_1().into(), // todo!("nate: use a proper style") suggestion_style: orange().dark().step_11().into(), // todo!("nate: use a proper style")
} }
} }
} }
@ -278,7 +279,7 @@ impl ThemeColors {
ghost_element_active: neutral().light().step_5(), ghost_element_active: neutral().light().step_5(),
ghost_element_selected: neutral().light().step_5(), ghost_element_selected: neutral().light().step_5(),
ghost_element_disabled: neutral().light_alpha().step_3(), ghost_element_disabled: neutral().light_alpha().step_3(),
text: neutral().light().step_12(), text: yellow().light().step_9(),
text_muted: neutral().light().step_11(), text_muted: neutral().light().step_11(),
text_placeholder: neutral().light().step_10(), text_placeholder: neutral().light().step_10(),
text_disabled: neutral().light().step_9(), text_disabled: neutral().light().step_9(),
@ -367,11 +368,11 @@ impl ThemeColors {
tab_active_background: neutral().dark().step_1(), tab_active_background: neutral().dark().step_1(),
tab_inactive_background: neutral().dark().step_2(), tab_inactive_background: neutral().dark().step_2(),
editor_background: neutral().dark().step_1(), editor_background: neutral().dark().step_1(),
editor_gutter_background: neutral().dark().step_1(), // todo!("pick the right colors") editor_gutter_background: neutral().dark().step_1(),
editor_subheader_background: neutral().dark().step_2(), editor_subheader_background: neutral().dark().step_3(),
editor_active_line_background: 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_line_number: neutral().dark_alpha().step_10(),
editor_active_line_number: neutral().dark_alpha().step_3(), // todo!("pick the right colors") editor_active_line_number: neutral().dark_alpha().step_12(),
editor_highlighted_line_background: neutral().dark_alpha().step_4(), // 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_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_wrap_guide: neutral().dark_alpha().step_4(), // todo!("pick the right colors")
@ -410,10 +411,10 @@ struct StaticColorScaleSet {
} }
impl TryFrom<StaticColorScaleSet> for ColorScaleSet { impl TryFrom<StaticColorScaleSet> for ColorScaleSet {
type Error = ParseIntError; type Error = anyhow::Error;
fn try_from(value: StaticColorScaleSet) -> Result<Self, Self::Error> { fn try_from(value: StaticColorScaleSet) -> Result<Self, Self::Error> {
fn to_color_scale(scale: StaticColorScale) -> Result<ColorScale, ParseIntError> { fn to_color_scale(scale: StaticColorScale) -> Result<ColorScale, anyhow::Error> {
scale scale
.into_iter() .into_iter()
.map(|color| Rgba::try_from(color).map(Hsla::from)) .map(|color| Rgba::try_from(color).map(Hsla::from))

View file

@ -2,7 +2,7 @@ use std::collections::HashMap;
use std::sync::Arc; use std::sync::Arc;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use gpui::SharedString; use gpui::{HighlightStyle, SharedString};
use refineable::Refineable; use refineable::Refineable;
use crate::{ use crate::{
@ -27,21 +27,47 @@ impl ThemeRegistry {
} }
} }
#[allow(unused)]
fn insert_user_theme_familes(&mut self, families: impl IntoIterator<Item = UserThemeFamily>) { fn insert_user_theme_familes(&mut self, families: impl IntoIterator<Item = UserThemeFamily>) {
for family in families.into_iter() { for family in families.into_iter() {
self.insert_user_themes(family.themes); self.insert_user_themes(family.themes);
} }
} }
#[allow(unused)]
fn insert_user_themes(&mut self, themes: impl IntoIterator<Item = UserTheme>) { fn insert_user_themes(&mut self, themes: impl IntoIterator<Item = UserTheme>) {
self.insert_themes(themes.into_iter().map(|user_theme| { self.insert_themes(themes.into_iter().map(|user_theme| {
let mut theme_colors = match user_theme.appearance { let mut theme_colors = match user_theme.appearance {
Appearance::Light => ThemeColors::default_light(), Appearance::Light => ThemeColors::default_light(),
Appearance::Dark => ThemeColors::default_dark(), Appearance::Dark => ThemeColors::default_dark(),
}; };
theme_colors.refine(&user_theme.styles.colors); theme_colors.refine(&user_theme.styles.colors);
let mut status_colors = StatusColors::default();
status_colors.refine(&user_theme.styles.status);
let mut syntax_colors = match user_theme.appearance {
Appearance::Light => SyntaxTheme::default_light(),
Appearance::Dark => SyntaxTheme::default_dark(),
};
if let Some(user_syntax) = user_theme.styles.syntax {
syntax_colors.highlights = user_syntax
.highlights
.iter()
.map(|(syntax_token, highlight)| {
(
syntax_token.clone(),
HighlightStyle {
color: highlight.color,
font_style: highlight.font_style.map(Into::into),
font_weight: highlight.font_weight.map(Into::into),
..Default::default()
},
)
})
.collect::<Vec<_>>();
}
Theme { Theme {
id: uuid::Uuid::new_v4().to_string(), id: uuid::Uuid::new_v4().to_string(),
name: user_theme.name.into(), name: user_theme.name.into(),
@ -49,12 +75,9 @@ impl ThemeRegistry {
styles: ThemeStyles { styles: ThemeStyles {
system: SystemColors::default(), system: SystemColors::default(),
colors: theme_colors, colors: theme_colors,
status: StatusColors::default(), status: status_colors,
player: PlayerColors::default(), player: PlayerColors::default(),
syntax: match user_theme.appearance { syntax: Arc::new(syntax_colors),
Appearance::Light => Arc::new(SyntaxTheme::default_light()),
Appearance::Dark => Arc::new(SyntaxTheme::default_dark()),
},
}, },
} }
})); }));
@ -83,6 +106,8 @@ impl Default for ThemeRegistry {
}; };
this.insert_theme_families([zed_pro_family()]); this.insert_theme_families([zed_pro_family()]);
#[cfg(not(feature = "importing-themes"))]
this.insert_user_theme_familes(crate::all_user_themes()); this.insert_user_theme_familes(crate::all_user_themes());
this this

View file

@ -128,6 +128,8 @@ impl ColorScale {
} }
/// `Step 10` - Used for hovered or active solid backgrounds, particularly when `Step 9` is their normal state. /// `Step 10` - Used for hovered or active solid backgrounds, particularly when `Step 9` is their normal state.
///
/// May also be used for extremely low contrast text. This should be used sparingly, as it may be difficult to read.
#[inline] #[inline]
pub fn step_10(&self) -> Hsla { pub fn step_10(&self) -> Hsla {
self.step(ColorScaleStep::TEN) self.step(ColorScaleStep::TEN)

View file

@ -6,6 +6,7 @@ mod registry;
mod scale; mod scale;
mod settings; mod settings;
mod syntax; mod syntax;
#[cfg(not(feature = "importing-themes"))]
mod themes; mod themes;
mod user_theme; mod user_theme;
@ -20,6 +21,7 @@ pub use registry::*;
pub use scale::*; pub use scale::*;
pub use settings::*; pub use settings::*;
pub use syntax::*; pub use syntax::*;
#[cfg(not(feature = "importing-themes"))]
pub use themes::*; pub use themes::*;
pub use user_theme::*; pub use user_theme::*;

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn andromeda() -> UserThemeFamily { pub fn andromeda() -> UserThemeFamily {
@ -19,7 +21,7 @@ pub fn andromeda() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x1b1d23ff).into()), border: Some(rgba(0x1b1d23ff).into()),
border_variant: Some(rgba(0x1b1d23ff).into()), border_variant: Some(rgba(0x1b1d23ff).into()),
border_focused: Some(rgba(0x1b1d23ff).into()), border_focused: Some(rgba(0x746f77ff).into()),
border_selected: Some(rgba(0x1b1d23ff).into()), border_selected: Some(rgba(0x1b1d23ff).into()),
border_transparent: Some(rgba(0x1b1d23ff).into()), border_transparent: Some(rgba(0x1b1d23ff).into()),
border_disabled: Some(rgba(0x1b1d23ff).into()), border_disabled: Some(rgba(0x1b1d23ff).into()),
@ -27,9 +29,17 @@ pub fn andromeda() -> UserThemeFamily {
surface_background: Some(rgba(0x23262eff).into()), surface_background: Some(rgba(0x23262eff).into()),
background: Some(rgba(0x23262eff).into()), background: Some(rgba(0x23262eff).into()),
element_background: Some(rgba(0x00e8c5cc).into()), element_background: Some(rgba(0x00e8c5cc).into()),
element_hover: Some(rgba(0x23262eff).into()),
element_selected: Some(rgba(0x23262eff).into()),
drop_target_background: Some(rgba(0x3a404eff).into()),
ghost_element_hover: Some(rgba(0x23262eff).into()),
text: Some(rgba(0xd4cdd8ff).into()), text: Some(rgba(0xd4cdd8ff).into()),
tab_inactive_background: Some(rgba(0x23262eff).into()), tab_inactive_background: Some(rgba(0x23262eff).into()),
tab_active_background: Some(rgba(0x23262eff).into()), tab_active_background: Some(rgba(0x23262eff).into()),
editor_background: Some(rgba(0x23262eff).into()),
editor_gutter_background: Some(rgba(0x23262eff).into()),
editor_line_number: Some(rgba(0x746f77ff).into()),
editor_active_line_number: Some(rgba(0xd4cdd8ff).into()),
terminal_ansi_bright_red: Some(rgba(0xee5d42ff).into()), terminal_ansi_bright_red: Some(rgba(0xee5d42ff).into()),
terminal_ansi_bright_green: Some(rgba(0x95e072ff).into()), terminal_ansi_bright_green: Some(rgba(0x95e072ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xffe66dff).into()), terminal_ansi_bright_yellow: Some(rgba(0xffe66dff).into()),
@ -44,6 +54,107 @@ pub fn andromeda() -> UserThemeFamily {
terminal_ansi_cyan: Some(rgba(0x00e8c6ff).into()), terminal_ansi_cyan: Some(rgba(0x00e8c6ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xfc634cff).into()),
error: Some(rgba(0xfc634cff).into()),
hidden: Some(rgba(0x746f77ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xf39c11ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x9fa0a6cc).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xc64dedff).into()),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xf39c11ff).into()),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xffe66dff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xc64dedff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xf39c11ff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0xee5d42ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0x95e072ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0xf92571ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0x95e072ff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xffe66dff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0x00e8c6ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -53,7 +164,7 @@ pub fn andromeda() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x1b1d23ff).into()), border: Some(rgba(0x1b1d23ff).into()),
border_variant: Some(rgba(0x1b1d23ff).into()), border_variant: Some(rgba(0x1b1d23ff).into()),
border_focused: Some(rgba(0x1b1d23ff).into()), border_focused: Some(rgba(0x746f77ff).into()),
border_selected: Some(rgba(0x1b1d23ff).into()), border_selected: Some(rgba(0x1b1d23ff).into()),
border_transparent: Some(rgba(0x1b1d23ff).into()), border_transparent: Some(rgba(0x1b1d23ff).into()),
border_disabled: Some(rgba(0x1b1d23ff).into()), border_disabled: Some(rgba(0x1b1d23ff).into()),
@ -61,9 +172,17 @@ pub fn andromeda() -> UserThemeFamily {
surface_background: Some(rgba(0x23262eff).into()), surface_background: Some(rgba(0x23262eff).into()),
background: Some(rgba(0x262933ff).into()), background: Some(rgba(0x262933ff).into()),
element_background: Some(rgba(0x00e8c5cc).into()), element_background: Some(rgba(0x00e8c5cc).into()),
element_hover: Some(rgba(0x23262eff).into()),
element_selected: Some(rgba(0x23262eff).into()),
drop_target_background: Some(rgba(0x3a404eff).into()),
ghost_element_hover: Some(rgba(0x23262eff).into()),
text: Some(rgba(0xd4cdd8ff).into()), text: Some(rgba(0xd4cdd8ff).into()),
tab_inactive_background: Some(rgba(0x23262eff).into()), tab_inactive_background: Some(rgba(0x23262eff).into()),
tab_active_background: Some(rgba(0x262933ff).into()), tab_active_background: Some(rgba(0x262933ff).into()),
editor_background: Some(rgba(0x262933ff).into()),
editor_gutter_background: Some(rgba(0x262933ff).into()),
editor_line_number: Some(rgba(0x746f77ff).into()),
editor_active_line_number: Some(rgba(0xd4cdd8ff).into()),
terminal_ansi_bright_red: Some(rgba(0xee5d42ff).into()), terminal_ansi_bright_red: Some(rgba(0xee5d42ff).into()),
terminal_ansi_bright_green: Some(rgba(0x95e072ff).into()), terminal_ansi_bright_green: Some(rgba(0x95e072ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xffe66dff).into()), terminal_ansi_bright_yellow: Some(rgba(0xffe66dff).into()),
@ -78,6 +197,107 @@ pub fn andromeda() -> UserThemeFamily {
terminal_ansi_cyan: Some(rgba(0x00e8c6ff).into()), terminal_ansi_cyan: Some(rgba(0x00e8c6ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xfc634cff).into()),
error: Some(rgba(0xfc634cff).into()),
hidden: Some(rgba(0x746f77ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xf39c11ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x9fa0a6cc).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xc64dedff).into()),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xf39c11ff).into()),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xffe66dff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xc64dedff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xf39c11ff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0xee5d42ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0x95e072ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0xf92571ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0x95e072ff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xffe66dff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0x00e8c6ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
], ],

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn ayu() -> UserThemeFamily { pub fn ayu() -> UserThemeFamily {
@ -19,7 +21,7 @@ pub fn ayu() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x6b7d8f1f).into()), border: Some(rgba(0x6b7d8f1f).into()),
border_variant: Some(rgba(0x6b7d8f1f).into()), border_variant: Some(rgba(0x6b7d8f1f).into()),
border_focused: Some(rgba(0x6b7d8f1f).into()), border_focused: Some(rgba(0xffaa32b3).into()),
border_selected: Some(rgba(0x6b7d8f1f).into()), border_selected: Some(rgba(0x6b7d8f1f).into()),
border_transparent: Some(rgba(0x6b7d8f1f).into()), border_transparent: Some(rgba(0x6b7d8f1f).into()),
border_disabled: Some(rgba(0x6b7d8f1f).into()), border_disabled: Some(rgba(0x6b7d8f1f).into()),
@ -27,9 +29,16 @@ pub fn ayu() -> UserThemeFamily {
surface_background: Some(rgba(0xf8f9faff).into()), surface_background: Some(rgba(0xf8f9faff).into()),
background: Some(rgba(0xf8f9faff).into()), background: Some(rgba(0xf8f9faff).into()),
element_background: Some(rgba(0xffaa32ff).into()), element_background: Some(rgba(0xffaa32ff).into()),
element_hover: Some(rgba(0x55728f1f).into()),
element_selected: Some(rgba(0x55728f1f).into()),
ghost_element_hover: Some(rgba(0x55728f1f).into()),
text: Some(rgba(0x8a9199ff).into()), text: Some(rgba(0x8a9199ff).into()),
tab_inactive_background: Some(rgba(0xf8f9faff).into()), tab_inactive_background: Some(rgba(0xf8f9faff).into()),
tab_active_background: Some(rgba(0xf8f9faff).into()), tab_active_background: Some(rgba(0xf8f9faff).into()),
editor_background: Some(rgba(0xf8f9faff).into()),
editor_gutter_background: Some(rgba(0xf8f9faff).into()),
editor_line_number: Some(rgba(0x8a919966).into()),
editor_active_line_number: Some(rgba(0x5c6166ff).into()),
terminal_background: Some(rgba(0xf8f9faff).into()), terminal_background: Some(rgba(0xf8f9faff).into()),
terminal_ansi_bright_black: Some(rgba(0x686868ff).into()), terminal_ansi_bright_black: Some(rgba(0x686868ff).into()),
terminal_ansi_bright_red: Some(rgba(0xef7070ff).into()), terminal_ansi_bright_red: Some(rgba(0xef7070ff).into()),
@ -49,6 +58,222 @@ pub fn ayu() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xc7c7c7ff).into()), terminal_ansi_white: Some(rgba(0xc7c7c7ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xe65050ff).into()),
error: Some(rgba(0xe65050ff).into()),
hidden: Some(rgba(0x8a9199ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xf2ad48ff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xa37accff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x787b8099).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x4bbf98ff).into()),
..Default::default()
},
),
(
"embedded".into(),
UserHighlightStyle {
color: Some(rgba(0x5c6166ff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xef7070ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xef7070ff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xf2ad48ff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xfa8d3eff).into()),
..Default::default()
},
),
(
"label".into(),
UserHighlightStyle {
color: Some(rgba(0x86b300ff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0x55b4d3ff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0x55b4d3ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xa37accff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0xed9365ff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0xef7070ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0x5c6166b3).into()),
..Default::default()
},
),
(
"punctuation.bracket".into(),
UserHighlightStyle {
color: Some(rgba(0x55b4d380).into()),
..Default::default()
},
),
(
"punctuation.delimiter".into(),
UserHighlightStyle {
color: Some(rgba(0x5c6166b3).into()),
..Default::default()
},
),
(
"punctuation.list_marker".into(),
UserHighlightStyle {
color: Some(rgba(0xf2ad48ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0x86b300ff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x4bbf98ff).into()),
..Default::default()
},
),
(
"string.special".into(),
UserHighlightStyle {
color: Some(rgba(0x86b300ff).into()),
..Default::default()
},
),
(
"string.special.symbol".into(),
UserHighlightStyle {
color: Some(rgba(0x86b300ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x55b4d3ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0x86b300ff).into()),
..Default::default()
},
),
(
"title".into(),
UserHighlightStyle {
color: Some(rgba(0x389ee6ff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x55b4d3ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0x5c6166ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xef7070ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -58,7 +283,7 @@ pub fn ayu() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x171a24ff).into()), border: Some(rgba(0x171a24ff).into()),
border_variant: Some(rgba(0x171a24ff).into()), border_variant: Some(rgba(0x171a24ff).into()),
border_focused: Some(rgba(0x171a24ff).into()), border_focused: Some(rgba(0xffcb65b3).into()),
border_selected: Some(rgba(0x171a24ff).into()), border_selected: Some(rgba(0x171a24ff).into()),
border_transparent: Some(rgba(0x171a24ff).into()), border_transparent: Some(rgba(0x171a24ff).into()),
border_disabled: Some(rgba(0x171a24ff).into()), border_disabled: Some(rgba(0x171a24ff).into()),
@ -66,9 +291,16 @@ pub fn ayu() -> UserThemeFamily {
surface_background: Some(rgba(0x1f2430ff).into()), surface_background: Some(rgba(0x1f2430ff).into()),
background: Some(rgba(0x1f2430ff).into()), background: Some(rgba(0x1f2430ff).into()),
element_background: Some(rgba(0xffcb65ff).into()), element_background: Some(rgba(0xffcb65ff).into()),
element_hover: Some(rgba(0x63759926).into()),
element_selected: Some(rgba(0x63759926).into()),
ghost_element_hover: Some(rgba(0x63759926).into()),
text: Some(rgba(0x707a8cff).into()), text: Some(rgba(0x707a8cff).into()),
tab_inactive_background: Some(rgba(0x1f2430ff).into()), tab_inactive_background: Some(rgba(0x1f2430ff).into()),
tab_active_background: Some(rgba(0x1f2430ff).into()), tab_active_background: Some(rgba(0x1f2430ff).into()),
editor_background: Some(rgba(0x1f2430ff).into()),
editor_gutter_background: Some(rgba(0x1f2430ff).into()),
editor_line_number: Some(rgba(0x8a919966).into()),
editor_active_line_number: Some(rgba(0xcccac2ff).into()),
terminal_background: Some(rgba(0x1f2430ff).into()), terminal_background: Some(rgba(0x1f2430ff).into()),
terminal_ansi_bright_black: Some(rgba(0x686868ff).into()), terminal_ansi_bright_black: Some(rgba(0x686868ff).into()),
terminal_ansi_bright_red: Some(rgba(0xf18678ff).into()), terminal_ansi_bright_red: Some(rgba(0xf18678ff).into()),
@ -88,6 +320,222 @@ pub fn ayu() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xc7c7c7ff).into()), terminal_ansi_white: Some(rgba(0xc7c7c7ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xff6565ff).into()),
error: Some(rgba(0xff6565ff).into()),
hidden: Some(rgba(0x707a8cff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xffd173ff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xdfbfffff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0xb8cfe680).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x95e6cbff).into()),
..Default::default()
},
),
(
"embedded".into(),
UserHighlightStyle {
color: Some(rgba(0xcccac2ff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xf18678ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xf18678ff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xffd173ff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xffad65ff).into()),
..Default::default()
},
),
(
"label".into(),
UserHighlightStyle {
color: Some(rgba(0xd4fe7fff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0x5ccfe6ff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0x5ccfe6ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xdfbfffff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0xf29e74ff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0xf18678ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0xcccac2b3).into()),
..Default::default()
},
),
(
"punctuation.bracket".into(),
UserHighlightStyle {
color: Some(rgba(0x5ccfe680).into()),
..Default::default()
},
),
(
"punctuation.delimiter".into(),
UserHighlightStyle {
color: Some(rgba(0xcccac2b3).into()),
..Default::default()
},
),
(
"punctuation.list_marker".into(),
UserHighlightStyle {
color: Some(rgba(0xffd173ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xd4fe7fff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x95e6cbff).into()),
..Default::default()
},
),
(
"string.special".into(),
UserHighlightStyle {
color: Some(rgba(0xd4fe7fff).into()),
..Default::default()
},
),
(
"string.special.symbol".into(),
UserHighlightStyle {
color: Some(rgba(0xd4fe7fff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x5ccfe6ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xd4fe7fff).into()),
..Default::default()
},
),
(
"title".into(),
UserHighlightStyle {
color: Some(rgba(0x73cfffff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x5ccfe6ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xcccac2ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xf18678ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -97,7 +545,7 @@ pub fn ayu() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x1e232bff).into()), border: Some(rgba(0x1e232bff).into()),
border_variant: Some(rgba(0x1e232bff).into()), border_variant: Some(rgba(0x1e232bff).into()),
border_focused: Some(rgba(0x1e232bff).into()), border_focused: Some(rgba(0xe6b450b3).into()),
border_selected: Some(rgba(0x1e232bff).into()), border_selected: Some(rgba(0x1e232bff).into()),
border_transparent: Some(rgba(0x1e232bff).into()), border_transparent: Some(rgba(0x1e232bff).into()),
border_disabled: Some(rgba(0x1e232bff).into()), border_disabled: Some(rgba(0x1e232bff).into()),
@ -105,9 +553,16 @@ pub fn ayu() -> UserThemeFamily {
surface_background: Some(rgba(0x0b0e14ff).into()), surface_background: Some(rgba(0x0b0e14ff).into()),
background: Some(rgba(0x0b0e14ff).into()), background: Some(rgba(0x0b0e14ff).into()),
element_background: Some(rgba(0xe6b450ff).into()), element_background: Some(rgba(0xe6b450ff).into()),
element_hover: Some(rgba(0x47526640).into()),
element_selected: Some(rgba(0x47526640).into()),
ghost_element_hover: Some(rgba(0x47526640).into()),
text: Some(rgba(0x565b66ff).into()), text: Some(rgba(0x565b66ff).into()),
tab_inactive_background: Some(rgba(0x0b0e14ff).into()), tab_inactive_background: Some(rgba(0x0b0e14ff).into()),
tab_active_background: Some(rgba(0x0b0e14ff).into()), tab_active_background: Some(rgba(0x0b0e14ff).into()),
editor_background: Some(rgba(0x0b0e14ff).into()),
editor_gutter_background: Some(rgba(0x0b0e14ff).into()),
editor_line_number: Some(rgba(0x6c738099).into()),
editor_active_line_number: Some(rgba(0xbfbdb6ff).into()),
terminal_background: Some(rgba(0x0b0e14ff).into()), terminal_background: Some(rgba(0x0b0e14ff).into()),
terminal_ansi_bright_black: Some(rgba(0x686868ff).into()), terminal_ansi_bright_black: Some(rgba(0x686868ff).into()),
terminal_ansi_bright_red: Some(rgba(0xef7077ff).into()), terminal_ansi_bright_red: Some(rgba(0xef7077ff).into()),
@ -127,6 +582,222 @@ pub fn ayu() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xc7c7c7ff).into()), terminal_ansi_white: Some(rgba(0xc7c7c7ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xd95757ff).into()),
error: Some(rgba(0xd95757ff).into()),
hidden: Some(rgba(0x565b66ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xffb353ff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xd2a6ffff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0xabb5be8c).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x95e6cbff).into()),
..Default::default()
},
),
(
"embedded".into(),
UserHighlightStyle {
color: Some(rgba(0xbfbdb6ff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xef7077ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xef7077ff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xffb353ff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xff8f3fff).into()),
..Default::default()
},
),
(
"label".into(),
UserHighlightStyle {
color: Some(rgba(0xa9d94bff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0x38b9e6ff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0x38b9e6ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xd2a6ffff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0xf29668ff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0xef7077ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0xbfbdb6b3).into()),
..Default::default()
},
),
(
"punctuation.bracket".into(),
UserHighlightStyle {
color: Some(rgba(0x38b9e680).into()),
..Default::default()
},
),
(
"punctuation.delimiter".into(),
UserHighlightStyle {
color: Some(rgba(0xbfbdb6b3).into()),
..Default::default()
},
),
(
"punctuation.list_marker".into(),
UserHighlightStyle {
color: Some(rgba(0xffb353ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xa9d94bff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x95e6cbff).into()),
..Default::default()
},
),
(
"string.special".into(),
UserHighlightStyle {
color: Some(rgba(0xa9d94bff).into()),
..Default::default()
},
),
(
"string.special.symbol".into(),
UserHighlightStyle {
color: Some(rgba(0xa9d94bff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x38b9e6ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xa9d94bff).into()),
..Default::default()
},
),
(
"title".into(),
UserHighlightStyle {
color: Some(rgba(0x59c2ffff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x38b9e6ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xbfbdb6ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xef7077ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
], ],

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn dracula() -> UserThemeFamily { pub fn dracula() -> UserThemeFamily {
@ -18,7 +20,7 @@ pub fn dracula() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0xbd93f9ff).into()), border: Some(rgba(0xbd93f9ff).into()),
border_variant: Some(rgba(0xbd93f9ff).into()), border_variant: Some(rgba(0xbd93f9ff).into()),
border_focused: Some(rgba(0xbd93f9ff).into()), border_focused: Some(rgba(0x6272a4ff).into()),
border_selected: Some(rgba(0xbd93f9ff).into()), border_selected: Some(rgba(0xbd93f9ff).into()),
border_transparent: Some(rgba(0xbd93f9ff).into()), border_transparent: Some(rgba(0xbd93f9ff).into()),
border_disabled: Some(rgba(0xbd93f9ff).into()), border_disabled: Some(rgba(0xbd93f9ff).into()),
@ -26,9 +28,17 @@ pub fn dracula() -> UserThemeFamily {
surface_background: Some(rgba(0x282a35ff).into()), surface_background: Some(rgba(0x282a35ff).into()),
background: Some(rgba(0x282a35ff).into()), background: Some(rgba(0x282a35ff).into()),
element_background: Some(rgba(0x44475aff).into()), element_background: Some(rgba(0x44475aff).into()),
element_hover: Some(rgba(0x44475a75).into()),
element_selected: Some(rgba(0x44475aff).into()),
drop_target_background: Some(rgba(0x44475aff).into()),
ghost_element_hover: Some(rgba(0x44475a75).into()),
text: Some(rgba(0xf8f8f2ff).into()), text: Some(rgba(0xf8f8f2ff).into()),
tab_inactive_background: Some(rgba(0x21222cff).into()), tab_inactive_background: Some(rgba(0x21222cff).into()),
tab_active_background: Some(rgba(0x282a35ff).into()), tab_active_background: Some(rgba(0x282a35ff).into()),
editor_background: Some(rgba(0x282a35ff).into()),
editor_gutter_background: Some(rgba(0x282a35ff).into()),
editor_line_number: Some(rgba(0x6272a4ff).into()),
editor_active_line_number: Some(rgba(0xf8f8f2ff).into()),
terminal_background: Some(rgba(0x282a35ff).into()), terminal_background: Some(rgba(0x282a35ff).into()),
terminal_ansi_bright_black: Some(rgba(0x6272a4ff).into()), terminal_ansi_bright_black: Some(rgba(0x6272a4ff).into()),
terminal_ansi_bright_red: Some(rgba(0xff6d6dff).into()), terminal_ansi_bright_red: Some(rgba(0xff6d6dff).into()),
@ -48,6 +58,121 @@ pub fn dracula() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xf8f8f2ff).into()), terminal_ansi_white: Some(rgba(0xf8f8f2ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xff5555ff).into()),
error: Some(rgba(0xff5555ff).into()),
hidden: Some(rgba(0x6272a4ff).into()),
warning: Some(rgba(0xffb76bff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0x50fa7bff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x6272a4ff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xf1fa8cff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xffb76bff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x50fa7bff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xff79c6ff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0x8be9fdff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0x8be9fdff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xf1fa8cff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0xff79c6ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xf1fa8cff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x8be9fdff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xbd93f9ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xbd93f9ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
],
}),
}, },
}], }],
} }

File diff suppressed because it is too large Load diff

View file

@ -6,8 +6,8 @@ mod ayu;
mod dracula; mod dracula;
mod gruvbox; mod gruvbox;
mod night_owl; mod night_owl;
mod noctis;
mod nord; mod nord;
mod notctis;
mod palenight; mod palenight;
mod rose_pine; mod rose_pine;
mod solarized; mod solarized;
@ -18,8 +18,8 @@ pub use ayu::*;
pub use dracula::*; pub use dracula::*;
pub use gruvbox::*; pub use gruvbox::*;
pub use night_owl::*; pub use night_owl::*;
pub use noctis::*;
pub use nord::*; pub use nord::*;
pub use notctis::*;
pub use palenight::*; pub use palenight::*;
pub use rose_pine::*; pub use rose_pine::*;
pub use solarized::*; pub use solarized::*;
@ -37,7 +37,7 @@ pub(crate) fn all_user_themes() -> Vec<UserThemeFamily> {
dracula(), dracula(),
solarized(), solarized(),
nord(), nord(),
notctis(), noctis(),
ayu(), ayu(),
gruvbox(), gruvbox(),
] ]

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn night_owl() -> UserThemeFamily { pub fn night_owl() -> UserThemeFamily {
@ -19,7 +21,7 @@ pub fn night_owl() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x5f7e97ff).into()), border: Some(rgba(0x5f7e97ff).into()),
border_variant: Some(rgba(0x5f7e97ff).into()), border_variant: Some(rgba(0x5f7e97ff).into()),
border_focused: Some(rgba(0x5f7e97ff).into()), border_focused: Some(rgba(0x122d42ff).into()),
border_selected: Some(rgba(0x5f7e97ff).into()), border_selected: Some(rgba(0x5f7e97ff).into()),
border_transparent: Some(rgba(0x5f7e97ff).into()), border_transparent: Some(rgba(0x5f7e97ff).into()),
border_disabled: Some(rgba(0x5f7e97ff).into()), border_disabled: Some(rgba(0x5f7e97ff).into()),
@ -27,9 +29,17 @@ pub fn night_owl() -> UserThemeFamily {
surface_background: Some(rgba(0x011526ff).into()), surface_background: Some(rgba(0x011526ff).into()),
background: Some(rgba(0x011526ff).into()), background: Some(rgba(0x011526ff).into()),
element_background: Some(rgba(0x7d56c1cc).into()), element_background: Some(rgba(0x7d56c1cc).into()),
element_hover: Some(rgba(0x011526ff).into()),
element_selected: Some(rgba(0x234c708c).into()),
drop_target_background: Some(rgba(0x011526ff).into()),
ghost_element_hover: Some(rgba(0x011526ff).into()),
text: Some(rgba(0xd6deebff).into()), text: Some(rgba(0xd6deebff).into()),
tab_inactive_background: Some(rgba(0x01101cff).into()), tab_inactive_background: Some(rgba(0x01101cff).into()),
tab_active_background: Some(rgba(0x0a2842ff).into()), tab_active_background: Some(rgba(0x0a2842ff).into()),
editor_background: Some(rgba(0x011526ff).into()),
editor_gutter_background: Some(rgba(0x011526ff).into()),
editor_line_number: Some(rgba(0x4b6479ff).into()),
editor_active_line_number: Some(rgba(0xd6deebff).into()),
terminal_ansi_bright_black: Some(rgba(0x575656ff).into()), terminal_ansi_bright_black: Some(rgba(0x575656ff).into()),
terminal_ansi_bright_red: Some(rgba(0xef524fff).into()), terminal_ansi_bright_red: Some(rgba(0xef524fff).into()),
terminal_ansi_bright_green: Some(rgba(0x21da6eff).into()), terminal_ansi_bright_green: Some(rgba(0x21da6eff).into()),
@ -48,6 +58,140 @@ pub fn night_owl() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xffffffff).into()), terminal_ansi_white: Some(rgba(0xffffffff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xef524fff).into()),
error: Some(rgba(0xef524fff).into()),
hidden: Some(rgba(0x5f7e97ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xc5e478ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x637777ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xf78b6bff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0x7fdbcaff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0x7fcac3ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xecc48dff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0xcaece6ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xecc48dff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xc5e478ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xc5e478ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0x7fdbcaff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -57,7 +201,7 @@ pub fn night_owl() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0xd9d9d9ff).into()), border: Some(rgba(0xd9d9d9ff).into()),
border_variant: Some(rgba(0xd9d9d9ff).into()), border_variant: Some(rgba(0xd9d9d9ff).into()),
border_focused: Some(rgba(0xd9d9d9ff).into()), border_focused: Some(rgba(0x93a1a1ff).into()),
border_selected: Some(rgba(0xd9d9d9ff).into()), border_selected: Some(rgba(0xd9d9d9ff).into()),
border_transparent: Some(rgba(0xd9d9d9ff).into()), border_transparent: Some(rgba(0xd9d9d9ff).into()),
border_disabled: Some(rgba(0xd9d9d9ff).into()), border_disabled: Some(rgba(0xd9d9d9ff).into()),
@ -65,9 +209,16 @@ pub fn night_owl() -> UserThemeFamily {
surface_background: Some(rgba(0xf0f0f0ff).into()), surface_background: Some(rgba(0xf0f0f0ff).into()),
background: Some(rgba(0xfbfbfbff).into()), background: Some(rgba(0xfbfbfbff).into()),
element_background: Some(rgba(0x29a298ff).into()), element_background: Some(rgba(0x29a298ff).into()),
element_hover: Some(rgba(0xd3e7f8ff).into()),
element_selected: Some(rgba(0xd3e7f8ff).into()),
ghost_element_hover: Some(rgba(0xd3e7f8ff).into()),
text: Some(rgba(0x403f53ff).into()), text: Some(rgba(0x403f53ff).into()),
tab_inactive_background: Some(rgba(0xf0f0f0ff).into()), tab_inactive_background: Some(rgba(0xf0f0f0ff).into()),
tab_active_background: Some(rgba(0xf6f6f6ff).into()), tab_active_background: Some(rgba(0xf6f6f6ff).into()),
editor_background: Some(rgba(0xfbfbfbff).into()),
editor_gutter_background: Some(rgba(0xfbfbfbff).into()),
editor_line_number: Some(rgba(0x90a7b2ff).into()),
editor_active_line_number: Some(rgba(0x403f53ff).into()),
terminal_background: Some(rgba(0xf6f6f6ff).into()), terminal_background: Some(rgba(0xf6f6f6ff).into()),
terminal_ansi_bright_black: Some(rgba(0x403f53ff).into()), terminal_ansi_bright_black: Some(rgba(0x403f53ff).into()),
terminal_ansi_bright_red: Some(rgba(0xde3c3aff).into()), terminal_ansi_bright_red: Some(rgba(0xde3c3aff).into()),
@ -87,6 +238,141 @@ pub fn night_owl() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xf0f0f0ff).into()), terminal_ansi_white: Some(rgba(0xf0f0f0ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0x403f53ff).into()),
error: Some(rgba(0x403f53ff).into()),
hidden: Some(rgba(0x403f53ff).into()),
warning: Some(rgba(0xdaa900ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x989fb1ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x994bc3ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0x994bc3ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xaa0881ff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0x0b969bff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0x0b969bff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0x994bc3ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x994bc3ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0x4876d6ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0x0b969bff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
], ],

File diff suppressed because it is too large Load diff

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn nord() -> UserThemeFamily { pub fn nord() -> UserThemeFamily {
@ -26,9 +28,17 @@ pub fn nord() -> UserThemeFamily {
surface_background: Some(rgba(0x2e3440ff).into()), surface_background: Some(rgba(0x2e3440ff).into()),
background: Some(rgba(0x2e3440ff).into()), background: Some(rgba(0x2e3440ff).into()),
element_background: Some(rgba(0x88bfd0ee).into()), element_background: Some(rgba(0x88bfd0ee).into()),
element_hover: Some(rgba(0x3b4252ff).into()),
element_selected: Some(rgba(0x88bfd0ff).into()),
drop_target_background: Some(rgba(0x88bfd099).into()),
ghost_element_hover: Some(rgba(0x3b4252ff).into()),
text: Some(rgba(0xd8dee9ff).into()), text: Some(rgba(0xd8dee9ff).into()),
tab_inactive_background: Some(rgba(0x2e3440ff).into()), tab_inactive_background: Some(rgba(0x2e3440ff).into()),
tab_active_background: Some(rgba(0x3b4252ff).into()), tab_active_background: Some(rgba(0x3b4252ff).into()),
editor_background: Some(rgba(0x2e3440ff).into()),
editor_gutter_background: Some(rgba(0x2e3440ff).into()),
editor_line_number: Some(rgba(0x4c566aff).into()),
editor_active_line_number: Some(rgba(0xd8dee9ff).into()),
terminal_background: Some(rgba(0x2e3440ff).into()), terminal_background: Some(rgba(0x2e3440ff).into()),
terminal_ansi_bright_black: Some(rgba(0x4c566aff).into()), terminal_ansi_bright_black: Some(rgba(0x4c566aff).into()),
terminal_ansi_bright_red: Some(rgba(0xbf616aff).into()), terminal_ansi_bright_red: Some(rgba(0xbf616aff).into()),
@ -48,6 +58,143 @@ pub fn nord() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xe5e9f0ff).into()), terminal_ansi_white: Some(rgba(0xe5e9f0ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xbf616aff).into()),
error: Some(rgba(0xbf616aff).into()),
hidden: Some(rgba(0xd8dee966).into()),
warning: Some(rgba(0xebcb8bff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0x8fbcbbff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0x81a1c1ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x606e87ff).into()),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0xebcb8bff).into()),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x88bfd0ff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0x81a1c1ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xb48eacff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0x81a1c1ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0xeceff4ff).into()),
..Default::default()
},
),
(
"punctuation.delimiter".into(),
UserHighlightStyle {
color: Some(rgba(0x81a1c1ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xa3be8cff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0xebcb8bff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x81a1c1ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xa3be8cff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x8fbcbbff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0x81a1c1ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0x81a1c1ff).into()),
..Default::default()
},
),
],
}),
}, },
}], }],
} }

View file

@ -1,446 +0,0 @@
// This file was generated by the `theme_importer`.
// Be careful when modifying it by hand.
use gpui::rgba;
use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
};
pub fn notctis() -> UserThemeFamily {
UserThemeFamily {
name: "Notctis".into(),
author: "Liviu Schera (liviuschera)".into(),
themes: vec![
UserTheme {
name: "Noctis Azureus".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x1579b6ff).into()),
border_variant: Some(rgba(0x1579b6ff).into()),
border_focused: Some(rgba(0x1579b6ff).into()),
border_selected: Some(rgba(0x1579b6ff).into()),
border_transparent: Some(rgba(0x1579b6ff).into()),
border_disabled: Some(rgba(0x1579b6ff).into()),
elevated_surface_background: Some(rgba(0x051b28ff).into()),
surface_background: Some(rgba(0x051b28ff).into()),
background: Some(rgba(0x07263aff).into()),
element_background: Some(rgba(0x007e99ff).into()),
text: Some(rgba(0xbecfdaff).into()),
tab_inactive_background: Some(rgba(0x08324eff).into()),
tab_active_background: Some(rgba(0x07263aff).into()),
terminal_background: Some(rgba(0x051b28ff).into()),
terminal_ansi_bright_black: Some(rgba(0x475e6cff).into()),
terminal_ansi_bright_red: Some(rgba(0xe97749ff).into()),
terminal_ansi_bright_green: Some(rgba(0x5febb1ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xe69532ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x5fb5ebff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xe697b2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x5fdaebff).into()),
terminal_ansi_bright_white: Some(rgba(0xbecfdaff).into()),
terminal_ansi_black: Some(rgba(0x28343dff).into()),
terminal_ansi_red: Some(rgba(0xe66432ff).into()),
terminal_ansi_green: Some(rgba(0x49e9a6ff).into()),
terminal_ansi_yellow: Some(rgba(0xe4b781ff).into()),
terminal_ansi_blue: Some(rgba(0x49ace9ff).into()),
terminal_ansi_magenta: Some(rgba(0xdf759aff).into()),
terminal_ansi_cyan: Some(rgba(0x49d5e9ff).into()),
terminal_ansi_white: Some(rgba(0xaec3d0ff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Bordo".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x997582ff).into()),
border_variant: Some(rgba(0x997582ff).into()),
border_focused: Some(rgba(0x997582ff).into()),
border_selected: Some(rgba(0x997582ff).into()),
border_transparent: Some(rgba(0x997582ff).into()),
border_disabled: Some(rgba(0x997582ff).into()),
elevated_surface_background: Some(rgba(0x272022ff).into()),
surface_background: Some(rgba(0x272022ff).into()),
background: Some(rgba(0x322a2dff).into()),
element_background: Some(rgba(0x007e99ff).into()),
text: Some(rgba(0xcbbec2ff).into()),
tab_inactive_background: Some(rgba(0x413036ff).into()),
tab_active_background: Some(rgba(0x322a2dff).into()),
terminal_background: Some(rgba(0x272022ff).into()),
terminal_ansi_bright_black: Some(rgba(0x69545bff).into()),
terminal_ansi_bright_red: Some(rgba(0xe97749ff).into()),
terminal_ansi_bright_green: Some(rgba(0x5febb1ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xe69532ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x5fb5ebff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xe697b2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x5fdaebff).into()),
terminal_ansi_bright_white: Some(rgba(0xcbbec2ff).into()),
terminal_ansi_black: Some(rgba(0x47393eff).into()),
terminal_ansi_red: Some(rgba(0xe66432ff).into()),
terminal_ansi_green: Some(rgba(0x49e9a6ff).into()),
terminal_ansi_yellow: Some(rgba(0xe4b781ff).into()),
terminal_ansi_blue: Some(rgba(0x49ace9ff).into()),
terminal_ansi_magenta: Some(rgba(0xdf759aff).into()),
terminal_ansi_cyan: Some(rgba(0x49d5e9ff).into()),
terminal_ansi_white: Some(rgba(0xb9acb0ff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctus Hibernus".into(),
appearance: Appearance::Light,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x00c6e0ff).into()),
border_variant: Some(rgba(0x00c6e0ff).into()),
border_focused: Some(rgba(0x00c6e0ff).into()),
border_selected: Some(rgba(0x00c6e0ff).into()),
border_transparent: Some(rgba(0x00c6e0ff).into()),
border_disabled: Some(rgba(0x00c6e0ff).into()),
elevated_surface_background: Some(rgba(0xe1eeefff).into()),
surface_background: Some(rgba(0xe1eeefff).into()),
background: Some(rgba(0xf4f6f6ff).into()),
element_background: Some(rgba(0x089099ff).into()),
text: Some(rgba(0x005661ff).into()),
tab_inactive_background: Some(rgba(0xcaedf2ff).into()),
tab_active_background: Some(rgba(0xf4f6f6ff).into()),
terminal_background: Some(rgba(0xe1eeefff).into()),
terminal_ansi_bright_black: Some(rgba(0x004d57ff).into()),
terminal_ansi_bright_red: Some(rgba(0xff3f00ff).into()),
terminal_ansi_bright_green: Some(rgba(0x00d17aff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xff8c00ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x0ea3ffff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xff6b9eff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x00cae6ff).into()),
terminal_ansi_bright_white: Some(rgba(0xbbc3c4ff).into()),
terminal_ansi_black: Some(rgba(0x003b41ff).into()),
terminal_ansi_red: Some(rgba(0xe34d1bff).into()),
terminal_ansi_green: Some(rgba(0x00b368ff).into()),
terminal_ansi_yellow: Some(rgba(0xf49724ff).into()),
terminal_ansi_blue: Some(rgba(0x0094f0ff).into()),
terminal_ansi_magenta: Some(rgba(0xff5792ff).into()),
terminal_ansi_cyan: Some(rgba(0x00bdd6ff).into()),
terminal_ansi_white: Some(rgba(0x8ca6a6ff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Lilac".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0xaea4f4ff).into()),
border_variant: Some(rgba(0xaea4f4ff).into()),
border_focused: Some(rgba(0xaea4f4ff).into()),
border_selected: Some(rgba(0xaea4f4ff).into()),
border_transparent: Some(rgba(0xaea4f4ff).into()),
border_disabled: Some(rgba(0xaea4f4ff).into()),
elevated_surface_background: Some(rgba(0xe9e7f3ff).into()),
surface_background: Some(rgba(0xe9e7f3ff).into()),
background: Some(rgba(0xf2f1f8ff).into()),
element_background: Some(rgba(0x8d7ffeff).into()),
text: Some(rgba(0x0c006bff).into()),
tab_inactive_background: Some(rgba(0xe2dff6ff).into()),
tab_active_background: Some(rgba(0xf2f1f8ff).into()),
terminal_background: Some(rgba(0xe9e7f3ff).into()),
terminal_ansi_bright_black: Some(rgba(0x0f0080ff).into()),
terminal_ansi_bright_red: Some(rgba(0xff3f00ff).into()),
terminal_ansi_bright_green: Some(rgba(0x00d17aff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xff8c00ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x0ea3ffff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xff6b9eff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x00cae6ff).into()),
terminal_ansi_bright_white: Some(rgba(0xbbc3c4ff).into()),
terminal_ansi_black: Some(rgba(0x0c006bff).into()),
terminal_ansi_red: Some(rgba(0xe34d1bff).into()),
terminal_ansi_green: Some(rgba(0x00b368ff).into()),
terminal_ansi_yellow: Some(rgba(0xf49724ff).into()),
terminal_ansi_blue: Some(rgba(0x0094f0ff).into()),
terminal_ansi_magenta: Some(rgba(0xff5792ff).into()),
terminal_ansi_cyan: Some(rgba(0x00bdd6ff).into()),
terminal_ansi_white: Some(rgba(0x8ca6a6ff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Lux".into(),
appearance: Appearance::Light,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x00c6e0ff).into()),
border_variant: Some(rgba(0x00c6e0ff).into()),
border_focused: Some(rgba(0x00c6e0ff).into()),
border_selected: Some(rgba(0x00c6e0ff).into()),
border_transparent: Some(rgba(0x00c6e0ff).into()),
border_disabled: Some(rgba(0x00c6e0ff).into()),
elevated_surface_background: Some(rgba(0xf6eddaff).into()),
surface_background: Some(rgba(0xf6eddaff).into()),
background: Some(rgba(0xfef8ecff).into()),
element_background: Some(rgba(0x089099ff).into()),
text: Some(rgba(0x005661ff).into()),
tab_inactive_background: Some(rgba(0xf0e9d6ff).into()),
tab_active_background: Some(rgba(0xfef8ecff).into()),
terminal_background: Some(rgba(0xf6eddaff).into()),
terminal_ansi_bright_black: Some(rgba(0x004d57ff).into()),
terminal_ansi_bright_red: Some(rgba(0xff3f00ff).into()),
terminal_ansi_bright_green: Some(rgba(0x00d17aff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xff8c00ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x0ea3ffff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xff6b9eff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x00cae6ff).into()),
terminal_ansi_bright_white: Some(rgba(0xbbc3c4ff).into()),
terminal_ansi_black: Some(rgba(0x003b41ff).into()),
terminal_ansi_red: Some(rgba(0xe34d1bff).into()),
terminal_ansi_green: Some(rgba(0x00b368ff).into()),
terminal_ansi_yellow: Some(rgba(0xf49724ff).into()),
terminal_ansi_blue: Some(rgba(0x0094f0ff).into()),
terminal_ansi_magenta: Some(rgba(0xff5792ff).into()),
terminal_ansi_cyan: Some(rgba(0x00bdd6ff).into()),
terminal_ansi_white: Some(rgba(0x8ca6a6ff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Minimus".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x496c83ff).into()),
border_variant: Some(rgba(0x496c83ff).into()),
border_focused: Some(rgba(0x496c83ff).into()),
border_selected: Some(rgba(0x496c83ff).into()),
border_transparent: Some(rgba(0x496c83ff).into()),
border_disabled: Some(rgba(0x496c83ff).into()),
elevated_surface_background: Some(rgba(0x0e1920ff).into()),
surface_background: Some(rgba(0x0e1920ff).into()),
background: Some(rgba(0x1b2932ff).into()),
element_background: Some(rgba(0x2e616bff).into()),
text: Some(rgba(0xc5cdd3ff).into()),
tab_inactive_background: Some(rgba(0x202d37ff).into()),
tab_active_background: Some(rgba(0x1b2932ff).into()),
terminal_background: Some(rgba(0x0e1920ff).into()),
terminal_ansi_bright_black: Some(rgba(0x425866ff).into()),
terminal_ansi_bright_red: Some(rgba(0xca8468ff).into()),
terminal_ansi_bright_green: Some(rgba(0x84c8abff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xd1aa7bff).into()),
terminal_ansi_bright_blue: Some(rgba(0x68a4caff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xc88da2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x84bfc8ff).into()),
terminal_ansi_bright_white: Some(rgba(0xc5d1d3ff).into()),
terminal_ansi_black: Some(rgba(0x182935ff).into()),
terminal_ansi_red: Some(rgba(0xc08872ff).into()),
terminal_ansi_green: Some(rgba(0x72c09fff).into()),
terminal_ansi_yellow: Some(rgba(0xc8a984ff).into()),
terminal_ansi_blue: Some(rgba(0x6095b7ff).into()),
terminal_ansi_magenta: Some(rgba(0xc28097ff).into()),
terminal_ansi_cyan: Some(rgba(0x72b7c0ff).into()),
terminal_ansi_white: Some(rgba(0xc5cdd3ff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x0d6571ff).into()),
border_variant: Some(rgba(0x0d6571ff).into()),
border_focused: Some(rgba(0x0d6571ff).into()),
border_selected: Some(rgba(0x0d6571ff).into()),
border_transparent: Some(rgba(0x0d6571ff).into()),
border_disabled: Some(rgba(0x0d6571ff).into()),
elevated_surface_background: Some(rgba(0x03181aff).into()),
surface_background: Some(rgba(0x03181aff).into()),
background: Some(rgba(0x052428ff).into()),
element_background: Some(rgba(0x089099ff).into()),
text: Some(rgba(0xb1c9ccff).into()),
tab_inactive_background: Some(rgba(0x052e32ff).into()),
tab_active_background: Some(rgba(0x052428ff).into()),
terminal_background: Some(rgba(0x03181aff).into()),
terminal_ansi_bright_black: Some(rgba(0x47686cff).into()),
terminal_ansi_bright_red: Some(rgba(0xe97749ff).into()),
terminal_ansi_bright_green: Some(rgba(0x5febb1ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xe69532ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x5fb5ebff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xe697b2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x5fdaebff).into()),
terminal_ansi_bright_white: Some(rgba(0xc1d4d7ff).into()),
terminal_ansi_black: Some(rgba(0x324a4dff).into()),
terminal_ansi_red: Some(rgba(0xe66432ff).into()),
terminal_ansi_green: Some(rgba(0x49e9a6ff).into()),
terminal_ansi_yellow: Some(rgba(0xe4b781ff).into()),
terminal_ansi_blue: Some(rgba(0x49ace9ff).into()),
terminal_ansi_magenta: Some(rgba(0xdf759aff).into()),
terminal_ansi_cyan: Some(rgba(0x49d5e9ff).into()),
terminal_ansi_white: Some(rgba(0xb1c9ccff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Obscuro".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x0d6571ff).into()),
border_variant: Some(rgba(0x0d6571ff).into()),
border_focused: Some(rgba(0x0d6571ff).into()),
border_selected: Some(rgba(0x0d6571ff).into()),
border_transparent: Some(rgba(0x0d6571ff).into()),
border_disabled: Some(rgba(0x0d6571ff).into()),
elevated_surface_background: Some(rgba(0x020c0eff).into()),
surface_background: Some(rgba(0x020c0eff).into()),
background: Some(rgba(0x031316ff).into()),
element_background: Some(rgba(0x089099ff).into()),
text: Some(rgba(0xb1c9ccff).into()),
tab_inactive_background: Some(rgba(0x052e32ff).into()),
tab_active_background: Some(rgba(0x031316ff).into()),
terminal_background: Some(rgba(0x020c0eff).into()),
terminal_ansi_bright_black: Some(rgba(0x47686cff).into()),
terminal_ansi_bright_red: Some(rgba(0xe97749ff).into()),
terminal_ansi_bright_green: Some(rgba(0x5febb1ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xe69532ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x5fb5ebff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xe697b2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x5fdaebff).into()),
terminal_ansi_bright_white: Some(rgba(0xc1d4d7ff).into()),
terminal_ansi_black: Some(rgba(0x324a4dff).into()),
terminal_ansi_red: Some(rgba(0xe66432ff).into()),
terminal_ansi_green: Some(rgba(0x49e9a6ff).into()),
terminal_ansi_yellow: Some(rgba(0xe4b781ff).into()),
terminal_ansi_blue: Some(rgba(0x49ace9ff).into()),
terminal_ansi_magenta: Some(rgba(0xdf759aff).into()),
terminal_ansi_cyan: Some(rgba(0x49d5e9ff).into()),
terminal_ansi_white: Some(rgba(0xb1c9ccff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Sereno".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x0d6571ff).into()),
border_variant: Some(rgba(0x0d6571ff).into()),
border_focused: Some(rgba(0x0d6571ff).into()),
border_selected: Some(rgba(0x0d6571ff).into()),
border_transparent: Some(rgba(0x0d6571ff).into()),
border_disabled: Some(rgba(0x0d6571ff).into()),
elevated_surface_background: Some(rgba(0x020c0eff).into()),
surface_background: Some(rgba(0x020c0eff).into()),
background: Some(rgba(0x031316ff).into()),
element_background: Some(rgba(0x089099ff).into()),
text: Some(rgba(0xb1c9ccff).into()),
tab_inactive_background: Some(rgba(0x052e32ff).into()),
tab_active_background: Some(rgba(0x031316ff).into()),
terminal_background: Some(rgba(0x020c0eff).into()),
terminal_ansi_bright_black: Some(rgba(0x47686cff).into()),
terminal_ansi_bright_red: Some(rgba(0xe97749ff).into()),
terminal_ansi_bright_green: Some(rgba(0x5febb1ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xe69532ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x5fb5ebff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xe697b2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x5fdaebff).into()),
terminal_ansi_bright_white: Some(rgba(0xc1d4d7ff).into()),
terminal_ansi_black: Some(rgba(0x324a4dff).into()),
terminal_ansi_red: Some(rgba(0xe66432ff).into()),
terminal_ansi_green: Some(rgba(0x49e9a6ff).into()),
terminal_ansi_yellow: Some(rgba(0xe4b781ff).into()),
terminal_ansi_blue: Some(rgba(0x49ace9ff).into()),
terminal_ansi_magenta: Some(rgba(0xdf759aff).into()),
terminal_ansi_cyan: Some(rgba(0x49d5e9ff).into()),
terminal_ansi_white: Some(rgba(0xb1c9ccff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Uva".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x6d66a7ff).into()),
border_variant: Some(rgba(0x6d66a7ff).into()),
border_focused: Some(rgba(0x6d66a7ff).into()),
border_selected: Some(rgba(0x6d66a7ff).into()),
border_transparent: Some(rgba(0x6d66a7ff).into()),
border_disabled: Some(rgba(0x6d66a7ff).into()),
elevated_surface_background: Some(rgba(0x1f1d30ff).into()),
surface_background: Some(rgba(0x1f1d30ff).into()),
background: Some(rgba(0x292640ff).into()),
element_background: Some(rgba(0x007e99ff).into()),
text: Some(rgba(0xc5c2d6ff).into()),
tab_inactive_background: Some(rgba(0x2f2c49ff).into()),
tab_active_background: Some(rgba(0x292640ff).into()),
terminal_background: Some(rgba(0x1f1d30ff).into()),
terminal_ansi_bright_black: Some(rgba(0x504e65ff).into()),
terminal_ansi_bright_red: Some(rgba(0xe97749ff).into()),
terminal_ansi_bright_green: Some(rgba(0x5febb1ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xe69532ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x5fb5ebff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xe697b2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x5fdaebff).into()),
terminal_ansi_bright_white: Some(rgba(0xc5c2d6ff).into()),
terminal_ansi_black: Some(rgba(0x302f3dff).into()),
terminal_ansi_red: Some(rgba(0xe66432ff).into()),
terminal_ansi_green: Some(rgba(0x49e9a6ff).into()),
terminal_ansi_yellow: Some(rgba(0xe4b781ff).into()),
terminal_ansi_blue: Some(rgba(0x49ace9ff).into()),
terminal_ansi_magenta: Some(rgba(0xdf759aff).into()),
terminal_ansi_cyan: Some(rgba(0x49d5e9ff).into()),
terminal_ansi_white: Some(rgba(0xb6b3ccff).into()),
..Default::default()
},
},
},
UserTheme {
name: "Noctis Viola".into(),
appearance: Appearance::Dark,
styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement {
border: Some(rgba(0x8666a7ff).into()),
border_variant: Some(rgba(0x8666a7ff).into()),
border_focused: Some(rgba(0x8666a7ff).into()),
border_selected: Some(rgba(0x8666a7ff).into()),
border_transparent: Some(rgba(0x8666a7ff).into()),
border_disabled: Some(rgba(0x8666a7ff).into()),
elevated_surface_background: Some(rgba(0x291d35ff).into()),
surface_background: Some(rgba(0x291d35ff).into()),
background: Some(rgba(0x30243dff).into()),
element_background: Some(rgba(0x007e99ff).into()),
text: Some(rgba(0xccbfd9ff).into()),
tab_inactive_background: Some(rgba(0x3d2e4dff).into()),
tab_active_background: Some(rgba(0x30243dff).into()),
terminal_background: Some(rgba(0x291d35ff).into()),
terminal_ansi_bright_black: Some(rgba(0x594e65ff).into()),
terminal_ansi_bright_red: Some(rgba(0xe97749ff).into()),
terminal_ansi_bright_green: Some(rgba(0x5febb1ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xe69532ff).into()),
terminal_ansi_bright_blue: Some(rgba(0x5fb5ebff).into()),
terminal_ansi_bright_magenta: Some(rgba(0xe697b2ff).into()),
terminal_ansi_bright_cyan: Some(rgba(0x5fdaebff).into()),
terminal_ansi_bright_white: Some(rgba(0xccbfd9ff).into()),
terminal_ansi_black: Some(rgba(0x362f3dff).into()),
terminal_ansi_red: Some(rgba(0xe66432ff).into()),
terminal_ansi_green: Some(rgba(0x49e9a6ff).into()),
terminal_ansi_yellow: Some(rgba(0xe4b781ff).into()),
terminal_ansi_blue: Some(rgba(0x49ace9ff).into()),
terminal_ansi_magenta: Some(rgba(0xdf759aff).into()),
terminal_ansi_cyan: Some(rgba(0x49d5e9ff).into()),
terminal_ansi_white: Some(rgba(0xbfafcfff).into()),
..Default::default()
},
},
},
],
}
}

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn palenight() -> UserThemeFamily { pub fn palenight() -> UserThemeFamily {
@ -27,9 +29,17 @@ pub fn palenight() -> UserThemeFamily {
surface_background: Some(rgba(0x292c3eff).into()), surface_background: Some(rgba(0x292c3eff).into()),
background: Some(rgba(0x292c3eff).into()), background: Some(rgba(0x292c3eff).into()),
element_background: Some(rgba(0x7d56c1cc).into()), element_background: Some(rgba(0x7d56c1cc).into()),
element_hover: Some(rgba(0x0000001a).into()),
element_selected: Some(rgba(0x7d56c1ff).into()),
drop_target_background: Some(rgba(0x2e3245ff).into()),
ghost_element_hover: Some(rgba(0x0000001a).into()),
text: Some(rgba(0xffffffff).into()), text: Some(rgba(0xffffffff).into()),
tab_inactive_background: Some(rgba(0x31364aff).into()), tab_inactive_background: Some(rgba(0x31364aff).into()),
tab_active_background: Some(rgba(0x292c3eff).into()), tab_active_background: Some(rgba(0x292c3eff).into()),
editor_background: Some(rgba(0x292c3eff).into()),
editor_gutter_background: Some(rgba(0x292c3eff).into()),
editor_line_number: Some(rgba(0x4c5374ff).into()),
editor_active_line_number: Some(rgba(0xbfc7d5ff).into()),
terminal_ansi_bright_black: Some(rgba(0x676e95ff).into()), terminal_ansi_bright_black: Some(rgba(0x676e95ff).into()),
terminal_ansi_bright_red: Some(rgba(0xff5571ff).into()), terminal_ansi_bright_red: Some(rgba(0xff5571ff).into()),
terminal_ansi_bright_green: Some(rgba(0xc3e88dff).into()), terminal_ansi_bright_green: Some(rgba(0xc3e88dff).into()),
@ -48,6 +58,166 @@ pub fn palenight() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xffffffff).into()), terminal_ansi_white: Some(rgba(0xffffffff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xef524fff).into()),
error: Some(rgba(0xef524fff).into()),
hidden: Some(rgba(0x9199c8ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x687097ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0xff869aff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0xff869aff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xf78b6bff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0x89ddffff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0x7fcac3ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xc3e88dff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0xff5571ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xc3e88dff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xff5571ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -65,9 +235,17 @@ pub fn palenight() -> UserThemeFamily {
surface_background: Some(rgba(0x292c3eff).into()), surface_background: Some(rgba(0x292c3eff).into()),
background: Some(rgba(0x292c3eff).into()), background: Some(rgba(0x292c3eff).into()),
element_background: Some(rgba(0x7d56c1cc).into()), element_background: Some(rgba(0x7d56c1cc).into()),
element_hover: Some(rgba(0x0000001a).into()),
element_selected: Some(rgba(0x7d56c1ff).into()),
drop_target_background: Some(rgba(0x2e3245ff).into()),
ghost_element_hover: Some(rgba(0x0000001a).into()),
text: Some(rgba(0xffffffff).into()), text: Some(rgba(0xffffffff).into()),
tab_inactive_background: Some(rgba(0x31364aff).into()), tab_inactive_background: Some(rgba(0x31364aff).into()),
tab_active_background: Some(rgba(0x292c3eff).into()), tab_active_background: Some(rgba(0x292c3eff).into()),
editor_background: Some(rgba(0x292c3eff).into()),
editor_gutter_background: Some(rgba(0x292c3eff).into()),
editor_line_number: Some(rgba(0x4c5374ff).into()),
editor_active_line_number: Some(rgba(0xbfc7d5ff).into()),
terminal_ansi_bright_black: Some(rgba(0x676e95ff).into()), terminal_ansi_bright_black: Some(rgba(0x676e95ff).into()),
terminal_ansi_bright_red: Some(rgba(0xff5571ff).into()), terminal_ansi_bright_red: Some(rgba(0xff5571ff).into()),
terminal_ansi_bright_green: Some(rgba(0xc3e88dff).into()), terminal_ansi_bright_green: Some(rgba(0xc3e88dff).into()),
@ -86,6 +264,166 @@ pub fn palenight() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xffffffff).into()), terminal_ansi_white: Some(rgba(0xffffffff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xef524fff).into()),
error: Some(rgba(0xef524fff).into()),
hidden: Some(rgba(0x9199c8ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x687097ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0xff869aff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0xff869aff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xf78b6bff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0x89ddffff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0x7fcac3ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xc3e88dff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0xff5571ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xc3e88dff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xff5571ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -103,9 +441,17 @@ pub fn palenight() -> UserThemeFamily {
surface_background: Some(rgba(0x25283aff).into()), surface_background: Some(rgba(0x25283aff).into()),
background: Some(rgba(0x292c3eff).into()), background: Some(rgba(0x292c3eff).into()),
element_background: Some(rgba(0x7d56c1cc).into()), element_background: Some(rgba(0x7d56c1cc).into()),
element_hover: Some(rgba(0x0000001a).into()),
element_selected: Some(rgba(0x7d56c1ff).into()),
drop_target_background: Some(rgba(0x2e3245ff).into()),
ghost_element_hover: Some(rgba(0x0000001a).into()),
text: Some(rgba(0xffffffff).into()), text: Some(rgba(0xffffffff).into()),
tab_inactive_background: Some(rgba(0x31364aff).into()), tab_inactive_background: Some(rgba(0x31364aff).into()),
tab_active_background: Some(rgba(0x25283aff).into()), tab_active_background: Some(rgba(0x25283aff).into()),
editor_background: Some(rgba(0x292c3eff).into()),
editor_gutter_background: Some(rgba(0x292c3eff).into()),
editor_line_number: Some(rgba(0x4c5374ff).into()),
editor_active_line_number: Some(rgba(0xbfc7d5ff).into()),
terminal_ansi_bright_black: Some(rgba(0x676e95ff).into()), terminal_ansi_bright_black: Some(rgba(0x676e95ff).into()),
terminal_ansi_bright_red: Some(rgba(0xff5571ff).into()), terminal_ansi_bright_red: Some(rgba(0xff5571ff).into()),
terminal_ansi_bright_green: Some(rgba(0xc3e88dff).into()), terminal_ansi_bright_green: Some(rgba(0xc3e88dff).into()),
@ -124,6 +470,166 @@ pub fn palenight() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xffffffff).into()), terminal_ansi_white: Some(rgba(0xffffffff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xef524fff).into()),
error: Some(rgba(0xef524fff).into()),
hidden: Some(rgba(0x9199c8ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x687097ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0xff869aff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0xff869aff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xf78b6bff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0x89ddffff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0x7fcac3ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0xc792eaff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xc3e88dff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0x82aaffff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0xff5571ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xc3e88dff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xffcb6bff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xff5571ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
], ],

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn rose_pine() -> UserThemeFamily { pub fn rose_pine() -> UserThemeFamily {
@ -19,7 +21,7 @@ pub fn rose_pine() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x000000ff).into()), border: Some(rgba(0x000000ff).into()),
border_variant: Some(rgba(0x000000ff).into()), border_variant: Some(rgba(0x000000ff).into()),
border_focused: Some(rgba(0x000000ff).into()), border_focused: Some(rgba(0x6e6a8633).into()),
border_selected: Some(rgba(0x000000ff).into()), border_selected: Some(rgba(0x000000ff).into()),
border_transparent: Some(rgba(0x000000ff).into()), border_transparent: Some(rgba(0x000000ff).into()),
border_disabled: Some(rgba(0x000000ff).into()), border_disabled: Some(rgba(0x000000ff).into()),
@ -27,9 +29,17 @@ pub fn rose_pine() -> UserThemeFamily {
surface_background: Some(rgba(0x1f1d2eff).into()), surface_background: Some(rgba(0x1f1d2eff).into()),
background: Some(rgba(0x191724ff).into()), background: Some(rgba(0x191724ff).into()),
element_background: Some(rgba(0xebbcbaff).into()), element_background: Some(rgba(0xebbcbaff).into()),
element_hover: Some(rgba(0x6e6a861a).into()),
element_selected: Some(rgba(0x6e6a8633).into()),
drop_target_background: Some(rgba(0x1f1d2eff).into()),
ghost_element_hover: Some(rgba(0x6e6a861a).into()),
text: Some(rgba(0xe0def4ff).into()), text: Some(rgba(0xe0def4ff).into()),
tab_inactive_background: Some(rgba(0x000000ff).into()), tab_inactive_background: Some(rgba(0x000000ff).into()),
tab_active_background: Some(rgba(0x6e6a861a).into()), tab_active_background: Some(rgba(0x6e6a861a).into()),
editor_background: Some(rgba(0x191724ff).into()),
editor_gutter_background: Some(rgba(0x191724ff).into()),
editor_line_number: Some(rgba(0x908caaff).into()),
editor_active_line_number: Some(rgba(0xe0def4ff).into()),
terminal_ansi_bright_black: Some(rgba(0x908caaff).into()), terminal_ansi_bright_black: Some(rgba(0x908caaff).into()),
terminal_ansi_bright_red: Some(rgba(0xeb6f92ff).into()), terminal_ansi_bright_red: Some(rgba(0xeb6f92ff).into()),
terminal_ansi_bright_green: Some(rgba(0x30738fff).into()), terminal_ansi_bright_green: Some(rgba(0x30738fff).into()),
@ -48,16 +58,136 @@ pub fn rose_pine() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xe0def4ff).into()), terminal_ansi_white: Some(rgba(0xe0def4ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xeb6f92ff).into()),
error: Some(rgba(0xeb6f92ff).into()),
hidden: Some(rgba(0x908caaff).into()),
warning: Some(rgba(0xf5c177ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xc4a7e7ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xebbcbaff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x6e6a86ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xeb6f92ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0x30738fff).into()),
..Default::default()
},
),
(
"label".into(),
UserHighlightStyle {
color: Some(rgba(0xebbcbaff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xebbcbaff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0x908caaff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xf5c177ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x9ccfd8ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xf5c177ff).into()),
..Default::default()
},
),
(
"title".into(),
UserHighlightStyle {
color: Some(rgba(0xebbcbaff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x9ccfd8ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xebbcbaff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xe0def4ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
name: "Rose Moon".into(), name: "Rose Pine Moon".into(),
appearance: Appearance::Dark, appearance: Appearance::Dark,
styles: UserThemeStylesRefinement { styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x000000ff).into()), border: Some(rgba(0x000000ff).into()),
border_variant: Some(rgba(0x000000ff).into()), border_variant: Some(rgba(0x000000ff).into()),
border_focused: Some(rgba(0x000000ff).into()), border_focused: Some(rgba(0x817c9c26).into()),
border_selected: Some(rgba(0x000000ff).into()), border_selected: Some(rgba(0x000000ff).into()),
border_transparent: Some(rgba(0x000000ff).into()), border_transparent: Some(rgba(0x000000ff).into()),
border_disabled: Some(rgba(0x000000ff).into()), border_disabled: Some(rgba(0x000000ff).into()),
@ -65,9 +195,17 @@ pub fn rose_pine() -> UserThemeFamily {
surface_background: Some(rgba(0x2a273eff).into()), surface_background: Some(rgba(0x2a273eff).into()),
background: Some(rgba(0x232136ff).into()), background: Some(rgba(0x232136ff).into()),
element_background: Some(rgba(0xea9a97ff).into()), element_background: Some(rgba(0xea9a97ff).into()),
element_hover: Some(rgba(0x817c9c14).into()),
element_selected: Some(rgba(0x817c9c26).into()),
drop_target_background: Some(rgba(0x2a273eff).into()),
ghost_element_hover: Some(rgba(0x817c9c14).into()),
text: Some(rgba(0xe0def4ff).into()), text: Some(rgba(0xe0def4ff).into()),
tab_inactive_background: Some(rgba(0x000000ff).into()), tab_inactive_background: Some(rgba(0x000000ff).into()),
tab_active_background: Some(rgba(0x817c9c14).into()), tab_active_background: Some(rgba(0x817c9c14).into()),
editor_background: Some(rgba(0x232136ff).into()),
editor_gutter_background: Some(rgba(0x232136ff).into()),
editor_line_number: Some(rgba(0x908caaff).into()),
editor_active_line_number: Some(rgba(0xe0def4ff).into()),
terminal_ansi_bright_black: Some(rgba(0x908caaff).into()), terminal_ansi_bright_black: Some(rgba(0x908caaff).into()),
terminal_ansi_bright_red: Some(rgba(0xeb6f92ff).into()), terminal_ansi_bright_red: Some(rgba(0xeb6f92ff).into()),
terminal_ansi_bright_green: Some(rgba(0x3d8fb0ff).into()), terminal_ansi_bright_green: Some(rgba(0x3d8fb0ff).into()),
@ -86,6 +224,126 @@ pub fn rose_pine() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xe0def4ff).into()), terminal_ansi_white: Some(rgba(0xe0def4ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xeb6f92ff).into()),
error: Some(rgba(0xeb6f92ff).into()),
hidden: Some(rgba(0x908caaff).into()),
warning: Some(rgba(0xf5c177ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xc4a7e7ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xea9a97ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x6e6a86ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xeb6f92ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0x3d8fb0ff).into()),
..Default::default()
},
),
(
"label".into(),
UserHighlightStyle {
color: Some(rgba(0xea9a97ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xea9a97ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0x908caaff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xf5c177ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x9ccfd8ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xf5c177ff).into()),
..Default::default()
},
),
(
"title".into(),
UserHighlightStyle {
color: Some(rgba(0xea9a97ff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x9ccfd8ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xea9a97ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xe0def4ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -95,7 +353,7 @@ pub fn rose_pine() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x000000ff).into()), border: Some(rgba(0x000000ff).into()),
border_variant: Some(rgba(0x000000ff).into()), border_variant: Some(rgba(0x000000ff).into()),
border_focused: Some(rgba(0x000000ff).into()), border_focused: Some(rgba(0x6e6a8614).into()),
border_selected: Some(rgba(0x000000ff).into()), border_selected: Some(rgba(0x000000ff).into()),
border_transparent: Some(rgba(0x000000ff).into()), border_transparent: Some(rgba(0x000000ff).into()),
border_disabled: Some(rgba(0x000000ff).into()), border_disabled: Some(rgba(0x000000ff).into()),
@ -103,9 +361,17 @@ pub fn rose_pine() -> UserThemeFamily {
surface_background: Some(rgba(0xfffaf3ff).into()), surface_background: Some(rgba(0xfffaf3ff).into()),
background: Some(rgba(0xfaf4edff).into()), background: Some(rgba(0xfaf4edff).into()),
element_background: Some(rgba(0xd7827dff).into()), element_background: Some(rgba(0xd7827dff).into()),
element_hover: Some(rgba(0x6e6a860d).into()),
element_selected: Some(rgba(0x6e6a8614).into()),
drop_target_background: Some(rgba(0xfffaf3ff).into()),
ghost_element_hover: Some(rgba(0x6e6a860d).into()),
text: Some(rgba(0x575279ff).into()), text: Some(rgba(0x575279ff).into()),
tab_inactive_background: Some(rgba(0x000000ff).into()), tab_inactive_background: Some(rgba(0x000000ff).into()),
tab_active_background: Some(rgba(0x6e6a860d).into()), tab_active_background: Some(rgba(0x6e6a860d).into()),
editor_background: Some(rgba(0xfaf4edff).into()),
editor_gutter_background: Some(rgba(0xfaf4edff).into()),
editor_line_number: Some(rgba(0x797593ff).into()),
editor_active_line_number: Some(rgba(0x575279ff).into()),
terminal_ansi_bright_black: Some(rgba(0x797593ff).into()), terminal_ansi_bright_black: Some(rgba(0x797593ff).into()),
terminal_ansi_bright_red: Some(rgba(0xb3627aff).into()), terminal_ansi_bright_red: Some(rgba(0xb3627aff).into()),
terminal_ansi_bright_green: Some(rgba(0x276983ff).into()), terminal_ansi_bright_green: Some(rgba(0x276983ff).into()),
@ -124,6 +390,126 @@ pub fn rose_pine() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0x575279ff).into()), terminal_ansi_white: Some(rgba(0x575279ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xb3627aff).into()),
error: Some(rgba(0xb3627aff).into()),
hidden: Some(rgba(0x797593ff).into()),
warning: Some(rgba(0xea9d34ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0x9079a9ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xd7827dff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x9893a5ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0xb3627aff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0x276983ff).into()),
..Default::default()
},
),
(
"label".into(),
UserHighlightStyle {
color: Some(rgba(0xd7827dff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xd7827dff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0x797593ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0xea9d34ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x55949fff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0xea9d34ff).into()),
..Default::default()
},
),
(
"title".into(),
UserHighlightStyle {
color: Some(rgba(0xd7827dff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x55949fff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xd7827dff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0x575279ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
], ],

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn solarized() -> UserThemeFamily { pub fn solarized() -> UserThemeFamily {
@ -19,14 +21,22 @@ pub fn solarized() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0x003847ff).into()), border: Some(rgba(0x003847ff).into()),
border_variant: Some(rgba(0x003847ff).into()), border_variant: Some(rgba(0x003847ff).into()),
border_focused: Some(rgba(0x003847ff).into()), border_focused: Some(rgba(0x29a19899).into()),
border_selected: Some(rgba(0x003847ff).into()), border_selected: Some(rgba(0x003847ff).into()),
border_transparent: Some(rgba(0x003847ff).into()), border_transparent: Some(rgba(0x003847ff).into()),
border_disabled: Some(rgba(0x003847ff).into()), border_disabled: Some(rgba(0x003847ff).into()),
background: Some(rgba(0x002a35ff).into()), background: Some(rgba(0x002a35ff).into()),
element_background: Some(rgba(0x29a19899).into()), element_background: Some(rgba(0x29a19899).into()),
element_hover: Some(rgba(0x004353aa).into()),
element_selected: Some(rgba(0x005a6fff).into()),
drop_target_background: Some(rgba(0x00435388).into()),
ghost_element_hover: Some(rgba(0x004353aa).into()),
text: Some(rgba(0xbbbbbbff).into()),
tab_inactive_background: Some(rgba(0x003f51ff).into()), tab_inactive_background: Some(rgba(0x003f51ff).into()),
tab_active_background: Some(rgba(0x002a36ff).into()), tab_active_background: Some(rgba(0x002a36ff).into()),
editor_background: Some(rgba(0x002a35ff).into()),
editor_gutter_background: Some(rgba(0x002a35ff).into()),
editor_line_number: Some(rgba(0x566c74ff).into()),
terminal_ansi_bright_black: Some(rgba(0x586e75ff).into()), terminal_ansi_bright_black: Some(rgba(0x586e75ff).into()),
terminal_ansi_bright_red: Some(rgba(0xcb4b15ff).into()), terminal_ansi_bright_red: Some(rgba(0xcb4b15ff).into()),
terminal_ansi_bright_green: Some(rgba(0x859900ff).into()), terminal_ansi_bright_green: Some(rgba(0x859900ff).into()),
@ -45,6 +55,150 @@ pub fn solarized() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0x839496ff).into()), terminal_ansi_white: Some(rgba(0x839496ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xffeaeaff).into()),
error: Some(rgba(0xffeaeaff).into()),
hidden: Some(rgba(0x93a1a1ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0x93a1a1ff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xb58800ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x657b83ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0xcb4b15ff).into()),
..Default::default()
},
),
(
"embedded".into(),
UserHighlightStyle {
color: Some(rgba(0x93a1a1ff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xd33582ff).into()),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xd33582ff).into()),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0x859900ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xd33582ff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0x839496ff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0x657b83ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0x29a198ff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0xcb4b15ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0x29a198ff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xcb4b15ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
UserTheme { UserTheme {
@ -54,14 +208,21 @@ pub fn solarized() -> UserThemeFamily {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border: Some(rgba(0xddd6c1ff).into()), border: Some(rgba(0xddd6c1ff).into()),
border_variant: Some(rgba(0xddd6c1ff).into()), border_variant: Some(rgba(0xddd6c1ff).into()),
border_focused: Some(rgba(0xddd6c1ff).into()), border_focused: Some(rgba(0xd3af86ff).into()),
border_selected: Some(rgba(0xddd6c1ff).into()), border_selected: Some(rgba(0xddd6c1ff).into()),
border_transparent: Some(rgba(0xddd6c1ff).into()), border_transparent: Some(rgba(0xddd6c1ff).into()),
border_disabled: Some(rgba(0xddd6c1ff).into()), border_disabled: Some(rgba(0xddd6c1ff).into()),
background: Some(rgba(0xfdf6e3ff).into()), background: Some(rgba(0xfdf6e3ff).into()),
element_background: Some(rgba(0xab9d56ff).into()), element_background: Some(rgba(0xab9d56ff).into()),
element_hover: Some(rgba(0xdec98744).into()),
element_selected: Some(rgba(0xdec987ff).into()),
ghost_element_hover: Some(rgba(0xdec98744).into()),
text: Some(rgba(0x333333ff).into()),
tab_inactive_background: Some(rgba(0xd3cbb7ff).into()), tab_inactive_background: Some(rgba(0xd3cbb7ff).into()),
tab_active_background: Some(rgba(0xfdf6e3ff).into()), tab_active_background: Some(rgba(0xfdf6e3ff).into()),
editor_background: Some(rgba(0xfdf6e3ff).into()),
editor_gutter_background: Some(rgba(0xfdf6e3ff).into()),
editor_line_number: Some(rgba(0x9ca8a6ff).into()),
terminal_ansi_bright_black: Some(rgba(0x657b83ff).into()), terminal_ansi_bright_black: Some(rgba(0x657b83ff).into()),
terminal_ansi_bright_red: Some(rgba(0xcb4b15ff).into()), terminal_ansi_bright_red: Some(rgba(0xcb4b15ff).into()),
terminal_ansi_bright_green: Some(rgba(0x859900ff).into()), terminal_ansi_bright_green: Some(rgba(0x859900ff).into()),
@ -80,6 +241,141 @@ pub fn solarized() -> UserThemeFamily {
terminal_ansi_white: Some(rgba(0xeee8d5ff).into()), terminal_ansi_white: Some(rgba(0xeee8d5ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
hidden: Some(rgba(0x586e75ff).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0x93a1a1ff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xb58800ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x93a1a1ff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"constant".into(),
UserHighlightStyle {
color: Some(rgba(0xcb4b15ff).into()),
..Default::default()
},
),
(
"embedded".into(),
UserHighlightStyle {
color: Some(rgba(0x657b83ff).into()),
..Default::default()
},
),
(
"emphasis".into(),
UserHighlightStyle {
color: Some(rgba(0xd33582ff).into()),
..Default::default()
},
),
(
"emphasis.strong".into(),
UserHighlightStyle {
color: Some(rgba(0xd33582ff).into()),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0x859900ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xd33582ff).into()),
..Default::default()
},
),
(
"punctuation.bracket".into(),
UserHighlightStyle {
color: Some(rgba(0x93a1a1ff).into()),
..Default::default()
},
),
(
"string".into(),
UserHighlightStyle {
color: Some(rgba(0x29a198ff).into()),
..Default::default()
},
),
(
"string.escape".into(),
UserHighlightStyle {
color: Some(rgba(0xcb4b15ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
(
"text.literal".into(),
UserHighlightStyle {
color: Some(rgba(0x29a198ff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0x258ad2ff).into()),
..Default::default()
},
),
],
}),
}, },
}, },
], ],

View file

@ -3,8 +3,10 @@
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{ use crate::{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
}; };
pub fn synthwave_84() -> UserThemeFamily { pub fn synthwave_84() -> UserThemeFamily {
@ -16,10 +18,18 @@ pub fn synthwave_84() -> UserThemeFamily {
appearance: Appearance::Dark, appearance: Appearance::Dark,
styles: UserThemeStylesRefinement { styles: UserThemeStylesRefinement {
colors: ThemeColorsRefinement { colors: ThemeColorsRefinement {
border_focused: Some(rgba(0x1f212bff).into()),
background: Some(rgba(0x252334ff).into()), background: Some(rgba(0x252334ff).into()),
element_background: Some(rgba(0x614d85ff).into()), element_background: Some(rgba(0x614d85ff).into()),
element_hover: Some(rgba(0x37294d99).into()),
element_selected: Some(rgba(0xffffff20).into()),
drop_target_background: Some(rgba(0x34294f66).into()),
ghost_element_hover: Some(rgba(0x37294d99).into()),
text: Some(rgba(0xffffffff).into()), text: Some(rgba(0xffffffff).into()),
tab_inactive_background: Some(rgba(0x252334ff).into()), tab_inactive_background: Some(rgba(0x252334ff).into()),
editor_background: Some(rgba(0x252334ff).into()),
editor_gutter_background: Some(rgba(0x252334ff).into()),
editor_line_number: Some(rgba(0xffffff73).into()),
terminal_ansi_bright_red: Some(rgba(0xfe444fff).into()), terminal_ansi_bright_red: Some(rgba(0xfe444fff).into()),
terminal_ansi_bright_green: Some(rgba(0x71f1b7ff).into()), terminal_ansi_bright_green: Some(rgba(0x71f1b7ff).into()),
terminal_ansi_bright_yellow: Some(rgba(0xfede5cff).into()), terminal_ansi_bright_yellow: Some(rgba(0xfede5cff).into()),
@ -34,6 +44,137 @@ pub fn synthwave_84() -> UserThemeFamily {
terminal_ansi_cyan: Some(rgba(0x02edf9ff).into()), terminal_ansi_cyan: Some(rgba(0x02edf9ff).into()),
..Default::default() ..Default::default()
}, },
status: StatusColorsRefinement {
deleted: Some(rgba(0xfe444fff).into()),
error: Some(rgba(0xfe444fff).into()),
warning: Some(rgba(0x71f1b7bb).into()),
..Default::default()
},
syntax: Some(UserSyntaxTheme {
highlights: vec![
(
"attribute".into(),
UserHighlightStyle {
color: Some(rgba(0xfede5cff).into()),
..Default::default()
},
),
(
"boolean".into(),
UserHighlightStyle {
color: Some(rgba(0xf97d71ff).into()),
..Default::default()
},
),
(
"comment".into(),
UserHighlightStyle {
color: Some(rgba(0x848bbdff).into()),
font_style: Some(UserFontStyle::Italic),
..Default::default()
},
),
(
"function".into(),
UserHighlightStyle {
color: Some(rgba(0x35f9f5ff).into()),
..Default::default()
},
),
(
"keyword".into(),
UserHighlightStyle {
color: Some(rgba(0xfede5cff).into()),
..Default::default()
},
),
(
"label".into(),
UserHighlightStyle {
color: Some(rgba(0xfe444fff).into()),
..Default::default()
},
),
(
"link_text".into(),
UserHighlightStyle {
color: Some(rgba(0xdd5500ff).into()),
..Default::default()
},
),
(
"link_uri".into(),
UserHighlightStyle {
color: Some(rgba(0xdd5500ff).into()),
..Default::default()
},
),
(
"number".into(),
UserHighlightStyle {
color: Some(rgba(0xf97d71ff).into()),
..Default::default()
},
),
(
"operator".into(),
UserHighlightStyle {
color: Some(rgba(0xfede5cff).into()),
..Default::default()
},
),
(
"property".into(),
UserHighlightStyle {
color: Some(rgba(0xff7ddaff).into()),
..Default::default()
},
),
(
"punctuation".into(),
UserHighlightStyle {
color: Some(rgba(0x35f9f5ff).into()),
..Default::default()
},
),
(
"tag".into(),
UserHighlightStyle {
color: Some(rgba(0x71f1b7ff).into()),
..Default::default()
},
),
(
"title".into(),
UserHighlightStyle {
color: Some(rgba(0xfe444fff).into()),
..Default::default()
},
),
(
"type".into(),
UserHighlightStyle {
color: Some(rgba(0xfe444fff).into()),
..Default::default()
},
),
(
"variable".into(),
UserHighlightStyle {
color: Some(rgba(0xff7ddaff).into()),
..Default::default()
},
),
(
"variable.special".into(),
UserHighlightStyle {
color: Some(rgba(0xfe444fff).into()),
font_weight: Some(UserFontWeight(700.0)),
..Default::default()
},
),
],
}),
}, },
}], }],
} }

View file

@ -1,8 +1,8 @@
use crate::{Appearance, StatusColors, StatusColorsRefinement, ThemeColors, ThemeColorsRefinement};
use gpui::{FontStyle, FontWeight, Hsla};
use refineable::Refineable; use refineable::Refineable;
use serde::Deserialize; use serde::Deserialize;
use crate::{Appearance, ThemeColors, ThemeColorsRefinement};
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct UserThemeFamily { pub struct UserThemeFamily {
pub name: String, pub name: String,
@ -18,8 +18,76 @@ pub struct UserTheme {
} }
#[derive(Refineable, Clone)] #[derive(Refineable, Clone)]
#[refineable(deserialize)] #[refineable(Deserialize)]
pub struct UserThemeStyles { pub struct UserThemeStyles {
#[refineable] #[refineable]
pub colors: ThemeColors, pub colors: ThemeColors,
#[refineable]
pub status: StatusColors,
pub syntax: UserSyntaxTheme,
}
#[derive(Clone, Default, Deserialize)]
pub struct UserSyntaxTheme {
pub highlights: Vec<(String, UserHighlightStyle)>,
}
#[derive(Clone, Default, Deserialize)]
pub struct UserHighlightStyle {
pub color: Option<Hsla>,
pub font_style: Option<UserFontStyle>,
pub font_weight: Option<UserFontWeight>,
}
#[derive(Clone, Copy, Default, Deserialize)]
pub struct UserFontWeight(pub f32);
impl UserFontWeight {
/// Thin weight (100), the thinnest value.
pub const THIN: Self = Self(FontWeight::THIN.0);
/// Extra light weight (200).
pub const EXTRA_LIGHT: Self = Self(FontWeight::EXTRA_LIGHT.0);
/// Light weight (300).
pub const LIGHT: Self = Self(FontWeight::LIGHT.0);
/// Normal (400).
pub const NORMAL: Self = Self(FontWeight::NORMAL.0);
/// Medium weight (500, higher than normal).
pub const MEDIUM: Self = Self(FontWeight::MEDIUM.0);
/// Semibold weight (600).
pub const SEMIBOLD: Self = Self(FontWeight::SEMIBOLD.0);
/// Bold weight (700).
pub const BOLD: Self = Self(FontWeight::BOLD.0);
/// Extra-bold weight (800).
pub const EXTRA_BOLD: Self = Self(FontWeight::EXTRA_BOLD.0);
/// Black weight (900), the thickest value.
pub const BLACK: Self = Self(FontWeight::BLACK.0);
}
impl From<UserFontWeight> for FontWeight {
fn from(value: UserFontWeight) -> Self {
Self(value.0)
}
}
#[derive(Debug, Clone, Copy, Deserialize)]
pub enum UserFontStyle {
Normal,
Italic,
Oblique,
}
impl From<UserFontStyle> for FontStyle {
fn from(value: UserFontStyle) -> Self {
match value {
UserFontStyle::Normal => FontStyle::Normal,
UserFontStyle::Italic => FontStyle::Italic,
UserFontStyle::Oblique => FontStyle::Oblique,
}
}
}
impl UserHighlightStyle {
pub fn is_empty(&self) -> bool {
self.color.is_none() && self.font_style.is_none() && self.font_weight.is_none()
}
} }

View file

@ -10,9 +10,12 @@ publish = false
anyhow.workspace = true anyhow.workspace = true
convert_case = "0.6.0" convert_case = "0.6.0"
gpui = { package = "gpui2", path = "../gpui2" } gpui = { package = "gpui2", path = "../gpui2" }
indexmap = "1.6.2"
json_comments = "0.2.2"
log.workspace = true log.workspace = true
rust-embed.workspace = true rust-embed.workspace = true
serde.workspace = true serde.workspace = true
simplelog = "0.9" simplelog = "0.9"
theme = { package = "theme2", path = "../theme2" } strum = { version = "0.25.0", features = ["derive"] }
theme = { package = "theme2", path = "../theme2", features = ["importing-themes"] }
uuid.workspace = true uuid.workspace = true

View file

@ -11,14 +11,15 @@ use std::str::FromStr;
use anyhow::{anyhow, Context, Result}; use anyhow::{anyhow, Context, Result};
use convert_case::{Case, Casing}; use convert_case::{Case, Casing};
use gpui::serde_json; use gpui::serde_json;
use json_comments::StripComments;
use log::LevelFilter; use log::LevelFilter;
use serde::Deserialize; use serde::Deserialize;
use simplelog::SimpleLogger; use simplelog::SimpleLogger;
use theme::{Appearance, UserThemeFamily}; use theme::{Appearance, UserThemeFamily};
use vscode::VsCodeThemeConverter;
use crate::theme_printer::UserThemeFamilyPrinter; use crate::theme_printer::UserThemeFamilyPrinter;
use crate::vscode::VsCodeTheme; use crate::vscode::VsCodeTheme;
use crate::vscode::VsCodeThemeConverter;
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
struct FamilyMetadata { struct FamilyMetadata {
@ -27,7 +28,7 @@ struct FamilyMetadata {
pub themes: Vec<ThemeMetadata>, pub themes: Vec<ThemeMetadata>,
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Clone, Copy, Deserialize)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
pub enum ThemeAppearanceJson { pub enum ThemeAppearanceJson {
Light, Light,
@ -111,7 +112,8 @@ fn main() -> Result<()> {
} }
}; };
let vscode_theme: VsCodeTheme = serde_json::from_reader(theme_file) let theme_without_comments = StripComments::new(theme_file);
let vscode_theme: VsCodeTheme = serde_json::from_reader(theme_without_comments)
.context(format!("failed to parse theme {theme_file_path:?}"))?; .context(format!("failed to parse theme {theme_file_path:?}"))?;
let converter = VsCodeThemeConverter::new(vscode_theme, theme_metadata); let converter = VsCodeThemeConverter::new(vscode_theme, theme_metadata);
@ -158,8 +160,10 @@ fn main() -> Result<()> {
use gpui::rgba; use gpui::rgba;
#[allow(unused)]
use crate::{{ use crate::{{
Appearance, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, Appearance, StatusColorsRefinement, ThemeColorsRefinement, UserHighlightStyle, UserSyntaxTheme,
UserTheme, UserThemeFamily, UserThemeStylesRefinement, UserFontWeight, UserFontStyle
}}; }};
pub fn {theme_family_slug}() -> UserThemeFamily {{ pub fn {theme_family_slug}() -> UserThemeFamily {{

View file

@ -2,8 +2,9 @@ use std::fmt::{self, Debug};
use gpui::{Hsla, Rgba}; use gpui::{Hsla, Rgba};
use theme::{ use theme::{
Appearance, PlayerColor, PlayerColors, StatusColors, SyntaxTheme, SystemColors, Appearance, PlayerColor, PlayerColors, StatusColorsRefinement, SystemColors,
ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement, ThemeColorsRefinement, UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeFamily,
UserThemeStylesRefinement,
}; };
struct RawSyntaxPrinter<'a>(&'a str); struct RawSyntaxPrinter<'a>(&'a str);
@ -30,6 +31,17 @@ impl<'a, D: Debug> Debug for IntoPrinter<'a, D> {
} }
} }
pub struct OptionPrinter<'a, T>(&'a Option<T>);
impl<'a, T: Debug> Debug for OptionPrinter<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.0 {
Some(value) => write!(f, "Some({:?})", value),
None => write!(f, "None"),
}
}
}
pub struct VecPrinter<'a, T>(&'a Vec<T>); pub struct VecPrinter<'a, T>(&'a Vec<T>);
impl<'a, T: Debug> Debug for VecPrinter<'a, T> { impl<'a, T: Debug> Debug for VecPrinter<'a, T> {
@ -92,6 +104,17 @@ impl<'a> Debug for UserThemeStylesRefinementPrinter<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UserThemeStylesRefinement") f.debug_struct("UserThemeStylesRefinement")
.field("colors", &ThemeColorsRefinementPrinter(&self.0.colors)) .field("colors", &ThemeColorsRefinementPrinter(&self.0.colors))
.field("status", &StatusColorsRefinementPrinter(&self.0.status))
.field(
"syntax",
&OptionPrinter(
&self
.0
.syntax
.as_ref()
.map(|syntax| UserSyntaxThemePrinter(syntax)),
),
)
.finish() .finish()
} }
} }
@ -250,23 +273,39 @@ impl<'a> Debug for ThemeColorsRefinementPrinter<'a> {
} }
} }
pub struct StatusColorsPrinter<'a>(&'a StatusColors); pub struct StatusColorsRefinementPrinter<'a>(&'a StatusColorsRefinement);
impl<'a> Debug for StatusColorsPrinter<'a> { impl<'a> Debug for StatusColorsRefinementPrinter<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("StatusColors") let status_colors = vec![
.field("conflict", &HslaPrinter(self.0.conflict)) ("conflict", self.0.conflict),
.field("created", &HslaPrinter(self.0.created)) ("created", self.0.created),
.field("deleted", &HslaPrinter(self.0.deleted)) ("deleted", self.0.deleted),
.field("error", &HslaPrinter(self.0.error)) ("error", self.0.error),
.field("hidden", &HslaPrinter(self.0.hidden)) ("hidden", self.0.hidden),
.field("ignored", &HslaPrinter(self.0.ignored)) ("ignored", self.0.ignored),
.field("info", &HslaPrinter(self.0.info)) ("info", self.0.info),
.field("modified", &HslaPrinter(self.0.modified)) ("modified", self.0.modified),
.field("renamed", &HslaPrinter(self.0.renamed)) ("renamed", self.0.renamed),
.field("success", &HslaPrinter(self.0.success)) ("success", self.0.success),
.field("warning", &HslaPrinter(self.0.warning)) ("warning", self.0.warning),
.finish() ];
f.write_str("StatusColorsRefinement {")?;
for (color_name, color) in status_colors {
if let Some(color) = color {
f.write_str(color_name)?;
f.write_str(": ")?;
f.write_str("Some(")?;
HslaPrinter(color).fmt(f)?;
f.write_str(")")?;
f.write_str(",")?;
}
}
f.write_str("..Default::default()")?;
f.write_str("}")
} }
} }
@ -299,11 +338,11 @@ impl<'a> Debug for PlayerColorPrinter<'a> {
} }
} }
pub struct SyntaxThemePrinter<'a>(&'a SyntaxTheme); pub struct UserSyntaxThemePrinter<'a>(&'a UserSyntaxTheme);
impl<'a> Debug for SyntaxThemePrinter<'a> { impl<'a> Debug for UserSyntaxThemePrinter<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SyntaxTheme") f.debug_struct("UserSyntaxTheme")
.field( .field(
"highlights", "highlights",
&VecPrinter( &VecPrinter(
@ -312,7 +351,7 @@ impl<'a> Debug for SyntaxThemePrinter<'a> {
.highlights .highlights
.iter() .iter()
.map(|(token, highlight)| { .map(|(token, highlight)| {
(IntoPrinter(token), HslaPrinter(highlight.color.unwrap())) (IntoPrinter(token), UserHighlightStylePrinter(&highlight))
}) })
.collect(), .collect(),
), ),
@ -320,3 +359,41 @@ impl<'a> Debug for SyntaxThemePrinter<'a> {
.finish() .finish()
} }
} }
pub struct UserHighlightStylePrinter<'a>(&'a UserHighlightStyle);
impl<'a> Debug for UserHighlightStylePrinter<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("UserHighlightStyle {")?;
if let Some(color) = self.0.color {
f.write_str("color")?;
f.write_str(": ")?;
f.write_str("Some(")?;
HslaPrinter(color).fmt(f)?;
f.write_str(")")?;
f.write_str(",")?;
}
if let Some(font_style) = self.0.font_style {
f.write_str("font_style")?;
f.write_str(": ")?;
f.write_str("Some(")?;
write!(f, "UserFontStyle::{:?}", font_style)?;
f.write_str(")")?;
f.write_str(",")?;
}
if let Some(font_weight) = self.0.font_weight.as_ref() {
f.write_str("font_weight")?;
f.write_str(": ")?;
f.write_str("Some(")?;
write!(f, "UserFontWeight({:?})", font_weight.0)?;
f.write_str(")")?;
f.write_str(",")?;
}
f.write_str("..Default::default()")?;
f.write_str("}")
}
}

View file

@ -1,570 +1,7 @@
use anyhow::Result; mod converter;
use gpui::{Hsla, Rgba}; mod syntax;
use serde::Deserialize; mod theme;
use theme::{ThemeColorsRefinement, UserTheme, UserThemeStylesRefinement};
use crate::util::Traverse; pub use converter::*;
use crate::ThemeMetadata; pub use syntax::*;
pub use theme::*;
#[derive(Deserialize, Debug)]
pub struct VsCodeTheme {
#[serde(rename = "$schema")]
pub schema: Option<String>,
pub name: Option<String>,
pub author: Option<String>,
pub maintainers: Option<Vec<String>>,
#[serde(rename = "semanticClass")]
pub semantic_class: Option<String>,
#[serde(rename = "semanticHighlighting")]
pub semantic_highlighting: Option<bool>,
pub colors: VsCodeColors,
}
#[derive(Debug, Deserialize)]
pub struct VsCodeColors {
#[serde(rename = "terminal.background")]
pub terminal_background: Option<String>,
#[serde(rename = "terminal.foreground")]
pub terminal_foreground: Option<String>,
#[serde(rename = "terminal.ansiBrightBlack")]
pub terminal_ansi_bright_black: Option<String>,
#[serde(rename = "terminal.ansiBrightRed")]
pub terminal_ansi_bright_red: Option<String>,
#[serde(rename = "terminal.ansiBrightGreen")]
pub terminal_ansi_bright_green: Option<String>,
#[serde(rename = "terminal.ansiBrightYellow")]
pub terminal_ansi_bright_yellow: Option<String>,
#[serde(rename = "terminal.ansiBrightBlue")]
pub terminal_ansi_bright_blue: Option<String>,
#[serde(rename = "terminal.ansiBrightMagenta")]
pub terminal_ansi_bright_magenta: Option<String>,
#[serde(rename = "terminal.ansiBrightCyan")]
pub terminal_ansi_bright_cyan: Option<String>,
#[serde(rename = "terminal.ansiBrightWhite")]
pub terminal_ansi_bright_white: Option<String>,
#[serde(rename = "terminal.ansiBlack")]
pub terminal_ansi_black: Option<String>,
#[serde(rename = "terminal.ansiRed")]
pub terminal_ansi_red: Option<String>,
#[serde(rename = "terminal.ansiGreen")]
pub terminal_ansi_green: Option<String>,
#[serde(rename = "terminal.ansiYellow")]
pub terminal_ansi_yellow: Option<String>,
#[serde(rename = "terminal.ansiBlue")]
pub terminal_ansi_blue: Option<String>,
#[serde(rename = "terminal.ansiMagenta")]
pub terminal_ansi_magenta: Option<String>,
#[serde(rename = "terminal.ansiCyan")]
pub terminal_ansi_cyan: Option<String>,
#[serde(rename = "terminal.ansiWhite")]
pub terminal_ansi_white: Option<String>,
#[serde(rename = "focusBorder")]
pub focus_border: Option<String>,
pub foreground: Option<String>,
#[serde(rename = "selection.background")]
pub selection_background: Option<String>,
#[serde(rename = "errorForeground")]
pub error_foreground: Option<String>,
#[serde(rename = "button.background")]
pub button_background: Option<String>,
#[serde(rename = "button.foreground")]
pub button_foreground: Option<String>,
#[serde(rename = "button.secondaryBackground")]
pub button_secondary_background: Option<String>,
#[serde(rename = "button.secondaryForeground")]
pub button_secondary_foreground: Option<String>,
#[serde(rename = "button.secondaryHoverBackground")]
pub button_secondary_hover_background: Option<String>,
#[serde(rename = "dropdown.background")]
pub dropdown_background: Option<String>,
#[serde(rename = "dropdown.border")]
pub dropdown_border: Option<String>,
#[serde(rename = "dropdown.foreground")]
pub dropdown_foreground: Option<String>,
#[serde(rename = "input.background")]
pub input_background: Option<String>,
#[serde(rename = "input.foreground")]
pub input_foreground: Option<String>,
#[serde(rename = "input.border")]
pub input_border: Option<String>,
#[serde(rename = "input.placeholderForeground")]
pub input_placeholder_foreground: Option<String>,
#[serde(rename = "inputOption.activeBorder")]
pub input_option_active_border: Option<String>,
#[serde(rename = "inputValidation.infoBorder")]
pub input_validation_info_border: Option<String>,
#[serde(rename = "inputValidation.warningBorder")]
pub input_validation_warning_border: Option<String>,
#[serde(rename = "inputValidation.errorBorder")]
pub input_validation_error_border: Option<String>,
#[serde(rename = "badge.foreground")]
pub badge_foreground: Option<String>,
#[serde(rename = "badge.background")]
pub badge_background: Option<String>,
#[serde(rename = "progressBar.background")]
pub progress_bar_background: Option<String>,
#[serde(rename = "list.activeSelectionBackground")]
pub list_active_selection_background: Option<String>,
#[serde(rename = "list.activeSelectionForeground")]
pub list_active_selection_foreground: Option<String>,
#[serde(rename = "list.dropBackground")]
pub list_drop_background: Option<String>,
#[serde(rename = "list.focusBackground")]
pub list_focus_background: Option<String>,
#[serde(rename = "list.highlightForeground")]
pub list_highlight_foreground: Option<String>,
#[serde(rename = "list.hoverBackground")]
pub list_hover_background: Option<String>,
#[serde(rename = "list.inactiveSelectionBackground")]
pub list_inactive_selection_background: Option<String>,
#[serde(rename = "list.warningForeground")]
pub list_warning_foreground: Option<String>,
#[serde(rename = "list.errorForeground")]
pub list_error_foreground: Option<String>,
#[serde(rename = "activityBar.background")]
pub activity_bar_background: Option<String>,
#[serde(rename = "activityBar.inactiveForeground")]
pub activity_bar_inactive_foreground: Option<String>,
#[serde(rename = "activityBar.foreground")]
pub activity_bar_foreground: Option<String>,
#[serde(rename = "activityBar.activeBorder")]
pub activity_bar_active_border: Option<String>,
#[serde(rename = "activityBar.activeBackground")]
pub activity_bar_active_background: Option<String>,
#[serde(rename = "activityBarBadge.background")]
pub activity_bar_badge_background: Option<String>,
#[serde(rename = "activityBarBadge.foreground")]
pub activity_bar_badge_foreground: Option<String>,
#[serde(rename = "sideBar.background")]
pub side_bar_background: Option<String>,
#[serde(rename = "sideBarTitle.foreground")]
pub side_bar_title_foreground: Option<String>,
#[serde(rename = "sideBarSectionHeader.background")]
pub side_bar_section_header_background: Option<String>,
#[serde(rename = "sideBarSectionHeader.border")]
pub side_bar_section_header_border: Option<String>,
#[serde(rename = "editorGroup.border")]
pub editor_group_border: Option<String>,
#[serde(rename = "editorGroup.dropBackground")]
pub editor_group_drop_background: Option<String>,
#[serde(rename = "editorGroupHeader.tabsBackground")]
pub editor_group_header_tabs_background: Option<String>,
#[serde(rename = "tab.activeBackground")]
pub tab_active_background: Option<String>,
#[serde(rename = "tab.activeForeground")]
pub tab_active_foreground: Option<String>,
#[serde(rename = "tab.border")]
pub tab_border: Option<String>,
#[serde(rename = "tab.activeBorderTop")]
pub tab_active_border_top: Option<String>,
#[serde(rename = "tab.inactiveBackground")]
pub tab_inactive_background: Option<String>,
#[serde(rename = "tab.inactiveForeground")]
pub tab_inactive_foreground: Option<String>,
#[serde(rename = "editor.foreground")]
pub editor_foreground: Option<String>,
#[serde(rename = "editor.background")]
pub editor_background: Option<String>,
#[serde(rename = "editorLineNumber.foreground")]
pub editor_line_number_foreground: Option<String>,
#[serde(rename = "editor.selectionBackground")]
pub editor_selection_background: Option<String>,
#[serde(rename = "editor.selectionHighlightBackground")]
pub editor_selection_highlight_background: Option<String>,
#[serde(rename = "editor.foldBackground")]
pub editor_fold_background: Option<String>,
#[serde(rename = "editor.wordHighlightBackground")]
pub editor_word_highlight_background: Option<String>,
#[serde(rename = "editor.wordHighlightStrongBackground")]
pub editor_word_highlight_strong_background: Option<String>,
#[serde(rename = "editor.findMatchBackground")]
pub editor_find_match_background: Option<String>,
#[serde(rename = "editor.findMatchHighlightBackground")]
pub editor_find_match_highlight_background: Option<String>,
#[serde(rename = "editor.findRangeHighlightBackground")]
pub editor_find_range_highlight_background: Option<String>,
#[serde(rename = "editor.hoverHighlightBackground")]
pub editor_hover_highlight_background: Option<String>,
#[serde(rename = "editor.lineHighlightBorder")]
pub editor_line_highlight_border: Option<String>,
#[serde(rename = "editorLink.activeForeground")]
pub editor_link_active_foreground: Option<String>,
#[serde(rename = "editor.rangeHighlightBackground")]
pub editor_range_highlight_background: Option<String>,
#[serde(rename = "editor.snippetTabstopHighlightBackground")]
pub editor_snippet_tabstop_highlight_background: Option<String>,
#[serde(rename = "editor.snippetTabstopHighlightBorder")]
pub editor_snippet_tabstop_highlight_border: Option<String>,
#[serde(rename = "editor.snippetFinalTabstopHighlightBackground")]
pub editor_snippet_final_tabstop_highlight_background: Option<String>,
#[serde(rename = "editor.snippetFinalTabstopHighlightBorder")]
pub editor_snippet_final_tabstop_highlight_border: Option<String>,
#[serde(rename = "editorWhitespace.foreground")]
pub editor_whitespace_foreground: Option<String>,
#[serde(rename = "editorIndentGuide.background")]
pub editor_indent_guide_background: Option<String>,
#[serde(rename = "editorIndentGuide.activeBackground")]
pub editor_indent_guide_active_background: Option<String>,
#[serde(rename = "editorRuler.foreground")]
pub editor_ruler_foreground: Option<String>,
#[serde(rename = "editorCodeLens.foreground")]
pub editor_code_lens_foreground: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground1")]
pub editor_bracket_highlight_foreground1: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground2")]
pub editor_bracket_highlight_foreground2: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground3")]
pub editor_bracket_highlight_foreground3: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground4")]
pub editor_bracket_highlight_foreground4: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground5")]
pub editor_bracket_highlight_foreground5: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground6")]
pub editor_bracket_highlight_foreground6: Option<String>,
#[serde(rename = "editorBracketHighlight.unexpectedBracket.foreground")]
pub editor_bracket_highlight_unexpected_bracket_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.border")]
pub editor_overview_ruler_border: Option<String>,
#[serde(rename = "editorOverviewRuler.selectionHighlightForeground")]
pub editor_overview_ruler_selection_highlight_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.wordHighlightForeground")]
pub editor_overview_ruler_word_highlight_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.wordHighlightStrongForeground")]
pub editor_overview_ruler_word_highlight_strong_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.modifiedForeground")]
pub editor_overview_ruler_modified_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.addedForeground")]
pub editor_overview_ruler_added_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.deletedForeground")]
pub editor_overview_ruler_deleted_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.errorForeground")]
pub editor_overview_ruler_error_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.warningForeground")]
pub editor_overview_ruler_warning_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.infoForeground")]
pub editor_overview_ruler_info_foreground: Option<String>,
#[serde(rename = "editorError.foreground")]
pub editor_error_foreground: Option<String>,
#[serde(rename = "editorWarning.foreground")]
pub editor_warning_foreground: Option<String>,
#[serde(rename = "editorGutter.modifiedBackground")]
pub editor_gutter_modified_background: Option<String>,
#[serde(rename = "editorGutter.addedBackground")]
pub editor_gutter_added_background: Option<String>,
#[serde(rename = "editorGutter.deletedBackground")]
pub editor_gutter_deleted_background: Option<String>,
#[serde(rename = "gitDecoration.modifiedResourceForeground")]
pub git_decoration_modified_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.deletedResourceForeground")]
pub git_decoration_deleted_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.untrackedResourceForeground")]
pub git_decoration_untracked_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.ignoredResourceForeground")]
pub git_decoration_ignored_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.conflictingResourceForeground")]
pub git_decoration_conflicting_resource_foreground: Option<String>,
#[serde(rename = "diffEditor.insertedTextBackground")]
pub diff_editor_inserted_text_background: Option<String>,
#[serde(rename = "diffEditor.removedTextBackground")]
pub diff_editor_removed_text_background: Option<String>,
#[serde(rename = "inlineChat.regionHighlight")]
pub inline_chat_region_highlight: Option<String>,
#[serde(rename = "editorWidget.background")]
pub editor_widget_background: Option<String>,
#[serde(rename = "editorSuggestWidget.background")]
pub editor_suggest_widget_background: Option<String>,
#[serde(rename = "editorSuggestWidget.foreground")]
pub editor_suggest_widget_foreground: Option<String>,
#[serde(rename = "editorSuggestWidget.selectedBackground")]
pub editor_suggest_widget_selected_background: Option<String>,
#[serde(rename = "editorHoverWidget.background")]
pub editor_hover_widget_background: Option<String>,
#[serde(rename = "editorHoverWidget.border")]
pub editor_hover_widget_border: Option<String>,
#[serde(rename = "editorMarkerNavigation.background")]
pub editor_marker_navigation_background: Option<String>,
#[serde(rename = "peekView.border")]
pub peek_view_border: Option<String>,
#[serde(rename = "peekViewEditor.background")]
pub peek_view_editor_background: Option<String>,
#[serde(rename = "peekViewEditor.matchHighlightBackground")]
pub peek_view_editor_match_highlight_background: Option<String>,
#[serde(rename = "peekViewResult.background")]
pub peek_view_result_background: Option<String>,
#[serde(rename = "peekViewResult.fileForeground")]
pub peek_view_result_file_foreground: Option<String>,
#[serde(rename = "peekViewResult.lineForeground")]
pub peek_view_result_line_foreground: Option<String>,
#[serde(rename = "peekViewResult.matchHighlightBackground")]
pub peek_view_result_match_highlight_background: Option<String>,
#[serde(rename = "peekViewResult.selectionBackground")]
pub peek_view_result_selection_background: Option<String>,
#[serde(rename = "peekViewResult.selectionForeground")]
pub peek_view_result_selection_foreground: Option<String>,
#[serde(rename = "peekViewTitle.background")]
pub peek_view_title_background: Option<String>,
#[serde(rename = "peekViewTitleDescription.foreground")]
pub peek_view_title_description_foreground: Option<String>,
#[serde(rename = "peekViewTitleLabel.foreground")]
pub peek_view_title_label_foreground: Option<String>,
#[serde(rename = "merge.currentHeaderBackground")]
pub merge_current_header_background: Option<String>,
#[serde(rename = "merge.incomingHeaderBackground")]
pub merge_incoming_header_background: Option<String>,
#[serde(rename = "editorOverviewRuler.currentContentForeground")]
pub editor_overview_ruler_current_content_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.incomingContentForeground")]
pub editor_overview_ruler_incoming_content_foreground: Option<String>,
#[serde(rename = "panel.background")]
pub panel_background: Option<String>,
#[serde(rename = "panel.border")]
pub panel_border: Option<String>,
#[serde(rename = "panelTitle.activeBorder")]
pub panel_title_active_border: Option<String>,
#[serde(rename = "panelTitle.activeForeground")]
pub panel_title_active_foreground: Option<String>,
#[serde(rename = "panelTitle.inactiveForeground")]
pub panel_title_inactive_foreground: Option<String>,
#[serde(rename = "statusBar.background")]
pub status_bar_background: Option<String>,
#[serde(rename = "statusBar.foreground")]
pub status_bar_foreground: Option<String>,
#[serde(rename = "statusBar.debuggingBackground")]
pub status_bar_debugging_background: Option<String>,
#[serde(rename = "statusBar.debuggingForeground")]
pub status_bar_debugging_foreground: Option<String>,
#[serde(rename = "statusBar.noFolderBackground")]
pub status_bar_no_folder_background: Option<String>,
#[serde(rename = "statusBar.noFolderForeground")]
pub status_bar_no_folder_foreground: Option<String>,
#[serde(rename = "statusBarItem.prominentBackground")]
pub status_bar_item_prominent_background: Option<String>,
#[serde(rename = "statusBarItem.prominentHoverBackground")]
pub status_bar_item_prominent_hover_background: Option<String>,
#[serde(rename = "statusBarItem.remoteForeground")]
pub status_bar_item_remote_foreground: Option<String>,
#[serde(rename = "statusBarItem.remoteBackground")]
pub status_bar_item_remote_background: Option<String>,
#[serde(rename = "titleBar.activeBackground")]
pub title_bar_active_background: Option<String>,
#[serde(rename = "titleBar.activeForeground")]
pub title_bar_active_foreground: Option<String>,
#[serde(rename = "titleBar.inactiveBackground")]
pub title_bar_inactive_background: Option<String>,
#[serde(rename = "titleBar.inactiveForeground")]
pub title_bar_inactive_foreground: Option<String>,
#[serde(rename = "extensionButton.prominentForeground")]
pub extension_button_prominent_foreground: Option<String>,
#[serde(rename = "extensionButton.prominentBackground")]
pub extension_button_prominent_background: Option<String>,
#[serde(rename = "extensionButton.prominentHoverBackground")]
pub extension_button_prominent_hover_background: Option<String>,
#[serde(rename = "pickerGroup.border")]
pub picker_group_border: Option<String>,
#[serde(rename = "pickerGroup.foreground")]
pub picker_group_foreground: Option<String>,
#[serde(rename = "debugToolBar.background")]
pub debug_tool_bar_background: Option<String>,
#[serde(rename = "walkThrough.embeddedEditorBackground")]
pub walk_through_embedded_editor_background: Option<String>,
#[serde(rename = "settings.headerForeground")]
pub settings_header_foreground: Option<String>,
#[serde(rename = "settings.modifiedItemIndicator")]
pub settings_modified_item_indicator: Option<String>,
#[serde(rename = "settings.dropdownBackground")]
pub settings_dropdown_background: Option<String>,
#[serde(rename = "settings.dropdownForeground")]
pub settings_dropdown_foreground: Option<String>,
#[serde(rename = "settings.dropdownBorder")]
pub settings_dropdown_border: Option<String>,
#[serde(rename = "settings.checkboxBackground")]
pub settings_checkbox_background: Option<String>,
#[serde(rename = "settings.checkboxForeground")]
pub settings_checkbox_foreground: Option<String>,
#[serde(rename = "settings.checkboxBorder")]
pub settings_checkbox_border: Option<String>,
#[serde(rename = "settings.textInputBackground")]
pub settings_text_input_background: Option<String>,
#[serde(rename = "settings.textInputForeground")]
pub settings_text_input_foreground: Option<String>,
#[serde(rename = "settings.textInputBorder")]
pub settings_text_input_border: Option<String>,
#[serde(rename = "settings.numberInputBackground")]
pub settings_number_input_background: Option<String>,
#[serde(rename = "settings.numberInputForeground")]
pub settings_number_input_foreground: Option<String>,
#[serde(rename = "settings.numberInputBorder")]
pub settings_number_input_border: Option<String>,
#[serde(rename = "breadcrumb.foreground")]
pub breadcrumb_foreground: Option<String>,
#[serde(rename = "breadcrumb.background")]
pub breadcrumb_background: Option<String>,
#[serde(rename = "breadcrumb.focusForeground")]
pub breadcrumb_focus_foreground: Option<String>,
#[serde(rename = "breadcrumb.activeSelectionForeground")]
pub breadcrumb_active_selection_foreground: Option<String>,
#[serde(rename = "breadcrumbPicker.background")]
pub breadcrumb_picker_background: Option<String>,
#[serde(rename = "listFilterWidget.background")]
pub list_filter_widget_background: Option<String>,
#[serde(rename = "listFilterWidget.outline")]
pub list_filter_widget_outline: Option<String>,
#[serde(rename = "listFilterWidget.noMatchesOutline")]
pub list_filter_widget_no_matches_outline: Option<String>,
}
fn try_parse_color(color: &str) -> Result<Hsla> {
Ok(Rgba::try_from(color)?.into())
}
pub struct VsCodeThemeConverter {
theme: VsCodeTheme,
theme_metadata: ThemeMetadata,
}
impl VsCodeThemeConverter {
pub fn new(theme: VsCodeTheme, theme_metadata: ThemeMetadata) -> Self {
Self {
theme,
theme_metadata,
}
}
pub fn convert(self) -> Result<UserTheme> {
let appearance = self.theme_metadata.appearance.into();
let vscode_colors = &self.theme.colors;
let theme_colors_refinements = ThemeColorsRefinement {
border: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_variant: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_focused: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_disabled: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_selected: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_transparent: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
elevated_surface_background: vscode_colors
.panel_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
surface_background: vscode_colors
.panel_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
background: vscode_colors
.editor_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
element_background: vscode_colors
.button_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
text: vscode_colors
.foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
tab_active_background: vscode_colors
.tab_active_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
tab_inactive_background: vscode_colors
.tab_inactive_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_background: vscode_colors
.terminal_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_black: vscode_colors
.terminal_ansi_bright_black
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_red: vscode_colors
.terminal_ansi_bright_red
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_green: vscode_colors
.terminal_ansi_bright_green
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_yellow: vscode_colors
.terminal_ansi_bright_yellow
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_blue: vscode_colors
.terminal_ansi_bright_blue
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_magenta: vscode_colors
.terminal_ansi_bright_magenta
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_cyan: vscode_colors
.terminal_ansi_bright_cyan
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_white: vscode_colors
.terminal_ansi_bright_white
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_black: vscode_colors
.terminal_ansi_black
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_red: vscode_colors
.terminal_ansi_red
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_green: vscode_colors
.terminal_ansi_green
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_yellow: vscode_colors
.terminal_ansi_yellow
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_blue: vscode_colors
.terminal_ansi_blue
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_magenta: vscode_colors
.terminal_ansi_magenta
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_cyan: vscode_colors
.terminal_ansi_cyan
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_white: vscode_colors
.terminal_ansi_white
.as_ref()
.traverse(|color| try_parse_color(&color))?,
..Default::default()
};
Ok(UserTheme {
name: self.theme_metadata.name.into(),
appearance,
styles: UserThemeStylesRefinement {
colors: theme_colors_refinements,
},
})
}
}

View file

@ -0,0 +1,372 @@
use anyhow::Result;
use gpui::{Hsla, Rgba};
use indexmap::IndexMap;
use strum::IntoEnumIterator;
use theme::{
StatusColorsRefinement, ThemeColorsRefinement, UserFontStyle, UserFontWeight,
UserHighlightStyle, UserSyntaxTheme, UserTheme, UserThemeStylesRefinement,
};
use crate::util::Traverse;
use crate::vscode::VsCodeTheme;
use crate::ThemeMetadata;
use super::ZedSyntaxToken;
pub(crate) fn try_parse_color(color: &str) -> Result<Hsla> {
Ok(Rgba::try_from(color)?.into())
}
pub(crate) fn try_parse_font_weight(font_style: &str) -> Option<UserFontWeight> {
match font_style {
style if style.contains("bold") => Some(UserFontWeight::BOLD),
_ => None,
}
}
pub(crate) fn try_parse_font_style(font_style: &str) -> Option<UserFontStyle> {
match font_style {
style if style.contains("italic") => Some(UserFontStyle::Italic),
style if style.contains("oblique") => Some(UserFontStyle::Oblique),
_ => None,
}
}
pub struct VsCodeThemeConverter {
theme: VsCodeTheme,
theme_metadata: ThemeMetadata,
}
impl VsCodeThemeConverter {
pub fn new(theme: VsCodeTheme, theme_metadata: ThemeMetadata) -> Self {
Self {
theme,
theme_metadata,
}
}
pub fn convert(self) -> Result<UserTheme> {
let appearance = self.theme_metadata.appearance.into();
let status_color_refinements = self.convert_status_colors()?;
let theme_colors_refinements = self.convert_theme_colors()?;
let syntax_theme = self.convert_syntax_theme()?;
Ok(UserTheme {
name: self.theme_metadata.name.into(),
appearance,
styles: UserThemeStylesRefinement {
colors: theme_colors_refinements,
status: status_color_refinements,
syntax: Some(syntax_theme),
},
})
}
fn convert_status_colors(&self) -> Result<StatusColorsRefinement> {
let vscode_colors = &self.theme.colors;
Ok(StatusColorsRefinement {
// conflict: None,
// created: None,
deleted: vscode_colors
.error_foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
error: vscode_colors
.error_foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
hidden: vscode_colors
.tab_inactive_foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
// ignored: None,
// info: None,
// modified: None,
// renamed: None,
// success: None,
warning: vscode_colors
.list_warning_foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
..Default::default()
})
}
fn convert_theme_colors(&self) -> Result<ThemeColorsRefinement> {
let vscode_colors = &self.theme.colors;
Ok(ThemeColorsRefinement {
border: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_variant: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_focused: vscode_colors
.focus_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_disabled: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_selected: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
border_transparent: vscode_colors
.panel_border
.as_ref()
.traverse(|color| try_parse_color(&color))?,
elevated_surface_background: vscode_colors
.panel_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
surface_background: vscode_colors
.panel_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
background: vscode_colors
.editor_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
element_background: vscode_colors
.button_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
element_hover: vscode_colors
.list_hover_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
element_selected: vscode_colors
.list_active_selection_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
ghost_element_hover: vscode_colors
.list_hover_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
drop_target_background: vscode_colors
.list_drop_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
text: vscode_colors
.foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?
.or_else(|| {
self.theme
.token_colors
.iter()
.find(|token_color| token_color.scope.is_none())
.and_then(|token_color| token_color.settings.foreground.as_ref())
.traverse(|color| try_parse_color(&color))
.ok()
.flatten()
}),
tab_active_background: vscode_colors
.tab_active_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
tab_inactive_background: vscode_colors
.tab_inactive_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
editor_background: vscode_colors
.editor_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
editor_gutter_background: vscode_colors
.editor_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
editor_line_number: vscode_colors
.editor_line_number_foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
editor_active_line_number: vscode_colors
.editor_foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_background: vscode_colors
.terminal_background
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_black: vscode_colors
.terminal_ansi_bright_black
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_red: vscode_colors
.terminal_ansi_bright_red
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_green: vscode_colors
.terminal_ansi_bright_green
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_yellow: vscode_colors
.terminal_ansi_bright_yellow
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_blue: vscode_colors
.terminal_ansi_bright_blue
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_magenta: vscode_colors
.terminal_ansi_bright_magenta
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_cyan: vscode_colors
.terminal_ansi_bright_cyan
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_bright_white: vscode_colors
.terminal_ansi_bright_white
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_black: vscode_colors
.terminal_ansi_black
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_red: vscode_colors
.terminal_ansi_red
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_green: vscode_colors
.terminal_ansi_green
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_yellow: vscode_colors
.terminal_ansi_yellow
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_blue: vscode_colors
.terminal_ansi_blue
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_magenta: vscode_colors
.terminal_ansi_magenta
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_cyan: vscode_colors
.terminal_ansi_cyan
.as_ref()
.traverse(|color| try_parse_color(&color))?,
terminal_ansi_white: vscode_colors
.terminal_ansi_white
.as_ref()
.traverse(|color| try_parse_color(&color))?,
..Default::default()
})
}
fn convert_syntax_theme(&self) -> Result<UserSyntaxTheme> {
let mut highlight_styles = IndexMap::new();
for syntax_token in ZedSyntaxToken::iter() {
let multimatch_scopes = syntax_token.to_vscode();
let token_color = self.theme.token_colors.iter().find(|token_color| {
token_color
.scope
.as_ref()
.map(|scope| scope.multimatch(&multimatch_scopes))
.unwrap_or(false)
});
let Some(token_color) = token_color else {
continue;
};
let highlight_style = UserHighlightStyle {
color: token_color
.settings
.foreground
.as_ref()
.traverse(|color| try_parse_color(&color))?,
font_style: token_color
.settings
.font_style
.as_ref()
.and_then(|style| try_parse_font_style(&style)),
font_weight: token_color
.settings
.font_style
.as_ref()
.and_then(|style| try_parse_font_weight(&style)),
};
if highlight_style.is_empty() {
continue;
}
highlight_styles.insert(syntax_token.to_string(), highlight_style);
}
Ok(UserSyntaxTheme {
highlights: highlight_styles.into_iter().collect(),
})
// let mut highlight_styles = IndexMap::new();
// for token_color in self.theme.token_colors {
// highlight_styles.extend(token_color.highlight_styles()?);
// }
// let syntax_theme = UserSyntaxTheme {
// highlights: highlight_styles.into_iter().collect(),
// };
// pub fn highlight_styles(&self) -> Result<IndexMap<String, UserHighlightStyle>> {
// let mut highlight_styles = IndexMap::new();
// for syntax_token in ZedSyntaxToken::iter() {
// let scope = syntax_token.to_scope();
// // let token_color =
// }
// let scope = match self.scope {
// Some(VsCodeTokenScope::One(ref scope)) => vec![scope.clone()],
// Some(VsCodeTokenScope::Many(ref scopes)) => scopes.clone(),
// None => return Ok(IndexMap::new()),
// };
// for scope in &scope {
// let Some(syntax_token) = Self::to_zed_token(&scope) else {
// continue;
// };
// let highlight_style = UserHighlightStyle {
// color: self
// .settings
// .foreground
// .as_ref()
// .traverse(|color| try_parse_color(&color))?,
// font_style: self
// .settings
// .font_style
// .as_ref()
// .and_then(|style| try_parse_font_style(&style)),
// font_weight: self
// .settings
// .font_style
// .as_ref()
// .and_then(|style| try_parse_font_weight(&style)),
// };
// if highlight_style.is_empty() {
// continue;
// }
// highlight_styles.insert(syntax_token, highlight_style);
// }
// Ok(highlight_styles)
// }
}
}

View file

@ -0,0 +1,218 @@
use serde::Deserialize;
use strum::EnumIter;
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum VsCodeTokenScope {
One(String),
Many(Vec<String>),
}
impl VsCodeTokenScope {
pub fn multimatch(&self, matches: &[&'static str]) -> bool {
match self {
VsCodeTokenScope::One(scope) => matches.iter().any(|&s| s == scope),
VsCodeTokenScope::Many(scopes) => {
matches.iter().any(|s| scopes.contains(&s.to_string()))
}
}
}
}
#[derive(Debug, Deserialize)]
pub struct VsCodeTokenColor {
pub scope: Option<VsCodeTokenScope>,
pub settings: VsCodeTokenColorSettings,
}
#[derive(Debug, Deserialize)]
pub struct VsCodeTokenColorSettings {
pub foreground: Option<String>,
pub background: Option<String>,
#[serde(rename = "fontStyle")]
pub font_style: Option<String>,
}
#[derive(Debug, PartialEq, Copy, Clone, EnumIter)]
pub enum ZedSyntaxToken {
SyntaxAttribute,
SyntaxBoolean,
SyntaxComment,
SyntaxCommentDoc,
SyntaxConstant,
SyntaxConstructor,
SyntaxEmbedded,
SyntaxEmphasis,
SyntaxEmphasisStrong,
SyntaxEnum,
SyntaxFunction,
SyntaxHint,
SyntaxKeyword,
SyntaxLabel,
SyntaxLinkText,
SyntaxLinkUri,
SyntaxNumber,
SyntaxOperator,
SyntaxPredictive,
SyntaxPreproc,
SyntaxPrimary,
SyntaxProperty,
SyntaxPunctuation,
SyntaxPunctuationBracket,
SyntaxPunctuationDelimiter,
SyntaxPunctuationListMarker,
SyntaxPunctuationSpecial,
SyntaxString,
SyntaxStringEscape,
SyntaxStringRegex,
SyntaxStringSpecial,
SyntaxStringSpecialSymbol,
SyntaxTag,
SyntaxTextLiteral,
SyntaxTitle,
SyntaxType,
SyntaxVariable,
SyntaxVariableSpecial,
SyntaxVariant,
}
impl std::fmt::Display for ZedSyntaxToken {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use ZedSyntaxToken::*;
write!(
f,
"{}",
match self {
SyntaxAttribute => "attribute",
SyntaxBoolean => "boolean",
SyntaxComment => "comment",
SyntaxCommentDoc => "comment.doc",
SyntaxConstant => "constant",
SyntaxConstructor => "constructor",
SyntaxEmbedded => "embedded",
SyntaxEmphasis => "emphasis",
SyntaxEmphasisStrong => "emphasis.strong",
SyntaxEnum => "enum",
SyntaxFunction => "function",
SyntaxHint => "hint",
SyntaxKeyword => "keyword",
SyntaxLabel => "label",
SyntaxLinkText => "link_text",
SyntaxLinkUri => "link_uri",
SyntaxNumber => "number",
SyntaxOperator => "operator",
SyntaxPredictive => "predictive",
SyntaxPreproc => "preproc",
SyntaxPrimary => "primary",
SyntaxProperty => "property",
SyntaxPunctuation => "punctuation",
SyntaxPunctuationBracket => "punctuation.bracket",
SyntaxPunctuationDelimiter => "punctuation.delimiter",
SyntaxPunctuationListMarker => "punctuation.list_marker",
SyntaxPunctuationSpecial => "punctuation.special",
SyntaxString => "string",
SyntaxStringEscape => "string.escape",
SyntaxStringRegex => "string.regex",
SyntaxStringSpecial => "string.special",
SyntaxStringSpecialSymbol => "string.special.symbol",
SyntaxTag => "tag",
SyntaxTextLiteral => "text.literal",
SyntaxTitle => "title",
SyntaxType => "type",
SyntaxVariable => "variable",
SyntaxVariableSpecial => "variable.special",
SyntaxVariant => "variant",
}
)
}
}
impl ZedSyntaxToken {
pub fn to_vscode(&self) -> Vec<&'static str> {
use ZedSyntaxToken::*;
match self {
SyntaxAttribute => vec!["entity.other.attribute-name"],
SyntaxBoolean => vec!["constant.language"],
SyntaxComment => vec!["comment"],
SyntaxCommentDoc => vec!["comment.block.documentation"],
SyntaxConstant => vec!["constant.character"],
SyntaxConstructor => vec!["entity.name.function.definition.special.constructor"],
SyntaxEmbedded => vec!["meta.embedded"],
SyntaxEmphasis => vec!["markup.italic"],
SyntaxEmphasisStrong => vec![
"markup.bold",
"markup.italic markup.bold",
"markup.bold markup.italic",
],
SyntaxEnum => vec!["support.type.enum"],
SyntaxFunction => vec![
"entity.name.function",
"variable.function",
"support.function",
],
SyntaxKeyword => vec!["keyword"],
SyntaxLabel => vec![
"label",
"entity.name",
"entity.name.import",
"entity.name.package",
],
SyntaxLinkText => vec!["markup.underline.link", "string.other.link"],
SyntaxLinkUri => vec!["markup.underline.link", "string.other.link"],
SyntaxNumber => vec!["constant.numeric", "number"],
SyntaxOperator => vec!["operator", "keyword.operator"],
SyntaxPreproc => vec!["preproc"],
SyntaxProperty => vec![
"variable.member",
"support.type.property-name",
"variable.object.property",
"variable.other.field",
],
SyntaxPunctuation => vec![
"punctuation",
"punctuation.section",
"punctuation.accessor",
"punctuation.separator",
"punctuation.terminator",
"punctuation.definition.tag",
],
SyntaxPunctuationBracket => vec![
"punctuation.bracket",
"punctuation.definition.tag.begin",
"punctuation.definition.tag.end",
],
SyntaxPunctuationDelimiter => vec![
"punctuation.delimiter",
"punctuation.separator",
"punctuation.terminator",
],
SyntaxPunctuationListMarker => vec!["markup.list punctuation.definition.list.begin"],
SyntaxPunctuationSpecial => vec!["punctuation.special"],
SyntaxString => vec!["string"],
SyntaxStringEscape => vec!["string.escape", "constant.character", "constant.other"],
SyntaxStringRegex => vec!["string.regex"],
SyntaxStringSpecial => vec!["string.special", "constant.other.symbol"],
SyntaxStringSpecialSymbol => vec!["string.special.symbol", "constant.other.symbol"],
SyntaxTag => vec!["tag", "entity.name.tag", "meta.tag.sgml"],
SyntaxTextLiteral => vec!["text.literal", "string"],
SyntaxTitle => vec!["title", "entity.name"],
SyntaxType => vec!["entity.name.type", "support.type", "support.class"],
SyntaxVariable => vec![
"variable",
"variable.language",
"variable.member",
"variable.parameter.function-call",
],
SyntaxVariableSpecial => vec![
"variable.special",
"variable.member",
"variable.annotation",
"variable.language",
],
SyntaxVariant => vec!["variant"],
_ => vec![],
}
}
}

View file

@ -0,0 +1,412 @@
use serde::Deserialize;
use crate::vscode::VsCodeTokenColor;
#[derive(Deserialize, Debug)]
pub struct VsCodeTheme {
#[serde(rename = "$schema")]
pub schema: Option<String>,
pub name: Option<String>,
pub author: Option<String>,
pub maintainers: Option<Vec<String>>,
#[serde(rename = "semanticClass")]
pub semantic_class: Option<String>,
#[serde(rename = "semanticHighlighting")]
pub semantic_highlighting: Option<bool>,
pub colors: VsCodeColors,
#[serde(rename = "tokenColors")]
pub token_colors: Vec<VsCodeTokenColor>,
}
#[derive(Debug, Deserialize)]
pub struct VsCodeColors {
#[serde(rename = "terminal.background")]
pub terminal_background: Option<String>,
#[serde(rename = "terminal.foreground")]
pub terminal_foreground: Option<String>,
#[serde(rename = "terminal.ansiBrightBlack")]
pub terminal_ansi_bright_black: Option<String>,
#[serde(rename = "terminal.ansiBrightRed")]
pub terminal_ansi_bright_red: Option<String>,
#[serde(rename = "terminal.ansiBrightGreen")]
pub terminal_ansi_bright_green: Option<String>,
#[serde(rename = "terminal.ansiBrightYellow")]
pub terminal_ansi_bright_yellow: Option<String>,
#[serde(rename = "terminal.ansiBrightBlue")]
pub terminal_ansi_bright_blue: Option<String>,
#[serde(rename = "terminal.ansiBrightMagenta")]
pub terminal_ansi_bright_magenta: Option<String>,
#[serde(rename = "terminal.ansiBrightCyan")]
pub terminal_ansi_bright_cyan: Option<String>,
#[serde(rename = "terminal.ansiBrightWhite")]
pub terminal_ansi_bright_white: Option<String>,
#[serde(rename = "terminal.ansiBlack")]
pub terminal_ansi_black: Option<String>,
#[serde(rename = "terminal.ansiRed")]
pub terminal_ansi_red: Option<String>,
#[serde(rename = "terminal.ansiGreen")]
pub terminal_ansi_green: Option<String>,
#[serde(rename = "terminal.ansiYellow")]
pub terminal_ansi_yellow: Option<String>,
#[serde(rename = "terminal.ansiBlue")]
pub terminal_ansi_blue: Option<String>,
#[serde(rename = "terminal.ansiMagenta")]
pub terminal_ansi_magenta: Option<String>,
#[serde(rename = "terminal.ansiCyan")]
pub terminal_ansi_cyan: Option<String>,
#[serde(rename = "terminal.ansiWhite")]
pub terminal_ansi_white: Option<String>,
#[serde(rename = "focusBorder")]
pub focus_border: Option<String>,
pub foreground: Option<String>,
#[serde(rename = "selection.background")]
pub selection_background: Option<String>,
#[serde(rename = "errorForeground")]
pub error_foreground: Option<String>,
#[serde(rename = "button.background")]
pub button_background: Option<String>,
#[serde(rename = "button.foreground")]
pub button_foreground: Option<String>,
#[serde(rename = "button.secondaryBackground")]
pub button_secondary_background: Option<String>,
#[serde(rename = "button.secondaryForeground")]
pub button_secondary_foreground: Option<String>,
#[serde(rename = "button.secondaryHoverBackground")]
pub button_secondary_hover_background: Option<String>,
#[serde(rename = "dropdown.background")]
pub dropdown_background: Option<String>,
#[serde(rename = "dropdown.border")]
pub dropdown_border: Option<String>,
#[serde(rename = "dropdown.foreground")]
pub dropdown_foreground: Option<String>,
#[serde(rename = "input.background")]
pub input_background: Option<String>,
#[serde(rename = "input.foreground")]
pub input_foreground: Option<String>,
#[serde(rename = "input.border")]
pub input_border: Option<String>,
#[serde(rename = "input.placeholderForeground")]
pub input_placeholder_foreground: Option<String>,
#[serde(rename = "inputOption.activeBorder")]
pub input_option_active_border: Option<String>,
#[serde(rename = "inputValidation.infoBorder")]
pub input_validation_info_border: Option<String>,
#[serde(rename = "inputValidation.warningBorder")]
pub input_validation_warning_border: Option<String>,
#[serde(rename = "inputValidation.errorBorder")]
pub input_validation_error_border: Option<String>,
#[serde(rename = "badge.foreground")]
pub badge_foreground: Option<String>,
#[serde(rename = "badge.background")]
pub badge_background: Option<String>,
#[serde(rename = "progressBar.background")]
pub progress_bar_background: Option<String>,
#[serde(rename = "list.activeSelectionBackground")]
pub list_active_selection_background: Option<String>,
#[serde(rename = "list.activeSelectionForeground")]
pub list_active_selection_foreground: Option<String>,
#[serde(rename = "list.dropBackground")]
pub list_drop_background: Option<String>,
#[serde(rename = "list.focusBackground")]
pub list_focus_background: Option<String>,
#[serde(rename = "list.highlightForeground")]
pub list_highlight_foreground: Option<String>,
#[serde(rename = "list.hoverBackground")]
pub list_hover_background: Option<String>,
#[serde(rename = "list.inactiveSelectionBackground")]
pub list_inactive_selection_background: Option<String>,
#[serde(rename = "list.warningForeground")]
pub list_warning_foreground: Option<String>,
#[serde(rename = "list.errorForeground")]
pub list_error_foreground: Option<String>,
#[serde(rename = "activityBar.background")]
pub activity_bar_background: Option<String>,
#[serde(rename = "activityBar.inactiveForeground")]
pub activity_bar_inactive_foreground: Option<String>,
#[serde(rename = "activityBar.foreground")]
pub activity_bar_foreground: Option<String>,
#[serde(rename = "activityBar.activeBorder")]
pub activity_bar_active_border: Option<String>,
#[serde(rename = "activityBar.activeBackground")]
pub activity_bar_active_background: Option<String>,
#[serde(rename = "activityBarBadge.background")]
pub activity_bar_badge_background: Option<String>,
#[serde(rename = "activityBarBadge.foreground")]
pub activity_bar_badge_foreground: Option<String>,
#[serde(rename = "sideBar.background")]
pub side_bar_background: Option<String>,
#[serde(rename = "sideBarTitle.foreground")]
pub side_bar_title_foreground: Option<String>,
#[serde(rename = "sideBarSectionHeader.background")]
pub side_bar_section_header_background: Option<String>,
#[serde(rename = "sideBarSectionHeader.border")]
pub side_bar_section_header_border: Option<String>,
#[serde(rename = "editorGroup.border")]
pub editor_group_border: Option<String>,
#[serde(rename = "editorGroup.dropBackground")]
pub editor_group_drop_background: Option<String>,
#[serde(rename = "editorGroupHeader.tabsBackground")]
pub editor_group_header_tabs_background: Option<String>,
#[serde(rename = "tab.activeBackground")]
pub tab_active_background: Option<String>,
#[serde(rename = "tab.activeForeground")]
pub tab_active_foreground: Option<String>,
#[serde(rename = "tab.border")]
pub tab_border: Option<String>,
#[serde(rename = "tab.activeBorderTop")]
pub tab_active_border_top: Option<String>,
#[serde(rename = "tab.inactiveBackground")]
pub tab_inactive_background: Option<String>,
#[serde(rename = "tab.inactiveForeground")]
pub tab_inactive_foreground: Option<String>,
#[serde(rename = "editor.foreground")]
pub editor_foreground: Option<String>,
#[serde(rename = "editor.background")]
pub editor_background: Option<String>,
#[serde(rename = "editorLineNumber.foreground")]
pub editor_line_number_foreground: Option<String>,
#[serde(rename = "editor.selectionBackground")]
pub editor_selection_background: Option<String>,
#[serde(rename = "editor.selectionHighlightBackground")]
pub editor_selection_highlight_background: Option<String>,
#[serde(rename = "editor.foldBackground")]
pub editor_fold_background: Option<String>,
#[serde(rename = "editor.wordHighlightBackground")]
pub editor_word_highlight_background: Option<String>,
#[serde(rename = "editor.wordHighlightStrongBackground")]
pub editor_word_highlight_strong_background: Option<String>,
#[serde(rename = "editor.findMatchBackground")]
pub editor_find_match_background: Option<String>,
#[serde(rename = "editor.findMatchHighlightBackground")]
pub editor_find_match_highlight_background: Option<String>,
#[serde(rename = "editor.findRangeHighlightBackground")]
pub editor_find_range_highlight_background: Option<String>,
#[serde(rename = "editor.hoverHighlightBackground")]
pub editor_hover_highlight_background: Option<String>,
#[serde(rename = "editor.lineHighlightBorder")]
pub editor_line_highlight_border: Option<String>,
#[serde(rename = "editorLink.activeForeground")]
pub editor_link_active_foreground: Option<String>,
#[serde(rename = "editor.rangeHighlightBackground")]
pub editor_range_highlight_background: Option<String>,
#[serde(rename = "editor.snippetTabstopHighlightBackground")]
pub editor_snippet_tabstop_highlight_background: Option<String>,
#[serde(rename = "editor.snippetTabstopHighlightBorder")]
pub editor_snippet_tabstop_highlight_border: Option<String>,
#[serde(rename = "editor.snippetFinalTabstopHighlightBackground")]
pub editor_snippet_final_tabstop_highlight_background: Option<String>,
#[serde(rename = "editor.snippetFinalTabstopHighlightBorder")]
pub editor_snippet_final_tabstop_highlight_border: Option<String>,
#[serde(rename = "editorWhitespace.foreground")]
pub editor_whitespace_foreground: Option<String>,
#[serde(rename = "editorIndentGuide.background")]
pub editor_indent_guide_background: Option<String>,
#[serde(rename = "editorIndentGuide.activeBackground")]
pub editor_indent_guide_active_background: Option<String>,
#[serde(rename = "editorRuler.foreground")]
pub editor_ruler_foreground: Option<String>,
#[serde(rename = "editorCodeLens.foreground")]
pub editor_code_lens_foreground: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground1")]
pub editor_bracket_highlight_foreground1: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground2")]
pub editor_bracket_highlight_foreground2: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground3")]
pub editor_bracket_highlight_foreground3: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground4")]
pub editor_bracket_highlight_foreground4: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground5")]
pub editor_bracket_highlight_foreground5: Option<String>,
#[serde(rename = "editorBracketHighlight.foreground6")]
pub editor_bracket_highlight_foreground6: Option<String>,
#[serde(rename = "editorBracketHighlight.unexpectedBracket.foreground")]
pub editor_bracket_highlight_unexpected_bracket_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.border")]
pub editor_overview_ruler_border: Option<String>,
#[serde(rename = "editorOverviewRuler.selectionHighlightForeground")]
pub editor_overview_ruler_selection_highlight_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.wordHighlightForeground")]
pub editor_overview_ruler_word_highlight_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.wordHighlightStrongForeground")]
pub editor_overview_ruler_word_highlight_strong_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.modifiedForeground")]
pub editor_overview_ruler_modified_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.addedForeground")]
pub editor_overview_ruler_added_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.deletedForeground")]
pub editor_overview_ruler_deleted_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.errorForeground")]
pub editor_overview_ruler_error_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.warningForeground")]
pub editor_overview_ruler_warning_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.infoForeground")]
pub editor_overview_ruler_info_foreground: Option<String>,
#[serde(rename = "editorError.foreground")]
pub editor_error_foreground: Option<String>,
#[serde(rename = "editorWarning.foreground")]
pub editor_warning_foreground: Option<String>,
#[serde(rename = "editorGutter.modifiedBackground")]
pub editor_gutter_modified_background: Option<String>,
#[serde(rename = "editorGutter.addedBackground")]
pub editor_gutter_added_background: Option<String>,
#[serde(rename = "editorGutter.deletedBackground")]
pub editor_gutter_deleted_background: Option<String>,
#[serde(rename = "gitDecoration.modifiedResourceForeground")]
pub git_decoration_modified_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.deletedResourceForeground")]
pub git_decoration_deleted_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.untrackedResourceForeground")]
pub git_decoration_untracked_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.ignoredResourceForeground")]
pub git_decoration_ignored_resource_foreground: Option<String>,
#[serde(rename = "gitDecoration.conflictingResourceForeground")]
pub git_decoration_conflicting_resource_foreground: Option<String>,
#[serde(rename = "diffEditor.insertedTextBackground")]
pub diff_editor_inserted_text_background: Option<String>,
#[serde(rename = "diffEditor.removedTextBackground")]
pub diff_editor_removed_text_background: Option<String>,
#[serde(rename = "inlineChat.regionHighlight")]
pub inline_chat_region_highlight: Option<String>,
#[serde(rename = "editorWidget.background")]
pub editor_widget_background: Option<String>,
#[serde(rename = "editorSuggestWidget.background")]
pub editor_suggest_widget_background: Option<String>,
#[serde(rename = "editorSuggestWidget.foreground")]
pub editor_suggest_widget_foreground: Option<String>,
#[serde(rename = "editorSuggestWidget.selectedBackground")]
pub editor_suggest_widget_selected_background: Option<String>,
#[serde(rename = "editorHoverWidget.background")]
pub editor_hover_widget_background: Option<String>,
#[serde(rename = "editorHoverWidget.border")]
pub editor_hover_widget_border: Option<String>,
#[serde(rename = "editorMarkerNavigation.background")]
pub editor_marker_navigation_background: Option<String>,
#[serde(rename = "peekView.border")]
pub peek_view_border: Option<String>,
#[serde(rename = "peekViewEditor.background")]
pub peek_view_editor_background: Option<String>,
#[serde(rename = "peekViewEditor.matchHighlightBackground")]
pub peek_view_editor_match_highlight_background: Option<String>,
#[serde(rename = "peekViewResult.background")]
pub peek_view_result_background: Option<String>,
#[serde(rename = "peekViewResult.fileForeground")]
pub peek_view_result_file_foreground: Option<String>,
#[serde(rename = "peekViewResult.lineForeground")]
pub peek_view_result_line_foreground: Option<String>,
#[serde(rename = "peekViewResult.matchHighlightBackground")]
pub peek_view_result_match_highlight_background: Option<String>,
#[serde(rename = "peekViewResult.selectionBackground")]
pub peek_view_result_selection_background: Option<String>,
#[serde(rename = "peekViewResult.selectionForeground")]
pub peek_view_result_selection_foreground: Option<String>,
#[serde(rename = "peekViewTitle.background")]
pub peek_view_title_background: Option<String>,
#[serde(rename = "peekViewTitleDescription.foreground")]
pub peek_view_title_description_foreground: Option<String>,
#[serde(rename = "peekViewTitleLabel.foreground")]
pub peek_view_title_label_foreground: Option<String>,
#[serde(rename = "merge.currentHeaderBackground")]
pub merge_current_header_background: Option<String>,
#[serde(rename = "merge.incomingHeaderBackground")]
pub merge_incoming_header_background: Option<String>,
#[serde(rename = "editorOverviewRuler.currentContentForeground")]
pub editor_overview_ruler_current_content_foreground: Option<String>,
#[serde(rename = "editorOverviewRuler.incomingContentForeground")]
pub editor_overview_ruler_incoming_content_foreground: Option<String>,
#[serde(rename = "panel.background")]
pub panel_background: Option<String>,
#[serde(rename = "panel.border")]
pub panel_border: Option<String>,
#[serde(rename = "panelTitle.activeBorder")]
pub panel_title_active_border: Option<String>,
#[serde(rename = "panelTitle.activeForeground")]
pub panel_title_active_foreground: Option<String>,
#[serde(rename = "panelTitle.inactiveForeground")]
pub panel_title_inactive_foreground: Option<String>,
#[serde(rename = "statusBar.background")]
pub status_bar_background: Option<String>,
#[serde(rename = "statusBar.foreground")]
pub status_bar_foreground: Option<String>,
#[serde(rename = "statusBar.debuggingBackground")]
pub status_bar_debugging_background: Option<String>,
#[serde(rename = "statusBar.debuggingForeground")]
pub status_bar_debugging_foreground: Option<String>,
#[serde(rename = "statusBar.noFolderBackground")]
pub status_bar_no_folder_background: Option<String>,
#[serde(rename = "statusBar.noFolderForeground")]
pub status_bar_no_folder_foreground: Option<String>,
#[serde(rename = "statusBarItem.prominentBackground")]
pub status_bar_item_prominent_background: Option<String>,
#[serde(rename = "statusBarItem.prominentHoverBackground")]
pub status_bar_item_prominent_hover_background: Option<String>,
#[serde(rename = "statusBarItem.remoteForeground")]
pub status_bar_item_remote_foreground: Option<String>,
#[serde(rename = "statusBarItem.remoteBackground")]
pub status_bar_item_remote_background: Option<String>,
#[serde(rename = "titleBar.activeBackground")]
pub title_bar_active_background: Option<String>,
#[serde(rename = "titleBar.activeForeground")]
pub title_bar_active_foreground: Option<String>,
#[serde(rename = "titleBar.inactiveBackground")]
pub title_bar_inactive_background: Option<String>,
#[serde(rename = "titleBar.inactiveForeground")]
pub title_bar_inactive_foreground: Option<String>,
#[serde(rename = "extensionButton.prominentForeground")]
pub extension_button_prominent_foreground: Option<String>,
#[serde(rename = "extensionButton.prominentBackground")]
pub extension_button_prominent_background: Option<String>,
#[serde(rename = "extensionButton.prominentHoverBackground")]
pub extension_button_prominent_hover_background: Option<String>,
#[serde(rename = "pickerGroup.border")]
pub picker_group_border: Option<String>,
#[serde(rename = "pickerGroup.foreground")]
pub picker_group_foreground: Option<String>,
#[serde(rename = "debugToolBar.background")]
pub debug_tool_bar_background: Option<String>,
#[serde(rename = "walkThrough.embeddedEditorBackground")]
pub walk_through_embedded_editor_background: Option<String>,
#[serde(rename = "settings.headerForeground")]
pub settings_header_foreground: Option<String>,
#[serde(rename = "settings.modifiedItemIndicator")]
pub settings_modified_item_indicator: Option<String>,
#[serde(rename = "settings.dropdownBackground")]
pub settings_dropdown_background: Option<String>,
#[serde(rename = "settings.dropdownForeground")]
pub settings_dropdown_foreground: Option<String>,
#[serde(rename = "settings.dropdownBorder")]
pub settings_dropdown_border: Option<String>,
#[serde(rename = "settings.checkboxBackground")]
pub settings_checkbox_background: Option<String>,
#[serde(rename = "settings.checkboxForeground")]
pub settings_checkbox_foreground: Option<String>,
#[serde(rename = "settings.checkboxBorder")]
pub settings_checkbox_border: Option<String>,
#[serde(rename = "settings.textInputBackground")]
pub settings_text_input_background: Option<String>,
#[serde(rename = "settings.textInputForeground")]
pub settings_text_input_foreground: Option<String>,
#[serde(rename = "settings.textInputBorder")]
pub settings_text_input_border: Option<String>,
#[serde(rename = "settings.numberInputBackground")]
pub settings_number_input_background: Option<String>,
#[serde(rename = "settings.numberInputForeground")]
pub settings_number_input_foreground: Option<String>,
#[serde(rename = "settings.numberInputBorder")]
pub settings_number_input_border: Option<String>,
#[serde(rename = "breadcrumb.foreground")]
pub breadcrumb_foreground: Option<String>,
#[serde(rename = "breadcrumb.background")]
pub breadcrumb_background: Option<String>,
#[serde(rename = "breadcrumb.focusForeground")]
pub breadcrumb_focus_foreground: Option<String>,
#[serde(rename = "breadcrumb.activeSelectionForeground")]
pub breadcrumb_active_selection_foreground: Option<String>,
#[serde(rename = "breadcrumbPicker.background")]
pub breadcrumb_picker_background: Option<String>,
#[serde(rename = "listFilterWidget.background")]
pub list_filter_widget_background: Option<String>,
#[serde(rename = "listFilterWidget.outline")]
pub list_filter_widget_outline: Option<String>,
#[serde(rename = "listFilterWidget.noMatchesOutline")]
pub list_filter_widget_no_matches_outline: Option<String>,
}

View file

@ -1,4 +1,4 @@
use gpui::{div, px, Div, ParentElement, Render, SharedString, Styled, ViewContext}; use gpui::{div, Div, ParentElement, Render, SharedString, Styled, ViewContext};
use theme2::ActiveTheme; use theme2::ActiveTheme;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -19,7 +19,7 @@ impl Render for TextTooltip {
let theme = cx.theme(); let theme = cx.theme();
div() div()
.bg(theme.colors().background) .bg(theme.colors().background)
.rounded(px(8.)) .rounded_lg()
.border() .border()
.font("Zed Sans") .font("Zed Sans")
.border_color(theme.colors().border) .border_color(theme.colors().border)

View file

@ -8,6 +8,11 @@
[ [
(jsx_element) (jsx_element)
(jsx_fragment) (jsx_fragment)
] @element
[
(jsx_opening_element)
(jsx_closing_element)
(jsx_self_closing_element) (jsx_self_closing_element)
(jsx_expression) (jsx_expression)
] @element ] @default

View file

@ -8,6 +8,11 @@
[ [
(jsx_element) (jsx_element)
(jsx_fragment) (jsx_fragment)
] @element
[
(jsx_opening_element)
(jsx_closing_element)
(jsx_self_closing_element) (jsx_self_closing_element)
(jsx_expression) (jsx_expression)
] @element ] @default

View file

@ -2,6 +2,7 @@ use anyhow::{anyhow, Result};
use async_compression::futures::bufread::GzipDecoder; use async_compression::futures::bufread::GzipDecoder;
use async_tar::Archive; use async_tar::Archive;
use async_trait::async_trait; use async_trait::async_trait;
use collections::HashMap;
use futures::{future::BoxFuture, FutureExt}; use futures::{future::BoxFuture, FutureExt};
use gpui::AppContext; use gpui::AppContext;
use language::{LanguageServerName, LspAdapter, LspAdapterDelegate}; use language::{LanguageServerName, LspAdapter, LspAdapterDelegate};
@ -20,12 +21,7 @@ use util::{fs::remove_matching, github::latest_github_release};
use util::{github::GitHubLspBinaryVersion, ResultExt}; use util::{github::GitHubLspBinaryVersion, ResultExt};
fn typescript_server_binary_arguments(server_path: &Path) -> Vec<OsString> { fn typescript_server_binary_arguments(server_path: &Path) -> Vec<OsString> {
vec![ vec![server_path.into(), "--stdio".into()]
server_path.into(),
"--stdio".into(),
"--tsserver-path".into(),
"node_modules/typescript/lib".into(),
]
} }
fn eslint_server_binary_arguments(server_path: &Path) -> Vec<OsString> { fn eslint_server_binary_arguments(server_path: &Path) -> Vec<OsString> {
@ -158,9 +154,20 @@ impl LspAdapter for TypeScriptLspAdapter {
async fn initialization_options(&self) -> Option<serde_json::Value> { async fn initialization_options(&self) -> Option<serde_json::Value> {
Some(json!({ Some(json!({
"provideFormatter": true "provideFormatter": true,
"tsserver": {
"path": "node_modules/typescript/lib",
},
})) }))
} }
async fn language_ids(&self) -> HashMap<String, String> {
HashMap::from_iter([
("TypeScript".into(), "typescript".into()),
("JavaScript".into(), "javascript".into()),
("TSX".into(), "typescriptreact".into()),
])
}
} }
async fn get_cached_ts_server_binary( async fn get_cached_ts_server_binary(

View file

@ -8,6 +8,11 @@
[ [
(jsx_element) (jsx_element)
(jsx_fragment) (jsx_fragment)
] @element
[
(jsx_opening_element)
(jsx_closing_element)
(jsx_self_closing_element) (jsx_self_closing_element)
(jsx_expression) (jsx_expression)
] @element ] @default

View file

@ -8,6 +8,11 @@
[ [
(jsx_element) (jsx_element)
(jsx_fragment) (jsx_fragment)
] @element
[
(jsx_opening_element)
(jsx_closing_element)
(jsx_self_closing_element) (jsx_self_closing_element)
(jsx_expression) (jsx_expression)
] @element ] @default

View file

@ -2,6 +2,7 @@ use anyhow::{anyhow, Result};
use async_compression::futures::bufread::GzipDecoder; use async_compression::futures::bufread::GzipDecoder;
use async_tar::Archive; use async_tar::Archive;
use async_trait::async_trait; use async_trait::async_trait;
use collections::HashMap;
use futures::{future::BoxFuture, FutureExt}; use futures::{future::BoxFuture, FutureExt};
use gpui::AppContext; use gpui::AppContext;
use language::{LanguageServerName, LspAdapter, LspAdapterDelegate}; use language::{LanguageServerName, LspAdapter, LspAdapterDelegate};
@ -20,12 +21,7 @@ use util::{fs::remove_matching, github::latest_github_release};
use util::{github::GitHubLspBinaryVersion, ResultExt}; use util::{github::GitHubLspBinaryVersion, ResultExt};
fn typescript_server_binary_arguments(server_path: &Path) -> Vec<OsString> { fn typescript_server_binary_arguments(server_path: &Path) -> Vec<OsString> {
vec![ vec![server_path.into(), "--stdio".into()]
server_path.into(),
"--stdio".into(),
"--tsserver-path".into(),
"node_modules/typescript/lib".into(),
]
} }
fn eslint_server_binary_arguments(server_path: &Path) -> Vec<OsString> { fn eslint_server_binary_arguments(server_path: &Path) -> Vec<OsString> {
@ -158,9 +154,20 @@ impl LspAdapter for TypeScriptLspAdapter {
async fn initialization_options(&self) -> Option<serde_json::Value> { async fn initialization_options(&self) -> Option<serde_json::Value> {
Some(json!({ Some(json!({
"provideFormatter": true "provideFormatter": true,
"tsserver": {
"path": "node_modules/typescript/lib",
},
})) }))
} }
async fn language_ids(&self) -> HashMap<String, String> {
HashMap::from_iter([
("TypeScript".into(), "typescript".into()),
("JavaScript".into(), "javascript".into()),
("TSX".into(), "typescriptreact".into()),
])
}
} }
async fn get_cached_ts_server_binary( async fn get_cached_ts_server_binary(

View file

@ -40,7 +40,7 @@ Customer Data consisting of non-personally-identifiable information that helps Z
##### 3.3.1.2. Crash Reports ##### 3.3.1.2. Crash Reports
Customer Data consisting of data related to the behavior of the Solution prior to a crash or failure, such as stack traces are collected and classified as " Crash Reports". Zed will use commercially reasonable efforts to exclude any personally identifiable information from Crash Reports, but due to the nature of a crash, Zed does not ensure that information such as paths will be excluded from Crash Reports. Crash Reports will be used solely for Zed's internal purposes in connection with diagnosing defects in the Solution that led to the crash. You may grant us permission to capture Crash Reports when installing or activating the Solution, and You may change Your preferences at any time in the settings feature of the Solution. Once You grant us this permission, Zed will retain the Crash Reports indefinitely. Customer Data consisting of data related to the behavior of the Solution prior to a crash or failure, such as stack traces are collected and classified as "Crash Reports". Zed will use commercially reasonable efforts to exclude any personally identifiable information from Crash Reports, but due to the nature of a crash, Zed does not ensure that information such as paths will be excluded from Crash Reports. Crash Reports will be used solely for Zed's internal purposes in connection with diagnosing defects in the Solution that led to the crash. You may grant us permission to capture Crash Reports when installing or activating the Solution, and You may change Your preferences at any time in the settings feature of the Solution. Once You grant us this permission, Zed will retain the Crash Reports indefinitely.
##### 3.3.1.3. User Content ##### 3.3.1.3. User Content

View file

@ -69,7 +69,7 @@
\f0\b\fs20 \cf2 3.3.1.2. Crash Reports\ \f0\b\fs20 \cf2 3.3.1.2. Crash Reports\
\pard\pardeftab720\sa240\partightenfactor0 \pard\pardeftab720\sa240\partightenfactor0
\f1\b0\fs24 \cf2 Customer Data consisting of data related to the behavior of the Solution prior to a crash or failure, such as stack traces are collected and classified as " Crash Reports". Zed will use commercially reasonable efforts to exclude any personally identifiable information from Crash Reports, but due to the nature of a crash, Zed does not ensure that information such as paths will be excluded from Crash Reports. Crash Reports will be used solely for Zed's internal purposes in connection with diagnosing defects in the Solution that led to the crash. You may grant us permission to capture Crash Reports when installing or activating the Solution, and You may change Your preferences at any time in the settings feature of the Solution. Once You grant us this permission, Zed will retain the Crash Reports indefinitely.\ \f1\b0\fs24 \cf2 Customer Data consisting of data related to the behavior of the Solution prior to a crash or failure, such as stack traces are collected and classified as "Crash Reports". Zed will use commercially reasonable efforts to exclude any personally identifiable information from Crash Reports, but due to the nature of a crash, Zed does not ensure that information such as paths will be excluded from Crash Reports. Crash Reports will be used solely for Zed's internal purposes in connection with diagnosing defects in the Solution that led to the crash. You may grant us permission to capture Crash Reports when installing or activating the Solution, and You may change Your preferences at any time in the settings feature of the Solution. Once You grant us this permission, Zed will retain the Crash Reports indefinitely.\
\pard\pardeftab720\sa332\partightenfactor0 \pard\pardeftab720\sa332\partightenfactor0
\f0\b\fs20 \cf2 3.3.1.3. User Content\ \f0\b\fs20 \cf2 3.3.1.3. User Content\