Compare commits

...

16 Commits

Author SHA1 Message Date
Kirill Bulatov
477a2a4f1b zed 0.111.3 2023-11-05 16:19:59 +02:00
Kirill Bulatov
e986a93535 More heuristics for diagnostics updates (#3236)
Follow-up of https://github.com/zed-industries/zed/pull/3225
That PR enabled every `project::Event::DiskBasedDiagnosticsFinished` to
update the diagnostics, which turned out to be bad, Zed does query for
more diagnostics after every excerpt update, and that seems to be due to
`Event::Edited` emitted by the multibuffers created in the diagnostics
panel.

* now, instead of eagerly updating the diagnostics every time, only do
that if the panel has 0 or 1 caret placed and no changes were made in
the panel yet.
Otherwise, use previous approach and register the updated paths to defer
their update later.

* on every `update_excerpts` in the diagnostics panel, query the entire
diagnostics summary (and store it for the future comparisons), compare
old and new summaries and re-query diagnostics for every path that's not
in both summaries.
Also, query every path that was registered during the
`DiskBasedDiagnosticsFinished` updates that were not eagerly updated
before.

This way we're supposed to get all new diagnostics (for new paths added)
and re-check all old paths that might have stale diagnostics now.

* do diagnostics rechecks concurrently for every path now, speeding the
overall process

Release Notes:

- Fixed diagnostics triggering too eagerly during multicaret edits and
certain stale diagnostics not being removed in time
2023-11-05 16:19:07 +02:00
Kirill Bulatov
acb90ba336 zed 0.111.2 2023-11-03 22:20:46 +02:00
Kirill Bulatov
6780e80bf7 Refresh diagnostics inside the tab (#3225)
r-a now has 2 different types of diagnostics: 
* "disk-based" ones that come from `cargo check` and related, that emit
`project::Event::DiskBasedDiagnosticsStarted` and
`DiskBasedDiagnosticsFinished`
* "flycheck" diagnostics from r-a itself, that it tries to dynamically
apply to every buffer open, that come with `DiagnosticsUpdated` event.

Latter diagnostics update frequently, on every file close and open, but
`diagnostics.rs` logic had never polled for new diagnostics after
registering the `DiagnosticsUpdated` event, so the only way we could
have newer diagnostics was to re-open the whole panel.
The PR fixes that, and also adds more debug logging to the module.
The logic of the fix looks very familiar to previous related fix:
https://github.com/zed-industries/zed/pull/3128

One notable thing after the fix: "flycheck" diagnostics stay forever if
the diagnostics panel is opened: excerpts in that panel do not allow the
buffer to get dropped (hence, closed in terms of r-a) and get the
updated, zero diagnostics.
If the diagnostics panel is opened and closed multiple times, those
errors gradually disappear.

Release Notes:

- Fixed diagnostics panel not refreshing its contents properly
2023-11-03 22:15:53 +02:00
Kirill Bulatov
7e17603059 Detect prettier in npm workspaces correctly (#3219)
Deals with https://github.com/zed-industries/community/issues/2016

Also refactored project code to spawn less default prettiers.

Release Notes:

- Fixed prettier not working in npm workspaces
2023-11-03 22:15:49 +02:00
Joseph T. Lyons
d2c0c4eac4 zed 0.111.1 2023-11-02 10:50:20 -04:00
Kyle Caverly
80469283ee authenticate with completion provider on new inline assists (#3209)
authenticate with completion provider on new inline assists

Release Notes:

- Fixed bug which lead the inline assist functionality to never
authenticate
2023-11-02 10:40:10 -04:00
Joseph T. Lyons
463901820c v0.111.x preview 2023-11-01 12:34:08 -04:00
Julia
b7625d81e8 Port multi_buffer to gpui2 (#3193)
Release Notes:

- N/A
2023-11-01 11:45:44 -04:00
Marshall Bowers
bbe53895ef Return ColorScaleSets from individual color scale functions (#3197)
This PR adjusts the individual color scale functions to return
`ColorScaleSet`s instead of `DefaultColorScaleSet`s.

We only use the `DefaultColorScaleSet`s to simplify the construction of
the scales, so it isn't necessary to surface them outside of the
function.

Release Notes:

-  N/A
2023-11-01 10:45:42 -04:00
Kyle Caverly
1b9619ca7f added parsing support for <|S| |E|> spans (#3184)
added parsing support for <|S| and |E|> spans for inline generation
2023-11-01 10:26:01 -04:00
Marshall Bowers
272f856460 Use Refineable for ThemeStyles (#3196)
This PR updates the `ThemeStyles` struct to use the `Refineable` trait
instead of a custom declarative macro for generating refinements.

Release Notes:

- N/A
2023-10-31 23:33:51 -04:00
Marshall Bowers
36a73d657a Remove old Theme definition (#3195)
This PR removes the old `Theme` definition in favor of the new
`ThemeVariant`s.

The new `SyntaxStyles` have been reverted to the old `SyntaxTheme` that
operates by storing the syntax styles as a vector of
`gpui2::HighlightStyle`s.

This is necessary for the intended usage by `language2`, where we find
the longest key in the theme's syntax styles that matches the capture
name:

18431051d9/crates/language2/src/highlight_map.rs (L15-L41)
2023-10-31 23:05:50 -04:00
Marshall Bowers
18431051d9 Rework theme2 with new theme structure (#3194)
This PR reworks the theme definition in the `theme2` crate to be based
off of the new theme work that @iamnbutler has been working on.

We're still developing the new theme system, but it is complete enough
that we can now load the default theme and use it to theme the storybook
(albeit with some further refining of the color palette required).

---------

Co-authored-by: Nate Butler <iamnbutler@gmail.com>
Co-authored-by: Marshall Bowers <marshall@zed.dev>
2023-10-31 22:23:00 -04:00
Julia
795369a1e3 Port multi_buffer to gpui2 2023-10-31 18:34:36 -04:00
KCaverly
08e9b2e848 added parsing support for <|S| |E|> spans 2023-10-30 13:32:47 -04:00
126 changed files with 8970 additions and 7634 deletions

69
Cargo.lock generated
View File

@@ -2424,8 +2424,10 @@ dependencies = [
"client",
"collections",
"editor",
"futures 0.3.28",
"gpui",
"language",
"log",
"lsp",
"postage",
"project",
@@ -5035,6 +5037,53 @@ dependencies = [
"workspace",
]
[[package]]
name = "multi_buffer2"
version = "0.1.0"
dependencies = [
"aho-corasick",
"anyhow",
"client2",
"clock",
"collections",
"convert_case 0.6.0",
"copilot2",
"ctor",
"env_logger 0.9.3",
"futures 0.3.28",
"git",
"gpui2",
"indoc",
"itertools 0.10.5",
"language2",
"lazy_static",
"log",
"lsp2",
"ordered-float 2.10.0",
"parking_lot 0.11.2",
"postage",
"project2",
"pulldown-cmark",
"rand 0.8.5",
"rich_text",
"schemars",
"serde",
"serde_derive",
"settings2",
"smallvec",
"smol",
"snippet",
"sum_tree",
"text",
"theme2",
"tree-sitter",
"tree-sitter-html",
"tree-sitter-rust",
"tree-sitter-typescript",
"unindent",
"util",
]
[[package]]
name = "multimap"
version = "0.8.3"
@@ -7463,7 +7512,6 @@ dependencies = [
"collections",
"editor",
"futures 0.3.28",
"globset",
"gpui",
"language",
"log",
@@ -8759,6 +8807,7 @@ dependencies = [
"gpui2",
"indexmap 1.9.3",
"parking_lot 0.11.2",
"refineable",
"schemars",
"serde",
"serde_derive",
@@ -8768,21 +8817,6 @@ dependencies = [
"util",
]
[[package]]
name = "theme_converter"
version = "0.1.0"
dependencies = [
"anyhow",
"clap 4.4.4",
"convert_case 0.6.0",
"gpui2",
"log",
"rust-embed",
"serde",
"simplelog",
"theme2",
]
[[package]]
name = "theme_selector"
version = "0.1.0"
@@ -9761,6 +9795,7 @@ dependencies = [
"dirs 3.0.2",
"futures 0.3.28",
"git2",
"globset",
"isahc",
"lazy_static",
"log",
@@ -10788,7 +10823,7 @@ dependencies = [
[[package]]
name = "zed"
version = "0.111.0"
version = "0.111.3"
dependencies = [
"activity_indicator",
"ai",

View File

@@ -61,6 +61,7 @@ members = [
"crates/menu",
"crates/menu2",
"crates/multi_buffer",
"crates/multi_buffer2",
"crates/node_runtime",
"crates/notifications",
"crates/outline",
@@ -92,7 +93,6 @@ members = [
"crates/text",
"crates/theme",
"crates/theme2",
"crates/theme_converter",
"crates/theme_selector",
"crates/ui2",
"crates/util",

View File

@@ -153,10 +153,17 @@ impl FakeCompletionProvider {
pub fn send_completion(&self, completion: impl Into<String>) {
let mut tx = self.last_completion_tx.lock();
tx.as_mut().unwrap().try_send(completion.into()).unwrap();
println!("COMPLETION TX: {:?}", &tx);
let a = tx.as_mut().unwrap();
a.try_send(completion.into()).unwrap();
// tx.as_mut().unwrap().try_send(completion.into()).unwrap();
}
pub fn finish_completion(&self) {
println!("FINISHING COMPLETION");
self.last_completion_tx.lock().take().unwrap();
}
}
@@ -181,8 +188,10 @@ impl CompletionProvider for FakeCompletionProvider {
&self,
_prompt: Box<dyn CompletionRequest>,
) -> BoxFuture<'static, anyhow::Result<BoxStream<'static, anyhow::Result<String>>>> {
println!("COMPLETING");
let (tx, rx) = mpsc::channel(1);
*self.last_completion_tx.lock() = Some(tx);
println!("TX: {:?}", *self.last_completion_tx.lock());
async move { Ok(rx.map(|rx| Ok(rx)).boxed()) }.boxed()
}
fn box_clone(&self) -> Box<dyn CompletionProvider> {

View File

@@ -142,7 +142,7 @@ pub struct AssistantPanel {
zoomed: bool,
has_focus: bool,
toolbar: ViewHandle<Toolbar>,
completion_provider: Box<dyn CompletionProvider>,
completion_provider: Arc<dyn CompletionProvider>,
api_key_editor: Option<ViewHandle<Editor>>,
languages: Arc<LanguageRegistry>,
fs: Arc<dyn Fs>,
@@ -204,7 +204,7 @@ impl AssistantPanel {
let semantic_index = SemanticIndex::global(cx);
// Defaulting currently to GPT4, allow for this to be set via config.
let completion_provider = Box::new(OpenAICompletionProvider::new(
let completion_provider = Arc::new(OpenAICompletionProvider::new(
"gpt-4",
cx.background().clone(),
));
@@ -259,7 +259,13 @@ impl AssistantPanel {
cx: &mut ViewContext<Workspace>,
) {
let this = if let Some(this) = workspace.panel::<AssistantPanel>(cx) {
if this.update(cx, |assistant, _| assistant.has_credentials()) {
if this.update(cx, |assistant, cx| {
if !assistant.has_credentials() {
assistant.load_credentials(cx);
};
assistant.has_credentials()
}) {
this
} else {
workspace.focus_panel::<AssistantPanel>(cx);
@@ -320,13 +326,10 @@ impl AssistantPanel {
};
let inline_assist_id = post_inc(&mut self.next_inline_assist_id);
let provider = Arc::new(OpenAICompletionProvider::new(
"gpt-4",
cx.background().clone(),
));
let provider = self.completion_provider.clone();
// Retrieve Credentials Authenticates the Provider
// provider.retrieve_credentials(cx);
provider.retrieve_credentials(cx);
let codegen = cx.add_model(|cx| {
Codegen::new(editor.read(cx).buffer().clone(), codegen_kind, provider, cx)
@@ -1439,7 +1442,7 @@ struct Conversation {
pending_save: Task<Result<()>>,
path: Option<PathBuf>,
_subscriptions: Vec<Subscription>,
completion_provider: Box<dyn CompletionProvider>,
completion_provider: Arc<dyn CompletionProvider>,
}
impl Entity for Conversation {
@@ -1450,7 +1453,7 @@ impl Conversation {
fn new(
language_registry: Arc<LanguageRegistry>,
cx: &mut ModelContext<Self>,
completion_provider: Box<dyn CompletionProvider>,
completion_provider: Arc<dyn CompletionProvider>,
) -> Self {
let markdown = language_registry.language_for_name("Markdown");
let buffer = cx.add_model(|cx| {
@@ -1544,7 +1547,7 @@ impl Conversation {
None => Some(Uuid::new_v4().to_string()),
};
let model = saved_conversation.model;
let completion_provider: Box<dyn CompletionProvider> = Box::new(
let completion_provider: Arc<dyn CompletionProvider> = Arc::new(
OpenAICompletionProvider::new(model.full_name(), cx.background().clone()),
);
completion_provider.retrieve_credentials(cx);
@@ -2201,7 +2204,7 @@ struct ConversationEditor {
impl ConversationEditor {
fn new(
completion_provider: Box<dyn CompletionProvider>,
completion_provider: Arc<dyn CompletionProvider>,
language_registry: Arc<LanguageRegistry>,
fs: Arc<dyn Fs>,
workspace: WeakViewHandle<Workspace>,
@@ -3406,7 +3409,7 @@ mod tests {
init(cx);
let registry = Arc::new(LanguageRegistry::test());
let completion_provider = Box::new(FakeCompletionProvider::new());
let completion_provider = Arc::new(FakeCompletionProvider::new());
let conversation = cx.add_model(|cx| Conversation::new(registry, cx, completion_provider));
let buffer = conversation.read(cx).buffer.clone();
@@ -3535,7 +3538,7 @@ mod tests {
cx.set_global(SettingsStore::test(cx));
init(cx);
let registry = Arc::new(LanguageRegistry::test());
let completion_provider = Box::new(FakeCompletionProvider::new());
let completion_provider = Arc::new(FakeCompletionProvider::new());
let conversation = cx.add_model(|cx| Conversation::new(registry, cx, completion_provider));
let buffer = conversation.read(cx).buffer.clone();
@@ -3633,7 +3636,7 @@ mod tests {
cx.set_global(SettingsStore::test(cx));
init(cx);
let registry = Arc::new(LanguageRegistry::test());
let completion_provider = Box::new(FakeCompletionProvider::new());
let completion_provider = Arc::new(FakeCompletionProvider::new());
let conversation = cx.add_model(|cx| Conversation::new(registry, cx, completion_provider));
let buffer = conversation.read(cx).buffer.clone();
@@ -3716,7 +3719,7 @@ mod tests {
cx.set_global(SettingsStore::test(cx));
init(cx);
let registry = Arc::new(LanguageRegistry::test());
let completion_provider = Box::new(FakeCompletionProvider::new());
let completion_provider = Arc::new(FakeCompletionProvider::new());
let conversation =
cx.add_model(|cx| Conversation::new(registry.clone(), cx, completion_provider));
let buffer = conversation.read(cx).buffer.clone();

View File

@@ -118,7 +118,7 @@ impl Codegen {
let (mut hunks_tx, mut hunks_rx) = mpsc::channel(1);
let diff = cx.background().spawn(async move {
let chunks = strip_markdown_codeblock(response.await?);
let chunks = strip_invalid_spans_from_codeblock(response.await?);
futures::pin_mut!(chunks);
let mut diff = StreamingDiff::new(selected_text.to_string());
@@ -279,12 +279,13 @@ impl Codegen {
}
}
fn strip_markdown_codeblock(
fn strip_invalid_spans_from_codeblock(
stream: impl Stream<Item = Result<String>>,
) -> impl Stream<Item = Result<String>> {
let mut first_line = true;
let mut buffer = String::new();
let mut starts_with_fenced_code_block = false;
let mut starts_with_markdown_codeblock = false;
let mut includes_start_or_end_span = false;
stream.filter_map(move |chunk| {
let chunk = match chunk {
Ok(chunk) => chunk,
@@ -292,11 +293,31 @@ fn strip_markdown_codeblock(
};
buffer.push_str(&chunk);
if buffer.len() > "<|S|".len() && buffer.starts_with("<|S|") {
includes_start_or_end_span = true;
buffer = buffer
.strip_prefix("<|S|>")
.or_else(|| buffer.strip_prefix("<|S|"))
.unwrap_or(&buffer)
.to_string();
} else if buffer.ends_with("|E|>") {
includes_start_or_end_span = true;
} else if buffer.starts_with("<|")
|| buffer.starts_with("<|S")
|| buffer.starts_with("<|S|")
|| buffer.ends_with("|")
|| buffer.ends_with("|E")
|| buffer.ends_with("|E|")
{
return future::ready(None);
}
if first_line {
if buffer == "" || buffer == "`" || buffer == "``" {
return future::ready(None);
} else if buffer.starts_with("```") {
starts_with_fenced_code_block = true;
starts_with_markdown_codeblock = true;
if let Some(newline_ix) = buffer.find('\n') {
buffer.replace_range(..newline_ix + 1, "");
first_line = false;
@@ -306,16 +327,26 @@ fn strip_markdown_codeblock(
}
}
let text = if starts_with_fenced_code_block {
buffer
let mut text = buffer.to_string();
if starts_with_markdown_codeblock {
text = text
.strip_suffix("\n```\n")
.or_else(|| buffer.strip_suffix("\n```"))
.or_else(|| buffer.strip_suffix("\n``"))
.or_else(|| buffer.strip_suffix("\n`"))
.or_else(|| buffer.strip_suffix('\n'))
.unwrap_or(&buffer)
} else {
&buffer
.or_else(|| text.strip_suffix("\n```"))
.or_else(|| text.strip_suffix("\n``"))
.or_else(|| text.strip_suffix("\n`"))
.or_else(|| text.strip_suffix('\n'))
.unwrap_or(&text)
.to_string();
}
if includes_start_or_end_span {
text = text
.strip_suffix("|E|>")
.or_else(|| text.strip_suffix("E|>"))
.or_else(|| text.strip_prefix("|>"))
.or_else(|| text.strip_prefix(">"))
.unwrap_or(&text)
.to_string();
};
if text.contains('\n') {
@@ -328,6 +359,7 @@ fn strip_markdown_codeblock(
} else {
Some(Ok(buffer.clone()))
};
buffer = remainder;
future::ready(result)
})
@@ -335,6 +367,8 @@ fn strip_markdown_codeblock(
#[cfg(test)]
mod tests {
use std::sync::Arc;
use super::*;
use ai::test::FakeCompletionProvider;
use futures::stream::{self};
@@ -405,6 +439,7 @@ mod tests {
let max_len = cmp::min(new_text.len(), 10);
let len = rng.gen_range(1..=max_len);
let (chunk, suffix) = new_text.split_at(len);
println!("CHUNK: {:?}", &chunk);
provider.send_completion(chunk);
new_text = suffix;
deterministic.run_until_parked();
@@ -537,6 +572,7 @@ mod tests {
let max_len = cmp::min(new_text.len(), 10);
let len = rng.gen_range(1..=max_len);
let (chunk, suffix) = new_text.split_at(len);
println!("{:?}", &chunk);
provider.send_completion(chunk);
new_text = suffix;
deterministic.run_until_parked();
@@ -558,50 +594,82 @@ mod tests {
}
#[gpui::test]
async fn test_strip_markdown_codeblock() {
async fn test_strip_invalid_spans_from_codeblock() {
assert_eq!(
strip_markdown_codeblock(chunks("Lorem ipsum dolor", 2))
strip_invalid_spans_from_codeblock(chunks("Lorem ipsum dolor", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum dolor"
);
assert_eq!(
strip_markdown_codeblock(chunks("```\nLorem ipsum dolor", 2))
strip_invalid_spans_from_codeblock(chunks("```\nLorem ipsum dolor", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum dolor"
);
assert_eq!(
strip_markdown_codeblock(chunks("```\nLorem ipsum dolor\n```", 2))
strip_invalid_spans_from_codeblock(chunks("```\nLorem ipsum dolor\n```", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum dolor"
);
assert_eq!(
strip_markdown_codeblock(chunks("```\nLorem ipsum dolor\n```\n", 2))
strip_invalid_spans_from_codeblock(chunks("```\nLorem ipsum dolor\n```\n", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum dolor"
);
assert_eq!(
strip_markdown_codeblock(chunks("```html\n```js\nLorem ipsum dolor\n```\n```", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
strip_invalid_spans_from_codeblock(chunks(
"```html\n```js\nLorem ipsum dolor\n```\n```",
2
))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"```js\nLorem ipsum dolor\n```"
);
assert_eq!(
strip_markdown_codeblock(chunks("``\nLorem ipsum dolor\n```", 2))
strip_invalid_spans_from_codeblock(chunks("``\nLorem ipsum dolor\n```", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"``\nLorem ipsum dolor\n```"
);
assert_eq!(
strip_invalid_spans_from_codeblock(chunks("<|S|Lorem ipsum|E|>", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum"
);
assert_eq!(
strip_invalid_spans_from_codeblock(chunks("<|S|>Lorem ipsum", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum"
);
assert_eq!(
strip_invalid_spans_from_codeblock(chunks("```\n<|S|>Lorem ipsum\n```", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum"
);
assert_eq!(
strip_invalid_spans_from_codeblock(chunks("```\n<|S|Lorem ipsum|E|>\n```", 2))
.map(|chunk| chunk.unwrap())
.collect::<String>()
.await,
"Lorem ipsum"
);
fn chunks(text: &str, size: usize) -> impl Stream<Item = Result<String>> {
stream::iter(
text.chars()

View File

@@ -80,12 +80,12 @@ fn summarize(buffer: &BufferSnapshot, selected_range: Range<impl ToOffset>) -> S
if !flushed_selection {
// The collapsed node ends after the selection starts, so we'll flush the selection first.
summary.extend(buffer.text_for_range(offset..selected_range.start));
summary.push_str("<|START|");
summary.push_str("<|S|");
if selected_range.end == selected_range.start {
summary.push_str(">");
} else {
summary.extend(buffer.text_for_range(selected_range.clone()));
summary.push_str("|END|>");
summary.push_str("|E|>");
}
offset = selected_range.end;
flushed_selection = true;
@@ -107,12 +107,12 @@ fn summarize(buffer: &BufferSnapshot, selected_range: Range<impl ToOffset>) -> S
// Flush selection if we haven't already done so.
if !flushed_selection && offset <= selected_range.start {
summary.extend(buffer.text_for_range(offset..selected_range.start));
summary.push_str("<|START|");
summary.push_str("<|S|");
if selected_range.end == selected_range.start {
summary.push_str(">");
} else {
summary.extend(buffer.text_for_range(selected_range.clone()));
summary.push_str("|END|>");
summary.push_str("|E|>");
}
offset = selected_range.end;
}
@@ -260,7 +260,7 @@ pub(crate) mod tests {
summarize(&snapshot, Point::new(1, 4)..Point::new(1, 4)),
indoc! {"
struct X {
<|START|>a: usize,
<|S|>a: usize,
b: usize,
}
@@ -286,7 +286,7 @@ pub(crate) mod tests {
impl X {
fn new() -> Self {
let <|START|a |END|>= 1;
let <|S|a |E|>= 1;
let b = 2;
Self { a, b }
}
@@ -307,7 +307,7 @@ pub(crate) mod tests {
}
impl X {
<|START|>
<|S|>
fn new() -> Self {}
pub fn a(&self, param: bool) -> usize {}
@@ -333,7 +333,7 @@ pub(crate) mod tests {
pub fn b(&self) -> usize {}
}
<|START|>"}
<|S|>"}
);
// Ensure nested functions get collapsed properly.
@@ -369,7 +369,7 @@ pub(crate) mod tests {
assert_eq!(
summarize(&snapshot, Point::new(0, 0)..Point::new(0, 0)),
indoc! {"
<|START|>struct X {
<|S|>struct X {
a: usize,
b: usize,
}

View File

@@ -20,7 +20,9 @@ theme = { path = "../theme" }
util = { path = "../util" }
workspace = { path = "../workspace" }
log.workspace = true
anyhow.workspace = true
futures.workspace = true
schemars.workspace = true
serde.workspace = true
serde_derive.workspace = true

View File

@@ -2,8 +2,8 @@ pub mod items;
mod project_diagnostics_settings;
mod toolbar_controls;
use anyhow::Result;
use collections::{BTreeSet, HashSet};
use anyhow::{Context, Result};
use collections::{HashMap, HashSet};
use editor::{
diagnostic_block_renderer,
display_map::{BlockDisposition, BlockId, BlockProperties, BlockStyle, RenderBlock},
@@ -11,9 +11,10 @@ use editor::{
scroll::autoscroll::Autoscroll,
Editor, ExcerptId, ExcerptRange, MultiBuffer, ToOffset,
};
use futures::future::try_join_all;
use gpui::{
actions, elements::*, fonts::TextStyle, serde_json, AnyViewHandle, AppContext, Entity,
ModelHandle, Task, View, ViewContext, ViewHandle, WeakViewHandle,
ModelHandle, Subscription, Task, View, ViewContext, ViewHandle, WeakViewHandle,
};
use language::{
Anchor, Bias, Buffer, Diagnostic, DiagnosticEntry, DiagnosticSeverity, Point, Selection,
@@ -28,6 +29,7 @@ use std::{
any::{Any, TypeId},
borrow::Cow,
cmp::Ordering,
mem,
ops::Range,
path::PathBuf,
sync::Arc,
@@ -60,8 +62,10 @@ struct ProjectDiagnosticsEditor {
summary: DiagnosticSummary,
excerpts: ModelHandle<MultiBuffer>,
path_states: Vec<PathState>,
paths_to_update: BTreeSet<(ProjectPath, LanguageServerId)>,
paths_to_update: HashMap<LanguageServerId, HashSet<ProjectPath>>,
current_diagnostics: HashMap<LanguageServerId, HashSet<ProjectPath>>,
include_warnings: bool,
_subscriptions: Vec<Subscription>,
}
struct PathState {
@@ -125,9 +129,12 @@ impl View for ProjectDiagnosticsEditor {
"summary": project.diagnostic_summary(cx),
}),
"summary": self.summary,
"paths_to_update": self.paths_to_update.iter().map(|(path, server_id)|
(path.path.to_string_lossy(), server_id.0)
).collect::<Vec<_>>(),
"paths_to_update": self.paths_to_update.iter().map(|(server_id, paths)|
(server_id.0, paths.into_iter().map(|path| path.path.to_string_lossy()).collect::<Vec<_>>())
).collect::<HashMap<_, _>>(),
"current_diagnostics": self.current_diagnostics.iter().map(|(server_id, paths)|
(server_id.0, paths.into_iter().map(|path| path.path.to_string_lossy()).collect::<Vec<_>>())
).collect::<HashMap<_, _>>(),
"paths_states": self.path_states.iter().map(|state|
json!({
"path": state.path.path.to_string_lossy(),
@@ -149,21 +156,30 @@ impl ProjectDiagnosticsEditor {
workspace: WeakViewHandle<Workspace>,
cx: &mut ViewContext<Self>,
) -> Self {
cx.subscribe(&project_handle, |this, _, event, cx| match event {
project::Event::DiskBasedDiagnosticsFinished { language_server_id } => {
this.update_excerpts(Some(*language_server_id), cx);
this.update_title(cx);
}
project::Event::DiagnosticsUpdated {
language_server_id,
path,
} => {
this.paths_to_update
.insert((path.clone(), *language_server_id));
}
_ => {}
})
.detach();
let project_event_subscription =
cx.subscribe(&project_handle, |this, _, event, cx| match event {
project::Event::DiskBasedDiagnosticsFinished { language_server_id } => {
log::debug!("Disk based diagnostics finished for server {language_server_id}");
this.update_excerpts(Some(*language_server_id), cx);
}
project::Event::DiagnosticsUpdated {
language_server_id,
path,
} => {
log::debug!("Adding path {path:?} to update for server {language_server_id}");
this.paths_to_update
.entry(*language_server_id)
.or_default()
.insert(path.clone());
let no_multiselections = this.editor.update(cx, |editor, cx| {
editor.selections.all::<usize>(cx).len() <= 1
});
if no_multiselections && !this.is_dirty(cx) {
this.update_excerpts(Some(*language_server_id), cx);
}
}
_ => {}
});
let excerpts = cx.add_model(|cx| MultiBuffer::new(project_handle.read(cx).replica_id()));
let editor = cx.add_view(|cx| {
@@ -172,19 +188,14 @@ impl ProjectDiagnosticsEditor {
editor.set_vertical_scroll_margin(5, cx);
editor
});
cx.subscribe(&editor, |this, _, event, cx| {
let editor_event_subscription = cx.subscribe(&editor, |this, _, event, cx| {
cx.emit(event.clone());
if event == &editor::Event::Focused && this.path_states.is_empty() {
cx.focus_self()
}
})
.detach();
});
let project = project_handle.read(cx);
let paths_to_update = project
.diagnostic_summaries(cx)
.map(|(path, server_id, _)| (path, server_id))
.collect();
let summary = project.diagnostic_summary(cx);
let mut this = Self {
project: project_handle,
@@ -193,8 +204,10 @@ impl ProjectDiagnosticsEditor {
excerpts,
editor,
path_states: Default::default(),
paths_to_update,
paths_to_update: HashMap::default(),
include_warnings: settings::get::<ProjectDiagnosticsSettings>(cx).include_warnings,
current_diagnostics: HashMap::default(),
_subscriptions: vec![project_event_subscription, editor_event_subscription],
};
this.update_excerpts(None, cx);
this
@@ -214,12 +227,6 @@ impl ProjectDiagnosticsEditor {
fn toggle_warnings(&mut self, _: &ToggleWarnings, cx: &mut ViewContext<Self>) {
self.include_warnings = !self.include_warnings;
self.paths_to_update = self
.project
.read(cx)
.diagnostic_summaries(cx)
.map(|(path, server_id, _)| (path, server_id))
.collect();
self.update_excerpts(None, cx);
cx.notify();
}
@@ -229,29 +236,94 @@ impl ProjectDiagnosticsEditor {
language_server_id: Option<LanguageServerId>,
cx: &mut ViewContext<Self>,
) {
let mut paths = Vec::new();
self.paths_to_update.retain(|(path, server_id)| {
if language_server_id
.map_or(true, |language_server_id| language_server_id == *server_id)
{
paths.push(path.clone());
false
log::debug!("Updating excerpts for server {language_server_id:?}");
let mut paths_to_recheck = HashSet::default();
let mut new_summaries: HashMap<LanguageServerId, HashSet<ProjectPath>> = self
.project
.read(cx)
.diagnostic_summaries(cx)
.fold(HashMap::default(), |mut summaries, (path, server_id, _)| {
summaries.entry(server_id).or_default().insert(path);
summaries
});
let mut old_diagnostics = if let Some(language_server_id) = language_server_id {
new_summaries.retain(|server_id, _| server_id == &language_server_id);
self.paths_to_update.retain(|server_id, paths| {
if server_id == &language_server_id {
paths_to_recheck.extend(paths.drain());
false
} else {
true
}
});
let mut old_diagnostics = HashMap::default();
if let Some(new_paths) = new_summaries.get(&language_server_id) {
if let Some(old_paths) = self
.current_diagnostics
.insert(language_server_id, new_paths.clone())
{
old_diagnostics.insert(language_server_id, old_paths);
}
} else {
true
if let Some(old_paths) = self.current_diagnostics.remove(&language_server_id) {
old_diagnostics.insert(language_server_id, old_paths);
}
}
});
old_diagnostics
} else {
paths_to_recheck.extend(self.paths_to_update.drain().flat_map(|(_, paths)| paths));
mem::replace(&mut self.current_diagnostics, new_summaries.clone())
};
for (server_id, new_paths) in new_summaries {
match old_diagnostics.remove(&server_id) {
Some(mut old_paths) => {
paths_to_recheck.extend(
new_paths
.into_iter()
.filter(|new_path| !old_paths.remove(new_path)),
);
paths_to_recheck.extend(old_paths);
}
None => paths_to_recheck.extend(new_paths),
}
}
paths_to_recheck.extend(old_diagnostics.into_iter().flat_map(|(_, paths)| paths));
if paths_to_recheck.is_empty() {
log::debug!("No paths to recheck for language server {language_server_id:?}");
return;
}
log::debug!(
"Rechecking {} paths for language server {:?}",
paths_to_recheck.len(),
language_server_id
);
let project = self.project.clone();
cx.spawn(|this, mut cx| {
async move {
for path in paths {
let buffer = project
.update(&mut cx, |project, cx| project.open_buffer(path.clone(), cx))
.await?;
this.update(&mut cx, |this, cx| {
this.populate_excerpts(path, language_server_id, buffer, cx)
})?;
}
Result::<_, anyhow::Error>::Ok(())
let _: Vec<()> = try_join_all(paths_to_recheck.into_iter().map(|path| {
let mut cx = cx.clone();
let project = project.clone();
async move {
let buffer = project
.update(&mut cx, |project, cx| project.open_buffer(path.clone(), cx))
.await
.with_context(|| format!("opening buffer for path {path:?}"))?;
this.update(&mut cx, |this, cx| {
this.populate_excerpts(path, language_server_id, buffer, cx);
})
.context("missing project")?;
anyhow::Ok(())
}
}))
.await
.context("rechecking diagnostics for paths")?;
this.update(&mut cx, |this, cx| {
this.summary = this.project.read(cx).diagnostic_summary(cx);
cx.emit(Event::TitleChanged);
})?;
anyhow::Ok(())
}
.log_err()
})
@@ -554,11 +626,6 @@ impl ProjectDiagnosticsEditor {
}
cx.notify();
}
fn update_title(&mut self, cx: &mut ViewContext<Self>) {
self.summary = self.project.read(cx).diagnostic_summary(cx);
cx.emit(Event::TitleChanged);
}
}
impl Item for ProjectDiagnosticsEditor {
@@ -1301,25 +1368,6 @@ mod tests {
cx,
)
.unwrap();
project
.update_diagnostic_entries(
server_id_2,
PathBuf::from("/test/main.js"),
None,
vec![DiagnosticEntry {
range: Unclipped(PointUtf16::new(1, 0))..Unclipped(PointUtf16::new(1, 1)),
diagnostic: Diagnostic {
message: "warning 1".to_string(),
severity: DiagnosticSeverity::ERROR,
is_primary: true,
is_disk_based: true,
group_id: 2,
..Default::default()
},
}],
cx,
)
.unwrap();
});
// The first language server finishes
@@ -1353,6 +1401,25 @@ mod tests {
// The second language server finishes
project.update(cx, |project, cx| {
project
.update_diagnostic_entries(
server_id_2,
PathBuf::from("/test/main.js"),
None,
vec![DiagnosticEntry {
range: Unclipped(PointUtf16::new(1, 0))..Unclipped(PointUtf16::new(1, 1)),
diagnostic: Diagnostic {
message: "warning 1".to_string(),
severity: DiagnosticSeverity::ERROR,
is_primary: true,
is_disk_based: true,
group_id: 2,
..Default::default()
},
}],
cx,
)
.unwrap();
project.disk_based_diagnostics_finished(server_id_2, cx);
});

View File

@@ -33,9 +33,9 @@ use util::{
paths::{PathExt, FILE_ROW_COLUMN_DELIMITER},
ResultExt, TryFutureExt,
};
use workspace::item::{BreadcrumbText, FollowableItemHandle};
use workspace::item::{BreadcrumbText, FollowableItemHandle, ItemHandle};
use workspace::{
item::{FollowableItem, Item, ItemEvent, ItemHandle, ProjectItem},
item::{FollowableItem, Item, ItemEvent, ProjectItem},
searchable::{Direction, SearchEvent, SearchableItem, SearchableItemHandle},
ItemId, ItemNavHistory, Pane, StatusItemView, ToolbarItemLocation, ViewId, Workspace,
WorkspaceId,

View File

@@ -47,8 +47,8 @@ where
subscribers.remove(&subscriber_id);
if subscribers.is_empty() {
lock.subscribers.remove(&emitter_key);
return;
}
return;
}
// We didn't manage to remove the subscription, which means it was dropped

View File

@@ -42,7 +42,7 @@ use std::{
},
};
use syntax_map::SyntaxSnapshot;
use theme2::{SyntaxTheme, Theme};
use theme2::{SyntaxTheme, ThemeVariant};
use tree_sitter::{self, Query};
use unicase::UniCase;
use util::{http::HttpClient, paths::PathExt};
@@ -642,7 +642,7 @@ struct LanguageRegistryState {
next_available_language_id: AvailableLanguageId,
loading_languages: HashMap<AvailableLanguageId, Vec<oneshot::Sender<Result<Arc<Language>>>>>,
subscription: (watch::Sender<()>, watch::Receiver<()>),
theme: Option<Arc<Theme>>,
theme: Option<Arc<ThemeVariant>>,
version: usize,
reload_count: usize,
}
@@ -743,11 +743,11 @@ impl LanguageRegistry {
self.state.read().reload_count
}
pub fn set_theme(&self, theme: Arc<Theme>) {
pub fn set_theme(&self, theme: Arc<ThemeVariant>) {
let mut state = self.state.write();
state.theme = Some(theme.clone());
for language in &state.languages {
language.set_theme(&theme.syntax);
language.set_theme(&theme.syntax());
}
}
@@ -1048,7 +1048,7 @@ impl LanguageRegistryState {
fn add(&mut self, language: Arc<Language>) {
if let Some(theme) = self.theme.as_ref() {
language.set_theme(&theme.syntax);
language.set_theme(&theme.syntax());
}
self.languages.push(language);
self.version += 1;

View File

@@ -0,0 +1,78 @@
[package]
name = "multi_buffer2"
version = "0.1.0"
edition = "2021"
publish = false
[lib]
path = "src/multi_buffer2.rs"
doctest = false
[features]
test-support = [
"copilot2/test-support",
"text/test-support",
"language2/test-support",
"gpui2/test-support",
"util/test-support",
"tree-sitter-rust",
"tree-sitter-typescript"
]
[dependencies]
client2 = { path = "../client2" }
clock = { path = "../clock" }
collections = { path = "../collections" }
git = { path = "../git" }
gpui2 = { path = "../gpui2" }
language2 = { path = "../language2" }
lsp2 = { path = "../lsp2" }
rich_text = { path = "../rich_text" }
settings2 = { path = "../settings2" }
snippet = { path = "../snippet" }
sum_tree = { path = "../sum_tree" }
text = { path = "../text" }
theme2 = { path = "../theme2" }
util = { path = "../util" }
aho-corasick = "1.1"
anyhow.workspace = true
convert_case = "0.6.0"
futures.workspace = true
indoc = "1.0.4"
itertools = "0.10"
lazy_static.workspace = true
log.workspace = true
ordered-float.workspace = true
parking_lot.workspace = true
postage.workspace = true
pulldown-cmark = { version = "0.9.2", default-features = false }
rand.workspace = true
schemars.workspace = true
serde.workspace = true
serde_derive.workspace = true
smallvec.workspace = true
smol.workspace = true
tree-sitter-rust = { workspace = true, optional = true }
tree-sitter-html = { workspace = true, optional = true }
tree-sitter-typescript = { workspace = true, optional = true }
[dev-dependencies]
copilot2 = { path = "../copilot2", features = ["test-support"] }
text = { path = "../text", features = ["test-support"] }
language2 = { path = "../language2", features = ["test-support"] }
lsp2 = { path = "../lsp2", features = ["test-support"] }
gpui2 = { path = "../gpui2", features = ["test-support"] }
util = { path = "../util", features = ["test-support"] }
project2 = { path = "../project2", features = ["test-support"] }
settings2 = { path = "../settings2", features = ["test-support"] }
ctor.workspace = true
env_logger.workspace = true
rand.workspace = true
unindent.workspace = true
tree-sitter.workspace = true
tree-sitter-rust.workspace = true
tree-sitter-html.workspace = true
tree-sitter-typescript.workspace = true

View File

@@ -0,0 +1,138 @@
use super::{ExcerptId, MultiBufferSnapshot, ToOffset, ToOffsetUtf16, ToPoint};
use language2::{OffsetUtf16, Point, TextDimension};
use std::{
cmp::Ordering,
ops::{Range, Sub},
};
use sum_tree::Bias;
#[derive(Clone, Copy, Eq, PartialEq, Debug, Hash)]
pub struct Anchor {
pub buffer_id: Option<u64>,
pub excerpt_id: ExcerptId,
pub text_anchor: text::Anchor,
}
impl Anchor {
pub fn min() -> Self {
Self {
buffer_id: None,
excerpt_id: ExcerptId::min(),
text_anchor: text::Anchor::MIN,
}
}
pub fn max() -> Self {
Self {
buffer_id: None,
excerpt_id: ExcerptId::max(),
text_anchor: text::Anchor::MAX,
}
}
pub fn cmp(&self, other: &Anchor, snapshot: &MultiBufferSnapshot) -> Ordering {
let excerpt_id_cmp = self.excerpt_id.cmp(&other.excerpt_id, snapshot);
if excerpt_id_cmp.is_eq() {
if self.excerpt_id == ExcerptId::min() || self.excerpt_id == ExcerptId::max() {
Ordering::Equal
} else if let Some(excerpt) = snapshot.excerpt(self.excerpt_id) {
self.text_anchor.cmp(&other.text_anchor, &excerpt.buffer)
} else {
Ordering::Equal
}
} else {
excerpt_id_cmp
}
}
pub fn bias(&self) -> Bias {
self.text_anchor.bias
}
pub fn bias_left(&self, snapshot: &MultiBufferSnapshot) -> Anchor {
if self.text_anchor.bias != Bias::Left {
if let Some(excerpt) = snapshot.excerpt(self.excerpt_id) {
return Self {
buffer_id: self.buffer_id,
excerpt_id: self.excerpt_id.clone(),
text_anchor: self.text_anchor.bias_left(&excerpt.buffer),
};
}
}
self.clone()
}
pub fn bias_right(&self, snapshot: &MultiBufferSnapshot) -> Anchor {
if self.text_anchor.bias != Bias::Right {
if let Some(excerpt) = snapshot.excerpt(self.excerpt_id) {
return Self {
buffer_id: self.buffer_id,
excerpt_id: self.excerpt_id.clone(),
text_anchor: self.text_anchor.bias_right(&excerpt.buffer),
};
}
}
self.clone()
}
pub fn summary<D>(&self, snapshot: &MultiBufferSnapshot) -> D
where
D: TextDimension + Ord + Sub<D, Output = D>,
{
snapshot.summary_for_anchor(self)
}
pub fn is_valid(&self, snapshot: &MultiBufferSnapshot) -> bool {
if *self == Anchor::min() || *self == Anchor::max() {
true
} else if let Some(excerpt) = snapshot.excerpt(self.excerpt_id) {
excerpt.contains(self)
&& (self.text_anchor == excerpt.range.context.start
|| self.text_anchor == excerpt.range.context.end
|| self.text_anchor.is_valid(&excerpt.buffer))
} else {
false
}
}
}
impl ToOffset for Anchor {
fn to_offset(&self, snapshot: &MultiBufferSnapshot) -> usize {
self.summary(snapshot)
}
}
impl ToOffsetUtf16 for Anchor {
fn to_offset_utf16(&self, snapshot: &MultiBufferSnapshot) -> OffsetUtf16 {
self.summary(snapshot)
}
}
impl ToPoint for Anchor {
fn to_point<'a>(&self, snapshot: &MultiBufferSnapshot) -> Point {
self.summary(snapshot)
}
}
pub trait AnchorRangeExt {
fn cmp(&self, b: &Range<Anchor>, buffer: &MultiBufferSnapshot) -> Ordering;
fn to_offset(&self, content: &MultiBufferSnapshot) -> Range<usize>;
fn to_point(&self, content: &MultiBufferSnapshot) -> Range<Point>;
}
impl AnchorRangeExt for Range<Anchor> {
fn cmp(&self, other: &Range<Anchor>, buffer: &MultiBufferSnapshot) -> Ordering {
match self.start.cmp(&other.start, buffer) {
Ordering::Equal => other.end.cmp(&self.end, buffer),
ord => ord,
}
}
fn to_offset(&self, content: &MultiBufferSnapshot) -> Range<usize> {
self.start.to_offset(content)..self.end.to_offset(content)
}
fn to_point(&self, content: &MultiBufferSnapshot) -> Range<Point> {
self.start.to_point(content)..self.end.to_point(content)
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,8 @@
use std::collections::VecDeque;
use std::path::{Path, PathBuf};
use std::sync::Arc;
use anyhow::Context;
use collections::HashMap;
use collections::{HashMap, HashSet};
use fs::Fs;
use gpui::{AsyncAppContext, ModelHandle};
use language::language_settings::language_settings;
@@ -11,7 +10,7 @@ use language::{Buffer, Diff};
use lsp::{LanguageServer, LanguageServerId};
use node_runtime::NodeRuntime;
use serde::{Deserialize, Serialize};
use util::paths::DEFAULT_PRETTIER_DIR;
use util::paths::{PathMatcher, DEFAULT_PRETTIER_DIR};
pub enum Prettier {
Real(RealPrettier),
@@ -20,7 +19,6 @@ pub enum Prettier {
}
pub struct RealPrettier {
worktree_id: Option<usize>,
default: bool,
prettier_dir: PathBuf,
server: Arc<LanguageServer>,
@@ -28,17 +26,10 @@ pub struct RealPrettier {
#[cfg(any(test, feature = "test-support"))]
pub struct TestPrettier {
worktree_id: Option<usize>,
prettier_dir: PathBuf,
default: bool,
}
#[derive(Debug)]
pub struct LocateStart {
pub worktree_root_path: Arc<Path>,
pub starting_path: Arc<Path>,
}
pub const PRETTIER_SERVER_FILE: &str = "prettier_server.js";
pub const PRETTIER_SERVER_JS: &str = include_str!("./prettier_server.js");
const PRETTIER_PACKAGE_NAME: &str = "prettier";
@@ -63,79 +54,106 @@ impl Prettier {
".editorconfig",
];
pub async fn locate(
starting_path: Option<LocateStart>,
fs: Arc<dyn Fs>,
) -> anyhow::Result<PathBuf> {
fn is_node_modules(path_component: &std::path::Component<'_>) -> bool {
path_component.as_os_str().to_string_lossy() == "node_modules"
pub async fn locate_prettier_installation(
fs: &dyn Fs,
installed_prettiers: &HashSet<PathBuf>,
locate_from: &Path,
) -> anyhow::Result<Option<PathBuf>> {
let mut path_to_check = locate_from
.components()
.take_while(|component| component.as_os_str().to_string_lossy() != "node_modules")
.collect::<PathBuf>();
let path_to_check_metadata = fs
.metadata(&path_to_check)
.await
.with_context(|| format!("failed to get metadata for initial path {path_to_check:?}"))?
.with_context(|| format!("empty metadata for initial path {path_to_check:?}"))?;
if !path_to_check_metadata.is_dir {
path_to_check.pop();
}
let paths_to_check = match starting_path.as_ref() {
Some(starting_path) => {
let worktree_root = starting_path
.worktree_root_path
.components()
.into_iter()
.take_while(|path_component| !is_node_modules(path_component))
.collect::<PathBuf>();
if worktree_root != starting_path.worktree_root_path.as_ref() {
vec![worktree_root]
let mut project_path_with_prettier_dependency = None;
loop {
if installed_prettiers.contains(&path_to_check) {
log::debug!("Found prettier path {path_to_check:?} in installed prettiers");
return Ok(Some(path_to_check));
} else if let Some(package_json_contents) =
read_package_json(fs, &path_to_check).await?
{
if has_prettier_in_package_json(&package_json_contents) {
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");
return Ok(Some(path_to_check));
} else if project_path_with_prettier_dependency.is_none() {
project_path_with_prettier_dependency = Some(path_to_check.clone());
}
} else {
if starting_path.starting_path.as_ref() == Path::new("") {
worktree_root
.parent()
.map(|path| vec![path.to_path_buf()])
.unwrap_or_default()
} else {
let file_to_format = starting_path.starting_path.as_ref();
let mut paths_to_check = VecDeque::new();
let mut current_path = worktree_root;
for path_component in file_to_format.components().into_iter() {
let new_path = current_path.join(path_component);
let old_path = std::mem::replace(&mut current_path, new_path);
paths_to_check.push_front(old_path);
if is_node_modules(&path_component) {
break;
match package_json_contents.get("workspaces") {
Some(serde_json::Value::Array(workspaces)) => {
match &project_path_with_prettier_dependency {
Some(project_path_with_prettier_dependency) => {
let subproject_path = project_path_with_prettier_dependency.strip_prefix(&path_to_check).expect("traversing path parents, should be able to strip prefix");
if workspaces.iter().filter_map(|value| {
if let serde_json::Value::String(s) = value {
Some(s.clone())
} else {
log::warn!("Skipping non-string 'workspaces' value: {value:?}");
None
}
}).any(|workspace_definition| {
if let Some(path_matcher) = PathMatcher::new(&workspace_definition).ok() {
path_matcher.is_match(subproject_path)
} else {
workspace_definition == subproject_path.to_string_lossy()
}
}) {
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:?}");
return Ok(Some(path_to_check));
} 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:?}");
}
}
None => {
log::warn!("Skipping path {path_to_check:?} that has prettier in its 'node_modules' subdirectory, but has no prettier in its package.json");
}
}
}
Vec::from(paths_to_check)
},
Some(unknown) => log::error!("Failed to parse workspaces for {path_to_check:?} from package.json, got {unknown:?}. Skipping."),
None => log::warn!("Skipping path {path_to_check:?} that has no prettier dependency and no workspaces section in its package.json"),
}
}
}
None => Vec::new(),
};
match find_closest_prettier_dir(paths_to_check, fs.as_ref())
.await
.with_context(|| format!("finding prettier starting with {starting_path:?}"))?
{
Some(prettier_dir) => Ok(prettier_dir),
None => Ok(DEFAULT_PRETTIER_DIR.to_path_buf()),
if !path_to_check.pop() {
match project_path_with_prettier_dependency {
Some(closest_prettier_discovered) => {
anyhow::bail!("No prettier found in node_modules for ancestors of {locate_from:?}, but discovered prettier package.json dependency in {closest_prettier_discovered:?}")
}
None => {
log::debug!("Found no prettier in ancestors of {locate_from:?}");
return Ok(None);
}
}
}
}
}
#[cfg(any(test, feature = "test-support"))]
pub async fn start(
worktree_id: Option<usize>,
_: LanguageServerId,
prettier_dir: PathBuf,
_: Arc<dyn NodeRuntime>,
_: AsyncAppContext,
) -> anyhow::Result<Self> {
Ok(
#[cfg(any(test, feature = "test-support"))]
Self::Test(TestPrettier {
worktree_id,
default: prettier_dir == DEFAULT_PRETTIER_DIR.as_path(),
prettier_dir,
}),
)
Ok(Self::Test(TestPrettier {
default: prettier_dir == DEFAULT_PRETTIER_DIR.as_path(),
prettier_dir,
}))
}
#[cfg(not(any(test, feature = "test-support")))]
pub async fn start(
worktree_id: Option<usize>,
server_id: LanguageServerId,
prettier_dir: PathBuf,
node: Arc<dyn NodeRuntime>,
@@ -143,7 +161,7 @@ impl Prettier {
) -> anyhow::Result<Self> {
use lsp::LanguageServerBinary;
let backgroud = cx.background();
let background = cx.background();
anyhow::ensure!(
prettier_dir.is_dir(),
"Prettier dir {prettier_dir:?} is not a directory"
@@ -154,7 +172,7 @@ impl Prettier {
"no prettier server package found at {prettier_server:?}"
);
let node_path = backgroud
let node_path = background
.spawn(async move { node.binary_path().await })
.await?;
let server = LanguageServer::new(
@@ -169,12 +187,11 @@ impl Prettier {
cx,
)
.context("prettier server creation")?;
let server = backgroud
let server = background
.spawn(server.initialize(None))
.await
.context("prettier server initialization")?;
Ok(Self::Real(RealPrettier {
worktree_id,
server,
default: prettier_dir == DEFAULT_PRETTIER_DIR.as_path(),
prettier_dir,
@@ -340,64 +357,61 @@ impl Prettier {
Self::Test(test_prettier) => &test_prettier.prettier_dir,
}
}
pub fn worktree_id(&self) -> Option<usize> {
match self {
Self::Real(local) => local.worktree_id,
#[cfg(any(test, feature = "test-support"))]
Self::Test(test_prettier) => test_prettier.worktree_id,
}
}
}
async fn find_closest_prettier_dir(
paths_to_check: Vec<PathBuf>,
fs: &dyn Fs,
) -> anyhow::Result<Option<PathBuf>> {
for path in paths_to_check {
let possible_package_json = path.join("package.json");
if let Some(package_json_metadata) = fs
.metadata(&possible_package_json)
.await
.with_context(|| format!("Fetching metadata for {possible_package_json:?}"))?
{
if !package_json_metadata.is_dir && !package_json_metadata.is_symlink {
let package_json_contents = fs
.load(&possible_package_json)
.await
.with_context(|| format!("reading {possible_package_json:?} file contents"))?;
if let Ok(json_contents) = serde_json::from_str::<HashMap<String, serde_json::Value>>(
&package_json_contents,
) {
if let Some(serde_json::Value::Object(o)) = json_contents.get("dependencies") {
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return Ok(Some(path));
}
}
if let Some(serde_json::Value::Object(o)) = json_contents.get("devDependencies")
{
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return Ok(Some(path));
}
}
}
}
}
async fn has_prettier_in_node_modules(fs: &dyn Fs, path: &Path) -> anyhow::Result<bool> {
let possible_node_modules_location = path.join("node_modules").join(PRETTIER_PACKAGE_NAME);
if let Some(node_modules_location_metadata) = fs
.metadata(&possible_node_modules_location)
.await
.with_context(|| format!("fetching metadata for {possible_node_modules_location:?}"))?
{
return Ok(node_modules_location_metadata.is_dir);
}
Ok(false)
}
let possible_node_modules_location = path.join("node_modules").join(PRETTIER_PACKAGE_NAME);
if let Some(node_modules_location_metadata) = fs
.metadata(&possible_node_modules_location)
.await
.with_context(|| format!("fetching metadata for {possible_node_modules_location:?}"))?
{
if node_modules_location_metadata.is_dir {
return Ok(Some(path));
}
async fn read_package_json(
fs: &dyn Fs,
path: &Path,
) -> anyhow::Result<Option<HashMap<String, serde_json::Value>>> {
let possible_package_json = path.join("package.json");
if let Some(package_json_metadata) = fs
.metadata(&possible_package_json)
.await
.with_context(|| format!("fetching metadata for package json {possible_package_json:?}"))?
{
if !package_json_metadata.is_dir && !package_json_metadata.is_symlink {
let package_json_contents = fs
.load(&possible_package_json)
.await
.with_context(|| format!("reading {possible_package_json:?} file contents"))?;
return serde_json::from_str::<HashMap<String, serde_json::Value>>(
&package_json_contents,
)
.map(Some)
.with_context(|| format!("parsing {possible_package_json:?} file contents"));
}
}
Ok(None)
}
fn has_prettier_in_package_json(
package_json_contents: &HashMap<String, serde_json::Value>,
) -> bool {
if let Some(serde_json::Value::Object(o)) = package_json_contents.get("dependencies") {
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return true;
}
}
if let Some(serde_json::Value::Object(o)) = package_json_contents.get("devDependencies") {
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return true;
}
}
false
}
enum Format {}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
@@ -436,3 +450,316 @@ impl lsp::request::Request for ClearCache {
type Result = ();
const METHOD: &'static str = "prettier/clear_cache";
}
#[cfg(test)]
mod tests {
use fs::FakeFs;
use serde_json::json;
use super::*;
#[gpui::test]
async fn test_prettier_lookup_finds_nothing(cx: &mut gpui::TestAppContext) {
let fs = FakeFs::new(cx.background());
fs.insert_tree(
"/root",
json!({
".config": {
"zed": {
"settings.json": r#"{ "formatter": "auto" }"#,
},
},
"work": {
"project": {
"src": {
"index.js": "// index.js file contents",
},
"node_modules": {
"expect": {
"build": {
"print.js": "// print.js file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.5.1"
}
}"#,
},
"prettier": {
"index.js": "// Dummy prettier package file",
},
},
"package.json": r#"{}"#
},
}
}),
)
.await;
assert!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/.config/zed/settings.json"),
)
.await
.unwrap()
.is_none(),
"Should successfully find no prettier for path hierarchy without it"
);
assert!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/project/src/index.js")
)
.await
.unwrap()
.is_none(),
"Should successfully find no prettier for path hierarchy that has node_modules with prettier, but no package.json mentions of it"
);
assert!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/project/node_modules/expect/build/print.js")
)
.await
.unwrap()
.is_none(),
"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"
);
}
#[gpui::test]
async fn test_prettier_lookup_in_simple_npm_projects(cx: &mut gpui::TestAppContext) {
let fs = FakeFs::new(cx.background());
fs.insert_tree(
"/root",
json!({
"web_blog": {
"node_modules": {
"prettier": {
"index.js": "// Dummy prettier package file",
},
"expect": {
"build": {
"print.js": "// print.js file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.5.1"
}
}"#,
},
},
"pages": {
"[slug].tsx": "// [slug].tsx file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.3.0"
},
"prettier": {
"semi": false,
"printWidth": 80,
"htmlWhitespaceSensitivity": "strict",
"tabWidth": 4
}
}"#
}
}),
)
.await;
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/web_blog/pages/[slug].tsx")
)
.await
.unwrap(),
Some(PathBuf::from("/root/web_blog")),
"Should find a preinstalled prettier in the project root"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/web_blog/node_modules/expect/build/print.js")
)
.await
.unwrap(),
Some(PathBuf::from("/root/web_blog")),
"Should find a preinstalled prettier in the project root even for node_modules files"
);
}
#[gpui::test]
async fn test_prettier_lookup_for_not_installed(cx: &mut gpui::TestAppContext) {
let fs = FakeFs::new(cx.background());
fs.insert_tree(
"/root",
json!({
"work": {
"web_blog": {
"pages": {
"[slug].tsx": "// [slug].tsx file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.3.0"
},
"prettier": {
"semi": false,
"printWidth": 80,
"htmlWhitespaceSensitivity": "strict",
"tabWidth": 4
}
}"#
}
}
}),
)
.await;
let path = "/root/work/web_blog/node_modules/pages/[slug].tsx";
match Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new(path)
)
.await {
Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"),
Err(e) => {
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 potential candidates without prettier node_modules contents");
},
};
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/pages/[slug].tsx")
)
.await
.unwrap(),
Some(PathBuf::from("/root/work")),
"Should return first cached value found without path checks"
);
}
#[gpui::test]
async fn test_prettier_lookup_in_npm_workspaces(cx: &mut gpui::TestAppContext) {
let fs = FakeFs::new(cx.background());
fs.insert_tree(
"/root",
json!({
"work": {
"full-stack-foundations": {
"exercises": {
"03.loading": {
"01.problem.loader": {
"app": {
"routes": {
"users+": {
"$username_+": {
"notes.tsx": "// notes.tsx file contents",
},
},
},
},
"node_modules": {},
"package.json": r#"{
"devDependencies": {
"prettier": "^3.0.3"
}
}"#
},
},
},
"package.json": r#"{
"workspaces": ["exercises/*/*", "examples/*"]
}"#,
"node_modules": {
"prettier": {
"index.js": "// Dummy prettier package file",
},
},
},
}
}),
)
.await;
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx"),
).await.unwrap(),
Some(PathBuf::from("/root/work/full-stack-foundations")),
"Should ascend to the multi-workspace root and find the prettier there",
);
}
#[gpui::test]
async fn test_prettier_lookup_in_npm_workspaces_for_not_installed(
cx: &mut gpui::TestAppContext,
) {
let fs = FakeFs::new(cx.background());
fs.insert_tree(
"/root",
json!({
"work": {
"full-stack-foundations": {
"exercises": {
"03.loading": {
"01.problem.loader": {
"app": {
"routes": {
"users+": {
"$username_+": {
"notes.tsx": "// notes.tsx file contents",
},
},
},
},
"node_modules": {},
"package.json": r#"{
"devDependencies": {
"prettier": "^3.0.3"
}
}"#
},
},
},
"package.json": r#"{
"workspaces": ["exercises/*/*", "examples/*"]
}"#,
},
}
}),
)
.await;
match Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx")
)
.await {
Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"),
Err(e) => {
let message = e.to_string();
assert!(message.contains("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader"), "Error message should mention which project had prettier defined");
assert!(message.contains("/root/work/full-stack-foundations"), "Error message should mention potential candidates without prettier node_modules contents");
},
};
}
}

View File

@@ -1,11 +1,13 @@
const { Buffer } = require('buffer');
const { Buffer } = require("buffer");
const fs = require("fs");
const path = require("path");
const { once } = require('events');
const { once } = require("events");
const prettierContainerPath = process.argv[2];
if (prettierContainerPath == null || prettierContainerPath.length == 0) {
process.stderr.write(`Prettier path argument was not specified or empty.\nUsage: ${process.argv[0]} ${process.argv[1]} prettier/path\n`);
process.stderr.write(
`Prettier path argument was not specified or empty.\nUsage: ${process.argv[0]} ${process.argv[1]} prettier/path\n`,
);
process.exit(1);
}
fs.stat(prettierContainerPath, (err, stats) => {
@@ -19,7 +21,7 @@ fs.stat(prettierContainerPath, (err, stats) => {
process.exit(1);
}
});
const prettierPath = path.join(prettierContainerPath, 'node_modules/prettier');
const prettierPath = path.join(prettierContainerPath, "node_modules/prettier");
class Prettier {
constructor(path, prettier, config) {
@@ -34,7 +36,7 @@ class Prettier {
let config;
try {
prettier = await loadPrettier(prettierPath);
config = await prettier.resolveConfig(prettierPath) || {};
config = (await prettier.resolveConfig(prettierPath)) || {};
} catch (e) {
process.stderr.write(`Failed to load prettier: ${e}\n`);
process.exit(1);
@@ -42,7 +44,7 @@ class Prettier {
process.stderr.write(`Prettier at path '${prettierPath}' loaded successfully, config: ${JSON.stringify(config)}\n`);
process.stdin.resume();
handleBuffer(new Prettier(prettierPath, prettier, config));
})()
})();
async function handleBuffer(prettier) {
for await (const messageText of readStdin()) {
@@ -54,25 +56,29 @@ async function handleBuffer(prettier) {
continue;
}
// allow concurrent request handling by not `await`ing the message handling promise (async function)
handleMessage(message, prettier).catch(e => {
handleMessage(message, prettier).catch((e) => {
const errorMessage = message;
if ((errorMessage.params || {}).text !== undefined) {
errorMessage.params.text = "..snip..";
}
sendResponse({ id: message.id, ...makeError(`error during message '${JSON.stringify(errorMessage)}' handling: ${e}`) }); });
sendResponse({
id: message.id,
...makeError(`error during message '${JSON.stringify(errorMessage)}' handling: ${e}`),
});
});
}
}
const headerSeparator = "\r\n";
const contentLengthHeaderName = 'Content-Length';
const contentLengthHeaderName = "Content-Length";
async function* readStdin() {
let buffer = Buffer.alloc(0);
let streamEnded = false;
process.stdin.on('end', () => {
process.stdin.on("end", () => {
streamEnded = true;
});
process.stdin.on('data', (data) => {
process.stdin.on("data", (data) => {
buffer = Buffer.concat([buffer, data]);
});
@@ -80,7 +86,7 @@ async function* readStdin() {
sendResponse(makeError(errorMessage));
buffer = Buffer.alloc(0);
messageLength = null;
await once(process.stdin, 'readable');
await once(process.stdin, "readable");
streamEnded = false;
}
@@ -91,20 +97,25 @@ async function* readStdin() {
if (messageLength === null) {
while (buffer.indexOf(`${headerSeparator}${headerSeparator}`) === -1) {
if (streamEnded) {
await handleStreamEnded('Unexpected end of stream: headers not found');
await handleStreamEnded("Unexpected end of stream: headers not found");
continue main_loop;
} else if (buffer.length > contentLengthHeaderName.length * 10) {
await handleStreamEnded(`Unexpected stream of bytes: no headers end found after ${buffer.length} bytes of input`);
await handleStreamEnded(
`Unexpected stream of bytes: no headers end found after ${buffer.length} bytes of input`,
);
continue main_loop;
}
await once(process.stdin, 'readable');
await once(process.stdin, "readable");
}
const headers = buffer.subarray(0, buffer.indexOf(`${headerSeparator}${headerSeparator}`)).toString('ascii');
const contentLengthHeader = headers.split(headerSeparator)
.map(header => header.split(':'))
.filter(header => header[2] === undefined)
.filter(header => (header[1] || '').length > 0)
.find(header => (header[0] || '').trim() === contentLengthHeaderName);
const headers = buffer
.subarray(0, buffer.indexOf(`${headerSeparator}${headerSeparator}`))
.toString("ascii");
const contentLengthHeader = headers
.split(headerSeparator)
.map((header) => header.split(":"))
.filter((header) => header[2] === undefined)
.filter((header) => (header[1] || "").length > 0)
.find((header) => (header[0] || "").trim() === contentLengthHeaderName);
const contentLength = (contentLengthHeader || [])[1];
if (contentLength === undefined) {
await handleStreamEnded(`Missing or incorrect ${contentLengthHeaderName} header: ${headers}`);
@@ -114,13 +125,14 @@ async function* readStdin() {
messageLength = parseInt(contentLength, 10);
}
while (buffer.length < (headersLength + messageLength)) {
while (buffer.length < headersLength + messageLength) {
if (streamEnded) {
await handleStreamEnded(
`Unexpected end of stream: buffer length ${buffer.length} does not match expected header length ${headersLength} + body length ${messageLength}`);
`Unexpected end of stream: buffer length ${buffer.length} does not match expected header length ${headersLength} + body length ${messageLength}`,
);
continue main_loop;
}
await once(process.stdin, 'readable');
await once(process.stdin, "readable");
}
const messageEnd = headersLength + messageLength;
@@ -128,12 +140,12 @@ async function* readStdin() {
buffer = buffer.subarray(messageEnd);
headersLength = null;
messageLength = null;
yield message.toString('utf8');
yield message.toString("utf8");
}
} catch (e) {
sendResponse(makeError(`Error reading stdin: ${e}`));
} finally {
process.stdin.off('data', () => { });
process.stdin.off("data", () => {});
}
}
@@ -146,7 +158,7 @@ async function handleMessage(message, prettier) {
throw new Error(`Message id is undefined: ${JSON.stringify(message)}`);
}
if (method === 'prettier/format') {
if (method === "prettier/format") {
if (params === undefined || params.text === undefined) {
throw new Error(`Message params.text is undefined: ${JSON.stringify(message)}`);
}
@@ -156,7 +168,7 @@ async function handleMessage(message, prettier) {
let resolvedConfig = {};
if (params.options.filepath !== undefined) {
resolvedConfig = await prettier.prettier.resolveConfig(params.options.filepath) || {};
resolvedConfig = (await prettier.prettier.resolveConfig(params.options.filepath)) || {};
}
const options = {
@@ -164,21 +176,25 @@ async function handleMessage(message, prettier) {
...resolvedConfig,
parser: params.options.parser,
plugins: params.options.plugins,
path: params.options.filepath
path: params.options.filepath,
};
process.stderr.write(`Resolved config: ${JSON.stringify(resolvedConfig)}, will format file '${params.options.filepath || ''}' with options: ${JSON.stringify(options)}\n`);
process.stderr.write(
`Resolved config: ${JSON.stringify(resolvedConfig)}, will format file '${
params.options.filepath || ""
}' with options: ${JSON.stringify(options)}\n`,
);
const formattedText = await prettier.prettier.format(params.text, options);
sendResponse({ id, result: { text: formattedText } });
} else if (method === 'prettier/clear_cache') {
} else if (method === "prettier/clear_cache") {
prettier.prettier.clearConfigCache();
prettier.config = await prettier.prettier.resolveConfig(prettier.path) || {};
prettier.config = (await prettier.prettier.resolveConfig(prettier.path)) || {};
sendResponse({ id, result: null });
} else if (method === 'initialize') {
} else if (method === "initialize") {
sendResponse({
id: id || 0,
id,
result: {
"capabilities": {}
}
capabilities: {},
},
});
} else {
throw new Error(`Unknown method: ${method}`);
@@ -188,18 +204,20 @@ async function handleMessage(message, prettier) {
function makeError(message) {
return {
error: {
"code": -32600, // invalid request code
code: -32600, // invalid request code
message,
}
},
};
}
function sendResponse(response) {
const responsePayloadString = JSON.stringify({
jsonrpc: "2.0",
...response
...response,
});
const headers = `${contentLengthHeaderName}: ${Buffer.byteLength(responsePayloadString)}${headerSeparator}${headerSeparator}`;
const headers = `${contentLengthHeaderName}: ${Buffer.byteLength(
responsePayloadString,
)}${headerSeparator}${headerSeparator}`;
process.stdout.write(headers + responsePayloadString);
}

View File

@@ -1,5 +1,5 @@
use anyhow::Context;
use collections::HashMap;
use collections::{HashMap, HashSet};
use fs2::Fs;
use gpui2::{AsyncAppContext, Model};
use language2::{language_settings::language_settings, Buffer, Diff};
@@ -7,11 +7,10 @@ use lsp2::{LanguageServer, LanguageServerId};
use node_runtime::NodeRuntime;
use serde::{Deserialize, Serialize};
use std::{
collections::VecDeque,
path::{Path, PathBuf},
sync::Arc,
};
use util::paths::DEFAULT_PRETTIER_DIR;
use util::paths::{PathMatcher, DEFAULT_PRETTIER_DIR};
pub enum Prettier {
Real(RealPrettier),
@@ -20,7 +19,6 @@ pub enum Prettier {
}
pub struct RealPrettier {
worktree_id: Option<usize>,
default: bool,
prettier_dir: PathBuf,
server: Arc<LanguageServer>,
@@ -28,17 +26,10 @@ pub struct RealPrettier {
#[cfg(any(test, feature = "test-support"))]
pub struct TestPrettier {
worktree_id: Option<usize>,
prettier_dir: PathBuf,
default: bool,
}
#[derive(Debug)]
pub struct LocateStart {
pub worktree_root_path: Arc<Path>,
pub starting_path: Arc<Path>,
}
pub const PRETTIER_SERVER_FILE: &str = "prettier_server.js";
pub const PRETTIER_SERVER_JS: &str = include_str!("./prettier_server.js");
const PRETTIER_PACKAGE_NAME: &str = "prettier";
@@ -63,79 +54,106 @@ impl Prettier {
".editorconfig",
];
pub async fn locate(
starting_path: Option<LocateStart>,
fs: Arc<dyn Fs>,
) -> anyhow::Result<PathBuf> {
fn is_node_modules(path_component: &std::path::Component<'_>) -> bool {
path_component.as_os_str().to_string_lossy() == "node_modules"
pub async fn locate_prettier_installation(
fs: &dyn Fs,
installed_prettiers: &HashSet<PathBuf>,
locate_from: &Path,
) -> anyhow::Result<Option<PathBuf>> {
let mut path_to_check = locate_from
.components()
.take_while(|component| component.as_os_str().to_string_lossy() != "node_modules")
.collect::<PathBuf>();
let path_to_check_metadata = fs
.metadata(&path_to_check)
.await
.with_context(|| format!("failed to get metadata for initial path {path_to_check:?}"))?
.with_context(|| format!("empty metadata for initial path {path_to_check:?}"))?;
if !path_to_check_metadata.is_dir {
path_to_check.pop();
}
let paths_to_check = match starting_path.as_ref() {
Some(starting_path) => {
let worktree_root = starting_path
.worktree_root_path
.components()
.into_iter()
.take_while(|path_component| !is_node_modules(path_component))
.collect::<PathBuf>();
if worktree_root != starting_path.worktree_root_path.as_ref() {
vec![worktree_root]
let mut project_path_with_prettier_dependency = None;
loop {
if installed_prettiers.contains(&path_to_check) {
log::debug!("Found prettier path {path_to_check:?} in installed prettiers");
return Ok(Some(path_to_check));
} else if let Some(package_json_contents) =
read_package_json(fs, &path_to_check).await?
{
if has_prettier_in_package_json(&package_json_contents) {
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");
return Ok(Some(path_to_check));
} else if project_path_with_prettier_dependency.is_none() {
project_path_with_prettier_dependency = Some(path_to_check.clone());
}
} else {
if starting_path.starting_path.as_ref() == Path::new("") {
worktree_root
.parent()
.map(|path| vec![path.to_path_buf()])
.unwrap_or_default()
} else {
let file_to_format = starting_path.starting_path.as_ref();
let mut paths_to_check = VecDeque::new();
let mut current_path = worktree_root;
for path_component in file_to_format.components().into_iter() {
let new_path = current_path.join(path_component);
let old_path = std::mem::replace(&mut current_path, new_path);
paths_to_check.push_front(old_path);
if is_node_modules(&path_component) {
break;
}
match package_json_contents.get("workspaces") {
Some(serde_json::Value::Array(workspaces)) => {
match &project_path_with_prettier_dependency {
Some(project_path_with_prettier_dependency) => {
let subproject_path = project_path_with_prettier_dependency.strip_prefix(&path_to_check).expect("traversing path parents, should be able to strip prefix");
if workspaces.iter().filter_map(|value| {
if let serde_json::Value::String(s) = value {
Some(s.clone())
} else {
log::warn!("Skipping non-string 'workspaces' value: {value:?}");
None
}
}).any(|workspace_definition| {
if let Some(path_matcher) = PathMatcher::new(&workspace_definition).ok() {
path_matcher.is_match(subproject_path)
} else {
workspace_definition == subproject_path.to_string_lossy()
}
}) {
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:?}");
return Ok(Some(path_to_check));
} 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:?}");
}
}
None => {
log::warn!("Skipping path {path_to_check:?} that has prettier in its 'node_modules' subdirectory, but has no prettier in its package.json");
}
}
},
Some(unknown) => log::error!("Failed to parse workspaces for {path_to_check:?} from package.json, got {unknown:?}. Skipping."),
None => log::warn!("Skipping path {path_to_check:?} that has no prettier dependency and no workspaces section in its package.json"),
}
Vec::from(paths_to_check)
}
}
if !path_to_check.pop() {
match project_path_with_prettier_dependency {
Some(closest_prettier_discovered) => {
anyhow::bail!("No prettier found in node_modules for ancestors of {locate_from:?}, but discovered prettier package.json dependency in {closest_prettier_discovered:?}")
}
None => {
log::debug!("Found no prettier in ancestors of {locate_from:?}");
return Ok(None);
}
}
}
None => Vec::new(),
};
match find_closest_prettier_dir(paths_to_check, fs.as_ref())
.await
.with_context(|| format!("finding prettier starting with {starting_path:?}"))?
{
Some(prettier_dir) => Ok(prettier_dir),
None => Ok(DEFAULT_PRETTIER_DIR.to_path_buf()),
}
}
#[cfg(any(test, feature = "test-support"))]
pub async fn start(
worktree_id: Option<usize>,
_: LanguageServerId,
prettier_dir: PathBuf,
_: Arc<dyn NodeRuntime>,
_: AsyncAppContext,
) -> anyhow::Result<Self> {
Ok(
#[cfg(any(test, feature = "test-support"))]
Self::Test(TestPrettier {
worktree_id,
default: prettier_dir == DEFAULT_PRETTIER_DIR.as_path(),
prettier_dir,
}),
)
Ok(Self::Test(TestPrettier {
default: prettier_dir == DEFAULT_PRETTIER_DIR.as_path(),
prettier_dir,
}))
}
#[cfg(not(any(test, feature = "test-support")))]
pub async fn start(
worktree_id: Option<usize>,
server_id: LanguageServerId,
prettier_dir: PathBuf,
node: Arc<dyn NodeRuntime>,
@@ -174,7 +192,6 @@ impl Prettier {
.await
.context("prettier server initialization")?;
Ok(Self::Real(RealPrettier {
worktree_id,
server,
default: prettier_dir == DEFAULT_PRETTIER_DIR.as_path(),
prettier_dir,
@@ -370,64 +387,61 @@ impl Prettier {
Self::Test(test_prettier) => &test_prettier.prettier_dir,
}
}
pub fn worktree_id(&self) -> Option<usize> {
match self {
Self::Real(local) => local.worktree_id,
#[cfg(any(test, feature = "test-support"))]
Self::Test(test_prettier) => test_prettier.worktree_id,
}
}
}
async fn find_closest_prettier_dir(
paths_to_check: Vec<PathBuf>,
fs: &dyn Fs,
) -> anyhow::Result<Option<PathBuf>> {
for path in paths_to_check {
let possible_package_json = path.join("package.json");
if let Some(package_json_metadata) = fs
.metadata(&possible_package_json)
.await
.with_context(|| format!("Fetching metadata for {possible_package_json:?}"))?
{
if !package_json_metadata.is_dir && !package_json_metadata.is_symlink {
let package_json_contents = fs
.load(&possible_package_json)
.await
.with_context(|| format!("reading {possible_package_json:?} file contents"))?;
if let Ok(json_contents) = serde_json::from_str::<HashMap<String, serde_json::Value>>(
&package_json_contents,
) {
if let Some(serde_json::Value::Object(o)) = json_contents.get("dependencies") {
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return Ok(Some(path));
}
}
if let Some(serde_json::Value::Object(o)) = json_contents.get("devDependencies")
{
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return Ok(Some(path));
}
}
}
}
}
async fn has_prettier_in_node_modules(fs: &dyn Fs, path: &Path) -> anyhow::Result<bool> {
let possible_node_modules_location = path.join("node_modules").join(PRETTIER_PACKAGE_NAME);
if let Some(node_modules_location_metadata) = fs
.metadata(&possible_node_modules_location)
.await
.with_context(|| format!("fetching metadata for {possible_node_modules_location:?}"))?
{
return Ok(node_modules_location_metadata.is_dir);
}
Ok(false)
}
let possible_node_modules_location = path.join("node_modules").join(PRETTIER_PACKAGE_NAME);
if let Some(node_modules_location_metadata) = fs
.metadata(&possible_node_modules_location)
.await
.with_context(|| format!("fetching metadata for {possible_node_modules_location:?}"))?
{
if node_modules_location_metadata.is_dir {
return Ok(Some(path));
}
async fn read_package_json(
fs: &dyn Fs,
path: &Path,
) -> anyhow::Result<Option<HashMap<String, serde_json::Value>>> {
let possible_package_json = path.join("package.json");
if let Some(package_json_metadata) = fs
.metadata(&possible_package_json)
.await
.with_context(|| format!("fetching metadata for package json {possible_package_json:?}"))?
{
if !package_json_metadata.is_dir && !package_json_metadata.is_symlink {
let package_json_contents = fs
.load(&possible_package_json)
.await
.with_context(|| format!("reading {possible_package_json:?} file contents"))?;
return serde_json::from_str::<HashMap<String, serde_json::Value>>(
&package_json_contents,
)
.map(Some)
.with_context(|| format!("parsing {possible_package_json:?} file contents"));
}
}
Ok(None)
}
fn has_prettier_in_package_json(
package_json_contents: &HashMap<String, serde_json::Value>,
) -> bool {
if let Some(serde_json::Value::Object(o)) = package_json_contents.get("dependencies") {
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return true;
}
}
if let Some(serde_json::Value::Object(o)) = package_json_contents.get("devDependencies") {
if o.contains_key(PRETTIER_PACKAGE_NAME) {
return true;
}
}
false
}
enum Format {}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
@@ -466,3 +480,316 @@ impl lsp2::request::Request for ClearCache {
type Result = ();
const METHOD: &'static str = "prettier/clear_cache";
}
#[cfg(test)]
mod tests {
use fs2::FakeFs;
use serde_json::json;
use super::*;
#[gpui2::test]
async fn test_prettier_lookup_finds_nothing(cx: &mut gpui2::TestAppContext) {
let fs = FakeFs::new(cx.executor().clone());
fs.insert_tree(
"/root",
json!({
".config": {
"zed": {
"settings.json": r#"{ "formatter": "auto" }"#,
},
},
"work": {
"project": {
"src": {
"index.js": "// index.js file contents",
},
"node_modules": {
"expect": {
"build": {
"print.js": "// print.js file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.5.1"
}
}"#,
},
"prettier": {
"index.js": "// Dummy prettier package file",
},
},
"package.json": r#"{}"#
},
}
}),
)
.await;
assert!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/.config/zed/settings.json"),
)
.await
.unwrap()
.is_none(),
"Should successfully find no prettier for path hierarchy without it"
);
assert!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/project/src/index.js")
)
.await
.unwrap()
.is_none(),
"Should successfully find no prettier for path hierarchy that has node_modules with prettier, but no package.json mentions of it"
);
assert!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/project/node_modules/expect/build/print.js")
)
.await
.unwrap()
.is_none(),
"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"
);
}
#[gpui2::test]
async fn test_prettier_lookup_in_simple_npm_projects(cx: &mut gpui2::TestAppContext) {
let fs = FakeFs::new(cx.executor().clone());
fs.insert_tree(
"/root",
json!({
"web_blog": {
"node_modules": {
"prettier": {
"index.js": "// Dummy prettier package file",
},
"expect": {
"build": {
"print.js": "// print.js file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.5.1"
}
}"#,
},
},
"pages": {
"[slug].tsx": "// [slug].tsx file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.3.0"
},
"prettier": {
"semi": false,
"printWidth": 80,
"htmlWhitespaceSensitivity": "strict",
"tabWidth": 4
}
}"#
}
}),
)
.await;
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/web_blog/pages/[slug].tsx")
)
.await
.unwrap(),
Some(PathBuf::from("/root/web_blog")),
"Should find a preinstalled prettier in the project root"
);
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/web_blog/node_modules/expect/build/print.js")
)
.await
.unwrap(),
Some(PathBuf::from("/root/web_blog")),
"Should find a preinstalled prettier in the project root even for node_modules files"
);
}
#[gpui2::test]
async fn test_prettier_lookup_for_not_installed(cx: &mut gpui2::TestAppContext) {
let fs = FakeFs::new(cx.executor().clone());
fs.insert_tree(
"/root",
json!({
"work": {
"web_blog": {
"pages": {
"[slug].tsx": "// [slug].tsx file contents",
},
"package.json": r#"{
"devDependencies": {
"prettier": "2.3.0"
},
"prettier": {
"semi": false,
"printWidth": 80,
"htmlWhitespaceSensitivity": "strict",
"tabWidth": 4
}
}"#
}
}
}),
)
.await;
let path = "/root/work/web_blog/node_modules/pages/[slug].tsx";
match Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new(path)
)
.await {
Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"),
Err(e) => {
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 potential candidates without prettier node_modules contents");
},
};
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/pages/[slug].tsx")
)
.await
.unwrap(),
Some(PathBuf::from("/root/work")),
"Should return first cached value found without path checks"
);
}
#[gpui2::test]
async fn test_prettier_lookup_in_npm_workspaces(cx: &mut gpui2::TestAppContext) {
let fs = FakeFs::new(cx.executor().clone());
fs.insert_tree(
"/root",
json!({
"work": {
"full-stack-foundations": {
"exercises": {
"03.loading": {
"01.problem.loader": {
"app": {
"routes": {
"users+": {
"$username_+": {
"notes.tsx": "// notes.tsx file contents",
},
},
},
},
"node_modules": {},
"package.json": r#"{
"devDependencies": {
"prettier": "^3.0.3"
}
}"#
},
},
},
"package.json": r#"{
"workspaces": ["exercises/*/*", "examples/*"]
}"#,
"node_modules": {
"prettier": {
"index.js": "// Dummy prettier package file",
},
},
},
}
}),
)
.await;
assert_eq!(
Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx"),
).await.unwrap(),
Some(PathBuf::from("/root/work/full-stack-foundations")),
"Should ascend to the multi-workspace root and find the prettier there",
);
}
#[gpui2::test]
async fn test_prettier_lookup_in_npm_workspaces_for_not_installed(
cx: &mut gpui2::TestAppContext,
) {
let fs = FakeFs::new(cx.executor().clone());
fs.insert_tree(
"/root",
json!({
"work": {
"full-stack-foundations": {
"exercises": {
"03.loading": {
"01.problem.loader": {
"app": {
"routes": {
"users+": {
"$username_+": {
"notes.tsx": "// notes.tsx file contents",
},
},
},
},
"node_modules": {},
"package.json": r#"{
"devDependencies": {
"prettier": "^3.0.3"
}
}"#
},
},
},
"package.json": r#"{
"workspaces": ["exercises/*/*", "examples/*"]
}"#,
},
}
}),
)
.await;
match Prettier::locate_prettier_installation(
fs.as_ref(),
&HashSet::default(),
Path::new("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader/app/routes/users+/$username_+/notes.tsx")
)
.await {
Ok(path) => panic!("Expected to fail for prettier in package.json but not in node_modules found, but got path {path:?}"),
Err(e) => {
let message = e.to_string();
assert!(message.contains("/root/work/full-stack-foundations/exercises/03.loading/01.problem.loader"), "Error message should mention which project had prettier defined");
assert!(message.contains("/root/work/full-stack-foundations"), "Error message should mention potential candidates without prettier node_modules contents");
},
};
}
}

View File

@@ -1,11 +1,13 @@
const { Buffer } = require('buffer');
const { Buffer } = require("buffer");
const fs = require("fs");
const path = require("path");
const { once } = require('events');
const { once } = require("events");
const prettierContainerPath = process.argv[2];
if (prettierContainerPath == null || prettierContainerPath.length == 0) {
process.stderr.write(`Prettier path argument was not specified or empty.\nUsage: ${process.argv[0]} ${process.argv[1]} prettier/path\n`);
process.stderr.write(
`Prettier path argument was not specified or empty.\nUsage: ${process.argv[0]} ${process.argv[1]} prettier/path\n`,
);
process.exit(1);
}
fs.stat(prettierContainerPath, (err, stats) => {
@@ -19,7 +21,7 @@ fs.stat(prettierContainerPath, (err, stats) => {
process.exit(1);
}
});
const prettierPath = path.join(prettierContainerPath, 'node_modules/prettier');
const prettierPath = path.join(prettierContainerPath, "node_modules/prettier");
class Prettier {
constructor(path, prettier, config) {
@@ -34,7 +36,7 @@ class Prettier {
let config;
try {
prettier = await loadPrettier(prettierPath);
config = await prettier.resolveConfig(prettierPath) || {};
config = (await prettier.resolveConfig(prettierPath)) || {};
} catch (e) {
process.stderr.write(`Failed to load prettier: ${e}\n`);
process.exit(1);
@@ -42,7 +44,7 @@ class Prettier {
process.stderr.write(`Prettier at path '${prettierPath}' loaded successfully, config: ${JSON.stringify(config)}\n`);
process.stdin.resume();
handleBuffer(new Prettier(prettierPath, prettier, config));
})()
})();
async function handleBuffer(prettier) {
for await (const messageText of readStdin()) {
@@ -54,22 +56,29 @@ async function handleBuffer(prettier) {
continue;
}
// allow concurrent request handling by not `await`ing the message handling promise (async function)
handleMessage(message, prettier).catch(e => {
sendResponse({ id: message.id, ...makeError(`error during message handling: ${e}`) });
handleMessage(message, prettier).catch((e) => {
const errorMessage = message;
if ((errorMessage.params || {}).text !== undefined) {
errorMessage.params.text = "..snip..";
}
sendResponse({
id: message.id,
...makeError(`error during message '${JSON.stringify(errorMessage)}' handling: ${e}`),
});
});
}
}
const headerSeparator = "\r\n";
const contentLengthHeaderName = 'Content-Length';
const contentLengthHeaderName = "Content-Length";
async function* readStdin() {
let buffer = Buffer.alloc(0);
let streamEnded = false;
process.stdin.on('end', () => {
process.stdin.on("end", () => {
streamEnded = true;
});
process.stdin.on('data', (data) => {
process.stdin.on("data", (data) => {
buffer = Buffer.concat([buffer, data]);
});
@@ -77,7 +86,7 @@ async function* readStdin() {
sendResponse(makeError(errorMessage));
buffer = Buffer.alloc(0);
messageLength = null;
await once(process.stdin, 'readable');
await once(process.stdin, "readable");
streamEnded = false;
}
@@ -88,20 +97,25 @@ async function* readStdin() {
if (messageLength === null) {
while (buffer.indexOf(`${headerSeparator}${headerSeparator}`) === -1) {
if (streamEnded) {
await handleStreamEnded('Unexpected end of stream: headers not found');
await handleStreamEnded("Unexpected end of stream: headers not found");
continue main_loop;
} else if (buffer.length > contentLengthHeaderName.length * 10) {
await handleStreamEnded(`Unexpected stream of bytes: no headers end found after ${buffer.length} bytes of input`);
await handleStreamEnded(
`Unexpected stream of bytes: no headers end found after ${buffer.length} bytes of input`,
);
continue main_loop;
}
await once(process.stdin, 'readable');
await once(process.stdin, "readable");
}
const headers = buffer.subarray(0, buffer.indexOf(`${headerSeparator}${headerSeparator}`)).toString('ascii');
const contentLengthHeader = headers.split(headerSeparator)
.map(header => header.split(':'))
.filter(header => header[2] === undefined)
.filter(header => (header[1] || '').length > 0)
.find(header => (header[0] || '').trim() === contentLengthHeaderName);
const headers = buffer
.subarray(0, buffer.indexOf(`${headerSeparator}${headerSeparator}`))
.toString("ascii");
const contentLengthHeader = headers
.split(headerSeparator)
.map((header) => header.split(":"))
.filter((header) => header[2] === undefined)
.filter((header) => (header[1] || "").length > 0)
.find((header) => (header[0] || "").trim() === contentLengthHeaderName);
const contentLength = (contentLengthHeader || [])[1];
if (contentLength === undefined) {
await handleStreamEnded(`Missing or incorrect ${contentLengthHeaderName} header: ${headers}`);
@@ -111,13 +125,14 @@ async function* readStdin() {
messageLength = parseInt(contentLength, 10);
}
while (buffer.length < (headersLength + messageLength)) {
while (buffer.length < headersLength + messageLength) {
if (streamEnded) {
await handleStreamEnded(
`Unexpected end of stream: buffer length ${buffer.length} does not match expected header length ${headersLength} + body length ${messageLength}`);
`Unexpected end of stream: buffer length ${buffer.length} does not match expected header length ${headersLength} + body length ${messageLength}`,
);
continue main_loop;
}
await once(process.stdin, 'readable');
await once(process.stdin, "readable");
}
const messageEnd = headersLength + messageLength;
@@ -125,12 +140,12 @@ async function* readStdin() {
buffer = buffer.subarray(messageEnd);
headersLength = null;
messageLength = null;
yield message.toString('utf8');
yield message.toString("utf8");
}
} catch (e) {
sendResponse(makeError(`Error reading stdin: ${e}`));
} finally {
process.stdin.off('data', () => { });
process.stdin.off("data", () => {});
}
}
@@ -143,7 +158,7 @@ async function handleMessage(message, prettier) {
throw new Error(`Message id is undefined: ${JSON.stringify(message)}`);
}
if (method === 'prettier/format') {
if (method === "prettier/format") {
if (params === undefined || params.text === undefined) {
throw new Error(`Message params.text is undefined: ${JSON.stringify(message)}`);
}
@@ -153,7 +168,7 @@ async function handleMessage(message, prettier) {
let resolvedConfig = {};
if (params.options.filepath !== undefined) {
resolvedConfig = await prettier.prettier.resolveConfig(params.options.filepath) || {};
resolvedConfig = (await prettier.prettier.resolveConfig(params.options.filepath)) || {};
}
const options = {
@@ -161,21 +176,25 @@ async function handleMessage(message, prettier) {
...resolvedConfig,
parser: params.options.parser,
plugins: params.options.plugins,
path: params.options.filepath
path: params.options.filepath,
};
process.stderr.write(`Resolved config: ${JSON.stringify(resolvedConfig)}, will format file '${params.options.filepath || ''}' with options: ${JSON.stringify(options)}\n`);
process.stderr.write(
`Resolved config: ${JSON.stringify(resolvedConfig)}, will format file '${
params.options.filepath || ""
}' with options: ${JSON.stringify(options)}\n`,
);
const formattedText = await prettier.prettier.format(params.text, options);
sendResponse({ id, result: { text: formattedText } });
} else if (method === 'prettier/clear_cache') {
} else if (method === "prettier/clear_cache") {
prettier.prettier.clearConfigCache();
prettier.config = await prettier.prettier.resolveConfig(prettier.path) || {};
prettier.config = (await prettier.prettier.resolveConfig(prettier.path)) || {};
sendResponse({ id, result: null });
} else if (method === 'initialize') {
} else if (method === "initialize") {
sendResponse({
id,
result: {
"capabilities": {}
}
capabilities: {},
},
});
} else {
throw new Error(`Unknown method: ${method}`);
@@ -185,18 +204,20 @@ async function handleMessage(message, prettier) {
function makeError(message) {
return {
error: {
"code": -32600, // invalid request code
code: -32600, // invalid request code
message,
}
},
};
}
function sendResponse(response) {
const responsePayloadString = JSON.stringify({
jsonrpc: "2.0",
...response
...response,
});
const headers = `${contentLengthHeaderName}: ${Buffer.byteLength(responsePayloadString)}${headerSeparator}${headerSeparator}`;
const headers = `${contentLengthHeaderName}: ${Buffer.byteLength(
responsePayloadString,
)}${headerSeparator}${headerSeparator}`;
process.stdout.write(headers + responsePayloadString);
}

View File

@@ -54,7 +54,7 @@ use lsp_command::*;
use node_runtime::NodeRuntime;
use parking_lot::Mutex;
use postage::watch;
use prettier::{LocateStart, Prettier};
use prettier::Prettier;
use project_settings::{LspSettings, ProjectSettings};
use rand::prelude::*;
use search::SearchQuery;
@@ -82,8 +82,11 @@ use std::{
use terminals::Terminals;
use text::Anchor;
use util::{
debug_panic, defer, http::HttpClient, merge_json_value_into,
paths::LOCAL_SETTINGS_RELATIVE_PATH, post_inc, ResultExt, TryFutureExt as _,
debug_panic, defer,
http::HttpClient,
merge_json_value_into,
paths::{DEFAULT_PRETTIER_DIR, LOCAL_SETTINGS_RELATIVE_PATH},
post_inc, ResultExt, TryFutureExt as _,
};
pub use fs::*;
@@ -162,17 +165,15 @@ pub struct Project {
copilot_log_subscription: Option<lsp::Subscription>,
current_lsp_settings: HashMap<Arc<str>, LspSettings>,
node: Option<Arc<dyn NodeRuntime>>,
#[cfg(not(any(test, feature = "test-support")))]
default_prettier: Option<DefaultPrettier>,
prettier_instances: HashMap<
(Option<WorktreeId>, PathBuf),
Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>,
>,
prettiers_per_worktree: HashMap<WorktreeId, HashSet<Option<PathBuf>>>,
prettier_instances: HashMap<PathBuf, Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>>,
}
#[cfg(not(any(test, feature = "test-support")))]
struct DefaultPrettier {
installation_process: Option<Shared<Task<()>>>,
instance: Option<Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>>,
installation_process: Option<Shared<Task<Result<(), Arc<anyhow::Error>>>>>,
#[cfg(not(any(test, feature = "test-support")))]
installed_plugins: HashSet<&'static str>,
}
@@ -685,8 +686,8 @@ impl Project {
copilot_log_subscription: None,
current_lsp_settings: settings::get::<ProjectSettings>(cx).lsp.clone(),
node: Some(node),
#[cfg(not(any(test, feature = "test-support")))]
default_prettier: None,
prettiers_per_worktree: HashMap::default(),
prettier_instances: HashMap::default(),
}
})
@@ -786,8 +787,8 @@ impl Project {
copilot_log_subscription: None,
current_lsp_settings: settings::get::<ProjectSettings>(cx).lsp.clone(),
node: None,
#[cfg(not(any(test, feature = "test-support")))]
default_prettier: None,
prettiers_per_worktree: HashMap::default(),
prettier_instances: HashMap::default(),
};
for worktree in worktrees {
@@ -924,8 +925,7 @@ impl Project {
}
for (worktree, language, settings) in language_formatters_to_check {
self.install_default_formatters(worktree, &language, &settings, cx)
.detach_and_log_err(cx);
self.install_default_formatters(worktree, &language, &settings, cx);
}
// Start all the newly-enabled language servers.
@@ -2681,20 +2681,7 @@ impl Project {
let buffer_file = File::from_dyn(buffer_file.as_ref());
let worktree = buffer_file.as_ref().map(|f| f.worktree_id(cx));
let task_buffer = buffer.clone();
let prettier_installation_task =
self.install_default_formatters(worktree, &new_language, &settings, cx);
cx.spawn(|project, mut cx| async move {
prettier_installation_task.await?;
let _ = project
.update(&mut cx, |project, cx| {
project.prettier_instance_for_buffer(&task_buffer, cx)
})
.await;
anyhow::Ok(())
})
.detach_and_log_err(cx);
self.install_default_formatters(worktree, &new_language, &settings, cx);
if let Some(file) = buffer_file {
let worktree = file.worktree.clone();
if let Some(tree) = worktree.read(cx).as_local() {
@@ -4029,7 +4016,7 @@ impl Project {
}
pub fn format(
&self,
&mut self,
buffers: HashSet<ModelHandle<Buffer>>,
push_to_history: bool,
trigger: FormatTrigger,
@@ -4049,10 +4036,10 @@ impl Project {
})
.collect::<Vec<_>>();
cx.spawn(|this, mut cx| async move {
cx.spawn(|project, mut cx| async move {
// Do not allow multiple concurrent formatting requests for the
// same buffer.
this.update(&mut cx, |this, cx| {
project.update(&mut cx, |this, cx| {
buffers_with_paths_and_servers.retain(|(buffer, _, _)| {
this.buffers_being_formatted
.insert(buffer.read(cx).remote_id())
@@ -4060,7 +4047,7 @@ impl Project {
});
let _cleanup = defer({
let this = this.clone();
let this = project.clone();
let mut cx = cx.clone();
let buffers = &buffers_with_paths_and_servers;
move || {
@@ -4128,7 +4115,7 @@ impl Project {
{
format_operation = Some(FormatOperation::Lsp(
Self::format_via_lsp(
&this,
&project,
&buffer,
buffer_abs_path,
&language_server,
@@ -4163,14 +4150,14 @@ impl Project {
}
}
(Formatter::Auto, FormatOnSave::On | FormatOnSave::Off) => {
if let Some(prettier_task) = this
if let Some((prettier_path, prettier_task)) = project
.update(&mut cx, |project, cx| {
project.prettier_instance_for_buffer(buffer, cx)
}).await {
match prettier_task.await
{
Ok(prettier) => {
let buffer_path = buffer.read_with(&cx, |buffer, cx| {
let buffer_path = buffer.update(&mut cx, |buffer, cx| {
File::from_dyn(buffer.file()).map(|file| file.abs_path(cx))
});
format_operation = Some(FormatOperation::Prettier(
@@ -4180,16 +4167,35 @@ impl Project {
.context("formatting via prettier")?,
));
}
Err(e) => anyhow::bail!(
"Failed to create prettier instance for buffer during autoformatting: {e:#}"
),
Err(e) => {
project.update(&mut cx, |project, _| {
match &prettier_path {
Some(prettier_path) => {
project.prettier_instances.remove(prettier_path);
},
None => {
if let Some(default_prettier) = project.default_prettier.as_mut() {
default_prettier.instance = None;
}
},
}
});
match &prettier_path {
Some(prettier_path) => {
log::error!("Failed to create prettier instance from {prettier_path:?} for buffer during autoformatting: {e:#}");
},
None => {
log::error!("Failed to create default prettier instance for buffer during autoformatting: {e:#}");
},
}
}
}
} else if let Some((language_server, buffer_abs_path)) =
language_server.as_ref().zip(buffer_abs_path.as_ref())
{
format_operation = Some(FormatOperation::Lsp(
Self::format_via_lsp(
&this,
&project,
&buffer,
buffer_abs_path,
&language_server,
@@ -4202,14 +4208,14 @@ impl Project {
}
}
(Formatter::Prettier { .. }, FormatOnSave::On | FormatOnSave::Off) => {
if let Some(prettier_task) = this
if let Some((prettier_path, prettier_task)) = project
.update(&mut cx, |project, cx| {
project.prettier_instance_for_buffer(buffer, cx)
}).await {
match prettier_task.await
{
Ok(prettier) => {
let buffer_path = buffer.read_with(&cx, |buffer, cx| {
let buffer_path = buffer.update(&mut cx, |buffer, cx| {
File::from_dyn(buffer.file()).map(|file| file.abs_path(cx))
});
format_operation = Some(FormatOperation::Prettier(
@@ -4219,9 +4225,28 @@ impl Project {
.context("formatting via prettier")?,
));
}
Err(e) => anyhow::bail!(
"Failed to create prettier instance for buffer during formatting: {e:#}"
),
Err(e) => {
project.update(&mut cx, |project, _| {
match &prettier_path {
Some(prettier_path) => {
project.prettier_instances.remove(prettier_path);
},
None => {
if let Some(default_prettier) = project.default_prettier.as_mut() {
default_prettier.instance = None;
}
},
}
});
match &prettier_path {
Some(prettier_path) => {
log::error!("Failed to create prettier instance from {prettier_path:?} for buffer during autoformatting: {e:#}");
},
None => {
log::error!("Failed to create default prettier instance for buffer during autoformatting: {e:#}");
},
}
}
}
}
}
@@ -6431,15 +6456,25 @@ impl Project {
"Prettier config file {config_path:?} changed, reloading prettier instances for worktree {current_worktree_id}"
);
let prettiers_to_reload = self
.prettier_instances
.prettiers_per_worktree
.get(&current_worktree_id)
.iter()
.filter_map(|((worktree_id, prettier_path), prettier_task)| {
if worktree_id.is_none() || worktree_id == &Some(current_worktree_id) {
Some((*worktree_id, prettier_path.clone(), prettier_task.clone()))
} else {
None
}
.flat_map(|prettier_paths| prettier_paths.iter())
.flatten()
.filter_map(|prettier_path| {
Some((
current_worktree_id,
Some(prettier_path.clone()),
self.prettier_instances.get(prettier_path)?.clone(),
))
})
.chain(self.default_prettier.iter().filter_map(|default_prettier| {
Some((
current_worktree_id,
None,
default_prettier.instance.clone()?,
))
}))
.collect::<Vec<_>>();
cx.background()
@@ -6450,9 +6485,15 @@ impl Project {
.clear_cache()
.await
.with_context(|| {
format!(
"clearing prettier {prettier_path:?} cache for worktree {worktree_id:?} on prettier settings update"
)
match prettier_path {
Some(prettier_path) => format!(
"clearing prettier {prettier_path:?} cache for worktree {worktree_id:?} on prettier settings update"
),
None => format!(
"clearing default prettier cache for worktree {worktree_id:?} on prettier settings update"
),
}
})
.map_err(Arc::new)
}
@@ -8364,7 +8405,12 @@ impl Project {
&mut self,
buffer: &ModelHandle<Buffer>,
cx: &mut ModelContext<Self>,
) -> Task<Option<Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>>> {
) -> Task<
Option<(
Option<PathBuf>,
Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>,
)>,
> {
let buffer = buffer.read(cx);
let buffer_file = buffer.file();
let Some(buffer_language) = buffer.language() else {
@@ -8374,136 +8420,119 @@ impl Project {
return Task::ready(None);
}
let buffer_file = File::from_dyn(buffer_file);
let buffer_path = buffer_file.map(|file| Arc::clone(file.path()));
let worktree_path = buffer_file
.as_ref()
.and_then(|file| Some(file.worktree.read(cx).abs_path()));
let worktree_id = buffer_file.map(|file| file.worktree_id(cx));
if self.is_local() || worktree_id.is_none() || worktree_path.is_none() {
if self.is_local() {
let Some(node) = self.node.as_ref().map(Arc::clone) else {
return Task::ready(None);
};
cx.spawn(|this, mut cx| async move {
let fs = this.update(&mut cx, |project, _| Arc::clone(&project.fs));
let prettier_dir = match cx
.background()
.spawn(Prettier::locate(
worktree_path.zip(buffer_path).map(
|(worktree_root_path, starting_path)| LocateStart {
worktree_root_path,
starting_path,
},
),
fs,
))
.await
{
Ok(path) => path,
Err(e) => {
return Some(
Task::ready(Err(Arc::new(e.context(
"determining prettier path for worktree {worktree_path:?}",
))))
.shared(),
);
}
};
if let Some(existing_prettier) = this.update(&mut cx, |project, _| {
project
.prettier_instances
.get(&(worktree_id, prettier_dir.clone()))
.cloned()
}) {
return Some(existing_prettier);
}
log::info!("Found prettier in {prettier_dir:?}, starting.");
let task_prettier_dir = prettier_dir.clone();
let weak_project = this.downgrade();
let new_server_id =
this.update(&mut cx, |this, _| this.languages.next_language_server_id());
let new_prettier_task = cx
.spawn(|mut cx| async move {
let prettier = Prettier::start(
worktree_id.map(|id| id.to_usize()),
new_server_id,
task_prettier_dir,
node,
cx.clone(),
)
.await
.context("prettier start")
.map_err(Arc::new)?;
log::info!("Started prettier in {:?}", prettier.prettier_dir());
if let Some((project, prettier_server)) =
weak_project.upgrade(&mut cx).zip(prettier.server())
match File::from_dyn(buffer_file).map(|file| (file.worktree_id(cx), file.abs_path(cx)))
{
Some((worktree_id, buffer_path)) => {
let fs = Arc::clone(&self.fs);
let installed_prettiers = self.prettier_instances.keys().cloned().collect();
return cx.spawn(|project, mut cx| async move {
match cx
.background()
.spawn(async move {
Prettier::locate_prettier_installation(
fs.as_ref(),
&installed_prettiers,
&buffer_path,
)
.await
})
.await
{
project.update(&mut cx, |project, cx| {
let name = if prettier.is_default() {
LanguageServerName(Arc::from("prettier (default)"))
} else {
let prettier_dir = prettier.prettier_dir();
let worktree_path = prettier
.worktree_id()
.map(WorktreeId::from_usize)
.and_then(|id| project.worktree_for_id(id, cx))
.map(|worktree| worktree.read(cx).abs_path());
match worktree_path {
Some(worktree_path) => {
if worktree_path.as_ref() == prettier_dir {
LanguageServerName(Arc::from(format!(
"prettier ({})",
prettier_dir
.file_name()
.and_then(|name| name.to_str())
.unwrap_or_default()
)))
} else {
let dir_to_display = match prettier_dir
.strip_prefix(&worktree_path)
.ok()
{
Some(relative_path) => relative_path,
None => prettier_dir,
};
LanguageServerName(Arc::from(format!(
"prettier ({})",
dir_to_display.display(),
)))
}
}
None => LanguageServerName(Arc::from(format!(
"prettier ({})",
prettier_dir.display(),
))),
Ok(None) => {
let started_default_prettier =
project.update(&mut cx, |project, _| {
project
.prettiers_per_worktree
.entry(worktree_id)
.or_default()
.insert(None);
project.default_prettier.as_ref().and_then(
|default_prettier| default_prettier.instance.clone(),
)
});
match started_default_prettier {
Some(old_task) => return Some((None, old_task)),
None => {
let new_default_prettier = project
.update(&mut cx, |_, cx| {
start_default_prettier(node, Some(worktree_id), cx)
})
.await;
return Some((None, new_default_prettier));
}
};
}
}
Ok(Some(prettier_dir)) => {
project.update(&mut cx, |project, _| {
project
.prettiers_per_worktree
.entry(worktree_id)
.or_default()
.insert(Some(prettier_dir.clone()))
});
if let Some(existing_prettier) =
project.update(&mut cx, |project, _| {
project.prettier_instances.get(&prettier_dir).cloned()
})
{
log::debug!(
"Found already started prettier in {prettier_dir:?}"
);
return Some((Some(prettier_dir), existing_prettier));
}
project
.supplementary_language_servers
.insert(new_server_id, (name, Arc::clone(prettier_server)));
cx.emit(Event::LanguageServerAdded(new_server_id));
});
log::info!("Found prettier in {prettier_dir:?}, starting.");
let new_prettier_task = project.update(&mut cx, |project, cx| {
let new_prettier_task = start_prettier(
node,
prettier_dir.clone(),
Some(worktree_id),
cx,
);
project
.prettier_instances
.insert(prettier_dir.clone(), new_prettier_task.clone());
new_prettier_task
});
Some((Some(prettier_dir), new_prettier_task))
}
Err(e) => {
return Some((
None,
Task::ready(Err(Arc::new(
e.context("determining prettier path"),
)))
.shared(),
));
}
}
Ok(Arc::new(prettier)).map_err(Arc::new)
})
.shared();
this.update(&mut cx, |project, _| {
project
.prettier_instances
.insert((worktree_id, prettier_dir), new_prettier_task.clone());
});
Some(new_prettier_task)
})
});
}
None => {
let started_default_prettier = self
.default_prettier
.as_ref()
.and_then(|default_prettier| default_prettier.instance.clone());
match started_default_prettier {
Some(old_task) => return Task::ready(Some((None, old_task))),
None => {
let new_task = start_default_prettier(node, None, cx);
return cx.spawn(|_, _| async move { Some((None, new_task.await)) });
}
}
}
}
} else if self.remote_id().is_some() {
return Task::ready(None);
} else {
Task::ready(Some(
Task::ready(Some((
None,
Task::ready(Err(Arc::new(anyhow!("project does not have a remote id")))).shared(),
))
)))
}
}
@@ -8514,8 +8543,7 @@ impl Project {
_new_language: &Language,
_language_settings: &LanguageSettings,
_cx: &mut ModelContext<Self>,
) -> Task<anyhow::Result<()>> {
return Task::ready(Ok(()));
) {
}
#[cfg(not(any(test, feature = "test-support")))]
@@ -8525,19 +8553,19 @@ impl Project {
new_language: &Language,
language_settings: &LanguageSettings,
cx: &mut ModelContext<Self>,
) -> Task<anyhow::Result<()>> {
) {
match &language_settings.formatter {
Formatter::Prettier { .. } | Formatter::Auto => {}
Formatter::LanguageServer | Formatter::External { .. } => return Task::ready(Ok(())),
Formatter::LanguageServer | Formatter::External { .. } => return,
};
let Some(node) = self.node.as_ref().cloned() else {
return Task::ready(Ok(()));
return;
};
let mut prettier_plugins = None;
if new_language.prettier_parser_name().is_some() {
prettier_plugins
.get_or_insert_with(|| HashSet::default())
.get_or_insert_with(|| HashSet::<&'static str>::default())
.extend(
new_language
.lsp_adapters()
@@ -8546,114 +8574,270 @@ impl Project {
)
}
let Some(prettier_plugins) = prettier_plugins else {
return Task::ready(Ok(()));
return;
};
let fs = Arc::clone(&self.fs);
let locate_prettier_installation = match worktree.and_then(|worktree_id| {
self.worktree_for_id(worktree_id, cx)
.map(|worktree| worktree.read(cx).abs_path())
}) {
Some(locate_from) => {
let installed_prettiers = self.prettier_instances.keys().cloned().collect();
cx.background().spawn(async move {
Prettier::locate_prettier_installation(
fs.as_ref(),
&installed_prettiers,
locate_from.as_ref(),
)
.await
})
}
None => Task::ready(Ok(None)),
};
let mut plugins_to_install = prettier_plugins;
let (mut install_success_tx, mut install_success_rx) =
futures::channel::mpsc::channel::<HashSet<&'static str>>(1);
let new_installation_process = cx
.spawn(|this, mut cx| async move {
if let Some(installed_plugins) = install_success_rx.next().await {
this.update(&mut cx, |this, _| {
let default_prettier =
this.default_prettier
.get_or_insert_with(|| DefaultPrettier {
installation_process: None,
installed_plugins: HashSet::default(),
});
if !installed_plugins.is_empty() {
log::info!("Installed new prettier plugins: {installed_plugins:?}");
default_prettier.installed_plugins.extend(installed_plugins);
}
})
}
})
.shared();
let previous_installation_process =
if let Some(default_prettier) = &mut self.default_prettier {
plugins_to_install
.retain(|plugin| !default_prettier.installed_plugins.contains(plugin));
if plugins_to_install.is_empty() {
return Task::ready(Ok(()));
return;
}
std::mem::replace(
&mut default_prettier.installation_process,
Some(new_installation_process.clone()),
)
default_prettier.installation_process.clone()
} else {
None
};
let default_prettier_dir = util::paths::DEFAULT_PRETTIER_DIR.as_path();
let already_running_prettier = self
.prettier_instances
.get(&(worktree, default_prettier_dir.to_path_buf()))
.cloned();
let fs = Arc::clone(&self.fs);
cx.spawn(|this, mut cx| async move {
if let Some(previous_installation_process) = previous_installation_process {
previous_installation_process.await;
}
let mut everything_was_installed = false;
this.update(&mut cx, |this, _| {
match &mut this.default_prettier {
Some(default_prettier) => {
plugins_to_install
.retain(|plugin| !default_prettier.installed_plugins.contains(plugin));
everything_was_installed = plugins_to_install.is_empty();
},
None => this.default_prettier = Some(DefaultPrettier { installation_process: Some(new_installation_process), installed_plugins: HashSet::default() }),
}
let default_prettier = self
.default_prettier
.get_or_insert_with(|| DefaultPrettier {
instance: None,
installation_process: None,
installed_plugins: HashSet::default(),
});
if everything_was_installed {
return Ok(());
}
cx.background()
.spawn(async move {
let prettier_wrapper_path = default_prettier_dir.join(prettier::PRETTIER_SERVER_FILE);
// method creates parent directory if it doesn't exist
fs.save(&prettier_wrapper_path, &text::Rope::from(prettier::PRETTIER_SERVER_JS), text::LineEnding::Unix).await
.with_context(|| format!("writing {} file at {prettier_wrapper_path:?}", prettier::PRETTIER_SERVER_FILE))?;
let packages_to_versions = future::try_join_all(
plugins_to_install
.iter()
.chain(Some(&"prettier"))
.map(|package_name| async {
let returned_package_name = package_name.to_string();
let latest_version = node.npm_package_latest_version(package_name)
.await
.with_context(|| {
format!("fetching latest npm version for package {returned_package_name}")
})?;
anyhow::Ok((returned_package_name, latest_version))
}),
)
default_prettier.installation_process = Some(
cx.spawn(|this, mut cx| async move {
match locate_prettier_installation
.await
.context("fetching latest npm versions")?;
log::info!("Fetching default prettier and plugins: {packages_to_versions:?}");
let borrowed_packages = packages_to_versions.iter().map(|(package, version)| {
(package.as_str(), version.as_str())
}).collect::<Vec<_>>();
node.npm_install_packages(default_prettier_dir, &borrowed_packages).await.context("fetching formatter packages")?;
let installed_packages = !plugins_to_install.is_empty();
install_success_tx.try_send(plugins_to_install).ok();
if !installed_packages {
if let Some(prettier) = already_running_prettier {
prettier.await.map_err(|e| anyhow::anyhow!("Default prettier startup await failure: {e:#}"))?.clear_cache().await.context("clearing default prettier cache after plugins install")?;
.context("locate prettier installation")
.map_err(Arc::new)?
{
Some(_non_default_prettier) => return Ok(()),
None => {
let mut needs_install = match previous_installation_process {
Some(previous_installation_process) => {
previous_installation_process.await.is_err()
}
None => true,
};
this.update(&mut cx, |this, _| {
if let Some(default_prettier) = &mut this.default_prettier {
plugins_to_install.retain(|plugin| {
!default_prettier.installed_plugins.contains(plugin)
});
needs_install |= !plugins_to_install.is_empty();
}
});
if needs_install {
let installed_plugins = plugins_to_install.clone();
cx.background()
.spawn(async move {
install_default_prettier(plugins_to_install, node, fs).await
})
.await
.context("prettier & plugins install")
.map_err(Arc::new)?;
this.update(&mut cx, |this, _| {
let default_prettier =
this.default_prettier
.get_or_insert_with(|| DefaultPrettier {
instance: None,
installation_process: Some(
Task::ready(Ok(())).shared(),
),
installed_plugins: HashSet::default(),
});
default_prettier.instance = None;
default_prettier.installed_plugins.extend(installed_plugins);
});
}
}
anyhow::Ok(())
}).await
})
}
Ok(())
})
.shared(),
);
}
}
fn start_default_prettier(
node: Arc<dyn NodeRuntime>,
worktree_id: Option<WorktreeId>,
cx: &mut ModelContext<'_, Project>,
) -> Task<Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>> {
cx.spawn(|project, mut cx| async move {
loop {
let default_prettier_installing = project.update(&mut cx, |project, _| {
project
.default_prettier
.as_ref()
.and_then(|default_prettier| default_prettier.installation_process.clone())
});
match default_prettier_installing {
Some(installation_task) => {
if installation_task.await.is_ok() {
break;
}
}
None => break,
}
}
project.update(&mut cx, |project, cx| {
match project
.default_prettier
.as_mut()
.and_then(|default_prettier| default_prettier.instance.as_mut())
{
Some(default_prettier) => default_prettier.clone(),
None => {
let new_default_prettier =
start_prettier(node, DEFAULT_PRETTIER_DIR.clone(), worktree_id, cx);
project
.default_prettier
.get_or_insert_with(|| DefaultPrettier {
instance: None,
installation_process: None,
#[cfg(not(any(test, feature = "test-support")))]
installed_plugins: HashSet::default(),
})
.instance = Some(new_default_prettier.clone());
new_default_prettier
}
}
})
})
}
fn start_prettier(
node: Arc<dyn NodeRuntime>,
prettier_dir: PathBuf,
worktree_id: Option<WorktreeId>,
cx: &mut ModelContext<'_, Project>,
) -> Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>> {
cx.spawn(|project, mut cx| async move {
let new_server_id = project.update(&mut cx, |project, _| {
project.languages.next_language_server_id()
});
let new_prettier = Prettier::start(new_server_id, prettier_dir, node, cx.clone())
.await
.context("default prettier spawn")
.map(Arc::new)
.map_err(Arc::new)?;
register_new_prettier(&project, &new_prettier, worktree_id, new_server_id, &mut cx);
Ok(new_prettier)
})
.shared()
}
fn register_new_prettier(
project: &ModelHandle<Project>,
prettier: &Prettier,
worktree_id: Option<WorktreeId>,
new_server_id: LanguageServerId,
cx: &mut AsyncAppContext,
) {
let prettier_dir = prettier.prettier_dir();
let is_default = prettier.is_default();
if is_default {
log::info!("Started default prettier in {prettier_dir:?}");
} else {
log::info!("Started prettier in {prettier_dir:?}");
}
if let Some(prettier_server) = prettier.server() {
project.update(cx, |project, cx| {
let name = if is_default {
LanguageServerName(Arc::from("prettier (default)"))
} else {
let worktree_path = worktree_id
.and_then(|id| project.worktree_for_id(id, cx))
.map(|worktree| worktree.update(cx, |worktree, _| worktree.abs_path()));
let name = match worktree_path {
Some(worktree_path) => {
if prettier_dir == worktree_path.as_ref() {
let name = prettier_dir
.file_name()
.and_then(|name| name.to_str())
.unwrap_or_default();
format!("prettier ({name})")
} else {
let dir_to_display = prettier_dir
.strip_prefix(worktree_path.as_ref())
.ok()
.unwrap_or(prettier_dir);
format!("prettier ({})", dir_to_display.display())
}
}
None => format!("prettier ({})", prettier_dir.display()),
};
LanguageServerName(Arc::from(name))
};
project
.supplementary_language_servers
.insert(new_server_id, (name, Arc::clone(prettier_server)));
cx.emit(Event::LanguageServerAdded(new_server_id));
});
}
}
#[cfg(not(any(test, feature = "test-support")))]
async fn install_default_prettier(
plugins_to_install: HashSet<&'static str>,
node: Arc<dyn NodeRuntime>,
fs: Arc<dyn Fs>,
) -> anyhow::Result<()> {
let prettier_wrapper_path = DEFAULT_PRETTIER_DIR.join(prettier::PRETTIER_SERVER_FILE);
// method creates parent directory if it doesn't exist
fs.save(
&prettier_wrapper_path,
&text::Rope::from(prettier::PRETTIER_SERVER_JS),
text::LineEnding::Unix,
)
.await
.with_context(|| {
format!(
"writing {} file at {prettier_wrapper_path:?}",
prettier::PRETTIER_SERVER_FILE
)
})?;
let packages_to_versions =
future::try_join_all(plugins_to_install.iter().chain(Some(&"prettier")).map(
|package_name| async {
let returned_package_name = package_name.to_string();
let latest_version = node
.npm_package_latest_version(package_name)
.await
.with_context(|| {
format!("fetching latest npm version for package {returned_package_name}")
})?;
anyhow::Ok((returned_package_name, latest_version))
},
))
.await
.context("fetching latest npm versions")?;
log::info!("Fetching default prettier and plugins: {packages_to_versions:?}");
let borrowed_packages = packages_to_versions
.iter()
.map(|(package, version)| (package.as_str(), version.as_str()))
.collect::<Vec<_>>();
node.npm_install_packages(DEFAULT_PRETTIER_DIR.as_path(), &borrowed_packages)
.await
.context("fetching formatter packages")?;
anyhow::Ok(())
}
fn subscribe_for_copilot_events(
copilot: &ModelHandle<Copilot>,
cx: &mut ModelContext<'_, Project>,

View File

@@ -1,4 +1,4 @@
use crate::{search::PathMatcher, worktree::WorktreeModelHandle, Event, *};
use crate::{worktree::WorktreeModelHandle, Event, *};
use fs::{FakeFs, RealFs};
use futures::{future, StreamExt};
use gpui::{executor::Deterministic, test::subscribe, AppContext};
@@ -13,7 +13,7 @@ use pretty_assertions::assert_eq;
use serde_json::json;
use std::{cell::RefCell, os::unix, rc::Rc, task::Poll};
use unindent::Unindent as _;
use util::{assert_set_eq, test::temp_tree};
use util::{assert_set_eq, paths::PathMatcher, test::temp_tree};
#[cfg(test)]
#[ctor::ctor]

View File

@@ -1,7 +1,6 @@
use aho_corasick::{AhoCorasick, AhoCorasickBuilder};
use anyhow::{Context, Result};
use client::proto;
use globset::{Glob, GlobMatcher};
use itertools::Itertools;
use language::{char_kind, BufferSnapshot};
use regex::{Regex, RegexBuilder};
@@ -10,9 +9,10 @@ use std::{
borrow::Cow,
io::{BufRead, BufReader, Read},
ops::Range,
path::{Path, PathBuf},
path::Path,
sync::Arc,
};
use util::paths::PathMatcher;
#[derive(Clone, Debug)]
pub struct SearchInputs {
@@ -52,31 +52,6 @@ pub enum SearchQuery {
},
}
#[derive(Clone, Debug)]
pub struct PathMatcher {
maybe_path: PathBuf,
glob: GlobMatcher,
}
impl std::fmt::Display for PathMatcher {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.maybe_path.to_string_lossy().fmt(f)
}
}
impl PathMatcher {
pub fn new(maybe_glob: &str) -> Result<Self, globset::Error> {
Ok(PathMatcher {
glob: Glob::new(&maybe_glob)?.compile_matcher(),
maybe_path: PathBuf::from(maybe_glob),
})
}
pub fn is_match<P: AsRef<Path>>(&self, other: P) -> bool {
other.as_ref().starts_with(&self.maybe_path) || self.glob.is_match(other)
}
}
impl SearchQuery {
pub fn text(
query: impl ToString,

View File

@@ -54,7 +54,7 @@ use lsp_command::*;
use node_runtime::NodeRuntime;
use parking_lot::Mutex;
use postage::watch;
use prettier2::{LocateStart, Prettier};
use prettier2::Prettier;
use project_settings::{LspSettings, ProjectSettings};
use rand::prelude::*;
use search::SearchQuery;
@@ -82,8 +82,11 @@ use std::{
use terminals::Terminals;
use text::Anchor;
use util::{
debug_panic, defer, http::HttpClient, merge_json_value_into,
paths::LOCAL_SETTINGS_RELATIVE_PATH, post_inc, ResultExt, TryFutureExt as _,
debug_panic, defer,
http::HttpClient,
merge_json_value_into,
paths::{DEFAULT_PRETTIER_DIR, LOCAL_SETTINGS_RELATIVE_PATH},
post_inc, ResultExt, TryFutureExt as _,
};
pub use fs2::*;
@@ -162,17 +165,15 @@ pub struct Project {
copilot_log_subscription: Option<lsp2::Subscription>,
current_lsp_settings: HashMap<Arc<str>, LspSettings>,
node: Option<Arc<dyn NodeRuntime>>,
#[cfg(not(any(test, feature = "test-support")))]
default_prettier: Option<DefaultPrettier>,
prettier_instances: HashMap<
(Option<WorktreeId>, PathBuf),
Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>,
>,
prettiers_per_worktree: HashMap<WorktreeId, HashSet<Option<PathBuf>>>,
prettier_instances: HashMap<PathBuf, Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>>,
}
#[cfg(not(any(test, feature = "test-support")))]
struct DefaultPrettier {
installation_process: Option<Shared<Task<()>>>,
instance: Option<Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>>,
installation_process: Option<Shared<Task<Result<(), Arc<anyhow::Error>>>>>,
#[cfg(not(any(test, feature = "test-support")))]
installed_plugins: HashSet<&'static str>,
}
@@ -686,8 +687,8 @@ impl Project {
copilot_log_subscription: None,
current_lsp_settings: ProjectSettings::get_global(cx).lsp.clone(),
node: Some(node),
#[cfg(not(any(test, feature = "test-support")))]
default_prettier: None,
prettiers_per_worktree: HashMap::default(),
prettier_instances: HashMap::default(),
}
})
@@ -789,8 +790,8 @@ impl Project {
copilot_log_subscription: None,
current_lsp_settings: ProjectSettings::get_global(cx).lsp.clone(),
node: None,
#[cfg(not(any(test, feature = "test-support")))]
default_prettier: None,
prettiers_per_worktree: HashMap::default(),
prettier_instances: HashMap::default(),
};
for worktree in worktrees {
@@ -963,8 +964,7 @@ impl Project {
}
for (worktree, language, settings) in language_formatters_to_check {
self.install_default_formatters(worktree, &language, &settings, cx)
.detach_and_log_err(cx);
self.install_default_formatters(worktree, &language, &settings, cx);
}
// Start all the newly-enabled language servers.
@@ -2722,20 +2722,7 @@ impl Project {
let buffer_file = File::from_dyn(buffer_file.as_ref());
let worktree = buffer_file.as_ref().map(|f| f.worktree_id(cx));
let task_buffer = buffer.clone();
let prettier_installation_task =
self.install_default_formatters(worktree, &new_language, &settings, cx);
cx.spawn(move |project, mut cx| async move {
prettier_installation_task.await?;
let _ = project
.update(&mut cx, |project, cx| {
project.prettier_instance_for_buffer(&task_buffer, cx)
})?
.await;
anyhow::Ok(())
})
.detach_and_log_err(cx);
self.install_default_formatters(worktree, &new_language, &settings, cx);
if let Some(file) = buffer_file {
let worktree = file.worktree.clone();
if let Some(tree) = worktree.read(cx).as_local() {
@@ -4098,7 +4085,7 @@ impl Project {
}
pub fn format(
&self,
&mut self,
buffers: HashSet<Model<Buffer>>,
push_to_history: bool,
trigger: FormatTrigger,
@@ -4118,10 +4105,10 @@ impl Project {
})
.collect::<Vec<_>>();
cx.spawn(move |this, mut cx| async move {
cx.spawn(move |project, mut cx| async move {
// Do not allow multiple concurrent formatting requests for the
// same buffer.
this.update(&mut cx, |this, cx| {
project.update(&mut cx, |this, cx| {
buffers_with_paths_and_servers.retain(|(buffer, _, _)| {
this.buffers_being_formatted
.insert(buffer.read(cx).remote_id())
@@ -4129,7 +4116,7 @@ impl Project {
})?;
let _cleanup = defer({
let this = this.clone();
let this = project.clone();
let mut cx = cx.clone();
let buffers = &buffers_with_paths_and_servers;
move || {
@@ -4197,7 +4184,7 @@ impl Project {
{
format_operation = Some(FormatOperation::Lsp(
Self::format_via_lsp(
&this,
&project,
&buffer,
buffer_abs_path,
&language_server,
@@ -4232,7 +4219,7 @@ impl Project {
}
}
(Formatter::Auto, FormatOnSave::On | FormatOnSave::Off) => {
if let Some(prettier_task) = this
if let Some((prettier_path, prettier_task)) = project
.update(&mut cx, |project, cx| {
project.prettier_instance_for_buffer(buffer, cx)
})?.await {
@@ -4249,16 +4236,35 @@ impl Project {
.context("formatting via prettier")?,
));
}
Err(e) => anyhow::bail!(
"Failed to create prettier instance for buffer during autoformatting: {e:#}"
),
Err(e) => {
project.update(&mut cx, |project, _| {
match &prettier_path {
Some(prettier_path) => {
project.prettier_instances.remove(prettier_path);
},
None => {
if let Some(default_prettier) = project.default_prettier.as_mut() {
default_prettier.instance = None;
}
},
}
})?;
match &prettier_path {
Some(prettier_path) => {
log::error!("Failed to create prettier instance from {prettier_path:?} for buffer during autoformatting: {e:#}");
},
None => {
log::error!("Failed to create default prettier instance for buffer during autoformatting: {e:#}");
},
}
}
}
} else if let Some((language_server, buffer_abs_path)) =
language_server.as_ref().zip(buffer_abs_path.as_ref())
{
format_operation = Some(FormatOperation::Lsp(
Self::format_via_lsp(
&this,
&project,
&buffer,
buffer_abs_path,
&language_server,
@@ -4271,7 +4277,7 @@ impl Project {
}
}
(Formatter::Prettier { .. }, FormatOnSave::On | FormatOnSave::Off) => {
if let Some(prettier_task) = this
if let Some((prettier_path, prettier_task)) = project
.update(&mut cx, |project, cx| {
project.prettier_instance_for_buffer(buffer, cx)
})?.await {
@@ -4288,9 +4294,28 @@ impl Project {
.context("formatting via prettier")?,
));
}
Err(e) => anyhow::bail!(
"Failed to create prettier instance for buffer during formatting: {e:#}"
),
Err(e) => {
project.update(&mut cx, |project, _| {
match &prettier_path {
Some(prettier_path) => {
project.prettier_instances.remove(prettier_path);
},
None => {
if let Some(default_prettier) = project.default_prettier.as_mut() {
default_prettier.instance = None;
}
},
}
})?;
match &prettier_path {
Some(prettier_path) => {
log::error!("Failed to create prettier instance from {prettier_path:?} for buffer during autoformatting: {e:#}");
},
None => {
log::error!("Failed to create default prettier instance for buffer during autoformatting: {e:#}");
},
}
}
}
}
}
@@ -6508,15 +6533,25 @@ impl Project {
"Prettier config file {config_path:?} changed, reloading prettier instances for worktree {current_worktree_id}"
);
let prettiers_to_reload = self
.prettier_instances
.prettiers_per_worktree
.get(&current_worktree_id)
.iter()
.filter_map(|((worktree_id, prettier_path), prettier_task)| {
if worktree_id.is_none() || worktree_id == &Some(current_worktree_id) {
Some((*worktree_id, prettier_path.clone(), prettier_task.clone()))
} else {
None
}
.flat_map(|prettier_paths| prettier_paths.iter())
.flatten()
.filter_map(|prettier_path| {
Some((
current_worktree_id,
Some(prettier_path.clone()),
self.prettier_instances.get(prettier_path)?.clone(),
))
})
.chain(self.default_prettier.iter().filter_map(|default_prettier| {
Some((
current_worktree_id,
None,
default_prettier.instance.clone()?,
))
}))
.collect::<Vec<_>>();
cx.executor()
@@ -6527,9 +6562,14 @@ impl Project {
.clear_cache()
.await
.with_context(|| {
format!(
"clearing prettier {prettier_path:?} cache for worktree {worktree_id:?} on prettier settings update"
)
match prettier_path {
Some(prettier_path) => format!(
"clearing prettier {prettier_path:?} cache for worktree {worktree_id:?} on prettier settings update"
),
None => format!(
"clearing default prettier cache for worktree {worktree_id:?} on prettier settings update"
),
}
})
.map_err(Arc::new)
}
@@ -8415,7 +8455,12 @@ impl Project {
&mut self,
buffer: &Model<Buffer>,
cx: &mut ModelContext<Self>,
) -> Task<Option<Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>>> {
) -> Task<
Option<(
Option<PathBuf>,
Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>,
)>,
> {
let buffer = buffer.read(cx);
let buffer_file = buffer.file();
let Some(buffer_language) = buffer.language() else {
@@ -8425,142 +8470,142 @@ impl Project {
return Task::ready(None);
}
let buffer_file = File::from_dyn(buffer_file);
let buffer_path = buffer_file.map(|file| Arc::clone(file.path()));
let worktree_path = buffer_file
.as_ref()
.and_then(|file| Some(file.worktree.read(cx).abs_path()));
let worktree_id = buffer_file.map(|file| file.worktree_id(cx));
if self.is_local() || worktree_id.is_none() || worktree_path.is_none() {
if self.is_local() {
let Some(node) = self.node.as_ref().map(Arc::clone) else {
return Task::ready(None);
};
let fs = self.fs.clone();
cx.spawn(move |this, mut cx| async move {
let prettier_dir = match cx
.executor()
.spawn(Prettier::locate(
worktree_path.zip(buffer_path).map(
|(worktree_root_path, starting_path)| LocateStart {
worktree_root_path,
starting_path,
},
),
fs,
))
.await
{
Ok(path) => path,
Err(e) => {
return Some(
Task::ready(Err(Arc::new(e.context(
"determining prettier path for worktree {worktree_path:?}",
))))
.shared(),
);
}
};
if let Some(existing_prettier) = this
.update(&mut cx, |project, _| {
project
.prettier_instances
.get(&(worktree_id, prettier_dir.clone()))
.cloned()
})
.ok()
.flatten()
{
return Some(existing_prettier);
}
log::info!("Found prettier in {prettier_dir:?}, starting.");
let task_prettier_dir = prettier_dir.clone();
let new_prettier_task = cx
.spawn({
let this = this.clone();
move |mut cx| async move {
let new_server_id = this.update(&mut cx, |this, _| {
this.languages.next_language_server_id()
})?;
let prettier = Prettier::start(
worktree_id.map(|id| id.to_usize()),
new_server_id,
task_prettier_dir,
node,
cx.clone(),
)
match File::from_dyn(buffer_file).map(|file| (file.worktree_id(cx), file.abs_path(cx)))
{
Some((worktree_id, buffer_path)) => {
let fs = Arc::clone(&self.fs);
let installed_prettiers = self.prettier_instances.keys().cloned().collect();
return cx.spawn(move |project, mut cx| async move {
match cx
.executor()
.spawn(async move {
Prettier::locate_prettier_installation(
fs.as_ref(),
&installed_prettiers,
&buffer_path,
)
.await
})
.await
.context("prettier start")
.map_err(Arc::new)?;
log::info!("Started prettier in {:?}", prettier.prettier_dir());
if let Some(prettier_server) = prettier.server() {
this.update(&mut cx, |project, cx| {
let name = if prettier.is_default() {
LanguageServerName(Arc::from("prettier (default)"))
} else {
let prettier_dir = prettier.prettier_dir();
let worktree_path = prettier
.worktree_id()
.map(WorktreeId::from_usize)
.and_then(|id| project.worktree_for_id(id, cx))
.map(|worktree| worktree.read(cx).abs_path());
match worktree_path {
Some(worktree_path) => {
if worktree_path.as_ref() == prettier_dir {
LanguageServerName(Arc::from(format!(
"prettier ({})",
prettier_dir
.file_name()
.and_then(|name| name.to_str())
.unwrap_or_default()
)))
} else {
let dir_to_display = match prettier_dir
.strip_prefix(&worktree_path)
.ok()
{
Some(relative_path) => relative_path,
None => prettier_dir,
};
LanguageServerName(Arc::from(format!(
"prettier ({})",
dir_to_display.display(),
)))
}
}
None => LanguageServerName(Arc::from(format!(
"prettier ({})",
prettier_dir.display(),
))),
}
};
{
Ok(None) => {
match project.update(&mut cx, |project, _| {
project
.supplementary_language_servers
.insert(new_server_id, (name, Arc::clone(prettier_server)));
cx.emit(Event::LanguageServerAdded(new_server_id));
})?;
.prettiers_per_worktree
.entry(worktree_id)
.or_default()
.insert(None);
project.default_prettier.as_ref().and_then(
|default_prettier| default_prettier.instance.clone(),
)
}) {
Ok(Some(old_task)) => Some((None, old_task)),
Ok(None) => {
match project.update(&mut cx, |_, cx| {
start_default_prettier(node, Some(worktree_id), cx)
}) {
Ok(new_default_prettier) => {
return Some((None, new_default_prettier.await))
}
Err(e) => {
Some((
None,
Task::ready(Err(Arc::new(e.context("project is gone during default prettier startup"))))
.shared(),
))
}
}
}
Err(e) => Some((None, Task::ready(Err(Arc::new(e.context("project is gone during default prettier checks"))))
.shared())),
}
}
Ok(Some(prettier_dir)) => {
match project.update(&mut cx, |project, _| {
project
.prettiers_per_worktree
.entry(worktree_id)
.or_default()
.insert(Some(prettier_dir.clone()));
project.prettier_instances.get(&prettier_dir).cloned()
}) {
Ok(Some(existing_prettier)) => {
log::debug!(
"Found already started prettier in {prettier_dir:?}"
);
return Some((Some(prettier_dir), existing_prettier));
}
Err(e) => {
return Some((
Some(prettier_dir),
Task::ready(Err(Arc::new(e.context("project is gone during custom prettier checks"))))
.shared(),
))
}
_ => {},
}
log::info!("Found prettier in {prettier_dir:?}, starting.");
let new_prettier_task =
match project.update(&mut cx, |project, cx| {
let new_prettier_task = start_prettier(
node,
prettier_dir.clone(),
Some(worktree_id),
cx,
);
project.prettier_instances.insert(
prettier_dir.clone(),
new_prettier_task.clone(),
);
new_prettier_task
}) {
Ok(task) => task,
Err(e) => return Some((
Some(prettier_dir),
Task::ready(Err(Arc::new(e.context("project is gone during custom prettier startup"))))
.shared()
)),
};
Some((Some(prettier_dir), new_prettier_task))
}
Err(e) => {
return Some((
None,
Task::ready(Err(Arc::new(
e.context("determining prettier path"),
)))
.shared(),
));
}
Ok(Arc::new(prettier)).map_err(Arc::new)
}
})
.shared();
this.update(&mut cx, |project, _| {
project
.prettier_instances
.insert((worktree_id, prettier_dir), new_prettier_task.clone());
})
.ok();
Some(new_prettier_task)
})
});
}
None => {
let started_default_prettier = self
.default_prettier
.as_ref()
.and_then(|default_prettier| default_prettier.instance.clone());
match started_default_prettier {
Some(old_task) => return Task::ready(Some((None, old_task))),
None => {
let new_task = start_default_prettier(node, None, cx);
return cx.spawn(|_, _| async move { Some((None, new_task.await)) });
}
}
}
}
} else if self.remote_id().is_some() {
return Task::ready(None);
} else {
Task::ready(Some(
Task::ready(Some((
None,
Task::ready(Err(Arc::new(anyhow!("project does not have a remote id")))).shared(),
))
)))
}
}
@@ -8571,8 +8616,7 @@ impl Project {
_: &Language,
_: &LanguageSettings,
_: &mut ModelContext<Self>,
) -> Task<anyhow::Result<()>> {
Task::ready(Ok(()))
) {
}
#[cfg(not(any(test, feature = "test-support")))]
@@ -8582,19 +8626,19 @@ impl Project {
new_language: &Language,
language_settings: &LanguageSettings,
cx: &mut ModelContext<Self>,
) -> Task<anyhow::Result<()>> {
) {
match &language_settings.formatter {
Formatter::Prettier { .. } | Formatter::Auto => {}
Formatter::LanguageServer | Formatter::External { .. } => return Task::ready(Ok(())),
Formatter::LanguageServer | Formatter::External { .. } => return,
};
let Some(node) = self.node.as_ref().cloned() else {
return Task::ready(Ok(()));
return;
};
let mut prettier_plugins = None;
if new_language.prettier_parser_name().is_some() {
prettier_plugins
.get_or_insert_with(|| HashSet::default())
.get_or_insert_with(|| HashSet::<&'static str>::default())
.extend(
new_language
.lsp_adapters()
@@ -8603,114 +8647,287 @@ impl Project {
)
}
let Some(prettier_plugins) = prettier_plugins else {
return Task::ready(Ok(()));
return;
};
let fs = Arc::clone(&self.fs);
let locate_prettier_installation = match worktree.and_then(|worktree_id| {
self.worktree_for_id(worktree_id, cx)
.map(|worktree| worktree.read(cx).abs_path())
}) {
Some(locate_from) => {
let installed_prettiers = self.prettier_instances.keys().cloned().collect();
cx.executor().spawn(async move {
Prettier::locate_prettier_installation(
fs.as_ref(),
&installed_prettiers,
locate_from.as_ref(),
)
.await
})
}
None => Task::ready(Ok(None)),
};
let mut plugins_to_install = prettier_plugins;
let (mut install_success_tx, mut install_success_rx) =
futures::channel::mpsc::channel::<HashSet<&'static str>>(1);
let new_installation_process = cx
.spawn(|this, mut cx| async move {
if let Some(installed_plugins) = install_success_rx.next().await {
this.update(&mut cx, |this, _| {
let default_prettier =
this.default_prettier
.get_or_insert_with(|| DefaultPrettier {
installation_process: None,
installed_plugins: HashSet::default(),
});
if !installed_plugins.is_empty() {
log::info!("Installed new prettier plugins: {installed_plugins:?}");
default_prettier.installed_plugins.extend(installed_plugins);
}
})
.ok();
}
})
.shared();
let previous_installation_process =
if let Some(default_prettier) = &mut self.default_prettier {
plugins_to_install
.retain(|plugin| !default_prettier.installed_plugins.contains(plugin));
if plugins_to_install.is_empty() {
return Task::ready(Ok(()));
return;
}
std::mem::replace(
&mut default_prettier.installation_process,
Some(new_installation_process.clone()),
)
default_prettier.installation_process.clone()
} else {
None
};
let default_prettier_dir = util::paths::DEFAULT_PRETTIER_DIR.as_path();
let already_running_prettier = self
.prettier_instances
.get(&(worktree, default_prettier_dir.to_path_buf()))
.cloned();
let fs = Arc::clone(&self.fs);
cx.spawn_on_main(move |this, mut cx| async move {
if let Some(previous_installation_process) = previous_installation_process {
previous_installation_process.await;
}
let mut everything_was_installed = false;
this.update(&mut cx, |this, _| {
match &mut this.default_prettier {
Some(default_prettier) => {
plugins_to_install
.retain(|plugin| !default_prettier.installed_plugins.contains(plugin));
everything_was_installed = plugins_to_install.is_empty();
},
None => this.default_prettier = Some(DefaultPrettier { installation_process: Some(new_installation_process), installed_plugins: HashSet::default() }),
}
})?;
if everything_was_installed {
return Ok(());
}
cx.spawn(move |_| async move {
let prettier_wrapper_path = default_prettier_dir.join(prettier2::PRETTIER_SERVER_FILE);
// method creates parent directory if it doesn't exist
fs.save(&prettier_wrapper_path, &text::Rope::from(prettier2::PRETTIER_SERVER_JS), text::LineEnding::Unix).await
.with_context(|| format!("writing {} file at {prettier_wrapper_path:?}", prettier2::PRETTIER_SERVER_FILE))?;
let packages_to_versions = future::try_join_all(
plugins_to_install
.iter()
.chain(Some(&"prettier"))
.map(|package_name| async {
let returned_package_name = package_name.to_string();
let latest_version = node.npm_package_latest_version(package_name)
let default_prettier = self
.default_prettier
.get_or_insert_with(|| DefaultPrettier {
instance: None,
installation_process: None,
installed_plugins: HashSet::default(),
});
default_prettier.installation_process = Some(
cx.spawn_on_main(|this, mut cx| async move {
match locate_prettier_installation
.await
.context("locate prettier installation")
.map_err(Arc::new)?
{
Some(_non_default_prettier) => return Ok(()),
None => {
let mut needs_install = match previous_installation_process {
Some(previous_installation_process) => {
previous_installation_process.await.is_err()
}
None => true,
};
this.update(&mut cx, |this, _| {
if let Some(default_prettier) = &mut this.default_prettier {
plugins_to_install.retain(|plugin| {
!default_prettier.installed_plugins.contains(plugin)
});
needs_install |= !plugins_to_install.is_empty();
}
})?;
if needs_install {
let installed_plugins = plugins_to_install.clone();
cx.executor()
.spawn(async move {
install_default_prettier(plugins_to_install, node, fs).await
})
.await
.with_context(|| {
format!("fetching latest npm version for package {returned_package_name}")
})?;
anyhow::Ok((returned_package_name, latest_version))
}),
)
.await
.context("fetching latest npm versions")?;
log::info!("Fetching default prettier and plugins: {packages_to_versions:?}");
let borrowed_packages = packages_to_versions.iter().map(|(package, version)| {
(package.as_str(), version.as_str())
}).collect::<Vec<_>>();
node.npm_install_packages(default_prettier_dir, &borrowed_packages).await.context("fetching formatter packages")?;
let installed_packages = !plugins_to_install.is_empty();
install_success_tx.try_send(plugins_to_install).ok();
if !installed_packages {
if let Some(prettier) = already_running_prettier {
prettier.await.map_err(|e| anyhow::anyhow!("Default prettier startup await failure: {e:#}"))?.clear_cache().await.context("clearing default prettier cache after plugins install")?;
.context("prettier & plugins install")
.map_err(Arc::new)?;
this.update(&mut cx, |this, _| {
let default_prettier =
this.default_prettier
.get_or_insert_with(|| DefaultPrettier {
instance: None,
installation_process: Some(
Task::ready(Ok(())).shared(),
),
installed_plugins: HashSet::default(),
});
default_prettier.instance = None;
default_prettier.installed_plugins.extend(installed_plugins);
})?;
}
}
}
anyhow::Ok(())
}).await
})
Ok(())
})
.shared(),
);
}
}
fn start_default_prettier(
node: Arc<dyn NodeRuntime>,
worktree_id: Option<WorktreeId>,
cx: &mut ModelContext<'_, Project>,
) -> Task<Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>>> {
cx.spawn(move |project, mut cx| async move {
loop {
let default_prettier_installing = match project.update(&mut cx, |project, _| {
project
.default_prettier
.as_ref()
.and_then(|default_prettier| default_prettier.installation_process.clone())
}) {
Ok(installation) => installation,
Err(e) => {
return Task::ready(Err(Arc::new(
e.context("project is gone during default prettier installation"),
)))
.shared()
}
};
match default_prettier_installing {
Some(installation_task) => {
if installation_task.await.is_ok() {
break;
}
}
None => break,
}
}
match project.update(&mut cx, |project, cx| {
match project
.default_prettier
.as_mut()
.and_then(|default_prettier| default_prettier.instance.as_mut())
{
Some(default_prettier) => default_prettier.clone(),
None => {
let new_default_prettier =
start_prettier(node, DEFAULT_PRETTIER_DIR.clone(), worktree_id, cx);
project
.default_prettier
.get_or_insert_with(|| DefaultPrettier {
instance: None,
installation_process: None,
#[cfg(not(any(test, feature = "test-support")))]
installed_plugins: HashSet::default(),
})
.instance = Some(new_default_prettier.clone());
new_default_prettier
}
}
}) {
Ok(task) => task,
Err(e) => Task::ready(Err(Arc::new(
e.context("project is gone during default prettier startup"),
)))
.shared(),
}
})
}
fn start_prettier(
node: Arc<dyn NodeRuntime>,
prettier_dir: PathBuf,
worktree_id: Option<WorktreeId>,
cx: &mut ModelContext<'_, Project>,
) -> Shared<Task<Result<Arc<Prettier>, Arc<anyhow::Error>>>> {
cx.spawn(move |project, mut cx| async move {
let new_server_id = project.update(&mut cx, |project, _| {
project.languages.next_language_server_id()
})?;
let new_prettier = Prettier::start(new_server_id, prettier_dir, node, cx.clone())
.await
.context("default prettier spawn")
.map(Arc::new)
.map_err(Arc::new)?;
register_new_prettier(&project, &new_prettier, worktree_id, new_server_id, &mut cx);
Ok(new_prettier)
})
.shared()
}
fn register_new_prettier(
project: &WeakModel<Project>,
prettier: &Prettier,
worktree_id: Option<WorktreeId>,
new_server_id: LanguageServerId,
cx: &mut AsyncAppContext,
) {
let prettier_dir = prettier.prettier_dir();
let is_default = prettier.is_default();
if is_default {
log::info!("Started default prettier in {prettier_dir:?}");
} else {
log::info!("Started prettier in {prettier_dir:?}");
}
if let Some(prettier_server) = prettier.server() {
project
.update(cx, |project, cx| {
let name = if is_default {
LanguageServerName(Arc::from("prettier (default)"))
} else {
let worktree_path = worktree_id
.and_then(|id| project.worktree_for_id(id, cx))
.map(|worktree| worktree.update(cx, |worktree, _| worktree.abs_path()));
let name = match worktree_path {
Some(worktree_path) => {
if prettier_dir == worktree_path.as_ref() {
let name = prettier_dir
.file_name()
.and_then(|name| name.to_str())
.unwrap_or_default();
format!("prettier ({name})")
} else {
let dir_to_display = prettier_dir
.strip_prefix(worktree_path.as_ref())
.ok()
.unwrap_or(prettier_dir);
format!("prettier ({})", dir_to_display.display())
}
}
None => format!("prettier ({})", prettier_dir.display()),
};
LanguageServerName(Arc::from(name))
};
project
.supplementary_language_servers
.insert(new_server_id, (name, Arc::clone(prettier_server)));
cx.emit(Event::LanguageServerAdded(new_server_id));
})
.ok();
}
}
#[cfg(not(any(test, feature = "test-support")))]
async fn install_default_prettier(
plugins_to_install: HashSet<&'static str>,
node: Arc<dyn NodeRuntime>,
fs: Arc<dyn Fs>,
) -> anyhow::Result<()> {
let prettier_wrapper_path = DEFAULT_PRETTIER_DIR.join(prettier2::PRETTIER_SERVER_FILE);
// method creates parent directory if it doesn't exist
fs.save(
&prettier_wrapper_path,
&text::Rope::from(prettier2::PRETTIER_SERVER_JS),
text::LineEnding::Unix,
)
.await
.with_context(|| {
format!(
"writing {} file at {prettier_wrapper_path:?}",
prettier2::PRETTIER_SERVER_FILE
)
})?;
let packages_to_versions =
future::try_join_all(plugins_to_install.iter().chain(Some(&"prettier")).map(
|package_name| async {
let returned_package_name = package_name.to_string();
let latest_version = node
.npm_package_latest_version(package_name)
.await
.with_context(|| {
format!("fetching latest npm version for package {returned_package_name}")
})?;
anyhow::Ok((returned_package_name, latest_version))
},
))
.await
.context("fetching latest npm versions")?;
log::info!("Fetching default prettier and plugins: {packages_to_versions:?}");
let borrowed_packages = packages_to_versions
.iter()
.map(|(package, version)| (package.as_str(), version.as_str()))
.collect::<Vec<_>>();
node.npm_install_packages(DEFAULT_PRETTIER_DIR.as_path(), &borrowed_packages)
.await
.context("fetching formatter packages")?;
anyhow::Ok(())
}
fn subscribe_for_copilot_events(
copilot: &Model<Copilot>,
cx: &mut ModelContext<'_, Project>,

View File

@@ -1,19 +1,24 @@
// use crate::{search::PathMatcher, worktree::WorktreeModelHandle, Event, *};
// use fs::{FakeFs, RealFs};
// use crate::{Event, *};
// use fs::FakeFs;
// use futures::{future, StreamExt};
// use gpui::{executor::Deterministic, test::subscribe, AppContext};
// use language2::{
// use gpui::AppContext;
// use language::{
// language_settings::{AllLanguageSettings, LanguageSettingsContent},
// tree_sitter_rust, tree_sitter_typescript, Diagnostic, FakeLspAdapter, LanguageConfig,
// LineEnding, OffsetRangeExt, Point, ToPoint,
// };
// use lsp2::Url;
// use lsp::Url;
// use parking_lot::Mutex;
// use pretty_assertions::assert_eq;
// use serde_json::json;
// use std::{cell::RefCell, os::unix, rc::Rc, task::Poll};
// use std::{os, task::Poll};
// use unindent::Unindent as _;
// use util::{assert_set_eq, test::temp_tree};
// use util::{assert_set_eq, paths::PathMatcher, test::temp_tree};
// #[gpui::test]
// async fn test_block_via_channel(cx: &mut gpui2::TestAppContext) {
// cx.executor().allow_parking();
// }
// #[cfg(test)]
// #[ctor::ctor]

View File

@@ -1,7 +1,6 @@
use aho_corasick::{AhoCorasick, AhoCorasickBuilder};
use anyhow::{Context, Result};
use client2::proto;
use globset::{Glob, GlobMatcher};
use itertools::Itertools;
use language2::{char_kind, BufferSnapshot};
use regex::{Regex, RegexBuilder};
@@ -10,9 +9,10 @@ use std::{
borrow::Cow,
io::{BufRead, BufReader, Read},
ops::Range,
path::{Path, PathBuf},
path::Path,
sync::Arc,
};
use util::paths::PathMatcher;
#[derive(Clone, Debug)]
pub struct SearchInputs {
@@ -52,31 +52,6 @@ pub enum SearchQuery {
},
}
#[derive(Clone, Debug)]
pub struct PathMatcher {
maybe_path: PathBuf,
glob: GlobMatcher,
}
impl std::fmt::Display for PathMatcher {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.maybe_path.to_string_lossy().fmt(f)
}
}
impl PathMatcher {
pub fn new(maybe_glob: &str) -> Result<Self, globset::Error> {
Ok(PathMatcher {
glob: Glob::new(&maybe_glob)?.compile_matcher(),
maybe_path: PathBuf::from(maybe_glob),
})
}
pub fn is_match<P: AsRef<Path>>(&self, other: P) -> bool {
other.as_ref().starts_with(&self.maybe_path) || self.glob.is_match(other)
}
}
impl SearchQuery {
pub fn text(
query: impl ToString,

View File

@@ -29,7 +29,6 @@ serde.workspace = true
serde_derive.workspace = true
smallvec.workspace = true
smol.workspace = true
globset.workspace = true
serde_json.workspace = true
[dev-dependencies]
client = { path = "../client", features = ["test-support"] }

View File

@@ -22,7 +22,7 @@ use gpui::{
};
use menu::Confirm;
use project::{
search::{PathMatcher, SearchInputs, SearchQuery},
search::{SearchInputs, SearchQuery},
Entry, Project,
};
use semantic_index::{SemanticIndex, SemanticIndexStatus};
@@ -37,7 +37,7 @@ use std::{
sync::Arc,
time::{Duration, Instant},
};
use util::ResultExt as _;
use util::{paths::PathMatcher, ResultExt as _};
use workspace::{
item::{BreadcrumbText, Item, ItemEvent, ItemHandle},
searchable::{Direction, SearchableItem, SearchableItemHandle},

View File

@@ -9,7 +9,7 @@ use futures::channel::oneshot;
use gpui::executor;
use ndarray::{Array1, Array2};
use ordered_float::OrderedFloat;
use project::{search::PathMatcher, Fs};
use project::Fs;
use rpc::proto::Timestamp;
use rusqlite::params;
use rusqlite::types::Value;
@@ -21,7 +21,7 @@ use std::{
sync::Arc,
time::SystemTime,
};
use util::TryFutureExt;
use util::{paths::PathMatcher, TryFutureExt};
pub fn argsort<T: Ord>(data: &[T]) -> Vec<usize> {
let mut indices = (0..data.len()).collect::<Vec<_>>();

View File

@@ -21,7 +21,7 @@ use ordered_float::OrderedFloat;
use parking_lot::Mutex;
use parsing::{CodeContextRetriever, Span, SpanDigest, PARSEABLE_ENTIRE_FILE_TYPES};
use postage::watch;
use project::{search::PathMatcher, Fs, PathChange, Project, ProjectEntryId, Worktree, WorktreeId};
use project::{Fs, PathChange, Project, ProjectEntryId, Worktree, WorktreeId};
use smol::channel;
use std::{
cmp::Reverse,
@@ -33,6 +33,7 @@ use std::{
sync::{Arc, Weak},
time::{Duration, Instant, SystemTime},
};
use util::paths::PathMatcher;
use util::{channel::RELEASE_CHANNEL_NAME, http::HttpClient, paths::EMBEDDINGS_DIR, ResultExt};
use workspace::WorkspaceCreated;

View File

@@ -10,13 +10,13 @@ use gpui::{executor::Deterministic, Task, TestAppContext};
use language::{Language, LanguageConfig, LanguageRegistry, ToOffset};
use parking_lot::Mutex;
use pretty_assertions::assert_eq;
use project::{project_settings::ProjectSettings, search::PathMatcher, FakeFs, Fs, Project};
use project::{project_settings::ProjectSettings, FakeFs, Fs, Project};
use rand::{rngs::StdRng, Rng};
use serde_json::json;
use settings::SettingsStore;
use std::{path::Path, sync::Arc, time::SystemTime};
use unindent::Unindent;
use util::RandomCharIter;
use util::{paths::PathMatcher, RandomCharIter};
#[ctor::ctor]
fn init_logger() {

View File

@@ -1,5 +1,6 @@
use crate::story::Story;
use gpui2::{px, Div, Render};
use theme2::default_color_scales;
use ui::prelude::*;
pub struct ColorsStory;
@@ -8,7 +9,7 @@ impl Render for ColorsStory {
type Element = Div<Self>;
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
let color_scales = theme2::default_color_scales();
let color_scales = default_color_scales();
Story::container(cx)
.child(Story::title(cx, "Colors"))
@@ -20,14 +21,14 @@ impl Render for ColorsStory {
.gap_1()
.overflow_y_scroll()
.text_color(gpui2::white())
.children(color_scales.into_iter().map(|(name, scale)| {
.children(color_scales.into_iter().map(|scale| {
div()
.flex()
.child(
div()
.w(px(75.))
.line_height(px(24.))
.child(name.to_string()),
.child(scale.name().to_string()),
)
.child(div().flex().gap_1().children(
(1..=12).map(|step| div().flex().size_6().bg(scale.step(cx, step))),

View File

@@ -3,7 +3,7 @@ use gpui2::{
StatelessInteractive, Styled, View, VisualContext, WindowContext,
};
use serde::Deserialize;
use theme2::theme;
use theme2::ActiveTheme;
#[derive(Clone, Default, PartialEq, Deserialize)]
struct ActionA;
@@ -34,13 +34,13 @@ impl Render for FocusStory {
type Element = Div<Self, StatefulInteraction<Self>, FocusEnabled<Self>>;
fn render(&mut self, cx: &mut gpui2::ViewContext<Self>) -> Self::Element {
let theme = theme(cx);
let color_1 = theme.git_created;
let color_2 = theme.git_modified;
let color_3 = theme.git_deleted;
let color_4 = theme.git_conflict;
let color_5 = theme.git_ignored;
let color_6 = theme.git_renamed;
let theme = cx.theme();
let color_1 = theme.styles.git.created;
let color_2 = theme.styles.git.modified;
let color_3 = theme.styles.git.deleted;
let color_4 = theme.styles.git.conflict;
let color_5 = theme.styles.git.ignored;
let color_6 = theme.styles.git.renamed;
let child_1 = cx.focus_handle();
let child_2 = cx.focus_handle();

View File

@@ -2,7 +2,7 @@ use gpui2::{
div, px, Component, Div, ParentElement, Render, SharedString, StatefulInteraction, Styled,
View, VisualContext, WindowContext,
};
use theme2::theme;
use theme2::ActiveTheme;
pub struct ScrollStory;
@@ -16,13 +16,13 @@ impl Render for ScrollStory {
type Element = Div<Self, StatefulInteraction<Self>>;
fn render(&mut self, cx: &mut gpui2::ViewContext<Self>) -> Self::Element {
let theme = theme(cx);
let color_1 = theme.git_created;
let color_2 = theme.git_modified;
let theme = cx.theme();
let color_1 = theme.styles.git.created;
let color_2 = theme.styles.git.modified;
div()
.id("parent")
.bg(theme.background)
.bg(theme.colors().background)
.size_full()
.overflow_scroll()
.children((0..10).map(|row| {

View File

@@ -48,7 +48,7 @@ fn main() {
let args = Args::parse();
let story_selector = args.story.clone();
let theme_name = args.theme.unwrap_or("One Dark".to_string());
let theme_name = args.theme.unwrap_or("Zed Pro Moonlight".to_string());
let asset_source = Arc::new(Assets);
gpui2::App::production(asset_source).run(move |cx| {
@@ -71,7 +71,6 @@ fn main() {
theme_settings.active_theme = theme_registry.get(&theme_name).unwrap();
ThemeSettings::override_global(theme_settings, cx);
cx.set_global(theme.clone());
ui::settings::init(cx);
let window = cx.open_window(

View File

@@ -16,19 +16,19 @@ path = "src/theme2.rs"
doctest = false
[dependencies]
gpui2 = { path = "../gpui2" }
fs = { path = "../fs" }
schemars.workspace = true
settings2 = { path = "../settings2" }
util = { path = "../util" }
anyhow.workspace = true
fs = { path = "../fs" }
gpui2 = { path = "../gpui2" }
indexmap = "1.6.2"
parking_lot.workspace = true
refineable.workspace = true
schemars.workspace = true
serde.workspace = true
serde_derive.workspace = true
serde_json.workspace = true
settings2 = { path = "../settings2" }
toml.workspace = true
util = { path = "../util" }
[dev-dependencies]
gpui2 = { path = "../gpui2", features = ["test-support"] }

144
crates/theme2/src/colors.rs Normal file
View File

@@ -0,0 +1,144 @@
use gpui2::Hsla;
use refineable::Refineable;
use crate::SyntaxTheme;
#[derive(Clone)]
pub struct SystemColors {
pub transparent: Hsla,
pub mac_os_traffic_light_red: Hsla,
pub mac_os_traffic_light_yellow: Hsla,
pub mac_os_traffic_light_green: Hsla,
}
#[derive(Debug, Clone, Copy)]
pub struct PlayerColor {
pub cursor: Hsla,
pub background: Hsla,
pub selection: Hsla,
}
#[derive(Clone)]
pub struct PlayerColors(pub Vec<PlayerColor>);
#[derive(Refineable, Clone, Debug)]
#[refineable(debug)]
pub struct StatusColors {
pub conflict: Hsla,
pub created: Hsla,
pub deleted: Hsla,
pub error: Hsla,
pub hidden: Hsla,
pub ignored: Hsla,
pub info: Hsla,
pub modified: Hsla,
pub renamed: Hsla,
pub success: Hsla,
pub warning: Hsla,
}
#[derive(Refineable, Clone, Debug)]
#[refineable(debug)]
pub struct GitStatusColors {
pub conflict: Hsla,
pub created: Hsla,
pub deleted: Hsla,
pub ignored: Hsla,
pub modified: Hsla,
pub renamed: Hsla,
}
#[derive(Refineable, Clone, Debug, Default)]
#[refineable(debug)]
pub struct ThemeColors {
pub border: Hsla,
pub border_variant: Hsla,
pub border_focused: Hsla,
pub border_transparent: Hsla,
pub elevated_surface: Hsla,
pub surface: Hsla,
pub background: Hsla,
pub element: Hsla,
pub element_hover: Hsla,
pub element_active: Hsla,
pub element_selected: Hsla,
pub element_disabled: Hsla,
pub element_placeholder: Hsla,
pub ghost_element: Hsla,
pub ghost_element_hover: Hsla,
pub ghost_element_active: Hsla,
pub ghost_element_selected: Hsla,
pub ghost_element_disabled: Hsla,
pub text: Hsla,
pub text_muted: Hsla,
pub text_placeholder: Hsla,
pub text_disabled: Hsla,
pub text_accent: Hsla,
pub icon: Hsla,
pub icon_muted: Hsla,
pub icon_disabled: Hsla,
pub icon_placeholder: Hsla,
pub icon_accent: Hsla,
pub status_bar: Hsla,
pub title_bar: Hsla,
pub toolbar: Hsla,
pub tab_bar: Hsla,
pub editor: Hsla,
pub editor_subheader: Hsla,
pub editor_active_line: Hsla,
}
#[derive(Refineable, Clone)]
pub struct ThemeStyles {
pub system: SystemColors,
pub colors: ThemeColors,
pub status: StatusColors,
pub git: GitStatusColors,
pub player: PlayerColors,
pub syntax: SyntaxTheme,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn override_a_single_theme_color() {
let mut colors = ThemeColors::default_light();
let magenta: Hsla = gpui2::rgb(0xff00ff);
assert_ne!(colors.text, magenta);
let overrides = ThemeColorsRefinement {
text: Some(magenta),
..Default::default()
};
colors.refine(&overrides);
assert_eq!(colors.text, magenta);
}
#[test]
fn override_multiple_theme_colors() {
let mut colors = ThemeColors::default_light();
let magenta: Hsla = gpui2::rgb(0xff00ff);
let green: Hsla = gpui2::rgb(0x00ff00);
assert_ne!(colors.text, magenta);
assert_ne!(colors.background, green);
let overrides = ThemeColorsRefinement {
text: Some(magenta),
background: Some(green),
..Default::default()
};
colors.refine(&overrides);
assert_eq!(colors.text, magenta);
assert_eq!(colors.background, green);
}
}

View File

@@ -1,10 +1,276 @@
use gpui2::Rgba;
use indexmap::IndexMap;
use gpui2::{hsla, Rgba};
use crate::scale::{ColorScaleName, ColorScaleSet, ColorScales};
use crate::{
colors::{GitStatusColors, PlayerColor, PlayerColors, StatusColors, SystemColors, ThemeColors},
scale::{ColorScaleSet, ColorScales},
syntax::SyntaxTheme,
};
impl Default for SystemColors {
fn default() -> Self {
Self {
transparent: hsla(0.0, 0.0, 0.0, 0.0),
mac_os_traffic_light_red: hsla(0.0139, 0.79, 0.65, 1.0),
mac_os_traffic_light_yellow: hsla(0.114, 0.88, 0.63, 1.0),
mac_os_traffic_light_green: hsla(0.313, 0.49, 0.55, 1.0),
}
}
}
impl Default for StatusColors {
fn default() -> Self {
Self {
conflict: gpui2::black(),
created: gpui2::black(),
deleted: gpui2::black(),
error: gpui2::black(),
hidden: gpui2::black(),
ignored: gpui2::black(),
info: gpui2::black(),
modified: gpui2::black(),
renamed: gpui2::black(),
success: gpui2::black(),
warning: gpui2::black(),
}
}
}
impl Default for GitStatusColors {
fn default() -> Self {
Self {
conflict: gpui2::rgba(0xdec184ff).into(),
created: gpui2::rgba(0xa1c181ff).into(),
deleted: gpui2::rgba(0xd07277ff).into(),
ignored: gpui2::rgba(0x555a63ff).into(),
modified: gpui2::rgba(0x74ade8ff).into(),
renamed: gpui2::rgba(0xdec184ff).into(),
}
}
}
impl Default for PlayerColors {
fn default() -> Self {
Self(vec![
PlayerColor {
cursor: hsla(0.0, 0.0, 0.0, 0.0),
background: hsla(0.0, 0.0, 0.0, 0.0),
selection: hsla(0.0, 0.0, 0.0, 0.0),
},
PlayerColor {
cursor: hsla(0.0, 0.0, 0.0, 0.0),
background: hsla(0.0, 0.0, 0.0, 0.0),
selection: hsla(0.0, 0.0, 0.0, 0.0),
},
PlayerColor {
cursor: hsla(0.0, 0.0, 0.0, 0.0),
background: hsla(0.0, 0.0, 0.0, 0.0),
selection: hsla(0.0, 0.0, 0.0, 0.0),
},
PlayerColor {
cursor: hsla(0.0, 0.0, 0.0, 0.0),
background: hsla(0.0, 0.0, 0.0, 0.0),
selection: hsla(0.0, 0.0, 0.0, 0.0),
},
])
}
}
impl SyntaxTheme {
pub fn default_light() -> Self {
Self {
highlights: vec![
(
"string.special.symbol".into(),
gpui2::rgba(0xad6e26ff).into(),
),
("hint".into(), gpui2::rgba(0x9294beff).into()),
("link_uri".into(), gpui2::rgba(0x3882b7ff).into()),
("type".into(), gpui2::rgba(0x3882b7ff).into()),
("string.regex".into(), gpui2::rgba(0xad6e26ff).into()),
("constant".into(), gpui2::rgba(0x669f59ff).into()),
("function".into(), gpui2::rgba(0x5b79e3ff).into()),
("string.special".into(), gpui2::rgba(0xad6e26ff).into()),
("punctuation.bracket".into(), gpui2::rgba(0x4d4f52ff).into()),
("variable".into(), gpui2::rgba(0x383a41ff).into()),
("punctuation".into(), gpui2::rgba(0x383a41ff).into()),
("property".into(), gpui2::rgba(0xd3604fff).into()),
("string".into(), gpui2::rgba(0x649f57ff).into()),
("predictive".into(), gpui2::rgba(0x9b9ec6ff).into()),
("attribute".into(), gpui2::rgba(0x5c78e2ff).into()),
("number".into(), gpui2::rgba(0xad6e25ff).into()),
("constructor".into(), gpui2::rgba(0x5c78e2ff).into()),
("embedded".into(), gpui2::rgba(0x383a41ff).into()),
("title".into(), gpui2::rgba(0xd3604fff).into()),
("tag".into(), gpui2::rgba(0x5c78e2ff).into()),
("boolean".into(), gpui2::rgba(0xad6e25ff).into()),
(
"punctuation.list_marker".into(),
gpui2::rgba(0xd3604fff).into(),
),
("variant".into(), gpui2::rgba(0x5b79e3ff).into()),
("emphasis".into(), gpui2::rgba(0x5c78e2ff).into()),
("link_text".into(), gpui2::rgba(0x5b79e3ff).into()),
("comment".into(), gpui2::rgba(0xa2a3a7ff).into()),
("punctuation.special".into(), gpui2::rgba(0xb92b46ff).into()),
("emphasis.strong".into(), gpui2::rgba(0xad6e25ff).into()),
("primary".into(), gpui2::rgba(0x383a41ff).into()),
(
"punctuation.delimiter".into(),
gpui2::rgba(0x4d4f52ff).into(),
),
("label".into(), gpui2::rgba(0x5c78e2ff).into()),
("keyword".into(), gpui2::rgba(0xa449abff).into()),
("string.escape".into(), gpui2::rgba(0x7c7e86ff).into()),
("text.literal".into(), gpui2::rgba(0x649f57ff).into()),
("variable.special".into(), gpui2::rgba(0xad6e25ff).into()),
("comment.doc".into(), gpui2::rgba(0x7c7e86ff).into()),
("enum".into(), gpui2::rgba(0xd3604fff).into()),
("operator".into(), gpui2::rgba(0x3882b7ff).into()),
("preproc".into(), gpui2::rgba(0x383a41ff).into()),
],
}
}
pub fn default_dark() -> Self {
Self {
highlights: vec![
("keyword".into(), gpui2::rgba(0xb477cfff).into()),
("comment.doc".into(), gpui2::rgba(0x878e98ff).into()),
("variant".into(), gpui2::rgba(0x73ade9ff).into()),
("property".into(), gpui2::rgba(0xd07277ff).into()),
("function".into(), gpui2::rgba(0x73ade9ff).into()),
("type".into(), gpui2::rgba(0x6eb4bfff).into()),
("tag".into(), gpui2::rgba(0x74ade8ff).into()),
("string.escape".into(), gpui2::rgba(0x878e98ff).into()),
("punctuation.bracket".into(), gpui2::rgba(0xb2b9c6ff).into()),
("hint".into(), gpui2::rgba(0x5a6f89ff).into()),
("punctuation".into(), gpui2::rgba(0xacb2beff).into()),
("comment".into(), gpui2::rgba(0x5d636fff).into()),
("emphasis".into(), gpui2::rgba(0x74ade8ff).into()),
("punctuation.special".into(), gpui2::rgba(0xb1574bff).into()),
("link_uri".into(), gpui2::rgba(0x6eb4bfff).into()),
("string.regex".into(), gpui2::rgba(0xbf956aff).into()),
("constructor".into(), gpui2::rgba(0x73ade9ff).into()),
("operator".into(), gpui2::rgba(0x6eb4bfff).into()),
("constant".into(), gpui2::rgba(0xdfc184ff).into()),
("string.special".into(), gpui2::rgba(0xbf956aff).into()),
("emphasis.strong".into(), gpui2::rgba(0xbf956aff).into()),
(
"string.special.symbol".into(),
gpui2::rgba(0xbf956aff).into(),
),
("primary".into(), gpui2::rgba(0xacb2beff).into()),
("preproc".into(), gpui2::rgba(0xc8ccd4ff).into()),
("string".into(), gpui2::rgba(0xa1c181ff).into()),
(
"punctuation.delimiter".into(),
gpui2::rgba(0xb2b9c6ff).into(),
),
("embedded".into(), gpui2::rgba(0xc8ccd4ff).into()),
("enum".into(), gpui2::rgba(0xd07277ff).into()),
("variable.special".into(), gpui2::rgba(0xbf956aff).into()),
("text.literal".into(), gpui2::rgba(0xa1c181ff).into()),
("attribute".into(), gpui2::rgba(0x74ade8ff).into()),
("link_text".into(), gpui2::rgba(0x73ade9ff).into()),
("title".into(), gpui2::rgba(0xd07277ff).into()),
("predictive".into(), gpui2::rgba(0x5a6a87ff).into()),
("number".into(), gpui2::rgba(0xbf956aff).into()),
("label".into(), gpui2::rgba(0x74ade8ff).into()),
("variable".into(), gpui2::rgba(0xc8ccd4ff).into()),
("boolean".into(), gpui2::rgba(0xbf956aff).into()),
(
"punctuation.list_marker".into(),
gpui2::rgba(0xd07277ff).into(),
),
],
}
}
}
impl ThemeColors {
pub fn default_light() -> Self {
Self {
border: gpui2::white(),
border_variant: gpui2::white(),
border_focused: gpui2::white(),
border_transparent: gpui2::white(),
elevated_surface: gpui2::white(),
surface: gpui2::white(),
background: gpui2::white(),
element: gpui2::white(),
element_hover: gpui2::white(),
element_active: gpui2::white(),
element_selected: gpui2::white(),
element_disabled: gpui2::white(),
element_placeholder: gpui2::white(),
ghost_element: gpui2::white(),
ghost_element_hover: gpui2::white(),
ghost_element_active: gpui2::white(),
ghost_element_selected: gpui2::white(),
ghost_element_disabled: gpui2::white(),
text: gpui2::white(),
text_muted: gpui2::white(),
text_placeholder: gpui2::white(),
text_disabled: gpui2::white(),
text_accent: gpui2::white(),
icon: gpui2::white(),
icon_muted: gpui2::white(),
icon_disabled: gpui2::white(),
icon_placeholder: gpui2::white(),
icon_accent: gpui2::white(),
status_bar: gpui2::white(),
title_bar: gpui2::white(),
toolbar: gpui2::white(),
tab_bar: gpui2::white(),
editor: gpui2::white(),
editor_subheader: gpui2::white(),
editor_active_line: gpui2::white(),
}
}
pub fn default_dark() -> Self {
Self {
border: gpui2::rgba(0x464b57ff).into(),
border_variant: gpui2::rgba(0x464b57ff).into(),
border_focused: gpui2::rgba(0x293b5bff).into(),
border_transparent: gpui2::rgba(0x00000000).into(),
elevated_surface: gpui2::rgba(0x3b414dff).into(),
surface: gpui2::rgba(0x2f343eff).into(),
background: gpui2::rgba(0x3b414dff).into(),
element: gpui2::rgba(0x3b414dff).into(),
element_hover: gpui2::rgba(0xffffff1e).into(),
element_active: gpui2::rgba(0xffffff28).into(),
element_selected: gpui2::rgba(0x18243dff).into(),
element_disabled: gpui2::rgba(0x00000000).into(),
element_placeholder: gpui2::black(),
ghost_element: gpui2::rgba(0x00000000).into(),
ghost_element_hover: gpui2::rgba(0xffffff14).into(),
ghost_element_active: gpui2::rgba(0xffffff1e).into(),
ghost_element_selected: gpui2::rgba(0x18243dff).into(),
ghost_element_disabled: gpui2::rgba(0x00000000).into(),
text: gpui2::rgba(0xc8ccd4ff).into(),
text_muted: gpui2::rgba(0x838994ff).into(),
text_placeholder: gpui2::rgba(0xd07277ff).into(),
text_disabled: gpui2::rgba(0x555a63ff).into(),
text_accent: gpui2::rgba(0x74ade8ff).into(),
icon: gpui2::black(),
icon_muted: gpui2::rgba(0x838994ff).into(),
icon_disabled: gpui2::black(),
icon_placeholder: gpui2::black(),
icon_accent: gpui2::black(),
status_bar: gpui2::rgba(0x3b414dff).into(),
title_bar: gpui2::rgba(0x3b414dff).into(),
toolbar: gpui2::rgba(0x282c33ff).into(),
tab_bar: gpui2::rgba(0x2f343eff).into(),
editor: gpui2::rgba(0x282c33ff).into(),
editor_subheader: gpui2::rgba(0x2f343eff).into(),
editor_active_line: gpui2::rgba(0x2f343eff).into(),
}
}
}
struct DefaultColorScaleSet {
scale: ColorScaleName,
scale: &'static str,
light: [&'static str; 12],
light_alpha: [&'static str; 12],
dark: [&'static str; 12],
@@ -32,48 +298,46 @@ impl From<DefaultColorScaleSet> for ColorScaleSet {
}
pub fn default_color_scales() -> ColorScales {
use ColorScaleName::*;
IndexMap::from_iter([
(Gray, gray().into()),
(Mauve, mauve().into()),
(Slate, slate().into()),
(Sage, sage().into()),
(Olive, olive().into()),
(Sand, sand().into()),
(Gold, gold().into()),
(Bronze, bronze().into()),
(Brown, brown().into()),
(Yellow, yellow().into()),
(Amber, amber().into()),
(Orange, orange().into()),
(Tomato, tomato().into()),
(Red, red().into()),
(Ruby, ruby().into()),
(Crimson, crimson().into()),
(Pink, pink().into()),
(Plum, plum().into()),
(Purple, purple().into()),
(Violet, violet().into()),
(Iris, iris().into()),
(Indigo, indigo().into()),
(Blue, blue().into()),
(Cyan, cyan().into()),
(Teal, teal().into()),
(Jade, jade().into()),
(Green, green().into()),
(Grass, grass().into()),
(Lime, lime().into()),
(Mint, mint().into()),
(Sky, sky().into()),
(Black, black().into()),
(White, white().into()),
])
ColorScales {
gray: gray(),
mauve: mauve(),
slate: slate(),
sage: sage(),
olive: olive(),
sand: sand(),
gold: gold(),
bronze: bronze(),
brown: brown(),
yellow: yellow(),
amber: amber(),
orange: orange(),
tomato: tomato(),
red: red(),
ruby: ruby(),
crimson: crimson(),
pink: pink(),
plum: plum(),
purple: purple(),
violet: violet(),
iris: iris(),
indigo: indigo(),
blue: blue(),
cyan: cyan(),
teal: teal(),
jade: jade(),
green: green(),
grass: grass(),
lime: lime(),
mint: mint(),
sky: sky(),
black: black(),
white: white(),
}
}
fn gray() -> DefaultColorScaleSet {
fn gray() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Gray,
scale: "Gray",
light: [
"#fcfcfcff",
"#f9f9f9ff",
@@ -131,11 +395,12 @@ fn gray() -> DefaultColorScaleSet {
"#ffffffed",
],
}
.into()
}
fn mauve() -> DefaultColorScaleSet {
fn mauve() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Mauve,
scale: "Mauve",
light: [
"#fdfcfdff",
"#faf9fbff",
@@ -193,11 +458,12 @@ fn mauve() -> DefaultColorScaleSet {
"#fdfdffef",
],
}
.into()
}
fn slate() -> DefaultColorScaleSet {
fn slate() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Slate,
scale: "Slate",
light: [
"#fcfcfdff",
"#f9f9fbff",
@@ -255,11 +521,12 @@ fn slate() -> DefaultColorScaleSet {
"#fcfdffef",
],
}
.into()
}
fn sage() -> DefaultColorScaleSet {
fn sage() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Sage,
scale: "Sage",
light: [
"#fbfdfcff",
"#f7f9f8ff",
@@ -317,11 +584,12 @@ fn sage() -> DefaultColorScaleSet {
"#fdfffeed",
],
}
.into()
}
fn olive() -> DefaultColorScaleSet {
fn olive() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Olive,
scale: "Olive",
light: [
"#fcfdfcff",
"#f8faf8ff",
@@ -379,11 +647,12 @@ fn olive() -> DefaultColorScaleSet {
"#fdfffded",
],
}
.into()
}
fn sand() -> DefaultColorScaleSet {
fn sand() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Sand,
scale: "Sand",
light: [
"#fdfdfcff",
"#f9f9f8ff",
@@ -441,11 +710,12 @@ fn sand() -> DefaultColorScaleSet {
"#fffffded",
],
}
.into()
}
fn gold() -> DefaultColorScaleSet {
fn gold() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Gold,
scale: "Gold",
light: [
"#fdfdfcff",
"#faf9f2ff",
@@ -503,11 +773,12 @@ fn gold() -> DefaultColorScaleSet {
"#fef7ede7",
],
}
.into()
}
fn bronze() -> DefaultColorScaleSet {
fn bronze() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Bronze,
scale: "Bronze",
light: [
"#fdfcfcff",
"#fdf7f5ff",
@@ -565,11 +836,12 @@ fn bronze() -> DefaultColorScaleSet {
"#fff1e9ec",
],
}
.into()
}
fn brown() -> DefaultColorScaleSet {
fn brown() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Brown,
scale: "Brown",
light: [
"#fefdfcff",
"#fcf9f6ff",
@@ -627,11 +899,12 @@ fn brown() -> DefaultColorScaleSet {
"#feecd4f2",
],
}
.into()
}
fn yellow() -> DefaultColorScaleSet {
fn yellow() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Yellow,
scale: "Yellow",
light: [
"#fdfdf9ff",
"#fefce9ff",
@@ -689,11 +962,12 @@ fn yellow() -> DefaultColorScaleSet {
"#fef6baf6",
],
}
.into()
}
fn amber() -> DefaultColorScaleSet {
fn amber() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Amber,
scale: "Amber",
light: [
"#fefdfbff",
"#fefbe9ff",
@@ -751,11 +1025,12 @@ fn amber() -> DefaultColorScaleSet {
"#ffe7b3ff",
],
}
.into()
}
fn orange() -> DefaultColorScaleSet {
fn orange() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Orange,
scale: "Orange",
light: [
"#fefcfbff",
"#fff7edff",
@@ -813,11 +1088,12 @@ fn orange() -> DefaultColorScaleSet {
"#ffe0c2ff",
],
}
.into()
}
fn tomato() -> DefaultColorScaleSet {
fn tomato() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Tomato,
scale: "Tomato",
light: [
"#fffcfcff",
"#fff8f7ff",
@@ -875,11 +1151,12 @@ fn tomato() -> DefaultColorScaleSet {
"#ffd6cefb",
],
}
.into()
}
fn red() -> DefaultColorScaleSet {
fn red() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Red,
scale: "Red",
light: [
"#fffcfcff",
"#fff7f7ff",
@@ -937,11 +1214,12 @@ fn red() -> DefaultColorScaleSet {
"#ffd1d9ff",
],
}
.into()
}
fn ruby() -> DefaultColorScaleSet {
fn ruby() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Ruby,
scale: "Ruby",
light: [
"#fffcfdff",
"#fff7f8ff",
@@ -999,11 +1277,12 @@ fn ruby() -> DefaultColorScaleSet {
"#ffd3e2fe",
],
}
.into()
}
fn crimson() -> DefaultColorScaleSet {
fn crimson() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Crimson,
scale: "Crimson",
light: [
"#fffcfdff",
"#fef7f9ff",
@@ -1061,11 +1340,12 @@ fn crimson() -> DefaultColorScaleSet {
"#ffd5eafd",
],
}
.into()
}
fn pink() -> DefaultColorScaleSet {
fn pink() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Pink,
scale: "Pink",
light: [
"#fffcfeff",
"#fef7fbff",
@@ -1123,11 +1403,12 @@ fn pink() -> DefaultColorScaleSet {
"#ffd3ecfd",
],
}
.into()
}
fn plum() -> DefaultColorScaleSet {
fn plum() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Plum,
scale: "Plum",
light: [
"#fefcffff",
"#fdf7fdff",
@@ -1185,11 +1466,12 @@ fn plum() -> DefaultColorScaleSet {
"#feddfef4",
],
}
.into()
}
fn purple() -> DefaultColorScaleSet {
fn purple() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Purple,
scale: "Purple",
light: [
"#fefcfeff",
"#fbf7feff",
@@ -1247,11 +1529,12 @@ fn purple() -> DefaultColorScaleSet {
"#f1ddfffa",
],
}
.into()
}
fn violet() -> DefaultColorScaleSet {
fn violet() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Violet,
scale: "Violet",
light: [
"#fdfcfeff",
"#faf8ffff",
@@ -1309,11 +1592,12 @@ fn violet() -> DefaultColorScaleSet {
"#e3defffe",
],
}
.into()
}
fn iris() -> DefaultColorScaleSet {
fn iris() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Iris,
scale: "Iris",
light: [
"#fdfdffff",
"#f8f8ffff",
@@ -1371,11 +1655,12 @@ fn iris() -> DefaultColorScaleSet {
"#e1e0fffe",
],
}
.into()
}
fn indigo() -> DefaultColorScaleSet {
fn indigo() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Indigo,
scale: "Indigo",
light: [
"#fdfdfeff",
"#f7f9ffff",
@@ -1433,11 +1718,12 @@ fn indigo() -> DefaultColorScaleSet {
"#d6e1ffff",
],
}
.into()
}
fn blue() -> DefaultColorScaleSet {
fn blue() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Blue,
scale: "Blue",
light: [
"#fbfdffff",
"#f4faffff",
@@ -1495,11 +1781,12 @@ fn blue() -> DefaultColorScaleSet {
"#c2e6ffff",
],
}
.into()
}
fn cyan() -> DefaultColorScaleSet {
fn cyan() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Cyan,
scale: "Cyan",
light: [
"#fafdfeff",
"#f2fafbff",
@@ -1557,11 +1844,12 @@ fn cyan() -> DefaultColorScaleSet {
"#bbf3fef7",
],
}
.into()
}
fn teal() -> DefaultColorScaleSet {
fn teal() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Teal,
scale: "Teal",
light: [
"#fafefdff",
"#f3fbf9ff",
@@ -1619,11 +1907,12 @@ fn teal() -> DefaultColorScaleSet {
"#b8ffebef",
],
}
.into()
}
fn jade() -> DefaultColorScaleSet {
fn jade() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Jade,
scale: "Jade",
light: [
"#fbfefdff",
"#f4fbf7ff",
@@ -1681,11 +1970,12 @@ fn jade() -> DefaultColorScaleSet {
"#b8ffe1ef",
],
}
.into()
}
fn green() -> DefaultColorScaleSet {
fn green() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Green,
scale: "Green",
light: [
"#fbfefcff",
"#f4fbf6ff",
@@ -1743,11 +2033,12 @@ fn green() -> DefaultColorScaleSet {
"#bbffd7f0",
],
}
.into()
}
fn grass() -> DefaultColorScaleSet {
fn grass() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Grass,
scale: "Grass",
light: [
"#fbfefbff",
"#f5fbf5ff",
@@ -1805,11 +2096,12 @@ fn grass() -> DefaultColorScaleSet {
"#ceffceef",
],
}
.into()
}
fn lime() -> DefaultColorScaleSet {
fn lime() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Lime,
scale: "Lime",
light: [
"#fcfdfaff",
"#f8faf3ff",
@@ -1867,11 +2159,12 @@ fn lime() -> DefaultColorScaleSet {
"#e9febff7",
],
}
.into()
}
fn mint() -> DefaultColorScaleSet {
fn mint() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Mint,
scale: "Mint",
light: [
"#f9fefdff",
"#f2fbf9ff",
@@ -1929,11 +2222,12 @@ fn mint() -> DefaultColorScaleSet {
"#cbfee9f5",
],
}
.into()
}
fn sky() -> DefaultColorScaleSet {
fn sky() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Sky,
scale: "Sky",
light: [
"#f9feffff",
"#f1fafdff",
@@ -1991,11 +2285,12 @@ fn sky() -> DefaultColorScaleSet {
"#c2f3ffff",
],
}
.into()
}
fn black() -> DefaultColorScaleSet {
fn black() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::Black,
scale: "Black",
light: [
"#0000000d",
"#0000001a",
@@ -2053,11 +2348,12 @@ fn black() -> DefaultColorScaleSet {
"#000000f2",
],
}
.into()
}
fn white() -> DefaultColorScaleSet {
fn white() -> ColorScaleSet {
DefaultColorScaleSet {
scale: ColorScaleName::White,
scale: "White",
light: [
"#ffffff0d",
"#ffffff1a",
@@ -2115,4 +2411,5 @@ fn white() -> DefaultColorScaleSet {
"#fffffff2",
],
}
.into()
}

View File

@@ -0,0 +1,58 @@
use crate::{
colors::{GitStatusColors, PlayerColors, StatusColors, SystemColors, ThemeColors, ThemeStyles},
default_color_scales, Appearance, SyntaxTheme, ThemeFamily, ThemeVariant,
};
fn zed_pro_daylight() -> ThemeVariant {
ThemeVariant {
id: "zed_pro_daylight".to_string(),
name: "Zed Pro Daylight".into(),
appearance: Appearance::Light,
styles: ThemeStyles {
system: SystemColors::default(),
colors: ThemeColors::default_light(),
status: StatusColors::default(),
git: GitStatusColors::default(),
player: PlayerColors::default(),
syntax: SyntaxTheme::default_light(),
},
}
}
pub(crate) fn zed_pro_moonlight() -> ThemeVariant {
ThemeVariant {
id: "zed_pro_moonlight".to_string(),
name: "Zed Pro Moonlight".into(),
appearance: Appearance::Dark,
styles: ThemeStyles {
system: SystemColors::default(),
colors: ThemeColors::default_dark(),
status: StatusColors::default(),
git: GitStatusColors::default(),
player: PlayerColors::default(),
syntax: SyntaxTheme::default_dark(),
},
}
}
pub fn zed_pro_family() -> ThemeFamily {
ThemeFamily {
id: "zed_pro".to_string(),
name: "Zed Pro".into(),
author: "Zed Team".into(),
themes: vec![zed_pro_daylight(), zed_pro_moonlight()],
scales: default_color_scales(),
}
}
impl Default for ThemeFamily {
fn default() -> Self {
zed_pro_family()
}
}
impl Default for ThemeVariant {
fn default() -> Self {
zed_pro_daylight()
}
}

View File

@@ -1,17 +1,22 @@
use crate::{themes, Theme, ThemeMetadata};
use crate::{zed_pro_family, ThemeFamily, ThemeVariant};
use anyhow::{anyhow, Result};
use gpui2::SharedString;
use std::{collections::HashMap, sync::Arc};
pub struct ThemeRegistry {
themes: HashMap<SharedString, Arc<Theme>>,
themes: HashMap<SharedString, Arc<ThemeVariant>>,
}
impl ThemeRegistry {
fn insert_themes(&mut self, themes: impl IntoIterator<Item = Theme>) {
fn insert_theme_families(&mut self, families: impl IntoIterator<Item = ThemeFamily>) {
for family in families.into_iter() {
self.insert_themes(family.themes);
}
}
fn insert_themes(&mut self, themes: impl IntoIterator<Item = ThemeVariant>) {
for theme in themes.into_iter() {
self.themes
.insert(theme.metadata.name.clone(), Arc::new(theme));
self.themes.insert(theme.name.clone(), Arc::new(theme));
}
}
@@ -19,11 +24,11 @@ impl ThemeRegistry {
self.themes.keys().cloned()
}
pub fn list(&self, _staff: bool) -> impl Iterator<Item = ThemeMetadata> + '_ {
self.themes.values().map(|theme| theme.metadata.clone())
pub fn list(&self, _staff: bool) -> impl Iterator<Item = SharedString> + '_ {
self.themes.values().map(|theme| theme.name.clone())
}
pub fn get(&self, name: &str) -> Result<Arc<Theme>> {
pub fn get(&self, name: &str) -> Result<Arc<ThemeVariant>> {
self.themes
.get(name)
.ok_or_else(|| anyhow!("theme not found: {}", name))
@@ -37,47 +42,7 @@ impl Default for ThemeRegistry {
themes: HashMap::default(),
};
this.insert_themes([
themes::andromeda(),
themes::atelier_cave_dark(),
themes::atelier_cave_light(),
themes::atelier_dune_dark(),
themes::atelier_dune_light(),
themes::atelier_estuary_dark(),
themes::atelier_estuary_light(),
themes::atelier_forest_dark(),
themes::atelier_forest_light(),
themes::atelier_heath_dark(),
themes::atelier_heath_light(),
themes::atelier_lakeside_dark(),
themes::atelier_lakeside_light(),
themes::atelier_plateau_dark(),
themes::atelier_plateau_light(),
themes::atelier_savanna_dark(),
themes::atelier_savanna_light(),
themes::atelier_seaside_dark(),
themes::atelier_seaside_light(),
themes::atelier_sulphurpool_dark(),
themes::atelier_sulphurpool_light(),
themes::ayu_dark(),
themes::ayu_light(),
themes::ayu_mirage(),
themes::gruvbox_dark(),
themes::gruvbox_dark_hard(),
themes::gruvbox_dark_soft(),
themes::gruvbox_light(),
themes::gruvbox_light_hard(),
themes::gruvbox_light_soft(),
themes::one_dark(),
themes::one_light(),
themes::rose_pine(),
themes::rose_pine_dawn(),
themes::rose_pine_moon(),
themes::sandcastle(),
themes::solarized_dark(),
themes::solarized_light(),
themes::summercamp(),
]);
this.insert_theme_families([zed_pro_family()]);
this
}

View File

@@ -1,98 +1,95 @@
use gpui2::{AppContext, Hsla};
use indexmap::IndexMap;
use gpui2::{AppContext, Hsla, SharedString};
use crate::{theme, Appearance};
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ColorScaleName {
Gray,
Mauve,
Slate,
Sage,
Olive,
Sand,
Gold,
Bronze,
Brown,
Yellow,
Amber,
Orange,
Tomato,
Red,
Ruby,
Crimson,
Pink,
Plum,
Purple,
Violet,
Iris,
Indigo,
Blue,
Cyan,
Teal,
Jade,
Green,
Grass,
Lime,
Mint,
Sky,
Black,
White,
}
impl std::fmt::Display for ColorScaleName {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::Gray => "Gray",
Self::Mauve => "Mauve",
Self::Slate => "Slate",
Self::Sage => "Sage",
Self::Olive => "Olive",
Self::Sand => "Sand",
Self::Gold => "Gold",
Self::Bronze => "Bronze",
Self::Brown => "Brown",
Self::Yellow => "Yellow",
Self::Amber => "Amber",
Self::Orange => "Orange",
Self::Tomato => "Tomato",
Self::Red => "Red",
Self::Ruby => "Ruby",
Self::Crimson => "Crimson",
Self::Pink => "Pink",
Self::Plum => "Plum",
Self::Purple => "Purple",
Self::Violet => "Violet",
Self::Iris => "Iris",
Self::Indigo => "Indigo",
Self::Blue => "Blue",
Self::Cyan => "Cyan",
Self::Teal => "Teal",
Self::Jade => "Jade",
Self::Green => "Green",
Self::Grass => "Grass",
Self::Lime => "Lime",
Self::Mint => "Mint",
Self::Sky => "Sky",
Self::Black => "Black",
Self::White => "White",
}
)
}
}
use crate::{ActiveTheme, Appearance};
pub type ColorScale = [Hsla; 12];
pub type ColorScales = IndexMap<ColorScaleName, ColorScaleSet>;
pub struct ColorScales {
pub gray: ColorScaleSet,
pub mauve: ColorScaleSet,
pub slate: ColorScaleSet,
pub sage: ColorScaleSet,
pub olive: ColorScaleSet,
pub sand: ColorScaleSet,
pub gold: ColorScaleSet,
pub bronze: ColorScaleSet,
pub brown: ColorScaleSet,
pub yellow: ColorScaleSet,
pub amber: ColorScaleSet,
pub orange: ColorScaleSet,
pub tomato: ColorScaleSet,
pub red: ColorScaleSet,
pub ruby: ColorScaleSet,
pub crimson: ColorScaleSet,
pub pink: ColorScaleSet,
pub plum: ColorScaleSet,
pub purple: ColorScaleSet,
pub violet: ColorScaleSet,
pub iris: ColorScaleSet,
pub indigo: ColorScaleSet,
pub blue: ColorScaleSet,
pub cyan: ColorScaleSet,
pub teal: ColorScaleSet,
pub jade: ColorScaleSet,
pub green: ColorScaleSet,
pub grass: ColorScaleSet,
pub lime: ColorScaleSet,
pub mint: ColorScaleSet,
pub sky: ColorScaleSet,
pub black: ColorScaleSet,
pub white: ColorScaleSet,
}
impl IntoIterator for ColorScales {
type Item = ColorScaleSet;
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
vec![
self.gray,
self.mauve,
self.slate,
self.sage,
self.olive,
self.sand,
self.gold,
self.bronze,
self.brown,
self.yellow,
self.amber,
self.orange,
self.tomato,
self.red,
self.ruby,
self.crimson,
self.pink,
self.plum,
self.purple,
self.violet,
self.iris,
self.indigo,
self.blue,
self.cyan,
self.teal,
self.jade,
self.green,
self.grass,
self.lime,
self.mint,
self.sky,
self.black,
self.white,
]
.into_iter()
}
}
/// A one-based step in a [`ColorScale`].
pub type ColorScaleStep = usize;
pub struct ColorScaleSet {
name: ColorScaleName,
name: SharedString,
light: ColorScale,
dark: ColorScale,
light_alpha: ColorScale,
@@ -101,14 +98,14 @@ pub struct ColorScaleSet {
impl ColorScaleSet {
pub fn new(
name: ColorScaleName,
name: impl Into<SharedString>,
light: ColorScale,
light_alpha: ColorScale,
dark: ColorScale,
dark_alpha: ColorScale,
) -> Self {
Self {
name,
name: name.into(),
light,
light_alpha,
dark,
@@ -116,8 +113,8 @@ impl ColorScaleSet {
}
}
pub fn name(&self) -> String {
self.name.to_string()
pub fn name(&self) -> &SharedString {
&self.name
}
pub fn light(&self, step: ColorScaleStep) -> Hsla {
@@ -136,27 +133,15 @@ impl ColorScaleSet {
self.dark_alpha[step - 1]
}
fn current_appearance(cx: &AppContext) -> Appearance {
let theme = theme(cx);
if theme.metadata.is_light {
Appearance::Light
} else {
Appearance::Dark
}
}
pub fn step(&self, cx: &AppContext, step: ColorScaleStep) -> Hsla {
let appearance = Self::current_appearance(cx);
match appearance {
match cx.theme().appearance {
Appearance::Light => self.light(step),
Appearance::Dark => self.dark(step),
}
}
pub fn step_alpha(&self, cx: &AppContext, step: ColorScaleStep) -> Hsla {
let appearance = Self::current_appearance(cx);
match appearance {
match cx.theme().appearance {
Appearance::Light => self.light_alpha(step),
Appearance::Dark => self.dark_alpha(step),
}

View File

@@ -1,4 +1,4 @@
use crate::{Theme, ThemeRegistry};
use crate::{ThemeRegistry, ThemeVariant};
use anyhow::Result;
use gpui2::{px, AppContext, Font, FontFeatures, FontStyle, FontWeight, Pixels};
use schemars::{
@@ -20,7 +20,7 @@ pub struct ThemeSettings {
pub buffer_font: Font,
pub buffer_font_size: Pixels,
pub buffer_line_height: BufferLineHeight,
pub active_theme: Arc<Theme>,
pub active_theme: Arc<ThemeVariant>,
}
#[derive(Default)]
@@ -123,7 +123,9 @@ impl settings2::Settings for ThemeSettings {
},
buffer_font_size: defaults.buffer_font_size.unwrap().into(),
buffer_line_height: defaults.buffer_line_height.unwrap(),
active_theme: themes.get(defaults.theme.as_ref().unwrap()).unwrap(),
active_theme: themes.get("Zed Pro Moonlight").unwrap(),
// todo!(Read the theme name from the settings)
// active_theme: themes.get(defaults.theme.as_ref().unwrap()).unwrap(),
};
for value in user_values.into_iter().copied().cloned() {

View File

@@ -0,0 +1,37 @@
use gpui2::{HighlightStyle, Hsla};
#[derive(Clone, Default)]
pub struct SyntaxTheme {
pub highlights: Vec<(String, HighlightStyle)>,
}
impl SyntaxTheme {
// TOOD: Get this working with `#[cfg(test)]`. Why isn't it?
pub fn new_test(colors: impl IntoIterator<Item = (&'static str, Hsla)>) -> Self {
SyntaxTheme {
highlights: colors
.into_iter()
.map(|(key, color)| {
(
key.to_owned(),
HighlightStyle {
color: Some(color),
..Default::default()
},
)
})
.collect(),
}
}
pub fn get(&self, name: &str) -> HighlightStyle {
self.highlights
.iter()
.find_map(|entry| if entry.0 == name { Some(entry.1) } else { None })
.unwrap_or_default()
}
pub fn color(&self, name: &str) -> Hsla {
self.get(name).color.unwrap_or_default()
}
}

View File

@@ -1,17 +1,21 @@
mod default;
mod colors;
mod default_colors;
mod default_theme;
mod registry;
mod scale;
mod settings;
mod themes;
mod syntax;
pub use default::*;
pub use colors::*;
pub use default_colors::*;
pub use default_theme::*;
pub use registry::*;
pub use scale::*;
pub use settings::*;
pub use syntax::*;
use gpui2::{AppContext, HighlightStyle, Hsla, SharedString};
use gpui2::{AppContext, Hsla, SharedString};
use settings2::Settings;
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq)]
pub enum Appearance {
@@ -24,132 +28,51 @@ pub fn init(cx: &mut AppContext) {
ThemeSettings::register(cx);
}
pub fn active_theme<'a>(cx: &'a AppContext) -> &'a Arc<Theme> {
&ThemeSettings::get_global(cx).active_theme
pub trait ActiveTheme {
fn theme(&self) -> &ThemeVariant;
}
pub fn theme(cx: &AppContext) -> Arc<Theme> {
active_theme(cx).clone()
}
pub struct Theme {
pub metadata: ThemeMetadata,
pub transparent: Hsla,
pub mac_os_traffic_light_red: Hsla,
pub mac_os_traffic_light_yellow: Hsla,
pub mac_os_traffic_light_green: Hsla,
pub border: Hsla,
pub border_variant: Hsla,
pub border_focused: Hsla,
pub border_transparent: Hsla,
/// The background color of an elevated surface, like a modal, tooltip or toast.
pub elevated_surface: Hsla,
pub surface: Hsla,
/// Window background color of the base app
pub background: Hsla,
/// Default background for elements like filled buttons,
/// text fields, checkboxes, radio buttons, etc.
/// - TODO: Map to step 3.
pub filled_element: Hsla,
/// The background color of a hovered element, like a button being hovered
/// with a mouse, or hovered on a touch screen.
/// - TODO: Map to step 4.
pub filled_element_hover: Hsla,
/// The background color of an active element, like a button being pressed,
/// or tapped on a touch screen.
/// - TODO: Map to step 5.
pub filled_element_active: Hsla,
/// The background color of a selected element, like a selected tab,
/// a button toggled on, or a checkbox that is checked.
pub filled_element_selected: Hsla,
pub filled_element_disabled: Hsla,
pub ghost_element: Hsla,
/// The background color of a hovered element with no default background,
/// like a ghost-style button or an interactable list item.
/// - TODO: Map to step 3.
pub ghost_element_hover: Hsla,
/// - TODO: Map to step 4.
pub ghost_element_active: Hsla,
pub ghost_element_selected: Hsla,
pub ghost_element_disabled: Hsla,
pub text: Hsla,
pub text_muted: Hsla,
pub text_placeholder: Hsla,
pub text_disabled: Hsla,
pub text_accent: Hsla,
pub icon_muted: Hsla,
pub syntax: SyntaxTheme,
pub status_bar: Hsla,
pub title_bar: Hsla,
pub toolbar: Hsla,
pub tab_bar: Hsla,
/// The background of the editor
pub editor: Hsla,
pub editor_subheader: Hsla,
pub editor_active_line: Hsla,
pub terminal: Hsla,
pub image_fallback_background: Hsla,
pub git_created: Hsla,
pub git_modified: Hsla,
pub git_deleted: Hsla,
pub git_conflict: Hsla,
pub git_ignored: Hsla,
pub git_renamed: Hsla,
pub players: [PlayerTheme; 8],
}
#[derive(Clone)]
pub struct SyntaxTheme {
pub highlights: Vec<(String, HighlightStyle)>,
}
impl SyntaxTheme {
// TOOD: Get this working with `#[cfg(test)]`. Why isn't it?
pub fn new_test(colors: impl IntoIterator<Item = (&'static str, Hsla)>) -> Self {
SyntaxTheme {
highlights: colors
.into_iter()
.map(|(key, color)| {
(
key.to_owned(),
HighlightStyle {
color: Some(color),
..Default::default()
},
)
})
.collect(),
}
}
pub fn get(&self, name: &str) -> HighlightStyle {
self.highlights
.iter()
.find_map(|entry| if entry.0 == name { Some(entry.1) } else { None })
.unwrap_or_default()
}
pub fn color(&self, name: &str) -> Hsla {
self.get(name).color.unwrap_or_default()
impl ActiveTheme for AppContext {
fn theme(&self) -> &ThemeVariant {
&ThemeSettings::get_global(self).active_theme
}
}
#[derive(Clone, Copy)]
pub struct PlayerTheme {
pub cursor: Hsla,
pub selection: Hsla,
}
#[derive(Clone)]
pub struct ThemeMetadata {
pub struct ThemeFamily {
#[allow(dead_code)]
pub(crate) id: String,
pub name: SharedString,
pub is_light: bool,
pub author: SharedString,
pub themes: Vec<ThemeVariant>,
pub scales: ColorScales,
}
pub struct Editor {
pub syntax: Arc<SyntaxTheme>,
impl ThemeFamily {}
pub struct ThemeVariant {
#[allow(dead_code)]
pub(crate) id: String,
pub name: SharedString,
pub appearance: Appearance,
pub styles: ThemeStyles,
}
impl ThemeVariant {
/// Returns the [`ThemeColors`] for the theme.
#[inline(always)]
pub fn colors(&self) -> &ThemeColors {
&self.styles.colors
}
/// Returns the [`SyntaxTheme`] for the theme.
#[inline(always)]
pub fn syntax(&self) -> &SyntaxTheme {
&self.styles.syntax
}
/// Returns the color for the syntax node with the given name.
#[inline(always)]
pub fn syntax_color(&self, name: &str) -> Hsla {
self.syntax().color(name)
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn andromeda() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Andromeda".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x2b2f38ff).into(),
border_variant: rgba(0x2b2f38ff).into(),
border_focused: rgba(0x183934ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x262933ff).into(),
surface: rgba(0x21242bff).into(),
background: rgba(0x262933ff).into(),
filled_element: rgba(0x262933ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x12231fff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x12231fff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf7f7f8ff).into(),
text_muted: rgba(0xaca8aeff).into(),
text_placeholder: rgba(0xf82871ff).into(),
text_disabled: rgba(0x6b6b73ff).into(),
text_accent: rgba(0x10a793ff).into(),
icon_muted: rgba(0xaca8aeff).into(),
syntax: SyntaxTheme {
highlights: vec![
("emphasis".into(), rgba(0x10a793ff).into()),
("punctuation.bracket".into(), rgba(0xd8d5dbff).into()),
("attribute".into(), rgba(0x10a793ff).into()),
("variable".into(), rgba(0xf7f7f8ff).into()),
("predictive".into(), rgba(0x315f70ff).into()),
("property".into(), rgba(0x10a793ff).into()),
("variant".into(), rgba(0x10a793ff).into()),
("embedded".into(), rgba(0xf7f7f8ff).into()),
("string.special".into(), rgba(0xf29c14ff).into()),
("keyword".into(), rgba(0x10a793ff).into()),
("tag".into(), rgba(0x10a793ff).into()),
("enum".into(), rgba(0xf29c14ff).into()),
("link_text".into(), rgba(0xf29c14ff).into()),
("primary".into(), rgba(0xf7f7f8ff).into()),
("punctuation".into(), rgba(0xd8d5dbff).into()),
("punctuation.special".into(), rgba(0xd8d5dbff).into()),
("function".into(), rgba(0xfee56cff).into()),
("number".into(), rgba(0x96df71ff).into()),
("preproc".into(), rgba(0xf7f7f8ff).into()),
("operator".into(), rgba(0xf29c14ff).into()),
("constructor".into(), rgba(0x10a793ff).into()),
("string.escape".into(), rgba(0xafabb1ff).into()),
("string.special.symbol".into(), rgba(0xf29c14ff).into()),
("string".into(), rgba(0xf29c14ff).into()),
("comment".into(), rgba(0xafabb1ff).into()),
("hint".into(), rgba(0x618399ff).into()),
("type".into(), rgba(0x08e7c5ff).into()),
("label".into(), rgba(0x10a793ff).into()),
("comment.doc".into(), rgba(0xafabb1ff).into()),
("text.literal".into(), rgba(0xf29c14ff).into()),
("constant".into(), rgba(0x96df71ff).into()),
("string.regex".into(), rgba(0xf29c14ff).into()),
("emphasis.strong".into(), rgba(0x10a793ff).into()),
("title".into(), rgba(0xf7f7f8ff).into()),
("punctuation.delimiter".into(), rgba(0xd8d5dbff).into()),
("link_uri".into(), rgba(0x96df71ff).into()),
("boolean".into(), rgba(0x96df71ff).into()),
("punctuation.list_marker".into(), rgba(0xd8d5dbff).into()),
],
},
status_bar: rgba(0x262933ff).into(),
title_bar: rgba(0x262933ff).into(),
toolbar: rgba(0x1e2025ff).into(),
tab_bar: rgba(0x21242bff).into(),
editor: rgba(0x1e2025ff).into(),
editor_subheader: rgba(0x21242bff).into(),
editor_active_line: rgba(0x21242bff).into(),
terminal: rgba(0x1e2025ff).into(),
image_fallback_background: rgba(0x262933ff).into(),
git_created: rgba(0x96df71ff).into(),
git_modified: rgba(0x10a793ff).into(),
git_deleted: rgba(0xf82871ff).into(),
git_conflict: rgba(0xfee56cff).into(),
git_ignored: rgba(0x6b6b73ff).into(),
git_renamed: rgba(0xfee56cff).into(),
players: [
PlayerTheme {
cursor: rgba(0x10a793ff).into(),
selection: rgba(0x10a7933d).into(),
},
PlayerTheme {
cursor: rgba(0x96df71ff).into(),
selection: rgba(0x96df713d).into(),
},
PlayerTheme {
cursor: rgba(0xc74cecff).into(),
selection: rgba(0xc74cec3d).into(),
},
PlayerTheme {
cursor: rgba(0xf29c14ff).into(),
selection: rgba(0xf29c143d).into(),
},
PlayerTheme {
cursor: rgba(0x893ea6ff).into(),
selection: rgba(0x893ea63d).into(),
},
PlayerTheme {
cursor: rgba(0x08e7c5ff).into(),
selection: rgba(0x08e7c53d).into(),
},
PlayerTheme {
cursor: rgba(0xf82871ff).into(),
selection: rgba(0xf828713d).into(),
},
PlayerTheme {
cursor: rgba(0xfee56cff).into(),
selection: rgba(0xfee56c3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_cave_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Cave Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x56505eff).into(),
border_variant: rgba(0x56505eff).into(),
border_focused: rgba(0x222953ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x3a353fff).into(),
surface: rgba(0x221f26ff).into(),
background: rgba(0x3a353fff).into(),
filled_element: rgba(0x3a353fff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x161a35ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x161a35ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xefecf4ff).into(),
text_muted: rgba(0x898591ff).into(),
text_placeholder: rgba(0xbe4677ff).into(),
text_disabled: rgba(0x756f7eff).into(),
text_accent: rgba(0x566ddaff).into(),
icon_muted: rgba(0x898591ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("comment.doc".into(), rgba(0x8b8792ff).into()),
("tag".into(), rgba(0x566ddaff).into()),
("link_text".into(), rgba(0xaa563bff).into()),
("constructor".into(), rgba(0x566ddaff).into()),
("punctuation".into(), rgba(0xe2dfe7ff).into()),
("punctuation.special".into(), rgba(0xbf3fbfff).into()),
("string.special.symbol".into(), rgba(0x299292ff).into()),
("string.escape".into(), rgba(0x8b8792ff).into()),
("emphasis".into(), rgba(0x566ddaff).into()),
("type".into(), rgba(0xa06d3aff).into()),
("punctuation.delimiter".into(), rgba(0x8b8792ff).into()),
("variant".into(), rgba(0xa06d3aff).into()),
("variable.special".into(), rgba(0x9559e7ff).into()),
("text.literal".into(), rgba(0xaa563bff).into()),
("punctuation.list_marker".into(), rgba(0xe2dfe7ff).into()),
("comment".into(), rgba(0x655f6dff).into()),
("function.method".into(), rgba(0x576cdbff).into()),
("property".into(), rgba(0xbe4677ff).into()),
("operator".into(), rgba(0x8b8792ff).into()),
("emphasis.strong".into(), rgba(0x566ddaff).into()),
("label".into(), rgba(0x566ddaff).into()),
("enum".into(), rgba(0xaa563bff).into()),
("number".into(), rgba(0xaa563bff).into()),
("primary".into(), rgba(0xe2dfe7ff).into()),
("keyword".into(), rgba(0x9559e7ff).into()),
(
"function.special.definition".into(),
rgba(0xa06d3aff).into(),
),
("punctuation.bracket".into(), rgba(0x8b8792ff).into()),
("constant".into(), rgba(0x2b9292ff).into()),
("string.special".into(), rgba(0xbf3fbfff).into()),
("title".into(), rgba(0xefecf4ff).into()),
("preproc".into(), rgba(0xefecf4ff).into()),
("link_uri".into(), rgba(0x2b9292ff).into()),
("string".into(), rgba(0x299292ff).into()),
("embedded".into(), rgba(0xefecf4ff).into()),
("hint".into(), rgba(0x706897ff).into()),
("boolean".into(), rgba(0x2b9292ff).into()),
("variable".into(), rgba(0xe2dfe7ff).into()),
("predictive".into(), rgba(0x615787ff).into()),
("string.regex".into(), rgba(0x388bc6ff).into()),
("function".into(), rgba(0x576cdbff).into()),
("attribute".into(), rgba(0x566ddaff).into()),
],
},
status_bar: rgba(0x3a353fff).into(),
title_bar: rgba(0x3a353fff).into(),
toolbar: rgba(0x19171cff).into(),
tab_bar: rgba(0x221f26ff).into(),
editor: rgba(0x19171cff).into(),
editor_subheader: rgba(0x221f26ff).into(),
editor_active_line: rgba(0x221f26ff).into(),
terminal: rgba(0x19171cff).into(),
image_fallback_background: rgba(0x3a353fff).into(),
git_created: rgba(0x2b9292ff).into(),
git_modified: rgba(0x566ddaff).into(),
git_deleted: rgba(0xbe4677ff).into(),
git_conflict: rgba(0xa06d3aff).into(),
git_ignored: rgba(0x756f7eff).into(),
git_renamed: rgba(0xa06d3aff).into(),
players: [
PlayerTheme {
cursor: rgba(0x566ddaff).into(),
selection: rgba(0x566dda3d).into(),
},
PlayerTheme {
cursor: rgba(0x2b9292ff).into(),
selection: rgba(0x2b92923d).into(),
},
PlayerTheme {
cursor: rgba(0xbf41bfff).into(),
selection: rgba(0xbf41bf3d).into(),
},
PlayerTheme {
cursor: rgba(0xaa563bff).into(),
selection: rgba(0xaa563b3d).into(),
},
PlayerTheme {
cursor: rgba(0x955ae6ff).into(),
selection: rgba(0x955ae63d).into(),
},
PlayerTheme {
cursor: rgba(0x3a8bc6ff).into(),
selection: rgba(0x3a8bc63d).into(),
},
PlayerTheme {
cursor: rgba(0xbe4677ff).into(),
selection: rgba(0xbe46773d).into(),
},
PlayerTheme {
cursor: rgba(0xa06d3aff).into(),
selection: rgba(0xa06d3a3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_cave_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Cave Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x8f8b96ff).into(),
border_variant: rgba(0x8f8b96ff).into(),
border_focused: rgba(0xc8c7f2ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xbfbcc5ff).into(),
surface: rgba(0xe6e3ebff).into(),
background: rgba(0xbfbcc5ff).into(),
filled_element: rgba(0xbfbcc5ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xe1e0f9ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xe1e0f9ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x19171cff).into(),
text_muted: rgba(0x5a5462ff).into(),
text_placeholder: rgba(0xbd4677ff).into(),
text_disabled: rgba(0x6e6876ff).into(),
text_accent: rgba(0x586cdaff).into(),
icon_muted: rgba(0x5a5462ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("link_text".into(), rgba(0xaa573cff).into()),
("string".into(), rgba(0x299292ff).into()),
("emphasis".into(), rgba(0x586cdaff).into()),
("label".into(), rgba(0x586cdaff).into()),
("property".into(), rgba(0xbe4677ff).into()),
("emphasis.strong".into(), rgba(0x586cdaff).into()),
("constant".into(), rgba(0x2b9292ff).into()),
(
"function.special.definition".into(),
rgba(0xa06d3aff).into(),
),
("embedded".into(), rgba(0x19171cff).into()),
("punctuation.special".into(), rgba(0xbf3fbfff).into()),
("function".into(), rgba(0x576cdbff).into()),
("tag".into(), rgba(0x586cdaff).into()),
("number".into(), rgba(0xaa563bff).into()),
("primary".into(), rgba(0x26232aff).into()),
("text.literal".into(), rgba(0xaa573cff).into()),
("variant".into(), rgba(0xa06d3aff).into()),
("type".into(), rgba(0xa06d3aff).into()),
("punctuation".into(), rgba(0x26232aff).into()),
("string.escape".into(), rgba(0x585260ff).into()),
("keyword".into(), rgba(0x9559e7ff).into()),
("title".into(), rgba(0x19171cff).into()),
("constructor".into(), rgba(0x586cdaff).into()),
("punctuation.list_marker".into(), rgba(0x26232aff).into()),
("string.special".into(), rgba(0xbf3fbfff).into()),
("operator".into(), rgba(0x585260ff).into()),
("function.method".into(), rgba(0x576cdbff).into()),
("link_uri".into(), rgba(0x2b9292ff).into()),
("variable.special".into(), rgba(0x9559e7ff).into()),
("hint".into(), rgba(0x776d9dff).into()),
("punctuation.bracket".into(), rgba(0x585260ff).into()),
("string.special.symbol".into(), rgba(0x299292ff).into()),
("predictive".into(), rgba(0x887fafff).into()),
("attribute".into(), rgba(0x586cdaff).into()),
("enum".into(), rgba(0xaa573cff).into()),
("preproc".into(), rgba(0x19171cff).into()),
("boolean".into(), rgba(0x2b9292ff).into()),
("variable".into(), rgba(0x26232aff).into()),
("comment.doc".into(), rgba(0x585260ff).into()),
("string.regex".into(), rgba(0x388bc6ff).into()),
("punctuation.delimiter".into(), rgba(0x585260ff).into()),
("comment".into(), rgba(0x7d7787ff).into()),
],
},
status_bar: rgba(0xbfbcc5ff).into(),
title_bar: rgba(0xbfbcc5ff).into(),
toolbar: rgba(0xefecf4ff).into(),
tab_bar: rgba(0xe6e3ebff).into(),
editor: rgba(0xefecf4ff).into(),
editor_subheader: rgba(0xe6e3ebff).into(),
editor_active_line: rgba(0xe6e3ebff).into(),
terminal: rgba(0xefecf4ff).into(),
image_fallback_background: rgba(0xbfbcc5ff).into(),
git_created: rgba(0x2b9292ff).into(),
git_modified: rgba(0x586cdaff).into(),
git_deleted: rgba(0xbd4677ff).into(),
git_conflict: rgba(0xa06e3bff).into(),
git_ignored: rgba(0x6e6876ff).into(),
git_renamed: rgba(0xa06e3bff).into(),
players: [
PlayerTheme {
cursor: rgba(0x586cdaff).into(),
selection: rgba(0x586cda3d).into(),
},
PlayerTheme {
cursor: rgba(0x2b9292ff).into(),
selection: rgba(0x2b92923d).into(),
},
PlayerTheme {
cursor: rgba(0xbf41bfff).into(),
selection: rgba(0xbf41bf3d).into(),
},
PlayerTheme {
cursor: rgba(0xaa573cff).into(),
selection: rgba(0xaa573c3d).into(),
},
PlayerTheme {
cursor: rgba(0x955ae6ff).into(),
selection: rgba(0x955ae63d).into(),
},
PlayerTheme {
cursor: rgba(0x3a8bc6ff).into(),
selection: rgba(0x3a8bc63d).into(),
},
PlayerTheme {
cursor: rgba(0xbd4677ff).into(),
selection: rgba(0xbd46773d).into(),
},
PlayerTheme {
cursor: rgba(0xa06e3bff).into(),
selection: rgba(0xa06e3b3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_dune_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Dune Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x6c695cff).into(),
border_variant: rgba(0x6c695cff).into(),
border_focused: rgba(0x262f56ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x45433bff).into(),
surface: rgba(0x262622ff).into(),
background: rgba(0x45433bff).into(),
filled_element: rgba(0x45433bff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x171e38ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x171e38ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xfefbecff).into(),
text_muted: rgba(0xa4a08bff).into(),
text_placeholder: rgba(0xd73837ff).into(),
text_disabled: rgba(0x8f8b77ff).into(),
text_accent: rgba(0x6684e0ff).into(),
icon_muted: rgba(0xa4a08bff).into(),
syntax: SyntaxTheme {
highlights: vec![
("constructor".into(), rgba(0x6684e0ff).into()),
("punctuation".into(), rgba(0xe8e4cfff).into()),
("punctuation.delimiter".into(), rgba(0xa6a28cff).into()),
("string.special".into(), rgba(0xd43451ff).into()),
("string.escape".into(), rgba(0xa6a28cff).into()),
("comment".into(), rgba(0x7d7a68ff).into()),
("enum".into(), rgba(0xb65611ff).into()),
("variable.special".into(), rgba(0xb854d4ff).into()),
("primary".into(), rgba(0xe8e4cfff).into()),
("comment.doc".into(), rgba(0xa6a28cff).into()),
("label".into(), rgba(0x6684e0ff).into()),
("operator".into(), rgba(0xa6a28cff).into()),
("string".into(), rgba(0x5fac38ff).into()),
("variant".into(), rgba(0xae9512ff).into()),
("variable".into(), rgba(0xe8e4cfff).into()),
("function.method".into(), rgba(0x6583e1ff).into()),
(
"function.special.definition".into(),
rgba(0xae9512ff).into(),
),
("string.regex".into(), rgba(0x1ead82ff).into()),
("emphasis.strong".into(), rgba(0x6684e0ff).into()),
("punctuation.special".into(), rgba(0xd43451ff).into()),
("punctuation.bracket".into(), rgba(0xa6a28cff).into()),
("link_text".into(), rgba(0xb65611ff).into()),
("link_uri".into(), rgba(0x5fac39ff).into()),
("boolean".into(), rgba(0x5fac39ff).into()),
("hint".into(), rgba(0xb17272ff).into()),
("tag".into(), rgba(0x6684e0ff).into()),
("function".into(), rgba(0x6583e1ff).into()),
("title".into(), rgba(0xfefbecff).into()),
("property".into(), rgba(0xd73737ff).into()),
("type".into(), rgba(0xae9512ff).into()),
("constant".into(), rgba(0x5fac39ff).into()),
("attribute".into(), rgba(0x6684e0ff).into()),
("predictive".into(), rgba(0x9c6262ff).into()),
("string.special.symbol".into(), rgba(0x5fac38ff).into()),
("punctuation.list_marker".into(), rgba(0xe8e4cfff).into()),
("emphasis".into(), rgba(0x6684e0ff).into()),
("keyword".into(), rgba(0xb854d4ff).into()),
("text.literal".into(), rgba(0xb65611ff).into()),
("number".into(), rgba(0xb65610ff).into()),
("preproc".into(), rgba(0xfefbecff).into()),
("embedded".into(), rgba(0xfefbecff).into()),
],
},
status_bar: rgba(0x45433bff).into(),
title_bar: rgba(0x45433bff).into(),
toolbar: rgba(0x20201dff).into(),
tab_bar: rgba(0x262622ff).into(),
editor: rgba(0x20201dff).into(),
editor_subheader: rgba(0x262622ff).into(),
editor_active_line: rgba(0x262622ff).into(),
terminal: rgba(0x20201dff).into(),
image_fallback_background: rgba(0x45433bff).into(),
git_created: rgba(0x5fac39ff).into(),
git_modified: rgba(0x6684e0ff).into(),
git_deleted: rgba(0xd73837ff).into(),
git_conflict: rgba(0xae9414ff).into(),
git_ignored: rgba(0x8f8b77ff).into(),
git_renamed: rgba(0xae9414ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x6684e0ff).into(),
selection: rgba(0x6684e03d).into(),
},
PlayerTheme {
cursor: rgba(0x5fac39ff).into(),
selection: rgba(0x5fac393d).into(),
},
PlayerTheme {
cursor: rgba(0xd43651ff).into(),
selection: rgba(0xd436513d).into(),
},
PlayerTheme {
cursor: rgba(0xb65611ff).into(),
selection: rgba(0xb656113d).into(),
},
PlayerTheme {
cursor: rgba(0xb854d3ff).into(),
selection: rgba(0xb854d33d).into(),
},
PlayerTheme {
cursor: rgba(0x20ad83ff).into(),
selection: rgba(0x20ad833d).into(),
},
PlayerTheme {
cursor: rgba(0xd73837ff).into(),
selection: rgba(0xd738373d).into(),
},
PlayerTheme {
cursor: rgba(0xae9414ff).into(),
selection: rgba(0xae94143d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_dune_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Dune Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xa8a48eff).into(),
border_variant: rgba(0xa8a48eff).into(),
border_focused: rgba(0xcdd1f5ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xcecab4ff).into(),
surface: rgba(0xeeebd7ff).into(),
background: rgba(0xcecab4ff).into(),
filled_element: rgba(0xcecab4ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xe3e5faff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xe3e5faff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x20201dff).into(),
text_muted: rgba(0x706d5fff).into(),
text_placeholder: rgba(0xd73737ff).into(),
text_disabled: rgba(0x878471ff).into(),
text_accent: rgba(0x6684dfff).into(),
icon_muted: rgba(0x706d5fff).into(),
syntax: SyntaxTheme {
highlights: vec![
("primary".into(), rgba(0x292824ff).into()),
("comment".into(), rgba(0x999580ff).into()),
("type".into(), rgba(0xae9512ff).into()),
("variant".into(), rgba(0xae9512ff).into()),
("label".into(), rgba(0x6684dfff).into()),
("function.method".into(), rgba(0x6583e1ff).into()),
("variable.special".into(), rgba(0xb854d4ff).into()),
("string.regex".into(), rgba(0x1ead82ff).into()),
("property".into(), rgba(0xd73737ff).into()),
("keyword".into(), rgba(0xb854d4ff).into()),
("number".into(), rgba(0xb65610ff).into()),
("punctuation.list_marker".into(), rgba(0x292824ff).into()),
(
"function.special.definition".into(),
rgba(0xae9512ff).into(),
),
("punctuation.special".into(), rgba(0xd43451ff).into()),
("punctuation".into(), rgba(0x292824ff).into()),
("punctuation.delimiter".into(), rgba(0x6e6b5eff).into()),
("tag".into(), rgba(0x6684dfff).into()),
("link_text".into(), rgba(0xb65712ff).into()),
("boolean".into(), rgba(0x61ac39ff).into()),
("hint".into(), rgba(0xb37979ff).into()),
("operator".into(), rgba(0x6e6b5eff).into()),
("constant".into(), rgba(0x61ac39ff).into()),
("function".into(), rgba(0x6583e1ff).into()),
("text.literal".into(), rgba(0xb65712ff).into()),
("string.special.symbol".into(), rgba(0x5fac38ff).into()),
("attribute".into(), rgba(0x6684dfff).into()),
("emphasis".into(), rgba(0x6684dfff).into()),
("preproc".into(), rgba(0x20201dff).into()),
("comment.doc".into(), rgba(0x6e6b5eff).into()),
("punctuation.bracket".into(), rgba(0x6e6b5eff).into()),
("string".into(), rgba(0x5fac38ff).into()),
("enum".into(), rgba(0xb65712ff).into()),
("variable".into(), rgba(0x292824ff).into()),
("string.special".into(), rgba(0xd43451ff).into()),
("embedded".into(), rgba(0x20201dff).into()),
("emphasis.strong".into(), rgba(0x6684dfff).into()),
("predictive".into(), rgba(0xc88a8aff).into()),
("title".into(), rgba(0x20201dff).into()),
("constructor".into(), rgba(0x6684dfff).into()),
("link_uri".into(), rgba(0x61ac39ff).into()),
("string.escape".into(), rgba(0x6e6b5eff).into()),
],
},
status_bar: rgba(0xcecab4ff).into(),
title_bar: rgba(0xcecab4ff).into(),
toolbar: rgba(0xfefbecff).into(),
tab_bar: rgba(0xeeebd7ff).into(),
editor: rgba(0xfefbecff).into(),
editor_subheader: rgba(0xeeebd7ff).into(),
editor_active_line: rgba(0xeeebd7ff).into(),
terminal: rgba(0xfefbecff).into(),
image_fallback_background: rgba(0xcecab4ff).into(),
git_created: rgba(0x61ac39ff).into(),
git_modified: rgba(0x6684dfff).into(),
git_deleted: rgba(0xd73737ff).into(),
git_conflict: rgba(0xae9414ff).into(),
git_ignored: rgba(0x878471ff).into(),
git_renamed: rgba(0xae9414ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x6684dfff).into(),
selection: rgba(0x6684df3d).into(),
},
PlayerTheme {
cursor: rgba(0x61ac39ff).into(),
selection: rgba(0x61ac393d).into(),
},
PlayerTheme {
cursor: rgba(0xd43652ff).into(),
selection: rgba(0xd436523d).into(),
},
PlayerTheme {
cursor: rgba(0xb65712ff).into(),
selection: rgba(0xb657123d).into(),
},
PlayerTheme {
cursor: rgba(0xb755d3ff).into(),
selection: rgba(0xb755d33d).into(),
},
PlayerTheme {
cursor: rgba(0x21ad82ff).into(),
selection: rgba(0x21ad823d).into(),
},
PlayerTheme {
cursor: rgba(0xd73737ff).into(),
selection: rgba(0xd737373d).into(),
},
PlayerTheme {
cursor: rgba(0xae9414ff).into(),
selection: rgba(0xae94143d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_estuary_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Estuary Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x5d5c4cff).into(),
border_variant: rgba(0x5d5c4cff).into(),
border_focused: rgba(0x1c3927ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x424136ff).into(),
surface: rgba(0x2c2b23ff).into(),
background: rgba(0x424136ff).into(),
filled_element: rgba(0x424136ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x142319ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x142319ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf4f3ecff).into(),
text_muted: rgba(0x91907fff).into(),
text_placeholder: rgba(0xba6136ff).into(),
text_disabled: rgba(0x7d7c6aff).into(),
text_accent: rgba(0x36a165ff).into(),
icon_muted: rgba(0x91907fff).into(),
syntax: SyntaxTheme {
highlights: vec![
("string.special.symbol".into(), rgba(0x7c9725ff).into()),
("comment".into(), rgba(0x6c6b5aff).into()),
("operator".into(), rgba(0x929181ff).into()),
("punctuation.delimiter".into(), rgba(0x929181ff).into()),
("keyword".into(), rgba(0x5f9182ff).into()),
("punctuation.special".into(), rgba(0x9d6b7bff).into()),
("preproc".into(), rgba(0xf4f3ecff).into()),
("title".into(), rgba(0xf4f3ecff).into()),
("string.escape".into(), rgba(0x929181ff).into()),
("boolean".into(), rgba(0x7d9726ff).into()),
("punctuation.bracket".into(), rgba(0x929181ff).into()),
("emphasis.strong".into(), rgba(0x36a165ff).into()),
("string".into(), rgba(0x7c9725ff).into()),
("constant".into(), rgba(0x7d9726ff).into()),
("link_text".into(), rgba(0xae7214ff).into()),
("tag".into(), rgba(0x36a165ff).into()),
("hint".into(), rgba(0x6f815aff).into()),
("punctuation".into(), rgba(0xe7e6dfff).into()),
("string.regex".into(), rgba(0x5a9d47ff).into()),
("variant".into(), rgba(0xa5980cff).into()),
("type".into(), rgba(0xa5980cff).into()),
("attribute".into(), rgba(0x36a165ff).into()),
("emphasis".into(), rgba(0x36a165ff).into()),
("enum".into(), rgba(0xae7214ff).into()),
("number".into(), rgba(0xae7312ff).into()),
("property".into(), rgba(0xba6135ff).into()),
("predictive".into(), rgba(0x5f724cff).into()),
(
"function.special.definition".into(),
rgba(0xa5980cff).into(),
),
("link_uri".into(), rgba(0x7d9726ff).into()),
("variable.special".into(), rgba(0x5f9182ff).into()),
("text.literal".into(), rgba(0xae7214ff).into()),
("label".into(), rgba(0x36a165ff).into()),
("primary".into(), rgba(0xe7e6dfff).into()),
("variable".into(), rgba(0xe7e6dfff).into()),
("embedded".into(), rgba(0xf4f3ecff).into()),
("function.method".into(), rgba(0x35a166ff).into()),
("comment.doc".into(), rgba(0x929181ff).into()),
("string.special".into(), rgba(0x9d6b7bff).into()),
("constructor".into(), rgba(0x36a165ff).into()),
("punctuation.list_marker".into(), rgba(0xe7e6dfff).into()),
("function".into(), rgba(0x35a166ff).into()),
],
},
status_bar: rgba(0x424136ff).into(),
title_bar: rgba(0x424136ff).into(),
toolbar: rgba(0x22221bff).into(),
tab_bar: rgba(0x2c2b23ff).into(),
editor: rgba(0x22221bff).into(),
editor_subheader: rgba(0x2c2b23ff).into(),
editor_active_line: rgba(0x2c2b23ff).into(),
terminal: rgba(0x22221bff).into(),
image_fallback_background: rgba(0x424136ff).into(),
git_created: rgba(0x7d9726ff).into(),
git_modified: rgba(0x36a165ff).into(),
git_deleted: rgba(0xba6136ff).into(),
git_conflict: rgba(0xa5980fff).into(),
git_ignored: rgba(0x7d7c6aff).into(),
git_renamed: rgba(0xa5980fff).into(),
players: [
PlayerTheme {
cursor: rgba(0x36a165ff).into(),
selection: rgba(0x36a1653d).into(),
},
PlayerTheme {
cursor: rgba(0x7d9726ff).into(),
selection: rgba(0x7d97263d).into(),
},
PlayerTheme {
cursor: rgba(0x9d6b7bff).into(),
selection: rgba(0x9d6b7b3d).into(),
},
PlayerTheme {
cursor: rgba(0xae7214ff).into(),
selection: rgba(0xae72143d).into(),
},
PlayerTheme {
cursor: rgba(0x5f9182ff).into(),
selection: rgba(0x5f91823d).into(),
},
PlayerTheme {
cursor: rgba(0x5a9d47ff).into(),
selection: rgba(0x5a9d473d).into(),
},
PlayerTheme {
cursor: rgba(0xba6136ff).into(),
selection: rgba(0xba61363d).into(),
},
PlayerTheme {
cursor: rgba(0xa5980fff).into(),
selection: rgba(0xa5980f3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_estuary_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Estuary Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x969585ff).into(),
border_variant: rgba(0x969585ff).into(),
border_focused: rgba(0xbbddc6ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xc5c4b9ff).into(),
surface: rgba(0xebeae3ff).into(),
background: rgba(0xc5c4b9ff).into(),
filled_element: rgba(0xc5c4b9ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xd9ecdfff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xd9ecdfff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x22221bff).into(),
text_muted: rgba(0x61604fff).into(),
text_placeholder: rgba(0xba6336ff).into(),
text_disabled: rgba(0x767463ff).into(),
text_accent: rgba(0x37a165ff).into(),
icon_muted: rgba(0x61604fff).into(),
syntax: SyntaxTheme {
highlights: vec![
("string.special".into(), rgba(0x9d6b7bff).into()),
("link_text".into(), rgba(0xae7214ff).into()),
("emphasis.strong".into(), rgba(0x37a165ff).into()),
("tag".into(), rgba(0x37a165ff).into()),
("primary".into(), rgba(0x302f27ff).into()),
("emphasis".into(), rgba(0x37a165ff).into()),
("hint".into(), rgba(0x758961ff).into()),
("title".into(), rgba(0x22221bff).into()),
("string.regex".into(), rgba(0x5a9d47ff).into()),
("attribute".into(), rgba(0x37a165ff).into()),
("string.escape".into(), rgba(0x5f5e4eff).into()),
("embedded".into(), rgba(0x22221bff).into()),
("punctuation.bracket".into(), rgba(0x5f5e4eff).into()),
(
"function.special.definition".into(),
rgba(0xa5980cff).into(),
),
("operator".into(), rgba(0x5f5e4eff).into()),
("constant".into(), rgba(0x7c9728ff).into()),
("comment.doc".into(), rgba(0x5f5e4eff).into()),
("label".into(), rgba(0x37a165ff).into()),
("variable".into(), rgba(0x302f27ff).into()),
("punctuation".into(), rgba(0x302f27ff).into()),
("punctuation.delimiter".into(), rgba(0x5f5e4eff).into()),
("comment".into(), rgba(0x878573ff).into()),
("punctuation.special".into(), rgba(0x9d6b7bff).into()),
("string.special.symbol".into(), rgba(0x7c9725ff).into()),
("enum".into(), rgba(0xae7214ff).into()),
("variable.special".into(), rgba(0x5f9182ff).into()),
("link_uri".into(), rgba(0x7c9728ff).into()),
("punctuation.list_marker".into(), rgba(0x302f27ff).into()),
("number".into(), rgba(0xae7312ff).into()),
("function".into(), rgba(0x35a166ff).into()),
("text.literal".into(), rgba(0xae7214ff).into()),
("boolean".into(), rgba(0x7c9728ff).into()),
("predictive".into(), rgba(0x879a72ff).into()),
("type".into(), rgba(0xa5980cff).into()),
("constructor".into(), rgba(0x37a165ff).into()),
("property".into(), rgba(0xba6135ff).into()),
("keyword".into(), rgba(0x5f9182ff).into()),
("function.method".into(), rgba(0x35a166ff).into()),
("variant".into(), rgba(0xa5980cff).into()),
("string".into(), rgba(0x7c9725ff).into()),
("preproc".into(), rgba(0x22221bff).into()),
],
},
status_bar: rgba(0xc5c4b9ff).into(),
title_bar: rgba(0xc5c4b9ff).into(),
toolbar: rgba(0xf4f3ecff).into(),
tab_bar: rgba(0xebeae3ff).into(),
editor: rgba(0xf4f3ecff).into(),
editor_subheader: rgba(0xebeae3ff).into(),
editor_active_line: rgba(0xebeae3ff).into(),
terminal: rgba(0xf4f3ecff).into(),
image_fallback_background: rgba(0xc5c4b9ff).into(),
git_created: rgba(0x7c9728ff).into(),
git_modified: rgba(0x37a165ff).into(),
git_deleted: rgba(0xba6336ff).into(),
git_conflict: rgba(0xa5980fff).into(),
git_ignored: rgba(0x767463ff).into(),
git_renamed: rgba(0xa5980fff).into(),
players: [
PlayerTheme {
cursor: rgba(0x37a165ff).into(),
selection: rgba(0x37a1653d).into(),
},
PlayerTheme {
cursor: rgba(0x7c9728ff).into(),
selection: rgba(0x7c97283d).into(),
},
PlayerTheme {
cursor: rgba(0x9d6b7bff).into(),
selection: rgba(0x9d6b7b3d).into(),
},
PlayerTheme {
cursor: rgba(0xae7214ff).into(),
selection: rgba(0xae72143d).into(),
},
PlayerTheme {
cursor: rgba(0x5f9182ff).into(),
selection: rgba(0x5f91823d).into(),
},
PlayerTheme {
cursor: rgba(0x5c9d49ff).into(),
selection: rgba(0x5c9d493d).into(),
},
PlayerTheme {
cursor: rgba(0xba6336ff).into(),
selection: rgba(0xba63363d).into(),
},
PlayerTheme {
cursor: rgba(0xa5980fff).into(),
selection: rgba(0xa5980f3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_forest_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Forest Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x665f5cff).into(),
border_variant: rgba(0x665f5cff).into(),
border_focused: rgba(0x182d5bff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x443c39ff).into(),
surface: rgba(0x27211eff).into(),
background: rgba(0x443c39ff).into(),
filled_element: rgba(0x443c39ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x0f1c3dff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x0f1c3dff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf0eeedff).into(),
text_muted: rgba(0xa79f9dff).into(),
text_placeholder: rgba(0xf22c3fff).into(),
text_disabled: rgba(0x8e8683ff).into(),
text_accent: rgba(0x407ee6ff).into(),
icon_muted: rgba(0xa79f9dff).into(),
syntax: SyntaxTheme {
highlights: vec![
("link_uri".into(), rgba(0x7a9726ff).into()),
("punctuation.list_marker".into(), rgba(0xe6e2e0ff).into()),
("type".into(), rgba(0xc38417ff).into()),
("punctuation.bracket".into(), rgba(0xa8a19fff).into()),
("punctuation".into(), rgba(0xe6e2e0ff).into()),
("preproc".into(), rgba(0xf0eeedff).into()),
("punctuation.special".into(), rgba(0xc33ff3ff).into()),
("variable.special".into(), rgba(0x6666eaff).into()),
("tag".into(), rgba(0x407ee6ff).into()),
("constructor".into(), rgba(0x407ee6ff).into()),
("title".into(), rgba(0xf0eeedff).into()),
("hint".into(), rgba(0xa77087ff).into()),
("constant".into(), rgba(0x7a9726ff).into()),
("number".into(), rgba(0xdf521fff).into()),
("emphasis.strong".into(), rgba(0x407ee6ff).into()),
("boolean".into(), rgba(0x7a9726ff).into()),
("comment".into(), rgba(0x766e6bff).into()),
("string.special".into(), rgba(0xc33ff3ff).into()),
("text.literal".into(), rgba(0xdf5321ff).into()),
("string.regex".into(), rgba(0x3c96b8ff).into()),
("enum".into(), rgba(0xdf5321ff).into()),
("operator".into(), rgba(0xa8a19fff).into()),
("embedded".into(), rgba(0xf0eeedff).into()),
("string.special.symbol".into(), rgba(0x7a9725ff).into()),
("predictive".into(), rgba(0x8f5b70ff).into()),
("comment.doc".into(), rgba(0xa8a19fff).into()),
("variant".into(), rgba(0xc38417ff).into()),
("label".into(), rgba(0x407ee6ff).into()),
("property".into(), rgba(0xf22c40ff).into()),
("keyword".into(), rgba(0x6666eaff).into()),
("function".into(), rgba(0x3f7ee7ff).into()),
("string.escape".into(), rgba(0xa8a19fff).into()),
("string".into(), rgba(0x7a9725ff).into()),
("primary".into(), rgba(0xe6e2e0ff).into()),
("function.method".into(), rgba(0x3f7ee7ff).into()),
("link_text".into(), rgba(0xdf5321ff).into()),
("attribute".into(), rgba(0x407ee6ff).into()),
("emphasis".into(), rgba(0x407ee6ff).into()),
(
"function.special.definition".into(),
rgba(0xc38417ff).into(),
),
("variable".into(), rgba(0xe6e2e0ff).into()),
("punctuation.delimiter".into(), rgba(0xa8a19fff).into()),
],
},
status_bar: rgba(0x443c39ff).into(),
title_bar: rgba(0x443c39ff).into(),
toolbar: rgba(0x1b1918ff).into(),
tab_bar: rgba(0x27211eff).into(),
editor: rgba(0x1b1918ff).into(),
editor_subheader: rgba(0x27211eff).into(),
editor_active_line: rgba(0x27211eff).into(),
terminal: rgba(0x1b1918ff).into(),
image_fallback_background: rgba(0x443c39ff).into(),
git_created: rgba(0x7a9726ff).into(),
git_modified: rgba(0x407ee6ff).into(),
git_deleted: rgba(0xf22c3fff).into(),
git_conflict: rgba(0xc38418ff).into(),
git_ignored: rgba(0x8e8683ff).into(),
git_renamed: rgba(0xc38418ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x407ee6ff).into(),
selection: rgba(0x407ee63d).into(),
},
PlayerTheme {
cursor: rgba(0x7a9726ff).into(),
selection: rgba(0x7a97263d).into(),
},
PlayerTheme {
cursor: rgba(0xc340f2ff).into(),
selection: rgba(0xc340f23d).into(),
},
PlayerTheme {
cursor: rgba(0xdf5321ff).into(),
selection: rgba(0xdf53213d).into(),
},
PlayerTheme {
cursor: rgba(0x6565e9ff).into(),
selection: rgba(0x6565e93d).into(),
},
PlayerTheme {
cursor: rgba(0x3d97b8ff).into(),
selection: rgba(0x3d97b83d).into(),
},
PlayerTheme {
cursor: rgba(0xf22c3fff).into(),
selection: rgba(0xf22c3f3d).into(),
},
PlayerTheme {
cursor: rgba(0xc38418ff).into(),
selection: rgba(0xc384183d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_forest_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Forest Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xaaa3a1ff).into(),
border_variant: rgba(0xaaa3a1ff).into(),
border_focused: rgba(0xc6cef7ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xccc7c5ff).into(),
surface: rgba(0xe9e6e4ff).into(),
background: rgba(0xccc7c5ff).into(),
filled_element: rgba(0xccc7c5ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xdfe3fbff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xdfe3fbff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x1b1918ff).into(),
text_muted: rgba(0x6a6360ff).into(),
text_placeholder: rgba(0xf22e40ff).into(),
text_disabled: rgba(0x837b78ff).into(),
text_accent: rgba(0x407ee6ff).into(),
icon_muted: rgba(0x6a6360ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("punctuation.special".into(), rgba(0xc33ff3ff).into()),
("text.literal".into(), rgba(0xdf5421ff).into()),
("string.escape".into(), rgba(0x68615eff).into()),
("string.regex".into(), rgba(0x3c96b8ff).into()),
("number".into(), rgba(0xdf521fff).into()),
("preproc".into(), rgba(0x1b1918ff).into()),
("keyword".into(), rgba(0x6666eaff).into()),
("variable.special".into(), rgba(0x6666eaff).into()),
("punctuation.delimiter".into(), rgba(0x68615eff).into()),
("emphasis.strong".into(), rgba(0x407ee6ff).into()),
("boolean".into(), rgba(0x7a9728ff).into()),
("variant".into(), rgba(0xc38417ff).into()),
("predictive".into(), rgba(0xbe899eff).into()),
("tag".into(), rgba(0x407ee6ff).into()),
("property".into(), rgba(0xf22c40ff).into()),
("enum".into(), rgba(0xdf5421ff).into()),
("attribute".into(), rgba(0x407ee6ff).into()),
("function.method".into(), rgba(0x3f7ee7ff).into()),
("function".into(), rgba(0x3f7ee7ff).into()),
("emphasis".into(), rgba(0x407ee6ff).into()),
("primary".into(), rgba(0x2c2421ff).into()),
("variable".into(), rgba(0x2c2421ff).into()),
("constant".into(), rgba(0x7a9728ff).into()),
("title".into(), rgba(0x1b1918ff).into()),
("comment.doc".into(), rgba(0x68615eff).into()),
("constructor".into(), rgba(0x407ee6ff).into()),
("type".into(), rgba(0xc38417ff).into()),
("punctuation.list_marker".into(), rgba(0x2c2421ff).into()),
("punctuation".into(), rgba(0x2c2421ff).into()),
("string".into(), rgba(0x7a9725ff).into()),
("label".into(), rgba(0x407ee6ff).into()),
("string.special".into(), rgba(0xc33ff3ff).into()),
("embedded".into(), rgba(0x1b1918ff).into()),
("link_text".into(), rgba(0xdf5421ff).into()),
("punctuation.bracket".into(), rgba(0x68615eff).into()),
("comment".into(), rgba(0x9c9491ff).into()),
(
"function.special.definition".into(),
rgba(0xc38417ff).into(),
),
("link_uri".into(), rgba(0x7a9728ff).into()),
("operator".into(), rgba(0x68615eff).into()),
("hint".into(), rgba(0xa67287ff).into()),
("string.special.symbol".into(), rgba(0x7a9725ff).into()),
],
},
status_bar: rgba(0xccc7c5ff).into(),
title_bar: rgba(0xccc7c5ff).into(),
toolbar: rgba(0xf0eeedff).into(),
tab_bar: rgba(0xe9e6e4ff).into(),
editor: rgba(0xf0eeedff).into(),
editor_subheader: rgba(0xe9e6e4ff).into(),
editor_active_line: rgba(0xe9e6e4ff).into(),
terminal: rgba(0xf0eeedff).into(),
image_fallback_background: rgba(0xccc7c5ff).into(),
git_created: rgba(0x7a9728ff).into(),
git_modified: rgba(0x407ee6ff).into(),
git_deleted: rgba(0xf22e40ff).into(),
git_conflict: rgba(0xc38419ff).into(),
git_ignored: rgba(0x837b78ff).into(),
git_renamed: rgba(0xc38419ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x407ee6ff).into(),
selection: rgba(0x407ee63d).into(),
},
PlayerTheme {
cursor: rgba(0x7a9728ff).into(),
selection: rgba(0x7a97283d).into(),
},
PlayerTheme {
cursor: rgba(0xc340f2ff).into(),
selection: rgba(0xc340f23d).into(),
},
PlayerTheme {
cursor: rgba(0xdf5421ff).into(),
selection: rgba(0xdf54213d).into(),
},
PlayerTheme {
cursor: rgba(0x6765e9ff).into(),
selection: rgba(0x6765e93d).into(),
},
PlayerTheme {
cursor: rgba(0x3e96b8ff).into(),
selection: rgba(0x3e96b83d).into(),
},
PlayerTheme {
cursor: rgba(0xf22e40ff).into(),
selection: rgba(0xf22e403d).into(),
},
PlayerTheme {
cursor: rgba(0xc38419ff).into(),
selection: rgba(0xc384193d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_heath_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Heath Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x675b67ff).into(),
border_variant: rgba(0x675b67ff).into(),
border_focused: rgba(0x192961ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x433a43ff).into(),
surface: rgba(0x252025ff).into(),
background: rgba(0x433a43ff).into(),
filled_element: rgba(0x433a43ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x0d1a43ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x0d1a43ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf7f3f7ff).into(),
text_muted: rgba(0xa899a8ff).into(),
text_placeholder: rgba(0xca3f2bff).into(),
text_disabled: rgba(0x908190ff).into(),
text_accent: rgba(0x5169ebff).into(),
icon_muted: rgba(0xa899a8ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("preproc".into(), rgba(0xf7f3f7ff).into()),
("number".into(), rgba(0xa65825ff).into()),
("boolean".into(), rgba(0x918b3aff).into()),
("embedded".into(), rgba(0xf7f3f7ff).into()),
("variable.special".into(), rgba(0x7b58bfff).into()),
("operator".into(), rgba(0xab9babff).into()),
("punctuation.delimiter".into(), rgba(0xab9babff).into()),
("primary".into(), rgba(0xd8cad8ff).into()),
("punctuation.bracket".into(), rgba(0xab9babff).into()),
("comment.doc".into(), rgba(0xab9babff).into()),
("variant".into(), rgba(0xbb8a34ff).into()),
("attribute".into(), rgba(0x5169ebff).into()),
("property".into(), rgba(0xca3f2aff).into()),
("keyword".into(), rgba(0x7b58bfff).into()),
("hint".into(), rgba(0x8d70a8ff).into()),
("string.special.symbol".into(), rgba(0x918b3aff).into()),
("punctuation.special".into(), rgba(0xcc32ccff).into()),
("link_uri".into(), rgba(0x918b3aff).into()),
("link_text".into(), rgba(0xa65827ff).into()),
("enum".into(), rgba(0xa65827ff).into()),
("function".into(), rgba(0x506aecff).into()),
(
"function.special.definition".into(),
rgba(0xbb8a34ff).into(),
),
("constant".into(), rgba(0x918b3aff).into()),
("title".into(), rgba(0xf7f3f7ff).into()),
("string.regex".into(), rgba(0x149393ff).into()),
("variable".into(), rgba(0xd8cad8ff).into()),
("comment".into(), rgba(0x776977ff).into()),
("predictive".into(), rgba(0x75588fff).into()),
("function.method".into(), rgba(0x506aecff).into()),
("type".into(), rgba(0xbb8a34ff).into()),
("punctuation".into(), rgba(0xd8cad8ff).into()),
("emphasis".into(), rgba(0x5169ebff).into()),
("emphasis.strong".into(), rgba(0x5169ebff).into()),
("tag".into(), rgba(0x5169ebff).into()),
("text.literal".into(), rgba(0xa65827ff).into()),
("string".into(), rgba(0x918b3aff).into()),
("string.escape".into(), rgba(0xab9babff).into()),
("constructor".into(), rgba(0x5169ebff).into()),
("label".into(), rgba(0x5169ebff).into()),
("punctuation.list_marker".into(), rgba(0xd8cad8ff).into()),
("string.special".into(), rgba(0xcc32ccff).into()),
],
},
status_bar: rgba(0x433a43ff).into(),
title_bar: rgba(0x433a43ff).into(),
toolbar: rgba(0x1b181bff).into(),
tab_bar: rgba(0x252025ff).into(),
editor: rgba(0x1b181bff).into(),
editor_subheader: rgba(0x252025ff).into(),
editor_active_line: rgba(0x252025ff).into(),
terminal: rgba(0x1b181bff).into(),
image_fallback_background: rgba(0x433a43ff).into(),
git_created: rgba(0x918b3aff).into(),
git_modified: rgba(0x5169ebff).into(),
git_deleted: rgba(0xca3f2bff).into(),
git_conflict: rgba(0xbb8a35ff).into(),
git_ignored: rgba(0x908190ff).into(),
git_renamed: rgba(0xbb8a35ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x5169ebff).into(),
selection: rgba(0x5169eb3d).into(),
},
PlayerTheme {
cursor: rgba(0x918b3aff).into(),
selection: rgba(0x918b3a3d).into(),
},
PlayerTheme {
cursor: rgba(0xcc34ccff).into(),
selection: rgba(0xcc34cc3d).into(),
},
PlayerTheme {
cursor: rgba(0xa65827ff).into(),
selection: rgba(0xa658273d).into(),
},
PlayerTheme {
cursor: rgba(0x7b58bfff).into(),
selection: rgba(0x7b58bf3d).into(),
},
PlayerTheme {
cursor: rgba(0x189393ff).into(),
selection: rgba(0x1893933d).into(),
},
PlayerTheme {
cursor: rgba(0xca3f2bff).into(),
selection: rgba(0xca3f2b3d).into(),
},
PlayerTheme {
cursor: rgba(0xbb8a35ff).into(),
selection: rgba(0xbb8a353d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_heath_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Heath Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xad9dadff).into(),
border_variant: rgba(0xad9dadff).into(),
border_focused: rgba(0xcac7faff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xc6b8c6ff).into(),
surface: rgba(0xe0d5e0ff).into(),
background: rgba(0xc6b8c6ff).into(),
filled_element: rgba(0xc6b8c6ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xe2dffcff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xe2dffcff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x1b181bff).into(),
text_muted: rgba(0x6b5e6bff).into(),
text_placeholder: rgba(0xca402bff).into(),
text_disabled: rgba(0x857785ff).into(),
text_accent: rgba(0x5169ebff).into(),
icon_muted: rgba(0x6b5e6bff).into(),
syntax: SyntaxTheme {
highlights: vec![
("enum".into(), rgba(0xa65927ff).into()),
("string.escape".into(), rgba(0x695d69ff).into()),
("link_uri".into(), rgba(0x918b3bff).into()),
("function.method".into(), rgba(0x506aecff).into()),
("comment.doc".into(), rgba(0x695d69ff).into()),
("property".into(), rgba(0xca3f2aff).into()),
("string.special".into(), rgba(0xcc32ccff).into()),
("tag".into(), rgba(0x5169ebff).into()),
("embedded".into(), rgba(0x1b181bff).into()),
("primary".into(), rgba(0x292329ff).into()),
("punctuation".into(), rgba(0x292329ff).into()),
("punctuation.special".into(), rgba(0xcc32ccff).into()),
("type".into(), rgba(0xbb8a34ff).into()),
("number".into(), rgba(0xa65825ff).into()),
("function".into(), rgba(0x506aecff).into()),
("preproc".into(), rgba(0x1b181bff).into()),
("punctuation.bracket".into(), rgba(0x695d69ff).into()),
("punctuation.delimiter".into(), rgba(0x695d69ff).into()),
("variable".into(), rgba(0x292329ff).into()),
(
"function.special.definition".into(),
rgba(0xbb8a34ff).into(),
),
("label".into(), rgba(0x5169ebff).into()),
("constructor".into(), rgba(0x5169ebff).into()),
("emphasis.strong".into(), rgba(0x5169ebff).into()),
("constant".into(), rgba(0x918b3bff).into()),
("keyword".into(), rgba(0x7b58bfff).into()),
("variable.special".into(), rgba(0x7b58bfff).into()),
("variant".into(), rgba(0xbb8a34ff).into()),
("title".into(), rgba(0x1b181bff).into()),
("attribute".into(), rgba(0x5169ebff).into()),
("comment".into(), rgba(0x9e8f9eff).into()),
("string.special.symbol".into(), rgba(0x918b3aff).into()),
("predictive".into(), rgba(0xa487bfff).into()),
("link_text".into(), rgba(0xa65927ff).into()),
("punctuation.list_marker".into(), rgba(0x292329ff).into()),
("boolean".into(), rgba(0x918b3bff).into()),
("text.literal".into(), rgba(0xa65927ff).into()),
("emphasis".into(), rgba(0x5169ebff).into()),
("string.regex".into(), rgba(0x149393ff).into()),
("hint".into(), rgba(0x8c70a6ff).into()),
("string".into(), rgba(0x918b3aff).into()),
("operator".into(), rgba(0x695d69ff).into()),
],
},
status_bar: rgba(0xc6b8c6ff).into(),
title_bar: rgba(0xc6b8c6ff).into(),
toolbar: rgba(0xf7f3f7ff).into(),
tab_bar: rgba(0xe0d5e0ff).into(),
editor: rgba(0xf7f3f7ff).into(),
editor_subheader: rgba(0xe0d5e0ff).into(),
editor_active_line: rgba(0xe0d5e0ff).into(),
terminal: rgba(0xf7f3f7ff).into(),
image_fallback_background: rgba(0xc6b8c6ff).into(),
git_created: rgba(0x918b3bff).into(),
git_modified: rgba(0x5169ebff).into(),
git_deleted: rgba(0xca402bff).into(),
git_conflict: rgba(0xbb8a35ff).into(),
git_ignored: rgba(0x857785ff).into(),
git_renamed: rgba(0xbb8a35ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x5169ebff).into(),
selection: rgba(0x5169eb3d).into(),
},
PlayerTheme {
cursor: rgba(0x918b3bff).into(),
selection: rgba(0x918b3b3d).into(),
},
PlayerTheme {
cursor: rgba(0xcc34ccff).into(),
selection: rgba(0xcc34cc3d).into(),
},
PlayerTheme {
cursor: rgba(0xa65927ff).into(),
selection: rgba(0xa659273d).into(),
},
PlayerTheme {
cursor: rgba(0x7a5ac0ff).into(),
selection: rgba(0x7a5ac03d).into(),
},
PlayerTheme {
cursor: rgba(0x189393ff).into(),
selection: rgba(0x1893933d).into(),
},
PlayerTheme {
cursor: rgba(0xca402bff).into(),
selection: rgba(0xca402b3d).into(),
},
PlayerTheme {
cursor: rgba(0xbb8a35ff).into(),
selection: rgba(0xbb8a353d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_lakeside_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Lakeside Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x4f6a78ff).into(),
border_variant: rgba(0x4f6a78ff).into(),
border_focused: rgba(0x1a2f3cff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x33444dff).into(),
surface: rgba(0x1c2529ff).into(),
background: rgba(0x33444dff).into(),
filled_element: rgba(0x33444dff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x121c24ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x121c24ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xebf8ffff).into(),
text_muted: rgba(0x7c9fb3ff).into(),
text_placeholder: rgba(0xd22e72ff).into(),
text_disabled: rgba(0x688c9dff).into(),
text_accent: rgba(0x267eadff).into(),
icon_muted: rgba(0x7c9fb3ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("punctuation.bracket".into(), rgba(0x7ea2b4ff).into()),
("punctuation.special".into(), rgba(0xb72cd2ff).into()),
("property".into(), rgba(0xd22c72ff).into()),
("function.method".into(), rgba(0x247eadff).into()),
("comment".into(), rgba(0x5a7b8cff).into()),
("constructor".into(), rgba(0x267eadff).into()),
("boolean".into(), rgba(0x558c3aff).into()),
("hint".into(), rgba(0x52809aff).into()),
("label".into(), rgba(0x267eadff).into()),
("string.special".into(), rgba(0xb72cd2ff).into()),
("title".into(), rgba(0xebf8ffff).into()),
("punctuation.list_marker".into(), rgba(0xc1e4f6ff).into()),
("emphasis.strong".into(), rgba(0x267eadff).into()),
("enum".into(), rgba(0x935b25ff).into()),
("type".into(), rgba(0x8a8a0eff).into()),
("tag".into(), rgba(0x267eadff).into()),
("punctuation.delimiter".into(), rgba(0x7ea2b4ff).into()),
("primary".into(), rgba(0xc1e4f6ff).into()),
("link_text".into(), rgba(0x935b25ff).into()),
("variable".into(), rgba(0xc1e4f6ff).into()),
("variable.special".into(), rgba(0x6a6ab7ff).into()),
("string.special.symbol".into(), rgba(0x558c3aff).into()),
("link_uri".into(), rgba(0x558c3aff).into()),
("function".into(), rgba(0x247eadff).into()),
("predictive".into(), rgba(0x426f88ff).into()),
("punctuation".into(), rgba(0xc1e4f6ff).into()),
("string.escape".into(), rgba(0x7ea2b4ff).into()),
("keyword".into(), rgba(0x6a6ab7ff).into()),
("attribute".into(), rgba(0x267eadff).into()),
("string.regex".into(), rgba(0x2c8f6eff).into()),
("embedded".into(), rgba(0xebf8ffff).into()),
("emphasis".into(), rgba(0x267eadff).into()),
("string".into(), rgba(0x558c3aff).into()),
("operator".into(), rgba(0x7ea2b4ff).into()),
("text.literal".into(), rgba(0x935b25ff).into()),
("constant".into(), rgba(0x558c3aff).into()),
("comment.doc".into(), rgba(0x7ea2b4ff).into()),
("number".into(), rgba(0x935c24ff).into()),
("preproc".into(), rgba(0xebf8ffff).into()),
(
"function.special.definition".into(),
rgba(0x8a8a0eff).into(),
),
("variant".into(), rgba(0x8a8a0eff).into()),
],
},
status_bar: rgba(0x33444dff).into(),
title_bar: rgba(0x33444dff).into(),
toolbar: rgba(0x161b1dff).into(),
tab_bar: rgba(0x1c2529ff).into(),
editor: rgba(0x161b1dff).into(),
editor_subheader: rgba(0x1c2529ff).into(),
editor_active_line: rgba(0x1c2529ff).into(),
terminal: rgba(0x161b1dff).into(),
image_fallback_background: rgba(0x33444dff).into(),
git_created: rgba(0x558c3aff).into(),
git_modified: rgba(0x267eadff).into(),
git_deleted: rgba(0xd22e72ff).into(),
git_conflict: rgba(0x8a8a10ff).into(),
git_ignored: rgba(0x688c9dff).into(),
git_renamed: rgba(0x8a8a10ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x267eadff).into(),
selection: rgba(0x267ead3d).into(),
},
PlayerTheme {
cursor: rgba(0x558c3aff).into(),
selection: rgba(0x558c3a3d).into(),
},
PlayerTheme {
cursor: rgba(0xb72ed2ff).into(),
selection: rgba(0xb72ed23d).into(),
},
PlayerTheme {
cursor: rgba(0x935b25ff).into(),
selection: rgba(0x935b253d).into(),
},
PlayerTheme {
cursor: rgba(0x6a6ab7ff).into(),
selection: rgba(0x6a6ab73d).into(),
},
PlayerTheme {
cursor: rgba(0x2d8f6fff).into(),
selection: rgba(0x2d8f6f3d).into(),
},
PlayerTheme {
cursor: rgba(0xd22e72ff).into(),
selection: rgba(0xd22e723d).into(),
},
PlayerTheme {
cursor: rgba(0x8a8a10ff).into(),
selection: rgba(0x8a8a103d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_lakeside_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Lakeside Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x80a4b6ff).into(),
border_variant: rgba(0x80a4b6ff).into(),
border_focused: rgba(0xb9cee0ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xa6cadcff).into(),
surface: rgba(0xcdeaf9ff).into(),
background: rgba(0xa6cadcff).into(),
filled_element: rgba(0xa6cadcff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xd8e4eeff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xd8e4eeff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x161b1dff).into(),
text_muted: rgba(0x526f7dff).into(),
text_placeholder: rgba(0xd22e71ff).into(),
text_disabled: rgba(0x628496ff).into(),
text_accent: rgba(0x267eadff).into(),
icon_muted: rgba(0x526f7dff).into(),
syntax: SyntaxTheme {
highlights: vec![
("emphasis".into(), rgba(0x267eadff).into()),
("number".into(), rgba(0x935c24ff).into()),
("embedded".into(), rgba(0x161b1dff).into()),
("link_text".into(), rgba(0x935c25ff).into()),
("string".into(), rgba(0x558c3aff).into()),
("constructor".into(), rgba(0x267eadff).into()),
("punctuation.list_marker".into(), rgba(0x1f292eff).into()),
("string.special".into(), rgba(0xb72cd2ff).into()),
("title".into(), rgba(0x161b1dff).into()),
("variant".into(), rgba(0x8a8a0eff).into()),
("tag".into(), rgba(0x267eadff).into()),
("attribute".into(), rgba(0x267eadff).into()),
("keyword".into(), rgba(0x6a6ab7ff).into()),
("enum".into(), rgba(0x935c25ff).into()),
("function".into(), rgba(0x247eadff).into()),
("string.escape".into(), rgba(0x516d7bff).into()),
("operator".into(), rgba(0x516d7bff).into()),
("function.method".into(), rgba(0x247eadff).into()),
(
"function.special.definition".into(),
rgba(0x8a8a0eff).into(),
),
("punctuation.delimiter".into(), rgba(0x516d7bff).into()),
("comment".into(), rgba(0x7094a7ff).into()),
("primary".into(), rgba(0x1f292eff).into()),
("punctuation.bracket".into(), rgba(0x516d7bff).into()),
("variable".into(), rgba(0x1f292eff).into()),
("emphasis.strong".into(), rgba(0x267eadff).into()),
("predictive".into(), rgba(0x6a97b2ff).into()),
("punctuation.special".into(), rgba(0xb72cd2ff).into()),
("hint".into(), rgba(0x5a87a0ff).into()),
("text.literal".into(), rgba(0x935c25ff).into()),
("string.special.symbol".into(), rgba(0x558c3aff).into()),
("comment.doc".into(), rgba(0x516d7bff).into()),
("constant".into(), rgba(0x568c3bff).into()),
("boolean".into(), rgba(0x568c3bff).into()),
("preproc".into(), rgba(0x161b1dff).into()),
("variable.special".into(), rgba(0x6a6ab7ff).into()),
("link_uri".into(), rgba(0x568c3bff).into()),
("string.regex".into(), rgba(0x2c8f6eff).into()),
("punctuation".into(), rgba(0x1f292eff).into()),
("property".into(), rgba(0xd22c72ff).into()),
("label".into(), rgba(0x267eadff).into()),
("type".into(), rgba(0x8a8a0eff).into()),
],
},
status_bar: rgba(0xa6cadcff).into(),
title_bar: rgba(0xa6cadcff).into(),
toolbar: rgba(0xebf8ffff).into(),
tab_bar: rgba(0xcdeaf9ff).into(),
editor: rgba(0xebf8ffff).into(),
editor_subheader: rgba(0xcdeaf9ff).into(),
editor_active_line: rgba(0xcdeaf9ff).into(),
terminal: rgba(0xebf8ffff).into(),
image_fallback_background: rgba(0xa6cadcff).into(),
git_created: rgba(0x568c3bff).into(),
git_modified: rgba(0x267eadff).into(),
git_deleted: rgba(0xd22e71ff).into(),
git_conflict: rgba(0x8a8a10ff).into(),
git_ignored: rgba(0x628496ff).into(),
git_renamed: rgba(0x8a8a10ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x267eadff).into(),
selection: rgba(0x267ead3d).into(),
},
PlayerTheme {
cursor: rgba(0x568c3bff).into(),
selection: rgba(0x568c3b3d).into(),
},
PlayerTheme {
cursor: rgba(0xb72ed2ff).into(),
selection: rgba(0xb72ed23d).into(),
},
PlayerTheme {
cursor: rgba(0x935c25ff).into(),
selection: rgba(0x935c253d).into(),
},
PlayerTheme {
cursor: rgba(0x6c6ab7ff).into(),
selection: rgba(0x6c6ab73d).into(),
},
PlayerTheme {
cursor: rgba(0x2e8f6eff).into(),
selection: rgba(0x2e8f6e3d).into(),
},
PlayerTheme {
cursor: rgba(0xd22e71ff).into(),
selection: rgba(0xd22e713d).into(),
},
PlayerTheme {
cursor: rgba(0x8a8a10ff).into(),
selection: rgba(0x8a8a103d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_plateau_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Plateau Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x564e4eff).into(),
border_variant: rgba(0x564e4eff).into(),
border_focused: rgba(0x2c2b45ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x3b3535ff).into(),
surface: rgba(0x252020ff).into(),
background: rgba(0x3b3535ff).into(),
filled_element: rgba(0x3b3535ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x1c1b29ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x1c1b29ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf4ececff).into(),
text_muted: rgba(0x898383ff).into(),
text_placeholder: rgba(0xca4848ff).into(),
text_disabled: rgba(0x756e6eff).into(),
text_accent: rgba(0x7272caff).into(),
icon_muted: rgba(0x898383ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("variant".into(), rgba(0xa06d3aff).into()),
("label".into(), rgba(0x7272caff).into()),
("punctuation.delimiter".into(), rgba(0x8a8585ff).into()),
("string.regex".into(), rgba(0x5485b6ff).into()),
("variable.special".into(), rgba(0x8464c4ff).into()),
("string".into(), rgba(0x4b8b8bff).into()),
("property".into(), rgba(0xca4848ff).into()),
("hint".into(), rgba(0x8a647aff).into()),
("comment.doc".into(), rgba(0x8a8585ff).into()),
("attribute".into(), rgba(0x7272caff).into()),
("tag".into(), rgba(0x7272caff).into()),
("constructor".into(), rgba(0x7272caff).into()),
("boolean".into(), rgba(0x4b8b8bff).into()),
("preproc".into(), rgba(0xf4ececff).into()),
("constant".into(), rgba(0x4b8b8bff).into()),
("punctuation.special".into(), rgba(0xbd5187ff).into()),
("function.method".into(), rgba(0x7272caff).into()),
("comment".into(), rgba(0x655d5dff).into()),
("variable".into(), rgba(0xe7dfdfff).into()),
("primary".into(), rgba(0xe7dfdfff).into()),
("title".into(), rgba(0xf4ececff).into()),
("emphasis".into(), rgba(0x7272caff).into()),
("emphasis.strong".into(), rgba(0x7272caff).into()),
("function".into(), rgba(0x7272caff).into()),
("type".into(), rgba(0xa06d3aff).into()),
("operator".into(), rgba(0x8a8585ff).into()),
("embedded".into(), rgba(0xf4ececff).into()),
("predictive".into(), rgba(0x795369ff).into()),
("punctuation".into(), rgba(0xe7dfdfff).into()),
("link_text".into(), rgba(0xb4593bff).into()),
("enum".into(), rgba(0xb4593bff).into()),
("string.special".into(), rgba(0xbd5187ff).into()),
("text.literal".into(), rgba(0xb4593bff).into()),
("string.escape".into(), rgba(0x8a8585ff).into()),
(
"function.special.definition".into(),
rgba(0xa06d3aff).into(),
),
("keyword".into(), rgba(0x8464c4ff).into()),
("link_uri".into(), rgba(0x4b8b8bff).into()),
("number".into(), rgba(0xb4593bff).into()),
("punctuation.bracket".into(), rgba(0x8a8585ff).into()),
("string.special.symbol".into(), rgba(0x4b8b8bff).into()),
("punctuation.list_marker".into(), rgba(0xe7dfdfff).into()),
],
},
status_bar: rgba(0x3b3535ff).into(),
title_bar: rgba(0x3b3535ff).into(),
toolbar: rgba(0x1b1818ff).into(),
tab_bar: rgba(0x252020ff).into(),
editor: rgba(0x1b1818ff).into(),
editor_subheader: rgba(0x252020ff).into(),
editor_active_line: rgba(0x252020ff).into(),
terminal: rgba(0x1b1818ff).into(),
image_fallback_background: rgba(0x3b3535ff).into(),
git_created: rgba(0x4b8b8bff).into(),
git_modified: rgba(0x7272caff).into(),
git_deleted: rgba(0xca4848ff).into(),
git_conflict: rgba(0xa06d3aff).into(),
git_ignored: rgba(0x756e6eff).into(),
git_renamed: rgba(0xa06d3aff).into(),
players: [
PlayerTheme {
cursor: rgba(0x7272caff).into(),
selection: rgba(0x7272ca3d).into(),
},
PlayerTheme {
cursor: rgba(0x4b8b8bff).into(),
selection: rgba(0x4b8b8b3d).into(),
},
PlayerTheme {
cursor: rgba(0xbd5187ff).into(),
selection: rgba(0xbd51873d).into(),
},
PlayerTheme {
cursor: rgba(0xb4593bff).into(),
selection: rgba(0xb4593b3d).into(),
},
PlayerTheme {
cursor: rgba(0x8464c4ff).into(),
selection: rgba(0x8464c43d).into(),
},
PlayerTheme {
cursor: rgba(0x5485b6ff).into(),
selection: rgba(0x5485b63d).into(),
},
PlayerTheme {
cursor: rgba(0xca4848ff).into(),
selection: rgba(0xca48483d).into(),
},
PlayerTheme {
cursor: rgba(0xa06d3aff).into(),
selection: rgba(0xa06d3a3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_plateau_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Plateau Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x8e8989ff).into(),
border_variant: rgba(0x8e8989ff).into(),
border_focused: rgba(0xcecaecff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xc1bbbbff).into(),
surface: rgba(0xebe3e3ff).into(),
background: rgba(0xc1bbbbff).into(),
filled_element: rgba(0xc1bbbbff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xe4e1f5ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xe4e1f5ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x1b1818ff).into(),
text_muted: rgba(0x5a5252ff).into(),
text_placeholder: rgba(0xca4a4aff).into(),
text_disabled: rgba(0x6e6666ff).into(),
text_accent: rgba(0x7272caff).into(),
icon_muted: rgba(0x5a5252ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("text.literal".into(), rgba(0xb45a3cff).into()),
("punctuation.special".into(), rgba(0xbd5187ff).into()),
("variant".into(), rgba(0xa06d3aff).into()),
("punctuation".into(), rgba(0x292424ff).into()),
("string.escape".into(), rgba(0x585050ff).into()),
("emphasis".into(), rgba(0x7272caff).into()),
("title".into(), rgba(0x1b1818ff).into()),
("constructor".into(), rgba(0x7272caff).into()),
("variable".into(), rgba(0x292424ff).into()),
("predictive".into(), rgba(0xa27a91ff).into()),
("label".into(), rgba(0x7272caff).into()),
("function.method".into(), rgba(0x7272caff).into()),
("link_uri".into(), rgba(0x4c8b8bff).into()),
("punctuation.delimiter".into(), rgba(0x585050ff).into()),
("link_text".into(), rgba(0xb45a3cff).into()),
("hint".into(), rgba(0x91697fff).into()),
("emphasis.strong".into(), rgba(0x7272caff).into()),
("attribute".into(), rgba(0x7272caff).into()),
("boolean".into(), rgba(0x4c8b8bff).into()),
("string.special.symbol".into(), rgba(0x4b8b8bff).into()),
("string".into(), rgba(0x4b8b8bff).into()),
("type".into(), rgba(0xa06d3aff).into()),
("string.regex".into(), rgba(0x5485b6ff).into()),
("comment.doc".into(), rgba(0x585050ff).into()),
("string.special".into(), rgba(0xbd5187ff).into()),
("property".into(), rgba(0xca4848ff).into()),
("preproc".into(), rgba(0x1b1818ff).into()),
("embedded".into(), rgba(0x1b1818ff).into()),
("comment".into(), rgba(0x7e7777ff).into()),
("primary".into(), rgba(0x292424ff).into()),
("number".into(), rgba(0xb4593bff).into()),
("function".into(), rgba(0x7272caff).into()),
("punctuation.bracket".into(), rgba(0x585050ff).into()),
("tag".into(), rgba(0x7272caff).into()),
("punctuation.list_marker".into(), rgba(0x292424ff).into()),
(
"function.special.definition".into(),
rgba(0xa06d3aff).into(),
),
("enum".into(), rgba(0xb45a3cff).into()),
("keyword".into(), rgba(0x8464c4ff).into()),
("operator".into(), rgba(0x585050ff).into()),
("variable.special".into(), rgba(0x8464c4ff).into()),
("constant".into(), rgba(0x4c8b8bff).into()),
],
},
status_bar: rgba(0xc1bbbbff).into(),
title_bar: rgba(0xc1bbbbff).into(),
toolbar: rgba(0xf4ececff).into(),
tab_bar: rgba(0xebe3e3ff).into(),
editor: rgba(0xf4ececff).into(),
editor_subheader: rgba(0xebe3e3ff).into(),
editor_active_line: rgba(0xebe3e3ff).into(),
terminal: rgba(0xf4ececff).into(),
image_fallback_background: rgba(0xc1bbbbff).into(),
git_created: rgba(0x4c8b8bff).into(),
git_modified: rgba(0x7272caff).into(),
git_deleted: rgba(0xca4a4aff).into(),
git_conflict: rgba(0xa06e3bff).into(),
git_ignored: rgba(0x6e6666ff).into(),
git_renamed: rgba(0xa06e3bff).into(),
players: [
PlayerTheme {
cursor: rgba(0x7272caff).into(),
selection: rgba(0x7272ca3d).into(),
},
PlayerTheme {
cursor: rgba(0x4c8b8bff).into(),
selection: rgba(0x4c8b8b3d).into(),
},
PlayerTheme {
cursor: rgba(0xbd5186ff).into(),
selection: rgba(0xbd51863d).into(),
},
PlayerTheme {
cursor: rgba(0xb45a3cff).into(),
selection: rgba(0xb45a3c3d).into(),
},
PlayerTheme {
cursor: rgba(0x8464c4ff).into(),
selection: rgba(0x8464c43d).into(),
},
PlayerTheme {
cursor: rgba(0x5485b5ff).into(),
selection: rgba(0x5485b53d).into(),
},
PlayerTheme {
cursor: rgba(0xca4a4aff).into(),
selection: rgba(0xca4a4a3d).into(),
},
PlayerTheme {
cursor: rgba(0xa06e3bff).into(),
selection: rgba(0xa06e3b3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_savanna_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Savanna Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x505e55ff).into(),
border_variant: rgba(0x505e55ff).into(),
border_focused: rgba(0x1f3233ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x353f39ff).into(),
surface: rgba(0x1f2621ff).into(),
background: rgba(0x353f39ff).into(),
filled_element: rgba(0x353f39ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x151e20ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x151e20ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xecf4eeff).into(),
text_muted: rgba(0x859188ff).into(),
text_placeholder: rgba(0xb16038ff).into(),
text_disabled: rgba(0x6f7e74ff).into(),
text_accent: rgba(0x468b8fff).into(),
icon_muted: rgba(0x859188ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("function.method".into(), rgba(0x468b8fff).into()),
("title".into(), rgba(0xecf4eeff).into()),
("label".into(), rgba(0x468b8fff).into()),
("text.literal".into(), rgba(0x9f703bff).into()),
("boolean".into(), rgba(0x479962ff).into()),
("punctuation.list_marker".into(), rgba(0xdfe7e2ff).into()),
("string.escape".into(), rgba(0x87928aff).into()),
("string.special".into(), rgba(0x857368ff).into()),
("punctuation.delimiter".into(), rgba(0x87928aff).into()),
("tag".into(), rgba(0x468b8fff).into()),
("property".into(), rgba(0xb16038ff).into()),
("preproc".into(), rgba(0xecf4eeff).into()),
("primary".into(), rgba(0xdfe7e2ff).into()),
("link_uri".into(), rgba(0x479962ff).into()),
("comment".into(), rgba(0x5f6d64ff).into()),
("type".into(), rgba(0xa07d3aff).into()),
("hint".into(), rgba(0x607e76ff).into()),
("punctuation".into(), rgba(0xdfe7e2ff).into()),
("string.special.symbol".into(), rgba(0x479962ff).into()),
("emphasis.strong".into(), rgba(0x468b8fff).into()),
("keyword".into(), rgba(0x55859bff).into()),
("comment.doc".into(), rgba(0x87928aff).into()),
("punctuation.bracket".into(), rgba(0x87928aff).into()),
("constant".into(), rgba(0x479962ff).into()),
("link_text".into(), rgba(0x9f703bff).into()),
("number".into(), rgba(0x9f703bff).into()),
("function".into(), rgba(0x468b8fff).into()),
("variable".into(), rgba(0xdfe7e2ff).into()),
("emphasis".into(), rgba(0x468b8fff).into()),
("punctuation.special".into(), rgba(0x857368ff).into()),
("constructor".into(), rgba(0x468b8fff).into()),
("variable.special".into(), rgba(0x55859bff).into()),
("operator".into(), rgba(0x87928aff).into()),
("enum".into(), rgba(0x9f703bff).into()),
("string.regex".into(), rgba(0x1b9aa0ff).into()),
("attribute".into(), rgba(0x468b8fff).into()),
("predictive".into(), rgba(0x506d66ff).into()),
("string".into(), rgba(0x479962ff).into()),
("embedded".into(), rgba(0xecf4eeff).into()),
("variant".into(), rgba(0xa07d3aff).into()),
(
"function.special.definition".into(),
rgba(0xa07d3aff).into(),
),
],
},
status_bar: rgba(0x353f39ff).into(),
title_bar: rgba(0x353f39ff).into(),
toolbar: rgba(0x171c19ff).into(),
tab_bar: rgba(0x1f2621ff).into(),
editor: rgba(0x171c19ff).into(),
editor_subheader: rgba(0x1f2621ff).into(),
editor_active_line: rgba(0x1f2621ff).into(),
terminal: rgba(0x171c19ff).into(),
image_fallback_background: rgba(0x353f39ff).into(),
git_created: rgba(0x479962ff).into(),
git_modified: rgba(0x468b8fff).into(),
git_deleted: rgba(0xb16038ff).into(),
git_conflict: rgba(0xa07d3aff).into(),
git_ignored: rgba(0x6f7e74ff).into(),
git_renamed: rgba(0xa07d3aff).into(),
players: [
PlayerTheme {
cursor: rgba(0x468b8fff).into(),
selection: rgba(0x468b8f3d).into(),
},
PlayerTheme {
cursor: rgba(0x479962ff).into(),
selection: rgba(0x4799623d).into(),
},
PlayerTheme {
cursor: rgba(0x857368ff).into(),
selection: rgba(0x8573683d).into(),
},
PlayerTheme {
cursor: rgba(0x9f703bff).into(),
selection: rgba(0x9f703b3d).into(),
},
PlayerTheme {
cursor: rgba(0x55859bff).into(),
selection: rgba(0x55859b3d).into(),
},
PlayerTheme {
cursor: rgba(0x1d9aa0ff).into(),
selection: rgba(0x1d9aa03d).into(),
},
PlayerTheme {
cursor: rgba(0xb16038ff).into(),
selection: rgba(0xb160383d).into(),
},
PlayerTheme {
cursor: rgba(0xa07d3aff).into(),
selection: rgba(0xa07d3a3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_savanna_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Savanna Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x8b968eff).into(),
border_variant: rgba(0x8b968eff).into(),
border_focused: rgba(0xbed4d6ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xbcc5bfff).into(),
surface: rgba(0xe3ebe6ff).into(),
background: rgba(0xbcc5bfff).into(),
filled_element: rgba(0xbcc5bfff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xdae7e8ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xdae7e8ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x171c19ff).into(),
text_muted: rgba(0x546259ff).into(),
text_placeholder: rgba(0xb16139ff).into(),
text_disabled: rgba(0x68766dff).into(),
text_accent: rgba(0x488b90ff).into(),
icon_muted: rgba(0x546259ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("text.literal".into(), rgba(0x9f713cff).into()),
("string".into(), rgba(0x479962ff).into()),
("punctuation.special".into(), rgba(0x857368ff).into()),
("type".into(), rgba(0xa07d3aff).into()),
("enum".into(), rgba(0x9f713cff).into()),
("title".into(), rgba(0x171c19ff).into()),
("comment".into(), rgba(0x77877cff).into()),
("predictive".into(), rgba(0x75958bff).into()),
("punctuation.list_marker".into(), rgba(0x232a25ff).into()),
("string.special.symbol".into(), rgba(0x479962ff).into()),
("constructor".into(), rgba(0x488b90ff).into()),
("variable".into(), rgba(0x232a25ff).into()),
("label".into(), rgba(0x488b90ff).into()),
("attribute".into(), rgba(0x488b90ff).into()),
("constant".into(), rgba(0x499963ff).into()),
("function".into(), rgba(0x468b8fff).into()),
("variable.special".into(), rgba(0x55859bff).into()),
("keyword".into(), rgba(0x55859bff).into()),
("number".into(), rgba(0x9f703bff).into()),
("boolean".into(), rgba(0x499963ff).into()),
("embedded".into(), rgba(0x171c19ff).into()),
("string.special".into(), rgba(0x857368ff).into()),
("emphasis.strong".into(), rgba(0x488b90ff).into()),
("string.regex".into(), rgba(0x1b9aa0ff).into()),
("hint".into(), rgba(0x66847cff).into()),
("preproc".into(), rgba(0x171c19ff).into()),
("link_uri".into(), rgba(0x499963ff).into()),
("variant".into(), rgba(0xa07d3aff).into()),
("function.method".into(), rgba(0x468b8fff).into()),
("punctuation.bracket".into(), rgba(0x526057ff).into()),
("punctuation.delimiter".into(), rgba(0x526057ff).into()),
("punctuation".into(), rgba(0x232a25ff).into()),
("primary".into(), rgba(0x232a25ff).into()),
("string.escape".into(), rgba(0x526057ff).into()),
("property".into(), rgba(0xb16038ff).into()),
("operator".into(), rgba(0x526057ff).into()),
("comment.doc".into(), rgba(0x526057ff).into()),
(
"function.special.definition".into(),
rgba(0xa07d3aff).into(),
),
("link_text".into(), rgba(0x9f713cff).into()),
("tag".into(), rgba(0x488b90ff).into()),
("emphasis".into(), rgba(0x488b90ff).into()),
],
},
status_bar: rgba(0xbcc5bfff).into(),
title_bar: rgba(0xbcc5bfff).into(),
toolbar: rgba(0xecf4eeff).into(),
tab_bar: rgba(0xe3ebe6ff).into(),
editor: rgba(0xecf4eeff).into(),
editor_subheader: rgba(0xe3ebe6ff).into(),
editor_active_line: rgba(0xe3ebe6ff).into(),
terminal: rgba(0xecf4eeff).into(),
image_fallback_background: rgba(0xbcc5bfff).into(),
git_created: rgba(0x499963ff).into(),
git_modified: rgba(0x488b90ff).into(),
git_deleted: rgba(0xb16139ff).into(),
git_conflict: rgba(0xa07d3bff).into(),
git_ignored: rgba(0x68766dff).into(),
git_renamed: rgba(0xa07d3bff).into(),
players: [
PlayerTheme {
cursor: rgba(0x488b90ff).into(),
selection: rgba(0x488b903d).into(),
},
PlayerTheme {
cursor: rgba(0x499963ff).into(),
selection: rgba(0x4999633d).into(),
},
PlayerTheme {
cursor: rgba(0x857368ff).into(),
selection: rgba(0x8573683d).into(),
},
PlayerTheme {
cursor: rgba(0x9f713cff).into(),
selection: rgba(0x9f713c3d).into(),
},
PlayerTheme {
cursor: rgba(0x55859bff).into(),
selection: rgba(0x55859b3d).into(),
},
PlayerTheme {
cursor: rgba(0x1e9aa0ff).into(),
selection: rgba(0x1e9aa03d).into(),
},
PlayerTheme {
cursor: rgba(0xb16139ff).into(),
selection: rgba(0xb161393d).into(),
},
PlayerTheme {
cursor: rgba(0xa07d3bff).into(),
selection: rgba(0xa07d3b3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_seaside_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Seaside Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x5c6c5cff).into(),
border_variant: rgba(0x5c6c5cff).into(),
border_focused: rgba(0x102667ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x3b453bff).into(),
surface: rgba(0x1f231fff).into(),
background: rgba(0x3b453bff).into(),
filled_element: rgba(0x3b453bff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x051949ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x051949ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf3faf3ff).into(),
text_muted: rgba(0x8ba48bff).into(),
text_placeholder: rgba(0xe61c3bff).into(),
text_disabled: rgba(0x778f77ff).into(),
text_accent: rgba(0x3e62f4ff).into(),
icon_muted: rgba(0x8ba48bff).into(),
syntax: SyntaxTheme {
highlights: vec![
("comment".into(), rgba(0x687d68ff).into()),
("predictive".into(), rgba(0x00788bff).into()),
("string.special".into(), rgba(0xe618c3ff).into()),
("string.regex".into(), rgba(0x1899b3ff).into()),
("boolean".into(), rgba(0x2aa329ff).into()),
("string".into(), rgba(0x28a328ff).into()),
("operator".into(), rgba(0x8ca68cff).into()),
("primary".into(), rgba(0xcfe8cfff).into()),
("number".into(), rgba(0x87711cff).into()),
("punctuation.special".into(), rgba(0xe618c3ff).into()),
("link_text".into(), rgba(0x87711dff).into()),
("title".into(), rgba(0xf3faf3ff).into()),
("comment.doc".into(), rgba(0x8ca68cff).into()),
("label".into(), rgba(0x3e62f4ff).into()),
("preproc".into(), rgba(0xf3faf3ff).into()),
("punctuation.bracket".into(), rgba(0x8ca68cff).into()),
("punctuation.delimiter".into(), rgba(0x8ca68cff).into()),
("function.method".into(), rgba(0x3d62f5ff).into()),
("tag".into(), rgba(0x3e62f4ff).into()),
("embedded".into(), rgba(0xf3faf3ff).into()),
("text.literal".into(), rgba(0x87711dff).into()),
("punctuation".into(), rgba(0xcfe8cfff).into()),
("string.special.symbol".into(), rgba(0x28a328ff).into()),
("link_uri".into(), rgba(0x2aa329ff).into()),
("keyword".into(), rgba(0xac2aeeff).into()),
("function".into(), rgba(0x3d62f5ff).into()),
("string.escape".into(), rgba(0x8ca68cff).into()),
("variant".into(), rgba(0x98981bff).into()),
(
"function.special.definition".into(),
rgba(0x98981bff).into(),
),
("constructor".into(), rgba(0x3e62f4ff).into()),
("constant".into(), rgba(0x2aa329ff).into()),
("hint".into(), rgba(0x008b9fff).into()),
("type".into(), rgba(0x98981bff).into()),
("emphasis".into(), rgba(0x3e62f4ff).into()),
("variable".into(), rgba(0xcfe8cfff).into()),
("emphasis.strong".into(), rgba(0x3e62f4ff).into()),
("attribute".into(), rgba(0x3e62f4ff).into()),
("enum".into(), rgba(0x87711dff).into()),
("property".into(), rgba(0xe6183bff).into()),
("punctuation.list_marker".into(), rgba(0xcfe8cfff).into()),
("variable.special".into(), rgba(0xac2aeeff).into()),
],
},
status_bar: rgba(0x3b453bff).into(),
title_bar: rgba(0x3b453bff).into(),
toolbar: rgba(0x131513ff).into(),
tab_bar: rgba(0x1f231fff).into(),
editor: rgba(0x131513ff).into(),
editor_subheader: rgba(0x1f231fff).into(),
editor_active_line: rgba(0x1f231fff).into(),
terminal: rgba(0x131513ff).into(),
image_fallback_background: rgba(0x3b453bff).into(),
git_created: rgba(0x2aa329ff).into(),
git_modified: rgba(0x3e62f4ff).into(),
git_deleted: rgba(0xe61c3bff).into(),
git_conflict: rgba(0x98981bff).into(),
git_ignored: rgba(0x778f77ff).into(),
git_renamed: rgba(0x98981bff).into(),
players: [
PlayerTheme {
cursor: rgba(0x3e62f4ff).into(),
selection: rgba(0x3e62f43d).into(),
},
PlayerTheme {
cursor: rgba(0x2aa329ff).into(),
selection: rgba(0x2aa3293d).into(),
},
PlayerTheme {
cursor: rgba(0xe61cc3ff).into(),
selection: rgba(0xe61cc33d).into(),
},
PlayerTheme {
cursor: rgba(0x87711dff).into(),
selection: rgba(0x87711d3d).into(),
},
PlayerTheme {
cursor: rgba(0xac2dedff).into(),
selection: rgba(0xac2ded3d).into(),
},
PlayerTheme {
cursor: rgba(0x1b99b3ff).into(),
selection: rgba(0x1b99b33d).into(),
},
PlayerTheme {
cursor: rgba(0xe61c3bff).into(),
selection: rgba(0xe61c3b3d).into(),
},
PlayerTheme {
cursor: rgba(0x98981bff).into(),
selection: rgba(0x98981b3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_seaside_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Seaside Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x8ea88eff).into(),
border_variant: rgba(0x8ea88eff).into(),
border_focused: rgba(0xc9c4fdff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xb4ceb4ff).into(),
surface: rgba(0xdaeedaff).into(),
background: rgba(0xb4ceb4ff).into(),
filled_element: rgba(0xb4ceb4ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xe1ddfeff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xe1ddfeff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x131513ff).into(),
text_muted: rgba(0x5f705fff).into(),
text_placeholder: rgba(0xe61c3dff).into(),
text_disabled: rgba(0x718771ff).into(),
text_accent: rgba(0x3e61f4ff).into(),
icon_muted: rgba(0x5f705fff).into(),
syntax: SyntaxTheme {
highlights: vec![
("string.escape".into(), rgba(0x5e6e5eff).into()),
("boolean".into(), rgba(0x2aa32aff).into()),
("string.special".into(), rgba(0xe618c3ff).into()),
("comment".into(), rgba(0x809980ff).into()),
("number".into(), rgba(0x87711cff).into()),
("comment.doc".into(), rgba(0x5e6e5eff).into()),
("tag".into(), rgba(0x3e61f4ff).into()),
("string.special.symbol".into(), rgba(0x28a328ff).into()),
("primary".into(), rgba(0x242924ff).into()),
("string".into(), rgba(0x28a328ff).into()),
("enum".into(), rgba(0x87711fff).into()),
("operator".into(), rgba(0x5e6e5eff).into()),
("string.regex".into(), rgba(0x1899b3ff).into()),
("keyword".into(), rgba(0xac2aeeff).into()),
("emphasis".into(), rgba(0x3e61f4ff).into()),
("link_uri".into(), rgba(0x2aa32aff).into()),
("constant".into(), rgba(0x2aa32aff).into()),
("constructor".into(), rgba(0x3e61f4ff).into()),
("link_text".into(), rgba(0x87711fff).into()),
("emphasis.strong".into(), rgba(0x3e61f4ff).into()),
("punctuation.list_marker".into(), rgba(0x242924ff).into()),
("punctuation.delimiter".into(), rgba(0x5e6e5eff).into()),
("punctuation.special".into(), rgba(0xe618c3ff).into()),
("variant".into(), rgba(0x98981bff).into()),
("predictive".into(), rgba(0x00a2b5ff).into()),
("attribute".into(), rgba(0x3e61f4ff).into()),
("preproc".into(), rgba(0x131513ff).into()),
("embedded".into(), rgba(0x131513ff).into()),
("punctuation".into(), rgba(0x242924ff).into()),
("label".into(), rgba(0x3e61f4ff).into()),
("function.method".into(), rgba(0x3d62f5ff).into()),
("property".into(), rgba(0xe6183bff).into()),
("title".into(), rgba(0x131513ff).into()),
("variable".into(), rgba(0x242924ff).into()),
("function".into(), rgba(0x3d62f5ff).into()),
("variable.special".into(), rgba(0xac2aeeff).into()),
("type".into(), rgba(0x98981bff).into()),
("text.literal".into(), rgba(0x87711fff).into()),
("hint".into(), rgba(0x008fa1ff).into()),
(
"function.special.definition".into(),
rgba(0x98981bff).into(),
),
("punctuation.bracket".into(), rgba(0x5e6e5eff).into()),
],
},
status_bar: rgba(0xb4ceb4ff).into(),
title_bar: rgba(0xb4ceb4ff).into(),
toolbar: rgba(0xf3faf3ff).into(),
tab_bar: rgba(0xdaeedaff).into(),
editor: rgba(0xf3faf3ff).into(),
editor_subheader: rgba(0xdaeedaff).into(),
editor_active_line: rgba(0xdaeedaff).into(),
terminal: rgba(0xf3faf3ff).into(),
image_fallback_background: rgba(0xb4ceb4ff).into(),
git_created: rgba(0x2aa32aff).into(),
git_modified: rgba(0x3e61f4ff).into(),
git_deleted: rgba(0xe61c3dff).into(),
git_conflict: rgba(0x98981cff).into(),
git_ignored: rgba(0x718771ff).into(),
git_renamed: rgba(0x98981cff).into(),
players: [
PlayerTheme {
cursor: rgba(0x3e61f4ff).into(),
selection: rgba(0x3e61f43d).into(),
},
PlayerTheme {
cursor: rgba(0x2aa32aff).into(),
selection: rgba(0x2aa32a3d).into(),
},
PlayerTheme {
cursor: rgba(0xe61cc2ff).into(),
selection: rgba(0xe61cc23d).into(),
},
PlayerTheme {
cursor: rgba(0x87711fff).into(),
selection: rgba(0x87711f3d).into(),
},
PlayerTheme {
cursor: rgba(0xac2dedff).into(),
selection: rgba(0xac2ded3d).into(),
},
PlayerTheme {
cursor: rgba(0x1c99b3ff).into(),
selection: rgba(0x1c99b33d).into(),
},
PlayerTheme {
cursor: rgba(0xe61c3dff).into(),
selection: rgba(0xe61c3d3d).into(),
},
PlayerTheme {
cursor: rgba(0x98981cff).into(),
selection: rgba(0x98981c3d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_sulphurpool_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Sulphurpool Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x5b6385ff).into(),
border_variant: rgba(0x5b6385ff).into(),
border_focused: rgba(0x203348ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x3e4769ff).into(),
surface: rgba(0x262f51ff).into(),
background: rgba(0x3e4769ff).into(),
filled_element: rgba(0x3e4769ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x161f2bff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x161f2bff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf5f7ffff).into(),
text_muted: rgba(0x959bb2ff).into(),
text_placeholder: rgba(0xc94922ff).into(),
text_disabled: rgba(0x7e849eff).into(),
text_accent: rgba(0x3e8ed0ff).into(),
icon_muted: rgba(0x959bb2ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("title".into(), rgba(0xf5f7ffff).into()),
("constructor".into(), rgba(0x3e8ed0ff).into()),
("type".into(), rgba(0xc08b2fff).into()),
("punctuation.list_marker".into(), rgba(0xdfe2f1ff).into()),
("property".into(), rgba(0xc94821ff).into()),
("link_uri".into(), rgba(0xac9739ff).into()),
("string.escape".into(), rgba(0x979db4ff).into()),
("constant".into(), rgba(0xac9739ff).into()),
("embedded".into(), rgba(0xf5f7ffff).into()),
("punctuation.special".into(), rgba(0x9b6279ff).into()),
("punctuation.bracket".into(), rgba(0x979db4ff).into()),
("preproc".into(), rgba(0xf5f7ffff).into()),
("emphasis.strong".into(), rgba(0x3e8ed0ff).into()),
("emphasis".into(), rgba(0x3e8ed0ff).into()),
("enum".into(), rgba(0xc76a29ff).into()),
("boolean".into(), rgba(0xac9739ff).into()),
("primary".into(), rgba(0xdfe2f1ff).into()),
("function.method".into(), rgba(0x3d8fd1ff).into()),
(
"function.special.definition".into(),
rgba(0xc08b2fff).into(),
),
("comment.doc".into(), rgba(0x979db4ff).into()),
("string".into(), rgba(0xac9738ff).into()),
("text.literal".into(), rgba(0xc76a29ff).into()),
("operator".into(), rgba(0x979db4ff).into()),
("number".into(), rgba(0xc76a28ff).into()),
("string.special".into(), rgba(0x9b6279ff).into()),
("punctuation.delimiter".into(), rgba(0x979db4ff).into()),
("tag".into(), rgba(0x3e8ed0ff).into()),
("string.special.symbol".into(), rgba(0xac9738ff).into()),
("variable".into(), rgba(0xdfe2f1ff).into()),
("attribute".into(), rgba(0x3e8ed0ff).into()),
("punctuation".into(), rgba(0xdfe2f1ff).into()),
("string.regex".into(), rgba(0x21a2c9ff).into()),
("keyword".into(), rgba(0x6679ccff).into()),
("label".into(), rgba(0x3e8ed0ff).into()),
("hint".into(), rgba(0x6c81a5ff).into()),
("function".into(), rgba(0x3d8fd1ff).into()),
("link_text".into(), rgba(0xc76a29ff).into()),
("variant".into(), rgba(0xc08b2fff).into()),
("variable.special".into(), rgba(0x6679ccff).into()),
("predictive".into(), rgba(0x58709aff).into()),
("comment".into(), rgba(0x6a7293ff).into()),
],
},
status_bar: rgba(0x3e4769ff).into(),
title_bar: rgba(0x3e4769ff).into(),
toolbar: rgba(0x202646ff).into(),
tab_bar: rgba(0x262f51ff).into(),
editor: rgba(0x202646ff).into(),
editor_subheader: rgba(0x262f51ff).into(),
editor_active_line: rgba(0x262f51ff).into(),
terminal: rgba(0x202646ff).into(),
image_fallback_background: rgba(0x3e4769ff).into(),
git_created: rgba(0xac9739ff).into(),
git_modified: rgba(0x3e8ed0ff).into(),
git_deleted: rgba(0xc94922ff).into(),
git_conflict: rgba(0xc08b30ff).into(),
git_ignored: rgba(0x7e849eff).into(),
git_renamed: rgba(0xc08b30ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x3e8ed0ff).into(),
selection: rgba(0x3e8ed03d).into(),
},
PlayerTheme {
cursor: rgba(0xac9739ff).into(),
selection: rgba(0xac97393d).into(),
},
PlayerTheme {
cursor: rgba(0x9b6279ff).into(),
selection: rgba(0x9b62793d).into(),
},
PlayerTheme {
cursor: rgba(0xc76a29ff).into(),
selection: rgba(0xc76a293d).into(),
},
PlayerTheme {
cursor: rgba(0x6679ccff).into(),
selection: rgba(0x6679cc3d).into(),
},
PlayerTheme {
cursor: rgba(0x24a1c9ff).into(),
selection: rgba(0x24a1c93d).into(),
},
PlayerTheme {
cursor: rgba(0xc94922ff).into(),
selection: rgba(0xc949223d).into(),
},
PlayerTheme {
cursor: rgba(0xc08b30ff).into(),
selection: rgba(0xc08b303d).into(),
},
],
}
}

View File

@@ -1,136 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn atelier_sulphurpool_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Atelier Sulphurpool Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x9a9fb6ff).into(),
border_variant: rgba(0x9a9fb6ff).into(),
border_focused: rgba(0xc2d5efff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xc1c5d8ff).into(),
surface: rgba(0xe5e8f5ff).into(),
background: rgba(0xc1c5d8ff).into(),
filled_element: rgba(0xc1c5d8ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xdde7f6ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xdde7f6ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x202646ff).into(),
text_muted: rgba(0x5f6789ff).into(),
text_placeholder: rgba(0xc94922ff).into(),
text_disabled: rgba(0x767d9aff).into(),
text_accent: rgba(0x3e8fd0ff).into(),
icon_muted: rgba(0x5f6789ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("string.special".into(), rgba(0x9b6279ff).into()),
("string.regex".into(), rgba(0x21a2c9ff).into()),
("embedded".into(), rgba(0x202646ff).into()),
("string".into(), rgba(0xac9738ff).into()),
(
"function.special.definition".into(),
rgba(0xc08b2fff).into(),
),
("hint".into(), rgba(0x7087b2ff).into()),
("function.method".into(), rgba(0x3d8fd1ff).into()),
("punctuation.list_marker".into(), rgba(0x293256ff).into()),
("punctuation".into(), rgba(0x293256ff).into()),
("constant".into(), rgba(0xac9739ff).into()),
("label".into(), rgba(0x3e8fd0ff).into()),
("comment.doc".into(), rgba(0x5d6587ff).into()),
("property".into(), rgba(0xc94821ff).into()),
("punctuation.bracket".into(), rgba(0x5d6587ff).into()),
("constructor".into(), rgba(0x3e8fd0ff).into()),
("variable.special".into(), rgba(0x6679ccff).into()),
("emphasis".into(), rgba(0x3e8fd0ff).into()),
("link_text".into(), rgba(0xc76a29ff).into()),
("keyword".into(), rgba(0x6679ccff).into()),
("primary".into(), rgba(0x293256ff).into()),
("comment".into(), rgba(0x898ea4ff).into()),
("title".into(), rgba(0x202646ff).into()),
("link_uri".into(), rgba(0xac9739ff).into()),
("text.literal".into(), rgba(0xc76a29ff).into()),
("operator".into(), rgba(0x5d6587ff).into()),
("number".into(), rgba(0xc76a28ff).into()),
("preproc".into(), rgba(0x202646ff).into()),
("attribute".into(), rgba(0x3e8fd0ff).into()),
("emphasis.strong".into(), rgba(0x3e8fd0ff).into()),
("string.escape".into(), rgba(0x5d6587ff).into()),
("tag".into(), rgba(0x3e8fd0ff).into()),
("variable".into(), rgba(0x293256ff).into()),
("predictive".into(), rgba(0x8599beff).into()),
("enum".into(), rgba(0xc76a29ff).into()),
("string.special.symbol".into(), rgba(0xac9738ff).into()),
("punctuation.delimiter".into(), rgba(0x5d6587ff).into()),
("function".into(), rgba(0x3d8fd1ff).into()),
("type".into(), rgba(0xc08b2fff).into()),
("punctuation.special".into(), rgba(0x9b6279ff).into()),
("variant".into(), rgba(0xc08b2fff).into()),
("boolean".into(), rgba(0xac9739ff).into()),
],
},
status_bar: rgba(0xc1c5d8ff).into(),
title_bar: rgba(0xc1c5d8ff).into(),
toolbar: rgba(0xf5f7ffff).into(),
tab_bar: rgba(0xe5e8f5ff).into(),
editor: rgba(0xf5f7ffff).into(),
editor_subheader: rgba(0xe5e8f5ff).into(),
editor_active_line: rgba(0xe5e8f5ff).into(),
terminal: rgba(0xf5f7ffff).into(),
image_fallback_background: rgba(0xc1c5d8ff).into(),
git_created: rgba(0xac9739ff).into(),
git_modified: rgba(0x3e8fd0ff).into(),
git_deleted: rgba(0xc94922ff).into(),
git_conflict: rgba(0xc08b30ff).into(),
git_ignored: rgba(0x767d9aff).into(),
git_renamed: rgba(0xc08b30ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x3e8fd0ff).into(),
selection: rgba(0x3e8fd03d).into(),
},
PlayerTheme {
cursor: rgba(0xac9739ff).into(),
selection: rgba(0xac97393d).into(),
},
PlayerTheme {
cursor: rgba(0x9b6279ff).into(),
selection: rgba(0x9b62793d).into(),
},
PlayerTheme {
cursor: rgba(0xc76a29ff).into(),
selection: rgba(0xc76a293d).into(),
},
PlayerTheme {
cursor: rgba(0x6679cbff).into(),
selection: rgba(0x6679cb3d).into(),
},
PlayerTheme {
cursor: rgba(0x24a1c9ff).into(),
selection: rgba(0x24a1c93d).into(),
},
PlayerTheme {
cursor: rgba(0xc94922ff).into(),
selection: rgba(0xc949223d).into(),
},
PlayerTheme {
cursor: rgba(0xc08b30ff).into(),
selection: rgba(0xc08b303d).into(),
},
],
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn ayu_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Ayu Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x3f4043ff).into(),
border_variant: rgba(0x3f4043ff).into(),
border_focused: rgba(0x1b4a6eff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x313337ff).into(),
surface: rgba(0x1f2127ff).into(),
background: rgba(0x313337ff).into(),
filled_element: rgba(0x313337ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x0d2f4eff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x0d2f4eff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xbfbdb6ff).into(),
text_muted: rgba(0x8a8986ff).into(),
text_placeholder: rgba(0xef7177ff).into(),
text_disabled: rgba(0x696a6aff).into(),
text_accent: rgba(0x5ac1feff).into(),
icon_muted: rgba(0x8a8986ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("emphasis".into(), rgba(0x5ac1feff).into()),
("punctuation.bracket".into(), rgba(0xa6a5a0ff).into()),
("constructor".into(), rgba(0x5ac1feff).into()),
("predictive".into(), rgba(0x5a728bff).into()),
("emphasis.strong".into(), rgba(0x5ac1feff).into()),
("string.regex".into(), rgba(0x95e6cbff).into()),
("tag".into(), rgba(0x5ac1feff).into()),
("punctuation".into(), rgba(0xa6a5a0ff).into()),
("number".into(), rgba(0xd2a6ffff).into()),
("punctuation.special".into(), rgba(0xd2a6ffff).into()),
("primary".into(), rgba(0xbfbdb6ff).into()),
("boolean".into(), rgba(0xd2a6ffff).into()),
("variant".into(), rgba(0x5ac1feff).into()),
("link_uri".into(), rgba(0xaad84cff).into()),
("comment.doc".into(), rgba(0x8c8b88ff).into()),
("title".into(), rgba(0xbfbdb6ff).into()),
("text.literal".into(), rgba(0xfe8f40ff).into()),
("link_text".into(), rgba(0xfe8f40ff).into()),
("punctuation.delimiter".into(), rgba(0xa6a5a0ff).into()),
("string.escape".into(), rgba(0x8c8b88ff).into()),
("hint".into(), rgba(0x628b80ff).into()),
("type".into(), rgba(0x59c2ffff).into()),
("variable".into(), rgba(0xbfbdb6ff).into()),
("label".into(), rgba(0x5ac1feff).into()),
("enum".into(), rgba(0xfe8f40ff).into()),
("operator".into(), rgba(0xf29668ff).into()),
("function".into(), rgba(0xffb353ff).into()),
("preproc".into(), rgba(0xbfbdb6ff).into()),
("embedded".into(), rgba(0xbfbdb6ff).into()),
("string".into(), rgba(0xa9d94bff).into()),
("attribute".into(), rgba(0x5ac1feff).into()),
("keyword".into(), rgba(0xff8f3fff).into()),
("string.special.symbol".into(), rgba(0xfe8f40ff).into()),
("comment".into(), rgba(0xabb5be8c).into()),
("property".into(), rgba(0x5ac1feff).into()),
("punctuation.list_marker".into(), rgba(0xa6a5a0ff).into()),
("constant".into(), rgba(0xd2a6ffff).into()),
("string.special".into(), rgba(0xe5b572ff).into()),
],
},
status_bar: rgba(0x313337ff).into(),
title_bar: rgba(0x313337ff).into(),
toolbar: rgba(0x0d1016ff).into(),
tab_bar: rgba(0x1f2127ff).into(),
editor: rgba(0x0d1016ff).into(),
editor_subheader: rgba(0x1f2127ff).into(),
editor_active_line: rgba(0x1f2127ff).into(),
terminal: rgba(0x0d1016ff).into(),
image_fallback_background: rgba(0x313337ff).into(),
git_created: rgba(0xaad84cff).into(),
git_modified: rgba(0x5ac1feff).into(),
git_deleted: rgba(0xef7177ff).into(),
git_conflict: rgba(0xfeb454ff).into(),
git_ignored: rgba(0x696a6aff).into(),
git_renamed: rgba(0xfeb454ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x5ac1feff).into(),
selection: rgba(0x5ac1fe3d).into(),
},
PlayerTheme {
cursor: rgba(0xaad84cff).into(),
selection: rgba(0xaad84c3d).into(),
},
PlayerTheme {
cursor: rgba(0x39bae5ff).into(),
selection: rgba(0x39bae53d).into(),
},
PlayerTheme {
cursor: rgba(0xfe8f40ff).into(),
selection: rgba(0xfe8f403d).into(),
},
PlayerTheme {
cursor: rgba(0xd2a6feff).into(),
selection: rgba(0xd2a6fe3d).into(),
},
PlayerTheme {
cursor: rgba(0x95e5cbff).into(),
selection: rgba(0x95e5cb3d).into(),
},
PlayerTheme {
cursor: rgba(0xef7177ff).into(),
selection: rgba(0xef71773d).into(),
},
PlayerTheme {
cursor: rgba(0xfeb454ff).into(),
selection: rgba(0xfeb4543d).into(),
},
],
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn ayu_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Ayu Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xcfd1d2ff).into(),
border_variant: rgba(0xcfd1d2ff).into(),
border_focused: rgba(0xc4daf6ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xdcdddeff).into(),
surface: rgba(0xececedff).into(),
background: rgba(0xdcdddeff).into(),
filled_element: rgba(0xdcdddeff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xdeebfaff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xdeebfaff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x5c6166ff).into(),
text_muted: rgba(0x8b8e92ff).into(),
text_placeholder: rgba(0xef7271ff).into(),
text_disabled: rgba(0xa9acaeff).into(),
text_accent: rgba(0x3b9ee5ff).into(),
icon_muted: rgba(0x8b8e92ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("string".into(), rgba(0x86b300ff).into()),
("enum".into(), rgba(0xf98d3fff).into()),
("comment".into(), rgba(0x787b8099).into()),
("comment.doc".into(), rgba(0x898d90ff).into()),
("emphasis".into(), rgba(0x3b9ee5ff).into()),
("keyword".into(), rgba(0xfa8d3eff).into()),
("string.regex".into(), rgba(0x4bbf98ff).into()),
("text.literal".into(), rgba(0xf98d3fff).into()),
("string.escape".into(), rgba(0x898d90ff).into()),
("link_text".into(), rgba(0xf98d3fff).into()),
("punctuation".into(), rgba(0x73777bff).into()),
("constructor".into(), rgba(0x3b9ee5ff).into()),
("constant".into(), rgba(0xa37accff).into()),
("variable".into(), rgba(0x5c6166ff).into()),
("primary".into(), rgba(0x5c6166ff).into()),
("emphasis.strong".into(), rgba(0x3b9ee5ff).into()),
("string.special".into(), rgba(0xe6ba7eff).into()),
("number".into(), rgba(0xa37accff).into()),
("preproc".into(), rgba(0x5c6166ff).into()),
("punctuation.delimiter".into(), rgba(0x73777bff).into()),
("string.special.symbol".into(), rgba(0xf98d3fff).into()),
("boolean".into(), rgba(0xa37accff).into()),
("property".into(), rgba(0x3b9ee5ff).into()),
("title".into(), rgba(0x5c6166ff).into()),
("hint".into(), rgba(0x8ca7c2ff).into()),
("predictive".into(), rgba(0x9eb9d3ff).into()),
("operator".into(), rgba(0xed9365ff).into()),
("type".into(), rgba(0x389ee6ff).into()),
("function".into(), rgba(0xf2ad48ff).into()),
("variant".into(), rgba(0x3b9ee5ff).into()),
("label".into(), rgba(0x3b9ee5ff).into()),
("punctuation.list_marker".into(), rgba(0x73777bff).into()),
("punctuation.bracket".into(), rgba(0x73777bff).into()),
("embedded".into(), rgba(0x5c6166ff).into()),
("punctuation.special".into(), rgba(0xa37accff).into()),
("attribute".into(), rgba(0x3b9ee5ff).into()),
("tag".into(), rgba(0x3b9ee5ff).into()),
("link_uri".into(), rgba(0x85b304ff).into()),
],
},
status_bar: rgba(0xdcdddeff).into(),
title_bar: rgba(0xdcdddeff).into(),
toolbar: rgba(0xfcfcfcff).into(),
tab_bar: rgba(0xececedff).into(),
editor: rgba(0xfcfcfcff).into(),
editor_subheader: rgba(0xececedff).into(),
editor_active_line: rgba(0xececedff).into(),
terminal: rgba(0xfcfcfcff).into(),
image_fallback_background: rgba(0xdcdddeff).into(),
git_created: rgba(0x85b304ff).into(),
git_modified: rgba(0x3b9ee5ff).into(),
git_deleted: rgba(0xef7271ff).into(),
git_conflict: rgba(0xf1ad49ff).into(),
git_ignored: rgba(0xa9acaeff).into(),
git_renamed: rgba(0xf1ad49ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x3b9ee5ff).into(),
selection: rgba(0x3b9ee53d).into(),
},
PlayerTheme {
cursor: rgba(0x85b304ff).into(),
selection: rgba(0x85b3043d).into(),
},
PlayerTheme {
cursor: rgba(0x55b4d3ff).into(),
selection: rgba(0x55b4d33d).into(),
},
PlayerTheme {
cursor: rgba(0xf98d3fff).into(),
selection: rgba(0xf98d3f3d).into(),
},
PlayerTheme {
cursor: rgba(0xa37accff).into(),
selection: rgba(0xa37acc3d).into(),
},
PlayerTheme {
cursor: rgba(0x4dbf99ff).into(),
selection: rgba(0x4dbf993d).into(),
},
PlayerTheme {
cursor: rgba(0xef7271ff).into(),
selection: rgba(0xef72713d).into(),
},
PlayerTheme {
cursor: rgba(0xf1ad49ff).into(),
selection: rgba(0xf1ad493d).into(),
},
],
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn ayu_mirage() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Ayu Mirage".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x53565dff).into(),
border_variant: rgba(0x53565dff).into(),
border_focused: rgba(0x24556fff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x464a52ff).into(),
surface: rgba(0x353944ff).into(),
background: rgba(0x464a52ff).into(),
filled_element: rgba(0x464a52ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x123950ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x123950ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xcccac2ff).into(),
text_muted: rgba(0x9a9a98ff).into(),
text_placeholder: rgba(0xf18779ff).into(),
text_disabled: rgba(0x7b7d7fff).into(),
text_accent: rgba(0x72cffeff).into(),
icon_muted: rgba(0x9a9a98ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("text.literal".into(), rgba(0xfead66ff).into()),
("link_text".into(), rgba(0xfead66ff).into()),
("function".into(), rgba(0xffd173ff).into()),
("punctuation.delimiter".into(), rgba(0xb4b3aeff).into()),
("property".into(), rgba(0x72cffeff).into()),
("title".into(), rgba(0xcccac2ff).into()),
("boolean".into(), rgba(0xdfbfffff).into()),
("link_uri".into(), rgba(0xd5fe80ff).into()),
("label".into(), rgba(0x72cffeff).into()),
("primary".into(), rgba(0xcccac2ff).into()),
("number".into(), rgba(0xdfbfffff).into()),
("variant".into(), rgba(0x72cffeff).into()),
("enum".into(), rgba(0xfead66ff).into()),
("string.special.symbol".into(), rgba(0xfead66ff).into()),
("operator".into(), rgba(0xf29e74ff).into()),
("punctuation.special".into(), rgba(0xdfbfffff).into()),
("constructor".into(), rgba(0x72cffeff).into()),
("type".into(), rgba(0x73cfffff).into()),
("emphasis.strong".into(), rgba(0x72cffeff).into()),
("embedded".into(), rgba(0xcccac2ff).into()),
("comment".into(), rgba(0xb8cfe680).into()),
("tag".into(), rgba(0x72cffeff).into()),
("keyword".into(), rgba(0xffad65ff).into()),
("punctuation".into(), rgba(0xb4b3aeff).into()),
("preproc".into(), rgba(0xcccac2ff).into()),
("hint".into(), rgba(0x7399a3ff).into()),
("string.special".into(), rgba(0xffdfb3ff).into()),
("attribute".into(), rgba(0x72cffeff).into()),
("string.regex".into(), rgba(0x95e6cbff).into()),
("predictive".into(), rgba(0x6d839bff).into()),
("comment.doc".into(), rgba(0x9b9b99ff).into()),
("emphasis".into(), rgba(0x72cffeff).into()),
("string".into(), rgba(0xd4fe7fff).into()),
("constant".into(), rgba(0xdfbfffff).into()),
("string.escape".into(), rgba(0x9b9b99ff).into()),
("variable".into(), rgba(0xcccac2ff).into()),
("punctuation.bracket".into(), rgba(0xb4b3aeff).into()),
("punctuation.list_marker".into(), rgba(0xb4b3aeff).into()),
],
},
status_bar: rgba(0x464a52ff).into(),
title_bar: rgba(0x464a52ff).into(),
toolbar: rgba(0x242835ff).into(),
tab_bar: rgba(0x353944ff).into(),
editor: rgba(0x242835ff).into(),
editor_subheader: rgba(0x353944ff).into(),
editor_active_line: rgba(0x353944ff).into(),
terminal: rgba(0x242835ff).into(),
image_fallback_background: rgba(0x464a52ff).into(),
git_created: rgba(0xd5fe80ff).into(),
git_modified: rgba(0x72cffeff).into(),
git_deleted: rgba(0xf18779ff).into(),
git_conflict: rgba(0xfecf72ff).into(),
git_ignored: rgba(0x7b7d7fff).into(),
git_renamed: rgba(0xfecf72ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x72cffeff).into(),
selection: rgba(0x72cffe3d).into(),
},
PlayerTheme {
cursor: rgba(0xd5fe80ff).into(),
selection: rgba(0xd5fe803d).into(),
},
PlayerTheme {
cursor: rgba(0x5bcde5ff).into(),
selection: rgba(0x5bcde53d).into(),
},
PlayerTheme {
cursor: rgba(0xfead66ff).into(),
selection: rgba(0xfead663d).into(),
},
PlayerTheme {
cursor: rgba(0xdebffeff).into(),
selection: rgba(0xdebffe3d).into(),
},
PlayerTheme {
cursor: rgba(0x95e5cbff).into(),
selection: rgba(0x95e5cb3d).into(),
},
PlayerTheme {
cursor: rgba(0xf18779ff).into(),
selection: rgba(0xf187793d).into(),
},
PlayerTheme {
cursor: rgba(0xfecf72ff).into(),
selection: rgba(0xfecf723d).into(),
},
],
}
}

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn gruvbox_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Gruvbox Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x5b534dff).into(),
border_variant: rgba(0x5b534dff).into(),
border_focused: rgba(0x303a36ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x4c4642ff).into(),
surface: rgba(0x3a3735ff).into(),
background: rgba(0x4c4642ff).into(),
filled_element: rgba(0x4c4642ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x1e2321ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x1e2321ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xfbf1c7ff).into(),
text_muted: rgba(0xc5b597ff).into(),
text_placeholder: rgba(0xfb4a35ff).into(),
text_disabled: rgba(0x998b78ff).into(),
text_accent: rgba(0x83a598ff).into(),
icon_muted: rgba(0xc5b597ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("operator".into(), rgba(0x8ec07cff).into()),
("string.special.symbol".into(), rgba(0x8ec07cff).into()),
("emphasis.strong".into(), rgba(0x83a598ff).into()),
("attribute".into(), rgba(0x83a598ff).into()),
("property".into(), rgba(0xebdbb2ff).into()),
("comment.doc".into(), rgba(0xc6b697ff).into()),
("emphasis".into(), rgba(0x83a598ff).into()),
("variant".into(), rgba(0x83a598ff).into()),
("text.literal".into(), rgba(0x83a598ff).into()),
("keyword".into(), rgba(0xfb4833ff).into()),
("primary".into(), rgba(0xebdbb2ff).into()),
("variable".into(), rgba(0x83a598ff).into()),
("enum".into(), rgba(0xfe7f18ff).into()),
("constructor".into(), rgba(0x83a598ff).into()),
("punctuation".into(), rgba(0xd5c4a1ff).into()),
("link_uri".into(), rgba(0xd3869bff).into()),
("hint".into(), rgba(0x8c957dff).into()),
("string.regex".into(), rgba(0xfe7f18ff).into()),
("punctuation.delimiter".into(), rgba(0xe5d5adff).into()),
("string".into(), rgba(0xb8bb25ff).into()),
("punctuation.special".into(), rgba(0xe5d5adff).into()),
("link_text".into(), rgba(0x8ec07cff).into()),
("tag".into(), rgba(0x8ec07cff).into()),
("string.escape".into(), rgba(0xc6b697ff).into()),
("label".into(), rgba(0x83a598ff).into()),
("constant".into(), rgba(0xfabd2eff).into()),
("type".into(), rgba(0xfabd2eff).into()),
("number".into(), rgba(0xd3869bff).into()),
("string.special".into(), rgba(0xd3869bff).into()),
("function.builtin".into(), rgba(0xfb4833ff).into()),
("boolean".into(), rgba(0xd3869bff).into()),
("embedded".into(), rgba(0x8ec07cff).into()),
("title".into(), rgba(0xb8bb25ff).into()),
("function".into(), rgba(0xb8bb25ff).into()),
("punctuation.bracket".into(), rgba(0xa89984ff).into()),
("comment".into(), rgba(0xa89984ff).into()),
("preproc".into(), rgba(0xfbf1c7ff).into()),
("predictive".into(), rgba(0x717363ff).into()),
("punctuation.list_marker".into(), rgba(0xebdbb2ff).into()),
],
},
status_bar: rgba(0x4c4642ff).into(),
title_bar: rgba(0x4c4642ff).into(),
toolbar: rgba(0x282828ff).into(),
tab_bar: rgba(0x3a3735ff).into(),
editor: rgba(0x282828ff).into(),
editor_subheader: rgba(0x3a3735ff).into(),
editor_active_line: rgba(0x3a3735ff).into(),
terminal: rgba(0x282828ff).into(),
image_fallback_background: rgba(0x4c4642ff).into(),
git_created: rgba(0xb7bb26ff).into(),
git_modified: rgba(0x83a598ff).into(),
git_deleted: rgba(0xfb4a35ff).into(),
git_conflict: rgba(0xf9bd2fff).into(),
git_ignored: rgba(0x998b78ff).into(),
git_renamed: rgba(0xf9bd2fff).into(),
players: [
PlayerTheme {
cursor: rgba(0x83a598ff).into(),
selection: rgba(0x83a5983d).into(),
},
PlayerTheme {
cursor: rgba(0xb7bb26ff).into(),
selection: rgba(0xb7bb263d).into(),
},
PlayerTheme {
cursor: rgba(0xa89984ff).into(),
selection: rgba(0xa899843d).into(),
},
PlayerTheme {
cursor: rgba(0xfd801bff).into(),
selection: rgba(0xfd801b3d).into(),
},
PlayerTheme {
cursor: rgba(0xd3869bff).into(),
selection: rgba(0xd3869b3d).into(),
},
PlayerTheme {
cursor: rgba(0x8ec07cff).into(),
selection: rgba(0x8ec07c3d).into(),
},
PlayerTheme {
cursor: rgba(0xfb4a35ff).into(),
selection: rgba(0xfb4a353d).into(),
},
PlayerTheme {
cursor: rgba(0xf9bd2fff).into(),
selection: rgba(0xf9bd2f3d).into(),
},
],
}
}

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn gruvbox_dark_hard() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Gruvbox Dark Hard".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x5b534dff).into(),
border_variant: rgba(0x5b534dff).into(),
border_focused: rgba(0x303a36ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x4c4642ff).into(),
surface: rgba(0x393634ff).into(),
background: rgba(0x4c4642ff).into(),
filled_element: rgba(0x4c4642ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x1e2321ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x1e2321ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xfbf1c7ff).into(),
text_muted: rgba(0xc5b597ff).into(),
text_placeholder: rgba(0xfb4a35ff).into(),
text_disabled: rgba(0x998b78ff).into(),
text_accent: rgba(0x83a598ff).into(),
icon_muted: rgba(0xc5b597ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("primary".into(), rgba(0xebdbb2ff).into()),
("label".into(), rgba(0x83a598ff).into()),
("punctuation.delimiter".into(), rgba(0xe5d5adff).into()),
("variant".into(), rgba(0x83a598ff).into()),
("type".into(), rgba(0xfabd2eff).into()),
("string.regex".into(), rgba(0xfe7f18ff).into()),
("function.builtin".into(), rgba(0xfb4833ff).into()),
("title".into(), rgba(0xb8bb25ff).into()),
("string".into(), rgba(0xb8bb25ff).into()),
("operator".into(), rgba(0x8ec07cff).into()),
("embedded".into(), rgba(0x8ec07cff).into()),
("punctuation.bracket".into(), rgba(0xa89984ff).into()),
("string.special".into(), rgba(0xd3869bff).into()),
("attribute".into(), rgba(0x83a598ff).into()),
("comment".into(), rgba(0xa89984ff).into()),
("link_text".into(), rgba(0x8ec07cff).into()),
("punctuation.special".into(), rgba(0xe5d5adff).into()),
("punctuation.list_marker".into(), rgba(0xebdbb2ff).into()),
("comment.doc".into(), rgba(0xc6b697ff).into()),
("preproc".into(), rgba(0xfbf1c7ff).into()),
("text.literal".into(), rgba(0x83a598ff).into()),
("function".into(), rgba(0xb8bb25ff).into()),
("predictive".into(), rgba(0x717363ff).into()),
("emphasis.strong".into(), rgba(0x83a598ff).into()),
("punctuation".into(), rgba(0xd5c4a1ff).into()),
("string.special.symbol".into(), rgba(0x8ec07cff).into()),
("property".into(), rgba(0xebdbb2ff).into()),
("keyword".into(), rgba(0xfb4833ff).into()),
("constructor".into(), rgba(0x83a598ff).into()),
("tag".into(), rgba(0x8ec07cff).into()),
("variable".into(), rgba(0x83a598ff).into()),
("enum".into(), rgba(0xfe7f18ff).into()),
("hint".into(), rgba(0x8c957dff).into()),
("number".into(), rgba(0xd3869bff).into()),
("constant".into(), rgba(0xfabd2eff).into()),
("boolean".into(), rgba(0xd3869bff).into()),
("link_uri".into(), rgba(0xd3869bff).into()),
("string.escape".into(), rgba(0xc6b697ff).into()),
("emphasis".into(), rgba(0x83a598ff).into()),
],
},
status_bar: rgba(0x4c4642ff).into(),
title_bar: rgba(0x4c4642ff).into(),
toolbar: rgba(0x1d2021ff).into(),
tab_bar: rgba(0x393634ff).into(),
editor: rgba(0x1d2021ff).into(),
editor_subheader: rgba(0x393634ff).into(),
editor_active_line: rgba(0x393634ff).into(),
terminal: rgba(0x1d2021ff).into(),
image_fallback_background: rgba(0x4c4642ff).into(),
git_created: rgba(0xb7bb26ff).into(),
git_modified: rgba(0x83a598ff).into(),
git_deleted: rgba(0xfb4a35ff).into(),
git_conflict: rgba(0xf9bd2fff).into(),
git_ignored: rgba(0x998b78ff).into(),
git_renamed: rgba(0xf9bd2fff).into(),
players: [
PlayerTheme {
cursor: rgba(0x83a598ff).into(),
selection: rgba(0x83a5983d).into(),
},
PlayerTheme {
cursor: rgba(0xb7bb26ff).into(),
selection: rgba(0xb7bb263d).into(),
},
PlayerTheme {
cursor: rgba(0xa89984ff).into(),
selection: rgba(0xa899843d).into(),
},
PlayerTheme {
cursor: rgba(0xfd801bff).into(),
selection: rgba(0xfd801b3d).into(),
},
PlayerTheme {
cursor: rgba(0xd3869bff).into(),
selection: rgba(0xd3869b3d).into(),
},
PlayerTheme {
cursor: rgba(0x8ec07cff).into(),
selection: rgba(0x8ec07c3d).into(),
},
PlayerTheme {
cursor: rgba(0xfb4a35ff).into(),
selection: rgba(0xfb4a353d).into(),
},
PlayerTheme {
cursor: rgba(0xf9bd2fff).into(),
selection: rgba(0xf9bd2f3d).into(),
},
],
}
}

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn gruvbox_dark_soft() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Gruvbox Dark Soft".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x5b534dff).into(),
border_variant: rgba(0x5b534dff).into(),
border_focused: rgba(0x303a36ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x4c4642ff).into(),
surface: rgba(0x3b3735ff).into(),
background: rgba(0x4c4642ff).into(),
filled_element: rgba(0x4c4642ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x1e2321ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x1e2321ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xfbf1c7ff).into(),
text_muted: rgba(0xc5b597ff).into(),
text_placeholder: rgba(0xfb4a35ff).into(),
text_disabled: rgba(0x998b78ff).into(),
text_accent: rgba(0x83a598ff).into(),
icon_muted: rgba(0xc5b597ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("punctuation.special".into(), rgba(0xe5d5adff).into()),
("attribute".into(), rgba(0x83a598ff).into()),
("preproc".into(), rgba(0xfbf1c7ff).into()),
("keyword".into(), rgba(0xfb4833ff).into()),
("emphasis".into(), rgba(0x83a598ff).into()),
("punctuation.delimiter".into(), rgba(0xe5d5adff).into()),
("punctuation.bracket".into(), rgba(0xa89984ff).into()),
("comment".into(), rgba(0xa89984ff).into()),
("text.literal".into(), rgba(0x83a598ff).into()),
("predictive".into(), rgba(0x717363ff).into()),
("link_text".into(), rgba(0x8ec07cff).into()),
("variant".into(), rgba(0x83a598ff).into()),
("label".into(), rgba(0x83a598ff).into()),
("function".into(), rgba(0xb8bb25ff).into()),
("string.regex".into(), rgba(0xfe7f18ff).into()),
("boolean".into(), rgba(0xd3869bff).into()),
("number".into(), rgba(0xd3869bff).into()),
("string.escape".into(), rgba(0xc6b697ff).into()),
("constructor".into(), rgba(0x83a598ff).into()),
("link_uri".into(), rgba(0xd3869bff).into()),
("string.special.symbol".into(), rgba(0x8ec07cff).into()),
("type".into(), rgba(0xfabd2eff).into()),
("function.builtin".into(), rgba(0xfb4833ff).into()),
("title".into(), rgba(0xb8bb25ff).into()),
("primary".into(), rgba(0xebdbb2ff).into()),
("tag".into(), rgba(0x8ec07cff).into()),
("constant".into(), rgba(0xfabd2eff).into()),
("emphasis.strong".into(), rgba(0x83a598ff).into()),
("string.special".into(), rgba(0xd3869bff).into()),
("hint".into(), rgba(0x8c957dff).into()),
("comment.doc".into(), rgba(0xc6b697ff).into()),
("property".into(), rgba(0xebdbb2ff).into()),
("embedded".into(), rgba(0x8ec07cff).into()),
("operator".into(), rgba(0x8ec07cff).into()),
("punctuation".into(), rgba(0xd5c4a1ff).into()),
("variable".into(), rgba(0x83a598ff).into()),
("enum".into(), rgba(0xfe7f18ff).into()),
("punctuation.list_marker".into(), rgba(0xebdbb2ff).into()),
("string".into(), rgba(0xb8bb25ff).into()),
],
},
status_bar: rgba(0x4c4642ff).into(),
title_bar: rgba(0x4c4642ff).into(),
toolbar: rgba(0x32302fff).into(),
tab_bar: rgba(0x3b3735ff).into(),
editor: rgba(0x32302fff).into(),
editor_subheader: rgba(0x3b3735ff).into(),
editor_active_line: rgba(0x3b3735ff).into(),
terminal: rgba(0x32302fff).into(),
image_fallback_background: rgba(0x4c4642ff).into(),
git_created: rgba(0xb7bb26ff).into(),
git_modified: rgba(0x83a598ff).into(),
git_deleted: rgba(0xfb4a35ff).into(),
git_conflict: rgba(0xf9bd2fff).into(),
git_ignored: rgba(0x998b78ff).into(),
git_renamed: rgba(0xf9bd2fff).into(),
players: [
PlayerTheme {
cursor: rgba(0x83a598ff).into(),
selection: rgba(0x83a5983d).into(),
},
PlayerTheme {
cursor: rgba(0xb7bb26ff).into(),
selection: rgba(0xb7bb263d).into(),
},
PlayerTheme {
cursor: rgba(0xa89984ff).into(),
selection: rgba(0xa899843d).into(),
},
PlayerTheme {
cursor: rgba(0xfd801bff).into(),
selection: rgba(0xfd801b3d).into(),
},
PlayerTheme {
cursor: rgba(0xd3869bff).into(),
selection: rgba(0xd3869b3d).into(),
},
PlayerTheme {
cursor: rgba(0x8ec07cff).into(),
selection: rgba(0x8ec07c3d).into(),
},
PlayerTheme {
cursor: rgba(0xfb4a35ff).into(),
selection: rgba(0xfb4a353d).into(),
},
PlayerTheme {
cursor: rgba(0xf9bd2fff).into(),
selection: rgba(0xf9bd2f3d).into(),
},
],
}
}

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn gruvbox_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Gruvbox Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xc8b899ff).into(),
border_variant: rgba(0xc8b899ff).into(),
border_focused: rgba(0xadc5ccff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xd9c8a4ff).into(),
surface: rgba(0xecddb4ff).into(),
background: rgba(0xd9c8a4ff).into(),
filled_element: rgba(0xd9c8a4ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xd2dee2ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xd2dee2ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x282828ff).into(),
text_muted: rgba(0x5f5650ff).into(),
text_placeholder: rgba(0x9d0308ff).into(),
text_disabled: rgba(0x897b6eff).into(),
text_accent: rgba(0x0b6678ff).into(),
icon_muted: rgba(0x5f5650ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("number".into(), rgba(0x8f3e71ff).into()),
("link_text".into(), rgba(0x427b58ff).into()),
("string.special".into(), rgba(0x8f3e71ff).into()),
("string.special.symbol".into(), rgba(0x427b58ff).into()),
("function".into(), rgba(0x79740eff).into()),
("title".into(), rgba(0x79740eff).into()),
("emphasis".into(), rgba(0x0b6678ff).into()),
("punctuation".into(), rgba(0x3c3836ff).into()),
("string.escape".into(), rgba(0x5d544eff).into()),
("type".into(), rgba(0xb57613ff).into()),
("string".into(), rgba(0x79740eff).into()),
("keyword".into(), rgba(0x9d0006ff).into()),
("tag".into(), rgba(0x427b58ff).into()),
("primary".into(), rgba(0x282828ff).into()),
("link_uri".into(), rgba(0x8f3e71ff).into()),
("comment.doc".into(), rgba(0x5d544eff).into()),
("boolean".into(), rgba(0x8f3e71ff).into()),
("embedded".into(), rgba(0x427b58ff).into()),
("hint".into(), rgba(0x677562ff).into()),
("emphasis.strong".into(), rgba(0x0b6678ff).into()),
("operator".into(), rgba(0x427b58ff).into()),
("label".into(), rgba(0x0b6678ff).into()),
("comment".into(), rgba(0x7c6f64ff).into()),
("function.builtin".into(), rgba(0x9d0006ff).into()),
("punctuation.bracket".into(), rgba(0x665c54ff).into()),
("text.literal".into(), rgba(0x066578ff).into()),
("string.regex".into(), rgba(0xaf3a02ff).into()),
("property".into(), rgba(0x282828ff).into()),
("attribute".into(), rgba(0x0b6678ff).into()),
("punctuation.delimiter".into(), rgba(0x413d3aff).into()),
("constructor".into(), rgba(0x0b6678ff).into()),
("variable".into(), rgba(0x066578ff).into()),
("constant".into(), rgba(0xb57613ff).into()),
("preproc".into(), rgba(0x282828ff).into()),
("punctuation.special".into(), rgba(0x413d3aff).into()),
("punctuation.list_marker".into(), rgba(0x282828ff).into()),
("variant".into(), rgba(0x0b6678ff).into()),
("predictive".into(), rgba(0x7c9780ff).into()),
("enum".into(), rgba(0xaf3a02ff).into()),
],
},
status_bar: rgba(0xd9c8a4ff).into(),
title_bar: rgba(0xd9c8a4ff).into(),
toolbar: rgba(0xfbf1c7ff).into(),
tab_bar: rgba(0xecddb4ff).into(),
editor: rgba(0xfbf1c7ff).into(),
editor_subheader: rgba(0xecddb4ff).into(),
editor_active_line: rgba(0xecddb4ff).into(),
terminal: rgba(0xfbf1c7ff).into(),
image_fallback_background: rgba(0xd9c8a4ff).into(),
git_created: rgba(0x797410ff).into(),
git_modified: rgba(0x0b6678ff).into(),
git_deleted: rgba(0x9d0308ff).into(),
git_conflict: rgba(0xb57615ff).into(),
git_ignored: rgba(0x897b6eff).into(),
git_renamed: rgba(0xb57615ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x0b6678ff).into(),
selection: rgba(0x0b66783d).into(),
},
PlayerTheme {
cursor: rgba(0x797410ff).into(),
selection: rgba(0x7974103d).into(),
},
PlayerTheme {
cursor: rgba(0x7c6f64ff).into(),
selection: rgba(0x7c6f643d).into(),
},
PlayerTheme {
cursor: rgba(0xaf3a04ff).into(),
selection: rgba(0xaf3a043d).into(),
},
PlayerTheme {
cursor: rgba(0x8f3f70ff).into(),
selection: rgba(0x8f3f703d).into(),
},
PlayerTheme {
cursor: rgba(0x437b59ff).into(),
selection: rgba(0x437b593d).into(),
},
PlayerTheme {
cursor: rgba(0x9d0308ff).into(),
selection: rgba(0x9d03083d).into(),
},
PlayerTheme {
cursor: rgba(0xb57615ff).into(),
selection: rgba(0xb576153d).into(),
},
],
}
}

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn gruvbox_light_hard() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Gruvbox Light Hard".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xc8b899ff).into(),
border_variant: rgba(0xc8b899ff).into(),
border_focused: rgba(0xadc5ccff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xd9c8a4ff).into(),
surface: rgba(0xecddb5ff).into(),
background: rgba(0xd9c8a4ff).into(),
filled_element: rgba(0xd9c8a4ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xd2dee2ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xd2dee2ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x282828ff).into(),
text_muted: rgba(0x5f5650ff).into(),
text_placeholder: rgba(0x9d0308ff).into(),
text_disabled: rgba(0x897b6eff).into(),
text_accent: rgba(0x0b6678ff).into(),
icon_muted: rgba(0x5f5650ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("label".into(), rgba(0x0b6678ff).into()),
("hint".into(), rgba(0x677562ff).into()),
("boolean".into(), rgba(0x8f3e71ff).into()),
("function.builtin".into(), rgba(0x9d0006ff).into()),
("constant".into(), rgba(0xb57613ff).into()),
("preproc".into(), rgba(0x282828ff).into()),
("predictive".into(), rgba(0x7c9780ff).into()),
("string".into(), rgba(0x79740eff).into()),
("comment.doc".into(), rgba(0x5d544eff).into()),
("function".into(), rgba(0x79740eff).into()),
("title".into(), rgba(0x79740eff).into()),
("text.literal".into(), rgba(0x066578ff).into()),
("punctuation.bracket".into(), rgba(0x665c54ff).into()),
("string.escape".into(), rgba(0x5d544eff).into()),
("punctuation.delimiter".into(), rgba(0x413d3aff).into()),
("string.special.symbol".into(), rgba(0x427b58ff).into()),
("type".into(), rgba(0xb57613ff).into()),
("constructor".into(), rgba(0x0b6678ff).into()),
("property".into(), rgba(0x282828ff).into()),
("comment".into(), rgba(0x7c6f64ff).into()),
("enum".into(), rgba(0xaf3a02ff).into()),
("emphasis".into(), rgba(0x0b6678ff).into()),
("embedded".into(), rgba(0x427b58ff).into()),
("operator".into(), rgba(0x427b58ff).into()),
("attribute".into(), rgba(0x0b6678ff).into()),
("emphasis.strong".into(), rgba(0x0b6678ff).into()),
("link_text".into(), rgba(0x427b58ff).into()),
("punctuation.special".into(), rgba(0x413d3aff).into()),
("punctuation.list_marker".into(), rgba(0x282828ff).into()),
("variant".into(), rgba(0x0b6678ff).into()),
("primary".into(), rgba(0x282828ff).into()),
("number".into(), rgba(0x8f3e71ff).into()),
("tag".into(), rgba(0x427b58ff).into()),
("keyword".into(), rgba(0x9d0006ff).into()),
("link_uri".into(), rgba(0x8f3e71ff).into()),
("string.regex".into(), rgba(0xaf3a02ff).into()),
("variable".into(), rgba(0x066578ff).into()),
("string.special".into(), rgba(0x8f3e71ff).into()),
("punctuation".into(), rgba(0x3c3836ff).into()),
],
},
status_bar: rgba(0xd9c8a4ff).into(),
title_bar: rgba(0xd9c8a4ff).into(),
toolbar: rgba(0xf9f5d7ff).into(),
tab_bar: rgba(0xecddb5ff).into(),
editor: rgba(0xf9f5d7ff).into(),
editor_subheader: rgba(0xecddb5ff).into(),
editor_active_line: rgba(0xecddb5ff).into(),
terminal: rgba(0xf9f5d7ff).into(),
image_fallback_background: rgba(0xd9c8a4ff).into(),
git_created: rgba(0x797410ff).into(),
git_modified: rgba(0x0b6678ff).into(),
git_deleted: rgba(0x9d0308ff).into(),
git_conflict: rgba(0xb57615ff).into(),
git_ignored: rgba(0x897b6eff).into(),
git_renamed: rgba(0xb57615ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x0b6678ff).into(),
selection: rgba(0x0b66783d).into(),
},
PlayerTheme {
cursor: rgba(0x797410ff).into(),
selection: rgba(0x7974103d).into(),
},
PlayerTheme {
cursor: rgba(0x7c6f64ff).into(),
selection: rgba(0x7c6f643d).into(),
},
PlayerTheme {
cursor: rgba(0xaf3a04ff).into(),
selection: rgba(0xaf3a043d).into(),
},
PlayerTheme {
cursor: rgba(0x8f3f70ff).into(),
selection: rgba(0x8f3f703d).into(),
},
PlayerTheme {
cursor: rgba(0x437b59ff).into(),
selection: rgba(0x437b593d).into(),
},
PlayerTheme {
cursor: rgba(0x9d0308ff).into(),
selection: rgba(0x9d03083d).into(),
},
PlayerTheme {
cursor: rgba(0xb57615ff).into(),
selection: rgba(0xb576153d).into(),
},
],
}
}

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn gruvbox_light_soft() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Gruvbox Light Soft".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xc8b899ff).into(),
border_variant: rgba(0xc8b899ff).into(),
border_focused: rgba(0xadc5ccff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xd9c8a4ff).into(),
surface: rgba(0xecdcb3ff).into(),
background: rgba(0xd9c8a4ff).into(),
filled_element: rgba(0xd9c8a4ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xd2dee2ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xd2dee2ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x282828ff).into(),
text_muted: rgba(0x5f5650ff).into(),
text_placeholder: rgba(0x9d0308ff).into(),
text_disabled: rgba(0x897b6eff).into(),
text_accent: rgba(0x0b6678ff).into(),
icon_muted: rgba(0x5f5650ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("preproc".into(), rgba(0x282828ff).into()),
("punctuation.list_marker".into(), rgba(0x282828ff).into()),
("string".into(), rgba(0x79740eff).into()),
("constant".into(), rgba(0xb57613ff).into()),
("keyword".into(), rgba(0x9d0006ff).into()),
("string.special.symbol".into(), rgba(0x427b58ff).into()),
("comment.doc".into(), rgba(0x5d544eff).into()),
("hint".into(), rgba(0x677562ff).into()),
("number".into(), rgba(0x8f3e71ff).into()),
("enum".into(), rgba(0xaf3a02ff).into()),
("emphasis".into(), rgba(0x0b6678ff).into()),
("operator".into(), rgba(0x427b58ff).into()),
("comment".into(), rgba(0x7c6f64ff).into()),
("embedded".into(), rgba(0x427b58ff).into()),
("type".into(), rgba(0xb57613ff).into()),
("title".into(), rgba(0x79740eff).into()),
("constructor".into(), rgba(0x0b6678ff).into()),
("punctuation.delimiter".into(), rgba(0x413d3aff).into()),
("function".into(), rgba(0x79740eff).into()),
("link_uri".into(), rgba(0x8f3e71ff).into()),
("emphasis.strong".into(), rgba(0x0b6678ff).into()),
("boolean".into(), rgba(0x8f3e71ff).into()),
("function.builtin".into(), rgba(0x9d0006ff).into()),
("predictive".into(), rgba(0x7c9780ff).into()),
("string.regex".into(), rgba(0xaf3a02ff).into()),
("tag".into(), rgba(0x427b58ff).into()),
("text.literal".into(), rgba(0x066578ff).into()),
("punctuation".into(), rgba(0x3c3836ff).into()),
("punctuation.bracket".into(), rgba(0x665c54ff).into()),
("variable".into(), rgba(0x066578ff).into()),
("attribute".into(), rgba(0x0b6678ff).into()),
("string.special".into(), rgba(0x8f3e71ff).into()),
("label".into(), rgba(0x0b6678ff).into()),
("string.escape".into(), rgba(0x5d544eff).into()),
("link_text".into(), rgba(0x427b58ff).into()),
("punctuation.special".into(), rgba(0x413d3aff).into()),
("property".into(), rgba(0x282828ff).into()),
("variant".into(), rgba(0x0b6678ff).into()),
("primary".into(), rgba(0x282828ff).into()),
],
},
status_bar: rgba(0xd9c8a4ff).into(),
title_bar: rgba(0xd9c8a4ff).into(),
toolbar: rgba(0xf2e5bcff).into(),
tab_bar: rgba(0xecdcb3ff).into(),
editor: rgba(0xf2e5bcff).into(),
editor_subheader: rgba(0xecdcb3ff).into(),
editor_active_line: rgba(0xecdcb3ff).into(),
terminal: rgba(0xf2e5bcff).into(),
image_fallback_background: rgba(0xd9c8a4ff).into(),
git_created: rgba(0x797410ff).into(),
git_modified: rgba(0x0b6678ff).into(),
git_deleted: rgba(0x9d0308ff).into(),
git_conflict: rgba(0xb57615ff).into(),
git_ignored: rgba(0x897b6eff).into(),
git_renamed: rgba(0xb57615ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x0b6678ff).into(),
selection: rgba(0x0b66783d).into(),
},
PlayerTheme {
cursor: rgba(0x797410ff).into(),
selection: rgba(0x7974103d).into(),
},
PlayerTheme {
cursor: rgba(0x7c6f64ff).into(),
selection: rgba(0x7c6f643d).into(),
},
PlayerTheme {
cursor: rgba(0xaf3a04ff).into(),
selection: rgba(0xaf3a043d).into(),
},
PlayerTheme {
cursor: rgba(0x8f3f70ff).into(),
selection: rgba(0x8f3f703d).into(),
},
PlayerTheme {
cursor: rgba(0x437b59ff).into(),
selection: rgba(0x437b593d).into(),
},
PlayerTheme {
cursor: rgba(0x9d0308ff).into(),
selection: rgba(0x9d03083d).into(),
},
PlayerTheme {
cursor: rgba(0xb57615ff).into(),
selection: rgba(0xb576153d).into(),
},
],
}
}

View File

@@ -1,79 +0,0 @@
mod andromeda;
mod atelier_cave_dark;
mod atelier_cave_light;
mod atelier_dune_dark;
mod atelier_dune_light;
mod atelier_estuary_dark;
mod atelier_estuary_light;
mod atelier_forest_dark;
mod atelier_forest_light;
mod atelier_heath_dark;
mod atelier_heath_light;
mod atelier_lakeside_dark;
mod atelier_lakeside_light;
mod atelier_plateau_dark;
mod atelier_plateau_light;
mod atelier_savanna_dark;
mod atelier_savanna_light;
mod atelier_seaside_dark;
mod atelier_seaside_light;
mod atelier_sulphurpool_dark;
mod atelier_sulphurpool_light;
mod ayu_dark;
mod ayu_light;
mod ayu_mirage;
mod gruvbox_dark;
mod gruvbox_dark_hard;
mod gruvbox_dark_soft;
mod gruvbox_light;
mod gruvbox_light_hard;
mod gruvbox_light_soft;
mod one_dark;
mod one_light;
mod rose_pine;
mod rose_pine_dawn;
mod rose_pine_moon;
mod sandcastle;
mod solarized_dark;
mod solarized_light;
mod summercamp;
pub use andromeda::*;
pub use atelier_cave_dark::*;
pub use atelier_cave_light::*;
pub use atelier_dune_dark::*;
pub use atelier_dune_light::*;
pub use atelier_estuary_dark::*;
pub use atelier_estuary_light::*;
pub use atelier_forest_dark::*;
pub use atelier_forest_light::*;
pub use atelier_heath_dark::*;
pub use atelier_heath_light::*;
pub use atelier_lakeside_dark::*;
pub use atelier_lakeside_light::*;
pub use atelier_plateau_dark::*;
pub use atelier_plateau_light::*;
pub use atelier_savanna_dark::*;
pub use atelier_savanna_light::*;
pub use atelier_seaside_dark::*;
pub use atelier_seaside_light::*;
pub use atelier_sulphurpool_dark::*;
pub use atelier_sulphurpool_light::*;
pub use ayu_dark::*;
pub use ayu_light::*;
pub use ayu_mirage::*;
pub use gruvbox_dark::*;
pub use gruvbox_dark_hard::*;
pub use gruvbox_dark_soft::*;
pub use gruvbox_light::*;
pub use gruvbox_light_hard::*;
pub use gruvbox_light_soft::*;
pub use one_dark::*;
pub use one_light::*;
pub use rose_pine::*;
pub use rose_pine_dawn::*;
pub use rose_pine_moon::*;
pub use sandcastle::*;
pub use solarized_dark::*;
pub use solarized_light::*;
pub use summercamp::*;

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn one_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "One Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x464b57ff).into(),
border_variant: rgba(0x464b57ff).into(),
border_focused: rgba(0x293b5bff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x3b414dff).into(),
surface: rgba(0x2f343eff).into(),
background: rgba(0x3b414dff).into(),
filled_element: rgba(0x3b414dff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x18243dff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x18243dff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xc8ccd4ff).into(),
text_muted: rgba(0x838994ff).into(),
text_placeholder: rgba(0xd07277ff).into(),
text_disabled: rgba(0x555a63ff).into(),
text_accent: rgba(0x74ade8ff).into(),
icon_muted: rgba(0x838994ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("keyword".into(), rgba(0xb477cfff).into()),
("comment.doc".into(), rgba(0x878e98ff).into()),
("variant".into(), rgba(0x73ade9ff).into()),
("property".into(), rgba(0xd07277ff).into()),
("function".into(), rgba(0x73ade9ff).into()),
("type".into(), rgba(0x6eb4bfff).into()),
("tag".into(), rgba(0x74ade8ff).into()),
("string.escape".into(), rgba(0x878e98ff).into()),
("punctuation.bracket".into(), rgba(0xb2b9c6ff).into()),
("hint".into(), rgba(0x5a6f89ff).into()),
("punctuation".into(), rgba(0xacb2beff).into()),
("comment".into(), rgba(0x5d636fff).into()),
("emphasis".into(), rgba(0x74ade8ff).into()),
("punctuation.special".into(), rgba(0xb1574bff).into()),
("link_uri".into(), rgba(0x6eb4bfff).into()),
("string.regex".into(), rgba(0xbf956aff).into()),
("constructor".into(), rgba(0x73ade9ff).into()),
("operator".into(), rgba(0x6eb4bfff).into()),
("constant".into(), rgba(0xdfc184ff).into()),
("string.special".into(), rgba(0xbf956aff).into()),
("emphasis.strong".into(), rgba(0xbf956aff).into()),
("string.special.symbol".into(), rgba(0xbf956aff).into()),
("primary".into(), rgba(0xacb2beff).into()),
("preproc".into(), rgba(0xc8ccd4ff).into()),
("string".into(), rgba(0xa1c181ff).into()),
("punctuation.delimiter".into(), rgba(0xb2b9c6ff).into()),
("embedded".into(), rgba(0xc8ccd4ff).into()),
("enum".into(), rgba(0xd07277ff).into()),
("variable.special".into(), rgba(0xbf956aff).into()),
("text.literal".into(), rgba(0xa1c181ff).into()),
("attribute".into(), rgba(0x74ade8ff).into()),
("link_text".into(), rgba(0x73ade9ff).into()),
("title".into(), rgba(0xd07277ff).into()),
("predictive".into(), rgba(0x5a6a87ff).into()),
("number".into(), rgba(0xbf956aff).into()),
("label".into(), rgba(0x74ade8ff).into()),
("variable".into(), rgba(0xc8ccd4ff).into()),
("boolean".into(), rgba(0xbf956aff).into()),
("punctuation.list_marker".into(), rgba(0xd07277ff).into()),
],
},
status_bar: rgba(0x3b414dff).into(),
title_bar: rgba(0x3b414dff).into(),
toolbar: rgba(0x282c33ff).into(),
tab_bar: rgba(0x2f343eff).into(),
editor: rgba(0x282c33ff).into(),
editor_subheader: rgba(0x2f343eff).into(),
editor_active_line: rgba(0x2f343eff).into(),
terminal: rgba(0x282c33ff).into(),
image_fallback_background: rgba(0x3b414dff).into(),
git_created: rgba(0xa1c181ff).into(),
git_modified: rgba(0x74ade8ff).into(),
git_deleted: rgba(0xd07277ff).into(),
git_conflict: rgba(0xdec184ff).into(),
git_ignored: rgba(0x555a63ff).into(),
git_renamed: rgba(0xdec184ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x74ade8ff).into(),
selection: rgba(0x74ade83d).into(),
},
PlayerTheme {
cursor: rgba(0xa1c181ff).into(),
selection: rgba(0xa1c1813d).into(),
},
PlayerTheme {
cursor: rgba(0xbe5046ff).into(),
selection: rgba(0xbe50463d).into(),
},
PlayerTheme {
cursor: rgba(0xbf956aff).into(),
selection: rgba(0xbf956a3d).into(),
},
PlayerTheme {
cursor: rgba(0xb477cfff).into(),
selection: rgba(0xb477cf3d).into(),
},
PlayerTheme {
cursor: rgba(0x6eb4bfff).into(),
selection: rgba(0x6eb4bf3d).into(),
},
PlayerTheme {
cursor: rgba(0xd07277ff).into(),
selection: rgba(0xd072773d).into(),
},
PlayerTheme {
cursor: rgba(0xdec184ff).into(),
selection: rgba(0xdec1843d).into(),
},
],
}
}

View File

@@ -1,131 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn one_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "One Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xc9c9caff).into(),
border_variant: rgba(0xc9c9caff).into(),
border_focused: rgba(0xcbcdf6ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xdcdcddff).into(),
surface: rgba(0xebebecff).into(),
background: rgba(0xdcdcddff).into(),
filled_element: rgba(0xdcdcddff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xe2e2faff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xe2e2faff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x383a41ff).into(),
text_muted: rgba(0x7e8087ff).into(),
text_placeholder: rgba(0xd36151ff).into(),
text_disabled: rgba(0xa1a1a3ff).into(),
text_accent: rgba(0x5c78e2ff).into(),
icon_muted: rgba(0x7e8087ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("string.special.symbol".into(), rgba(0xad6e26ff).into()),
("hint".into(), rgba(0x9294beff).into()),
("link_uri".into(), rgba(0x3882b7ff).into()),
("type".into(), rgba(0x3882b7ff).into()),
("string.regex".into(), rgba(0xad6e26ff).into()),
("constant".into(), rgba(0x669f59ff).into()),
("function".into(), rgba(0x5b79e3ff).into()),
("string.special".into(), rgba(0xad6e26ff).into()),
("punctuation.bracket".into(), rgba(0x4d4f52ff).into()),
("variable".into(), rgba(0x383a41ff).into()),
("punctuation".into(), rgba(0x383a41ff).into()),
("property".into(), rgba(0xd3604fff).into()),
("string".into(), rgba(0x649f57ff).into()),
("predictive".into(), rgba(0x9b9ec6ff).into()),
("attribute".into(), rgba(0x5c78e2ff).into()),
("number".into(), rgba(0xad6e25ff).into()),
("constructor".into(), rgba(0x5c78e2ff).into()),
("embedded".into(), rgba(0x383a41ff).into()),
("title".into(), rgba(0xd3604fff).into()),
("tag".into(), rgba(0x5c78e2ff).into()),
("boolean".into(), rgba(0xad6e25ff).into()),
("punctuation.list_marker".into(), rgba(0xd3604fff).into()),
("variant".into(), rgba(0x5b79e3ff).into()),
("emphasis".into(), rgba(0x5c78e2ff).into()),
("link_text".into(), rgba(0x5b79e3ff).into()),
("comment".into(), rgba(0xa2a3a7ff).into()),
("punctuation.special".into(), rgba(0xb92b46ff).into()),
("emphasis.strong".into(), rgba(0xad6e25ff).into()),
("primary".into(), rgba(0x383a41ff).into()),
("punctuation.delimiter".into(), rgba(0x4d4f52ff).into()),
("label".into(), rgba(0x5c78e2ff).into()),
("keyword".into(), rgba(0xa449abff).into()),
("string.escape".into(), rgba(0x7c7e86ff).into()),
("text.literal".into(), rgba(0x649f57ff).into()),
("variable.special".into(), rgba(0xad6e25ff).into()),
("comment.doc".into(), rgba(0x7c7e86ff).into()),
("enum".into(), rgba(0xd3604fff).into()),
("operator".into(), rgba(0x3882b7ff).into()),
("preproc".into(), rgba(0x383a41ff).into()),
],
},
status_bar: rgba(0xdcdcddff).into(),
title_bar: rgba(0xdcdcddff).into(),
toolbar: rgba(0xfafafaff).into(),
tab_bar: rgba(0xebebecff).into(),
editor: rgba(0xfafafaff).into(),
editor_subheader: rgba(0xebebecff).into(),
editor_active_line: rgba(0xebebecff).into(),
terminal: rgba(0xfafafaff).into(),
image_fallback_background: rgba(0xdcdcddff).into(),
git_created: rgba(0x669f59ff).into(),
git_modified: rgba(0x5c78e2ff).into(),
git_deleted: rgba(0xd36151ff).into(),
git_conflict: rgba(0xdec184ff).into(),
git_ignored: rgba(0xa1a1a3ff).into(),
git_renamed: rgba(0xdec184ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x5c78e2ff).into(),
selection: rgba(0x5c78e23d).into(),
},
PlayerTheme {
cursor: rgba(0x669f59ff).into(),
selection: rgba(0x669f593d).into(),
},
PlayerTheme {
cursor: rgba(0x984ea5ff).into(),
selection: rgba(0x984ea53d).into(),
},
PlayerTheme {
cursor: rgba(0xad6e26ff).into(),
selection: rgba(0xad6e263d).into(),
},
PlayerTheme {
cursor: rgba(0xa349abff).into(),
selection: rgba(0xa349ab3d).into(),
},
PlayerTheme {
cursor: rgba(0x3a82b7ff).into(),
selection: rgba(0x3a82b73d).into(),
},
PlayerTheme {
cursor: rgba(0xd36151ff).into(),
selection: rgba(0xd361513d).into(),
},
PlayerTheme {
cursor: rgba(0xdec184ff).into(),
selection: rgba(0xdec1843d).into(),
},
],
}
}

View File

@@ -1,132 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn rose_pine() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Rosé Pine".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x423f55ff).into(),
border_variant: rgba(0x423f55ff).into(),
border_focused: rgba(0x435255ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x292738ff).into(),
surface: rgba(0x1c1b2aff).into(),
background: rgba(0x292738ff).into(),
filled_element: rgba(0x292738ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x2f3639ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x2f3639ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xe0def4ff).into(),
text_muted: rgba(0x74708dff).into(),
text_placeholder: rgba(0xea6e92ff).into(),
text_disabled: rgba(0x2f2b43ff).into(),
text_accent: rgba(0x9bced6ff).into(),
icon_muted: rgba(0x74708dff).into(),
syntax: SyntaxTheme {
highlights: vec![
("punctuation.delimiter".into(), rgba(0x9d99b6ff).into()),
("number".into(), rgba(0x5cc1a3ff).into()),
("punctuation.special".into(), rgba(0x9d99b6ff).into()),
("string.escape".into(), rgba(0x76728fff).into()),
("title".into(), rgba(0xf5c177ff).into()),
("constant".into(), rgba(0x5cc1a3ff).into()),
("string.regex".into(), rgba(0xc4a7e6ff).into()),
("type.builtin".into(), rgba(0x9ccfd8ff).into()),
("comment.doc".into(), rgba(0x76728fff).into()),
("primary".into(), rgba(0xe0def4ff).into()),
("string.special".into(), rgba(0xc4a7e6ff).into()),
("punctuation".into(), rgba(0x908caaff).into()),
("string.special.symbol".into(), rgba(0xc4a7e6ff).into()),
("variant".into(), rgba(0x9bced6ff).into()),
("function.method".into(), rgba(0xebbcbaff).into()),
("comment".into(), rgba(0x6e6a86ff).into()),
("boolean".into(), rgba(0xebbcbaff).into()),
("preproc".into(), rgba(0xe0def4ff).into()),
("link_uri".into(), rgba(0xebbcbaff).into()),
("hint".into(), rgba(0x5e768cff).into()),
("attribute".into(), rgba(0x9bced6ff).into()),
("text.literal".into(), rgba(0xc4a7e6ff).into()),
("punctuation.list_marker".into(), rgba(0x9d99b6ff).into()),
("operator".into(), rgba(0x30738fff).into()),
("emphasis.strong".into(), rgba(0x9bced6ff).into()),
("keyword".into(), rgba(0x30738fff).into()),
("enum".into(), rgba(0xc4a7e6ff).into()),
("tag".into(), rgba(0x9ccfd8ff).into()),
("constructor".into(), rgba(0x9bced6ff).into()),
("function".into(), rgba(0xebbcbaff).into()),
("string".into(), rgba(0xf5c177ff).into()),
("type".into(), rgba(0x9ccfd8ff).into()),
("emphasis".into(), rgba(0x9bced6ff).into()),
("link_text".into(), rgba(0x9ccfd8ff).into()),
("property".into(), rgba(0x9bced6ff).into()),
("predictive".into(), rgba(0x556b81ff).into()),
("punctuation.bracket".into(), rgba(0x9d99b6ff).into()),
("embedded".into(), rgba(0xe0def4ff).into()),
("variable".into(), rgba(0xe0def4ff).into()),
("label".into(), rgba(0x9bced6ff).into()),
],
},
status_bar: rgba(0x292738ff).into(),
title_bar: rgba(0x292738ff).into(),
toolbar: rgba(0x191724ff).into(),
tab_bar: rgba(0x1c1b2aff).into(),
editor: rgba(0x191724ff).into(),
editor_subheader: rgba(0x1c1b2aff).into(),
editor_active_line: rgba(0x1c1b2aff).into(),
terminal: rgba(0x191724ff).into(),
image_fallback_background: rgba(0x292738ff).into(),
git_created: rgba(0x5cc1a3ff).into(),
git_modified: rgba(0x9bced6ff).into(),
git_deleted: rgba(0xea6e92ff).into(),
git_conflict: rgba(0xf5c177ff).into(),
git_ignored: rgba(0x2f2b43ff).into(),
git_renamed: rgba(0xf5c177ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x9bced6ff).into(),
selection: rgba(0x9bced63d).into(),
},
PlayerTheme {
cursor: rgba(0x5cc1a3ff).into(),
selection: rgba(0x5cc1a33d).into(),
},
PlayerTheme {
cursor: rgba(0x9d7591ff).into(),
selection: rgba(0x9d75913d).into(),
},
PlayerTheme {
cursor: rgba(0xc4a7e6ff).into(),
selection: rgba(0xc4a7e63d).into(),
},
PlayerTheme {
cursor: rgba(0xc4a7e6ff).into(),
selection: rgba(0xc4a7e63d).into(),
},
PlayerTheme {
cursor: rgba(0x31738fff).into(),
selection: rgba(0x31738f3d).into(),
},
PlayerTheme {
cursor: rgba(0xea6e92ff).into(),
selection: rgba(0xea6e923d).into(),
},
PlayerTheme {
cursor: rgba(0xf5c177ff).into(),
selection: rgba(0xf5c1773d).into(),
},
],
}
}

View File

@@ -1,132 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn rose_pine_dawn() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Rosé Pine Dawn".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0xdcd6d5ff).into(),
border_variant: rgba(0xdcd6d5ff).into(),
border_focused: rgba(0xc3d7dbff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xdcd8d8ff).into(),
surface: rgba(0xfef9f2ff).into(),
background: rgba(0xdcd8d8ff).into(),
filled_element: rgba(0xdcd8d8ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xdde9ebff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xdde9ebff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x575279ff).into(),
text_muted: rgba(0x706c8cff).into(),
text_placeholder: rgba(0xb4647aff).into(),
text_disabled: rgba(0x938fa3ff).into(),
text_accent: rgba(0x57949fff).into(),
icon_muted: rgba(0x706c8cff).into(),
syntax: SyntaxTheme {
highlights: vec![
("primary".into(), rgba(0x575279ff).into()),
("attribute".into(), rgba(0x57949fff).into()),
("operator".into(), rgba(0x276983ff).into()),
("boolean".into(), rgba(0xd7827dff).into()),
("tag".into(), rgba(0x55949fff).into()),
("enum".into(), rgba(0x9079a9ff).into()),
("embedded".into(), rgba(0x575279ff).into()),
("label".into(), rgba(0x57949fff).into()),
("function.method".into(), rgba(0xd7827dff).into()),
("punctuation.list_marker".into(), rgba(0x635e82ff).into()),
("punctuation.delimiter".into(), rgba(0x635e82ff).into()),
("string".into(), rgba(0xea9d34ff).into()),
("type".into(), rgba(0x55949fff).into()),
("string.regex".into(), rgba(0x9079a9ff).into()),
("variable".into(), rgba(0x575279ff).into()),
("constructor".into(), rgba(0x57949fff).into()),
("punctuation.bracket".into(), rgba(0x635e82ff).into()),
("emphasis".into(), rgba(0x57949fff).into()),
("comment.doc".into(), rgba(0x6e6a8bff).into()),
("comment".into(), rgba(0x9893a5ff).into()),
("keyword".into(), rgba(0x276983ff).into()),
("preproc".into(), rgba(0x575279ff).into()),
("string.special".into(), rgba(0x9079a9ff).into()),
("string.escape".into(), rgba(0x6e6a8bff).into()),
("constant".into(), rgba(0x3daa8eff).into()),
("property".into(), rgba(0x57949fff).into()),
("punctuation.special".into(), rgba(0x635e82ff).into()),
("text.literal".into(), rgba(0x9079a9ff).into()),
("type.builtin".into(), rgba(0x55949fff).into()),
("string.special.symbol".into(), rgba(0x9079a9ff).into()),
("link_uri".into(), rgba(0xd7827dff).into()),
("number".into(), rgba(0x3daa8eff).into()),
("emphasis.strong".into(), rgba(0x57949fff).into()),
("function".into(), rgba(0xd7827dff).into()),
("title".into(), rgba(0xea9d34ff).into()),
("punctuation".into(), rgba(0x797593ff).into()),
("link_text".into(), rgba(0x55949fff).into()),
("variant".into(), rgba(0x57949fff).into()),
("predictive".into(), rgba(0xa2acbeff).into()),
("hint".into(), rgba(0x7a92aaff).into()),
],
},
status_bar: rgba(0xdcd8d8ff).into(),
title_bar: rgba(0xdcd8d8ff).into(),
toolbar: rgba(0xfaf4edff).into(),
tab_bar: rgba(0xfef9f2ff).into(),
editor: rgba(0xfaf4edff).into(),
editor_subheader: rgba(0xfef9f2ff).into(),
editor_active_line: rgba(0xfef9f2ff).into(),
terminal: rgba(0xfaf4edff).into(),
image_fallback_background: rgba(0xdcd8d8ff).into(),
git_created: rgba(0x3daa8eff).into(),
git_modified: rgba(0x57949fff).into(),
git_deleted: rgba(0xb4647aff).into(),
git_conflict: rgba(0xe99d35ff).into(),
git_ignored: rgba(0x938fa3ff).into(),
git_renamed: rgba(0xe99d35ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x57949fff).into(),
selection: rgba(0x57949f3d).into(),
},
PlayerTheme {
cursor: rgba(0x3daa8eff).into(),
selection: rgba(0x3daa8e3d).into(),
},
PlayerTheme {
cursor: rgba(0x7c697fff).into(),
selection: rgba(0x7c697f3d).into(),
},
PlayerTheme {
cursor: rgba(0x9079a9ff).into(),
selection: rgba(0x9079a93d).into(),
},
PlayerTheme {
cursor: rgba(0x9079a9ff).into(),
selection: rgba(0x9079a93d).into(),
},
PlayerTheme {
cursor: rgba(0x296983ff).into(),
selection: rgba(0x2969833d).into(),
},
PlayerTheme {
cursor: rgba(0xb4647aff).into(),
selection: rgba(0xb4647a3d).into(),
},
PlayerTheme {
cursor: rgba(0xe99d35ff).into(),
selection: rgba(0xe99d353d).into(),
},
],
}
}

View File

@@ -1,132 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn rose_pine_moon() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Rosé Pine Moon".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x504c68ff).into(),
border_variant: rgba(0x504c68ff).into(),
border_focused: rgba(0x435255ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x38354eff).into(),
surface: rgba(0x28253cff).into(),
background: rgba(0x38354eff).into(),
filled_element: rgba(0x38354eff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x2f3639ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x2f3639ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xe0def4ff).into(),
text_muted: rgba(0x85819eff).into(),
text_placeholder: rgba(0xea6e92ff).into(),
text_disabled: rgba(0x605d7aff).into(),
text_accent: rgba(0x9bced6ff).into(),
icon_muted: rgba(0x85819eff).into(),
syntax: SyntaxTheme {
highlights: vec![
("type.builtin".into(), rgba(0x9ccfd8ff).into()),
("variable".into(), rgba(0xe0def4ff).into()),
("punctuation".into(), rgba(0x908caaff).into()),
("number".into(), rgba(0x5cc1a3ff).into()),
("comment".into(), rgba(0x6e6a86ff).into()),
("string.special".into(), rgba(0xc4a7e6ff).into()),
("string.escape".into(), rgba(0x8682a0ff).into()),
("function.method".into(), rgba(0xea9a97ff).into()),
("predictive".into(), rgba(0x516b83ff).into()),
("punctuation.delimiter".into(), rgba(0xaeabc6ff).into()),
("primary".into(), rgba(0xe0def4ff).into()),
("link_text".into(), rgba(0x9ccfd8ff).into()),
("string.regex".into(), rgba(0xc4a7e6ff).into()),
("constructor".into(), rgba(0x9bced6ff).into()),
("constant".into(), rgba(0x5cc1a3ff).into()),
("emphasis.strong".into(), rgba(0x9bced6ff).into()),
("function".into(), rgba(0xea9a97ff).into()),
("hint".into(), rgba(0x728aa2ff).into()),
("preproc".into(), rgba(0xe0def4ff).into()),
("property".into(), rgba(0x9bced6ff).into()),
("punctuation.list_marker".into(), rgba(0xaeabc6ff).into()),
("emphasis".into(), rgba(0x9bced6ff).into()),
("attribute".into(), rgba(0x9bced6ff).into()),
("title".into(), rgba(0xf5c177ff).into()),
("keyword".into(), rgba(0x3d8fb0ff).into()),
("string".into(), rgba(0xf5c177ff).into()),
("text.literal".into(), rgba(0xc4a7e6ff).into()),
("embedded".into(), rgba(0xe0def4ff).into()),
("comment.doc".into(), rgba(0x8682a0ff).into()),
("variant".into(), rgba(0x9bced6ff).into()),
("label".into(), rgba(0x9bced6ff).into()),
("punctuation.special".into(), rgba(0xaeabc6ff).into()),
("string.special.symbol".into(), rgba(0xc4a7e6ff).into()),
("tag".into(), rgba(0x9ccfd8ff).into()),
("enum".into(), rgba(0xc4a7e6ff).into()),
("boolean".into(), rgba(0xea9a97ff).into()),
("punctuation.bracket".into(), rgba(0xaeabc6ff).into()),
("operator".into(), rgba(0x3d8fb0ff).into()),
("type".into(), rgba(0x9ccfd8ff).into()),
("link_uri".into(), rgba(0xea9a97ff).into()),
],
},
status_bar: rgba(0x38354eff).into(),
title_bar: rgba(0x38354eff).into(),
toolbar: rgba(0x232136ff).into(),
tab_bar: rgba(0x28253cff).into(),
editor: rgba(0x232136ff).into(),
editor_subheader: rgba(0x28253cff).into(),
editor_active_line: rgba(0x28253cff).into(),
terminal: rgba(0x232136ff).into(),
image_fallback_background: rgba(0x38354eff).into(),
git_created: rgba(0x5cc1a3ff).into(),
git_modified: rgba(0x9bced6ff).into(),
git_deleted: rgba(0xea6e92ff).into(),
git_conflict: rgba(0xf5c177ff).into(),
git_ignored: rgba(0x605d7aff).into(),
git_renamed: rgba(0xf5c177ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x9bced6ff).into(),
selection: rgba(0x9bced63d).into(),
},
PlayerTheme {
cursor: rgba(0x5cc1a3ff).into(),
selection: rgba(0x5cc1a33d).into(),
},
PlayerTheme {
cursor: rgba(0xa683a0ff).into(),
selection: rgba(0xa683a03d).into(),
},
PlayerTheme {
cursor: rgba(0xc4a7e6ff).into(),
selection: rgba(0xc4a7e63d).into(),
},
PlayerTheme {
cursor: rgba(0xc4a7e6ff).into(),
selection: rgba(0xc4a7e63d).into(),
},
PlayerTheme {
cursor: rgba(0x3e8fb0ff).into(),
selection: rgba(0x3e8fb03d).into(),
},
PlayerTheme {
cursor: rgba(0xea6e92ff).into(),
selection: rgba(0xea6e923d).into(),
},
PlayerTheme {
cursor: rgba(0xf5c177ff).into(),
selection: rgba(0xf5c1773d).into(),
},
],
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn sandcastle() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Sandcastle".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x3d4350ff).into(),
border_variant: rgba(0x3d4350ff).into(),
border_focused: rgba(0x223131ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x333944ff).into(),
surface: rgba(0x2b3038ff).into(),
background: rgba(0x333944ff).into(),
filled_element: rgba(0x333944ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x171e1eff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x171e1eff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xfdf4c1ff).into(),
text_muted: rgba(0xa69782ff).into(),
text_placeholder: rgba(0xb3627aff).into(),
text_disabled: rgba(0x827568ff).into(),
text_accent: rgba(0x518b8bff).into(),
icon_muted: rgba(0xa69782ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("comment".into(), rgba(0xa89984ff).into()),
("type".into(), rgba(0x83a598ff).into()),
("preproc".into(), rgba(0xfdf4c1ff).into()),
("punctuation.bracket".into(), rgba(0xd5c5a1ff).into()),
("hint".into(), rgba(0x727d68ff).into()),
("link_uri".into(), rgba(0x83a598ff).into()),
("text.literal".into(), rgba(0xa07d3aff).into()),
("enum".into(), rgba(0xa07d3aff).into()),
("string.special".into(), rgba(0xa07d3aff).into()),
("string".into(), rgba(0xa07d3aff).into()),
("punctuation.special".into(), rgba(0xd5c5a1ff).into()),
("keyword".into(), rgba(0x518b8bff).into()),
("constructor".into(), rgba(0x518b8bff).into()),
("predictive".into(), rgba(0x5c6152ff).into()),
("title".into(), rgba(0xfdf4c1ff).into()),
("variable".into(), rgba(0xfdf4c1ff).into()),
("emphasis.strong".into(), rgba(0x518b8bff).into()),
("primary".into(), rgba(0xfdf4c1ff).into()),
("emphasis".into(), rgba(0x518b8bff).into()),
("punctuation".into(), rgba(0xd5c5a1ff).into()),
("constant".into(), rgba(0x83a598ff).into()),
("link_text".into(), rgba(0xa07d3aff).into()),
("punctuation.delimiter".into(), rgba(0xd5c5a1ff).into()),
("embedded".into(), rgba(0xfdf4c1ff).into()),
("string.special.symbol".into(), rgba(0xa07d3aff).into()),
("tag".into(), rgba(0x518b8bff).into()),
("punctuation.list_marker".into(), rgba(0xd5c5a1ff).into()),
("operator".into(), rgba(0xa07d3aff).into()),
("boolean".into(), rgba(0x83a598ff).into()),
("function".into(), rgba(0xa07d3aff).into()),
("attribute".into(), rgba(0x518b8bff).into()),
("number".into(), rgba(0x83a598ff).into()),
("string.escape".into(), rgba(0xa89984ff).into()),
("comment.doc".into(), rgba(0xa89984ff).into()),
("label".into(), rgba(0x518b8bff).into()),
("string.regex".into(), rgba(0xa07d3aff).into()),
("property".into(), rgba(0x518b8bff).into()),
("variant".into(), rgba(0x518b8bff).into()),
],
},
status_bar: rgba(0x333944ff).into(),
title_bar: rgba(0x333944ff).into(),
toolbar: rgba(0x282c33ff).into(),
tab_bar: rgba(0x2b3038ff).into(),
editor: rgba(0x282c33ff).into(),
editor_subheader: rgba(0x2b3038ff).into(),
editor_active_line: rgba(0x2b3038ff).into(),
terminal: rgba(0x282c33ff).into(),
image_fallback_background: rgba(0x333944ff).into(),
git_created: rgba(0x83a598ff).into(),
git_modified: rgba(0x518b8bff).into(),
git_deleted: rgba(0xb3627aff).into(),
git_conflict: rgba(0xa07d3aff).into(),
git_ignored: rgba(0x827568ff).into(),
git_renamed: rgba(0xa07d3aff).into(),
players: [
PlayerTheme {
cursor: rgba(0x518b8bff).into(),
selection: rgba(0x518b8b3d).into(),
},
PlayerTheme {
cursor: rgba(0x83a598ff).into(),
selection: rgba(0x83a5983d).into(),
},
PlayerTheme {
cursor: rgba(0xa87222ff).into(),
selection: rgba(0xa872223d).into(),
},
PlayerTheme {
cursor: rgba(0xa07d3aff).into(),
selection: rgba(0xa07d3a3d).into(),
},
PlayerTheme {
cursor: rgba(0xd75f5fff).into(),
selection: rgba(0xd75f5f3d).into(),
},
PlayerTheme {
cursor: rgba(0x83a598ff).into(),
selection: rgba(0x83a5983d).into(),
},
PlayerTheme {
cursor: rgba(0xb3627aff).into(),
selection: rgba(0xb3627a3d).into(),
},
PlayerTheme {
cursor: rgba(0xa07d3aff).into(),
selection: rgba(0xa07d3a3d).into(),
},
],
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn solarized_dark() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Solarized Dark".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x2b4e58ff).into(),
border_variant: rgba(0x2b4e58ff).into(),
border_focused: rgba(0x1b3149ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x073743ff).into(),
surface: rgba(0x04313bff).into(),
background: rgba(0x073743ff).into(),
filled_element: rgba(0x073743ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x141f2cff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x141f2cff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xfdf6e3ff).into(),
text_muted: rgba(0x93a1a1ff).into(),
text_placeholder: rgba(0xdc3330ff).into(),
text_disabled: rgba(0x6f8389ff).into(),
text_accent: rgba(0x278ad1ff).into(),
icon_muted: rgba(0x93a1a1ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("punctuation.special".into(), rgba(0xefe9d6ff).into()),
("string".into(), rgba(0xcb4b16ff).into()),
("variant".into(), rgba(0x278ad1ff).into()),
("variable".into(), rgba(0xfdf6e3ff).into()),
("string.special.symbol".into(), rgba(0xcb4b16ff).into()),
("primary".into(), rgba(0xfdf6e3ff).into()),
("type".into(), rgba(0x2ba198ff).into()),
("boolean".into(), rgba(0x849903ff).into()),
("string.special".into(), rgba(0xcb4b16ff).into()),
("label".into(), rgba(0x278ad1ff).into()),
("link_uri".into(), rgba(0x849903ff).into()),
("constructor".into(), rgba(0x278ad1ff).into()),
("hint".into(), rgba(0x4f8297ff).into()),
("preproc".into(), rgba(0xfdf6e3ff).into()),
("text.literal".into(), rgba(0xcb4b16ff).into()),
("string.escape".into(), rgba(0x99a5a4ff).into()),
("link_text".into(), rgba(0xcb4b16ff).into()),
("comment".into(), rgba(0x99a5a4ff).into()),
("enum".into(), rgba(0xcb4b16ff).into()),
("constant".into(), rgba(0x849903ff).into()),
("comment.doc".into(), rgba(0x99a5a4ff).into()),
("emphasis".into(), rgba(0x278ad1ff).into()),
("predictive".into(), rgba(0x3f718bff).into()),
("attribute".into(), rgba(0x278ad1ff).into()),
("punctuation.delimiter".into(), rgba(0xefe9d6ff).into()),
("function".into(), rgba(0xb58902ff).into()),
("emphasis.strong".into(), rgba(0x278ad1ff).into()),
("tag".into(), rgba(0x278ad1ff).into()),
("string.regex".into(), rgba(0xcb4b16ff).into()),
("property".into(), rgba(0x278ad1ff).into()),
("keyword".into(), rgba(0x278ad1ff).into()),
("number".into(), rgba(0x849903ff).into()),
("embedded".into(), rgba(0xfdf6e3ff).into()),
("operator".into(), rgba(0xcb4b16ff).into()),
("punctuation".into(), rgba(0xefe9d6ff).into()),
("punctuation.bracket".into(), rgba(0xefe9d6ff).into()),
("title".into(), rgba(0xfdf6e3ff).into()),
("punctuation.list_marker".into(), rgba(0xefe9d6ff).into()),
],
},
status_bar: rgba(0x073743ff).into(),
title_bar: rgba(0x073743ff).into(),
toolbar: rgba(0x002a35ff).into(),
tab_bar: rgba(0x04313bff).into(),
editor: rgba(0x002a35ff).into(),
editor_subheader: rgba(0x04313bff).into(),
editor_active_line: rgba(0x04313bff).into(),
terminal: rgba(0x002a35ff).into(),
image_fallback_background: rgba(0x073743ff).into(),
git_created: rgba(0x849903ff).into(),
git_modified: rgba(0x278ad1ff).into(),
git_deleted: rgba(0xdc3330ff).into(),
git_conflict: rgba(0xb58902ff).into(),
git_ignored: rgba(0x6f8389ff).into(),
git_renamed: rgba(0xb58902ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x278ad1ff).into(),
selection: rgba(0x278ad13d).into(),
},
PlayerTheme {
cursor: rgba(0x849903ff).into(),
selection: rgba(0x8499033d).into(),
},
PlayerTheme {
cursor: rgba(0xd33781ff).into(),
selection: rgba(0xd337813d).into(),
},
PlayerTheme {
cursor: rgba(0xcb4b16ff).into(),
selection: rgba(0xcb4b163d).into(),
},
PlayerTheme {
cursor: rgba(0x6c71c4ff).into(),
selection: rgba(0x6c71c43d).into(),
},
PlayerTheme {
cursor: rgba(0x2ba198ff).into(),
selection: rgba(0x2ba1983d).into(),
},
PlayerTheme {
cursor: rgba(0xdc3330ff).into(),
selection: rgba(0xdc33303d).into(),
},
PlayerTheme {
cursor: rgba(0xb58902ff).into(),
selection: rgba(0xb589023d).into(),
},
],
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn solarized_light() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Solarized Light".into(),
is_light: true,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x9faaa8ff).into(),
border_variant: rgba(0x9faaa8ff).into(),
border_focused: rgba(0xbfd3efff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0xcfd0c4ff).into(),
surface: rgba(0xf3eddaff).into(),
background: rgba(0xcfd0c4ff).into(),
filled_element: rgba(0xcfd0c4ff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0xdbe6f6ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0xdbe6f6ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0x002a35ff).into(),
text_muted: rgba(0x34555eff).into(),
text_placeholder: rgba(0xdc3330ff).into(),
text_disabled: rgba(0x6a7f86ff).into(),
text_accent: rgba(0x288bd1ff).into(),
icon_muted: rgba(0x34555eff).into(),
syntax: SyntaxTheme {
highlights: vec![
("string.escape".into(), rgba(0x30525bff).into()),
("boolean".into(), rgba(0x849903ff).into()),
("comment.doc".into(), rgba(0x30525bff).into()),
("string.special".into(), rgba(0xcb4b17ff).into()),
("punctuation".into(), rgba(0x04333eff).into()),
("emphasis".into(), rgba(0x288bd1ff).into()),
("type".into(), rgba(0x2ba198ff).into()),
("preproc".into(), rgba(0x002a35ff).into()),
("emphasis.strong".into(), rgba(0x288bd1ff).into()),
("constant".into(), rgba(0x849903ff).into()),
("title".into(), rgba(0x002a35ff).into()),
("operator".into(), rgba(0xcb4b17ff).into()),
("punctuation.bracket".into(), rgba(0x04333eff).into()),
("link_uri".into(), rgba(0x849903ff).into()),
("label".into(), rgba(0x288bd1ff).into()),
("enum".into(), rgba(0xcb4b17ff).into()),
("property".into(), rgba(0x288bd1ff).into()),
("predictive".into(), rgba(0x679aafff).into()),
("punctuation.special".into(), rgba(0x04333eff).into()),
("text.literal".into(), rgba(0xcb4b17ff).into()),
("string".into(), rgba(0xcb4b17ff).into()),
("string.regex".into(), rgba(0xcb4b17ff).into()),
("variable".into(), rgba(0x002a35ff).into()),
("tag".into(), rgba(0x288bd1ff).into()),
("string.special.symbol".into(), rgba(0xcb4b17ff).into()),
("link_text".into(), rgba(0xcb4b17ff).into()),
("punctuation.list_marker".into(), rgba(0x04333eff).into()),
("keyword".into(), rgba(0x288bd1ff).into()),
("constructor".into(), rgba(0x288bd1ff).into()),
("attribute".into(), rgba(0x288bd1ff).into()),
("variant".into(), rgba(0x288bd1ff).into()),
("function".into(), rgba(0xb58903ff).into()),
("primary".into(), rgba(0x002a35ff).into()),
("hint".into(), rgba(0x5789a3ff).into()),
("comment".into(), rgba(0x30525bff).into()),
("number".into(), rgba(0x849903ff).into()),
("punctuation.delimiter".into(), rgba(0x04333eff).into()),
("embedded".into(), rgba(0x002a35ff).into()),
],
},
status_bar: rgba(0xcfd0c4ff).into(),
title_bar: rgba(0xcfd0c4ff).into(),
toolbar: rgba(0xfdf6e3ff).into(),
tab_bar: rgba(0xf3eddaff).into(),
editor: rgba(0xfdf6e3ff).into(),
editor_subheader: rgba(0xf3eddaff).into(),
editor_active_line: rgba(0xf3eddaff).into(),
terminal: rgba(0xfdf6e3ff).into(),
image_fallback_background: rgba(0xcfd0c4ff).into(),
git_created: rgba(0x849903ff).into(),
git_modified: rgba(0x288bd1ff).into(),
git_deleted: rgba(0xdc3330ff).into(),
git_conflict: rgba(0xb58903ff).into(),
git_ignored: rgba(0x6a7f86ff).into(),
git_renamed: rgba(0xb58903ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x288bd1ff).into(),
selection: rgba(0x288bd13d).into(),
},
PlayerTheme {
cursor: rgba(0x849903ff).into(),
selection: rgba(0x8499033d).into(),
},
PlayerTheme {
cursor: rgba(0xd33781ff).into(),
selection: rgba(0xd337813d).into(),
},
PlayerTheme {
cursor: rgba(0xcb4b17ff).into(),
selection: rgba(0xcb4b173d).into(),
},
PlayerTheme {
cursor: rgba(0x6c71c3ff).into(),
selection: rgba(0x6c71c33d).into(),
},
PlayerTheme {
cursor: rgba(0x2ba198ff).into(),
selection: rgba(0x2ba1983d).into(),
},
PlayerTheme {
cursor: rgba(0xdc3330ff).into(),
selection: rgba(0xdc33303d).into(),
},
PlayerTheme {
cursor: rgba(0xb58903ff).into(),
selection: rgba(0xb589033d).into(),
},
],
}
}

View File

@@ -1,130 +0,0 @@
use gpui2::rgba;
use crate::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub fn summercamp() -> Theme {
Theme {
metadata: ThemeMetadata {
name: "Summercamp".into(),
is_light: false,
},
transparent: rgba(0x00000000).into(),
mac_os_traffic_light_red: rgba(0xec695eff).into(),
mac_os_traffic_light_yellow: rgba(0xf4bf4eff).into(),
mac_os_traffic_light_green: rgba(0x61c553ff).into(),
border: rgba(0x302c21ff).into(),
border_variant: rgba(0x302c21ff).into(),
border_focused: rgba(0x193760ff).into(),
border_transparent: rgba(0x00000000).into(),
elevated_surface: rgba(0x2a261cff).into(),
surface: rgba(0x231f16ff).into(),
background: rgba(0x2a261cff).into(),
filled_element: rgba(0x2a261cff).into(),
filled_element_hover: rgba(0xffffff1e).into(),
filled_element_active: rgba(0xffffff28).into(),
filled_element_selected: rgba(0x0e2242ff).into(),
filled_element_disabled: rgba(0x00000000).into(),
ghost_element: rgba(0x00000000).into(),
ghost_element_hover: rgba(0xffffff14).into(),
ghost_element_active: rgba(0xffffff1e).into(),
ghost_element_selected: rgba(0x0e2242ff).into(),
ghost_element_disabled: rgba(0x00000000).into(),
text: rgba(0xf8f5deff).into(),
text_muted: rgba(0x736e55ff).into(),
text_placeholder: rgba(0xe35041ff).into(),
text_disabled: rgba(0x4c4735ff).into(),
text_accent: rgba(0x499befff).into(),
icon_muted: rgba(0x736e55ff).into(),
syntax: SyntaxTheme {
highlights: vec![
("predictive".into(), rgba(0x78434aff).into()),
("title".into(), rgba(0xf8f5deff).into()),
("primary".into(), rgba(0xf8f5deff).into()),
("punctuation.special".into(), rgba(0xbfbb9bff).into()),
("constant".into(), rgba(0x5dea5aff).into()),
("string.regex".into(), rgba(0xfaa11cff).into()),
("tag".into(), rgba(0x499befff).into()),
("preproc".into(), rgba(0xf8f5deff).into()),
("comment".into(), rgba(0x777159ff).into()),
("punctuation.bracket".into(), rgba(0xbfbb9bff).into()),
("constructor".into(), rgba(0x499befff).into()),
("type".into(), rgba(0x5aeabbff).into()),
("variable".into(), rgba(0xf8f5deff).into()),
("operator".into(), rgba(0xfaa11cff).into()),
("boolean".into(), rgba(0x5dea5aff).into()),
("attribute".into(), rgba(0x499befff).into()),
("link_text".into(), rgba(0xfaa11cff).into()),
("string.escape".into(), rgba(0x777159ff).into()),
("string.special".into(), rgba(0xfaa11cff).into()),
("string.special.symbol".into(), rgba(0xfaa11cff).into()),
("hint".into(), rgba(0x246e61ff).into()),
("link_uri".into(), rgba(0x5dea5aff).into()),
("comment.doc".into(), rgba(0x777159ff).into()),
("emphasis".into(), rgba(0x499befff).into()),
("punctuation".into(), rgba(0xbfbb9bff).into()),
("text.literal".into(), rgba(0xfaa11cff).into()),
("number".into(), rgba(0x5dea5aff).into()),
("punctuation.delimiter".into(), rgba(0xbfbb9bff).into()),
("label".into(), rgba(0x499befff).into()),
("function".into(), rgba(0xf1fe28ff).into()),
("property".into(), rgba(0x499befff).into()),
("keyword".into(), rgba(0x499befff).into()),
("embedded".into(), rgba(0xf8f5deff).into()),
("string".into(), rgba(0xfaa11cff).into()),
("punctuation.list_marker".into(), rgba(0xbfbb9bff).into()),
("enum".into(), rgba(0xfaa11cff).into()),
("emphasis.strong".into(), rgba(0x499befff).into()),
("variant".into(), rgba(0x499befff).into()),
],
},
status_bar: rgba(0x2a261cff).into(),
title_bar: rgba(0x2a261cff).into(),
toolbar: rgba(0x1b1810ff).into(),
tab_bar: rgba(0x231f16ff).into(),
editor: rgba(0x1b1810ff).into(),
editor_subheader: rgba(0x231f16ff).into(),
editor_active_line: rgba(0x231f16ff).into(),
terminal: rgba(0x1b1810ff).into(),
image_fallback_background: rgba(0x2a261cff).into(),
git_created: rgba(0x5dea5aff).into(),
git_modified: rgba(0x499befff).into(),
git_deleted: rgba(0xe35041ff).into(),
git_conflict: rgba(0xf1fe28ff).into(),
git_ignored: rgba(0x4c4735ff).into(),
git_renamed: rgba(0xf1fe28ff).into(),
players: [
PlayerTheme {
cursor: rgba(0x499befff).into(),
selection: rgba(0x499bef3d).into(),
},
PlayerTheme {
cursor: rgba(0x5dea5aff).into(),
selection: rgba(0x5dea5a3d).into(),
},
PlayerTheme {
cursor: rgba(0xf59be6ff).into(),
selection: rgba(0xf59be63d).into(),
},
PlayerTheme {
cursor: rgba(0xfaa11cff).into(),
selection: rgba(0xfaa11c3d).into(),
},
PlayerTheme {
cursor: rgba(0xfe8080ff).into(),
selection: rgba(0xfe80803d).into(),
},
PlayerTheme {
cursor: rgba(0x5aeabbff).into(),
selection: rgba(0x5aeabb3d).into(),
},
PlayerTheme {
cursor: rgba(0xe35041ff).into(),
selection: rgba(0xe350413d).into(),
},
PlayerTheme {
cursor: rgba(0xf1fe28ff).into(),
selection: rgba(0xf1fe283d).into(),
},
],
}
}

View File

@@ -1,18 +0,0 @@
[package]
name = "theme_converter"
version = "0.1.0"
edition = "2021"
publish = false
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
anyhow.workspace = true
clap = { version = "4.4", features = ["derive", "string"] }
convert_case = "0.6.0"
gpui2 = { path = "../gpui2" }
log.workspace = true
rust-embed.workspace = true
serde.workspace = true
simplelog = "0.9"
theme2 = { path = "../theme2" }

View File

@@ -1,390 +0,0 @@
mod theme_printer;
use std::borrow::Cow;
use std::collections::HashMap;
use std::fmt::{self, Debug};
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
use std::str::FromStr;
use anyhow::{anyhow, Context, Result};
use clap::Parser;
use convert_case::{Case, Casing};
use gpui2::{hsla, rgb, serde_json, AssetSource, Hsla, SharedString};
use log::LevelFilter;
use rust_embed::RustEmbed;
use serde::de::Visitor;
use serde::{Deserialize, Deserializer};
use simplelog::SimpleLogger;
use theme2::{PlayerTheme, SyntaxTheme};
use crate::theme_printer::ThemePrinter;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Args {
/// The name of the theme to convert.
theme: String,
}
fn main() -> Result<()> {
SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger");
// let args = Args::parse();
let themes_path = PathBuf::from_str("crates/theme2/src/themes")?;
let mut theme_modules = Vec::new();
for theme_path in Assets.list("themes/")? {
let (_, theme_name) = theme_path.split_once("themes/").unwrap();
if theme_name == ".gitkeep" {
continue;
}
let (json_theme, legacy_theme) = load_theme(&theme_path)?;
let theme = convert_theme(json_theme, legacy_theme)?;
let theme_slug = theme
.metadata
.name
.as_ref()
.replace("é", "e")
.to_case(Case::Snake);
let mut output_file = File::create(themes_path.join(format!("{theme_slug}.rs")))?;
let theme_module = format!(
r#"
use gpui2::rgba;
use crate::{{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata}};
pub fn {theme_slug}() -> Theme {{
{theme_definition}
}}
"#,
theme_definition = format!("{:#?}", ThemePrinter::new(theme))
);
output_file.write_all(theme_module.as_bytes())?;
theme_modules.push(theme_slug);
}
let mut mod_rs_file = File::create(themes_path.join(format!("mod.rs")))?;
let mod_rs_contents = format!(
r#"
{mod_statements}
{use_statements}
"#,
mod_statements = theme_modules
.iter()
.map(|module| format!("mod {module};"))
.collect::<Vec<_>>()
.join("\n"),
use_statements = theme_modules
.iter()
.map(|module| format!("pub use {module}::*;"))
.collect::<Vec<_>>()
.join("\n")
);
mod_rs_file.write_all(mod_rs_contents.as_bytes())?;
Ok(())
}
#[derive(RustEmbed)]
#[folder = "../../assets"]
#[include = "fonts/**/*"]
#[include = "icons/**/*"]
#[include = "themes/**/*"]
#[include = "sounds/**/*"]
#[include = "*.md"]
#[exclude = "*.DS_Store"]
pub struct Assets;
impl AssetSource for Assets {
fn load(&self, path: &str) -> Result<Cow<[u8]>> {
Self::get(path)
.map(|f| f.data)
.ok_or_else(|| anyhow!("could not find asset at path \"{}\"", path))
}
fn list(&self, path: &str) -> Result<Vec<SharedString>> {
Ok(Self::iter()
.filter(|p| p.starts_with(path))
.map(SharedString::from)
.collect())
}
}
#[derive(Clone, Copy)]
pub struct PlayerThemeColors {
pub cursor: Hsla,
pub selection: Hsla,
}
impl PlayerThemeColors {
pub fn new(theme: &LegacyTheme, ix: usize) -> Self {
if ix < theme.players.len() {
Self {
cursor: theme.players[ix].cursor,
selection: theme.players[ix].selection,
}
} else {
Self {
cursor: rgb::<Hsla>(0xff00ff),
selection: rgb::<Hsla>(0xff00ff),
}
}
}
}
impl From<PlayerThemeColors> for PlayerTheme {
fn from(value: PlayerThemeColors) -> Self {
Self {
cursor: value.cursor,
selection: value.selection,
}
}
}
fn convert_theme(json_theme: JsonTheme, legacy_theme: LegacyTheme) -> Result<theme2::Theme> {
let transparent = hsla(0.0, 0.0, 0.0, 0.0);
let players: [PlayerTheme; 8] = [
PlayerThemeColors::new(&legacy_theme, 0).into(),
PlayerThemeColors::new(&legacy_theme, 1).into(),
PlayerThemeColors::new(&legacy_theme, 2).into(),
PlayerThemeColors::new(&legacy_theme, 3).into(),
PlayerThemeColors::new(&legacy_theme, 4).into(),
PlayerThemeColors::new(&legacy_theme, 5).into(),
PlayerThemeColors::new(&legacy_theme, 6).into(),
PlayerThemeColors::new(&legacy_theme, 7).into(),
];
let theme = theme2::Theme {
metadata: theme2::ThemeMetadata {
name: legacy_theme.name.clone().into(),
is_light: legacy_theme.is_light,
},
transparent,
mac_os_traffic_light_red: rgb::<Hsla>(0xEC695E),
mac_os_traffic_light_yellow: rgb::<Hsla>(0xF4BF4F),
mac_os_traffic_light_green: rgb::<Hsla>(0x62C554),
border: legacy_theme.lowest.base.default.border,
border_variant: legacy_theme.lowest.variant.default.border,
border_focused: legacy_theme.lowest.accent.default.border,
border_transparent: transparent,
elevated_surface: legacy_theme.lowest.base.default.background,
surface: legacy_theme.middle.base.default.background,
background: legacy_theme.lowest.base.default.background,
filled_element: legacy_theme.lowest.base.default.background,
filled_element_hover: hsla(0.0, 0.0, 100.0, 0.12),
filled_element_active: hsla(0.0, 0.0, 100.0, 0.16),
filled_element_selected: legacy_theme.lowest.accent.default.background,
filled_element_disabled: transparent,
ghost_element: transparent,
ghost_element_hover: hsla(0.0, 0.0, 100.0, 0.08),
ghost_element_active: hsla(0.0, 0.0, 100.0, 0.12),
ghost_element_selected: legacy_theme.lowest.accent.default.background,
ghost_element_disabled: transparent,
text: legacy_theme.lowest.base.default.foreground,
text_muted: legacy_theme.lowest.variant.default.foreground,
/// TODO: map this to a real value
text_placeholder: legacy_theme.lowest.negative.default.foreground,
text_disabled: legacy_theme.lowest.base.disabled.foreground,
text_accent: legacy_theme.lowest.accent.default.foreground,
icon_muted: legacy_theme.lowest.variant.default.foreground,
syntax: SyntaxTheme {
highlights: json_theme
.editor
.syntax
.iter()
.map(|(token, style)| (token.clone(), style.color.clone().into()))
.collect(),
},
status_bar: legacy_theme.lowest.base.default.background,
title_bar: legacy_theme.lowest.base.default.background,
toolbar: legacy_theme.highest.base.default.background,
tab_bar: legacy_theme.middle.base.default.background,
editor: legacy_theme.highest.base.default.background,
editor_subheader: legacy_theme.middle.base.default.background,
terminal: legacy_theme.highest.base.default.background,
editor_active_line: legacy_theme.highest.on.default.background,
image_fallback_background: legacy_theme.lowest.base.default.background,
git_created: legacy_theme.lowest.positive.default.foreground,
git_modified: legacy_theme.lowest.accent.default.foreground,
git_deleted: legacy_theme.lowest.negative.default.foreground,
git_conflict: legacy_theme.lowest.warning.default.foreground,
git_ignored: legacy_theme.lowest.base.disabled.foreground,
git_renamed: legacy_theme.lowest.warning.default.foreground,
players,
};
Ok(theme)
}
#[derive(Deserialize)]
struct JsonTheme {
pub editor: JsonEditorTheme,
pub base_theme: serde_json::Value,
}
#[derive(Deserialize)]
struct JsonEditorTheme {
pub syntax: HashMap<String, JsonSyntaxStyle>,
}
#[derive(Deserialize)]
struct JsonSyntaxStyle {
pub color: Hsla,
}
/// Loads the [`Theme`] with the given name.
fn load_theme(theme_path: &str) -> Result<(JsonTheme, LegacyTheme)> {
let theme_contents =
Assets::get(theme_path).with_context(|| format!("theme file not found: '{theme_path}'"))?;
let json_theme: JsonTheme = serde_json::from_str(std::str::from_utf8(&theme_contents.data)?)
.context("failed to parse legacy theme")?;
let legacy_theme: LegacyTheme = serde_json::from_value(json_theme.base_theme.clone())
.context("failed to parse `base_theme`")?;
Ok((json_theme, legacy_theme))
}
#[derive(Deserialize, Clone, Default, Debug)]
pub struct LegacyTheme {
pub name: String,
pub is_light: bool,
pub lowest: Layer,
pub middle: Layer,
pub highest: Layer,
pub popover_shadow: Shadow,
pub modal_shadow: Shadow,
#[serde(deserialize_with = "deserialize_player_colors")]
pub players: Vec<PlayerColors>,
#[serde(deserialize_with = "deserialize_syntax_colors")]
pub syntax: HashMap<String, Hsla>,
}
#[derive(Deserialize, Clone, Default, Debug)]
pub struct Layer {
pub base: StyleSet,
pub variant: StyleSet,
pub on: StyleSet,
pub accent: StyleSet,
pub positive: StyleSet,
pub warning: StyleSet,
pub negative: StyleSet,
}
#[derive(Deserialize, Clone, Default, Debug)]
pub struct StyleSet {
#[serde(rename = "default")]
pub default: ContainerColors,
pub hovered: ContainerColors,
pub pressed: ContainerColors,
pub active: ContainerColors,
pub disabled: ContainerColors,
pub inverted: ContainerColors,
}
#[derive(Deserialize, Clone, Default, Debug)]
pub struct ContainerColors {
pub background: Hsla,
pub foreground: Hsla,
pub border: Hsla,
}
#[derive(Deserialize, Clone, Default, Debug)]
pub struct PlayerColors {
pub selection: Hsla,
pub cursor: Hsla,
}
#[derive(Deserialize, Clone, Default, Debug)]
pub struct Shadow {
pub blur: u8,
pub color: Hsla,
pub offset: Vec<u8>,
}
fn deserialize_player_colors<'de, D>(deserializer: D) -> Result<Vec<PlayerColors>, D::Error>
where
D: Deserializer<'de>,
{
struct PlayerArrayVisitor;
impl<'de> Visitor<'de> for PlayerArrayVisitor {
type Value = Vec<PlayerColors>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("an object with integer keys")
}
fn visit_map<A: serde::de::MapAccess<'de>>(
self,
mut map: A,
) -> Result<Self::Value, A::Error> {
let mut players = Vec::with_capacity(8);
while let Some((key, value)) = map.next_entry::<usize, PlayerColors>()? {
if key < 8 {
players.push(value);
} else {
return Err(serde::de::Error::invalid_value(
serde::de::Unexpected::Unsigned(key as u64),
&"a key in range 0..7",
));
}
}
Ok(players)
}
}
deserializer.deserialize_map(PlayerArrayVisitor)
}
fn deserialize_syntax_colors<'de, D>(deserializer: D) -> Result<HashMap<String, Hsla>, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(Deserialize)]
struct ColorWrapper {
color: Hsla,
}
struct SyntaxVisitor;
impl<'de> Visitor<'de> for SyntaxVisitor {
type Value = HashMap<String, Hsla>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a map with keys and objects with a single color field as values")
}
fn visit_map<M>(self, mut map: M) -> Result<HashMap<String, Hsla>, M::Error>
where
M: serde::de::MapAccess<'de>,
{
let mut result = HashMap::new();
while let Some(key) = map.next_key()? {
let wrapper: ColorWrapper = map.next_value()?; // Deserialize values as Hsla
result.insert(key, wrapper.color);
}
Ok(result)
}
}
deserializer.deserialize_map(SyntaxVisitor)
}

View File

@@ -1,174 +0,0 @@
use std::fmt::{self, Debug};
use gpui2::{Hsla, Rgba};
use theme2::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
pub struct ThemePrinter(Theme);
impl ThemePrinter {
pub fn new(theme: Theme) -> Self {
Self(theme)
}
}
struct HslaPrinter(Hsla);
impl Debug for HslaPrinter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", IntoPrinter(&Rgba::from(self.0)))
}
}
struct IntoPrinter<'a, D: Debug>(&'a D);
impl<'a, D: Debug> Debug for IntoPrinter<'a, D> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}.into()", self.0)
}
}
impl Debug for ThemePrinter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Theme")
.field("metadata", &ThemeMetadataPrinter(self.0.metadata.clone()))
.field("transparent", &HslaPrinter(self.0.transparent))
.field(
"mac_os_traffic_light_red",
&HslaPrinter(self.0.mac_os_traffic_light_red),
)
.field(
"mac_os_traffic_light_yellow",
&HslaPrinter(self.0.mac_os_traffic_light_yellow),
)
.field(
"mac_os_traffic_light_green",
&HslaPrinter(self.0.mac_os_traffic_light_green),
)
.field("border", &HslaPrinter(self.0.border))
.field("border_variant", &HslaPrinter(self.0.border_variant))
.field("border_focused", &HslaPrinter(self.0.border_focused))
.field(
"border_transparent",
&HslaPrinter(self.0.border_transparent),
)
.field("elevated_surface", &HslaPrinter(self.0.elevated_surface))
.field("surface", &HslaPrinter(self.0.surface))
.field("background", &HslaPrinter(self.0.background))
.field("filled_element", &HslaPrinter(self.0.filled_element))
.field(
"filled_element_hover",
&HslaPrinter(self.0.filled_element_hover),
)
.field(
"filled_element_active",
&HslaPrinter(self.0.filled_element_active),
)
.field(
"filled_element_selected",
&HslaPrinter(self.0.filled_element_selected),
)
.field(
"filled_element_disabled",
&HslaPrinter(self.0.filled_element_disabled),
)
.field("ghost_element", &HslaPrinter(self.0.ghost_element))
.field(
"ghost_element_hover",
&HslaPrinter(self.0.ghost_element_hover),
)
.field(
"ghost_element_active",
&HslaPrinter(self.0.ghost_element_active),
)
.field(
"ghost_element_selected",
&HslaPrinter(self.0.ghost_element_selected),
)
.field(
"ghost_element_disabled",
&HslaPrinter(self.0.ghost_element_disabled),
)
.field("text", &HslaPrinter(self.0.text))
.field("text_muted", &HslaPrinter(self.0.text_muted))
.field("text_placeholder", &HslaPrinter(self.0.text_placeholder))
.field("text_disabled", &HslaPrinter(self.0.text_disabled))
.field("text_accent", &HslaPrinter(self.0.text_accent))
.field("icon_muted", &HslaPrinter(self.0.icon_muted))
.field("syntax", &SyntaxThemePrinter(self.0.syntax.clone()))
.field("status_bar", &HslaPrinter(self.0.status_bar))
.field("title_bar", &HslaPrinter(self.0.title_bar))
.field("toolbar", &HslaPrinter(self.0.toolbar))
.field("tab_bar", &HslaPrinter(self.0.tab_bar))
.field("editor", &HslaPrinter(self.0.editor))
.field("editor_subheader", &HslaPrinter(self.0.editor_subheader))
.field(
"editor_active_line",
&HslaPrinter(self.0.editor_active_line),
)
.field("terminal", &HslaPrinter(self.0.terminal))
.field(
"image_fallback_background",
&HslaPrinter(self.0.image_fallback_background),
)
.field("git_created", &HslaPrinter(self.0.git_created))
.field("git_modified", &HslaPrinter(self.0.git_modified))
.field("git_deleted", &HslaPrinter(self.0.git_deleted))
.field("git_conflict", &HslaPrinter(self.0.git_conflict))
.field("git_ignored", &HslaPrinter(self.0.git_ignored))
.field("git_renamed", &HslaPrinter(self.0.git_renamed))
.field("players", &self.0.players.map(PlayerThemePrinter))
.finish()
}
}
pub struct ThemeMetadataPrinter(ThemeMetadata);
impl Debug for ThemeMetadataPrinter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ThemeMetadata")
.field("name", &IntoPrinter(&self.0.name))
.field("is_light", &self.0.is_light)
.finish()
}
}
pub struct SyntaxThemePrinter(SyntaxTheme);
impl Debug for SyntaxThemePrinter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SyntaxTheme")
.field(
"highlights",
&VecPrinter(
&self
.0
.highlights
.iter()
.map(|(token, highlight)| {
(IntoPrinter(token), HslaPrinter(highlight.color.unwrap()))
})
.collect(),
),
)
.finish()
}
}
pub struct VecPrinter<'a, T>(&'a Vec<T>);
impl<'a, T: Debug> Debug for VecPrinter<'a, T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "vec!{:?}", &self.0)
}
}
pub struct PlayerThemePrinter(PlayerTheme);
impl Debug for PlayerThemePrinter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PlayerTheme")
.field("cursor", &HslaPrinter(self.0.cursor))
.field("selection", &HslaPrinter(self.0.selection))
.finish()
}
}

View File

@@ -19,24 +19,22 @@ impl Breadcrumb {
}
fn render_separator<V: 'static>(&self, cx: &WindowContext) -> Div<V> {
let theme = theme(cx);
div().child(" ").text_color(theme.text_muted)
div()
.child(" ")
.text_color(cx.theme().colors().text_muted)
}
fn render<V: 'static>(self, view_state: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
let symbols_len = self.symbols.len();
h_stack()
.id("breadcrumb")
.px_1()
.text_sm()
.text_color(theme.text_muted)
.text_color(cx.theme().colors().text_muted)
.rounded_md()
.hover(|style| style.bg(theme.ghost_element_hover))
.active(|style| style.bg(theme.ghost_element_active))
.hover(|style| style.bg(cx.theme().colors().ghost_element_hover))
.active(|style| style.bg(cx.theme().colors().ghost_element_active))
.child(self.path.clone().to_str().unwrap().to_string())
.child(if !self.symbols.is_empty() {
self.render_separator(cx)
@@ -84,8 +82,6 @@ mod stories {
type Element = Div<Self>;
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
let theme = theme(cx);
Story::container(cx)
.child(Story::title_for::<_, Breadcrumb>(cx))
.child(Story::label(cx, "Default"))
@@ -95,21 +91,21 @@ mod stories {
Symbol(vec![
HighlightedText {
text: "impl ".to_string(),
color: theme.syntax.color("keyword"),
color: cx.theme().syntax_color("keyword"),
},
HighlightedText {
text: "BreadcrumbStory".to_string(),
color: theme.syntax.color("function"),
color: cx.theme().syntax_color("function"),
},
]),
Symbol(vec![
HighlightedText {
text: "fn ".to_string(),
color: theme.syntax.color("keyword"),
color: cx.theme().syntax_color("keyword"),
},
HighlightedText {
text: "render".to_string(),
color: theme.syntax.color("function"),
color: cx.theme().syntax_color("function"),
},
]),
],

View File

@@ -155,18 +155,16 @@ impl Buffer {
}
fn render_row<V: 'static>(row: BufferRow, cx: &WindowContext) -> impl Component<V> {
let theme = theme(cx);
let line_background = if row.current {
theme.editor_active_line
cx.theme().colors().editor_active_line
} else {
theme.transparent
cx.theme().styles.system.transparent
};
let line_number_color = if row.current {
theme.text
cx.theme().colors().text
} else {
theme.syntax.get("comment").color.unwrap_or_default()
cx.theme().syntax_color("comment")
};
h_stack()
@@ -216,14 +214,13 @@ impl Buffer {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
let rows = self.render_rows(cx);
v_stack()
.flex_1()
.w_full()
.h_full()
.bg(theme.editor)
.bg(cx.theme().colors().editor)
.children(rows)
}
}
@@ -246,8 +243,6 @@ mod stories {
type Element = Div<Self>;
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
let theme = theme(cx);
Story::container(cx)
.child(Story::title_for::<_, Buffer>(cx))
.child(Story::label(cx, "Default"))
@@ -257,14 +252,14 @@ mod stories {
div()
.w(rems(64.))
.h_96()
.child(hello_world_rust_buffer_example(&theme)),
.child(hello_world_rust_buffer_example(cx)),
)
.child(Story::label(cx, "Hello World (Rust) with Status"))
.child(
div()
.w(rems(64.))
.h_96()
.child(hello_world_rust_buffer_with_status_example(&theme)),
.child(hello_world_rust_buffer_with_status_example(cx)),
)
}
}

View File

@@ -30,9 +30,7 @@ impl Render for BufferSearch {
type Element = Div<Self>;
fn render(&mut self, cx: &mut ViewContext<Self>) -> Div<Self> {
let theme = theme(cx);
h_stack().bg(theme.toolbar).p_2().child(
h_stack().bg(cx.theme().colors().toolbar).p_2().child(
h_stack().child(Input::new("Search")).child(
IconButton::<Self>::new("replace", Icon::Replace)
.when(self.is_replace_open, |this| this.color(IconColor::Accent))

View File

@@ -15,27 +15,29 @@ impl CollabPanel {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
v_stack()
.id(self.id.clone())
.h_full()
.bg(theme.surface)
.bg(cx.theme().colors().surface)
.child(
v_stack()
.id("crdb")
.w_full()
.overflow_y_scroll()
.child(
div().pb_1().border_color(theme.border).border_b().child(
List::new(static_collab_panel_current_call())
.header(
ListHeader::new("CRDB")
.left_icon(Icon::Hash.into())
.toggle(ToggleState::Toggled),
)
.toggle(ToggleState::Toggled),
),
div()
.pb_1()
.border_color(cx.theme().colors().border)
.border_b()
.child(
List::new(static_collab_panel_current_call())
.header(
ListHeader::new("CRDB")
.left_icon(Icon::Hash.into())
.toggle(ToggleState::Toggled),
)
.toggle(ToggleState::Toggled),
),
)
.child(
v_stack().id("channels").py_1().child(
@@ -71,13 +73,13 @@ impl CollabPanel {
.h_7()
.px_2()
.border_t()
.border_color(theme.border)
.border_color(cx.theme().colors().border)
.flex()
.items_center()
.child(
div()
.text_sm()
.text_color(theme.text_placeholder)
.text_color(cx.theme().colors().text_placeholder)
.child("Find..."),
),
)

View File

@@ -44,13 +44,11 @@ impl ContextMenu {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
v_stack()
.flex()
.bg(theme.elevated_surface)
.bg(cx.theme().colors().elevated_surface)
.border()
.border_color(theme.border)
.border_color(cx.theme().colors().border)
.child(
List::new(
self.items

View File

@@ -66,8 +66,6 @@ impl<V: 'static> IconButton<V> {
}
fn render(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
let icon_color = match (self.state, self.color) {
(InteractionState::Disabled, _) => IconColor::Disabled,
_ => self.color,
@@ -75,14 +73,14 @@ impl<V: 'static> IconButton<V> {
let (bg_color, bg_hover_color, bg_active_color) = match self.variant {
ButtonVariant::Filled => (
theme.filled_element,
theme.filled_element_hover,
theme.filled_element_active,
cx.theme().colors().element,
cx.theme().colors().element_hover,
cx.theme().colors().element_active,
),
ButtonVariant::Ghost => (
theme.ghost_element,
theme.ghost_element_hover,
theme.ghost_element_active,
cx.theme().colors().ghost_element,
cx.theme().colors().ghost_element_hover,
cx.theme().colors().ghost_element_active,
),
};

View File

@@ -60,15 +60,13 @@ impl Key {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
div()
.px_2()
.py_0()
.rounded_md()
.text_sm()
.text_color(theme.text)
.bg(theme.filled_element)
.text_color(cx.theme().colors().text)
.bg(cx.theme().colors().element)
.child(self.key.clone())
}
}

View File

@@ -89,8 +89,6 @@ impl ListHeader {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
let is_toggleable = self.toggleable != Toggleable::NotToggleable;
let is_toggled = self.toggleable.is_toggled();
@@ -99,9 +97,10 @@ impl ListHeader {
h_stack()
.flex_1()
.w_full()
.bg(theme.surface)
.bg(cx.theme().colors().surface)
.when(self.state == InteractionState::Focused, |this| {
this.border().border_color(theme.border_focused)
this.border()
.border_color(cx.theme().colors().border_focused)
})
.relative()
.child(
@@ -363,7 +362,6 @@ impl ListEntry {
fn render<V: 'static>(mut self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let settings = user_settings(cx);
let theme = theme(cx);
let left_content = match self.left_content.clone() {
Some(LeftContent::Icon(i)) => Some(
@@ -385,9 +383,10 @@ impl ListEntry {
div()
.relative()
.group("")
.bg(theme.surface)
.bg(cx.theme().colors().surface)
.when(self.state == InteractionState::Focused, |this| {
this.border().border_color(theme.border_focused)
this.border()
.border_color(cx.theme().colors().border_focused)
})
.child(
sized_item
@@ -399,11 +398,11 @@ impl ListEntry {
.h_full()
.flex()
.justify_center()
.group_hover("", |style| style.bg(theme.border_focused))
.group_hover("", |style| style.bg(cx.theme().colors().border_focused))
.child(
h_stack()
.child(div().w_px().h_full())
.child(div().w_px().h_full().bg(theme.border)),
.child(div().w_px().h_full().bg(cx.theme().colors().border)),
)
}))
.flex()
@@ -472,19 +471,18 @@ impl<V: 'static> ListDetailsEntry<V> {
}
fn render(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
let settings = user_settings(cx);
let (item_bg, item_bg_hover, item_bg_active) = match self.seen {
true => (
theme.ghost_element,
theme.ghost_element_hover,
theme.ghost_element_active,
cx.theme().colors().ghost_element,
cx.theme().colors().ghost_element_hover,
cx.theme().colors().ghost_element_active,
),
false => (
theme.filled_element,
theme.filled_element_hover,
theme.filled_element_active,
cx.theme().colors().element,
cx.theme().colors().element_hover,
cx.theme().colors().element_active,
),
};
@@ -524,9 +522,7 @@ impl ListSeparator {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
div().h_px().w_full().bg(theme.border)
div().h_px().w_full().bg(cx.theme().colors().border)
}
}

View File

@@ -39,22 +39,20 @@ impl<V: 'static> Modal<V> {
}
fn render(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
v_stack()
.id(self.id.clone())
.w_96()
// .rounded_xl()
.bg(theme.background)
.bg(cx.theme().colors().background)
.border()
.border_color(theme.border)
.border_color(cx.theme().colors().border)
.shadow_2xl()
.child(
h_stack()
.justify_between()
.p_1()
.border_b()
.border_color(theme.border)
.border_color(cx.theme().colors().border)
.child(div().children(self.title.clone().map(|t| Label::new(t))))
.child(IconButton::new("close", Icon::Close)),
)
@@ -65,7 +63,7 @@ impl<V: 'static> Modal<V> {
this.child(
h_stack()
.border_t()
.border_color(theme.border)
.border_color(cx.theme().colors().border)
.p_1()
.justify_end()
.children(self.secondary_action)

View File

@@ -12,8 +12,6 @@ impl MultiBuffer {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
v_stack()
.w_full()
.h_full()
@@ -26,7 +24,7 @@ impl MultiBuffer {
.items_center()
.justify_between()
.p_4()
.bg(theme.editor_subheader)
.bg(cx.theme().colors().editor_subheader)
.child(Label::new("main.rs"))
.child(IconButton::new("arrow_up_right", Icon::ArrowUpRight)),
)
@@ -50,17 +48,15 @@ mod stories {
type Element = Div<Self>;
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
let theme = theme(cx);
Story::container(cx)
.child(Story::title_for::<_, MultiBuffer>(cx))
.child(Story::label(cx, "Default"))
.child(MultiBuffer::new(vec![
hello_world_rust_buffer_example(&theme),
hello_world_rust_buffer_example(&theme),
hello_world_rust_buffer_example(&theme),
hello_world_rust_buffer_example(&theme),
hello_world_rust_buffer_example(&theme),
hello_world_rust_buffer_example(cx),
hello_world_rust_buffer_example(cx),
hello_world_rust_buffer_example(cx),
hello_world_rust_buffer_example(cx),
hello_world_rust_buffer_example(cx),
]))
}
}

View File

@@ -1,6 +1,7 @@
use gpui2::rems;
use crate::{h_stack, prelude::*, Icon};
use crate::prelude::*;
use crate::{h_stack, Icon};
#[derive(Component)]
pub struct NotificationToast {
@@ -22,8 +23,6 @@ impl NotificationToast {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
h_stack()
.z_index(5)
.absolute()
@@ -35,7 +34,7 @@ impl NotificationToast {
.px_1p5()
.rounded_lg()
.shadow_md()
.bg(theme.elevated_surface)
.bg(cx.theme().colors().elevated_surface)
.child(div().size_full().child(self.label.clone()))
}
}

View File

@@ -12,15 +12,13 @@ impl NotificationsPanel {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
div()
.id(self.id.clone())
.flex()
.flex_col()
.w_full()
.h_full()
.bg(theme.surface)
.bg(cx.theme().colors().surface)
.child(
div()
.id("header")

View File

@@ -43,22 +43,20 @@ impl Palette {
}
fn render<V: 'static>(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
v_stack()
.id(self.id.clone())
.w_96()
.rounded_lg()
.bg(theme.elevated_surface)
.bg(cx.theme().colors().elevated_surface)
.border()
.border_color(theme.border)
.border_color(cx.theme().colors().border)
.child(
v_stack()
.gap_px()
.child(v_stack().py_0p5().px_1().child(div().px_2().py_0p5().child(
Label::new(self.input_placeholder.clone()).color(LabelColor::Placeholder),
)))
.child(div().h_px().w_full().bg(theme.filled_element))
.child(div().h_px().w_full().bg(cx.theme().colors().element))
.child(
v_stack()
.id("items")
@@ -88,8 +86,12 @@ impl Palette {
.px_2()
.py_0p5()
.rounded_lg()
.hover(|style| style.bg(theme.ghost_element_hover))
.active(|style| style.bg(theme.ghost_element_active))
.hover(|style| {
style.bg(cx.theme().colors().ghost_element_hover)
})
.active(|style| {
style.bg(cx.theme().colors().ghost_element_active)
})
.child(item)
})),
),

View File

@@ -93,8 +93,6 @@ impl<V: 'static> Panel<V> {
}
fn render(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
let current_size = self.width.unwrap_or(self.initial_width);
v_stack()
@@ -111,8 +109,8 @@ impl<V: 'static> Panel<V> {
.when(self.current_side == PanelSide::Bottom, |this| {
this.border_b().w_full().h(current_size)
})
.bg(theme.surface)
.border_color(theme.border)
.bg(cx.theme().colors().surface)
.border_color(cx.theme().colors().border)
.children(self.children)
}
}

View File

@@ -90,8 +90,6 @@ impl<V: 'static> PaneGroup<V> {
}
fn render(self, view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
let theme = theme(cx);
if !self.panes.is_empty() {
let el = div()
.flex()
@@ -115,7 +113,7 @@ impl<V: 'static> PaneGroup<V> {
.gap_px()
.w_full()
.h_full()
.bg(theme.editor)
.bg(cx.theme().colors().editor)
.children(self.groups.into_iter().map(|group| group.render(view, cx)));
if self.split_direction == SplitDirection::Horizontal {

Some files were not shown because too many files have changed in this diff Show More