Merge remote-tracking branch 'origin/main' into scrollbars2

Antonio Scandurra created

Change summary

Cargo.lock                                                      |    5 
Cargo.toml                                                      |    2 
assets/themes/src/vscode/palenight/palenight-mild-contrast.json | 3138 +-
assets/themes/src/vscode/palenight/palenight-operator.json      | 3280 +-
assets/themes/src/vscode/palenight/palenight.json               | 3138 +-
assets/themes/src/vscode/rose-pine/rose-pine-dawn.json          | 1356 
assets/themes/src/vscode/rose-pine/rose-pine-moon.json          | 1356 
assets/themes/src/vscode/rose-pine/rose-pine.json               | 1356 
crates/activity_indicator2/src/activity_indicator.rs            |    2 
crates/assistant2/src/assistant.rs                              |   27 
crates/assistant2/src/assistant_panel.rs                        |    7 
crates/auto_update2/src/auto_update.rs                          |   11 
crates/breadcrumbs2/Cargo.toml                                  |    2 
crates/breadcrumbs2/src/breadcrumbs.rs                          |  109 
crates/channel2/src/channel_store.rs                            |   11 
crates/channel2/src/channel_store/channel_index.rs              |    8 
crates/client2/src/client2.rs                                   |    2 
crates/collab/Cargo.toml                                        |    2 
crates/collab/src/api.rs                                        |    3 
crates/collab2/src/tests/channel_tests.rs                       |   64 
crates/collab2/src/tests/random_channel_buffer_tests.rs         |    8 
crates/collab_ui2/src/channel_view.rs                           |    2 
crates/collab_ui2/src/chat_panel.rs                             | 1681 
crates/collab_ui2/src/chat_panel/message_editor.rs              |  105 
crates/collab_ui2/src/collab_panel.rs                           |   64 
crates/collab_ui2/src/collab_panel/channel_modal.rs             |   13 
crates/collab_ui2/src/collab_panel/contact_finder.rs            |    2 
crates/collab_ui2/src/collab_titlebar_item.rs                   |   13 
crates/collab_ui2/src/collab_ui.rs                              |   14 
crates/command_palette2/src/command_palette.rs                  |   30 
crates/copilot2/src/copilot2.rs                                 |   15 
crates/diagnostics2/src/diagnostics.rs                          |    2 
crates/editor2/src/editor.rs                                    |  282 
crates/editor2/src/element.rs                                   |   75 
crates/editor2/src/hover_popover.rs                             |    2 
crates/feedback2/src/deploy_feedback_button.rs                  |    2 
crates/feedback2/src/feedback2.rs                               |   13 
crates/feedback2/src/feedback_modal.rs                          |  321 
crates/file_finder2/src/file_finder.rs                          |    6 
crates/go_to_line2/src/go_to_line.rs                            |    5 
crates/gpui2/docs/key_dispatch.md                               |    2 
crates/gpui2/src/action.rs                                      |  122 
crates/gpui2/src/app.rs                                         |    5 
crates/gpui2/src/elements/list.rs                               |  496 
crates/gpui2/src/elements/mod.rs                                |    2 
crates/gpui2/src/elements/uniform_list.rs                       |    2 
crates/gpui2/src/gpui2.rs                                       |   45 
crates/gpui2/src/interactive.rs                                 |    2 
crates/gpui2/src/key_dispatch.rs                                |   14 
crates/gpui2/src/keymap/context.rs                              |    5 
crates/gpui2/src/shared_string.rs                               |  101 
crates/gpui2/src/styled.rs                                      |   14 
crates/gpui2/tests/action_macros.rs                             |   13 
crates/gpui2_macros/src/action.rs                               |   97 
crates/gpui2_macros/src/gpui2_macros.rs                         |   12 
crates/gpui2_macros/src/register_action.rs                      |   44 
crates/install_cli2/src/install_cli2.rs                         |    2 
crates/language_selector2/src/language_selector.rs              |    5 
crates/live_kit_client2/examples/test_app2.rs                   |    6 
crates/menu2/src/menu2.rs                                       |   19 
crates/outline2/src/outline.rs                                  |    5 
crates/project_panel2/src/project_panel.rs                      |   37 
crates/recent_projects2/src/projects.rs                         |    2 
crates/recent_projects2/src/recent_projects.rs                  |    6 
crates/rich_text2/src/rich_text.rs                              |  292 
crates/search2/src/buffer_search.rs                             |    8 
crates/search2/src/search.rs                                    |   31 
crates/settings2/src/keymap_file.rs                             |    6 
crates/storybook2/src/stories/focus.rs                          |    2 
crates/terminal2/src/terminal2.rs                               |   17 
crates/terminal_view2/src/terminal_element.rs                   |   19 
crates/terminal_view2/src/terminal_panel.rs                     |    2 
crates/terminal_view2/src/terminal_view.rs                      |  104 
crates/theme2/src/registry.rs                                   |   13 
crates/theme2/src/theme2.rs                                     |    9 
crates/theme2/src/themes/andromeda.rs                           |  106 
crates/theme2/src/themes/ayu.rs                                 |  123 
crates/theme2/src/themes/dracula.rs                             |   60 
crates/theme2/src/themes/gruvbox.rs                             |  534 
crates/theme2/src/themes/night_owl.rs                           |  142 
crates/theme2/src/themes/noctis.rs                              |  523 
crates/theme2/src/themes/nord.rs                                |   69 
crates/theme2/src/themes/palenight.rs                           |  205 
crates/theme2/src/themes/rose_pine.rs                           |  288 
crates/theme2/src/themes/solarized.rs                           |  121 
crates/theme2/src/themes/synthwave_84.rs                        |   54 
crates/theme_importer/src/vscode/converter.rs                   |   55 
crates/theme_importer/src/vscode/syntax.rs                      |   41 
crates/theme_importer/src/vscode/theme.rs                       | 1411 +
crates/theme_selector2/src/theme_selector.rs                    |   36 
crates/ui2/src/components/button/button.rs                      |   47 
crates/ui2/src/components/button/button_like.rs                 |    8 
crates/ui2/src/components/context_menu.rs                       |    6 
crates/ui2/src/components/icon.rs                               |    3 
crates/ui2/src/components/stories/context_menu.rs               |    2 
crates/ui2/src/components/stories/keybinding.rs                 |    5 
crates/ui2/src/prelude.rs                                       |    2 
crates/welcome2/src/base_keymap_picker.rs                       |    5 
crates/workspace2/src/dock.rs                                   |    2 
crates/workspace2/src/modal_layer.rs                            |   68 
crates/workspace2/src/pane.rs                                   |  395 
crates/workspace2/src/status_bar.rs                             |   33 
crates/workspace2/src/workspace2.rs                             |   95 
crates/zed2/build.rs                                            |   18 
crates/zed2/src/zed2.rs                                         |   55 
crates/zed_actions2/src/lib.rs                                  |    8 
script/upload-nightly                                           |    2 
107 files changed, 12,975 insertions(+), 9,642 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -1154,6 +1154,7 @@ dependencies = [
  "gpui2",
  "itertools 0.10.5",
  "language2",
+ "outline2",
  "project2",
  "search2",
  "settings2",
@@ -1753,7 +1754,7 @@ dependencies = [
 
 [[package]]
 name = "collab"
-version = "0.30.0"
+version = "0.30.1"
 dependencies = [
  "anyhow",
  "async-trait",
@@ -10511,7 +10512,7 @@ dependencies = [
 [[package]]
 name = "tree-sitter-vue"
 version = "0.0.1"
-source = "git+https://github.com/zed-industries/tree-sitter-vue?rev=9b6cb221ccb8d0b956fcb17e9a1efac2feefeb58#9b6cb221ccb8d0b956fcb17e9a1efac2feefeb58"
+source = "git+https://github.com/zed-industries/tree-sitter-vue?rev=6608d9d60c386f19d80af7d8132322fa11199c42#6608d9d60c386f19d80af7d8132322fa11199c42"
 dependencies = [
  "cc",
  "tree-sitter",

Cargo.toml 🔗

@@ -205,7 +205,7 @@ tree-sitter-yaml = { git = "https://github.com/zed-industries/tree-sitter-yaml",
 tree-sitter-lua = "0.0.14"
 tree-sitter-nix = { git = "https://github.com/nix-community/tree-sitter-nix", rev = "66e3e9ce9180ae08fc57372061006ef83f0abde7" }
 tree-sitter-nu = { git = "https://github.com/nushell/tree-sitter-nu", rev = "786689b0562b9799ce53e824cb45a1a2a04dc673"}
-tree-sitter-vue = {git = "https://github.com/zed-industries/tree-sitter-vue", rev = "9b6cb221ccb8d0b956fcb17e9a1efac2feefeb58"}
+tree-sitter-vue = {git = "https://github.com/zed-industries/tree-sitter-vue", rev = "6608d9d60c386f19d80af7d8132322fa11199c42"}
 tree-sitter-uiua = {git = "https://github.com/shnarazk/tree-sitter-uiua", rev = "9260f11be5900beda4ee6d1a24ab8ddfaf5a19b2"}
 
 [patch.crates-io]

assets/themes/src/vscode/palenight/palenight-mild-contrast.json 🔗

@@ -1,1569 +1,1569 @@
-{

-  "name": "Palenight (Mild Contrast)",

-  "author": "Olaolu Olawuyi",

-  "maintainers": ["Olaolu Olawuyi <mrolaolu@gmail.com>"],

-  "type": "dark",

-  "semanticClass": "palenight-mild-contrast",

-  "colors": {

-    "contrastActiveBorder": null,

-    "contrastBorder": "#2C2F40",

-    "focusBorder": "#2C2F40",

-    "foreground": "#ffffff",

-    "widget.shadow": "#232635",

-    "selection.background": "#7580B850",

-    "descriptionForeground": null,

-    "errorForeground": "#EF5350",

-    "button.background": "#7e57c2cc",

-    "button.foreground": "#ffffffcc",

-    "button.hoverBackground": "#7e57c2",

-    "dropdown.background": "#292D3E",

-    "dropdown.border": "#7e57c2",

-    "dropdown.foreground": "#ffffffcc",

-    "input.background": "#313850",

-    "input.border": "#7e57c2",

-    "input.foreground": "#ffffffcc",

-    "input.placeholderForeground": "#ffffffcc",

-    "inputOption.activeBorder": "#ffffffcc",

-    "inputValidation.errorBackground": "#ef5350f2",

-    "inputValidation.errorBorder": "#EF5350",

-    "inputValidation.infoBackground": "#64b5f6f2",

-    "inputValidation.infoBorder": "#64B5F6",

-    "inputValidation.warningBackground": "#ffca28f2",

-    "inputValidation.warningBorder": "#FFCA28",

-    "scrollbar.shadow": "#292D3E00",

-    "scrollbarSlider.activeBackground": "#694CA4cc",

-    "scrollbarSlider.background": "#694CA466",

-    "scrollbarSlider.hoverBackground": "#694CA4cc",

-    "badge.background": "#7e57c2",

-    "badge.foreground": "#ffffff",

-    "progress.background": "#7e57c2",

-    "list.activeSelectionBackground": "#7e57c2",

-    "list.activeSelectionForeground": "#ffffff",

-    "list.dropBackground": "#2E3245",

-    "list.focusBackground": "#0000002e",

-    "list.focusForeground": "#ffffff",

-    "list.highlightForeground": "#ffffff",

-    "list.hoverBackground": "#0000001a",

-    "list.hoverForeground": "#ffffff",

-    "list.inactiveSelectionBackground": "#929ac90d",

-    "list.inactiveSelectionForeground": "#929ac9",

-    "activityBar.background": "#242839",

-    "activityBar.dropBackground": "#7e57c2e3",

-    "activityBar.foreground": "#eeffff",

-    "activityBar.border": "#2E3243",

-    "activityBarBadge.background": "#7e57c2",

-    "activityBarBadge.foreground": "#ffffff",

-    "sideBar.background": "#25293A",

-    "sideBar.foreground": "#6C739A",

-    "sideBar.border": "#2C2F40",

-    "sideBarTitle.foreground": "#eeffff",

-    "sideBarSectionHeader.background": "#25293A",

-    "sideBarSectionHeader.foreground": "#eeffff",

-    "editorGroup.background": "#32374C",

-    "editorGroup.border": "#2E3245",

-    "editorGroup.dropBackground": "#7e57c273",

-    "editorGroupHeader.noTabsBackground": "#32374C",

-    "editorGroupHeader.tabsBackground": "#31364a",

-    "editorGroupHeader.tabsBorder": "#2C3041",

-    "tab.activeBackground": "#25293A",

-    "tab.activeForeground": "#eeffff",

-    "tab.border": "#272B3B",

-    "tab.activeBorder": "#2C3041",

-    "tab.unfocusedActiveBorder": "#2C3041",

-    "tab.inactiveBackground": "#31364A",

-    "tab.inactiveForeground": "#929ac9",

-    "tab.unfocusedActiveForeground": null,

-    "tab.unfocusedInactiveForeground": null,

-    "editor.background": "#292D3E",

-    "editor.foreground": "#BFC7D5",

-    "editorLineNumber.foreground": "#4c5374",

-    "editorLineNumber.activeForeground": "#eeffff",

-    "editorCursor.foreground": "#7e57c2",

-    "editorCursor.background": null,

-    "editor.selectionBackground": "#7580B850",

-    "editor.selectionHighlightBackground": "#383D51",

-    "editor.inactiveSelectionBackground": "#7e57c25a",

-    "editor.wordHighlightBackground": "#32374D",

-    "editor.wordHighlightStrongBackground": "#2E3250",

-    "editor.findMatchBackground": "#2e3248fc",

-    "editor.findMatchHighlightBackground": "#7e57c233",

-    "editor.findRangeHighlightBackground": null,

-    "editor.hoverHighlightBackground": "#7e57c25a",

-    "editor.lineHighlightBackground": "#0003",

-    "editor.lineHighlightBorder": null,

-    "editorLink.activeForeground": null,

-    "editor.rangeHighlightBackground": "#7e57c25a",

-    "editorWhitespace.foreground": null,

-    "editorIndentGuide.background": "#4E557980",

-    "editorRuler.foreground": "#4E557980",

-    "editorCodeLens.foreground": "#FFCA28",

-    "editorBracketMatch.background": null,

-    "editorBracketMatch.border": null,

-    "editorOverviewRuler.currentContentForeground": "#7e57c2",

-    "editorOverviewRuler.incomingContentForeground": "#7e57c2",

-    "editorOverviewRuler.commonContentForeground": "#7e57c2",

-    "editorError.foreground": "#EF5350",

-    "editorError.border": null,

-    "editorWarning.foreground": "#FFCA28",

-    "editorWarning.border": null,

-    "editorGutter.background": null,

-    "editorGutter.modifiedBackground": "#e2b93d",

-    "editorGutter.addedBackground": "#9CCC65",

-    "editorGutter.deletedBackground": "#EF5350",

-    "diffEditor.insertedTextBackground": "#99b76d23",

-    "diffEditor.removedTextBackground": "#ef535033",

-    "editorWidget.background": "#31364a",

-    "editorWidget.border": null,

-    "editorSuggestWidget.background": "#2C3043",

-    "editorSuggestWidget.border": "#2B2F40",

-    "editorSuggestWidget.foreground": "#bfc7d5",

-    "editorSuggestWidget.highlightForeground": "#ffffff",

-    "editorSuggestWidget.selectedBackground": "#7e57c2",

-    "editorHoverWidget.background": "#292D3E",

-    "editorHoverWidget.border": "#7e57c2",

-    "debugExceptionWidget.background": "#292D3E",

-    "debugExceptionWidget.border": "#7e57c2",

-    "editorMarkerNavigation.background": "#31364a",

-    "editorMarkerNavigationError.background": "#EF5350",

-    "editorMarkerNavigationWarning.background": "#FFCA28",

-    "peekView.border": "#7e57c2",

-    "peekViewEditor.background": "#232635",

-    "peekViewEditor.matchHighlightBackground": "#7e57c25a",

-    "peekViewResult.background": "#2E3245",

-    "peekViewResult.fileForeground": "#eeffff",

-    "peekViewResult.lineForeground": "#eeffff",

-    "peekViewResult.matchHighlightBackground": "#7e57c25a",

-    "peekViewResult.selectionBackground": "#2E3250",

-    "peekViewResult.selectionForeground": "#eeffff",

-    "peekViewTitle.background": "#292D3E",

-    "peekViewTitleDescription.foreground": "#697098",

-    "peekViewTitleLabel.foreground": "#eeffff",

-    "merge.currentHeaderBackground": "#7e57c25a",

-    "merge.currentContentBackground": null,

-    "merge.incomingHeaderBackground": "#7e57c25a",

-    "merge.incomingContentBackground": null,

-    "merge.border": null,

-    "panel.background": "#25293A",

-    "panel.border": "#2C2F40",

-    "panelTitle.activeBorder": "#7e57c2",

-    "panelTitle.activeForeground": "#eeffff",

-    "panelTitle.inactiveForeground": "#bfc7d580",

-    "statusBar.background": "#25293A",

-    "statusBar.foreground": "#676E95",

-    "statusBar.border": "#2C3041",

-    "statusBar.debuggingBackground": "#202431",

-    "statusBar.debuggingForeground": null,

-    "statusBar.debuggingBorder": "#1F2330",

-    "statusBar.noFolderForeground": null,

-    "statusBar.noFolderBackground": "#292D3E",

-    "statusBar.noFolderBorder": "#25293A",

-    "statusBarItem.activeBackground": "#202431",

-    "statusBarItem.hoverBackground": "#202431",

-    "statusBarItem.prominentBackground": "#202431",

-    "statusBarItem.prominentHoverBackground": "#202431",

-    "titleBar.activeBackground": "#25293A",

-    "titleBar.activeForeground": "#eeefff",

-    "titleBar.border": "#2C3041",

-    "titleBar.inactiveBackground": "#30364c",

-    "titleBar.inactiveForeground": null,

-    "notifications.background": "#292D3E",

-    "notifications.foreground": "#ffffffcc",

-    "notificationLink.foreground": "#80CBC4",

-    "extensionButton.prominentForeground": "#ffffffcc",

-    "extensionButton.prominentBackground": "#7e57c2cc",

-    "extensionButton.prominentHoverBackground": "#7e57c2",

-    "pickerGroup.foreground": "#d1aaff",

-    "pickerGroup.border": "#2E3245",

-    "terminal.ansiWhite": "#ffffff",

-    "terminal.ansiBlack": "#676E95",

-    "terminal.ansiBlue": "#82AAFF",

-    "terminal.ansiCyan": "#89DDFF",

-    "terminal.ansiGreen": "#a9c77d",

-    "terminal.ansiMagenta": "#C792EA",

-    "terminal.ansiRed": "#ff5572",

-    "terminal.ansiYellow": "#FFCB6B",

-    "terminal.ansiBrightWhite": "#ffffff",

-    "terminal.ansiBrightBlack": "#676E95",

-    "terminal.ansiBrightBlue": "#82AAFF",

-    "terminal.ansiBrightCyan": "#89DDFF",

-    "terminal.ansiBrightGreen": "#C3E88D",

-    "terminal.ansiBrightMagenta": "#C792EA",

-    "terminal.ansiBrightRed": "#ff5572",

-    "terminal.ansiBrightYellow": "#FFCB6B",

-    "debugToolBar.background": "#292D3E",

-    "welcomePage.buttonBackground": null,

-    "welcomePage.buttonHoverBackground": null,

-    "walkThrough.embeddedEditorBackground": "#232635",

-    "gitDecoration.modifiedResourceForeground": "#e2c08de6",

-    "gitDecoration.deletedResourceForeground": "#EF535090",

-    "gitDecoration.untrackedResourceForeground": "#a9c77dff",

-    "gitDecoration.ignoredResourceForeground": "#69709890",

-    "gitDecoration.conflictingResourceForeground": "#FFEB95CC",

-    "editorActiveLineNumber.foreground": "#eeffff",

-    "breadcrumb.foreground": "#6c739a",

-    "breadcrumb.focusForeground": "#bfc7d5",

-    "breadcrumb.activeSelectionForeground": "#eeffff",

-    "breadcrumbPicker.background": "#292D3E"

-  },

-  "tokenColors": [

-    {

-      "name": "Global settings",

-      "settings": {

-        "background": "#292D3E",

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Comment",

-      "scope": "comment",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "String",

-      "scope": "string",

-      "settings": {

-        "foreground": "#C3E88D"

-      }

-    },

-    {

-      "name": "String Quoted",

-      "scope": "string.quoted",

-      "settings": {

-        "foreground": "#C3E88D"

-      }

-    },

-    {

-      "name": "String Unquoted",

-      "scope": "string.unquoted",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Support Constant Math",

-      "scope": "support.constant.math",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Number",

-      "scope": ["constant.numeric", "constant.character.numeric"],

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Built-in constant",

-      "scope": [

-        "constant.language",

-        "punctuation.definition.constant",

-        "variable.other.constant"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "User-defined constant",

-      "scope": ["constant.character", "constant.other"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Constant Character Escape",

-      "scope": "constant.character.escape",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "RegExp String",

-      "scope": ["string.regexp", "string.regexp keyword.other"],

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Comma in functions",

-      "scope": "meta.function punctuation.separator.comma",

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "Variable",

-      "scope": "variable",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Keyword",

-      "scope": ["punctuation.accessor", "keyword"],

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Storage",

-      "scope": [

-        "storage",

-        "storage.type",

-        "meta.var.expr storage.type",

-        "storage.type.property.js",

-        "storage.type.property.ts",

-        "storage.type.property.tsx",

-        "meta.class meta.method.declaration meta.var.expr storage.type.js"

-      ],

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Class name",

-      "scope": ["entity.name.class", "meta.class entity.name.type.class"],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Inherited class",

-      "scope": "entity.other.inherited-class",

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Function name",

-      "scope": "entity.name.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Function Parameters",

-      "scope": "variable.parameter",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "Meta Tag",

-      "scope": ["punctuation.definition.tag", "meta.tag"],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "HTML Tag names",

-      "scope": [

-        "entity.name.tag support.class.component",

-        "meta.tag.other.html",

-        "meta.tag.other.js",

-        "meta.tag.other.tsx",

-        "entity.name.tag.tsx",

-        "entity.name.tag.js",

-        "entity.name.tag",

-        "meta.tag.js",

-        "meta.tag.tsx",

-        "meta.tag.html"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Tag attribute",

-      "scope": "entity.other.attribute-name",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Entity Name Tag Custom",

-      "scope": "entity.name.tag.custom",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Library (function & constant)",

-      "scope": ["support.function", "support.constant"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Support Constant Property Value meta",

-      "scope": "support.constant.meta.property-value",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Library class/type",

-      "scope": ["support.type", "support.class"],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Support Variable DOM",

-      "scope": "support.variable.dom",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Invalid",

-      "scope": "invalid",

-      "settings": {

-        "background": "#ff2c83",

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Invalid deprecated",

-      "scope": "invalid.deprecated",

-      "settings": {

-        "foreground": "#ffffff",

-        "background": "#d3423e"

-      }

-    },

-    {

-      "name": "Keyword Operator",

-      "scope": "keyword.operator",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Relational",

-      "scope": "keyword.operator.relational",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Keyword Operator Assignment",

-      "scope": "keyword.operator.assignment",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Double-Slashed Comment",

-      "scope": "comment.line.double-slash",

-      "settings": {

-        "foreground": "#697098"

-      }

-    },

-    {

-      "name": "Object",

-      "scope": "object",

-      "settings": {

-        "foreground": "#cdebf7"

-      }

-    },

-    {

-      "name": "Null",

-      "scope": "constant.language.null",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Meta Brace",

-      "scope": "meta.brace",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Meta Delimiter Period",

-      "scope": "meta.delimiter.period",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Punctuation Definition String",

-      "scope": "punctuation.definition.string",

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Boolean",

-      "scope": "constant.language.boolean",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Object Comma",

-      "scope": "object.comma",

-      "settings": {

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Variable Parameter Function",

-      "scope": "variable.parameter.function",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Support Type Property Name & entity name tags",

-      "scope": [

-        "support.type.vendored.property-name",

-        "support.constant.vendored.property-value",

-        "support.type.property-name",

-        "meta.property-list entity.name.tag"

-      ],

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Entity Name tag reference in stylesheets",

-      "scope": "meta.property-list entity.name.tag.reference",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Constant Other Color RGB Value Punctuation Definition Constant",

-      "scope": "constant.other.color.rgb-value punctuation.definition.constant",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Constant Other Color",

-      "scope": "constant.other.color",

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Keyword Other Unit",

-      "scope": "keyword.other.unit",

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Meta Selector",

-      "scope": "meta.selector",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Entity Other Attribute Name Id",

-      "scope": "entity.other.attribute-name.id",

-      "settings": {

-        "foreground": "#FAD430"

-      }

-    },

-    {

-      "name": "Meta Property Name",

-      "scope": "meta.property-name",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Doctypes",

-      "scope": ["entity.name.tag.doctype", "meta.tag.sgml.doctype"],

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Punctuation Definition Parameters",

-      "scope": "punctuation.definition.parameters",

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Keyword Control Operator",

-      "scope": "keyword.control.operator",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Logical",

-      "scope": "keyword.operator.logical",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Variable Instances",

-      "scope": [

-        "variable.instance",

-        "variable.other.instance",

-        "variable.reaedwrite.instance",

-        "variable.other.readwrite.instance"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Variable Property Other",

-      "scope": ["variable.other.property", "variable.other.object.property"],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Entity Name Function",

-      "scope": "entity.name.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Comparison",

-      "scope": "keyword.operator.comparison",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Support Constant, `new` keyword, Special Method Keyword",

-      "scope": [

-        "support.constant",

-        "keyword.other.special-method",

-        "keyword.other.new"

-      ],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Support Function",

-      "scope": "support.function",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Invalid Broken",

-      "scope": "invalid.broken",

-      "settings": {

-        "foreground": "#020e14",

-        "background": "#F78C6C"

-      }

-    },

-    {

-      "name": "Invalid Unimplemented",

-      "scope": "invalid.unimplemented",

-      "settings": {

-        "background": "#8BD649",

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Invalid Illegal",

-      "scope": "invalid.illegal",

-      "settings": {

-        "foreground": "#ffffff",

-        "background": "#ec5f67"

-      }

-    },

-    {

-      "name": "Language Variable",

-      "scope": "variable.language",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Support Variable Property",

-      "scope": "support.variable.property",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Variable Function",

-      "scope": "variable.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Variable Interpolation",

-      "scope": "variable.interpolation",

-      "settings": {

-        "foreground": "#ec5f67"

-      }

-    },

-    {

-      "name": "Meta Function Call",

-      "scope": "meta.function-call",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Punctuation Section Embedded",

-      "scope": "punctuation.section.embedded",

-      "settings": {

-        "foreground": "#d3423e"

-      }

-    },

-    {

-      "name": "Punctuation Tweaks",

-      "scope": [

-        "punctuation.terminator.expression",

-        "punctuation.definition.arguments",

-        "punctuation.definition.array",

-        "punctuation.section.array",

-        "meta.array"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "More Punctuation Tweaks",

-      "scope": [

-        "punctuation.definition.list.begin",

-        "punctuation.definition.list.end",

-        "punctuation.separator.arguments",

-        "punctuation.definition.list"

-      ],

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Template Strings",

-      "scope": "string.template meta.template.expression",

-      "settings": {

-        "foreground": "#d3423e"

-      }

-    },

-    {

-      "name": "Backtics(``) in Template Strings",

-      "scope": "string.template punctuation.definition.string",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Italics",

-      "scope": "italic",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Bold",

-      "scope": "bold",

-      "settings": {

-        "foreground": "#ffcb6b",

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Quote",

-      "scope": "quote",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Raw Code",

-      "scope": "raw",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "CoffeScript Variable Assignment",

-      "scope": "variable.assignment.coffee",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "CoffeScript Parameter Function",

-      "scope": "variable.parameter.function.coffee",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "CoffeeScript Assignments",

-      "scope": "variable.assignment.coffee",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "C# Readwrite Variables",

-      "scope": "variable.other.readwrite.cs",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "C# Classes & Storage types",

-      "scope": ["entity.name.type.class.cs", "storage.type.cs"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "C# Namespaces",

-      "scope": "entity.name.type.namespace.cs",

-      "settings": {

-        "foreground": "#B2CCD6"

-      }

-    },

-    {

-      "name": "Tag names in Stylesheets",

-      "scope": [

-        "entity.name.tag.css",

-        "entity.name.tag.less",

-        "entity.name.tag.custom.css"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Wildcard(*) selector in Stylesheets",

-      "scope": [

-        "entity.name.tag.wildcard.css",

-        "entity.name.tag.wildcard.less",

-        "entity.name.tag.wildcard.scss",

-        "entity.name.tag.wildcard.sass"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "(C|SC|SA|LE)SS property value unit",

-      "scope": [

-        "keyword.other.unit.css",

-        "constant.length.units.css",

-        "keyword.other.unit.less",

-        "constant.length.units.less",

-        "keyword.other.unit.scss",

-        "constant.length.units.scss",

-        "keyword.other.unit.sass",

-        "constant.length.units.sass"

-      ],

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Attribute Name for CSS",

-      "scope": "meta.attribute-selector.css entity.other.attribute-name.attribute",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "punctuations in styled components",

-      "scope": [

-        "source.js source.css meta.property-list",

-        "source.js source.css punctuation.section",

-        "source.js source.css punctuation.terminator.rule",

-        "source.js source.css punctuation.definition.entity.end.bracket",

-        "source.js source.css punctuation.definition.entity.begin.bracket",

-        "source.js source.css punctuation.separator.key-value",

-        "source.js source.css punctuation.definition.attribute-selector",

-        "source.js source.css meta.property-list",

-        "source.js source.css meta.property-list punctuation.separator.comma",

-        "source.ts source.css punctuation.section",

-        "source.ts source.css punctuation.terminator.rule",

-        "source.ts source.css punctuation.definition.entity.end.bracket",

-        "source.ts source.css punctuation.definition.entity.begin.bracket",

-        "source.ts source.css punctuation.separator.key-value",

-        "source.ts source.css punctuation.definition.attribute-selector",

-        "source.ts source.css meta.property-list",

-        "source.ts source.css meta.property-list punctuation.separator.comma"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Elixir Classes",

-      "scope": [

-        "source.elixir support.type.elixir",

-        "source.elixir meta.module.elixir entity.name.class.elixir"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Elixir Functions",

-      "scope": "source.elixir entity.name.function",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Elixir Constants",

-      "scope": [

-        "source.elixir constant.other.symbol.elixir",

-        "source.elixir constant.other.keywords.elixir"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Elixir String Punctuations",

-      "scope": "source.elixir punctuation.definition.string",

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Elixir",

-      "scope": [

-        "source.elixir variable.other.readwrite.module.elixir",

-        "source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir"

-      ],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Elixir Binary Punctuations",

-      "scope": "source.elixir .punctuation.binary.elixir",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Go Function Calls",

-      "scope": "source.go meta.function-call.go",

-      "settings": {

-        "foreground": "#DDDDDD"

-      }

-    },

-    {

-      "name": "GraphQL Variables",

-      "scope": "variable.qraphql",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "ID Attribute Name in HTML",

-      "scope": "entity.other.attribute-name.id.html",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "HTML Punctuation Definition Tag",

-      "scope": "punctuation.definition.tag.html",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "HTML Doctype",

-      "scope": "meta.tag.sgml.doctype.html",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "JavaScript Classes",

-      "scope": "meta.class entity.name.type.class.js",

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "JavaScript Method Declaration e.g. `constructor`",

-      "scope": "meta.method.declaration storage.type.js",

-      "settings": {

-        "foreground": "#82AAFF",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "JavaScript Terminator",

-      "scope": "terminator.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Meta Punctuation Definition",

-      "scope": "meta.js punctuation.definition.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Entity Names in Code Documentations",

-      "scope": [

-        "entity.name.type.instance.jsdoc",

-        "entity.name.type.instance.phpdoc"

-      ],

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "Other Variables in Code Documentations",

-      "scope": ["variable.other.jsdoc", "variable.other.phpdoc"],

-      "settings": {

-        "foreground": "#78ccf0"

-      }

-    },

-    {

-      "name": "JavaScript module imports and exports",

-      "scope": [

-        "variable.other.meta.import.js",

-        "meta.import.js variable.other",

-        "variable.other.meta.export.js",

-        "meta.export.js variable.other"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Variable Parameter Function",

-      "scope": "variable.parameter.function.js",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "JavaScript Variable Other ReadWrite",

-      "scope": "variable.other.readwrite.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Text nested in React tags",

-      "scope": [

-        "meta.jsx.children",

-        "meta.jsx.children.js",

-        "meta.jsx.children.tsx"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript[React] Variable Other Object",

-      "scope": [

-        "variable.other.object.js",

-        "variable.other.object.jsx",

-        "meta.object-literal.key.js",

-        "meta.object-literal.key.jsx",

-        "variable.object.property.js",

-        "variable.object.property.jsx"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Variables",

-      "scope": ["variable.js", "variable.other.js"],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Entity Name Type",

-      "scope": ["entity.name.type.js", "entity.name.type.module.js"],

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "JavaScript Support Classes",

-      "scope": "support.class.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JSON Property Names",

-      "scope": "support.type.property-name.json",

-      "settings": {

-        "foreground": "#C3E88D",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "JSON Support Constants",

-      "scope": "support.constant.json",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "JSON Property values (string)",

-      "scope": "meta.structure.dictionary.value.json string.quoted.double",

-      "settings": {

-        "foreground": "#80CBC4",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "Strings in JSON values",

-      "scope": "string.quoted.double.json punctuation.definition.string.json",

-      "settings": {

-        "foreground": "#80CBC4",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "Specific JSON Property values like null",

-      "scope": "meta.structure.dictionary.json meta.structure.dictionary.value constant.language",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Ruby Variables",

-      "scope": "variable.other.ruby",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Ruby Hashkeys",

-      "scope": "constant.language.symbol.hashkey.ruby",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "LESS Tag names",

-      "scope": "entity.name.tag.less",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Attribute Name for LESS",

-      "scope": "meta.attribute-selector.less entity.other.attribute-name.attribute",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Markup Headings",

-      "scope": "markup.heading",

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Markup Italics",

-      "scope": "markup.italic",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markup Bold",

-      "scope": "markup.bold",

-      "settings": {

-        "foreground": "#ffcb6b",

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Markup Quote + others",

-      "scope": "markup.quote",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markup Raw Code + others",

-      "scope": "markup.inline.raw",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Markup Links",

-      "scope": ["markup.underline.link", "markup.underline.link.image"],

-      "settings": {

-        "foreground": "#ff869a"

-      }

-    },

-    {

-      "name": "Markup Attributes",

-      "scope": ["markup.meta.attribute-list"],

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Markup Admonitions",

-      "scope": "markup.admonition",

-      "settings": {

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Markup Lists",

-      "scope": "markup.list.bullet",

-      "settings": {

-        "foreground": "#D9F5DD"

-      }

-    },

-    {

-      "name": "Markup Superscript and Subscript",

-      "scope": ["markup.superscript", "markup.subscript"],

-      "settings": {

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markdown Link Title and Description",

-      "scope": [

-        "string.other.link.title.markdown",

-        "string.other.link.description.markdown"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Markdown Punctuation",

-      "scope": [

-        "punctuation.definition.string.markdown",

-        "punctuation.definition.string.begin.markdown",

-        "punctuation.definition.string.end.markdown",

-        "meta.link.inline.markdown punctuation.definition.string"

-      ],

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Markdown MetaData Punctuation",

-      "scope": ["punctuation.definition.metadata.markdown"],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Markdown List Punctuation",

-      "scope": ["beginning.punctuation.definition.list.markdown"],

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Asciidoc Function",

-      "scope": "entity.name.function.asciidoc",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "PHP Variables",

-      "scope": "variable.other.php",

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "Support Classes in PHP",

-      "scope": "support.class.php",

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "Punctuations in PHP function calls",

-      "scope": "meta.function-call.php punctuation",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "PHP Global Variables",

-      "scope": "variable.other.global.php",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Declaration Punctuation in PHP Global Variables",

-      "scope": "variable.other.global.php punctuation.definition.variable",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Language Constants in Python",

-      "scope": "constant.language.python",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Python Function Parameter and Arguments",

-      "scope": [

-        "variable.parameter.function.python",

-        "meta.function-call.arguments.python"

-      ],

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "Python Function Call",

-      "scope": [

-        "meta.function-call.python",

-        "meta.function-call.generic.python"

-      ],

-      "settings": {

-        "foreground": "#B2CCD6"

-      }

-    },

-    {

-      "name": "Punctuations in Python",

-      "scope": "punctuation.python",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Decorator Functions in Python",

-      "scope": "entity.name.function.decorator.python",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Python Language Variable",

-      "scope": "source.python variable.language.special",

-      "settings": {

-        "foreground": "#8EACE3"

-      }

-    },

-    {

-      "name": "SCSS Variable",

-      "scope": [

-        "variable.scss",

-        "variable.sass",

-        "variable.parameter.url.scss",

-        "variable.parameter.url.sass"

-      ],

-      "settings": {

-        "foreground": "#DDDDDD"

-      }

-    },

-    {

-      "name": "Variables in SASS At-Rules",

-      "scope": [

-        "source.css.scss meta.at-rule variable",

-        "source.css.sass meta.at-rule variable"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Variables in SASS At-Rules",

-      "scope": [

-        "source.css.scss meta.at-rule variable",

-        "source.css.sass meta.at-rule variable"

-      ],

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "Attribute Name for SASS",

-      "scope": [

-        "meta.attribute-selector.scss entity.other.attribute-name.attribute",

-        "meta.attribute-selector.sass entity.other.attribute-name.attribute"

-      ],

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Tag names in SASS",

-      "scope": ["entity.name.tag.scss", "entity.name.tag.sass"],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "TypeScript[React] Variables and Object Properties",

-      "scope": [

-        "variable.other.readwrite.alias.ts",

-        "variable.other.readwrite.alias.tsx",

-        "variable.other.readwrite.ts",

-        "variable.other.readwrite.tsx",

-        "variable.other.object.ts",

-        "variable.other.object.tsx",

-        "variable.object.property.ts",

-        "variable.object.property.tsx",

-        "variable.other.ts",

-        "variable.other.tsx",

-        "variable.tsx",

-        "variable.ts"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "TypeScript[React] Entity Name Types",

-      "scope": ["entity.name.type.ts", "entity.name.type.tsx"],

-      "settings": {

-        "foreground": "#78ccf0"

-      }

-    },

-    {

-      "name": "TypeScript[React] Node Classes",

-      "scope": ["support.class.node.ts", "support.class.node.tsx"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "TypeScript[React] Entity Name Types as Parameters",

-      "scope": [

-        "meta.type.parameters.ts entity.name.type",

-        "meta.type.parameters.tsx entity.name.type"

-      ],

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "TypeScript[React] Import/Export Punctuations",

-      "scope": [

-        "meta.import.ts punctuation.definition.block",

-        "meta.import.tsx punctuation.definition.block",

-        "meta.export.ts punctuation.definition.block",

-        "meta.export.tsx punctuation.definition.block"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "TypeScript[React] Punctuation Decorators",

-      "scope": [

-        "meta.decorator punctuation.decorator.ts",

-        "meta.decorator punctuation.decorator.tsx"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "TypeScript[React] Punctuation Decorators",

-      "scope": "meta.tag.js meta.jsx.children.tsx",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "YAML Entity Name Tags",

-      "scope": "entity.name.tag.yaml",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "handlebars variables",

-      "scope": "variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "handlebars parameters",

-      "scope": "entity.other.attribute-name.handlebars variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "handlebars enitity attribute names",

-      "scope": "entity.other.attribute-name.handlebars",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "handlebars enitity attribute values",

-      "scope": "entity.other.attribute-value.handlebars variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "normalize font style of certain components",

-      "scope": [

-        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js",

-        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js",

-        "meta.property-list.css meta.property-value.css variable.other.less",

-        "punctuation.section.embedded.begin.js.jsx",

-        "punctuation.section.embedded.end.js.jsx",

-        "meta.property-list.scss variable.scss",

-        "meta.property-list.sass variable.sass",

-        "keyword.operator.logical",

-        "keyword.operator.arithmetic",

-        "keyword.operator.bitwise",

-        "keyword.operator.increment",

-        "keyword.operator.ternary",

-        "keyword.operator.comparison",

-        "keyword.operator.assignment",

-        "keyword.operator.operator",

-        "keyword.operator.or.regexp",

-        "keyword.operator.expression.in",

-        "keyword.operator.type",

-        "punctuation.section.embedded.js",

-        "punctuation.definintion.string",

-        "punctuation"

-      ],

-      "settings": {

-        "fontStyle": "normal"

-      }

-    }

-  ]

-}

+{
+  "name": "Palenight (Mild Contrast)",
+  "author": "Olaolu Olawuyi",
+  "maintainers": ["Olaolu Olawuyi <mrolaolu@gmail.com>"],
+  "type": "dark",
+  "semanticClass": "palenight-mild-contrast",
+  "colors": {
+    "contrastActiveBorder": null,
+    "contrastBorder": "#2C2F40",
+    "focusBorder": "#2C2F40",
+    "foreground": "#ffffff",
+    "widget.shadow": "#232635",
+    "selection.background": "#7580B850",
+    "descriptionForeground": null,
+    "errorForeground": "#EF5350",
+    "button.background": "#7e57c2cc",
+    "button.foreground": "#ffffffcc",
+    "button.hoverBackground": "#7e57c2",
+    "dropdown.background": "#292D3E",
+    "dropdown.border": "#7e57c2",
+    "dropdown.foreground": "#ffffffcc",
+    "input.background": "#313850",
+    "input.border": "#7e57c2",
+    "input.foreground": "#ffffffcc",
+    "input.placeholderForeground": "#ffffffcc",
+    "inputOption.activeBorder": "#ffffffcc",
+    "inputValidation.errorBackground": "#ef5350f2",
+    "inputValidation.errorBorder": "#EF5350",
+    "inputValidation.infoBackground": "#64b5f6f2",
+    "inputValidation.infoBorder": "#64B5F6",
+    "inputValidation.warningBackground": "#ffca28f2",
+    "inputValidation.warningBorder": "#FFCA28",
+    "scrollbar.shadow": "#292D3E00",
+    "scrollbarSlider.activeBackground": "#694CA4cc",
+    "scrollbarSlider.background": "#694CA466",
+    "scrollbarSlider.hoverBackground": "#694CA4cc",
+    "badge.background": "#7e57c2",
+    "badge.foreground": "#ffffff",
+    "progress.background": "#7e57c2",
+    "list.activeSelectionBackground": "#7e57c2",
+    "list.activeSelectionForeground": "#ffffff",
+    "list.dropBackground": "#2E3245",
+    "list.focusBackground": "#0000002e",
+    "list.focusForeground": "#ffffff",
+    "list.highlightForeground": "#ffffff",
+    "list.hoverBackground": "#0000001a",
+    "list.hoverForeground": "#ffffff",
+    "list.inactiveSelectionBackground": "#929ac90d",
+    "list.inactiveSelectionForeground": "#929ac9",
+    "activityBar.background": "#242839",
+    "activityBar.dropBackground": "#7e57c2e3",
+    "activityBar.foreground": "#eeffff",
+    "activityBar.border": "#2E3243",
+    "activityBarBadge.background": "#7e57c2",
+    "activityBarBadge.foreground": "#ffffff",
+    "sideBar.background": "#25293A",
+    "sideBar.foreground": "#6C739A",
+    "sideBar.border": "#2C2F40",
+    "sideBarTitle.foreground": "#eeffff",
+    "sideBarSectionHeader.background": "#25293A",
+    "sideBarSectionHeader.foreground": "#eeffff",
+    "editorGroup.background": "#32374C",
+    "editorGroup.border": "#2E3245",
+    "editorGroup.dropBackground": "#7e57c273",
+    "editorGroupHeader.noTabsBackground": "#32374C",
+    "editorGroupHeader.tabsBackground": "#31364a",
+    "editorGroupHeader.tabsBorder": "#2C3041",
+    "tab.activeBackground": "#25293A",
+    "tab.activeForeground": "#eeffff",
+    "tab.border": "#272B3B",
+    "tab.activeBorder": "#2C3041",
+    "tab.unfocusedActiveBorder": "#2C3041",
+    "tab.inactiveBackground": "#31364A",
+    "tab.inactiveForeground": "#929ac9",
+    "tab.unfocusedActiveForeground": null,
+    "tab.unfocusedInactiveForeground": null,
+    "editor.background": "#292D3E",
+    "editor.foreground": "#BFC7D5",
+    "editorLineNumber.foreground": "#4c5374",
+    "editorLineNumber.activeForeground": "#eeffff",
+    "editorCursor.foreground": "#7e57c2",
+    "editorCursor.background": null,
+    "editor.selectionBackground": "#7580B850",
+    "editor.selectionHighlightBackground": "#383D51",
+    "editor.inactiveSelectionBackground": "#7e57c25a",
+    "editor.wordHighlightBackground": "#32374D",
+    "editor.wordHighlightStrongBackground": "#2E3250",
+    "editor.findMatchBackground": "#2e3248fc",
+    "editor.findMatchHighlightBackground": "#7e57c233",
+    "editor.findRangeHighlightBackground": null,
+    "editor.hoverHighlightBackground": "#7e57c25a",
+    "editor.lineHighlightBackground": "#0003",
+    "editor.lineHighlightBorder": null,
+    "editorLink.activeForeground": null,
+    "editor.rangeHighlightBackground": "#7e57c25a",
+    "editorWhitespace.foreground": null,
+    "editorIndentGuide.background": "#4E557980",
+    "editorRuler.foreground": "#4E557980",
+    "editorCodeLens.foreground": "#FFCA28",
+    "editorBracketMatch.background": null,
+    "editorBracketMatch.border": null,
+    "editorOverviewRuler.currentContentForeground": "#7e57c2",
+    "editorOverviewRuler.incomingContentForeground": "#7e57c2",
+    "editorOverviewRuler.commonContentForeground": "#7e57c2",
+    "editorError.foreground": "#EF5350",
+    "editorError.border": null,
+    "editorWarning.foreground": "#FFCA28",
+    "editorWarning.border": null,
+    "editorGutter.background": null,
+    "editorGutter.modifiedBackground": "#e2b93d",
+    "editorGutter.addedBackground": "#9CCC65",
+    "editorGutter.deletedBackground": "#EF5350",
+    "diffEditor.insertedTextBackground": "#99b76d23",
+    "diffEditor.removedTextBackground": "#ef535033",
+    "editorWidget.background": "#31364a",
+    "editorWidget.border": null,
+    "editorSuggestWidget.background": "#2C3043",
+    "editorSuggestWidget.border": "#2B2F40",
+    "editorSuggestWidget.foreground": "#bfc7d5",
+    "editorSuggestWidget.highlightForeground": "#ffffff",
+    "editorSuggestWidget.selectedBackground": "#7e57c2",
+    "editorHoverWidget.background": "#292D3E",
+    "editorHoverWidget.border": "#7e57c2",
+    "debugExceptionWidget.background": "#292D3E",
+    "debugExceptionWidget.border": "#7e57c2",
+    "editorMarkerNavigation.background": "#31364a",
+    "editorMarkerNavigationError.background": "#EF5350",
+    "editorMarkerNavigationWarning.background": "#FFCA28",
+    "peekView.border": "#7e57c2",
+    "peekViewEditor.background": "#232635",
+    "peekViewEditor.matchHighlightBackground": "#7e57c25a",
+    "peekViewResult.background": "#2E3245",
+    "peekViewResult.fileForeground": "#eeffff",
+    "peekViewResult.lineForeground": "#eeffff",
+    "peekViewResult.matchHighlightBackground": "#7e57c25a",
+    "peekViewResult.selectionBackground": "#2E3250",
+    "peekViewResult.selectionForeground": "#eeffff",
+    "peekViewTitle.background": "#292D3E",
+    "peekViewTitleDescription.foreground": "#697098",
+    "peekViewTitleLabel.foreground": "#eeffff",
+    "merge.currentHeaderBackground": "#7e57c25a",
+    "merge.currentContentBackground": null,
+    "merge.incomingHeaderBackground": "#7e57c25a",
+    "merge.incomingContentBackground": null,
+    "merge.border": null,
+    "panel.background": "#25293A",
+    "panel.border": "#2C2F40",
+    "panelTitle.activeBorder": "#7e57c2",
+    "panelTitle.activeForeground": "#eeffff",
+    "panelTitle.inactiveForeground": "#bfc7d580",
+    "statusBar.background": "#25293A",
+    "statusBar.foreground": "#676E95",
+    "statusBar.border": "#2C3041",
+    "statusBar.debuggingBackground": "#202431",
+    "statusBar.debuggingForeground": null,
+    "statusBar.debuggingBorder": "#1F2330",
+    "statusBar.noFolderForeground": null,
+    "statusBar.noFolderBackground": "#292D3E",
+    "statusBar.noFolderBorder": "#25293A",
+    "statusBarItem.activeBackground": "#202431",
+    "statusBarItem.hoverBackground": "#202431",
+    "statusBarItem.prominentBackground": "#202431",
+    "statusBarItem.prominentHoverBackground": "#202431",
+    "titleBar.activeBackground": "#25293A",
+    "titleBar.activeForeground": "#eeefff",
+    "titleBar.border": "#2C3041",
+    "titleBar.inactiveBackground": "#30364c",
+    "titleBar.inactiveForeground": null,
+    "notifications.background": "#292D3E",
+    "notifications.foreground": "#ffffffcc",
+    "notificationLink.foreground": "#80CBC4",
+    "extensionButton.prominentForeground": "#ffffffcc",
+    "extensionButton.prominentBackground": "#7e57c2cc",
+    "extensionButton.prominentHoverBackground": "#7e57c2",
+    "pickerGroup.foreground": "#d1aaff",
+    "pickerGroup.border": "#2E3245",
+    "terminal.ansiWhite": "#ffffff",
+    "terminal.ansiBlack": "#676E95",
+    "terminal.ansiBlue": "#82AAFF",
+    "terminal.ansiCyan": "#89DDFF",
+    "terminal.ansiGreen": "#a9c77d",
+    "terminal.ansiMagenta": "#C792EA",
+    "terminal.ansiRed": "#ff5572",
+    "terminal.ansiYellow": "#FFCB6B",
+    "terminal.ansiBrightWhite": "#ffffff",
+    "terminal.ansiBrightBlack": "#676E95",
+    "terminal.ansiBrightBlue": "#82AAFF",
+    "terminal.ansiBrightCyan": "#89DDFF",
+    "terminal.ansiBrightGreen": "#C3E88D",
+    "terminal.ansiBrightMagenta": "#C792EA",
+    "terminal.ansiBrightRed": "#ff5572",
+    "terminal.ansiBrightYellow": "#FFCB6B",
+    "debugToolBar.background": "#292D3E",
+    "welcomePage.buttonBackground": null,
+    "welcomePage.buttonHoverBackground": null,
+    "walkThrough.embeddedEditorBackground": "#232635",
+    "gitDecoration.modifiedResourceForeground": "#e2c08de6",
+    "gitDecoration.deletedResourceForeground": "#EF535090",
+    "gitDecoration.untrackedResourceForeground": "#a9c77dff",
+    "gitDecoration.ignoredResourceForeground": "#69709890",
+    "gitDecoration.conflictingResourceForeground": "#FFEB95CC",
+    "editorActiveLineNumber.foreground": "#eeffff",
+    "breadcrumb.foreground": "#6c739a",
+    "breadcrumb.focusForeground": "#bfc7d5",
+    "breadcrumb.activeSelectionForeground": "#eeffff",
+    "breadcrumbPicker.background": "#292D3E"
+  },
+  "tokenColors": [
+    {
+      "name": "Global settings",
+      "settings": {
+        "background": "#292D3E",
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Comment",
+      "scope": "comment",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "String",
+      "scope": "string",
+      "settings": {
+        "foreground": "#C3E88D"
+      }
+    },
+    {
+      "name": "String Quoted",
+      "scope": "string.quoted",
+      "settings": {
+        "foreground": "#C3E88D"
+      }
+    },
+    {
+      "name": "String Unquoted",
+      "scope": "string.unquoted",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Support Constant Math",
+      "scope": "support.constant.math",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Number",
+      "scope": ["constant.numeric", "constant.character.numeric"],
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Built-in constant",
+      "scope": [
+        "constant.language",
+        "punctuation.definition.constant",
+        "variable.other.constant"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "User-defined constant",
+      "scope": ["constant.character", "constant.other"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Constant Character Escape",
+      "scope": "constant.character.escape",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "RegExp String",
+      "scope": ["string.regexp", "string.regexp keyword.other"],
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Comma in functions",
+      "scope": "meta.function punctuation.separator.comma",
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "Variable",
+      "scope": "variable",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Keyword",
+      "scope": ["punctuation.accessor", "keyword"],
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Storage",
+      "scope": [
+        "storage",
+        "storage.type",
+        "meta.var.expr storage.type",
+        "storage.type.property.js",
+        "storage.type.property.ts",
+        "storage.type.property.tsx",
+        "meta.class meta.method.declaration meta.var.expr storage.type.js"
+      ],
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": ["entity.name.class", "meta.class entity.name.type.class"],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Inherited class",
+      "scope": "entity.other.inherited-class",
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Function name",
+      "scope": "entity.name.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Function Parameters",
+      "scope": "variable.parameter",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "Meta Tag",
+      "scope": ["punctuation.definition.tag", "meta.tag"],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "HTML Tag names",
+      "scope": [
+        "entity.name.tag support.class.component",
+        "meta.tag.other.html",
+        "meta.tag.other.js",
+        "meta.tag.other.tsx",
+        "entity.name.tag.tsx",
+        "entity.name.tag.js",
+        "entity.name.tag",
+        "meta.tag.js",
+        "meta.tag.tsx",
+        "meta.tag.html"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Tag attribute",
+      "scope": "entity.other.attribute-name",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Entity Name Tag Custom",
+      "scope": "entity.name.tag.custom",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Library (function & constant)",
+      "scope": ["support.function", "support.constant"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Support Constant Property Value meta",
+      "scope": "support.constant.meta.property-value",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Library class/type",
+      "scope": ["support.type", "support.class"],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Support Variable DOM",
+      "scope": "support.variable.dom",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Invalid",
+      "scope": "invalid",
+      "settings": {
+        "background": "#ff2c83",
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Invalid deprecated",
+      "scope": "invalid.deprecated",
+      "settings": {
+        "foreground": "#ffffff",
+        "background": "#d3423e"
+      }
+    },
+    {
+      "name": "Keyword Operator",
+      "scope": "keyword.operator",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Relational",
+      "scope": "keyword.operator.relational",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Keyword Operator Assignment",
+      "scope": "keyword.operator.assignment",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Double-Slashed Comment",
+      "scope": "comment.line.double-slash",
+      "settings": {
+        "foreground": "#697098"
+      }
+    },
+    {
+      "name": "Object",
+      "scope": "object",
+      "settings": {
+        "foreground": "#cdebf7"
+      }
+    },
+    {
+      "name": "Null",
+      "scope": "constant.language.null",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Meta Brace",
+      "scope": "meta.brace",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Meta Delimiter Period",
+      "scope": "meta.delimiter.period",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Punctuation Definition String",
+      "scope": "punctuation.definition.string",
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Boolean",
+      "scope": "constant.language.boolean",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Object Comma",
+      "scope": "object.comma",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Variable Parameter Function",
+      "scope": "variable.parameter.function",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Support Type Property Name & entity name tags",
+      "scope": [
+        "support.type.vendored.property-name",
+        "support.constant.vendored.property-value",
+        "support.type.property-name",
+        "meta.property-list entity.name.tag"
+      ],
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Entity Name tag reference in stylesheets",
+      "scope": "meta.property-list entity.name.tag.reference",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Constant Other Color RGB Value Punctuation Definition Constant",
+      "scope": "constant.other.color.rgb-value punctuation.definition.constant",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Constant Other Color",
+      "scope": "constant.other.color",
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Keyword Other Unit",
+      "scope": "keyword.other.unit",
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Meta Selector",
+      "scope": "meta.selector",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Entity Other Attribute Name Id",
+      "scope": "entity.other.attribute-name.id",
+      "settings": {
+        "foreground": "#FAD430"
+      }
+    },
+    {
+      "name": "Meta Property Name",
+      "scope": "meta.property-name",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Doctypes",
+      "scope": ["entity.name.tag.doctype", "meta.tag.sgml.doctype"],
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Punctuation Definition Parameters",
+      "scope": "punctuation.definition.parameters",
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Keyword Control Operator",
+      "scope": "keyword.control.operator",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Logical",
+      "scope": "keyword.operator.logical",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Variable Instances",
+      "scope": [
+        "variable.instance",
+        "variable.other.instance",
+        "variable.reaedwrite.instance",
+        "variable.other.readwrite.instance"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Variable Property Other",
+      "scope": ["variable.other.property", "variable.other.object.property"],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Entity Name Function",
+      "scope": "entity.name.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Comparison",
+      "scope": "keyword.operator.comparison",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Support Constant, `new` keyword, Special Method Keyword",
+      "scope": [
+        "support.constant",
+        "keyword.other.special-method",
+        "keyword.other.new"
+      ],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Support Function",
+      "scope": "support.function",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Invalid Broken",
+      "scope": "invalid.broken",
+      "settings": {
+        "foreground": "#020e14",
+        "background": "#F78C6C"
+      }
+    },
+    {
+      "name": "Invalid Unimplemented",
+      "scope": "invalid.unimplemented",
+      "settings": {
+        "background": "#8BD649",
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Invalid Illegal",
+      "scope": "invalid.illegal",
+      "settings": {
+        "foreground": "#ffffff",
+        "background": "#ec5f67"
+      }
+    },
+    {
+      "name": "Language Variable",
+      "scope": "variable.language",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Support Variable Property",
+      "scope": "support.variable.property",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Variable Function",
+      "scope": "variable.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Variable Interpolation",
+      "scope": "variable.interpolation",
+      "settings": {
+        "foreground": "#ec5f67"
+      }
+    },
+    {
+      "name": "Meta Function Call",
+      "scope": "meta.function-call",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Punctuation Section Embedded",
+      "scope": "punctuation.section.embedded",
+      "settings": {
+        "foreground": "#d3423e"
+      }
+    },
+    {
+      "name": "Punctuation Tweaks",
+      "scope": [
+        "punctuation.terminator.expression",
+        "punctuation.definition.arguments",
+        "punctuation.definition.array",
+        "punctuation.section.array",
+        "meta.array"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "More Punctuation Tweaks",
+      "scope": [
+        "punctuation.definition.list.begin",
+        "punctuation.definition.list.end",
+        "punctuation.separator.arguments",
+        "punctuation.definition.list"
+      ],
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Template Strings",
+      "scope": "string.template meta.template.expression",
+      "settings": {
+        "foreground": "#d3423e"
+      }
+    },
+    {
+      "name": "Backtics(``) in Template Strings",
+      "scope": "string.template punctuation.definition.string",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Italics",
+      "scope": "italic",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "bold",
+      "settings": {
+        "foreground": "#ffcb6b",
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Quote",
+      "scope": "quote",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Raw Code",
+      "scope": "raw",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "CoffeScript Variable Assignment",
+      "scope": "variable.assignment.coffee",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "CoffeScript Parameter Function",
+      "scope": "variable.parameter.function.coffee",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "CoffeeScript Assignments",
+      "scope": "variable.assignment.coffee",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "C# Readwrite Variables",
+      "scope": "variable.other.readwrite.cs",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "C# Classes & Storage types",
+      "scope": ["entity.name.type.class.cs", "storage.type.cs"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "C# Namespaces",
+      "scope": "entity.name.type.namespace.cs",
+      "settings": {
+        "foreground": "#B2CCD6"
+      }
+    },
+    {
+      "name": "Tag names in Stylesheets",
+      "scope": [
+        "entity.name.tag.css",
+        "entity.name.tag.less",
+        "entity.name.tag.custom.css"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Wildcard(*) selector in Stylesheets",
+      "scope": [
+        "entity.name.tag.wildcard.css",
+        "entity.name.tag.wildcard.less",
+        "entity.name.tag.wildcard.scss",
+        "entity.name.tag.wildcard.sass"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "(C|SC|SA|LE)SS property value unit",
+      "scope": [
+        "keyword.other.unit.css",
+        "constant.length.units.css",
+        "keyword.other.unit.less",
+        "constant.length.units.less",
+        "keyword.other.unit.scss",
+        "constant.length.units.scss",
+        "keyword.other.unit.sass",
+        "constant.length.units.sass"
+      ],
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Attribute Name for CSS",
+      "scope": "meta.attribute-selector.css entity.other.attribute-name.attribute",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "punctuations in styled components",
+      "scope": [
+        "source.js source.css meta.property-list",
+        "source.js source.css punctuation.section",
+        "source.js source.css punctuation.terminator.rule",
+        "source.js source.css punctuation.definition.entity.end.bracket",
+        "source.js source.css punctuation.definition.entity.begin.bracket",
+        "source.js source.css punctuation.separator.key-value",
+        "source.js source.css punctuation.definition.attribute-selector",
+        "source.js source.css meta.property-list",
+        "source.js source.css meta.property-list punctuation.separator.comma",
+        "source.ts source.css punctuation.section",
+        "source.ts source.css punctuation.terminator.rule",
+        "source.ts source.css punctuation.definition.entity.end.bracket",
+        "source.ts source.css punctuation.definition.entity.begin.bracket",
+        "source.ts source.css punctuation.separator.key-value",
+        "source.ts source.css punctuation.definition.attribute-selector",
+        "source.ts source.css meta.property-list",
+        "source.ts source.css meta.property-list punctuation.separator.comma"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Elixir Classes",
+      "scope": [
+        "source.elixir support.type.elixir",
+        "source.elixir meta.module.elixir entity.name.class.elixir"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Elixir Functions",
+      "scope": "source.elixir entity.name.function",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Elixir Constants",
+      "scope": [
+        "source.elixir constant.other.symbol.elixir",
+        "source.elixir constant.other.keywords.elixir"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Elixir String Punctuations",
+      "scope": "source.elixir punctuation.definition.string",
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Elixir",
+      "scope": [
+        "source.elixir variable.other.readwrite.module.elixir",
+        "source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir"
+      ],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Elixir Binary Punctuations",
+      "scope": "source.elixir .punctuation.binary.elixir",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Go Function Calls",
+      "scope": "source.go meta.function-call.go",
+      "settings": {
+        "foreground": "#DDDDDD"
+      }
+    },
+    {
+      "name": "GraphQL Variables",
+      "scope": "variable.qraphql",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "ID Attribute Name in HTML",
+      "scope": "entity.other.attribute-name.id.html",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "HTML Punctuation Definition Tag",
+      "scope": "punctuation.definition.tag.html",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "HTML Doctype",
+      "scope": "meta.tag.sgml.doctype.html",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "JavaScript Classes",
+      "scope": "meta.class entity.name.type.class.js",
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "JavaScript Method Declaration e.g. `constructor`",
+      "scope": "meta.method.declaration storage.type.js",
+      "settings": {
+        "foreground": "#82AAFF",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "JavaScript Terminator",
+      "scope": "terminator.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Meta Punctuation Definition",
+      "scope": "meta.js punctuation.definition.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Entity Names in Code Documentations",
+      "scope": [
+        "entity.name.type.instance.jsdoc",
+        "entity.name.type.instance.phpdoc"
+      ],
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "Other Variables in Code Documentations",
+      "scope": ["variable.other.jsdoc", "variable.other.phpdoc"],
+      "settings": {
+        "foreground": "#78ccf0"
+      }
+    },
+    {
+      "name": "JavaScript module imports and exports",
+      "scope": [
+        "variable.other.meta.import.js",
+        "meta.import.js variable.other",
+        "variable.other.meta.export.js",
+        "meta.export.js variable.other"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Variable Parameter Function",
+      "scope": "variable.parameter.function.js",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "JavaScript Variable Other ReadWrite",
+      "scope": "variable.other.readwrite.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Text nested in React tags",
+      "scope": [
+        "meta.jsx.children",
+        "meta.jsx.children.js",
+        "meta.jsx.children.tsx"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript[React] Variable Other Object",
+      "scope": [
+        "variable.other.object.js",
+        "variable.other.object.jsx",
+        "meta.object-literal.key.js",
+        "meta.object-literal.key.jsx",
+        "variable.object.property.js",
+        "variable.object.property.jsx"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Variables",
+      "scope": ["variable.js", "variable.other.js"],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Entity Name Type",
+      "scope": ["entity.name.type.js", "entity.name.type.module.js"],
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "JavaScript Support Classes",
+      "scope": "support.class.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JSON Property Names",
+      "scope": "support.type.property-name.json",
+      "settings": {
+        "foreground": "#C3E88D",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "JSON Support Constants",
+      "scope": "support.constant.json",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "JSON Property values (string)",
+      "scope": "meta.structure.dictionary.value.json string.quoted.double",
+      "settings": {
+        "foreground": "#80CBC4",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "Strings in JSON values",
+      "scope": "string.quoted.double.json punctuation.definition.string.json",
+      "settings": {
+        "foreground": "#80CBC4",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "Specific JSON Property values like null",
+      "scope": "meta.structure.dictionary.json meta.structure.dictionary.value constant.language",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Ruby Variables",
+      "scope": "variable.other.ruby",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Ruby Hashkeys",
+      "scope": "constant.language.symbol.hashkey.ruby",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "LESS Tag names",
+      "scope": "entity.name.tag.less",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Attribute Name for LESS",
+      "scope": "meta.attribute-selector.less entity.other.attribute-name.attribute",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Markup Headings",
+      "scope": "markup.heading",
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Markup Italics",
+      "scope": "markup.italic",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markup Bold",
+      "scope": "markup.bold",
+      "settings": {
+        "foreground": "#ffcb6b",
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Markup Quote + others",
+      "scope": "markup.quote",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markup Raw Code + others",
+      "scope": "markup.inline.raw",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Markup Links",
+      "scope": ["markup.underline.link", "markup.underline.link.image"],
+      "settings": {
+        "foreground": "#ff869a"
+      }
+    },
+    {
+      "name": "Markup Attributes",
+      "scope": ["markup.meta.attribute-list"],
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Markup Admonitions",
+      "scope": "markup.admonition",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Markup Lists",
+      "scope": "markup.list.bullet",
+      "settings": {
+        "foreground": "#D9F5DD"
+      }
+    },
+    {
+      "name": "Markup Superscript and Subscript",
+      "scope": ["markup.superscript", "markup.subscript"],
+      "settings": {
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markdown Link Title and Description",
+      "scope": [
+        "string.other.link.title.markdown",
+        "string.other.link.description.markdown"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Markdown Punctuation",
+      "scope": [
+        "punctuation.definition.string.markdown",
+        "punctuation.definition.string.begin.markdown",
+        "punctuation.definition.string.end.markdown",
+        "meta.link.inline.markdown punctuation.definition.string"
+      ],
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Markdown MetaData Punctuation",
+      "scope": ["punctuation.definition.metadata.markdown"],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Markdown List Punctuation",
+      "scope": ["beginning.punctuation.definition.list.markdown"],
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Asciidoc Function",
+      "scope": "entity.name.function.asciidoc",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "PHP Variables",
+      "scope": "variable.other.php",
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "Support Classes in PHP",
+      "scope": "support.class.php",
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "Punctuations in PHP function calls",
+      "scope": "meta.function-call.php punctuation",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "PHP Global Variables",
+      "scope": "variable.other.global.php",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Declaration Punctuation in PHP Global Variables",
+      "scope": "variable.other.global.php punctuation.definition.variable",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Language Constants in Python",
+      "scope": "constant.language.python",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Python Function Parameter and Arguments",
+      "scope": [
+        "variable.parameter.function.python",
+        "meta.function-call.arguments.python"
+      ],
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "Python Function Call",
+      "scope": [
+        "meta.function-call.python",
+        "meta.function-call.generic.python"
+      ],
+      "settings": {
+        "foreground": "#B2CCD6"
+      }
+    },
+    {
+      "name": "Punctuations in Python",
+      "scope": "punctuation.python",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Decorator Functions in Python",
+      "scope": "entity.name.function.decorator.python",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Python Language Variable",
+      "scope": "source.python variable.language.special",
+      "settings": {
+        "foreground": "#8EACE3"
+      }
+    },
+    {
+      "name": "SCSS Variable",
+      "scope": [
+        "variable.scss",
+        "variable.sass",
+        "variable.parameter.url.scss",
+        "variable.parameter.url.sass"
+      ],
+      "settings": {
+        "foreground": "#DDDDDD"
+      }
+    },
+    {
+      "name": "Variables in SASS At-Rules",
+      "scope": [
+        "source.css.scss meta.at-rule variable",
+        "source.css.sass meta.at-rule variable"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Variables in SASS At-Rules",
+      "scope": [
+        "source.css.scss meta.at-rule variable",
+        "source.css.sass meta.at-rule variable"
+      ],
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "Attribute Name for SASS",
+      "scope": [
+        "meta.attribute-selector.scss entity.other.attribute-name.attribute",
+        "meta.attribute-selector.sass entity.other.attribute-name.attribute"
+      ],
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Tag names in SASS",
+      "scope": ["entity.name.tag.scss", "entity.name.tag.sass"],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "TypeScript[React] Variables and Object Properties",
+      "scope": [
+        "variable.other.readwrite.alias.ts",
+        "variable.other.readwrite.alias.tsx",
+        "variable.other.readwrite.ts",
+        "variable.other.readwrite.tsx",
+        "variable.other.object.ts",
+        "variable.other.object.tsx",
+        "variable.object.property.ts",
+        "variable.object.property.tsx",
+        "variable.other.ts",
+        "variable.other.tsx",
+        "variable.tsx",
+        "variable.ts"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "TypeScript[React] Entity Name Types",
+      "scope": ["entity.name.type.ts", "entity.name.type.tsx"],
+      "settings": {
+        "foreground": "#78ccf0"
+      }
+    },
+    {
+      "name": "TypeScript[React] Node Classes",
+      "scope": ["support.class.node.ts", "support.class.node.tsx"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "TypeScript[React] Entity Name Types as Parameters",
+      "scope": [
+        "meta.type.parameters.ts entity.name.type",
+        "meta.type.parameters.tsx entity.name.type"
+      ],
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "TypeScript[React] Import/Export Punctuations",
+      "scope": [
+        "meta.import.ts punctuation.definition.block",
+        "meta.import.tsx punctuation.definition.block",
+        "meta.export.ts punctuation.definition.block",
+        "meta.export.tsx punctuation.definition.block"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "TypeScript[React] Punctuation Decorators",
+      "scope": [
+        "meta.decorator punctuation.decorator.ts",
+        "meta.decorator punctuation.decorator.tsx"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "TypeScript[React] Punctuation Decorators",
+      "scope": "meta.tag.js meta.jsx.children.tsx",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "YAML Entity Name Tags",
+      "scope": "entity.name.tag.yaml",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "handlebars variables",
+      "scope": "variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "handlebars parameters",
+      "scope": "entity.other.attribute-name.handlebars variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "handlebars enitity attribute names",
+      "scope": "entity.other.attribute-name.handlebars",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "handlebars enitity attribute values",
+      "scope": "entity.other.attribute-value.handlebars variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "normalize font style of certain components",
+      "scope": [
+        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js",
+        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js",
+        "meta.property-list.css meta.property-value.css variable.other.less",
+        "punctuation.section.embedded.begin.js.jsx",
+        "punctuation.section.embedded.end.js.jsx",
+        "meta.property-list.scss variable.scss",
+        "meta.property-list.sass variable.sass",
+        "keyword.operator.logical",
+        "keyword.operator.arithmetic",
+        "keyword.operator.bitwise",
+        "keyword.operator.increment",
+        "keyword.operator.ternary",
+        "keyword.operator.comparison",
+        "keyword.operator.assignment",
+        "keyword.operator.operator",
+        "keyword.operator.or.regexp",
+        "keyword.operator.expression.in",
+        "keyword.operator.type",
+        "punctuation.section.embedded.js",
+        "punctuation.definintion.string",
+        "punctuation"
+      ],
+      "settings": {
+        "fontStyle": "normal"
+      }
+    }
+  ]
+}

assets/themes/src/vscode/palenight/palenight-operator.json 🔗

@@ -1,1640 +1,1640 @@
-{

-  "name": "Palenight Operator",

-  "author": "Olaolu Olawuyi",

-  "maintainers": ["Olaolu Olawuyi <mrolaolu@gmail.com>"],

-  "type": "dark",

-  "semanticClass": "palenight-operator",

-  "colors": {

-    "contrastActiveBorder": null,

-    "contrastBorder": "#282B3C",

-    "focusBorder": "#282B3C",

-    "foreground": "#ffffff",

-    "widget.shadow": "#232635",

-    "selection.background": "#7580B850",

-    "descriptionForeground": null,

-    "errorForeground": "#EF5350",

-    "button.background": "#7e57c2cc",

-    "button.foreground": "#ffffffcc",

-    "button.hoverBackground": "#7e57c2",

-    "dropdown.background": "#292D3E",

-    "dropdown.border": "#7e57c2",

-    "dropdown.foreground": "#ffffffcc",

-    "input.background": "#313850",

-    "input.border": "#7e57c2",

-    "input.foreground": "#ffffffcc",

-    "input.placeholderForeground": "#ffffffcc",

-    "inputOption.activeBorder": "#ffffffcc",

-    "inputValidation.errorBackground": "#ef5350f2",

-    "inputValidation.errorBorder": "#EF5350",

-    "inputValidation.infoBackground": "#64b5f6f2",

-    "inputValidation.infoBorder": "#64B5F6",

-    "inputValidation.warningBackground": "#ffca28f2",

-    "inputValidation.warningBorder": "#FFCA28",

-    "scrollbar.shadow": "#292D3E00",

-    "scrollbarSlider.activeBackground": "#694CA4cc",

-    "scrollbarSlider.background": "#694CA466",

-    "scrollbarSlider.hoverBackground": "#694CA4cc",

-    "badge.background": "#7e57c2",

-    "badge.foreground": "#ffffff",

-    "progress.background": "#7e57c2",

-    "list.activeSelectionBackground": "#7e57c2",

-    "list.activeSelectionForeground": "#ffffff",

-    "list.dropBackground": "#2E3245",

-    "list.focusBackground": "#0000002e",

-    "list.focusForeground": "#ffffff",

-    "list.highlightForeground": "#ffffff",

-    "list.hoverBackground": "#0000001a",

-    "list.hoverForeground": "#ffffff",

-    "list.inactiveSelectionBackground": "#929ac90d",

-    "list.inactiveSelectionForeground": "#929ac9",

-    "activityBar.background": "#282C3D",

-    "activityBar.dropBackground": "#7e57c2e3",

-    "activityBar.foreground": "#eeffff",

-    "activityBar.border": "#282C3D",

-    "activityBarBadge.background": "#7e57c2",

-    "activityBarBadge.foreground": "#ffffff",

-    "sideBar.background": "#292D3E",

-    "sideBar.foreground": "#6C739A",

-    "sideBar.border": "#282B3C",

-    "sideBarTitle.foreground": "#eeffff",

-    "sideBarSectionHeader.background": "#292D3E",

-    "sideBarSectionHeader.foreground": "#eeffff",

-    "editorGroup.background": "#32374C",

-    "editorGroup.border": "#2E3245",

-    "editorGroup.dropBackground": "#7e57c273",

-    "editorGroupHeader.noTabsBackground": "#32374C",

-    "editorGroupHeader.tabsBackground": "#31364a",

-    "editorGroupHeader.tabsBorder": "#262A39",

-    "tab.activeBackground": "#292D3E",

-    "tab.activeForeground": "#eeffff",

-    "tab.border": "#272B3B",

-    "tab.activeBorder": "#262A39",

-    "tab.unfocusedActiveBorder": "#262A39",

-    "tab.inactiveBackground": "#31364A",

-    "tab.inactiveForeground": "#929ac9",

-    "tab.unfocusedActiveForeground": null,

-    "tab.unfocusedInactiveForeground": null,

-    "editor.background": "#292D3E",

-    "editor.foreground": "#BFC7D5",

-    "editorLineNumber.foreground": "#4c5374",

-    "editorLineNumber.activeForeground": "#eeffff",

-    "editorCursor.foreground": "#7e57c2",

-    "editorCursor.background": null,

-    "editor.selectionBackground": "#7580B850",

-    "editor.selectionHighlightBackground": "#383D51",

-    "editor.inactiveSelectionBackground": "#7e57c25a",

-    "editor.wordHighlightBackground": "#32374D",

-    "editor.wordHighlightStrongBackground": "#2E3250",

-    "editor.findMatchBackground": "#2e3248fc",

-    "editor.findMatchHighlightBackground": "#7e57c233",

-    "editor.findRangeHighlightBackground": null,

-    "editor.hoverHighlightBackground": "#7e57c25a",

-    "editor.lineHighlightBackground": "#0003",

-    "editor.lineHighlightBorder": null,

-    "editorLink.activeForeground": null,

-    "editor.rangeHighlightBackground": "#7e57c25a",

-    "editorWhitespace.foreground": null,

-    "editorIndentGuide.background": "#4E557980",

-    "editorRuler.foreground": "#4E557980",

-    "editorCodeLens.foreground": "#FFCA28",

-    "editorBracketMatch.background": null,

-    "editorBracketMatch.border": null,

-    "editorOverviewRuler.currentContentForeground": "#7e57c2",

-    "editorOverviewRuler.incomingContentForeground": "#7e57c2",

-    "editorOverviewRuler.commonContentForeground": "#7e57c2",

-    "editorError.foreground": "#EF5350",

-    "editorError.border": null,

-    "editorWarning.foreground": "#FFCA28",

-    "editorWarning.border": null,

-    "editorGutter.background": null,

-    "editorGutter.modifiedBackground": "#e2b93d",

-    "editorGutter.addedBackground": "#9CCC65",

-    "editorGutter.deletedBackground": "#EF5350",

-    "diffEditor.insertedTextBackground": "#99b76d23",

-    "diffEditor.removedTextBackground": "#ef535033",

-    "editorWidget.background": "#31364a",

-    "editorWidget.border": null,

-    "editorSuggestWidget.background": "#2C3043",

-    "editorSuggestWidget.border": "#2B2F40",

-    "editorSuggestWidget.foreground": "#bfc7d5",

-    "editorSuggestWidget.highlightForeground": "#ffffff",

-    "editorSuggestWidget.selectedBackground": "#7e57c2",

-    "editorHoverWidget.background": "#292D3E",

-    "editorHoverWidget.border": "#7e57c2",

-    "debugExceptionWidget.background": "#292D3E",

-    "debugExceptionWidget.border": "#7e57c2",

-    "editorMarkerNavigation.background": "#31364a",

-    "editorMarkerNavigationError.background": "#EF5350",

-    "editorMarkerNavigationWarning.background": "#FFCA28",

-    "peekView.border": "#7e57c2",

-    "peekViewEditor.background": "#232635",

-    "peekViewEditor.matchHighlightBackground": "#7e57c25a",

-    "peekViewResult.background": "#2E3245",

-    "peekViewResult.fileForeground": "#eeffff",

-    "peekViewResult.lineForeground": "#eeffff",

-    "peekViewResult.matchHighlightBackground": "#7e57c25a",

-    "peekViewResult.selectionBackground": "#2E3250",

-    "peekViewResult.selectionForeground": "#eeffff",

-    "peekViewTitle.background": "#292D3E",

-    "peekViewTitleDescription.foreground": "#697098",

-    "peekViewTitleLabel.foreground": "#eeffff",

-    "merge.currentHeaderBackground": "#7e57c25a",

-    "merge.currentContentBackground": null,

-    "merge.incomingHeaderBackground": "#7e57c25a",

-    "merge.incomingContentBackground": null,

-    "merge.border": null,

-    "panel.background": "#292D3E",

-    "panel.border": "#282B3C",

-    "panelTitle.activeBorder": "#7e57c2",

-    "panelTitle.activeForeground": "#eeffff",

-    "panelTitle.inactiveForeground": "#bfc7d580",

-    "statusBar.background": "#282C3D",

-    "statusBar.foreground": "#676E95",

-    "statusBar.border": "#262A39",

-    "statusBar.debuggingBackground": "#202431",

-    "statusBar.debuggingForeground": null,

-    "statusBar.debuggingBorder": "#1F2330",

-    "statusBar.noFolderForeground": null,

-    "statusBar.noFolderBackground": "#292D3E",

-    "statusBar.noFolderBorder": "#25293A",

-    "statusBarItem.activeBackground": "#202431",

-    "statusBarItem.hoverBackground": "#202431",

-    "statusBarItem.prominentBackground": "#202431",

-    "statusBarItem.prominentHoverBackground": "#202431",

-    "titleBar.activeBackground": "#292d3e",

-    "titleBar.activeForeground": "#eeefff",

-    "titleBar.border": "#30364c",

-    "titleBar.inactiveBackground": "#30364c",

-    "titleBar.inactiveForeground": null,

-    "notifications.background": "#292D3E",

-    "notifications.foreground": "#ffffffcc",

-    "notificationLink.foreground": "#80CBC4",

-    "extensionButton.prominentForeground": "#ffffffcc",

-    "extensionButton.prominentBackground": "#7e57c2cc",

-    "extensionButton.prominentHoverBackground": "#7e57c2",

-    "pickerGroup.foreground": "#d1aaff",

-    "pickerGroup.border": "#2E3245",

-    "terminal.ansiWhite": "#ffffff",

-    "terminal.ansiBlack": "#676E95",

-    "terminal.ansiBlue": "#82AAFF",

-    "terminal.ansiCyan": "#89DDFF",

-    "terminal.ansiGreen": "#a9c77d",

-    "terminal.ansiMagenta": "#C792EA",

-    "terminal.ansiRed": "#ff5572",

-    "terminal.ansiYellow": "#FFCB6B",

-    "terminal.ansiBrightWhite": "#ffffff",

-    "terminal.ansiBrightBlack": "#676E95",

-    "terminal.ansiBrightBlue": "#82AAFF",

-    "terminal.ansiBrightCyan": "#89DDFF",

-    "terminal.ansiBrightGreen": "#C3E88D",

-    "terminal.ansiBrightMagenta": "#C792EA",

-    "terminal.ansiBrightRed": "#ff5572",

-    "terminal.ansiBrightYellow": "#FFCB6B",

-    "debugToolBar.background": "#292D3E",

-    "welcomePage.buttonBackground": null,

-    "welcomePage.buttonHoverBackground": null,

-    "walkThrough.embeddedEditorBackground": "#232635",

-    "gitDecoration.modifiedResourceForeground": "#e2c08de6",

-    "gitDecoration.deletedResourceForeground": "#EF535090",

-    "gitDecoration.untrackedResourceForeground": "#a9c77dff",

-    "gitDecoration.ignoredResourceForeground": "#69709890",

-    "gitDecoration.conflictingResourceForeground": "#FFEB95CC",

-    "editorActiveLineNumber.foreground": "#eeffff",

-    "breadcrumb.foreground": "#6c739a",

-    "breadcrumb.focusForeground": "#bfc7d5",

-    "breadcrumb.activeSelectionForeground": "#eeffff",

-    "breadcrumbPicker.background": "#292D3E"

-  },

-  "tokenColors": [

-    {

-      "name": "Global settings",

-      "settings": {

-        "background": "#292D3E",

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Comment",

-      "scope": "comment",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "String",

-      "scope": "string",

-      "settings": {

-        "foreground": "#C3E88D"

-      }

-    },

-    {

-      "name": "String Quoted",

-      "scope": "string.quoted",

-      "settings": {

-        "foreground": "#C3E88D"

-      }

-    },

-    {

-      "name": "String Unquoted",

-      "scope": "string.unquoted",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Support Constant Math",

-      "scope": "support.constant.math",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Number",

-      "scope": ["constant.numeric", "constant.character.numeric"],

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Built-in constant",

-      "scope": [

-        "constant.language",

-        "punctuation.definition.constant",

-        "variable.other.constant"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "User-defined constant",

-      "scope": ["constant.character", "constant.other"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Constant Character Escape",

-      "scope": "constant.character.escape",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "RegExp String",

-      "scope": ["string.regexp", "string.regexp keyword.other"],

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Comma in functions",

-      "scope": "meta.function punctuation.separator.comma",

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "Variable",

-      "scope": "variable",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Keyword",

-      "scope": ["punctuation.accessor", "keyword"],

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Storage",

-      "scope": [

-        "storage",

-        "storage.type",

-        "meta.var.expr storage.type",

-        "storage.type.property.js",

-        "storage.type.property.ts",

-        "storage.type.property.tsx",

-        "meta.class meta.method.declaration meta.var.expr storage.type.js"

-      ],

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Class name",

-      "scope": ["entity.name.class", "meta.class entity.name.type.class"],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Inherited class",

-      "scope": "entity.other.inherited-class",

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Function name",

-      "scope": "entity.name.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Function Parameters",

-      "scope": "variable.parameter",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "Meta Tag",

-      "scope": ["punctuation.definition.tag", "meta.tag"],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "HTML Tag names",

-      "scope": [

-        "entity.name.tag support.class.component",

-        "meta.tag.other.html",

-        "meta.tag.other.js",

-        "meta.tag.other.tsx",

-        "entity.name.tag.tsx",

-        "entity.name.tag.js",

-        "entity.name.tag",

-        "meta.tag.js",

-        "meta.tag.tsx",

-        "meta.tag.html"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Tag attribute",

-      "scope": "entity.other.attribute-name",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Entity Name Tag Custom",

-      "scope": "entity.name.tag.custom",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Library (function & constant)",

-      "scope": ["support.function", "support.constant"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Support Constant Property Value meta",

-      "scope": "support.constant.meta.property-value",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Library class/type",

-      "scope": ["support.type", "support.class"],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Support Variable DOM",

-      "scope": "support.variable.dom",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Invalid",

-      "scope": "invalid",

-      "settings": {

-        "background": "#ff2c83",

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Invalid deprecated",

-      "scope": "invalid.deprecated",

-      "settings": {

-        "foreground": "#ffffff",

-        "background": "#d3423e"

-      }

-    },

-    {

-      "name": "Keyword Operator",

-      "scope": "keyword.operator",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Relational",

-      "scope": "keyword.operator.relational",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Keyword Operator Assignment",

-      "scope": "keyword.operator.assignment",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Double-Slashed Comment",

-      "scope": "comment.line.double-slash",

-      "settings": {

-        "foreground": "#697098"

-      }

-    },

-    {

-      "name": "Object",

-      "scope": "object",

-      "settings": {

-        "foreground": "#cdebf7"

-      }

-    },

-    {

-      "name": "Null",

-      "scope": "constant.language.null",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Meta Brace",

-      "scope": "meta.brace",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Meta Delimiter Period",

-      "scope": "meta.delimiter.period",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Punctuation Definition String",

-      "scope": "punctuation.definition.string",

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Boolean",

-      "scope": "constant.language.boolean",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Object Comma",

-      "scope": "object.comma",

-      "settings": {

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Variable Parameter Function",

-      "scope": "variable.parameter.function",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Support Type Property Name & entity name tags",

-      "scope": [

-        "support.type.vendored.property-name",

-        "support.constant.vendored.property-value",

-        "support.type.property-name",

-        "meta.property-list entity.name.tag"

-      ],

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Entity Name tag reference in stylesheets",

-      "scope": "meta.property-list entity.name.tag.reference",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Constant Other Color RGB Value Punctuation Definition Constant",

-      "scope": "constant.other.color.rgb-value punctuation.definition.constant",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Constant Other Color",

-      "scope": "constant.other.color",

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Keyword Other Unit",

-      "scope": "keyword.other.unit",

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Meta Selector",

-      "scope": "meta.selector",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Entity Other Attribute Name Id",

-      "scope": "entity.other.attribute-name.id",

-      "settings": {

-        "foreground": "#FAD430"

-      }

-    },

-    {

-      "name": "Meta Property Name",

-      "scope": "meta.property-name",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Doctypes",

-      "scope": ["entity.name.tag.doctype", "meta.tag.sgml.doctype"],

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Punctuation Definition Parameters",

-      "scope": "punctuation.definition.parameters",

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Keyword Control Operator",

-      "scope": "keyword.control.operator",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Logical",

-      "scope": "keyword.operator.logical",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Variable Instances",

-      "scope": [

-        "variable.instance",

-        "variable.other.instance",

-        "variable.reaedwrite.instance",

-        "variable.other.readwrite.instance"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Variable Property Other",

-      "scope": ["variable.other.property", "variable.other.object.property"],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Entity Name Function",

-      "scope": "entity.name.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Comparison",

-      "scope": "keyword.operator.comparison",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Support Constant, `new` keyword, Special Method Keyword",

-      "scope": [

-        "support.constant",

-        "keyword.other.special-method",

-        "keyword.other.new"

-      ],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Support Function",

-      "scope": "support.function",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Invalid Broken",

-      "scope": "invalid.broken",

-      "settings": {

-        "foreground": "#020e14",

-        "background": "#F78C6C"

-      }

-    },

-    {

-      "name": "Invalid Unimplemented",

-      "scope": "invalid.unimplemented",

-      "settings": {

-        "background": "#8BD649",

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Invalid Illegal",

-      "scope": "invalid.illegal",

-      "settings": {

-        "foreground": "#ffffff",

-        "background": "#ec5f67"

-      }

-    },

-    {

-      "name": "Language Variable",

-      "scope": "variable.language",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Support Variable Property",

-      "scope": "support.variable.property",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Variable Function",

-      "scope": "variable.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Variable Interpolation",

-      "scope": "variable.interpolation",

-      "settings": {

-        "foreground": "#ec5f67"

-      }

-    },

-    {

-      "name": "Meta Function Call",

-      "scope": "meta.function-call",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Punctuation Section Embedded",

-      "scope": "punctuation.section.embedded",

-      "settings": {

-        "foreground": "#d3423e"

-      }

-    },

-    {

-      "name": "Punctuation Tweaks",

-      "scope": [

-        "punctuation.terminator.expression",

-        "punctuation.definition.arguments",

-        "punctuation.definition.array",

-        "punctuation.section.array",

-        "meta.array"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "More Punctuation Tweaks",

-      "scope": [

-        "punctuation.definition.list.begin",

-        "punctuation.definition.list.end",

-        "punctuation.separator.arguments",

-        "punctuation.definition.list"

-      ],

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Template Strings",

-      "scope": "string.template meta.template.expression",

-      "settings": {

-        "foreground": "#d3423e"

-      }

-    },

-    {

-      "name": "Backtics(``) in Template Strings",

-      "scope": "string.template punctuation.definition.string",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Italics",

-      "scope": "italic",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Bold",

-      "scope": "bold",

-      "settings": {

-        "foreground": "#ffcb6b",

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Quote",

-      "scope": "quote",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Raw Code",

-      "scope": "raw",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "CoffeScript Variable Assignment",

-      "scope": "variable.assignment.coffee",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "CoffeScript Parameter Function",

-      "scope": "variable.parameter.function.coffee",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "CoffeeScript Assignments",

-      "scope": "variable.assignment.coffee",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "C# Readwrite Variables",

-      "scope": "variable.other.readwrite.cs",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "C# Classes & Storage types",

-      "scope": ["entity.name.type.class.cs", "storage.type.cs"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "C# Namespaces",

-      "scope": "entity.name.type.namespace.cs",

-      "settings": {

-        "foreground": "#B2CCD6"

-      }

-    },

-    {

-      "name": "Tag names in Stylesheets",

-      "scope": [

-        "entity.name.tag.css",

-        "entity.name.tag.less",

-        "entity.name.tag.custom.css"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Wildcard(*) selector in Stylesheets",

-      "scope": [

-        "entity.name.tag.wildcard.css",

-        "entity.name.tag.wildcard.less",

-        "entity.name.tag.wildcard.scss",

-        "entity.name.tag.wildcard.sass"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "(C|SC|SA|LE)SS property value unit",

-      "scope": [

-        "keyword.other.unit.css",

-        "constant.length.units.css",

-        "keyword.other.unit.less",

-        "constant.length.units.less",

-        "keyword.other.unit.scss",

-        "constant.length.units.scss",

-        "keyword.other.unit.sass",

-        "constant.length.units.sass"

-      ],

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Attribute Name for CSS",

-      "scope": "meta.attribute-selector.css entity.other.attribute-name.attribute",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "punctuations in styled components",

-      "scope": [

-        "source.js source.css meta.property-list",

-        "source.js source.css punctuation.section",

-        "source.js source.css punctuation.terminator.rule",

-        "source.js source.css punctuation.definition.entity.end.bracket",

-        "source.js source.css punctuation.definition.entity.begin.bracket",

-        "source.js source.css punctuation.separator.key-value",

-        "source.js source.css punctuation.definition.attribute-selector",

-        "source.js source.css meta.property-list",

-        "source.js source.css meta.property-list punctuation.separator.comma",

-        "source.ts source.css punctuation.section",

-        "source.ts source.css punctuation.terminator.rule",

-        "source.ts source.css punctuation.definition.entity.end.bracket",

-        "source.ts source.css punctuation.definition.entity.begin.bracket",

-        "source.ts source.css punctuation.separator.key-value",

-        "source.ts source.css punctuation.definition.attribute-selector",

-        "source.ts source.css meta.property-list",

-        "source.ts source.css meta.property-list punctuation.separator.comma"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Elixir Classes",

-      "scope": [

-        "source.elixir support.type.elixir",

-        "source.elixir meta.module.elixir entity.name.class.elixir"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Elixir Functions",

-      "scope": "source.elixir entity.name.function",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Elixir Constants",

-      "scope": [

-        "source.elixir constant.other.symbol.elixir",

-        "source.elixir constant.other.keywords.elixir"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Elixir String Punctuations",

-      "scope": "source.elixir punctuation.definition.string",

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Elixir",

-      "scope": [

-        "source.elixir variable.other.readwrite.module.elixir",

-        "source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir"

-      ],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Elixir Binary Punctuations",

-      "scope": "source.elixir .punctuation.binary.elixir",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Go Function Calls",

-      "scope": "source.go meta.function-call.go",

-      "settings": {

-        "foreground": "#DDDDDD"

-      }

-    },

-    {

-      "name": "GraphQL Variables",

-      "scope": "variable.qraphql",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "ID Attribute Name in HTML",

-      "scope": "entity.other.attribute-name.id.html",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "HTML Punctuation Definition Tag",

-      "scope": "punctuation.definition.tag.html",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "HTML Doctype",

-      "scope": "meta.tag.sgml.doctype.html",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "JavaScript Classes",

-      "scope": "meta.class entity.name.type.class.js",

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "JavaScript Method Declaration e.g. `constructor`",

-      "scope": "meta.method.declaration storage.type.js",

-      "settings": {

-        "foreground": "#82AAFF",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "JavaScript Terminator",

-      "scope": "terminator.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Meta Punctuation Definition",

-      "scope": "meta.js punctuation.definition.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Entity Names in Code Documentations",

-      "scope": [

-        "entity.name.type.instance.jsdoc",

-        "entity.name.type.instance.phpdoc"

-      ],

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "Other Variables in Code Documentations",

-      "scope": ["variable.other.jsdoc", "variable.other.phpdoc"],

-      "settings": {

-        "foreground": "#78ccf0"

-      }

-    },

-    {

-      "name": "JavaScript module imports and exports",

-      "scope": [

-        "variable.other.meta.import.js",

-        "meta.import.js variable.other",

-        "variable.other.meta.export.js",

-        "meta.export.js variable.other"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Variable Parameter Function",

-      "scope": "variable.parameter.function.js",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "JavaScript Variable Other ReadWrite",

-      "scope": "variable.other.readwrite.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Text nested in React tags",

-      "scope": [

-        "meta.jsx.children",

-        "meta.jsx.children.js",

-        "meta.jsx.children.tsx"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript[React] Variable Other Object",

-      "scope": [

-        "variable.other.object.js",

-        "variable.other.object.jsx",

-        "meta.object-literal.key.js",

-        "meta.object-literal.key.jsx",

-        "variable.object.property.js",

-        "variable.object.property.jsx"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Variables",

-      "scope": ["variable.js", "variable.other.js"],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Entity Name Type",

-      "scope": ["entity.name.type.js", "entity.name.type.module.js"],

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "JavaScript Support Classes",

-      "scope": "support.class.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JSON Property Names",

-      "scope": "support.type.property-name.json",

-      "settings": {

-        "foreground": "#C3E88D",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "JSON Support Constants",

-      "scope": "support.constant.json",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "JSON Property values (string)",

-      "scope": "meta.structure.dictionary.value.json string.quoted.double",

-      "settings": {

-        "foreground": "#80CBC4",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "Strings in JSON values",

-      "scope": "string.quoted.double.json punctuation.definition.string.json",

-      "settings": {

-        "foreground": "#80CBC4",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "Specific JSON Property values like null",

-      "scope": "meta.structure.dictionary.json meta.structure.dictionary.value constant.language",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Ruby Variables",

-      "scope": "variable.other.ruby",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Ruby Hashkeys",

-      "scope": "constant.language.symbol.hashkey.ruby",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "LESS Tag names",

-      "scope": "entity.name.tag.less",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Attribute Name for LESS",

-      "scope": "meta.attribute-selector.less entity.other.attribute-name.attribute",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Markup Headings",

-      "scope": "markup.heading",

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Markup Italics",

-      "scope": "markup.italic",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markup Bold",

-      "scope": "markup.bold",

-      "settings": {

-        "foreground": "#ffcb6b",

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Markup Quote + others",

-      "scope": "markup.quote",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markup Raw Code + others",

-      "scope": "markup.inline.raw",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Markup Links",

-      "scope": ["markup.underline.link", "markup.underline.link.image"],

-      "settings": {

-        "foreground": "#ff869a"

-      }

-    },

-    {

-      "name": "Markup Attributes",

-      "scope": ["markup.meta.attribute-list"],

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Markup Admonitions",

-      "scope": "markup.admonition",

-      "settings": {

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Markup Lists",

-      "scope": "markup.list.bullet",

-      "settings": {

-        "foreground": "#D9F5DD"

-      }

-    },

-    {

-      "name": "Markup Superscript and Subscript",

-      "scope": ["markup.superscript", "markup.subscript"],

-      "settings": {

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markdown Link Title and Description",

-      "scope": [

-        "string.other.link.title.markdown",

-        "string.other.link.description.markdown"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Markdown Punctuation",

-      "scope": [

-        "punctuation.definition.string.markdown",

-        "punctuation.definition.string.begin.markdown",

-        "punctuation.definition.string.end.markdown",

-        "meta.link.inline.markdown punctuation.definition.string"

-      ],

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Markdown MetaData Punctuation",

-      "scope": ["punctuation.definition.metadata.markdown"],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Markdown List Punctuation",

-      "scope": ["beginning.punctuation.definition.list.markdown"],

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Asciidoc Function",

-      "scope": "entity.name.function.asciidoc",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "PHP Variables",

-      "scope": "variable.other.php",

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "Support Classes in PHP",

-      "scope": "support.class.php",

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "Punctuations in PHP function calls",

-      "scope": "meta.function-call.php punctuation",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "PHP Global Variables",

-      "scope": "variable.other.global.php",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Declaration Punctuation in PHP Global Variables",

-      "scope": "variable.other.global.php punctuation.definition.variable",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Language Constants in Python",

-      "scope": "constant.language.python",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Python Function Parameter and Arguments",

-      "scope": [

-        "variable.parameter.function.python",

-        "meta.function-call.arguments.python"

-      ],

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "Python Function Call",

-      "scope": [

-        "meta.function-call.python",

-        "meta.function-call.generic.python"

-      ],

-      "settings": {

-        "foreground": "#B2CCD6"

-      }

-    },

-    {

-      "name": "Punctuations in Python",

-      "scope": "punctuation.python",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Decorator Functions in Python",

-      "scope": "entity.name.function.decorator.python",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Python Language Variable",

-      "scope": "source.python variable.language.special",

-      "settings": {

-        "foreground": "#8EACE3"

-      }

-    },

-    {

-      "name": "SCSS Variable",

-      "scope": [

-        "variable.scss",

-        "variable.sass",

-        "variable.parameter.url.scss",

-        "variable.parameter.url.sass"

-      ],

-      "settings": {

-        "foreground": "#DDDDDD"

-      }

-    },

-    {

-      "name": "Variables in SASS At-Rules",

-      "scope": [

-        "source.css.scss meta.at-rule variable",

-        "source.css.sass meta.at-rule variable"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Variables in SASS At-Rules",

-      "scope": [

-        "source.css.scss meta.at-rule variable",

-        "source.css.sass meta.at-rule variable"

-      ],

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "Attribute Name for SASS",

-      "scope": [

-        "meta.attribute-selector.scss entity.other.attribute-name.attribute",

-        "meta.attribute-selector.sass entity.other.attribute-name.attribute"

-      ],

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Tag names in SASS",

-      "scope": ["entity.name.tag.scss", "entity.name.tag.sass"],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "TypeScript[React] Variables and Object Properties",

-      "scope": [

-        "variable.other.readwrite.alias.ts",

-        "variable.other.readwrite.alias.tsx",

-        "variable.other.readwrite.ts",

-        "variable.other.readwrite.tsx",

-        "variable.other.object.ts",

-        "variable.other.object.tsx",

-        "variable.object.property.ts",

-        "variable.object.property.tsx",

-        "variable.other.ts",

-        "variable.other.tsx",

-        "variable.tsx",

-        "variable.ts"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "TypeScript[React] Entity Name Types",

-      "scope": ["entity.name.type.ts", "entity.name.type.tsx"],

-      "settings": {

-        "foreground": "#78ccf0"

-      }

-    },

-    {

-      "name": "TypeScript[React] Node Classes",

-      "scope": ["support.class.node.ts", "support.class.node.tsx"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "TypeScript[React] Entity Name Types as Parameters",

-      "scope": [

-        "meta.type.parameters.ts entity.name.type",

-        "meta.type.parameters.tsx entity.name.type"

-      ],

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "TypeScript[React] Import/Export Punctuations",

-      "scope": [

-        "meta.import.ts punctuation.definition.block",

-        "meta.import.tsx punctuation.definition.block",

-        "meta.export.ts punctuation.definition.block",

-        "meta.export.tsx punctuation.definition.block"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "TypeScript[React] Punctuation Decorators",

-      "scope": [

-        "meta.decorator punctuation.decorator.ts",

-        "meta.decorator punctuation.decorator.tsx"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "TypeScript[React] Punctuation Decorators",

-      "scope": "meta.tag.js meta.jsx.children.tsx",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "YAML Entity Name Tags",

-      "scope": "entity.name.tag.yaml",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "handlebars variables",

-      "scope": "variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "handlebars parameters",

-      "scope": "entity.other.attribute-name.handlebars variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "handlebars enitity attribute names",

-      "scope": "entity.other.attribute-name.handlebars",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "handlebars enitity attribute values",

-      "scope": "entity.other.attribute-value.handlebars variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "normalize font style of certain components",

-      "scope": [

-        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js",

-        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js",

-        "meta.property-list.css meta.property-value.css variable.other.less",

-        "punctuation.section.embedded.begin.js.jsx",

-        "punctuation.section.embedded.end.js.jsx",

-        "meta.property-list.scss variable.scss",

-        "meta.property-list.sass variable.sass",

-        "keyword.operator.logical",

-        "keyword.operator.arithmetic",

-        "keyword.operator.bitwise",

-        "keyword.operator.increment",

-        "keyword.operator.ternary",

-        "keyword.operator.comparison",

-        "keyword.operator.assignment",

-        "keyword.operator.operator",

-        "keyword.operator.or.regexp",

-        "keyword.operator.expression.in",

-        "keyword.operator.type",

-        "punctuation.section.embedded.js",

-        "punctuation.definintion.string",

-        "punctuation"

-      ],

-      "settings": {

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "italicsify for operator mono",

-      "scope": [

-        "keyword.other.unit",

-        "support.type.property-name.css",

-        "support.type.vendored.property-name.css",

-        "support.constant.vendored.property-value.css",

-        "meta.import.ts meta.block.ts variable.other.readwrite.alias.ts",

-        "meta.import.tsx meta.block.tsx variable.other.readwrite.alias.tsx",

-        "meta.import.js variable.other",

-        "meta.export.ts meta.block.ts variable.other.readwrite.alias.ts",

-        "meta.export.tsx meta.block.tsx variable.other.readwrite.alias.tsx",

-        "meta.export.js variable.other",

-        "entity.name.function.ts",

-        "entity.name.function.tsx",

-        "support.type.primitive",

-        "entity.name.tag.yaml",

-        "entity.other.attribute-name",

-        "meta.tag.sgml.doctype.html",

-        "entity.name.tag.doctype",

-        "meta.tag.sgml.doctype",

-        "entity.name.tag.custom",

-        "source.js.jsx keyword.control.flow.js",

-        "support.type.property.css",

-        "support.function.basic_functions",

-        "constant.other.color.rgb-value.hex.css",

-        "constant.other.rgb-value.css",

-        "variable.assignment.coffee",

-        "support.function.basic_functions",

-        "keyword.operator.expression.typeof",

-        "punctuation.section.embedded",

-        "keyword.operator.type.annotation",

-        "variable.object.property.ts",

-        "variable.object.property.js",

-        "variable.object.property.jsx",

-        "variable.object.property.tsx",

-        "assignment.coffee",

-        "entity.name.type.ts",

-        "support.constant.math",

-        "meta.object-literal.key",

-        "meta.var.expr storage.type",

-        "variable.scss",

-        "variable.sass",

-        "variable.other.less",

-        "variable.parameter.url.scss",

-        "variable.parameter.url.sass",

-        "parameter",

-        "string",

-        "italic",

-        "quote",

-        "keyword",

-        "storage",

-        "language",

-        "constant.language",

-        "variable.language",

-        "type .function",

-        "type.function",

-        "storage.type.class",

-        "type.var",

-        "meta.parameter",

-        "variable.parameter",

-        "meta.parameters",

-        "keyword.control",

-        "modifier",

-        "this",

-        "comment"

-      ],

-      "settings": {

-        "fontStyle": "italic"

-      }

-    }

-  ]

-}

+{
+  "name": "Palenight Operator",
+  "author": "Olaolu Olawuyi",
+  "maintainers": ["Olaolu Olawuyi <mrolaolu@gmail.com>"],
+  "type": "dark",
+  "semanticClass": "palenight-operator",
+  "colors": {
+    "contrastActiveBorder": null,
+    "contrastBorder": "#282B3C",
+    "focusBorder": "#282B3C",
+    "foreground": "#ffffff",
+    "widget.shadow": "#232635",
+    "selection.background": "#7580B850",
+    "descriptionForeground": null,
+    "errorForeground": "#EF5350",
+    "button.background": "#7e57c2cc",
+    "button.foreground": "#ffffffcc",
+    "button.hoverBackground": "#7e57c2",
+    "dropdown.background": "#292D3E",
+    "dropdown.border": "#7e57c2",
+    "dropdown.foreground": "#ffffffcc",
+    "input.background": "#313850",
+    "input.border": "#7e57c2",
+    "input.foreground": "#ffffffcc",
+    "input.placeholderForeground": "#ffffffcc",
+    "inputOption.activeBorder": "#ffffffcc",
+    "inputValidation.errorBackground": "#ef5350f2",
+    "inputValidation.errorBorder": "#EF5350",
+    "inputValidation.infoBackground": "#64b5f6f2",
+    "inputValidation.infoBorder": "#64B5F6",
+    "inputValidation.warningBackground": "#ffca28f2",
+    "inputValidation.warningBorder": "#FFCA28",
+    "scrollbar.shadow": "#292D3E00",
+    "scrollbarSlider.activeBackground": "#694CA4cc",
+    "scrollbarSlider.background": "#694CA466",
+    "scrollbarSlider.hoverBackground": "#694CA4cc",
+    "badge.background": "#7e57c2",
+    "badge.foreground": "#ffffff",
+    "progress.background": "#7e57c2",
+    "list.activeSelectionBackground": "#7e57c2",
+    "list.activeSelectionForeground": "#ffffff",
+    "list.dropBackground": "#2E3245",
+    "list.focusBackground": "#0000002e",
+    "list.focusForeground": "#ffffff",
+    "list.highlightForeground": "#ffffff",
+    "list.hoverBackground": "#0000001a",
+    "list.hoverForeground": "#ffffff",
+    "list.inactiveSelectionBackground": "#929ac90d",
+    "list.inactiveSelectionForeground": "#929ac9",
+    "activityBar.background": "#282C3D",
+    "activityBar.dropBackground": "#7e57c2e3",
+    "activityBar.foreground": "#eeffff",
+    "activityBar.border": "#282C3D",
+    "activityBarBadge.background": "#7e57c2",
+    "activityBarBadge.foreground": "#ffffff",
+    "sideBar.background": "#292D3E",
+    "sideBar.foreground": "#6C739A",
+    "sideBar.border": "#282B3C",
+    "sideBarTitle.foreground": "#eeffff",
+    "sideBarSectionHeader.background": "#292D3E",
+    "sideBarSectionHeader.foreground": "#eeffff",
+    "editorGroup.background": "#32374C",
+    "editorGroup.border": "#2E3245",
+    "editorGroup.dropBackground": "#7e57c273",
+    "editorGroupHeader.noTabsBackground": "#32374C",
+    "editorGroupHeader.tabsBackground": "#31364a",
+    "editorGroupHeader.tabsBorder": "#262A39",
+    "tab.activeBackground": "#292D3E",
+    "tab.activeForeground": "#eeffff",
+    "tab.border": "#272B3B",
+    "tab.activeBorder": "#262A39",
+    "tab.unfocusedActiveBorder": "#262A39",
+    "tab.inactiveBackground": "#31364A",
+    "tab.inactiveForeground": "#929ac9",
+    "tab.unfocusedActiveForeground": null,
+    "tab.unfocusedInactiveForeground": null,
+    "editor.background": "#292D3E",
+    "editor.foreground": "#BFC7D5",
+    "editorLineNumber.foreground": "#4c5374",
+    "editorLineNumber.activeForeground": "#eeffff",
+    "editorCursor.foreground": "#7e57c2",
+    "editorCursor.background": null,
+    "editor.selectionBackground": "#7580B850",
+    "editor.selectionHighlightBackground": "#383D51",
+    "editor.inactiveSelectionBackground": "#7e57c25a",
+    "editor.wordHighlightBackground": "#32374D",
+    "editor.wordHighlightStrongBackground": "#2E3250",
+    "editor.findMatchBackground": "#2e3248fc",
+    "editor.findMatchHighlightBackground": "#7e57c233",
+    "editor.findRangeHighlightBackground": null,
+    "editor.hoverHighlightBackground": "#7e57c25a",
+    "editor.lineHighlightBackground": "#0003",
+    "editor.lineHighlightBorder": null,
+    "editorLink.activeForeground": null,
+    "editor.rangeHighlightBackground": "#7e57c25a",
+    "editorWhitespace.foreground": null,
+    "editorIndentGuide.background": "#4E557980",
+    "editorRuler.foreground": "#4E557980",
+    "editorCodeLens.foreground": "#FFCA28",
+    "editorBracketMatch.background": null,
+    "editorBracketMatch.border": null,
+    "editorOverviewRuler.currentContentForeground": "#7e57c2",
+    "editorOverviewRuler.incomingContentForeground": "#7e57c2",
+    "editorOverviewRuler.commonContentForeground": "#7e57c2",
+    "editorError.foreground": "#EF5350",
+    "editorError.border": null,
+    "editorWarning.foreground": "#FFCA28",
+    "editorWarning.border": null,
+    "editorGutter.background": null,
+    "editorGutter.modifiedBackground": "#e2b93d",
+    "editorGutter.addedBackground": "#9CCC65",
+    "editorGutter.deletedBackground": "#EF5350",
+    "diffEditor.insertedTextBackground": "#99b76d23",
+    "diffEditor.removedTextBackground": "#ef535033",
+    "editorWidget.background": "#31364a",
+    "editorWidget.border": null,
+    "editorSuggestWidget.background": "#2C3043",
+    "editorSuggestWidget.border": "#2B2F40",
+    "editorSuggestWidget.foreground": "#bfc7d5",
+    "editorSuggestWidget.highlightForeground": "#ffffff",
+    "editorSuggestWidget.selectedBackground": "#7e57c2",
+    "editorHoverWidget.background": "#292D3E",
+    "editorHoverWidget.border": "#7e57c2",
+    "debugExceptionWidget.background": "#292D3E",
+    "debugExceptionWidget.border": "#7e57c2",
+    "editorMarkerNavigation.background": "#31364a",
+    "editorMarkerNavigationError.background": "#EF5350",
+    "editorMarkerNavigationWarning.background": "#FFCA28",
+    "peekView.border": "#7e57c2",
+    "peekViewEditor.background": "#232635",
+    "peekViewEditor.matchHighlightBackground": "#7e57c25a",
+    "peekViewResult.background": "#2E3245",
+    "peekViewResult.fileForeground": "#eeffff",
+    "peekViewResult.lineForeground": "#eeffff",
+    "peekViewResult.matchHighlightBackground": "#7e57c25a",
+    "peekViewResult.selectionBackground": "#2E3250",
+    "peekViewResult.selectionForeground": "#eeffff",
+    "peekViewTitle.background": "#292D3E",
+    "peekViewTitleDescription.foreground": "#697098",
+    "peekViewTitleLabel.foreground": "#eeffff",
+    "merge.currentHeaderBackground": "#7e57c25a",
+    "merge.currentContentBackground": null,
+    "merge.incomingHeaderBackground": "#7e57c25a",
+    "merge.incomingContentBackground": null,
+    "merge.border": null,
+    "panel.background": "#292D3E",
+    "panel.border": "#282B3C",
+    "panelTitle.activeBorder": "#7e57c2",
+    "panelTitle.activeForeground": "#eeffff",
+    "panelTitle.inactiveForeground": "#bfc7d580",
+    "statusBar.background": "#282C3D",
+    "statusBar.foreground": "#676E95",
+    "statusBar.border": "#262A39",
+    "statusBar.debuggingBackground": "#202431",
+    "statusBar.debuggingForeground": null,
+    "statusBar.debuggingBorder": "#1F2330",
+    "statusBar.noFolderForeground": null,
+    "statusBar.noFolderBackground": "#292D3E",
+    "statusBar.noFolderBorder": "#25293A",
+    "statusBarItem.activeBackground": "#202431",
+    "statusBarItem.hoverBackground": "#202431",
+    "statusBarItem.prominentBackground": "#202431",
+    "statusBarItem.prominentHoverBackground": "#202431",
+    "titleBar.activeBackground": "#292d3e",
+    "titleBar.activeForeground": "#eeefff",
+    "titleBar.border": "#30364c",
+    "titleBar.inactiveBackground": "#30364c",
+    "titleBar.inactiveForeground": null,
+    "notifications.background": "#292D3E",
+    "notifications.foreground": "#ffffffcc",
+    "notificationLink.foreground": "#80CBC4",
+    "extensionButton.prominentForeground": "#ffffffcc",
+    "extensionButton.prominentBackground": "#7e57c2cc",
+    "extensionButton.prominentHoverBackground": "#7e57c2",
+    "pickerGroup.foreground": "#d1aaff",
+    "pickerGroup.border": "#2E3245",
+    "terminal.ansiWhite": "#ffffff",
+    "terminal.ansiBlack": "#676E95",
+    "terminal.ansiBlue": "#82AAFF",
+    "terminal.ansiCyan": "#89DDFF",
+    "terminal.ansiGreen": "#a9c77d",
+    "terminal.ansiMagenta": "#C792EA",
+    "terminal.ansiRed": "#ff5572",
+    "terminal.ansiYellow": "#FFCB6B",
+    "terminal.ansiBrightWhite": "#ffffff",
+    "terminal.ansiBrightBlack": "#676E95",
+    "terminal.ansiBrightBlue": "#82AAFF",
+    "terminal.ansiBrightCyan": "#89DDFF",
+    "terminal.ansiBrightGreen": "#C3E88D",
+    "terminal.ansiBrightMagenta": "#C792EA",
+    "terminal.ansiBrightRed": "#ff5572",
+    "terminal.ansiBrightYellow": "#FFCB6B",
+    "debugToolBar.background": "#292D3E",
+    "welcomePage.buttonBackground": null,
+    "welcomePage.buttonHoverBackground": null,
+    "walkThrough.embeddedEditorBackground": "#232635",
+    "gitDecoration.modifiedResourceForeground": "#e2c08de6",
+    "gitDecoration.deletedResourceForeground": "#EF535090",
+    "gitDecoration.untrackedResourceForeground": "#a9c77dff",
+    "gitDecoration.ignoredResourceForeground": "#69709890",
+    "gitDecoration.conflictingResourceForeground": "#FFEB95CC",
+    "editorActiveLineNumber.foreground": "#eeffff",
+    "breadcrumb.foreground": "#6c739a",
+    "breadcrumb.focusForeground": "#bfc7d5",
+    "breadcrumb.activeSelectionForeground": "#eeffff",
+    "breadcrumbPicker.background": "#292D3E"
+  },
+  "tokenColors": [
+    {
+      "name": "Global settings",
+      "settings": {
+        "background": "#292D3E",
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Comment",
+      "scope": "comment",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "String",
+      "scope": "string",
+      "settings": {
+        "foreground": "#C3E88D"
+      }
+    },
+    {
+      "name": "String Quoted",
+      "scope": "string.quoted",
+      "settings": {
+        "foreground": "#C3E88D"
+      }
+    },
+    {
+      "name": "String Unquoted",
+      "scope": "string.unquoted",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Support Constant Math",
+      "scope": "support.constant.math",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Number",
+      "scope": ["constant.numeric", "constant.character.numeric"],
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Built-in constant",
+      "scope": [
+        "constant.language",
+        "punctuation.definition.constant",
+        "variable.other.constant"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "User-defined constant",
+      "scope": ["constant.character", "constant.other"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Constant Character Escape",
+      "scope": "constant.character.escape",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "RegExp String",
+      "scope": ["string.regexp", "string.regexp keyword.other"],
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Comma in functions",
+      "scope": "meta.function punctuation.separator.comma",
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "Variable",
+      "scope": "variable",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Keyword",
+      "scope": ["punctuation.accessor", "keyword"],
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Storage",
+      "scope": [
+        "storage",
+        "storage.type",
+        "meta.var.expr storage.type",
+        "storage.type.property.js",
+        "storage.type.property.ts",
+        "storage.type.property.tsx",
+        "meta.class meta.method.declaration meta.var.expr storage.type.js"
+      ],
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": ["entity.name.class", "meta.class entity.name.type.class"],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Inherited class",
+      "scope": "entity.other.inherited-class",
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Function name",
+      "scope": "entity.name.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Function Parameters",
+      "scope": "variable.parameter",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "Meta Tag",
+      "scope": ["punctuation.definition.tag", "meta.tag"],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "HTML Tag names",
+      "scope": [
+        "entity.name.tag support.class.component",
+        "meta.tag.other.html",
+        "meta.tag.other.js",
+        "meta.tag.other.tsx",
+        "entity.name.tag.tsx",
+        "entity.name.tag.js",
+        "entity.name.tag",
+        "meta.tag.js",
+        "meta.tag.tsx",
+        "meta.tag.html"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Tag attribute",
+      "scope": "entity.other.attribute-name",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Entity Name Tag Custom",
+      "scope": "entity.name.tag.custom",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Library (function & constant)",
+      "scope": ["support.function", "support.constant"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Support Constant Property Value meta",
+      "scope": "support.constant.meta.property-value",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Library class/type",
+      "scope": ["support.type", "support.class"],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Support Variable DOM",
+      "scope": "support.variable.dom",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Invalid",
+      "scope": "invalid",
+      "settings": {
+        "background": "#ff2c83",
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Invalid deprecated",
+      "scope": "invalid.deprecated",
+      "settings": {
+        "foreground": "#ffffff",
+        "background": "#d3423e"
+      }
+    },
+    {
+      "name": "Keyword Operator",
+      "scope": "keyword.operator",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Relational",
+      "scope": "keyword.operator.relational",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Keyword Operator Assignment",
+      "scope": "keyword.operator.assignment",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Double-Slashed Comment",
+      "scope": "comment.line.double-slash",
+      "settings": {
+        "foreground": "#697098"
+      }
+    },
+    {
+      "name": "Object",
+      "scope": "object",
+      "settings": {
+        "foreground": "#cdebf7"
+      }
+    },
+    {
+      "name": "Null",
+      "scope": "constant.language.null",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Meta Brace",
+      "scope": "meta.brace",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Meta Delimiter Period",
+      "scope": "meta.delimiter.period",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Punctuation Definition String",
+      "scope": "punctuation.definition.string",
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Boolean",
+      "scope": "constant.language.boolean",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Object Comma",
+      "scope": "object.comma",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Variable Parameter Function",
+      "scope": "variable.parameter.function",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Support Type Property Name & entity name tags",
+      "scope": [
+        "support.type.vendored.property-name",
+        "support.constant.vendored.property-value",
+        "support.type.property-name",
+        "meta.property-list entity.name.tag"
+      ],
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Entity Name tag reference in stylesheets",
+      "scope": "meta.property-list entity.name.tag.reference",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Constant Other Color RGB Value Punctuation Definition Constant",
+      "scope": "constant.other.color.rgb-value punctuation.definition.constant",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Constant Other Color",
+      "scope": "constant.other.color",
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Keyword Other Unit",
+      "scope": "keyword.other.unit",
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Meta Selector",
+      "scope": "meta.selector",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Entity Other Attribute Name Id",
+      "scope": "entity.other.attribute-name.id",
+      "settings": {
+        "foreground": "#FAD430"
+      }
+    },
+    {
+      "name": "Meta Property Name",
+      "scope": "meta.property-name",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Doctypes",
+      "scope": ["entity.name.tag.doctype", "meta.tag.sgml.doctype"],
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Punctuation Definition Parameters",
+      "scope": "punctuation.definition.parameters",
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Keyword Control Operator",
+      "scope": "keyword.control.operator",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Logical",
+      "scope": "keyword.operator.logical",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Variable Instances",
+      "scope": [
+        "variable.instance",
+        "variable.other.instance",
+        "variable.reaedwrite.instance",
+        "variable.other.readwrite.instance"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Variable Property Other",
+      "scope": ["variable.other.property", "variable.other.object.property"],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Entity Name Function",
+      "scope": "entity.name.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Comparison",
+      "scope": "keyword.operator.comparison",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Support Constant, `new` keyword, Special Method Keyword",
+      "scope": [
+        "support.constant",
+        "keyword.other.special-method",
+        "keyword.other.new"
+      ],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Support Function",
+      "scope": "support.function",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Invalid Broken",
+      "scope": "invalid.broken",
+      "settings": {
+        "foreground": "#020e14",
+        "background": "#F78C6C"
+      }
+    },
+    {
+      "name": "Invalid Unimplemented",
+      "scope": "invalid.unimplemented",
+      "settings": {
+        "background": "#8BD649",
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Invalid Illegal",
+      "scope": "invalid.illegal",
+      "settings": {
+        "foreground": "#ffffff",
+        "background": "#ec5f67"
+      }
+    },
+    {
+      "name": "Language Variable",
+      "scope": "variable.language",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Support Variable Property",
+      "scope": "support.variable.property",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Variable Function",
+      "scope": "variable.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Variable Interpolation",
+      "scope": "variable.interpolation",
+      "settings": {
+        "foreground": "#ec5f67"
+      }
+    },
+    {
+      "name": "Meta Function Call",
+      "scope": "meta.function-call",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Punctuation Section Embedded",
+      "scope": "punctuation.section.embedded",
+      "settings": {
+        "foreground": "#d3423e"
+      }
+    },
+    {
+      "name": "Punctuation Tweaks",
+      "scope": [
+        "punctuation.terminator.expression",
+        "punctuation.definition.arguments",
+        "punctuation.definition.array",
+        "punctuation.section.array",
+        "meta.array"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "More Punctuation Tweaks",
+      "scope": [
+        "punctuation.definition.list.begin",
+        "punctuation.definition.list.end",
+        "punctuation.separator.arguments",
+        "punctuation.definition.list"
+      ],
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Template Strings",
+      "scope": "string.template meta.template.expression",
+      "settings": {
+        "foreground": "#d3423e"
+      }
+    },
+    {
+      "name": "Backtics(``) in Template Strings",
+      "scope": "string.template punctuation.definition.string",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Italics",
+      "scope": "italic",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "bold",
+      "settings": {
+        "foreground": "#ffcb6b",
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Quote",
+      "scope": "quote",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Raw Code",
+      "scope": "raw",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "CoffeScript Variable Assignment",
+      "scope": "variable.assignment.coffee",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "CoffeScript Parameter Function",
+      "scope": "variable.parameter.function.coffee",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "CoffeeScript Assignments",
+      "scope": "variable.assignment.coffee",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "C# Readwrite Variables",
+      "scope": "variable.other.readwrite.cs",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "C# Classes & Storage types",
+      "scope": ["entity.name.type.class.cs", "storage.type.cs"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "C# Namespaces",
+      "scope": "entity.name.type.namespace.cs",
+      "settings": {
+        "foreground": "#B2CCD6"
+      }
+    },
+    {
+      "name": "Tag names in Stylesheets",
+      "scope": [
+        "entity.name.tag.css",
+        "entity.name.tag.less",
+        "entity.name.tag.custom.css"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Wildcard(*) selector in Stylesheets",
+      "scope": [
+        "entity.name.tag.wildcard.css",
+        "entity.name.tag.wildcard.less",
+        "entity.name.tag.wildcard.scss",
+        "entity.name.tag.wildcard.sass"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "(C|SC|SA|LE)SS property value unit",
+      "scope": [
+        "keyword.other.unit.css",
+        "constant.length.units.css",
+        "keyword.other.unit.less",
+        "constant.length.units.less",
+        "keyword.other.unit.scss",
+        "constant.length.units.scss",
+        "keyword.other.unit.sass",
+        "constant.length.units.sass"
+      ],
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Attribute Name for CSS",
+      "scope": "meta.attribute-selector.css entity.other.attribute-name.attribute",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "punctuations in styled components",
+      "scope": [
+        "source.js source.css meta.property-list",
+        "source.js source.css punctuation.section",
+        "source.js source.css punctuation.terminator.rule",
+        "source.js source.css punctuation.definition.entity.end.bracket",
+        "source.js source.css punctuation.definition.entity.begin.bracket",
+        "source.js source.css punctuation.separator.key-value",
+        "source.js source.css punctuation.definition.attribute-selector",
+        "source.js source.css meta.property-list",
+        "source.js source.css meta.property-list punctuation.separator.comma",
+        "source.ts source.css punctuation.section",
+        "source.ts source.css punctuation.terminator.rule",
+        "source.ts source.css punctuation.definition.entity.end.bracket",
+        "source.ts source.css punctuation.definition.entity.begin.bracket",
+        "source.ts source.css punctuation.separator.key-value",
+        "source.ts source.css punctuation.definition.attribute-selector",
+        "source.ts source.css meta.property-list",
+        "source.ts source.css meta.property-list punctuation.separator.comma"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Elixir Classes",
+      "scope": [
+        "source.elixir support.type.elixir",
+        "source.elixir meta.module.elixir entity.name.class.elixir"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Elixir Functions",
+      "scope": "source.elixir entity.name.function",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Elixir Constants",
+      "scope": [
+        "source.elixir constant.other.symbol.elixir",
+        "source.elixir constant.other.keywords.elixir"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Elixir String Punctuations",
+      "scope": "source.elixir punctuation.definition.string",
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Elixir",
+      "scope": [
+        "source.elixir variable.other.readwrite.module.elixir",
+        "source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir"
+      ],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Elixir Binary Punctuations",
+      "scope": "source.elixir .punctuation.binary.elixir",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Go Function Calls",
+      "scope": "source.go meta.function-call.go",
+      "settings": {
+        "foreground": "#DDDDDD"
+      }
+    },
+    {
+      "name": "GraphQL Variables",
+      "scope": "variable.qraphql",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "ID Attribute Name in HTML",
+      "scope": "entity.other.attribute-name.id.html",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "HTML Punctuation Definition Tag",
+      "scope": "punctuation.definition.tag.html",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "HTML Doctype",
+      "scope": "meta.tag.sgml.doctype.html",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "JavaScript Classes",
+      "scope": "meta.class entity.name.type.class.js",
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "JavaScript Method Declaration e.g. `constructor`",
+      "scope": "meta.method.declaration storage.type.js",
+      "settings": {
+        "foreground": "#82AAFF",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "JavaScript Terminator",
+      "scope": "terminator.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Meta Punctuation Definition",
+      "scope": "meta.js punctuation.definition.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Entity Names in Code Documentations",
+      "scope": [
+        "entity.name.type.instance.jsdoc",
+        "entity.name.type.instance.phpdoc"
+      ],
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "Other Variables in Code Documentations",
+      "scope": ["variable.other.jsdoc", "variable.other.phpdoc"],
+      "settings": {
+        "foreground": "#78ccf0"
+      }
+    },
+    {
+      "name": "JavaScript module imports and exports",
+      "scope": [
+        "variable.other.meta.import.js",
+        "meta.import.js variable.other",
+        "variable.other.meta.export.js",
+        "meta.export.js variable.other"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Variable Parameter Function",
+      "scope": "variable.parameter.function.js",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "JavaScript Variable Other ReadWrite",
+      "scope": "variable.other.readwrite.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Text nested in React tags",
+      "scope": [
+        "meta.jsx.children",
+        "meta.jsx.children.js",
+        "meta.jsx.children.tsx"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript[React] Variable Other Object",
+      "scope": [
+        "variable.other.object.js",
+        "variable.other.object.jsx",
+        "meta.object-literal.key.js",
+        "meta.object-literal.key.jsx",
+        "variable.object.property.js",
+        "variable.object.property.jsx"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Variables",
+      "scope": ["variable.js", "variable.other.js"],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Entity Name Type",
+      "scope": ["entity.name.type.js", "entity.name.type.module.js"],
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "JavaScript Support Classes",
+      "scope": "support.class.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JSON Property Names",
+      "scope": "support.type.property-name.json",
+      "settings": {
+        "foreground": "#C3E88D",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "JSON Support Constants",
+      "scope": "support.constant.json",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "JSON Property values (string)",
+      "scope": "meta.structure.dictionary.value.json string.quoted.double",
+      "settings": {
+        "foreground": "#80CBC4",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "Strings in JSON values",
+      "scope": "string.quoted.double.json punctuation.definition.string.json",
+      "settings": {
+        "foreground": "#80CBC4",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "Specific JSON Property values like null",
+      "scope": "meta.structure.dictionary.json meta.structure.dictionary.value constant.language",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Ruby Variables",
+      "scope": "variable.other.ruby",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Ruby Hashkeys",
+      "scope": "constant.language.symbol.hashkey.ruby",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "LESS Tag names",
+      "scope": "entity.name.tag.less",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Attribute Name for LESS",
+      "scope": "meta.attribute-selector.less entity.other.attribute-name.attribute",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Markup Headings",
+      "scope": "markup.heading",
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Markup Italics",
+      "scope": "markup.italic",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markup Bold",
+      "scope": "markup.bold",
+      "settings": {
+        "foreground": "#ffcb6b",
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Markup Quote + others",
+      "scope": "markup.quote",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markup Raw Code + others",
+      "scope": "markup.inline.raw",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Markup Links",
+      "scope": ["markup.underline.link", "markup.underline.link.image"],
+      "settings": {
+        "foreground": "#ff869a"
+      }
+    },
+    {
+      "name": "Markup Attributes",
+      "scope": ["markup.meta.attribute-list"],
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Markup Admonitions",
+      "scope": "markup.admonition",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Markup Lists",
+      "scope": "markup.list.bullet",
+      "settings": {
+        "foreground": "#D9F5DD"
+      }
+    },
+    {
+      "name": "Markup Superscript and Subscript",
+      "scope": ["markup.superscript", "markup.subscript"],
+      "settings": {
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markdown Link Title and Description",
+      "scope": [
+        "string.other.link.title.markdown",
+        "string.other.link.description.markdown"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Markdown Punctuation",
+      "scope": [
+        "punctuation.definition.string.markdown",
+        "punctuation.definition.string.begin.markdown",
+        "punctuation.definition.string.end.markdown",
+        "meta.link.inline.markdown punctuation.definition.string"
+      ],
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Markdown MetaData Punctuation",
+      "scope": ["punctuation.definition.metadata.markdown"],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Markdown List Punctuation",
+      "scope": ["beginning.punctuation.definition.list.markdown"],
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Asciidoc Function",
+      "scope": "entity.name.function.asciidoc",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "PHP Variables",
+      "scope": "variable.other.php",
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "Support Classes in PHP",
+      "scope": "support.class.php",
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "Punctuations in PHP function calls",
+      "scope": "meta.function-call.php punctuation",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "PHP Global Variables",
+      "scope": "variable.other.global.php",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Declaration Punctuation in PHP Global Variables",
+      "scope": "variable.other.global.php punctuation.definition.variable",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Language Constants in Python",
+      "scope": "constant.language.python",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Python Function Parameter and Arguments",
+      "scope": [
+        "variable.parameter.function.python",
+        "meta.function-call.arguments.python"
+      ],
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "Python Function Call",
+      "scope": [
+        "meta.function-call.python",
+        "meta.function-call.generic.python"
+      ],
+      "settings": {
+        "foreground": "#B2CCD6"
+      }
+    },
+    {
+      "name": "Punctuations in Python",
+      "scope": "punctuation.python",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Decorator Functions in Python",
+      "scope": "entity.name.function.decorator.python",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Python Language Variable",
+      "scope": "source.python variable.language.special",
+      "settings": {
+        "foreground": "#8EACE3"
+      }
+    },
+    {
+      "name": "SCSS Variable",
+      "scope": [
+        "variable.scss",
+        "variable.sass",
+        "variable.parameter.url.scss",
+        "variable.parameter.url.sass"
+      ],
+      "settings": {
+        "foreground": "#DDDDDD"
+      }
+    },
+    {
+      "name": "Variables in SASS At-Rules",
+      "scope": [
+        "source.css.scss meta.at-rule variable",
+        "source.css.sass meta.at-rule variable"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Variables in SASS At-Rules",
+      "scope": [
+        "source.css.scss meta.at-rule variable",
+        "source.css.sass meta.at-rule variable"
+      ],
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "Attribute Name for SASS",
+      "scope": [
+        "meta.attribute-selector.scss entity.other.attribute-name.attribute",
+        "meta.attribute-selector.sass entity.other.attribute-name.attribute"
+      ],
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Tag names in SASS",
+      "scope": ["entity.name.tag.scss", "entity.name.tag.sass"],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "TypeScript[React] Variables and Object Properties",
+      "scope": [
+        "variable.other.readwrite.alias.ts",
+        "variable.other.readwrite.alias.tsx",
+        "variable.other.readwrite.ts",
+        "variable.other.readwrite.tsx",
+        "variable.other.object.ts",
+        "variable.other.object.tsx",
+        "variable.object.property.ts",
+        "variable.object.property.tsx",
+        "variable.other.ts",
+        "variable.other.tsx",
+        "variable.tsx",
+        "variable.ts"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "TypeScript[React] Entity Name Types",
+      "scope": ["entity.name.type.ts", "entity.name.type.tsx"],
+      "settings": {
+        "foreground": "#78ccf0"
+      }
+    },
+    {
+      "name": "TypeScript[React] Node Classes",
+      "scope": ["support.class.node.ts", "support.class.node.tsx"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "TypeScript[React] Entity Name Types as Parameters",
+      "scope": [
+        "meta.type.parameters.ts entity.name.type",
+        "meta.type.parameters.tsx entity.name.type"
+      ],
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "TypeScript[React] Import/Export Punctuations",
+      "scope": [
+        "meta.import.ts punctuation.definition.block",
+        "meta.import.tsx punctuation.definition.block",
+        "meta.export.ts punctuation.definition.block",
+        "meta.export.tsx punctuation.definition.block"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "TypeScript[React] Punctuation Decorators",
+      "scope": [
+        "meta.decorator punctuation.decorator.ts",
+        "meta.decorator punctuation.decorator.tsx"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "TypeScript[React] Punctuation Decorators",
+      "scope": "meta.tag.js meta.jsx.children.tsx",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "YAML Entity Name Tags",
+      "scope": "entity.name.tag.yaml",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "handlebars variables",
+      "scope": "variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "handlebars parameters",
+      "scope": "entity.other.attribute-name.handlebars variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "handlebars enitity attribute names",
+      "scope": "entity.other.attribute-name.handlebars",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "handlebars enitity attribute values",
+      "scope": "entity.other.attribute-value.handlebars variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "normalize font style of certain components",
+      "scope": [
+        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js",
+        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js",
+        "meta.property-list.css meta.property-value.css variable.other.less",
+        "punctuation.section.embedded.begin.js.jsx",
+        "punctuation.section.embedded.end.js.jsx",
+        "meta.property-list.scss variable.scss",
+        "meta.property-list.sass variable.sass",
+        "keyword.operator.logical",
+        "keyword.operator.arithmetic",
+        "keyword.operator.bitwise",
+        "keyword.operator.increment",
+        "keyword.operator.ternary",
+        "keyword.operator.comparison",
+        "keyword.operator.assignment",
+        "keyword.operator.operator",
+        "keyword.operator.or.regexp",
+        "keyword.operator.expression.in",
+        "keyword.operator.type",
+        "punctuation.section.embedded.js",
+        "punctuation.definintion.string",
+        "punctuation"
+      ],
+      "settings": {
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "italicsify for operator mono",
+      "scope": [
+        "keyword.other.unit",
+        "support.type.property-name.css",
+        "support.type.vendored.property-name.css",
+        "support.constant.vendored.property-value.css",
+        "meta.import.ts meta.block.ts variable.other.readwrite.alias.ts",
+        "meta.import.tsx meta.block.tsx variable.other.readwrite.alias.tsx",
+        "meta.import.js variable.other",
+        "meta.export.ts meta.block.ts variable.other.readwrite.alias.ts",
+        "meta.export.tsx meta.block.tsx variable.other.readwrite.alias.tsx",
+        "meta.export.js variable.other",
+        "entity.name.function.ts",
+        "entity.name.function.tsx",
+        "support.type.primitive",
+        "entity.name.tag.yaml",
+        "entity.other.attribute-name",
+        "meta.tag.sgml.doctype.html",
+        "entity.name.tag.doctype",
+        "meta.tag.sgml.doctype",
+        "entity.name.tag.custom",
+        "source.js.jsx keyword.control.flow.js",
+        "support.type.property.css",
+        "support.function.basic_functions",
+        "constant.other.color.rgb-value.hex.css",
+        "constant.other.rgb-value.css",
+        "variable.assignment.coffee",
+        "support.function.basic_functions",
+        "keyword.operator.expression.typeof",
+        "punctuation.section.embedded",
+        "keyword.operator.type.annotation",
+        "variable.object.property.ts",
+        "variable.object.property.js",
+        "variable.object.property.jsx",
+        "variable.object.property.tsx",
+        "assignment.coffee",
+        "entity.name.type.ts",
+        "support.constant.math",
+        "meta.object-literal.key",
+        "meta.var.expr storage.type",
+        "variable.scss",
+        "variable.sass",
+        "variable.other.less",
+        "variable.parameter.url.scss",
+        "variable.parameter.url.sass",
+        "parameter",
+        "string",
+        "italic",
+        "quote",
+        "keyword",
+        "storage",
+        "language",
+        "constant.language",
+        "variable.language",
+        "type .function",
+        "type.function",
+        "storage.type.class",
+        "type.var",
+        "meta.parameter",
+        "variable.parameter",
+        "meta.parameters",
+        "keyword.control",
+        "modifier",
+        "this",
+        "comment"
+      ],
+      "settings": {
+        "fontStyle": "italic"
+      }
+    }
+  ]
+}

assets/themes/src/vscode/palenight/palenight.json 🔗

@@ -1,1569 +1,1569 @@
-{

-  "name": "Palenight Theme",

-  "author": "Olaolu Olawuyi",

-  "maintainers": ["Olaolu Olawuyi <mrolaolu@gmail.com>"],

-  "type": "dark",

-  "semanticClass": "palenight",

-  "colors": {

-    "contrastActiveBorder": null,

-    "contrastBorder": "#282B3C",

-    "focusBorder": "#282B3C",

-    "foreground": "#ffffff",

-    "widget.shadow": "#232635",

-    "selection.background": "#7580B850",

-    "descriptionForeground": null,

-    "errorForeground": "#EF5350",

-    "button.background": "#7e57c2cc",

-    "button.foreground": "#ffffffcc",

-    "button.hoverBackground": "#7e57c2",

-    "dropdown.background": "#292D3E",

-    "dropdown.border": "#7e57c2",

-    "dropdown.foreground": "#ffffffcc",

-    "input.background": "#313850",

-    "input.border": "#7e57c2",

-    "input.foreground": "#ffffffcc",

-    "input.placeholderForeground": "#ffffffcc",

-    "inputOption.activeBorder": "#ffffffcc",

-    "inputValidation.errorBackground": "#ef5350f2",

-    "inputValidation.errorBorder": "#EF5350",

-    "inputValidation.infoBackground": "#64b5f6f2",

-    "inputValidation.infoBorder": "#64B5F6",

-    "inputValidation.warningBackground": "#ffca28f2",

-    "inputValidation.warningBorder": "#FFCA28",

-    "scrollbar.shadow": "#292D3E00",

-    "scrollbarSlider.activeBackground": "#694CA4cc",

-    "scrollbarSlider.background": "#694CA466",

-    "scrollbarSlider.hoverBackground": "#694CA4cc",

-    "badge.background": "#7e57c2",

-    "badge.foreground": "#ffffff",

-    "progress.background": "#7e57c2",

-    "list.activeSelectionBackground": "#7e57c2",

-    "list.activeSelectionForeground": "#ffffff",

-    "list.dropBackground": "#2E3245",

-    "list.focusBackground": "#0000002e",

-    "list.focusForeground": "#ffffff",

-    "list.highlightForeground": "#ffffff",

-    "list.hoverBackground": "#0000001a",

-    "list.hoverForeground": "#ffffff",

-    "list.inactiveSelectionBackground": "#929ac90d",

-    "list.inactiveSelectionForeground": "#929ac9",

-    "activityBar.background": "#282C3D",

-    "activityBar.dropBackground": "#7e57c2e3",

-    "activityBar.foreground": "#eeffff",

-    "activityBar.border": "#282C3D",

-    "activityBarBadge.background": "#7e57c2",

-    "activityBarBadge.foreground": "#ffffff",

-    "sideBar.background": "#292D3E",

-    "sideBar.foreground": "#6C739A",

-    "sideBar.border": "#282B3C",

-    "sideBarTitle.foreground": "#eeffff",

-    "sideBarSectionHeader.background": "#292D3E",

-    "sideBarSectionHeader.foreground": "#eeffff",

-    "editorGroup.background": "#32374C",

-    "editorGroup.border": "#2E3245",

-    "editorGroup.dropBackground": "#7e57c273",

-    "editorGroupHeader.noTabsBackground": "#32374C",

-    "editorGroupHeader.tabsBackground": "#31364a",

-    "editorGroupHeader.tabsBorder": "#262A39",

-    "tab.activeBackground": "#292D3E",

-    "tab.activeForeground": "#eeffff",

-    "tab.border": "#272B3B",

-    "tab.activeBorder": "#262A39",

-    "tab.unfocusedActiveBorder": "#262A39",

-    "tab.inactiveBackground": "#31364A",

-    "tab.inactiveForeground": "#929ac9",

-    "tab.unfocusedActiveForeground": null,

-    "tab.unfocusedInactiveForeground": null,

-    "editor.background": "#292D3E",

-    "editor.foreground": "#BFC7D5",

-    "editorLineNumber.foreground": "#4c5374",

-    "editorLineNumber.activeForeground": "#eeffff",

-    "editorCursor.foreground": "#7e57c2",

-    "editorCursor.background": null,

-    "editor.selectionBackground": "#7580B850",

-    "editor.selectionHighlightBackground": "#383D51",

-    "editor.inactiveSelectionBackground": "#7e57c25a",

-    "editor.wordHighlightBackground": "#32374D",

-    "editor.wordHighlightStrongBackground": "#2E3250",

-    "editor.findMatchBackground": "#2e3248fc",

-    "editor.findMatchHighlightBackground": "#7e57c233",

-    "editor.findRangeHighlightBackground": null,

-    "editor.hoverHighlightBackground": "#7e57c25a",

-    "editor.lineHighlightBackground": "#0003",

-    "editor.lineHighlightBorder": null,

-    "editorLink.activeForeground": null,

-    "editor.rangeHighlightBackground": "#7e57c25a",

-    "editorWhitespace.foreground": null,

-    "editorIndentGuide.background": "#4E557980",

-    "editorRuler.foreground": "#4E557980",

-    "editorCodeLens.foreground": "#FFCA28",

-    "editorBracketMatch.background": null,

-    "editorBracketMatch.border": null,

-    "editorOverviewRuler.currentContentForeground": "#7e57c2",

-    "editorOverviewRuler.incomingContentForeground": "#7e57c2",

-    "editorOverviewRuler.commonContentForeground": "#7e57c2",

-    "editorError.foreground": "#EF5350",

-    "editorError.border": null,

-    "editorWarning.foreground": "#FFCA28",

-    "editorWarning.border": null,

-    "editorGutter.background": null,

-    "editorGutter.modifiedBackground": "#e2b93d",

-    "editorGutter.addedBackground": "#9CCC65",

-    "editorGutter.deletedBackground": "#EF5350",

-    "diffEditor.insertedTextBackground": "#99b76d23",

-    "diffEditor.removedTextBackground": "#ef535033",

-    "editorWidget.background": "#31364a",

-    "editorWidget.border": null,

-    "editorSuggestWidget.background": "#2C3043",

-    "editorSuggestWidget.border": "#2B2F40",

-    "editorSuggestWidget.foreground": "#bfc7d5",

-    "editorSuggestWidget.highlightForeground": "#ffffff",

-    "editorSuggestWidget.selectedBackground": "#7e57c2",

-    "editorHoverWidget.background": "#292D3E",

-    "editorHoverWidget.border": "#7e57c2",

-    "debugExceptionWidget.background": "#292D3E",

-    "debugExceptionWidget.border": "#7e57c2",

-    "editorMarkerNavigation.background": "#31364a",

-    "editorMarkerNavigationError.background": "#EF5350",

-    "editorMarkerNavigationWarning.background": "#FFCA28",

-    "peekView.border": "#7e57c2",

-    "peekViewEditor.background": "#232635",

-    "peekViewEditor.matchHighlightBackground": "#7e57c25a",

-    "peekViewResult.background": "#2E3245",

-    "peekViewResult.fileForeground": "#eeffff",

-    "peekViewResult.lineForeground": "#eeffff",

-    "peekViewResult.matchHighlightBackground": "#7e57c25a",

-    "peekViewResult.selectionBackground": "#2E3250",

-    "peekViewResult.selectionForeground": "#eeffff",

-    "peekViewTitle.background": "#292D3E",

-    "peekViewTitleDescription.foreground": "#697098",

-    "peekViewTitleLabel.foreground": "#eeffff",

-    "merge.currentHeaderBackground": "#7e57c25a",

-    "merge.currentContentBackground": null,

-    "merge.incomingHeaderBackground": "#7e57c25a",

-    "merge.incomingContentBackground": null,

-    "merge.border": null,

-    "panel.background": "#292D3E",

-    "panel.border": "#282B3C",

-    "panelTitle.activeBorder": "#7e57c2",

-    "panelTitle.activeForeground": "#eeffff",

-    "panelTitle.inactiveForeground": "#bfc7d580",

-    "statusBar.background": "#282C3D",

-    "statusBar.foreground": "#676E95",

-    "statusBar.border": "#262A39",

-    "statusBar.debuggingBackground": "#202431",

-    "statusBar.debuggingForeground": null,

-    "statusBar.debuggingBorder": "#1F2330",

-    "statusBar.noFolderForeground": null,

-    "statusBar.noFolderBackground": "#292D3E",

-    "statusBar.noFolderBorder": "#25293A",

-    "statusBarItem.activeBackground": "#202431",

-    "statusBarItem.hoverBackground": "#202431",

-    "statusBarItem.prominentBackground": "#202431",

-    "statusBarItem.prominentHoverBackground": "#202431",

-    "titleBar.activeBackground": "#292d3e",

-    "titleBar.activeForeground": "#eeefff",

-    "titleBar.border": "#30364c",

-    "titleBar.inactiveBackground": "#30364c",

-    "titleBar.inactiveForeground": null,

-    "notifications.background": "#292D3E",

-    "notifications.foreground": "#ffffffcc",

-    "notificationLink.foreground": "#80CBC4",

-    "extensionButton.prominentForeground": "#ffffffcc",

-    "extensionButton.prominentBackground": "#7e57c2cc",

-    "extensionButton.prominentHoverBackground": "#7e57c2",

-    "pickerGroup.foreground": "#d1aaff",

-    "pickerGroup.border": "#2E3245",

-    "terminal.ansiWhite": "#ffffff",

-    "terminal.ansiBlack": "#676E95",

-    "terminal.ansiBlue": "#82AAFF",

-    "terminal.ansiCyan": "#89DDFF",

-    "terminal.ansiGreen": "#a9c77d",

-    "terminal.ansiMagenta": "#C792EA",

-    "terminal.ansiRed": "#ff5572",

-    "terminal.ansiYellow": "#FFCB6B",

-    "terminal.ansiBrightWhite": "#ffffff",

-    "terminal.ansiBrightBlack": "#676E95",

-    "terminal.ansiBrightBlue": "#82AAFF",

-    "terminal.ansiBrightCyan": "#89DDFF",

-    "terminal.ansiBrightGreen": "#C3E88D",

-    "terminal.ansiBrightMagenta": "#C792EA",

-    "terminal.ansiBrightRed": "#ff5572",

-    "terminal.ansiBrightYellow": "#FFCB6B",

-    "debugToolBar.background": "#292D3E",

-    "welcomePage.buttonBackground": null,

-    "welcomePage.buttonHoverBackground": null,

-    "walkThrough.embeddedEditorBackground": "#232635",

-    "gitDecoration.modifiedResourceForeground": "#e2c08de6",

-    "gitDecoration.deletedResourceForeground": "#EF535090",

-    "gitDecoration.untrackedResourceForeground": "#a9c77dff",

-    "gitDecoration.ignoredResourceForeground": "#69709890",

-    "gitDecoration.conflictingResourceForeground": "#FFEB95CC",

-    "editorActiveLineNumber.foreground": "#eeffff",

-    "breadcrumb.foreground": "#6c739a",

-    "breadcrumb.focusForeground": "#bfc7d5",

-    "breadcrumb.activeSelectionForeground": "#eeffff",

-    "breadcrumbPicker.background": "#292D3E"

-  },

-  "tokenColors": [

-    {

-      "name": "Global settings",

-      "settings": {

-        "background": "#292D3E",

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Comment",

-      "scope": "comment",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "String",

-      "scope": "string",

-      "settings": {

-        "foreground": "#C3E88D"

-      }

-    },

-    {

-      "name": "String Quoted",

-      "scope": "string.quoted",

-      "settings": {

-        "foreground": "#C3E88D"

-      }

-    },

-    {

-      "name": "String Unquoted",

-      "scope": "string.unquoted",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Support Constant Math",

-      "scope": "support.constant.math",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Number",

-      "scope": ["constant.numeric", "constant.character.numeric"],

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Built-in constant",

-      "scope": [

-        "constant.language",

-        "punctuation.definition.constant",

-        "variable.other.constant"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "User-defined constant",

-      "scope": ["constant.character", "constant.other"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Constant Character Escape",

-      "scope": "constant.character.escape",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "RegExp String",

-      "scope": ["string.regexp", "string.regexp keyword.other"],

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Comma in functions",

-      "scope": "meta.function punctuation.separator.comma",

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "Variable",

-      "scope": "variable",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Keyword",

-      "scope": ["punctuation.accessor", "keyword"],

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Storage",

-      "scope": [

-        "storage",

-        "storage.type",

-        "meta.var.expr storage.type",

-        "storage.type.property.js",

-        "storage.type.property.ts",

-        "storage.type.property.tsx",

-        "meta.class meta.method.declaration meta.var.expr storage.type.js"

-      ],

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Class name",

-      "scope": ["entity.name.class", "meta.class entity.name.type.class"],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Inherited class",

-      "scope": "entity.other.inherited-class",

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Function name",

-      "scope": "entity.name.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Function Parameters",

-      "scope": "variable.parameter",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "Meta Tag",

-      "scope": ["punctuation.definition.tag", "meta.tag"],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "HTML Tag names",

-      "scope": [

-        "entity.name.tag support.class.component",

-        "meta.tag.other.html",

-        "meta.tag.other.js",

-        "meta.tag.other.tsx",

-        "entity.name.tag.tsx",

-        "entity.name.tag.js",

-        "entity.name.tag",

-        "meta.tag.js",

-        "meta.tag.tsx",

-        "meta.tag.html"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Tag attribute",

-      "scope": "entity.other.attribute-name",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Entity Name Tag Custom",

-      "scope": "entity.name.tag.custom",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Library (function & constant)",

-      "scope": ["support.function", "support.constant"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Support Constant Property Value meta",

-      "scope": "support.constant.meta.property-value",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Library class/type",

-      "scope": ["support.type", "support.class"],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Support Variable DOM",

-      "scope": "support.variable.dom",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Invalid",

-      "scope": "invalid",

-      "settings": {

-        "background": "#ff2c83",

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Invalid deprecated",

-      "scope": "invalid.deprecated",

-      "settings": {

-        "foreground": "#ffffff",

-        "background": "#d3423e"

-      }

-    },

-    {

-      "name": "Keyword Operator",

-      "scope": "keyword.operator",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Relational",

-      "scope": "keyword.operator.relational",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Keyword Operator Assignment",

-      "scope": "keyword.operator.assignment",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Double-Slashed Comment",

-      "scope": "comment.line.double-slash",

-      "settings": {

-        "foreground": "#697098"

-      }

-    },

-    {

-      "name": "Object",

-      "scope": "object",

-      "settings": {

-        "foreground": "#cdebf7"

-      }

-    },

-    {

-      "name": "Null",

-      "scope": "constant.language.null",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Meta Brace",

-      "scope": "meta.brace",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Meta Delimiter Period",

-      "scope": "meta.delimiter.period",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Punctuation Definition String",

-      "scope": "punctuation.definition.string",

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Boolean",

-      "scope": "constant.language.boolean",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Object Comma",

-      "scope": "object.comma",

-      "settings": {

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Variable Parameter Function",

-      "scope": "variable.parameter.function",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Support Type Property Name & entity name tags",

-      "scope": [

-        "support.type.vendored.property-name",

-        "support.constant.vendored.property-value",

-        "support.type.property-name",

-        "meta.property-list entity.name.tag"

-      ],

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Entity Name tag reference in stylesheets",

-      "scope": "meta.property-list entity.name.tag.reference",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Constant Other Color RGB Value Punctuation Definition Constant",

-      "scope": "constant.other.color.rgb-value punctuation.definition.constant",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Constant Other Color",

-      "scope": "constant.other.color",

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Keyword Other Unit",

-      "scope": "keyword.other.unit",

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Meta Selector",

-      "scope": "meta.selector",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Entity Other Attribute Name Id",

-      "scope": "entity.other.attribute-name.id",

-      "settings": {

-        "foreground": "#FAD430"

-      }

-    },

-    {

-      "name": "Meta Property Name",

-      "scope": "meta.property-name",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Doctypes",

-      "scope": ["entity.name.tag.doctype", "meta.tag.sgml.doctype"],

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Punctuation Definition Parameters",

-      "scope": "punctuation.definition.parameters",

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Keyword Control Operator",

-      "scope": "keyword.control.operator",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Logical",

-      "scope": "keyword.operator.logical",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Variable Instances",

-      "scope": [

-        "variable.instance",

-        "variable.other.instance",

-        "variable.reaedwrite.instance",

-        "variable.other.readwrite.instance"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Variable Property Other",

-      "scope": ["variable.other.property", "variable.other.object.property"],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Entity Name Function",

-      "scope": "entity.name.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Keyword Operator Comparison",

-      "scope": "keyword.operator.comparison",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Support Constant, `new` keyword, Special Method Keyword",

-      "scope": [

-        "support.constant",

-        "keyword.other.special-method",

-        "keyword.other.new"

-      ],

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Support Function",

-      "scope": "support.function",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Invalid Broken",

-      "scope": "invalid.broken",

-      "settings": {

-        "foreground": "#020e14",

-        "background": "#F78C6C"

-      }

-    },

-    {

-      "name": "Invalid Unimplemented",

-      "scope": "invalid.unimplemented",

-      "settings": {

-        "background": "#8BD649",

-        "foreground": "#ffffff"

-      }

-    },

-    {

-      "name": "Invalid Illegal",

-      "scope": "invalid.illegal",

-      "settings": {

-        "foreground": "#ffffff",

-        "background": "#ec5f67"

-      }

-    },

-    {

-      "name": "Language Variable",

-      "scope": "variable.language",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Support Variable Property",

-      "scope": "support.variable.property",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "Variable Function",

-      "scope": "variable.function",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Variable Interpolation",

-      "scope": "variable.interpolation",

-      "settings": {

-        "foreground": "#ec5f67"

-      }

-    },

-    {

-      "name": "Meta Function Call",

-      "scope": "meta.function-call",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Punctuation Section Embedded",

-      "scope": "punctuation.section.embedded",

-      "settings": {

-        "foreground": "#d3423e"

-      }

-    },

-    {

-      "name": "Punctuation Tweaks",

-      "scope": [

-        "punctuation.terminator.expression",

-        "punctuation.definition.arguments",

-        "punctuation.definition.array",

-        "punctuation.section.array",

-        "meta.array"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "More Punctuation Tweaks",

-      "scope": [

-        "punctuation.definition.list.begin",

-        "punctuation.definition.list.end",

-        "punctuation.separator.arguments",

-        "punctuation.definition.list"

-      ],

-      "settings": {

-        "foreground": "#d9f5dd"

-      }

-    },

-    {

-      "name": "Template Strings",

-      "scope": "string.template meta.template.expression",

-      "settings": {

-        "foreground": "#d3423e"

-      }

-    },

-    {

-      "name": "Backtics(``) in Template Strings",

-      "scope": "string.template punctuation.definition.string",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Italics",

-      "scope": "italic",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Bold",

-      "scope": "bold",

-      "settings": {

-        "foreground": "#ffcb6b",

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Quote",

-      "scope": "quote",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Raw Code",

-      "scope": "raw",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "CoffeScript Variable Assignment",

-      "scope": "variable.assignment.coffee",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "CoffeScript Parameter Function",

-      "scope": "variable.parameter.function.coffee",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "CoffeeScript Assignments",

-      "scope": "variable.assignment.coffee",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "C# Readwrite Variables",

-      "scope": "variable.other.readwrite.cs",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "C# Classes & Storage types",

-      "scope": ["entity.name.type.class.cs", "storage.type.cs"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "C# Namespaces",

-      "scope": "entity.name.type.namespace.cs",

-      "settings": {

-        "foreground": "#B2CCD6"

-      }

-    },

-    {

-      "name": "Tag names in Stylesheets",

-      "scope": [

-        "entity.name.tag.css",

-        "entity.name.tag.less",

-        "entity.name.tag.custom.css"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Wildcard(*) selector in Stylesheets",

-      "scope": [

-        "entity.name.tag.wildcard.css",

-        "entity.name.tag.wildcard.less",

-        "entity.name.tag.wildcard.scss",

-        "entity.name.tag.wildcard.sass"

-      ],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "(C|SC|SA|LE)SS property value unit",

-      "scope": [

-        "keyword.other.unit.css",

-        "constant.length.units.css",

-        "keyword.other.unit.less",

-        "constant.length.units.less",

-        "keyword.other.unit.scss",

-        "constant.length.units.scss",

-        "keyword.other.unit.sass",

-        "constant.length.units.sass"

-      ],

-      "settings": {

-        "foreground": "#FFEB95"

-      }

-    },

-    {

-      "name": "Attribute Name for CSS",

-      "scope": "meta.attribute-selector.css entity.other.attribute-name.attribute",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "punctuations in styled components",

-      "scope": [

-        "source.js source.css meta.property-list",

-        "source.js source.css punctuation.section",

-        "source.js source.css punctuation.terminator.rule",

-        "source.js source.css punctuation.definition.entity.end.bracket",

-        "source.js source.css punctuation.definition.entity.begin.bracket",

-        "source.js source.css punctuation.separator.key-value",

-        "source.js source.css punctuation.definition.attribute-selector",

-        "source.js source.css meta.property-list",

-        "source.js source.css meta.property-list punctuation.separator.comma",

-        "source.ts source.css punctuation.section",

-        "source.ts source.css punctuation.terminator.rule",

-        "source.ts source.css punctuation.definition.entity.end.bracket",

-        "source.ts source.css punctuation.definition.entity.begin.bracket",

-        "source.ts source.css punctuation.separator.key-value",

-        "source.ts source.css punctuation.definition.attribute-selector",

-        "source.ts source.css meta.property-list",

-        "source.ts source.css meta.property-list punctuation.separator.comma"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Elixir Classes",

-      "scope": [

-        "source.elixir support.type.elixir",

-        "source.elixir meta.module.elixir entity.name.class.elixir"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Elixir Functions",

-      "scope": "source.elixir entity.name.function",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Elixir Constants",

-      "scope": [

-        "source.elixir constant.other.symbol.elixir",

-        "source.elixir constant.other.keywords.elixir"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Elixir String Punctuations",

-      "scope": "source.elixir punctuation.definition.string",

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Elixir",

-      "scope": [

-        "source.elixir variable.other.readwrite.module.elixir",

-        "source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir"

-      ],

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Elixir Binary Punctuations",

-      "scope": "source.elixir .punctuation.binary.elixir",

-      "settings": {

-        "foreground": "#c792ea"

-      }

-    },

-    {

-      "name": "Go Function Calls",

-      "scope": "source.go meta.function-call.go",

-      "settings": {

-        "foreground": "#DDDDDD"

-      }

-    },

-    {

-      "name": "GraphQL Variables",

-      "scope": "variable.qraphql",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "ID Attribute Name in HTML",

-      "scope": "entity.other.attribute-name.id.html",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "HTML Punctuation Definition Tag",

-      "scope": "punctuation.definition.tag.html",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "HTML Doctype",

-      "scope": "meta.tag.sgml.doctype.html",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "JavaScript Classes",

-      "scope": "meta.class entity.name.type.class.js",

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "JavaScript Method Declaration e.g. `constructor`",

-      "scope": "meta.method.declaration storage.type.js",

-      "settings": {

-        "foreground": "#82AAFF",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "JavaScript Terminator",

-      "scope": "terminator.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Meta Punctuation Definition",

-      "scope": "meta.js punctuation.definition.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Entity Names in Code Documentations",

-      "scope": [

-        "entity.name.type.instance.jsdoc",

-        "entity.name.type.instance.phpdoc"

-      ],

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "Other Variables in Code Documentations",

-      "scope": ["variable.other.jsdoc", "variable.other.phpdoc"],

-      "settings": {

-        "foreground": "#78ccf0"

-      }

-    },

-    {

-      "name": "JavaScript module imports and exports",

-      "scope": [

-        "variable.other.meta.import.js",

-        "meta.import.js variable.other",

-        "variable.other.meta.export.js",

-        "meta.export.js variable.other"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Variable Parameter Function",

-      "scope": "variable.parameter.function.js",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "JavaScript Variable Other ReadWrite",

-      "scope": "variable.other.readwrite.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Text nested in React tags",

-      "scope": [

-        "meta.jsx.children",

-        "meta.jsx.children.js",

-        "meta.jsx.children.tsx"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript[React] Variable Other Object",

-      "scope": [

-        "variable.other.object.js",

-        "variable.other.object.jsx",

-        "meta.object-literal.key.js",

-        "meta.object-literal.key.jsx",

-        "variable.object.property.js",

-        "variable.object.property.jsx"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Variables",

-      "scope": ["variable.js", "variable.other.js"],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JavaScript Entity Name Type",

-      "scope": ["entity.name.type.js", "entity.name.type.module.js"],

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "JavaScript Support Classes",

-      "scope": "support.class.js",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "JSON Property Names",

-      "scope": "support.type.property-name.json",

-      "settings": {

-        "foreground": "#C3E88D",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "JSON Support Constants",

-      "scope": "support.constant.json",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "JSON Property values (string)",

-      "scope": "meta.structure.dictionary.value.json string.quoted.double",

-      "settings": {

-        "foreground": "#80CBC4",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "Strings in JSON values",

-      "scope": "string.quoted.double.json punctuation.definition.string.json",

-      "settings": {

-        "foreground": "#80CBC4",

-        "fontStyle": "normal"

-      }

-    },

-    {

-      "name": "Specific JSON Property values like null",

-      "scope": "meta.structure.dictionary.json meta.structure.dictionary.value constant.language",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Ruby Variables",

-      "scope": "variable.other.ruby",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Ruby Hashkeys",

-      "scope": "constant.language.symbol.hashkey.ruby",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "LESS Tag names",

-      "scope": "entity.name.tag.less",

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Attribute Name for LESS",

-      "scope": "meta.attribute-selector.less entity.other.attribute-name.attribute",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Markup Headings",

-      "scope": "markup.heading",

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Markup Italics",

-      "scope": "markup.italic",

-      "settings": {

-        "foreground": "#c792ea",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markup Bold",

-      "scope": "markup.bold",

-      "settings": {

-        "foreground": "#ffcb6b",

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Markup Quote + others",

-      "scope": "markup.quote",

-      "settings": {

-        "foreground": "#697098",

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markup Raw Code + others",

-      "scope": "markup.inline.raw",

-      "settings": {

-        "foreground": "#80CBC4"

-      }

-    },

-    {

-      "name": "Markup Links",

-      "scope": ["markup.underline.link", "markup.underline.link.image"],

-      "settings": {

-        "foreground": "#ff869a"

-      }

-    },

-    {

-      "name": "Markup Attributes",

-      "scope": ["markup.meta.attribute-list"],

-      "settings": {

-        "foreground": "#a9c77d"

-      }

-    },

-    {

-      "name": "Markup Admonitions",

-      "scope": "markup.admonition",

-      "settings": {

-        "fontStyle": "bold"

-      }

-    },

-    {

-      "name": "Markup Lists",

-      "scope": "markup.list.bullet",

-      "settings": {

-        "foreground": "#D9F5DD"

-      }

-    },

-    {

-      "name": "Markup Superscript and Subscript",

-      "scope": ["markup.superscript", "markup.subscript"],

-      "settings": {

-        "fontStyle": "italic"

-      }

-    },

-    {

-      "name": "Markdown Link Title and Description",

-      "scope": [

-        "string.other.link.title.markdown",

-        "string.other.link.description.markdown"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Markdown Punctuation",

-      "scope": [

-        "punctuation.definition.string.markdown",

-        "punctuation.definition.string.begin.markdown",

-        "punctuation.definition.string.end.markdown",

-        "meta.link.inline.markdown punctuation.definition.string"

-      ],

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Markdown MetaData Punctuation",

-      "scope": ["punctuation.definition.metadata.markdown"],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "Markdown List Punctuation",

-      "scope": ["beginning.punctuation.definition.list.markdown"],

-      "settings": {

-        "foreground": "#82b1ff"

-      }

-    },

-    {

-      "name": "Asciidoc Function",

-      "scope": "entity.name.function.asciidoc",

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "PHP Variables",

-      "scope": "variable.other.php",

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "Support Classes in PHP",

-      "scope": "support.class.php",

-      "settings": {

-        "foreground": "#ffcb8b"

-      }

-    },

-    {

-      "name": "Punctuations in PHP function calls",

-      "scope": "meta.function-call.php punctuation",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "PHP Global Variables",

-      "scope": "variable.other.global.php",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Declaration Punctuation in PHP Global Variables",

-      "scope": "variable.other.global.php punctuation.definition.variable",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Language Constants in Python",

-      "scope": "constant.language.python",

-      "settings": {

-        "foreground": "#ff5874"

-      }

-    },

-    {

-      "name": "Python Function Parameter and Arguments",

-      "scope": [

-        "variable.parameter.function.python",

-        "meta.function-call.arguments.python"

-      ],

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "Python Function Call",

-      "scope": [

-        "meta.function-call.python",

-        "meta.function-call.generic.python"

-      ],

-      "settings": {

-        "foreground": "#B2CCD6"

-      }

-    },

-    {

-      "name": "Punctuations in Python",

-      "scope": "punctuation.python",

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "Decorator Functions in Python",

-      "scope": "entity.name.function.decorator.python",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "Python Language Variable",

-      "scope": "source.python variable.language.special",

-      "settings": {

-        "foreground": "#8EACE3"

-      }

-    },

-    {

-      "name": "SCSS Variable",

-      "scope": [

-        "variable.scss",

-        "variable.sass",

-        "variable.parameter.url.scss",

-        "variable.parameter.url.sass"

-      ],

-      "settings": {

-        "foreground": "#DDDDDD"

-      }

-    },

-    {

-      "name": "Variables in SASS At-Rules",

-      "scope": [

-        "source.css.scss meta.at-rule variable",

-        "source.css.sass meta.at-rule variable"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "Variables in SASS At-Rules",

-      "scope": [

-        "source.css.scss meta.at-rule variable",

-        "source.css.sass meta.at-rule variable"

-      ],

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "Attribute Name for SASS",

-      "scope": [

-        "meta.attribute-selector.scss entity.other.attribute-name.attribute",

-        "meta.attribute-selector.sass entity.other.attribute-name.attribute"

-      ],

-      "settings": {

-        "foreground": "#F78C6C"

-      }

-    },

-    {

-      "name": "Tag names in SASS",

-      "scope": ["entity.name.tag.scss", "entity.name.tag.sass"],

-      "settings": {

-        "foreground": "#ff5572"

-      }

-    },

-    {

-      "name": "TypeScript[React] Variables and Object Properties",

-      "scope": [

-        "variable.other.readwrite.alias.ts",

-        "variable.other.readwrite.alias.tsx",

-        "variable.other.readwrite.ts",

-        "variable.other.readwrite.tsx",

-        "variable.other.object.ts",

-        "variable.other.object.tsx",

-        "variable.object.property.ts",

-        "variable.object.property.tsx",

-        "variable.other.ts",

-        "variable.other.tsx",

-        "variable.tsx",

-        "variable.ts"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "TypeScript[React] Entity Name Types",

-      "scope": ["entity.name.type.ts", "entity.name.type.tsx"],

-      "settings": {

-        "foreground": "#78ccf0"

-      }

-    },

-    {

-      "name": "TypeScript[React] Node Classes",

-      "scope": ["support.class.node.ts", "support.class.node.tsx"],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "TypeScript[React] Entity Name Types as Parameters",

-      "scope": [

-        "meta.type.parameters.ts entity.name.type",

-        "meta.type.parameters.tsx entity.name.type"

-      ],

-      "settings": {

-        "foreground": "#eeffff"

-      }

-    },

-    {

-      "name": "TypeScript[React] Import/Export Punctuations",

-      "scope": [

-        "meta.import.ts punctuation.definition.block",

-        "meta.import.tsx punctuation.definition.block",

-        "meta.export.ts punctuation.definition.block",

-        "meta.export.tsx punctuation.definition.block"

-      ],

-      "settings": {

-        "foreground": "#bfc7d5"

-      }

-    },

-    {

-      "name": "TypeScript[React] Punctuation Decorators",

-      "scope": [

-        "meta.decorator punctuation.decorator.ts",

-        "meta.decorator punctuation.decorator.tsx"

-      ],

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "TypeScript[React] Punctuation Decorators",

-      "scope": "meta.tag.js meta.jsx.children.tsx",

-      "settings": {

-        "foreground": "#82AAFF"

-      }

-    },

-    {

-      "name": "YAML Entity Name Tags",

-      "scope": "entity.name.tag.yaml",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "handlebars variables",

-      "scope": "variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#bec5d4"

-      }

-    },

-    {

-      "name": "handlebars parameters",

-      "scope": "entity.other.attribute-name.handlebars variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#ffcb6b"

-      }

-    },

-    {

-      "name": "handlebars enitity attribute names",

-      "scope": "entity.other.attribute-name.handlebars",

-      "settings": {

-        "foreground": "#89DDFF"

-      }

-    },

-    {

-      "name": "handlebars enitity attribute values",

-      "scope": "entity.other.attribute-value.handlebars variable.parameter.handlebars",

-      "settings": {

-        "foreground": "#7986E7"

-      }

-    },

-    {

-      "name": "normalize font style of certain components",

-      "scope": [

-        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js",

-        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js",

-        "meta.property-list.css meta.property-value.css variable.other.less",

-        "punctuation.section.embedded.begin.js.jsx",

-        "punctuation.section.embedded.end.js.jsx",

-        "meta.property-list.scss variable.scss",

-        "meta.property-list.sass variable.sass",

-        "keyword.operator.logical",

-        "keyword.operator.arithmetic",

-        "keyword.operator.bitwise",

-        "keyword.operator.increment",

-        "keyword.operator.ternary",

-        "keyword.operator.comparison",

-        "keyword.operator.assignment",

-        "keyword.operator.operator",

-        "keyword.operator.or.regexp",

-        "keyword.operator.expression.in",

-        "keyword.operator.type",

-        "punctuation.section.embedded.js",

-        "punctuation.definintion.string",

-        "punctuation"

-      ],

-      "settings": {

-        "fontStyle": "normal"

-      }

-    }

-  ]

-}

+{
+  "name": "Palenight Theme",
+  "author": "Olaolu Olawuyi",
+  "maintainers": ["Olaolu Olawuyi <mrolaolu@gmail.com>"],
+  "type": "dark",
+  "semanticClass": "palenight",
+  "colors": {
+    "contrastActiveBorder": null,
+    "contrastBorder": "#282B3C",
+    "focusBorder": "#282B3C",
+    "foreground": "#ffffff",
+    "widget.shadow": "#232635",
+    "selection.background": "#7580B850",
+    "descriptionForeground": null,
+    "errorForeground": "#EF5350",
+    "button.background": "#7e57c2cc",
+    "button.foreground": "#ffffffcc",
+    "button.hoverBackground": "#7e57c2",
+    "dropdown.background": "#292D3E",
+    "dropdown.border": "#7e57c2",
+    "dropdown.foreground": "#ffffffcc",
+    "input.background": "#313850",
+    "input.border": "#7e57c2",
+    "input.foreground": "#ffffffcc",
+    "input.placeholderForeground": "#ffffffcc",
+    "inputOption.activeBorder": "#ffffffcc",
+    "inputValidation.errorBackground": "#ef5350f2",
+    "inputValidation.errorBorder": "#EF5350",
+    "inputValidation.infoBackground": "#64b5f6f2",
+    "inputValidation.infoBorder": "#64B5F6",
+    "inputValidation.warningBackground": "#ffca28f2",
+    "inputValidation.warningBorder": "#FFCA28",
+    "scrollbar.shadow": "#292D3E00",
+    "scrollbarSlider.activeBackground": "#694CA4cc",
+    "scrollbarSlider.background": "#694CA466",
+    "scrollbarSlider.hoverBackground": "#694CA4cc",
+    "badge.background": "#7e57c2",
+    "badge.foreground": "#ffffff",
+    "progress.background": "#7e57c2",
+    "list.activeSelectionBackground": "#7e57c2",
+    "list.activeSelectionForeground": "#ffffff",
+    "list.dropBackground": "#2E3245",
+    "list.focusBackground": "#0000002e",
+    "list.focusForeground": "#ffffff",
+    "list.highlightForeground": "#ffffff",
+    "list.hoverBackground": "#0000001a",
+    "list.hoverForeground": "#ffffff",
+    "list.inactiveSelectionBackground": "#929ac90d",
+    "list.inactiveSelectionForeground": "#929ac9",
+    "activityBar.background": "#282C3D",
+    "activityBar.dropBackground": "#7e57c2e3",
+    "activityBar.foreground": "#eeffff",
+    "activityBar.border": "#282C3D",
+    "activityBarBadge.background": "#7e57c2",
+    "activityBarBadge.foreground": "#ffffff",
+    "sideBar.background": "#292D3E",
+    "sideBar.foreground": "#6C739A",
+    "sideBar.border": "#282B3C",
+    "sideBarTitle.foreground": "#eeffff",
+    "sideBarSectionHeader.background": "#292D3E",
+    "sideBarSectionHeader.foreground": "#eeffff",
+    "editorGroup.background": "#32374C",
+    "editorGroup.border": "#2E3245",
+    "editorGroup.dropBackground": "#7e57c273",
+    "editorGroupHeader.noTabsBackground": "#32374C",
+    "editorGroupHeader.tabsBackground": "#31364a",
+    "editorGroupHeader.tabsBorder": "#262A39",
+    "tab.activeBackground": "#292D3E",
+    "tab.activeForeground": "#eeffff",
+    "tab.border": "#272B3B",
+    "tab.activeBorder": "#262A39",
+    "tab.unfocusedActiveBorder": "#262A39",
+    "tab.inactiveBackground": "#31364A",
+    "tab.inactiveForeground": "#929ac9",
+    "tab.unfocusedActiveForeground": null,
+    "tab.unfocusedInactiveForeground": null,
+    "editor.background": "#292D3E",
+    "editor.foreground": "#BFC7D5",
+    "editorLineNumber.foreground": "#4c5374",
+    "editorLineNumber.activeForeground": "#eeffff",
+    "editorCursor.foreground": "#7e57c2",
+    "editorCursor.background": null,
+    "editor.selectionBackground": "#7580B850",
+    "editor.selectionHighlightBackground": "#383D51",
+    "editor.inactiveSelectionBackground": "#7e57c25a",
+    "editor.wordHighlightBackground": "#32374D",
+    "editor.wordHighlightStrongBackground": "#2E3250",
+    "editor.findMatchBackground": "#2e3248fc",
+    "editor.findMatchHighlightBackground": "#7e57c233",
+    "editor.findRangeHighlightBackground": null,
+    "editor.hoverHighlightBackground": "#7e57c25a",
+    "editor.lineHighlightBackground": "#0003",
+    "editor.lineHighlightBorder": null,
+    "editorLink.activeForeground": null,
+    "editor.rangeHighlightBackground": "#7e57c25a",
+    "editorWhitespace.foreground": null,
+    "editorIndentGuide.background": "#4E557980",
+    "editorRuler.foreground": "#4E557980",
+    "editorCodeLens.foreground": "#FFCA28",
+    "editorBracketMatch.background": null,
+    "editorBracketMatch.border": null,
+    "editorOverviewRuler.currentContentForeground": "#7e57c2",
+    "editorOverviewRuler.incomingContentForeground": "#7e57c2",
+    "editorOverviewRuler.commonContentForeground": "#7e57c2",
+    "editorError.foreground": "#EF5350",
+    "editorError.border": null,
+    "editorWarning.foreground": "#FFCA28",
+    "editorWarning.border": null,
+    "editorGutter.background": null,
+    "editorGutter.modifiedBackground": "#e2b93d",
+    "editorGutter.addedBackground": "#9CCC65",
+    "editorGutter.deletedBackground": "#EF5350",
+    "diffEditor.insertedTextBackground": "#99b76d23",
+    "diffEditor.removedTextBackground": "#ef535033",
+    "editorWidget.background": "#31364a",
+    "editorWidget.border": null,
+    "editorSuggestWidget.background": "#2C3043",
+    "editorSuggestWidget.border": "#2B2F40",
+    "editorSuggestWidget.foreground": "#bfc7d5",
+    "editorSuggestWidget.highlightForeground": "#ffffff",
+    "editorSuggestWidget.selectedBackground": "#7e57c2",
+    "editorHoverWidget.background": "#292D3E",
+    "editorHoverWidget.border": "#7e57c2",
+    "debugExceptionWidget.background": "#292D3E",
+    "debugExceptionWidget.border": "#7e57c2",
+    "editorMarkerNavigation.background": "#31364a",
+    "editorMarkerNavigationError.background": "#EF5350",
+    "editorMarkerNavigationWarning.background": "#FFCA28",
+    "peekView.border": "#7e57c2",
+    "peekViewEditor.background": "#232635",
+    "peekViewEditor.matchHighlightBackground": "#7e57c25a",
+    "peekViewResult.background": "#2E3245",
+    "peekViewResult.fileForeground": "#eeffff",
+    "peekViewResult.lineForeground": "#eeffff",
+    "peekViewResult.matchHighlightBackground": "#7e57c25a",
+    "peekViewResult.selectionBackground": "#2E3250",
+    "peekViewResult.selectionForeground": "#eeffff",
+    "peekViewTitle.background": "#292D3E",
+    "peekViewTitleDescription.foreground": "#697098",
+    "peekViewTitleLabel.foreground": "#eeffff",
+    "merge.currentHeaderBackground": "#7e57c25a",
+    "merge.currentContentBackground": null,
+    "merge.incomingHeaderBackground": "#7e57c25a",
+    "merge.incomingContentBackground": null,
+    "merge.border": null,
+    "panel.background": "#292D3E",
+    "panel.border": "#282B3C",
+    "panelTitle.activeBorder": "#7e57c2",
+    "panelTitle.activeForeground": "#eeffff",
+    "panelTitle.inactiveForeground": "#bfc7d580",
+    "statusBar.background": "#282C3D",
+    "statusBar.foreground": "#676E95",
+    "statusBar.border": "#262A39",
+    "statusBar.debuggingBackground": "#202431",
+    "statusBar.debuggingForeground": null,
+    "statusBar.debuggingBorder": "#1F2330",
+    "statusBar.noFolderForeground": null,
+    "statusBar.noFolderBackground": "#292D3E",
+    "statusBar.noFolderBorder": "#25293A",
+    "statusBarItem.activeBackground": "#202431",
+    "statusBarItem.hoverBackground": "#202431",
+    "statusBarItem.prominentBackground": "#202431",
+    "statusBarItem.prominentHoverBackground": "#202431",
+    "titleBar.activeBackground": "#292d3e",
+    "titleBar.activeForeground": "#eeefff",
+    "titleBar.border": "#30364c",
+    "titleBar.inactiveBackground": "#30364c",
+    "titleBar.inactiveForeground": null,
+    "notifications.background": "#292D3E",
+    "notifications.foreground": "#ffffffcc",
+    "notificationLink.foreground": "#80CBC4",
+    "extensionButton.prominentForeground": "#ffffffcc",
+    "extensionButton.prominentBackground": "#7e57c2cc",
+    "extensionButton.prominentHoverBackground": "#7e57c2",
+    "pickerGroup.foreground": "#d1aaff",
+    "pickerGroup.border": "#2E3245",
+    "terminal.ansiWhite": "#ffffff",
+    "terminal.ansiBlack": "#676E95",
+    "terminal.ansiBlue": "#82AAFF",
+    "terminal.ansiCyan": "#89DDFF",
+    "terminal.ansiGreen": "#a9c77d",
+    "terminal.ansiMagenta": "#C792EA",
+    "terminal.ansiRed": "#ff5572",
+    "terminal.ansiYellow": "#FFCB6B",
+    "terminal.ansiBrightWhite": "#ffffff",
+    "terminal.ansiBrightBlack": "#676E95",
+    "terminal.ansiBrightBlue": "#82AAFF",
+    "terminal.ansiBrightCyan": "#89DDFF",
+    "terminal.ansiBrightGreen": "#C3E88D",
+    "terminal.ansiBrightMagenta": "#C792EA",
+    "terminal.ansiBrightRed": "#ff5572",
+    "terminal.ansiBrightYellow": "#FFCB6B",
+    "debugToolBar.background": "#292D3E",
+    "welcomePage.buttonBackground": null,
+    "welcomePage.buttonHoverBackground": null,
+    "walkThrough.embeddedEditorBackground": "#232635",
+    "gitDecoration.modifiedResourceForeground": "#e2c08de6",
+    "gitDecoration.deletedResourceForeground": "#EF535090",
+    "gitDecoration.untrackedResourceForeground": "#a9c77dff",
+    "gitDecoration.ignoredResourceForeground": "#69709890",
+    "gitDecoration.conflictingResourceForeground": "#FFEB95CC",
+    "editorActiveLineNumber.foreground": "#eeffff",
+    "breadcrumb.foreground": "#6c739a",
+    "breadcrumb.focusForeground": "#bfc7d5",
+    "breadcrumb.activeSelectionForeground": "#eeffff",
+    "breadcrumbPicker.background": "#292D3E"
+  },
+  "tokenColors": [
+    {
+      "name": "Global settings",
+      "settings": {
+        "background": "#292D3E",
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Comment",
+      "scope": "comment",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "String",
+      "scope": "string",
+      "settings": {
+        "foreground": "#C3E88D"
+      }
+    },
+    {
+      "name": "String Quoted",
+      "scope": "string.quoted",
+      "settings": {
+        "foreground": "#C3E88D"
+      }
+    },
+    {
+      "name": "String Unquoted",
+      "scope": "string.unquoted",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Support Constant Math",
+      "scope": "support.constant.math",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Number",
+      "scope": ["constant.numeric", "constant.character.numeric"],
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Built-in constant",
+      "scope": [
+        "constant.language",
+        "punctuation.definition.constant",
+        "variable.other.constant"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "User-defined constant",
+      "scope": ["constant.character", "constant.other"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Constant Character Escape",
+      "scope": "constant.character.escape",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "RegExp String",
+      "scope": ["string.regexp", "string.regexp keyword.other"],
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Comma in functions",
+      "scope": "meta.function punctuation.separator.comma",
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "Variable",
+      "scope": "variable",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Keyword",
+      "scope": ["punctuation.accessor", "keyword"],
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Storage",
+      "scope": [
+        "storage",
+        "storage.type",
+        "meta.var.expr storage.type",
+        "storage.type.property.js",
+        "storage.type.property.ts",
+        "storage.type.property.tsx",
+        "meta.class meta.method.declaration meta.var.expr storage.type.js"
+      ],
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": ["entity.name.class", "meta.class entity.name.type.class"],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Inherited class",
+      "scope": "entity.other.inherited-class",
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Function name",
+      "scope": "entity.name.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Function Parameters",
+      "scope": "variable.parameter",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "Meta Tag",
+      "scope": ["punctuation.definition.tag", "meta.tag"],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "HTML Tag names",
+      "scope": [
+        "entity.name.tag support.class.component",
+        "meta.tag.other.html",
+        "meta.tag.other.js",
+        "meta.tag.other.tsx",
+        "entity.name.tag.tsx",
+        "entity.name.tag.js",
+        "entity.name.tag",
+        "meta.tag.js",
+        "meta.tag.tsx",
+        "meta.tag.html"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Tag attribute",
+      "scope": "entity.other.attribute-name",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Entity Name Tag Custom",
+      "scope": "entity.name.tag.custom",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Library (function & constant)",
+      "scope": ["support.function", "support.constant"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Support Constant Property Value meta",
+      "scope": "support.constant.meta.property-value",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Library class/type",
+      "scope": ["support.type", "support.class"],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Support Variable DOM",
+      "scope": "support.variable.dom",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Invalid",
+      "scope": "invalid",
+      "settings": {
+        "background": "#ff2c83",
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Invalid deprecated",
+      "scope": "invalid.deprecated",
+      "settings": {
+        "foreground": "#ffffff",
+        "background": "#d3423e"
+      }
+    },
+    {
+      "name": "Keyword Operator",
+      "scope": "keyword.operator",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Relational",
+      "scope": "keyword.operator.relational",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Keyword Operator Assignment",
+      "scope": "keyword.operator.assignment",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Double-Slashed Comment",
+      "scope": "comment.line.double-slash",
+      "settings": {
+        "foreground": "#697098"
+      }
+    },
+    {
+      "name": "Object",
+      "scope": "object",
+      "settings": {
+        "foreground": "#cdebf7"
+      }
+    },
+    {
+      "name": "Null",
+      "scope": "constant.language.null",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Meta Brace",
+      "scope": "meta.brace",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Meta Delimiter Period",
+      "scope": "meta.delimiter.period",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Punctuation Definition String",
+      "scope": "punctuation.definition.string",
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Boolean",
+      "scope": "constant.language.boolean",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Object Comma",
+      "scope": "object.comma",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Variable Parameter Function",
+      "scope": "variable.parameter.function",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Support Type Property Name & entity name tags",
+      "scope": [
+        "support.type.vendored.property-name",
+        "support.constant.vendored.property-value",
+        "support.type.property-name",
+        "meta.property-list entity.name.tag"
+      ],
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Entity Name tag reference in stylesheets",
+      "scope": "meta.property-list entity.name.tag.reference",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Constant Other Color RGB Value Punctuation Definition Constant",
+      "scope": "constant.other.color.rgb-value punctuation.definition.constant",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Constant Other Color",
+      "scope": "constant.other.color",
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Keyword Other Unit",
+      "scope": "keyword.other.unit",
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Meta Selector",
+      "scope": "meta.selector",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Entity Other Attribute Name Id",
+      "scope": "entity.other.attribute-name.id",
+      "settings": {
+        "foreground": "#FAD430"
+      }
+    },
+    {
+      "name": "Meta Property Name",
+      "scope": "meta.property-name",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Doctypes",
+      "scope": ["entity.name.tag.doctype", "meta.tag.sgml.doctype"],
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Punctuation Definition Parameters",
+      "scope": "punctuation.definition.parameters",
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Keyword Control Operator",
+      "scope": "keyword.control.operator",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Logical",
+      "scope": "keyword.operator.logical",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Variable Instances",
+      "scope": [
+        "variable.instance",
+        "variable.other.instance",
+        "variable.reaedwrite.instance",
+        "variable.other.readwrite.instance"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Variable Property Other",
+      "scope": ["variable.other.property", "variable.other.object.property"],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Entity Name Function",
+      "scope": "entity.name.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Keyword Operator Comparison",
+      "scope": "keyword.operator.comparison",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Support Constant, `new` keyword, Special Method Keyword",
+      "scope": [
+        "support.constant",
+        "keyword.other.special-method",
+        "keyword.other.new"
+      ],
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Support Function",
+      "scope": "support.function",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Invalid Broken",
+      "scope": "invalid.broken",
+      "settings": {
+        "foreground": "#020e14",
+        "background": "#F78C6C"
+      }
+    },
+    {
+      "name": "Invalid Unimplemented",
+      "scope": "invalid.unimplemented",
+      "settings": {
+        "background": "#8BD649",
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Invalid Illegal",
+      "scope": "invalid.illegal",
+      "settings": {
+        "foreground": "#ffffff",
+        "background": "#ec5f67"
+      }
+    },
+    {
+      "name": "Language Variable",
+      "scope": "variable.language",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Support Variable Property",
+      "scope": "support.variable.property",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "Variable Function",
+      "scope": "variable.function",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Variable Interpolation",
+      "scope": "variable.interpolation",
+      "settings": {
+        "foreground": "#ec5f67"
+      }
+    },
+    {
+      "name": "Meta Function Call",
+      "scope": "meta.function-call",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Punctuation Section Embedded",
+      "scope": "punctuation.section.embedded",
+      "settings": {
+        "foreground": "#d3423e"
+      }
+    },
+    {
+      "name": "Punctuation Tweaks",
+      "scope": [
+        "punctuation.terminator.expression",
+        "punctuation.definition.arguments",
+        "punctuation.definition.array",
+        "punctuation.section.array",
+        "meta.array"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "More Punctuation Tweaks",
+      "scope": [
+        "punctuation.definition.list.begin",
+        "punctuation.definition.list.end",
+        "punctuation.separator.arguments",
+        "punctuation.definition.list"
+      ],
+      "settings": {
+        "foreground": "#d9f5dd"
+      }
+    },
+    {
+      "name": "Template Strings",
+      "scope": "string.template meta.template.expression",
+      "settings": {
+        "foreground": "#d3423e"
+      }
+    },
+    {
+      "name": "Backtics(``) in Template Strings",
+      "scope": "string.template punctuation.definition.string",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Italics",
+      "scope": "italic",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "bold",
+      "settings": {
+        "foreground": "#ffcb6b",
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Quote",
+      "scope": "quote",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Raw Code",
+      "scope": "raw",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "CoffeScript Variable Assignment",
+      "scope": "variable.assignment.coffee",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "CoffeScript Parameter Function",
+      "scope": "variable.parameter.function.coffee",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "CoffeeScript Assignments",
+      "scope": "variable.assignment.coffee",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "C# Readwrite Variables",
+      "scope": "variable.other.readwrite.cs",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "C# Classes & Storage types",
+      "scope": ["entity.name.type.class.cs", "storage.type.cs"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "C# Namespaces",
+      "scope": "entity.name.type.namespace.cs",
+      "settings": {
+        "foreground": "#B2CCD6"
+      }
+    },
+    {
+      "name": "Tag names in Stylesheets",
+      "scope": [
+        "entity.name.tag.css",
+        "entity.name.tag.less",
+        "entity.name.tag.custom.css"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Wildcard(*) selector in Stylesheets",
+      "scope": [
+        "entity.name.tag.wildcard.css",
+        "entity.name.tag.wildcard.less",
+        "entity.name.tag.wildcard.scss",
+        "entity.name.tag.wildcard.sass"
+      ],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "(C|SC|SA|LE)SS property value unit",
+      "scope": [
+        "keyword.other.unit.css",
+        "constant.length.units.css",
+        "keyword.other.unit.less",
+        "constant.length.units.less",
+        "keyword.other.unit.scss",
+        "constant.length.units.scss",
+        "keyword.other.unit.sass",
+        "constant.length.units.sass"
+      ],
+      "settings": {
+        "foreground": "#FFEB95"
+      }
+    },
+    {
+      "name": "Attribute Name for CSS",
+      "scope": "meta.attribute-selector.css entity.other.attribute-name.attribute",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "punctuations in styled components",
+      "scope": [
+        "source.js source.css meta.property-list",
+        "source.js source.css punctuation.section",
+        "source.js source.css punctuation.terminator.rule",
+        "source.js source.css punctuation.definition.entity.end.bracket",
+        "source.js source.css punctuation.definition.entity.begin.bracket",
+        "source.js source.css punctuation.separator.key-value",
+        "source.js source.css punctuation.definition.attribute-selector",
+        "source.js source.css meta.property-list",
+        "source.js source.css meta.property-list punctuation.separator.comma",
+        "source.ts source.css punctuation.section",
+        "source.ts source.css punctuation.terminator.rule",
+        "source.ts source.css punctuation.definition.entity.end.bracket",
+        "source.ts source.css punctuation.definition.entity.begin.bracket",
+        "source.ts source.css punctuation.separator.key-value",
+        "source.ts source.css punctuation.definition.attribute-selector",
+        "source.ts source.css meta.property-list",
+        "source.ts source.css meta.property-list punctuation.separator.comma"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Elixir Classes",
+      "scope": [
+        "source.elixir support.type.elixir",
+        "source.elixir meta.module.elixir entity.name.class.elixir"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Elixir Functions",
+      "scope": "source.elixir entity.name.function",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Elixir Constants",
+      "scope": [
+        "source.elixir constant.other.symbol.elixir",
+        "source.elixir constant.other.keywords.elixir"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Elixir String Punctuations",
+      "scope": "source.elixir punctuation.definition.string",
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Elixir",
+      "scope": [
+        "source.elixir variable.other.readwrite.module.elixir",
+        "source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir"
+      ],
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Elixir Binary Punctuations",
+      "scope": "source.elixir .punctuation.binary.elixir",
+      "settings": {
+        "foreground": "#c792ea"
+      }
+    },
+    {
+      "name": "Go Function Calls",
+      "scope": "source.go meta.function-call.go",
+      "settings": {
+        "foreground": "#DDDDDD"
+      }
+    },
+    {
+      "name": "GraphQL Variables",
+      "scope": "variable.qraphql",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "ID Attribute Name in HTML",
+      "scope": "entity.other.attribute-name.id.html",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "HTML Punctuation Definition Tag",
+      "scope": "punctuation.definition.tag.html",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "HTML Doctype",
+      "scope": "meta.tag.sgml.doctype.html",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "JavaScript Classes",
+      "scope": "meta.class entity.name.type.class.js",
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "JavaScript Method Declaration e.g. `constructor`",
+      "scope": "meta.method.declaration storage.type.js",
+      "settings": {
+        "foreground": "#82AAFF",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "JavaScript Terminator",
+      "scope": "terminator.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Meta Punctuation Definition",
+      "scope": "meta.js punctuation.definition.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Entity Names in Code Documentations",
+      "scope": [
+        "entity.name.type.instance.jsdoc",
+        "entity.name.type.instance.phpdoc"
+      ],
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "Other Variables in Code Documentations",
+      "scope": ["variable.other.jsdoc", "variable.other.phpdoc"],
+      "settings": {
+        "foreground": "#78ccf0"
+      }
+    },
+    {
+      "name": "JavaScript module imports and exports",
+      "scope": [
+        "variable.other.meta.import.js",
+        "meta.import.js variable.other",
+        "variable.other.meta.export.js",
+        "meta.export.js variable.other"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Variable Parameter Function",
+      "scope": "variable.parameter.function.js",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "JavaScript Variable Other ReadWrite",
+      "scope": "variable.other.readwrite.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Text nested in React tags",
+      "scope": [
+        "meta.jsx.children",
+        "meta.jsx.children.js",
+        "meta.jsx.children.tsx"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript[React] Variable Other Object",
+      "scope": [
+        "variable.other.object.js",
+        "variable.other.object.jsx",
+        "meta.object-literal.key.js",
+        "meta.object-literal.key.jsx",
+        "variable.object.property.js",
+        "variable.object.property.jsx"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Variables",
+      "scope": ["variable.js", "variable.other.js"],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JavaScript Entity Name Type",
+      "scope": ["entity.name.type.js", "entity.name.type.module.js"],
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "JavaScript Support Classes",
+      "scope": "support.class.js",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "JSON Property Names",
+      "scope": "support.type.property-name.json",
+      "settings": {
+        "foreground": "#C3E88D",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "JSON Support Constants",
+      "scope": "support.constant.json",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "JSON Property values (string)",
+      "scope": "meta.structure.dictionary.value.json string.quoted.double",
+      "settings": {
+        "foreground": "#80CBC4",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "Strings in JSON values",
+      "scope": "string.quoted.double.json punctuation.definition.string.json",
+      "settings": {
+        "foreground": "#80CBC4",
+        "fontStyle": "normal"
+      }
+    },
+    {
+      "name": "Specific JSON Property values like null",
+      "scope": "meta.structure.dictionary.json meta.structure.dictionary.value constant.language",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Ruby Variables",
+      "scope": "variable.other.ruby",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Ruby Hashkeys",
+      "scope": "constant.language.symbol.hashkey.ruby",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "LESS Tag names",
+      "scope": "entity.name.tag.less",
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Attribute Name for LESS",
+      "scope": "meta.attribute-selector.less entity.other.attribute-name.attribute",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Markup Headings",
+      "scope": "markup.heading",
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Markup Italics",
+      "scope": "markup.italic",
+      "settings": {
+        "foreground": "#c792ea",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markup Bold",
+      "scope": "markup.bold",
+      "settings": {
+        "foreground": "#ffcb6b",
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Markup Quote + others",
+      "scope": "markup.quote",
+      "settings": {
+        "foreground": "#697098",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markup Raw Code + others",
+      "scope": "markup.inline.raw",
+      "settings": {
+        "foreground": "#80CBC4"
+      }
+    },
+    {
+      "name": "Markup Links",
+      "scope": ["markup.underline.link", "markup.underline.link.image"],
+      "settings": {
+        "foreground": "#ff869a"
+      }
+    },
+    {
+      "name": "Markup Attributes",
+      "scope": ["markup.meta.attribute-list"],
+      "settings": {
+        "foreground": "#a9c77d"
+      }
+    },
+    {
+      "name": "Markup Admonitions",
+      "scope": "markup.admonition",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Markup Lists",
+      "scope": "markup.list.bullet",
+      "settings": {
+        "foreground": "#D9F5DD"
+      }
+    },
+    {
+      "name": "Markup Superscript and Subscript",
+      "scope": ["markup.superscript", "markup.subscript"],
+      "settings": {
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Markdown Link Title and Description",
+      "scope": [
+        "string.other.link.title.markdown",
+        "string.other.link.description.markdown"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Markdown Punctuation",
+      "scope": [
+        "punctuation.definition.string.markdown",
+        "punctuation.definition.string.begin.markdown",
+        "punctuation.definition.string.end.markdown",
+        "meta.link.inline.markdown punctuation.definition.string"
+      ],
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Markdown MetaData Punctuation",
+      "scope": ["punctuation.definition.metadata.markdown"],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "Markdown List Punctuation",
+      "scope": ["beginning.punctuation.definition.list.markdown"],
+      "settings": {
+        "foreground": "#82b1ff"
+      }
+    },
+    {
+      "name": "Asciidoc Function",
+      "scope": "entity.name.function.asciidoc",
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "PHP Variables",
+      "scope": "variable.other.php",
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "Support Classes in PHP",
+      "scope": "support.class.php",
+      "settings": {
+        "foreground": "#ffcb8b"
+      }
+    },
+    {
+      "name": "Punctuations in PHP function calls",
+      "scope": "meta.function-call.php punctuation",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "PHP Global Variables",
+      "scope": "variable.other.global.php",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Declaration Punctuation in PHP Global Variables",
+      "scope": "variable.other.global.php punctuation.definition.variable",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Language Constants in Python",
+      "scope": "constant.language.python",
+      "settings": {
+        "foreground": "#ff5874"
+      }
+    },
+    {
+      "name": "Python Function Parameter and Arguments",
+      "scope": [
+        "variable.parameter.function.python",
+        "meta.function-call.arguments.python"
+      ],
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "Python Function Call",
+      "scope": [
+        "meta.function-call.python",
+        "meta.function-call.generic.python"
+      ],
+      "settings": {
+        "foreground": "#B2CCD6"
+      }
+    },
+    {
+      "name": "Punctuations in Python",
+      "scope": "punctuation.python",
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "Decorator Functions in Python",
+      "scope": "entity.name.function.decorator.python",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "Python Language Variable",
+      "scope": "source.python variable.language.special",
+      "settings": {
+        "foreground": "#8EACE3"
+      }
+    },
+    {
+      "name": "SCSS Variable",
+      "scope": [
+        "variable.scss",
+        "variable.sass",
+        "variable.parameter.url.scss",
+        "variable.parameter.url.sass"
+      ],
+      "settings": {
+        "foreground": "#DDDDDD"
+      }
+    },
+    {
+      "name": "Variables in SASS At-Rules",
+      "scope": [
+        "source.css.scss meta.at-rule variable",
+        "source.css.sass meta.at-rule variable"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "Variables in SASS At-Rules",
+      "scope": [
+        "source.css.scss meta.at-rule variable",
+        "source.css.sass meta.at-rule variable"
+      ],
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "Attribute Name for SASS",
+      "scope": [
+        "meta.attribute-selector.scss entity.other.attribute-name.attribute",
+        "meta.attribute-selector.sass entity.other.attribute-name.attribute"
+      ],
+      "settings": {
+        "foreground": "#F78C6C"
+      }
+    },
+    {
+      "name": "Tag names in SASS",
+      "scope": ["entity.name.tag.scss", "entity.name.tag.sass"],
+      "settings": {
+        "foreground": "#ff5572"
+      }
+    },
+    {
+      "name": "TypeScript[React] Variables and Object Properties",
+      "scope": [
+        "variable.other.readwrite.alias.ts",
+        "variable.other.readwrite.alias.tsx",
+        "variable.other.readwrite.ts",
+        "variable.other.readwrite.tsx",
+        "variable.other.object.ts",
+        "variable.other.object.tsx",
+        "variable.object.property.ts",
+        "variable.object.property.tsx",
+        "variable.other.ts",
+        "variable.other.tsx",
+        "variable.tsx",
+        "variable.ts"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "TypeScript[React] Entity Name Types",
+      "scope": ["entity.name.type.ts", "entity.name.type.tsx"],
+      "settings": {
+        "foreground": "#78ccf0"
+      }
+    },
+    {
+      "name": "TypeScript[React] Node Classes",
+      "scope": ["support.class.node.ts", "support.class.node.tsx"],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "TypeScript[React] Entity Name Types as Parameters",
+      "scope": [
+        "meta.type.parameters.ts entity.name.type",
+        "meta.type.parameters.tsx entity.name.type"
+      ],
+      "settings": {
+        "foreground": "#eeffff"
+      }
+    },
+    {
+      "name": "TypeScript[React] Import/Export Punctuations",
+      "scope": [
+        "meta.import.ts punctuation.definition.block",
+        "meta.import.tsx punctuation.definition.block",
+        "meta.export.ts punctuation.definition.block",
+        "meta.export.tsx punctuation.definition.block"
+      ],
+      "settings": {
+        "foreground": "#bfc7d5"
+      }
+    },
+    {
+      "name": "TypeScript[React] Punctuation Decorators",
+      "scope": [
+        "meta.decorator punctuation.decorator.ts",
+        "meta.decorator punctuation.decorator.tsx"
+      ],
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "TypeScript[React] Punctuation Decorators",
+      "scope": "meta.tag.js meta.jsx.children.tsx",
+      "settings": {
+        "foreground": "#82AAFF"
+      }
+    },
+    {
+      "name": "YAML Entity Name Tags",
+      "scope": "entity.name.tag.yaml",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "handlebars variables",
+      "scope": "variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#bec5d4"
+      }
+    },
+    {
+      "name": "handlebars parameters",
+      "scope": "entity.other.attribute-name.handlebars variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#ffcb6b"
+      }
+    },
+    {
+      "name": "handlebars enitity attribute names",
+      "scope": "entity.other.attribute-name.handlebars",
+      "settings": {
+        "foreground": "#89DDFF"
+      }
+    },
+    {
+      "name": "handlebars enitity attribute values",
+      "scope": "entity.other.attribute-value.handlebars variable.parameter.handlebars",
+      "settings": {
+        "foreground": "#7986E7"
+      }
+    },
+    {
+      "name": "normalize font style of certain components",
+      "scope": [
+        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js",
+        "meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js",
+        "meta.property-list.css meta.property-value.css variable.other.less",
+        "punctuation.section.embedded.begin.js.jsx",
+        "punctuation.section.embedded.end.js.jsx",
+        "meta.property-list.scss variable.scss",
+        "meta.property-list.sass variable.sass",
+        "keyword.operator.logical",
+        "keyword.operator.arithmetic",
+        "keyword.operator.bitwise",
+        "keyword.operator.increment",
+        "keyword.operator.ternary",
+        "keyword.operator.comparison",
+        "keyword.operator.assignment",
+        "keyword.operator.operator",
+        "keyword.operator.or.regexp",
+        "keyword.operator.expression.in",
+        "keyword.operator.type",
+        "punctuation.section.embedded.js",
+        "punctuation.definintion.string",
+        "punctuation"
+      ],
+      "settings": {
+        "fontStyle": "normal"
+      }
+    }
+  ]
+}

assets/themes/src/vscode/rose-pine/rose-pine-dawn.json 🔗

@@ -1,680 +1,680 @@
 {
-    "name": "Rosé Pine Dawn",
-    "type": "light",
-    "colors": {
-        "activityBar.activeBorder": "#575279",
-        "activityBar.background": "#faf4ed",
-        "activityBar.dropBorder": "#f2e9e1",
-        "activityBar.foreground": "#575279",
-        "activityBar.inactiveForeground": "#797593",
-        "activityBarBadge.background": "#d7827e",
-        "activityBarBadge.foreground": "#faf4ed",
-        "badge.background": "#d7827e",
-        "badge.foreground": "#faf4ed",
-        "banner.background": "#fffaf3",
-        "banner.foreground": "#575279",
-        "banner.iconForeground": "#797593",
-        "breadcrumb.activeSelectionForeground": "#d7827e",
-        "breadcrumb.background": "#faf4ed",
-        "breadcrumb.focusForeground": "#797593",
-        "breadcrumb.foreground": "#9893a5",
-        "breadcrumbPicker.background": "#fffaf3",
-        "button.background": "#d7827e",
-        "button.foreground": "#faf4ed",
-        "button.hoverBackground": "#d7827ee6",
-        "button.secondaryBackground": "#fffaf3",
-        "button.secondaryForeground": "#575279",
-        "button.secondaryHoverBackground": "#f2e9e1",
-        "charts.blue": "#56949f",
-        "charts.foreground": "#575279",
-        "charts.green": "#286983",
-        "charts.lines": "#797593",
-        "charts.orange": "#d7827e",
-        "charts.purple": "#907aa9",
-        "charts.red": "#b4637a",
-        "charts.yellow": "#ea9d34",
-        "checkbox.background": "#fffaf3",
-        "checkbox.border": "#6e6a8614",
-        "checkbox.foreground": "#575279",
-        "debugExceptionWidget.background": "#fffaf3",
-        "debugExceptionWidget.border": "#6e6a8614",
-        "debugIcon.breakpointCurrentStackframeForeground": "#797593",
-        "debugIcon.breakpointDisabledForeground": "#797593",
-        "debugIcon.breakpointForeground": "#797593",
-        "debugIcon.breakpointStackframeForeground": "#797593",
-        "debugIcon.breakpointUnverifiedForeground": "#797593",
-        "debugIcon.continueForeground": "#797593",
-        "debugIcon.disconnectForeground": "#797593",
-        "debugIcon.pauseForeground": "#797593",
-        "debugIcon.restartForeground": "#797593",
-        "debugIcon.startForeground": "#797593",
-        "debugIcon.stepBackForeground": "#797593",
-        "debugIcon.stepIntoForeground": "#797593",
-        "debugIcon.stepOutForeground": "#797593",
-        "debugIcon.stepOverForeground": "#797593",
-        "debugIcon.stopForeground": "#b4637a",
-        "debugToolBar.background": "#fffaf3",
-        "debugToolBar.border": "#f2e9e1",
-        "descriptionForeground": "#797593",
-        "diffEditor.border": "#f2e9e1",
-        "diffEditor.diagonalFill": "#6e6a8626",
-        "diffEditor.insertedLineBackground": "#56949f26",
-        "diffEditor.insertedTextBackground": "#56949f26",
-        "diffEditor.removedLineBackground": "#b4637a26",
-        "diffEditor.removedTextBackground": "#b4637a26",
-        "diffEditorOverview.insertedForeground": "#56949f80",
-        "diffEditorOverview.removedForeground": "#b4637a80",
-        "dropdown.background": "#fffaf3",
-        "dropdown.border": "#6e6a8614",
-        "dropdown.foreground": "#575279",
-        "dropdown.listBackground": "#fffaf3",
-        "editor.background": "#faf4ed",
-        "editor.findMatchBackground": "#6e6a8626",
-        "editor.findMatchHighlightBackground": "#6e6a8626",
-        "editor.findRangeHighlightBackground": "#6e6a8626",
-        "editor.findRangeHighlightBorder": "#000000",
-        "editor.focusedStackFrameHighlightBackground": "#6e6a8614",
-        "editor.foldBackground": "#fffaf3",
-        "editor.foreground": "#575279",
-        "editor.hoverHighlightBackground": "#000000",
-        "editor.inactiveSelectionBackground": "#6e6a860d",
-        "editor.inlineValuesBackground": "#000000",
-        "editor.inlineValuesForeground": "#797593",
-        "editor.lineHighlightBackground": "#6e6a860d",
-        "editor.lineHighlightBorder": "#000000",
-        "editor.linkedEditingBackground": "#fffaf3",
-        "editor.rangeHighlightBackground": "#6e6a860d",
-        "editor.selectionBackground": "#6e6a8614",
-        "editor.selectionForeground": "#575279",
-        "editor.selectionHighlightBackground": "#6e6a8614",
-        "editor.selectionHighlightBorder": "#faf4ed",
-        "editor.snippetFinalTabstopHighlightBackground": "#6e6a8614",
-        "editor.snippetFinalTabstopHighlightBorder": "#fffaf3",
-        "editor.snippetTabstopHighlightBackground": "#6e6a8614",
-        "editor.snippetTabstopHighlightBorder": "#fffaf3",
-        "editor.stackFrameHighlightBackground": "#6e6a8614",
-        "editor.symbolHighlightBackground": "#6e6a8614",
-        "editor.symbolHighlightBorder": "#000000",
-        "editor.wordHighlightBackground": "#6e6a8614",
-        "editor.wordHighlightBorder": "#000000",
-        "editor.wordHighlightStrongBackground": "#6e6a8614",
-        "editor.wordHighlightStrongBorder": "#6e6a8614",
-        "editorBracketHighlight.foreground1": "#b4637a80",
-        "editorBracketHighlight.foreground2": "#28698380",
-        "editorBracketHighlight.foreground3": "#ea9d3480",
-        "editorBracketHighlight.foreground4": "#56949f80",
-        "editorBracketHighlight.foreground5": "#d7827e80",
-        "editorBracketHighlight.foreground6": "#907aa980",
-        "editorBracketMatch.background": "#000000",
-        "editorBracketMatch.border": "#797593",
-        "editorBracketPairGuide.activeBackground1": "#286983",
-        "editorBracketPairGuide.activeBackground2": "#d7827e",
-        "editorBracketPairGuide.activeBackground3": "#907aa9",
-        "editorBracketPairGuide.activeBackground4": "#56949f",
-        "editorBracketPairGuide.activeBackground5": "#ea9d34",
-        "editorBracketPairGuide.activeBackground6": "#b4637a",
-        "editorBracketPairGuide.background1": "#28698380",
-        "editorBracketPairGuide.background2": "#d7827e80",
-        "editorBracketPairGuide.background3": "#907aa980",
-        "editorBracketPairGuide.background4": "#56949f80",
-        "editorBracketPairGuide.background5": "#ea9d3480",
-        "editorBracketPairGuide.background6": "#b4637a80",
-        "editorCodeLens.foreground": "#d7827e",
-        "editorCursor.background": "#575279",
-        "editorCursor.foreground": "#9893a5",
-        "editorError.border": "#000000",
-        "editorError.foreground": "#b4637a",
-        "editorGhostText.foreground": "#797593",
-        "editorGroup.border": "#000000",
-        "editorGroup.dropBackground": "#fffaf3",
-        "editorGroup.emptyBackground": "#000000",
-        "editorGroup.focusedEmptyBorder": "#000000",
-        "editorGroupHeader.noTabsBackground": "#000000",
-        "editorGroupHeader.tabsBackground": "#000000",
-        "editorGroupHeader.tabsBorder": "#000000",
-        "editorGutter.addedBackground": "#56949f",
-        "editorGutter.background": "#faf4ed",
-        "editorGutter.commentRangeForeground": "#797593",
-        "editorGutter.deletedBackground": "#b4637a",
-        "editorGutter.foldingControlForeground": "#907aa9",
-        "editorGutter.modifiedBackground": "#d7827e",
-        "editorHint.border": "#000000",
-        "editorHint.foreground": "#797593",
-        "editorHoverWidget.background": "#fffaf3",
-        "editorHoverWidget.border": "#9893a580",
-        "editorHoverWidget.foreground": "#797593",
-        "editorHoverWidget.highlightForeground": "#575279",
-        "editorHoverWidget.statusBarBackground": "#000000",
-        "editorIndentGuide.activeBackground": "#9893a5",
-        "editorIndentGuide.background": "#6e6a8626",
-        "editorInfo.border": "#f2e9e1",
-        "editorInfo.foreground": "#56949f",
-        "editorInlayHint.background": "#f2e9e1",
-        "editorInlayHint.foreground": "#797593",
-        "editorInlayHint.parameterBackground": "#f2e9e1",
-        "editorInlayHint.parameterForeground": "#907aa9",
-        "editorInlayHint.typeBackground": "#f2e9e1",
-        "editorInlayHint.typeForeground": "#56949f",
-        "editorLightBulb.foreground": "#286983",
-        "editorLightBulbAutoFix.foreground": "#d7827e",
-        "editorLineNumber.activeForeground": "#575279",
-        "editorLineNumber.foreground": "#797593",
-        "editorLink.activeForeground": "#d7827e",
-        "editorMarkerNavigation.background": "#fffaf3",
-        "editorMarkerNavigationError.background": "#fffaf3",
-        "editorMarkerNavigationInfo.background": "#fffaf3",
-        "editorMarkerNavigationWarning.background": "#fffaf3",
-        "editorOverviewRuler.addedForeground": "#56949f80",
-        "editorOverviewRuler.background": "#faf4ed",
-        "editorOverviewRuler.border": "#6e6a8626",
-        "editorOverviewRuler.bracketMatchForeground": "#797593",
-        "editorOverviewRuler.commonContentForeground": "#6e6a860d",
-        "editorOverviewRuler.currentContentForeground": "#6e6a8614",
-        "editorOverviewRuler.deletedForeground": "#b4637a80",
-        "editorOverviewRuler.errorForeground": "#b4637a80",
-        "editorOverviewRuler.findMatchForeground": "#6e6a8626",
-        "editorOverviewRuler.incomingContentForeground": "#907aa980",
-        "editorOverviewRuler.infoForeground": "#56949f80",
-        "editorOverviewRuler.modifiedForeground": "#d7827e80",
-        "editorOverviewRuler.rangeHighlightForeground": "#6e6a8626",
-        "editorOverviewRuler.selectionHighlightForeground": "#6e6a8626",
-        "editorOverviewRuler.warningForeground": "#ea9d3480",
-        "editorOverviewRuler.wordHighlightForeground": "#6e6a8614",
-        "editorOverviewRuler.wordHighlightStrongForeground": "#6e6a8626",
-        "editorPane.background": "#000000",
-        "editorRuler.foreground": "#6e6a8626",
-        "editorSuggestWidget.background": "#fffaf3",
-        "editorSuggestWidget.border": "#000000",
-        "editorSuggestWidget.focusHighlightForeground": "#d7827e",
-        "editorSuggestWidget.foreground": "#797593",
-        "editorSuggestWidget.highlightForeground": "#d7827e",
-        "editorSuggestWidget.selectedBackground": "#6e6a8614",
-        "editorSuggestWidget.selectedForeground": "#575279",
-        "editorSuggestWidget.selectedIconForeground": "#575279",
-        "editorUnnecessaryCode.border": "#000000",
-        "editorUnnecessaryCode.opacity": "#57527980",
-        "editorWarning.border": "#000000",
-        "editorWarning.foreground": "#ea9d34",
-        "editorWhitespace.foreground": "#9893a5",
-        "editorWidget.background": "#fffaf3",
-        "editorWidget.border": "#f2e9e1",
-        "editorWidget.foreground": "#797593",
-        "editorWidget.resizeBorder": "#9893a5",
-        "errorForeground": "#b4637a",
-        "extensionBadge.remoteBackground": "#907aa9",
-        "extensionBadge.remoteForeground": "#faf4ed",
-        "extensionButton.prominentBackground": "#d7827e",
-        "extensionButton.prominentForeground": "#faf4ed",
-        "extensionButton.prominentHoverBackground": "#d7827ee6",
-        "extensionIcon.preReleaseForeground": "#286983",
-        "extensionIcon.starForeground": "#d7827e",
-        "extensionIcon.verifiedForeground": "#907aa9",
-        "focusBorder": "#6e6a8614",
-        "foreground": "#575279",
-        "gitDecoration.addedResourceForeground": "#56949f",
-        "gitDecoration.conflictingResourceForeground": "#b4637a",
-        "gitDecoration.deletedResourceForeground": "#797593",
-        "gitDecoration.ignoredResourceForeground": "#9893a5",
-        "gitDecoration.modifiedResourceForeground": "#d7827e",
-        "gitDecoration.renamedResourceForeground": "#286983",
-        "gitDecoration.stageDeletedResourceForeground": "#b4637a",
-        "gitDecoration.stageModifiedResourceForeground": "#907aa9",
-        "gitDecoration.submoduleResourceForeground": "#ea9d34",
-        "gitDecoration.untrackedResourceForeground": "#ea9d34",
-        "icon.foreground": "#797593",
-        "input.background": "#f2e9e180",
-        "input.border": "#6e6a8614",
-        "input.foreground": "#575279",
-        "input.placeholderForeground": "#797593",
-        "inputOption.activeBackground": "#d7827e26",
-        "inputOption.activeForeground": "#d7827e",
-        "inputValidation.errorBackground": "#fffaf3",
-        "inputValidation.errorBorder": "#6e6a8626",
-        "inputValidation.errorForeground": "#b4637a",
-        "inputValidation.infoBackground": "#fffaf3",
-        "inputValidation.infoBorder": "#6e6a8626",
-        "inputValidation.infoForeground": "#56949f",
-        "inputValidation.warningBackground": "#fffaf3",
-        "inputValidation.warningBorder": "#6e6a8626",
-        "inputValidation.warningForeground": "#56949f80",
-        "keybindingLabel.background": "#f2e9e1",
-        "keybindingLabel.border": "#6e6a8626",
-        "keybindingLabel.bottomBorder": "#6e6a8626",
-        "keybindingLabel.foreground": "#907aa9",
-        "keybindingTable.headerBackground": "#f2e9e1",
-        "keybindingTable.rowsBackground": "#fffaf3",
-        "list.activeSelectionBackground": "#6e6a8614",
-        "list.activeSelectionForeground": "#575279",
-        "list.deemphasizedForeground": "#797593",
-        "list.dropBackground": "#fffaf3",
-        "list.errorForeground": "#b4637a",
-        "list.filterMatchBackground": "#fffaf3",
-        "list.filterMatchBorder": "#d7827e",
-        "list.focusBackground": "#6e6a8626",
-        "list.focusForeground": "#575279",
-        "list.focusOutline": "#6e6a8614",
-        "list.highlightForeground": "#d7827e",
-        "list.hoverBackground": "#6e6a860d",
-        "list.hoverForeground": "#575279",
-        "list.inactiveFocusBackground": "#6e6a860d",
-        "list.inactiveSelectionBackground": "#fffaf3",
-        "list.inactiveSelectionForeground": "#575279",
-        "list.invalidItemForeground": "#b4637a",
-        "list.warningForeground": "#ea9d34",
-        "listFilterWidget.background": "#fffaf3",
-        "listFilterWidget.noMatchesOutline": "#b4637a",
-        "listFilterWidget.outline": "#f2e9e1",
-        "menu.background": "#fffaf3",
-        "menu.border": "#6e6a860d",
-        "menu.foreground": "#575279",
-        "menu.selectionBackground": "#6e6a8614",
-        "menu.selectionBorder": "#f2e9e1",
-        "menu.selectionForeground": "#575279",
-        "menu.separatorBackground": "#6e6a8626",
-        "menubar.selectionBackground": "#6e6a8614",
-        "menubar.selectionBorder": "#6e6a860d",
-        "menubar.selectionForeground": "#575279",
-        "merge.border": "#f2e9e1",
-        "merge.commonContentBackground": "#6e6a8614",
-        "merge.commonHeaderBackground": "#6e6a8614",
-        "merge.currentContentBackground": "#ea9d3480",
-        "merge.currentHeaderBackground": "#ea9d3480",
-        "merge.incomingContentBackground": "#56949f80",
-        "merge.incomingHeaderBackground": "#56949f80",
-        "minimap.background": "#fffaf3",
-        "minimap.errorHighlight": "#b4637a80",
-        "minimap.findMatchHighlight": "#6e6a8614",
-        "minimap.selectionHighlight": "#6e6a8614",
-        "minimap.warningHighlight": "#ea9d3480",
-        "minimapGutter.addedBackground": "#56949f",
-        "minimapGutter.deletedBackground": "#b4637a",
-        "minimapGutter.modifiedBackground": "#d7827e",
-        "minimapSlider.activeBackground": "#6e6a8626",
-        "minimapSlider.background": "#6e6a8614",
-        "minimapSlider.hoverBackground": "#6e6a8614",
-        "notebook.cellBorderColor": "#56949f80",
-        "notebook.cellEditorBackground": "#fffaf3",
-        "notebook.cellHoverBackground": "#f2e9e180",
-        "notebook.focusedCellBackground": "#6e6a860d",
-        "notebook.focusedCellBorder": "#56949f",
-        "notebook.outputContainerBackgroundColor": "#6e6a860d",
-        "notificationCenter.border": "#6e6a8614",
-        "notificationCenterHeader.background": "#fffaf3",
-        "notificationCenterHeader.foreground": "#797593",
-        "notificationLink.foreground": "#907aa9",
-        "notifications.background": "#fffaf3",
-        "notifications.border": "#6e6a8614",
-        "notifications.foreground": "#575279",
-        "notificationsErrorIcon.foreground": "#b4637a",
-        "notificationsInfoIcon.foreground": "#56949f",
-        "notificationsWarningIcon.foreground": "#ea9d34",
-        "notificationToast.border": "#6e6a8614",
-        "panel.background": "#fffaf3",
-        "panel.border": "#000000",
-        "panel.dropBorder": "#f2e9e1",
-        "panelInput.border": "#fffaf3",
-        "panelSection.dropBackground": "#6e6a8614",
-        "panelSectionHeader.background": "#fffaf3",
-        "panelSectionHeader.foreground": "#575279",
-        "panelTitle.activeBorder": "#6e6a8626",
-        "panelTitle.activeForeground": "#575279",
-        "panelTitle.inactiveForeground": "#797593",
-        "peekView.border": "#f2e9e1",
-        "peekViewEditor.background": "#fffaf3",
-        "peekViewEditor.matchHighlightBackground": "#6e6a8626",
-        "peekViewResult.background": "#fffaf3",
-        "peekViewResult.fileForeground": "#797593",
-        "peekViewResult.lineForeground": "#797593",
-        "peekViewResult.matchHighlightBackground": "#6e6a8626",
-        "peekViewResult.selectionBackground": "#6e6a8614",
-        "peekViewResult.selectionForeground": "#575279",
-        "peekViewTitle.background": "#f2e9e1",
-        "peekViewTitleDescription.foreground": "#797593",
-        "pickerGroup.border": "#6e6a8626",
-        "pickerGroup.foreground": "#907aa9",
-        "ports.iconRunningProcessForeground": "#d7827e",
-        "problemsErrorIcon.foreground": "#b4637a",
-        "problemsInfoIcon.foreground": "#56949f",
-        "problemsWarningIcon.foreground": "#ea9d34",
-        "progressBar.background": "#d7827e",
-        "quickInput.background": "#fffaf3",
-        "quickInput.foreground": "#797593",
-        "quickInputList.focusBackground": "#6e6a8614",
-        "quickInputList.focusForeground": "#575279",
-        "quickInputList.focusIconForeground": "#575279",
-        "scrollbar.shadow": "#fffaf34d",
-        "scrollbarSlider.activeBackground": "#28698380",
-        "scrollbarSlider.background": "#6e6a8614",
-        "scrollbarSlider.hoverBackground": "#6e6a8626",
-        "searchEditor.findMatchBackground": "#6e6a8614",
-        "selection.background": "#6e6a8626",
-        "settings.focusedRowBackground": "#fffaf3",
-        "settings.headerForeground": "#575279",
-        "settings.modifiedItemIndicator": "#d7827e",
-        "settings.focusedRowBorder": "#6e6a8614",
-        "settings.rowHoverBackground": "#fffaf3",
-        "sideBar.background": "#faf4ed",
-        "sideBar.dropBackground": "#fffaf3",
-        "sideBar.foreground": "#797593",
-        "sideBarSectionHeader.background": "#000000",
-        "sideBarSectionHeader.border": "#6e6a8614",
-        "statusBar.background": "#faf4ed",
-        "statusBar.debuggingBackground": "#907aa9",
-        "statusBar.debuggingForeground": "#faf4ed",
-        "statusBar.foreground": "#797593",
-        "statusBar.noFolderBackground": "#faf4ed",
-        "statusBar.noFolderForeground": "#797593",
-        "statusBarItem.activeBackground": "#6e6a8626",
-        "statusBarItem.hoverBackground": "#6e6a8614",
-        "statusBarItem.prominentBackground": "#f2e9e1",
-        "statusBarItem.prominentForeground": "#575279",
-        "statusBarItem.prominentHoverBackground": "#6e6a8614",
-        "statusBarItem.remoteBackground": "#faf4ed",
-        "statusBarItem.remoteForeground": "#ea9d34",
-        "statusBarItem.errorBackground": "#faf4ed",
-        "statusBarItem.errorForeground": "#b4637a",
-        "symbolIcon.arrayForeground": "#797593",
-        "symbolIcon.classForeground": "#797593",
-        "symbolIcon.colorForeground": "#797593",
-        "symbolIcon.constantForeground": "#797593",
-        "symbolIcon.constructorForeground": "#797593",
-        "symbolIcon.enumeratorForeground": "#797593",
-        "symbolIcon.enumeratorMemberForeground": "#797593",
-        "symbolIcon.eventForeground": "#797593",
-        "symbolIcon.fieldForeground": "#797593",
-        "symbolIcon.fileForeground": "#797593",
-        "symbolIcon.folderForeground": "#797593",
-        "symbolIcon.functionForeground": "#797593",
-        "symbolIcon.interfaceForeground": "#797593",
-        "symbolIcon.keyForeground": "#797593",
-        "symbolIcon.keywordForeground": "#797593",
-        "symbolIcon.methodForeground": "#797593",
-        "symbolIcon.moduleForeground": "#797593",
-        "symbolIcon.namespaceForeground": "#797593",
-        "symbolIcon.nullForeground": "#797593",
-        "symbolIcon.numberForeground": "#797593",
-        "symbolIcon.objectForeground": "#797593",
-        "symbolIcon.operatorForeground": "#797593",
-        "symbolIcon.packageForeground": "#797593",
-        "symbolIcon.propertyForeground": "#797593",
-        "symbolIcon.referenceForeground": "#797593",
-        "symbolIcon.snippetForeground": "#797593",
-        "symbolIcon.stringForeground": "#797593",
-        "symbolIcon.structForeground": "#797593",
-        "symbolIcon.textForeground": "#797593",
-        "symbolIcon.typeParameterForeground": "#797593",
-        "symbolIcon.unitForeground": "#797593",
-        "symbolIcon.variableForeground": "#797593",
-        "tab.activeBackground": "#6e6a860d",
-        "tab.activeForeground": "#575279",
-        "tab.activeModifiedBorder": "#56949f",
-        "tab.border": "#000000",
-        "tab.hoverBackground": "#6e6a8614",
-        "tab.inactiveBackground": "#000000",
-        "tab.inactiveForeground": "#797593",
-        "tab.inactiveModifiedBorder": "#56949f80",
-        "tab.lastPinnedBorder": "#9893a5",
-        "tab.unfocusedActiveBackground": "#000000",
-        "tab.unfocusedHoverBackground": "#000000",
-        "tab.unfocusedInactiveBackground": "#000000",
-        "tab.unfocusedInactiveModifiedBorder": "#56949f80",
-        "terminal.ansiBlack": "#f2e9e1",
-        "terminal.ansiBlue": "#56949f",
-        "terminal.ansiBrightBlack": "#797593",
-        "terminal.ansiBrightBlue": "#56949f",
-        "terminal.ansiBrightCyan": "#d7827e",
-        "terminal.ansiBrightGreen": "#286983",
-        "terminal.ansiBrightMagenta": "#907aa9",
-        "terminal.ansiBrightRed": "#b4637a",
-        "terminal.ansiBrightWhite": "#575279",
-        "terminal.ansiBrightYellow": "#ea9d34",
-        "terminal.ansiCyan": "#d7827e",
-        "terminal.ansiGreen": "#286983",
-        "terminal.ansiMagenta": "#907aa9",
-        "terminal.ansiRed": "#b4637a",
-        "terminal.ansiWhite": "#575279",
-        "terminal.ansiYellow": "#ea9d34",
-        "terminal.dropBackground": "#6e6a8614",
-        "terminal.foreground": "#575279",
-        "terminal.selectionBackground": "#6e6a8614",
-        "terminal.tab.activeBorder": "#575279",
-        "terminalCursor.background": "#575279",
-        "terminalCursor.foreground": "#9893a5",
-        "textBlockQuote.background": "#fffaf3",
-        "textBlockQuote.border": "#6e6a8614",
-        "textCodeBlock.background": "#fffaf3",
-        "textLink.activeForeground": "#907aa9e6",
-        "textLink.foreground": "#907aa9",
-        "textPreformat.foreground": "#ea9d34",
-        "textSeparator.foreground": "#797593",
-        "titleBar.activeBackground": "#faf4ed",
-        "titleBar.activeForeground": "#797593",
-        "titleBar.inactiveBackground": "#fffaf3",
-        "titleBar.inactiveForeground": "#797593",
-        "toolbar.activeBackground": "#6e6a8626",
-        "toolbar.hoverBackground": "#6e6a8614",
-        "tree.indentGuidesStroke": "#797593",
-        "walkThrough.embeddedEditorBackground": "#faf4ed",
-        "welcomePage.background": "#faf4ed",
-        "welcomePage.buttonBackground": "#fffaf3",
-        "welcomePage.buttonHoverBackground": "#f2e9e1",
-        "widget.shadow": "#fffaf34d",
-        "window.activeBorder": "#fffaf3",
-        "window.inactiveBorder": "#fffaf3"
-    },
-    "tokenColors": [
-        {
-            "scope": ["comment"],
-            "settings": {
-                "foreground": "#9893a5",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["constant"],
-            "settings": {
-                "foreground": "#286983"
-            }
-        },
-        {
-            "scope": ["constant.numeric", "constant.language"],
-            "settings": {
-                "foreground": "#d7827e"
-            }
-        },
-        {
-            "scope": ["entity.name"],
-            "settings": {
-                "foreground": "#d7827e"
-            }
-        },
-        {
-            "scope": [
-                "entity.name.section",
-                "entity.name.tag",
-                "entity.name.namespace",
-                "entity.name.type"
-            ],
-            "settings": {
-                "foreground": "#56949f"
-            }
-        },
-        {
-            "scope": ["entity.other.attribute-name", "entity.other.inherited-class"],
-            "settings": {
-                "foreground": "#907aa9",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["invalid"],
-            "settings": {
-                "foreground": "#b4637a"
-            }
-        },
-        {
-            "scope": ["invalid.deprecated"],
-            "settings": {
-                "foreground": "#797593"
-            }
-        },
-        {
-            "scope": ["keyword"],
-            "settings": {
-                "foreground": "#286983"
-            }
-        },
-        {
-            "scope": ["markup.inserted.diff"],
-            "settings": {
-                "foreground": "#56949f"
-            }
-        },
-        {
-            "scope": ["markup.deleted.diff"],
-            "settings": {
-                "foreground": "#b4637a"
-            }
-        },
-        {
-            "scope": "markup.heading",
-            "settings": {
-                "fontStyle": "bold"
-            }
-        },
-        {
-            "scope": "markup.bold.markdown",
-            "settings": {
-                "fontStyle": "bold"
-            }
-        },
-        {
-            "scope": "markup.italic.markdown",
-            "settings": {
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["meta.diff.range"],
-            "settings": {
-                "foreground": "#907aa9"
-            }
-        },
-        {
-            "scope": ["meta.tag", "meta.brace"],
-            "settings": {
-                "foreground": "#575279"
-            }
-        },
-        {
-            "scope": ["meta.import", "meta.export"],
-            "settings": {
-                "foreground": "#286983"
-            }
-        },
-        {
-            "scope": "meta.directive.vue",
-            "settings": {
-                "foreground": "#907aa9",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": "meta.property-name.css",
-            "settings": {
-                "foreground": "#56949f"
-            }
-        },
-        {
-            "scope": "meta.property-value.css",
-            "settings": {
-                "foreground": "#ea9d34"
-            }
-        },
-        {
-            "scope": "meta.tag.other.html",
-            "settings": {
-                "foreground": "#797593"
-            }
-        },
-        {
-            "scope": ["punctuation"],
-            "settings": {
-                "foreground": "#797593"
-            }
-        },
-        {
-            "scope": ["punctuation.accessor"],
-            "settings": {
-                "foreground": "#286983"
-            }
-        },
-        {
-            "scope": ["punctuation.definition.string"],
-            "settings": {
-                "foreground": "#ea9d34"
-            }
-        },
-        {
-            "scope": ["punctuation.definition.tag"],
-            "settings": {
-                "foreground": "#9893a5"
-            }
-        },
-        {
-            "scope": ["storage.type", "storage.modifier"],
-            "settings": {
-                "foreground": "#286983"
-            }
-        },
-        {
-            "scope": ["string"],
-            "settings": {
-                "foreground": "#ea9d34"
-            }
-        },
-        {
-            "scope": ["support"],
-            "settings": {
-                "foreground": "#56949f"
-            }
-        },
-        {
-            "scope": ["support.constant"],
-            "settings": {
-                "foreground": "#ea9d34"
-            }
-        },
-        {
-            "scope": ["support.function"],
-            "settings": {
-                "foreground": "#b4637a",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["variable"],
-            "settings": {
-                "foreground": "#d7827e",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": [
-                "variable.other",
-                "variable.language",
-                "variable.function",
-                "variable.argument"
-            ],
-            "settings": {
-                "foreground": "#575279"
-            }
-        },
-        {
-            "scope": ["variable.parameter"],
-            "settings": {
-                "foreground": "#907aa9"
-            }
-        }
-    ]
+  "name": "Rosé Pine Dawn",
+  "type": "light",
+  "colors": {
+    "activityBar.activeBorder": "#575279",
+    "activityBar.background": "#faf4ed",
+    "activityBar.dropBorder": "#f2e9e1",
+    "activityBar.foreground": "#575279",
+    "activityBar.inactiveForeground": "#797593",
+    "activityBarBadge.background": "#d7827e",
+    "activityBarBadge.foreground": "#faf4ed",
+    "badge.background": "#d7827e",
+    "badge.foreground": "#faf4ed",
+    "banner.background": "#fffaf3",
+    "banner.foreground": "#575279",
+    "banner.iconForeground": "#797593",
+    "breadcrumb.activeSelectionForeground": "#d7827e",
+    "breadcrumb.background": "#faf4ed",
+    "breadcrumb.focusForeground": "#797593",
+    "breadcrumb.foreground": "#9893a5",
+    "breadcrumbPicker.background": "#fffaf3",
+    "button.background": "#d7827e",
+    "button.foreground": "#faf4ed",
+    "button.hoverBackground": "#d7827ee6",
+    "button.secondaryBackground": "#fffaf3",
+    "button.secondaryForeground": "#575279",
+    "button.secondaryHoverBackground": "#f2e9e1",
+    "charts.blue": "#56949f",
+    "charts.foreground": "#575279",
+    "charts.green": "#286983",
+    "charts.lines": "#797593",
+    "charts.orange": "#d7827e",
+    "charts.purple": "#907aa9",
+    "charts.red": "#b4637a",
+    "charts.yellow": "#ea9d34",
+    "checkbox.background": "#fffaf3",
+    "checkbox.border": "#6e6a8614",
+    "checkbox.foreground": "#575279",
+    "debugExceptionWidget.background": "#fffaf3",
+    "debugExceptionWidget.border": "#6e6a8614",
+    "debugIcon.breakpointCurrentStackframeForeground": "#797593",
+    "debugIcon.breakpointDisabledForeground": "#797593",
+    "debugIcon.breakpointForeground": "#797593",
+    "debugIcon.breakpointStackframeForeground": "#797593",
+    "debugIcon.breakpointUnverifiedForeground": "#797593",
+    "debugIcon.continueForeground": "#797593",
+    "debugIcon.disconnectForeground": "#797593",
+    "debugIcon.pauseForeground": "#797593",
+    "debugIcon.restartForeground": "#797593",
+    "debugIcon.startForeground": "#797593",
+    "debugIcon.stepBackForeground": "#797593",
+    "debugIcon.stepIntoForeground": "#797593",
+    "debugIcon.stepOutForeground": "#797593",
+    "debugIcon.stepOverForeground": "#797593",
+    "debugIcon.stopForeground": "#b4637a",
+    "debugToolBar.background": "#fffaf3",
+    "debugToolBar.border": "#f2e9e1",
+    "descriptionForeground": "#797593",
+    "diffEditor.border": "#f2e9e1",
+    "diffEditor.diagonalFill": "#6e6a8626",
+    "diffEditor.insertedLineBackground": "#56949f26",
+    "diffEditor.insertedTextBackground": "#56949f26",
+    "diffEditor.removedLineBackground": "#b4637a26",
+    "diffEditor.removedTextBackground": "#b4637a26",
+    "diffEditorOverview.insertedForeground": "#56949f80",
+    "diffEditorOverview.removedForeground": "#b4637a80",
+    "dropdown.background": "#fffaf3",
+    "dropdown.border": "#6e6a8614",
+    "dropdown.foreground": "#575279",
+    "dropdown.listBackground": "#fffaf3",
+    "editor.background": "#faf4ed",
+    "editor.findMatchBackground": "#6e6a8626",
+    "editor.findMatchHighlightBackground": "#6e6a8626",
+    "editor.findRangeHighlightBackground": "#6e6a8626",
+    "editor.findRangeHighlightBorder": "#0000",
+    "editor.focusedStackFrameHighlightBackground": "#6e6a8614",
+    "editor.foldBackground": "#fffaf3",
+    "editor.foreground": "#575279",
+    "editor.hoverHighlightBackground": "#0000",
+    "editor.inactiveSelectionBackground": "#6e6a860d",
+    "editor.inlineValuesBackground": "#0000",
+    "editor.inlineValuesForeground": "#797593",
+    "editor.lineHighlightBackground": "#6e6a860d",
+    "editor.lineHighlightBorder": "#0000",
+    "editor.linkedEditingBackground": "#fffaf3",
+    "editor.rangeHighlightBackground": "#6e6a860d",
+    "editor.selectionBackground": "#6e6a8614",
+    "editor.selectionForeground": "#575279",
+    "editor.selectionHighlightBackground": "#6e6a8614",
+    "editor.selectionHighlightBorder": "#faf4ed",
+    "editor.snippetFinalTabstopHighlightBackground": "#6e6a8614",
+    "editor.snippetFinalTabstopHighlightBorder": "#fffaf3",
+    "editor.snippetTabstopHighlightBackground": "#6e6a8614",
+    "editor.snippetTabstopHighlightBorder": "#fffaf3",
+    "editor.stackFrameHighlightBackground": "#6e6a8614",
+    "editor.symbolHighlightBackground": "#6e6a8614",
+    "editor.symbolHighlightBorder": "#0000",
+    "editor.wordHighlightBackground": "#6e6a8614",
+    "editor.wordHighlightBorder": "#0000",
+    "editor.wordHighlightStrongBackground": "#6e6a8614",
+    "editor.wordHighlightStrongBorder": "#6e6a8614",
+    "editorBracketHighlight.foreground1": "#b4637a80",
+    "editorBracketHighlight.foreground2": "#28698380",
+    "editorBracketHighlight.foreground3": "#ea9d3480",
+    "editorBracketHighlight.foreground4": "#56949f80",
+    "editorBracketHighlight.foreground5": "#d7827e80",
+    "editorBracketHighlight.foreground6": "#907aa980",
+    "editorBracketMatch.background": "#0000",
+    "editorBracketMatch.border": "#797593",
+    "editorBracketPairGuide.activeBackground1": "#286983",
+    "editorBracketPairGuide.activeBackground2": "#d7827e",
+    "editorBracketPairGuide.activeBackground3": "#907aa9",
+    "editorBracketPairGuide.activeBackground4": "#56949f",
+    "editorBracketPairGuide.activeBackground5": "#ea9d34",
+    "editorBracketPairGuide.activeBackground6": "#b4637a",
+    "editorBracketPairGuide.background1": "#28698380",
+    "editorBracketPairGuide.background2": "#d7827e80",
+    "editorBracketPairGuide.background3": "#907aa980",
+    "editorBracketPairGuide.background4": "#56949f80",
+    "editorBracketPairGuide.background5": "#ea9d3480",
+    "editorBracketPairGuide.background6": "#b4637a80",
+    "editorCodeLens.foreground": "#d7827e",
+    "editorCursor.background": "#575279",
+    "editorCursor.foreground": "#9893a5",
+    "editorError.border": "#0000",
+    "editorError.foreground": "#b4637a",
+    "editorGhostText.foreground": "#797593",
+    "editorGroup.border": "#0000",
+    "editorGroup.dropBackground": "#fffaf3",
+    "editorGroup.emptyBackground": "#0000",
+    "editorGroup.focusedEmptyBorder": "#0000",
+    "editorGroupHeader.noTabsBackground": "#0000",
+    "editorGroupHeader.tabsBackground": "#0000",
+    "editorGroupHeader.tabsBorder": "#0000",
+    "editorGutter.addedBackground": "#56949f",
+    "editorGutter.background": "#faf4ed",
+    "editorGutter.commentRangeForeground": "#797593",
+    "editorGutter.deletedBackground": "#b4637a",
+    "editorGutter.foldingControlForeground": "#907aa9",
+    "editorGutter.modifiedBackground": "#d7827e",
+    "editorHint.border": "#0000",
+    "editorHint.foreground": "#797593",
+    "editorHoverWidget.background": "#fffaf3",
+    "editorHoverWidget.border": "#9893a580",
+    "editorHoverWidget.foreground": "#797593",
+    "editorHoverWidget.highlightForeground": "#575279",
+    "editorHoverWidget.statusBarBackground": "#0000",
+    "editorIndentGuide.activeBackground": "#9893a5",
+    "editorIndentGuide.background": "#6e6a8626",
+    "editorInfo.border": "#f2e9e1",
+    "editorInfo.foreground": "#56949f",
+    "editorInlayHint.background": "#f2e9e1",
+    "editorInlayHint.foreground": "#797593",
+    "editorInlayHint.parameterBackground": "#f2e9e1",
+    "editorInlayHint.parameterForeground": "#907aa9",
+    "editorInlayHint.typeBackground": "#f2e9e1",
+    "editorInlayHint.typeForeground": "#56949f",
+    "editorLightBulb.foreground": "#286983",
+    "editorLightBulbAutoFix.foreground": "#d7827e",
+    "editorLineNumber.activeForeground": "#575279",
+    "editorLineNumber.foreground": "#797593",
+    "editorLink.activeForeground": "#d7827e",
+    "editorMarkerNavigation.background": "#fffaf3",
+    "editorMarkerNavigationError.background": "#fffaf3",
+    "editorMarkerNavigationInfo.background": "#fffaf3",
+    "editorMarkerNavigationWarning.background": "#fffaf3",
+    "editorOverviewRuler.addedForeground": "#56949f80",
+    "editorOverviewRuler.background": "#faf4ed",
+    "editorOverviewRuler.border": "#6e6a8626",
+    "editorOverviewRuler.bracketMatchForeground": "#797593",
+    "editorOverviewRuler.commonContentForeground": "#6e6a860d",
+    "editorOverviewRuler.currentContentForeground": "#6e6a8614",
+    "editorOverviewRuler.deletedForeground": "#b4637a80",
+    "editorOverviewRuler.errorForeground": "#b4637a80",
+    "editorOverviewRuler.findMatchForeground": "#6e6a8626",
+    "editorOverviewRuler.incomingContentForeground": "#907aa980",
+    "editorOverviewRuler.infoForeground": "#56949f80",
+    "editorOverviewRuler.modifiedForeground": "#d7827e80",
+    "editorOverviewRuler.rangeHighlightForeground": "#6e6a8626",
+    "editorOverviewRuler.selectionHighlightForeground": "#6e6a8626",
+    "editorOverviewRuler.warningForeground": "#ea9d3480",
+    "editorOverviewRuler.wordHighlightForeground": "#6e6a8614",
+    "editorOverviewRuler.wordHighlightStrongForeground": "#6e6a8626",
+    "editorPane.background": "#0000",
+    "editorRuler.foreground": "#6e6a8626",
+    "editorSuggestWidget.background": "#fffaf3",
+    "editorSuggestWidget.border": "#0000",
+    "editorSuggestWidget.focusHighlightForeground": "#d7827e",
+    "editorSuggestWidget.foreground": "#797593",
+    "editorSuggestWidget.highlightForeground": "#d7827e",
+    "editorSuggestWidget.selectedBackground": "#6e6a8614",
+    "editorSuggestWidget.selectedForeground": "#575279",
+    "editorSuggestWidget.selectedIconForeground": "#575279",
+    "editorUnnecessaryCode.border": "#0000",
+    "editorUnnecessaryCode.opacity": "#57527980",
+    "editorWarning.border": "#0000",
+    "editorWarning.foreground": "#ea9d34",
+    "editorWhitespace.foreground": "#9893a5",
+    "editorWidget.background": "#fffaf3",
+    "editorWidget.border": "#f2e9e1",
+    "editorWidget.foreground": "#797593",
+    "editorWidget.resizeBorder": "#9893a5",
+    "errorForeground": "#b4637a",
+    "extensionBadge.remoteBackground": "#907aa9",
+    "extensionBadge.remoteForeground": "#faf4ed",
+    "extensionButton.prominentBackground": "#d7827e",
+    "extensionButton.prominentForeground": "#faf4ed",
+    "extensionButton.prominentHoverBackground": "#d7827ee6",
+    "extensionIcon.preReleaseForeground": "#286983",
+    "extensionIcon.starForeground": "#d7827e",
+    "extensionIcon.verifiedForeground": "#907aa9",
+    "focusBorder": "#6e6a8614",
+    "foreground": "#575279",
+    "gitDecoration.addedResourceForeground": "#56949f",
+    "gitDecoration.conflictingResourceForeground": "#b4637a",
+    "gitDecoration.deletedResourceForeground": "#797593",
+    "gitDecoration.ignoredResourceForeground": "#9893a5",
+    "gitDecoration.modifiedResourceForeground": "#d7827e",
+    "gitDecoration.renamedResourceForeground": "#286983",
+    "gitDecoration.stageDeletedResourceForeground": "#b4637a",
+    "gitDecoration.stageModifiedResourceForeground": "#907aa9",
+    "gitDecoration.submoduleResourceForeground": "#ea9d34",
+    "gitDecoration.untrackedResourceForeground": "#ea9d34",
+    "icon.foreground": "#797593",
+    "input.background": "#f2e9e180",
+    "input.border": "#6e6a8614",
+    "input.foreground": "#575279",
+    "input.placeholderForeground": "#797593",
+    "inputOption.activeBackground": "#d7827e26",
+    "inputOption.activeForeground": "#d7827e",
+    "inputValidation.errorBackground": "#fffaf3",
+    "inputValidation.errorBorder": "#6e6a8626",
+    "inputValidation.errorForeground": "#b4637a",
+    "inputValidation.infoBackground": "#fffaf3",
+    "inputValidation.infoBorder": "#6e6a8626",
+    "inputValidation.infoForeground": "#56949f",
+    "inputValidation.warningBackground": "#fffaf3",
+    "inputValidation.warningBorder": "#6e6a8626",
+    "inputValidation.warningForeground": "#56949f80",
+    "keybindingLabel.background": "#f2e9e1",
+    "keybindingLabel.border": "#6e6a8626",
+    "keybindingLabel.bottomBorder": "#6e6a8626",
+    "keybindingLabel.foreground": "#907aa9",
+    "keybindingTable.headerBackground": "#f2e9e1",
+    "keybindingTable.rowsBackground": "#fffaf3",
+    "list.activeSelectionBackground": "#6e6a8614",
+    "list.activeSelectionForeground": "#575279",
+    "list.deemphasizedForeground": "#797593",
+    "list.dropBackground": "#fffaf3",
+    "list.errorForeground": "#b4637a",
+    "list.filterMatchBackground": "#fffaf3",
+    "list.filterMatchBorder": "#d7827e",
+    "list.focusBackground": "#6e6a8626",
+    "list.focusForeground": "#575279",
+    "list.focusOutline": "#6e6a8614",
+    "list.highlightForeground": "#d7827e",
+    "list.hoverBackground": "#6e6a860d",
+    "list.hoverForeground": "#575279",
+    "list.inactiveFocusBackground": "#6e6a860d",
+    "list.inactiveSelectionBackground": "#fffaf3",
+    "list.inactiveSelectionForeground": "#575279",
+    "list.invalidItemForeground": "#b4637a",
+    "list.warningForeground": "#ea9d34",
+    "listFilterWidget.background": "#fffaf3",
+    "listFilterWidget.noMatchesOutline": "#b4637a",
+    "listFilterWidget.outline": "#f2e9e1",
+    "menu.background": "#fffaf3",
+    "menu.border": "#6e6a860d",
+    "menu.foreground": "#575279",
+    "menu.selectionBackground": "#6e6a8614",
+    "menu.selectionBorder": "#f2e9e1",
+    "menu.selectionForeground": "#575279",
+    "menu.separatorBackground": "#6e6a8626",
+    "menubar.selectionBackground": "#6e6a8614",
+    "menubar.selectionBorder": "#6e6a860d",
+    "menubar.selectionForeground": "#575279",
+    "merge.border": "#f2e9e1",
+    "merge.commonContentBackground": "#6e6a8614",
+    "merge.commonHeaderBackground": "#6e6a8614",
+    "merge.currentContentBackground": "#ea9d3480",
+    "merge.currentHeaderBackground": "#ea9d3480",
+    "merge.incomingContentBackground": "#56949f80",
+    "merge.incomingHeaderBackground": "#56949f80",
+    "minimap.background": "#fffaf3",
+    "minimap.errorHighlight": "#b4637a80",
+    "minimap.findMatchHighlight": "#6e6a8614",
+    "minimap.selectionHighlight": "#6e6a8614",
+    "minimap.warningHighlight": "#ea9d3480",
+    "minimapGutter.addedBackground": "#56949f",
+    "minimapGutter.deletedBackground": "#b4637a",
+    "minimapGutter.modifiedBackground": "#d7827e",
+    "minimapSlider.activeBackground": "#6e6a8626",
+    "minimapSlider.background": "#6e6a8614",
+    "minimapSlider.hoverBackground": "#6e6a8614",
+    "notebook.cellBorderColor": "#56949f80",
+    "notebook.cellEditorBackground": "#fffaf3",
+    "notebook.cellHoverBackground": "#f2e9e180",
+    "notebook.focusedCellBackground": "#6e6a860d",
+    "notebook.focusedCellBorder": "#56949f",
+    "notebook.outputContainerBackgroundColor": "#6e6a860d",
+    "notificationCenter.border": "#6e6a8614",
+    "notificationCenterHeader.background": "#fffaf3",
+    "notificationCenterHeader.foreground": "#797593",
+    "notificationLink.foreground": "#907aa9",
+    "notifications.background": "#fffaf3",
+    "notifications.border": "#6e6a8614",
+    "notifications.foreground": "#575279",
+    "notificationsErrorIcon.foreground": "#b4637a",
+    "notificationsInfoIcon.foreground": "#56949f",
+    "notificationsWarningIcon.foreground": "#ea9d34",
+    "notificationToast.border": "#6e6a8614",
+    "panel.background": "#fffaf3",
+    "panel.border": "#0000",
+    "panel.dropBorder": "#f2e9e1",
+    "panelInput.border": "#fffaf3",
+    "panelSection.dropBackground": "#6e6a8614",
+    "panelSectionHeader.background": "#fffaf3",
+    "panelSectionHeader.foreground": "#575279",
+    "panelTitle.activeBorder": "#6e6a8626",
+    "panelTitle.activeForeground": "#575279",
+    "panelTitle.inactiveForeground": "#797593",
+    "peekView.border": "#f2e9e1",
+    "peekViewEditor.background": "#fffaf3",
+    "peekViewEditor.matchHighlightBackground": "#6e6a8626",
+    "peekViewResult.background": "#fffaf3",
+    "peekViewResult.fileForeground": "#797593",
+    "peekViewResult.lineForeground": "#797593",
+    "peekViewResult.matchHighlightBackground": "#6e6a8626",
+    "peekViewResult.selectionBackground": "#6e6a8614",
+    "peekViewResult.selectionForeground": "#575279",
+    "peekViewTitle.background": "#f2e9e1",
+    "peekViewTitleDescription.foreground": "#797593",
+    "pickerGroup.border": "#6e6a8626",
+    "pickerGroup.foreground": "#907aa9",
+    "ports.iconRunningProcessForeground": "#d7827e",
+    "problemsErrorIcon.foreground": "#b4637a",
+    "problemsInfoIcon.foreground": "#56949f",
+    "problemsWarningIcon.foreground": "#ea9d34",
+    "progressBar.background": "#d7827e",
+    "quickInput.background": "#fffaf3",
+    "quickInput.foreground": "#797593",
+    "quickInputList.focusBackground": "#6e6a8614",
+    "quickInputList.focusForeground": "#575279",
+    "quickInputList.focusIconForeground": "#575279",
+    "scrollbar.shadow": "#fffaf34d",
+    "scrollbarSlider.activeBackground": "#28698380",
+    "scrollbarSlider.background": "#6e6a8614",
+    "scrollbarSlider.hoverBackground": "#6e6a8626",
+    "searchEditor.findMatchBackground": "#6e6a8614",
+    "selection.background": "#6e6a8626",
+    "settings.focusedRowBackground": "#fffaf3",
+    "settings.headerForeground": "#575279",
+    "settings.modifiedItemIndicator": "#d7827e",
+    "settings.focusedRowBorder": "#6e6a8614",
+    "settings.rowHoverBackground": "#fffaf3",
+    "sideBar.background": "#faf4ed",
+    "sideBar.dropBackground": "#fffaf3",
+    "sideBar.foreground": "#797593",
+    "sideBarSectionHeader.background": "#0000",
+    "sideBarSectionHeader.border": "#6e6a8614",
+    "statusBar.background": "#faf4ed",
+    "statusBar.debuggingBackground": "#907aa9",
+    "statusBar.debuggingForeground": "#faf4ed",
+    "statusBar.foreground": "#797593",
+    "statusBar.noFolderBackground": "#faf4ed",
+    "statusBar.noFolderForeground": "#797593",
+    "statusBarItem.activeBackground": "#6e6a8626",
+    "statusBarItem.hoverBackground": "#6e6a8614",
+    "statusBarItem.prominentBackground": "#f2e9e1",
+    "statusBarItem.prominentForeground": "#575279",
+    "statusBarItem.prominentHoverBackground": "#6e6a8614",
+    "statusBarItem.remoteBackground": "#faf4ed",
+    "statusBarItem.remoteForeground": "#ea9d34",
+    "statusBarItem.errorBackground": "#faf4ed",
+    "statusBarItem.errorForeground": "#b4637a",
+    "symbolIcon.arrayForeground": "#797593",
+    "symbolIcon.classForeground": "#797593",
+    "symbolIcon.colorForeground": "#797593",
+    "symbolIcon.constantForeground": "#797593",
+    "symbolIcon.constructorForeground": "#797593",
+    "symbolIcon.enumeratorForeground": "#797593",
+    "symbolIcon.enumeratorMemberForeground": "#797593",
+    "symbolIcon.eventForeground": "#797593",
+    "symbolIcon.fieldForeground": "#797593",
+    "symbolIcon.fileForeground": "#797593",
+    "symbolIcon.folderForeground": "#797593",
+    "symbolIcon.functionForeground": "#797593",
+    "symbolIcon.interfaceForeground": "#797593",
+    "symbolIcon.keyForeground": "#797593",
+    "symbolIcon.keywordForeground": "#797593",
+    "symbolIcon.methodForeground": "#797593",
+    "symbolIcon.moduleForeground": "#797593",
+    "symbolIcon.namespaceForeground": "#797593",
+    "symbolIcon.nullForeground": "#797593",
+    "symbolIcon.numberForeground": "#797593",
+    "symbolIcon.objectForeground": "#797593",
+    "symbolIcon.operatorForeground": "#797593",
+    "symbolIcon.packageForeground": "#797593",
+    "symbolIcon.propertyForeground": "#797593",
+    "symbolIcon.referenceForeground": "#797593",
+    "symbolIcon.snippetForeground": "#797593",
+    "symbolIcon.stringForeground": "#797593",
+    "symbolIcon.structForeground": "#797593",
+    "symbolIcon.textForeground": "#797593",
+    "symbolIcon.typeParameterForeground": "#797593",
+    "symbolIcon.unitForeground": "#797593",
+    "symbolIcon.variableForeground": "#797593",
+    "tab.activeBackground": "#6e6a860d",
+    "tab.activeForeground": "#575279",
+    "tab.activeModifiedBorder": "#56949f",
+    "tab.border": "#0000",
+    "tab.hoverBackground": "#6e6a8614",
+    "tab.inactiveBackground": "#0000",
+    "tab.inactiveForeground": "#797593",
+    "tab.inactiveModifiedBorder": "#56949f80",
+    "tab.lastPinnedBorder": "#9893a5",
+    "tab.unfocusedActiveBackground": "#0000",
+    "tab.unfocusedHoverBackground": "#0000",
+    "tab.unfocusedInactiveBackground": "#0000",
+    "tab.unfocusedInactiveModifiedBorder": "#56949f80",
+    "terminal.ansiBlack": "#f2e9e1",
+    "terminal.ansiBlue": "#56949f",
+    "terminal.ansiBrightBlack": "#797593",
+    "terminal.ansiBrightBlue": "#56949f",
+    "terminal.ansiBrightCyan": "#d7827e",
+    "terminal.ansiBrightGreen": "#286983",
+    "terminal.ansiBrightMagenta": "#907aa9",
+    "terminal.ansiBrightRed": "#b4637a",
+    "terminal.ansiBrightWhite": "#575279",
+    "terminal.ansiBrightYellow": "#ea9d34",
+    "terminal.ansiCyan": "#d7827e",
+    "terminal.ansiGreen": "#286983",
+    "terminal.ansiMagenta": "#907aa9",
+    "terminal.ansiRed": "#b4637a",
+    "terminal.ansiWhite": "#575279",
+    "terminal.ansiYellow": "#ea9d34",
+    "terminal.dropBackground": "#6e6a8614",
+    "terminal.foreground": "#575279",
+    "terminal.selectionBackground": "#6e6a8614",
+    "terminal.tab.activeBorder": "#575279",
+    "terminalCursor.background": "#575279",
+    "terminalCursor.foreground": "#9893a5",
+    "textBlockQuote.background": "#fffaf3",
+    "textBlockQuote.border": "#6e6a8614",
+    "textCodeBlock.background": "#fffaf3",
+    "textLink.activeForeground": "#907aa9e6",
+    "textLink.foreground": "#907aa9",
+    "textPreformat.foreground": "#ea9d34",
+    "textSeparator.foreground": "#797593",
+    "titleBar.activeBackground": "#faf4ed",
+    "titleBar.activeForeground": "#797593",
+    "titleBar.inactiveBackground": "#fffaf3",
+    "titleBar.inactiveForeground": "#797593",
+    "toolbar.activeBackground": "#6e6a8626",
+    "toolbar.hoverBackground": "#6e6a8614",
+    "tree.indentGuidesStroke": "#797593",
+    "walkThrough.embeddedEditorBackground": "#faf4ed",
+    "welcomePage.background": "#faf4ed",
+    "welcomePage.buttonBackground": "#fffaf3",
+    "welcomePage.buttonHoverBackground": "#f2e9e1",
+    "widget.shadow": "#fffaf34d",
+    "window.activeBorder": "#fffaf3",
+    "window.inactiveBorder": "#fffaf3"
+  },
+  "tokenColors": [
+    {
+      "scope": ["comment"],
+      "settings": {
+        "foreground": "#9893a5",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "scope": ["constant"],
+      "settings": {
+        "foreground": "#286983"
+      }
+    },
+    {
+      "scope": ["constant.numeric", "constant.language"],
+      "settings": {
+        "foreground": "#d7827e"
+      }
+    },
+    {
+      "scope": ["entity.name"],
+      "settings": {
+        "foreground": "#d7827e"
+      }
+    },
+    {
+      "scope": [
+        "entity.name.section",
+        "entity.name.tag",
+        "entity.name.namespace",
+        "entity.name.type"
+      ],
+      "settings": {
+        "foreground": "#56949f"
+      }
+    },
+    {
+      "scope": ["entity.other.attribute-name", "entity.other.inherited-class"],
+      "settings": {
+        "foreground": "#907aa9",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "scope": ["invalid"],
+      "settings": {
+        "foreground": "#b4637a"
+      }
+    },
+    {
+      "scope": ["invalid.deprecated"],
+      "settings": {
+        "foreground": "#797593"
+      }
+    },
+    {
+      "scope": ["keyword"],
+      "settings": {
+        "foreground": "#286983"
+      }
+    },
+    {
+      "scope": ["markup.inserted.diff"],
+      "settings": {
+        "foreground": "#56949f"
+      }
+    },
+    {
+      "scope": ["markup.deleted.diff"],
+      "settings": {
+        "foreground": "#b4637a"
+      }
+    },
+    {
+      "scope": "markup.heading",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "scope": "markup.bold.markdown",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "scope": "markup.italic.markdown",
+      "settings": {
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "scope": ["meta.diff.range"],
+      "settings": {
+        "foreground": "#907aa9"
+      }
+    },
+    {
+      "scope": ["meta.tag", "meta.brace"],
+      "settings": {
+        "foreground": "#575279"
+      }
+    },
+    {
+      "scope": ["meta.import", "meta.export"],
+      "settings": {
+        "foreground": "#286983"
+      }
+    },
+    {
+      "scope": "meta.directive.vue",
+      "settings": {
+        "foreground": "#907aa9",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "scope": "meta.property-name.css",
+      "settings": {
+        "foreground": "#56949f"
+      }
+    },
+    {
+      "scope": "meta.property-value.css",
+      "settings": {
+        "foreground": "#ea9d34"
+      }
+    },
+    {
+      "scope": "meta.tag.other.html",
+      "settings": {
+        "foreground": "#797593"
+      }
+    },
+    {
+      "scope": ["punctuation"],
+      "settings": {
+        "foreground": "#797593"
+      }
+    },
+    {
+      "scope": ["punctuation.accessor"],
+      "settings": {
+        "foreground": "#286983"
+      }
+    },
+    {
+      "scope": ["punctuation.definition.string"],
+      "settings": {
+        "foreground": "#ea9d34"
+      }
+    },
+    {
+      "scope": ["punctuation.definition.tag"],
+      "settings": {
+        "foreground": "#9893a5"
+      }
+    },
+    {
+      "scope": ["storage.type", "storage.modifier"],
+      "settings": {
+        "foreground": "#286983"
+      }
+    },
+    {
+      "scope": ["string"],
+      "settings": {
+        "foreground": "#ea9d34"
+      }
+    },
+    {
+      "scope": ["support"],
+      "settings": {
+        "foreground": "#56949f"
+      }
+    },
+    {
+      "scope": ["support.constant"],
+      "settings": {
+        "foreground": "#ea9d34"
+      }
+    },
+    {
+      "scope": ["support.function"],
+      "settings": {
+        "foreground": "#b4637a",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "scope": ["variable"],
+      "settings": {
+        "foreground": "#d7827e",
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "scope": [
+        "variable.other",
+        "variable.language",
+        "variable.function",
+        "variable.argument"
+      ],
+      "settings": {
+        "foreground": "#575279"
+      }
+    },
+    {
+      "scope": ["variable.parameter"],
+      "settings": {
+        "foreground": "#907aa9"
+      }
+    }
+  ]
 }

assets/themes/src/vscode/rose-pine/rose-pine-moon.json 🔗

@@ -1,680 +1,680 @@
 {
-    "name": "Rosé Pine Moon",
-    "type": "dark",
-    "colors": {
-        "activityBar.activeBorder": "#e0def4",
-        "activityBar.background": "#232136",
-        "activityBar.dropBorder": "#393552",
-        "activityBar.foreground": "#e0def4",
-        "activityBar.inactiveForeground": "#908caa",
-        "activityBarBadge.background": "#ea9a97",
-        "activityBarBadge.foreground": "#232136",
-        "badge.background": "#ea9a97",
-        "badge.foreground": "#232136",
-        "banner.background": "#2a273f",
-        "banner.foreground": "#e0def4",
-        "banner.iconForeground": "#908caa",
-        "breadcrumb.activeSelectionForeground": "#ea9a97",
-        "breadcrumb.background": "#232136",
-        "breadcrumb.focusForeground": "#908caa",
-        "breadcrumb.foreground": "#6e6a86",
-        "breadcrumbPicker.background": "#2a273f",
-        "button.background": "#ea9a97",
-        "button.foreground": "#232136",
-        "button.hoverBackground": "#ea9a97e6",
-        "button.secondaryBackground": "#2a273f",
-        "button.secondaryForeground": "#e0def4",
-        "button.secondaryHoverBackground": "#393552",
-        "charts.blue": "#9ccfd8",
-        "charts.foreground": "#e0def4",
-        "charts.green": "#3e8fb0",
-        "charts.lines": "#908caa",
-        "charts.orange": "#ea9a97",
-        "charts.purple": "#c4a7e7",
-        "charts.red": "#eb6f92",
-        "charts.yellow": "#f6c177",
-        "checkbox.background": "#2a273f",
-        "checkbox.border": "#817c9c26",
-        "checkbox.foreground": "#e0def4",
-        "debugExceptionWidget.background": "#2a273f",
-        "debugExceptionWidget.border": "#817c9c26",
-        "debugIcon.breakpointCurrentStackframeForeground": "#908caa",
-        "debugIcon.breakpointDisabledForeground": "#908caa",
-        "debugIcon.breakpointForeground": "#908caa",
-        "debugIcon.breakpointStackframeForeground": "#908caa",
-        "debugIcon.breakpointUnverifiedForeground": "#908caa",
-        "debugIcon.continueForeground": "#908caa",
-        "debugIcon.disconnectForeground": "#908caa",
-        "debugIcon.pauseForeground": "#908caa",
-        "debugIcon.restartForeground": "#908caa",
-        "debugIcon.startForeground": "#908caa",
-        "debugIcon.stepBackForeground": "#908caa",
-        "debugIcon.stepIntoForeground": "#908caa",
-        "debugIcon.stepOutForeground": "#908caa",
-        "debugIcon.stepOverForeground": "#908caa",
-        "debugIcon.stopForeground": "#eb6f92",
-        "debugToolBar.background": "#2a273f",
-        "debugToolBar.border": "#393552",
-        "descriptionForeground": "#908caa",
-        "diffEditor.border": "#393552",
-        "diffEditor.diagonalFill": "#817c9c4d",
-        "diffEditor.insertedLineBackground": "#9ccfd826",
-        "diffEditor.insertedTextBackground": "#9ccfd826",
-        "diffEditor.removedLineBackground": "#eb6f9226",
-        "diffEditor.removedTextBackground": "#eb6f9226",
-        "diffEditorOverview.insertedForeground": "#9ccfd880",
-        "diffEditorOverview.removedForeground": "#eb6f9280",
-        "dropdown.background": "#2a273f",
-        "dropdown.border": "#817c9c26",
-        "dropdown.foreground": "#e0def4",
-        "dropdown.listBackground": "#2a273f",
-        "editor.background": "#232136",
-        "editor.findMatchBackground": "#817c9c4d",
-        "editor.findMatchHighlightBackground": "#817c9c4d",
-        "editor.findRangeHighlightBackground": "#817c9c4d",
-        "editor.findRangeHighlightBorder": "#000000",
-        "editor.focusedStackFrameHighlightBackground": "#817c9c26",
-        "editor.foldBackground": "#2a273f",
-        "editor.foreground": "#e0def4",
-        "editor.hoverHighlightBackground": "#000000",
-        "editor.inactiveSelectionBackground": "#817c9c14",
-        "editor.inlineValuesBackground": "#000000",
-        "editor.inlineValuesForeground": "#908caa",
-        "editor.lineHighlightBackground": "#817c9c14",
-        "editor.lineHighlightBorder": "#000000",
-        "editor.linkedEditingBackground": "#2a273f",
-        "editor.rangeHighlightBackground": "#817c9c14",
-        "editor.selectionBackground": "#817c9c26",
-        "editor.selectionForeground": "#e0def4",
-        "editor.selectionHighlightBackground": "#817c9c26",
-        "editor.selectionHighlightBorder": "#232136",
-        "editor.snippetFinalTabstopHighlightBackground": "#817c9c26",
-        "editor.snippetFinalTabstopHighlightBorder": "#2a273f",
-        "editor.snippetTabstopHighlightBackground": "#817c9c26",
-        "editor.snippetTabstopHighlightBorder": "#2a273f",
-        "editor.stackFrameHighlightBackground": "#817c9c26",
-        "editor.symbolHighlightBackground": "#817c9c26",
-        "editor.symbolHighlightBorder": "#000000",
-        "editor.wordHighlightBackground": "#817c9c26",
-        "editor.wordHighlightBorder": "#000000",
-        "editor.wordHighlightStrongBackground": "#817c9c26",
-        "editor.wordHighlightStrongBorder": "#817c9c26",
-        "editorBracketHighlight.foreground1": "#eb6f9280",
-        "editorBracketHighlight.foreground2": "#3e8fb080",
-        "editorBracketHighlight.foreground3": "#f6c17780",
-        "editorBracketHighlight.foreground4": "#9ccfd880",
-        "editorBracketHighlight.foreground5": "#ea9a9780",
-        "editorBracketHighlight.foreground6": "#c4a7e780",
-        "editorBracketMatch.background": "#000000",
-        "editorBracketMatch.border": "#908caa",
-        "editorBracketPairGuide.activeBackground1": "#3e8fb0",
-        "editorBracketPairGuide.activeBackground2": "#ea9a97",
-        "editorBracketPairGuide.activeBackground3": "#c4a7e7",
-        "editorBracketPairGuide.activeBackground4": "#9ccfd8",
-        "editorBracketPairGuide.activeBackground5": "#f6c177",
-        "editorBracketPairGuide.activeBackground6": "#eb6f92",
-        "editorBracketPairGuide.background1": "#3e8fb080",
-        "editorBracketPairGuide.background2": "#ea9a9780",
-        "editorBracketPairGuide.background3": "#c4a7e780",
-        "editorBracketPairGuide.background4": "#9ccfd880",
-        "editorBracketPairGuide.background5": "#f6c17780",
-        "editorBracketPairGuide.background6": "#eb6f9280",
-        "editorCodeLens.foreground": "#ea9a97",
-        "editorCursor.background": "#e0def4",
-        "editorCursor.foreground": "#6e6a86",
-        "editorError.border": "#000000",
-        "editorError.foreground": "#eb6f92",
-        "editorGhostText.foreground": "#908caa",
-        "editorGroup.border": "#000000",
-        "editorGroup.dropBackground": "#2a273f",
-        "editorGroup.emptyBackground": "#000000",
-        "editorGroup.focusedEmptyBorder": "#000000",
-        "editorGroupHeader.noTabsBackground": "#000000",
-        "editorGroupHeader.tabsBackground": "#000000",
-        "editorGroupHeader.tabsBorder": "#000000",
-        "editorGutter.addedBackground": "#9ccfd8",
-        "editorGutter.background": "#232136",
-        "editorGutter.commentRangeForeground": "#908caa",
-        "editorGutter.deletedBackground": "#eb6f92",
-        "editorGutter.foldingControlForeground": "#c4a7e7",
-        "editorGutter.modifiedBackground": "#ea9a97",
-        "editorHint.border": "#000000",
-        "editorHint.foreground": "#908caa",
-        "editorHoverWidget.background": "#2a273f",
-        "editorHoverWidget.border": "#6e6a8680",
-        "editorHoverWidget.foreground": "#908caa",
-        "editorHoverWidget.highlightForeground": "#e0def4",
-        "editorHoverWidget.statusBarBackground": "#000000",
-        "editorIndentGuide.activeBackground": "#6e6a86",
-        "editorIndentGuide.background": "#817c9c4d",
-        "editorInfo.border": "#393552",
-        "editorInfo.foreground": "#9ccfd8",
-        "editorInlayHint.background": "#393552",
-        "editorInlayHint.foreground": "#908caa",
-        "editorInlayHint.parameterBackground": "#393552",
-        "editorInlayHint.parameterForeground": "#c4a7e7",
-        "editorInlayHint.typeBackground": "#393552",
-        "editorInlayHint.typeForeground": "#9ccfd8",
-        "editorLightBulb.foreground": "#3e8fb0",
-        "editorLightBulbAutoFix.foreground": "#ea9a97",
-        "editorLineNumber.activeForeground": "#e0def4",
-        "editorLineNumber.foreground": "#908caa",
-        "editorLink.activeForeground": "#ea9a97",
-        "editorMarkerNavigation.background": "#2a273f",
-        "editorMarkerNavigationError.background": "#2a273f",
-        "editorMarkerNavigationInfo.background": "#2a273f",
-        "editorMarkerNavigationWarning.background": "#2a273f",
-        "editorOverviewRuler.addedForeground": "#9ccfd880",
-        "editorOverviewRuler.background": "#232136",
-        "editorOverviewRuler.border": "#817c9c4d",
-        "editorOverviewRuler.bracketMatchForeground": "#908caa",
-        "editorOverviewRuler.commonContentForeground": "#817c9c14",
-        "editorOverviewRuler.currentContentForeground": "#817c9c26",
-        "editorOverviewRuler.deletedForeground": "#eb6f9280",
-        "editorOverviewRuler.errorForeground": "#eb6f9280",
-        "editorOverviewRuler.findMatchForeground": "#817c9c4d",
-        "editorOverviewRuler.incomingContentForeground": "#c4a7e780",
-        "editorOverviewRuler.infoForeground": "#9ccfd880",
-        "editorOverviewRuler.modifiedForeground": "#ea9a9780",
-        "editorOverviewRuler.rangeHighlightForeground": "#817c9c4d",
-        "editorOverviewRuler.selectionHighlightForeground": "#817c9c4d",
-        "editorOverviewRuler.warningForeground": "#f6c17780",
-        "editorOverviewRuler.wordHighlightForeground": "#817c9c26",
-        "editorOverviewRuler.wordHighlightStrongForeground": "#817c9c4d",
-        "editorPane.background": "#000000",
-        "editorRuler.foreground": "#817c9c4d",
-        "editorSuggestWidget.background": "#2a273f",
-        "editorSuggestWidget.border": "#000000",
-        "editorSuggestWidget.focusHighlightForeground": "#ea9a97",
-        "editorSuggestWidget.foreground": "#908caa",
-        "editorSuggestWidget.highlightForeground": "#ea9a97",
-        "editorSuggestWidget.selectedBackground": "#817c9c26",
-        "editorSuggestWidget.selectedForeground": "#e0def4",
-        "editorSuggestWidget.selectedIconForeground": "#e0def4",
-        "editorUnnecessaryCode.border": "#000000",
-        "editorUnnecessaryCode.opacity": "#e0def480",
-        "editorWarning.border": "#000000",
-        "editorWarning.foreground": "#f6c177",
-        "editorWhitespace.foreground": "#6e6a86",
-        "editorWidget.background": "#2a273f",
-        "editorWidget.border": "#393552",
-        "editorWidget.foreground": "#908caa",
-        "editorWidget.resizeBorder": "#6e6a86",
-        "errorForeground": "#eb6f92",
-        "extensionBadge.remoteBackground": "#c4a7e7",
-        "extensionBadge.remoteForeground": "#232136",
-        "extensionButton.prominentBackground": "#ea9a97",
-        "extensionButton.prominentForeground": "#232136",
-        "extensionButton.prominentHoverBackground": "#ea9a97e6",
-        "extensionIcon.preReleaseForeground": "#3e8fb0",
-        "extensionIcon.starForeground": "#ea9a97",
-        "extensionIcon.verifiedForeground": "#c4a7e7",
-        "focusBorder": "#817c9c26",
-        "foreground": "#e0def4",
-        "gitDecoration.addedResourceForeground": "#9ccfd8",
-        "gitDecoration.conflictingResourceForeground": "#eb6f92",
-        "gitDecoration.deletedResourceForeground": "#908caa",
-        "gitDecoration.ignoredResourceForeground": "#6e6a86",
-        "gitDecoration.modifiedResourceForeground": "#ea9a97",
-        "gitDecoration.renamedResourceForeground": "#3e8fb0",
-        "gitDecoration.stageDeletedResourceForeground": "#eb6f92",
-        "gitDecoration.stageModifiedResourceForeground": "#c4a7e7",
-        "gitDecoration.submoduleResourceForeground": "#f6c177",
-        "gitDecoration.untrackedResourceForeground": "#f6c177",
-        "icon.foreground": "#908caa",
-        "input.background": "#39355280",
-        "input.border": "#817c9c26",
-        "input.foreground": "#e0def4",
-        "input.placeholderForeground": "#908caa",
-        "inputOption.activeBackground": "#ea9a9726",
-        "inputOption.activeForeground": "#ea9a97",
-        "inputValidation.errorBackground": "#2a273f",
-        "inputValidation.errorBorder": "#817c9c4d",
-        "inputValidation.errorForeground": "#eb6f92",
-        "inputValidation.infoBackground": "#2a273f",
-        "inputValidation.infoBorder": "#817c9c4d",
-        "inputValidation.infoForeground": "#9ccfd8",
-        "inputValidation.warningBackground": "#2a273f",
-        "inputValidation.warningBorder": "#817c9c4d",
-        "inputValidation.warningForeground": "#9ccfd880",
-        "keybindingLabel.background": "#393552",
-        "keybindingLabel.border": "#817c9c4d",
-        "keybindingLabel.bottomBorder": "#817c9c4d",
-        "keybindingLabel.foreground": "#c4a7e7",
-        "keybindingTable.headerBackground": "#393552",
-        "keybindingTable.rowsBackground": "#2a273f",
-        "list.activeSelectionBackground": "#817c9c26",
-        "list.activeSelectionForeground": "#e0def4",
-        "list.deemphasizedForeground": "#908caa",
-        "list.dropBackground": "#2a273f",
-        "list.errorForeground": "#eb6f92",
-        "list.filterMatchBackground": "#2a273f",
-        "list.filterMatchBorder": "#ea9a97",
-        "list.focusBackground": "#817c9c4d",
-        "list.focusForeground": "#e0def4",
-        "list.focusOutline": "#817c9c26",
-        "list.highlightForeground": "#ea9a97",
-        "list.hoverBackground": "#817c9c14",
-        "list.hoverForeground": "#e0def4",
-        "list.inactiveFocusBackground": "#817c9c14",
-        "list.inactiveSelectionBackground": "#2a273f",
-        "list.inactiveSelectionForeground": "#e0def4",
-        "list.invalidItemForeground": "#eb6f92",
-        "list.warningForeground": "#f6c177",
-        "listFilterWidget.background": "#2a273f",
-        "listFilterWidget.noMatchesOutline": "#eb6f92",
-        "listFilterWidget.outline": "#393552",
-        "menu.background": "#2a273f",
-        "menu.border": "#817c9c14",
-        "menu.foreground": "#e0def4",
-        "menu.selectionBackground": "#817c9c26",
-        "menu.selectionBorder": "#393552",
-        "menu.selectionForeground": "#e0def4",
-        "menu.separatorBackground": "#817c9c4d",
-        "menubar.selectionBackground": "#817c9c26",
-        "menubar.selectionBorder": "#817c9c14",
-        "menubar.selectionForeground": "#e0def4",
-        "merge.border": "#393552",
-        "merge.commonContentBackground": "#817c9c26",
-        "merge.commonHeaderBackground": "#817c9c26",
-        "merge.currentContentBackground": "#f6c17780",
-        "merge.currentHeaderBackground": "#f6c17780",
-        "merge.incomingContentBackground": "#9ccfd880",
-        "merge.incomingHeaderBackground": "#9ccfd880",
-        "minimap.background": "#2a273f",
-        "minimap.errorHighlight": "#eb6f9280",
-        "minimap.findMatchHighlight": "#817c9c26",
-        "minimap.selectionHighlight": "#817c9c26",
-        "minimap.warningHighlight": "#f6c17780",
-        "minimapGutter.addedBackground": "#9ccfd8",
-        "minimapGutter.deletedBackground": "#eb6f92",
-        "minimapGutter.modifiedBackground": "#ea9a97",
-        "minimapSlider.activeBackground": "#817c9c4d",
-        "minimapSlider.background": "#817c9c26",
-        "minimapSlider.hoverBackground": "#817c9c26",
-        "notebook.cellBorderColor": "#9ccfd880",
-        "notebook.cellEditorBackground": "#2a273f",
-        "notebook.cellHoverBackground": "#39355280",
-        "notebook.focusedCellBackground": "#817c9c14",
-        "notebook.focusedCellBorder": "#9ccfd8",
-        "notebook.outputContainerBackgroundColor": "#817c9c14",
-        "notificationCenter.border": "#817c9c26",
-        "notificationCenterHeader.background": "#2a273f",
-        "notificationCenterHeader.foreground": "#908caa",
-        "notificationLink.foreground": "#c4a7e7",
-        "notifications.background": "#2a273f",
-        "notifications.border": "#817c9c26",
-        "notifications.foreground": "#e0def4",
-        "notificationsErrorIcon.foreground": "#eb6f92",
-        "notificationsInfoIcon.foreground": "#9ccfd8",
-        "notificationsWarningIcon.foreground": "#f6c177",
-        "notificationToast.border": "#817c9c26",
-        "panel.background": "#2a273f",
-        "panel.border": "#000000",
-        "panel.dropBorder": "#393552",
-        "panelInput.border": "#2a273f",
-        "panelSection.dropBackground": "#817c9c26",
-        "panelSectionHeader.background": "#2a273f",
-        "panelSectionHeader.foreground": "#e0def4",
-        "panelTitle.activeBorder": "#817c9c4d",
-        "panelTitle.activeForeground": "#e0def4",
-        "panelTitle.inactiveForeground": "#908caa",
-        "peekView.border": "#393552",
-        "peekViewEditor.background": "#2a273f",
-        "peekViewEditor.matchHighlightBackground": "#817c9c4d",
-        "peekViewResult.background": "#2a273f",
-        "peekViewResult.fileForeground": "#908caa",
-        "peekViewResult.lineForeground": "#908caa",
-        "peekViewResult.matchHighlightBackground": "#817c9c4d",
-        "peekViewResult.selectionBackground": "#817c9c26",
-        "peekViewResult.selectionForeground": "#e0def4",
-        "peekViewTitle.background": "#393552",
-        "peekViewTitleDescription.foreground": "#908caa",
-        "pickerGroup.border": "#817c9c4d",
-        "pickerGroup.foreground": "#c4a7e7",
-        "ports.iconRunningProcessForeground": "#ea9a97",
-        "problemsErrorIcon.foreground": "#eb6f92",
-        "problemsInfoIcon.foreground": "#9ccfd8",
-        "problemsWarningIcon.foreground": "#f6c177",
-        "progressBar.background": "#ea9a97",
-        "quickInput.background": "#2a273f",
-        "quickInput.foreground": "#908caa",
-        "quickInputList.focusBackground": "#817c9c26",
-        "quickInputList.focusForeground": "#e0def4",
-        "quickInputList.focusIconForeground": "#e0def4",
-        "scrollbar.shadow": "#2a273f4d",
-        "scrollbarSlider.activeBackground": "#3e8fb080",
-        "scrollbarSlider.background": "#817c9c26",
-        "scrollbarSlider.hoverBackground": "#817c9c4d",
-        "searchEditor.findMatchBackground": "#817c9c26",
-        "selection.background": "#817c9c4d",
-        "settings.focusedRowBackground": "#2a273f",
-        "settings.headerForeground": "#e0def4",
-        "settings.modifiedItemIndicator": "#ea9a97",
-        "settings.focusedRowBorder": "#817c9c26",
-        "settings.rowHoverBackground": "#2a273f",
-        "sideBar.background": "#232136",
-        "sideBar.dropBackground": "#2a273f",
-        "sideBar.foreground": "#908caa",
-        "sideBarSectionHeader.background": "#000000",
-        "sideBarSectionHeader.border": "#817c9c26",
-        "statusBar.background": "#232136",
-        "statusBar.debuggingBackground": "#c4a7e7",
-        "statusBar.debuggingForeground": "#232136",
-        "statusBar.foreground": "#908caa",
-        "statusBar.noFolderBackground": "#232136",
-        "statusBar.noFolderForeground": "#908caa",
-        "statusBarItem.activeBackground": "#817c9c4d",
-        "statusBarItem.hoverBackground": "#817c9c26",
-        "statusBarItem.prominentBackground": "#393552",
-        "statusBarItem.prominentForeground": "#e0def4",
-        "statusBarItem.prominentHoverBackground": "#817c9c26",
-        "statusBarItem.remoteBackground": "#232136",
-        "statusBarItem.remoteForeground": "#f6c177",
-        "statusBarItem.errorBackground": "#232136",
-        "statusBarItem.errorForeground": "#eb6f92",
-        "symbolIcon.arrayForeground": "#908caa",
-        "symbolIcon.classForeground": "#908caa",
-        "symbolIcon.colorForeground": "#908caa",
-        "symbolIcon.constantForeground": "#908caa",
-        "symbolIcon.constructorForeground": "#908caa",
-        "symbolIcon.enumeratorForeground": "#908caa",
-        "symbolIcon.enumeratorMemberForeground": "#908caa",
-        "symbolIcon.eventForeground": "#908caa",
-        "symbolIcon.fieldForeground": "#908caa",
-        "symbolIcon.fileForeground": "#908caa",
-        "symbolIcon.folderForeground": "#908caa",
-        "symbolIcon.functionForeground": "#908caa",
-        "symbolIcon.interfaceForeground": "#908caa",
-        "symbolIcon.keyForeground": "#908caa",
-        "symbolIcon.keywordForeground": "#908caa",
-        "symbolIcon.methodForeground": "#908caa",
-        "symbolIcon.moduleForeground": "#908caa",
-        "symbolIcon.namespaceForeground": "#908caa",
-        "symbolIcon.nullForeground": "#908caa",
-        "symbolIcon.numberForeground": "#908caa",
-        "symbolIcon.objectForeground": "#908caa",
-        "symbolIcon.operatorForeground": "#908caa",
-        "symbolIcon.packageForeground": "#908caa",
-        "symbolIcon.propertyForeground": "#908caa",
-        "symbolIcon.referenceForeground": "#908caa",
-        "symbolIcon.snippetForeground": "#908caa",
-        "symbolIcon.stringForeground": "#908caa",
-        "symbolIcon.structForeground": "#908caa",
-        "symbolIcon.textForeground": "#908caa",
-        "symbolIcon.typeParameterForeground": "#908caa",
-        "symbolIcon.unitForeground": "#908caa",
-        "symbolIcon.variableForeground": "#908caa",
-        "tab.activeBackground": "#817c9c14",
-        "tab.activeForeground": "#e0def4",
-        "tab.activeModifiedBorder": "#9ccfd8",
-        "tab.border": "#000000",
-        "tab.hoverBackground": "#817c9c26",
-        "tab.inactiveBackground": "#000000",
-        "tab.inactiveForeground": "#908caa",
-        "tab.inactiveModifiedBorder": "#9ccfd880",
-        "tab.lastPinnedBorder": "#6e6a86",
-        "tab.unfocusedActiveBackground": "#000000",
-        "tab.unfocusedHoverBackground": "#000000",
-        "tab.unfocusedInactiveBackground": "#000000",
-        "tab.unfocusedInactiveModifiedBorder": "#9ccfd880",
-        "terminal.ansiBlack": "#393552",
-        "terminal.ansiBlue": "#9ccfd8",
-        "terminal.ansiBrightBlack": "#908caa",
-        "terminal.ansiBrightBlue": "#9ccfd8",
-        "terminal.ansiBrightCyan": "#ea9a97",
-        "terminal.ansiBrightGreen": "#3e8fb0",
-        "terminal.ansiBrightMagenta": "#c4a7e7",
-        "terminal.ansiBrightRed": "#eb6f92",
-        "terminal.ansiBrightWhite": "#e0def4",
-        "terminal.ansiBrightYellow": "#f6c177",
-        "terminal.ansiCyan": "#ea9a97",
-        "terminal.ansiGreen": "#3e8fb0",
-        "terminal.ansiMagenta": "#c4a7e7",
-        "terminal.ansiRed": "#eb6f92",
-        "terminal.ansiWhite": "#e0def4",
-        "terminal.ansiYellow": "#f6c177",
-        "terminal.dropBackground": "#817c9c26",
-        "terminal.foreground": "#e0def4",
-        "terminal.selectionBackground": "#817c9c26",
-        "terminal.tab.activeBorder": "#e0def4",
-        "terminalCursor.background": "#e0def4",
-        "terminalCursor.foreground": "#6e6a86",
-        "textBlockQuote.background": "#2a273f",
-        "textBlockQuote.border": "#817c9c26",
-        "textCodeBlock.background": "#2a273f",
-        "textLink.activeForeground": "#c4a7e7e6",
-        "textLink.foreground": "#c4a7e7",
-        "textPreformat.foreground": "#f6c177",
-        "textSeparator.foreground": "#908caa",
-        "titleBar.activeBackground": "#232136",
-        "titleBar.activeForeground": "#908caa",
-        "titleBar.inactiveBackground": "#2a273f",
-        "titleBar.inactiveForeground": "#908caa",
-        "toolbar.activeBackground": "#817c9c4d",
-        "toolbar.hoverBackground": "#817c9c26",
-        "tree.indentGuidesStroke": "#908caa",
-        "walkThrough.embeddedEditorBackground": "#232136",
-        "welcomePage.background": "#232136",
-        "welcomePage.buttonBackground": "#2a273f",
-        "welcomePage.buttonHoverBackground": "#393552",
-        "widget.shadow": "#2a273f4d",
-        "window.activeBorder": "#2a273f",
-        "window.inactiveBorder": "#2a273f"
-    },
-    "tokenColors": [
-        {
-            "scope": ["comment"],
-            "settings": {
-                "foreground": "#6e6a86",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["constant"],
-            "settings": {
-                "foreground": "#3e8fb0"
-            }
-        },
-        {
-            "scope": ["constant.numeric", "constant.language"],
-            "settings": {
-                "foreground": "#ea9a97"
-            }
-        },
-        {
-            "scope": ["entity.name"],
-            "settings": {
-                "foreground": "#ea9a97"
-            }
-        },
-        {
-            "scope": [
-                "entity.name.section",
-                "entity.name.tag",
-                "entity.name.namespace",
-                "entity.name.type"
-            ],
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": ["entity.other.attribute-name", "entity.other.inherited-class"],
-            "settings": {
-                "foreground": "#c4a7e7",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["invalid"],
-            "settings": {
-                "foreground": "#eb6f92"
-            }
-        },
-        {
-            "scope": ["invalid.deprecated"],
-            "settings": {
-                "foreground": "#908caa"
-            }
-        },
-        {
-            "scope": ["keyword"],
-            "settings": {
-                "foreground": "#3e8fb0"
-            }
-        },
-        {
-            "scope": ["markup.inserted.diff"],
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": ["markup.deleted.diff"],
-            "settings": {
-                "foreground": "#eb6f92"
-            }
-        },
-        {
-            "scope": "markup.heading",
-            "settings": {
-                "fontStyle": "bold"
-            }
-        },
-        {
-            "scope": "markup.bold.markdown",
-            "settings": {
-                "fontStyle": "bold"
-            }
-        },
-        {
-            "scope": "markup.italic.markdown",
-            "settings": {
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["meta.diff.range"],
-            "settings": {
-                "foreground": "#c4a7e7"
-            }
-        },
-        {
-            "scope": ["meta.tag", "meta.brace"],
-            "settings": {
-                "foreground": "#e0def4"
-            }
-        },
-        {
-            "scope": ["meta.import", "meta.export"],
-            "settings": {
-                "foreground": "#3e8fb0"
-            }
-        },
-        {
-            "scope": "meta.directive.vue",
-            "settings": {
-                "foreground": "#c4a7e7",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": "meta.property-name.css",
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": "meta.property-value.css",
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": "meta.tag.other.html",
-            "settings": {
-                "foreground": "#908caa"
-            }
-        },
-        {
-            "scope": ["punctuation"],
-            "settings": {
-                "foreground": "#908caa"
-            }
-        },
-        {
-            "scope": ["punctuation.accessor"],
-            "settings": {
-                "foreground": "#3e8fb0"
-            }
-        },
-        {
-            "scope": ["punctuation.definition.string"],
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": ["punctuation.definition.tag"],
-            "settings": {
-                "foreground": "#6e6a86"
-            }
-        },
-        {
-            "scope": ["storage.type", "storage.modifier"],
-            "settings": {
-                "foreground": "#3e8fb0"
-            }
-        },
-        {
-            "scope": ["string"],
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": ["support"],
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": ["support.constant"],
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": ["support.function"],
-            "settings": {
-                "foreground": "#eb6f92",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["variable"],
-            "settings": {
-                "foreground": "#ea9a97",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": [
-                "variable.other",
-                "variable.language",
-                "variable.function",
-                "variable.argument"
-            ],
-            "settings": {
-                "foreground": "#e0def4"
-            }
-        },
-        {
-            "scope": ["variable.parameter"],
-            "settings": {
-                "foreground": "#c4a7e7"
-            }
-        }
-    ]
+	"name": "Rosé Pine Moon",
+	"type": "dark",
+	"colors": {
+		"activityBar.activeBorder": "#e0def4",
+		"activityBar.background": "#232136",
+		"activityBar.dropBorder": "#393552",
+		"activityBar.foreground": "#e0def4",
+		"activityBar.inactiveForeground": "#908caa",
+		"activityBarBadge.background": "#ea9a97",
+		"activityBarBadge.foreground": "#232136",
+		"badge.background": "#ea9a97",
+		"badge.foreground": "#232136",
+		"banner.background": "#2a273f",
+		"banner.foreground": "#e0def4",
+		"banner.iconForeground": "#908caa",
+		"breadcrumb.activeSelectionForeground": "#ea9a97",
+		"breadcrumb.background": "#232136",
+		"breadcrumb.focusForeground": "#908caa",
+		"breadcrumb.foreground": "#6e6a86",
+		"breadcrumbPicker.background": "#2a273f",
+		"button.background": "#ea9a97",
+		"button.foreground": "#232136",
+		"button.hoverBackground": "#ea9a97e6",
+		"button.secondaryBackground": "#2a273f",
+		"button.secondaryForeground": "#e0def4",
+		"button.secondaryHoverBackground": "#393552",
+		"charts.blue": "#9ccfd8",
+		"charts.foreground": "#e0def4",
+		"charts.green": "#3e8fb0",
+		"charts.lines": "#908caa",
+		"charts.orange": "#ea9a97",
+		"charts.purple": "#c4a7e7",
+		"charts.red": "#eb6f92",
+		"charts.yellow": "#f6c177",
+		"checkbox.background": "#2a273f",
+		"checkbox.border": "#817c9c26",
+		"checkbox.foreground": "#e0def4",
+		"debugExceptionWidget.background": "#2a273f",
+		"debugExceptionWidget.border": "#817c9c26",
+		"debugIcon.breakpointCurrentStackframeForeground": "#908caa",
+		"debugIcon.breakpointDisabledForeground": "#908caa",
+		"debugIcon.breakpointForeground": "#908caa",
+		"debugIcon.breakpointStackframeForeground": "#908caa",
+		"debugIcon.breakpointUnverifiedForeground": "#908caa",
+		"debugIcon.continueForeground": "#908caa",
+		"debugIcon.disconnectForeground": "#908caa",
+		"debugIcon.pauseForeground": "#908caa",
+		"debugIcon.restartForeground": "#908caa",
+		"debugIcon.startForeground": "#908caa",
+		"debugIcon.stepBackForeground": "#908caa",
+		"debugIcon.stepIntoForeground": "#908caa",
+		"debugIcon.stepOutForeground": "#908caa",
+		"debugIcon.stepOverForeground": "#908caa",
+		"debugIcon.stopForeground": "#eb6f92",
+		"debugToolBar.background": "#2a273f",
+		"debugToolBar.border": "#393552",
+		"descriptionForeground": "#908caa",
+		"diffEditor.border": "#393552",
+		"diffEditor.diagonalFill": "#817c9c4d",
+		"diffEditor.insertedLineBackground": "#9ccfd826",
+		"diffEditor.insertedTextBackground": "#9ccfd826",
+		"diffEditor.removedLineBackground": "#eb6f9226",
+		"diffEditor.removedTextBackground": "#eb6f9226",
+		"diffEditorOverview.insertedForeground": "#9ccfd880",
+		"diffEditorOverview.removedForeground": "#eb6f9280",
+		"dropdown.background": "#2a273f",
+		"dropdown.border": "#817c9c26",
+		"dropdown.foreground": "#e0def4",
+		"dropdown.listBackground": "#2a273f",
+		"editor.background": "#232136",
+		"editor.findMatchBackground": "#817c9c4d",
+		"editor.findMatchHighlightBackground": "#817c9c4d",
+		"editor.findRangeHighlightBackground": "#817c9c4d",
+		"editor.findRangeHighlightBorder": "#0000",
+		"editor.focusedStackFrameHighlightBackground": "#817c9c26",
+		"editor.foldBackground": "#2a273f",
+		"editor.foreground": "#e0def4",
+		"editor.hoverHighlightBackground": "#0000",
+		"editor.inactiveSelectionBackground": "#817c9c14",
+		"editor.inlineValuesBackground": "#0000",
+		"editor.inlineValuesForeground": "#908caa",
+		"editor.lineHighlightBackground": "#817c9c14",
+		"editor.lineHighlightBorder": "#0000",
+		"editor.linkedEditingBackground": "#2a273f",
+		"editor.rangeHighlightBackground": "#817c9c14",
+		"editor.selectionBackground": "#817c9c26",
+		"editor.selectionForeground": "#e0def4",
+		"editor.selectionHighlightBackground": "#817c9c26",
+		"editor.selectionHighlightBorder": "#232136",
+		"editor.snippetFinalTabstopHighlightBackground": "#817c9c26",
+		"editor.snippetFinalTabstopHighlightBorder": "#2a273f",
+		"editor.snippetTabstopHighlightBackground": "#817c9c26",
+		"editor.snippetTabstopHighlightBorder": "#2a273f",
+		"editor.stackFrameHighlightBackground": "#817c9c26",
+		"editor.symbolHighlightBackground": "#817c9c26",
+		"editor.symbolHighlightBorder": "#0000",
+		"editor.wordHighlightBackground": "#817c9c26",
+		"editor.wordHighlightBorder": "#0000",
+		"editor.wordHighlightStrongBackground": "#817c9c26",
+		"editor.wordHighlightStrongBorder": "#817c9c26",
+		"editorBracketHighlight.foreground1": "#eb6f9280",
+		"editorBracketHighlight.foreground2": "#3e8fb080",
+		"editorBracketHighlight.foreground3": "#f6c17780",
+		"editorBracketHighlight.foreground4": "#9ccfd880",
+		"editorBracketHighlight.foreground5": "#ea9a9780",
+		"editorBracketHighlight.foreground6": "#c4a7e780",
+		"editorBracketMatch.background": "#0000",
+		"editorBracketMatch.border": "#908caa",
+		"editorBracketPairGuide.activeBackground1": "#3e8fb0",
+		"editorBracketPairGuide.activeBackground2": "#ea9a97",
+		"editorBracketPairGuide.activeBackground3": "#c4a7e7",
+		"editorBracketPairGuide.activeBackground4": "#9ccfd8",
+		"editorBracketPairGuide.activeBackground5": "#f6c177",
+		"editorBracketPairGuide.activeBackground6": "#eb6f92",
+		"editorBracketPairGuide.background1": "#3e8fb080",
+		"editorBracketPairGuide.background2": "#ea9a9780",
+		"editorBracketPairGuide.background3": "#c4a7e780",
+		"editorBracketPairGuide.background4": "#9ccfd880",
+		"editorBracketPairGuide.background5": "#f6c17780",
+		"editorBracketPairGuide.background6": "#eb6f9280",
+		"editorCodeLens.foreground": "#ea9a97",
+		"editorCursor.background": "#e0def4",
+		"editorCursor.foreground": "#6e6a86",
+		"editorError.border": "#0000",
+		"editorError.foreground": "#eb6f92",
+		"editorGhostText.foreground": "#908caa",
+		"editorGroup.border": "#0000",
+		"editorGroup.dropBackground": "#2a273f",
+		"editorGroup.emptyBackground": "#0000",
+		"editorGroup.focusedEmptyBorder": "#0000",
+		"editorGroupHeader.noTabsBackground": "#0000",
+		"editorGroupHeader.tabsBackground": "#0000",
+		"editorGroupHeader.tabsBorder": "#0000",
+		"editorGutter.addedBackground": "#9ccfd8",
+		"editorGutter.background": "#232136",
+		"editorGutter.commentRangeForeground": "#908caa",
+		"editorGutter.deletedBackground": "#eb6f92",
+		"editorGutter.foldingControlForeground": "#c4a7e7",
+		"editorGutter.modifiedBackground": "#ea9a97",
+		"editorHint.border": "#0000",
+		"editorHint.foreground": "#908caa",
+		"editorHoverWidget.background": "#2a273f",
+		"editorHoverWidget.border": "#6e6a8680",
+		"editorHoverWidget.foreground": "#908caa",
+		"editorHoverWidget.highlightForeground": "#e0def4",
+		"editorHoverWidget.statusBarBackground": "#0000",
+		"editorIndentGuide.activeBackground": "#6e6a86",
+		"editorIndentGuide.background": "#817c9c4d",
+		"editorInfo.border": "#393552",
+		"editorInfo.foreground": "#9ccfd8",
+		"editorInlayHint.background": "#393552",
+		"editorInlayHint.foreground": "#908caa",
+		"editorInlayHint.parameterBackground": "#393552",
+		"editorInlayHint.parameterForeground": "#c4a7e7",
+		"editorInlayHint.typeBackground": "#393552",
+		"editorInlayHint.typeForeground": "#9ccfd8",
+		"editorLightBulb.foreground": "#3e8fb0",
+		"editorLightBulbAutoFix.foreground": "#ea9a97",
+		"editorLineNumber.activeForeground": "#e0def4",
+		"editorLineNumber.foreground": "#908caa",
+		"editorLink.activeForeground": "#ea9a97",
+		"editorMarkerNavigation.background": "#2a273f",
+		"editorMarkerNavigationError.background": "#2a273f",
+		"editorMarkerNavigationInfo.background": "#2a273f",
+		"editorMarkerNavigationWarning.background": "#2a273f",
+		"editorOverviewRuler.addedForeground": "#9ccfd880",
+		"editorOverviewRuler.background": "#232136",
+		"editorOverviewRuler.border": "#817c9c4d",
+		"editorOverviewRuler.bracketMatchForeground": "#908caa",
+		"editorOverviewRuler.commonContentForeground": "#817c9c14",
+		"editorOverviewRuler.currentContentForeground": "#817c9c26",
+		"editorOverviewRuler.deletedForeground": "#eb6f9280",
+		"editorOverviewRuler.errorForeground": "#eb6f9280",
+		"editorOverviewRuler.findMatchForeground": "#817c9c4d",
+		"editorOverviewRuler.incomingContentForeground": "#c4a7e780",
+		"editorOverviewRuler.infoForeground": "#9ccfd880",
+		"editorOverviewRuler.modifiedForeground": "#ea9a9780",
+		"editorOverviewRuler.rangeHighlightForeground": "#817c9c4d",
+		"editorOverviewRuler.selectionHighlightForeground": "#817c9c4d",
+		"editorOverviewRuler.warningForeground": "#f6c17780",
+		"editorOverviewRuler.wordHighlightForeground": "#817c9c26",
+		"editorOverviewRuler.wordHighlightStrongForeground": "#817c9c4d",
+		"editorPane.background": "#0000",
+		"editorRuler.foreground": "#817c9c4d",
+		"editorSuggestWidget.background": "#2a273f",
+		"editorSuggestWidget.border": "#0000",
+		"editorSuggestWidget.focusHighlightForeground": "#ea9a97",
+		"editorSuggestWidget.foreground": "#908caa",
+		"editorSuggestWidget.highlightForeground": "#ea9a97",
+		"editorSuggestWidget.selectedBackground": "#817c9c26",
+		"editorSuggestWidget.selectedForeground": "#e0def4",
+		"editorSuggestWidget.selectedIconForeground": "#e0def4",
+		"editorUnnecessaryCode.border": "#0000",
+		"editorUnnecessaryCode.opacity": "#e0def480",
+		"editorWarning.border": "#0000",
+		"editorWarning.foreground": "#f6c177",
+		"editorWhitespace.foreground": "#6e6a86",
+		"editorWidget.background": "#2a273f",
+		"editorWidget.border": "#393552",
+		"editorWidget.foreground": "#908caa",
+		"editorWidget.resizeBorder": "#6e6a86",
+		"errorForeground": "#eb6f92",
+		"extensionBadge.remoteBackground": "#c4a7e7",
+		"extensionBadge.remoteForeground": "#232136",
+		"extensionButton.prominentBackground": "#ea9a97",
+		"extensionButton.prominentForeground": "#232136",
+		"extensionButton.prominentHoverBackground": "#ea9a97e6",
+		"extensionIcon.preReleaseForeground": "#3e8fb0",
+		"extensionIcon.starForeground": "#ea9a97",
+		"extensionIcon.verifiedForeground": "#c4a7e7",
+		"focusBorder": "#817c9c26",
+		"foreground": "#e0def4",
+		"gitDecoration.addedResourceForeground": "#9ccfd8",
+		"gitDecoration.conflictingResourceForeground": "#eb6f92",
+		"gitDecoration.deletedResourceForeground": "#908caa",
+		"gitDecoration.ignoredResourceForeground": "#6e6a86",
+		"gitDecoration.modifiedResourceForeground": "#ea9a97",
+		"gitDecoration.renamedResourceForeground": "#3e8fb0",
+		"gitDecoration.stageDeletedResourceForeground": "#eb6f92",
+		"gitDecoration.stageModifiedResourceForeground": "#c4a7e7",
+		"gitDecoration.submoduleResourceForeground": "#f6c177",
+		"gitDecoration.untrackedResourceForeground": "#f6c177",
+		"icon.foreground": "#908caa",
+		"input.background": "#39355280",
+		"input.border": "#817c9c26",
+		"input.foreground": "#e0def4",
+		"input.placeholderForeground": "#908caa",
+		"inputOption.activeBackground": "#ea9a9726",
+		"inputOption.activeForeground": "#ea9a97",
+		"inputValidation.errorBackground": "#2a273f",
+		"inputValidation.errorBorder": "#817c9c4d",
+		"inputValidation.errorForeground": "#eb6f92",
+		"inputValidation.infoBackground": "#2a273f",
+		"inputValidation.infoBorder": "#817c9c4d",
+		"inputValidation.infoForeground": "#9ccfd8",
+		"inputValidation.warningBackground": "#2a273f",
+		"inputValidation.warningBorder": "#817c9c4d",
+		"inputValidation.warningForeground": "#9ccfd880",
+		"keybindingLabel.background": "#393552",
+		"keybindingLabel.border": "#817c9c4d",
+		"keybindingLabel.bottomBorder": "#817c9c4d",
+		"keybindingLabel.foreground": "#c4a7e7",
+		"keybindingTable.headerBackground": "#393552",
+		"keybindingTable.rowsBackground": "#2a273f",
+		"list.activeSelectionBackground": "#817c9c26",
+		"list.activeSelectionForeground": "#e0def4",
+		"list.deemphasizedForeground": "#908caa",
+		"list.dropBackground": "#2a273f",
+		"list.errorForeground": "#eb6f92",
+		"list.filterMatchBackground": "#2a273f",
+		"list.filterMatchBorder": "#ea9a97",
+		"list.focusBackground": "#817c9c4d",
+		"list.focusForeground": "#e0def4",
+		"list.focusOutline": "#817c9c26",
+		"list.highlightForeground": "#ea9a97",
+		"list.hoverBackground": "#817c9c14",
+		"list.hoverForeground": "#e0def4",
+		"list.inactiveFocusBackground": "#817c9c14",
+		"list.inactiveSelectionBackground": "#2a273f",
+		"list.inactiveSelectionForeground": "#e0def4",
+		"list.invalidItemForeground": "#eb6f92",
+		"list.warningForeground": "#f6c177",
+		"listFilterWidget.background": "#2a273f",
+		"listFilterWidget.noMatchesOutline": "#eb6f92",
+		"listFilterWidget.outline": "#393552",
+		"menu.background": "#2a273f",
+		"menu.border": "#817c9c14",
+		"menu.foreground": "#e0def4",
+		"menu.selectionBackground": "#817c9c26",
+		"menu.selectionBorder": "#393552",
+		"menu.selectionForeground": "#e0def4",
+		"menu.separatorBackground": "#817c9c4d",
+		"menubar.selectionBackground": "#817c9c26",
+		"menubar.selectionBorder": "#817c9c14",
+		"menubar.selectionForeground": "#e0def4",
+		"merge.border": "#393552",
+		"merge.commonContentBackground": "#817c9c26",
+		"merge.commonHeaderBackground": "#817c9c26",
+		"merge.currentContentBackground": "#f6c17780",
+		"merge.currentHeaderBackground": "#f6c17780",
+		"merge.incomingContentBackground": "#9ccfd880",
+		"merge.incomingHeaderBackground": "#9ccfd880",
+		"minimap.background": "#2a273f",
+		"minimap.errorHighlight": "#eb6f9280",
+		"minimap.findMatchHighlight": "#817c9c26",
+		"minimap.selectionHighlight": "#817c9c26",
+		"minimap.warningHighlight": "#f6c17780",
+		"minimapGutter.addedBackground": "#9ccfd8",
+		"minimapGutter.deletedBackground": "#eb6f92",
+		"minimapGutter.modifiedBackground": "#ea9a97",
+		"minimapSlider.activeBackground": "#817c9c4d",
+		"minimapSlider.background": "#817c9c26",
+		"minimapSlider.hoverBackground": "#817c9c26",
+		"notebook.cellBorderColor": "#9ccfd880",
+		"notebook.cellEditorBackground": "#2a273f",
+		"notebook.cellHoverBackground": "#39355280",
+		"notebook.focusedCellBackground": "#817c9c14",
+		"notebook.focusedCellBorder": "#9ccfd8",
+		"notebook.outputContainerBackgroundColor": "#817c9c14",
+		"notificationCenter.border": "#817c9c26",
+		"notificationCenterHeader.background": "#2a273f",
+		"notificationCenterHeader.foreground": "#908caa",
+		"notificationLink.foreground": "#c4a7e7",
+		"notifications.background": "#2a273f",
+		"notifications.border": "#817c9c26",
+		"notifications.foreground": "#e0def4",
+		"notificationsErrorIcon.foreground": "#eb6f92",
+		"notificationsInfoIcon.foreground": "#9ccfd8",
+		"notificationsWarningIcon.foreground": "#f6c177",
+		"notificationToast.border": "#817c9c26",
+		"panel.background": "#2a273f",
+		"panel.border": "#0000",
+		"panel.dropBorder": "#393552",
+		"panelInput.border": "#2a273f",
+		"panelSection.dropBackground": "#817c9c26",
+		"panelSectionHeader.background": "#2a273f",
+		"panelSectionHeader.foreground": "#e0def4",
+		"panelTitle.activeBorder": "#817c9c4d",
+		"panelTitle.activeForeground": "#e0def4",
+		"panelTitle.inactiveForeground": "#908caa",
+		"peekView.border": "#393552",
+		"peekViewEditor.background": "#2a273f",
+		"peekViewEditor.matchHighlightBackground": "#817c9c4d",
+		"peekViewResult.background": "#2a273f",
+		"peekViewResult.fileForeground": "#908caa",
+		"peekViewResult.lineForeground": "#908caa",
+		"peekViewResult.matchHighlightBackground": "#817c9c4d",
+		"peekViewResult.selectionBackground": "#817c9c26",
+		"peekViewResult.selectionForeground": "#e0def4",
+		"peekViewTitle.background": "#393552",
+		"peekViewTitleDescription.foreground": "#908caa",
+		"pickerGroup.border": "#817c9c4d",
+		"pickerGroup.foreground": "#c4a7e7",
+		"ports.iconRunningProcessForeground": "#ea9a97",
+		"problemsErrorIcon.foreground": "#eb6f92",
+		"problemsInfoIcon.foreground": "#9ccfd8",
+		"problemsWarningIcon.foreground": "#f6c177",
+		"progressBar.background": "#ea9a97",
+		"quickInput.background": "#2a273f",
+		"quickInput.foreground": "#908caa",
+		"quickInputList.focusBackground": "#817c9c26",
+		"quickInputList.focusForeground": "#e0def4",
+		"quickInputList.focusIconForeground": "#e0def4",
+		"scrollbar.shadow": "#2a273f4d",
+		"scrollbarSlider.activeBackground": "#3e8fb080",
+		"scrollbarSlider.background": "#817c9c26",
+		"scrollbarSlider.hoverBackground": "#817c9c4d",
+		"searchEditor.findMatchBackground": "#817c9c26",
+		"selection.background": "#817c9c4d",
+		"settings.focusedRowBackground": "#2a273f",
+		"settings.headerForeground": "#e0def4",
+		"settings.modifiedItemIndicator": "#ea9a97",
+		"settings.focusedRowBorder": "#817c9c26",
+		"settings.rowHoverBackground": "#2a273f",
+		"sideBar.background": "#232136",
+		"sideBar.dropBackground": "#2a273f",
+		"sideBar.foreground": "#908caa",
+		"sideBarSectionHeader.background": "#0000",
+		"sideBarSectionHeader.border": "#817c9c26",
+		"statusBar.background": "#232136",
+		"statusBar.debuggingBackground": "#c4a7e7",
+		"statusBar.debuggingForeground": "#232136",
+		"statusBar.foreground": "#908caa",
+		"statusBar.noFolderBackground": "#232136",
+		"statusBar.noFolderForeground": "#908caa",
+		"statusBarItem.activeBackground": "#817c9c4d",
+		"statusBarItem.hoverBackground": "#817c9c26",
+		"statusBarItem.prominentBackground": "#393552",
+		"statusBarItem.prominentForeground": "#e0def4",
+		"statusBarItem.prominentHoverBackground": "#817c9c26",
+		"statusBarItem.remoteBackground": "#232136",
+		"statusBarItem.remoteForeground": "#f6c177",
+		"statusBarItem.errorBackground": "#232136",
+		"statusBarItem.errorForeground": "#eb6f92",
+		"symbolIcon.arrayForeground": "#908caa",
+		"symbolIcon.classForeground": "#908caa",
+		"symbolIcon.colorForeground": "#908caa",
+		"symbolIcon.constantForeground": "#908caa",
+		"symbolIcon.constructorForeground": "#908caa",
+		"symbolIcon.enumeratorForeground": "#908caa",
+		"symbolIcon.enumeratorMemberForeground": "#908caa",
+		"symbolIcon.eventForeground": "#908caa",
+		"symbolIcon.fieldForeground": "#908caa",
+		"symbolIcon.fileForeground": "#908caa",
+		"symbolIcon.folderForeground": "#908caa",
+		"symbolIcon.functionForeground": "#908caa",
+		"symbolIcon.interfaceForeground": "#908caa",
+		"symbolIcon.keyForeground": "#908caa",
+		"symbolIcon.keywordForeground": "#908caa",
+		"symbolIcon.methodForeground": "#908caa",
+		"symbolIcon.moduleForeground": "#908caa",
+		"symbolIcon.namespaceForeground": "#908caa",
+		"symbolIcon.nullForeground": "#908caa",
+		"symbolIcon.numberForeground": "#908caa",
+		"symbolIcon.objectForeground": "#908caa",
+		"symbolIcon.operatorForeground": "#908caa",
+		"symbolIcon.packageForeground": "#908caa",
+		"symbolIcon.propertyForeground": "#908caa",
+		"symbolIcon.referenceForeground": "#908caa",
+		"symbolIcon.snippetForeground": "#908caa",
+		"symbolIcon.stringForeground": "#908caa",
+		"symbolIcon.structForeground": "#908caa",
+		"symbolIcon.textForeground": "#908caa",
+		"symbolIcon.typeParameterForeground": "#908caa",
+		"symbolIcon.unitForeground": "#908caa",
+		"symbolIcon.variableForeground": "#908caa",
+		"tab.activeBackground": "#817c9c14",
+		"tab.activeForeground": "#e0def4",
+		"tab.activeModifiedBorder": "#9ccfd8",
+		"tab.border": "#0000",
+		"tab.hoverBackground": "#817c9c26",
+		"tab.inactiveBackground": "#0000",
+		"tab.inactiveForeground": "#908caa",
+		"tab.inactiveModifiedBorder": "#9ccfd880",
+		"tab.lastPinnedBorder": "#6e6a86",
+		"tab.unfocusedActiveBackground": "#0000",
+		"tab.unfocusedHoverBackground": "#0000",
+		"tab.unfocusedInactiveBackground": "#0000",
+		"tab.unfocusedInactiveModifiedBorder": "#9ccfd880",
+		"terminal.ansiBlack": "#393552",
+		"terminal.ansiBlue": "#9ccfd8",
+		"terminal.ansiBrightBlack": "#908caa",
+		"terminal.ansiBrightBlue": "#9ccfd8",
+		"terminal.ansiBrightCyan": "#ea9a97",
+		"terminal.ansiBrightGreen": "#3e8fb0",
+		"terminal.ansiBrightMagenta": "#c4a7e7",
+		"terminal.ansiBrightRed": "#eb6f92",
+		"terminal.ansiBrightWhite": "#e0def4",
+		"terminal.ansiBrightYellow": "#f6c177",
+		"terminal.ansiCyan": "#ea9a97",
+		"terminal.ansiGreen": "#3e8fb0",
+		"terminal.ansiMagenta": "#c4a7e7",
+		"terminal.ansiRed": "#eb6f92",
+		"terminal.ansiWhite": "#e0def4",
+		"terminal.ansiYellow": "#f6c177",
+		"terminal.dropBackground": "#817c9c26",
+		"terminal.foreground": "#e0def4",
+		"terminal.selectionBackground": "#817c9c26",
+		"terminal.tab.activeBorder": "#e0def4",
+		"terminalCursor.background": "#e0def4",
+		"terminalCursor.foreground": "#6e6a86",
+		"textBlockQuote.background": "#2a273f",
+		"textBlockQuote.border": "#817c9c26",
+		"textCodeBlock.background": "#2a273f",
+		"textLink.activeForeground": "#c4a7e7e6",
+		"textLink.foreground": "#c4a7e7",
+		"textPreformat.foreground": "#f6c177",
+		"textSeparator.foreground": "#908caa",
+		"titleBar.activeBackground": "#232136",
+		"titleBar.activeForeground": "#908caa",
+		"titleBar.inactiveBackground": "#2a273f",
+		"titleBar.inactiveForeground": "#908caa",
+		"toolbar.activeBackground": "#817c9c4d",
+		"toolbar.hoverBackground": "#817c9c26",
+		"tree.indentGuidesStroke": "#908caa",
+		"walkThrough.embeddedEditorBackground": "#232136",
+		"welcomePage.background": "#232136",
+		"welcomePage.buttonBackground": "#2a273f",
+		"welcomePage.buttonHoverBackground": "#393552",
+		"widget.shadow": "#2a273f4d",
+		"window.activeBorder": "#2a273f",
+		"window.inactiveBorder": "#2a273f"
+	},
+	"tokenColors": [
+		{
+			"scope": ["comment"],
+			"settings": {
+				"foreground": "#6e6a86",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["constant"],
+			"settings": {
+				"foreground": "#3e8fb0"
+			}
+		},
+		{
+			"scope": ["constant.numeric", "constant.language"],
+			"settings": {
+				"foreground": "#ea9a97"
+			}
+		},
+		{
+			"scope": ["entity.name"],
+			"settings": {
+				"foreground": "#ea9a97"
+			}
+		},
+		{
+			"scope": [
+				"entity.name.section",
+				"entity.name.tag",
+				"entity.name.namespace",
+				"entity.name.type"
+			],
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": ["entity.other.attribute-name", "entity.other.inherited-class"],
+			"settings": {
+				"foreground": "#c4a7e7",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["invalid"],
+			"settings": {
+				"foreground": "#eb6f92"
+			}
+		},
+		{
+			"scope": ["invalid.deprecated"],
+			"settings": {
+				"foreground": "#908caa"
+			}
+		},
+		{
+			"scope": ["keyword"],
+			"settings": {
+				"foreground": "#3e8fb0"
+			}
+		},
+		{
+			"scope": ["markup.inserted.diff"],
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": ["markup.deleted.diff"],
+			"settings": {
+				"foreground": "#eb6f92"
+			}
+		},
+		{
+			"scope": "markup.heading",
+			"settings": {
+				"fontStyle": "bold"
+			}
+		},
+		{
+			"scope": "markup.bold.markdown",
+			"settings": {
+				"fontStyle": "bold"
+			}
+		},
+		{
+			"scope": "markup.italic.markdown",
+			"settings": {
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["meta.diff.range"],
+			"settings": {
+				"foreground": "#c4a7e7"
+			}
+		},
+		{
+			"scope": ["meta.tag", "meta.brace"],
+			"settings": {
+				"foreground": "#e0def4"
+			}
+		},
+		{
+			"scope": ["meta.import", "meta.export"],
+			"settings": {
+				"foreground": "#3e8fb0"
+			}
+		},
+		{
+			"scope": "meta.directive.vue",
+			"settings": {
+				"foreground": "#c4a7e7",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": "meta.property-name.css",
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": "meta.property-value.css",
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": "meta.tag.other.html",
+			"settings": {
+				"foreground": "#908caa"
+			}
+		},
+		{
+			"scope": ["punctuation"],
+			"settings": {
+				"foreground": "#908caa"
+			}
+		},
+		{
+			"scope": ["punctuation.accessor"],
+			"settings": {
+				"foreground": "#3e8fb0"
+			}
+		},
+		{
+			"scope": ["punctuation.definition.string"],
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": ["punctuation.definition.tag"],
+			"settings": {
+				"foreground": "#6e6a86"
+			}
+		},
+		{
+			"scope": ["storage.type", "storage.modifier"],
+			"settings": {
+				"foreground": "#3e8fb0"
+			}
+		},
+		{
+			"scope": ["string"],
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": ["support"],
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": ["support.constant"],
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": ["support.function"],
+			"settings": {
+				"foreground": "#eb6f92",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["variable"],
+			"settings": {
+				"foreground": "#ea9a97",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": [
+				"variable.other",
+				"variable.language",
+				"variable.function",
+				"variable.argument"
+			],
+			"settings": {
+				"foreground": "#e0def4"
+			}
+		},
+		{
+			"scope": ["variable.parameter"],
+			"settings": {
+				"foreground": "#c4a7e7"
+			}
+		}
+	]
 }

assets/themes/src/vscode/rose-pine/rose-pine.json 🔗

@@ -1,680 +1,680 @@
 {
-    "name": "Rosé Pine",
-    "type": "dark",
-    "colors": {
-        "activityBar.activeBorder": "#e0def4",
-        "activityBar.background": "#191724",
-        "activityBar.dropBorder": "#26233a",
-        "activityBar.foreground": "#e0def4",
-        "activityBar.inactiveForeground": "#908caa",
-        "activityBarBadge.background": "#ebbcba",
-        "activityBarBadge.foreground": "#191724",
-        "badge.background": "#ebbcba",
-        "badge.foreground": "#191724",
-        "banner.background": "#1f1d2e",
-        "banner.foreground": "#e0def4",
-        "banner.iconForeground": "#908caa",
-        "breadcrumb.activeSelectionForeground": "#ebbcba",
-        "breadcrumb.background": "#191724",
-        "breadcrumb.focusForeground": "#908caa",
-        "breadcrumb.foreground": "#6e6a86",
-        "breadcrumbPicker.background": "#1f1d2e",
-        "button.background": "#ebbcba",
-        "button.foreground": "#191724",
-        "button.hoverBackground": "#ebbcbae6",
-        "button.secondaryBackground": "#1f1d2e",
-        "button.secondaryForeground": "#e0def4",
-        "button.secondaryHoverBackground": "#26233a",
-        "charts.blue": "#9ccfd8",
-        "charts.foreground": "#e0def4",
-        "charts.green": "#31748f",
-        "charts.lines": "#908caa",
-        "charts.orange": "#ebbcba",
-        "charts.purple": "#c4a7e7",
-        "charts.red": "#eb6f92",
-        "charts.yellow": "#f6c177",
-        "checkbox.background": "#1f1d2e",
-        "checkbox.border": "#6e6a8633",
-        "checkbox.foreground": "#e0def4",
-        "debugExceptionWidget.background": "#1f1d2e",
-        "debugExceptionWidget.border": "#6e6a8633",
-        "debugIcon.breakpointCurrentStackframeForeground": "#908caa",
-        "debugIcon.breakpointDisabledForeground": "#908caa",
-        "debugIcon.breakpointForeground": "#908caa",
-        "debugIcon.breakpointStackframeForeground": "#908caa",
-        "debugIcon.breakpointUnverifiedForeground": "#908caa",
-        "debugIcon.continueForeground": "#908caa",
-        "debugIcon.disconnectForeground": "#908caa",
-        "debugIcon.pauseForeground": "#908caa",
-        "debugIcon.restartForeground": "#908caa",
-        "debugIcon.startForeground": "#908caa",
-        "debugIcon.stepBackForeground": "#908caa",
-        "debugIcon.stepIntoForeground": "#908caa",
-        "debugIcon.stepOutForeground": "#908caa",
-        "debugIcon.stepOverForeground": "#908caa",
-        "debugIcon.stopForeground": "#eb6f92",
-        "debugToolBar.background": "#1f1d2e",
-        "debugToolBar.border": "#26233a",
-        "descriptionForeground": "#908caa",
-        "diffEditor.border": "#26233a",
-        "diffEditor.diagonalFill": "#6e6a8666",
-        "diffEditor.insertedLineBackground": "#9ccfd826",
-        "diffEditor.insertedTextBackground": "#9ccfd826",
-        "diffEditor.removedLineBackground": "#eb6f9226",
-        "diffEditor.removedTextBackground": "#eb6f9226",
-        "diffEditorOverview.insertedForeground": "#9ccfd880",
-        "diffEditorOverview.removedForeground": "#eb6f9280",
-        "dropdown.background": "#1f1d2e",
-        "dropdown.border": "#6e6a8633",
-        "dropdown.foreground": "#e0def4",
-        "dropdown.listBackground": "#1f1d2e",
-        "editor.background": "#191724",
-        "editor.findMatchBackground": "#6e6a8666",
-        "editor.findMatchHighlightBackground": "#6e6a8666",
-        "editor.findRangeHighlightBackground": "#6e6a8666",
-        "editor.findRangeHighlightBorder": "#000000",
-        "editor.focusedStackFrameHighlightBackground": "#6e6a8633",
-        "editor.foldBackground": "#1f1d2e",
-        "editor.foreground": "#e0def4",
-        "editor.hoverHighlightBackground": "#000000",
-        "editor.inactiveSelectionBackground": "#6e6a861a",
-        "editor.inlineValuesBackground": "#000000",
-        "editor.inlineValuesForeground": "#908caa",
-        "editor.lineHighlightBackground": "#6e6a861a",
-        "editor.lineHighlightBorder": "#000000",
-        "editor.linkedEditingBackground": "#1f1d2e",
-        "editor.rangeHighlightBackground": "#6e6a861a",
-        "editor.selectionBackground": "#6e6a8633",
-        "editor.selectionForeground": "#e0def4",
-        "editor.selectionHighlightBackground": "#6e6a8633",
-        "editor.selectionHighlightBorder": "#191724",
-        "editor.snippetFinalTabstopHighlightBackground": "#6e6a8633",
-        "editor.snippetFinalTabstopHighlightBorder": "#1f1d2e",
-        "editor.snippetTabstopHighlightBackground": "#6e6a8633",
-        "editor.snippetTabstopHighlightBorder": "#1f1d2e",
-        "editor.stackFrameHighlightBackground": "#6e6a8633",
-        "editor.symbolHighlightBackground": "#6e6a8633",
-        "editor.symbolHighlightBorder": "#000000",
-        "editor.wordHighlightBackground": "#6e6a8633",
-        "editor.wordHighlightBorder": "#000000",
-        "editor.wordHighlightStrongBackground": "#6e6a8633",
-        "editor.wordHighlightStrongBorder": "#6e6a8633",
-        "editorBracketHighlight.foreground1": "#eb6f9280",
-        "editorBracketHighlight.foreground2": "#31748f80",
-        "editorBracketHighlight.foreground3": "#f6c17780",
-        "editorBracketHighlight.foreground4": "#9ccfd880",
-        "editorBracketHighlight.foreground5": "#ebbcba80",
-        "editorBracketHighlight.foreground6": "#c4a7e780",
-        "editorBracketMatch.background": "#000000",
-        "editorBracketMatch.border": "#908caa",
-        "editorBracketPairGuide.activeBackground1": "#31748f",
-        "editorBracketPairGuide.activeBackground2": "#ebbcba",
-        "editorBracketPairGuide.activeBackground3": "#c4a7e7",
-        "editorBracketPairGuide.activeBackground4": "#9ccfd8",
-        "editorBracketPairGuide.activeBackground5": "#f6c177",
-        "editorBracketPairGuide.activeBackground6": "#eb6f92",
-        "editorBracketPairGuide.background1": "#31748f80",
-        "editorBracketPairGuide.background2": "#ebbcba80",
-        "editorBracketPairGuide.background3": "#c4a7e780",
-        "editorBracketPairGuide.background4": "#9ccfd880",
-        "editorBracketPairGuide.background5": "#f6c17780",
-        "editorBracketPairGuide.background6": "#eb6f9280",
-        "editorCodeLens.foreground": "#ebbcba",
-        "editorCursor.background": "#e0def4",
-        "editorCursor.foreground": "#6e6a86",
-        "editorError.border": "#000000",
-        "editorError.foreground": "#eb6f92",
-        "editorGhostText.foreground": "#908caa",
-        "editorGroup.border": "#000000",
-        "editorGroup.dropBackground": "#1f1d2e",
-        "editorGroup.emptyBackground": "#000000",
-        "editorGroup.focusedEmptyBorder": "#000000",
-        "editorGroupHeader.noTabsBackground": "#000000",
-        "editorGroupHeader.tabsBackground": "#000000",
-        "editorGroupHeader.tabsBorder": "#000000",
-        "editorGutter.addedBackground": "#9ccfd8",
-        "editorGutter.background": "#191724",
-        "editorGutter.commentRangeForeground": "#908caa",
-        "editorGutter.deletedBackground": "#eb6f92",
-        "editorGutter.foldingControlForeground": "#c4a7e7",
-        "editorGutter.modifiedBackground": "#ebbcba",
-        "editorHint.border": "#000000",
-        "editorHint.foreground": "#908caa",
-        "editorHoverWidget.background": "#1f1d2e",
-        "editorHoverWidget.border": "#6e6a8680",
-        "editorHoverWidget.foreground": "#908caa",
-        "editorHoverWidget.highlightForeground": "#e0def4",
-        "editorHoverWidget.statusBarBackground": "#000000",
-        "editorIndentGuide.activeBackground": "#6e6a86",
-        "editorIndentGuide.background": "#6e6a8666",
-        "editorInfo.border": "#26233a",
-        "editorInfo.foreground": "#9ccfd8",
-        "editorInlayHint.background": "#26233a",
-        "editorInlayHint.foreground": "#908caa",
-        "editorInlayHint.parameterBackground": "#26233a",
-        "editorInlayHint.parameterForeground": "#c4a7e7",
-        "editorInlayHint.typeBackground": "#26233a",
-        "editorInlayHint.typeForeground": "#9ccfd8",
-        "editorLightBulb.foreground": "#31748f",
-        "editorLightBulbAutoFix.foreground": "#ebbcba",
-        "editorLineNumber.activeForeground": "#e0def4",
-        "editorLineNumber.foreground": "#908caa",
-        "editorLink.activeForeground": "#ebbcba",
-        "editorMarkerNavigation.background": "#1f1d2e",
-        "editorMarkerNavigationError.background": "#1f1d2e",
-        "editorMarkerNavigationInfo.background": "#1f1d2e",
-        "editorMarkerNavigationWarning.background": "#1f1d2e",
-        "editorOverviewRuler.addedForeground": "#9ccfd880",
-        "editorOverviewRuler.background": "#191724",
-        "editorOverviewRuler.border": "#6e6a8666",
-        "editorOverviewRuler.bracketMatchForeground": "#908caa",
-        "editorOverviewRuler.commonContentForeground": "#6e6a861a",
-        "editorOverviewRuler.currentContentForeground": "#6e6a8633",
-        "editorOverviewRuler.deletedForeground": "#eb6f9280",
-        "editorOverviewRuler.errorForeground": "#eb6f9280",
-        "editorOverviewRuler.findMatchForeground": "#6e6a8666",
-        "editorOverviewRuler.incomingContentForeground": "#c4a7e780",
-        "editorOverviewRuler.infoForeground": "#9ccfd880",
-        "editorOverviewRuler.modifiedForeground": "#ebbcba80",
-        "editorOverviewRuler.rangeHighlightForeground": "#6e6a8666",
-        "editorOverviewRuler.selectionHighlightForeground": "#6e6a8666",
-        "editorOverviewRuler.warningForeground": "#f6c17780",
-        "editorOverviewRuler.wordHighlightForeground": "#6e6a8633",
-        "editorOverviewRuler.wordHighlightStrongForeground": "#6e6a8666",
-        "editorPane.background": "#000000",
-        "editorRuler.foreground": "#6e6a8666",
-        "editorSuggestWidget.background": "#1f1d2e",
-        "editorSuggestWidget.border": "#000000",
-        "editorSuggestWidget.focusHighlightForeground": "#ebbcba",
-        "editorSuggestWidget.foreground": "#908caa",
-        "editorSuggestWidget.highlightForeground": "#ebbcba",
-        "editorSuggestWidget.selectedBackground": "#6e6a8633",
-        "editorSuggestWidget.selectedForeground": "#e0def4",
-        "editorSuggestWidget.selectedIconForeground": "#e0def4",
-        "editorUnnecessaryCode.border": "#000000",
-        "editorUnnecessaryCode.opacity": "#e0def480",
-        "editorWarning.border": "#000000",
-        "editorWarning.foreground": "#f6c177",
-        "editorWhitespace.foreground": "#6e6a86",
-        "editorWidget.background": "#1f1d2e",
-        "editorWidget.border": "#26233a",
-        "editorWidget.foreground": "#908caa",
-        "editorWidget.resizeBorder": "#6e6a86",
-        "errorForeground": "#eb6f92",
-        "extensionBadge.remoteBackground": "#c4a7e7",
-        "extensionBadge.remoteForeground": "#191724",
-        "extensionButton.prominentBackground": "#ebbcba",
-        "extensionButton.prominentForeground": "#191724",
-        "extensionButton.prominentHoverBackground": "#ebbcbae6",
-        "extensionIcon.preReleaseForeground": "#31748f",
-        "extensionIcon.starForeground": "#ebbcba",
-        "extensionIcon.verifiedForeground": "#c4a7e7",
-        "focusBorder": "#6e6a8633",
-        "foreground": "#e0def4",
-        "gitDecoration.addedResourceForeground": "#9ccfd8",
-        "gitDecoration.conflictingResourceForeground": "#eb6f92",
-        "gitDecoration.deletedResourceForeground": "#908caa",
-        "gitDecoration.ignoredResourceForeground": "#6e6a86",
-        "gitDecoration.modifiedResourceForeground": "#ebbcba",
-        "gitDecoration.renamedResourceForeground": "#31748f",
-        "gitDecoration.stageDeletedResourceForeground": "#eb6f92",
-        "gitDecoration.stageModifiedResourceForeground": "#c4a7e7",
-        "gitDecoration.submoduleResourceForeground": "#f6c177",
-        "gitDecoration.untrackedResourceForeground": "#f6c177",
-        "icon.foreground": "#908caa",
-        "input.background": "#26233a80",
-        "input.border": "#6e6a8633",
-        "input.foreground": "#e0def4",
-        "input.placeholderForeground": "#908caa",
-        "inputOption.activeBackground": "#ebbcba26",
-        "inputOption.activeForeground": "#ebbcba",
-        "inputValidation.errorBackground": "#1f1d2e",
-        "inputValidation.errorBorder": "#6e6a8666",
-        "inputValidation.errorForeground": "#eb6f92",
-        "inputValidation.infoBackground": "#1f1d2e",
-        "inputValidation.infoBorder": "#6e6a8666",
-        "inputValidation.infoForeground": "#9ccfd8",
-        "inputValidation.warningBackground": "#1f1d2e",
-        "inputValidation.warningBorder": "#6e6a8666",
-        "inputValidation.warningForeground": "#9ccfd880",
-        "keybindingLabel.background": "#26233a",
-        "keybindingLabel.border": "#6e6a8666",
-        "keybindingLabel.bottomBorder": "#6e6a8666",
-        "keybindingLabel.foreground": "#c4a7e7",
-        "keybindingTable.headerBackground": "#26233a",
-        "keybindingTable.rowsBackground": "#1f1d2e",
-        "list.activeSelectionBackground": "#6e6a8633",
-        "list.activeSelectionForeground": "#e0def4",
-        "list.deemphasizedForeground": "#908caa",
-        "list.dropBackground": "#1f1d2e",
-        "list.errorForeground": "#eb6f92",
-        "list.filterMatchBackground": "#1f1d2e",
-        "list.filterMatchBorder": "#ebbcba",
-        "list.focusBackground": "#6e6a8666",
-        "list.focusForeground": "#e0def4",
-        "list.focusOutline": "#6e6a8633",
-        "list.highlightForeground": "#ebbcba",
-        "list.hoverBackground": "#6e6a861a",
-        "list.hoverForeground": "#e0def4",
-        "list.inactiveFocusBackground": "#6e6a861a",
-        "list.inactiveSelectionBackground": "#1f1d2e",
-        "list.inactiveSelectionForeground": "#e0def4",
-        "list.invalidItemForeground": "#eb6f92",
-        "list.warningForeground": "#f6c177",
-        "listFilterWidget.background": "#1f1d2e",
-        "listFilterWidget.noMatchesOutline": "#eb6f92",
-        "listFilterWidget.outline": "#26233a",
-        "menu.background": "#1f1d2e",
-        "menu.border": "#6e6a861a",
-        "menu.foreground": "#e0def4",
-        "menu.selectionBackground": "#6e6a8633",
-        "menu.selectionBorder": "#26233a",
-        "menu.selectionForeground": "#e0def4",
-        "menu.separatorBackground": "#6e6a8666",
-        "menubar.selectionBackground": "#6e6a8633",
-        "menubar.selectionBorder": "#6e6a861a",
-        "menubar.selectionForeground": "#e0def4",
-        "merge.border": "#26233a",
-        "merge.commonContentBackground": "#6e6a8633",
-        "merge.commonHeaderBackground": "#6e6a8633",
-        "merge.currentContentBackground": "#f6c17780",
-        "merge.currentHeaderBackground": "#f6c17780",
-        "merge.incomingContentBackground": "#9ccfd880",
-        "merge.incomingHeaderBackground": "#9ccfd880",
-        "minimap.background": "#1f1d2e",
-        "minimap.errorHighlight": "#eb6f9280",
-        "minimap.findMatchHighlight": "#6e6a8633",
-        "minimap.selectionHighlight": "#6e6a8633",
-        "minimap.warningHighlight": "#f6c17780",
-        "minimapGutter.addedBackground": "#9ccfd8",
-        "minimapGutter.deletedBackground": "#eb6f92",
-        "minimapGutter.modifiedBackground": "#ebbcba",
-        "minimapSlider.activeBackground": "#6e6a8666",
-        "minimapSlider.background": "#6e6a8633",
-        "minimapSlider.hoverBackground": "#6e6a8633",
-        "notebook.cellBorderColor": "#9ccfd880",
-        "notebook.cellEditorBackground": "#1f1d2e",
-        "notebook.cellHoverBackground": "#26233a80",
-        "notebook.focusedCellBackground": "#6e6a861a",
-        "notebook.focusedCellBorder": "#9ccfd8",
-        "notebook.outputContainerBackgroundColor": "#6e6a861a",
-        "notificationCenter.border": "#6e6a8633",
-        "notificationCenterHeader.background": "#1f1d2e",
-        "notificationCenterHeader.foreground": "#908caa",
-        "notificationLink.foreground": "#c4a7e7",
-        "notifications.background": "#1f1d2e",
-        "notifications.border": "#6e6a8633",
-        "notifications.foreground": "#e0def4",
-        "notificationsErrorIcon.foreground": "#eb6f92",
-        "notificationsInfoIcon.foreground": "#9ccfd8",
-        "notificationsWarningIcon.foreground": "#f6c177",
-        "notificationToast.border": "#6e6a8633",
-        "panel.background": "#1f1d2e",
-        "panel.border": "#000000",
-        "panel.dropBorder": "#26233a",
-        "panelInput.border": "#1f1d2e",
-        "panelSection.dropBackground": "#6e6a8633",
-        "panelSectionHeader.background": "#1f1d2e",
-        "panelSectionHeader.foreground": "#e0def4",
-        "panelTitle.activeBorder": "#6e6a8666",
-        "panelTitle.activeForeground": "#e0def4",
-        "panelTitle.inactiveForeground": "#908caa",
-        "peekView.border": "#26233a",
-        "peekViewEditor.background": "#1f1d2e",
-        "peekViewEditor.matchHighlightBackground": "#6e6a8666",
-        "peekViewResult.background": "#1f1d2e",
-        "peekViewResult.fileForeground": "#908caa",
-        "peekViewResult.lineForeground": "#908caa",
-        "peekViewResult.matchHighlightBackground": "#6e6a8666",
-        "peekViewResult.selectionBackground": "#6e6a8633",
-        "peekViewResult.selectionForeground": "#e0def4",
-        "peekViewTitle.background": "#26233a",
-        "peekViewTitleDescription.foreground": "#908caa",
-        "pickerGroup.border": "#6e6a8666",
-        "pickerGroup.foreground": "#c4a7e7",
-        "ports.iconRunningProcessForeground": "#ebbcba",
-        "problemsErrorIcon.foreground": "#eb6f92",
-        "problemsInfoIcon.foreground": "#9ccfd8",
-        "problemsWarningIcon.foreground": "#f6c177",
-        "progressBar.background": "#ebbcba",
-        "quickInput.background": "#1f1d2e",
-        "quickInput.foreground": "#908caa",
-        "quickInputList.focusBackground": "#6e6a8633",
-        "quickInputList.focusForeground": "#e0def4",
-        "quickInputList.focusIconForeground": "#e0def4",
-        "scrollbar.shadow": "#1f1d2e4d",
-        "scrollbarSlider.activeBackground": "#31748f80",
-        "scrollbarSlider.background": "#6e6a8633",
-        "scrollbarSlider.hoverBackground": "#6e6a8666",
-        "searchEditor.findMatchBackground": "#6e6a8633",
-        "selection.background": "#6e6a8666",
-        "settings.focusedRowBackground": "#1f1d2e",
-        "settings.headerForeground": "#e0def4",
-        "settings.modifiedItemIndicator": "#ebbcba",
-        "settings.focusedRowBorder": "#6e6a8633",
-        "settings.rowHoverBackground": "#1f1d2e",
-        "sideBar.background": "#191724",
-        "sideBar.dropBackground": "#1f1d2e",
-        "sideBar.foreground": "#908caa",
-        "sideBarSectionHeader.background": "#000000",
-        "sideBarSectionHeader.border": "#6e6a8633",
-        "statusBar.background": "#191724",
-        "statusBar.debuggingBackground": "#c4a7e7",
-        "statusBar.debuggingForeground": "#191724",
-        "statusBar.foreground": "#908caa",
-        "statusBar.noFolderBackground": "#191724",
-        "statusBar.noFolderForeground": "#908caa",
-        "statusBarItem.activeBackground": "#6e6a8666",
-        "statusBarItem.hoverBackground": "#6e6a8633",
-        "statusBarItem.prominentBackground": "#26233a",
-        "statusBarItem.prominentForeground": "#e0def4",
-        "statusBarItem.prominentHoverBackground": "#6e6a8633",
-        "statusBarItem.remoteBackground": "#191724",
-        "statusBarItem.remoteForeground": "#f6c177",
-        "statusBarItem.errorBackground": "#191724",
-        "statusBarItem.errorForeground": "#eb6f92",
-        "symbolIcon.arrayForeground": "#908caa",
-        "symbolIcon.classForeground": "#908caa",
-        "symbolIcon.colorForeground": "#908caa",
-        "symbolIcon.constantForeground": "#908caa",
-        "symbolIcon.constructorForeground": "#908caa",
-        "symbolIcon.enumeratorForeground": "#908caa",
-        "symbolIcon.enumeratorMemberForeground": "#908caa",
-        "symbolIcon.eventForeground": "#908caa",
-        "symbolIcon.fieldForeground": "#908caa",
-        "symbolIcon.fileForeground": "#908caa",
-        "symbolIcon.folderForeground": "#908caa",
-        "symbolIcon.functionForeground": "#908caa",
-        "symbolIcon.interfaceForeground": "#908caa",
-        "symbolIcon.keyForeground": "#908caa",
-        "symbolIcon.keywordForeground": "#908caa",
-        "symbolIcon.methodForeground": "#908caa",
-        "symbolIcon.moduleForeground": "#908caa",
-        "symbolIcon.namespaceForeground": "#908caa",
-        "symbolIcon.nullForeground": "#908caa",
-        "symbolIcon.numberForeground": "#908caa",
-        "symbolIcon.objectForeground": "#908caa",
-        "symbolIcon.operatorForeground": "#908caa",
-        "symbolIcon.packageForeground": "#908caa",
-        "symbolIcon.propertyForeground": "#908caa",
-        "symbolIcon.referenceForeground": "#908caa",
-        "symbolIcon.snippetForeground": "#908caa",
-        "symbolIcon.stringForeground": "#908caa",
-        "symbolIcon.structForeground": "#908caa",
-        "symbolIcon.textForeground": "#908caa",
-        "symbolIcon.typeParameterForeground": "#908caa",
-        "symbolIcon.unitForeground": "#908caa",
-        "symbolIcon.variableForeground": "#908caa",
-        "tab.activeBackground": "#6e6a861a",
-        "tab.activeForeground": "#e0def4",
-        "tab.activeModifiedBorder": "#9ccfd8",
-        "tab.border": "#000000",
-        "tab.hoverBackground": "#6e6a8633",
-        "tab.inactiveBackground": "#000000",
-        "tab.inactiveForeground": "#908caa",
-        "tab.inactiveModifiedBorder": "#9ccfd880",
-        "tab.lastPinnedBorder": "#6e6a86",
-        "tab.unfocusedActiveBackground": "#000000",
-        "tab.unfocusedHoverBackground": "#000000",
-        "tab.unfocusedInactiveBackground": "#000000",
-        "tab.unfocusedInactiveModifiedBorder": "#9ccfd880",
-        "terminal.ansiBlack": "#26233a",
-        "terminal.ansiBlue": "#9ccfd8",
-        "terminal.ansiBrightBlack": "#908caa",
-        "terminal.ansiBrightBlue": "#9ccfd8",
-        "terminal.ansiBrightCyan": "#ebbcba",
-        "terminal.ansiBrightGreen": "#31748f",
-        "terminal.ansiBrightMagenta": "#c4a7e7",
-        "terminal.ansiBrightRed": "#eb6f92",
-        "terminal.ansiBrightWhite": "#e0def4",
-        "terminal.ansiBrightYellow": "#f6c177",
-        "terminal.ansiCyan": "#ebbcba",
-        "terminal.ansiGreen": "#31748f",
-        "terminal.ansiMagenta": "#c4a7e7",
-        "terminal.ansiRed": "#eb6f92",
-        "terminal.ansiWhite": "#e0def4",
-        "terminal.ansiYellow": "#f6c177",
-        "terminal.dropBackground": "#6e6a8633",
-        "terminal.foreground": "#e0def4",
-        "terminal.selectionBackground": "#6e6a8633",
-        "terminal.tab.activeBorder": "#e0def4",
-        "terminalCursor.background": "#e0def4",
-        "terminalCursor.foreground": "#6e6a86",
-        "textBlockQuote.background": "#1f1d2e",
-        "textBlockQuote.border": "#6e6a8633",
-        "textCodeBlock.background": "#1f1d2e",
-        "textLink.activeForeground": "#c4a7e7e6",
-        "textLink.foreground": "#c4a7e7",
-        "textPreformat.foreground": "#f6c177",
-        "textSeparator.foreground": "#908caa",
-        "titleBar.activeBackground": "#191724",
-        "titleBar.activeForeground": "#908caa",
-        "titleBar.inactiveBackground": "#1f1d2e",
-        "titleBar.inactiveForeground": "#908caa",
-        "toolbar.activeBackground": "#6e6a8666",
-        "toolbar.hoverBackground": "#6e6a8633",
-        "tree.indentGuidesStroke": "#908caa",
-        "walkThrough.embeddedEditorBackground": "#191724",
-        "welcomePage.background": "#191724",
-        "welcomePage.buttonBackground": "#1f1d2e",
-        "welcomePage.buttonHoverBackground": "#26233a",
-        "widget.shadow": "#1f1d2e4d",
-        "window.activeBorder": "#1f1d2e",
-        "window.inactiveBorder": "#1f1d2e"
-    },
-    "tokenColors": [
-        {
-            "scope": ["comment"],
-            "settings": {
-                "foreground": "#6e6a86",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["constant"],
-            "settings": {
-                "foreground": "#31748f"
-            }
-        },
-        {
-            "scope": ["constant.numeric", "constant.language"],
-            "settings": {
-                "foreground": "#ebbcba"
-            }
-        },
-        {
-            "scope": ["entity.name"],
-            "settings": {
-                "foreground": "#ebbcba"
-            }
-        },
-        {
-            "scope": [
-                "entity.name.section",
-                "entity.name.tag",
-                "entity.name.namespace",
-                "entity.name.type"
-            ],
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": ["entity.other.attribute-name", "entity.other.inherited-class"],
-            "settings": {
-                "foreground": "#c4a7e7",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["invalid"],
-            "settings": {
-                "foreground": "#eb6f92"
-            }
-        },
-        {
-            "scope": ["invalid.deprecated"],
-            "settings": {
-                "foreground": "#908caa"
-            }
-        },
-        {
-            "scope": ["keyword"],
-            "settings": {
-                "foreground": "#31748f"
-            }
-        },
-        {
-            "scope": ["markup.inserted.diff"],
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": ["markup.deleted.diff"],
-            "settings": {
-                "foreground": "#eb6f92"
-            }
-        },
-        {
-            "scope": "markup.heading",
-            "settings": {
-                "fontStyle": "bold"
-            }
-        },
-        {
-            "scope": "markup.bold.markdown",
-            "settings": {
-                "fontStyle": "bold"
-            }
-        },
-        {
-            "scope": "markup.italic.markdown",
-            "settings": {
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["meta.diff.range"],
-            "settings": {
-                "foreground": "#c4a7e7"
-            }
-        },
-        {
-            "scope": ["meta.tag", "meta.brace"],
-            "settings": {
-                "foreground": "#e0def4"
-            }
-        },
-        {
-            "scope": ["meta.import", "meta.export"],
-            "settings": {
-                "foreground": "#31748f"
-            }
-        },
-        {
-            "scope": "meta.directive.vue",
-            "settings": {
-                "foreground": "#c4a7e7",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": "meta.property-name.css",
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": "meta.property-value.css",
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": "meta.tag.other.html",
-            "settings": {
-                "foreground": "#908caa"
-            }
-        },
-        {
-            "scope": ["punctuation"],
-            "settings": {
-                "foreground": "#908caa"
-            }
-        },
-        {
-            "scope": ["punctuation.accessor"],
-            "settings": {
-                "foreground": "#31748f"
-            }
-        },
-        {
-            "scope": ["punctuation.definition.string"],
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": ["punctuation.definition.tag"],
-            "settings": {
-                "foreground": "#6e6a86"
-            }
-        },
-        {
-            "scope": ["storage.type", "storage.modifier"],
-            "settings": {
-                "foreground": "#31748f"
-            }
-        },
-        {
-            "scope": ["string"],
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": ["support"],
-            "settings": {
-                "foreground": "#9ccfd8"
-            }
-        },
-        {
-            "scope": ["support.constant"],
-            "settings": {
-                "foreground": "#f6c177"
-            }
-        },
-        {
-            "scope": ["support.function"],
-            "settings": {
-                "foreground": "#eb6f92",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": ["variable"],
-            "settings": {
-                "foreground": "#ebbcba",
-                "fontStyle": "italic"
-            }
-        },
-        {
-            "scope": [
-                "variable.other",
-                "variable.language",
-                "variable.function",
-                "variable.argument"
-            ],
-            "settings": {
-                "foreground": "#e0def4"
-            }
-        },
-        {
-            "scope": ["variable.parameter"],
-            "settings": {
-                "foreground": "#c4a7e7"
-            }
-        }
-    ]
+	"name": "Rosé Pine",
+	"type": "dark",
+	"colors": {
+		"activityBar.activeBorder": "#e0def4",
+		"activityBar.background": "#191724",
+		"activityBar.dropBorder": "#26233a",
+		"activityBar.foreground": "#e0def4",
+		"activityBar.inactiveForeground": "#908caa",
+		"activityBarBadge.background": "#ebbcba",
+		"activityBarBadge.foreground": "#191724",
+		"badge.background": "#ebbcba",
+		"badge.foreground": "#191724",
+		"banner.background": "#1f1d2e",
+		"banner.foreground": "#e0def4",
+		"banner.iconForeground": "#908caa",
+		"breadcrumb.activeSelectionForeground": "#ebbcba",
+		"breadcrumb.background": "#191724",
+		"breadcrumb.focusForeground": "#908caa",
+		"breadcrumb.foreground": "#6e6a86",
+		"breadcrumbPicker.background": "#1f1d2e",
+		"button.background": "#ebbcba",
+		"button.foreground": "#191724",
+		"button.hoverBackground": "#ebbcbae6",
+		"button.secondaryBackground": "#1f1d2e",
+		"button.secondaryForeground": "#e0def4",
+		"button.secondaryHoverBackground": "#26233a",
+		"charts.blue": "#9ccfd8",
+		"charts.foreground": "#e0def4",
+		"charts.green": "#31748f",
+		"charts.lines": "#908caa",
+		"charts.orange": "#ebbcba",
+		"charts.purple": "#c4a7e7",
+		"charts.red": "#eb6f92",
+		"charts.yellow": "#f6c177",
+		"checkbox.background": "#1f1d2e",
+		"checkbox.border": "#6e6a8633",
+		"checkbox.foreground": "#e0def4",
+		"debugExceptionWidget.background": "#1f1d2e",
+		"debugExceptionWidget.border": "#6e6a8633",
+		"debugIcon.breakpointCurrentStackframeForeground": "#908caa",
+		"debugIcon.breakpointDisabledForeground": "#908caa",
+		"debugIcon.breakpointForeground": "#908caa",
+		"debugIcon.breakpointStackframeForeground": "#908caa",
+		"debugIcon.breakpointUnverifiedForeground": "#908caa",
+		"debugIcon.continueForeground": "#908caa",
+		"debugIcon.disconnectForeground": "#908caa",
+		"debugIcon.pauseForeground": "#908caa",
+		"debugIcon.restartForeground": "#908caa",
+		"debugIcon.startForeground": "#908caa",
+		"debugIcon.stepBackForeground": "#908caa",
+		"debugIcon.stepIntoForeground": "#908caa",
+		"debugIcon.stepOutForeground": "#908caa",
+		"debugIcon.stepOverForeground": "#908caa",
+		"debugIcon.stopForeground": "#eb6f92",
+		"debugToolBar.background": "#1f1d2e",
+		"debugToolBar.border": "#26233a",
+		"descriptionForeground": "#908caa",
+		"diffEditor.border": "#26233a",
+		"diffEditor.diagonalFill": "#6e6a8666",
+		"diffEditor.insertedLineBackground": "#9ccfd826",
+		"diffEditor.insertedTextBackground": "#9ccfd826",
+		"diffEditor.removedLineBackground": "#eb6f9226",
+		"diffEditor.removedTextBackground": "#eb6f9226",
+		"diffEditorOverview.insertedForeground": "#9ccfd880",
+		"diffEditorOverview.removedForeground": "#eb6f9280",
+		"dropdown.background": "#1f1d2e",
+		"dropdown.border": "#6e6a8633",
+		"dropdown.foreground": "#e0def4",
+		"dropdown.listBackground": "#1f1d2e",
+		"editor.background": "#191724",
+		"editor.findMatchBackground": "#6e6a8666",
+		"editor.findMatchHighlightBackground": "#6e6a8666",
+		"editor.findRangeHighlightBackground": "#6e6a8666",
+		"editor.findRangeHighlightBorder": "#0000",
+		"editor.focusedStackFrameHighlightBackground": "#6e6a8633",
+		"editor.foldBackground": "#1f1d2e",
+		"editor.foreground": "#e0def4",
+		"editor.hoverHighlightBackground": "#0000",
+		"editor.inactiveSelectionBackground": "#6e6a861a",
+		"editor.inlineValuesBackground": "#0000",
+		"editor.inlineValuesForeground": "#908caa",
+		"editor.lineHighlightBackground": "#6e6a861a",
+		"editor.lineHighlightBorder": "#0000",
+		"editor.linkedEditingBackground": "#1f1d2e",
+		"editor.rangeHighlightBackground": "#6e6a861a",
+		"editor.selectionBackground": "#6e6a8633",
+		"editor.selectionForeground": "#e0def4",
+		"editor.selectionHighlightBackground": "#6e6a8633",
+		"editor.selectionHighlightBorder": "#191724",
+		"editor.snippetFinalTabstopHighlightBackground": "#6e6a8633",
+		"editor.snippetFinalTabstopHighlightBorder": "#1f1d2e",
+		"editor.snippetTabstopHighlightBackground": "#6e6a8633",
+		"editor.snippetTabstopHighlightBorder": "#1f1d2e",
+		"editor.stackFrameHighlightBackground": "#6e6a8633",
+		"editor.symbolHighlightBackground": "#6e6a8633",
+		"editor.symbolHighlightBorder": "#0000",
+		"editor.wordHighlightBackground": "#6e6a8633",
+		"editor.wordHighlightBorder": "#0000",
+		"editor.wordHighlightStrongBackground": "#6e6a8633",
+		"editor.wordHighlightStrongBorder": "#6e6a8633",
+		"editorBracketHighlight.foreground1": "#eb6f9280",
+		"editorBracketHighlight.foreground2": "#31748f80",
+		"editorBracketHighlight.foreground3": "#f6c17780",
+		"editorBracketHighlight.foreground4": "#9ccfd880",
+		"editorBracketHighlight.foreground5": "#ebbcba80",
+		"editorBracketHighlight.foreground6": "#c4a7e780",
+		"editorBracketMatch.background": "#0000",
+		"editorBracketMatch.border": "#908caa",
+		"editorBracketPairGuide.activeBackground1": "#31748f",
+		"editorBracketPairGuide.activeBackground2": "#ebbcba",
+		"editorBracketPairGuide.activeBackground3": "#c4a7e7",
+		"editorBracketPairGuide.activeBackground4": "#9ccfd8",
+		"editorBracketPairGuide.activeBackground5": "#f6c177",
+		"editorBracketPairGuide.activeBackground6": "#eb6f92",
+		"editorBracketPairGuide.background1": "#31748f80",
+		"editorBracketPairGuide.background2": "#ebbcba80",
+		"editorBracketPairGuide.background3": "#c4a7e780",
+		"editorBracketPairGuide.background4": "#9ccfd880",
+		"editorBracketPairGuide.background5": "#f6c17780",
+		"editorBracketPairGuide.background6": "#eb6f9280",
+		"editorCodeLens.foreground": "#ebbcba",
+		"editorCursor.background": "#e0def4",
+		"editorCursor.foreground": "#6e6a86",
+		"editorError.border": "#0000",
+		"editorError.foreground": "#eb6f92",
+		"editorGhostText.foreground": "#908caa",
+		"editorGroup.border": "#0000",
+		"editorGroup.dropBackground": "#1f1d2e",
+		"editorGroup.emptyBackground": "#0000",
+		"editorGroup.focusedEmptyBorder": "#0000",
+		"editorGroupHeader.noTabsBackground": "#0000",
+		"editorGroupHeader.tabsBackground": "#0000",
+		"editorGroupHeader.tabsBorder": "#0000",
+		"editorGutter.addedBackground": "#9ccfd8",
+		"editorGutter.background": "#191724",
+		"editorGutter.commentRangeForeground": "#908caa",
+		"editorGutter.deletedBackground": "#eb6f92",
+		"editorGutter.foldingControlForeground": "#c4a7e7",
+		"editorGutter.modifiedBackground": "#ebbcba",
+		"editorHint.border": "#0000",
+		"editorHint.foreground": "#908caa",
+		"editorHoverWidget.background": "#1f1d2e",
+		"editorHoverWidget.border": "#6e6a8680",
+		"editorHoverWidget.foreground": "#908caa",
+		"editorHoverWidget.highlightForeground": "#e0def4",
+		"editorHoverWidget.statusBarBackground": "#0000",
+		"editorIndentGuide.activeBackground": "#6e6a86",
+		"editorIndentGuide.background": "#6e6a8666",
+		"editorInfo.border": "#26233a",
+		"editorInfo.foreground": "#9ccfd8",
+		"editorInlayHint.background": "#26233a",
+		"editorInlayHint.foreground": "#908caa",
+		"editorInlayHint.parameterBackground": "#26233a",
+		"editorInlayHint.parameterForeground": "#c4a7e7",
+		"editorInlayHint.typeBackground": "#26233a",
+		"editorInlayHint.typeForeground": "#9ccfd8",
+		"editorLightBulb.foreground": "#31748f",
+		"editorLightBulbAutoFix.foreground": "#ebbcba",
+		"editorLineNumber.activeForeground": "#e0def4",
+		"editorLineNumber.foreground": "#908caa",
+		"editorLink.activeForeground": "#ebbcba",
+		"editorMarkerNavigation.background": "#1f1d2e",
+		"editorMarkerNavigationError.background": "#1f1d2e",
+		"editorMarkerNavigationInfo.background": "#1f1d2e",
+		"editorMarkerNavigationWarning.background": "#1f1d2e",
+		"editorOverviewRuler.addedForeground": "#9ccfd880",
+		"editorOverviewRuler.background": "#191724",
+		"editorOverviewRuler.border": "#6e6a8666",
+		"editorOverviewRuler.bracketMatchForeground": "#908caa",
+		"editorOverviewRuler.commonContentForeground": "#6e6a861a",
+		"editorOverviewRuler.currentContentForeground": "#6e6a8633",
+		"editorOverviewRuler.deletedForeground": "#eb6f9280",
+		"editorOverviewRuler.errorForeground": "#eb6f9280",
+		"editorOverviewRuler.findMatchForeground": "#6e6a8666",
+		"editorOverviewRuler.incomingContentForeground": "#c4a7e780",
+		"editorOverviewRuler.infoForeground": "#9ccfd880",
+		"editorOverviewRuler.modifiedForeground": "#ebbcba80",
+		"editorOverviewRuler.rangeHighlightForeground": "#6e6a8666",
+		"editorOverviewRuler.selectionHighlightForeground": "#6e6a8666",
+		"editorOverviewRuler.warningForeground": "#f6c17780",
+		"editorOverviewRuler.wordHighlightForeground": "#6e6a8633",
+		"editorOverviewRuler.wordHighlightStrongForeground": "#6e6a8666",
+		"editorPane.background": "#0000",
+		"editorRuler.foreground": "#6e6a8666",
+		"editorSuggestWidget.background": "#1f1d2e",
+		"editorSuggestWidget.border": "#0000",
+		"editorSuggestWidget.focusHighlightForeground": "#ebbcba",
+		"editorSuggestWidget.foreground": "#908caa",
+		"editorSuggestWidget.highlightForeground": "#ebbcba",
+		"editorSuggestWidget.selectedBackground": "#6e6a8633",
+		"editorSuggestWidget.selectedForeground": "#e0def4",
+		"editorSuggestWidget.selectedIconForeground": "#e0def4",
+		"editorUnnecessaryCode.border": "#0000",
+		"editorUnnecessaryCode.opacity": "#e0def480",
+		"editorWarning.border": "#0000",
+		"editorWarning.foreground": "#f6c177",
+		"editorWhitespace.foreground": "#6e6a86",
+		"editorWidget.background": "#1f1d2e",
+		"editorWidget.border": "#26233a",
+		"editorWidget.foreground": "#908caa",
+		"editorWidget.resizeBorder": "#6e6a86",
+		"errorForeground": "#eb6f92",
+		"extensionBadge.remoteBackground": "#c4a7e7",
+		"extensionBadge.remoteForeground": "#191724",
+		"extensionButton.prominentBackground": "#ebbcba",
+		"extensionButton.prominentForeground": "#191724",
+		"extensionButton.prominentHoverBackground": "#ebbcbae6",
+		"extensionIcon.preReleaseForeground": "#31748f",
+		"extensionIcon.starForeground": "#ebbcba",
+		"extensionIcon.verifiedForeground": "#c4a7e7",
+		"focusBorder": "#6e6a8633",
+		"foreground": "#e0def4",
+		"gitDecoration.addedResourceForeground": "#9ccfd8",
+		"gitDecoration.conflictingResourceForeground": "#eb6f92",
+		"gitDecoration.deletedResourceForeground": "#908caa",
+		"gitDecoration.ignoredResourceForeground": "#6e6a86",
+		"gitDecoration.modifiedResourceForeground": "#ebbcba",
+		"gitDecoration.renamedResourceForeground": "#31748f",
+		"gitDecoration.stageDeletedResourceForeground": "#eb6f92",
+		"gitDecoration.stageModifiedResourceForeground": "#c4a7e7",
+		"gitDecoration.submoduleResourceForeground": "#f6c177",
+		"gitDecoration.untrackedResourceForeground": "#f6c177",
+		"icon.foreground": "#908caa",
+		"input.background": "#26233a80",
+		"input.border": "#6e6a8633",
+		"input.foreground": "#e0def4",
+		"input.placeholderForeground": "#908caa",
+		"inputOption.activeBackground": "#ebbcba26",
+		"inputOption.activeForeground": "#ebbcba",
+		"inputValidation.errorBackground": "#1f1d2e",
+		"inputValidation.errorBorder": "#6e6a8666",
+		"inputValidation.errorForeground": "#eb6f92",
+		"inputValidation.infoBackground": "#1f1d2e",
+		"inputValidation.infoBorder": "#6e6a8666",
+		"inputValidation.infoForeground": "#9ccfd8",
+		"inputValidation.warningBackground": "#1f1d2e",
+		"inputValidation.warningBorder": "#6e6a8666",
+		"inputValidation.warningForeground": "#9ccfd880",
+		"keybindingLabel.background": "#26233a",
+		"keybindingLabel.border": "#6e6a8666",
+		"keybindingLabel.bottomBorder": "#6e6a8666",
+		"keybindingLabel.foreground": "#c4a7e7",
+		"keybindingTable.headerBackground": "#26233a",
+		"keybindingTable.rowsBackground": "#1f1d2e",
+		"list.activeSelectionBackground": "#6e6a8633",
+		"list.activeSelectionForeground": "#e0def4",
+		"list.deemphasizedForeground": "#908caa",
+		"list.dropBackground": "#1f1d2e",
+		"list.errorForeground": "#eb6f92",
+		"list.filterMatchBackground": "#1f1d2e",
+		"list.filterMatchBorder": "#ebbcba",
+		"list.focusBackground": "#6e6a8666",
+		"list.focusForeground": "#e0def4",
+		"list.focusOutline": "#6e6a8633",
+		"list.highlightForeground": "#ebbcba",
+		"list.hoverBackground": "#6e6a861a",
+		"list.hoverForeground": "#e0def4",
+		"list.inactiveFocusBackground": "#6e6a861a",
+		"list.inactiveSelectionBackground": "#1f1d2e",
+		"list.inactiveSelectionForeground": "#e0def4",
+		"list.invalidItemForeground": "#eb6f92",
+		"list.warningForeground": "#f6c177",
+		"listFilterWidget.background": "#1f1d2e",
+		"listFilterWidget.noMatchesOutline": "#eb6f92",
+		"listFilterWidget.outline": "#26233a",
+		"menu.background": "#1f1d2e",
+		"menu.border": "#6e6a861a",
+		"menu.foreground": "#e0def4",
+		"menu.selectionBackground": "#6e6a8633",
+		"menu.selectionBorder": "#26233a",
+		"menu.selectionForeground": "#e0def4",
+		"menu.separatorBackground": "#6e6a8666",
+		"menubar.selectionBackground": "#6e6a8633",
+		"menubar.selectionBorder": "#6e6a861a",
+		"menubar.selectionForeground": "#e0def4",
+		"merge.border": "#26233a",
+		"merge.commonContentBackground": "#6e6a8633",
+		"merge.commonHeaderBackground": "#6e6a8633",
+		"merge.currentContentBackground": "#f6c17780",
+		"merge.currentHeaderBackground": "#f6c17780",
+		"merge.incomingContentBackground": "#9ccfd880",
+		"merge.incomingHeaderBackground": "#9ccfd880",
+		"minimap.background": "#1f1d2e",
+		"minimap.errorHighlight": "#eb6f9280",
+		"minimap.findMatchHighlight": "#6e6a8633",
+		"minimap.selectionHighlight": "#6e6a8633",
+		"minimap.warningHighlight": "#f6c17780",
+		"minimapGutter.addedBackground": "#9ccfd8",
+		"minimapGutter.deletedBackground": "#eb6f92",
+		"minimapGutter.modifiedBackground": "#ebbcba",
+		"minimapSlider.activeBackground": "#6e6a8666",
+		"minimapSlider.background": "#6e6a8633",
+		"minimapSlider.hoverBackground": "#6e6a8633",
+		"notebook.cellBorderColor": "#9ccfd880",
+		"notebook.cellEditorBackground": "#1f1d2e",
+		"notebook.cellHoverBackground": "#26233a80",
+		"notebook.focusedCellBackground": "#6e6a861a",
+		"notebook.focusedCellBorder": "#9ccfd8",
+		"notebook.outputContainerBackgroundColor": "#6e6a861a",
+		"notificationCenter.border": "#6e6a8633",
+		"notificationCenterHeader.background": "#1f1d2e",
+		"notificationCenterHeader.foreground": "#908caa",
+		"notificationLink.foreground": "#c4a7e7",
+		"notifications.background": "#1f1d2e",
+		"notifications.border": "#6e6a8633",
+		"notifications.foreground": "#e0def4",
+		"notificationsErrorIcon.foreground": "#eb6f92",
+		"notificationsInfoIcon.foreground": "#9ccfd8",
+		"notificationsWarningIcon.foreground": "#f6c177",
+		"notificationToast.border": "#6e6a8633",
+		"panel.background": "#1f1d2e",
+		"panel.border": "#0000",
+		"panel.dropBorder": "#26233a",
+		"panelInput.border": "#1f1d2e",
+		"panelSection.dropBackground": "#6e6a8633",
+		"panelSectionHeader.background": "#1f1d2e",
+		"panelSectionHeader.foreground": "#e0def4",
+		"panelTitle.activeBorder": "#6e6a8666",
+		"panelTitle.activeForeground": "#e0def4",
+		"panelTitle.inactiveForeground": "#908caa",
+		"peekView.border": "#26233a",
+		"peekViewEditor.background": "#1f1d2e",
+		"peekViewEditor.matchHighlightBackground": "#6e6a8666",
+		"peekViewResult.background": "#1f1d2e",
+		"peekViewResult.fileForeground": "#908caa",
+		"peekViewResult.lineForeground": "#908caa",
+		"peekViewResult.matchHighlightBackground": "#6e6a8666",
+		"peekViewResult.selectionBackground": "#6e6a8633",
+		"peekViewResult.selectionForeground": "#e0def4",
+		"peekViewTitle.background": "#26233a",
+		"peekViewTitleDescription.foreground": "#908caa",
+		"pickerGroup.border": "#6e6a8666",
+		"pickerGroup.foreground": "#c4a7e7",
+		"ports.iconRunningProcessForeground": "#ebbcba",
+		"problemsErrorIcon.foreground": "#eb6f92",
+		"problemsInfoIcon.foreground": "#9ccfd8",
+		"problemsWarningIcon.foreground": "#f6c177",
+		"progressBar.background": "#ebbcba",
+		"quickInput.background": "#1f1d2e",
+		"quickInput.foreground": "#908caa",
+		"quickInputList.focusBackground": "#6e6a8633",
+		"quickInputList.focusForeground": "#e0def4",
+		"quickInputList.focusIconForeground": "#e0def4",
+		"scrollbar.shadow": "#1f1d2e4d",
+		"scrollbarSlider.activeBackground": "#31748f80",
+		"scrollbarSlider.background": "#6e6a8633",
+		"scrollbarSlider.hoverBackground": "#6e6a8666",
+		"searchEditor.findMatchBackground": "#6e6a8633",
+		"selection.background": "#6e6a8666",
+		"settings.focusedRowBackground": "#1f1d2e",
+		"settings.headerForeground": "#e0def4",
+		"settings.modifiedItemIndicator": "#ebbcba",
+		"settings.focusedRowBorder": "#6e6a8633",
+		"settings.rowHoverBackground": "#1f1d2e",
+		"sideBar.background": "#191724",
+		"sideBar.dropBackground": "#1f1d2e",
+		"sideBar.foreground": "#908caa",
+		"sideBarSectionHeader.background": "#0000",
+		"sideBarSectionHeader.border": "#6e6a8633",
+		"statusBar.background": "#191724",
+		"statusBar.debuggingBackground": "#c4a7e7",
+		"statusBar.debuggingForeground": "#191724",
+		"statusBar.foreground": "#908caa",
+		"statusBar.noFolderBackground": "#191724",
+		"statusBar.noFolderForeground": "#908caa",
+		"statusBarItem.activeBackground": "#6e6a8666",
+		"statusBarItem.hoverBackground": "#6e6a8633",
+		"statusBarItem.prominentBackground": "#26233a",
+		"statusBarItem.prominentForeground": "#e0def4",
+		"statusBarItem.prominentHoverBackground": "#6e6a8633",
+		"statusBarItem.remoteBackground": "#191724",
+		"statusBarItem.remoteForeground": "#f6c177",
+		"statusBarItem.errorBackground": "#191724",
+		"statusBarItem.errorForeground": "#eb6f92",
+		"symbolIcon.arrayForeground": "#908caa",
+		"symbolIcon.classForeground": "#908caa",
+		"symbolIcon.colorForeground": "#908caa",
+		"symbolIcon.constantForeground": "#908caa",
+		"symbolIcon.constructorForeground": "#908caa",
+		"symbolIcon.enumeratorForeground": "#908caa",
+		"symbolIcon.enumeratorMemberForeground": "#908caa",
+		"symbolIcon.eventForeground": "#908caa",
+		"symbolIcon.fieldForeground": "#908caa",
+		"symbolIcon.fileForeground": "#908caa",
+		"symbolIcon.folderForeground": "#908caa",
+		"symbolIcon.functionForeground": "#908caa",
+		"symbolIcon.interfaceForeground": "#908caa",
+		"symbolIcon.keyForeground": "#908caa",
+		"symbolIcon.keywordForeground": "#908caa",
+		"symbolIcon.methodForeground": "#908caa",
+		"symbolIcon.moduleForeground": "#908caa",
+		"symbolIcon.namespaceForeground": "#908caa",
+		"symbolIcon.nullForeground": "#908caa",
+		"symbolIcon.numberForeground": "#908caa",
+		"symbolIcon.objectForeground": "#908caa",
+		"symbolIcon.operatorForeground": "#908caa",
+		"symbolIcon.packageForeground": "#908caa",
+		"symbolIcon.propertyForeground": "#908caa",
+		"symbolIcon.referenceForeground": "#908caa",
+		"symbolIcon.snippetForeground": "#908caa",
+		"symbolIcon.stringForeground": "#908caa",
+		"symbolIcon.structForeground": "#908caa",
+		"symbolIcon.textForeground": "#908caa",
+		"symbolIcon.typeParameterForeground": "#908caa",
+		"symbolIcon.unitForeground": "#908caa",
+		"symbolIcon.variableForeground": "#908caa",
+		"tab.activeBackground": "#6e6a861a",
+		"tab.activeForeground": "#e0def4",
+		"tab.activeModifiedBorder": "#9ccfd8",
+		"tab.border": "#0000",
+		"tab.hoverBackground": "#6e6a8633",
+		"tab.inactiveBackground": "#0000",
+		"tab.inactiveForeground": "#908caa",
+		"tab.inactiveModifiedBorder": "#9ccfd880",
+		"tab.lastPinnedBorder": "#6e6a86",
+		"tab.unfocusedActiveBackground": "#0000",
+		"tab.unfocusedHoverBackground": "#0000",
+		"tab.unfocusedInactiveBackground": "#0000",
+		"tab.unfocusedInactiveModifiedBorder": "#9ccfd880",
+		"terminal.ansiBlack": "#26233a",
+		"terminal.ansiBlue": "#9ccfd8",
+		"terminal.ansiBrightBlack": "#908caa",
+		"terminal.ansiBrightBlue": "#9ccfd8",
+		"terminal.ansiBrightCyan": "#ebbcba",
+		"terminal.ansiBrightGreen": "#31748f",
+		"terminal.ansiBrightMagenta": "#c4a7e7",
+		"terminal.ansiBrightRed": "#eb6f92",
+		"terminal.ansiBrightWhite": "#e0def4",
+		"terminal.ansiBrightYellow": "#f6c177",
+		"terminal.ansiCyan": "#ebbcba",
+		"terminal.ansiGreen": "#31748f",
+		"terminal.ansiMagenta": "#c4a7e7",
+		"terminal.ansiRed": "#eb6f92",
+		"terminal.ansiWhite": "#e0def4",
+		"terminal.ansiYellow": "#f6c177",
+		"terminal.dropBackground": "#6e6a8633",
+		"terminal.foreground": "#e0def4",
+		"terminal.selectionBackground": "#6e6a8633",
+		"terminal.tab.activeBorder": "#e0def4",
+		"terminalCursor.background": "#e0def4",
+		"terminalCursor.foreground": "#6e6a86",
+		"textBlockQuote.background": "#1f1d2e",
+		"textBlockQuote.border": "#6e6a8633",
+		"textCodeBlock.background": "#1f1d2e",
+		"textLink.activeForeground": "#c4a7e7e6",
+		"textLink.foreground": "#c4a7e7",
+		"textPreformat.foreground": "#f6c177",
+		"textSeparator.foreground": "#908caa",
+		"titleBar.activeBackground": "#191724",
+		"titleBar.activeForeground": "#908caa",
+		"titleBar.inactiveBackground": "#1f1d2e",
+		"titleBar.inactiveForeground": "#908caa",
+		"toolbar.activeBackground": "#6e6a8666",
+		"toolbar.hoverBackground": "#6e6a8633",
+		"tree.indentGuidesStroke": "#908caa",
+		"walkThrough.embeddedEditorBackground": "#191724",
+		"welcomePage.background": "#191724",
+		"welcomePage.buttonBackground": "#1f1d2e",
+		"welcomePage.buttonHoverBackground": "#26233a",
+		"widget.shadow": "#1f1d2e4d",
+		"window.activeBorder": "#1f1d2e",
+		"window.inactiveBorder": "#1f1d2e"
+	},
+	"tokenColors": [
+		{
+			"scope": ["comment"],
+			"settings": {
+				"foreground": "#6e6a86",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["constant"],
+			"settings": {
+				"foreground": "#31748f"
+			}
+		},
+		{
+			"scope": ["constant.numeric", "constant.language"],
+			"settings": {
+				"foreground": "#ebbcba"
+			}
+		},
+		{
+			"scope": ["entity.name"],
+			"settings": {
+				"foreground": "#ebbcba"
+			}
+		},
+		{
+			"scope": [
+				"entity.name.section",
+				"entity.name.tag",
+				"entity.name.namespace",
+				"entity.name.type"
+			],
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": ["entity.other.attribute-name", "entity.other.inherited-class"],
+			"settings": {
+				"foreground": "#c4a7e7",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["invalid"],
+			"settings": {
+				"foreground": "#eb6f92"
+			}
+		},
+		{
+			"scope": ["invalid.deprecated"],
+			"settings": {
+				"foreground": "#908caa"
+			}
+		},
+		{
+			"scope": ["keyword"],
+			"settings": {
+				"foreground": "#31748f"
+			}
+		},
+		{
+			"scope": ["markup.inserted.diff"],
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": ["markup.deleted.diff"],
+			"settings": {
+				"foreground": "#eb6f92"
+			}
+		},
+		{
+			"scope": "markup.heading",
+			"settings": {
+				"fontStyle": "bold"
+			}
+		},
+		{
+			"scope": "markup.bold.markdown",
+			"settings": {
+				"fontStyle": "bold"
+			}
+		},
+		{
+			"scope": "markup.italic.markdown",
+			"settings": {
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["meta.diff.range"],
+			"settings": {
+				"foreground": "#c4a7e7"
+			}
+		},
+		{
+			"scope": ["meta.tag", "meta.brace"],
+			"settings": {
+				"foreground": "#e0def4"
+			}
+		},
+		{
+			"scope": ["meta.import", "meta.export"],
+			"settings": {
+				"foreground": "#31748f"
+			}
+		},
+		{
+			"scope": "meta.directive.vue",
+			"settings": {
+				"foreground": "#c4a7e7",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": "meta.property-name.css",
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": "meta.property-value.css",
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": "meta.tag.other.html",
+			"settings": {
+				"foreground": "#908caa"
+			}
+		},
+		{
+			"scope": ["punctuation"],
+			"settings": {
+				"foreground": "#908caa"
+			}
+		},
+		{
+			"scope": ["punctuation.accessor"],
+			"settings": {
+				"foreground": "#31748f"
+			}
+		},
+		{
+			"scope": ["punctuation.definition.string"],
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": ["punctuation.definition.tag"],
+			"settings": {
+				"foreground": "#6e6a86"
+			}
+		},
+		{
+			"scope": ["storage.type", "storage.modifier"],
+			"settings": {
+				"foreground": "#31748f"
+			}
+		},
+		{
+			"scope": ["string"],
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": ["support"],
+			"settings": {
+				"foreground": "#9ccfd8"
+			}
+		},
+		{
+			"scope": ["support.constant"],
+			"settings": {
+				"foreground": "#f6c177"
+			}
+		},
+		{
+			"scope": ["support.function"],
+			"settings": {
+				"foreground": "#eb6f92",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": ["variable"],
+			"settings": {
+				"foreground": "#ebbcba",
+				"fontStyle": "italic"
+			}
+		},
+		{
+			"scope": [
+				"variable.other",
+				"variable.language",
+				"variable.function",
+				"variable.argument"
+			],
+			"settings": {
+				"foreground": "#e0def4"
+			}
+		},
+		{
+			"scope": ["variable.parameter"],
+			"settings": {
+				"foreground": "#c4a7e7"
+			}
+		}
+	]
 }

crates/activity_indicator2/src/activity_indicator.rs 🔗

@@ -14,7 +14,7 @@ use ui::h_stack;
 use util::ResultExt;
 use workspace::{item::ItemHandle, StatusItemView, Workspace};
 
-actions!(ShowErrorMessage);
+actions!(activity_indicator, [ShowErrorMessage]);
 
 const DOWNLOAD_ICON: &str = "icons/download.svg";
 const WARNING_ICON: &str = "icons/warning.svg";

crates/assistant2/src/assistant.rs 🔗

@@ -12,23 +12,26 @@ use chrono::{DateTime, Local};
 use collections::HashMap;
 use fs::Fs;
 use futures::StreamExt;
-use gpui::{actions, AppContext};
+use gpui::{actions, AppContext, SharedString};
 use regex::Regex;
 use serde::{Deserialize, Serialize};
 use std::{cmp::Reverse, ffi::OsStr, path::PathBuf, sync::Arc};
 use util::paths::CONVERSATIONS_DIR;
 
 actions!(
-    NewConversation,
-    Assist,
-    Split,
-    CycleMessageRole,
-    QuoteSelection,
-    ToggleFocus,
-    ResetKey,
-    InlineAssist,
-    ToggleIncludeConversation,
-    ToggleRetrieveContext,
+    assistant,
+    [
+        NewConversation,
+        Assist,
+        Split,
+        CycleMessageRole,
+        QuoteSelection,
+        ToggleFocus,
+        ResetKey,
+        InlineAssist,
+        ToggleIncludeConversation,
+        ToggleRetrieveContext,
+    ]
 );
 
 #[derive(
@@ -47,7 +50,7 @@ struct MessageMetadata {
 enum MessageStatus {
     Pending,
     Done,
-    Error(Arc<str>),
+    Error(SharedString),
 }
 
 #[derive(Serialize, Deserialize)]

crates/assistant2/src/assistant_panel.rs 🔗

@@ -1628,8 +1628,9 @@ impl Conversation {
                                     metadata.status = MessageStatus::Done;
                                 }
                                 Err(error) => {
-                                    metadata.status =
-                                        MessageStatus::Error(error.to_string().trim().into());
+                                    metadata.status = MessageStatus::Error(SharedString::from(
+                                        error.to_string().trim().to_string(),
+                                    ));
                                 }
                             }
                             cx.notify();
@@ -2273,7 +2274,7 @@ impl ConversationEditor {
                                         Some(
                                             div()
                                                 .id("error")
-                                                .tooltip(move |cx| Tooltip::text(&error, cx))
+                                                .tooltip(move |cx| Tooltip::text(error.clone(), cx))
                                                 .child(IconElement::new(Icon::XCircle)),
                                         )
                                     } else {

crates/auto_update2/src/auto_update.rs 🔗

@@ -26,10 +26,13 @@ const POLL_INTERVAL: Duration = Duration::from_secs(60 * 60);
 
 //todo!(remove CheckThatAutoUpdaterWorks)
 actions!(
-    Check,
-    DismissErrorMessage,
-    ViewReleaseNotes,
-    CheckThatAutoUpdaterWorks
+    auto_update,
+    [
+        Check,
+        DismissErrorMessage,
+        ViewReleaseNotes,
+        CheckThatAutoUpdaterWorks
+    ]
 );
 
 #[derive(Serialize)]

crates/breadcrumbs2/Cargo.toml 🔗

@@ -19,7 +19,7 @@ search = { package = "search2", path = "../search2" }
 settings = { package = "settings2", path = "../settings2" }
 theme = { package = "theme2", path = "../theme2" }
 workspace = { package = "workspace2", path = "../workspace2" }
-# outline = { path = "../outline" }
+outline = { package = "outline2", path = "../outline2" }
 itertools = "0.10"
 
 [dev-dependencies]

crates/breadcrumbs2/src/breadcrumbs.rs 🔗

@@ -4,7 +4,7 @@ use gpui::{
 };
 use itertools::Itertools;
 use theme::ActiveTheme;
-use ui::{prelude::*, ButtonLike, ButtonStyle, Label};
+use ui::{prelude::*, ButtonLike, ButtonStyle, Label, Tooltip};
 use workspace::{
     item::{ItemEvent, ItemHandle},
     ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace,
@@ -18,7 +18,7 @@ pub struct Breadcrumbs {
     pane_focused: bool,
     active_item: Option<Box<dyn ItemHandle>>,
     subscription: Option<Subscription>,
-    _workspace: WeakView<Workspace>,
+    workspace: WeakView<Workspace>,
 }
 
 impl Breadcrumbs {
@@ -27,7 +27,7 @@ impl Breadcrumbs {
             pane_focused: false,
             active_item: Default::default(),
             subscription: Default::default(),
-            _workspace: workspace.weak_handle(),
+            workspace: workspace.weak_handle(),
         }
     }
 }
@@ -66,93 +66,32 @@ impl Render for Breadcrumbs {
             ButtonLike::new("toggle outline view")
                 .style(ButtonStyle::Subtle)
                 .child(h_stack().gap_1().children(breadcrumbs))
-                // We disable the button when it is not focused
-                // due to ... @julia what was the reason again?
+                // We disable the button when the containing pane is not focused:
+                //    Because right now all the breadcrumb does is open the outline view, which is an
+                //    action which operates on the active editor, clicking the breadcrumbs of another
+                //    editor could cause weirdness. I remember that at one point it actually caused a
+                //    panic weirdly.
+                //
+                //    It might be possible that with changes around how focus is managed that we
+                //    might be able to update the active editor to the one with the breadcrumbs
+                //    clicked on? That or we could just add a code path for being able to open the
+                //    outline for a specific editor. Long term we'd like for it to be an actual
+                //    breadcrumb bar so that problem goes away
+                //
+                //   — Julia (https://github.com/zed-industries/zed/pull/3505#pullrequestreview-1766198050)
                 .disabled(!self.pane_focused)
-                .on_click(move |_, _cx| {
-                    todo!("outline::toggle");
-                    // this.update(cx, |this, cx| {
-                    //     if let Some(workspace) = this.workspace.upgrade() {
-                    //         workspace.update(cx, |_workspace, _cx| {
-                    //             outline::toggle(workspace, &Default::default(), cx)
-                    //         })
-                    //     }
-                    // })
-                    // .ok();
-                }),
+                .on_click(cx.listener(|breadcrumbs, _, cx| {
+                    if let Some(workspace) = breadcrumbs.workspace.upgrade() {
+                        workspace.update(cx, |workspace, cx| {
+                            outline::toggle(workspace, &outline::Toggle, cx)
+                        })
+                    }
+                }))
+                .tooltip(|cx| Tooltip::for_action("Show symbol outline", &outline::Toggle, cx)),
         )
     }
 }
 
-// impl View for Breadcrumbs {
-//     fn ui_name() -> &'static str {
-//         "Breadcrumbs"
-//     }
-
-//     fn render(&mut self, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
-//         let active_item = match &self.active_item {
-//             Some(active_item) => active_item,
-//             None => return Empty::new().into_any(),
-//         };
-//         let not_editor = active_item.downcast::<editor::Editor>().is_none();
-
-//         let theme = theme::current(cx).clone();
-//         let style = &theme.workspace.toolbar.breadcrumbs;
-
-//         let breadcrumbs = match active_item.breadcrumbs(&theme, cx) {
-//             Some(breadcrumbs) => breadcrumbs,
-//             None => return Empty::new().into_any(),
-//         }
-//         .into_iter()
-//         .map(|breadcrumb| {
-//             Text::new(
-//                 breadcrumb.text,
-//                 theme.workspace.toolbar.breadcrumbs.default.text.clone(),
-//             )
-//             .with_highlights(breadcrumb.highlights.unwrap_or_default())
-//             .into_any()
-//         });
-
-//         let crumbs = Flex::row()
-//             .with_children(Itertools::intersperse_with(breadcrumbs, || {
-//                 Label::new(" › ", style.default.text.clone()).into_any()
-//             }))
-//             .constrained()
-//             .with_height(theme.workspace.toolbar.breadcrumb_height)
-//             .contained();
-
-//         if not_editor || !self.pane_focused {
-//             return crumbs
-//                 .with_style(style.default.container)
-//                 .aligned()
-//                 .left()
-//                 .into_any();
-//         }
-
-//         MouseEventHandler::new::<Breadcrumbs, _>(0, cx, |state, _| {
-//             let style = style.style_for(state);
-//             crumbs.with_style(style.container)
-//         })
-//         .on_click(MouseButton::Left, |_, this, cx| {
-//             if let Some(workspace) = this.workspace.upgrade(cx) {
-//                 workspace.update(cx, |workspace, cx| {
-//                     outline::toggle(workspace, &Default::default(), cx)
-//                 })
-//             }
-//         })
-//         .with_tooltip::<Breadcrumbs>(
-//             0,
-//             "Show symbol outline".to_owned(),
-//             Some(Box::new(outline::Toggle)),
-//             theme.tooltip.clone(),
-//             cx,
-//         )
-//         .aligned()
-//         .left()
-//         .into_any()
-//     }
-// }
-
 impl ToolbarItemView for Breadcrumbs {
     fn set_active_pane_item(
         &mut self,

crates/channel2/src/channel_store.rs 🔗

@@ -8,7 +8,8 @@ use collections::{hash_map, HashMap, HashSet};
 use db::RELEASE_CHANNEL;
 use futures::{channel::mpsc, future::Shared, Future, FutureExt, StreamExt};
 use gpui::{
-    AppContext, AsyncAppContext, Context, EventEmitter, Model, ModelContext, Task, WeakModel,
+    AppContext, AsyncAppContext, Context, EventEmitter, Model, ModelContext, SharedString, Task,
+    WeakModel,
 };
 use rpc::{
     proto::{self, ChannelVisibility},
@@ -46,7 +47,7 @@ pub struct ChannelStore {
 #[derive(Clone, Debug, PartialEq)]
 pub struct Channel {
     pub id: ChannelId,
-    pub name: String,
+    pub name: SharedString,
     pub visibility: proto::ChannelVisibility,
     pub role: proto::ChannelRole,
     pub unseen_note_version: Option<(u64, clock::Global)>,
@@ -895,14 +896,16 @@ impl ChannelStore {
                 .channel_invitations
                 .binary_search_by_key(&channel.id, |c| c.id)
             {
-                Ok(ix) => Arc::make_mut(&mut self.channel_invitations[ix]).name = channel.name,
+                Ok(ix) => {
+                    Arc::make_mut(&mut self.channel_invitations[ix]).name = channel.name.into()
+                }
                 Err(ix) => self.channel_invitations.insert(
                     ix,
                     Arc::new(Channel {
                         id: channel.id,
                         visibility: channel.visibility(),
                         role: channel.role(),
-                        name: channel.name,
+                        name: channel.name.into(),
                         unseen_note_version: None,
                         unseen_message_id: None,
                         parent_path: channel.parent_path,

crates/channel2/src/channel_store/channel_index.rs 🔗

@@ -104,7 +104,7 @@ impl<'a> ChannelPathsInsertGuard<'a> {
 
             existing_channel.visibility = channel_proto.visibility();
             existing_channel.role = channel_proto.role();
-            existing_channel.name = channel_proto.name;
+            existing_channel.name = channel_proto.name.into();
         } else {
             self.channels_by_id.insert(
                 channel_proto.id,
@@ -112,7 +112,7 @@ impl<'a> ChannelPathsInsertGuard<'a> {
                     id: channel_proto.id,
                     visibility: channel_proto.visibility(),
                     role: channel_proto.role(),
-                    name: channel_proto.name,
+                    name: channel_proto.name.into(),
                     unseen_note_version: None,
                     unseen_message_id: None,
                     parent_path: channel_proto.parent_path,
@@ -146,11 +146,11 @@ fn channel_path_sorting_key<'a>(
     let (parent_path, name) = channels_by_id
         .get(&id)
         .map_or((&[] as &[_], None), |channel| {
-            (channel.parent_path.as_slice(), Some(channel.name.as_str()))
+            (channel.parent_path.as_slice(), Some(channel.name.as_ref()))
         });
     parent_path
         .iter()
-        .filter_map(|id| Some(channels_by_id.get(id)?.name.as_str()))
+        .filter_map(|id| Some(channels_by_id.get(id)?.name.as_ref()))
         .chain(name)
 }
 

crates/client2/src/client2.rs 🔗

@@ -70,7 +70,7 @@ pub const ZED_SECRET_CLIENT_TOKEN: &str = "618033988749894";
 pub const INITIAL_RECONNECTION_DELAY: Duration = Duration::from_millis(100);
 pub const CONNECTION_TIMEOUT: Duration = Duration::from_secs(5);
 
-actions!(SignIn, SignOut, Reconnect);
+actions!(client, [SignIn, SignOut, Reconnect]);
 
 pub fn init_settings(cx: &mut AppContext) {
     TelemetrySettings::register(cx);

crates/collab/Cargo.toml 🔗

@@ -3,7 +3,7 @@ authors = ["Nathan Sobo <nathan@zed.dev>"]
 default-run = "collab"
 edition = "2021"
 name = "collab"
-version = "0.30.0"
+version = "0.30.1"
 publish = false
 
 [[bin]]

crates/collab/src/api.rs 🔗

@@ -116,12 +116,13 @@ struct CreateUserResponse {
 #[derive(Debug, Deserialize)]
 struct Panic {
     version: String,
+    release_channel: String,
     text: String,
 }
 
 #[instrument(skip(panic))]
 async fn trace_panic(panic: Json<Panic>) -> Result<()> {
-    tracing::error!(version = %panic.version, text = %panic.text, "panic report");
+    tracing::error!(version = %panic.version, release_channel = %panic.release_channel, text = %panic.text, "panic report");
     Ok(())
 }
 

crates/collab2/src/tests/channel_tests.rs 🔗

@@ -7,7 +7,7 @@ use call::ActiveCall;
 use channel::{ChannelId, ChannelMembership, ChannelStore};
 use client::User;
 use futures::future::try_join_all;
-use gpui::{BackgroundExecutor, Model, TestAppContext};
+use gpui::{BackgroundExecutor, Model, SharedString, TestAppContext};
 use rpc::{
     proto::{self, ChannelRole},
     RECEIVE_TIMEOUT,
@@ -46,13 +46,13 @@ async fn test_core_channels(
         &[
             ExpectedChannel {
                 id: channel_a_id,
-                name: "channel-a".to_string(),
+                name: "channel-a".into(),
                 depth: 0,
                 role: ChannelRole::Admin,
             },
             ExpectedChannel {
                 id: channel_b_id,
-                name: "channel-b".to_string(),
+                name: "channel-b".into(),
                 depth: 1,
                 role: ChannelRole::Admin,
             },
@@ -92,7 +92,7 @@ async fn test_core_channels(
         cx_b,
         &[ExpectedChannel {
             id: channel_a_id,
-            name: "channel-a".to_string(),
+            name: "channel-a".into(),
             depth: 0,
             role: ChannelRole::Member,
         }],
@@ -140,13 +140,13 @@ async fn test_core_channels(
         &[
             ExpectedChannel {
                 id: channel_a_id,
-                name: "channel-a".to_string(),
+                name: "channel-a".into(),
                 role: ChannelRole::Member,
                 depth: 0,
             },
             ExpectedChannel {
                 id: channel_b_id,
-                name: "channel-b".to_string(),
+                name: "channel-b".into(),
                 role: ChannelRole::Member,
                 depth: 1,
             },
@@ -168,19 +168,19 @@ async fn test_core_channels(
         &[
             ExpectedChannel {
                 id: channel_a_id,
-                name: "channel-a".to_string(),
+                name: "channel-a".into(),
                 role: ChannelRole::Member,
                 depth: 0,
             },
             ExpectedChannel {
                 id: channel_b_id,
-                name: "channel-b".to_string(),
+                name: "channel-b".into(),
                 role: ChannelRole::Member,
                 depth: 1,
             },
             ExpectedChannel {
                 id: channel_c_id,
-                name: "channel-c".to_string(),
+                name: "channel-c".into(),
                 role: ChannelRole::Member,
                 depth: 2,
             },
@@ -211,19 +211,19 @@ async fn test_core_channels(
         &[
             ExpectedChannel {
                 id: channel_a_id,
-                name: "channel-a".to_string(),
+                name: "channel-a".into(),
                 depth: 0,
                 role: ChannelRole::Admin,
             },
             ExpectedChannel {
                 id: channel_b_id,
-                name: "channel-b".to_string(),
+                name: "channel-b".into(),
                 depth: 1,
                 role: ChannelRole::Admin,
             },
             ExpectedChannel {
                 id: channel_c_id,
-                name: "channel-c".to_string(),
+                name: "channel-c".into(),
                 depth: 2,
                 role: ChannelRole::Admin,
             },
@@ -245,7 +245,7 @@ async fn test_core_channels(
         cx_a,
         &[ExpectedChannel {
             id: channel_a_id,
-            name: "channel-a".to_string(),
+            name: "channel-a".into(),
             depth: 0,
             role: ChannelRole::Admin,
         }],
@@ -255,7 +255,7 @@ async fn test_core_channels(
         cx_b,
         &[ExpectedChannel {
             id: channel_a_id,
-            name: "channel-a".to_string(),
+            name: "channel-a".into(),
             depth: 0,
             role: ChannelRole::Admin,
         }],
@@ -278,7 +278,7 @@ async fn test_core_channels(
         cx_a,
         &[ExpectedChannel {
             id: channel_a_id,
-            name: "channel-a".to_string(),
+            name: "channel-a".into(),
             depth: 0,
             role: ChannelRole::Admin,
         }],
@@ -309,7 +309,7 @@ async fn test_core_channels(
         cx_a,
         &[ExpectedChannel {
             id: channel_a_id,
-            name: "channel-a-renamed".to_string(),
+            name: "channel-a-renamed".into(),
             depth: 0,
             role: ChannelRole::Admin,
         }],
@@ -418,7 +418,7 @@ async fn test_channel_room(
         cx_b,
         &[ExpectedChannel {
             id: zed_id,
-            name: "zed".to_string(),
+            name: "zed".into(),
             depth: 0,
             role: ChannelRole::Member,
         }],
@@ -680,7 +680,7 @@ async fn test_permissions_update_while_invited(
         &[ExpectedChannel {
             depth: 0,
             id: rust_id,
-            name: "rust".to_string(),
+            name: "rust".into(),
             role: ChannelRole::Member,
         }],
     );
@@ -708,7 +708,7 @@ async fn test_permissions_update_while_invited(
         &[ExpectedChannel {
             depth: 0,
             id: rust_id,
-            name: "rust".to_string(),
+            name: "rust".into(),
             role: ChannelRole::Member,
         }],
     );
@@ -747,7 +747,7 @@ async fn test_channel_rename(
         &[ExpectedChannel {
             depth: 0,
             id: rust_id,
-            name: "rust-archive".to_string(),
+            name: "rust-archive".into(),
             role: ChannelRole::Admin,
         }],
     );
@@ -759,7 +759,7 @@ async fn test_channel_rename(
         &[ExpectedChannel {
             depth: 0,
             id: rust_id,
-            name: "rust-archive".to_string(),
+            name: "rust-archive".into(),
             role: ChannelRole::Member,
         }],
     );
@@ -888,7 +888,7 @@ async fn test_lost_channel_creation(
         &[ExpectedChannel {
             depth: 0,
             id: channel_id,
-            name: "x".to_string(),
+            name: "x".into(),
             role: ChannelRole::Member,
         }],
     );
@@ -912,13 +912,13 @@ async fn test_lost_channel_creation(
             ExpectedChannel {
                 depth: 0,
                 id: channel_id,
-                name: "x".to_string(),
+                name: "x".into(),
                 role: ChannelRole::Admin,
             },
             ExpectedChannel {
                 depth: 1,
                 id: subchannel_id,
-                name: "subchannel".to_string(),
+                name: "subchannel".into(),
                 role: ChannelRole::Admin,
             },
         ],
@@ -943,13 +943,13 @@ async fn test_lost_channel_creation(
             ExpectedChannel {
                 depth: 0,
                 id: channel_id,
-                name: "x".to_string(),
+                name: "x".into(),
                 role: ChannelRole::Member,
             },
             ExpectedChannel {
                 depth: 1,
                 id: subchannel_id,
-                name: "subchannel".to_string(),
+                name: "subchannel".into(),
                 role: ChannelRole::Member,
             },
         ],
@@ -1221,13 +1221,13 @@ async fn test_channel_membership_notifications(
             ExpectedChannel {
                 depth: 0,
                 id: zed_channel,
-                name: "zed".to_string(),
+                name: "zed".into(),
                 role: ChannelRole::Guest,
             },
             ExpectedChannel {
                 depth: 1,
                 id: vim_channel,
-                name: "vim".to_string(),
+                name: "vim".into(),
                 role: ChannelRole::Member,
             },
         ],
@@ -1250,13 +1250,13 @@ async fn test_channel_membership_notifications(
             ExpectedChannel {
                 depth: 0,
                 id: zed_channel,
-                name: "zed".to_string(),
+                name: "zed".into(),
                 role: ChannelRole::Guest,
             },
             ExpectedChannel {
                 depth: 1,
                 id: vim_channel,
-                name: "vim".to_string(),
+                name: "vim".into(),
                 role: ChannelRole::Guest,
             },
         ],
@@ -1476,7 +1476,7 @@ async fn test_channel_moving(
 struct ExpectedChannel {
     depth: usize,
     id: ChannelId,
-    name: String,
+    name: SharedString,
     role: ChannelRole,
 }
 
@@ -1515,7 +1515,7 @@ fn assert_channels(
                 .ordered_channels()
                 .map(|(depth, channel)| ExpectedChannel {
                     depth,
-                    name: channel.name.clone(),
+                    name: channel.name.clone().into(),
                     id: channel.id,
                     role: channel.role,
                 })

crates/collab2/src/tests/random_channel_buffer_tests.rs 🔗

@@ -3,7 +3,7 @@ use crate::db::ChannelRole;
 use super::{run_randomized_test, RandomizedTest, TestClient, TestError, TestServer, UserTestPlan};
 use anyhow::Result;
 use async_trait::async_trait;
-use gpui::{BackgroundExecutor, TestAppContext};
+use gpui::{BackgroundExecutor, SharedString, TestAppContext};
 use rand::prelude::*;
 use serde_derive::{Deserialize, Serialize};
 use std::{
@@ -30,13 +30,13 @@ struct RandomChannelBufferTest;
 #[derive(Clone, Serialize, Deserialize)]
 enum ChannelBufferOperation {
     JoinChannelNotes {
-        channel_name: String,
+        channel_name: SharedString,
     },
     LeaveChannelNotes {
-        channel_name: String,
+        channel_name: SharedString,
     },
     EditChannelNotes {
-        channel_name: String,
+        channel_name: SharedString,
         edits: Vec<(Range<usize>, Arc<str>)>,
     },
     Noop,

crates/collab_ui2/src/channel_view.rs 🔗

@@ -26,7 +26,7 @@ use workspace::{
     ItemNavHistory, Pane, SaveIntent, ViewId, Workspace, WorkspaceId,
 };
 
-actions!(Deploy);
+actions!(collab, [Deploy]);
 
 pub fn init(cx: &mut AppContext) {
     register_followable_item::<ChannelView>(cx)

crates/collab_ui2/src/chat_panel.rs 🔗

@@ -1,983 +1,698 @@
-// use crate::{
-//     channel_view::ChannelView, is_channels_feature_enabled, render_avatar, ChatPanelSettings,
-// };
-// use anyhow::Result;
-// use call::ActiveCall;
-// use channel::{ChannelChat, ChannelChatEvent, ChannelMessageId, ChannelStore};
-// use client::Client;
-// use collections::HashMap;
-// use db::kvp::KEY_VALUE_STORE;
-// use editor::Editor;
-// use gpui::{
-//     actions,
-//     elements::*,
-//     platform::{CursorStyle, MouseButton},
-//     serde_json,
-//     views::{ItemType, Select, SelectStyle},
-//     AnyViewHandle, AppContext, AsyncAppContext, Entity, ModelHandle, Subscription, Task, View,
-//     ViewContext, ViewHandle, WeakViewHandle,
-// };
-// use language::LanguageRegistry;
-// use menu::Confirm;
-// use message_editor::MessageEditor;
-// use project::Fs;
-// use rich_text::RichText;
-// use serde::{Deserialize, Serialize};
-// use settings::SettingsStore;
-// use std::sync::Arc;
-// use theme::{IconButton, Theme};
-// use time::{OffsetDateTime, UtcOffset};
-// use util::{ResultExt, TryFutureExt};
-// use workspace::{
-//     dock::{DockPosition, Panel},
-//     Workspace,
-// };
-
-// mod message_editor;
-
-// const MESSAGE_LOADING_THRESHOLD: usize = 50;
-// const CHAT_PANEL_KEY: &'static str = "ChatPanel";
-
-// pub struct ChatPanel {
-//     client: Arc<Client>,
-//     channel_store: ModelHandle<ChannelStore>,
-//     languages: Arc<LanguageRegistry>,
-//     active_chat: Option<(ModelHandle<ChannelChat>, Subscription)>,
-//     message_list: ListState<ChatPanel>,
-//     input_editor: ViewHandle<MessageEditor>,
-//     channel_select: ViewHandle<Select>,
-//     local_timezone: UtcOffset,
-//     fs: Arc<dyn Fs>,
-//     width: Option<f32>,
-//     active: bool,
-//     pending_serialization: Task<Option<()>>,
-//     subscriptions: Vec<gpui::Subscription>,
-//     workspace: WeakViewHandle<Workspace>,
-//     is_scrolled_to_bottom: bool,
-//     has_focus: bool,
-//     markdown_data: HashMap<ChannelMessageId, RichText>,
-// }
-
-// #[derive(Serialize, Deserialize)]
-// struct SerializedChatPanel {
-//     width: Option<f32>,
-// }
-
-// #[derive(Debug)]
-// pub enum Event {
-//     DockPositionChanged,
-//     Focus,
-//     Dismissed,
-// }
-
-// actions!(
-//     chat_panel,
-//     [LoadMoreMessages, ToggleFocus, OpenChannelNotes, JoinCall]
-// );
-
-// pub fn init(cx: &mut AppContext) {
-//     cx.add_action(ChatPanel::send);
-//     cx.add_action(ChatPanel::load_more_messages);
-//     cx.add_action(ChatPanel::open_notes);
-//     cx.add_action(ChatPanel::join_call);
-// }
-
-// impl ChatPanel {
-//     pub fn new(workspace: &mut Workspace, cx: &mut ViewContext<Workspace>) -> ViewHandle<Self> {
-//         let fs = workspace.app_state().fs.clone();
-//         let client = workspace.app_state().client.clone();
-//         let channel_store = ChannelStore::global(cx);
-//         let languages = workspace.app_state().languages.clone();
-
-//         let input_editor = cx.add_view(|cx| {
-//             MessageEditor::new(
-//                 languages.clone(),
-//                 channel_store.clone(),
-//                 cx.add_view(|cx| {
-//                     Editor::auto_height(
-//                         4,
-//                         Some(Arc::new(|theme| theme.chat_panel.input_editor.clone())),
-//                         cx,
-//                     )
-//                 }),
-//                 cx,
-//             )
-//         });
-
-//         let workspace_handle = workspace.weak_handle();
-
-//         let channel_select = cx.add_view(|cx| {
-//             let channel_store = channel_store.clone();
-//             let workspace = workspace_handle.clone();
-//             Select::new(0, cx, {
-//                 move |ix, item_type, is_hovered, cx| {
-//                     Self::render_channel_name(
-//                         &channel_store,
-//                         ix,
-//                         item_type,
-//                         is_hovered,
-//                         workspace,
-//                         cx,
-//                     )
-//                 }
-//             })
-//             .with_style(move |cx| {
-//                 let style = &theme::current(cx).chat_panel.channel_select;
-//                 SelectStyle {
-//                     header: Default::default(),
-//                     menu: style.menu,
-//                 }
-//             })
-//         });
-
-//         let mut message_list =
-//             ListState::<Self>::new(0, Orientation::Bottom, 10., move |this, ix, cx| {
-//                 this.render_message(ix, cx)
-//             });
-//         message_list.set_scroll_handler(|visible_range, count, this, cx| {
-//             if visible_range.start < MESSAGE_LOADING_THRESHOLD {
-//                 this.load_more_messages(&LoadMoreMessages, cx);
-//             }
-//             this.is_scrolled_to_bottom = visible_range.end == count;
-//         });
-
-//         cx.add_view(|cx| {
-//             let mut this = Self {
-//                 fs,
-//                 client,
-//                 channel_store,
-//                 languages,
-//                 active_chat: Default::default(),
-//                 pending_serialization: Task::ready(None),
-//                 message_list,
-//                 input_editor,
-//                 channel_select,
-//                 local_timezone: cx.platform().local_timezone(),
-//                 has_focus: false,
-//                 subscriptions: Vec::new(),
-//                 workspace: workspace_handle,
-//                 is_scrolled_to_bottom: true,
-//                 active: false,
-//                 width: None,
-//                 markdown_data: Default::default(),
-//             };
-
-//             let mut old_dock_position = this.position(cx);
-//             this.subscriptions
-//                 .push(
-//                     cx.observe_global::<SettingsStore, _>(move |this: &mut Self, cx| {
-//                         let new_dock_position = this.position(cx);
-//                         if new_dock_position != old_dock_position {
-//                             old_dock_position = new_dock_position;
-//                             cx.emit(Event::DockPositionChanged);
-//                         }
-//                         cx.notify();
-//                     }),
-//                 );
-
-//             this.update_channel_count(cx);
-//             cx.observe(&this.channel_store, |this, _, cx| {
-//                 this.update_channel_count(cx)
-//             })
-//             .detach();
-
-//             cx.observe(&this.channel_select, |this, channel_select, cx| {
-//                 let selected_ix = channel_select.read(cx).selected_index();
-
-//                 let selected_channel_id = this
-//                     .channel_store
-//                     .read(cx)
-//                     .channel_at(selected_ix)
-//                     .map(|e| e.id);
-//                 if let Some(selected_channel_id) = selected_channel_id {
-//                     this.select_channel(selected_channel_id, None, cx)
-//                         .detach_and_log_err(cx);
-//                 }
-//             })
-//             .detach();
-
-//             this
-//         })
-//     }
-
-//     pub fn is_scrolled_to_bottom(&self) -> bool {
-//         self.is_scrolled_to_bottom
-//     }
-
-//     pub fn active_chat(&self) -> Option<ModelHandle<ChannelChat>> {
-//         self.active_chat.as_ref().map(|(chat, _)| chat.clone())
-//     }
-
-//     pub fn load(
-//         workspace: WeakViewHandle<Workspace>,
-//         cx: AsyncAppContext,
-//     ) -> Task<Result<ViewHandle<Self>>> {
-//         cx.spawn(|mut cx| async move {
-//             let serialized_panel = if let Some(panel) = cx
-//                 .background()
-//                 .spawn(async move { KEY_VALUE_STORE.read_kvp(CHAT_PANEL_KEY) })
-//                 .await
-//                 .log_err()
-//                 .flatten()
-//             {
-//                 Some(serde_json::from_str::<SerializedChatPanel>(&panel)?)
-//             } else {
-//                 None
-//             };
-
-//             workspace.update(&mut cx, |workspace, cx| {
-//                 let panel = Self::new(workspace, cx);
-//                 if let Some(serialized_panel) = serialized_panel {
-//                     panel.update(cx, |panel, cx| {
-//                         panel.width = serialized_panel.width;
-//                         cx.notify();
-//                     });
-//                 }
-//                 panel
-//             })
-//         })
-//     }
-
-//     fn serialize(&mut self, cx: &mut ViewContext<Self>) {
-//         let width = self.width;
-//         self.pending_serialization = cx.background().spawn(
-//             async move {
-//                 KEY_VALUE_STORE
-//                     .write_kvp(
-//                         CHAT_PANEL_KEY.into(),
-//                         serde_json::to_string(&SerializedChatPanel { width })?,
-//                     )
-//                     .await?;
-//                 anyhow::Ok(())
-//             }
-//             .log_err(),
-//         );
-//     }
-
-//     fn update_channel_count(&mut self, cx: &mut ViewContext<Self>) {
-//         let channel_count = self.channel_store.read(cx).channel_count();
-//         self.channel_select.update(cx, |select, cx| {
-//             select.set_item_count(channel_count, cx);
-//         });
-//     }
-
-//     fn set_active_chat(&mut self, chat: ModelHandle<ChannelChat>, cx: &mut ViewContext<Self>) {
-//         if self.active_chat.as_ref().map(|e| &e.0) != Some(&chat) {
-//             let channel_id = chat.read(cx).channel_id;
-//             {
-//                 self.markdown_data.clear();
-//                 let chat = chat.read(cx);
-//                 self.message_list.reset(chat.message_count());
-
-//                 let channel_name = chat.channel(cx).map(|channel| channel.name.clone());
-//                 self.input_editor.update(cx, |editor, cx| {
-//                     editor.set_channel(channel_id, channel_name, cx);
-//                 });
-//             };
-//             let subscription = cx.subscribe(&chat, Self::channel_did_change);
-//             self.active_chat = Some((chat, subscription));
-//             self.acknowledge_last_message(cx);
-//             self.channel_select.update(cx, |select, cx| {
-//                 if let Some(ix) = self.channel_store.read(cx).index_of_channel(channel_id) {
-//                     select.set_selected_index(ix, cx);
-//                 }
-//             });
-//             cx.notify();
-//         }
-//     }
-
-//     fn channel_did_change(
-//         &mut self,
-//         _: ModelHandle<ChannelChat>,
-//         event: &ChannelChatEvent,
-//         cx: &mut ViewContext<Self>,
-//     ) {
-//         match event {
-//             ChannelChatEvent::MessagesUpdated {
-//                 old_range,
-//                 new_count,
-//             } => {
-//                 self.message_list.splice(old_range.clone(), *new_count);
-//                 if self.active {
-//                     self.acknowledge_last_message(cx);
-//                 }
-//             }
-//             ChannelChatEvent::NewMessage {
-//                 channel_id,
-//                 message_id,
-//             } => {
-//                 if !self.active {
-//                     self.channel_store.update(cx, |store, cx| {
-//                         store.new_message(*channel_id, *message_id, cx)
-//                     })
-//                 }
-//             }
-//         }
-//         cx.notify();
-//     }
-
-//     fn acknowledge_last_message(&mut self, cx: &mut ViewContext<'_, '_, ChatPanel>) {
-//         if self.active && self.is_scrolled_to_bottom {
-//             if let Some((chat, _)) = &self.active_chat {
-//                 chat.update(cx, |chat, cx| {
-//                     chat.acknowledge_last_message(cx);
-//                 });
-//             }
-//         }
-//     }
-
-//     fn render_channel(&self, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
-//         let theme = theme::current(cx);
-//         Flex::column()
-//             .with_child(
-//                 ChildView::new(&self.channel_select, cx)
-//                     .contained()
-//                     .with_style(theme.chat_panel.channel_select.container),
-//             )
-//             .with_child(self.render_active_channel_messages(&theme))
-//             .with_child(self.render_input_box(&theme, cx))
-//             .into_any()
-//     }
-
-//     fn render_active_channel_messages(&self, theme: &Arc<Theme>) -> AnyElement<Self> {
-//         let messages = if self.active_chat.is_some() {
-//             List::new(self.message_list.clone())
-//                 .contained()
-//                 .with_style(theme.chat_panel.list)
-//                 .into_any()
-//         } else {
-//             Empty::new().into_any()
-//         };
-
-//         messages.flex(1., true).into_any()
-//     }
-
-//     fn render_message(&mut self, ix: usize, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
-//         let (message, is_continuation, is_last, is_admin) = self
-//             .active_chat
-//             .as_ref()
-//             .unwrap()
-//             .0
-//             .update(cx, |active_chat, cx| {
-//                 let is_admin = self
-//                     .channel_store
-//                     .read(cx)
-//                     .is_channel_admin(active_chat.channel_id);
-
-//                 let last_message = active_chat.message(ix.saturating_sub(1));
-//                 let this_message = active_chat.message(ix).clone();
-//                 let is_continuation = last_message.id != this_message.id
-//                     && this_message.sender.id == last_message.sender.id;
-
-//                 if let ChannelMessageId::Saved(id) = this_message.id {
-//                     if this_message
-//                         .mentions
-//                         .iter()
-//                         .any(|(_, user_id)| Some(*user_id) == self.client.user_id())
-//                     {
-//                         active_chat.acknowledge_message(id);
-//                     }
-//                 }
-
-//                 (
-//                     this_message,
-//                     is_continuation,
-//                     active_chat.message_count() == ix + 1,
-//                     is_admin,
-//                 )
-//             });
-
-//         let is_pending = message.is_pending();
-//         let theme = theme::current(cx);
-//         let text = self.markdown_data.entry(message.id).or_insert_with(|| {
-//             Self::render_markdown_with_mentions(&self.languages, self.client.id(), &message)
-//         });
-
-//         let now = OffsetDateTime::now_utc();
-
-//         let style = if is_pending {
-//             &theme.chat_panel.pending_message
-//         } else if is_continuation {
-//             &theme.chat_panel.continuation_message
-//         } else {
-//             &theme.chat_panel.message
-//         };
-
-//         let belongs_to_user = Some(message.sender.id) == self.client.user_id();
-//         let message_id_to_remove = if let (ChannelMessageId::Saved(id), true) =
-//             (message.id, belongs_to_user || is_admin)
-//         {
-//             Some(id)
-//         } else {
-//             None
-//         };
-
-//         enum MessageBackgroundHighlight {}
-//         MouseEventHandler::new::<MessageBackgroundHighlight, _>(ix, cx, |state, cx| {
-//             let container = style.style_for(state);
-//             if is_continuation {
-//                 Flex::row()
-//                     .with_child(
-//                         text.element(
-//                             theme.editor.syntax.clone(),
-//                             theme.chat_panel.rich_text.clone(),
-//                             cx,
-//                         )
-//                         .flex(1., true),
-//                     )
-//                     .with_child(render_remove(message_id_to_remove, cx, &theme))
-//                     .contained()
-//                     .with_style(*container)
-//                     .with_margin_bottom(if is_last {
-//                         theme.chat_panel.last_message_bottom_spacing
-//                     } else {
-//                         0.
-//                     })
-//                     .into_any()
-//             } else {
-//                 Flex::column()
-//                     .with_child(
-//                         Flex::row()
-//                             .with_child(
-//                                 Flex::row()
-//                                     .with_child(render_avatar(
-//                                         message.sender.avatar.clone(),
-//                                         &theme.chat_panel.avatar,
-//                                         theme.chat_panel.avatar_container,
-//                                     ))
-//                                     .with_child(
-//                                         Label::new(
-//                                             message.sender.github_login.clone(),
-//                                             theme.chat_panel.message_sender.text.clone(),
-//                                         )
-//                                         .contained()
-//                                         .with_style(theme.chat_panel.message_sender.container),
-//                                     )
-//                                     .with_child(
-//                                         Label::new(
-//                                             format_timestamp(
-//                                                 message.timestamp,
-//                                                 now,
-//                                                 self.local_timezone,
-//                                             ),
-//                                             theme.chat_panel.message_timestamp.text.clone(),
-//                                         )
-//                                         .contained()
-//                                         .with_style(theme.chat_panel.message_timestamp.container),
-//                                     )
-//                                     .align_children_center()
-//                                     .flex(1., true),
-//                             )
-//                             .with_child(render_remove(message_id_to_remove, cx, &theme))
-//                             .align_children_center(),
-//                     )
-//                     .with_child(
-//                         Flex::row()
-//                             .with_child(
-//                                 text.element(
-//                                     theme.editor.syntax.clone(),
-//                                     theme.chat_panel.rich_text.clone(),
-//                                     cx,
-//                                 )
-//                                 .flex(1., true),
-//                             )
-//                             // Add a spacer to make everything line up
-//                             .with_child(render_remove(None, cx, &theme)),
-//                     )
-//                     .contained()
-//                     .with_style(*container)
-//                     .with_margin_bottom(if is_last {
-//                         theme.chat_panel.last_message_bottom_spacing
-//                     } else {
-//                         0.
-//                     })
-//                     .into_any()
-//             }
-//         })
-//         .into_any()
-//     }
-
-//     fn render_markdown_with_mentions(
-//         language_registry: &Arc<LanguageRegistry>,
-//         current_user_id: u64,
-//         message: &channel::ChannelMessage,
-//     ) -> RichText {
-//         let mentions = message
-//             .mentions
-//             .iter()
-//             .map(|(range, user_id)| rich_text::Mention {
-//                 range: range.clone(),
-//                 is_self_mention: *user_id == current_user_id,
-//             })
-//             .collect::<Vec<_>>();
-
-//         rich_text::render_markdown(message.body.clone(), &mentions, language_registry, None)
-//     }
-
-//     fn render_input_box(&self, theme: &Arc<Theme>, cx: &AppContext) -> AnyElement<Self> {
-//         ChildView::new(&self.input_editor, cx)
-//             .contained()
-//             .with_style(theme.chat_panel.input_editor.container)
-//             .into_any()
-//     }
-
-//     fn render_channel_name(
-//         channel_store: &ModelHandle<ChannelStore>,
-//         ix: usize,
-//         item_type: ItemType,
-//         is_hovered: bool,
-//         workspace: WeakViewHandle<Workspace>,
-//         cx: &mut ViewContext<Select>,
-//     ) -> AnyElement<Select> {
-//         let theme = theme::current(cx);
-//         let tooltip_style = &theme.tooltip;
-//         let theme = &theme.chat_panel;
-//         let style = match (&item_type, is_hovered) {
-//             (ItemType::Header, _) => &theme.channel_select.header,
-//             (ItemType::Selected, _) => &theme.channel_select.active_item,
-//             (ItemType::Unselected, false) => &theme.channel_select.item,
-//             (ItemType::Unselected, true) => &theme.channel_select.hovered_item,
-//         };
-
-//         let channel = &channel_store.read(cx).channel_at(ix).unwrap();
-//         let channel_id = channel.id;
-
-//         let mut row = Flex::row()
-//             .with_child(
-//                 Label::new("#".to_string(), style.hash.text.clone())
-//                     .contained()
-//                     .with_style(style.hash.container),
-//             )
-//             .with_child(Label::new(channel.name.clone(), style.name.clone()));
-
-//         if matches!(item_type, ItemType::Header) {
-//             row.add_children([
-//                 MouseEventHandler::new::<OpenChannelNotes, _>(0, cx, |mouse_state, _| {
-//                     render_icon_button(theme.icon_button.style_for(mouse_state), "icons/file.svg")
-//                 })
-//                 .on_click(MouseButton::Left, move |_, _, cx| {
-//                     if let Some(workspace) = workspace.upgrade(cx) {
-//                         ChannelView::open(channel_id, workspace, cx).detach();
-//                     }
-//                 })
-//                 .with_tooltip::<OpenChannelNotes>(
-//                     channel_id as usize,
-//                     "Open Notes",
-//                     Some(Box::new(OpenChannelNotes)),
-//                     tooltip_style.clone(),
-//                     cx,
-//                 )
-//                 .flex_float(),
-//                 MouseEventHandler::new::<ActiveCall, _>(0, cx, |mouse_state, _| {
-//                     render_icon_button(
-//                         theme.icon_button.style_for(mouse_state),
-//                         "icons/speaker-loud.svg",
-//                     )
-//                 })
-//                 .on_click(MouseButton::Left, move |_, _, cx| {
-//                     ActiveCall::global(cx)
-//                         .update(cx, |call, cx| call.join_channel(channel_id, cx))
-//                         .detach_and_log_err(cx);
-//                 })
-//                 .with_tooltip::<ActiveCall>(
-//                     channel_id as usize,
-//                     "Join Call",
-//                     Some(Box::new(JoinCall)),
-//                     tooltip_style.clone(),
-//                     cx,
-//                 )
-//                 .flex_float(),
-//             ]);
-//         }
-
-//         row.align_children_center()
-//             .contained()
-//             .with_style(style.container)
-//             .into_any()
-//     }
-
-//     fn render_sign_in_prompt(
-//         &self,
-//         theme: &Arc<Theme>,
-//         cx: &mut ViewContext<Self>,
-//     ) -> AnyElement<Self> {
-//         enum SignInPromptLabel {}
-
-//         MouseEventHandler::new::<SignInPromptLabel, _>(0, cx, |mouse_state, _| {
-//             Label::new(
-//                 "Sign in to use chat".to_string(),
-//                 theme
-//                     .chat_panel
-//                     .sign_in_prompt
-//                     .style_for(mouse_state)
-//                     .clone(),
-//             )
-//         })
-//         .with_cursor_style(CursorStyle::PointingHand)
-//         .on_click(MouseButton::Left, move |_, this, cx| {
-//             let client = this.client.clone();
-//             cx.spawn(|this, mut cx| async move {
-//                 if client
-//                     .authenticate_and_connect(true, &cx)
-//                     .log_err()
-//                     .await
-//                     .is_some()
-//                 {
-//                     this.update(&mut cx, |this, cx| {
-//                         if cx.handle().is_focused(cx) {
-//                             cx.focus(&this.input_editor);
-//                         }
-//                     })
-//                     .ok();
-//                 }
-//             })
-//             .detach();
-//         })
-//         .aligned()
-//         .into_any()
-//     }
-
-//     fn send(&mut self, _: &Confirm, cx: &mut ViewContext<Self>) {
-//         if let Some((chat, _)) = self.active_chat.as_ref() {
-//             let message = self
-//                 .input_editor
-//                 .update(cx, |editor, cx| editor.take_message(cx));
-
-//             if let Some(task) = chat
-//                 .update(cx, |chat, cx| chat.send_message(message, cx))
-//                 .log_err()
-//             {
-//                 task.detach();
-//             }
-//         }
-//     }
-
-//     fn remove_message(&mut self, id: u64, cx: &mut ViewContext<Self>) {
-//         if let Some((chat, _)) = self.active_chat.as_ref() {
-//             chat.update(cx, |chat, cx| chat.remove_message(id, cx).detach())
-//         }
-//     }
-
-//     fn load_more_messages(&mut self, _: &LoadMoreMessages, cx: &mut ViewContext<Self>) {
-//         if let Some((chat, _)) = self.active_chat.as_ref() {
-//             chat.update(cx, |channel, cx| {
-//                 if let Some(task) = channel.load_more_messages(cx) {
-//                     task.detach();
-//                 }
-//             })
-//         }
-//     }
-
-//     pub fn select_channel(
-//         &mut self,
-//         selected_channel_id: u64,
-//         scroll_to_message_id: Option<u64>,
-//         cx: &mut ViewContext<ChatPanel>,
-//     ) -> Task<Result<()>> {
-//         let open_chat = self
-//             .active_chat
-//             .as_ref()
-//             .and_then(|(chat, _)| {
-//                 (chat.read(cx).channel_id == selected_channel_id)
-//                     .then(|| Task::ready(anyhow::Ok(chat.clone())))
-//             })
-//             .unwrap_or_else(|| {
-//                 self.channel_store.update(cx, |store, cx| {
-//                     store.open_channel_chat(selected_channel_id, cx)
-//                 })
-//             });
-
-//         cx.spawn(|this, mut cx| async move {
-//             let chat = open_chat.await?;
-//             this.update(&mut cx, |this, cx| {
-//                 this.set_active_chat(chat.clone(), cx);
-//             })?;
-
-//             if let Some(message_id) = scroll_to_message_id {
-//                 if let Some(item_ix) =
-//                     ChannelChat::load_history_since_message(chat.clone(), message_id, cx.clone())
-//                         .await
-//                 {
-//                     this.update(&mut cx, |this, cx| {
-//                         if this.active_chat.as_ref().map_or(false, |(c, _)| *c == chat) {
-//                             this.message_list.scroll_to(ListOffset {
-//                                 item_ix,
-//                                 offset_in_item: 0.,
-//                             });
-//                             cx.notify();
-//                         }
-//                     })?;
-//                 }
-//             }
-
-//             Ok(())
-//         })
-//     }
-
-//     fn open_notes(&mut self, _: &OpenChannelNotes, cx: &mut ViewContext<Self>) {
-//         if let Some((chat, _)) = &self.active_chat {
-//             let channel_id = chat.read(cx).channel_id;
-//             if let Some(workspace) = self.workspace.upgrade(cx) {
-//                 ChannelView::open(channel_id, workspace, cx).detach();
-//             }
-//         }
-//     }
-
-//     fn join_call(&mut self, _: &JoinCall, cx: &mut ViewContext<Self>) {
-//         if let Some((chat, _)) = &self.active_chat {
-//             let channel_id = chat.read(cx).channel_id;
-//             ActiveCall::global(cx)
-//                 .update(cx, |call, cx| call.join_channel(channel_id, cx))
-//                 .detach_and_log_err(cx);
-//         }
-//     }
-// }
-
-// fn render_remove(
-//     message_id_to_remove: Option<u64>,
-//     cx: &mut ViewContext<'_, '_, ChatPanel>,
-//     theme: &Arc<Theme>,
-// ) -> AnyElement<ChatPanel> {
-//     enum DeleteMessage {}
-
-//     message_id_to_remove
-//         .map(|id| {
-//             MouseEventHandler::new::<DeleteMessage, _>(id as usize, cx, |mouse_state, _| {
-//                 let button_style = theme.chat_panel.icon_button.style_for(mouse_state);
-//                 render_icon_button(button_style, "icons/x.svg")
-//                     .aligned()
-//                     .into_any()
-//             })
-//             .with_padding(Padding::uniform(2.))
-//             .with_cursor_style(CursorStyle::PointingHand)
-//             .on_click(MouseButton::Left, move |_, this, cx| {
-//                 this.remove_message(id, cx);
-//             })
-//             .flex_float()
-//             .into_any()
-//         })
-//         .unwrap_or_else(|| {
-//             let style = theme.chat_panel.icon_button.default;
-
-//             Empty::new()
-//                 .constrained()
-//                 .with_width(style.icon_width)
-//                 .aligned()
-//                 .constrained()
-//                 .with_width(style.button_width)
-//                 .with_height(style.button_width)
-//                 .contained()
-//                 .with_uniform_padding(2.)
-//                 .flex_float()
-//                 .into_any()
-//         })
-// }
-
-// impl Entity for ChatPanel {
-//     type Event = Event;
-// }
-
-// impl View for ChatPanel {
-//     fn ui_name() -> &'static str {
-//         "ChatPanel"
-//     }
-
-//     fn render(&mut self, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
-//         let theme = theme::current(cx);
-//         let element = if self.client.user_id().is_some() {
-//             self.render_channel(cx)
-//         } else {
-//             self.render_sign_in_prompt(&theme, cx)
-//         };
-//         element
-//             .contained()
-//             .with_style(theme.chat_panel.container)
-//             .constrained()
-//             .with_min_width(150.)
-//             .into_any()
-//     }
-
-//     fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext<Self>) {
-//         self.has_focus = true;
-//         if matches!(
-//             *self.client.status().borrow(),
-//             client::Status::Connected { .. }
-//         ) {
-//             let editor = self.input_editor.read(cx).editor.clone();
-//             cx.focus(&editor);
-//         }
-//     }
-
-//     fn focus_out(&mut self, _: AnyViewHandle, _: &mut ViewContext<Self>) {
-//         self.has_focus = false;
-//     }
-// }
-
-// impl Panel for ChatPanel {
-//     fn position(&self, cx: &gpui::WindowContext) -> DockPosition {
-//         settings::get::<ChatPanelSettings>(cx).dock
-//     }
-
-//     fn position_is_valid(&self, position: DockPosition) -> bool {
-//         matches!(position, DockPosition::Left | DockPosition::Right)
-//     }
-
-//     fn set_position(&mut self, position: DockPosition, cx: &mut ViewContext<Self>) {
-//         settings::update_settings_file::<ChatPanelSettings>(self.fs.clone(), cx, move |settings| {
-//             settings.dock = Some(position)
-//         });
-//     }
-
-//     fn size(&self, cx: &gpui::WindowContext) -> f32 {
-//         self.width
-//             .unwrap_or_else(|| settings::get::<ChatPanelSettings>(cx).default_width)
-//     }
-
-//     fn set_size(&mut self, size: Option<f32>, cx: &mut ViewContext<Self>) {
-//         self.width = size;
-//         self.serialize(cx);
-//         cx.notify();
-//     }
-
-//     fn set_active(&mut self, active: bool, cx: &mut ViewContext<Self>) {
-//         self.active = active;
-//         if active {
-//             self.acknowledge_last_message(cx);
-//             if !is_channels_feature_enabled(cx) {
-//                 cx.emit(Event::Dismissed);
-//             }
-//         }
-//     }
-
-//     fn icon_path(&self, cx: &gpui::WindowContext) -> Option<&'static str> {
-//         (settings::get::<ChatPanelSettings>(cx).button && is_channels_feature_enabled(cx))
-//             .then(|| "icons/conversations.svg")
-//     }
-
-//     fn icon_tooltip(&self) -> (String, Option<Box<dyn gpui::Action>>) {
-//         ("Chat Panel".to_string(), Some(Box::new(ToggleFocus)))
-//     }
-
-//     fn should_change_position_on_event(event: &Self::Event) -> bool {
-//         matches!(event, Event::DockPositionChanged)
-//     }
-
-//     fn should_close_on_event(event: &Self::Event) -> bool {
-//         matches!(event, Event::Dismissed)
-//     }
-
-//     fn has_focus(&self, _cx: &gpui::WindowContext) -> bool {
-//         self.has_focus
-//     }
-
-//     fn is_focus_event(event: &Self::Event) -> bool {
-//         matches!(event, Event::Focus)
-//     }
-// }
-
-// fn format_timestamp(
-//     mut timestamp: OffsetDateTime,
-//     mut now: OffsetDateTime,
-//     local_timezone: UtcOffset,
-// ) -> String {
-//     timestamp = timestamp.to_offset(local_timezone);
-//     now = now.to_offset(local_timezone);
-
-//     let today = now.date();
-//     let date = timestamp.date();
-//     let mut hour = timestamp.hour();
-//     let mut part = "am";
-//     if hour > 12 {
-//         hour -= 12;
-//         part = "pm";
-//     }
-//     if date == today {
-//         format!("{:02}:{:02}{}", hour, timestamp.minute(), part)
-//     } else if date.next_day() == Some(today) {
-//         format!("yesterday at {:02}:{:02}{}", hour, timestamp.minute(), part)
-//     } else {
-//         format!("{:02}/{}/{}", date.month() as u32, date.day(), date.year())
-//     }
-// }
-
-// fn render_icon_button<V: View>(style: &IconButton, svg_path: &'static str) -> impl Element<V> {
-//     Svg::new(svg_path)
-//         .with_color(style.color)
-//         .constrained()
-//         .with_width(style.icon_width)
-//         .aligned()
-//         .constrained()
-//         .with_width(style.button_width)
-//         .with_height(style.button_width)
-//         .contained()
-//         .with_style(style.container)
-// }
-
-// #[cfg(test)]
-// mod tests {
-//     use super::*;
-//     use gpui::fonts::HighlightStyle;
-//     use pretty_assertions::assert_eq;
-//     use rich_text::{BackgroundKind, Highlight, RenderedRegion};
-//     use util::test::marked_text_ranges;
-
-//     #[gpui::test]
-//     fn test_render_markdown_with_mentions() {
-//         let language_registry = Arc::new(LanguageRegistry::test());
-//         let (body, ranges) = marked_text_ranges("*hi*, «@abc», let's **call** «@fgh»", false);
-//         let message = channel::ChannelMessage {
-//             id: ChannelMessageId::Saved(0),
-//             body,
-//             timestamp: OffsetDateTime::now_utc(),
-//             sender: Arc::new(client::User {
-//                 github_login: "fgh".into(),
-//                 avatar: None,
-//                 id: 103,
-//             }),
-//             nonce: 5,
-//             mentions: vec![(ranges[0].clone(), 101), (ranges[1].clone(), 102)],
-//         };
-
-//         let message = ChatPanel::render_markdown_with_mentions(&language_registry, 102, &message);
-
-//         // Note that the "'" was replaced with ’ due to smart punctuation.
-//         let (body, ranges) = marked_text_ranges("«hi», «@abc», let’s «call» «@fgh»", false);
-//         assert_eq!(message.text, body);
-//         assert_eq!(
-//             message.highlights,
-//             vec![
-//                 (
-//                     ranges[0].clone(),
-//                     HighlightStyle {
-//                         italic: Some(true),
-//                         ..Default::default()
-//                     }
-//                     .into()
-//                 ),
-//                 (ranges[1].clone(), Highlight::Mention),
-//                 (
-//                     ranges[2].clone(),
-//                     HighlightStyle {
-//                         weight: Some(gpui::fonts::Weight::BOLD),
-//                         ..Default::default()
-//                     }
-//                     .into()
-//                 ),
-//                 (ranges[3].clone(), Highlight::SelfMention)
-//             ]
-//         );
-//         assert_eq!(
-//             message.regions,
-//             vec![
-//                 RenderedRegion {
-//                     background_kind: Some(BackgroundKind::Mention),
-//                     link_url: None
-//                 },
-//                 RenderedRegion {
-//                     background_kind: Some(BackgroundKind::SelfMention),
-//                     link_url: None
-//                 },
-//             ]
-//         );
-//     }
-// }
+use crate::{channel_view::ChannelView, is_channels_feature_enabled, ChatPanelSettings};
+use anyhow::Result;
+use call::ActiveCall;
+use channel::{ChannelChat, ChannelChatEvent, ChannelMessageId, ChannelStore};
+use client::Client;
+use collections::HashMap;
+use db::kvp::KEY_VALUE_STORE;
+use editor::Editor;
+use gpui::{
+    actions, div, list, prelude::*, px, serde_json, AnyElement, AppContext, AsyncWindowContext,
+    ClickEvent, Div, ElementId, EventEmitter, FocusableView, ListOffset, ListScrollEvent,
+    ListState, Model, Render, Subscription, Task, View, ViewContext, VisualContext, WeakView,
+};
+use language::LanguageRegistry;
+use menu::Confirm;
+use message_editor::MessageEditor;
+use project::Fs;
+use rich_text::RichText;
+use serde::{Deserialize, Serialize};
+use settings::{Settings, SettingsStore};
+use std::sync::Arc;
+use theme::ActiveTheme as _;
+use time::{OffsetDateTime, UtcOffset};
+use ui::{
+    h_stack, prelude::WindowContext, v_stack, Avatar, Button, ButtonCommon as _, Clickable, Icon,
+    IconButton, Label, Tooltip,
+};
+use util::{ResultExt, TryFutureExt};
+use workspace::{
+    dock::{DockPosition, Panel, PanelEvent},
+    Workspace,
+};
+
+mod message_editor;
+
+const MESSAGE_LOADING_THRESHOLD: usize = 50;
+const CHAT_PANEL_KEY: &'static str = "ChatPanel";
+
+pub fn init(cx: &mut AppContext) {
+    cx.observe_new_views(|workspace: &mut Workspace, _| {
+        workspace.register_action(|workspace, _: &ToggleFocus, cx| {
+            workspace.toggle_panel_focus::<ChatPanel>(cx);
+        });
+    })
+    .detach();
+}
+
+pub struct ChatPanel {
+    client: Arc<Client>,
+    channel_store: Model<ChannelStore>,
+    languages: Arc<LanguageRegistry>,
+    message_list: ListState,
+    active_chat: Option<(Model<ChannelChat>, Subscription)>,
+    input_editor: View<MessageEditor>,
+    local_timezone: UtcOffset,
+    fs: Arc<dyn Fs>,
+    width: Option<f32>,
+    active: bool,
+    pending_serialization: Task<Option<()>>,
+    subscriptions: Vec<gpui::Subscription>,
+    workspace: WeakView<Workspace>,
+    is_scrolled_to_bottom: bool,
+    markdown_data: HashMap<ChannelMessageId, RichText>,
+}
+
+#[derive(Serialize, Deserialize)]
+struct SerializedChatPanel {
+    width: Option<f32>,
+}
+
+#[derive(Debug)]
+pub enum Event {
+    DockPositionChanged,
+    Focus,
+    Dismissed,
+}
+
+actions!(chat_panel, [ToggleFocus]);
+
+impl ChatPanel {
+    pub fn new(workspace: &mut Workspace, cx: &mut ViewContext<Workspace>) -> View<Self> {
+        let fs = workspace.app_state().fs.clone();
+        let client = workspace.app_state().client.clone();
+        let channel_store = ChannelStore::global(cx);
+        let languages = workspace.app_state().languages.clone();
+
+        let input_editor = cx.build_view(|cx| {
+            MessageEditor::new(
+                languages.clone(),
+                channel_store.clone(),
+                cx.build_view(|cx| Editor::auto_height(4, cx)),
+                cx,
+            )
+        });
+
+        let workspace_handle = workspace.weak_handle();
+
+        cx.build_view(|cx| {
+            let view: View<ChatPanel> = cx.view().clone();
+            let message_list =
+                ListState::new(0, gpui::ListAlignment::Bottom, px(1000.), move |ix, cx| {
+                    view.update(cx, |view, cx| view.render_message(ix, cx))
+                });
+
+            message_list.set_scroll_handler(cx.listener(|this, event: &ListScrollEvent, cx| {
+                if event.visible_range.start < MESSAGE_LOADING_THRESHOLD {
+                    this.load_more_messages(cx);
+                }
+                this.is_scrolled_to_bottom = event.visible_range.end == event.count;
+            }));
+
+            let mut this = Self {
+                fs,
+                client,
+                channel_store,
+                languages,
+                message_list,
+                active_chat: Default::default(),
+                pending_serialization: Task::ready(None),
+                input_editor,
+                local_timezone: cx.local_timezone(),
+                subscriptions: Vec::new(),
+                workspace: workspace_handle,
+                is_scrolled_to_bottom: true,
+                active: false,
+                width: None,
+                markdown_data: Default::default(),
+            };
+
+            let mut old_dock_position = this.position(cx);
+            this.subscriptions.push(cx.observe_global::<SettingsStore>(
+                move |this: &mut Self, cx| {
+                    let new_dock_position = this.position(cx);
+                    if new_dock_position != old_dock_position {
+                        old_dock_position = new_dock_position;
+                        cx.emit(Event::DockPositionChanged);
+                    }
+                    cx.notify();
+                },
+            ));
+
+            this
+        })
+    }
+
+    pub fn is_scrolled_to_bottom(&self) -> bool {
+        self.is_scrolled_to_bottom
+    }
+
+    pub fn active_chat(&self) -> Option<Model<ChannelChat>> {
+        self.active_chat.as_ref().map(|(chat, _)| chat.clone())
+    }
+
+    pub fn load(
+        workspace: WeakView<Workspace>,
+        cx: AsyncWindowContext,
+    ) -> Task<Result<View<Self>>> {
+        cx.spawn(|mut cx| async move {
+            let serialized_panel = if let Some(panel) = cx
+                .background_executor()
+                .spawn(async move { KEY_VALUE_STORE.read_kvp(CHAT_PANEL_KEY) })
+                .await
+                .log_err()
+                .flatten()
+            {
+                Some(serde_json::from_str::<SerializedChatPanel>(&panel)?)
+            } else {
+                None
+            };
+
+            workspace.update(&mut cx, |workspace, cx| {
+                let panel = Self::new(workspace, cx);
+                if let Some(serialized_panel) = serialized_panel {
+                    panel.update(cx, |panel, cx| {
+                        panel.width = serialized_panel.width;
+                        cx.notify();
+                    });
+                }
+                panel
+            })
+        })
+    }
+
+    fn serialize(&mut self, cx: &mut ViewContext<Self>) {
+        let width = self.width;
+        self.pending_serialization = cx.background_executor().spawn(
+            async move {
+                KEY_VALUE_STORE
+                    .write_kvp(
+                        CHAT_PANEL_KEY.into(),
+                        serde_json::to_string(&SerializedChatPanel { width })?,
+                    )
+                    .await?;
+                anyhow::Ok(())
+            }
+            .log_err(),
+        );
+    }
+
+    fn set_active_chat(&mut self, chat: Model<ChannelChat>, cx: &mut ViewContext<Self>) {
+        if self.active_chat.as_ref().map(|e| &e.0) != Some(&chat) {
+            let channel_id = chat.read(cx).channel_id;
+            {
+                self.markdown_data.clear();
+                let chat = chat.read(cx);
+                self.message_list.reset(chat.message_count());
+
+                let channel_name = chat.channel(cx).map(|channel| channel.name.clone());
+                self.input_editor.update(cx, |editor, cx| {
+                    editor.set_channel(channel_id, channel_name, cx);
+                });
+            };
+            let subscription = cx.subscribe(&chat, Self::channel_did_change);
+            self.active_chat = Some((chat, subscription));
+            self.acknowledge_last_message(cx);
+            cx.notify();
+        }
+    }
+
+    fn channel_did_change(
+        &mut self,
+        _: Model<ChannelChat>,
+        event: &ChannelChatEvent,
+        cx: &mut ViewContext<Self>,
+    ) {
+        match event {
+            ChannelChatEvent::MessagesUpdated {
+                old_range,
+                new_count,
+            } => {
+                self.message_list.splice(old_range.clone(), *new_count);
+                if self.active {
+                    self.acknowledge_last_message(cx);
+                }
+            }
+            ChannelChatEvent::NewMessage {
+                channel_id,
+                message_id,
+            } => {
+                if !self.active {
+                    self.channel_store.update(cx, |store, cx| {
+                        store.new_message(*channel_id, *message_id, cx)
+                    })
+                }
+            }
+        }
+        cx.notify();
+    }
+
+    fn acknowledge_last_message(&mut self, cx: &mut ViewContext<Self>) {
+        if self.active && self.is_scrolled_to_bottom {
+            if let Some((chat, _)) = &self.active_chat {
+                chat.update(cx, |chat, cx| {
+                    chat.acknowledge_last_message(cx);
+                });
+            }
+        }
+    }
+
+    fn render_channel(&self, cx: &mut ViewContext<Self>) -> AnyElement {
+        v_stack()
+            .full()
+            .on_action(cx.listener(Self::send))
+            .child(
+                h_stack()
+                    .w_full()
+                    .h_7()
+                    .justify_between()
+                    .z_index(1)
+                    .bg(cx.theme().colors().background)
+                    .child(Label::new(
+                        self.active_chat
+                            .as_ref()
+                            .and_then(|c| Some(format!("#{}", c.0.read(cx).channel(cx)?.name)))
+                            .unwrap_or_default(),
+                    ))
+                    .child(
+                        h_stack()
+                            .child(
+                                IconButton::new("notes", Icon::File)
+                                    .on_click(cx.listener(Self::open_notes))
+                                    .tooltip(|cx| Tooltip::text("Open notes", cx)),
+                            )
+                            .child(
+                                IconButton::new("call", Icon::AudioOn)
+                                    .on_click(cx.listener(Self::join_call))
+                                    .tooltip(|cx| Tooltip::text("Join call", cx)),
+                            ),
+                    ),
+            )
+            .child(div().grow().child(self.render_active_channel_messages(cx)))
+            .child(
+                div()
+                    .z_index(1)
+                    .p_2()
+                    .bg(cx.theme().colors().background)
+                    .child(self.input_editor.clone()),
+            )
+            .into_any()
+    }
+
+    fn render_active_channel_messages(&self, _cx: &mut ViewContext<Self>) -> AnyElement {
+        if self.active_chat.is_some() {
+            list(self.message_list.clone()).full().into_any_element()
+        } else {
+            div().into_any_element()
+        }
+    }
+
+    fn render_message(&mut self, ix: usize, cx: &mut ViewContext<Self>) -> AnyElement {
+        let active_chat = &self.active_chat.as_ref().unwrap().0;
+        let (message, is_continuation, is_admin) = active_chat.update(cx, |active_chat, cx| {
+            let is_admin = self
+                .channel_store
+                .read(cx)
+                .is_channel_admin(active_chat.channel_id);
+
+            let last_message = active_chat.message(ix.saturating_sub(1));
+            let this_message = active_chat.message(ix).clone();
+            let is_continuation = last_message.id != this_message.id
+                && this_message.sender.id == last_message.sender.id;
+
+            if let ChannelMessageId::Saved(id) = this_message.id {
+                if this_message
+                    .mentions
+                    .iter()
+                    .any(|(_, user_id)| Some(*user_id) == self.client.user_id())
+                {
+                    active_chat.acknowledge_message(id);
+                }
+            }
+
+            (this_message, is_continuation, is_admin)
+        });
+
+        let _is_pending = message.is_pending();
+        let text = self.markdown_data.entry(message.id).or_insert_with(|| {
+            Self::render_markdown_with_mentions(&self.languages, self.client.id(), &message)
+        });
+
+        let now = OffsetDateTime::now_utc();
+
+        let belongs_to_user = Some(message.sender.id) == self.client.user_id();
+        let message_id_to_remove = if let (ChannelMessageId::Saved(id), true) =
+            (message.id, belongs_to_user || is_admin)
+        {
+            Some(id)
+        } else {
+            None
+        };
+
+        let element_id: ElementId = match message.id {
+            ChannelMessageId::Saved(id) => ("saved-message", id).into(),
+            ChannelMessageId::Pending(id) => ("pending-message", id).into(),
+        };
+
+        let mut result = v_stack()
+            .w_full()
+            .id(element_id)
+            .relative()
+            .group("")
+            .mb_1();
+
+        if !is_continuation {
+            result = result.child(
+                h_stack()
+                    .children(
+                        message
+                            .sender
+                            .avatar
+                            .clone()
+                            .map(|avatar| Avatar::data(avatar)),
+                    )
+                    .child(Label::new(message.sender.github_login.clone()))
+                    .child(Label::new(format_timestamp(
+                        message.timestamp,
+                        now,
+                        self.local_timezone,
+                    ))),
+            );
+        }
+
+        result
+            .child(text.element("body".into(), cx))
+            .child(
+                div()
+                    .invisible()
+                    .absolute()
+                    .top_1()
+                    .right_2()
+                    .w_8()
+                    .group_hover("", |this| this.visible())
+                    .child(render_remove(message_id_to_remove, cx)),
+            )
+            .into_any()
+    }
+
+    fn render_markdown_with_mentions(
+        language_registry: &Arc<LanguageRegistry>,
+        current_user_id: u64,
+        message: &channel::ChannelMessage,
+    ) -> RichText {
+        let mentions = message
+            .mentions
+            .iter()
+            .map(|(range, user_id)| rich_text::Mention {
+                range: range.clone(),
+                is_self_mention: *user_id == current_user_id,
+            })
+            .collect::<Vec<_>>();
+
+        rich_text::render_markdown(message.body.clone(), &mentions, language_registry, None)
+    }
+
+    fn render_sign_in_prompt(&self, cx: &mut ViewContext<Self>) -> AnyElement {
+        Button::new("sign-in", "Sign in to use chat")
+            .on_click(cx.listener(move |this, _, cx| {
+                let client = this.client.clone();
+                cx.spawn(|this, mut cx| async move {
+                    if client
+                        .authenticate_and_connect(true, &cx)
+                        .log_err()
+                        .await
+                        .is_some()
+                    {
+                        this.update(&mut cx, |_, cx| {
+                            cx.focus_self();
+                        })
+                        .ok();
+                    }
+                })
+                .detach();
+            }))
+            .into_any_element()
+    }
+
+    fn send(&mut self, _: &Confirm, cx: &mut ViewContext<Self>) {
+        if let Some((chat, _)) = self.active_chat.as_ref() {
+            let message = self
+                .input_editor
+                .update(cx, |editor, cx| editor.take_message(cx));
+
+            if let Some(task) = chat
+                .update(cx, |chat, cx| chat.send_message(message, cx))
+                .log_err()
+            {
+                task.detach();
+            }
+        }
+    }
+
+    fn remove_message(&mut self, id: u64, cx: &mut ViewContext<Self>) {
+        if let Some((chat, _)) = self.active_chat.as_ref() {
+            chat.update(cx, |chat, cx| chat.remove_message(id, cx).detach())
+        }
+    }
+
+    fn load_more_messages(&mut self, cx: &mut ViewContext<Self>) {
+        if let Some((chat, _)) = self.active_chat.as_ref() {
+            chat.update(cx, |channel, cx| {
+                if let Some(task) = channel.load_more_messages(cx) {
+                    task.detach();
+                }
+            })
+        }
+    }
+
+    pub fn select_channel(
+        &mut self,
+        selected_channel_id: u64,
+        scroll_to_message_id: Option<u64>,
+        cx: &mut ViewContext<ChatPanel>,
+    ) -> Task<Result<()>> {
+        let open_chat = self
+            .active_chat
+            .as_ref()
+            .and_then(|(chat, _)| {
+                (chat.read(cx).channel_id == selected_channel_id)
+                    .then(|| Task::ready(anyhow::Ok(chat.clone())))
+            })
+            .unwrap_or_else(|| {
+                self.channel_store.update(cx, |store, cx| {
+                    store.open_channel_chat(selected_channel_id, cx)
+                })
+            });
+
+        cx.spawn(|this, mut cx| async move {
+            let chat = open_chat.await?;
+            this.update(&mut cx, |this, cx| {
+                this.set_active_chat(chat.clone(), cx);
+            })?;
+
+            if let Some(message_id) = scroll_to_message_id {
+                if let Some(item_ix) =
+                    ChannelChat::load_history_since_message(chat.clone(), message_id, (*cx).clone())
+                        .await
+                {
+                    this.update(&mut cx, |this, cx| {
+                        if this.active_chat.as_ref().map_or(false, |(c, _)| *c == chat) {
+                            this.message_list.scroll_to(ListOffset {
+                                item_ix,
+                                offset_in_item: px(0.0),
+                            });
+                            cx.notify();
+                        }
+                    })?;
+                }
+            }
+
+            Ok(())
+        })
+    }
+
+    fn open_notes(&mut self, _: &ClickEvent, cx: &mut ViewContext<Self>) {
+        if let Some((chat, _)) = &self.active_chat {
+            let channel_id = chat.read(cx).channel_id;
+            if let Some(workspace) = self.workspace.upgrade() {
+                ChannelView::open(channel_id, workspace, cx).detach();
+            }
+        }
+    }
+
+    fn join_call(&mut self, _: &ClickEvent, cx: &mut ViewContext<Self>) {
+        if let Some((chat, _)) = &self.active_chat {
+            let channel_id = chat.read(cx).channel_id;
+            ActiveCall::global(cx)
+                .update(cx, |call, cx| call.join_channel(channel_id, cx))
+                .detach_and_log_err(cx);
+        }
+    }
+}
+
+fn render_remove(message_id_to_remove: Option<u64>, cx: &mut ViewContext<ChatPanel>) -> AnyElement {
+    if let Some(message_id) = message_id_to_remove {
+        IconButton::new(("remove", message_id), Icon::XCircle)
+            .on_click(cx.listener(move |this, _, cx| {
+                this.remove_message(message_id, cx);
+            }))
+            .into_any_element()
+    } else {
+        div().into_any_element()
+    }
+}
+
+impl EventEmitter<Event> for ChatPanel {}
+
+impl Render for ChatPanel {
+    type Element = Div;
+
+    fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
+        div()
+            .full()
+            .child(if self.client.user_id().is_some() {
+                self.render_channel(cx)
+            } else {
+                self.render_sign_in_prompt(cx)
+            })
+            .min_w(px(150.))
+    }
+}
+
+impl FocusableView for ChatPanel {
+    fn focus_handle(&self, cx: &AppContext) -> gpui::FocusHandle {
+        self.input_editor.read(cx).focus_handle(cx)
+    }
+}
+
+impl Panel for ChatPanel {
+    fn position(&self, cx: &gpui::WindowContext) -> DockPosition {
+        ChatPanelSettings::get_global(cx).dock
+    }
+
+    fn position_is_valid(&self, position: DockPosition) -> bool {
+        matches!(position, DockPosition::Left | DockPosition::Right)
+    }
+
+    fn set_position(&mut self, position: DockPosition, cx: &mut ViewContext<Self>) {
+        settings::update_settings_file::<ChatPanelSettings>(self.fs.clone(), cx, move |settings| {
+            settings.dock = Some(position)
+        });
+    }
+
+    fn size(&self, cx: &gpui::WindowContext) -> f32 {
+        self.width
+            .unwrap_or_else(|| ChatPanelSettings::get_global(cx).default_width)
+    }
+
+    fn set_size(&mut self, size: Option<f32>, cx: &mut ViewContext<Self>) {
+        self.width = size;
+        self.serialize(cx);
+        cx.notify();
+    }
+
+    fn set_active(&mut self, active: bool, cx: &mut ViewContext<Self>) {
+        self.active = active;
+        if active {
+            self.acknowledge_last_message(cx);
+            if !is_channels_feature_enabled(cx) {
+                cx.emit(Event::Dismissed);
+            }
+        }
+    }
+
+    fn persistent_name() -> &'static str {
+        "ChatPanel"
+    }
+
+    fn icon(&self, _cx: &WindowContext) -> Option<ui::Icon> {
+        Some(ui::Icon::MessageBubbles)
+    }
+
+    fn toggle_action(&self) -> Box<dyn gpui::Action> {
+        Box::new(ToggleFocus)
+    }
+}
+
+impl EventEmitter<PanelEvent> for ChatPanel {}
+
+fn format_timestamp(
+    mut timestamp: OffsetDateTime,
+    mut now: OffsetDateTime,
+    local_timezone: UtcOffset,
+) -> String {
+    timestamp = timestamp.to_offset(local_timezone);
+    now = now.to_offset(local_timezone);
+
+    let today = now.date();
+    let date = timestamp.date();
+    let mut hour = timestamp.hour();
+    let mut part = "am";
+    if hour > 12 {
+        hour -= 12;
+        part = "pm";
+    }
+    if date == today {
+        format!("{:02}:{:02}{}", hour, timestamp.minute(), part)
+    } else if date.next_day() == Some(today) {
+        format!("yesterday at {:02}:{:02}{}", hour, timestamp.minute(), part)
+    } else {
+        format!("{:02}/{}/{}", date.month() as u32, date.day(), date.year())
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use gpui::HighlightStyle;
+    use pretty_assertions::assert_eq;
+    use rich_text::Highlight;
+    use util::test::marked_text_ranges;
+
+    #[gpui::test]
+    fn test_render_markdown_with_mentions() {
+        let language_registry = Arc::new(LanguageRegistry::test());
+        let (body, ranges) = marked_text_ranges("*hi*, «@abc», let's **call** «@fgh»", false);
+        let message = channel::ChannelMessage {
+            id: ChannelMessageId::Saved(0),
+            body,
+            timestamp: OffsetDateTime::now_utc(),
+            sender: Arc::new(client::User {
+                github_login: "fgh".into(),
+                avatar: None,
+                id: 103,
+            }),
+            nonce: 5,
+            mentions: vec![(ranges[0].clone(), 101), (ranges[1].clone(), 102)],
+        };
+
+        let message = ChatPanel::render_markdown_with_mentions(&language_registry, 102, &message);
+
+        // Note that the "'" was replaced with ’ due to smart punctuation.
+        let (body, ranges) = marked_text_ranges("«hi», «@abc», let’s «call» «@fgh»", false);
+        assert_eq!(message.text, body);
+        assert_eq!(
+            message.highlights,
+            vec![
+                (
+                    ranges[0].clone(),
+                    HighlightStyle {
+                        font_style: Some(gpui::FontStyle::Italic),
+                        ..Default::default()
+                    }
+                    .into()
+                ),
+                (ranges[1].clone(), Highlight::Mention),
+                (
+                    ranges[2].clone(),
+                    HighlightStyle {
+                        font_weight: Some(gpui::FontWeight::BOLD),
+                        ..Default::default()
+                    }
+                    .into()
+                ),
+                (ranges[3].clone(), Highlight::SelfMention)
+            ]
+        );
+    }
+}

crates/collab_ui2/src/chat_panel/message_editor.rs 🔗

@@ -3,13 +3,14 @@ use client::UserId;
 use collections::HashMap;
 use editor::{AnchorRangeExt, Editor};
 use gpui::{
-    elements::ChildView, AnyElement, AsyncAppContext, Element, Entity, ModelHandle, Task, View,
-    ViewContext, ViewHandle, WeakViewHandle,
+    AnyView, AsyncWindowContext, FocusableView, Model, Render, SharedString, Task, View,
+    ViewContext, WeakView,
 };
 use language::{language_settings::SoftWrap, Buffer, BufferSnapshot, LanguageRegistry};
 use lazy_static::lazy_static;
 use project::search::SearchQuery;
 use std::{sync::Arc, time::Duration};
+use workspace::item::ItemHandle;
 
 const MENTIONS_DEBOUNCE_INTERVAL: Duration = Duration::from_millis(50);
 
@@ -19,8 +20,8 @@ lazy_static! {
 }
 
 pub struct MessageEditor {
-    pub editor: ViewHandle<Editor>,
-    channel_store: ModelHandle<ChannelStore>,
+    pub editor: View<Editor>,
+    channel_store: Model<ChannelStore>,
     users: HashMap<String, UserId>,
     mentions: Vec<UserId>,
     mentions_task: Option<Task<()>>,
@@ -30,8 +31,8 @@ pub struct MessageEditor {
 impl MessageEditor {
     pub fn new(
         language_registry: Arc<LanguageRegistry>,
-        channel_store: ModelHandle<ChannelStore>,
-        editor: ViewHandle<Editor>,
+        channel_store: Model<ChannelStore>,
+        editor: View<Editor>,
         cx: &mut ViewContext<Self>,
     ) -> Self {
         editor.update(cx, |editor, cx| {
@@ -48,15 +49,13 @@ impl MessageEditor {
         cx.subscribe(&buffer, Self::on_buffer_event).detach();
 
         let markdown = language_registry.language_for_name("Markdown");
-        cx.app_context()
-            .spawn(|mut cx| async move {
-                let markdown = markdown.await?;
-                buffer.update(&mut cx, |buffer, cx| {
-                    buffer.set_language(Some(markdown), cx)
-                });
-                anyhow::Ok(())
+        cx.spawn(|_, mut cx| async move {
+            let markdown = markdown.await?;
+            buffer.update(&mut cx, |buffer, cx| {
+                buffer.set_language(Some(markdown), cx)
             })
-            .detach_and_log_err(cx);
+        })
+        .detach_and_log_err(cx);
 
         Self {
             editor,
@@ -71,7 +70,7 @@ impl MessageEditor {
     pub fn set_channel(
         &mut self,
         channel_id: u64,
-        channel_name: Option<String>,
+        channel_name: Option<SharedString>,
         cx: &mut ViewContext<Self>,
     ) {
         self.editor.update(cx, |editor, cx| {
@@ -132,26 +131,28 @@ impl MessageEditor {
 
     fn on_buffer_event(
         &mut self,
-        buffer: ModelHandle<Buffer>,
+        buffer: Model<Buffer>,
         event: &language::Event,
         cx: &mut ViewContext<Self>,
     ) {
         if let language::Event::Reparsed | language::Event::Edited = event {
             let buffer = buffer.read(cx).snapshot();
             self.mentions_task = Some(cx.spawn(|this, cx| async move {
-                cx.background().timer(MENTIONS_DEBOUNCE_INTERVAL).await;
+                cx.background_executor()
+                    .timer(MENTIONS_DEBOUNCE_INTERVAL)
+                    .await;
                 Self::find_mentions(this, buffer, cx).await;
             }));
         }
     }
 
     async fn find_mentions(
-        this: WeakViewHandle<MessageEditor>,
+        this: WeakView<MessageEditor>,
         buffer: BufferSnapshot,
-        mut cx: AsyncAppContext,
+        mut cx: AsyncWindowContext,
     ) {
         let (buffer, ranges) = cx
-            .background()
+            .background_executor()
             .spawn(async move {
                 let ranges = MENTIONS_SEARCH.search(&buffer, None).await;
                 (buffer, ranges)
@@ -180,11 +181,7 @@ impl MessageEditor {
                 }
 
                 editor.clear_highlights::<Self>(cx);
-                editor.highlight_text::<Self>(
-                    anchor_ranges,
-                    theme::current(cx).chat_panel.rich_text.mention_highlight,
-                    cx,
-                )
+                editor.highlight_text::<Self>(anchor_ranges, gpui::red().into(), cx)
             });
 
             this.mentions = mentioned_user_ids;
@@ -192,21 +189,17 @@ impl MessageEditor {
         })
         .ok();
     }
-}
 
-impl Entity for MessageEditor {
-    type Event = ();
+    pub(crate) fn focus_handle(&self, cx: &gpui::AppContext) -> gpui::FocusHandle {
+        self.editor.read(cx).focus_handle(cx)
+    }
 }
 
-impl View for MessageEditor {
-    fn render(&mut self, cx: &mut ViewContext<'_, '_, Self>) -> AnyElement<Self> {
-        ChildView::new(&self.editor, cx).into_any()
-    }
+impl Render for MessageEditor {
+    type Element = AnyView;
 
-    fn focus_in(&mut self, _: gpui::AnyViewHandle, cx: &mut ViewContext<Self>) {
-        if cx.is_self_focused() {
-            cx.focus(&self.editor);
-        }
+    fn render(&mut self, _cx: &mut ViewContext<Self>) -> Self::Element {
+        self.editor.to_any()
     }
 }
 
@@ -214,7 +207,7 @@ impl View for MessageEditor {
 mod tests {
     use super::*;
     use client::{Client, User, UserStore};
-    use gpui::{TestAppContext, WindowHandle};
+    use gpui::{Context as _, TestAppContext, VisualContext as _};
     use language::{Language, LanguageConfig};
     use rpc::proto;
     use settings::SettingsStore;
@@ -222,8 +215,17 @@ mod tests {
 
     #[gpui::test]
     async fn test_message_editor(cx: &mut TestAppContext) {
-        let editor = init_test(cx);
-        let editor = editor.root(cx);
+        let language_registry = init_test(cx);
+
+        let (editor, cx) = cx.add_window_view(|cx| {
+            MessageEditor::new(
+                language_registry,
+                ChannelStore::global(cx),
+                cx.build_view(|cx| Editor::auto_height(4, cx)),
+                cx,
+            )
+        });
+        cx.executor().run_until_parked();
 
         editor.update(cx, |editor, cx| {
             editor.set_members(
@@ -255,7 +257,7 @@ mod tests {
             });
         });
 
-        cx.foreground().advance_clock(MENTIONS_DEBOUNCE_INTERVAL);
+        cx.executor().advance_clock(MENTIONS_DEBOUNCE_INTERVAL);
 
         editor.update(cx, |editor, cx| {
             let (text, ranges) = marked_text_ranges("Hello, «@a-b»! Have you met «@C_D»?", false);
@@ -269,15 +271,14 @@ mod tests {
         });
     }
 
-    fn init_test(cx: &mut TestAppContext) -> WindowHandle<MessageEditor> {
-        cx.foreground().forbid_parking();
-
+    fn init_test(cx: &mut TestAppContext) -> Arc<LanguageRegistry> {
         cx.update(|cx| {
             let http = FakeHttpClient::with_404_response();
             let client = Client::new(http.clone(), cx);
-            let user_store = cx.add_model(|cx| UserStore::new(client.clone(), http, cx));
-            cx.set_global(SettingsStore::test(cx));
-            theme::init((), cx);
+            let user_store = cx.build_model(|cx| UserStore::new(client.clone(), http, cx));
+            let settings = SettingsStore::test(cx);
+            cx.set_global(settings);
+            theme::init(theme::LoadThemes::JustBase, cx);
             language::init(cx);
             editor::init(cx);
             client::init(&client, cx);
@@ -292,16 +293,6 @@ mod tests {
             },
             Some(tree_sitter_markdown::language()),
         )));
-
-        let editor = cx.add_window(|cx| {
-            MessageEditor::new(
-                language_registry,
-                ChannelStore::global(cx),
-                cx.add_view(|cx| Editor::auto_height(4, None, cx)),
-                cx,
-            )
-        });
-        cx.foreground().run_until_parked();
-        editor
+        language_registry
     }
 }

crates/collab_ui2/src/collab_panel.rs 🔗

@@ -92,7 +92,7 @@ use theme::{ActiveTheme, ThemeSettings};
 //     channel_id: ChannelId,
 // }
 
-#[derive(Action, PartialEq, Debug, Clone, Serialize, Deserialize)]
+#[derive(PartialEq, Debug, Clone, Serialize, Deserialize)]
 pub struct OpenChannelNotes {
     pub channel_id: ChannelId,
 }
@@ -122,15 +122,20 @@ pub struct OpenChannelNotes {
 //     to: ChannelId,
 // }
 
+impl_actions!(collab_panel, [OpenChannelNotes]);
+
 actions!(
-    ToggleFocus,
-    Remove,
-    Secondary,
-    CollapseSelectedChannel,
-    ExpandSelectedChannel,
-    StartMoveChannel,
-    MoveSelected,
-    InsertSpace,
+    collab_panel,
+    [
+        ToggleFocus,
+        Remove,
+        Secondary,
+        CollapseSelectedChannel,
+        ExpandSelectedChannel,
+        StartMoveChannel,
+        MoveSelected,
+        InsertSpace,
+    ]
 );
 
 // impl_actions!(
@@ -169,12 +174,12 @@ use editor::Editor;
 use feature_flags::{ChannelsAlpha, FeatureFlagAppExt, FeatureFlagViewExt};
 use fuzzy::{match_strings, StringMatchCandidate};
 use gpui::{
-    actions, canvas, div, img, overlay, point, prelude::*, px, rems, serde_json, size, Action,
-    AppContext, AsyncWindowContext, Bounds, ClipboardItem, DismissEvent, Div, EventEmitter,
-    FocusHandle, Focusable, FocusableView, Hsla, InteractiveElement, IntoElement, Length, Model,
-    MouseDownEvent, ParentElement, Pixels, Point, PromptLevel, Quad, Render, RenderOnce,
-    ScrollHandle, SharedString, Size, Stateful, Styled, Subscription, Task, View, ViewContext,
-    VisualContext, WeakView,
+    actions, canvas, div, img, impl_actions, overlay, point, prelude::*, px, rems, serde_json,
+    size, Action, AppContext, AsyncWindowContext, Bounds, ClipboardItem, DismissEvent, Div,
+    EventEmitter, FocusHandle, Focusable, FocusableView, Hsla, InteractiveElement, IntoElement,
+    Length, Model, MouseDownEvent, ParentElement, Pixels, Point, PromptLevel, Quad, Render,
+    RenderOnce, ScrollHandle, SharedString, Size, Stateful, Styled, Subscription, Task, View,
+    ViewContext, VisualContext, WeakView,
 };
 use project::{Fs, Project};
 use serde_derive::{Deserialize, Serialize};
@@ -192,6 +197,7 @@ use workspace::{
 };
 
 use crate::channel_view::ChannelView;
+use crate::chat_panel::ChatPanel;
 use crate::{face_pile::FacePile, CollaborationPanelSettings};
 
 use self::channel_modal::ChannelModal;
@@ -852,7 +858,7 @@ impl CollabPanel {
                     .extend(channel_store.ordered_channels().enumerate().map(
                         |(ix, (_, channel))| StringMatchCandidate {
                             id: ix,
-                            string: channel.name.clone(),
+                            string: channel.name.clone().into(),
                             char_bag: channel.name.chars().collect(),
                         },
                     ));
@@ -2102,14 +2108,13 @@ impl CollabPanel {
         };
         cx.window_context().defer(move |cx| {
             workspace.update(cx, |workspace, cx| {
-                todo!();
-                // if let Some(panel) = workspace.focus_panel::<ChatPanel>(cx) {
-                //     panel.update(cx, |panel, cx| {
-                //         panel
-                //             .select_channel(channel_id, None, cx)
-                //             .detach_and_log_err(cx);
-                //     });
-                // }
+                if let Some(panel) = workspace.focus_panel::<ChatPanel>(cx) {
+                    panel.update(cx, |panel, cx| {
+                        panel
+                            .select_channel(channel_id, None, cx)
+                            .detach_and_log_err(cx);
+                    });
+                }
             });
         });
     }
@@ -2262,7 +2267,7 @@ impl CollabPanel {
                         }
                     };
 
-                    Some(channel.name.as_str())
+                    Some(channel.name.as_ref())
                 });
 
                 if let Some(name) = channel_name {
@@ -2603,9 +2608,14 @@ impl CollabPanel {
                                                     Color::Default
                                                 } else {
                                                     Color::Muted
+                                                })
+                                                .on_click(cx.listener(move |this, _, cx| {
+                                                    this.join_channel_chat(channel_id, cx)
+                                                }))
+                                                .tooltip(|cx| {
+                                                    Tooltip::text("Open channel chat", cx)
                                                 }),
-                                            )
-                                            .tooltip(|cx| Tooltip::text("Open channel chat", cx)),
+                                            ),
                                     )
                                     .child(
                                         div()

crates/collab_ui2/src/collab_panel/channel_modal.rs 🔗

@@ -13,12 +13,16 @@ use picker::{Picker, PickerDelegate};
 use std::sync::Arc;
 use ui::prelude::*;
 use util::TryFutureExt;
+use workspace::ModalView;
 
 actions!(
-    SelectNextControl,
-    ToggleMode,
-    ToggleMemberAdmin,
-    RemoveMember
+    channel_modal,
+    [
+        SelectNextControl,
+        ToggleMode,
+        ToggleMemberAdmin,
+        RemoveMember
+    ]
 );
 
 // pub fn init(cx: &mut AppContext) {
@@ -140,6 +144,7 @@ impl ChannelModal {
 }
 
 impl EventEmitter<DismissEvent> for ChannelModal {}
+impl ModalView for ChannelModal {}
 
 impl FocusableView for ChannelModal {
     fn focus_handle(&self, cx: &AppContext) -> gpui::FocusHandle {

crates/collab_ui2/src/collab_panel/contact_finder.rs 🔗

@@ -9,6 +9,7 @@ use std::sync::Arc;
 use theme::ActiveTheme as _;
 use ui::prelude::*;
 use util::{ResultExt as _, TryFutureExt};
+use workspace::ModalView;
 
 pub fn init(cx: &mut AppContext) {
     //Picker::<ContactFinderDelegate>::init(cx);
@@ -95,6 +96,7 @@ pub struct ContactFinderDelegate {
 }
 
 impl EventEmitter<DismissEvent> for ContactFinder {}
+impl ModalView for ContactFinder {}
 
 impl FocusableView for ContactFinder {
     fn focus_handle(&self, cx: &AppContext) -> FocusHandle {

crates/collab_ui2/src/collab_titlebar_item.rs 🔗

@@ -20,11 +20,14 @@ const MAX_PROJECT_NAME_LENGTH: usize = 40;
 const MAX_BRANCH_NAME_LENGTH: usize = 40;
 
 actions!(
-    ShareProject,
-    UnshareProject,
-    ToggleUserMenu,
-    ToggleProjectMenu,
-    SwitchBranch
+    collab,
+    [
+        ShareProject,
+        UnshareProject,
+        ToggleUserMenu,
+        ToggleProjectMenu,
+        SwitchBranch
+    ]
 );
 
 pub fn init(cx: &mut AppContext) {

crates/collab_ui2/src/collab_ui.rs 🔗

@@ -12,6 +12,7 @@ use std::{rc::Rc, sync::Arc};
 use call::{report_call_event_for_room, ActiveCall, Room};
 pub use collab_panel::CollabPanel;
 pub use collab_titlebar_item::CollabTitlebarItem;
+use feature_flags::{ChannelsAlpha, FeatureFlagAppExt};
 use gpui::{
     actions, point, AppContext, GlobalPixels, Pixels, PlatformDisplay, Size, Task, WindowBounds,
     WindowKind, WindowOptions,
@@ -23,7 +24,10 @@ use settings::Settings;
 use util::ResultExt;
 use workspace::AppState;
 
-actions!(ToggleScreenSharing, ToggleMute, ToggleDeafen, LeaveCall);
+actions!(
+    collab,
+    [ToggleScreenSharing, ToggleMute, ToggleDeafen, LeaveCall]
+);
 
 pub fn init(app_state: &Arc<AppState>, cx: &mut AppContext) {
     CollaborationPanelSettings::register(cx);
@@ -34,7 +38,7 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut AppContext) {
     collab_titlebar_item::init(cx);
     collab_panel::init(cx);
     channel_view::init(cx);
-    // chat_panel::init(cx);
+    chat_panel::init(cx);
     notifications::init(&app_state, cx);
 
     // cx.add_global_action(toggle_screen_sharing);
@@ -157,6 +161,6 @@ fn notification_window_options(
 //         .into_any()
 // }
 
-// fn is_channels_feature_enabled(cx: &gpui::WindowContext<'_>) -> bool {
-//     cx.is_staff() || cx.has_flag::<ChannelsAlpha>()
-// }
+fn is_channels_feature_enabled(cx: &gpui::WindowContext<'_>) -> bool {
+    cx.is_staff() || cx.has_flag::<ChannelsAlpha>()
+}

crates/command_palette2/src/command_palette.rs 🔗

@@ -7,7 +7,7 @@ use collections::{CommandPaletteFilter, HashMap};
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
     actions, Action, AppContext, DismissEvent, Div, EventEmitter, FocusHandle, FocusableView,
-    Keystroke, ParentElement, Render, Styled, View, ViewContext, VisualContext, WeakView,
+    ParentElement, Render, Styled, View, ViewContext, VisualContext, WeakView,
 };
 use picker::{Picker, PickerDelegate};
 
@@ -16,16 +16,18 @@ use util::{
     channel::{parse_zed_link, ReleaseChannel, RELEASE_CHANNEL},
     ResultExt,
 };
-use workspace::Workspace;
+use workspace::{ModalView, Workspace};
 use zed_actions::OpenZedURL;
 
-actions!(Toggle);
+actions!(command_palette, [Toggle]);
 
 pub fn init(cx: &mut AppContext) {
     cx.set_global(HitCounts::default());
     cx.observe_new_views(CommandPalette::register).detach();
 }
 
+impl ModalView for CommandPalette {}
+
 pub struct CommandPalette {
     picker: View<Picker<CommandPaletteDelegate>>,
 }
@@ -47,7 +49,7 @@ impl CommandPalette {
             .available_actions()
             .into_iter()
             .filter_map(|action| {
-                let name = gpui::remove_the_2(action.name());
+                let name = action.name();
                 let namespace = name.split("::").next().unwrap_or("malformed action name");
                 if filter.is_some_and(|f| {
                     f.hidden_namespaces.contains(namespace)
@@ -59,7 +61,6 @@ impl CommandPalette {
                 Some(Command {
                     name: humanize_action_name(&name),
                     action,
-                    keystrokes: vec![], // todo!()
                 })
             })
             .collect();
@@ -108,7 +109,6 @@ pub struct CommandPaletteDelegate {
 struct Command {
     name: String,
     action: Box<dyn Action>,
-    keystrokes: Vec<Keystroke>,
 }
 
 impl Clone for Command {
@@ -116,7 +116,6 @@ impl Clone for Command {
         Self {
             name: self.name.clone(),
             action: self.action.boxed_clone(),
-            keystrokes: self.keystrokes.clone(),
         }
     }
 }
@@ -227,6 +226,7 @@ impl PickerDelegate for CommandPaletteDelegate {
                     })
                 }
             }
+
             if let Some(CommandInterceptResult {
                 action,
                 string,
@@ -242,7 +242,6 @@ impl PickerDelegate for CommandPaletteDelegate {
                 commands.push(Command {
                     name: string.clone(),
                     action,
-                    keystrokes: vec![],
                 });
                 matches.insert(
                     0,
@@ -254,6 +253,7 @@ impl PickerDelegate for CommandPaletteDelegate {
                     },
                 )
             }
+
             picker
                 .update(&mut cx, |picker, _| {
                     let delegate = &mut picker.delegate;
@@ -283,6 +283,8 @@ impl PickerDelegate for CommandPaletteDelegate {
         }
         let action_ix = self.matches[self.selected_ix].candidate_id;
         let command = self.commands.swap_remove(action_ix);
+        self.matches.clear();
+        self.commands.clear();
         cx.update_global(|hit_counts: &mut HitCounts, _| {
             *hit_counts.0.entry(command.name).or_default() += 1;
         });
@@ -298,13 +300,8 @@ impl PickerDelegate for CommandPaletteDelegate {
         selected: bool,
         cx: &mut ViewContext<Picker<Self>>,
     ) -> Option<Self::ListItem> {
-        let Some(r#match) = self.matches.get(ix) else {
-            return None;
-        };
-        let Some(command) = self.commands.get(r#match.candidate_id) else {
-            return None;
-        };
-
+        let r#match = self.matches.get(ix)?;
+        let command = self.commands.get(r#match.candidate_id)?;
         Some(
             ListItem::new(ix).inset(true).selected(selected).child(
                 h_stack()
@@ -352,8 +349,7 @@ impl std::fmt::Debug for Command {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         f.debug_struct("Command")
             .field("name", &self.name)
-            .field("keystrokes", &self.keystrokes)
-            .finish()
+            .finish_non_exhaustive()
     }
 }
 

crates/copilot2/src/copilot2.rs 🔗

@@ -34,12 +34,15 @@ use util::{
 };
 
 actions!(
-    Suggest,
-    NextSuggestion,
-    PreviousSuggestion,
-    Reinstall,
-    SignIn,
-    SignOut
+    copilot,
+    [
+        Suggest,
+        NextSuggestion,
+        PreviousSuggestion,
+        Reinstall,
+        SignIn,
+        SignOut
+    ]
 );
 
 pub fn init(

crates/diagnostics2/src/diagnostics.rs 🔗

@@ -43,7 +43,7 @@ use workspace::{
     ItemNavHistory, Pane, ToolbarItemLocation, Workspace,
 };
 
-actions!(Deploy, ToggleWarnings);
+actions!(diagnostics, [Deploy, ToggleWarnings]);
 
 const CONTEXT_LINE_COUNT: u32 = 1;
 

crates/editor2/src/editor.rs 🔗

@@ -39,8 +39,8 @@ use futures::FutureExt;
 use fuzzy::{StringMatch, StringMatchCandidate};
 use git::diff_hunk_to_display;
 use gpui::{
-    actions, div, point, prelude::*, px, relative, rems, size, uniform_list, Action, AnyElement,
-    AppContext, AsyncWindowContext, BackgroundExecutor, Bounds, ClipboardItem, Context,
+    actions, div, impl_actions, point, prelude::*, px, relative, rems, size, uniform_list, Action,
+    AnyElement, AppContext, AsyncWindowContext, BackgroundExecutor, Bounds, ClipboardItem, Context,
     DispatchPhase, Div, ElementId, EventEmitter, FocusHandle, FocusableView, FontFeatures,
     FontStyle, FontWeight, HighlightStyle, Hsla, InputHandler, InteractiveText, KeyContext, Model,
     MouseButton, ParentElement, Pixels, Render, RenderOnce, SharedString, Styled, StyledText,
@@ -185,82 +185,101 @@ pub fn render_parsed_markdown(
     })
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct SelectNext {
     #[serde(default)]
     pub replace_newest: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct SelectPrevious {
     #[serde(default)]
     pub replace_newest: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct SelectAllMatches {
     #[serde(default)]
     pub replace_newest: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct SelectToBeginningOfLine {
     #[serde(default)]
     stop_at_soft_wraps: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct MovePageUp {
     #[serde(default)]
     center_cursor: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct MovePageDown {
     #[serde(default)]
     center_cursor: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct SelectToEndOfLine {
     #[serde(default)]
     stop_at_soft_wraps: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct ToggleCodeActions {
     #[serde(default)]
     pub deployed_from_indicator: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct ConfirmCompletion {
     #[serde(default)]
     pub item_ix: Option<usize>,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct ConfirmCodeAction {
     #[serde(default)]
     pub item_ix: Option<usize>,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct ToggleComments {
     #[serde(default)]
     pub advance_downwards: bool,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct FoldAt {
     pub buffer_row: u32,
 }
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct UnfoldAt {
     pub buffer_row: u32,
 }
 
+impl_actions!(
+    editor,
+    [
+        SelectNext,
+        SelectPrevious,
+        SelectAllMatches,
+        SelectToBeginningOfLine,
+        MovePageUp,
+        MovePageDown,
+        SelectToEndOfLine,
+        ToggleCodeActions,
+        ConfirmCompletion,
+        ConfirmCodeAction,
+        ToggleComments,
+        FoldAt,
+        UnfoldAt
+    ]
+);
+
 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub enum InlayId {
     Suggestion(usize),
@@ -277,121 +296,124 @@ impl InlayId {
 }
 
 actions!(
-    AddSelectionAbove,
-    AddSelectionBelow,
-    Backspace,
-    Cancel,
-    ConfirmRename,
-    ContextMenuFirst,
-    ContextMenuLast,
-    ContextMenuNext,
-    ContextMenuPrev,
-    ConvertToKebabCase,
-    ConvertToLowerCamelCase,
-    ConvertToLowerCase,
-    ConvertToSnakeCase,
-    ConvertToTitleCase,
-    ConvertToUpperCamelCase,
-    ConvertToUpperCase,
-    Copy,
-    CopyHighlightJson,
-    CopyPath,
-    CopyRelativePath,
-    Cut,
-    CutToEndOfLine,
-    Delete,
-    DeleteLine,
-    DeleteToBeginningOfLine,
-    DeleteToEndOfLine,
-    DeleteToNextSubwordEnd,
-    DeleteToNextWordEnd,
-    DeleteToPreviousSubwordStart,
-    DeleteToPreviousWordStart,
-    DuplicateLine,
-    FindAllReferences,
-    Fold,
-    FoldSelectedRanges,
-    Format,
-    GoToDefinition,
-    GoToDefinitionSplit,
-    GoToDiagnostic,
-    GoToHunk,
-    GoToPrevDiagnostic,
-    GoToPrevHunk,
-    GoToTypeDefinition,
-    GoToTypeDefinitionSplit,
-    HalfPageDown,
-    HalfPageUp,
-    Hover,
-    Indent,
-    JoinLines,
-    LineDown,
-    LineUp,
-    MoveDown,
-    MoveLeft,
-    MoveLineDown,
-    MoveLineUp,
-    MoveRight,
-    MoveToBeginning,
-    MoveToBeginningOfLine,
-    MoveToEnclosingBracket,
-    MoveToEnd,
-    MoveToEndOfLine,
-    MoveToEndOfParagraph,
-    MoveToNextSubwordEnd,
-    MoveToNextWordEnd,
-    MoveToPreviousSubwordStart,
-    MoveToPreviousWordStart,
-    MoveToStartOfParagraph,
-    MoveUp,
-    Newline,
-    NewlineAbove,
-    NewlineBelow,
-    NextScreen,
-    OpenExcerpts,
-    Outdent,
-    PageDown,
-    PageUp,
-    Paste,
-    Redo,
-    RedoSelection,
-    Rename,
-    RestartLanguageServer,
-    RevealInFinder,
-    ReverseLines,
-    ScrollCursorBottom,
-    ScrollCursorCenter,
-    ScrollCursorTop,
-    SelectAll,
-    SelectDown,
-    SelectLargerSyntaxNode,
-    SelectLeft,
-    SelectLine,
-    SelectRight,
-    SelectSmallerSyntaxNode,
-    SelectToBeginning,
-    SelectToEnd,
-    SelectToEndOfParagraph,
-    SelectToNextSubwordEnd,
-    SelectToNextWordEnd,
-    SelectToPreviousSubwordStart,
-    SelectToPreviousWordStart,
-    SelectToStartOfParagraph,
-    SelectUp,
-    ShowCharacterPalette,
-    ShowCompletions,
-    ShuffleLines,
-    SortLinesCaseInsensitive,
-    SortLinesCaseSensitive,
-    SplitSelectionIntoLines,
-    Tab,
-    TabPrev,
-    ToggleInlayHints,
-    ToggleSoftWrap,
-    Transpose,
-    Undo,
-    UndoSelection,
-    UnfoldLines,
+    editor,
+    [
+        AddSelectionAbove,
+        AddSelectionBelow,
+        Backspace,
+        Cancel,
+        ConfirmRename,
+        ContextMenuFirst,
+        ContextMenuLast,
+        ContextMenuNext,
+        ContextMenuPrev,
+        ConvertToKebabCase,
+        ConvertToLowerCamelCase,
+        ConvertToLowerCase,
+        ConvertToSnakeCase,
+        ConvertToTitleCase,
+        ConvertToUpperCamelCase,
+        ConvertToUpperCase,
+        Copy,
+        CopyHighlightJson,
+        CopyPath,
+        CopyRelativePath,
+        Cut,
+        CutToEndOfLine,
+        Delete,
+        DeleteLine,
+        DeleteToBeginningOfLine,
+        DeleteToEndOfLine,
+        DeleteToNextSubwordEnd,
+        DeleteToNextWordEnd,
+        DeleteToPreviousSubwordStart,
+        DeleteToPreviousWordStart,
+        DuplicateLine,
+        FindAllReferences,
+        Fold,
+        FoldSelectedRanges,
+        Format,
+        GoToDefinition,
+        GoToDefinitionSplit,
+        GoToDiagnostic,
+        GoToHunk,
+        GoToPrevDiagnostic,
+        GoToPrevHunk,
+        GoToTypeDefinition,
+        GoToTypeDefinitionSplit,
+        HalfPageDown,
+        HalfPageUp,
+        Hover,
+        Indent,
+        JoinLines,
+        LineDown,
+        LineUp,
+        MoveDown,
+        MoveLeft,
+        MoveLineDown,
+        MoveLineUp,
+        MoveRight,
+        MoveToBeginning,
+        MoveToBeginningOfLine,
+        MoveToEnclosingBracket,
+        MoveToEnd,
+        MoveToEndOfLine,
+        MoveToEndOfParagraph,
+        MoveToNextSubwordEnd,
+        MoveToNextWordEnd,
+        MoveToPreviousSubwordStart,
+        MoveToPreviousWordStart,
+        MoveToStartOfParagraph,
+        MoveUp,
+        Newline,
+        NewlineAbove,
+        NewlineBelow,
+        NextScreen,
+        OpenExcerpts,
+        Outdent,
+        PageDown,
+        PageUp,
+        Paste,
+        Redo,
+        RedoSelection,
+        Rename,
+        RestartLanguageServer,
+        RevealInFinder,
+        ReverseLines,
+        ScrollCursorBottom,
+        ScrollCursorCenter,
+        ScrollCursorTop,
+        SelectAll,
+        SelectDown,
+        SelectLargerSyntaxNode,
+        SelectLeft,
+        SelectLine,
+        SelectRight,
+        SelectSmallerSyntaxNode,
+        SelectToBeginning,
+        SelectToEnd,
+        SelectToEndOfParagraph,
+        SelectToNextSubwordEnd,
+        SelectToNextWordEnd,
+        SelectToPreviousSubwordStart,
+        SelectToPreviousWordStart,
+        SelectToStartOfParagraph,
+        SelectUp,
+        ShowCharacterPalette,
+        ShowCompletions,
+        ShuffleLines,
+        SortLinesCaseInsensitive,
+        SortLinesCaseSensitive,
+        SplitSelectionIntoLines,
+        Tab,
+        TabPrev,
+        ToggleInlayHints,
+        ToggleSoftWrap,
+        Transpose,
+        Undo,
+        UndoSelection,
+        UnfoldLines,
+    ]
 );
 
 enum DocumentHighlightRead {}

crates/editor2/src/element.rs 🔗

@@ -750,44 +750,47 @@ impl EditorElement {
             }
         }
 
-        for (ix, fold_indicator) in layout.fold_indicators.drain(..).enumerate() {
-            if let Some(mut fold_indicator) = fold_indicator {
-                let mut fold_indicator = fold_indicator.into_any_element();
-                let available_space = size(
-                    AvailableSpace::MinContent,
-                    AvailableSpace::Definite(line_height * 0.55),
-                );
-                let fold_indicator_size = fold_indicator.measure(available_space, cx);
+        cx.with_z_index(1, |cx| {
+            for (ix, fold_indicator) in layout.fold_indicators.drain(..).enumerate() {
+                if let Some(mut fold_indicator) = fold_indicator {
+                    let mut fold_indicator = fold_indicator.into_any_element();
+                    let available_space = size(
+                        AvailableSpace::MinContent,
+                        AvailableSpace::Definite(line_height * 0.55),
+                    );
+                    let fold_indicator_size = fold_indicator.measure(available_space, cx);
 
-                let position = point(
-                    bounds.size.width - layout.gutter_padding,
-                    ix as f32 * line_height - (scroll_top % line_height),
-                );
-                let centering_offset = point(
-                    (layout.gutter_padding + layout.gutter_margin - fold_indicator_size.width) / 2.,
-                    (line_height - fold_indicator_size.height) / 2.,
-                );
-                let origin = bounds.origin + position + centering_offset;
-                fold_indicator.draw(origin, available_space, cx);
+                    let position = point(
+                        bounds.size.width - layout.gutter_padding,
+                        ix as f32 * line_height - (scroll_top % line_height),
+                    );
+                    let centering_offset = point(
+                        (layout.gutter_padding + layout.gutter_margin - fold_indicator_size.width)
+                            / 2.,
+                        (line_height - fold_indicator_size.height) / 2.,
+                    );
+                    let origin = bounds.origin + position + centering_offset;
+                    fold_indicator.draw(origin, available_space, cx);
+                }
             }
-        }
 
-        if let Some(indicator) = layout.code_actions_indicator.take() {
-            let mut button = indicator.button.into_any_element();
-            let available_space = size(
-                AvailableSpace::MinContent,
-                AvailableSpace::Definite(line_height),
-            );
-            let indicator_size = button.measure(available_space, cx);
+            if let Some(indicator) = layout.code_actions_indicator.take() {
+                let mut button = indicator.button.into_any_element();
+                let available_space = size(
+                    AvailableSpace::MinContent,
+                    AvailableSpace::Definite(line_height),
+                );
+                let indicator_size = button.measure(available_space, cx);
 
-            let mut x = Pixels::ZERO;
-            let mut y = indicator.row as f32 * line_height - scroll_top;
-            // Center indicator.
-            x += ((layout.gutter_padding + layout.gutter_margin) - indicator_size.width) / 2.;
-            y += (line_height - indicator_size.height) / 2.;
+                let mut x = Pixels::ZERO;
+                let mut y = indicator.row as f32 * line_height - scroll_top;
+                // Center indicator.
+                x += ((layout.gutter_padding + layout.gutter_margin) - indicator_size.width) / 2.;
+                y += (line_height - indicator_size.height) / 2.;
 
-            button.draw(bounds.origin + point(x, y), available_space, cx);
-        }
+                button.draw(bounds.origin + point(x, y), available_space, cx);
+            }
+        });
     }
 
     fn paint_diff_hunks(bounds: Bounds<Pixels>, layout: &LayoutState, cx: &mut WindowContext) {
@@ -825,8 +828,8 @@ impl EditorElement {
             };
 
             let color = match status {
-                DiffHunkStatus::Added => gpui::green(), // todo!("use the appropriate color")
-                DiffHunkStatus::Modified => gpui::yellow(), // todo!("use the appropriate color")
+                DiffHunkStatus::Added => cx.theme().status().created,
+                DiffHunkStatus::Modified => cx.theme().status().modified,
 
                 //TODO: This rendering is entirely a horrible hack
                 DiffHunkStatus::Removed => {
@@ -843,7 +846,7 @@ impl EditorElement {
                     cx.paint_quad(
                         highlight_bounds,
                         Corners::all(1. * line_height),
-                        gpui::red(), // todo!("use the right color")
+                        cx.theme().status().deleted,
                         Edges::default(),
                         transparent_black(),
                     );

crates/editor2/src/hover_popover.rs 🔗

@@ -26,7 +26,7 @@ pub const MIN_POPOVER_CHARACTER_WIDTH: f32 = 20.;
 pub const MIN_POPOVER_LINE_HEIGHT: Pixels = px(4.);
 pub const HOVER_POPOVER_GAP: Pixels = px(10.);
 
-actions!(Hover);
+actions!(editor, [Hover]);
 
 /// Bindable action which uses the most recent selection head to trigger a hover
 pub fn hover(editor: &mut Editor, _: &Hover, cx: &mut ViewContext<Editor>) {

crates/feedback2/src/deploy_feedback_button.rs 🔗

@@ -32,7 +32,7 @@ impl Render for DeployFeedbackButton {
         IconButton::new("give-feedback", Icon::Envelope)
             .style(ui::ButtonStyle::Subtle)
             .selected(is_open)
-            .tooltip(|cx| Tooltip::text("Give Feedback", cx))
+            .tooltip(|cx| Tooltip::text("Share Feedback", cx))
             .on_click(|_, cx| {
                 cx.dispatch_action(Box::new(GiveFeedback));
             })

crates/feedback2/src/feedback2.rs 🔗

@@ -5,15 +5,18 @@ use workspace::Workspace;
 pub mod deploy_feedback_button;
 pub mod feedback_modal;
 
-actions!(GiveFeedback, SubmitFeedback);
+actions!(feedback, [GiveFeedback, SubmitFeedback]);
 
 mod system_specs;
 
 actions!(
-    CopySystemSpecsIntoClipboard,
-    FileBugReport,
-    RequestFeature,
-    OpenZedCommunityRepo
+    zed,
+    [
+        CopySystemSpecsIntoClipboard,
+        FileBugReport,
+        RequestFeature,
+        OpenZedCommunityRepo
+    ]
 );
 
 pub fn init(cx: &mut AppContext) {

crates/feedback2/src/feedback_modal.rs 🔗

@@ -1,28 +1,38 @@
 use std::{ops::RangeInclusive, sync::Arc};
 
-use anyhow::bail;
+use anyhow::{anyhow, bail};
 use client::{Client, ZED_SECRET_CLIENT_TOKEN, ZED_SERVER_URL};
 use db::kvp::KEY_VALUE_STORE;
 use editor::{Editor, EditorEvent};
 use futures::AsyncReadExt;
 use gpui::{
-    div, red, rems, serde_json, AppContext, DismissEvent, Div, EventEmitter, FocusHandle,
-    FocusableView, Model, PromptLevel, Render, Task, View, ViewContext,
+    div, rems, serde_json, AppContext, DismissEvent, Div, EventEmitter, FocusHandle, FocusableView,
+    Model, PromptLevel, Render, Task, View, ViewContext,
 };
 use isahc::Request;
 use language::Buffer;
 use project::Project;
 use regex::Regex;
 use serde_derive::Serialize;
-use ui::{prelude::*, Button, ButtonStyle, Label, Tooltip};
+use ui::{prelude::*, Button, ButtonStyle, IconPosition, Tooltip};
 use util::ResultExt;
-use workspace::Workspace;
+use workspace::{ModalView, Workspace};
 
 use crate::{system_specs::SystemSpecs, GiveFeedback, OpenZedCommunityRepo};
 
+// For UI testing purposes
+const SEND_SUCCESS_IN_DEV_MODE: bool = true;
+
+// Temporary, until tests are in place
+#[cfg(debug_assertions)]
+const DEV_MODE: bool = true;
+
+#[cfg(not(debug_assertions))]
+const DEV_MODE: bool = false;
+
 const DATABASE_KEY_NAME: &str = "email_address";
 const EMAIL_REGEX: &str = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b";
-const FEEDBACK_CHAR_LIMIT: RangeInclusive<usize> = 10..=5000;
+const FEEDBACK_CHAR_LIMIT: RangeInclusive<i32> = 10..=5000;
 const FEEDBACK_SUBMISSION_ERROR_TEXT: &str =
     "Feedback failed to submit, see error log for details.";
 
@@ -41,8 +51,9 @@ pub struct FeedbackModal {
     system_specs: SystemSpecs,
     feedback_editor: View<Editor>,
     email_address_editor: View<Editor>,
-    character_count: usize,
-    pending_submission: bool,
+    awaiting_submission: bool,
+    user_submitted: bool,
+    character_count: i32,
 }
 
 impl FocusableView for FeedbackModal {
@@ -52,6 +63,25 @@ impl FocusableView for FeedbackModal {
 }
 impl EventEmitter<DismissEvent> for FeedbackModal {}
 
+impl ModalView for FeedbackModal {
+    fn dismiss(&mut self, cx: &mut ViewContext<Self>) -> Task<bool> {
+        if self.user_submitted {
+            self.set_user_submitted(false, cx);
+            return cx.spawn(|_, _| async { true });
+        }
+
+        let has_feedback = self.feedback_editor.read(cx).text_option(cx).is_some();
+
+        if !has_feedback {
+            return cx.spawn(|_, _| async { true });
+        }
+
+        let answer = cx.prompt(PromptLevel::Info, "Discard feedback?", &["Yes", "No"]);
+
+        cx.spawn(|_, _| async { answer.await.ok() == Some(0) })
+    }
+}
+
 impl FeedbackModal {
     pub fn register(workspace: &mut Workspace, cx: &mut ViewContext<Workspace>) {
         let _handle = cx.view().downgrade();
@@ -104,6 +134,11 @@ impl FeedbackModal {
 
         let feedback_editor = cx.build_view(|cx| {
             let mut editor = Editor::for_buffer(buffer, Some(project.clone()), cx);
+            editor.set_placeholder_text(
+                "You can use markdown to organize your feedback wiht add code and links, or organize feedback.",
+                cx,
+            );
+            // editor.set_show_gutter(false, cx);
             editor.set_vertical_scroll_margin(5, cx);
             editor
         });
@@ -119,7 +154,7 @@ impl FeedbackModal {
                         .as_singleton()
                         .expect("Feedback editor is never a multi-buffer")
                         .read(cx)
-                        .len();
+                        .len() as i32;
                     cx.notify();
                 }
                 _ => {}
@@ -131,7 +166,8 @@ impl FeedbackModal {
             system_specs: system_specs.clone(),
             feedback_editor,
             email_address_editor,
-            pending_submission: false,
+            awaiting_submission: false,
+            user_submitted: false,
             character_count: 0,
         }
     }
@@ -163,37 +199,53 @@ impl FeedbackModal {
                     }
                 };
 
-                this.update(&mut cx, |feedback_editor, cx| {
-                    feedback_editor.set_pending_submission(true, cx);
+                this.update(&mut cx, |this, cx| {
+                    this.set_awaiting_submission(true, cx);
                 })
                 .log_err();
 
-                if let Err(error) =
-                    FeedbackModal::submit_feedback(&feedback_text, email, client, specs).await
-                {
-                    log::error!("{}", error);
-                    this.update(&mut cx, |feedback_editor, cx| {
-                        let prompt = cx.prompt(
-                            PromptLevel::Critical,
-                            FEEDBACK_SUBMISSION_ERROR_TEXT,
-                            &["OK"],
-                        );
-                        cx.spawn(|_, _cx| async move {
-                            prompt.await.ok();
+                let res =
+                    FeedbackModal::submit_feedback(&feedback_text, email, client, specs).await;
+
+                match res {
+                    Ok(_) => {
+                        this.update(&mut cx, |this, cx| {
+                            this.set_user_submitted(true, cx);
+                            cx.emit(DismissEvent)
+                        })
+                        .ok();
+                    }
+                    Err(error) => {
+                        log::error!("{}", error);
+                        this.update(&mut cx, |this, cx| {
+                            let prompt = cx.prompt(
+                                PromptLevel::Critical,
+                                FEEDBACK_SUBMISSION_ERROR_TEXT,
+                                &["OK"],
+                            );
+                            cx.spawn(|_, _cx| async move {
+                                prompt.await.ok();
+                            })
+                            .detach();
+                            this.set_awaiting_submission(false, cx);
                         })
-                        .detach();
-                        feedback_editor.set_pending_submission(false, cx);
-                    })
-                    .log_err();
+                        .log_err();
+                    }
                 }
             }
         })
         .detach();
+
         Task::ready(Ok(()))
     }
 
-    fn set_pending_submission(&mut self, pending_submission: bool, cx: &mut ViewContext<Self>) {
-        self.pending_submission = pending_submission;
+    fn set_awaiting_submission(&mut self, awaiting_submission: bool, cx: &mut ViewContext<Self>) {
+        self.awaiting_submission = awaiting_submission;
+        cx.notify();
+    }
+
+    fn set_user_submitted(&mut self, user_submitted: bool, cx: &mut ViewContext<Self>) {
+        self.user_submitted = user_submitted;
         cx.notify();
     }
 
@@ -203,6 +255,14 @@ impl FeedbackModal {
         zed_client: Arc<Client>,
         system_specs: SystemSpecs,
     ) -> anyhow::Result<()> {
+        if DEV_MODE {
+            if SEND_SUCCESS_IN_DEV_MODE {
+                return Ok(());
+            } else {
+                return Err(anyhow!("Error submitting feedback"));
+            }
+        }
+
         let feedback_endpoint = format!("{}/api/feedback", *ZED_SERVER_URL);
         let telemetry = zed_client.telemetry();
         let metrics_id = telemetry.metrics_id();
@@ -233,11 +293,8 @@ impl FeedbackModal {
     }
 
     // TODO: Escape button calls dismiss
-    // TODO: Should do same as hitting cancel / clicking outside of modal
-    //     Close immediately if no text in field
-    //     Ask to close if text in the field
     fn cancel(&mut self, _: &menu::Cancel, cx: &mut ViewContext<Self>) {
-        cx.emit(DismissEvent);
+        cx.emit(DismissEvent)
     }
 }
 
@@ -251,136 +308,128 @@ impl Render for FeedbackModal {
         };
 
         let valid_character_count = FEEDBACK_CHAR_LIMIT.contains(&self.character_count);
-        let characters_remaining =
-            if valid_character_count || self.character_count > *FEEDBACK_CHAR_LIMIT.end() {
-                *FEEDBACK_CHAR_LIMIT.end() as i32 - self.character_count as i32
-            } else {
-                self.character_count as i32 - *FEEDBACK_CHAR_LIMIT.start() as i32
-            };
 
         let allow_submission =
-            valid_character_count && valid_email_address && !self.pending_submission;
+            valid_character_count && valid_email_address && !self.awaiting_submission;
 
-        let has_feedback = self.feedback_editor.read(cx).text_option(cx).is_some();
-
-        let submit_button_text = if self.pending_submission {
-            "Sending..."
+        let submit_button_text = if self.awaiting_submission {
+            "Submitting..."
         } else {
-            "Send Feedback"
+            "Submit"
         };
-        let dismiss = cx.listener(|_, _, cx| {
-            cx.emit(DismissEvent);
-        });
-        // TODO: get the "are you sure you want to dismiss?" prompt here working
-        let dismiss_prompt = cx.listener(|_, _, _| {
-            // let answer = cx.prompt(PromptLevel::Info, "Exit feedback?", &["Yes", "No"]);
-            // cx.spawn(|_, _| async move {
-            //     let answer = answer.await.ok();
-            //     if answer == Some(0) {
-            //         cx.emit(DismissEvent);
-            //     }
-            // })
-            // .detach();
-        });
+
         let open_community_repo =
             cx.listener(|_, _, cx| cx.dispatch_action(Box::new(OpenZedCommunityRepo)));
 
-        // TODO: Nate UI pass
+        // Moved this here because providing it inline breaks rustfmt
+        let provide_an_email_address =
+            "Provide an email address if you want us to be able to reply.";
+
         v_stack()
             .elevation_3(cx)
             .key_context("GiveFeedback")
             .on_action(cx.listener(Self::cancel))
             .min_w(rems(40.))
             .max_w(rems(96.))
-            .border()
-            .border_color(red())
-            .h(rems(40.))
-            .p_2()
-            .gap_2()
+            .h(rems(32.))
+            .p_4()
+            .gap_4()
+            .child(v_stack().child(
+                // TODO: Add Headline component to `ui2`
+                div().text_xl().child("Share Feedback"),
+            ))
             .child(
-                v_stack().child(
-                    div()
-                        .size_full()
-                        .child(Label::new("Give Feedback").color(Color::Default))
-                        .child(Label::new("This editor supports markdown").color(Color::Muted)),
-                ),
+                Label::new(if self.character_count < *FEEDBACK_CHAR_LIMIT.start() {
+                    format!(
+                        "Feedback must be at least {} characters.",
+                        FEEDBACK_CHAR_LIMIT.start()
+                    )
+                } else {
+                    format!(
+                        "Characters: {}",
+                        *FEEDBACK_CHAR_LIMIT.end() - self.character_count
+                    )
+                })
+                .color(if valid_character_count {
+                    Color::Success
+                } else {
+                    Color::Error
+                }),
             )
             .child(
                 div()
                     .flex_1()
                     .bg(cx.theme().colors().editor_background)
+                    .p_2()
                     .border()
+                    .rounded_md()
                     .border_color(cx.theme().colors().border)
                     .child(self.feedback_editor.clone()),
             )
-            .child(
-                div().child(
-                    Label::new(format!(
-                        "Characters: {}",
-                        characters_remaining
-                    ))
-                    .color(
-                        if valid_character_count {
-                            Color::Success
-                        } else {
-                            Color::Error
-                        }
-                    )
-                ),
-            )
             .child(
                 div()
-                .bg(cx.theme().colors().editor_background)
-                .border()
-                .border_color(cx.theme().colors().border)
-                .child(self.email_address_editor.clone())
-            )
-            .child(
-                h_stack()
-                    .justify_between()
-                    .gap_1()
-                    .child(Button::new("community_repo", "Community Repo")
-                        .style(ButtonStyle::Filled)
-                        .color(Color::Muted)
-                        .on_click(open_community_repo)
+                    .child(
+                        h_stack()
+                            .bg(cx.theme().colors().editor_background)
+                            .p_2()
+                            .border()
+                            .rounded_md()
+                            .border_color(cx.theme().colors().border)
+                            .child(self.email_address_editor.clone()),
                     )
-                    .child(h_stack().justify_between().gap_1()
-                        .child(
-                            Button::new("cancel_feedback", "Cancel")
-                                .style(ButtonStyle::Subtle)
-                                .color(Color::Muted)
-                                // TODO: replicate this logic when clicking outside the modal
-                                // TODO: Will require somehow overriding the modal dismal default behavior
-                                .map(|this| {
-                                    if has_feedback {
-                                        this.on_click(dismiss_prompt)
-                                    } else {
-                                        this.on_click(dismiss)
-                                    }
-                                })
-                        )
-                        .child(
-                            Button::new("send_feedback", submit_button_text)
-                                .color(Color::Accent)
-                                .style(ButtonStyle::Filled)
-                                // TODO: Ensure that while submitting, "Sending..." is shown and disable the button
-                                // TODO: If submit errors: show popup with error, don't close modal, set text back to "Send Feedback", and re-enable button
-                                // TODO: If submit is successful, close the modal
-                                .on_click(cx.listener(|this, _, cx| {
-                                    let _ = this.submit(cx);
-                                }))
-                                .tooltip(|cx| {
-                                    Tooltip::with_meta(
-                                        "Submit feedback to the Zed team.",
-                                        None,
-                                        "Provide an email address if you want us to be able to reply.",
-                                        cx,
+                    .child(
+                        h_stack()
+                            .justify_between()
+                            .gap_1()
+                            .child(
+                                Button::new("community_repo", "Community Repo")
+                                    .style(ButtonStyle::Transparent)
+                                    .icon(Icon::ExternalLink)
+                                    .icon_position(IconPosition::End)
+                                    .icon_size(IconSize::Small)
+                                    .on_click(open_community_repo),
+                            )
+                            .child(
+                                h_stack()
+                                    .gap_1()
+                                    .child(
+                                        Button::new("cancel_feedback", "Cancel")
+                                            .style(ButtonStyle::Subtle)
+                                            .color(Color::Muted)
+                                            .on_click(cx.listener(move |_, _, cx| {
+                                                cx.spawn(|this, mut cx| async move {
+                                                    this.update(&mut cx, |_, cx| {
+                                                        cx.emit(DismissEvent)
+                                                    })
+                                                    .ok();
+                                                })
+                                                .detach();
+                                            })),
                                     )
-                                })
-                                .when(!allow_submission, |this| this.disabled(true))
-                        ),
-                    )
-
+                                    .child(
+                                        Button::new("send_feedback", submit_button_text)
+                                            .color(Color::Accent)
+                                            .style(ButtonStyle::Filled)
+                                            // TODO: Ensure that while submitting, "Sending..." is shown and disable the button
+                                            // TODO: If submit errors: show popup with error, don't close modal, set text back to "Submit", and re-enable button
+                                            .on_click(cx.listener(|this, _, cx| {
+                                                this.submit(cx).detach();
+                                            }))
+                                            .tooltip(move |cx| {
+                                                Tooltip::with_meta(
+                                                    "Submit feedback to the Zed team.",
+                                                    None,
+                                                    provide_an_email_address,
+                                                    cx,
+                                                )
+                                            })
+                                            .when(!allow_submission, |this| this.disabled(true)),
+                                    ),
+                            ),
+                    ),
             )
     }
 }
+
+// TODO: Maybe store email address whenever the modal is closed, versus just on submit, so users can remove it if they want without submitting
+// TODO: Testing of various button states, dismissal prompts, etc.

crates/file_finder2/src/file_finder.rs 🔗

@@ -17,9 +17,11 @@ use std::{
 use text::Point;
 use ui::{prelude::*, HighlightedLabel, ListItem};
 use util::{paths::PathLikeWithPosition, post_inc, ResultExt};
-use workspace::Workspace;
+use workspace::{ModalView, Workspace};
 
-actions!(Toggle);
+actions!(file_finder, [Toggle]);
+
+impl ModalView for FileFinder {}
 
 pub struct FileFinder {
     picker: View<Picker<FileFinderDelegate>>,

crates/go_to_line2/src/go_to_line.rs 🔗

@@ -8,8 +8,9 @@ use text::{Bias, Point};
 use theme::ActiveTheme;
 use ui::{h_stack, prelude::*, v_stack, Label};
 use util::paths::FILE_ROW_COLUMN_DELIMITER;
+use workspace::ModalView;
 
-actions!(Toggle);
+actions!(go_to_line, [Toggle]);
 
 pub fn init(cx: &mut AppContext) {
     cx.observe_new_views(GoToLine::register).detach();
@@ -23,6 +24,8 @@ pub struct GoToLine {
     _subscriptions: Vec<Subscription>,
 }
 
+impl ModalView for GoToLine {}
+
 impl FocusableView for GoToLine {
     fn focus_handle(&self, cx: &AppContext) -> FocusHandle {
         self.line_editor.focus_handle(cx)

crates/gpui2/docs/key_dispatch.md 🔗

@@ -22,7 +22,7 @@ Actions are frequently unit structs, for which we have a macro. The above could
 
 ```rust
 mod menu {
-    actions!(MoveUp, MoveDown);
+    actions!(gpui, [MoveUp, MoveDown]);
 }
 ```
 

crates/gpui2/src/action.rs 🔗

@@ -3,34 +3,33 @@ use anyhow::{anyhow, Context, Result};
 use collections::HashMap;
 pub use no_action::NoAction;
 use serde_json::json;
-use std::{
-    any::{Any, TypeId},
-    ops::Deref,
-};
+use std::any::{Any, TypeId};
 
 /// Actions are used to implement keyboard-driven UI.
 /// When you declare an action, you can bind keys to the action in the keymap and
 /// listeners for that action in the element tree.
 ///
 /// To declare a list of simple actions, you can use the actions! macro, which defines a simple unit struct
-/// action for each listed action name.
+/// action for each listed action name in the given namespace.
 /// ```rust
-/// actions!(MoveUp, MoveDown, MoveLeft, MoveRight, Newline);
+/// actions!(editor, [MoveUp, MoveDown, MoveLeft, MoveRight, Newline]);
 /// ```
-/// More complex data types can also be actions. If you annotate your type with the action derive macro
-/// it will be implemented and registered automatically.
+/// More complex data types can also be actions, providing they implement Clone, PartialEq,
+/// and serde_derive::Deserialize.
+/// Use `impl_actions!` to automatically implement the action in the given namespace.
 /// ```
-/// #[derive(Clone, PartialEq, serde_derive::Deserialize, Action)]
+/// #[derive(Clone, PartialEq, serde_derive::Deserialize)]
 /// pub struct SelectNext {
 ///     pub replace_newest: bool,
 /// }
+/// impl_actions!(editor, [SelectNext]);
+/// ```
 ///
 /// If you want to control the behavior of the action trait manually, you can use the lower-level `#[register_action]`
 /// macro, which only generates the code needed to register your action before `main`.
 ///
 /// ```
-/// #[gpui::register_action]
-/// #[derive(gpui::serde::Deserialize, std::cmp::PartialEq, std::clone::Clone, std::fmt::Debug)]
+/// #[derive(gpui::serde::Deserialize, std::cmp::PartialEq, std::clone::Clone)]
 /// pub struct Paste {
 ///     pub content: SharedString,
 /// }
@@ -38,6 +37,7 @@ use std::{
 /// impl gpui::Action for Paste {
 ///      ///...
 /// }
+/// register_action!(Paste);
 /// ```
 pub trait Action: 'static {
     fn boxed_clone(&self) -> Box<dyn Action>;
@@ -56,7 +56,7 @@ pub trait Action: 'static {
 impl std::fmt::Debug for dyn Action {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         f.debug_struct("dyn Action")
-            .field("type_name", &self.name())
+            .field("name", &self.name())
             .finish()
     }
 }
@@ -115,7 +115,7 @@ impl ActionRegistry {
         for builder in __GPUI_ACTIONS {
             let action = builder();
             //todo(remove)
-            let name: SharedString = remove_the_2(action.name).into();
+            let name: SharedString = action.name.into();
             self.builders_by_name.insert(name.clone(), action.build);
             self.names_by_type_id.insert(action.type_id, name.clone());
             self.all_names.push(name);
@@ -139,11 +139,9 @@ impl ActionRegistry {
         name: &str,
         params: Option<serde_json::Value>,
     ) -> Result<Box<dyn Action>> {
-        //todo(remove)
-        let name = remove_the_2(name);
         let build_action = self
             .builders_by_name
-            .get(name.deref())
+            .get(name)
             .ok_or_else(|| anyhow!("no action type registered for {}", name))?;
         (build_action)(params.unwrap_or_else(|| json!({})))
             .with_context(|| format!("Attempting to build action {}", name))
@@ -155,36 +153,88 @@ impl ActionRegistry {
 }
 
 /// Defines unit structs that can be used as actions.
-/// To use more complex data types as actions, annotate your type with the #[action] macro.
+/// To use more complex data types as actions, use `impl_actions!`
 #[macro_export]
 macro_rules! actions {
-    () => {};
-
-    ( $name:ident ) => {
-        #[derive(::std::cmp::PartialEq, ::std::clone::Clone, ::std::default::Default, gpui::serde_derive::Deserialize, gpui::Action)]
-        #[serde(crate = "gpui::serde")]
-        pub struct $name;
+    ($namespace:path, [ $($name:ident),* $(,)? ]) => {
+        $(
+            #[derive(::std::cmp::PartialEq, ::std::clone::Clone, ::std::default::Default, gpui::serde_derive::Deserialize)]
+            #[serde(crate = "gpui::serde")]
+            pub struct $name;
+
+            gpui::__impl_action!($namespace, $name,
+                fn build(_: gpui::serde_json::Value) -> gpui::Result<::std::boxed::Box<dyn gpui::Action>> {
+                    Ok(Box::new(Self))
+                }
+            );
+
+            gpui::register_action!($name);
+        )*
     };
+}
 
-    ( $name:ident, $($rest:tt)* ) => {
-        actions!($name);
-        actions!($($rest)*);
+/// Implements the Action trait for any struct that implements Clone, Default, PartialEq, and serde_deserialize::Deserialize
+#[macro_export]
+macro_rules! impl_actions {
+    ($namespace:path, [ $($name:ident),* $(,)? ]) => {
+        $(
+            gpui::__impl_action!($namespace, $name,
+                fn build(value: gpui::serde_json::Value) -> gpui::Result<::std::boxed::Box<dyn gpui::Action>> {
+                    Ok(std::boxed::Box::new(gpui::serde_json::from_value::<Self>(value)?))
+                }
+            );
+        )*
     };
 }
 
-//todo!(remove)
-pub fn remove_the_2(action_name: &str) -> String {
-    let mut separator_matches = action_name.rmatch_indices("::");
-    separator_matches.next().unwrap();
-    let name_start_ix = separator_matches.next().map_or(0, |(ix, _)| ix + 2);
-    // todo!() remove the 2 replacement when migration is done
-    action_name[name_start_ix..]
-        .replace("2::", "::")
-        .to_string()
+#[doc(hidden)]
+#[macro_export]
+macro_rules! __impl_action {
+    ($namespace:path, $name:ident, $build:item) => {
+        impl gpui::Action for $name {
+            fn name(&self) -> &'static str
+            {
+                concat!(
+                    stringify!($namespace),
+                    "::",
+                    stringify!($name),
+                )
+            }
+
+            // todo!() why is this needed in addition to name?
+            fn debug_name() -> &'static str
+            where
+                Self: ::std::marker::Sized
+            {
+                concat!(
+                    stringify!($namespace),
+                    "::",
+                    stringify!($name),
+                )
+            }
+
+            $build
+
+            fn partial_eq(&self, action: &dyn gpui::Action) -> bool {
+                action
+                    .as_any()
+                    .downcast_ref::<Self>()
+                    .map_or(false, |a| self == a)
+            }
+
+            fn boxed_clone(&self) ->  std::boxed::Box<dyn gpui::Action> {
+                ::std::boxed::Box::new(self.clone())
+            }
+
+            fn as_any(&self) -> &dyn ::std::any::Any {
+                self
+            }
+        }
+    };
 }
 
 mod no_action {
     use crate as gpui;
 
-    actions!(NoAction);
+    actions!(zed, [NoAction]);
 }

crates/gpui2/src/app.rs 🔗

@@ -13,6 +13,7 @@ use smallvec::SmallVec;
 use smol::future::FutureExt;
 #[cfg(any(test, feature = "test-support"))]
 pub use test_context::*;
+use time::UtcOffset;
 
 use crate::{
     current_platform, image_cache::ImageCache, init_app_menus, Action, ActionRegistry, Any,
@@ -536,6 +537,10 @@ impl AppContext {
         self.platform.restart()
     }
 
+    pub fn local_timezone(&self) -> UtcOffset {
+        self.platform.local_timezone()
+    }
+
     pub(crate) fn push_effect(&mut self, effect: Effect) {
         match &effect {
             Effect::Notify { emitter } => {

crates/gpui2/src/elements/list.rs 🔗

@@ -0,0 +1,496 @@
+use crate::{
+    px, AnyElement, AvailableSpace, BorrowAppContext, DispatchPhase, Element, IntoElement, Pixels,
+    Point, ScrollWheelEvent, Size, Style, StyleRefinement, Styled, WindowContext,
+};
+use collections::VecDeque;
+use refineable::Refineable as _;
+use std::{cell::RefCell, ops::Range, rc::Rc};
+use sum_tree::{Bias, SumTree};
+
+pub fn list(state: ListState) -> List {
+    List {
+        state,
+        style: StyleRefinement::default(),
+    }
+}
+
+pub struct List {
+    state: ListState,
+    style: StyleRefinement,
+}
+
+#[derive(Clone)]
+pub struct ListState(Rc<RefCell<StateInner>>);
+
+struct StateInner {
+    last_layout_width: Option<Pixels>,
+    render_item: Box<dyn FnMut(usize, &mut WindowContext) -> AnyElement>,
+    items: SumTree<ListItem>,
+    logical_scroll_top: Option<ListOffset>,
+    alignment: ListAlignment,
+    overdraw: Pixels,
+    #[allow(clippy::type_complexity)]
+    scroll_handler: Option<Box<dyn FnMut(&ListScrollEvent, &mut WindowContext)>>,
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+pub enum ListAlignment {
+    Top,
+    Bottom,
+}
+
+pub struct ListScrollEvent {
+    pub visible_range: Range<usize>,
+    pub count: usize,
+}
+
+#[derive(Clone)]
+enum ListItem {
+    Unrendered,
+    Rendered { height: Pixels },
+}
+
+#[derive(Clone, Debug, Default, PartialEq)]
+struct ListItemSummary {
+    count: usize,
+    rendered_count: usize,
+    unrendered_count: usize,
+    height: Pixels,
+}
+
+#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
+struct Count(usize);
+
+#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
+struct RenderedCount(usize);
+
+#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
+struct UnrenderedCount(usize);
+
+#[derive(Clone, Debug, Default)]
+struct Height(Pixels);
+
+impl ListState {
+    pub fn new<F>(
+        element_count: usize,
+        orientation: ListAlignment,
+        overdraw: Pixels,
+        render_item: F,
+    ) -> Self
+    where
+        F: 'static + FnMut(usize, &mut WindowContext) -> AnyElement,
+    {
+        let mut items = SumTree::new();
+        items.extend((0..element_count).map(|_| ListItem::Unrendered), &());
+        Self(Rc::new(RefCell::new(StateInner {
+            last_layout_width: None,
+            render_item: Box::new(render_item),
+            items,
+            logical_scroll_top: None,
+            alignment: orientation,
+            overdraw,
+            scroll_handler: None,
+        })))
+    }
+
+    pub fn reset(&self, element_count: usize) {
+        let state = &mut *self.0.borrow_mut();
+        state.logical_scroll_top = None;
+        state.items = SumTree::new();
+        state
+            .items
+            .extend((0..element_count).map(|_| ListItem::Unrendered), &());
+    }
+
+    pub fn item_count(&self) -> usize {
+        self.0.borrow().items.summary().count
+    }
+
+    pub fn splice(&self, old_range: Range<usize>, count: usize) {
+        let state = &mut *self.0.borrow_mut();
+
+        if let Some(ListOffset {
+            item_ix,
+            offset_in_item,
+        }) = state.logical_scroll_top.as_mut()
+        {
+            if old_range.contains(item_ix) {
+                *item_ix = old_range.start;
+                *offset_in_item = px(0.);
+            } else if old_range.end <= *item_ix {
+                *item_ix = *item_ix - (old_range.end - old_range.start) + count;
+            }
+        }
+
+        let mut old_heights = state.items.cursor::<Count>();
+        let mut new_heights = old_heights.slice(&Count(old_range.start), Bias::Right, &());
+        old_heights.seek_forward(&Count(old_range.end), Bias::Right, &());
+
+        new_heights.extend((0..count).map(|_| ListItem::Unrendered), &());
+        new_heights.append(old_heights.suffix(&()), &());
+        drop(old_heights);
+        state.items = new_heights;
+    }
+
+    pub fn set_scroll_handler(
+        &self,
+        handler: impl FnMut(&ListScrollEvent, &mut WindowContext) + 'static,
+    ) {
+        self.0.borrow_mut().scroll_handler = Some(Box::new(handler))
+    }
+
+    pub fn logical_scroll_top(&self) -> ListOffset {
+        self.0.borrow().logical_scroll_top()
+    }
+
+    pub fn scroll_to(&self, mut scroll_top: ListOffset) {
+        let state = &mut *self.0.borrow_mut();
+        let item_count = state.items.summary().count;
+        if scroll_top.item_ix >= item_count {
+            scroll_top.item_ix = item_count;
+            scroll_top.offset_in_item = px(0.);
+        }
+        state.logical_scroll_top = Some(scroll_top);
+    }
+}
+
+impl StateInner {
+    fn visible_range(&self, height: Pixels, scroll_top: &ListOffset) -> Range<usize> {
+        let mut cursor = self.items.cursor::<ListItemSummary>();
+        cursor.seek(&Count(scroll_top.item_ix), Bias::Right, &());
+        let start_y = cursor.start().height + scroll_top.offset_in_item;
+        cursor.seek_forward(&Height(start_y + height), Bias::Left, &());
+        scroll_top.item_ix..cursor.start().count + 1
+    }
+
+    fn scroll(
+        &mut self,
+        scroll_top: &ListOffset,
+        height: Pixels,
+        delta: Point<Pixels>,
+        cx: &mut WindowContext,
+    ) {
+        let scroll_max = (self.items.summary().height - height).max(px(0.));
+        let new_scroll_top = (self.scroll_top(scroll_top) - delta.y)
+            .max(px(0.))
+            .min(scroll_max);
+
+        if self.alignment == ListAlignment::Bottom && new_scroll_top == scroll_max {
+            self.logical_scroll_top = None;
+        } else {
+            let mut cursor = self.items.cursor::<ListItemSummary>();
+            cursor.seek(&Height(new_scroll_top), Bias::Right, &());
+            let item_ix = cursor.start().count;
+            let offset_in_item = new_scroll_top - cursor.start().height;
+            self.logical_scroll_top = Some(ListOffset {
+                item_ix,
+                offset_in_item,
+            });
+        }
+
+        if self.scroll_handler.is_some() {
+            let visible_range = self.visible_range(height, scroll_top);
+            self.scroll_handler.as_mut().unwrap()(
+                &ListScrollEvent {
+                    visible_range,
+                    count: self.items.summary().count,
+                },
+                cx,
+            );
+        }
+
+        cx.notify();
+    }
+
+    fn logical_scroll_top(&self) -> ListOffset {
+        self.logical_scroll_top
+            .unwrap_or_else(|| match self.alignment {
+                ListAlignment::Top => ListOffset {
+                    item_ix: 0,
+                    offset_in_item: px(0.),
+                },
+                ListAlignment::Bottom => ListOffset {
+                    item_ix: self.items.summary().count,
+                    offset_in_item: px(0.),
+                },
+            })
+    }
+
+    fn scroll_top(&self, logical_scroll_top: &ListOffset) -> Pixels {
+        let mut cursor = self.items.cursor::<ListItemSummary>();
+        cursor.seek(&Count(logical_scroll_top.item_ix), Bias::Right, &());
+        cursor.start().height + logical_scroll_top.offset_in_item
+    }
+}
+
+impl std::fmt::Debug for ListItem {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            Self::Unrendered => write!(f, "Unrendered"),
+            Self::Rendered { height, .. } => {
+                f.debug_struct("Rendered").field("height", height).finish()
+            }
+        }
+    }
+}
+
+#[derive(Debug, Clone, Copy)]
+pub struct ListOffset {
+    pub item_ix: usize,
+    pub offset_in_item: Pixels,
+}
+
+impl Element for List {
+    type State = ();
+
+    fn layout(
+        &mut self,
+        _state: Option<Self::State>,
+        cx: &mut crate::WindowContext,
+    ) -> (crate::LayoutId, Self::State) {
+        let mut style = Style::default();
+        style.refine(&self.style);
+        let layout_id = cx.with_text_style(style.text_style().cloned(), |cx| {
+            cx.request_layout(&style, None)
+        });
+        (layout_id, ())
+    }
+
+    fn paint(
+        self,
+        bounds: crate::Bounds<crate::Pixels>,
+        _state: &mut Self::State,
+        cx: &mut crate::WindowContext,
+    ) {
+        let state = &mut *self.state.0.borrow_mut();
+
+        // If the width of the list has changed, invalidate all cached item heights
+        if state.last_layout_width != Some(bounds.size.width) {
+            state.items = SumTree::from_iter(
+                (0..state.items.summary().count).map(|_| ListItem::Unrendered),
+                &(),
+            )
+        }
+
+        let old_items = state.items.clone();
+        let mut measured_items = VecDeque::new();
+        let mut item_elements = VecDeque::new();
+        let mut rendered_height = px(0.);
+        let mut scroll_top = state.logical_scroll_top();
+
+        let available_item_space = Size {
+            width: AvailableSpace::Definite(bounds.size.width),
+            height: AvailableSpace::MinContent,
+        };
+
+        // Render items after the scroll top, including those in the trailing overdraw
+        let mut cursor = old_items.cursor::<Count>();
+        cursor.seek(&Count(scroll_top.item_ix), Bias::Right, &());
+        for (ix, item) in cursor.by_ref().enumerate() {
+            let visible_height = rendered_height - scroll_top.offset_in_item;
+            if visible_height >= bounds.size.height + state.overdraw {
+                break;
+            }
+
+            // Use the previously cached height if available
+            let mut height = if let ListItem::Rendered { height } = item {
+                Some(*height)
+            } else {
+                None
+            };
+
+            // If we're within the visible area or the height wasn't cached, render and measure the item's element
+            if visible_height < bounds.size.height || height.is_none() {
+                let mut element = (state.render_item)(scroll_top.item_ix + ix, cx);
+                let element_size = element.measure(available_item_space, cx);
+                height = Some(element_size.height);
+                if visible_height < bounds.size.height {
+                    item_elements.push_back(element);
+                }
+            }
+
+            let height = height.unwrap();
+            rendered_height += height;
+            measured_items.push_back(ListItem::Rendered { height });
+        }
+
+        // Prepare to start walking upward from the item at the scroll top.
+        cursor.seek(&Count(scroll_top.item_ix), Bias::Right, &());
+
+        // If the rendered items do not fill the visible region, then adjust
+        // the scroll top upward.
+        if rendered_height - scroll_top.offset_in_item < bounds.size.height {
+            while rendered_height < bounds.size.height {
+                cursor.prev(&());
+                if cursor.item().is_some() {
+                    let mut element = (state.render_item)(cursor.start().0, cx);
+                    let element_size = element.measure(available_item_space, cx);
+
+                    rendered_height += element_size.height;
+                    measured_items.push_front(ListItem::Rendered {
+                        height: element_size.height,
+                    });
+                    item_elements.push_front(element)
+                } else {
+                    break;
+                }
+            }
+
+            scroll_top = ListOffset {
+                item_ix: cursor.start().0,
+                offset_in_item: rendered_height - bounds.size.height,
+            };
+
+            match state.alignment {
+                ListAlignment::Top => {
+                    scroll_top.offset_in_item = scroll_top.offset_in_item.max(px(0.));
+                    state.logical_scroll_top = Some(scroll_top);
+                }
+                ListAlignment::Bottom => {
+                    scroll_top = ListOffset {
+                        item_ix: cursor.start().0,
+                        offset_in_item: rendered_height - bounds.size.height,
+                    };
+                    state.logical_scroll_top = None;
+                }
+            };
+        }
+
+        // Measure items in the leading overdraw
+        let mut leading_overdraw = scroll_top.offset_in_item;
+        while leading_overdraw < state.overdraw {
+            cursor.prev(&());
+            if let Some(item) = cursor.item() {
+                let height = if let ListItem::Rendered { height } = item {
+                    *height
+                } else {
+                    let mut element = (state.render_item)(cursor.start().0, cx);
+                    element.measure(available_item_space, cx).height
+                };
+
+                leading_overdraw += height;
+                measured_items.push_front(ListItem::Rendered { height });
+            } else {
+                break;
+            }
+        }
+
+        let measured_range = cursor.start().0..(cursor.start().0 + measured_items.len());
+        let mut cursor = old_items.cursor::<Count>();
+        let mut new_items = cursor.slice(&Count(measured_range.start), Bias::Right, &());
+        new_items.extend(measured_items, &());
+        cursor.seek(&Count(measured_range.end), Bias::Right, &());
+        new_items.append(cursor.suffix(&()), &());
+
+        // Paint the visible items
+        let mut item_origin = bounds.origin;
+        item_origin.y -= scroll_top.offset_in_item;
+        for mut item_element in item_elements {
+            let item_height = item_element.measure(available_item_space, cx).height;
+            item_element.draw(item_origin, available_item_space, cx);
+            item_origin.y += item_height;
+        }
+
+        state.items = new_items;
+        state.last_layout_width = Some(bounds.size.width);
+
+        let list_state = self.state.clone();
+        let height = bounds.size.height;
+        cx.on_mouse_event(move |event: &ScrollWheelEvent, phase, cx| {
+            if phase == DispatchPhase::Bubble {
+                list_state.0.borrow_mut().scroll(
+                    &scroll_top,
+                    height,
+                    event.delta.pixel_delta(px(20.)),
+                    cx,
+                )
+            }
+        });
+    }
+}
+
+impl IntoElement for List {
+    type Element = Self;
+
+    fn element_id(&self) -> Option<crate::ElementId> {
+        None
+    }
+
+    fn into_element(self) -> Self::Element {
+        self
+    }
+}
+
+impl Styled for List {
+    fn style(&mut self) -> &mut StyleRefinement {
+        &mut self.style
+    }
+}
+
+impl sum_tree::Item for ListItem {
+    type Summary = ListItemSummary;
+
+    fn summary(&self) -> Self::Summary {
+        match self {
+            ListItem::Unrendered => ListItemSummary {
+                count: 1,
+                rendered_count: 0,
+                unrendered_count: 1,
+                height: px(0.),
+            },
+            ListItem::Rendered { height } => ListItemSummary {
+                count: 1,
+                rendered_count: 1,
+                unrendered_count: 0,
+                height: *height,
+            },
+        }
+    }
+}
+
+impl sum_tree::Summary for ListItemSummary {
+    type Context = ();
+
+    fn add_summary(&mut self, summary: &Self, _: &()) {
+        self.count += summary.count;
+        self.rendered_count += summary.rendered_count;
+        self.unrendered_count += summary.unrendered_count;
+        self.height += summary.height;
+    }
+}
+
+impl<'a> sum_tree::Dimension<'a, ListItemSummary> for Count {
+    fn add_summary(&mut self, summary: &'a ListItemSummary, _: &()) {
+        self.0 += summary.count;
+    }
+}
+
+impl<'a> sum_tree::Dimension<'a, ListItemSummary> for RenderedCount {
+    fn add_summary(&mut self, summary: &'a ListItemSummary, _: &()) {
+        self.0 += summary.rendered_count;
+    }
+}
+
+impl<'a> sum_tree::Dimension<'a, ListItemSummary> for UnrenderedCount {
+    fn add_summary(&mut self, summary: &'a ListItemSummary, _: &()) {
+        self.0 += summary.unrendered_count;
+    }
+}
+
+impl<'a> sum_tree::Dimension<'a, ListItemSummary> for Height {
+    fn add_summary(&mut self, summary: &'a ListItemSummary, _: &()) {
+        self.0 += summary.height;
+    }
+}
+
+impl<'a> sum_tree::SeekTarget<'a, ListItemSummary, ListItemSummary> for Count {
+    fn cmp(&self, other: &ListItemSummary, _: &()) -> std::cmp::Ordering {
+        self.0.partial_cmp(&other.count).unwrap()
+    }
+}
+
+impl<'a> sum_tree::SeekTarget<'a, ListItemSummary, ListItemSummary> for Height {
+    fn cmp(&self, other: &ListItemSummary, _: &()) -> std::cmp::Ordering {
+        self.0.partial_cmp(&other.height).unwrap()
+    }
+}

crates/gpui2/src/elements/mod.rs 🔗

@@ -1,6 +1,7 @@
 mod canvas;
 mod div;
 mod img;
+mod list;
 mod overlay;
 mod svg;
 mod text;
@@ -9,6 +10,7 @@ mod uniform_list;
 pub use canvas::*;
 pub use div::*;
 pub use img::*;
+pub use list::*;
 pub use overlay::*;
 pub use svg::*;
 pub use text::*;

crates/gpui2/src/elements/uniform_list.rs 🔗

@@ -131,7 +131,7 @@ impl Element for UniformList {
                                         }
                                     });
                             let height = match available_space.height {
-                                AvailableSpace::Definite(x) => desired_height.min(x),
+                                AvailableSpace::Definite(height) => desired_height.min(height),
                                 AvailableSpace::MinContent | AvailableSpace::MaxContent => {
                                     desired_height
                                 }

crates/gpui2/src/gpui2.rs 🔗

@@ -1,6 +1,7 @@
 #[macro_use]
 mod action;
 mod app;
+
 mod assets;
 mod color;
 mod element;
@@ -15,6 +16,7 @@ mod keymap;
 mod platform;
 pub mod prelude;
 mod scene;
+mod shared_string;
 mod style;
 mod styled;
 mod subscription;
@@ -57,6 +59,7 @@ pub use scene::*;
 pub use serde;
 pub use serde_derive;
 pub use serde_json;
+pub use shared_string::*;
 pub use smallvec;
 pub use smol::Timer;
 pub use style::*;
@@ -71,10 +74,9 @@ pub use util::arc_cow::ArcCow;
 pub use view::*;
 pub use window::*;
 
-use derive_more::{Deref, DerefMut};
 use std::{
     any::{Any, TypeId},
-    borrow::{Borrow, BorrowMut},
+    borrow::BorrowMut,
 };
 use taffy::TaffyLayoutEngine;
 
@@ -209,42 +211,3 @@ impl<T> Flatten<T> for Result<T> {
         self
     }
 }
-
-#[derive(Deref, DerefMut, Eq, PartialEq, Hash, Clone)]
-pub struct SharedString(ArcCow<'static, str>);
-
-impl Default for SharedString {
-    fn default() -> Self {
-        Self(ArcCow::Owned("".into()))
-    }
-}
-
-impl AsRef<str> for SharedString {
-    fn as_ref(&self) -> &str {
-        &self.0
-    }
-}
-
-impl Borrow<str> for SharedString {
-    fn borrow(&self) -> &str {
-        self.as_ref()
-    }
-}
-
-impl std::fmt::Debug for SharedString {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        self.0.fmt(f)
-    }
-}
-
-impl std::fmt::Display for SharedString {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(f, "{}", self.0.as_ref())
-    }
-}
-
-impl<T: Into<ArcCow<'static, str>>> From<T> for SharedString {
-    fn from(value: T) -> Self {
-        Self(value.into())
-    }
-}

crates/gpui2/src/interactive.rs 🔗

@@ -302,7 +302,7 @@ mod test {
         focus_handle: FocusHandle,
     }
 
-    actions!(TestAction);
+    actions!(test, [TestAction]);
 
     impl Render for TestView {
         type Element = Stateful<Div>;

crates/gpui2/src/key_dispatch.rs 🔗

@@ -149,13 +149,19 @@ impl DispatchTree {
     }
 
     pub fn available_actions(&self, target: DispatchNodeId) -> Vec<Box<dyn Action>> {
-        let mut actions = Vec::new();
+        let mut actions = Vec::<Box<dyn Action>>::new();
         for node_id in self.dispatch_path(target) {
             let node = &self.nodes[node_id.0];
             for DispatchActionListener { action_type, .. } in &node.action_listeners {
-                // Intentionally silence these errors without logging.
-                // If an action cannot be built by default, it's not available.
-                actions.extend(self.action_registry.build_action_type(action_type).ok());
+                if let Err(ix) = actions.binary_search_by_key(action_type, |a| a.as_any().type_id())
+                {
+                    // Intentionally silence these errors without logging.
+                    // If an action cannot be built by default, it's not available.
+                    let action = self.action_registry.build_action_type(action_type).ok();
+                    if let Some(action) = action {
+                        actions.insert(ix, action);
+                    }
+                }
             }
         }
         actions

crates/gpui2/src/keymap/context.rs 🔗

@@ -293,11 +293,13 @@ mod tests {
     #[test]
     fn test_actions_definition() {
         {
-            actions!(A, B, C, D, E, F, G);
+            actions!(test, [A, B, C, D, E, F, G]);
         }
 
         {
             actions!(
+                test,
+                [
                 A,
                 B,
                 C,
@@ -305,6 +307,7 @@ mod tests {
                 E,
                 F,
                 G, // Don't wrap, test the trailing comma
+            ]
             );
         }
     }

crates/gpui2/src/shared_string.rs 🔗

@@ -0,0 +1,101 @@
+use derive_more::{Deref, DerefMut};
+use serde::{Deserialize, Serialize};
+use std::{borrow::Borrow, sync::Arc};
+use util::arc_cow::ArcCow;
+
+#[derive(Deref, DerefMut, Eq, PartialEq, Hash, Clone)]
+pub struct SharedString(ArcCow<'static, str>);
+
+impl Default for SharedString {
+    fn default() -> Self {
+        Self(ArcCow::Owned("".into()))
+    }
+}
+
+impl AsRef<str> for SharedString {
+    fn as_ref(&self) -> &str {
+        &self.0
+    }
+}
+
+impl Borrow<str> for SharedString {
+    fn borrow(&self) -> &str {
+        self.as_ref()
+    }
+}
+
+impl std::fmt::Debug for SharedString {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        self.0.fmt(f)
+    }
+}
+
+impl std::fmt::Display for SharedString {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.0.as_ref())
+    }
+}
+
+impl PartialEq<String> for SharedString {
+    fn eq(&self, other: &String) -> bool {
+        self.as_ref() == other
+    }
+}
+
+impl PartialEq<SharedString> for String {
+    fn eq(&self, other: &SharedString) -> bool {
+        self == other.as_ref()
+    }
+}
+
+impl PartialEq<str> for SharedString {
+    fn eq(&self, other: &str) -> bool {
+        self.as_ref() == other
+    }
+}
+
+impl<'a> PartialEq<&'a str> for SharedString {
+    fn eq(&self, other: &&'a str) -> bool {
+        self.as_ref() == *other
+    }
+}
+
+impl Into<Arc<str>> for SharedString {
+    fn into(self) -> Arc<str> {
+        match self.0 {
+            ArcCow::Borrowed(borrowed) => Arc::from(borrowed),
+            ArcCow::Owned(owned) => owned.clone(),
+        }
+    }
+}
+
+impl<T: Into<ArcCow<'static, str>>> From<T> for SharedString {
+    fn from(value: T) -> Self {
+        Self(value.into())
+    }
+}
+
+impl Into<String> for SharedString {
+    fn into(self) -> String {
+        self.0.to_string()
+    }
+}
+
+impl Serialize for SharedString {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: serde::Serializer,
+    {
+        serializer.serialize_str(self.as_ref())
+    }
+}
+
+impl<'de> Deserialize<'de> for SharedString {
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+    where
+        D: serde::Deserializer<'de>,
+    {
+        let s = String::deserialize(deserializer)?;
+        Ok(SharedString::from(s))
+    }
+}

crates/gpui2/src/styled.rs 🔗

@@ -245,6 +245,13 @@ pub trait Styled: Sized {
         self
     }
 
+    /// Sets the flex direction of the element to `column-reverse`.
+    /// [Docs](https://tailwindcss.com/docs/flex-direction#column-reverse)
+    fn flex_col_reverse(mut self) -> Self {
+        self.style().flex_direction = Some(FlexDirection::ColumnReverse);
+        self
+    }
+
     /// Sets the flex direction of the element to `row`.
     /// [Docs](https://tailwindcss.com/docs/flex-direction#row)
     fn flex_row(mut self) -> Self {
@@ -252,6 +259,13 @@ pub trait Styled: Sized {
         self
     }
 
+    /// Sets the flex direction of the element to `row-reverse`.
+    /// [Docs](https://tailwindcss.com/docs/flex-direction#row-reverse)
+    fn flex_row_reverse(mut self) -> Self {
+        self.style().flex_direction = Some(FlexDirection::RowReverse);
+        self
+    }
+
     /// Sets the element to allow a flex item to grow and shrink as needed, ignoring its initial size.
     /// [Docs](https://tailwindcss.com/docs/flex#flex-1)
     fn flex_1(mut self) -> Self {

crates/gpui2/tests/action_macros.rs 🔗

@@ -1,16 +1,23 @@
+use gpui2::{actions, impl_actions};
+use gpui2_macros::register_action;
 use serde_derive::Deserialize;
 
 #[test]
-fn test_derive() {
+fn test_action_macros() {
     use gpui2 as gpui;
 
-    #[derive(PartialEq, Clone, Deserialize, gpui2_macros::Action)]
+    actions!(test, [TestAction]);
+
+    #[derive(PartialEq, Clone, Deserialize)]
     struct AnotherTestAction;
 
-    #[gpui2_macros::register_action]
+    impl_actions!(test, [AnotherTestAction]);
+
     #[derive(PartialEq, Clone, gpui::serde_derive::Deserialize)]
     struct RegisterableAction {}
 
+    register_action!(RegisterableAction);
+
     impl gpui::Action for RegisterableAction {
         fn boxed_clone(&self) -> Box<dyn gpui::Action> {
             todo!()

crates/gpui2_macros/src/action.rs 🔗

@@ -1,97 +0,0 @@
-// Input:
-//
-// #[action]
-// struct Foo {
-//   bar: String,
-// }
-
-// Output:
-//
-// #[gpui::register_action]
-// #[derive(gpui::serde::Deserialize, std::cmp::PartialEq, std::clone::Clone, std::default::Default, std::fmt::Debug)]
-// struct Foo {
-//   bar: String,
-// }
-
-use proc_macro::TokenStream;
-use quote::quote;
-use syn::{parse_macro_input, DeriveInput, Error};
-
-use crate::register_action::register_action;
-
-pub fn action(input: TokenStream) -> TokenStream {
-    let input = parse_macro_input!(input as DeriveInput);
-
-    let name = &input.ident;
-
-    if input.generics.lt_token.is_some() {
-        return Error::new(name.span(), "Actions must be a concrete type")
-            .into_compile_error()
-            .into();
-    }
-
-    let is_unit_struct = match input.data {
-        syn::Data::Struct(struct_data) => struct_data.fields.is_empty(),
-        syn::Data::Enum(_) => false,
-        syn::Data::Union(_) => false,
-    };
-
-    let build_impl = if is_unit_struct {
-        quote! {
-            let _ = value;
-            Ok(std::boxed::Box::new(Self {}))
-        }
-    } else {
-        quote! {
-            Ok(std::boxed::Box::new(gpui::serde_json::from_value::<Self>(value)?))
-        }
-    };
-
-    let register_action = register_action(&name);
-
-    let output = quote! {
-        const _: fn() = || {
-            fn assert_impl<T: ?Sized + for<'a> gpui::serde::Deserialize<'a> +  ::std::cmp::PartialEq + ::std::clone::Clone>() {}
-            assert_impl::<#name>();
-        };
-
-        impl gpui::Action for #name {
-            fn name(&self) -> &'static str
-            {
-                ::std::any::type_name::<#name>()
-            }
-
-            fn debug_name() -> &'static str
-            where
-                Self: ::std::marker::Sized
-            {
-                ::std::any::type_name::<#name>()
-            }
-
-            fn build(value: gpui::serde_json::Value) -> gpui::Result<::std::boxed::Box<dyn gpui::Action>>
-            where
-                Self: ::std::marker::Sized {
-                    #build_impl
-            }
-
-            fn partial_eq(&self, action: &dyn gpui::Action) -> bool {
-                action
-                    .as_any()
-                    .downcast_ref::<Self>()
-                    .map_or(false, |a| self == a)
-            }
-
-            fn boxed_clone(&self) ->  std::boxed::Box<dyn gpui::Action> {
-                ::std::boxed::Box::new(self.clone())
-            }
-
-            fn as_any(&self) -> &dyn ::std::any::Any {
-                self
-            }
-        }
-
-        #register_action
-    };
-
-    TokenStream::from(output)
-}

crates/gpui2_macros/src/gpui2_macros.rs 🔗

@@ -1,4 +1,3 @@
-mod action;
 mod derive_into_element;
 mod register_action;
 mod style_helpers;
@@ -6,14 +5,9 @@ mod test;
 
 use proc_macro::TokenStream;
 
-#[proc_macro_derive(Action)]
-pub fn action(input: TokenStream) -> TokenStream {
-    action::action(input)
-}
-
-#[proc_macro_attribute]
-pub fn register_action(attr: TokenStream, item: TokenStream) -> TokenStream {
-    register_action::register_action_macro(attr, item)
+#[proc_macro]
+pub fn register_action(ident: TokenStream) -> TokenStream {
+    register_action::register_action_macro(ident)
 }
 
 #[proc_macro_derive(IntoElement)]

crates/gpui2_macros/src/register_action.rs 🔗

@@ -14,47 +14,13 @@
 use proc_macro::TokenStream;
 use proc_macro2::Ident;
 use quote::{format_ident, quote};
-use syn::{parse_macro_input, DeriveInput, Error};
+use syn::parse_macro_input;
 
-pub fn register_action_macro(_attr: TokenStream, item: TokenStream) -> TokenStream {
-    let input = parse_macro_input!(item as DeriveInput);
-    let registration = register_action(&input.ident);
-
-    let has_action_derive = input
-        .attrs
-        .iter()
-        .find(|attr| {
-            (|| {
-                let meta = attr.parse_meta().ok()?;
-                meta.path().is_ident("derive").then(|| match meta {
-                    syn::Meta::Path(_) => None,
-                    syn::Meta::NameValue(_) => None,
-                    syn::Meta::List(list) => list
-                        .nested
-                        .iter()
-                        .find(|list| match list {
-                            syn::NestedMeta::Meta(meta) => meta.path().is_ident("Action"),
-                            syn::NestedMeta::Lit(_) => false,
-                        })
-                        .map(|_| true),
-                })?
-            })()
-            .unwrap_or(false)
-        })
-        .is_some();
-
-    if has_action_derive {
-        return Error::new(
-            input.ident.span(),
-            "The Action derive macro has already registered this action",
-        )
-        .into_compile_error()
-        .into();
-    }
+pub fn register_action_macro(ident: TokenStream) -> TokenStream {
+    let name = parse_macro_input!(ident as Ident);
+    let registration = register_action(&name);
 
     TokenStream::from(quote! {
-        #input
-
         #registration
     })
 }
@@ -78,7 +44,7 @@ pub(crate) fn register_action(type_name: &Ident) -> proc_macro2::TokenStream {
         #[doc(hidden)]
         fn #action_builder_fn_name() -> gpui::ActionData {
             gpui::ActionData {
-                name: ::std::any::type_name::<#type_name>(),
+                name: <#type_name as gpui::Action>::debug_name(),
                 type_id: ::std::any::TypeId::of::<#type_name>(),
                 build: <#type_name as gpui::Action>::build,
             }

crates/install_cli2/src/install_cli2.rs 🔗

@@ -3,7 +3,7 @@ use gpui::{actions, AsyncAppContext};
 use std::path::Path;
 use util::ResultExt;
 
-actions!(Install);
+actions!(cli, [Install]);
 
 pub async fn install_cli(cx: &AsyncAppContext) -> Result<()> {
     let cli_path = cx.update(|cx| cx.path_for_auxiliary_executable("cli"))??;

crates/language_selector2/src/language_selector.rs 🔗

@@ -14,9 +14,9 @@ use project::Project;
 use std::sync::Arc;
 use ui::{prelude::*, HighlightedLabel, ListItem};
 use util::ResultExt;
-use workspace::Workspace;
+use workspace::{ModalView, Workspace};
 
-actions!(Toggle);
+actions!(language_selector, [Toggle]);
 
 pub fn init(cx: &mut AppContext) {
     cx.observe_new_views(LanguageSelector::register).detach();
@@ -81,6 +81,7 @@ impl FocusableView for LanguageSelector {
 }
 
 impl EventEmitter<DismissEvent> for LanguageSelector {}
+impl ModalView for LanguageSelector {}
 
 pub struct LanguageSelectorDelegate {
     language_selector: WeakView<LanguageSelector>,

crates/live_kit_client2/examples/test_app2.rs 🔗

@@ -1,17 +1,15 @@
 use std::{sync::Arc, time::Duration};
 
 use futures::StreamExt;
-use gpui::{Action, KeyBinding};
+use gpui::{actions, KeyBinding};
 use live_kit_client2::{
     LocalAudioTrack, LocalVideoTrack, RemoteAudioTrackUpdate, RemoteVideoTrackUpdate, Room,
 };
 use live_kit_server::token::{self, VideoGrant};
 use log::LevelFilter;
-use serde_derive::Deserialize;
 use simplelog::SimpleLogger;
 
-#[derive(Deserialize, Debug, Clone, Copy, PartialEq, Action)]
-struct Quit;
+actions!(live_kit_client, [Quit]);
 
 fn main() {
     SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger");

crates/menu2/src/menu2.rs 🔗

@@ -10,12 +10,15 @@ use gpui::actions;
 pub fn init() {}
 
 actions!(
-    Cancel,
-    Confirm,
-    SecondaryConfirm,
-    SelectPrev,
-    SelectNext,
-    SelectFirst,
-    SelectLast,
-    ShowContextMenu
+    menu,
+    [
+        Cancel,
+        Confirm,
+        SecondaryConfirm,
+        SelectPrev,
+        SelectNext,
+        SelectFirst,
+        SelectLast,
+        ShowContextMenu
+    ]
 );

crates/outline2/src/outline.rs 🔗

@@ -20,9 +20,9 @@ use std::{
 use theme::{color_alpha, ActiveTheme, ThemeSettings};
 use ui::{prelude::*, ListItem};
 use util::ResultExt;
-use workspace::Workspace;
+use workspace::{ModalView, Workspace};
 
-actions!(Toggle);
+actions!(outline, [Toggle]);
 
 pub fn init(cx: &mut AppContext) {
     cx.observe_new_views(OutlineView::register).detach();
@@ -57,6 +57,7 @@ impl FocusableView for OutlineView {
 }
 
 impl EventEmitter<DismissEvent> for OutlineView {}
+impl ModalView for OutlineView {}
 
 impl Render for OutlineView {
     type Element = Div;

crates/project_panel2/src/project_panel.rs 🔗

@@ -103,23 +103,26 @@ pub struct EntryDetails {
 }
 
 actions!(
-    ExpandSelectedEntry,
-    CollapseSelectedEntry,
-    CollapseAllEntries,
-    NewDirectory,
-    NewFile,
-    Copy,
-    CopyPath,
-    CopyRelativePath,
-    RevealInFinder,
-    OpenInTerminal,
-    Cut,
-    Paste,
-    Delete,
-    Rename,
-    Open,
-    ToggleFocus,
-    NewSearchInDirectory,
+    project_panel,
+    [
+        ExpandSelectedEntry,
+        CollapseSelectedEntry,
+        CollapseAllEntries,
+        NewDirectory,
+        NewFile,
+        Copy,
+        CopyPath,
+        CopyRelativePath,
+        RevealInFinder,
+        OpenInTerminal,
+        Cut,
+        Paste,
+        Delete,
+        Rename,
+        Open,
+        ToggleFocus,
+        NewSearchInDirectory,
+    ]
 );
 
 pub fn init_settings(cx: &mut AppContext) {

crates/recent_projects2/src/recent_projects.rs 🔗

@@ -13,8 +13,8 @@ use std::sync::Arc;
 use ui::{prelude::*, ListItem};
 use util::paths::PathExt;
 use workspace::{
-    notifications::simple_message_notification::MessageNotification, Workspace, WorkspaceLocation,
-    WORKSPACE_DB,
+    notifications::simple_message_notification::MessageNotification, ModalView, Workspace,
+    WorkspaceLocation, WORKSPACE_DB,
 };
 
 pub use projects::OpenRecent;
@@ -27,6 +27,8 @@ pub struct RecentProjects {
     picker: View<Picker<RecentProjectsDelegate>>,
 }
 
+impl ModalView for RecentProjects {}
+
 impl RecentProjects {
     fn new(delegate: RecentProjectsDelegate, cx: &mut ViewContext<Self>) -> Self {
         Self {

crates/rich_text2/src/rich_text.rs 🔗

@@ -1,13 +1,16 @@
-use std::{ops::Range, sync::Arc};
-
-use anyhow::bail;
 use futures::FutureExt;
-use gpui::{AnyElement, FontStyle, FontWeight, HighlightStyle, UnderlineStyle};
+use gpui::{
+    AnyElement, ElementId, FontStyle, FontWeight, HighlightStyle, InteractiveText, IntoElement,
+    SharedString, StyledText, UnderlineStyle, WindowContext,
+};
 use language::{HighlightId, Language, LanguageRegistry};
+use std::{ops::Range, sync::Arc};
+use theme::ActiveTheme;
 use util::RangeExt;
 
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub enum Highlight {
+    Code,
     Id(HighlightId),
     Highlight(HighlightStyle),
     Mention,
@@ -28,24 +31,10 @@ impl From<HighlightId> for Highlight {
 
 #[derive(Debug, Clone)]
 pub struct RichText {
-    pub text: String,
+    pub text: SharedString,
     pub highlights: Vec<(Range<usize>, Highlight)>,
-    pub region_ranges: Vec<Range<usize>>,
-    pub regions: Vec<RenderedRegion>,
-}
-
-#[derive(Clone, Copy, Debug, PartialEq, Eq)]
-pub enum BackgroundKind {
-    Code,
-    /// A mention background for non-self user.
-    Mention,
-    SelfMention,
-}
-
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub struct RenderedRegion {
-    pub background_kind: Option<BackgroundKind>,
-    pub link_url: Option<String>,
+    pub link_ranges: Vec<Range<usize>>,
+    pub link_urls: Arc<[String]>,
 }
 
 /// Allows one to specify extra links to the rendered markdown, which can be used
@@ -56,94 +45,71 @@ pub struct Mention {
 }
 
 impl RichText {
-    pub fn element(
-        &self,
-        // syntax: Arc<SyntaxTheme>,
-        //  style: RichTextStyle,
-        // cx: &mut ViewContext<V>,
-    ) -> AnyElement {
-        todo!();
+    pub fn element(&self, id: ElementId, cx: &mut WindowContext) -> AnyElement {
+        let theme = cx.theme();
+        let code_background = theme.colors().surface_background;
 
-        // let mut region_id = 0;
-        // let view_id = cx.view_id();
-
-        // let regions = self.regions.clone();
-
-        // enum Markdown {}
-        // Text::new(self.text.clone(), style.text.clone())
-        //     .with_highlights(
-        //         self.highlights
-        //             .iter()
-        //             .filter_map(|(range, highlight)| {
-        //                 let style = match highlight {
-        //                     Highlight::Id(id) => id.style(&syntax)?,
-        //                     Highlight::Highlight(style) => style.clone(),
-        //                     Highlight::Mention => style.mention_highlight,
-        //                     Highlight::SelfMention => style.self_mention_highlight,
-        //                 };
-        //                 Some((range.clone(), style))
-        //             })
-        //             .collect::<Vec<_>>(),
-        //     )
-        //     .with_custom_runs(self.region_ranges.clone(), move |ix, bounds, cx| {
-        //         region_id += 1;
-        //         let region = regions[ix].clone();
-        //         if let Some(url) = region.link_url {
-        //             cx.scene().push_cursor_region(CursorRegion {
-        //                 bounds,
-        //                 style: CursorStyle::PointingHand,
-        //             });
-        //             cx.scene().push_mouse_region(
-        //                 MouseRegion::new::<Markdown>(view_id, region_id, bounds)
-        //                     .on_click::<V, _>(MouseButton::Left, move |_, _, cx| {
-        //                         cx.platform().open_url(&url)
-        //                     }),
-        //             );
-        //         }
-        //         if let Some(region_kind) = &region.background_kind {
-        //             let background = match region_kind {
-        //                 BackgroundKind::Code => style.code_background,
-        //                 BackgroundKind::Mention => style.mention_background,
-        //                 BackgroundKind::SelfMention => style.self_mention_background,
-        //             };
-        //             if background.is_some() {
-        //                 cx.scene().push_quad(gpui::Quad {
-        //                     bounds,
-        //                     background,
-        //                     border: Default::default(),
-        //                     corner_radii: (2.0).into(),
-        //                 });
-        //             }
-        //         }
-        //     })
-        //     .with_soft_wrap(true)
-        //     .into_any()
+        InteractiveText::new(
+            id,
+            StyledText::new(self.text.clone()).with_highlights(
+                &cx.text_style(),
+                self.highlights.iter().map(|(range, highlight)| {
+                    (
+                        range.clone(),
+                        match highlight {
+                            Highlight::Code => HighlightStyle {
+                                background_color: Some(code_background),
+                                ..Default::default()
+                            },
+                            Highlight::Id(id) => HighlightStyle {
+                                background_color: Some(code_background),
+                                ..id.style(&theme.syntax()).unwrap_or_default()
+                            },
+                            Highlight::Highlight(highlight) => *highlight,
+                            Highlight::Mention => HighlightStyle {
+                                font_weight: Some(FontWeight::BOLD),
+                                ..Default::default()
+                            },
+                            Highlight::SelfMention => HighlightStyle {
+                                font_weight: Some(FontWeight::BOLD),
+                                ..Default::default()
+                            },
+                        },
+                    )
+                }),
+            ),
+        )
+        .on_click(self.link_ranges.clone(), {
+            let link_urls = self.link_urls.clone();
+            move |ix, cx| cx.open_url(&link_urls[ix])
+        })
+        .into_any_element()
     }
 
-    pub fn add_mention(
-        &mut self,
-        range: Range<usize>,
-        is_current_user: bool,
-        mention_style: HighlightStyle,
-    ) -> anyhow::Result<()> {
-        if range.end > self.text.len() {
-            bail!(
-                "Mention in range {range:?} is outside of bounds for a message of length {}",
-                self.text.len()
-            );
-        }
+    // pub fn add_mention(
+    //     &mut self,
+    //     range: Range<usize>,
+    //     is_current_user: bool,
+    //     mention_style: HighlightStyle,
+    // ) -> anyhow::Result<()> {
+    //     if range.end > self.text.len() {
+    //         bail!(
+    //             "Mention in range {range:?} is outside of bounds for a message of length {}",
+    //             self.text.len()
+    //         );
+    //     }
 
-        if is_current_user {
-            self.region_ranges.push(range.clone());
-            self.regions.push(RenderedRegion {
-                background_kind: Some(BackgroundKind::Mention),
-                link_url: None,
-            });
-        }
-        self.highlights
-            .push((range, Highlight::Highlight(mention_style)));
-        Ok(())
-    }
+    //     if is_current_user {
+    //         self.region_ranges.push(range.clone());
+    //         self.regions.push(RenderedRegion {
+    //             background_kind: Some(BackgroundKind::Mention),
+    //             link_url: None,
+    //         });
+    //     }
+    //     self.highlights
+    //         .push((range, Highlight::Highlight(mention_style)));
+    //     Ok(())
+    // }
 }
 
 pub fn render_markdown_mut(
@@ -151,7 +117,10 @@ pub fn render_markdown_mut(
     mut mentions: &[Mention],
     language_registry: &Arc<LanguageRegistry>,
     language: Option<&Arc<Language>>,
-    data: &mut RichText,
+    text: &mut String,
+    highlights: &mut Vec<(Range<usize>, Highlight)>,
+    link_ranges: &mut Vec<Range<usize>>,
+    link_urls: &mut Vec<String>,
 ) {
     use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag};
 
@@ -163,18 +132,18 @@ pub fn render_markdown_mut(
 
     let options = Options::all();
     for (event, source_range) in Parser::new_ext(&block, options).into_offset_iter() {
-        let prev_len = data.text.len();
+        let prev_len = text.len();
         match event {
             Event::Text(t) => {
                 if let Some(language) = &current_language {
-                    render_code(&mut data.text, &mut data.highlights, t.as_ref(), language);
+                    render_code(text, highlights, t.as_ref(), language);
                 } else {
                     if let Some(mention) = mentions.first() {
                         if source_range.contains_inclusive(&mention.range) {
                             mentions = &mentions[1..];
                             let range = (prev_len + mention.range.start - source_range.start)
                                 ..(prev_len + mention.range.end - source_range.start);
-                            data.highlights.push((
+                            highlights.push((
                                 range.clone(),
                                 if mention.is_self_mention {
                                     Highlight::SelfMention
@@ -182,19 +151,10 @@ pub fn render_markdown_mut(
                                     Highlight::Mention
                                 },
                             ));
-                            data.region_ranges.push(range);
-                            data.regions.push(RenderedRegion {
-                                background_kind: Some(if mention.is_self_mention {
-                                    BackgroundKind::SelfMention
-                                } else {
-                                    BackgroundKind::Mention
-                                }),
-                                link_url: None,
-                            });
                         }
                     }
 
-                    data.text.push_str(t.as_ref());
+                    text.push_str(t.as_ref());
                     let mut style = HighlightStyle::default();
                     if bold_depth > 0 {
                         style.font_weight = Some(FontWeight::BOLD);
@@ -203,11 +163,8 @@ pub fn render_markdown_mut(
                         style.font_style = Some(FontStyle::Italic);
                     }
                     if let Some(link_url) = link_url.clone() {
-                        data.region_ranges.push(prev_len..data.text.len());
-                        data.regions.push(RenderedRegion {
-                            link_url: Some(link_url),
-                            background_kind: None,
-                        });
+                        link_ranges.push(prev_len..text.len());
+                        link_urls.push(link_url);
                         style.underline = Some(UnderlineStyle {
                             thickness: 1.0.into(),
                             ..Default::default()
@@ -216,27 +173,25 @@ pub fn render_markdown_mut(
 
                     if style != HighlightStyle::default() {
                         let mut new_highlight = true;
-                        if let Some((last_range, last_style)) = data.highlights.last_mut() {
+                        if let Some((last_range, last_style)) = highlights.last_mut() {
                             if last_range.end == prev_len
                                 && last_style == &Highlight::Highlight(style)
                             {
-                                last_range.end = data.text.len();
+                                last_range.end = text.len();
                                 new_highlight = false;
                             }
                         }
                         if new_highlight {
-                            data.highlights
-                                .push((prev_len..data.text.len(), Highlight::Highlight(style)));
+                            highlights.push((prev_len..text.len(), Highlight::Highlight(style)));
                         }
                     }
                 }
             }
             Event::Code(t) => {
-                data.text.push_str(t.as_ref());
-                data.region_ranges.push(prev_len..data.text.len());
+                text.push_str(t.as_ref());
                 if link_url.is_some() {
-                    data.highlights.push((
-                        prev_len..data.text.len(),
+                    highlights.push((
+                        prev_len..text.len(),
                         Highlight::Highlight(HighlightStyle {
                             underline: Some(UnderlineStyle {
                                 thickness: 1.0.into(),
@@ -246,19 +201,19 @@ pub fn render_markdown_mut(
                         }),
                     ));
                 }
-                data.regions.push(RenderedRegion {
-                    background_kind: Some(BackgroundKind::Code),
-                    link_url: link_url.clone(),
-                });
+                if let Some(link_url) = link_url.clone() {
+                    link_ranges.push(prev_len..text.len());
+                    link_urls.push(link_url);
+                }
             }
             Event::Start(tag) => match tag {
-                Tag::Paragraph => new_paragraph(&mut data.text, &mut list_stack),
+                Tag::Paragraph => new_paragraph(text, &mut list_stack),
                 Tag::Heading(_, _, _) => {
-                    new_paragraph(&mut data.text, &mut list_stack);
+                    new_paragraph(text, &mut list_stack);
                     bold_depth += 1;
                 }
                 Tag::CodeBlock(kind) => {
-                    new_paragraph(&mut data.text, &mut list_stack);
+                    new_paragraph(text, &mut list_stack);
                     current_language = if let CodeBlockKind::Fenced(language) = kind {
                         language_registry
                             .language_for_name(language.as_ref())
@@ -278,18 +233,18 @@ pub fn render_markdown_mut(
                     let len = list_stack.len();
                     if let Some((list_number, has_content)) = list_stack.last_mut() {
                         *has_content = false;
-                        if !data.text.is_empty() && !data.text.ends_with('\n') {
-                            data.text.push('\n');
+                        if !text.is_empty() && !text.ends_with('\n') {
+                            text.push('\n');
                         }
                         for _ in 0..len - 1 {
-                            data.text.push_str("  ");
+                            text.push_str("  ");
                         }
                         if let Some(number) = list_number {
-                            data.text.push_str(&format!("{}. ", number));
+                            text.push_str(&format!("{}. ", number));
                             *number += 1;
                             *has_content = false;
                         } else {
-                            data.text.push_str("- ");
+                            text.push_str("- ");
                         }
                     }
                 }
@@ -304,8 +259,8 @@ pub fn render_markdown_mut(
                 Tag::List(_) => drop(list_stack.pop()),
                 _ => {}
             },
-            Event::HardBreak => data.text.push('\n'),
-            Event::SoftBreak => data.text.push(' '),
+            Event::HardBreak => text.push('\n'),
+            Event::SoftBreak => text.push(' '),
             _ => {}
         }
     }
@@ -317,18 +272,35 @@ pub fn render_markdown(
     language_registry: &Arc<LanguageRegistry>,
     language: Option<&Arc<Language>>,
 ) -> RichText {
-    let mut data = RichText {
-        text: Default::default(),
-        highlights: Default::default(),
-        region_ranges: Default::default(),
-        regions: Default::default(),
-    };
-
-    render_markdown_mut(&block, mentions, language_registry, language, &mut data);
+    // let mut data = RichText {
+    //     text: Default::default(),
+    //     highlights: Default::default(),
+    //     region_ranges: Default::default(),
+    //     regions: Default::default(),
+    // };
 
-    data.text = data.text.trim().to_string();
+    let mut text = String::new();
+    let mut highlights = Vec::new();
+    let mut link_ranges = Vec::new();
+    let mut link_urls = Vec::new();
+    render_markdown_mut(
+        &block,
+        mentions,
+        language_registry,
+        language,
+        &mut text,
+        &mut highlights,
+        &mut link_ranges,
+        &mut link_urls,
+    );
+    text.truncate(text.trim_end().len());
 
-    data
+    RichText {
+        text: SharedString::from(text),
+        link_urls: link_urls.into(),
+        link_ranges,
+        highlights,
+    }
 }
 
 pub fn render_code(
@@ -339,11 +311,19 @@ pub fn render_code(
 ) {
     let prev_len = text.len();
     text.push_str(content);
+    let mut offset = 0;
     for (range, highlight_id) in language.highlight_text(&content.into(), 0..content.len()) {
+        if range.start > offset {
+            highlights.push((prev_len + offset..prev_len + range.start, Highlight::Code));
+        }
         highlights.push((
             prev_len + range.start..prev_len + range.end,
             Highlight::Id(highlight_id),
         ));
+        offset = range.end;
+    }
+    if offset < content.len() {
+        highlights.push((prev_len + offset..prev_len + content.len(), Highlight::Code));
     }
 }
 

crates/search2/src/buffer_search.rs 🔗

@@ -10,7 +10,7 @@ use collections::HashMap;
 use editor::{Editor, EditorMode};
 use futures::channel::oneshot;
 use gpui::{
-    actions, div, red, Action, AppContext, Div, EventEmitter, FocusableView,
+    actions, div, impl_actions, red, Action, AppContext, Div, EventEmitter, FocusableView,
     InteractiveElement as _, IntoElement, KeyContext, ParentElement as _, Render, Styled,
     Subscription, Task, View, ViewContext, VisualContext as _, WeakView, WindowContext,
 };
@@ -26,12 +26,14 @@ use workspace::{
     ToolbarItemLocation, ToolbarItemView,
 };
 
-#[derive(PartialEq, Clone, Deserialize, Default, Action)]
+#[derive(PartialEq, Clone, Deserialize)]
 pub struct Deploy {
     pub focus: bool,
 }
 
-actions!(Dismiss, FocusEditor);
+impl_actions!(buffer_search, [Deploy]);
+
+actions!(buffer_search, [Dismiss, FocusEditor]);
 
 pub enum Event {
     UpdateLocation,

crates/search2/src/search.rs 🔗

@@ -22,20 +22,23 @@ pub fn init(cx: &mut AppContext) {
 }
 
 actions!(
-    CycleMode,
-    ToggleWholeWord,
-    ToggleCaseSensitive,
-    ToggleReplace,
-    SelectNextMatch,
-    SelectPrevMatch,
-    SelectAllMatches,
-    NextHistoryQuery,
-    PreviousHistoryQuery,
-    ActivateTextMode,
-    ActivateSemanticMode,
-    ActivateRegexMode,
-    ReplaceAll,
-    ReplaceNext,
+    search,
+    [
+        CycleMode,
+        ToggleWholeWord,
+        ToggleCaseSensitive,
+        ToggleReplace,
+        SelectNextMatch,
+        SelectPrevMatch,
+        SelectAllMatches,
+        NextHistoryQuery,
+        PreviousHistoryQuery,
+        ActivateTextMode,
+        ActivateSemanticMode,
+        ActivateRegexMode,
+        ReplaceAll,
+        ReplaceNext,
+    ]
 );
 
 bitflags! {

crates/settings2/src/keymap_file.rs 🔗

@@ -1,7 +1,7 @@
 use crate::{settings_store::parse_json_with_comments, SettingsAssets};
 use anyhow::{anyhow, Context, Result};
 use collections::BTreeMap;
-use gpui::{actions, Action, AppContext, KeyBinding, SharedString};
+use gpui::{Action, AppContext, KeyBinding, SharedString};
 use schemars::{
     gen::{SchemaGenerator, SchemaSettings},
     schema::{InstanceType, Schema, SchemaObject, SingleOrVec, SubschemaValidation},
@@ -137,10 +137,8 @@ impl KeymapFile {
     }
 }
 
-actions!(NoAction);
-
 fn no_action() -> Box<dyn gpui::Action> {
-    NoAction.boxed_clone()
+    gpui::NoAction.boxed_clone()
 }
 
 #[cfg(test)]

crates/storybook2/src/stories/focus.rs 🔗

@@ -4,7 +4,7 @@ use gpui::{
 };
 use ui::prelude::*;
 
-actions!(ActionA, ActionB, ActionC);
+actions!(focus, [ActionA, ActionB, ActionC]);
 
 pub struct FocusStory {
     child_1_focus: FocusHandle,

crates/terminal2/src/terminal2.rs 🔗

@@ -59,13 +59,16 @@ use crate::mappings::{colors::to_alac_rgb, keys::to_esc_str};
 use lazy_static::lazy_static;
 
 actions!(
-    Clear,
-    Copy,
-    Paste,
-    ShowCharacterPalette,
-    SearchTest,
-    SendText,
-    SendKeystroke,
+    terminal,
+    [
+        Clear,
+        Copy,
+        Paste,
+        ShowCharacterPalette,
+        SearchTest,
+        SendText,
+        SendKeystroke,
+    ]
 );
 
 ///Scrolling is unbearably sluggish by default. Alacritty supports a configurable

crates/terminal_view2/src/terminal_element.rs 🔗

@@ -5,7 +5,7 @@ use gpui::{
     FontStyle, FontWeight, HighlightStyle, Hsla, InteractiveElement, InteractiveElementState,
     IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton, Pixels,
     PlatformInputHandler, Point, Rgba, ShapedLine, Size, StatefulInteractiveElement, Styled,
-    TextRun, TextStyle, TextSystem, UnderlineStyle, View, WhiteSpace, WindowContext,
+    TextRun, TextStyle, TextSystem, UnderlineStyle, WhiteSpace, WindowContext,
 };
 use itertools::Itertools;
 use language::CursorShape;
@@ -27,8 +27,6 @@ use ui::Tooltip;
 use std::mem;
 use std::{fmt::Debug, ops::RangeInclusive};
 
-use crate::TerminalView;
-
 ///The information generated during layout that is necessary for painting
 pub struct LayoutState {
     cells: Vec<LayoutCell>,
@@ -149,7 +147,6 @@ impl LayoutRect {
 ///We need to keep a reference to the view for mouse events, do we need it for any other terminal stuff, or can we move that to connection?
 pub struct TerminalElement {
     terminal: Model<Terminal>,
-    terminal_view: View<TerminalView>,
     focus: FocusHandle,
     focused: bool,
     cursor_visible: bool,
@@ -168,7 +165,6 @@ impl StatefulInteractiveElement for TerminalElement {}
 impl TerminalElement {
     pub fn new(
         terminal: Model<Terminal>,
-        terminal_view: View<TerminalView>,
         focus: FocusHandle,
         focused: bool,
         cursor_visible: bool,
@@ -176,7 +172,6 @@ impl TerminalElement {
     ) -> TerminalElement {
         TerminalElement {
             terminal,
-            terminal_view,
             focused,
             focus: focus.clone(),
             cursor_visible,
@@ -474,6 +469,7 @@ impl TerminalElement {
                 .size_full()
                 .id("terminal-element")
                 .tooltip(move |cx| Tooltip::text(hovered_word.word.clone(), cx))
+                .into_any_element()
         });
 
         let TerminalContent {
@@ -575,7 +571,7 @@ impl TerminalElement {
             relative_highlighted_ranges,
             mode: *mode,
             display_offset: *display_offset,
-            hyperlink_tooltip: None, // todo!(tooltips)
+            hyperlink_tooltip,
             gutter,
         }
     }
@@ -774,18 +770,11 @@ impl Element for TerminalElement {
         (layout_id, interactive_state)
     }
 
-    fn paint(
-        mut self,
-        bounds: Bounds<Pixels>,
-        state: &mut Self::State,
-        cx: &mut WindowContext<'_>,
-    ) {
+    fn paint(self, bounds: Bounds<Pixels>, state: &mut Self::State, cx: &mut WindowContext<'_>) {
         let mut layout = self.compute_layout(bounds, cx);
 
         let theme = cx.theme();
 
-        let dispatch_context = self.terminal_view.read(cx).dispatch_context(cx);
-        self.interactivity().key_context = Some(dispatch_context);
         cx.paint_quad(
             bounds,
             Default::default(),

crates/terminal_view2/src/terminal_panel.rs 🔗

@@ -24,7 +24,7 @@ use anyhow::Result;
 
 const TERMINAL_PANEL_KEY: &'static str = "TerminalPanel";
 
-actions!(ToggleFocus);
+actions!(terminal_view, [ToggleFocus]);
 
 pub fn init(cx: &mut AppContext) {
     cx.observe_new_views(

crates/terminal_view2/src/terminal_view.rs 🔗

@@ -9,9 +9,10 @@ pub mod terminal_panel;
 // use crate::terminal_element::TerminalElement;
 use editor::{scroll::autoscroll::Autoscroll, Editor};
 use gpui::{
-    div, Action, AnyElement, AppContext, Div, EventEmitter, FocusEvent, FocusHandle, Focusable,
-    FocusableElement, FocusableView, KeyContext, KeyDownEvent, Keystroke, Model, MouseButton,
-    MouseDownEvent, Pixels, Render, Subscription, Task, View, VisualContext, WeakView,
+    div, impl_actions, overlay, AnyElement, AppContext, DismissEvent, Div, EventEmitter,
+    FocusEvent, FocusHandle, Focusable, FocusableElement, FocusableView, KeyContext, KeyDownEvent,
+    Keystroke, Model, MouseButton, MouseDownEvent, Pixels, Render, Styled, Subscription, Task,
+    View, VisualContext, WeakView,
 };
 use language::Bias;
 use persistence::TERMINAL_DB;
@@ -54,12 +55,14 @@ const CURSOR_BLINK_INTERVAL: Duration = Duration::from_millis(500);
 #[derive(Clone, Debug, PartialEq)]
 pub struct ScrollTerminal(pub i32);
 
-#[derive(Clone, Debug, Default, Deserialize, PartialEq, Action)]
+#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
 pub struct SendText(String);
 
-#[derive(Clone, Debug, Default, Deserialize, PartialEq, Action)]
+#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
 pub struct SendKeystroke(String);
 
+impl_actions!(terminal_view, [SendText, SendKeystroke]);
+
 pub fn init(cx: &mut AppContext) {
     terminal_panel::init(cx);
     terminal::init(cx);
@@ -81,7 +84,7 @@ pub struct TerminalView {
     has_new_content: bool,
     //Currently using iTerm bell, show bell emoji in tab until input is received
     has_bell: bool,
-    context_menu: Option<View<ContextMenu>>,
+    context_menu: Option<(View<ContextMenu>, gpui::Point<Pixels>, Subscription)>,
     blink_state: bool,
     blinking_on: bool,
     blinking_paused: bool,
@@ -312,14 +315,24 @@ impl TerminalView {
         position: gpui::Point<Pixels>,
         cx: &mut ViewContext<Self>,
     ) {
-        self.context_menu = Some(ContextMenu::build(cx, |menu, cx| {
+        let context_menu = ContextMenu::build(cx, |menu, cx| {
             menu.action("Clear", Box::new(Clear))
                 .action("Close", Box::new(CloseActiveItem { save_intent: None }))
-        }));
-        // todo!(context menus)
-        //     self.context_menu
-        //         .show(position, AnchorCorner::TopLeft, menu_entries, cx);
-        //     cx.notify();
+        });
+
+        cx.focus_view(&context_menu);
+        let subscription =
+            cx.subscribe(&context_menu, |this, _, _: &DismissEvent, cx| {
+                if this.context_menu.as_ref().is_some_and(|context_menu| {
+                    context_menu.0.focus_handle(cx).contains_focused(cx)
+                }) {
+                    cx.focus_self();
+                }
+                this.context_menu.take();
+                cx.notify();
+            });
+
+        self.context_menu = Some((context_menu, position, subscription));
     }
 
     fn show_character_palette(&mut self, _: &ShowCharacterPalette, cx: &mut ViewContext<Self>) {
@@ -621,7 +634,6 @@ impl Render for TerminalView {
 
     fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
         let terminal_handle = self.terminal.clone();
-        let this_view = cx.view().clone();
 
         let self_id = cx.entity_id();
         let focused = self.focus_handle.is_focused(cx);
@@ -629,43 +641,41 @@ impl Render for TerminalView {
         div()
             .size_full()
             .relative()
-            .child(
-                div()
-                    .z_index(0)
-                    .absolute()
-                    .size_full()
-                    .on_key_down(cx.listener(Self::key_down))
-                    .on_action(cx.listener(TerminalView::send_text))
-                    .on_action(cx.listener(TerminalView::send_keystroke))
-                    .on_action(cx.listener(TerminalView::copy))
-                    .on_action(cx.listener(TerminalView::paste))
-                    .on_action(cx.listener(TerminalView::clear))
-                    .on_action(cx.listener(TerminalView::show_character_palette))
-                    .on_action(cx.listener(TerminalView::select_all))
-                    .child(TerminalElement::new(
-                        terminal_handle,
-                        this_view,
-                        self.focus_handle.clone(),
-                        focused,
-                        self.should_show_cursor(focused, cx),
-                        self.can_navigate_to_selected_word,
-                    ))
-                    .on_mouse_down(
-                        MouseButton::Right,
-                        cx.listener(|this, event: &MouseDownEvent, cx| {
-                            this.deploy_context_menu(event.position, cx);
-                            cx.notify();
-                        }),
-                    ),
-            )
-            .children(
-                self.context_menu
-                    .clone()
-                    .map(|context_menu| div().z_index(1).absolute().child(context_menu)),
-            )
             .track_focus(&self.focus_handle)
+            .key_context(self.dispatch_context(cx))
+            .on_action(cx.listener(TerminalView::send_text))
+            .on_action(cx.listener(TerminalView::send_keystroke))
+            .on_action(cx.listener(TerminalView::copy))
+            .on_action(cx.listener(TerminalView::paste))
+            .on_action(cx.listener(TerminalView::clear))
+            .on_action(cx.listener(TerminalView::show_character_palette))
+            .on_action(cx.listener(TerminalView::select_all))
             .on_focus_in(cx.listener(Self::focus_in))
             .on_focus_out(cx.listener(Self::focus_out))
+            .on_key_down(cx.listener(Self::key_down))
+            .on_mouse_down(
+                MouseButton::Right,
+                cx.listener(|this, event: &MouseDownEvent, cx| {
+                    this.deploy_context_menu(event.position, cx);
+                    cx.notify();
+                }),
+            )
+            .child(
+                // TODO: Oddly this wrapper div is needed for TerminalElement to not steal events from the context menu
+                div().size_full().child(TerminalElement::new(
+                    terminal_handle,
+                    self.focus_handle.clone(),
+                    focused,
+                    self.should_show_cursor(focused, cx),
+                    self.can_navigate_to_selected_word,
+                )),
+            )
+            .children(self.context_menu.as_ref().map(|(menu, positon, _)| {
+                overlay()
+                    .position(*positon)
+                    .anchor(gpui::AnchorCorner::TopLeft)
+                    .child(menu.clone())
+            }))
     }
 }
 

crates/theme2/src/registry.rs 🔗

@@ -10,6 +10,12 @@ use crate::{
     SystemColors, Theme, ThemeColors, ThemeFamily, ThemeStyles, UserTheme, UserThemeFamily,
 };
 
+#[derive(Debug, Clone)]
+pub struct ThemeMeta {
+    pub name: SharedString,
+    pub appearance: Appearance,
+}
+
 pub struct ThemeRegistry {
     themes: HashMap<SharedString, Arc<Theme>>,
 }
@@ -94,8 +100,11 @@ impl ThemeRegistry {
         self.themes.keys().cloned()
     }
 
-    pub fn list(&self, _staff: bool) -> impl Iterator<Item = SharedString> + '_ {
-        self.themes.values().map(|theme| theme.name.clone())
+    pub fn list(&self, _staff: bool) -> impl Iterator<Item = ThemeMeta> + '_ {
+        self.themes.values().map(|theme| ThemeMeta {
+            name: theme.name.clone(),
+            appearance: theme.appearance(),
+        })
     }
 
     pub fn get(&self, name: &str) -> Result<Arc<Theme>> {

crates/theme2/src/theme2.rs 🔗

@@ -31,6 +31,15 @@ pub enum Appearance {
     Dark,
 }
 
+impl Appearance {
+    pub fn is_light(&self) -> bool {
+        match self {
+            Self::Light => true,
+            Self::Dark => false,
+        }
+    }
+}
+
 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
 pub enum LoadThemes {
     /// Only load the base theme.

crates/theme2/src/themes/andromeda.rs 🔗

@@ -25,7 +25,7 @@ pub fn andromeda() -> UserThemeFamily {
                         border_selected: Some(rgba(0x1b1d23ff).into()),
                         border_transparent: Some(rgba(0x1b1d23ff).into()),
                         border_disabled: Some(rgba(0x1b1d23ff).into()),
-                        elevated_surface_background: Some(rgba(0x23262eff).into()),
+                        elevated_surface_background: Some(rgba(0x2b303bff).into()),
                         surface_background: Some(rgba(0x23262eff).into()),
                         background: Some(rgba(0x23262eff).into()),
                         element_background: Some(rgba(0x00e8c5cc).into()),
@@ -33,6 +33,7 @@ pub fn andromeda() -> UserThemeFamily {
                         element_selected: Some(rgba(0x23262eff).into()),
                         drop_target_background: Some(rgba(0x3a404eff).into()),
                         ghost_element_hover: Some(rgba(0x23262eff).into()),
+                        ghost_element_selected: Some(rgba(0x23262eff).into()),
                         text: Some(rgba(0xd5ced9ff).into()),
                         status_bar_background: Some(rgba(0x23262eff).into()),
                         title_bar_background: Some(rgba(0x23262eff).into()),
@@ -59,10 +60,13 @@ pub fn andromeda() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
-                        deleted: Some(rgba(0xfc644dff).into()),
+                        created: Some(rgba(0x9bc53dbb).into()),
+                        deleted: Some(rgba(0xfc644dbb).into()),
                         error: Some(rgba(0xfc644dff).into()),
                         hidden: Some(rgba(0x746f77ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x555555ff).into()),
+                        modified: Some(rgba(0x5bc0ebbb).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -88,6 +92,20 @@ pub fn andromeda() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xee5d43ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf92672ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis".into(),
                                 UserHighlightStyle {
@@ -137,6 +155,34 @@ pub fn andromeda() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.escape".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -154,7 +200,7 @@ pub fn andromeda() -> UserThemeFamily {
                             (
                                 "type".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xee5d43ff).into()),
+                                    color: Some(rgba(0xffe66dff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -187,7 +233,7 @@ pub fn andromeda() -> UserThemeFamily {
                         border_selected: Some(rgba(0x1b1d23ff).into()),
                         border_transparent: Some(rgba(0x1b1d23ff).into()),
                         border_disabled: Some(rgba(0x1b1d23ff).into()),
-                        elevated_surface_background: Some(rgba(0x23262eff).into()),
+                        elevated_surface_background: Some(rgba(0x2b303bff).into()),
                         surface_background: Some(rgba(0x23262eff).into()),
                         background: Some(rgba(0x262a33ff).into()),
                         element_background: Some(rgba(0x00e8c5cc).into()),
@@ -195,10 +241,11 @@ pub fn andromeda() -> UserThemeFamily {
                         element_selected: Some(rgba(0x23262eff).into()),
                         drop_target_background: Some(rgba(0x3a404eff).into()),
                         ghost_element_hover: Some(rgba(0x23262eff).into()),
+                        ghost_element_selected: Some(rgba(0x23262eff).into()),
                         text: Some(rgba(0xd5ced9ff).into()),
                         status_bar_background: Some(rgba(0x23262eff).into()),
                         title_bar_background: Some(rgba(0x23262eff).into()),
-                        toolbar_background: Some(rgba(0x23262eff).into()),
+                        toolbar_background: Some(rgba(0x262a33ff).into()),
                         tab_bar_background: Some(rgba(0x23262eff).into()),
                         tab_inactive_background: Some(rgba(0x23262eff).into()),
                         tab_active_background: Some(rgba(0x262a33ff).into()),
@@ -221,10 +268,13 @@ pub fn andromeda() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
-                        deleted: Some(rgba(0xfc644dff).into()),
+                        created: Some(rgba(0x9bc53dbb).into()),
+                        deleted: Some(rgba(0xfc644dbb).into()),
                         error: Some(rgba(0xfc644dff).into()),
                         hidden: Some(rgba(0x746f77ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x555555ff).into()),
+                        modified: Some(rgba(0x5bc0ebbb).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -250,6 +300,20 @@ pub fn andromeda() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xee5d43ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf92672ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis".into(),
                                 UserHighlightStyle {
@@ -299,6 +363,34 @@ pub fn andromeda() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.escape".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x96e072ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -316,7 +408,7 @@ pub fn andromeda() -> UserThemeFamily {
                             (
                                 "type".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xee5d43ff).into()),
+                                    color: Some(rgba(0xffe66dff).into()),
                                     ..Default::default()
                                 },
                             ),

crates/theme2/src/themes/ayu.rs 🔗

@@ -25,13 +25,14 @@ pub fn ayu() -> UserThemeFamily {
                         border_selected: Some(rgba(0x6b7d8f1f).into()),
                         border_transparent: Some(rgba(0x6b7d8f1f).into()),
                         border_disabled: Some(rgba(0x6b7d8f1f).into()),
-                        elevated_surface_background: Some(rgba(0xf8f9faff).into()),
+                        elevated_surface_background: Some(rgba(0xfcfcfcff).into()),
                         surface_background: Some(rgba(0xf8f9faff).into()),
                         background: Some(rgba(0xf8f9faff).into()),
                         element_background: Some(rgba(0xffaa33ff).into()),
                         element_hover: Some(rgba(0x56728f1f).into()),
                         element_selected: Some(rgba(0x56728f1f).into()),
                         ghost_element_hover: Some(rgba(0x56728f1f).into()),
+                        ghost_element_selected: Some(rgba(0x56728f1f).into()),
                         text: Some(rgba(0x8a9199ff).into()),
                         status_bar_background: Some(rgba(0xf8f9faff).into()),
                         title_bar_background: Some(rgba(0xf8f9faff).into()),
@@ -63,10 +64,13 @@ pub fn ayu() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
-                        deleted: Some(rgba(0xe65050ff).into()),
+                        created: Some(rgba(0x6cbf43cc).into()),
+                        deleted: Some(rgba(0xff7383cc).into()),
                         error: Some(rgba(0xe65050ff).into()),
                         hidden: Some(rgba(0x8a9199ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x8a919980).into()),
+                        modified: Some(rgba(0x478acccc).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -104,7 +108,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x4cbf99ff).into()),
+                                    color: Some(rgba(0xa37accff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x55b4d4ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -134,14 +145,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xf07171ff).into()),
+                                    color: Some(rgba(0xf2ae49ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
                                 "keyword".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x55b4d4ff).into()),
+                                    color: Some(rgba(0xfa8d3eff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -183,14 +194,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "property".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x55b4d4ff).into()),
+                                    color: Some(rgba(0xf07171ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x5c6166b3).into()),
+                                    color: Some(rgba(0x5c6166ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -215,6 +226,13 @@ pub fn ayu() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x5c6166ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -229,6 +247,13 @@ pub fn ayu() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x86b300ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string.special".into(),
                                 UserHighlightStyle {
@@ -281,7 +306,7 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "variable.special".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xf2ae49ff).into()),
+                                    color: Some(rgba(0xf07171ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -300,13 +325,14 @@ pub fn ayu() -> UserThemeFamily {
                         border_selected: Some(rgba(0x171b24ff).into()),
                         border_transparent: Some(rgba(0x171b24ff).into()),
                         border_disabled: Some(rgba(0x171b24ff).into()),
-                        elevated_surface_background: Some(rgba(0x1f2430ff).into()),
+                        elevated_surface_background: Some(rgba(0x242936ff).into()),
                         surface_background: Some(rgba(0x1f2430ff).into()),
                         background: Some(rgba(0x1f2430ff).into()),
                         element_background: Some(rgba(0xffcc66ff).into()),
                         element_hover: Some(rgba(0x63759926).into()),
                         element_selected: Some(rgba(0x63759926).into()),
                         ghost_element_hover: Some(rgba(0x63759926).into()),
+                        ghost_element_selected: Some(rgba(0x63759926).into()),
                         text: Some(rgba(0x707a8cff).into()),
                         status_bar_background: Some(rgba(0x1f2430ff).into()),
                         title_bar_background: Some(rgba(0x1f2430ff).into()),
@@ -338,10 +364,13 @@ pub fn ayu() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
-                        deleted: Some(rgba(0xff6666ff).into()),
+                        created: Some(rgba(0x87d96ccc).into()),
+                        deleted: Some(rgba(0xf27983cc).into()),
                         error: Some(rgba(0xff6666ff).into()),
                         hidden: Some(rgba(0x707a8cff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x707a8c80).into()),
+                        modified: Some(rgba(0x80bfffcc).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -379,7 +408,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x95e6cbff).into()),
+                                    color: Some(rgba(0xdfbfffff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x5ccfe6ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -409,14 +445,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xf28779ff).into()),
+                                    color: Some(rgba(0xffd173ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
                                 "keyword".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x5ccfe6ff).into()),
+                                    color: Some(rgba(0xffad66ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -458,14 +494,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "property".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x5ccfe6ff).into()),
+                                    color: Some(rgba(0xf28779ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xcccac2b3).into()),
+                                    color: Some(rgba(0xcccac2ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -490,6 +526,13 @@ pub fn ayu() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xcccac2ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -504,6 +547,13 @@ pub fn ayu() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xd5ff80ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string.special".into(),
                                 UserHighlightStyle {
@@ -556,7 +606,7 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "variable.special".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xffd173ff).into()),
+                                    color: Some(rgba(0xf28779ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -575,13 +625,14 @@ pub fn ayu() -> UserThemeFamily {
                         border_selected: Some(rgba(0x1e232bff).into()),
                         border_transparent: Some(rgba(0x1e232bff).into()),
                         border_disabled: Some(rgba(0x1e232bff).into()),
-                        elevated_surface_background: Some(rgba(0x0b0e14ff).into()),
+                        elevated_surface_background: Some(rgba(0x0d1017ff).into()),
                         surface_background: Some(rgba(0x0b0e14ff).into()),
                         background: Some(rgba(0x0b0e14ff).into()),
                         element_background: Some(rgba(0xe6b450ff).into()),
                         element_hover: Some(rgba(0x47526640).into()),
                         element_selected: Some(rgba(0x47526640).into()),
                         ghost_element_hover: Some(rgba(0x47526640).into()),
+                        ghost_element_selected: Some(rgba(0x47526640).into()),
                         text: Some(rgba(0x565b66ff).into()),
                         status_bar_background: Some(rgba(0x0b0e14ff).into()),
                         title_bar_background: Some(rgba(0x0b0e14ff).into()),
@@ -613,10 +664,13 @@ pub fn ayu() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
-                        deleted: Some(rgba(0xd95757ff).into()),
+                        created: Some(rgba(0x7fd962cc).into()),
+                        deleted: Some(rgba(0xf26d78cc).into()),
                         error: Some(rgba(0xd95757ff).into()),
                         hidden: Some(rgba(0x565b66ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x565b6680).into()),
+                        modified: Some(rgba(0x73b8ffcc).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -654,7 +708,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x95e6cbff).into()),
+                                    color: Some(rgba(0xd2a6ffff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x39bae6ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -684,14 +745,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xf07178ff).into()),
+                                    color: Some(rgba(0xffb454ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
                                 "keyword".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x39bae6ff).into()),
+                                    color: Some(rgba(0xff8f40ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -733,14 +794,14 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "property".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x39bae6ff).into()),
+                                    color: Some(rgba(0xf07178ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xbfbdb6b3).into()),
+                                    color: Some(rgba(0xbfbdb6ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -765,6 +826,13 @@ pub fn ayu() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xbfbdb6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -779,6 +847,13 @@ pub fn ayu() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xaad94cff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string.special".into(),
                                 UserHighlightStyle {
@@ -831,7 +906,7 @@ pub fn ayu() -> UserThemeFamily {
                             (
                                 "variable.special".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xffb454ff).into()),
+                                    color: Some(rgba(0xf07178ff).into()),
                                     ..Default::default()
                                 },
                             ),

crates/theme2/src/themes/dracula.rs 🔗

@@ -24,7 +24,7 @@ pub fn dracula() -> UserThemeFamily {
                     border_selected: Some(rgba(0xbd93f9ff).into()),
                     border_transparent: Some(rgba(0xbd93f9ff).into()),
                     border_disabled: Some(rgba(0xbd93f9ff).into()),
-                    elevated_surface_background: Some(rgba(0x282a36ff).into()),
+                    elevated_surface_background: Some(rgba(0x343746ff).into()),
                     surface_background: Some(rgba(0x282a36ff).into()),
                     background: Some(rgba(0x282a36ff).into()),
                     element_background: Some(rgba(0x44475aff).into()),
@@ -32,11 +32,12 @@ pub fn dracula() -> UserThemeFamily {
                     element_selected: Some(rgba(0x44475aff).into()),
                     drop_target_background: Some(rgba(0x44475aff).into()),
                     ghost_element_hover: Some(rgba(0x44475a75).into()),
+                    ghost_element_selected: Some(rgba(0x44475aff).into()),
                     text: Some(rgba(0xf8f8f2ff).into()),
                     status_bar_background: Some(rgba(0x191a21ff).into()),
                     title_bar_background: Some(rgba(0x21222cff).into()),
                     toolbar_background: Some(rgba(0x282a36ff).into()),
-                    tab_bar_background: Some(rgba(0x282a36ff).into()),
+                    tab_bar_background: Some(rgba(0x191a21ff).into()),
                     tab_inactive_background: Some(rgba(0x21222cff).into()),
                     tab_active_background: Some(rgba(0x282a36ff).into()),
                     editor_background: Some(rgba(0x282a36ff).into()),
@@ -63,10 +64,14 @@ pub fn dracula() -> UserThemeFamily {
                     ..Default::default()
                 },
                 status: StatusColorsRefinement {
-                    deleted: Some(rgba(0xff5555ff).into()),
+                    conflict: Some(rgba(0xffb86cff).into()),
+                    created: Some(rgba(0x50fa7b80).into()),
+                    deleted: Some(rgba(0xff555580).into()),
                     error: Some(rgba(0xff5555ff).into()),
                     hidden: Some(rgba(0x6272a4ff).into()),
                     hint: Some(rgba(0x969696ff).into()),
+                    ignored: Some(rgba(0x6272a4ff).into()),
+                    modified: Some(rgba(0x8be9fd80).into()),
                     warning: Some(rgba(0xffb86cff).into()),
                     ..Default::default()
                 },
@@ -94,6 +99,20 @@ pub fn dracula() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "constant".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xbd93f9ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "constructor".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xff79c6ff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "emphasis".into(),
                             UserHighlightStyle {
@@ -138,6 +157,13 @@ pub fn dracula() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "number".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xbd93f9ff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "string".into(),
                             UserHighlightStyle {
@@ -145,6 +171,34 @@ pub fn dracula() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "string.escape".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xf1fa8cff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "string.regex".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xf1fa8cff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "string.special".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xf1fa8cff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "string.special.symbol".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xf1fa8cff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "tag".into(),
                             UserHighlightStyle {

crates/theme2/src/themes/gruvbox.rs 🔗

@@ -25,15 +25,19 @@ pub fn gruvbox() -> UserThemeFamily {
                         border_selected: Some(rgba(0x3c3836ff).into()),
                         border_transparent: Some(rgba(0x3c3836ff).into()),
                         border_disabled: Some(rgba(0x3c3836ff).into()),
+                        elevated_surface_background: Some(rgba(0x1d2021ff).into()),
                         background: Some(rgba(0x1d2021ff).into()),
                         element_background: Some(rgba(0x45858880).into()),
                         element_hover: Some(rgba(0x3c383680).into()),
                         element_selected: Some(rgba(0x3c383680).into()),
                         drop_target_background: Some(rgba(0x3c3836ff).into()),
                         ghost_element_hover: Some(rgba(0x3c383680).into()),
+                        ghost_element_selected: Some(rgba(0x3c383680).into()),
                         text: Some(rgba(0xebdbb2ff).into()),
                         status_bar_background: Some(rgba(0x1d2021ff).into()),
                         title_bar_background: Some(rgba(0x1d2021ff).into()),
+                        toolbar_background: Some(rgba(0x1d2021ff).into()),
+                        tab_bar_background: Some(rgba(0x1d2021ff).into()),
                         tab_inactive_background: Some(rgba(0x1d2021ff).into()),
                         tab_active_background: Some(rgba(0x32302fff).into()),
                         editor_background: Some(rgba(0x1d2021ff).into()),
@@ -60,10 +64,14 @@ pub fn gruvbox() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xb16286ff).into()),
+                        created: Some(rgba(0xb8bb26ff).into()),
                         deleted: Some(rgba(0xfb4934ff).into()),
                         error: Some(rgba(0xfb4934ff).into()),
                         hidden: Some(rgba(0xa89984ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x7c6f64ff).into()),
+                        modified: Some(rgba(0x83a598ff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -91,6 +99,20 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xd3869bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8ec07cff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis.strong".into(),
                                 UserHighlightStyle {
@@ -102,7 +124,7 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xfabd2fff).into()),
+                                    color: Some(rgba(0x8ec07cff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -134,6 +156,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "number".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xd3869bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "operator".into(),
                                 UserHighlightStyle {
@@ -141,6 +170,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xfe8019ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -151,7 +187,35 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x83a598ff).into()),
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -169,6 +233,27 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -226,15 +311,19 @@ pub fn gruvbox() -> UserThemeFamily {
                         border_selected: Some(rgba(0x3c3836ff).into()),
                         border_transparent: Some(rgba(0x3c3836ff).into()),
                         border_disabled: Some(rgba(0x3c3836ff).into()),
+                        elevated_surface_background: Some(rgba(0x282828ff).into()),
                         background: Some(rgba(0x282828ff).into()),
                         element_background: Some(rgba(0x45858880).into()),
                         element_hover: Some(rgba(0x3c383680).into()),
                         element_selected: Some(rgba(0x3c383680).into()),
                         drop_target_background: Some(rgba(0x3c3836ff).into()),
                         ghost_element_hover: Some(rgba(0x3c383680).into()),
+                        ghost_element_selected: Some(rgba(0x3c383680).into()),
                         text: Some(rgba(0xebdbb2ff).into()),
                         status_bar_background: Some(rgba(0x282828ff).into()),
                         title_bar_background: Some(rgba(0x282828ff).into()),
+                        toolbar_background: Some(rgba(0x282828ff).into()),
+                        tab_bar_background: Some(rgba(0x282828ff).into()),
                         tab_inactive_background: Some(rgba(0x282828ff).into()),
                         tab_active_background: Some(rgba(0x3c3836ff).into()),
                         editor_background: Some(rgba(0x282828ff).into()),
@@ -261,10 +350,14 @@ pub fn gruvbox() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xb16286ff).into()),
+                        created: Some(rgba(0xb8bb26ff).into()),
                         deleted: Some(rgba(0xfb4934ff).into()),
                         error: Some(rgba(0xfb4934ff).into()),
                         hidden: Some(rgba(0xa89984ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x7c6f64ff).into()),
+                        modified: Some(rgba(0x83a598ff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -292,6 +385,20 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xd3869bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8ec07cff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis.strong".into(),
                                 UserHighlightStyle {
@@ -303,7 +410,7 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xfabd2fff).into()),
+                                    color: Some(rgba(0x8ec07cff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -335,6 +442,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "number".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xd3869bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "operator".into(),
                                 UserHighlightStyle {
@@ -342,6 +456,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xfe8019ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -352,7 +473,35 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x83a598ff).into()),
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -370,6 +519,27 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -427,15 +597,19 @@ pub fn gruvbox() -> UserThemeFamily {
                         border_selected: Some(rgba(0x3c3836ff).into()),
                         border_transparent: Some(rgba(0x3c3836ff).into()),
                         border_disabled: Some(rgba(0x3c3836ff).into()),
+                        elevated_surface_background: Some(rgba(0x32302fff).into()),
                         background: Some(rgba(0x32302fff).into()),
                         element_background: Some(rgba(0x45858880).into()),
                         element_hover: Some(rgba(0x3c383680).into()),
                         element_selected: Some(rgba(0x3c383680).into()),
                         drop_target_background: Some(rgba(0x3c3836ff).into()),
                         ghost_element_hover: Some(rgba(0x3c383680).into()),
+                        ghost_element_selected: Some(rgba(0x3c383680).into()),
                         text: Some(rgba(0xebdbb2ff).into()),
                         status_bar_background: Some(rgba(0x32302fff).into()),
                         title_bar_background: Some(rgba(0x32302fff).into()),
+                        toolbar_background: Some(rgba(0x32302fff).into()),
+                        tab_bar_background: Some(rgba(0x32302fff).into()),
                         tab_inactive_background: Some(rgba(0x32302fff).into()),
                         tab_active_background: Some(rgba(0x504945ff).into()),
                         editor_background: Some(rgba(0x32302fff).into()),
@@ -462,10 +636,14 @@ pub fn gruvbox() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xb16286ff).into()),
+                        created: Some(rgba(0xb8bb26ff).into()),
                         deleted: Some(rgba(0xfb4934ff).into()),
                         error: Some(rgba(0xfb4934ff).into()),
                         hidden: Some(rgba(0xa89984ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x7c6f64ff).into()),
+                        modified: Some(rgba(0x83a598ff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -493,6 +671,20 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xd3869bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8ec07cff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis.strong".into(),
                                 UserHighlightStyle {
@@ -504,7 +696,7 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xfabd2fff).into()),
+                                    color: Some(rgba(0x8ec07cff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -536,6 +728,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "number".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xd3869bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "operator".into(),
                                 UserHighlightStyle {
@@ -543,6 +742,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xfe8019ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -553,7 +759,35 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x83a598ff).into()),
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xa89984ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -571,6 +805,27 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb8bb26ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -628,15 +883,19 @@ pub fn gruvbox() -> UserThemeFamily {
                         border_selected: Some(rgba(0xebdbb2ff).into()),
                         border_transparent: Some(rgba(0xebdbb2ff).into()),
                         border_disabled: Some(rgba(0xebdbb2ff).into()),
+                        elevated_surface_background: Some(rgba(0xf9f5d7ff).into()),
                         background: Some(rgba(0xf9f5d7ff).into()),
                         element_background: Some(rgba(0x45858880).into()),
                         element_hover: Some(rgba(0xebdbb280).into()),
                         element_selected: Some(rgba(0xebdbb280).into()),
                         drop_target_background: Some(rgba(0xebdbb2ff).into()),
                         ghost_element_hover: Some(rgba(0xebdbb280).into()),
+                        ghost_element_selected: Some(rgba(0xebdbb280).into()),
                         text: Some(rgba(0x3c3836ff).into()),
                         status_bar_background: Some(rgba(0xf9f5d7ff).into()),
                         title_bar_background: Some(rgba(0xf9f5d7ff).into()),
+                        toolbar_background: Some(rgba(0xf9f5d7ff).into()),
+                        tab_bar_background: Some(rgba(0xf9f5d7ff).into()),
                         tab_inactive_background: Some(rgba(0xf9f5d7ff).into()),
                         tab_active_background: Some(rgba(0xf2e5bcff).into()),
                         editor_background: Some(rgba(0xf9f5d7ff).into()),
@@ -663,10 +922,14 @@ pub fn gruvbox() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xb16286ff).into()),
+                        created: Some(rgba(0x79740eff).into()),
                         deleted: Some(rgba(0x9d0006ff).into()),
                         error: Some(rgba(0x9d0006ff).into()),
                         hidden: Some(rgba(0x7c6f64ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0xa89984ff).into()),
+                        modified: Some(rgba(0x076678ff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -694,6 +957,20 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8f3f71ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x427b58ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis.strong".into(),
                                 UserHighlightStyle {
@@ -705,7 +982,7 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xb57614ff).into()),
+                                    color: Some(rgba(0x427b58ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -737,6 +1014,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "number".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8f3f71ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "operator".into(),
                                 UserHighlightStyle {
@@ -744,6 +1028,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xaf3a03ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -754,7 +1045,35 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x076678ff).into()),
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -772,6 +1091,27 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -829,15 +1169,19 @@ pub fn gruvbox() -> UserThemeFamily {
                         border_selected: Some(rgba(0xebdbb2ff).into()),
                         border_transparent: Some(rgba(0xebdbb2ff).into()),
                         border_disabled: Some(rgba(0xebdbb2ff).into()),
+                        elevated_surface_background: Some(rgba(0xfbf1c7ff).into()),
                         background: Some(rgba(0xfbf1c7ff).into()),
                         element_background: Some(rgba(0x45858880).into()),
                         element_hover: Some(rgba(0xebdbb280).into()),
                         element_selected: Some(rgba(0xebdbb280).into()),
                         drop_target_background: Some(rgba(0xebdbb2ff).into()),
                         ghost_element_hover: Some(rgba(0xebdbb280).into()),
+                        ghost_element_selected: Some(rgba(0xebdbb280).into()),
                         text: Some(rgba(0x3c3836ff).into()),
                         status_bar_background: Some(rgba(0xfbf1c7ff).into()),
                         title_bar_background: Some(rgba(0xfbf1c7ff).into()),
+                        toolbar_background: Some(rgba(0xfbf1c7ff).into()),
+                        tab_bar_background: Some(rgba(0xfbf1c7ff).into()),
                         tab_inactive_background: Some(rgba(0xfbf1c7ff).into()),
                         tab_active_background: Some(rgba(0xebdbb2ff).into()),
                         editor_background: Some(rgba(0xfbf1c7ff).into()),
@@ -864,10 +1208,14 @@ pub fn gruvbox() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xb16286ff).into()),
+                        created: Some(rgba(0x79740eff).into()),
                         deleted: Some(rgba(0x9d0006ff).into()),
                         error: Some(rgba(0x9d0006ff).into()),
                         hidden: Some(rgba(0x7c6f64ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0xa89984ff).into()),
+                        modified: Some(rgba(0x076678ff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -895,6 +1243,20 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8f3f71ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x427b58ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis.strong".into(),
                                 UserHighlightStyle {
@@ -906,7 +1268,7 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xb57614ff).into()),
+                                    color: Some(rgba(0x427b58ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -938,6 +1300,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "number".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8f3f71ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "operator".into(),
                                 UserHighlightStyle {
@@ -945,6 +1314,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xaf3a03ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -955,7 +1331,35 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x076678ff).into()),
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -973,6 +1377,27 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -1030,15 +1455,19 @@ pub fn gruvbox() -> UserThemeFamily {
                         border_selected: Some(rgba(0xebdbb2ff).into()),
                         border_transparent: Some(rgba(0xebdbb2ff).into()),
                         border_disabled: Some(rgba(0xebdbb2ff).into()),
+                        elevated_surface_background: Some(rgba(0xf2e5bcff).into()),
                         background: Some(rgba(0xf2e5bcff).into()),
                         element_background: Some(rgba(0x45858880).into()),
                         element_hover: Some(rgba(0xebdbb280).into()),
                         element_selected: Some(rgba(0xebdbb280).into()),
                         drop_target_background: Some(rgba(0xebdbb2ff).into()),
                         ghost_element_hover: Some(rgba(0xebdbb280).into()),
+                        ghost_element_selected: Some(rgba(0xebdbb280).into()),
                         text: Some(rgba(0x3c3836ff).into()),
                         status_bar_background: Some(rgba(0xf2e5bcff).into()),
                         title_bar_background: Some(rgba(0xf2e5bcff).into()),
+                        toolbar_background: Some(rgba(0xf2e5bcff).into()),
+                        tab_bar_background: Some(rgba(0xf2e5bcff).into()),
                         tab_inactive_background: Some(rgba(0xf2e5bcff).into()),
                         tab_active_background: Some(rgba(0xd5c4a1ff).into()),
                         editor_background: Some(rgba(0xf2e5bcff).into()),
@@ -1065,10 +1494,14 @@ pub fn gruvbox() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xb16286ff).into()),
+                        created: Some(rgba(0x79740eff).into()),
                         deleted: Some(rgba(0x9d0006ff).into()),
                         error: Some(rgba(0x9d0006ff).into()),
                         hidden: Some(rgba(0x7c6f64ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0xa89984ff).into()),
+                        modified: Some(rgba(0x076678ff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -1096,6 +1529,20 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8f3f71ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x427b58ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis.strong".into(),
                                 UserHighlightStyle {
@@ -1107,7 +1554,7 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "function".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xb57614ff).into()),
+                                    color: Some(rgba(0x427b58ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -1139,6 +1586,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "number".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x8f3f71ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "operator".into(),
                                 UserHighlightStyle {
@@ -1146,6 +1600,13 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xaf3a03ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -1156,7 +1617,35 @@ pub fn gruvbox() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x076678ff).into()),
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x7c6f64ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -1174,6 +1663,27 @@ pub fn gruvbox() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x79740eff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {

crates/theme2/src/themes/night_owl.rs 🔗

@@ -33,6 +33,7 @@ pub fn night_owl() -> UserThemeFamily {
                         element_selected: Some(rgba(0x234d708c).into()),
                         drop_target_background: Some(rgba(0x011627ff).into()),
                         ghost_element_hover: Some(rgba(0x011627ff).into()),
+                        ghost_element_selected: Some(rgba(0x234d708c).into()),
                         text: Some(rgba(0xd6deebff).into()),
                         status_bar_background: Some(rgba(0x011627ff).into()),
                         title_bar_background: Some(rgba(0x011627ff).into()),
@@ -63,10 +64,14 @@ pub fn night_owl() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xffeb95cc).into()),
+                        created: Some(rgba(0x9ccc65ff).into()),
                         deleted: Some(rgba(0xef5350ff).into()),
                         error: Some(rgba(0xef5350ff).into()),
                         hidden: Some(rgba(0x5f7e97ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x395a75ff).into()),
+                        modified: Some(rgba(0xe2b93dff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -109,10 +114,18 @@ pub fn night_owl() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xcaece6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "function".into(),
                                 UserHighlightStyle {
                                     color: Some(rgba(0x82aaffff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
                                     ..Default::default()
                                 },
                             ),
@@ -148,7 +161,40 @@ pub fn night_owl() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x7fdbcaff).into()),
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
                                     ..Default::default()
                                 },
                             ),
@@ -166,6 +212,27 @@ pub fn night_owl() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xecc48dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xecc48dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xecc48dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -190,7 +257,7 @@ pub fn night_owl() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xd7dbe0ff).into()),
+                                    color: Some(rgba(0xc5e478ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -223,10 +290,11 @@ pub fn night_owl() -> UserThemeFamily {
                         element_hover: Some(rgba(0xd3e8f8ff).into()),
                         element_selected: Some(rgba(0xd3e8f8ff).into()),
                         ghost_element_hover: Some(rgba(0xd3e8f8ff).into()),
+                        ghost_element_selected: Some(rgba(0xd3e8f8ff).into()),
                         text: Some(rgba(0x403f53ff).into()),
                         status_bar_background: Some(rgba(0xf0f0f0ff).into()),
                         title_bar_background: Some(rgba(0xf0f0f0ff).into()),
-                        toolbar_background: Some(rgba(0xf0f0f0ff).into()),
+                        toolbar_background: Some(rgba(0xfbfbfbff).into()),
                         tab_bar_background: Some(rgba(0xf0f0f0ff).into()),
                         tab_inactive_background: Some(rgba(0xf0f0f0ff).into()),
                         tab_active_background: Some(rgba(0xf6f6f6ff).into()),
@@ -254,10 +322,12 @@ pub fn night_owl() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
-                        deleted: Some(rgba(0x403f53ff).into()),
+                        created: Some(rgba(0x49d0c5ff).into()),
+                        deleted: Some(rgba(0xf76e6eff).into()),
                         error: Some(rgba(0x403f53ff).into()),
                         hidden: Some(rgba(0x403f53ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        modified: Some(rgba(0x6fbef6ff).into()),
                         warning: Some(rgba(0xdaaa01ff).into()),
                         ..Default::default()
                     },
@@ -301,10 +371,18 @@ pub fn night_owl() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x994cc3ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "function".into(),
                                 UserHighlightStyle {
                                     color: Some(rgba(0x4876d6ff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
                                     ..Default::default()
                                 },
                             ),
@@ -341,6 +419,39 @@ pub fn night_owl() -> UserThemeFamily {
                                 "punctuation".into(),
                                 UserHighlightStyle {
                                     color: Some(rgba(0x994cc3ff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x994cc3ff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x994cc3ff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x994cc3ff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x994cc3ff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
                                     ..Default::default()
                                 },
                             ),
@@ -358,6 +469,27 @@ pub fn night_owl() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x4876d6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x4876d6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x4876d6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -382,7 +514,7 @@ pub fn night_owl() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x403f53ff).into()),
+                                    color: Some(rgba(0x4876d6ff).into()),
                                     ..Default::default()
                                 },
                             ),

crates/theme2/src/themes/noctis.rs 🔗

@@ -25,7 +25,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0x1679b6ff).into()),
                         border_transparent: Some(rgba(0x1679b6ff).into()),
                         border_disabled: Some(rgba(0x1679b6ff).into()),
-                        elevated_surface_background: Some(rgba(0x051b29ff).into()),
+                        elevated_surface_background: Some(rgba(0x09334eff).into()),
                         surface_background: Some(rgba(0x051b29ff).into()),
                         background: Some(rgba(0x07273bff).into()),
                         element_background: Some(rgba(0x007f99ff).into()),
@@ -33,11 +33,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0x0c3f5fff).into()),
                         drop_target_background: Some(rgba(0x002a4dff).into()),
                         ghost_element_hover: Some(rgba(0x00558a65).into()),
+                        ghost_element_selected: Some(rgba(0x0c3f5fff).into()),
                         text: Some(rgba(0xbecfdaff).into()),
                         status_bar_background: Some(rgba(0x07273bff).into()),
                         title_bar_background: Some(rgba(0x07273bff).into()),
-                        toolbar_background: Some(rgba(0x051b29ff).into()),
-                        tab_bar_background: Some(rgba(0x051b29ff).into()),
+                        toolbar_background: Some(rgba(0x07273bff).into()),
+                        tab_bar_background: Some(rgba(0x09334eff).into()),
                         tab_inactive_background: Some(rgba(0x09334eff).into()),
                         tab_active_background: Some(rgba(0x07273bff).into()),
                         editor_background: Some(rgba(0x07273bff).into()),
@@ -64,10 +65,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xffc180ff).into()),
+                        created: Some(rgba(0x8ce99aff).into()),
                         deleted: Some(rgba(0xe34e1cff).into()),
                         error: Some(rgba(0xe34e1cff).into()),
                         hidden: Some(rgba(0x9fb6c6ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x5b788bff).into()),
+                        modified: Some(rgba(0xffc180ff).into()),
                         warning: Some(rgba(0xffa857ff).into()),
                         ..Default::default()
                     },
@@ -97,7 +102,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xbecfdaff).into()),
+                                    color: Some(rgba(0xd5971aff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xe66533ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -143,6 +155,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xdf769bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -157,6 +176,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xbecfdaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.delimiter".into(),
                                 UserHighlightStyle {
@@ -164,6 +190,20 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xbecfdaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xbecfdaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -178,6 +218,27 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -235,7 +296,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0x997582ff).into()),
                         border_transparent: Some(rgba(0x997582ff).into()),
                         border_disabled: Some(rgba(0x997582ff).into()),
-                        elevated_surface_background: Some(rgba(0x272022ff).into()),
+                        elevated_surface_background: Some(rgba(0x413036ff).into()),
                         surface_background: Some(rgba(0x272022ff).into()),
                         background: Some(rgba(0x322a2dff).into()),
                         element_background: Some(rgba(0x007f99ff).into()),
@@ -243,11 +304,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0x5c2e3e99).into()),
                         drop_target_background: Some(rgba(0x38292eff).into()),
                         ghost_element_hover: Some(rgba(0x533641ff).into()),
+                        ghost_element_selected: Some(rgba(0x5c2e3e99).into()),
                         text: Some(rgba(0xcbbec2ff).into()),
                         status_bar_background: Some(rgba(0x322a2dff).into()),
                         title_bar_background: Some(rgba(0x322a2dff).into()),
-                        toolbar_background: Some(rgba(0x272022ff).into()),
-                        tab_bar_background: Some(rgba(0x272022ff).into()),
+                        toolbar_background: Some(rgba(0x322a2dff).into()),
+                        tab_bar_background: Some(rgba(0x413036ff).into()),
                         tab_inactive_background: Some(rgba(0x413036ff).into()),
                         tab_active_background: Some(rgba(0x322a2dff).into()),
                         editor_background: Some(rgba(0x322a2dff).into()),
@@ -274,10 +336,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xffc180ff).into()),
+                        created: Some(rgba(0x8ce99aff).into()),
                         deleted: Some(rgba(0xe34e1cff).into()),
                         error: Some(rgba(0xe34e1cff).into()),
                         hidden: Some(rgba(0xbbaab0ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x5b788bff).into()),
+                        modified: Some(rgba(0xffc180ff).into()),
                         warning: Some(rgba(0xffa857ff).into()),
                         ..Default::default()
                     },
@@ -307,7 +373,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xcbbec2ff).into()),
+                                    color: Some(rgba(0xd5971aff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xe66533ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -353,6 +426,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xdf769bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -367,6 +447,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xcbbec2ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.delimiter".into(),
                                 UserHighlightStyle {
@@ -374,6 +461,20 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xcbbec2ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xcbbec2ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -388,6 +489,27 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -445,7 +567,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0x00c6e0ff).into()),
                         border_transparent: Some(rgba(0x00c6e0ff).into()),
                         border_disabled: Some(rgba(0x00c6e0ff).into()),
-                        elevated_surface_background: Some(rgba(0xe1eeefff).into()),
+                        elevated_surface_background: Some(rgba(0xf4f6f6ff).into()),
                         surface_background: Some(rgba(0xe1eeefff).into()),
                         background: Some(rgba(0xf4f6f6ff).into()),
                         element_background: Some(rgba(0x099099ff).into()),
@@ -453,11 +575,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0xb6e1e7ff).into()),
                         drop_target_background: Some(rgba(0xb2cacdff).into()),
                         ghost_element_hover: Some(rgba(0xd1eafaff).into()),
+                        ghost_element_selected: Some(rgba(0xb6e1e7ff).into()),
                         text: Some(rgba(0x005661ff).into()),
                         status_bar_background: Some(rgba(0xcaedf2ff).into()),
                         title_bar_background: Some(rgba(0xe7f2f3ff).into()),
-                        toolbar_background: Some(rgba(0xe1eeefff).into()),
-                        tab_bar_background: Some(rgba(0xe1eeefff).into()),
+                        toolbar_background: Some(rgba(0xf4f6f6ff).into()),
+                        tab_bar_background: Some(rgba(0xcaedf2ff).into()),
                         tab_inactive_background: Some(rgba(0xcaedf2ff).into()),
                         tab_active_background: Some(rgba(0xf4f6f6ff).into()),
                         editor_background: Some(rgba(0xf4f6f6ff).into()),
@@ -484,10 +607,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xe9a149ff).into()),
+                        created: Some(rgba(0x8ce99aff).into()),
                         deleted: Some(rgba(0xff4000ff).into()),
                         error: Some(rgba(0xff4000ff).into()),
                         hidden: Some(rgba(0x71838eff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0xa8a28faa).into()),
+                        modified: Some(rgba(0xe9a149ff).into()),
                         warning: Some(rgba(0xe07a52ff).into()),
                         ..Default::default()
                     },
@@ -517,7 +644,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x004d57ff).into()),
+                                    color: Some(rgba(0xa88c00ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xe64100ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -563,6 +697,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xff5792ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -577,6 +718,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x004d57ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.delimiter".into(),
                                 UserHighlightStyle {
@@ -584,6 +732,20 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x004d57ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x004d57ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -598,6 +760,27 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -655,7 +838,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0xaea4f4ff).into()),
                         border_transparent: Some(rgba(0xaea4f4ff).into()),
                         border_disabled: Some(rgba(0xaea4f4ff).into()),
-                        elevated_surface_background: Some(rgba(0xe9e7f3ff).into()),
+                        elevated_surface_background: Some(rgba(0xf2f1f8ff).into()),
                         surface_background: Some(rgba(0xe9e7f3ff).into()),
                         background: Some(rgba(0xf2f1f8ff).into()),
                         element_background: Some(rgba(0x8e80ffff).into()),
@@ -663,11 +846,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0xbcb6e7ff).into()),
                         drop_target_background: Some(rgba(0xafaad4aa).into()),
                         ghost_element_hover: Some(rgba(0xd2ccffff).into()),
+                        ghost_element_selected: Some(rgba(0xbcb6e7ff).into()),
                         text: Some(rgba(0x0c006bff).into()),
                         status_bar_background: Some(rgba(0xe2dff6ff).into()),
                         title_bar_background: Some(rgba(0xedecf8ff).into()),
-                        toolbar_background: Some(rgba(0xe9e7f3ff).into()),
-                        tab_bar_background: Some(rgba(0xe9e7f3ff).into()),
+                        toolbar_background: Some(rgba(0xf2f1f8ff).into()),
+                        tab_bar_background: Some(rgba(0xe2dff6ff).into()),
                         tab_inactive_background: Some(rgba(0xe2dff6ff).into()),
                         tab_active_background: Some(rgba(0xf2f1f8ff).into()),
                         editor_background: Some(rgba(0xf2f1f8ff).into()),
@@ -694,10 +878,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xe9a149ff).into()),
+                        created: Some(rgba(0x8ce99aff).into()),
                         deleted: Some(rgba(0xff4000ff).into()),
                         error: Some(rgba(0xff4000ff).into()),
                         hidden: Some(rgba(0x75718eff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0xa8a28faa).into()),
+                        modified: Some(rgba(0xe9a149ff).into()),
                         warning: Some(rgba(0xe07a52ff).into()),
                         ..Default::default()
                     },
@@ -727,7 +915,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x0c006bff).into()),
+                                    color: Some(rgba(0xa88c00ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xe64100ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -773,6 +968,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xff5792ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -787,6 +989,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x0c006bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.delimiter".into(),
                                 UserHighlightStyle {
@@ -794,6 +1003,20 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x0c006bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x0c006bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -808,6 +1031,27 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -865,7 +1109,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0x00c6e0ff).into()),
                         border_transparent: Some(rgba(0x00c6e0ff).into()),
                         border_disabled: Some(rgba(0x00c6e0ff).into()),
-                        elevated_surface_background: Some(rgba(0xf6eddaff).into()),
+                        elevated_surface_background: Some(rgba(0xfef8ecff).into()),
                         surface_background: Some(rgba(0xf6eddaff).into()),
                         background: Some(rgba(0xfef8ecff).into()),
                         element_background: Some(rgba(0x099099ff).into()),
@@ -873,11 +1117,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0xb6e1e7ff).into()),
                         drop_target_background: Some(rgba(0xcdcbb2ff).into()),
                         ghost_element_hover: Some(rgba(0xd2f3f9ff).into()),
+                        ghost_element_selected: Some(rgba(0xb6e1e7ff).into()),
                         text: Some(rgba(0x005661ff).into()),
                         status_bar_background: Some(rgba(0xf0e9d6ff).into()),
                         title_bar_background: Some(rgba(0xf9f1e1ff).into()),
-                        toolbar_background: Some(rgba(0xf6eddaff).into()),
-                        tab_bar_background: Some(rgba(0xf6eddaff).into()),
+                        toolbar_background: Some(rgba(0xfef8ecff).into()),
+                        tab_bar_background: Some(rgba(0xf0e9d6ff).into()),
                         tab_inactive_background: Some(rgba(0xf0e9d6ff).into()),
                         tab_active_background: Some(rgba(0xfef8ecff).into()),
                         editor_background: Some(rgba(0xfef8ecff).into()),
@@ -904,10 +1149,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xe9a149ff).into()),
+                        created: Some(rgba(0x8ce99aff).into()),
                         deleted: Some(rgba(0xff4000ff).into()),
                         error: Some(rgba(0xff4000ff).into()),
                         hidden: Some(rgba(0x888477ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0xa8a28faa).into()),
+                        modified: Some(rgba(0xe9a149ff).into()),
                         warning: Some(rgba(0xe07a52ff).into()),
                         ..Default::default()
                     },
@@ -937,7 +1186,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x004d57ff).into()),
+                                    color: Some(rgba(0xa88c00ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xe64100ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -983,6 +1239,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xff5792ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -997,6 +1260,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x004d57ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.delimiter".into(),
                                 UserHighlightStyle {
@@ -1004,6 +1274,20 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x004d57ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x004d57ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -1018,6 +1302,27 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x00b368ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -1075,7 +1380,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0x496d83ff).into()),
                         border_transparent: Some(rgba(0x496d83ff).into()),
                         border_disabled: Some(rgba(0x496d83ff).into()),
-                        elevated_surface_background: Some(rgba(0x0e1920ff).into()),
+                        elevated_surface_background: Some(rgba(0x202e37ff).into()),
                         surface_background: Some(rgba(0x0e1920ff).into()),
                         background: Some(rgba(0x1b2932ff).into()),
                         element_background: Some(rgba(0x2e616bff).into()),
@@ -1083,11 +1388,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0x2c414eff).into()),
                         drop_target_background: Some(rgba(0x152837ff).into()),
                         ghost_element_hover: Some(rgba(0x00558aff).into()),
+                        ghost_element_selected: Some(rgba(0x2c414eff).into()),
                         text: Some(rgba(0xc5cdd3ff).into()),
                         status_bar_background: Some(rgba(0x1b2932ff).into()),
                         title_bar_background: Some(rgba(0x1b2932ff).into()),
-                        toolbar_background: Some(rgba(0x0e1920ff).into()),
-                        tab_bar_background: Some(rgba(0x0e1920ff).into()),
+                        toolbar_background: Some(rgba(0x1b2932ff).into()),
+                        tab_bar_background: Some(rgba(0x24333dff).into()),
                         tab_inactive_background: Some(rgba(0x202e37ff).into()),
                         tab_active_background: Some(rgba(0x1b2932ff).into()),
                         editor_background: Some(rgba(0x1b2932ff).into()),
@@ -1114,10 +1420,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xdfc09fff).into()),
+                        created: Some(rgba(0xa0d4a8ff).into()),
                         deleted: Some(rgba(0xb96346ff).into()),
                         error: Some(rgba(0xb96346ff).into()),
                         hidden: Some(rgba(0x96a8b6ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x5b788bff).into()),
+                        modified: Some(rgba(0xdfc09fff).into()),
                         warning: Some(rgba(0xffa857ff).into()),
                         ..Default::default()
                     },
@@ -1147,7 +1457,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xc5cdd3ff).into()),
+                                    color: Some(rgba(0xa88c00ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc37455ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -1193,6 +1510,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc88da2ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -1208,16 +1532,37 @@ pub fn noctis() -> UserThemeFamily {
                                 },
                             ),
                             (
-                                "punctuation.delimiter".into(),
+                                "punctuation.bracket".into(),
                                 UserHighlightStyle {
                                     color: Some(rgba(0xc5cdd3ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
-                                "string".into(),
+                                "punctuation.delimiter".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x72c09fff).into()),
+                                    color: Some(rgba(0xc5cdd3ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc5cdd3ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc5cdd3ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x72c09fff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -1228,6 +1573,27 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x72c09fff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x72c09fff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x72c09fff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -1285,7 +1651,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0x0e6671ff).into()),
                         border_transparent: Some(rgba(0x0e6671ff).into()),
                         border_disabled: Some(rgba(0x0e6671ff).into()),
-                        elevated_surface_background: Some(rgba(0x03191bff).into()),
+                        elevated_surface_background: Some(rgba(0x073940ff).into()),
                         surface_background: Some(rgba(0x03191bff).into()),
                         background: Some(rgba(0x052529ff).into()),
                         element_background: Some(rgba(0x099099ff).into()),
@@ -1293,11 +1659,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0x0e6671ff).into()),
                         drop_target_background: Some(rgba(0x00404dff).into()),
                         ghost_element_hover: Some(rgba(0x0b515bff).into()),
+                        ghost_element_selected: Some(rgba(0x0e6671ff).into()),
                         text: Some(rgba(0xb2cacdff).into()),
                         status_bar_background: Some(rgba(0x041d20ff).into()),
                         title_bar_background: Some(rgba(0x041d20ff).into()),
-                        toolbar_background: Some(rgba(0x03191bff).into()),
-                        tab_bar_background: Some(rgba(0x03191bff).into()),
+                        toolbar_background: Some(rgba(0x052529ff).into()),
+                        tab_bar_background: Some(rgba(0x062e32ff).into()),
                         tab_inactive_background: Some(rgba(0x062e32ff).into()),
                         tab_active_background: Some(rgba(0x052529ff).into()),
                         editor_background: Some(rgba(0x052529ff).into()),
@@ -1324,10 +1691,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xe4b781ff).into()),
+                        created: Some(rgba(0x8ce99aff).into()),
                         deleted: Some(rgba(0xe34e1cff).into()),
                         error: Some(rgba(0xe34e1cff).into()),
                         hidden: Some(rgba(0x87a7abff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x5b858bff).into()),
+                        modified: Some(rgba(0xe0c184ff).into()),
                         warning: Some(rgba(0xffa487ff).into()),
                         ..Default::default()
                     },
@@ -1357,7 +1728,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xb2cacdff).into()),
+                                    color: Some(rgba(0xd5971aff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xe66533ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -1403,6 +1781,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xdf769bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -1417,6 +1802,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb2cacdff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.delimiter".into(),
                                 UserHighlightStyle {
@@ -1424,6 +1816,20 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb2cacdff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb2cacdff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -1438,6 +1844,27 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x49e9a6ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -1495,7 +1922,7 @@ pub fn noctis() -> UserThemeFamily {
                         border_selected: Some(rgba(0x0e6671ff).into()),
                         border_transparent: Some(rgba(0x0e6671ff).into()),
                         border_disabled: Some(rgba(0x0e6671ff).into()),
-                        elevated_surface_background: Some(rgba(0x020c0eff).into()),
+                        elevated_surface_background: Some(rgba(0x031417ff).into()),
                         surface_background: Some(rgba(0x020c0eff).into()),
                         background: Some(rgba(0x031417ff).into()),
                         element_background: Some(rgba(0x099099ff).into()),
@@ -1503,11 +1930,12 @@ pub fn noctis() -> UserThemeFamily {
                         element_selected: Some(rgba(0x0e6671ff).into()),
                         drop_target_background: Some(rgba(0x00404dff).into()),
                         ghost_element_hover: Some(rgba(0x0b515bff).into()),
+                        ghost_element_selected: Some(rgba(0x0e6671ff).into()),
                         text: Some(rgba(0xb2cacdff).into()),
                         status_bar_background: Some(rgba(0x031417ff).into()),
                         title_bar_background: Some(rgba(0x031417ff).into()),
-                        toolbar_background: Some(rgba(0x020c0eff).into()),
-                        tab_bar_background: Some(rgba(0x020c0eff).into()),
+                        toolbar_background: Some(rgba(0x031417ff).into()),
+                        tab_bar_background: Some(rgba(0x062e32ff).into()),
                         tab_inactive_background: Some(rgba(0x062e32ff).into()),
                         tab_active_background: Some(rgba(0x031417ff).into()),
                         editor_background: Some(rgba(0x031417ff).into()),
@@ -1534,10 +1962,14 @@ pub fn noctis() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xe4b781ff).into()),
+                        created: Some(rgba(0x8ce99aff).into()),
                         deleted: Some(rgba(0xe34e1cff).into()),
                         error: Some(rgba(0xe34e1cff).into()),
                         hidden: Some(rgba(0x87a7abff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x647e82ff).into()),
+                        modified: Some(rgba(0xe4b781ff).into()),
                         warning: Some(rgba(0xffa487ff).into()),
                         ..Default::default()
                     },
@@ -1567,7 +1999,14 @@ pub fn noctis() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xb2cacdff).into()),
+                                    color: Some(rgba(0xd5971aff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xe66533ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -1613,6 +2052,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xdf769bff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -1627,6 +2073,13 @@ pub fn noctis() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb2cacdff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.delimiter".into(),
                                 UserHighlightStyle {

crates/theme2/src/themes/nord.rs 🔗

@@ -24,7 +24,7 @@ pub fn nord() -> UserThemeFamily {
                     border_selected: Some(rgba(0x3b4252ff).into()),
                     border_transparent: Some(rgba(0x3b4252ff).into()),
                     border_disabled: Some(rgba(0x3b4252ff).into()),
-                    elevated_surface_background: Some(rgba(0x2e3440ff).into()),
+                    elevated_surface_background: Some(rgba(0x3b4252ff).into()),
                     surface_background: Some(rgba(0x2e3440ff).into()),
                     background: Some(rgba(0x2e3440ff).into()),
                     element_background: Some(rgba(0x88c0d0ee).into()),
@@ -32,6 +32,7 @@ pub fn nord() -> UserThemeFamily {
                     element_selected: Some(rgba(0x88c0d0ff).into()),
                     drop_target_background: Some(rgba(0x88c0d099).into()),
                     ghost_element_hover: Some(rgba(0x3b4252ff).into()),
+                    ghost_element_selected: Some(rgba(0x88c0d0ff).into()),
                     text: Some(rgba(0xd8dee9ff).into()),
                     status_bar_background: Some(rgba(0x3b4252ff).into()),
                     title_bar_background: Some(rgba(0x2e3440ff).into()),
@@ -63,10 +64,14 @@ pub fn nord() -> UserThemeFamily {
                     ..Default::default()
                 },
                 status: StatusColorsRefinement {
+                    conflict: Some(rgba(0x5e81acff).into()),
+                    created: Some(rgba(0xa3be8cff).into()),
                     deleted: Some(rgba(0xbf616aff).into()),
                     error: Some(rgba(0xbf616aff).into()),
                     hidden: Some(rgba(0xd8dee966).into()),
                     hint: Some(rgba(0xd8dee9ff).into()),
+                    ignored: Some(rgba(0xd8dee966).into()),
+                    modified: Some(rgba(0xebcb8bff).into()),
                     warning: Some(rgba(0xebcb8bff).into()),
                     ..Default::default()
                 },
@@ -103,7 +108,14 @@ pub fn nord() -> UserThemeFamily {
                         (
                             "constant".into(),
                             UserHighlightStyle {
-                                color: Some(rgba(0xebcb8bff).into()),
+                                color: Some(rgba(0x81a1c1ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "constructor".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0x81a1c1ff).into()),
                                 ..Default::default()
                             },
                         ),
@@ -135,10 +147,24 @@ pub fn nord() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "preproc".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0x5e81acff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "punctuation".into(),
                             UserHighlightStyle {
-                                color: Some(rgba(0x81a1c1ff).into()),
+                                color: Some(rgba(0xeceff4ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "punctuation.bracket".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xeceff4ff).into()),
                                 ..Default::default()
                             },
                         ),
@@ -149,6 +175,20 @@ pub fn nord() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "punctuation.list_marker".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xeceff4ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "punctuation.special".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xeceff4ff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "string".into(),
                             UserHighlightStyle {
@@ -163,6 +203,27 @@ pub fn nord() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "string.regex".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xa3be8cff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "string.special".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xa3be8cff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "string.special.symbol".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xa3be8cff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "tag".into(),
                             UserHighlightStyle {
@@ -187,7 +248,7 @@ pub fn nord() -> UserThemeFamily {
                         (
                             "variable".into(),
                             UserHighlightStyle {
-                                color: Some(rgba(0xd8dee9ff).into()),
+                                color: Some(rgba(0x81a1c1ff).into()),
                                 ..Default::default()
                             },
                         ),

crates/theme2/src/themes/palenight.rs 🔗

@@ -33,11 +33,12 @@ pub fn palenight() -> UserThemeFamily {
                         element_selected: Some(rgba(0x7e57c2ff).into()),
                         drop_target_background: Some(rgba(0x2e3245ff).into()),
                         ghost_element_hover: Some(rgba(0x0000001a).into()),
+                        ghost_element_selected: Some(rgba(0x7e57c2ff).into()),
                         text: Some(rgba(0xffffffff).into()),
                         status_bar_background: Some(rgba(0x282c3dff).into()),
                         title_bar_background: Some(rgba(0x292d3eff).into()),
                         toolbar_background: Some(rgba(0x292d3eff).into()),
-                        tab_bar_background: Some(rgba(0x292d3eff).into()),
+                        tab_bar_background: Some(rgba(0x31364aff).into()),
                         tab_inactive_background: Some(rgba(0x31364aff).into()),
                         tab_active_background: Some(rgba(0x292d3eff).into()),
                         editor_background: Some(rgba(0x292d3eff).into()),
@@ -63,10 +64,14 @@ pub fn palenight() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xffeb95cc).into()),
+                        created: Some(rgba(0x9ccc65ff).into()),
                         deleted: Some(rgba(0xef5350ff).into()),
                         error: Some(rgba(0xef5350ff).into()),
                         hidden: Some(rgba(0x929ac9ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x69709890).into()),
+                        modified: Some(rgba(0xe2b93dff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -108,6 +113,13 @@ pub fn palenight() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xff5572ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis".into(),
                                 UserHighlightStyle {
@@ -176,7 +188,35 @@ pub fn palenight() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x89ddffff).into()),
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -194,6 +234,27 @@ pub fn palenight() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -218,7 +279,7 @@ pub fn palenight() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xff5572ff).into()),
+                                    color: Some(rgba(0xffcb6bff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -252,11 +313,12 @@ pub fn palenight() -> UserThemeFamily {
                         element_selected: Some(rgba(0x7e57c2ff).into()),
                         drop_target_background: Some(rgba(0x2e3245ff).into()),
                         ghost_element_hover: Some(rgba(0x0000001a).into()),
+                        ghost_element_selected: Some(rgba(0x7e57c2ff).into()),
                         text: Some(rgba(0xffffffff).into()),
                         status_bar_background: Some(rgba(0x282c3dff).into()),
                         title_bar_background: Some(rgba(0x292d3eff).into()),
                         toolbar_background: Some(rgba(0x292d3eff).into()),
-                        tab_bar_background: Some(rgba(0x292d3eff).into()),
+                        tab_bar_background: Some(rgba(0x31364aff).into()),
                         tab_inactive_background: Some(rgba(0x31364aff).into()),
                         tab_active_background: Some(rgba(0x292d3eff).into()),
                         editor_background: Some(rgba(0x292d3eff).into()),
@@ -282,10 +344,14 @@ pub fn palenight() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xffeb95cc).into()),
+                        created: Some(rgba(0x9ccc65ff).into()),
                         deleted: Some(rgba(0xef5350ff).into()),
                         error: Some(rgba(0xef5350ff).into()),
                         hidden: Some(rgba(0x929ac9ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x69709890).into()),
+                        modified: Some(rgba(0xe2b93dff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -327,6 +393,13 @@ pub fn palenight() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xff5572ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis".into(),
                                 UserHighlightStyle {
@@ -395,7 +468,35 @@ pub fn palenight() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x89ddffff).into()),
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -413,6 +514,27 @@ pub fn palenight() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -437,7 +559,7 @@ pub fn palenight() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xff5572ff).into()),
+                                    color: Some(rgba(0xffcb6bff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -463,7 +585,7 @@ pub fn palenight() -> UserThemeFamily {
                         border_selected: Some(rgba(0x2c2f40ff).into()),
                         border_transparent: Some(rgba(0x2c2f40ff).into()),
                         border_disabled: Some(rgba(0x2c2f40ff).into()),
-                        elevated_surface_background: Some(rgba(0x25293aff).into()),
+                        elevated_surface_background: Some(rgba(0x292d3eff).into()),
                         surface_background: Some(rgba(0x25293aff).into()),
                         background: Some(rgba(0x292d3eff).into()),
                         element_background: Some(rgba(0x7e57c2cc).into()),
@@ -471,11 +593,12 @@ pub fn palenight() -> UserThemeFamily {
                         element_selected: Some(rgba(0x7e57c2ff).into()),
                         drop_target_background: Some(rgba(0x2e3245ff).into()),
                         ghost_element_hover: Some(rgba(0x0000001a).into()),
+                        ghost_element_selected: Some(rgba(0x7e57c2ff).into()),
                         text: Some(rgba(0xffffffff).into()),
                         status_bar_background: Some(rgba(0x25293aff).into()),
                         title_bar_background: Some(rgba(0x25293aff).into()),
-                        toolbar_background: Some(rgba(0x25293aff).into()),
-                        tab_bar_background: Some(rgba(0x25293aff).into()),
+                        toolbar_background: Some(rgba(0x292d3eff).into()),
+                        tab_bar_background: Some(rgba(0x31364aff).into()),
                         tab_inactive_background: Some(rgba(0x31364aff).into()),
                         tab_active_background: Some(rgba(0x25293aff).into()),
                         editor_background: Some(rgba(0x292d3eff).into()),
@@ -501,10 +624,14 @@ pub fn palenight() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xffeb95cc).into()),
+                        created: Some(rgba(0x9ccc65ff).into()),
                         deleted: Some(rgba(0xef5350ff).into()),
                         error: Some(rgba(0xef5350ff).into()),
                         hidden: Some(rgba(0x929ac9ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
+                        ignored: Some(rgba(0x69709890).into()),
+                        modified: Some(rgba(0xe2b93dff).into()),
                         ..Default::default()
                     },
                     syntax: Some(UserSyntaxTheme {
@@ -546,6 +673,13 @@ pub fn palenight() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xff5572ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "emphasis".into(),
                                 UserHighlightStyle {
@@ -614,7 +748,35 @@ pub fn palenight() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x89ddffff).into()),
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc792eaff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -632,6 +794,27 @@ pub fn palenight() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xc3e88dff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -656,7 +839,7 @@ pub fn palenight() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xff5572ff).into()),
+                                    color: Some(rgba(0xffcb6bff).into()),
                                     ..Default::default()
                                 },
                             ),

crates/theme2/src/themes/rose_pine.rs 🔗

@@ -19,12 +19,12 @@ pub fn rose_pine() -> UserThemeFamily {
                 appearance: Appearance::Dark,
                 styles: UserThemeStylesRefinement {
                     colors: ThemeColorsRefinement {
-                        border: Some(rgba(0x000000ff).into()),
-                        border_variant: Some(rgba(0x000000ff).into()),
+                        border: Some(rgba(0x00000000).into()),
+                        border_variant: Some(rgba(0x00000000).into()),
                         border_focused: Some(rgba(0x6e6a8633).into()),
-                        border_selected: Some(rgba(0x000000ff).into()),
-                        border_transparent: Some(rgba(0x000000ff).into()),
-                        border_disabled: Some(rgba(0x000000ff).into()),
+                        border_selected: Some(rgba(0x00000000).into()),
+                        border_transparent: Some(rgba(0x00000000).into()),
+                        border_disabled: Some(rgba(0x00000000).into()),
                         elevated_surface_background: Some(rgba(0x1f1d2eff).into()),
                         surface_background: Some(rgba(0x1f1d2eff).into()),
                         background: Some(rgba(0x191724ff).into()),
@@ -33,12 +33,13 @@ pub fn rose_pine() -> UserThemeFamily {
                         element_selected: Some(rgba(0x6e6a8633).into()),
                         drop_target_background: Some(rgba(0x1f1d2eff).into()),
                         ghost_element_hover: Some(rgba(0x6e6a861a).into()),
+                        ghost_element_selected: Some(rgba(0x6e6a8633).into()),
                         text: Some(rgba(0xe0def4ff).into()),
                         status_bar_background: Some(rgba(0x191724ff).into()),
                         title_bar_background: Some(rgba(0x191724ff).into()),
-                        toolbar_background: Some(rgba(0x1f1d2eff).into()),
-                        tab_bar_background: Some(rgba(0x1f1d2eff).into()),
-                        tab_inactive_background: Some(rgba(0x000000ff).into()),
+                        toolbar_background: Some(rgba(0x191724ff).into()),
+                        tab_bar_background: Some(rgba(0x00000000).into()),
+                        tab_inactive_background: Some(rgba(0x00000000).into()),
                         tab_active_background: Some(rgba(0x6e6a861a).into()),
                         editor_background: Some(rgba(0x191724ff).into()),
                         editor_gutter_background: Some(rgba(0x191724ff).into()),
@@ -63,10 +64,14 @@ pub fn rose_pine() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xeb6f92ff).into()),
+                        created: Some(rgba(0x9ccfd8ff).into()),
                         deleted: Some(rgba(0xeb6f92ff).into()),
                         error: Some(rgba(0xeb6f92ff).into()),
                         hidden: Some(rgba(0x908caaff).into()),
                         hint: Some(rgba(0x908caaff).into()),
+                        ignored: Some(rgba(0x6e6a86ff).into()),
+                        modified: Some(rgba(0xebbcbaff).into()),
                         warning: Some(rgba(0xf6c177ff).into()),
                         ..Default::default()
                     },
@@ -103,6 +108,20 @@ pub fn rose_pine() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x31748fff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x9ccfd8ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "function".into(),
                                 UserHighlightStyle {
@@ -134,7 +153,35 @@ pub fn rose_pine() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x6e6a86ff).into()),
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -145,6 +192,34 @@ pub fn rose_pine() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.escape".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -176,7 +251,8 @@ pub fn rose_pine() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xc4a7e7ff).into()),
+                                    color: Some(rgba(0xebbcbaff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
                                     ..Default::default()
                                 },
                             ),
@@ -196,12 +272,12 @@ pub fn rose_pine() -> UserThemeFamily {
                 appearance: Appearance::Dark,
                 styles: UserThemeStylesRefinement {
                     colors: ThemeColorsRefinement {
-                        border: Some(rgba(0x000000ff).into()),
-                        border_variant: Some(rgba(0x000000ff).into()),
+                        border: Some(rgba(0x00000000).into()),
+                        border_variant: Some(rgba(0x00000000).into()),
                         border_focused: Some(rgba(0x817c9c26).into()),
-                        border_selected: Some(rgba(0x000000ff).into()),
-                        border_transparent: Some(rgba(0x000000ff).into()),
-                        border_disabled: Some(rgba(0x000000ff).into()),
+                        border_selected: Some(rgba(0x00000000).into()),
+                        border_transparent: Some(rgba(0x00000000).into()),
+                        border_disabled: Some(rgba(0x00000000).into()),
                         elevated_surface_background: Some(rgba(0x2a273fff).into()),
                         surface_background: Some(rgba(0x2a273fff).into()),
                         background: Some(rgba(0x232136ff).into()),
@@ -210,12 +286,13 @@ pub fn rose_pine() -> UserThemeFamily {
                         element_selected: Some(rgba(0x817c9c26).into()),
                         drop_target_background: Some(rgba(0x2a273fff).into()),
                         ghost_element_hover: Some(rgba(0x817c9c14).into()),
+                        ghost_element_selected: Some(rgba(0x817c9c26).into()),
                         text: Some(rgba(0xe0def4ff).into()),
                         status_bar_background: Some(rgba(0x232136ff).into()),
                         title_bar_background: Some(rgba(0x232136ff).into()),
-                        toolbar_background: Some(rgba(0x2a273fff).into()),
-                        tab_bar_background: Some(rgba(0x2a273fff).into()),
-                        tab_inactive_background: Some(rgba(0x000000ff).into()),
+                        toolbar_background: Some(rgba(0x232136ff).into()),
+                        tab_bar_background: Some(rgba(0x00000000).into()),
+                        tab_inactive_background: Some(rgba(0x00000000).into()),
                         tab_active_background: Some(rgba(0x817c9c14).into()),
                         editor_background: Some(rgba(0x232136ff).into()),
                         editor_gutter_background: Some(rgba(0x232136ff).into()),
@@ -240,10 +317,14 @@ pub fn rose_pine() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xeb6f92ff).into()),
+                        created: Some(rgba(0x9ccfd8ff).into()),
                         deleted: Some(rgba(0xeb6f92ff).into()),
                         error: Some(rgba(0xeb6f92ff).into()),
                         hidden: Some(rgba(0x908caaff).into()),
                         hint: Some(rgba(0x908caaff).into()),
+                        ignored: Some(rgba(0x6e6a86ff).into()),
+                        modified: Some(rgba(0xea9a97ff).into()),
                         warning: Some(rgba(0xf6c177ff).into()),
                         ..Default::default()
                     },
@@ -280,6 +361,20 @@ pub fn rose_pine() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x3e8fb0ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x9ccfd8ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "function".into(),
                                 UserHighlightStyle {
@@ -311,7 +406,35 @@ pub fn rose_pine() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x6e6a86ff).into()),
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x908caaff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -322,6 +445,34 @@ pub fn rose_pine() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.escape".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xf6c177ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -353,7 +504,8 @@ pub fn rose_pine() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xc4a7e7ff).into()),
+                                    color: Some(rgba(0xea9a97ff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
                                     ..Default::default()
                                 },
                             ),
@@ -373,12 +525,12 @@ pub fn rose_pine() -> UserThemeFamily {
                 appearance: Appearance::Light,
                 styles: UserThemeStylesRefinement {
                     colors: ThemeColorsRefinement {
-                        border: Some(rgba(0x000000ff).into()),
-                        border_variant: Some(rgba(0x000000ff).into()),
+                        border: Some(rgba(0x00000000).into()),
+                        border_variant: Some(rgba(0x00000000).into()),
                         border_focused: Some(rgba(0x6e6a8614).into()),
-                        border_selected: Some(rgba(0x000000ff).into()),
-                        border_transparent: Some(rgba(0x000000ff).into()),
-                        border_disabled: Some(rgba(0x000000ff).into()),
+                        border_selected: Some(rgba(0x00000000).into()),
+                        border_transparent: Some(rgba(0x00000000).into()),
+                        border_disabled: Some(rgba(0x00000000).into()),
                         elevated_surface_background: Some(rgba(0xfffaf3ff).into()),
                         surface_background: Some(rgba(0xfffaf3ff).into()),
                         background: Some(rgba(0xfaf4edff).into()),
@@ -387,12 +539,13 @@ pub fn rose_pine() -> UserThemeFamily {
                         element_selected: Some(rgba(0x6e6a8614).into()),
                         drop_target_background: Some(rgba(0xfffaf3ff).into()),
                         ghost_element_hover: Some(rgba(0x6e6a860d).into()),
+                        ghost_element_selected: Some(rgba(0x6e6a8614).into()),
                         text: Some(rgba(0x575279ff).into()),
                         status_bar_background: Some(rgba(0xfaf4edff).into()),
                         title_bar_background: Some(rgba(0xfaf4edff).into()),
-                        toolbar_background: Some(rgba(0xfffaf3ff).into()),
-                        tab_bar_background: Some(rgba(0xfffaf3ff).into()),
-                        tab_inactive_background: Some(rgba(0x000000ff).into()),
+                        toolbar_background: Some(rgba(0xfaf4edff).into()),
+                        tab_bar_background: Some(rgba(0x00000000).into()),
+                        tab_inactive_background: Some(rgba(0x00000000).into()),
                         tab_active_background: Some(rgba(0x6e6a860d).into()),
                         editor_background: Some(rgba(0xfaf4edff).into()),
                         editor_gutter_background: Some(rgba(0xfaf4edff).into()),
@@ -417,10 +570,14 @@ pub fn rose_pine() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
+                        conflict: Some(rgba(0xb4637aff).into()),
+                        created: Some(rgba(0x56949fff).into()),
                         deleted: Some(rgba(0xb4637aff).into()),
                         error: Some(rgba(0xb4637aff).into()),
                         hidden: Some(rgba(0x797593ff).into()),
                         hint: Some(rgba(0x797593ff).into()),
+                        ignored: Some(rgba(0x9893a5ff).into()),
+                        modified: Some(rgba(0xd7827eff).into()),
                         warning: Some(rgba(0xea9d34ff).into()),
                         ..Default::default()
                     },
@@ -457,6 +614,20 @@ pub fn rose_pine() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "constant".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x286983ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x56949fff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "function".into(),
                                 UserHighlightStyle {
@@ -488,7 +659,35 @@ pub fn rose_pine() -> UserThemeFamily {
                             (
                                 "punctuation".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x9893a5ff).into()),
+                                    color: Some(rgba(0x797593ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x797593ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x797593ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x797593ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x797593ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -499,6 +698,34 @@ pub fn rose_pine() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.escape".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xea9d34ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xea9d34ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xea9d34ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xea9d34ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -530,7 +757,8 @@ pub fn rose_pine() -> UserThemeFamily {
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x907aa9ff).into()),
+                                    color: Some(rgba(0xd7827eff).into()),
+                                    font_style: Some(UserFontStyle::Italic),
                                     ..Default::default()
                                 },
                             ),

crates/theme2/src/themes/solarized.rs 🔗

@@ -25,15 +25,19 @@ pub fn solarized() -> UserThemeFamily {
                         border_selected: Some(rgba(0x003847ff).into()),
                         border_transparent: Some(rgba(0x003847ff).into()),
                         border_disabled: Some(rgba(0x003847ff).into()),
+                        elevated_surface_background: Some(rgba(0x00212bff).into()),
                         background: Some(rgba(0x002b36ff).into()),
                         element_background: Some(rgba(0x2aa19899).into()),
                         element_hover: Some(rgba(0x004454aa).into()),
                         element_selected: Some(rgba(0x005a6fff).into()),
                         drop_target_background: Some(rgba(0x00445488).into()),
                         ghost_element_hover: Some(rgba(0x004454aa).into()),
+                        ghost_element_selected: Some(rgba(0x005a6fff).into()),
                         text: Some(rgba(0xbbbbbbff).into()),
                         status_bar_background: Some(rgba(0x00212bff).into()),
                         title_bar_background: Some(rgba(0x002c39ff).into()),
+                        toolbar_background: Some(rgba(0x002b36ff).into()),
+                        tab_bar_background: Some(rgba(0x004052ff).into()),
                         tab_inactive_background: Some(rgba(0x004052ff).into()),
                         tab_active_background: Some(rgba(0x002b37ff).into()),
                         editor_background: Some(rgba(0x002b36ff).into()),
@@ -58,7 +62,6 @@ pub fn solarized() -> UserThemeFamily {
                         ..Default::default()
                     },
                     status: StatusColorsRefinement {
-                        deleted: Some(rgba(0xffeaeaff).into()),
                         error: Some(rgba(0xffeaeaff).into()),
                         hidden: Some(rgba(0x93a1a1ff).into()),
                         hint: Some(rgba(0x969696ff).into()),
@@ -99,7 +102,14 @@ pub fn solarized() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xcb4b16ff).into()),
+                                    color: Some(rgba(0xb58900ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x268bd2ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -134,7 +144,7 @@ pub fn solarized() -> UserThemeFamily {
                             (
                                 "keyword".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x268bd2ff).into()),
+                                    color: Some(rgba(0x859900ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -145,6 +155,13 @@ pub fn solarized() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb58900ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "property".into(),
                                 UserHighlightStyle {
@@ -159,6 +176,34 @@ pub fn solarized() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "punctuation.bracket".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x657b83ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.delimiter".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x657b83ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.list_marker".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x657b83ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "punctuation.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x657b83ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "string".into(),
                                 UserHighlightStyle {
@@ -173,6 +218,27 @@ pub fn solarized() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x2aa198ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x2aa198ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x2aa198ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -190,14 +256,14 @@ pub fn solarized() -> UserThemeFamily {
                             (
                                 "type".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x859900ff).into()),
+                                    color: Some(rgba(0xb58900ff).into()),
                                     ..Default::default()
                                 },
                             ),
                             (
                                 "variable".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x839496ff).into()),
+                                    color: Some(rgba(0x268bd2ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -223,14 +289,18 @@ pub fn solarized() -> UserThemeFamily {
                         border_selected: Some(rgba(0xddd6c1ff).into()),
                         border_transparent: Some(rgba(0xddd6c1ff).into()),
                         border_disabled: Some(rgba(0xddd6c1ff).into()),
+                        elevated_surface_background: Some(rgba(0xeee8d5ff).into()),
                         background: Some(rgba(0xfdf6e3ff).into()),
                         element_background: Some(rgba(0xac9d57ff).into()),
                         element_hover: Some(rgba(0xdfca8844).into()),
                         element_selected: Some(rgba(0xdfca88ff).into()),
                         ghost_element_hover: Some(rgba(0xdfca8844).into()),
+                        ghost_element_selected: Some(rgba(0xdfca88ff).into()),
                         text: Some(rgba(0x333333ff).into()),
                         status_bar_background: Some(rgba(0xeee8d5ff).into()),
                         title_bar_background: Some(rgba(0xeee8d5ff).into()),
+                        toolbar_background: Some(rgba(0xfdf6e3ff).into()),
+                        tab_bar_background: Some(rgba(0xd9d2c2ff).into()),
                         tab_inactive_background: Some(rgba(0xd3cbb7ff).into()),
                         tab_active_background: Some(rgba(0xfdf6e3ff).into()),
                         editor_background: Some(rgba(0xfdf6e3ff).into()),
@@ -294,7 +364,14 @@ pub fn solarized() -> UserThemeFamily {
                             (
                                 "constant".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0xcb4b16ff).into()),
+                                    color: Some(rgba(0xb58900ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "constructor".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x268bd2ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -329,7 +406,7 @@ pub fn solarized() -> UserThemeFamily {
                             (
                                 "keyword".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x268bd2ff).into()),
+                                    color: Some(rgba(0x859900ff).into()),
                                     ..Default::default()
                                 },
                             ),
@@ -340,6 +417,13 @@ pub fn solarized() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "preproc".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0xb58900ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "punctuation.bracket".into(),
                                 UserHighlightStyle {
@@ -361,6 +445,27 @@ pub fn solarized() -> UserThemeFamily {
                                     ..Default::default()
                                 },
                             ),
+                            (
+                                "string.regex".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x2aa198ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x2aa198ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
+                            (
+                                "string.special.symbol".into(),
+                                UserHighlightStyle {
+                                    color: Some(rgba(0x2aa198ff).into()),
+                                    ..Default::default()
+                                },
+                            ),
                             (
                                 "tag".into(),
                                 UserHighlightStyle {
@@ -378,7 +483,7 @@ pub fn solarized() -> UserThemeFamily {
                             (
                                 "type".into(),
                                 UserHighlightStyle {
-                                    color: Some(rgba(0x859900ff).into()),
+                                    color: Some(rgba(0xb58900ff).into()),
                                     ..Default::default()
                                 },
                             ),

crates/theme2/src/themes/synthwave_84.rs 🔗

@@ -19,15 +19,19 @@ pub fn synthwave_84() -> UserThemeFamily {
             styles: UserThemeStylesRefinement {
                 colors: ThemeColorsRefinement {
                     border_focused: Some(rgba(0x1f212bff).into()),
+                    elevated_surface_background: Some(rgba(0x232530ff).into()),
                     background: Some(rgba(0x262335ff).into()),
                     element_background: Some(rgba(0x614d85ff).into()),
                     element_hover: Some(rgba(0x37294d99).into()),
                     element_selected: Some(rgba(0xffffff20).into()),
                     drop_target_background: Some(rgba(0x34294f66).into()),
                     ghost_element_hover: Some(rgba(0x37294d99).into()),
+                    ghost_element_selected: Some(rgba(0xffffff20).into()),
                     text: Some(rgba(0xffffffff).into()),
                     status_bar_background: Some(rgba(0x241b2fff).into()),
                     title_bar_background: Some(rgba(0x241b2fff).into()),
+                    toolbar_background: Some(rgba(0x262335ff).into()),
+                    tab_bar_background: Some(rgba(0x241b2fff).into()),
                     tab_inactive_background: Some(rgba(0x262335ff).into()),
                     editor_background: Some(rgba(0x262335ff).into()),
                     editor_gutter_background: Some(rgba(0x262335ff).into()),
@@ -47,9 +51,12 @@ pub fn synthwave_84() -> UserThemeFamily {
                     ..Default::default()
                 },
                 status: StatusColorsRefinement {
-                    deleted: Some(rgba(0xfe4450ff).into()),
+                    created: Some(rgba(0x206d4bd6).into()),
+                    deleted: Some(rgba(0xfa2e46a4).into()),
                     error: Some(rgba(0xfe4450ff).into()),
                     hint: Some(rgba(0x969696ff).into()),
+                    ignored: Some(rgba(0xffffff59).into()),
+                    modified: Some(rgba(0xb893ce8f).into()),
                     warning: Some(rgba(0x72f1b8bb).into()),
                     ..Default::default()
                 },
@@ -85,6 +92,20 @@ pub fn synthwave_84() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "constant".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0xf97e72ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "constructor".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0x72f1b8ff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "function".into(),
                             UserHighlightStyle {
@@ -148,6 +169,34 @@ pub fn synthwave_84() -> UserThemeFamily {
                                 ..Default::default()
                             },
                         ),
+                        (
+                            "punctuation.bracket".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0x36f9f6ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "punctuation.delimiter".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0x36f9f6ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "punctuation.list_marker".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0x36f9f6ff).into()),
+                                ..Default::default()
+                            },
+                        ),
+                        (
+                            "punctuation.special".into(),
+                            UserHighlightStyle {
+                                color: Some(rgba(0x36f9f6ff).into()),
+                                ..Default::default()
+                            },
+                        ),
                         (
                             "tag".into(),
                             UserHighlightStyle {
@@ -172,8 +221,7 @@ pub fn synthwave_84() -> UserThemeFamily {
                         (
                             "variable".into(),
                             UserHighlightStyle {
-                                color: Some(rgba(0xfe4450ff).into()),
-                                font_weight: Some(UserFontWeight(700.0)),
+                                color: Some(rgba(0xff7edbff).into()),
                                 ..Default::default()
                             },
                         ),

crates/theme_importer/src/vscode/converter.rs 🔗

@@ -75,10 +75,20 @@ impl VsCodeThemeConverter {
         };
 
         Ok(StatusColorsRefinement {
-            // conflict: None,
-            // created: None,
+            created: vscode_colors
+                .editor_gutter_added_background
+                .as_ref()
+                .traverse(|color| try_parse_color(&color))?,
+            modified: vscode_colors
+                .editor_gutter_modified_background
+                .as_ref()
+                .traverse(|color| try_parse_color(&color))?,
             deleted: vscode_colors
-                .error_foreground
+                .editor_gutter_deleted_background
+                .as_ref()
+                .traverse(|color| try_parse_color(&color))?,
+            conflict: vscode_colors
+                .git_decoration_conflicting_resource_foreground
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?,
             error: vscode_colors
@@ -94,9 +104,11 @@ impl VsCodeThemeConverter {
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?
                 .or(vscode_base_status_colors.hint),
-            // ignored: None,
+            ignored: vscode_colors
+                .git_decoration_ignored_resource_foreground
+                .as_ref()
+                .traverse(|color| try_parse_color(&color))?,
             // info: None,
-            // modified: None,
             // renamed: None,
             // success: None,
             warning: vscode_colors
@@ -110,6 +122,11 @@ impl VsCodeThemeConverter {
     fn convert_theme_colors(&self) -> Result<ThemeColorsRefinement> {
         let vscode_colors = &self.theme.colors;
 
+        let vscode_editor_background = vscode_colors
+            .editor_background
+            .as_ref()
+            .traverse(|color| try_parse_color(&color))?;
+
         Ok(ThemeColorsRefinement {
             border: vscode_colors
                 .panel_border
@@ -136,17 +153,14 @@ impl VsCodeThemeConverter {
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?,
             elevated_surface_background: vscode_colors
-                .panel_background
+                .dropdown_background
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?,
             surface_background: vscode_colors
                 .panel_background
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?,
-            background: vscode_colors
-                .editor_background
-                .as_ref()
-                .traverse(|color| try_parse_color(&color))?,
+            background: vscode_editor_background,
             title_bar_background: vscode_colors
                 .title_bar_active_background
                 .as_ref()
@@ -171,6 +185,10 @@ impl VsCodeThemeConverter {
                 .list_hover_background
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?,
+            ghost_element_selected: vscode_colors
+                .list_active_selection_background
+                .as_ref()
+                .traverse(|color| try_parse_color(&color))?,
             drop_target_background: vscode_colors
                 .list_drop_background
                 .as_ref()
@@ -190,7 +208,7 @@ impl VsCodeThemeConverter {
                         .flatten()
                 }),
             tab_bar_background: vscode_colors
-                .panel_background
+                .editor_group_header_tabs_background
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?,
             tab_active_background: vscode_colors
@@ -202,17 +220,12 @@ impl VsCodeThemeConverter {
                 .as_ref()
                 .traverse(|color| try_parse_color(&color))?,
             toolbar_background: vscode_colors
-                .panel_background
+                .breadcrumb_background
                 .as_ref()
-                .traverse(|color| try_parse_color(&color))?,
-            editor_background: vscode_colors
-                .editor_background
-                .as_ref()
-                .traverse(|color| try_parse_color(&color))?,
-            editor_gutter_background: vscode_colors
-                .editor_background
-                .as_ref()
-                .traverse(|color| try_parse_color(&color))?,
+                .traverse(|color| try_parse_color(&color))?
+                .or(vscode_editor_background),
+            editor_background: vscode_editor_background,
+            editor_gutter_background: vscode_editor_background,
             editor_line_number: vscode_colors
                 .editor_line_number_foreground
                 .as_ref()

crates/theme_importer/src/vscode/syntax.rs 🔗

@@ -153,11 +153,20 @@ impl ZedSyntaxToken {
         .map(|scope| scope.as_str())
         .collect::<Vec<_>>();
 
+        let scopes_to_match = self.to_vscode();
+        let number_of_scopes_to_match = scopes_to_match.len();
+
         let mut matches = 0;
 
-        for scope in self.to_vscode() {
+        for (ix, scope) in scopes_to_match.into_iter().enumerate() {
+            // Assign each entry a weight that is inversely proportional to its
+            // position in the list.
+            //
+            // Entries towards the front are weighted higher than those towards the end.
+            let weight = (number_of_scopes_to_match - ix) as u32;
+
             if candidate_scopes.contains(&scope) {
-                matches += 1;
+                matches += 1 + weight;
             }
         }
 
@@ -167,7 +176,16 @@ impl ZedSyntaxToken {
     pub fn fallbacks(&self) -> &[Self] {
         match self {
             ZedSyntaxToken::CommentDoc => &[ZedSyntaxToken::Comment],
+            ZedSyntaxToken::Number => &[ZedSyntaxToken::Constant],
             ZedSyntaxToken::VariableSpecial => &[ZedSyntaxToken::Variable],
+            ZedSyntaxToken::PunctuationBracket
+            | ZedSyntaxToken::PunctuationDelimiter
+            | ZedSyntaxToken::PunctuationListMarker
+            | ZedSyntaxToken::PunctuationSpecial => &[ZedSyntaxToken::Punctuation],
+            ZedSyntaxToken::StringEscape
+            | ZedSyntaxToken::StringRegex
+            | ZedSyntaxToken::StringSpecial
+            | ZedSyntaxToken::StringSpecialSymbol => &[ZedSyntaxToken::String],
             _ => &[],
         }
     }
@@ -178,9 +196,12 @@ impl ZedSyntaxToken {
             ZedSyntaxToken::Boolean => vec!["constant.language"],
             ZedSyntaxToken::Comment => vec!["comment"],
             ZedSyntaxToken::CommentDoc => vec!["comment.block.documentation"],
-            ZedSyntaxToken::Constant => vec!["constant.character"],
+            ZedSyntaxToken::Constant => vec!["constant", "constant.language", "constant.character"],
             ZedSyntaxToken::Constructor => {
-                vec!["entity.name.function.definition.special.constructor"]
+                vec![
+                    "entity.name.tag",
+                    "entity.name.function.definition.special.constructor",
+                ]
             }
             ZedSyntaxToken::Embedded => vec!["meta.embedded"],
             ZedSyntaxToken::Emphasis => vec!["markup.italic"],
@@ -191,16 +212,17 @@ impl ZedSyntaxToken {
             ],
             ZedSyntaxToken::Enum => vec!["support.type.enum"],
             ZedSyntaxToken::Function => vec![
+                "entity.function",
                 "entity.name.function",
                 "variable.function",
-                "support.function",
             ],
             ZedSyntaxToken::Hint => vec![],
             ZedSyntaxToken::Keyword => vec![
                 "keyword",
+                "keyword.other.fn.rust",
                 "keyword.control",
                 "keyword.control.fun",
-                "keyword.other.fn.rust",
+                "keyword.control.class",
                 "punctuation.accessor",
                 "entity.name.tag",
             ],
@@ -215,7 +237,11 @@ impl ZedSyntaxToken {
             ZedSyntaxToken::Number => vec!["constant.numeric", "number"],
             ZedSyntaxToken::Operator => vec!["operator", "keyword.operator"],
             ZedSyntaxToken::Predictive => vec![],
-            ZedSyntaxToken::Preproc => vec!["preproc"],
+            ZedSyntaxToken::Preproc => vec![
+                "preproc",
+                "meta.preprocessor",
+                "punctuation.definition.preprocessor",
+            ],
             ZedSyntaxToken::Primary => vec![],
             ZedSyntaxToken::Property => vec![
                 "variable.member",
@@ -228,7 +254,6 @@ impl ZedSyntaxToken {
                 "punctuation.section",
                 "punctuation.accessor",
                 "punctuation.separator",
-                "punctuation.terminator",
                 "punctuation.definition.tag",
             ],
             ZedSyntaxToken::PunctuationBracket => vec![

crates/theme_importer/src/vscode/theme.rs 🔗

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

crates/theme_selector2/src/theme_selector.rs 🔗

@@ -2,18 +2,18 @@ use feature_flags::FeatureFlagAppExt;
 use fs::Fs;
 use fuzzy::{match_strings, StringMatch, StringMatchCandidate};
 use gpui::{
-    actions, AppContext, DismissEvent, Div, EventEmitter, FocusableView, Render, SharedString,
-    View, ViewContext, VisualContext, WeakView,
+    actions, AppContext, DismissEvent, Div, EventEmitter, FocusableView, Render, View, ViewContext,
+    VisualContext, WeakView,
 };
 use picker::{Picker, PickerDelegate};
 use settings::{update_settings_file, SettingsStore};
 use std::sync::Arc;
-use theme::{Theme, ThemeRegistry, ThemeSettings};
+use theme::{Theme, ThemeMeta, ThemeRegistry, ThemeSettings};
 use ui::{prelude::*, v_stack, ListItem};
 use util::ResultExt;
-use workspace::{ui::HighlightedLabel, Workspace};
+use workspace::{ui::HighlightedLabel, ModalView, Workspace};
 
-actions!(Toggle, Reload);
+actions!(theme_selector, [Toggle, Reload]);
 
 pub fn init(cx: &mut AppContext) {
     cx.observe_new_views(
@@ -52,6 +52,8 @@ pub fn reload(cx: &mut AppContext) {
     }
 }
 
+impl ModalView for ThemeSelector {}
+
 pub struct ThemeSelector {
     picker: View<Picker<ThemeSelectorDelegate>>,
 }
@@ -81,7 +83,7 @@ impl ThemeSelector {
 
 pub struct ThemeSelectorDelegate {
     fs: Arc<dyn Fs>,
-    theme_names: Vec<SharedString>,
+    themes: Vec<ThemeMeta>,
     matches: Vec<StringMatch>,
     original_theme: Arc<Theme>,
     selection_completed: bool,
@@ -99,21 +101,25 @@ impl ThemeSelectorDelegate {
 
         let staff_mode = cx.is_staff();
         let registry = cx.global::<ThemeRegistry>();
-        let theme_names = registry.list(staff_mode).collect::<Vec<_>>();
-        //todo!(theme sorting)
-        // theme_names.sort_unstable_by(|a, b| a.is_light.cmp(&b.is_light).then(a.name.cmp(&b.name)));
-        let matches = theme_names
+        let mut themes = registry.list(staff_mode).collect::<Vec<_>>();
+        themes.sort_unstable_by(|a, b| {
+            a.appearance
+                .is_light()
+                .cmp(&b.appearance.is_light())
+                .then(a.name.cmp(&b.name))
+        });
+        let matches = themes
             .iter()
             .map(|meta| StringMatch {
                 candidate_id: 0,
                 score: 0.0,
                 positions: Default::default(),
-                string: meta.to_string(),
+                string: meta.name.to_string(),
             })
             .collect();
         let mut this = Self {
             fs,
-            theme_names,
+            themes,
             matches,
             original_theme: original_theme.clone(),
             selected_index: 0,
@@ -213,13 +219,13 @@ impl PickerDelegate for ThemeSelectorDelegate {
     ) -> gpui::Task<()> {
         let background = cx.background_executor().clone();
         let candidates = self
-            .theme_names
+            .themes
             .iter()
             .enumerate()
             .map(|(id, meta)| StringMatchCandidate {
                 id,
-                char_bag: meta.as_ref().into(),
-                string: meta.to_string(),
+                char_bag: meta.name.as_ref().into(),
+                string: meta.name.to_string(),
             })
             .collect::<Vec<_>>();
 

crates/ui2/src/components/button/button.rs 🔗

@@ -1,6 +1,6 @@
 use gpui::{AnyView, DefiniteLength};
 
-use crate::prelude::*;
+use crate::{prelude::*, IconPosition};
 use crate::{
     ButtonCommon, ButtonLike, ButtonSize, ButtonStyle, Icon, IconSize, Label, LineHeightStyle,
 };
@@ -14,6 +14,7 @@ pub struct Button {
     label_color: Option<Color>,
     selected_label: Option<SharedString>,
     icon: Option<Icon>,
+    icon_position: Option<IconPosition>,
     icon_size: Option<IconSize>,
     icon_color: Option<Color>,
     selected_icon: Option<Icon>,
@@ -27,6 +28,7 @@ impl Button {
             label_color: None,
             selected_label: None,
             icon: None,
+            icon_position: None,
             icon_size: None,
             icon_color: None,
             selected_icon: None,
@@ -48,6 +50,11 @@ impl Button {
         self
     }
 
+    pub fn icon_position(mut self, icon_position: impl Into<Option<IconPosition>>) -> Self {
+        self.icon_position = icon_position.into();
+        self
+    }
+
     pub fn icon_size(mut self, icon_size: impl Into<Option<IconSize>>) -> Self {
         self.icon_size = icon_size.into();
         self
@@ -141,19 +148,29 @@ impl RenderOnce for Button {
             self.label_color.unwrap_or_default()
         };
 
-        self.base
-            .children(self.icon.map(|icon| {
-                ButtonIcon::new(icon)
-                    .disabled(is_disabled)
-                    .selected(is_selected)
-                    .selected_icon(self.selected_icon)
-                    .size(self.icon_size)
-                    .color(self.icon_color)
-            }))
-            .child(
-                Label::new(label)
-                    .color(label_color)
-                    .line_height_style(LineHeightStyle::UILabel),
-            )
+        self.base.child(
+            h_stack()
+                .gap_1()
+                .map(|this| {
+                    if self.icon_position == Some(IconPosition::End) {
+                        this.flex_row_reverse()
+                    } else {
+                        this
+                    }
+                })
+                .child(
+                    Label::new(label)
+                        .color(label_color)
+                        .line_height_style(LineHeightStyle::UILabel),
+                )
+                .children(self.icon.map(|icon| {
+                    ButtonIcon::new(icon)
+                        .disabled(is_disabled)
+                        .selected(is_selected)
+                        .selected_icon(self.selected_icon)
+                        .size(self.icon_size)
+                        .color(self.icon_color)
+                })),
+        )
     }
 }

crates/ui2/src/components/button/button_like.rs 🔗

@@ -30,6 +30,13 @@ pub trait ButtonCommon: Clickable + Disableable {
     fn tooltip(self, tooltip: impl Fn(&mut WindowContext) -> AnyView + 'static) -> Self;
 }
 
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)]
+pub enum IconPosition {
+    #[default]
+    Start,
+    End,
+}
+
 #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)]
 pub enum ButtonStyle {
     /// A filled button with a solid background color. Provides emphasis versus
@@ -347,6 +354,7 @@ impl RenderOnce for ButtonLike {
                 ButtonSize::None => this,
             })
             .bg(self.style.enabled(cx).background)
+            .when(self.disabled, |this| this.cursor_not_allowed())
             .when(!self.disabled, |this| {
                 this.cursor_pointer()
                     .hover(|hover| hover.bg(self.style.hovered(cx).background))

crates/ui2/src/components/context_menu.rs 🔗

@@ -239,7 +239,6 @@ impl Render for ContextMenu {
                                 action,
                             } => {
                                 let handler = handler.clone();
-                                let dismiss = cx.listener(|_, _, cx| cx.emit(DismissEvent));
 
                                 let label_element = if let Some(icon) = icon {
                                     h_stack()
@@ -263,10 +262,7 @@ impl Render for ContextMenu {
                                             })),
                                     )
                                     .selected(Some(ix) == self.selected_index)
-                                    .on_click(move |event, cx| {
-                                        handler(cx);
-                                        dismiss(event, cx)
-                                    })
+                                    .on_click(move |_, cx| handler(cx))
                                     .into_any_element()
                             }
                         },

crates/ui2/src/components/icon.rs 🔗

@@ -51,6 +51,7 @@ pub enum Icon {
     CopilotDisabled,
     Dash,
     Envelope,
+    ExternalLink,
     ExclamationTriangle,
     Exit,
     File,
@@ -123,13 +124,13 @@ impl Icon {
             Icon::Close => "icons/x.svg",
             Icon::Collab => "icons/user_group_16.svg",
             Icon::Copilot => "icons/copilot.svg",
-
             Icon::CopilotInit => "icons/copilot_init.svg",
             Icon::CopilotError => "icons/copilot_error.svg",
             Icon::CopilotDisabled => "icons/copilot_disabled.svg",
             Icon::Dash => "icons/dash.svg",
             Icon::Envelope => "icons/feedback.svg",
             Icon::ExclamationTriangle => "icons/warning.svg",
+            Icon::ExternalLink => "icons/external_link.svg",
             Icon::Exit => "icons/exit.svg",
             Icon::File => "icons/file.svg",
             Icon::FileDoc => "icons/file_icons/book.svg",

crates/ui2/src/components/stories/context_menu.rs 🔗

@@ -4,7 +4,7 @@ use story::Story;
 use crate::prelude::*;
 use crate::{right_click_menu, ContextMenu, Label};
 
-actions!(PrintCurrentDate, PrintBestFood);
+actions!(context_menu, [PrintCurrentDate, PrintBestFood]);
 
 fn build_menu(cx: &mut WindowContext, header: impl Into<SharedString>) -> View<ContextMenu> {
     ContextMenu::build(cx, |menu, _| {

crates/ui2/src/components/stories/keybinding.rs 🔗

@@ -1,4 +1,5 @@
-use gpui::{actions, Div, Render};
+use gpui::NoAction;
+use gpui::{Div, Render};
 use itertools::Itertools;
 use story::Story;
 
@@ -7,8 +8,6 @@ use crate::KeyBinding;
 
 pub struct KeybindingStory;
 
-actions!(NoAction);
-
 pub fn binding(key: &str) -> gpui::KeyBinding {
     gpui::KeyBinding::new(key, NoAction {}, None)
 }

crates/ui2/src/prelude.rs 🔗

@@ -12,6 +12,6 @@ pub use crate::selectable::*;
 pub use crate::{h_stack, v_stack};
 pub use crate::{Button, ButtonSize, ButtonStyle, IconButton};
 pub use crate::{ButtonCommon, Color, StyledExt};
-pub use crate::{Icon, IconElement, IconSize};
+pub use crate::{Icon, IconElement, IconPosition, IconSize};
 pub use crate::{Label, LabelCommon, LabelSize, LineHeightStyle};
 pub use theme::ActiveTheme;

crates/welcome2/src/base_keymap_picker.rs 🔗

@@ -10,9 +10,9 @@ use settings::{update_settings_file, Settings};
 use std::sync::Arc;
 use ui::{prelude::*, ListItem};
 use util::ResultExt;
-use workspace::{ui::HighlightedLabel, Workspace};
+use workspace::{ui::HighlightedLabel, ModalView, Workspace};
 
-actions!(ToggleBaseKeymapSelector);
+actions!(welcome, [ToggleBaseKeymapSelector]);
 
 pub fn init(cx: &mut AppContext) {
     cx.observe_new_views(|workspace: &mut Workspace, _cx| {
@@ -47,6 +47,7 @@ impl FocusableView for BaseKeymapSelector {
 }
 
 impl EventEmitter<DismissEvent> for BaseKeymapSelector {}
+impl ModalView for BaseKeymapSelector {}
 
 impl BaseKeymapSelector {
     pub fn new(

crates/workspace2/src/dock.rs 🔗

@@ -770,7 +770,7 @@ pub mod test {
         pub focus_handle: FocusHandle,
         pub size: f32,
     }
-    actions!(ToggleTestPanel);
+    actions!(test, [ToggleTestPanel]);
 
     impl EventEmitter<PanelEvent> for TestPanel {}
 

crates/workspace2/src/modal_layer.rs 🔗

@@ -1,11 +1,32 @@
 use gpui::{
-    div, prelude::*, px, AnyView, Div, FocusHandle, ManagedView, Render, Subscription, View,
-    ViewContext,
+    div, prelude::*, px, AnyView, Div, FocusHandle, ManagedView, Render, Subscription, Task, View,
+    ViewContext, WindowContext,
 };
 use ui::{h_stack, v_stack};
 
+pub trait ModalView: ManagedView {
+    fn dismiss(&mut self, cx: &mut ViewContext<Self>) -> Task<bool> {
+        Task::ready(true)
+    }
+}
+
+trait ModalViewHandle {
+    fn should_dismiss(&mut self, cx: &mut WindowContext) -> Task<bool>;
+    fn view(&self) -> AnyView;
+}
+
+impl<V: ModalView> ModalViewHandle for View<V> {
+    fn should_dismiss(&mut self, cx: &mut WindowContext) -> Task<bool> {
+        self.update(cx, |this, cx| this.dismiss(cx))
+    }
+
+    fn view(&self) -> AnyView {
+        self.clone().into()
+    }
+}
+
 pub struct ActiveModal {
-    modal: AnyView,
+    modal: Box<dyn ModalViewHandle>,
     subscription: Subscription,
     previous_focus_handle: Option<FocusHandle>,
     focus_handle: FocusHandle,
@@ -22,11 +43,11 @@ impl ModalLayer {
 
     pub fn toggle_modal<V, B>(&mut self, cx: &mut ViewContext<Self>, build_view: B)
     where
-        V: ManagedView,
+        V: ModalView,
         B: FnOnce(&mut ViewContext<V>) -> V,
     {
         if let Some(active_modal) = &self.active_modal {
-            let is_close = active_modal.modal.clone().downcast::<V>().is_ok();
+            let is_close = active_modal.modal.view().downcast::<V>().is_ok();
             self.hide_modal(cx);
             if is_close {
                 return;
@@ -38,10 +59,10 @@ impl ModalLayer {
 
     pub fn show_modal<V>(&mut self, new_modal: View<V>, cx: &mut ViewContext<Self>)
     where
-        V: ManagedView,
+        V: ModalView,
     {
         self.active_modal = Some(ActiveModal {
-            modal: new_modal.clone().into(),
+            modal: Box::new(new_modal.clone()),
             subscription: cx.subscribe(&new_modal, |this, modal, e, cx| this.hide_modal(cx)),
             previous_focus_handle: cx.focused(),
             focus_handle: cx.focus_handle(),
@@ -51,15 +72,28 @@ impl ModalLayer {
     }
 
     pub fn hide_modal(&mut self, cx: &mut ViewContext<Self>) {
-        if let Some(active_modal) = self.active_modal.take() {
-            if let Some(previous_focus) = active_modal.previous_focus_handle {
-                if active_modal.focus_handle.contains_focused(cx) {
-                    previous_focus.focus(cx);
-                }
-            }
-        }
+        let Some(active_modal) = self.active_modal.as_mut() else {
+            return;
+        };
 
-        cx.notify();
+        let dismiss = active_modal.modal.should_dismiss(cx);
+
+        cx.spawn(|this, mut cx| async move {
+            if dismiss.await {
+                this.update(&mut cx, |this, cx| {
+                    if let Some(active_modal) = this.active_modal.take() {
+                        if let Some(previous_focus) = active_modal.previous_focus_handle {
+                            if active_modal.focus_handle.contains_focused(cx) {
+                                previous_focus.focus(cx);
+                            }
+                        }
+                        cx.notify();
+                    }
+                })
+                .ok();
+            }
+        })
+        .detach();
     }
 
     pub fn active_modal<V>(&self) -> Option<View<V>>
@@ -67,7 +101,7 @@ impl ModalLayer {
         V: 'static,
     {
         let active_modal = self.active_modal.as_ref()?;
-        active_modal.modal.clone().downcast::<V>().ok()
+        active_modal.modal.view().downcast::<V>().ok()
     }
 }
 
@@ -98,7 +132,7 @@ impl Render for ModalLayer {
                             .on_mouse_down_out(cx.listener(|this, _, cx| {
                                 this.hide_modal(cx);
                             }))
-                            .child(active_modal.modal.clone()),
+                            .child(active_modal.modal.view()),
                     ),
             )
     }

crates/workspace2/src/pane.rs 🔗

@@ -7,10 +7,10 @@ use crate::{
 use anyhow::Result;
 use collections::{HashMap, HashSet, VecDeque};
 use gpui::{
-    actions, overlay, prelude::*, rems, Action, AnchorCorner, AnyWeakView, AppContext,
-    AsyncWindowContext, DismissEvent, Div, EntityId, EventEmitter, FocusHandle, Focusable,
-    FocusableView, Model, Pixels, Point, PromptLevel, Render, Task, View, ViewContext,
-    VisualContext, WeakView, WindowContext,
+    actions, impl_actions, overlay, prelude::*, rems, Action, AnchorCorner, AnyWeakView,
+    AppContext, AsyncWindowContext, DismissEvent, Div, EntityId, EventEmitter, FocusHandle,
+    Focusable, FocusableView, Model, MouseButton, NavigationDirection, Pixels, Point, PromptLevel,
+    Render, Task, View, ViewContext, VisualContext, WeakView, WindowContext,
 };
 use parking_lot::Mutex;
 use project::{Project, ProjectEntryId, ProjectPath};
@@ -52,9 +52,7 @@ pub enum SaveIntent {
     Skip,
 }
 
-//todo!("Do we need the default bound on actions? Decide soon")
-// #[register_action]
-#[derive(Action, Clone, Deserialize, PartialEq, Debug)]
+#[derive(Clone, Deserialize, PartialEq, Debug)]
 pub struct ActivateItem(pub usize);
 
 // #[derive(Clone, PartialEq)]
@@ -75,34 +73,38 @@ pub struct ActivateItem(pub usize);
 //     pub pane: WeakView<Pane>,
 // }
 
-#[derive(Clone, PartialEq, Debug, Deserialize, Default, Action)]
+#[derive(Clone, PartialEq, Debug, Deserialize, Default)]
 #[serde(rename_all = "camelCase")]
 pub struct CloseActiveItem {
     pub save_intent: Option<SaveIntent>,
 }
 
-#[derive(Clone, PartialEq, Debug, Deserialize, Default, Action)]
+#[derive(Clone, PartialEq, Debug, Deserialize, Default)]
 #[serde(rename_all = "camelCase")]
 pub struct CloseAllItems {
     pub save_intent: Option<SaveIntent>,
 }
 
-// todo!(These used to be under pane::{Action}. Are they now workspace::pane::{Action}?)
+impl_actions!(pane, [CloseAllItems, CloseActiveItem, ActivateItem]);
+
 actions!(
-    ActivatePrevItem,
-    ActivateNextItem,
-    ActivateLastItem,
-    CloseInactiveItems,
-    CloseCleanItems,
-    CloseItemsToTheLeft,
-    CloseItemsToTheRight,
-    GoBack,
-    GoForward,
-    ReopenClosedItem,
-    SplitLeft,
-    SplitUp,
-    SplitRight,
-    SplitDown,
+    pane,
+    [
+        ActivatePrevItem,
+        ActivateNextItem,
+        ActivateLastItem,
+        CloseInactiveItems,
+        CloseCleanItems,
+        CloseItemsToTheLeft,
+        CloseItemsToTheRight,
+        GoBack,
+        GoForward,
+        ReopenClosedItem,
+        SplitLeft,
+        SplitUp,
+        SplitRight,
+        SplitDown,
+    ]
 );
 
 const MAX_NAVIGATION_HISTORY_LEN: usize = 1024;
@@ -2139,183 +2141,174 @@ impl Render for Pane {
                     .justify_center()
                     .child(Label::new("Open a file or project to get started.").color(Color::Muted))
             })
-
-        // enum MouseNavigationHandler {}
-
-        // MouseEventHandler::new::<MouseNavigationHandler, _>(0, cx, |_, cx| {
-        //     let active_item_index = self.active_item_index;
-
-        //     if let Some(active_item) = self.active_item() {
-        //         Flex::column()
-        //             .with_child({
-        //                 let theme = theme::current(cx).clone();
-
-        //                 let mut stack = Stack::new();
-
-        //                 enum TabBarEventHandler {}
-        //                 stack.add_child(
-        //                     MouseEventHandler::new::<TabBarEventHandler, _>(0, cx, |_, _| {
-        //                         Empty::new()
-        //                             .contained()
-        //                             .with_style(theme.workspace.tab_bar.container)
-        //                     })
-        //                     .on_down(
-        //                         MouseButton::Left,
-        //                         move |_, this, cx| {
-        //                             this.activate_item(active_item_index, true, true, cx);
-        //                         },
-        //                     ),
-        //                 );
-        //                 let tooltip_style = theme.tooltip.clone();
-        //                 let tab_bar_theme = theme.workspace.tab_bar.clone();
-
-        //                 let nav_button_height = tab_bar_theme.height;
-        //                 let button_style = tab_bar_theme.nav_button;
-        //                 let border_for_nav_buttons = tab_bar_theme
-        //                     .tab_style(false, false)
-        //                     .container
-        //                     .border
-        //                     .clone();
-
-        //                 let mut tab_row = Flex::row()
-        //                     .with_child(nav_button(
-        //                         "icons/arrow_left.svg",
-        //                         button_style.clone(),
-        //                         nav_button_height,
-        //                         tooltip_style.clone(),
-        //                         self.can_navigate_backward(),
-        //                         {
-        //                             move |pane, cx| {
-        //                                 if let Some(workspace) = pane.workspace.upgrade(cx) {
-        //                                     let pane = cx.weak_handle();
-        //                                     cx.window_context().defer(move |cx| {
-        //                                         workspace.update(cx, |workspace, cx| {
-        //                                             workspace
-        //                                                 .go_back(pane, cx)
-        //                                                 .detach_and_log_err(cx)
-        //                                         })
-        //                                     })
-        //                                 }
-        //                             }
-        //                         },
-        //                         super::GoBack,
-        //                         "Go Back",
-        //                         cx,
-        //                     ))
-        //                     .with_child(
-        //                         nav_button(
-        //                             "icons/arrow_right.svg",
-        //                             button_style.clone(),
-        //                             nav_button_height,
-        //                             tooltip_style,
-        //                             self.can_navigate_forward(),
-        //                             {
-        //                                 move |pane, cx| {
-        //                                     if let Some(workspace) = pane.workspace.upgrade(cx) {
-        //                                         let pane = cx.weak_handle();
-        //                                         cx.window_context().defer(move |cx| {
-        //                                             workspace.update(cx, |workspace, cx| {
-        //                                                 workspace
-        //                                                     .go_forward(pane, cx)
-        //                                                     .detach_and_log_err(cx)
-        //                                             })
-        //                                         })
-        //                                     }
-        //                                 }
-        //                             },
-        //                             super::GoForward,
-        //                             "Go Forward",
-        //                             cx,
-        //                         )
-        //                         .contained()
-        //                         .with_border(border_for_nav_buttons),
-        //                     )
-        //                     .with_child(self.render_tabs(cx).flex(1., true).into_any_named("tabs"));
-
-        //                 if self.has_focus {
-        //                     let render_tab_bar_buttons = self.render_tab_bar_buttons.clone();
-        //                     tab_row.add_child(
-        //                         (render_tab_bar_buttons)(self, cx)
-        //                             .contained()
-        //                             .with_style(theme.workspace.tab_bar.pane_button_container)
-        //                             .flex(1., false)
-        //                             .into_any(),
-        //                     )
-        //                 }
-
-        //                 stack.add_child(tab_row);
-        //                 stack
-        //                     .constrained()
-        //                     .with_height(theme.workspace.tab_bar.height)
-        //                     .flex(1., false)
-        //                     .into_any_named("tab bar")
-        //             })
-        //             .with_child({
-        //                 enum PaneContentTabDropTarget {}
-        //                 dragged_item_receiver::<PaneContentTabDropTarget, _, _>(
-        //                     self,
-        //                     0,
-        //                     self.active_item_index + 1,
-        //                     !self.can_split,
-        //                     if self.can_split { Some(100.) } else { None },
-        //                     cx,
-        //                     {
-        //                         let toolbar = self.toolbar.clone();
-        //                         let toolbar_hidden = toolbar.read(cx).hidden();
-        //                         move |_, cx| {
-        //                             Flex::column()
-        //                                 .with_children(
-        //                                     (!toolbar_hidden)
-        //                                         .then(|| ChildView::new(&toolbar, cx).expanded()),
-        //                                 )
-        //                                 .with_child(
-        //                                     ChildView::new(active_item.as_any(), cx).flex(1., true),
-        //                                 )
-        //                         }
-        //                     },
-        //                 )
-        //                 .flex(1., true)
-        //             })
-        //             .with_child(ChildView::new(&self.tab_context_menu, cx))
-        //             .into_any()
-        //     } else {
-        //         enum EmptyPane {}
-        //         let theme = theme::current(cx).clone();
-
-        //         dragged_item_receiver::<EmptyPane, _, _>(self, 0, 0, false, None, cx, |_, cx| {
-        //             self.render_blank_pane(&theme, cx)
-        //         })
-        //         .on_down(MouseButton::Left, |_, _, cx| {
-        //             cx.focus_parent();
-        //         })
-        //         .into_any()
-        //     }
-        // })
-        // .on_down(
-        //     MouseButton::Navigate(NavigationDirection::Back),
-        //     move |_, pane, cx| {
-        //         if let Some(workspace) = pane.workspace.upgrade(cx) {
-        //             let pane = cx.weak_handle();
-        //             cx.window_context().defer(move |cx| {
-        //                 workspace.update(cx, |workspace, cx| {
-        //                     workspace.go_back(pane, cx).detach_and_log_err(cx)
-        //                 })
-        //             })
-        //         }
-        //     },
-        // )
-        // .on_down(MouseButton::Navigate(NavigationDirection::Forward), {
-        //     move |_, pane, cx| {
-        //         if let Some(workspace) = pane.workspace.upgrade(cx) {
-        //             let pane = cx.weak_handle();
-        //             cx.window_context().defer(move |cx| {
-        //                 workspace.update(cx, |workspace, cx| {
-        //                     workspace.go_forward(pane, cx).detach_and_log_err(cx)
-        //                 })
-        //             })
-        //         }
-        //     }
-        // })
+            // enum MouseNavigationHandler {}
+            // MouseEventHandler::new::<MouseNavigationHandler, _>(0, cx, |_, cx| {
+            //     let active_item_index = self.active_item_index;
+            //     if let Some(active_item) = self.active_item() {
+            //         Flex::column()
+            //             .with_child({
+            //                 let theme = theme::current(cx).clone();
+            //                 let mut stack = Stack::new();
+            //                 enum TabBarEventHandler {}
+            //                 stack.add_child(
+            //                     MouseEventHandler::new::<TabBarEventHandler, _>(0, cx, |_, _| {
+            //                         Empty::new()
+            //                             .contained()
+            //                             .with_style(theme.workspace.tab_bar.container)
+            //                     })
+            //                     .on_down(
+            //                         MouseButton::Left,
+            //                         move |_, this, cx| {
+            //                             this.activate_item(active_item_index, true, true, cx);
+            //                         },
+            //                     ),
+            //                 );
+            //                 let tooltip_style = theme.tooltip.clone();
+            //                 let tab_bar_theme = theme.workspace.tab_bar.clone();
+            //                 let nav_button_height = tab_bar_theme.height;
+            //                 let button_style = tab_bar_theme.nav_button;
+            //                 let border_for_nav_buttons = tab_bar_theme
+            //                     .tab_style(false, false)
+            //                     .container
+            //                     .border
+            //                     .clone();
+            //                 let mut tab_row = Flex::row()
+            //                     .with_child(nav_button(
+            //                         "icons/arrow_left.svg",
+            //                         button_style.clone(),
+            //                         nav_button_height,
+            //                         tooltip_style.clone(),
+            //                         self.can_navigate_backward(),
+            //                         {
+            //                             move |pane, cx| {
+            //                                 if let Some(workspace) = pane.workspace.upgrade(cx) {
+            //                                     let pane = cx.weak_handle();
+            //                                     cx.window_context().defer(move |cx| {
+            //                                         workspace.update(cx, |workspace, cx| {
+            //                                             workspace
+            //                                                 .go_back(pane, cx)
+            //                                                 .detach_and_log_err(cx)
+            //                                         })
+            //                                     })
+            //                                 }
+            //                             }
+            //                         },
+            //                         super::GoBack,
+            //                         "Go Back",
+            //                         cx,
+            //                     ))
+            //                     .with_child(
+            //                         nav_button(
+            //                             "icons/arrow_right.svg",
+            //                             button_style.clone(),
+            //                             nav_button_height,
+            //                             tooltip_style,
+            //                             self.can_navigate_forward(),
+            //                             {
+            //                                 move |pane, cx| {
+            //                                     if let Some(workspace) = pane.workspace.upgrade(cx) {
+            //                                         let pane = cx.weak_handle();
+            //                                         cx.window_context().defer(move |cx| {
+            //                                             workspace.update(cx, |workspace, cx| {
+            //                                                 workspace
+            //                                                     .go_forward(pane, cx)
+            //                                                     .detach_and_log_err(cx)
+            //                                             })
+            //                                         })
+            //                                     }
+            //                                 }
+            //                             },
+            //                             super::GoForward,
+            //                             "Go Forward",
+            //                             cx,
+            //                         )
+            //                         .contained()
+            //                         .with_border(border_for_nav_buttons),
+            //                     )
+            //                     .with_child(self.render_tabs(cx).flex(1., true).into_any_named("tabs"));
+            //                 if self.has_focus {
+            //                     let render_tab_bar_buttons = self.render_tab_bar_buttons.clone();
+            //                     tab_row.add_child(
+            //                         (render_tab_bar_buttons)(self, cx)
+            //                             .contained()
+            //                             .with_style(theme.workspace.tab_bar.pane_button_container)
+            //                             .flex(1., false)
+            //                             .into_any(),
+            //                     )
+            //                 }
+            //                 stack.add_child(tab_row);
+            //                 stack
+            //                     .constrained()
+            //                     .with_height(theme.workspace.tab_bar.height)
+            //                     .flex(1., false)
+            //                     .into_any_named("tab bar")
+            //             })
+            //             .with_child({
+            //                 enum PaneContentTabDropTarget {}
+            //                 dragged_item_receiver::<PaneContentTabDropTarget, _, _>(
+            //                     self,
+            //                     0,
+            //                     self.active_item_index + 1,
+            //                     !self.can_split,
+            //                     if self.can_split { Some(100.) } else { None },
+            //                     cx,
+            //                     {
+            //                         let toolbar = self.toolbar.clone();
+            //                         let toolbar_hidden = toolbar.read(cx).hidden();
+            //                         move |_, cx| {
+            //                             Flex::column()
+            //                                 .with_children(
+            //                                     (!toolbar_hidden)
+            //                                         .then(|| ChildView::new(&toolbar, cx).expanded()),
+            //                                 )
+            //                                 .with_child(
+            //                                     ChildView::new(active_item.as_any(), cx).flex(1., true),
+            //                                 )
+            //                         }
+            //                     },
+            //                 )
+            //                 .flex(1., true)
+            //             })
+            //             .with_child(ChildView::new(&self.tab_context_menu, cx))
+            //             .into_any()
+            //     } else {
+            //         enum EmptyPane {}
+            //         let theme = theme::current(cx).clone();
+            //         dragged_item_receiver::<EmptyPane, _, _>(self, 0, 0, false, None, cx, |_, cx| {
+            //             self.render_blank_pane(&theme, cx)
+            //         })
+            //         .on_down(MouseButton::Left, |_, _, cx| {
+            //             cx.focus_parent();
+            //         })
+            //         .into_any()
+            //     }
+            // })
+            .on_mouse_down(
+                MouseButton::Navigate(NavigationDirection::Back),
+                cx.listener(|pane, _, cx| {
+                    if let Some(workspace) = pane.workspace.upgrade() {
+                        let pane = cx.view().downgrade();
+                        cx.window_context().defer(move |cx| {
+                            workspace.update(cx, |workspace, cx| {
+                                workspace.go_back(pane, cx).detach_and_log_err(cx)
+                            })
+                        })
+                    }
+                }),
+            )
+            .on_mouse_down(
+                MouseButton::Navigate(NavigationDirection::Forward),
+                cx.listener(|pane, _, cx| {
+                    if let Some(workspace) = pane.workspace.upgrade() {
+                        let pane = cx.view().downgrade();
+                        cx.window_context().defer(move |cx| {
+                            workspace.update(cx, |workspace, cx| {
+                                workspace.go_forward(pane, cx).detach_and_log_err(cx)
+                            })
+                        })
+                    }
+                }),
+            )
         // .into_any_named("pane")
     }
 

crates/workspace2/src/status_bar.rs 🔗

@@ -1,12 +1,10 @@
-use std::any::TypeId;
-
 use crate::{ItemHandle, Pane};
 use gpui::{
     div, AnyView, Div, IntoElement, ParentElement, Render, Styled, Subscription, View, ViewContext,
     WindowContext,
 };
-use ui::prelude::*;
-use ui::{h_stack, Icon, IconButton};
+use std::any::TypeId;
+use ui::{h_stack, prelude::*};
 use util::ResultExt;
 
 pub trait StatusItemView: Render {
@@ -47,31 +45,8 @@ impl Render for StatusBar {
             .w_full()
             .h_8()
             .bg(cx.theme().colors().status_bar_background)
-            .child(h_stack().gap_1().child(self.render_left_tools(cx)))
-            .child(
-                h_stack()
-                    .gap_4()
-                    .child(
-                        h_stack().gap_1().child(
-                            // Feedback Tool
-                            div()
-                                .border()
-                                .border_color(gpui::red())
-                                .child(IconButton::new("status-feedback", Icon::Envelope)),
-                        ),
-                    )
-                    .child(
-                        // Right Dock
-                        h_stack().gap_1().child(
-                            // Terminal
-                            div()
-                                .border()
-                                .border_color(gpui::red())
-                                .child(IconButton::new("status-chat", Icon::MessageBubbles)),
-                        ),
-                    )
-                    .child(self.render_right_tools(cx)),
-            )
+            .child(self.render_left_tools(cx))
+            .child(self.render_right_tools(cx))
     }
 }
 

crates/workspace2/src/workspace2.rs 🔗

@@ -29,12 +29,12 @@ use futures::{
     Future, FutureExt, StreamExt,
 };
 use gpui::{
-    actions, div, point, size, Action, AnyModel, AnyView, AnyWeakView, AnyWindowHandle, AppContext,
-    AsyncAppContext, AsyncWindowContext, Bounds, Context, Div, Entity, EntityId, EventEmitter,
-    FocusHandle, FocusableView, GlobalPixels, InteractiveElement, KeyContext, ManagedView, Model,
-    ModelContext, ParentElement, PathPromptOptions, Point, PromptLevel, Render, Size, Styled,
-    Subscription, Task, View, ViewContext, VisualContext, WeakView, WindowBounds, WindowContext,
-    WindowHandle, WindowOptions,
+    actions, div, impl_actions, point, size, Action, AnyModel, AnyView, AnyWeakView,
+    AnyWindowHandle, AppContext, AsyncAppContext, AsyncWindowContext, Bounds, Context, Div, Entity,
+    EntityId, EventEmitter, FocusHandle, FocusableView, GlobalPixels, InteractiveElement,
+    KeyContext, ManagedView, Model, ModelContext, ParentElement, PathPromptOptions, Point,
+    PromptLevel, Render, Size, Styled, Subscription, Task, View, ViewContext, VisualContext,
+    WeakView, WindowBounds, WindowContext, WindowHandle, WindowOptions,
 };
 use item::{FollowableItem, FollowableItemHandle, Item, ItemHandle, ItemSettings, ProjectItem};
 use itertools::Itertools;
@@ -91,30 +91,33 @@ lazy_static! {
 pub struct RemoveWorktreeFromProject(pub WorktreeId);
 
 actions!(
-    Open,
-    NewFile,
-    NewWindow,
-    CloseWindow,
-    CloseInactiveTabsAndPanes,
-    AddFolderToProject,
-    Unfollow,
-    SaveAs,
-    ReloadActiveItem,
-    ActivatePreviousPane,
-    ActivateNextPane,
-    FollowNextCollaborator,
-    NewTerminal,
-    NewCenterTerminal,
-    ToggleTerminalFocus,
-    NewSearch,
-    Feedback,
-    Restart,
-    Welcome,
-    ToggleZoom,
-    ToggleLeftDock,
-    ToggleRightDock,
-    ToggleBottomDock,
-    CloseAllDocks,
+    workspace,
+    [
+        Open,
+        NewFile,
+        NewWindow,
+        CloseWindow,
+        CloseInactiveTabsAndPanes,
+        AddFolderToProject,
+        Unfollow,
+        SaveAs,
+        ReloadActiveItem,
+        ActivatePreviousPane,
+        ActivateNextPane,
+        FollowNextCollaborator,
+        NewTerminal,
+        NewCenterTerminal,
+        ToggleTerminalFocus,
+        NewSearch,
+        Feedback,
+        Restart,
+        Welcome,
+        ToggleZoom,
+        ToggleLeftDock,
+        ToggleRightDock,
+        ToggleBottomDock,
+        CloseAllDocks,
+    ]
 );
 
 #[derive(Clone, PartialEq)]
@@ -122,36 +125,50 @@ pub struct OpenPaths {
     pub paths: Vec<PathBuf>,
 }
 
-#[derive(Clone, Deserialize, PartialEq, Action)]
+#[derive(Clone, Deserialize, PartialEq)]
 pub struct ActivatePane(pub usize);
 
-#[derive(Clone, Deserialize, PartialEq, Action)]
+#[derive(Clone, Deserialize, PartialEq)]
 pub struct ActivatePaneInDirection(pub SplitDirection);
 
-#[derive(Clone, Deserialize, PartialEq, Action)]
+#[derive(Clone, Deserialize, PartialEq)]
 pub struct SwapPaneInDirection(pub SplitDirection);
 
-#[derive(Clone, Deserialize, PartialEq, Action)]
+#[derive(Clone, Deserialize, PartialEq)]
 pub struct NewFileInDirection(pub SplitDirection);
 
-#[derive(Clone, PartialEq, Debug, Deserialize, Action)]
+#[derive(Clone, PartialEq, Debug, Deserialize)]
 #[serde(rename_all = "camelCase")]
 pub struct SaveAll {
     pub save_intent: Option<SaveIntent>,
 }
 
-#[derive(Clone, PartialEq, Debug, Deserialize, Action)]
+#[derive(Clone, PartialEq, Debug, Deserialize)]
 #[serde(rename_all = "camelCase")]
 pub struct Save {
     pub save_intent: Option<SaveIntent>,
 }
 
-#[derive(Clone, PartialEq, Debug, Deserialize, Default, Action)]
+#[derive(Clone, PartialEq, Debug, Deserialize, Default)]
 #[serde(rename_all = "camelCase")]
 pub struct CloseAllItemsAndPanes {
     pub save_intent: Option<SaveIntent>,
 }
 
+impl_actions!(
+    workspace,
+    [
+        ActivatePane,
+        ActivatePaneInDirection,
+        CloseAllItemsAndPanes,
+        NewFileInDirection,
+        OpenTerminal,
+        Save,
+        SaveAll,
+        SwapPaneInDirection,
+    ]
+);
+
 #[derive(Deserialize)]
 pub struct Toast {
     id: usize,
@@ -197,7 +214,7 @@ impl Clone for Toast {
     }
 }
 
-#[derive(Debug, Default, Clone, Deserialize, PartialEq, Action)]
+#[derive(Debug, Default, Clone, Deserialize, PartialEq)]
 pub struct OpenTerminal {
     pub working_directory: PathBuf,
 }
@@ -3414,7 +3431,7 @@ impl Workspace {
         self.modal_layer.read(cx).active_modal()
     }
 
-    pub fn toggle_modal<V: ManagedView, B>(&mut self, cx: &mut ViewContext<Self>, build: B)
+    pub fn toggle_modal<V: ModalView, B>(&mut self, cx: &mut ViewContext<Self>, build: B)
     where
         B: FnOnce(&mut ViewContext<V>) -> V,
     {

crates/zed2/build.rs 🔗

@@ -27,10 +27,20 @@ fn main() {
     // Populate git sha environment variable if git is available
     if let Ok(output) = Command::new("git").args(["rev-parse", "HEAD"]).output() {
         if output.status.success() {
-            println!(
-                "cargo:rustc-env=ZED_COMMIT_SHA={}",
-                String::from_utf8_lossy(&output.stdout).trim()
-            );
+            let git_sha = String::from_utf8_lossy(&output.stdout);
+            let git_sha = git_sha.trim();
+
+            println!("cargo:rustc-env=ZED_COMMIT_SHA={git_sha}");
+
+            if let Ok(build_profile) = std::env::var("PROFILE") {
+                if build_profile == "release" {
+                    // This is currently the best way to make `cargo build ...`'s build script
+                    // to print something to stdout without extra verbosity.
+                    println!(
+                        "cargo:warning=Info: using '{git_sha}' hash for ZED_COMMIT_SHA env var"
+                    );
+                }
+            }
         }
     }
 }

crates/zed2/src/zed2.rs 🔗

@@ -43,27 +43,30 @@ use workspace::{
 use zed_actions::{OpenBrowser, OpenZedURL};
 
 actions!(
-    About,
-    DebugElements,
-    DecreaseBufferFontSize,
-    Hide,
-    HideOthers,
-    IncreaseBufferFontSize,
-    Minimize,
-    OpenDefaultKeymap,
-    OpenDefaultSettings,
-    OpenKeymap,
-    OpenLicenses,
-    OpenLocalSettings,
-    OpenLog,
-    OpenSettings,
-    OpenTelemetryLog,
-    Quit,
-    ResetBufferFontSize,
-    ResetDatabase,
-    ShowAll,
-    ToggleFullScreen,
-    Zoom,
+    zed,
+    [
+        About,
+        DebugElements,
+        DecreaseBufferFontSize,
+        Hide,
+        HideOthers,
+        IncreaseBufferFontSize,
+        Minimize,
+        OpenDefaultKeymap,
+        OpenDefaultSettings,
+        OpenKeymap,
+        OpenLicenses,
+        OpenLocalSettings,
+        OpenLog,
+        OpenSettings,
+        OpenTelemetryLog,
+        Quit,
+        ResetBufferFontSize,
+        ResetDatabase,
+        ShowAll,
+        ToggleFullScreen,
+        Zoom,
+    ]
 );
 
 pub fn build_window_options(
@@ -160,8 +163,8 @@ pub fn initialize_workspace(app_state: Arc<AppState>, cx: &mut AppContext) {
             let assistant_panel = AssistantPanel::load(workspace_handle.clone(), cx.clone());
             let channels_panel =
                 collab_ui::collab_panel::CollabPanel::load(workspace_handle.clone(), cx.clone());
-            // let chat_panel =
-            //     collab_ui::chat_panel::ChatPanel::load(workspace_handle.clone(), cx.clone());
+            let chat_panel =
+                collab_ui::chat_panel::ChatPanel::load(workspace_handle.clone(), cx.clone());
             // let notification_panel = collab_ui::notification_panel::NotificationPanel::load(
             //     workspace_handle.clone(),
             //     cx.clone(),
@@ -171,14 +174,14 @@ pub fn initialize_workspace(app_state: Arc<AppState>, cx: &mut AppContext) {
                 terminal_panel,
                 assistant_panel,
                 channels_panel,
-                //     chat_panel,
+                chat_panel,
                 //     notification_panel,
             ) = futures::try_join!(
                 project_panel,
                 terminal_panel,
                 assistant_panel,
                 channels_panel,
-                //     chat_panel,
+                chat_panel,
                 //     notification_panel,
             )?;
 
@@ -188,7 +191,7 @@ pub fn initialize_workspace(app_state: Arc<AppState>, cx: &mut AppContext) {
                 workspace.add_panel(terminal_panel, cx);
                 workspace.add_panel(assistant_panel, cx);
                 workspace.add_panel(channels_panel, cx);
-                //     workspace.add_panel(chat_panel, cx);
+                workspace.add_panel(chat_panel, cx);
                 //     workspace.add_panel(notification_panel, cx);
 
                 // if !was_deserialized

crates/zed_actions2/src/lib.rs 🔗

@@ -1,4 +1,4 @@
-use gpui::Action;
+use gpui::impl_actions;
 use serde::Deserialize;
 
 // If the zed binary doesn't use anything in this crate, it will be optimized away
@@ -10,12 +10,14 @@ use serde::Deserialize;
 // https://github.com/mmastrac/rust-ctor/issues/280
 pub fn init() {}
 
-#[derive(Clone, PartialEq, Deserialize, Action)]
+#[derive(Clone, PartialEq, Deserialize)]
 pub struct OpenBrowser {
     pub url: String,
 }
 
-#[derive(Clone, PartialEq, Deserialize, Action)]
+#[derive(Clone, PartialEq, Deserialize)]
 pub struct OpenZedURL {
     pub url: String,
 }
+
+impl_actions!(zed, [OpenBrowser, OpenZedURL]);

script/upload-nightly 🔗

@@ -20,7 +20,7 @@ function uploadToSpaces
   string="PUT\n\n${content_type}\n${date}\n${acl}\n${storage_type}\n/${SPACE}/${space_path}/${file_name}"
   signature=$(echo -en "${string}" | openssl sha1 -hmac "${DIGITALOCEAN_SPACES_SECRET_KEY}" -binary | base64)
 
-  curl -vv -s -X PUT -T "$file_to_upload" \
+  curl --fail -vv -s -X PUT -T "$file_to_upload" \
     -H "Host: ${SPACE}.${REGION}.digitaloceanspaces.com" \
     -H "Date: $date" \
     -H "Content-Type: $content_type" \