Merge branch 'main' into in-app-feedback

Joseph Lyons created

Change summary

.github/workflows/ci.yml             | 10 ++
.gitignore                           |  1 
crates/activity_indicator/Cargo.toml |  1 
crates/assets/Cargo.toml             |  1 
crates/auto_update/Cargo.toml        |  1 
crates/breadcrumbs/Cargo.toml        |  1 
crates/call/Cargo.toml               |  1 
crates/cli/Cargo.toml                |  1 
crates/cli/src/main.rs               | 21 ++++++
crates/client/Cargo.toml             |  1 
crates/clock/Cargo.toml              |  1 
crates/collab/Cargo.toml             |  1 
crates/collab_ui/Cargo.toml          |  1 
crates/collections/Cargo.toml        |  1 
crates/command_palette/Cargo.toml    |  1 
crates/context_menu/Cargo.toml       |  1 
crates/db/Cargo.toml                 |  1 
crates/diagnostics/Cargo.toml        |  1 
crates/drag_and_drop/Cargo.toml      |  1 
crates/editor/Cargo.toml             |  1 
crates/file_finder/Cargo.toml        |  1 
crates/fs/Cargo.toml                 |  1 
crates/fsevent/Cargo.toml            |  1 
crates/fuzzy/Cargo.toml              |  1 
crates/git/Cargo.toml                |  1 
crates/go_to_line/Cargo.toml         |  1 
crates/gpui/Cargo.toml               |  1 
crates/gpui_macros/Cargo.toml        |  1 
crates/journal/Cargo.toml            |  1 
crates/language/Cargo.toml           |  1 
crates/live_kit_client/Cargo.toml    |  1 
crates/live_kit_server/Cargo.toml    |  1 
crates/lsp/Cargo.toml                |  1 
crates/media/Cargo.toml              |  1 
crates/menu/Cargo.toml               |  1 
crates/outline/Cargo.toml            |  1 
crates/picker/Cargo.toml             |  1 
crates/plugin/Cargo.toml             |  1 
crates/plugin_macros/Cargo.toml      |  1 
crates/plugin_runtime/Cargo.toml     |  1 
crates/project/Cargo.toml            |  1 
crates/project_panel/Cargo.toml      |  1 
crates/project_symbols/Cargo.toml    |  1 
crates/recent_projects/Cargo.toml    |  1 
crates/rope/Cargo.toml               |  1 
crates/rpc/Cargo.toml                |  1 
crates/search/Cargo.toml             |  1 
crates/settings/Cargo.toml           |  1 
crates/snippet/Cargo.toml            |  1 
crates/sqlez/Cargo.toml              |  1 
crates/sqlez_macros/Cargo.toml       |  1 
crates/sum_tree/Cargo.toml           |  1 
crates/terminal/Cargo.toml           |  1 
crates/terminal_view/Cargo.toml      |  1 
crates/text/Cargo.toml               |  1 
crates/theme/Cargo.toml              |  1 
crates/theme_selector/Cargo.toml     |  1 
crates/theme_testbench/Cargo.toml    |  1 
crates/util/Cargo.toml               |  1 
crates/vim/Cargo.toml                |  1 
crates/workspace/Cargo.toml          |  1 
crates/workspace/src/pane.rs         | 87 +++++++++++++++--------------
crates/workspace/src/workspace.rs    |  1 
crates/zed/Cargo.toml                |  1 
crates/zed/src/zed.rs                | 31 ++++++++--
script/generate-licenses             | 15 +++++
script/licenses/template.hbs.md      | 27 +++++++++
script/licenses/zed-licenses.toml    | 37 ++++++++++++
styles/src/themes/one-light.ts       | 18 +++---
69 files changed, 246 insertions(+), 61 deletions(-)

Detailed changes

.github/workflows/ci.yml 🔗

@@ -41,16 +41,19 @@ jobs:
         with:
           clean: false
           submodules: 'recursive'
-            
+
       - name: Run tests
         run: cargo test --workspace --no-fail-fast
-    
+
       - name: Build collab
         run: cargo build -p collab
 
       - name: Build other binaries
         run: cargo build --workspace --bins --all-features
 
+      - name: Generate license file
+        run: script/generate-licenses
+
   bundle:
     name: Bundle app
     runs-on:
@@ -109,6 +112,9 @@ jobs:
             exit 1
           fi
 
+      - name: Generate license file
+        run: script/generate-licenses
+
       - name: Create app bundle
         run: script/bundle
 

.gitignore 🔗

@@ -9,6 +9,7 @@
 /assets/themes/*.json
 /assets/themes/Internal/*.json
 /assets/themes/Experiments/*.json
+/assets/licenses.md
 **/venv
 .build
 Packages

crates/assets/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "assets"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/assets.rs"

crates/call/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "call"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/call.rs"

crates/cli/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "cli"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/cli.rs"

crates/cli/src/main.rs 🔗

@@ -9,7 +9,13 @@ use core_foundation::{
 use core_services::{kLSLaunchDefaults, LSLaunchURLSpec, LSOpenFromURLSpec, TCFType};
 use ipc_channel::ipc::{IpcOneShotServer, IpcReceiver, IpcSender};
 use serde::Deserialize;
-use std::{ffi::OsStr, fs, path::PathBuf, ptr};
+use std::{
+    ffi::OsStr,
+    fs::{self, OpenOptions},
+    io,
+    path::{Path, PathBuf},
+    ptr,
+};
 
 #[derive(Parser)]
 #[clap(name = "zed", global_setting(clap::AppSettings::NoAutoVersion))]
@@ -54,6 +60,12 @@ fn main() -> Result<()> {
         return Ok(());
     }
 
+    for path in args.paths.iter() {
+        if !path.exists() {
+            touch(path.as_path())?;
+        }
+    }
+
     let (tx, rx) = launch_app(bundle_path)?;
 
     tx.send(CliRequest::Open {
@@ -77,6 +89,13 @@ fn main() -> Result<()> {
     Ok(())
 }
 
+fn touch(path: &Path) -> io::Result<()> {
+    match OpenOptions::new().create(true).write(true).open(path) {
+        Ok(_) => Ok(()),
+        Err(e) => Err(e),
+    }
+}
+
 fn locate_bundle() -> Result<PathBuf> {
     let cli_path = std::env::current_exe()?.canonicalize()?;
     let mut app_path = cli_path.clone();

crates/client/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "client"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/client.rs"

crates/clock/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "clock"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/clock.rs"

crates/collab/Cargo.toml 🔗

@@ -4,6 +4,7 @@ default-run = "collab"
 edition = "2021"
 name = "collab"
 version = "0.5.3"
+publish = false
 
 [[bin]]
 name = "collab"

crates/db/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "db"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/db.rs"

crates/editor/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "editor"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/editor.rs"

crates/fs/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "fs"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/fs.rs"

crates/fsevent/Cargo.toml 🔗

@@ -3,6 +3,7 @@ name = "fsevent"
 version = "2.0.2"
 license = "MIT"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/fsevent.rs"

crates/fuzzy/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "fuzzy"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/fuzzy.rs"

crates/git/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "git"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/git.rs"

crates/gpui/Cargo.toml 🔗

@@ -4,6 +4,7 @@ edition = "2021"
 name = "gpui"
 version = "0.1.0"
 description = "A GPU-accelerated UI framework"
+publish = false
 
 [lib]
 path = "src/gpui.rs"

crates/journal/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "journal"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/journal.rs"

crates/language/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "language"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/language.rs"

crates/live_kit_client/Cargo.toml 🔗

@@ -3,6 +3,7 @@ name = "live_kit_client"
 version = "0.1.0"
 edition = "2021"
 description = "Bindings to LiveKit Swift client SDK"
+publish = false
 
 [lib]
 path = "src/live_kit_client.rs"

crates/live_kit_server/Cargo.toml 🔗

@@ -3,6 +3,7 @@ name = "live_kit_server"
 version = "0.1.0"
 edition = "2021"
 description = "SDK for the LiveKit server API"
+publish = false
 
 [lib]
 path = "src/live_kit_server.rs"

crates/lsp/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "lsp"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/lsp.rs"

crates/media/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "media"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/media.rs"

crates/menu/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "menu"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/menu.rs"

crates/outline/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "outline"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/outline.rs"

crates/picker/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "picker"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/picker.rs"

crates/plugin/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "plugin"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [dependencies]
 serde = "1.0"

crates/project/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "project"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/project.rs"

crates/rope/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "rope"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/rope.rs"

crates/rpc/Cargo.toml 🔗

@@ -3,6 +3,7 @@ description = "Shared logic for communication between the Zed app and the zed.de
 edition = "2021"
 name = "rpc"
 version = "0.1.0"
+publish = false
 
 [lib]
 path = "src/rpc.rs"

crates/search/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "search"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/search.rs"

crates/settings/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "settings"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/settings.rs"

crates/snippet/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "snippet"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/snippet.rs"

crates/sqlez/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "sqlez"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 

crates/sum_tree/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "sum_tree"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/sum_tree.rs"

crates/terminal/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "terminal"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/terminal.rs"

crates/text/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "text"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/text.rs"

crates/theme/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "theme"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/theme.rs"

crates/util/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "util"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 doctest = false

crates/vim/Cargo.toml 🔗

@@ -2,6 +2,7 @@
 name = "vim"
 version = "0.1.0"
 edition = "2021"
+publish = false
 
 [lib]
 path = "src/vim.rs"

crates/workspace/src/pane.rs 🔗

@@ -1150,7 +1150,7 @@ impl Pane {
 
             row.add_child({
                 enum Tab {}
-                dragged_item_receiver::<Tab, _>(ix, ix, true, None, cx, {
+                let mut receiver = dragged_item_receiver::<Tab, _>(ix, ix, true, None, cx, {
                     let item = item.clone();
                     let pane = pane.clone();
                     let detail = detail.clone();
@@ -1162,50 +1162,51 @@ impl Pane {
                         let hovered = mouse_state.hovered();
                         Self::render_tab(&item, pane, ix == 0, detail, hovered, tab_style, cx)
                     }
-                })
-                .with_cursor_style(if pane_active && tab_active {
-                    CursorStyle::Arrow
-                } else {
-                    CursorStyle::PointingHand
-                })
-                .on_down(MouseButton::Left, move |_, cx| {
-                    cx.dispatch_action(ActivateItem(ix));
-                    cx.propagate_event();
-                })
-                .on_click(MouseButton::Middle, {
-                    let item = item.clone();
-                    let pane = pane.clone();
-                    move |_, cx: &mut EventContext| {
-                        cx.dispatch_action(CloseItem {
-                            item_id: item.id(),
-                            pane: pane.clone(),
-                        })
-                    }
-                })
-                .as_draggable(
-                    DraggedItem {
-                        item,
-                        pane: pane.clone(),
-                    },
-                    {
-                        let theme = cx.global::<Settings>().theme.clone();
+                });
 
-                        let detail = detail.clone();
-                        move |dragged_item, cx: &mut RenderContext<Workspace>| {
-                            let tab_style = &theme.workspace.tab_bar.dragged_tab;
-                            Self::render_tab(
-                                &dragged_item.item,
-                                dragged_item.pane.clone(),
-                                false,
-                                detail,
-                                false,
-                                &tab_style,
-                                cx,
-                            )
+                if !pane_active || !tab_active {
+                    receiver = receiver.with_cursor_style(CursorStyle::PointingHand);
+                }
+
+                receiver
+                    .on_down(MouseButton::Left, move |_, cx| {
+                        cx.dispatch_action(ActivateItem(ix));
+                        cx.propagate_event();
+                    })
+                    .on_click(MouseButton::Middle, {
+                        let item = item.clone();
+                        let pane = pane.clone();
+                        move |_, cx: &mut EventContext| {
+                            cx.dispatch_action(CloseItem {
+                                item_id: item.id(),
+                                pane: pane.clone(),
+                            })
                         }
-                    },
-                )
-                .boxed()
+                    })
+                    .as_draggable(
+                        DraggedItem {
+                            item,
+                            pane: pane.clone(),
+                        },
+                        {
+                            let theme = cx.global::<Settings>().theme.clone();
+
+                            let detail = detail.clone();
+                            move |dragged_item, cx: &mut RenderContext<Workspace>| {
+                                let tab_style = &theme.workspace.tab_bar.dragged_tab;
+                                Self::render_tab(
+                                    &dragged_item.item,
+                                    dragged_item.pane.clone(),
+                                    false,
+                                    detail,
+                                    false,
+                                    &tab_style,
+                                    cx,
+                                )
+                            }
+                        },
+                    )
+                    .boxed()
             })
         }
 

crates/workspace/src/workspace.rs 🔗

@@ -234,6 +234,7 @@ pub fn init(app_state: Arc<AppState>, cx: &mut MutableAppContext) {
         workspace.toggle_sidebar(SidebarSide::Right, cx);
     });
     cx.add_action(Workspace::activate_pane_at_index);
+
     cx.add_action(Workspace::split_pane_with_item);
     cx.add_action(Workspace::split_pane_with_project_entry);
 

crates/zed/Cargo.toml 🔗

@@ -4,6 +4,7 @@ description = "The fast, collaborative code editor."
 edition = "2021"
 name = "zed"
 version = "0.71.0"
+publish = false
 
 [lib]
 name = "zed"

crates/zed/src/zed.rs 🔗

@@ -31,7 +31,7 @@ use search::{BufferSearchBar, ProjectSearchBar};
 use serde::Deserialize;
 use serde_json::to_string_pretty;
 use settings::{keymap_file_json_schema, settings_file_json_schema, Settings};
-use std::{env, path::Path, str, sync::Arc};
+use std::{borrow::Cow, env, path::Path, str, sync::Arc};
 use util::{channel::ReleaseChannel, paths, ResultExt};
 pub use workspace;
 use workspace::{sidebar::SidebarSide, AppState, Workspace};
@@ -57,6 +57,7 @@ actions!(
         DebugElements,
         OpenSettings,
         OpenLog,
+        OpenLicenses,
         OpenTelemetryLog,
         OpenKeymap,
         OpenDefaultSettings,
@@ -176,6 +177,19 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut gpui::MutableAppContext) {
             open_log_file(workspace, app_state.clone(), cx);
         }
     });
+    cx.add_action({
+        let app_state = app_state.clone();
+        move |workspace: &mut Workspace, _: &OpenLicenses, cx: &mut ViewContext<Workspace>| {
+            open_bundled_file(
+                workspace,
+                app_state.clone(),
+                "licenses.md",
+                "Open Source License Attribution",
+                "Markdown",
+                cx,
+            );
+        }
+    });
     cx.add_action({
         let app_state = app_state.clone();
         move |workspace: &mut Workspace, _: &OpenTelemetryLog, cx: &mut ViewContext<Workspace>| {
@@ -191,11 +205,12 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut gpui::MutableAppContext) {
     cx.add_action({
         let app_state = app_state.clone();
         move |workspace: &mut Workspace, _: &OpenDefaultKeymap, cx: &mut ViewContext<Workspace>| {
-            open_bundled_config_file(
+            open_bundled_file(
                 workspace,
                 app_state.clone(),
                 "keymaps/default.json",
                 "Default Key Bindings",
+                "JSON",
                 cx,
             );
         }
@@ -205,11 +220,12 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut gpui::MutableAppContext) {
         move |workspace: &mut Workspace,
               _: &OpenDefaultSettings,
               cx: &mut ViewContext<Workspace>| {
-            open_bundled_config_file(
+            open_bundled_file(
                 workspace,
                 app_state.clone(),
                 "settings/default.json",
                 "Default Settings",
+                "JSON",
                 cx,
             );
         }
@@ -613,21 +629,24 @@ fn open_telemetry_log_file(
     }).detach();
 }
 
-fn open_bundled_config_file(
+fn open_bundled_file(
     workspace: &mut Workspace,
     app_state: Arc<AppState>,
     asset_path: &'static str,
     title: &'static str,
+    language: &'static str,
     cx: &mut ViewContext<Workspace>,
 ) {
     workspace
         .with_local_workspace(&app_state, cx, |workspace, cx| {
             let project = workspace.project().clone();
             let buffer = project.update(cx, |project, cx| {
-                let text = Assets::get(asset_path).unwrap().data;
+                let text = Assets::get(asset_path)
+                    .map(|f| f.data)
+                    .unwrap_or_else(|| Cow::Borrowed(b"File not found"));
                 let text = str::from_utf8(text.as_ref()).unwrap();
                 project
-                    .create_buffer(text, project.languages().get_language("JSON"), cx)
+                    .create_buffer(text, project.languages().get_language(language), cx)
                     .expect("creating buffers on a local workspace always succeeds")
             });
             let buffer =

script/generate-licenses 🔗

@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+[[ "$(cargo about --version)" == "cargo-about 0.5.2" ]] || cargo install cargo-about --locked --git https://github.com/zed-industries/cargo-about --branch error-code-on-warn
+
+cargo about generate --fail-on-missing-license -o assets/licenses.md -c script/licenses/zed-licenses.toml script/licenses/template.hbs.md
+
+# cargo about automatically html-escapes all output, so we need to undo it here: 
+sed -i '' 's/&quot;/"/g' assets/licenses.md
+sed -i '' 's/&#x27;/'\''/g' assets/licenses.md # `'\''` ends the string, appends a single quote, and re-opens the string
+sed -i '' 's/&#x3D;/=/g' assets/licenses.md
+sed -i '' 's/&#x60;/`/g' assets/licenses.md
+sed -i '' 's/&lt;/</g' assets/licenses.md
+sed -i '' 's/&gt;/>/g' assets/licenses.md

script/licenses/template.hbs.md 🔗

@@ -0,0 +1,27 @@
+# Third Party Licenses
+
+This page lists the licenses of the projects used in Zed.
+
+## Overview of licenses:
+
+{{#each overview}}
+* {{name}} ({{count}})
+{{/each}}
+
+## All license texts:
+
+{{#each licenses}}
+
+### {{name}}
+  
+#### Used by:
+
+{{#each used_by}}
+* [{{crate.name}} {{crate.version}}]({{#if crate.repository}} {{crate.repository}} {{else}} https://crates.io/crates/{{crate.name}} {{/if}})
+{{/each}}
+ 
+{{text}}
+
+--------------------------------------------------------------------------------
+           
+{{/each}}

script/licenses/zed-licenses.toml 🔗

@@ -0,0 +1,37 @@
+no-clearly-defined = true
+private = { ignore = true }
+accepted = [
+    "Apache-2.0",
+    "MIT",
+    "Apache-2.0 WITH LLVM-exception",
+    "MPL-2.0",
+    "BSD-3-Clause",
+    "BSD-2-Clause",
+    "ISC",
+    "CC0-1.0",
+    "Unicode-DFS-2016",
+    "OpenSSL",
+    "Zlib",
+]
+workarounds = [
+    "ring",
+    "wasmtime",
+]
+
+[procinfo.clarify]
+license = "MIT"
+[[procinfo.clarify.git]]
+path = 'LICENSE.md'
+checksum = '37db33bbbd7348969eda397b89a16f252d56c1ca7481b6ccaf56ccdcbab5dcca'
+
+[webpki.clarify]
+license = "ISC" # It actually says 'ISC-style' but I don't know the SPDX expression for that.
+[[webpki.clarify.files]]
+path = 'LICENSE'
+checksum = '5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a'
+
+[fuchsia-cprng.clarify]
+license = "BSD-3-Clause"
+[[fuchsia-cprng.clarify.files]]
+path = 'LICENSE'
+checksum = '03b114f53e6587a398931762ee11e2395bfdba252a329940e2c8c9e81813845b'

styles/src/themes/one-light.ts 🔗

@@ -11,15 +11,15 @@ const license = {
 
 export const light = createColorScheme(`${name}`, true, {
   neutral: chroma.scale([
-      "#090a0b",
-      "#202227",
-      "#383a42",
-      "#696c77",
-      "#a0a1a7",
-      "#e5e5e6",
-      "#f0f0f1",
-      "#fafafa",
-    ])
+    "#090a0b",
+    "#202227",
+    "#383a42",
+    "#696c77",
+    "#a0a1a7",
+    "#e5e5e6",
+    "#f0f0f1",
+    "#fafafa",
+  ])
     .domain([0.05, 0.22, 0.25, 0.45, 0.62, 0.8, 0.9, 1]),
 
   red: colorRamp(chroma("#ca1243")),