Merge remote-tracking branch 'origin/main' into editor2-paint

This commit is contained in:
Antonio Scandurra 2023-11-07 13:09:48 +01:00
commit bdf6e8bcc7
204 changed files with 48828 additions and 1648 deletions

56
Cargo.lock generated
View file

@ -1347,6 +1347,43 @@ dependencies = [
"uuid 1.4.1",
]
[[package]]
name = "channel2"
version = "0.1.0"
dependencies = [
"anyhow",
"client2",
"clock",
"collections",
"db2",
"feature_flags2",
"futures 0.3.28",
"gpui2",
"image",
"language2",
"lazy_static",
"log",
"parking_lot 0.11.2",
"postage",
"rand 0.8.5",
"rpc2",
"schemars",
"serde",
"serde_derive",
"settings2",
"smallvec",
"smol",
"sum_tree",
"tempfile",
"text",
"thiserror",
"time",
"tiny_http",
"url",
"util",
"uuid 1.4.1",
]
[[package]]
name = "chrono"
version = "0.4.31"
@ -2422,8 +2459,10 @@ dependencies = [
"client",
"collections",
"editor",
"futures 0.3.28",
"gpui",
"language",
"log",
"lsp",
"postage",
"project",
@ -8960,6 +8999,21 @@ dependencies = [
"util",
]
[[package]]
name = "theme_importer"
version = "0.1.0"
dependencies = [
"anyhow",
"convert_case 0.6.0",
"gpui2",
"log",
"rust-embed",
"serde",
"simplelog",
"theme2",
"uuid 1.4.1",
]
[[package]]
name = "theme_selector"
version = "0.1.0"
@ -9690,7 +9744,7 @@ dependencies = [
[[package]]
name = "tree-sitter-vue"
version = "0.0.1"
source = "git+https://github.com/zed-industries/tree-sitter-vue?rev=95b2890#95b28908d90e928c308866f7631e73ef6e1d4b5f"
source = "git+https://github.com/zed-industries/tree-sitter-vue?rev=9b6cb221ccb8d0b956fcb17e9a1efac2feefeb58#9b6cb221ccb8d0b956fcb17e9a1efac2feefeb58"
dependencies = [
"cc",
"tree-sitter",

View file

@ -10,6 +10,7 @@ members = [
"crates/call",
"crates/call2",
"crates/channel",
"crates/channel2",
"crates/cli",
"crates/client",
"crates/client2",
@ -93,6 +94,7 @@ members = [
"crates/text",
"crates/theme",
"crates/theme2",
"crates/theme_importer",
"crates/theme_selector",
"crates/ui2",
"crates/util",
@ -175,7 +177,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 = "95b2890"}
tree-sitter-vue = {git = "https://github.com/zed-industries/tree-sitter-vue", rev = "9b6cb221ccb8d0b956fcb17e9a1efac2feefeb58"}
[patch.crates-io]
tree-sitter = { git = "https://github.com/tree-sitter/tree-sitter", rev = "35a6052fbcafc5e5fc0f9415b8652be7dcaf7222" }
async-task = { git = "https://github.com/zed-industries/async-task", rev = "341b57d6de98cdfd7b418567b8de2022ca993a6e" }

1
assets/icons/dash.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-minus"><path d="M5 12h14"/></svg>

After

Width:  |  Height:  |  Size: 229 B

View file

@ -0,0 +1,7 @@
Copyright (c) 2017 eliverlara@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View file

@ -0,0 +1,369 @@
{
"name": "Andromeda Bordered",
"type": "dark",
"colors": {
"focusBorder": "#746f77",
"foreground": "#D5CED9",
"widget.shadow": "#14151A",
"selection.background": "#746f77",
"errorForeground": "#FC644D",
"button.background": "#00e8c5cc",
"button.hoverBackground": "#07d4b6cc",
"dropdown.background": "#2b303b",
"dropdown.border": "#363c49",
"input.background": "#2b303b",
"input.placeholderForeground": "#746f77",
"inputOption.activeBorder": "#C668BA",
"inputValidation.errorBackground": "#D65343",
"inputValidation.errorBorder": "#D65343",
"inputValidation.infoBackground": "#3A6395",
"inputValidation.infoBorder": "#3A6395",
"inputValidation.warningBackground": "#DE9237",
"inputValidation.warningBorder": "#DE9237",
"scrollbar.shadow": "#23262E",
"scrollbarSlider.activeBackground": "#3A3F4CCC",
"scrollbarSlider.background": "#3A3F4C77",
"scrollbarSlider.hoverBackground": "#3A3F4CAA",
"badge.background": "#00b0ff",
"badge.foreground": "#20232B",
"progressBar.background": "#C668BA",
"list.activeSelectionBackground": "#23262E",
"list.activeSelectionForeground": "#00e8c6",
"list.dropBackground": "#3a404e",
"list.focusBackground": "#282b35",
"list.focusForeground": "#eee",
"list.hoverBackground": "#23262E",
"list.hoverForeground": "#eee",
"list.inactiveSelectionBackground": "#23262E",
"list.inactiveSelectionForeground": "#00e8c6",
"activityBar.background": "#20232B",
"activityBar.dropBackground": "#3a404e",
"activityBar.foreground": "#BAAFC0",
"activityBarBadge.background": "#00b0ff",
"activityBarBadge.foreground": "#20232B",
"activityBar.border": "#1B1D23",
"sideBar.background": "#23262E",
"sideBarSectionHeader.background": "#23262E",
"sideBarTitle.foreground": "#00e8c6",
"sideBar.foreground": "#999999",
"sideBar.border": "#1B1D23",
"editorGroup.background": "#23262E",
"editorGroup.dropBackground": "#495061d7",
"editorGroupHeader.tabsBackground": "#23262E",
"tab.activeBackground": "#262A33",
"tab.inactiveBackground": "#23262E",
"tab.activeForeground": "#00e8c6",
"tab.inactiveForeground": "#746f77",
"editor.background": "#262A33",
"editor.foreground": "#D5CED9",
"editorLineNumber.foreground": "#746f77",
"editorCursor.foreground": "#FFF",
"editor.selectionBackground": "#3D4352",
"editor.selectionHighlightBackground": "#4F435580",
"editor.wordHighlightBackground": "#4F4355",
"editor.wordHighlightStrongBackground": "#db45a280",
"editor.findMatchBackground": "#f39d1256",
"editor.findMatchHighlightBackground": "#59b8b377",
"editor.findMatchBorder": "#f39d12b6",
"editor.hoverHighlightBackground": "#373941",
"editor.lineHighlightBackground": "#2e323d",
"editor.lineHighlightBorder": "#2e323d",
"editorLink.activeForeground": "#3B79C7",
"editor.rangeHighlightBackground": "#372F3C",
"editorWhitespace.foreground": "#333844",
"editorIndentGuide.background": "#333844",
"editorIndentGuide.activeBackground": "#585C66",
"editorRuler.foreground": "#4F4355",
"editorCodeLens.foreground": "#746f77",
"editorBracketMatch.background": "#746f77",
"editorBracketMatch.border": "#746f77",
"editorOverviewRuler.border": "#1B1D23",
"editorError.foreground": "#FC644D",
"editorWarning.foreground": "#FF9F2E",
"editorGutter.modifiedBackground": "#5BC0EBBB",
"editorGutter.addedBackground": "#9BC53DBB",
"editorGutter.deletedBackground": "#FC644DBB",
"diffEditor.insertedTextBackground": "#29BF1220",
"diffEditor.removedTextBackground": "#F21B3F20",
"editorWidget.background": "#20232A",
"editorSuggestWidget.background": "#20232A",
"editorSuggestWidget.border": "#372F3C",
"editorSuggestWidget.selectedBackground": "#373941",
"editorHoverWidget.background": "#373941",
"editorHoverWidget.border": "#00e8c5cc",
"debugExceptionWidget.background": "#FF9F2E60",
"debugExceptionWidget.border": "#FF9F2E60",
"minimapSlider.background": "#58607460",
"minimapSlider.hoverBackground": "#60698060",
"minimapSlider.activeBackground": "#60698060",
"peekView.border": "#23262E",
"peekViewEditor.background": "#1A1C22",
"peekViewEditor.matchHighlightBackground": "#FF9F2E60",
"peekViewResult.background": "#1A1C22",
"peekViewResult.matchHighlightBackground": "#FF9F2E60",
"peekViewResult.selectionBackground": "#23262E",
"peekViewTitle.background": "#1A1C22",
"peekViewTitleDescription.foreground": "#746f77",
"merge.currentHeaderBackground": "#F92672",
"merge.currentContentBackground": "#F9267240",
"merge.incomingHeaderBackground": "#3B79C7BB",
"merge.incomingContentBackground": "#3B79C740",
"panel.background": "#23262E",
"panel.border": "#1B1D23",
"panelTitle.activeBorder": "#23262E",
"panelTitle.inactiveForeground": "#746f77",
"statusBar.background": "#23262E",
"statusBar.debuggingBackground": "#FC644D",
"statusBar.noFolderBackground": "#23262E",
"statusBarItem.activeBackground": "#00e8c5cc",
"statusBarItem.hoverBackground": "#07d4b5b0",
"statusBarItem.prominentBackground": "#07d4b5b0",
"statusBarItem.prominentHoverBackground": "#00e8c5cc",
"terminal.ansiRed":"#ee5d43",
"terminal.ansiGreen":"#96E072",
"terminal.ansiYellow":"#FFE66D",
"terminal.ansiBlue":"#7cb7ff",
"terminal.ansiMagenta":"#ff00aa",
"terminal.ansiCyan":"#00e8c6",
"terminal.ansiBrightRed":"#ee5d43",
"terminal.ansiBrightGreen":"#96E072",
"terminal.ansiBrightYellow":"#FFE66D",
"terminal.ansiBrightBlue":"#7cb7ff",
"terminal.ansiBrightMagenta":"#ff00aa",
"terminal.ansiBrightCyan":"#00e8c6",
"terminalCursor.background": "#23262E",
"terminalCursor.foreground": "#FFE66D",
"titleBar.activeBackground": "#23262E",
"notification.background": "#2d313b",
"notification.buttonBackground": "#00e8c5cc",
"notification.buttonHoverBackground": "#07d4b5b0",
"notification.infoBackground": "#00b0ff",
"notification.warningBackground": "#FF9F2E",
"notification.errorBackground": "#FC644D",
"extensionButton.prominentBackground": "#07d4b6cc",
"extensionButton.prominentHoverBackground": "#07d4b5b0",
"pickerGroup.border": "#4F4355",
"pickerGroup.foreground": "#746f77",
"debugToolBar.background": "#20232A",
"walkThrough.embeddedEditorBackground": "#23262E",
"gitDecoration.ignoredResourceForeground": "#555555"
},
"tokenColors": [
{
"settings": {
"foreground": "#D5CED9",
"background": "#23262E"
}
},
{
"name": "Comment color",
"scope": [
"comment",
"markup.quote.markdown",
"meta.diff",
"meta.diff.header"
],
"settings": {
"foreground": "#A0A1A7cc"
}
},
{
"name": "Text Color",
"scope": [
"meta.template.expression.js",
"constant.name.attribute.tag.jade",
"punctuation.definition.metadata.markdown",
"punctuation.definition.string.end.markdown",
"punctuation.definition.string.begin.markdown"
],
"settings": {
"foreground": "#D5CED9"
}
},
{
"name": "Cyan",
"scope": [
"variable",
"support.variable",
"entity.name.tag.yaml",
"constant.character.entity.html",
"source.css entity.name.tag.reference",
"beginning.punctuation.definition.list.markdown",
"source.css entity.other.attribute-name.parent-selector",
"meta.structure.dictionary.json support.type.property-name"
],
"settings": {
"foreground": "#00e8c6"
}
},
{
"name": "Orange",
"scope": [
"markup.bold",
"constant.numeric",
"meta.group.regexp",
"constant.other.php",
"support.constant.ext.php",
"constant.other.class.php",
"support.constant.core.php",
"fenced_code.block.language",
"constant.other.caps.python",
"entity.other.attribute-name",
"support.type.exception.python",
"source.css keyword.other.unit",
"variable.other.object.property.js.jsx", "variable.other.object.js"
],
"settings": {
"foreground": "#f39c12"
}
},
{
"name": "Yellow",
"scope": [
"markup.list",
"text.xml string",
"entity.name.type",
"support.function",
"entity.other.attribute-name",
"meta.at-rule.extend",
"entity.name.function",
"entity.other.inherited-class",
"entity.other.keyframe-offset.css",
"text.html.markdown string.quoted",
"meta.function-call.generic.python",
"meta.at-rule.extend support.constant",
"entity.other.attribute-name.class.jade",
"source.css entity.other.attribute-name",
"text.xml punctuation.definition.string"
],
"settings": {
"foreground": "#FFE66D"
}
},
{
"name": "Pink",
"scope": [
"markup.heading",
"variable.language.this.js",
"variable.language.special.self.python"
],
"settings": {
"foreground": "#ff00aa"
}
},
{
"name": "Hot Pink",
"scope": [
"punctuation.definition.interpolation",
"punctuation.section.embedded.end.php",
"punctuation.section.embedded.end.ruby",
"punctuation.section.embedded.begin.php",
"punctuation.section.embedded.begin.ruby",
"punctuation.definition.template-expression",
"entity.name.tag"
],
"settings": {
"foreground": "#f92672"
}
},
{
"name": "Purple",
"scope": [
"storage",
"keyword",
"meta.link",
"meta.image",
"markup.italic",
"source.js support.type"
],
"settings": {
"foreground": "#c74ded"
}
},
{
"name": "Blue",
"scope": [
"string.regexp",
"markup.changed"
],
"settings": {
"foreground": "#7cb7ff"
}
},
{
"name": "Red",
"scope": [
"constant",
"support.class",
"keyword.operator",
"support.constant",
"text.html.markdown string",
"source.css support.function",
"source.php support.function",
"support.function.magic.python",
"entity.other.attribute-name.id",
"markup.deleted"
],
"settings": {
"foreground": "#ee5d43"
}
},
{
"name": "Green",
"scope": [
"string",
"text.html.php string",
"markup.inline.raw",
"markup.inserted",
"punctuation.definition.string",
"punctuation.definition.markdown",
"text.html meta.embedded source.js string",
"text.html.php punctuation.definition.string",
"text.html meta.embedded source.js punctuation.definition.string",
"text.html punctuation.definition.string",
"text.html string"
],
"settings": {
"foreground": "#96E072"
}
},
{
"name": "Font Underline",
"scope": [
"entity.other.inherited-class"
],
"settings": {
"fontStyle": "underline"
}
}
]
}

View file

@ -0,0 +1,367 @@
{
"name": "Andromeda",
"type": "dark",
"colors": {
"focusBorder": "#746f77",
"foreground": "#D5CED9",
"widget.shadow": "#14151A",
"selection.background": "#746f77",
"errorForeground": "#FC644D",
"button.background": "#00e8c5cc",
"button.hoverBackground": "#07d4b6cc",
"dropdown.background": "#2b303b",
"dropdown.border": "#363c49",
"input.background": "#2b303b",
"input.placeholderForeground": "#746f77",
"inputOption.activeBorder": "#C668BA",
"inputValidation.errorBackground": "#D65343",
"inputValidation.errorBorder": "#D65343",
"inputValidation.infoBackground": "#3A6395",
"inputValidation.infoBorder": "#3A6395",
"inputValidation.warningBackground": "#DE9237",
"inputValidation.warningBorder": "#DE9237",
"scrollbar.shadow": "#23262E",
"scrollbarSlider.activeBackground": "#3A3F4CCC",
"scrollbarSlider.background": "#3A3F4C77",
"scrollbarSlider.hoverBackground": "#3A3F4CAA",
"badge.background": "#00b0ff",
"badge.foreground": "#20232B",
"progressBar.background": "#C668BA",
"list.activeSelectionBackground": "#23262E",
"list.activeSelectionForeground": "#00e8c6",
"list.dropBackground": "#3a404e",
"list.focusBackground": "#282b35",
"list.focusForeground": "#eee",
"list.hoverBackground": "#23262E",
"list.hoverForeground": "#eee",
"list.inactiveSelectionBackground": "#23262E",
"list.inactiveSelectionForeground": "#00e8c6",
"activityBar.background": "#23262E",
"activityBar.dropBackground": "#3a404e",
"activityBar.foreground": "#BAAFC0",
"activityBarBadge.background": "#00b0ff",
"activityBarBadge.foreground": "#20232B",
"sideBar.background": "#23262E",
"sideBarSectionHeader.background": "#23262E",
"sideBarTitle.foreground": "#00e8c6",
"sideBar.foreground": "#999999",
"editorGroup.background": "#23262E",
"editorGroup.dropBackground": "#495061d7",
"editorGroupHeader.tabsBackground": "#23262E",
"tab.activeBackground": "#23262e",
"tab.inactiveBackground": "#23262E",
"tab.activeForeground": "#00e8c6",
"tab.inactiveForeground": "#746f77",
"editor.background": "#23262E",
"editor.foreground": "#D5CED9",
"editorLineNumber.foreground": "#746f77",
"editorCursor.foreground": "#FFF",
"editor.selectionBackground": "#3D4352",
"editor.selectionHighlightBackground": "#4F435580",
"editor.wordHighlightBackground": "#4F4355",
"editor.wordHighlightStrongBackground": "#db45a280",
"editor.findMatchBackground": "#f39d1256",
"editor.findMatchHighlightBackground": "#59b8b377",
"editor.findMatchBorder": "#f39d12b6",
"editor.hoverHighlightBackground": "#373941",
"editor.lineHighlightBackground": "#2e323d",
"editor.lineHighlightBorder": "#2e323d",
"editorLink.activeForeground": "#3B79C7",
"editor.rangeHighlightBackground": "#372F3C",
"editorWhitespace.foreground": "#333844",
"editorIndentGuide.background": "#333844",
"editorIndentGuide.activeBackground": "#585C66",
"editorRuler.foreground": "#4F4355",
"editorCodeLens.foreground": "#746f77",
"editorBracketMatch.background": "#746f77",
"editorBracketMatch.border": "#746f77",
"editorOverviewRuler.border": "#1B1D23",
"editorError.foreground": "#FC644D",
"editorWarning.foreground": "#FF9F2E",
"editorGutter.modifiedBackground": "#5BC0EBBB",
"editorGutter.addedBackground": "#9BC53DBB",
"editorGutter.deletedBackground": "#FC644DBB",
"diffEditor.insertedTextBackground": "#29BF1220",
"diffEditor.removedTextBackground": "#F21B3F20",
"editorWidget.background": "#20232A",
"editorSuggestWidget.background": "#20232A",
"editorSuggestWidget.border": "#372F3C",
"editorSuggestWidget.selectedBackground": "#373941",
"editorHoverWidget.background": "#373941",
"editorHoverWidget.border": "#00e8c5cc",
"debugExceptionWidget.background": "#FF9F2E60",
"debugExceptionWidget.border": "#FF9F2E60",
"minimapSlider.background": "#58607460",
"minimapSlider.hoverBackground": "#60698060",
"minimapSlider.activeBackground": "#60698060",
"peekView.border": "#23262E",
"peekViewEditor.background": "#1A1C22",
"peekViewEditor.matchHighlightBackground": "#FF9F2E60",
"peekViewResult.background": "#1A1C22",
"peekViewResult.matchHighlightBackground": "#FF9F2E60",
"peekViewResult.selectionBackground": "#23262E",
"peekViewTitle.background": "#1A1C22",
"peekViewTitleDescription.foreground": "#746f77",
"merge.currentHeaderBackground": "#F92672",
"merge.currentContentBackground": "#F9267240",
"merge.incomingHeaderBackground": "#3B79C7BB",
"merge.incomingContentBackground": "#3B79C740",
"panel.background": "#23262E",
"panel.border": "#1B1D23",
"panelTitle.activeBorder": "#23262E",
"panelTitle.inactiveForeground": "#746f77",
"statusBar.background": "#23262E",
"statusBar.debuggingBackground": "#FC644D",
"statusBar.noFolderBackground": "#23262E",
"statusBarItem.activeBackground": "#00e8c5cc",
"statusBarItem.hoverBackground": "#07d4b5b0",
"statusBarItem.prominentBackground": "#07d4b5b0",
"statusBarItem.prominentHoverBackground": "#00e8c5cc",
"terminal.ansiRed":"#ee5d43",
"terminal.ansiGreen":"#96E072",
"terminal.ansiYellow":"#FFE66D",
"terminal.ansiBlue":"#7cb7ff",
"terminal.ansiMagenta":"#ff00aa",
"terminal.ansiCyan":"#00e8c6",
"terminal.ansiBrightRed":"#ee5d43",
"terminal.ansiBrightGreen":"#96E072",
"terminal.ansiBrightYellow":"#FFE66D",
"terminal.ansiBrightBlue":"#7cb7ff",
"terminal.ansiBrightMagenta":"#ff00aa",
"terminal.ansiBrightCyan":"#00e8c6",
"terminalCursor.background": "#23262E",
"terminalCursor.foreground": "#FFE66D",
"titleBar.activeBackground": "#23262E",
"notification.background": "#2d313b",
"notification.buttonBackground": "#00e8c5cc",
"notification.buttonHoverBackground": "#07d4b5b0",
"notification.infoBackground": "#00b0ff",
"notification.warningBackground": "#FF9F2E",
"notification.errorBackground": "#FC644D",
"extensionButton.prominentBackground": "#07d4b6cc",
"extensionButton.prominentHoverBackground": "#07d4b5b0",
"pickerGroup.border": "#4F4355",
"pickerGroup.foreground": "#746f77",
"debugToolBar.background": "#20232A",
"walkThrough.embeddedEditorBackground": "#23262E",
"gitDecoration.ignoredResourceForeground": "#555555"
},
"tokenColors": [
{
"settings": {
"foreground": "#D5CED9",
"background": "#23262E"
}
},
{
"name": "Comment color",
"scope": [
"comment",
"markup.quote.markdown",
"meta.diff",
"meta.diff.header"
],
"settings": {
"foreground": "#A0A1A7cc"
}
},
{
"name": "Text Color",
"scope": [
"meta.template.expression.js",
"constant.name.attribute.tag.jade",
"punctuation.definition.metadata.markdown",
"punctuation.definition.string.end.markdown",
"punctuation.definition.string.begin.markdown"
],
"settings": {
"foreground": "#D5CED9"
}
},
{
"name": "Cyan",
"scope": [
"variable",
"support.variable",
"entity.name.tag.yaml",
"constant.character.entity.html",
"source.css entity.name.tag.reference",
"beginning.punctuation.definition.list.markdown",
"source.css entity.other.attribute-name.parent-selector",
"meta.structure.dictionary.json support.type.property-name"
],
"settings": {
"foreground": "#00e8c6"
}
},
{
"name": "Orange",
"scope": [
"markup.bold",
"constant.numeric",
"meta.group.regexp",
"constant.other.php",
"support.constant.ext.php",
"constant.other.class.php",
"support.constant.core.php",
"fenced_code.block.language",
"constant.other.caps.python",
"entity.other.attribute-name",
"support.type.exception.python",
"source.css keyword.other.unit",
"variable.other.object.property.js.jsx", "variable.other.object.js"
],
"settings": {
"foreground": "#f39c12"
}
},
{
"name": "Yellow",
"scope": [
"markup.list",
"text.xml string",
"entity.name.type",
"support.function",
"entity.other.attribute-name",
"meta.at-rule.extend",
"entity.name.function",
"entity.other.inherited-class",
"entity.other.keyframe-offset.css",
"text.html.markdown string.quoted",
"meta.function-call.generic.python",
"meta.at-rule.extend support.constant",
"entity.other.attribute-name.class.jade",
"source.css entity.other.attribute-name",
"text.xml punctuation.definition.string"
],
"settings": {
"foreground": "#FFE66D"
}
},
{
"name": "Pink",
"scope": [
"markup.heading",
"variable.language.this.js",
"variable.language.special.self.python"
],
"settings": {
"foreground": "#ff00aa"
}
},
{
"name": "Hot Pink",
"scope": [
"punctuation.definition.interpolation",
"punctuation.section.embedded.end.php",
"punctuation.section.embedded.end.ruby",
"punctuation.section.embedded.begin.php",
"punctuation.section.embedded.begin.ruby",
"punctuation.definition.template-expression",
"entity.name.tag"
],
"settings": {
"foreground": "#f92672"
}
},
{
"name": "Purple",
"scope": [
"storage",
"keyword",
"meta.link",
"meta.image",
"markup.italic",
"source.js support.type"
],
"settings": {
"foreground": "#c74ded"
}
},
{
"name": "Blue",
"scope": [
"string.regexp",
"markup.changed"
],
"settings": {
"foreground": "#7cb7ff"
}
},
{
"name": "Red",
"scope": [
"constant",
"support.class",
"keyword.operator",
"support.constant",
"text.html.markdown string",
"source.css support.function",
"source.php support.function",
"support.function.magic.python",
"entity.other.attribute-name.id",
"markup.deleted"
],
"settings": {
"foreground": "#ee5d43"
}
},
{
"name": "Green",
"scope": [
"string",
"text.html.php string",
"markup.inline.raw",
"markup.inserted",
"punctuation.definition.string",
"punctuation.definition.markdown",
"text.html meta.embedded source.js string",
"text.html.php punctuation.definition.string",
"text.html meta.embedded source.js punctuation.definition.string",
"text.html punctuation.definition.string",
"text.html string"
],
"settings": {
"foreground": "#96E072"
}
},
{
"name": "Font Underline",
"scope": [
"entity.other.inherited-class"
],
"settings": {
"fontStyle": "underline"
}
}
]
}

View file

@ -0,0 +1,16 @@
{
"name": "Andromeda",
"author": "Eliver Lara (EliverLara)",
"themes": [
{
"name": "Andromeda",
"file_name": "andromeda.json",
"appearance": "dark"
},
{
"name": "Andromeda Bordered",
"file_name": "andromeda-bordered.json",
"appearance": "dark"
}
]
}

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2016 Ike Ku
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,847 @@
{
"type": "dark",
"colors": {
"focusBorder": "#e6b450b3",
"foreground": "#565b66",
"widget.shadow": "#00000080",
"selection.background": "#409fff4d",
"icon.foreground": "#565b66",
"errorForeground": "#d95757",
"descriptionForeground": "#565b66",
"textBlockQuote.background": "#0f131a",
"textLink.foreground": "#e6b450",
"textLink.activeForeground": "#e6b450",
"textPreformat.foreground": "#bfbdb6",
"button.background": "#e6b450",
"button.foreground": "#734d00",
"button.hoverBackground": "#e1af4b",
"button.secondaryBackground": "#565b6633",
"button.secondaryForeground": "#bfbdb6",
"button.secondaryHoverBackground": "#565b6680",
"dropdown.background": "#0d1017",
"dropdown.foreground": "#565b66",
"dropdown.border": "#565b6645",
"input.background": "#0d1017",
"input.border": "#565b6645",
"input.foreground": "#bfbdb6",
"input.placeholderForeground": "#565b6680",
"inputOption.activeBorder": "#e6b4504d",
"inputOption.activeBackground": "#e6b45033",
"inputOption.activeForeground": "#e6b450",
"inputValidation.errorBackground": "#0d1017",
"inputValidation.errorBorder": "#d95757",
"inputValidation.infoBackground": "#0b0e14",
"inputValidation.infoBorder": "#39bae6",
"inputValidation.warningBackground": "#0b0e14",
"inputValidation.warningBorder": "#ffb454",
"scrollbar.shadow": "#1e232b00",
"scrollbarSlider.background": "#565b6666",
"scrollbarSlider.hoverBackground": "#565b6699",
"scrollbarSlider.activeBackground": "#565b66b3",
"badge.background": "#e6b45033",
"badge.foreground": "#e6b450",
"progressBar.background": "#e6b450",
"list.activeSelectionBackground": "#47526640",
"list.activeSelectionForeground": "#bfbdb6",
"list.focusBackground": "#47526640",
"list.focusForeground": "#bfbdb6",
"list.focusOutline": "#47526640",
"list.highlightForeground": "#e6b450",
"list.deemphasizedForeground": "#d95757",
"list.hoverBackground": "#47526640",
"list.inactiveSelectionBackground": "#47526633",
"list.inactiveSelectionForeground": "#565b66",
"list.invalidItemForeground": "#565b664d",
"list.errorForeground": "#d95757",
"tree.indentGuidesStroke": "#6c738080",
"listFilterWidget.background": "#0f131a",
"listFilterWidget.outline": "#e6b450",
"listFilterWidget.noMatchesOutline": "#d95757",
"list.filterMatchBackground": "#5f4c7266",
"list.filterMatchBorder": "#6c598066",
"activityBar.background": "#0b0e14",
"activityBar.foreground": "#565b66cc",
"activityBar.inactiveForeground": "#565b6699",
"activityBar.border": "#0b0e14",
"activityBar.activeBorder": "#e6b450",
"activityBarBadge.background": "#e6b450",
"activityBarBadge.foreground": "#734d00",
"sideBar.background": "#0b0e14",
"sideBar.border": "#0b0e14",
"sideBarTitle.foreground": "#565b66",
"sideBarSectionHeader.background": "#0b0e14",
"sideBarSectionHeader.foreground": "#565b66",
"sideBarSectionHeader.border": "#0b0e14",
"minimap.background": "#0b0e14",
"minimap.selectionHighlight": "#409fff4d",
"minimap.errorHighlight": "#d95757",
"minimap.findMatchHighlight": "#6c5980",
"minimapGutter.addedBackground": "#7fd962",
"minimapGutter.modifiedBackground": "#73b8ff",
"minimapGutter.deletedBackground": "#f26d78",
"editorGroup.border": "#1e232b",
"editorGroup.background": "#0f131a",
"editorGroupHeader.noTabsBackground": "#0b0e14",
"editorGroupHeader.tabsBackground": "#0b0e14",
"editorGroupHeader.tabsBorder": "#0b0e14",
"tab.activeBackground": "#0b0e14",
"tab.activeForeground": "#bfbdb6",
"tab.border": "#0b0e14",
"tab.activeBorder": "#e6b450",
"tab.unfocusedActiveBorder": "#565b66",
"tab.inactiveBackground": "#0b0e14",
"tab.inactiveForeground": "#565b66",
"tab.unfocusedActiveForeground": "#565b66",
"tab.unfocusedInactiveForeground": "#565b66",
"editor.background": "#0b0e14",
"editor.foreground": "#bfbdb6",
"editorLineNumber.foreground": "#6c738099",
"editorLineNumber.activeForeground": "#6c7380e6",
"editorCursor.foreground": "#e6b450",
"editor.inactiveSelectionBackground": "#409fff21",
"editor.selectionBackground": "#409fff4d",
"editor.selectionHighlightBackground": "#7fd96226",
"editor.selectionHighlightBorder": "#7fd96200",
"editor.wordHighlightBackground": "#73b8ff14",
"editor.wordHighlightStrongBackground": "#7fd96214",
"editor.wordHighlightBorder": "#73b8ff80",
"editor.wordHighlightStrongBorder": "#7fd96280",
"editor.findMatchBackground": "#6c5980",
"editor.findMatchBorder": "#6c5980",
"editor.findMatchHighlightBackground": "#6c598066",
"editor.findMatchHighlightBorder": "#5f4c7266",
"editor.findRangeHighlightBackground": "#6c598040",
"editor.rangeHighlightBackground": "#6c598033",
"editor.lineHighlightBackground": "#131721",
"editorLink.activeForeground": "#e6b450",
"editorWhitespace.foreground": "#6c738099",
"editorIndentGuide.background": "#6c738033",
"editorIndentGuide.activeBackground": "#6c738080",
"editorRuler.foreground": "#6c738033",
"editorCodeLens.foreground": "#acb6bf8c",
"editorBracketMatch.background": "#6c73804d",
"editorBracketMatch.border": "#6c73804d",
"editor.snippetTabstopHighlightBackground": "#7fd96233",
"editorOverviewRuler.border": "#1e232b",
"editorOverviewRuler.modifiedForeground": "#73b8ff",
"editorOverviewRuler.addedForeground": "#7fd962",
"editorOverviewRuler.deletedForeground": "#f26d78",
"editorOverviewRuler.errorForeground": "#d95757",
"editorOverviewRuler.warningForeground": "#e6b450",
"editorOverviewRuler.bracketMatchForeground": "#6c7380b3",
"editorOverviewRuler.wordHighlightForeground": "#73b8ff66",
"editorOverviewRuler.wordHighlightStrongForeground": "#7fd96266",
"editorOverviewRuler.findMatchForeground": "#6c5980",
"editorError.foreground": "#d95757",
"editorWarning.foreground": "#e6b450",
"editorGutter.modifiedBackground": "#73b8ffcc",
"editorGutter.addedBackground": "#7fd962cc",
"editorGutter.deletedBackground": "#f26d78cc",
"diffEditor.insertedTextBackground": "#7fd9621f",
"diffEditor.removedTextBackground": "#f26d781f",
"diffEditor.diagonalFill": "#1e232b",
"editorWidget.background": "#0f131a",
"editorWidget.border": "#1e232b",
"editorHoverWidget.background": "#0f131a",
"editorHoverWidget.border": "#1e232b",
"editorSuggestWidget.background": "#0f131a",
"editorSuggestWidget.border": "#1e232b",
"editorSuggestWidget.highlightForeground": "#e6b450",
"editorSuggestWidget.selectedBackground": "#47526640",
"debugExceptionWidget.border": "#1e232b",
"debugExceptionWidget.background": "#0f131a",
"editorMarkerNavigation.background": "#0f131a",
"peekView.border": "#47526640",
"peekViewTitle.background": "#47526640",
"peekViewTitleDescription.foreground": "#565b66",
"peekViewTitleLabel.foreground": "#bfbdb6",
"peekViewEditor.background": "#0f131a",
"peekViewEditor.matchHighlightBackground": "#6c598066",
"peekViewEditor.matchHighlightBorder": "#5f4c7266",
"peekViewResult.background": "#0f131a",
"peekViewResult.fileForeground": "#bfbdb6",
"peekViewResult.lineForeground": "#565b66",
"peekViewResult.matchHighlightBackground": "#6c598066",
"peekViewResult.selectionBackground": "#47526640",
"panel.background": "#0b0e14",
"panel.border": "#1e232b",
"panelTitle.activeBorder": "#e6b450",
"panelTitle.activeForeground": "#bfbdb6",
"panelTitle.inactiveForeground": "#565b66",
"statusBar.background": "#0b0e14",
"statusBar.foreground": "#565b66",
"statusBar.border": "#0b0e14",
"statusBar.debuggingBackground": "#f29668",
"statusBar.debuggingForeground": "#0d1017",
"statusBar.noFolderBackground": "#0f131a",
"statusBarItem.activeBackground": "#565b6633",
"statusBarItem.hoverBackground": "#565b6633",
"statusBarItem.prominentBackground": "#1e232b",
"statusBarItem.prominentHoverBackground": "#00000030",
"statusBarItem.remoteBackground": "#e6b450",
"statusBarItem.remoteForeground": "#734d00",
"titleBar.activeBackground": "#0b0e14",
"titleBar.activeForeground": "#bfbdb6",
"titleBar.inactiveBackground": "#0b0e14",
"titleBar.inactiveForeground": "#565b66",
"titleBar.border": "#0b0e14",
"extensionButton.prominentForeground": "#734d00",
"extensionButton.prominentBackground": "#e6b450",
"extensionButton.prominentHoverBackground": "#e1af4b",
"pickerGroup.border": "#1e232b",
"pickerGroup.foreground": "#565b6680",
"debugToolBar.background": "#0f131a",
"debugIcon.breakpointForeground": "#f29668",
"debugIcon.breakpointDisabledForeground": "#f2966880",
"debugConsoleInputIcon.foreground": "#e6b450",
"welcomePage.tileBackground": "#0b0e14",
"welcomePage.tileShadow": "#00000080",
"welcomePage.progress.background": "#131721",
"welcomePage.buttonBackground": "#e6b45066",
"walkThrough.embeddedEditorBackground": "#0f131a",
"gitDecoration.modifiedResourceForeground": "#73b8ffb3",
"gitDecoration.deletedResourceForeground": "#f26d78b3",
"gitDecoration.untrackedResourceForeground": "#7fd962b3",
"gitDecoration.ignoredResourceForeground": "#565b6680",
"gitDecoration.conflictingResourceForeground": "",
"gitDecoration.submoduleResourceForeground": "#d2a6ffb3",
"settings.headerForeground": "#bfbdb6",
"settings.modifiedItemIndicator": "#73b8ff",
"keybindingLabel.background": "#565b661a",
"keybindingLabel.foreground": "#bfbdb6",
"keybindingLabel.border": "#bfbdb61a",
"keybindingLabel.bottomBorder": "#bfbdb61a",
"terminal.background": "#0b0e14",
"terminal.foreground": "#bfbdb6",
"terminal.ansiBlack": "#1e232b",
"terminal.ansiRed": "#ea6c73",
"terminal.ansiGreen": "#7fd962",
"terminal.ansiYellow": "#f9af4f",
"terminal.ansiBlue": "#53bdfa",
"terminal.ansiMagenta": "#cda1fa",
"terminal.ansiCyan": "#90e1c6",
"terminal.ansiWhite": "#c7c7c7",
"terminal.ansiBrightBlack": "#686868",
"terminal.ansiBrightRed": "#f07178",
"terminal.ansiBrightGreen": "#aad94c",
"terminal.ansiBrightYellow": "#ffb454",
"terminal.ansiBrightBlue": "#59c2ff",
"terminal.ansiBrightMagenta": "#d2a6ff",
"terminal.ansiBrightCyan": "#95e6cb",
"terminal.ansiBrightWhite": "#ffffff"
},
"tokenColors": [
{
"settings": {
"background": "#0b0e14",
"foreground": "#bfbdb6"
}
},
{
"name": "Comment",
"scope": [
"comment"
],
"settings": {
"fontStyle": "italic",
"foreground": "#acb6bf8c"
}
},
{
"name": "String",
"scope": [
"string",
"constant.other.symbol"
],
"settings": {
"foreground": "#aad94c"
}
},
{
"name": "Regular Expressions and Escape Characters",
"scope": [
"string.regexp",
"constant.character",
"constant.other"
],
"settings": {
"foreground": "#95e6cb"
}
},
{
"name": "Number",
"scope": [
"constant.numeric"
],
"settings": {
"foreground": "#d2a6ff"
}
},
{
"name": "Built-in constants",
"scope": [
"constant.language"
],
"settings": {
"foreground": "#d2a6ff"
}
},
{
"name": "Variable",
"scope": [
"variable",
"variable.parameter.function-call"
],
"settings": {
"foreground": "#bfbdb6"
}
},
{
"name": "Member Variable",
"scope": [
"variable.member"
],
"settings": {
"foreground": "#f07178"
}
},
{
"name": "Language variable",
"scope": [
"variable.language"
],
"settings": {
"fontStyle": "italic",
"foreground": "#39bae6"
}
},
{
"name": "Storage",
"scope": [
"storage"
],
"settings": {
"foreground": "#ff8f40"
}
},
{
"name": "Keyword",
"scope": [
"keyword"
],
"settings": {
"foreground": "#ff8f40"
}
},
{
"name": "Operators",
"scope": [
"keyword.operator"
],
"settings": {
"foreground": "#f29668"
}
},
{
"name": "Separators like ; or ,",
"scope": [
"punctuation.separator",
"punctuation.terminator"
],
"settings": {
"foreground": "#bfbdb6b3"
}
},
{
"name": "Punctuation",
"scope": [
"punctuation.section"
],
"settings": {
"foreground": "#bfbdb6"
}
},
{
"name": "Accessor",
"scope": [
"punctuation.accessor"
],
"settings": {
"foreground": "#f29668"
}
},
{
"name": "JavaScript/TypeScript interpolation punctuation",
"scope": [
"punctuation.definition.template-expression"
],
"settings": {
"foreground": "#ff8f40"
}
},
{
"name": "Ruby interpolation punctuation",
"scope": [
"punctuation.section.embedded"
],
"settings": {
"foreground": "#ff8f40"
}
},
{
"name": "Interpolation text",
"scope": [
"meta.embedded"
],
"settings": {
"foreground": "#bfbdb6"
}
},
{
"name": "Types fixes",
"scope": [
"source.java storage.type",
"source.haskell storage.type",
"source.c storage.type"
],
"settings": {
"foreground": "#59c2ff"
}
},
{
"name": "Inherited class type",
"scope": [
"entity.other.inherited-class"
],
"settings": {
"foreground": "#39bae6"
}
},
{
"name": "Lambda arrow",
"scope": [
"storage.type.function"
],
"settings": {
"foreground": "#ff8f40"
}
},
{
"name": "Java primitive variable types",
"scope": [
"source.java storage.type.primitive"
],
"settings": {
"foreground": "#39bae6"
}
},
{
"name": "Function name",
"scope": [
"entity.name.function"
],
"settings": {
"foreground": "#ffb454"
}
},
{
"name": "Function arguments",
"scope": [
"variable.parameter",
"meta.parameter"
],
"settings": {
"foreground": "#d2a6ff"
}
},
{
"name": "Function call",
"scope": [
"variable.function",
"variable.annotation",
"meta.function-call.generic",
"support.function.go"
],
"settings": {
"foreground": "#ffb454"
}
},
{
"name": "Library function",
"scope": [
"support.function",
"support.macro"
],
"settings": {
"foreground": "#f07178"
}
},
{
"name": "Imports and packages",
"scope": [
"entity.name.import",
"entity.name.package"
],
"settings": {
"foreground": "#aad94c"
}
},
{
"name": "Entity name",
"scope": [
"entity.name"
],
"settings": {
"foreground": "#59c2ff"
}
},
{
"name": "Tag",
"scope": [
"entity.name.tag",
"meta.tag.sgml"
],
"settings": {
"foreground": "#39bae6"
}
},
{
"name": "JSX Component",
"scope": [
"support.class.component"
],
"settings": {
"foreground": "#59c2ff"
}
},
{
"name": "Tag start/end",
"scope": [
"punctuation.definition.tag.end",
"punctuation.definition.tag.begin",
"punctuation.definition.tag"
],
"settings": {
"foreground": "#39bae680"
}
},
{
"name": "Tag attribute",
"scope": [
"entity.other.attribute-name"
],
"settings": {
"foreground": "#ffb454"
}
},
{
"name": "Library constant",
"scope": [
"support.constant"
],
"settings": {
"fontStyle": "italic",
"foreground": "#f29668"
}
},
{
"name": "Library class/type",
"scope": [
"support.type",
"support.class",
"source.go storage.type"
],
"settings": {
"foreground": "#39bae6"
}
},
{
"name": "Decorators/annotation",
"scope": [
"meta.decorator variable.other",
"meta.decorator punctuation.decorator",
"storage.type.annotation"
],
"settings": {
"foreground": "#e6b673"
}
},
{
"name": "Invalid",
"scope": [
"invalid"
],
"settings": {
"foreground": "#d95757"
}
},
{
"name": "diff.header",
"scope": [
"meta.diff",
"meta.diff.header"
],
"settings": {
"foreground": "#c594c5"
}
},
{
"name": "Ruby class methods",
"scope": [
"source.ruby variable.other.readwrite"
],
"settings": {
"foreground": "#ffb454"
}
},
{
"name": "CSS tag names",
"scope": [
"source.css entity.name.tag",
"source.sass entity.name.tag",
"source.scss entity.name.tag",
"source.less entity.name.tag",
"source.stylus entity.name.tag"
],
"settings": {
"foreground": "#59c2ff"
}
},
{
"name": "CSS browser prefix",
"scope": [
"source.css support.type",
"source.sass support.type",
"source.scss support.type",
"source.less support.type",
"source.stylus support.type"
],
"settings": {
"foreground": "#acb6bf8c"
}
},
{
"name": "CSS Properties",
"scope": [
"support.type.property-name"
],
"settings": {
"fontStyle": "normal",
"foreground": "#39bae6"
}
},
{
"name": "Search Results Numbers",
"scope": [
"constant.numeric.line-number.find-in-files - match"
],
"settings": {
"foreground": "#acb6bf8c"
}
},
{
"name": "Search Results Match Numbers",
"scope": [
"constant.numeric.line-number.match"
],
"settings": {
"foreground": "#ff8f40"
}
},
{
"name": "Search Results Lines",
"scope": [
"entity.name.filename.find-in-files"
],
"settings": {
"foreground": "#aad94c"
}
},
{
"scope": [
"message.error"
],
"settings": {
"foreground": "#d95757"
}
},
{
"name": "Markup heading",
"scope": [
"markup.heading",
"markup.heading entity.name"
],
"settings": {
"fontStyle": "bold",
"foreground": "#aad94c"
}
},
{
"name": "Markup links",
"scope": [
"markup.underline.link",
"string.other.link"
],
"settings": {
"foreground": "#39bae6"
}
},
{
"name": "Markup Italic",
"scope": [
"markup.italic"
],
"settings": {
"fontStyle": "italic",
"foreground": "#f07178"
}
},
{
"name": "Markup Bold",
"scope": [
"markup.bold"
],
"settings": {
"fontStyle": "bold",
"foreground": "#f07178"
}
},
{
"name": "Markup Bold/italic",
"scope": [
"markup.italic markup.bold",
"markup.bold markup.italic"
],
"settings": {
"fontStyle": "bold italic"
}
},
{
"name": "Markup Code",
"scope": [
"markup.raw"
],
"settings": {
"background": "#bfbdb605"
}
},
{
"name": "Markup Code Inline",
"scope": [
"markup.raw.inline"
],
"settings": {
"background": "#bfbdb60f"
}
},
{
"name": "Markdown Separator",
"scope": [
"meta.separator"
],
"settings": {
"fontStyle": "bold",
"background": "#bfbdb60f",
"foreground": "#acb6bf8c"
}
},
{
"name": "Markup Blockquote",
"scope": [
"markup.quote"
],
"settings": {
"foreground": "#95e6cb",
"fontStyle": "italic"
}
},
{
"name": "Markup List Bullet",
"scope": [
"markup.list punctuation.definition.list.begin"
],
"settings": {
"foreground": "#ffb454"
}
},
{
"name": "Markup added",
"scope": [
"markup.inserted"
],
"settings": {
"foreground": "#7fd962"
}
},
{
"name": "Markup modified",
"scope": [
"markup.changed"
],
"settings": {
"foreground": "#73b8ff"
}
},
{
"name": "Markup removed",
"scope": [
"markup.deleted"
],
"settings": {
"foreground": "#f26d78"
}
},
{
"name": "Markup Strike",
"scope": [
"markup.strike"
],
"settings": {
"foreground": "#e6b673"
}
},
{
"name": "Markup Table",
"scope": [
"markup.table"
],
"settings": {
"background": "#bfbdb60f",
"foreground": "#39bae6"
}
},
{
"name": "Markup Raw Inline",
"scope": [
"text.html.markdown markup.inline.raw"
],
"settings": {
"foreground": "#f29668"
}
},
{
"name": "Markdown - Line Break",
"scope": [
"text.html.markdown meta.dummy.line-break"
],
"settings": {
"background": "#acb6bf8c",
"foreground": "#acb6bf8c"
}
},
{
"name": "Markdown - Raw Block Fenced",
"scope": [
"punctuation.definition.markdown"
],
"settings": {
"background": "#bfbdb6",
"foreground": "#acb6bf8c"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"parameter.label": "#bfbdb6"
}
}

View file

@ -0,0 +1,847 @@
{
"type": "light",
"colors": {
"focusBorder": "#ffaa33b3",
"foreground": "#8a9199",
"widget.shadow": "#00000026",
"selection.background": "#035bd626",
"icon.foreground": "#8a9199",
"errorForeground": "#e65050",
"descriptionForeground": "#8a9199",
"textBlockQuote.background": "#f3f4f5",
"textLink.foreground": "#ffaa33",
"textLink.activeForeground": "#ffaa33",
"textPreformat.foreground": "#5c6166",
"button.background": "#ffaa33",
"button.foreground": "#804a00",
"button.hoverBackground": "#f9a52e",
"button.secondaryBackground": "#8a919933",
"button.secondaryForeground": "#5c6166",
"button.secondaryHoverBackground": "#8a919980",
"dropdown.background": "#fcfcfc",
"dropdown.foreground": "#8a9199",
"dropdown.border": "#8a919945",
"input.background": "#fcfcfc",
"input.border": "#8a919945",
"input.foreground": "#5c6166",
"input.placeholderForeground": "#8a919980",
"inputOption.activeBorder": "#f4a0284d",
"inputOption.activeBackground": "#ffaa3333",
"inputOption.activeForeground": "#f4a028",
"inputValidation.errorBackground": "#fcfcfc",
"inputValidation.errorBorder": "#e65050",
"inputValidation.infoBackground": "#f8f9fa",
"inputValidation.infoBorder": "#55b4d4",
"inputValidation.warningBackground": "#f8f9fa",
"inputValidation.warningBorder": "#f2ae49",
"scrollbar.shadow": "#6b7d8f00",
"scrollbarSlider.background": "#8a919966",
"scrollbarSlider.hoverBackground": "#8a919999",
"scrollbarSlider.activeBackground": "#8a9199b3",
"badge.background": "#ffaa3333",
"badge.foreground": "#f4a028",
"progressBar.background": "#ffaa33",
"list.activeSelectionBackground": "#56728f1f",
"list.activeSelectionForeground": "#5c6166",
"list.focusBackground": "#56728f1f",
"list.focusForeground": "#5c6166",
"list.focusOutline": "#56728f1f",
"list.highlightForeground": "#ffaa33",
"list.deemphasizedForeground": "#e65050",
"list.hoverBackground": "#56728f1f",
"list.inactiveSelectionBackground": "#6b7d8f1f",
"list.inactiveSelectionForeground": "#8a9199",
"list.invalidItemForeground": "#8a91994d",
"list.errorForeground": "#e65050",
"tree.indentGuidesStroke": "#8a919959",
"listFilterWidget.background": "#f3f4f5",
"listFilterWidget.outline": "#ffaa33",
"listFilterWidget.noMatchesOutline": "#e65050",
"list.filterMatchBackground": "#ddcaef73",
"list.filterMatchBorder": "#ecd9ff73",
"activityBar.background": "#f8f9fa",
"activityBar.foreground": "#8a9199cc",
"activityBar.inactiveForeground": "#8a919999",
"activityBar.border": "#f8f9fa",
"activityBar.activeBorder": "#ffaa33",
"activityBarBadge.background": "#ffaa33",
"activityBarBadge.foreground": "#f8f9fa",
"sideBar.background": "#f8f9fa",
"sideBar.border": "#f8f9fa",
"sideBarTitle.foreground": "#8a9199",
"sideBarSectionHeader.background": "#f8f9fa",
"sideBarSectionHeader.foreground": "#8a9199",
"sideBarSectionHeader.border": "#f8f9fa",
"minimap.background": "#f8f9fa",
"minimap.selectionHighlight": "#035bd626",
"minimap.errorHighlight": "#e65050",
"minimap.findMatchHighlight": "#ecd9ff",
"minimapGutter.addedBackground": "#6cbf43",
"minimapGutter.modifiedBackground": "#478acc",
"minimapGutter.deletedBackground": "#ff7383",
"editorGroup.border": "#6b7d8f1f",
"editorGroup.background": "#f3f4f5",
"editorGroupHeader.noTabsBackground": "#f8f9fa",
"editorGroupHeader.tabsBackground": "#f8f9fa",
"editorGroupHeader.tabsBorder": "#f8f9fa",
"tab.activeBackground": "#f8f9fa",
"tab.activeForeground": "#5c6166",
"tab.border": "#f8f9fa",
"tab.activeBorder": "#ffaa33",
"tab.unfocusedActiveBorder": "#8a9199",
"tab.inactiveBackground": "#f8f9fa",
"tab.inactiveForeground": "#8a9199",
"tab.unfocusedActiveForeground": "#8a9199",
"tab.unfocusedInactiveForeground": "#8a9199",
"editor.background": "#f8f9fa",
"editor.foreground": "#5c6166",
"editorLineNumber.foreground": "#8a919966",
"editorLineNumber.activeForeground": "#8a9199cc",
"editorCursor.foreground": "#ffaa33",
"editor.inactiveSelectionBackground": "#035bd612",
"editor.selectionBackground": "#035bd626",
"editor.selectionHighlightBackground": "#6cbf4326",
"editor.selectionHighlightBorder": "#6cbf4300",
"editor.wordHighlightBackground": "#478acc14",
"editor.wordHighlightStrongBackground": "#6cbf4314",
"editor.wordHighlightBorder": "#478acc80",
"editor.wordHighlightStrongBorder": "#6cbf4380",
"editor.findMatchBackground": "#ecd9ff",
"editor.findMatchBorder": "#ecd9ff",
"editor.findMatchHighlightBackground": "#ecd9ff73",
"editor.findMatchHighlightBorder": "#ddcaef73",
"editor.findRangeHighlightBackground": "#ecd9ff40",
"editor.rangeHighlightBackground": "#ecd9ff33",
"editor.lineHighlightBackground": "#8a91991a",
"editorLink.activeForeground": "#ffaa33",
"editorWhitespace.foreground": "#8a919966",
"editorIndentGuide.background": "#8a91992e",
"editorIndentGuide.activeBackground": "#8a919959",
"editorRuler.foreground": "#8a91992e",
"editorCodeLens.foreground": "#787b8099",
"editorBracketMatch.background": "#8a91994d",
"editorBracketMatch.border": "#8a91994d",
"editor.snippetTabstopHighlightBackground": "#6cbf4333",
"editorOverviewRuler.border": "#6b7d8f1f",
"editorOverviewRuler.modifiedForeground": "#478acc",
"editorOverviewRuler.addedForeground": "#6cbf43",
"editorOverviewRuler.deletedForeground": "#ff7383",
"editorOverviewRuler.errorForeground": "#e65050",
"editorOverviewRuler.warningForeground": "#ffaa33",
"editorOverviewRuler.bracketMatchForeground": "#8a9199b3",
"editorOverviewRuler.wordHighlightForeground": "#478acc66",
"editorOverviewRuler.wordHighlightStrongForeground": "#6cbf4366",
"editorOverviewRuler.findMatchForeground": "#ecd9ff",
"editorError.foreground": "#e65050",
"editorWarning.foreground": "#ffaa33",
"editorGutter.modifiedBackground": "#478acccc",
"editorGutter.addedBackground": "#6cbf43cc",
"editorGutter.deletedBackground": "#ff7383cc",
"diffEditor.insertedTextBackground": "#6cbf431f",
"diffEditor.removedTextBackground": "#ff73831f",
"diffEditor.diagonalFill": "#6b7d8f1f",
"editorWidget.background": "#f3f4f5",
"editorWidget.border": "#6b7d8f1f",
"editorHoverWidget.background": "#f3f4f5",
"editorHoverWidget.border": "#6b7d8f1f",
"editorSuggestWidget.background": "#f3f4f5",
"editorSuggestWidget.border": "#6b7d8f1f",
"editorSuggestWidget.highlightForeground": "#ffaa33",
"editorSuggestWidget.selectedBackground": "#56728f1f",
"debugExceptionWidget.border": "#6b7d8f1f",
"debugExceptionWidget.background": "#f3f4f5",
"editorMarkerNavigation.background": "#f3f4f5",
"peekView.border": "#56728f1f",
"peekViewTitle.background": "#56728f1f",
"peekViewTitleDescription.foreground": "#8a9199",
"peekViewTitleLabel.foreground": "#5c6166",
"peekViewEditor.background": "#f3f4f5",
"peekViewEditor.matchHighlightBackground": "#ecd9ff73",
"peekViewEditor.matchHighlightBorder": "#ddcaef73",
"peekViewResult.background": "#f3f4f5",
"peekViewResult.fileForeground": "#5c6166",
"peekViewResult.lineForeground": "#8a9199",
"peekViewResult.matchHighlightBackground": "#ecd9ff73",
"peekViewResult.selectionBackground": "#56728f1f",
"panel.background": "#f8f9fa",
"panel.border": "#6b7d8f1f",
"panelTitle.activeBorder": "#ffaa33",
"panelTitle.activeForeground": "#5c6166",
"panelTitle.inactiveForeground": "#8a9199",
"statusBar.background": "#f8f9fa",
"statusBar.foreground": "#8a9199",
"statusBar.border": "#f8f9fa",
"statusBar.debuggingBackground": "#ed9366",
"statusBar.debuggingForeground": "#fcfcfc",
"statusBar.noFolderBackground": "#f3f4f5",
"statusBarItem.activeBackground": "#8a919933",
"statusBarItem.hoverBackground": "#8a919933",
"statusBarItem.prominentBackground": "#6b7d8f1f",
"statusBarItem.prominentHoverBackground": "#00000030",
"statusBarItem.remoteBackground": "#ffaa33",
"statusBarItem.remoteForeground": "#804a00",
"titleBar.activeBackground": "#f8f9fa",
"titleBar.activeForeground": "#5c6166",
"titleBar.inactiveBackground": "#f8f9fa",
"titleBar.inactiveForeground": "#8a9199",
"titleBar.border": "#f8f9fa",
"extensionButton.prominentForeground": "#804a00",
"extensionButton.prominentBackground": "#ffaa33",
"extensionButton.prominentHoverBackground": "#f9a52e",
"pickerGroup.border": "#6b7d8f1f",
"pickerGroup.foreground": "#8a919980",
"debugToolBar.background": "#f3f4f5",
"debugIcon.breakpointForeground": "#ed9366",
"debugIcon.breakpointDisabledForeground": "#ed936680",
"debugConsoleInputIcon.foreground": "#ffaa33",
"welcomePage.tileBackground": "#f8f9fa",
"welcomePage.tileShadow": "#00000026",
"welcomePage.progress.background": "#8a91991a",
"welcomePage.buttonBackground": "#ffaa3366",
"walkThrough.embeddedEditorBackground": "#f3f4f5",
"gitDecoration.modifiedResourceForeground": "#478accb3",
"gitDecoration.deletedResourceForeground": "#ff7383b3",
"gitDecoration.untrackedResourceForeground": "#6cbf43b3",
"gitDecoration.ignoredResourceForeground": "#8a919980",
"gitDecoration.conflictingResourceForeground": "",
"gitDecoration.submoduleResourceForeground": "#a37accb3",
"settings.headerForeground": "#5c6166",
"settings.modifiedItemIndicator": "#478acc",
"keybindingLabel.background": "#8a91991a",
"keybindingLabel.foreground": "#5c6166",
"keybindingLabel.border": "#5c61661a",
"keybindingLabel.bottomBorder": "#5c61661a",
"terminal.background": "#f8f9fa",
"terminal.foreground": "#5c6166",
"terminal.ansiBlack": "#000000",
"terminal.ansiRed": "#ea6c6d",
"terminal.ansiGreen": "#6cbf43",
"terminal.ansiYellow": "#eca944",
"terminal.ansiBlue": "#3199e1",
"terminal.ansiMagenta": "#9e75c7",
"terminal.ansiCyan": "#46ba94",
"terminal.ansiWhite": "#c7c7c7",
"terminal.ansiBrightBlack": "#686868",
"terminal.ansiBrightRed": "#f07171",
"terminal.ansiBrightGreen": "#86b300",
"terminal.ansiBrightYellow": "#f2ae49",
"terminal.ansiBrightBlue": "#399ee6",
"terminal.ansiBrightMagenta": "#a37acc",
"terminal.ansiBrightCyan": "#4cbf99",
"terminal.ansiBrightWhite": "#d1d1d1"
},
"tokenColors": [
{
"settings": {
"background": "#f8f9fa",
"foreground": "#5c6166"
}
},
{
"name": "Comment",
"scope": [
"comment"
],
"settings": {
"fontStyle": "italic",
"foreground": "#787b8099"
}
},
{
"name": "String",
"scope": [
"string",
"constant.other.symbol"
],
"settings": {
"foreground": "#86b300"
}
},
{
"name": "Regular Expressions and Escape Characters",
"scope": [
"string.regexp",
"constant.character",
"constant.other"
],
"settings": {
"foreground": "#4cbf99"
}
},
{
"name": "Number",
"scope": [
"constant.numeric"
],
"settings": {
"foreground": "#a37acc"
}
},
{
"name": "Built-in constants",
"scope": [
"constant.language"
],
"settings": {
"foreground": "#a37acc"
}
},
{
"name": "Variable",
"scope": [
"variable",
"variable.parameter.function-call"
],
"settings": {
"foreground": "#5c6166"
}
},
{
"name": "Member Variable",
"scope": [
"variable.member"
],
"settings": {
"foreground": "#f07171"
}
},
{
"name": "Language variable",
"scope": [
"variable.language"
],
"settings": {
"fontStyle": "italic",
"foreground": "#55b4d4"
}
},
{
"name": "Storage",
"scope": [
"storage"
],
"settings": {
"foreground": "#fa8d3e"
}
},
{
"name": "Keyword",
"scope": [
"keyword"
],
"settings": {
"foreground": "#fa8d3e"
}
},
{
"name": "Operators",
"scope": [
"keyword.operator"
],
"settings": {
"foreground": "#ed9366"
}
},
{
"name": "Separators like ; or ,",
"scope": [
"punctuation.separator",
"punctuation.terminator"
],
"settings": {
"foreground": "#5c6166b3"
}
},
{
"name": "Punctuation",
"scope": [
"punctuation.section"
],
"settings": {
"foreground": "#5c6166"
}
},
{
"name": "Accessor",
"scope": [
"punctuation.accessor"
],
"settings": {
"foreground": "#ed9366"
}
},
{
"name": "JavaScript/TypeScript interpolation punctuation",
"scope": [
"punctuation.definition.template-expression"
],
"settings": {
"foreground": "#fa8d3e"
}
},
{
"name": "Ruby interpolation punctuation",
"scope": [
"punctuation.section.embedded"
],
"settings": {
"foreground": "#fa8d3e"
}
},
{
"name": "Interpolation text",
"scope": [
"meta.embedded"
],
"settings": {
"foreground": "#5c6166"
}
},
{
"name": "Types fixes",
"scope": [
"source.java storage.type",
"source.haskell storage.type",
"source.c storage.type"
],
"settings": {
"foreground": "#399ee6"
}
},
{
"name": "Inherited class type",
"scope": [
"entity.other.inherited-class"
],
"settings": {
"foreground": "#55b4d4"
}
},
{
"name": "Lambda arrow",
"scope": [
"storage.type.function"
],
"settings": {
"foreground": "#fa8d3e"
}
},
{
"name": "Java primitive variable types",
"scope": [
"source.java storage.type.primitive"
],
"settings": {
"foreground": "#55b4d4"
}
},
{
"name": "Function name",
"scope": [
"entity.name.function"
],
"settings": {
"foreground": "#f2ae49"
}
},
{
"name": "Function arguments",
"scope": [
"variable.parameter",
"meta.parameter"
],
"settings": {
"foreground": "#a37acc"
}
},
{
"name": "Function call",
"scope": [
"variable.function",
"variable.annotation",
"meta.function-call.generic",
"support.function.go"
],
"settings": {
"foreground": "#f2ae49"
}
},
{
"name": "Library function",
"scope": [
"support.function",
"support.macro"
],
"settings": {
"foreground": "#f07171"
}
},
{
"name": "Imports and packages",
"scope": [
"entity.name.import",
"entity.name.package"
],
"settings": {
"foreground": "#86b300"
}
},
{
"name": "Entity name",
"scope": [
"entity.name"
],
"settings": {
"foreground": "#399ee6"
}
},
{
"name": "Tag",
"scope": [
"entity.name.tag",
"meta.tag.sgml"
],
"settings": {
"foreground": "#55b4d4"
}
},
{
"name": "JSX Component",
"scope": [
"support.class.component"
],
"settings": {
"foreground": "#399ee6"
}
},
{
"name": "Tag start/end",
"scope": [
"punctuation.definition.tag.end",
"punctuation.definition.tag.begin",
"punctuation.definition.tag"
],
"settings": {
"foreground": "#55b4d480"
}
},
{
"name": "Tag attribute",
"scope": [
"entity.other.attribute-name"
],
"settings": {
"foreground": "#f2ae49"
}
},
{
"name": "Library constant",
"scope": [
"support.constant"
],
"settings": {
"fontStyle": "italic",
"foreground": "#ed9366"
}
},
{
"name": "Library class/type",
"scope": [
"support.type",
"support.class",
"source.go storage.type"
],
"settings": {
"foreground": "#55b4d4"
}
},
{
"name": "Decorators/annotation",
"scope": [
"meta.decorator variable.other",
"meta.decorator punctuation.decorator",
"storage.type.annotation"
],
"settings": {
"foreground": "#e6ba7e"
}
},
{
"name": "Invalid",
"scope": [
"invalid"
],
"settings": {
"foreground": "#e65050"
}
},
{
"name": "diff.header",
"scope": [
"meta.diff",
"meta.diff.header"
],
"settings": {
"foreground": "#c594c5"
}
},
{
"name": "Ruby class methods",
"scope": [
"source.ruby variable.other.readwrite"
],
"settings": {
"foreground": "#f2ae49"
}
},
{
"name": "CSS tag names",
"scope": [
"source.css entity.name.tag",
"source.sass entity.name.tag",
"source.scss entity.name.tag",
"source.less entity.name.tag",
"source.stylus entity.name.tag"
],
"settings": {
"foreground": "#399ee6"
}
},
{
"name": "CSS browser prefix",
"scope": [
"source.css support.type",
"source.sass support.type",
"source.scss support.type",
"source.less support.type",
"source.stylus support.type"
],
"settings": {
"foreground": "#787b8099"
}
},
{
"name": "CSS Properties",
"scope": [
"support.type.property-name"
],
"settings": {
"fontStyle": "normal",
"foreground": "#55b4d4"
}
},
{
"name": "Search Results Numbers",
"scope": [
"constant.numeric.line-number.find-in-files - match"
],
"settings": {
"foreground": "#787b8099"
}
},
{
"name": "Search Results Match Numbers",
"scope": [
"constant.numeric.line-number.match"
],
"settings": {
"foreground": "#fa8d3e"
}
},
{
"name": "Search Results Lines",
"scope": [
"entity.name.filename.find-in-files"
],
"settings": {
"foreground": "#86b300"
}
},
{
"scope": [
"message.error"
],
"settings": {
"foreground": "#e65050"
}
},
{
"name": "Markup heading",
"scope": [
"markup.heading",
"markup.heading entity.name"
],
"settings": {
"fontStyle": "bold",
"foreground": "#86b300"
}
},
{
"name": "Markup links",
"scope": [
"markup.underline.link",
"string.other.link"
],
"settings": {
"foreground": "#55b4d4"
}
},
{
"name": "Markup Italic",
"scope": [
"markup.italic"
],
"settings": {
"fontStyle": "italic",
"foreground": "#f07171"
}
},
{
"name": "Markup Bold",
"scope": [
"markup.bold"
],
"settings": {
"fontStyle": "bold",
"foreground": "#f07171"
}
},
{
"name": "Markup Bold/italic",
"scope": [
"markup.italic markup.bold",
"markup.bold markup.italic"
],
"settings": {
"fontStyle": "bold italic"
}
},
{
"name": "Markup Code",
"scope": [
"markup.raw"
],
"settings": {
"background": "#5c616605"
}
},
{
"name": "Markup Code Inline",
"scope": [
"markup.raw.inline"
],
"settings": {
"background": "#5c61660f"
}
},
{
"name": "Markdown Separator",
"scope": [
"meta.separator"
],
"settings": {
"fontStyle": "bold",
"background": "#5c61660f",
"foreground": "#787b8099"
}
},
{
"name": "Markup Blockquote",
"scope": [
"markup.quote"
],
"settings": {
"foreground": "#4cbf99",
"fontStyle": "italic"
}
},
{
"name": "Markup List Bullet",
"scope": [
"markup.list punctuation.definition.list.begin"
],
"settings": {
"foreground": "#f2ae49"
}
},
{
"name": "Markup added",
"scope": [
"markup.inserted"
],
"settings": {
"foreground": "#6cbf43"
}
},
{
"name": "Markup modified",
"scope": [
"markup.changed"
],
"settings": {
"foreground": "#478acc"
}
},
{
"name": "Markup removed",
"scope": [
"markup.deleted"
],
"settings": {
"foreground": "#ff7383"
}
},
{
"name": "Markup Strike",
"scope": [
"markup.strike"
],
"settings": {
"foreground": "#e6ba7e"
}
},
{
"name": "Markup Table",
"scope": [
"markup.table"
],
"settings": {
"background": "#5c61660f",
"foreground": "#55b4d4"
}
},
{
"name": "Markup Raw Inline",
"scope": [
"text.html.markdown markup.inline.raw"
],
"settings": {
"foreground": "#ed9366"
}
},
{
"name": "Markdown - Line Break",
"scope": [
"text.html.markdown meta.dummy.line-break"
],
"settings": {
"background": "#787b8099",
"foreground": "#787b8099"
}
},
{
"name": "Markdown - Raw Block Fenced",
"scope": [
"punctuation.definition.markdown"
],
"settings": {
"background": "#5c6166",
"foreground": "#787b8099"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"parameter.label": "#5c6166"
}
}

View file

@ -0,0 +1,847 @@
{
"type": "dark",
"colors": {
"focusBorder": "#ffcc66b3",
"foreground": "#707a8c",
"widget.shadow": "#12151cb3",
"selection.background": "#409fff40",
"icon.foreground": "#707a8c",
"errorForeground": "#ff6666",
"descriptionForeground": "#707a8c",
"textBlockQuote.background": "#1c212b",
"textLink.foreground": "#ffcc66",
"textLink.activeForeground": "#ffcc66",
"textPreformat.foreground": "#cccac2",
"button.background": "#ffcc66",
"button.foreground": "#805500",
"button.hoverBackground": "#fac761",
"button.secondaryBackground": "#707a8c33",
"button.secondaryForeground": "#cccac2",
"button.secondaryHoverBackground": "#707a8c80",
"dropdown.background": "#242936",
"dropdown.foreground": "#707a8c",
"dropdown.border": "#707a8c45",
"input.background": "#242936",
"input.border": "#707a8c45",
"input.foreground": "#cccac2",
"input.placeholderForeground": "#707a8c80",
"inputOption.activeBorder": "#ffcc664d",
"inputOption.activeBackground": "#ffcc6633",
"inputOption.activeForeground": "#ffcc66",
"inputValidation.errorBackground": "#242936",
"inputValidation.errorBorder": "#ff6666",
"inputValidation.infoBackground": "#1f2430",
"inputValidation.infoBorder": "#5ccfe6",
"inputValidation.warningBackground": "#1f2430",
"inputValidation.warningBorder": "#ffd173",
"scrollbar.shadow": "#171b2400",
"scrollbarSlider.background": "#707a8c66",
"scrollbarSlider.hoverBackground": "#707a8c99",
"scrollbarSlider.activeBackground": "#707a8cb3",
"badge.background": "#ffcc6633",
"badge.foreground": "#ffcc66",
"progressBar.background": "#ffcc66",
"list.activeSelectionBackground": "#63759926",
"list.activeSelectionForeground": "#cccac2",
"list.focusBackground": "#63759926",
"list.focusForeground": "#cccac2",
"list.focusOutline": "#63759926",
"list.highlightForeground": "#ffcc66",
"list.deemphasizedForeground": "#ff6666",
"list.hoverBackground": "#63759926",
"list.inactiveSelectionBackground": "#69758c1f",
"list.inactiveSelectionForeground": "#707a8c",
"list.invalidItemForeground": "#707a8c4d",
"list.errorForeground": "#ff6666",
"tree.indentGuidesStroke": "#8a919959",
"listFilterWidget.background": "#1c212b",
"listFilterWidget.outline": "#ffcc66",
"listFilterWidget.noMatchesOutline": "#ff6666",
"list.filterMatchBackground": "#5c467266",
"list.filterMatchBorder": "#69538066",
"activityBar.background": "#1f2430",
"activityBar.foreground": "#707a8ccc",
"activityBar.inactiveForeground": "#707a8c99",
"activityBar.border": "#1f2430",
"activityBar.activeBorder": "#ffcc66",
"activityBarBadge.background": "#ffcc66",
"activityBarBadge.foreground": "#805500",
"sideBar.background": "#1f2430",
"sideBar.border": "#1f2430",
"sideBarTitle.foreground": "#707a8c",
"sideBarSectionHeader.background": "#1f2430",
"sideBarSectionHeader.foreground": "#707a8c",
"sideBarSectionHeader.border": "#1f2430",
"minimap.background": "#1f2430",
"minimap.selectionHighlight": "#409fff40",
"minimap.errorHighlight": "#ff6666",
"minimap.findMatchHighlight": "#695380",
"minimapGutter.addedBackground": "#87d96c",
"minimapGutter.modifiedBackground": "#80bfff",
"minimapGutter.deletedBackground": "#f27983",
"editorGroup.border": "#171b24",
"editorGroup.background": "#1c212b",
"editorGroupHeader.noTabsBackground": "#1f2430",
"editorGroupHeader.tabsBackground": "#1f2430",
"editorGroupHeader.tabsBorder": "#1f2430",
"tab.activeBackground": "#1f2430",
"tab.activeForeground": "#cccac2",
"tab.border": "#1f2430",
"tab.activeBorder": "#ffcc66",
"tab.unfocusedActiveBorder": "#707a8c",
"tab.inactiveBackground": "#1f2430",
"tab.inactiveForeground": "#707a8c",
"tab.unfocusedActiveForeground": "#707a8c",
"tab.unfocusedInactiveForeground": "#707a8c",
"editor.background": "#1f2430",
"editor.foreground": "#cccac2",
"editorLineNumber.foreground": "#8a919966",
"editorLineNumber.activeForeground": "#8a9199cc",
"editorCursor.foreground": "#ffcc66",
"editor.inactiveSelectionBackground": "#409fff21",
"editor.selectionBackground": "#409fff40",
"editor.selectionHighlightBackground": "#87d96c26",
"editor.selectionHighlightBorder": "#87d96c00",
"editor.wordHighlightBackground": "#80bfff14",
"editor.wordHighlightStrongBackground": "#87d96c14",
"editor.wordHighlightBorder": "#80bfff80",
"editor.wordHighlightStrongBorder": "#87d96c80",
"editor.findMatchBackground": "#695380",
"editor.findMatchBorder": "#695380",
"editor.findMatchHighlightBackground": "#69538066",
"editor.findMatchHighlightBorder": "#5c467266",
"editor.findRangeHighlightBackground": "#69538040",
"editor.rangeHighlightBackground": "#69538033",
"editor.lineHighlightBackground": "#1a1f29",
"editorLink.activeForeground": "#ffcc66",
"editorWhitespace.foreground": "#8a919966",
"editorIndentGuide.background": "#8a91992e",
"editorIndentGuide.activeBackground": "#8a919959",
"editorRuler.foreground": "#8a91992e",
"editorCodeLens.foreground": "#b8cfe680",
"editorBracketMatch.background": "#8a91994d",
"editorBracketMatch.border": "#8a91994d",
"editor.snippetTabstopHighlightBackground": "#87d96c33",
"editorOverviewRuler.border": "#171b24",
"editorOverviewRuler.modifiedForeground": "#80bfff",
"editorOverviewRuler.addedForeground": "#87d96c",
"editorOverviewRuler.deletedForeground": "#f27983",
"editorOverviewRuler.errorForeground": "#ff6666",
"editorOverviewRuler.warningForeground": "#ffcc66",
"editorOverviewRuler.bracketMatchForeground": "#8a9199b3",
"editorOverviewRuler.wordHighlightForeground": "#80bfff66",
"editorOverviewRuler.wordHighlightStrongForeground": "#87d96c66",
"editorOverviewRuler.findMatchForeground": "#695380",
"editorError.foreground": "#ff6666",
"editorWarning.foreground": "#ffcc66",
"editorGutter.modifiedBackground": "#80bfffcc",
"editorGutter.addedBackground": "#87d96ccc",
"editorGutter.deletedBackground": "#f27983cc",
"diffEditor.insertedTextBackground": "#87d96c1f",
"diffEditor.removedTextBackground": "#f279831f",
"diffEditor.diagonalFill": "#171b24",
"editorWidget.background": "#1c212b",
"editorWidget.border": "#171b24",
"editorHoverWidget.background": "#1c212b",
"editorHoverWidget.border": "#171b24",
"editorSuggestWidget.background": "#1c212b",
"editorSuggestWidget.border": "#171b24",
"editorSuggestWidget.highlightForeground": "#ffcc66",
"editorSuggestWidget.selectedBackground": "#63759926",
"debugExceptionWidget.border": "#171b24",
"debugExceptionWidget.background": "#1c212b",
"editorMarkerNavigation.background": "#1c212b",
"peekView.border": "#63759926",
"peekViewTitle.background": "#63759926",
"peekViewTitleDescription.foreground": "#707a8c",
"peekViewTitleLabel.foreground": "#cccac2",
"peekViewEditor.background": "#1c212b",
"peekViewEditor.matchHighlightBackground": "#69538066",
"peekViewEditor.matchHighlightBorder": "#5c467266",
"peekViewResult.background": "#1c212b",
"peekViewResult.fileForeground": "#cccac2",
"peekViewResult.lineForeground": "#707a8c",
"peekViewResult.matchHighlightBackground": "#69538066",
"peekViewResult.selectionBackground": "#63759926",
"panel.background": "#1f2430",
"panel.border": "#171b24",
"panelTitle.activeBorder": "#ffcc66",
"panelTitle.activeForeground": "#cccac2",
"panelTitle.inactiveForeground": "#707a8c",
"statusBar.background": "#1f2430",
"statusBar.foreground": "#707a8c",
"statusBar.border": "#1f2430",
"statusBar.debuggingBackground": "#f29e74",
"statusBar.debuggingForeground": "#242936",
"statusBar.noFolderBackground": "#1c212b",
"statusBarItem.activeBackground": "#707a8c33",
"statusBarItem.hoverBackground": "#707a8c33",
"statusBarItem.prominentBackground": "#171b24",
"statusBarItem.prominentHoverBackground": "#00000030",
"statusBarItem.remoteBackground": "#ffcc66",
"statusBarItem.remoteForeground": "#805500",
"titleBar.activeBackground": "#1f2430",
"titleBar.activeForeground": "#cccac2",
"titleBar.inactiveBackground": "#1f2430",
"titleBar.inactiveForeground": "#707a8c",
"titleBar.border": "#1f2430",
"extensionButton.prominentForeground": "#805500",
"extensionButton.prominentBackground": "#ffcc66",
"extensionButton.prominentHoverBackground": "#fac761",
"pickerGroup.border": "#171b24",
"pickerGroup.foreground": "#707a8c80",
"debugToolBar.background": "#1c212b",
"debugIcon.breakpointForeground": "#f29e74",
"debugIcon.breakpointDisabledForeground": "#f29e7480",
"debugConsoleInputIcon.foreground": "#ffcc66",
"welcomePage.tileBackground": "#1f2430",
"welcomePage.tileShadow": "#12151cb3",
"welcomePage.progress.background": "#1a1f29",
"welcomePage.buttonBackground": "#ffcc6666",
"walkThrough.embeddedEditorBackground": "#1c212b",
"gitDecoration.modifiedResourceForeground": "#80bfffb3",
"gitDecoration.deletedResourceForeground": "#f27983b3",
"gitDecoration.untrackedResourceForeground": "#87d96cb3",
"gitDecoration.ignoredResourceForeground": "#707a8c80",
"gitDecoration.conflictingResourceForeground": "",
"gitDecoration.submoduleResourceForeground": "#dfbfffb3",
"settings.headerForeground": "#cccac2",
"settings.modifiedItemIndicator": "#80bfff",
"keybindingLabel.background": "#707a8c1a",
"keybindingLabel.foreground": "#cccac2",
"keybindingLabel.border": "#cccac21a",
"keybindingLabel.bottomBorder": "#cccac21a",
"terminal.background": "#1f2430",
"terminal.foreground": "#cccac2",
"terminal.ansiBlack": "#171b24",
"terminal.ansiRed": "#ed8274",
"terminal.ansiGreen": "#87d96c",
"terminal.ansiYellow": "#facc6e",
"terminal.ansiBlue": "#6dcbfa",
"terminal.ansiMagenta": "#dabafa",
"terminal.ansiCyan": "#90e1c6",
"terminal.ansiWhite": "#c7c7c7",
"terminal.ansiBrightBlack": "#686868",
"terminal.ansiBrightRed": "#f28779",
"terminal.ansiBrightGreen": "#d5ff80",
"terminal.ansiBrightYellow": "#ffd173",
"terminal.ansiBrightBlue": "#73d0ff",
"terminal.ansiBrightMagenta": "#dfbfff",
"terminal.ansiBrightCyan": "#95e6cb",
"terminal.ansiBrightWhite": "#ffffff"
},
"tokenColors": [
{
"settings": {
"background": "#1f2430",
"foreground": "#cccac2"
}
},
{
"name": "Comment",
"scope": [
"comment"
],
"settings": {
"fontStyle": "italic",
"foreground": "#b8cfe680"
}
},
{
"name": "String",
"scope": [
"string",
"constant.other.symbol"
],
"settings": {
"foreground": "#d5ff80"
}
},
{
"name": "Regular Expressions and Escape Characters",
"scope": [
"string.regexp",
"constant.character",
"constant.other"
],
"settings": {
"foreground": "#95e6cb"
}
},
{
"name": "Number",
"scope": [
"constant.numeric"
],
"settings": {
"foreground": "#dfbfff"
}
},
{
"name": "Built-in constants",
"scope": [
"constant.language"
],
"settings": {
"foreground": "#dfbfff"
}
},
{
"name": "Variable",
"scope": [
"variable",
"variable.parameter.function-call"
],
"settings": {
"foreground": "#cccac2"
}
},
{
"name": "Member Variable",
"scope": [
"variable.member"
],
"settings": {
"foreground": "#f28779"
}
},
{
"name": "Language variable",
"scope": [
"variable.language"
],
"settings": {
"fontStyle": "italic",
"foreground": "#5ccfe6"
}
},
{
"name": "Storage",
"scope": [
"storage"
],
"settings": {
"foreground": "#ffad66"
}
},
{
"name": "Keyword",
"scope": [
"keyword"
],
"settings": {
"foreground": "#ffad66"
}
},
{
"name": "Operators",
"scope": [
"keyword.operator"
],
"settings": {
"foreground": "#f29e74"
}
},
{
"name": "Separators like ; or ,",
"scope": [
"punctuation.separator",
"punctuation.terminator"
],
"settings": {
"foreground": "#cccac2b3"
}
},
{
"name": "Punctuation",
"scope": [
"punctuation.section"
],
"settings": {
"foreground": "#cccac2"
}
},
{
"name": "Accessor",
"scope": [
"punctuation.accessor"
],
"settings": {
"foreground": "#f29e74"
}
},
{
"name": "JavaScript/TypeScript interpolation punctuation",
"scope": [
"punctuation.definition.template-expression"
],
"settings": {
"foreground": "#ffad66"
}
},
{
"name": "Ruby interpolation punctuation",
"scope": [
"punctuation.section.embedded"
],
"settings": {
"foreground": "#ffad66"
}
},
{
"name": "Interpolation text",
"scope": [
"meta.embedded"
],
"settings": {
"foreground": "#cccac2"
}
},
{
"name": "Types fixes",
"scope": [
"source.java storage.type",
"source.haskell storage.type",
"source.c storage.type"
],
"settings": {
"foreground": "#73d0ff"
}
},
{
"name": "Inherited class type",
"scope": [
"entity.other.inherited-class"
],
"settings": {
"foreground": "#5ccfe6"
}
},
{
"name": "Lambda arrow",
"scope": [
"storage.type.function"
],
"settings": {
"foreground": "#ffad66"
}
},
{
"name": "Java primitive variable types",
"scope": [
"source.java storage.type.primitive"
],
"settings": {
"foreground": "#5ccfe6"
}
},
{
"name": "Function name",
"scope": [
"entity.name.function"
],
"settings": {
"foreground": "#ffd173"
}
},
{
"name": "Function arguments",
"scope": [
"variable.parameter",
"meta.parameter"
],
"settings": {
"foreground": "#dfbfff"
}
},
{
"name": "Function call",
"scope": [
"variable.function",
"variable.annotation",
"meta.function-call.generic",
"support.function.go"
],
"settings": {
"foreground": "#ffd173"
}
},
{
"name": "Library function",
"scope": [
"support.function",
"support.macro"
],
"settings": {
"foreground": "#f28779"
}
},
{
"name": "Imports and packages",
"scope": [
"entity.name.import",
"entity.name.package"
],
"settings": {
"foreground": "#d5ff80"
}
},
{
"name": "Entity name",
"scope": [
"entity.name"
],
"settings": {
"foreground": "#73d0ff"
}
},
{
"name": "Tag",
"scope": [
"entity.name.tag",
"meta.tag.sgml"
],
"settings": {
"foreground": "#5ccfe6"
}
},
{
"name": "JSX Component",
"scope": [
"support.class.component"
],
"settings": {
"foreground": "#73d0ff"
}
},
{
"name": "Tag start/end",
"scope": [
"punctuation.definition.tag.end",
"punctuation.definition.tag.begin",
"punctuation.definition.tag"
],
"settings": {
"foreground": "#5ccfe680"
}
},
{
"name": "Tag attribute",
"scope": [
"entity.other.attribute-name"
],
"settings": {
"foreground": "#ffd173"
}
},
{
"name": "Library constant",
"scope": [
"support.constant"
],
"settings": {
"fontStyle": "italic",
"foreground": "#f29e74"
}
},
{
"name": "Library class/type",
"scope": [
"support.type",
"support.class",
"source.go storage.type"
],
"settings": {
"foreground": "#5ccfe6"
}
},
{
"name": "Decorators/annotation",
"scope": [
"meta.decorator variable.other",
"meta.decorator punctuation.decorator",
"storage.type.annotation"
],
"settings": {
"foreground": "#ffdfb3"
}
},
{
"name": "Invalid",
"scope": [
"invalid"
],
"settings": {
"foreground": "#ff6666"
}
},
{
"name": "diff.header",
"scope": [
"meta.diff",
"meta.diff.header"
],
"settings": {
"foreground": "#c594c5"
}
},
{
"name": "Ruby class methods",
"scope": [
"source.ruby variable.other.readwrite"
],
"settings": {
"foreground": "#ffd173"
}
},
{
"name": "CSS tag names",
"scope": [
"source.css entity.name.tag",
"source.sass entity.name.tag",
"source.scss entity.name.tag",
"source.less entity.name.tag",
"source.stylus entity.name.tag"
],
"settings": {
"foreground": "#73d0ff"
}
},
{
"name": "CSS browser prefix",
"scope": [
"source.css support.type",
"source.sass support.type",
"source.scss support.type",
"source.less support.type",
"source.stylus support.type"
],
"settings": {
"foreground": "#b8cfe680"
}
},
{
"name": "CSS Properties",
"scope": [
"support.type.property-name"
],
"settings": {
"fontStyle": "normal",
"foreground": "#5ccfe6"
}
},
{
"name": "Search Results Numbers",
"scope": [
"constant.numeric.line-number.find-in-files - match"
],
"settings": {
"foreground": "#b8cfe680"
}
},
{
"name": "Search Results Match Numbers",
"scope": [
"constant.numeric.line-number.match"
],
"settings": {
"foreground": "#ffad66"
}
},
{
"name": "Search Results Lines",
"scope": [
"entity.name.filename.find-in-files"
],
"settings": {
"foreground": "#d5ff80"
}
},
{
"scope": [
"message.error"
],
"settings": {
"foreground": "#ff6666"
}
},
{
"name": "Markup heading",
"scope": [
"markup.heading",
"markup.heading entity.name"
],
"settings": {
"fontStyle": "bold",
"foreground": "#d5ff80"
}
},
{
"name": "Markup links",
"scope": [
"markup.underline.link",
"string.other.link"
],
"settings": {
"foreground": "#5ccfe6"
}
},
{
"name": "Markup Italic",
"scope": [
"markup.italic"
],
"settings": {
"fontStyle": "italic",
"foreground": "#f28779"
}
},
{
"name": "Markup Bold",
"scope": [
"markup.bold"
],
"settings": {
"fontStyle": "bold",
"foreground": "#f28779"
}
},
{
"name": "Markup Bold/italic",
"scope": [
"markup.italic markup.bold",
"markup.bold markup.italic"
],
"settings": {
"fontStyle": "bold italic"
}
},
{
"name": "Markup Code",
"scope": [
"markup.raw"
],
"settings": {
"background": "#cccac205"
}
},
{
"name": "Markup Code Inline",
"scope": [
"markup.raw.inline"
],
"settings": {
"background": "#cccac20f"
}
},
{
"name": "Markdown Separator",
"scope": [
"meta.separator"
],
"settings": {
"fontStyle": "bold",
"background": "#cccac20f",
"foreground": "#b8cfe680"
}
},
{
"name": "Markup Blockquote",
"scope": [
"markup.quote"
],
"settings": {
"foreground": "#95e6cb",
"fontStyle": "italic"
}
},
{
"name": "Markup List Bullet",
"scope": [
"markup.list punctuation.definition.list.begin"
],
"settings": {
"foreground": "#ffd173"
}
},
{
"name": "Markup added",
"scope": [
"markup.inserted"
],
"settings": {
"foreground": "#87d96c"
}
},
{
"name": "Markup modified",
"scope": [
"markup.changed"
],
"settings": {
"foreground": "#80bfff"
}
},
{
"name": "Markup removed",
"scope": [
"markup.deleted"
],
"settings": {
"foreground": "#f27983"
}
},
{
"name": "Markup Strike",
"scope": [
"markup.strike"
],
"settings": {
"foreground": "#ffdfb3"
}
},
{
"name": "Markup Table",
"scope": [
"markup.table"
],
"settings": {
"background": "#cccac20f",
"foreground": "#5ccfe6"
}
},
{
"name": "Markup Raw Inline",
"scope": [
"text.html.markdown markup.inline.raw"
],
"settings": {
"foreground": "#f29e74"
}
},
{
"name": "Markdown - Line Break",
"scope": [
"text.html.markdown meta.dummy.line-break"
],
"settings": {
"background": "#b8cfe680",
"foreground": "#b8cfe680"
}
},
{
"name": "Markdown - Raw Block Fenced",
"scope": [
"punctuation.definition.markdown"
],
"settings": {
"background": "#cccac2",
"foreground": "#b8cfe680"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"parameter.label": "#cccac2"
}
}

View file

@ -0,0 +1,21 @@
{
"name": "Ayu",
"author": "dempfi (Ike Ku)",
"themes": [
{
"name": "Ayu Light",
"file_name": "ayu-light.json",
"appearance": "light"
},
{
"name": "Ayu Mirage",
"file_name": "ayu-mirage.json",
"appearance": "dark"
},
{
"name": "Ayu Dark",
"file_name": "ayu-dark.json",
"appearance": "dark"
}
]
}

View file

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 Dracula Theme
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,11 @@
{
"name": "Dracula",
"author": "Zeno Rocha",
"themes": [
{
"name": "Dracula",
"file_name": "dracula.json",
"appearance": "dark"
}
]
}

View file

@ -0,0 +1 @@
MIT/X11

View file

@ -0,0 +1,36 @@
{
"name": "Gruvbox",
"author": "morhetz",
"themes": [
{
"name": "Gruvbox Dark Hard",
"file_name": "gruvbox-dark-hard.json",
"appearance": "dark"
},
{
"name": "Gruvbox Dark Medium",
"file_name": "gruvbox-dark-medium.json",
"appearance": "dark"
},
{
"name": "Gruvbox Dark Soft",
"file_name": "gruvbox-dark-soft.json",
"appearance": "dark"
},
{
"name": "Gruvbox Light Hard",
"file_name": "gruvbox-light-hard.json",
"appearance": "light"
},
{
"name": "Gruvbox Light Medium",
"file_name": "gruvbox-light-medium.json",
"appearance": "light"
},
{
"name": "Gruvbox Light Soft",
"file_name": "gruvbox-light-soft.json",
"appearance": "light"
}
]
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Sarah Drasner
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,16 @@
{
"name": "Night Owl",
"author": "Sarah Drasner (sdras)",
"themes": [
{
"name": "Night Owl",
"file_name": "night-owl.json",
"appearance": "dark"
},
{
"name": "Night Owl Light",
"file_name": "night-owl-light.json",
"appearance": "light"
}
]
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,9 @@
MIT License
Copyright (c) 2018 Liviu Schera
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,21 @@
MIT License (MIT)
Copyright (c) 2016-present Sven Greb <development@svengreb.de> (https://www.svengreb.de)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,11 @@
{
"name": "Nord",
"author": "Sven Greb (svengreb)",
"themes": [
{
"name": "Nord",
"file_name": "nord.json",
"appearance": "dark"
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
Copyright (c) 2017-present Olaolu Olawuyi
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View file

@ -0,0 +1,21 @@
{
"name": "Palenight",
"author": "Olaolu Olawuyi (whizkydee)",
"themes": [
{
"name": "Palenight",
"file_name": "palenight.json",
"appearance": "dark"
},
{
"name": "Palenight Operator",
"file_name": "palenight-operator.json",
"appearance": "dark"
},
{
"name": "Palenight (Mild Contrast)",
"file_name": "palenight-mild-contrast.json",
"appearance": "dark"
}
]
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Rosé Pine
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

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

View file

@ -0,0 +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"
}
}
]
}

View file

@ -0,0 +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"
}
}
]
}

View file

@ -0,0 +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"
}
}
]
}

View file

@ -0,0 +1,19 @@
Copyright (c) 2011 Ethan Schoonover
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View file

@ -0,0 +1,558 @@
{
"type": "dark",
"colors": {
"errorForeground": "#ffeaea",
"focusBorder": "#2aa19899",
"selection.background": "#2aa19899",
"input.background": "#003847",
"input.foreground": "#93a1a1",
"inputOption.activeBorder": "#2aa19899",
"input.placeholderForeground": "#93a1a1aa",
"inputValidation.infoBackground": "#052730",
"inputValidation.infoBorder": "#363b5f",
"inputValidation.warningBackground": "#5d5938",
"inputValidation.warningBorder": "#9d8a5e",
"inputValidation.errorBackground": "#571b26",
"inputValidation.errorBorder": "#a92049",
"dropdown.background": "#00212b",
"dropdown.border": "#2aa19899",
"list.focusBackground": "#005a6f",
"list.activeSelectionBackground": "#005a6f",
"list.inactiveSelectionBackground": "#00445488",
"list.hoverBackground": "#004454aa",
"list.dropBackground": "#00445488",
"list.highlightForeground": "#1ebcc5",
"pickerGroup.foreground": "#2aa19899",
"pickerGroup.border": "#2aa19899",
"button.background": "#2aa19899",
"badge.background": "#047aa6",
"progressBar.background": "#047aa6",
"editor.background": "#002b36",
"editorWidget.background": "#00212b",
"editor.selectionBackground": "#073642",
"editor.selectionHighlightBackground": "#005a6faa",
"editorHoverWidget.background": "#004052",
"editor.lineHighlightBackground": "#073642",
"editorCursor.foreground": "#839496",
"editorWhitespace.foreground": "#93a1a180",
"editorLineNumber.foreground": "#566c74",
"editorLineNumber.activeForeground": "#6e8a93",
"editorGutter.background": "#073642",
"editorMarkerNavigationError.background": "#ab395b",
"editorMarkerNavigationWarning.background": "#5b7e7a",
"editor.wordHighlightBackground": "#004454aa",
"editor.wordHighlightStrongBackground": "#005a6faa",
"peekViewTitle.background": "#00212b",
"peekView.border": "#003847",
"peekViewResult.background": "#00212b",
"peekViewEditor.background": "#10192c",
"peekViewEditorGutter.background": "#073642",
"peekViewEditor.matchHighlightBackground": "#7744aa40",
"tab.activeBackground": "#002b37",
"tab.inactiveBackground": "#004052",
"tab.border": "#003847",
"tab.activeForeground": "#d6dbdb",
"tab.inactiveForeground": "#93a1a1",
"editorGroup.background": "#011b23",
"editorGroupHeader.tabsBackground": "#004052",
"editorGroup.border": "#00212b",
"editorGroup.dropBackground": "#2aa19844",
"panel.border": "#003847",
"statusBar.foreground": "#93a1a1",
"statusBar.background": "#00212b",
"statusBar.noFolderBackground": "#00212b",
"statusBarItem.prominentBackground": "#003847",
"statusBarItem.prominentHoverBackground": "#003847",
"activityBar.background": "#003847",
"sideBar.background": "#00212b",
"sideBarTitle.foreground": "#93a1a1",
"titleBar.activeBackground": "#002c39",
"terminal.foreground": "#839496",
"statusBar.debuggingBackground": "#00212b",
"debugExceptionWidget.border": "#ab395b",
"debugExceptionWidget.background": "#00212b",
"debugToolBar.background": "#00212b",
"terminal.ansiBlack": "#073642",
"terminal.ansiRed": "#dc322f",
"terminal.ansiGreen": "#859900",
"terminal.ansiYellow": "#b58900",
"terminal.ansiBlue": "#268bd2",
"terminal.ansiMagenta": "#d33682",
"terminal.ansiCyan": "#2aa198",
"terminal.ansiWhite": "#839496",
"terminal.ansiBrightBlack": "#586e75",
"terminal.ansiBrightRed": "#cb4b16",
"terminal.ansiBrightGreen": "#859900",
"terminal.ansiBrightYellow": "#657b83",
"terminal.ansiBrightBlue": "#839496",
"terminal.ansiBrightMagenta": "#6c71c4",
"terminal.ansiBrightCyan": "#93a1a1",
"terminal.ansiBrightWhite": "#839496",
"editorBracketHighlight.foreground1": "#268bd2",
"editorBracketHighlight.foreground2": "#b58900",
"editorBracketHighlight.foreground3": "#d33682"
},
"tokenColors": [
{
"settings": {
"foreground": "#bbbbbbff",
"background": "#002b36ff"
}
},
{
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#002B36",
"foreground": "#93A1A1"
}
},
{
"name": "Comment",
"scope": "comment",
"settings": {
"fontStyle": "italic",
"foreground": "#657B83"
}
},
{
"name": "String",
"scope": "string",
"settings": {
"foreground": "#2AA198"
}
},
{
"name": "Regexp",
"scope": "string.regexp",
"settings": {
"foreground": "#D30102"
}
},
{
"name": "Number",
"scope": "constant.numeric",
"settings": {
"foreground": "#D33682"
}
},
{
"name": "Variable",
"scope": ["variable.language", "variable.other"],
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Keyword",
"scope": "keyword",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Storage",
"scope": "storage",
"settings": {
"fontStyle": "bold",
"foreground": "#93A1A1"
}
},
{
"name": "Class name",
"scope": ["entity.name.class", "entity.name.type"],
"settings": {
"fontStyle": "",
"foreground": "#CB4B16"
}
},
{
"name": "Function name",
"scope": "entity.name.function",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Variable start",
"scope": "punctuation.definition.variable",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Embedded code markers",
"scope": [
"punctuation.section.embedded.begin",
"punctuation.section.embedded.end"
],
"settings": {
"foreground": "#D30102"
}
},
{
"name": "Built-in constant",
"scope": ["constant.language", "meta.preprocessor"],
"settings": {
"foreground": "#B58900"
}
},
{
"name": "Support.construct",
"scope": ["support.function.construct", "keyword.other.new"],
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "User-defined constant",
"scope": ["constant.character", "constant.other"],
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "Inherited class",
"scope": "entity.other.inherited-class",
"settings": {
"foreground": "#6C71C4"
}
},
{
"name": "Function argument",
"scope": "variable.parameter",
"settings": {}
},
{
"name": "Tag name",
"scope": "entity.name.tag",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Tag start/end",
"scope": "punctuation.definition.tag",
"settings": {
"foreground": "#657B83"
}
},
{
"name": "Tag attribute",
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#93A1A1"
}
},
{
"name": "Library function",
"scope": "support.function",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Continuation",
"scope": "punctuation.separator.continuation",
"settings": {
"foreground": "#D30102"
}
},
{
"name": "Library constant",
"scope": "support.constant",
"settings": {}
},
{
"name": "Library class/type",
"scope": ["support.type", "support.class"],
"settings": {
"foreground": "#859900"
}
},
{
"name": "Library Exception",
"scope": "support.type.exception",
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "Library variable",
"scope": "support.other.variable",
"settings": {}
},
{
"name": "Invalid",
"scope": "invalid",
"settings": {}
},
{
"name": "diff: header",
"scope": ["meta.diff", "meta.diff.header"],
"settings": {
"background": "#b58900",
"fontStyle": "italic",
"foreground": "#E0EDDD"
}
},
{
"name": "diff: deleted",
"scope": "markup.deleted",
"settings": {
"background": "#eee8d5",
"fontStyle": "",
"foreground": "#dc322f"
}
},
{
"name": "diff: changed",
"scope": "markup.changed",
"settings": {
"background": "#eee8d5",
"fontStyle": "",
"foreground": "#cb4b16"
}
},
{
"name": "diff: inserted",
"scope": "markup.inserted",
"settings": {
"background": "#eee8d5",
"foreground": "#219186"
}
},
{
"name": "Markup Quote",
"scope": "markup.quote",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Markup Lists",
"scope": "markup.list",
"settings": {
"foreground": "#B58900"
}
},
{
"name": "Markup Styling",
"scope": ["markup.bold", "markup.italic"],
"settings": {
"foreground": "#D33682"
}
},
{
"name": "Markup Inline",
"scope": "markup.inline.raw",
"settings": {
"fontStyle": "",
"foreground": "#2AA198"
}
},
{
"name": "Markup Headings",
"scope": "markup.heading",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Markup Setext Header",
"scope": "markup.heading.setext",
"settings": {
"fontStyle": "",
"foreground": "#268BD2"
}
},
{
"scope": "token.info-token",
"settings": {
"foreground": "#6796e6"
}
},
{
"scope": "token.warn-token",
"settings": {
"foreground": "#cd9731"
}
},
{
"scope": "token.error-token",
"settings": {
"foreground": "#f44747"
}
},
{
"scope": "token.debug-token",
"settings": {
"foreground": "#b267e6"
}
},
{
"scope": "variable.object.property",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "variable.parameter",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "support.type",
"settings": {
"fontStyle": ""
}
},
{
"scope": "storage.type.function",
"settings": {
"fontStyle": ""
}
},
{
"scope": "entity.other.inherited-class",
"settings": {
"foreground": "#b58900"
}
},
{
"scope": "storage.modifier",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "keyword.control.import",
"settings": {
"foreground": "#D33682"
}
},
{
"scope": "storage.modifier.async",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "meta.import",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "source.ts",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "meta.function-call",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "entity.name.type",
"settings": {
"foreground": "#b58900"
}
},
{
"scope": "entity.name.function",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "variable.other",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "storage.modifier.tsx",
"settings": {
"foreground": "#859900"
}
},
{
"scope": "entity.name.type.class.python",
"settings": {
"foreground": "#268BD2"
}
},
{
"scope": "support.type.python",
"settings": {
"foreground": "#268BD2"
}
},
{
"scope": "source.python",
"settings": {
"foreground": "#839496"
}
},
{
"scope": "keyword.control.import",
"settings": {
"foreground": "#cb4b16"
}
},
{
"scope": "keyword.control.from",
"settings": {
"foreground": "#cb4b16"
}
},
{
"scope": "constant.language.python",
"settings": {
"foreground": "#268BD2"
}
},
{
"scope": "entity.name.function.python",
"settings": {
"foreground": "#268BD2"
}
},
{
"scope": "punctuation.separator.dictionary.key-value.json, punctuation.separator.array.json, punctuation.separator.dictionary.pair.json",
"settings": {
"foreground": "#657B83"
}
},
{
"scope": "storage.type.ts",
"settings": {
"foreground": "#268BD2"
}
},
{
"scope": "support.type.primitive",
"settings": {
"foreground": "#b58900"
}
},
{
"scope": "punctuation.definition.dictionary.begin.json, punctuation.definition.dictionary.end.json, punctuation.definition.array.begin.json, punctuation.definition.array.end.json",
"settings": {
"foreground": "#DC3272"
}
}
]
}

View file

@ -0,0 +1,16 @@
{
"name": "Solarized",
"author": "Ethan Schoonover (altercation)",
"themes": [
{
"name": "Solarized Dark",
"file_name": "dark.json",
"appearance": "dark"
},
{
"name": "Solarized Light",
"file_name": "light.json",
"appearance": "light"
}
]
}

View file

@ -0,0 +1,591 @@
{
"type": "light",
"colors": {
"focusBorder": "#d3af86",
"selection.background": "#ccc4b0",
"input.background": "#ddd6c1",
"input.foreground": "#586e75",
"inputOption.activeBorder": "#d3af86",
"input.placeholderForeground": "#586e75aa",
"dropdown.background": "#eee8d5",
"dropdown.border": "#d3af86",
"list.focusBackground": "#dfca8866",
"list.activeSelectionBackground": "#dfca88",
"list.activeSelectionForeground": "#6c6c6c",
"list.inactiveSelectionBackground": "#d1cbb8",
"list.hoverBackground": "#dfca8844",
"list.highlightForeground": "#b58900",
"pickerGroup.foreground": "#2aa19899",
"pickerGroup.border": "#2aa19899",
"button.background": "#ac9d57",
"badge.background": "#b58900aa",
"progressBar.background": "#b58900",
"editor.background": "#fdf6e3",
"editorWidget.background": "#eee8d5",
"editor.selectionBackground": "#eee8d5",
"editorHoverWidget.background": "#ccc4b0",
"editor.lineHighlightBackground": "#eee8d5",
"editorCursor.foreground": "#657b83",
"editorWhitespace.foreground": "#586e7580",
"editorLineNumber.foreground": "#9ca8a6",
"editorLineNumber.activeForeground": "#6f7776",
"editorGutter.background": "#eee8d5",
"peekViewTitle.background": "#eee8d5",
"peekView.border": "#b58900",
"peekViewResult.background": "#eee8d5",
"peekViewEditor.background": "#fffbf2",
"peekViewEditor.matchHighlightBackground": "#7744aa40",
"tab.activeBackground": "#fdf6e3",
"tab.inactiveBackground": "#d3cbb7",
"tab.border": "#ddd6c1",
"tab.inactiveForeground": "#586e75",
"editorGroup.background": "#fffbf2",
"editorGroupHeader.tabsBackground": "#d9d2c2",
"editorGroup.border": "#ddd6c1",
"editorGroup.dropBackground": "#ddd6c1aa",
"panel.border": "#ddd6c1",
"statusBar.foreground": "#586e75",
"statusBar.background": "#eee8d5",
"statusBar.noFolderBackground": "#eee8d5",
"statusBarItem.prominentBackground": "#ddd6c1",
"statusBarItem.prominentHoverBackground": "#ddd6c199",
"activityBar.background": "#ddd6c1",
"activityBar.foreground": "#584c27",
"activityBar.dropBackground": "#eee8d5",
"activityBarBadge.background": "#b58900",
"sideBar.background": "#eee8d5",
"sideBarTitle.foreground": "#586e75",
"titleBar.activeBackground": "#eee8d5",
"terminal.foreground": "#657b83",
"statusBar.debuggingBackground": "#eee8d5",
"debugExceptionWidget.border": "#ab395b",
"debugExceptionWidget.background": "#ddd6c1",
"debugToolBar.background": "#ddd6c1",
"extensionButton.prominentBackground": "#b58900",
"extensionButton.prominentHoverBackground": "#584c27aa",
"terminal.ansiBlack": "#657b83",
"terminal.ansiRed": "#dc322f",
"terminal.ansiGreen": "#859900",
"terminal.ansiYellow": "#b58900",
"terminal.ansiBlue": "#268bd2",
"terminal.ansiMagenta": "#d33682",
"terminal.ansiCyan": "#2aa198",
"terminal.ansiWhite": "#eee8d5",
"terminal.ansiBrightBlack": "#657b83",
"terminal.ansiBrightRed": "#cb4b16",
"terminal.ansiBrightGreen": "#859900",
"terminal.ansiBrightYellow": "#657b83",
"terminal.ansiBrightBlue": "#839496",
"terminal.ansiBrightMagenta": "#6c71c4",
"terminal.ansiBrightCyan": "#93a1a1",
"terminal.ansiBrightWhite": "#eee8d5",
"editorBracketHighlight.foreground1": "#268bd2",
"editorBracketHighlight.foreground2": "#b58900",
"editorBracketHighlight.foreground3": "#d33682"
},
"tokenColors": [
{
"settings": {
"foreground": "#333333ff",
"background": "#fdf6e3ff"
}
},
{
"scope": [
"meta.embedded",
"source.groovy.embedded"
],
"settings": {
"background": "#FDF6E3",
"foreground": "#657B83"
}
},
{
"name": "Comment",
"scope": "comment",
"settings": {
"fontStyle": "italic",
"foreground": "#93A1A1"
}
},
{
"name": "String",
"scope": "string",
"settings": {
"foreground": "#2AA198"
}
},
{
"name": "Regexp",
"scope": "string.regexp",
"settings": {
"foreground": "#D30102"
}
},
{
"name": "Number",
"scope": "constant.numeric",
"settings": {
"foreground": "#D33682"
}
},
{
"name": "Variable",
"scope": [
"variable.language",
"variable.other"
],
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Keyword",
"scope": "keyword",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Storage",
"scope": "storage",
"settings": {
"fontStyle": "bold",
"foreground": "#073642"
}
},
{
"name": "Class name",
"scope": [
"entity.name.class",
"entity.name.type"
],
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Function name",
"scope": "entity.name.function",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Variable start",
"scope": "punctuation.definition.variable",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Embedded code markers",
"scope": [
"punctuation.section.embedded.begin",
"punctuation.section.embedded.end"
],
"settings": {
"foreground": "#D30102"
}
},
{
"name": "Built-in constant",
"scope": [
"constant.language",
"meta.preprocessor"
],
"settings": {
"foreground": "#B58900"
}
},
{
"name": "Support.construct",
"scope": [
"support.function.construct",
"keyword.other.new"
],
"settings": {
"foreground": "#D30102"
}
},
{
"name": "User-defined constant",
"scope": [
"constant.character",
"constant.other"
],
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "Inherited class",
"scope": "entity.other.inherited-class",
"settings": {}
},
{
"name": "Function argument",
"scope": "variable.parameter",
"settings": {}
},
{
"name": "Tag name",
"scope": "entity.name.tag",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Tag start/end",
"scope": [
"punctuation.definition.tag.begin",
"punctuation.definition.tag.end"
],
"settings": {
"foreground": "#93A1A1"
}
},
{
"name": "Tag attribute",
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#93A1A1"
}
},
{
"name": "Library function",
"scope": "support.function",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Continuation",
"scope": "punctuation.separator.continuation",
"settings": {
"foreground": "#D30102"
}
},
{
"name": "Library constant",
"scope": "support.constant",
"settings": {}
},
{
"name": "Library class/type",
"scope": [
"support.type",
"support.class"
],
"settings": {
"foreground": "#859900"
}
},
{
"name": "Library Exception",
"scope": "support.type.exception",
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "Library variable",
"scope": "support.other.variable",
"settings": {}
},
{
"name": "Invalid",
"scope": "invalid",
"settings": {}
},
{
"name": "diff: header",
"scope": [
"meta.diff",
"meta.diff.header"
],
"settings": {
"background": "#b58900",
"fontStyle": "italic",
"foreground": "#E0EDDD"
}
},
{
"name": "diff: deleted",
"scope": "markup.deleted",
"settings": {
"background": "#eee8d5",
"fontStyle": "",
"foreground": "#dc322f"
}
},
{
"name": "diff: changed",
"scope": "markup.changed",
"settings": {
"background": "#eee8d5",
"fontStyle": "",
"foreground": "#cb4b16"
}
},
{
"name": "diff: inserted",
"scope": "markup.inserted",
"settings": {
"background": "#eee8d5",
"foreground": "#219186"
}
},
{
"name": "Markup Quote",
"scope": "markup.quote",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Markup Lists",
"scope": "markup.list",
"settings": {
"foreground": "#B58900"
}
},
{
"name": "Markup Styling",
"scope": [
"markup.bold",
"markup.italic"
],
"settings": {
"foreground": "#D33682"
}
},
{
"name": "Markup Inline",
"scope": "markup.inline.raw",
"settings": {
"fontStyle": "",
"foreground": "#2AA198"
}
},
{
"name": "Markup Headings",
"scope": "markup.heading",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Markup Setext Header",
"scope": "markup.heading.setext",
"settings": {
"fontStyle": "",
"foreground": "#268BD2"
}
},
{
"scope": "token.info-token",
"settings": {
"foreground": "#316bcd"
}
},
{
"scope": "token.warn-token",
"settings": {
"foreground": "#cd9731"
}
},
{
"scope": "token.error-token",
"settings": {
"foreground": "#cd3131"
}
},
{
"scope": "token.debug-token",
"settings": {
"foreground": "#800080"
}
},
{
"scope": "storage.modifier",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "keyword.control.import",
"settings": {
"foreground": "#D33682"
}
},
{
"scope": "storage.modifier.async",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "meta.import",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "source.ts",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "meta.function-call",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "entity.name.type",
"settings": {
"foreground": "#b58900"
}
},
{
"scope": "entity.name.function",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "variable.other",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "storage.modifier.tsx",
"settings": {
"foreground": "#859900"
}
},
{
"scope": "storage.modifier",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "keyword.control.import",
"settings": {
"foreground": "#D33682"
}
},
{
"scope": "storage.modifier.async",
"settings": {
"foreground": "#859900ff",
"fontStyle": ""
}
},
{
"scope": "meta.import",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "source.ts",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "meta.function-call",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "entity.name.type",
"settings": {
"foreground": "#b58900"
}
},
{
"scope": "entity.name.function",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "variable.other",
"settings": {
"foreground": "#657b83"
}
},
{
"scope": "storage.modifier.tsx",
"settings": {
"foreground": "#859900"
}
},
{
"scope": "punctuation.separator.dictionary.key-value.json, punctuation.separator.array.json, punctuation.separator.dictionary.pair.json",
"settings": {
"foreground": "#657B83"
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#268BD2"
}
},
{
"scope": "punctuation.definition.dictionary.begin.json, punctuation.definition.dictionary.end.json, punctuation.definition.array.begin.json, punctuation.definition.array.end.json",
"settings": {
"foreground": "#DC3272"
}
},
{
"scope": "support.type.primitive",
"settings": {
"foreground": "#b58900"
}
},
{
"scope": "keyword.control.import",
"settings": {
"foreground": "#cb4b16"
}
},
{
"scope": "keyword.control.from",
"settings": {
"foreground": "#cb4b16"
}
},
{
"scope": "source",
"settings": {
"foreground": "#657b83"
}
}
]
}

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 Robb Owen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,11 @@
{
"name": "Synthwave 84",
"author": "Robb Owen (robb0wen)",
"themes": [
{
"name": "Synthwave 84",
"file_name": "synthwave.json",
"appearance": "dark"
}
]
}

View file

@ -0,0 +1,822 @@
{
"name": "SynthWave 84",
"type": "dark",
"semanticHighlighting": true,
"colors": {
"focusBorder": "#1f212b",
"foreground": "#ffffff",
"widget.shadow": "#2a2139",
"selection.background": "#ffffff20",
"errorForeground": "#fe4450",
"textLink.activeForeground": "#ff7edb",
"textLink.foreground": "#f97e72",
"button.background": "#614D85",
"dropdown.background": "#232530",
"dropdown.listBackground": "#2a2139",
"input.background": "#2a2139",
"inputOption.activeBorder": "#ff7edb99",
"inputValidation.errorBackground": "#fe445080",
"inputValidation.errorBorder": "#fe445000",
"scrollbar.shadow": "#2a2139",
"scrollbarSlider.activeBackground": "#9d8bca20",
"scrollbarSlider.background": "#9d8bca30",
"scrollbarSlider.hoverBackground": "#9d8bca50",
"badge.foreground": "#ffffff",
"badge.background": "#2a2139",
"progressBar.background": "#f97e72",
"list.activeSelectionBackground": "#ffffff20",
"list.activeSelectionForeground": "#ffffff",
"list.dropBackground": "#34294f66",
"list.focusBackground": "#ffffff20",
"list.focusForeground": "#ffffff",
"list.highlightForeground": "#f97e72",
"list.hoverBackground": "#37294d99",
"list.hoverForeground": "#ffffff",
"list.inactiveSelectionBackground": "#ffffff20",
"list.inactiveSelectionForeground": "#ffffff",
"list.inactiveFocusBackground": "#2a213999",
"list.errorForeground": "#fe4450E6",
"list.warningForeground": "#72f1b8bb",
"activityBar.background": "#171520",
"activityBar.dropBackground": "#34294f66",
"activityBar.foreground": "#ffffffCC",
"activityBarBadge.background": "#f97e72",
"activityBarBadge.foreground": "#2a2139",
"sideBar.background": "#241b2f",
"sideBar.foreground": "#ffffff99",
"sideBar.dropBackground": "#34294f4c",
"sideBarSectionHeader.background": "#241b2f",
"sideBarSectionHeader.foreground": "#ffffffca",
"menu.background": "#463465",
"editorGroup.border": "#495495",
"editorGroup.dropBackground": "#4954954a",
"editorGroupHeader.tabsBackground": "#241b2f",
"tab.border": "#241b2f00",
"tab.activeBorder": "#880088",
"tab.inactiveBackground": "#262335",
"editor.background": "#262335",
"editorLineNumber.foreground": "#ffffff73",
"editorLineNumber.activeForeground": "#ffffffcc",
"editorCursor.background": "#241b2f",
"editorCursor.foreground": "#f97e72",
"editor.selectionBackground": "#ffffff20",
"editor.selectionHighlightBackground": "#ffffff20",
"editor.wordHighlightBackground": "#34294f88",
"editor.wordHighlightStrongBackground": "#34294f88",
"editor.findMatchBackground": "#D18616bb",
"editor.findMatchHighlightBackground": "#D1861655",
"editor.findRangeHighlightBackground": "#34294f1a",
"editor.hoverHighlightBackground": "#463564",
"editor.lineHighlightBorder": "#7059AB66",
"editor.rangeHighlightBackground": "#49549539",
"editorIndentGuide.background": "#444251",
"editorIndentGuide.activeBackground": "#A148AB80",
"editorRuler.foreground": "#A148AB80",
"editorCodeLens.foreground": "#ffffff7c",
"editorBracketMatch.background": "#34294f66",
"editorBracketMatch.border": "#495495",
"editorOverviewRuler.border": "#34294fb3",
"editorOverviewRuler.findMatchForeground": "#D1861699",
"editorOverviewRuler.modifiedForeground": "#b893ce99",
"editorOverviewRuler.addedForeground": "#09f7a099",
"editorOverviewRuler.deletedForeground": "#fe445099",
"editorOverviewRuler.errorForeground": "#fe4450dd",
"editorOverviewRuler.warningForeground": "#72f1b8cc",
"editorError.foreground": "#fe4450",
"editorWarning.foreground": "#72f1b8cc",
"editorGutter.modifiedBackground": "#b893ce8f",
"editorGutter.addedBackground": "#206d4bd6",
"editorGutter.deletedBackground": "#fa2e46a4",
"diffEditor.insertedTextBackground": "#0beb9935",
"diffEditor.removedTextBackground": "#fe445035",
"editorWidget.background": "#171520DC",
"editorWidget.border": "#ffffff22",
"editorWidget.resizeBorder": "#ffffff44",
"editorSuggestWidget.highlightForeground": "#f97e72",
"editorSuggestWidget.selectedBackground": "#ffffff36",
"peekView.border": "#495495",
"peekViewEditor.background": "#232530",
"peekViewEditor.matchHighlightBackground": "#D18616bb",
"peekViewResult.background": "#232530",
"peekViewResult.matchHighlightBackground": "#D1861655",
"peekViewResult.selectionBackground": "#2a213980",
"peekViewTitle.background": "#232530",
"panelTitle.activeBorder": "#f97e72",
"statusBar.background": "#241b2f",
"statusBar.foreground": "#ffffff80",
"statusBar.debuggingBackground": "#f97e72",
"statusBar.debuggingForeground": "#08080f",
"statusBar.noFolderBackground": "#241b2f",
"statusBarItem.prominentBackground": "#2a2139",
"statusBarItem.prominentHoverBackground": "#34294f",
"titleBar.activeBackground": "#241b2f",
"titleBar.inactiveBackground": "#241b2f",
"extensionButton.prominentBackground": "#f97e72",
"extensionButton.prominentHoverBackground": "#ff7edb",
"pickerGroup.foreground": "#f97e72ea",
"terminal.foreground": "#ffffff",
"terminal.ansiBlue": "#03edf9",
"terminal.ansiBrightBlue": "#03edf9",
"terminal.ansiBrightCyan": "#03edf9",
"terminal.ansiBrightGreen": "#72f1b8",
"terminal.ansiBrightMagenta": "#ff7edb",
"terminal.ansiBrightRed": "#fe4450",
"terminal.ansiBrightYellow": "#fede5d",
"terminal.ansiCyan": "#03edf9",
"terminal.ansiGreen": "#72f1b8",
"terminal.ansiMagenta": "#ff7edb",
"terminal.ansiRed": "#fe4450",
"terminal.ansiYellow": "#f3e70f",
"terminal.selectionBackground": "#ffffff20",
"terminalCursor.background": "#ffffff",
"terminalCursor.foreground": "#03edf9",
"debugToolBar.background": "#463465",
"walkThrough.embeddedEditorBackground": "#232530",
"gitDecoration.modifiedResourceForeground": "#b893ceee",
"gitDecoration.deletedResourceForeground": "#fe4450",
"gitDecoration.addedResourceForeground": "#72f1b8cc",
"gitDecoration.untrackedResourceForeground": "#72f1b8",
"gitDecoration.ignoredResourceForeground": "#ffffff59",
"minimapGutter.addedBackground": "#09f7a099",
"minimapGutter.modifiedBackground": "#b893ce",
"minimapGutter.deletedBackground": "#fe4450",
"breadcrumbPicker.background": "#232530"
},
"tokenColors": [
{
"name": "Comment",
"scope": [
"comment",
"string.quoted.docstring.multi.python",
"string.quoted.docstring.multi.python punctuation.definition.string.begin.python",
"string.quoted.docstring.multi.python punctuation.definition.string.end.python"
],
"settings": {
"foreground": "#848bbd",
"fontStyle": "italic"
}
},
{
"name": "String",
"scope": ["string.quoted", "string.template", "punctuation.definition.string"],
"settings": {
"foreground": "#ff8b39"
}
},
{
"name": "Punctuation within templates",
"scope": "string.template meta.embedded.line",
"settings": {
"foreground": "#b6b1b1"
}
},
{
"name": "Variable",
"scope": ["variable", "entity.name.variable"],
"settings": {
"foreground": "#ff7edb"
}
},
{
"name": "Language variable",
"scope": "variable.language",
"settings": {
"foreground": "#fe4450",
"fontStyle": "bold"
}
},
{
"name": "Parameter",
"scope": "variable.parameter",
"settings": {
"fontStyle": "italic"
}
},
{
"name": "Storage (declaration or modifier keyword)",
"scope": ["storage.type", "storage.modifier"],
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Constant",
"scope": "constant",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Regex",
"scope": "string.regexp",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Number",
"scope": "constant.numeric",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Language constant (boolean, null)",
"scope": "constant.language",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Character escape",
"scope": "constant.character.escape",
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Entity",
"scope": "entity.name",
"settings": {
"foreground": "#fe4450"
}
},
{
"name": "HTML or XML tag",
"scope": "entity.name.tag",
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "HTML or XML tag brackets",
"scope": ["punctuation.definition.tag"],
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Tag attribute",
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Tag attribute HTML",
"scope": "entity.other.attribute-name.html",
"settings": {
"foreground": "#fede5d",
"fontStyle": "italic"
}
},
{
"name": "Class",
"scope": ["entity.name.type", "meta.attribute.class.html"],
"settings": {
"foreground": "#fe4450"
}
},
{
"name": "Inherited class",
"scope": "entity.other.inherited-class",
"settings": {
"foreground": "#D50"
}
},
{
"name": "Function",
"scope": ["entity.name.function", "variable.function"],
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "JS Export",
"scope": ["keyword.control.export.js", "keyword.control.import.js"],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "JS Numerics",
"scope": ["constant.numeric.decimal.js"],
"settings": {
"foreground": "#2EE2FA"
}
},
{
"name": "Keyword",
"scope": "keyword",
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Control keyword",
"scope": "keyword.control",
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Operator",
"scope": "keyword.operator",
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Special operator",
"scope": [
"keyword.operator.new",
"keyword.operator.expression",
"keyword.operator.logical"
],
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Unit",
"scope": "keyword.other.unit",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Support",
"scope": "support",
"settings": {
"foreground": "#fe4450"
}
},
{
"name": "Support function",
"scope": "support.function",
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Support variable",
"scope": "support.variable",
"settings": {
"foreground": "#ff7edb"
}
},
{
"name": "Object literal key / property",
"scope": ["meta.object-literal.key", "support.type.property-name"],
"settings": {
"foreground": "#ff7edb"
}
},
{
"name": "Key-value separator",
"scope": "punctuation.separator.key-value",
"settings": {
"foreground": "#b6b1b1"
}
},
{
"name": "Embedded punctuation",
"scope": "punctuation.section.embedded",
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Template expression",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end"
],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "CSS property",
"scope": ["support.type.property-name.css", "support.type.property-name.json"],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "JS Switch control",
"scope": "switch-block.expr.js",
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "JS object path",
"scope": "variable.other.constant.property.js, variable.other.property.js",
"settings": {
"foreground": "#2ee2fa"
}
},
{
"name": "Color",
"scope": "constant.other.color",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Font names",
"scope": "support.constant.font-name",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "CSS #id",
"scope": "entity.other.attribute-name.id",
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Pseudo CSS",
"scope": [
"entity.other.attribute-name.pseudo-element",
"entity.other.attribute-name.pseudo-class"
],
"settings": {
"foreground": "#D50"
}
},
{
"name": "CSS support functions (rgb)",
"scope": "support.function.misc.css",
"settings": {
"foreground": "#fe4450"
}
},
{
"name": "Markup heading",
"scope": ["markup.heading", "entity.name.section"],
"settings": {
"foreground": "#ff7edb"
}
},
{
"name": "Markup text",
"scope": ["text.html", "keyword.operator.assignment"],
"settings": {
"foreground": "#ffffffee"
}
},
{
"name": "Markup quote",
"scope": "markup.quote",
"settings": {
"foreground": "#b6b1b1cc",
"fontStyle": "italic"
}
},
{
"name": "Markup list",
"scope": "beginning.punctuation.definition.list",
"settings": {
"foreground": "#ff7edb"
}
},
{
"name": "Markup link",
"scope": "markup.underline.link",
"settings": {
"foreground": "#D50"
}
},
{
"name": "Markup link description",
"scope": "string.other.link.description",
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Python function call",
"scope": "meta.function-call.generic.python",
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Python variable params",
"scope": "variable.parameter.function-call.python",
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "C# storage type",
"scope": "storage.type.cs",
"settings": {
"foreground": "#fe4450"
}
},
{
"name": "C# local variable",
"scope": "entity.name.variable.local.cs",
"settings": {
"foreground": "#ff7edb"
}
},
{
"name": "C# properties and fields",
"scope": ["entity.name.variable.field.cs", "entity.name.variable.property.cs"],
"settings": {
"foreground": "#ff7edb"
}
},
{
"name": "C placeholder",
"scope": "constant.other.placeholder.c",
"settings": {
"foreground": "#72f1b8",
"fontStyle": "italic"
}
},
{
"name": "C preprocessors",
"scope": ["keyword.control.directive.include.c", "keyword.control.directive.define.c"],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "C storage modifier",
"scope": "storage.modifier.c",
"settings": {
"foreground": "#fe4450"
}
},
{
"name": "C++ operators",
"scope": "source.cpp keyword.operator",
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "C++ placeholder",
"scope": "constant.other.placeholder.cpp",
"settings": {
"foreground": "#72f1b8",
"fontStyle": "italic"
}
},
{
"name": "C++ include",
"scope": [
"keyword.control.directive.include.cpp",
"keyword.control.directive.define.cpp"
],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "C++ constant modifier",
"scope": "storage.modifier.specifier.const.cpp",
"settings": {
"foreground": "#fe4450"
}
},
{
"name": "Elixir Classes",
"scope": [
"source.elixir support.type.elixir",
"source.elixir meta.module.elixir entity.name.class.elixir"
],
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Elixir Functions",
"scope": "source.elixir entity.name.function",
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "Elixir Constants",
"scope": [
"source.elixir constant.other.symbol.elixir",
"source.elixir constant.other.keywords.elixir"
],
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Elixir String Punctuation",
"scope": "source.elixir punctuation.definition.string",
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "Elixir",
"scope": [
"source.elixir variable.other.readwrite.module.elixir",
"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir"
],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "Elixir Binary Punctuation",
"scope": "source.elixir .punctuation.binary.elixir",
"settings": {
"foreground": "#ff7edb",
"fontStyle": "italic"
}
},
{
"name": "Clojure Globals",
"scope": ["entity.global.clojure"],
"settings": {
"foreground": "#36f9f6",
"fontStyle": "bold"
}
},
{
"name": "Clojure Storage",
"scope": ["storage.control.clojure"],
"settings": {
"foreground": "#36f9f6",
"fontStyle": "italic"
}
},
{
"name": "Clojure Metadata",
"scope": ["meta.metadata.simple.clojure", "meta.metadata.map.clojure"],
"settings": {
"foreground": "#fe4450",
"fontStyle": "italic"
}
},
{
"name": "Clojure Macros, Quoted",
"scope": ["meta.quoted-expression.clojure"],
"settings": {
"fontStyle": "italic"
}
},
{
"name": "Clojure Symbols",
"scope": ["meta.symbol.clojure"],
"settings": {
"foreground": "#ff7edbff"
}
},
{
"name": "Go basic",
"scope": "source.go",
"settings": {
"foreground": "#ff7edbff"
}
},
{
"name": "Go Function Calls",
"scope": "source.go meta.function-call.go",
"settings": {
"foreground": "#36f9f6"
}
},
{
"name": "Go Keywords",
"scope": [
"source.go keyword.package.go",
"source.go keyword.import.go",
"source.go keyword.function.go",
"source.go keyword.type.go",
"source.go keyword.const.go",
"source.go keyword.var.go",
"source.go keyword.map.go",
"source.go keyword.channel.go",
"source.go keyword.control.go"
],
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Go interfaces",
"scope": [
"source.go storage.type",
"source.go keyword.struct.go",
"source.go keyword.interface.go"
],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "Go Constants e.g. nil, string format (%s, %d, etc.)",
"scope": [
"source.go constant.language.go",
"source.go constant.other.placeholder.go",
"source.go variable"
],
"settings": {
"foreground": "#2EE2FA"
}
},
{
"name": "Markdown links and image paths",
"scope": ["markup.underline.link.markdown", "markup.inline.raw.string.markdown"],
"settings": {
"foreground": "#72f1b8",
"fontStyle": "italic"
}
},
{
"name": "Markdown links and image paths",
"scope": ["string.other.link.title.markdown"],
"settings": {
"foreground": "#fede5d"
}
},
{
"name": "Markdown headings",
"scope": ["markup.heading.markdown", "entity.name.section.markdown"],
"settings": {
"foreground": "#ff7edb",
"fontStyle": "bold"
}
},
{
"name": "Markdown italic",
"scope": ["markup.italic.markdown"],
"settings": {
"foreground": "#2EE2FA",
"fontStyle": "italic"
}
},
{
"name": "Markdown bold",
"scope": ["markup.bold.markdown"],
"settings": {
"foreground": "#2EE2FA",
"fontStyle": "bold"
}
},
{
"name": "Markdown quotes",
"scope": ["punctuation.definition.quote.begin.markdown", "markup.quote.markdown"],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "Basic source colours",
"scope": ["source.dart", "source.python", "source.scala"],
"settings": {
"foreground": "#ff7edbff"
}
},
{
"name": "Dart strings",
"scope": ["string.interpolated.single.dart"],
"settings": {
"foreground": "#f97e72"
}
},
{
"name": "Dart variable params",
"scope": ["variable.parameter.dart"],
"settings": {
"foreground": "#72f1b8"
}
},
{
"name": "Dart numerics",
"scope": ["constant.numeric.dart"],
"settings": {
"foreground": "#2EE2FA"
}
},
{
"name": "Scala variable params",
"scope": ["variable.parameter.scala"],
"settings": {
"foreground": "#2EE2FA"
}
},
{
"name": "Scala",
"scope": ["meta.template.expression.scala"],
"settings": {
"foreground": "#72f1b8"
}
}
]
}

View file

@ -0,0 +1,54 @@
[package]
name = "channel2"
version = "0.1.0"
edition = "2021"
publish = false
[lib]
path = "src/channel2.rs"
doctest = false
[features]
test-support = ["collections/test-support", "gpui/test-support", "rpc/test-support"]
[dependencies]
client = { package = "client2", path = "../client2" }
collections = { path = "../collections" }
db = { package = "db2", path = "../db2" }
gpui = { package = "gpui2", path = "../gpui2" }
util = { path = "../util" }
rpc = { package = "rpc2", path = "../rpc2" }
text = { path = "../text" }
language = { package = "language2", path = "../language2" }
settings = { package = "settings2", path = "../settings2" }
feature_flags = { package = "feature_flags2", path = "../feature_flags2" }
sum_tree = { path = "../sum_tree" }
clock = { path = "../clock" }
anyhow.workspace = true
futures.workspace = true
image = "0.23"
lazy_static.workspace = true
smallvec.workspace = true
log.workspace = true
parking_lot.workspace = true
postage.workspace = true
rand.workspace = true
schemars.workspace = true
smol.workspace = true
thiserror.workspace = true
time.workspace = true
tiny_http = "0.8"
uuid.workspace = true
url = "2.2"
serde.workspace = true
serde_derive.workspace = true
tempfile = "3"
[dev-dependencies]
collections = { path = "../collections", features = ["test-support"] }
gpui = { package = "gpui2", path = "../gpui2", features = ["test-support"] }
rpc = { package = "rpc2", path = "../rpc2", features = ["test-support"] }
client = { package = "client2", path = "../client2", features = ["test-support"] }
settings = { package = "settings2", path = "../settings2", features = ["test-support"] }
util = { path = "../util", features = ["test-support"] }

View file

@ -0,0 +1,23 @@
mod channel_buffer;
mod channel_chat;
mod channel_store;
use client::{Client, UserStore};
use gpui::{AppContext, Model};
use std::sync::Arc;
pub use channel_buffer::{ChannelBuffer, ChannelBufferEvent, ACKNOWLEDGE_DEBOUNCE_INTERVAL};
pub use channel_chat::{
mentions_to_proto, ChannelChat, ChannelChatEvent, ChannelMessage, ChannelMessageId,
MessageParams,
};
pub use channel_store::{Channel, ChannelEvent, ChannelId, ChannelMembership, ChannelStore};
#[cfg(test)]
mod channel_store_tests;
pub fn init(client: &Arc<Client>, user_store: Model<UserStore>, cx: &mut AppContext) {
channel_store::init(client, user_store, cx);
channel_buffer::init(client);
channel_chat::init(client);
}

View file

@ -0,0 +1,259 @@
use crate::{Channel, ChannelId, ChannelStore};
use anyhow::Result;
use client::{Client, Collaborator, UserStore};
use collections::HashMap;
use gpui::{AppContext, AsyncAppContext, Context, EventEmitter, Model, ModelContext, Task};
use language::proto::serialize_version;
use rpc::{
proto::{self, PeerId},
TypedEnvelope,
};
use std::{sync::Arc, time::Duration};
use util::ResultExt;
pub const ACKNOWLEDGE_DEBOUNCE_INTERVAL: Duration = Duration::from_millis(250);
pub(crate) fn init(client: &Arc<Client>) {
client.add_model_message_handler(ChannelBuffer::handle_update_channel_buffer);
client.add_model_message_handler(ChannelBuffer::handle_update_channel_buffer_collaborators);
}
pub struct ChannelBuffer {
pub channel_id: ChannelId,
connected: bool,
collaborators: HashMap<PeerId, Collaborator>,
user_store: Model<UserStore>,
channel_store: Model<ChannelStore>,
buffer: Model<language::Buffer>,
buffer_epoch: u64,
client: Arc<Client>,
subscription: Option<client::Subscription>,
acknowledge_task: Option<Task<Result<()>>>,
}
pub enum ChannelBufferEvent {
CollaboratorsChanged,
Disconnected,
BufferEdited,
ChannelChanged,
}
impl EventEmitter for ChannelBuffer {
type Event = ChannelBufferEvent;
}
impl ChannelBuffer {
pub(crate) async fn new(
channel: Arc<Channel>,
client: Arc<Client>,
user_store: Model<UserStore>,
channel_store: Model<ChannelStore>,
mut cx: AsyncAppContext,
) -> Result<Model<Self>> {
let response = client
.request(proto::JoinChannelBuffer {
channel_id: channel.id,
})
.await?;
let base_text = response.base_text;
let operations = response
.operations
.into_iter()
.map(language::proto::deserialize_operation)
.collect::<Result<Vec<_>, _>>()?;
let buffer = cx.build_model(|_| {
language::Buffer::remote(response.buffer_id, response.replica_id as u16, base_text)
})?;
buffer.update(&mut cx, |buffer, cx| buffer.apply_ops(operations, cx))??;
let subscription = client.subscribe_to_entity(channel.id)?;
anyhow::Ok(cx.build_model(|cx| {
cx.subscribe(&buffer, Self::on_buffer_update).detach();
cx.on_release(Self::release).detach();
let mut this = Self {
buffer,
buffer_epoch: response.epoch,
client,
connected: true,
collaborators: Default::default(),
acknowledge_task: None,
channel_id: channel.id,
subscription: Some(subscription.set_model(&cx.handle(), &mut cx.to_async())),
user_store,
channel_store,
};
this.replace_collaborators(response.collaborators, cx);
this
})?)
}
fn release(&mut self, _: &mut AppContext) {
if self.connected {
if let Some(task) = self.acknowledge_task.take() {
task.detach();
}
self.client
.send(proto::LeaveChannelBuffer {
channel_id: self.channel_id,
})
.log_err();
}
}
pub fn remote_id(&self, cx: &AppContext) -> u64 {
self.buffer.read(cx).remote_id()
}
pub fn user_store(&self) -> &Model<UserStore> {
&self.user_store
}
pub(crate) fn replace_collaborators(
&mut self,
collaborators: Vec<proto::Collaborator>,
cx: &mut ModelContext<Self>,
) {
let mut new_collaborators = HashMap::default();
for collaborator in collaborators {
if let Ok(collaborator) = Collaborator::from_proto(collaborator) {
new_collaborators.insert(collaborator.peer_id, collaborator);
}
}
for (_, old_collaborator) in &self.collaborators {
if !new_collaborators.contains_key(&old_collaborator.peer_id) {
self.buffer.update(cx, |buffer, cx| {
buffer.remove_peer(old_collaborator.replica_id as u16, cx)
});
}
}
self.collaborators = new_collaborators;
cx.emit(ChannelBufferEvent::CollaboratorsChanged);
cx.notify();
}
async fn handle_update_channel_buffer(
this: Model<Self>,
update_channel_buffer: TypedEnvelope<proto::UpdateChannelBuffer>,
_: Arc<Client>,
mut cx: AsyncAppContext,
) -> Result<()> {
let ops = update_channel_buffer
.payload
.operations
.into_iter()
.map(language::proto::deserialize_operation)
.collect::<Result<Vec<_>, _>>()?;
this.update(&mut cx, |this, cx| {
cx.notify();
this.buffer
.update(cx, |buffer, cx| buffer.apply_ops(ops, cx))
})??;
Ok(())
}
async fn handle_update_channel_buffer_collaborators(
this: Model<Self>,
message: TypedEnvelope<proto::UpdateChannelBufferCollaborators>,
_: Arc<Client>,
mut cx: AsyncAppContext,
) -> Result<()> {
this.update(&mut cx, |this, cx| {
this.replace_collaborators(message.payload.collaborators, cx);
cx.emit(ChannelBufferEvent::CollaboratorsChanged);
cx.notify();
})
}
fn on_buffer_update(
&mut self,
_: Model<language::Buffer>,
event: &language::Event,
cx: &mut ModelContext<Self>,
) {
match event {
language::Event::Operation(operation) => {
let operation = language::proto::serialize_operation(operation);
self.client
.send(proto::UpdateChannelBuffer {
channel_id: self.channel_id,
operations: vec![operation],
})
.log_err();
}
language::Event::Edited => {
cx.emit(ChannelBufferEvent::BufferEdited);
}
_ => {}
}
}
pub fn acknowledge_buffer_version(&mut self, cx: &mut ModelContext<'_, ChannelBuffer>) {
let buffer = self.buffer.read(cx);
let version = buffer.version();
let buffer_id = buffer.remote_id();
let client = self.client.clone();
let epoch = self.epoch();
self.acknowledge_task = Some(cx.spawn(move |_, cx| async move {
cx.background_executor()
.timer(ACKNOWLEDGE_DEBOUNCE_INTERVAL)
.await;
client
.send(proto::AckBufferOperation {
buffer_id,
epoch,
version: serialize_version(&version),
})
.ok();
Ok(())
}));
}
pub fn epoch(&self) -> u64 {
self.buffer_epoch
}
pub fn buffer(&self) -> Model<language::Buffer> {
self.buffer.clone()
}
pub fn collaborators(&self) -> &HashMap<PeerId, Collaborator> {
&self.collaborators
}
pub fn channel(&self, cx: &AppContext) -> Option<Arc<Channel>> {
self.channel_store
.read(cx)
.channel_for_id(self.channel_id)
.cloned()
}
pub(crate) fn disconnect(&mut self, cx: &mut ModelContext<Self>) {
log::info!("channel buffer {} disconnected", self.channel_id);
if self.connected {
self.connected = false;
self.subscription.take();
cx.emit(ChannelBufferEvent::Disconnected);
cx.notify()
}
}
pub(crate) fn channel_changed(&mut self, cx: &mut ModelContext<Self>) {
cx.emit(ChannelBufferEvent::ChannelChanged);
cx.notify()
}
pub fn is_connected(&self) -> bool {
self.connected
}
pub fn replica_id(&self, cx: &AppContext) -> u16 {
self.buffer.read(cx).replica_id()
}
}

View file

@ -0,0 +1,647 @@
use crate::{Channel, ChannelId, ChannelStore};
use anyhow::{anyhow, Result};
use client::{
proto,
user::{User, UserStore},
Client, Subscription, TypedEnvelope, UserId,
};
use futures::lock::Mutex;
use gpui::{AppContext, AsyncAppContext, Context, EventEmitter, Model, ModelContext, Task};
use rand::prelude::*;
use std::{
collections::HashSet,
mem,
ops::{ControlFlow, Range},
sync::Arc,
};
use sum_tree::{Bias, SumTree};
use time::OffsetDateTime;
use util::{post_inc, ResultExt as _, TryFutureExt};
pub struct ChannelChat {
pub channel_id: ChannelId,
messages: SumTree<ChannelMessage>,
acknowledged_message_ids: HashSet<u64>,
channel_store: Model<ChannelStore>,
loaded_all_messages: bool,
last_acknowledged_id: Option<u64>,
next_pending_message_id: usize,
user_store: Model<UserStore>,
rpc: Arc<Client>,
outgoing_messages_lock: Arc<Mutex<()>>,
rng: StdRng,
_subscription: Subscription,
}
#[derive(Debug, PartialEq, Eq)]
pub struct MessageParams {
pub text: String,
pub mentions: Vec<(Range<usize>, UserId)>,
}
#[derive(Clone, Debug)]
pub struct ChannelMessage {
pub id: ChannelMessageId,
pub body: String,
pub timestamp: OffsetDateTime,
pub sender: Arc<User>,
pub nonce: u128,
pub mentions: Vec<(Range<usize>, UserId)>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ChannelMessageId {
Saved(u64),
Pending(usize),
}
#[derive(Clone, Debug, Default)]
pub struct ChannelMessageSummary {
max_id: ChannelMessageId,
count: usize,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
struct Count(usize);
#[derive(Clone, Debug, PartialEq)]
pub enum ChannelChatEvent {
MessagesUpdated {
old_range: Range<usize>,
new_count: usize,
},
NewMessage {
channel_id: ChannelId,
message_id: u64,
},
}
impl EventEmitter for ChannelChat {
type Event = ChannelChatEvent;
}
pub fn init(client: &Arc<Client>) {
client.add_model_message_handler(ChannelChat::handle_message_sent);
client.add_model_message_handler(ChannelChat::handle_message_removed);
}
impl ChannelChat {
pub async fn new(
channel: Arc<Channel>,
channel_store: Model<ChannelStore>,
user_store: Model<UserStore>,
client: Arc<Client>,
mut cx: AsyncAppContext,
) -> Result<Model<Self>> {
let channel_id = channel.id;
let subscription = client.subscribe_to_entity(channel_id).unwrap();
let response = client
.request(proto::JoinChannelChat { channel_id })
.await?;
let messages = messages_from_proto(response.messages, &user_store, &mut cx).await?;
let loaded_all_messages = response.done;
Ok(cx.build_model(|cx| {
cx.on_release(Self::release).detach();
let mut this = Self {
channel_id: channel.id,
user_store,
channel_store,
rpc: client,
outgoing_messages_lock: Default::default(),
messages: Default::default(),
acknowledged_message_ids: Default::default(),
loaded_all_messages,
next_pending_message_id: 0,
last_acknowledged_id: None,
rng: StdRng::from_entropy(),
_subscription: subscription.set_model(&cx.handle(), &mut cx.to_async()),
};
this.insert_messages(messages, cx);
this
})?)
}
fn release(&mut self, _: &mut AppContext) {
self.rpc
.send(proto::LeaveChannelChat {
channel_id: self.channel_id,
})
.log_err();
}
pub fn channel(&self, cx: &AppContext) -> Option<Arc<Channel>> {
self.channel_store
.read(cx)
.channel_for_id(self.channel_id)
.cloned()
}
pub fn client(&self) -> &Arc<Client> {
&self.rpc
}
pub fn send_message(
&mut self,
message: MessageParams,
cx: &mut ModelContext<Self>,
) -> Result<Task<Result<u64>>> {
if message.text.is_empty() {
Err(anyhow!("message body can't be empty"))?;
}
let current_user = self
.user_store
.read(cx)
.current_user()
.ok_or_else(|| anyhow!("current_user is not present"))?;
let channel_id = self.channel_id;
let pending_id = ChannelMessageId::Pending(post_inc(&mut self.next_pending_message_id));
let nonce = self.rng.gen();
self.insert_messages(
SumTree::from_item(
ChannelMessage {
id: pending_id,
body: message.text.clone(),
sender: current_user,
timestamp: OffsetDateTime::now_utc(),
mentions: message.mentions.clone(),
nonce,
},
&(),
),
cx,
);
let user_store = self.user_store.clone();
let rpc = self.rpc.clone();
let outgoing_messages_lock = self.outgoing_messages_lock.clone();
Ok(cx.spawn(move |this, mut cx| async move {
let outgoing_message_guard = outgoing_messages_lock.lock().await;
let request = rpc.request(proto::SendChannelMessage {
channel_id,
body: message.text,
nonce: Some(nonce.into()),
mentions: mentions_to_proto(&message.mentions),
});
let response = request.await?;
drop(outgoing_message_guard);
let response = response.message.ok_or_else(|| anyhow!("invalid message"))?;
let id = response.id;
let message = ChannelMessage::from_proto(response, &user_store, &mut cx).await?;
this.update(&mut cx, |this, cx| {
this.insert_messages(SumTree::from_item(message, &()), cx);
})?;
Ok(id)
}))
}
pub fn remove_message(&mut self, id: u64, cx: &mut ModelContext<Self>) -> Task<Result<()>> {
let response = self.rpc.request(proto::RemoveChannelMessage {
channel_id: self.channel_id,
message_id: id,
});
cx.spawn(move |this, mut cx| async move {
response.await?;
this.update(&mut cx, |this, cx| {
this.message_removed(id, cx);
})?;
Ok(())
})
}
pub fn load_more_messages(&mut self, cx: &mut ModelContext<Self>) -> Option<Task<Option<()>>> {
if self.loaded_all_messages {
return None;
}
let rpc = self.rpc.clone();
let user_store = self.user_store.clone();
let channel_id = self.channel_id;
let before_message_id = self.first_loaded_message_id()?;
Some(cx.spawn(move |this, mut cx| {
async move {
let response = rpc
.request(proto::GetChannelMessages {
channel_id,
before_message_id,
})
.await?;
let loaded_all_messages = response.done;
let messages = messages_from_proto(response.messages, &user_store, &mut cx).await?;
this.update(&mut cx, |this, cx| {
this.loaded_all_messages = loaded_all_messages;
this.insert_messages(messages, cx);
})?;
anyhow::Ok(())
}
.log_err()
}))
}
pub fn first_loaded_message_id(&mut self) -> Option<u64> {
self.messages.first().and_then(|message| match message.id {
ChannelMessageId::Saved(id) => Some(id),
ChannelMessageId::Pending(_) => None,
})
}
/// Load all of the chat messages since a certain message id.
///
/// For now, we always maintain a suffix of the channel's messages.
pub async fn load_history_since_message(
chat: Model<Self>,
message_id: u64,
mut cx: AsyncAppContext,
) -> Option<usize> {
loop {
let step = chat
.update(&mut cx, |chat, cx| {
if let Some(first_id) = chat.first_loaded_message_id() {
if first_id <= message_id {
let mut cursor = chat.messages.cursor::<(ChannelMessageId, Count)>();
let message_id = ChannelMessageId::Saved(message_id);
cursor.seek(&message_id, Bias::Left, &());
return ControlFlow::Break(
if cursor
.item()
.map_or(false, |message| message.id == message_id)
{
Some(cursor.start().1 .0)
} else {
None
},
);
}
}
ControlFlow::Continue(chat.load_more_messages(cx))
})
.log_err()?;
match step {
ControlFlow::Break(ix) => return ix,
ControlFlow::Continue(task) => task?.await?,
}
}
}
pub fn acknowledge_last_message(&mut self, cx: &mut ModelContext<Self>) {
if let ChannelMessageId::Saved(latest_message_id) = self.messages.summary().max_id {
if self
.last_acknowledged_id
.map_or(true, |acknowledged_id| acknowledged_id < latest_message_id)
{
self.rpc
.send(proto::AckChannelMessage {
channel_id: self.channel_id,
message_id: latest_message_id,
})
.ok();
self.last_acknowledged_id = Some(latest_message_id);
self.channel_store.update(cx, |store, cx| {
store.acknowledge_message_id(self.channel_id, latest_message_id, cx);
});
}
}
}
pub fn rejoin(&mut self, cx: &mut ModelContext<Self>) {
let user_store = self.user_store.clone();
let rpc = self.rpc.clone();
let channel_id = self.channel_id;
cx.spawn(move |this, mut cx| {
async move {
let response = rpc.request(proto::JoinChannelChat { channel_id }).await?;
let messages = messages_from_proto(response.messages, &user_store, &mut cx).await?;
let loaded_all_messages = response.done;
let pending_messages = this.update(&mut cx, |this, cx| {
if let Some((first_new_message, last_old_message)) =
messages.first().zip(this.messages.last())
{
if first_new_message.id > last_old_message.id {
let old_messages = mem::take(&mut this.messages);
cx.emit(ChannelChatEvent::MessagesUpdated {
old_range: 0..old_messages.summary().count,
new_count: 0,
});
this.loaded_all_messages = loaded_all_messages;
}
}
this.insert_messages(messages, cx);
if loaded_all_messages {
this.loaded_all_messages = loaded_all_messages;
}
this.pending_messages().cloned().collect::<Vec<_>>()
})?;
for pending_message in pending_messages {
let request = rpc.request(proto::SendChannelMessage {
channel_id,
body: pending_message.body,
mentions: mentions_to_proto(&pending_message.mentions),
nonce: Some(pending_message.nonce.into()),
});
let response = request.await?;
let message = ChannelMessage::from_proto(
response.message.ok_or_else(|| anyhow!("invalid message"))?,
&user_store,
&mut cx,
)
.await?;
this.update(&mut cx, |this, cx| {
this.insert_messages(SumTree::from_item(message, &()), cx);
})?;
}
anyhow::Ok(())
}
.log_err()
})
.detach();
}
pub fn message_count(&self) -> usize {
self.messages.summary().count
}
pub fn messages(&self) -> &SumTree<ChannelMessage> {
&self.messages
}
pub fn message(&self, ix: usize) -> &ChannelMessage {
let mut cursor = self.messages.cursor::<Count>();
cursor.seek(&Count(ix), Bias::Right, &());
cursor.item().unwrap()
}
pub fn acknowledge_message(&mut self, id: u64) {
if self.acknowledged_message_ids.insert(id) {
self.rpc
.send(proto::AckChannelMessage {
channel_id: self.channel_id,
message_id: id,
})
.ok();
}
}
pub fn messages_in_range(&self, range: Range<usize>) -> impl Iterator<Item = &ChannelMessage> {
let mut cursor = self.messages.cursor::<Count>();
cursor.seek(&Count(range.start), Bias::Right, &());
cursor.take(range.len())
}
pub fn pending_messages(&self) -> impl Iterator<Item = &ChannelMessage> {
let mut cursor = self.messages.cursor::<ChannelMessageId>();
cursor.seek(&ChannelMessageId::Pending(0), Bias::Left, &());
cursor
}
async fn handle_message_sent(
this: Model<Self>,
message: TypedEnvelope<proto::ChannelMessageSent>,
_: Arc<Client>,
mut cx: AsyncAppContext,
) -> Result<()> {
let user_store = this.update(&mut cx, |this, _| this.user_store.clone())?;
let message = message
.payload
.message
.ok_or_else(|| anyhow!("empty message"))?;
let message_id = message.id;
let message = ChannelMessage::from_proto(message, &user_store, &mut cx).await?;
this.update(&mut cx, |this, cx| {
this.insert_messages(SumTree::from_item(message, &()), cx);
cx.emit(ChannelChatEvent::NewMessage {
channel_id: this.channel_id,
message_id,
})
})?;
Ok(())
}
async fn handle_message_removed(
this: Model<Self>,
message: TypedEnvelope<proto::RemoveChannelMessage>,
_: Arc<Client>,
mut cx: AsyncAppContext,
) -> Result<()> {
this.update(&mut cx, |this, cx| {
this.message_removed(message.payload.message_id, cx)
})?;
Ok(())
}
fn insert_messages(&mut self, messages: SumTree<ChannelMessage>, cx: &mut ModelContext<Self>) {
if let Some((first_message, last_message)) = messages.first().zip(messages.last()) {
let nonces = messages
.cursor::<()>()
.map(|m| m.nonce)
.collect::<HashSet<_>>();
let mut old_cursor = self.messages.cursor::<(ChannelMessageId, Count)>();
let mut new_messages = old_cursor.slice(&first_message.id, Bias::Left, &());
let start_ix = old_cursor.start().1 .0;
let removed_messages = old_cursor.slice(&last_message.id, Bias::Right, &());
let removed_count = removed_messages.summary().count;
let new_count = messages.summary().count;
let end_ix = start_ix + removed_count;
new_messages.append(messages, &());
let mut ranges = Vec::<Range<usize>>::new();
if new_messages.last().unwrap().is_pending() {
new_messages.append(old_cursor.suffix(&()), &());
} else {
new_messages.append(
old_cursor.slice(&ChannelMessageId::Pending(0), Bias::Left, &()),
&(),
);
while let Some(message) = old_cursor.item() {
let message_ix = old_cursor.start().1 .0;
if nonces.contains(&message.nonce) {
if ranges.last().map_or(false, |r| r.end == message_ix) {
ranges.last_mut().unwrap().end += 1;
} else {
ranges.push(message_ix..message_ix + 1);
}
} else {
new_messages.push(message.clone(), &());
}
old_cursor.next(&());
}
}
drop(old_cursor);
self.messages = new_messages;
for range in ranges.into_iter().rev() {
cx.emit(ChannelChatEvent::MessagesUpdated {
old_range: range,
new_count: 0,
});
}
cx.emit(ChannelChatEvent::MessagesUpdated {
old_range: start_ix..end_ix,
new_count,
});
cx.notify();
}
}
fn message_removed(&mut self, id: u64, cx: &mut ModelContext<Self>) {
let mut cursor = self.messages.cursor::<ChannelMessageId>();
let mut messages = cursor.slice(&ChannelMessageId::Saved(id), Bias::Left, &());
if let Some(item) = cursor.item() {
if item.id == ChannelMessageId::Saved(id) {
let ix = messages.summary().count;
cursor.next(&());
messages.append(cursor.suffix(&()), &());
drop(cursor);
self.messages = messages;
cx.emit(ChannelChatEvent::MessagesUpdated {
old_range: ix..ix + 1,
new_count: 0,
});
}
}
}
}
async fn messages_from_proto(
proto_messages: Vec<proto::ChannelMessage>,
user_store: &Model<UserStore>,
cx: &mut AsyncAppContext,
) -> Result<SumTree<ChannelMessage>> {
let messages = ChannelMessage::from_proto_vec(proto_messages, user_store, cx).await?;
let mut result = SumTree::new();
result.extend(messages, &());
Ok(result)
}
impl ChannelMessage {
pub async fn from_proto(
message: proto::ChannelMessage,
user_store: &Model<UserStore>,
cx: &mut AsyncAppContext,
) -> Result<Self> {
let sender = user_store
.update(cx, |user_store, cx| {
user_store.get_user(message.sender_id, cx)
})?
.await?;
Ok(ChannelMessage {
id: ChannelMessageId::Saved(message.id),
body: message.body,
mentions: message
.mentions
.into_iter()
.filter_map(|mention| {
let range = mention.range?;
Some((range.start as usize..range.end as usize, mention.user_id))
})
.collect(),
timestamp: OffsetDateTime::from_unix_timestamp(message.timestamp as i64)?,
sender,
nonce: message
.nonce
.ok_or_else(|| anyhow!("nonce is required"))?
.into(),
})
}
pub fn is_pending(&self) -> bool {
matches!(self.id, ChannelMessageId::Pending(_))
}
pub async fn from_proto_vec(
proto_messages: Vec<proto::ChannelMessage>,
user_store: &Model<UserStore>,
cx: &mut AsyncAppContext,
) -> Result<Vec<Self>> {
let unique_user_ids = proto_messages
.iter()
.map(|m| m.sender_id)
.collect::<HashSet<_>>()
.into_iter()
.collect();
user_store
.update(cx, |user_store, cx| {
user_store.get_users(unique_user_ids, cx)
})?
.await?;
let mut messages = Vec::with_capacity(proto_messages.len());
for message in proto_messages {
messages.push(ChannelMessage::from_proto(message, user_store, cx).await?);
}
Ok(messages)
}
}
pub fn mentions_to_proto(mentions: &[(Range<usize>, UserId)]) -> Vec<proto::ChatMention> {
mentions
.iter()
.map(|(range, user_id)| proto::ChatMention {
range: Some(proto::Range {
start: range.start as u64,
end: range.end as u64,
}),
user_id: *user_id as u64,
})
.collect()
}
impl sum_tree::Item for ChannelMessage {
type Summary = ChannelMessageSummary;
fn summary(&self) -> Self::Summary {
ChannelMessageSummary {
max_id: self.id,
count: 1,
}
}
}
impl Default for ChannelMessageId {
fn default() -> Self {
Self::Saved(0)
}
}
impl sum_tree::Summary for ChannelMessageSummary {
type Context = ();
fn add_summary(&mut self, summary: &Self, _: &()) {
self.max_id = summary.max_id;
self.count += summary.count;
}
}
impl<'a> sum_tree::Dimension<'a, ChannelMessageSummary> for ChannelMessageId {
fn add_summary(&mut self, summary: &'a ChannelMessageSummary, _: &()) {
debug_assert!(summary.max_id > *self);
*self = summary.max_id;
}
}
impl<'a> sum_tree::Dimension<'a, ChannelMessageSummary> for Count {
fn add_summary(&mut self, summary: &'a ChannelMessageSummary, _: &()) {
self.0 += summary.count;
}
}
impl<'a> From<&'a str> for MessageParams {
fn from(value: &'a str) -> Self {
Self {
text: value.into(),
mentions: Vec::new(),
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,184 @@
use crate::{Channel, ChannelId};
use collections::BTreeMap;
use rpc::proto;
use std::sync::Arc;
#[derive(Default, Debug)]
pub struct ChannelIndex {
channels_ordered: Vec<ChannelId>,
channels_by_id: BTreeMap<ChannelId, Arc<Channel>>,
}
impl ChannelIndex {
pub fn by_id(&self) -> &BTreeMap<ChannelId, Arc<Channel>> {
&self.channels_by_id
}
pub fn ordered_channels(&self) -> &[ChannelId] {
&self.channels_ordered
}
pub fn clear(&mut self) {
self.channels_ordered.clear();
self.channels_by_id.clear();
}
/// Delete the given channels from this index.
pub fn delete_channels(&mut self, channels: &[ChannelId]) {
self.channels_by_id
.retain(|channel_id, _| !channels.contains(channel_id));
self.channels_ordered
.retain(|channel_id| !channels.contains(channel_id));
}
pub fn bulk_insert(&mut self) -> ChannelPathsInsertGuard {
ChannelPathsInsertGuard {
channels_ordered: &mut self.channels_ordered,
channels_by_id: &mut self.channels_by_id,
}
}
pub fn acknowledge_note_version(
&mut self,
channel_id: ChannelId,
epoch: u64,
version: &clock::Global,
) {
if let Some(channel) = self.channels_by_id.get_mut(&channel_id) {
let channel = Arc::make_mut(channel);
if let Some((unseen_epoch, unseen_version)) = &channel.unseen_note_version {
if epoch > *unseen_epoch
|| epoch == *unseen_epoch && version.observed_all(unseen_version)
{
channel.unseen_note_version = None;
}
}
}
}
pub fn acknowledge_message_id(&mut self, channel_id: ChannelId, message_id: u64) {
if let Some(channel) = self.channels_by_id.get_mut(&channel_id) {
let channel = Arc::make_mut(channel);
if let Some(unseen_message_id) = channel.unseen_message_id {
if message_id >= unseen_message_id {
channel.unseen_message_id = None;
}
}
}
}
pub fn note_changed(&mut self, channel_id: ChannelId, epoch: u64, version: &clock::Global) {
insert_note_changed(&mut self.channels_by_id, channel_id, epoch, version);
}
pub fn new_message(&mut self, channel_id: ChannelId, message_id: u64) {
insert_new_message(&mut self.channels_by_id, channel_id, message_id)
}
}
/// A guard for ensuring that the paths index maintains its sort and uniqueness
/// invariants after a series of insertions
#[derive(Debug)]
pub struct ChannelPathsInsertGuard<'a> {
channels_ordered: &'a mut Vec<ChannelId>,
channels_by_id: &'a mut BTreeMap<ChannelId, Arc<Channel>>,
}
impl<'a> ChannelPathsInsertGuard<'a> {
pub fn note_changed(&mut self, channel_id: ChannelId, epoch: u64, version: &clock::Global) {
insert_note_changed(&mut self.channels_by_id, channel_id, epoch, &version);
}
pub fn new_messages(&mut self, channel_id: ChannelId, message_id: u64) {
insert_new_message(&mut self.channels_by_id, channel_id, message_id)
}
pub fn insert(&mut self, channel_proto: proto::Channel) -> bool {
let mut ret = false;
if let Some(existing_channel) = self.channels_by_id.get_mut(&channel_proto.id) {
let existing_channel = Arc::make_mut(existing_channel);
ret = existing_channel.visibility != channel_proto.visibility()
|| existing_channel.role != channel_proto.role()
|| existing_channel.name != channel_proto.name;
existing_channel.visibility = channel_proto.visibility();
existing_channel.role = channel_proto.role();
existing_channel.name = channel_proto.name;
} else {
self.channels_by_id.insert(
channel_proto.id,
Arc::new(Channel {
id: channel_proto.id,
visibility: channel_proto.visibility(),
role: channel_proto.role(),
name: channel_proto.name,
unseen_note_version: None,
unseen_message_id: None,
parent_path: channel_proto.parent_path,
}),
);
self.insert_root(channel_proto.id);
}
ret
}
fn insert_root(&mut self, channel_id: ChannelId) {
self.channels_ordered.push(channel_id);
}
}
impl<'a> Drop for ChannelPathsInsertGuard<'a> {
fn drop(&mut self) {
self.channels_ordered.sort_by(|a, b| {
let a = channel_path_sorting_key(*a, &self.channels_by_id);
let b = channel_path_sorting_key(*b, &self.channels_by_id);
a.cmp(b)
});
self.channels_ordered.dedup();
}
}
fn channel_path_sorting_key<'a>(
id: ChannelId,
channels_by_id: &'a BTreeMap<ChannelId, Arc<Channel>>,
) -> impl Iterator<Item = &str> {
let (parent_path, name) = channels_by_id
.get(&id)
.map_or((&[] as &[_], None), |channel| {
(channel.parent_path.as_slice(), Some(channel.name.as_str()))
});
parent_path
.iter()
.filter_map(|id| Some(channels_by_id.get(id)?.name.as_str()))
.chain(name)
}
fn insert_note_changed(
channels_by_id: &mut BTreeMap<ChannelId, Arc<Channel>>,
channel_id: u64,
epoch: u64,
version: &clock::Global,
) {
if let Some(channel) = channels_by_id.get_mut(&channel_id) {
let unseen_version = Arc::make_mut(channel)
.unseen_note_version
.get_or_insert((0, clock::Global::new()));
if epoch > unseen_version.0 {
*unseen_version = (epoch, version.clone());
} else {
unseen_version.1.join(&version);
}
}
}
fn insert_new_message(
channels_by_id: &mut BTreeMap<ChannelId, Arc<Channel>>,
channel_id: u64,
message_id: u64,
) {
if let Some(channel) = channels_by_id.get_mut(&channel_id) {
let unseen_message_id = Arc::make_mut(channel).unseen_message_id.get_or_insert(0);
*unseen_message_id = message_id.max(*unseen_message_id);
}
}

View file

@ -0,0 +1,380 @@
use crate::channel_chat::ChannelChatEvent;
use super::*;
use client::{test::FakeServer, Client, UserStore};
use gpui::{AppContext, Context, Model, TestAppContext};
use rpc::proto::{self};
use settings::SettingsStore;
use util::http::FakeHttpClient;
#[gpui::test]
fn test_update_channels(cx: &mut AppContext) {
let channel_store = init_test(cx);
update_channels(
&channel_store,
proto::UpdateChannels {
channels: vec![
proto::Channel {
id: 1,
name: "b".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Admin.into(),
parent_path: Vec::new(),
},
proto::Channel {
id: 2,
name: "a".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Member.into(),
parent_path: Vec::new(),
},
],
..Default::default()
},
cx,
);
assert_channels(
&channel_store,
&[
//
(0, "a".to_string(), proto::ChannelRole::Member),
(0, "b".to_string(), proto::ChannelRole::Admin),
],
cx,
);
update_channels(
&channel_store,
proto::UpdateChannels {
channels: vec![
proto::Channel {
id: 3,
name: "x".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Admin.into(),
parent_path: vec![1],
},
proto::Channel {
id: 4,
name: "y".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Member.into(),
parent_path: vec![2],
},
],
..Default::default()
},
cx,
);
assert_channels(
&channel_store,
&[
(0, "a".to_string(), proto::ChannelRole::Member),
(1, "y".to_string(), proto::ChannelRole::Member),
(0, "b".to_string(), proto::ChannelRole::Admin),
(1, "x".to_string(), proto::ChannelRole::Admin),
],
cx,
);
}
#[gpui::test]
fn test_dangling_channel_paths(cx: &mut AppContext) {
let channel_store = init_test(cx);
update_channels(
&channel_store,
proto::UpdateChannels {
channels: vec![
proto::Channel {
id: 0,
name: "a".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Admin.into(),
parent_path: vec![],
},
proto::Channel {
id: 1,
name: "b".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Admin.into(),
parent_path: vec![0],
},
proto::Channel {
id: 2,
name: "c".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Admin.into(),
parent_path: vec![0, 1],
},
],
..Default::default()
},
cx,
);
// Sanity check
assert_channels(
&channel_store,
&[
//
(0, "a".to_string(), proto::ChannelRole::Admin),
(1, "b".to_string(), proto::ChannelRole::Admin),
(2, "c".to_string(), proto::ChannelRole::Admin),
],
cx,
);
update_channels(
&channel_store,
proto::UpdateChannels {
delete_channels: vec![1, 2],
..Default::default()
},
cx,
);
// Make sure that the 1/2/3 path is gone
assert_channels(
&channel_store,
&[(0, "a".to_string(), proto::ChannelRole::Admin)],
cx,
);
}
#[gpui::test]
async fn test_channel_messages(cx: &mut TestAppContext) {
let user_id = 5;
let channel_id = 5;
let channel_store = cx.update(init_test);
let client = channel_store.update(cx, |s, _| s.client());
let server = FakeServer::for_client(user_id, &client, cx).await;
// Get the available channels.
server.send(proto::UpdateChannels {
channels: vec![proto::Channel {
id: channel_id,
name: "the-channel".to_string(),
visibility: proto::ChannelVisibility::Members as i32,
role: proto::ChannelRole::Member.into(),
parent_path: vec![],
}],
..Default::default()
});
cx.executor().run_until_parked();
cx.update(|cx| {
assert_channels(
&channel_store,
&[(0, "the-channel".to_string(), proto::ChannelRole::Member)],
cx,
);
});
let get_users = server.receive::<proto::GetUsers>().await.unwrap();
assert_eq!(get_users.payload.user_ids, vec![5]);
server.respond(
get_users.receipt(),
proto::UsersResponse {
users: vec![proto::User {
id: 5,
github_login: "nathansobo".into(),
avatar_url: "http://avatar.com/nathansobo".into(),
}],
},
);
// Join a channel and populate its existing messages.
let channel = channel_store.update(cx, |store, cx| {
let channel_id = store.ordered_channels().next().unwrap().1.id;
store.open_channel_chat(channel_id, cx)
});
let join_channel = server.receive::<proto::JoinChannelChat>().await.unwrap();
server.respond(
join_channel.receipt(),
proto::JoinChannelChatResponse {
messages: vec![
proto::ChannelMessage {
id: 10,
body: "a".into(),
timestamp: 1000,
sender_id: 5,
mentions: vec![],
nonce: Some(1.into()),
},
proto::ChannelMessage {
id: 11,
body: "b".into(),
timestamp: 1001,
sender_id: 6,
mentions: vec![],
nonce: Some(2.into()),
},
],
done: false,
},
);
cx.executor().start_waiting();
// Client requests all users for the received messages
let mut get_users = server.receive::<proto::GetUsers>().await.unwrap();
get_users.payload.user_ids.sort();
assert_eq!(get_users.payload.user_ids, vec![6]);
server.respond(
get_users.receipt(),
proto::UsersResponse {
users: vec![proto::User {
id: 6,
github_login: "maxbrunsfeld".into(),
avatar_url: "http://avatar.com/maxbrunsfeld".into(),
}],
},
);
let channel = channel.await.unwrap();
channel.update(cx, |channel, _| {
assert_eq!(
channel
.messages_in_range(0..2)
.map(|message| (message.sender.github_login.clone(), message.body.clone()))
.collect::<Vec<_>>(),
&[
("nathansobo".into(), "a".into()),
("maxbrunsfeld".into(), "b".into())
]
);
});
// Receive a new message.
server.send(proto::ChannelMessageSent {
channel_id,
message: Some(proto::ChannelMessage {
id: 12,
body: "c".into(),
timestamp: 1002,
sender_id: 7,
mentions: vec![],
nonce: Some(3.into()),
}),
});
// Client requests user for message since they haven't seen them yet
let get_users = server.receive::<proto::GetUsers>().await.unwrap();
assert_eq!(get_users.payload.user_ids, vec![7]);
server.respond(
get_users.receipt(),
proto::UsersResponse {
users: vec![proto::User {
id: 7,
github_login: "as-cii".into(),
avatar_url: "http://avatar.com/as-cii".into(),
}],
},
);
assert_eq!(
channel.next_event(cx),
ChannelChatEvent::MessagesUpdated {
old_range: 2..2,
new_count: 1,
}
);
channel.update(cx, |channel, _| {
assert_eq!(
channel
.messages_in_range(2..3)
.map(|message| (message.sender.github_login.clone(), message.body.clone()))
.collect::<Vec<_>>(),
&[("as-cii".into(), "c".into())]
)
});
// Scroll up to view older messages.
channel.update(cx, |channel, cx| {
channel.load_more_messages(cx).unwrap().detach();
});
let get_messages = server.receive::<proto::GetChannelMessages>().await.unwrap();
assert_eq!(get_messages.payload.channel_id, 5);
assert_eq!(get_messages.payload.before_message_id, 10);
server.respond(
get_messages.receipt(),
proto::GetChannelMessagesResponse {
done: true,
messages: vec![
proto::ChannelMessage {
id: 8,
body: "y".into(),
timestamp: 998,
sender_id: 5,
nonce: Some(4.into()),
mentions: vec![],
},
proto::ChannelMessage {
id: 9,
body: "z".into(),
timestamp: 999,
sender_id: 6,
nonce: Some(5.into()),
mentions: vec![],
},
],
},
);
assert_eq!(
channel.next_event(cx),
ChannelChatEvent::MessagesUpdated {
old_range: 0..0,
new_count: 2,
}
);
channel.update(cx, |channel, _| {
assert_eq!(
channel
.messages_in_range(0..2)
.map(|message| (message.sender.github_login.clone(), message.body.clone()))
.collect::<Vec<_>>(),
&[
("nathansobo".into(), "y".into()),
("maxbrunsfeld".into(), "z".into())
]
);
});
}
fn init_test(cx: &mut AppContext) -> Model<ChannelStore> {
let http = FakeHttpClient::with_404_response();
let client = Client::new(http.clone(), cx);
let user_store = cx.build_model(|cx| UserStore::new(client.clone(), http, cx));
let settings_store = SettingsStore::test(cx);
cx.set_global(settings_store);
client::init(&client, cx);
crate::init(&client, user_store, cx);
ChannelStore::global(cx)
}
fn update_channels(
channel_store: &Model<ChannelStore>,
message: proto::UpdateChannels,
cx: &mut AppContext,
) {
let task = channel_store.update(cx, |store, cx| store.update_channels(message, cx));
assert!(task.is_none());
}
#[track_caller]
fn assert_channels(
channel_store: &Model<ChannelStore>,
expected_channels: &[(usize, String, proto::ChannelRole)],
cx: &mut AppContext,
) {
let actual = channel_store.update(cx, |store, _| {
store
.ordered_channels()
.map(|(depth, channel)| (depth, channel.name.to_string(), channel.role))
.collect::<Vec<_>>()
});
assert_eq!(actual, expected_channels);
}

View file

@ -292,22 +292,18 @@ impl UserStore {
.upgrade()
.ok_or_else(|| anyhow!("can't upgrade user store handle"))?;
for contact in message.contacts {
let should_notify = contact.should_notify;
updated_contacts.push((
Arc::new(Contact::from_proto(contact, &this, &mut cx).await?),
should_notify,
updated_contacts.push(Arc::new(
Contact::from_proto(contact, &this, &mut cx).await?,
));
}
let mut incoming_requests = Vec::new();
for request in message.incoming_requests {
incoming_requests.push({
let user = this
.update(&mut cx, |this, cx| {
this.get_user(request.requester_id, cx)
})?
.await?;
(user, request.should_notify)
this.update(&mut cx, |this, cx| {
this.get_user(request.requester_id, cx)
})?
.await?
});
}
@ -331,13 +327,7 @@ impl UserStore {
this.contacts
.retain(|contact| !removed_contacts.contains(&contact.user.id));
// Update existing contacts and insert new ones
for (updated_contact, should_notify) in updated_contacts {
if should_notify {
cx.emit(Event::Contact {
user: updated_contact.user.clone(),
kind: ContactEventKind::Accepted,
});
}
for updated_contact in updated_contacts {
match this.contacts.binary_search_by_key(
&&updated_contact.user.github_login,
|contact| &contact.user.github_login,
@ -360,14 +350,7 @@ impl UserStore {
}
});
// Update existing incoming requests and insert new ones
for (user, should_notify) in incoming_requests {
if should_notify {
cx.emit(Event::Contact {
user: user.clone(),
kind: ContactEventKind::Requested,
});
}
for user in incoming_requests {
match this
.incoming_contact_requests
.binary_search_by_key(&&user.github_login, |contact| {

View file

@ -75,23 +75,23 @@ impl ChannelView {
let workspace = workspace.read(cx);
let project = workspace.project().to_owned();
let channel_store = ChannelStore::global(cx);
let markdown = workspace
.app_state()
.languages
.language_for_name("Markdown");
let language_registry = workspace.app_state().languages.clone();
let markdown = language_registry.language_for_name("Markdown");
let channel_buffer =
channel_store.update(cx, |store, cx| store.open_channel_buffer(channel_id, cx));
cx.spawn(|mut cx| async move {
let channel_buffer = channel_buffer.await?;
let markdown = markdown.await.log_err();
if let Some(markdown) = markdown.await.log_err() {
channel_buffer.update(&mut cx, |buffer, cx| {
buffer.buffer().update(cx, |buffer, cx| {
channel_buffer.update(&mut cx, |buffer, cx| {
buffer.buffer().update(cx, |buffer, cx| {
buffer.set_language_registry(language_registry);
if let Some(markdown) = markdown {
buffer.set_language(Some(markdown), cx);
})
});
}
}
})
});
pane.update(&mut cx, |pane, cx| {
let buffer_id = channel_buffer.read(cx).remote_id(cx);

View file

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

View file

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

View file

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

View file

@ -510,8 +510,8 @@ impl DisplaySnapshot {
self.chunks(
display_rows,
language_aware,
Some(theme.styles.inlay_highlight_style),
Some(theme.styles.suggestion_highlight_style),
None, // todo!("add inlay highlight style")
None, // todo!("add suggestion highlight style")
)
.map(|chunk| {
let mut highlight_style = chunk

View file

@ -9335,7 +9335,7 @@ impl Render for Editor {
underline: None,
};
EditorElement::new(EditorStyle {
background: cx.theme().colors().editor,
background: cx.theme().colors().editor_background,
local_player: cx.theme().players().local(),
text: text_style,
line_height_scalar: settings.buffer_line_height.value(),

View file

@ -508,7 +508,7 @@ impl EditorElement {
let bounds = gutter_bounds.union(&text_bounds);
let scroll_top =
layout.position_map.snapshot.scroll_position().y * layout.position_map.line_height;
let gutter_bg = cx.theme().colors().editor_gutter;
let gutter_bg = cx.theme().colors().editor_gutter_background;
cx.paint_quad(
gutter_bounds,
Corners::default(),
@ -545,7 +545,7 @@ impl EditorElement {
bounds.size.width,
layout.position_map.line_height * (end_row - start_row + 1) as f32,
);
let active_line_bg = cx.theme().colors().editor_active_line;
let active_line_bg = cx.theme().colors().editor_active_line_background;
cx.paint_quad(
Bounds { origin, size },
Corners::default(),
@ -567,7 +567,7 @@ impl EditorElement {
bounds.size.width,
layout.position_map.line_height * highlighted_rows.len() as f32,
);
let highlighted_line_bg = cx.theme().colors().editor_highlighted_line;
let highlighted_line_bg = cx.theme().colors().editor_highlighted_line_background;
cx.paint_quad(
Bounds { origin, size },
Corners::default(),

View file

@ -20,6 +20,7 @@ fn generate_dispatch_bindings() {
.header("src/platform/mac/dispatch.h")
.allowlist_var("_dispatch_main_q")
.allowlist_var("DISPATCH_QUEUE_PRIORITY_DEFAULT")
.allowlist_var("DISPATCH_TIME_NOW")
.allowlist_function("dispatch_get_global_queue")
.allowlist_function("dispatch_async_f")
.allowlist_function("dispatch_after_f")

View file

@ -46,13 +46,17 @@ pub struct AppCell {
}
impl AppCell {
#[track_caller]
pub fn borrow(&self) -> AppRef {
let thread_id = std::thread::current().id();
eprintln!("borrowed {thread_id:?}");
AppRef(self.app.borrow())
}
#[track_caller]
pub fn borrow_mut(&self) -> AppRefMut {
// let thread_id = std::thread::current().id();
// dbg!("borrowed {thread_id:?}");
let thread_id = std::thread::current().id();
eprintln!("borrowed {thread_id:?}");
AppRefMut(self.app.borrow_mut())
}
}
@ -157,6 +161,7 @@ pub struct AppContext {
flushing_effects: bool,
pending_updates: usize,
pub(crate) active_drag: Option<AnyDrag>,
pub(crate) active_tooltip: Option<AnyTooltip>,
pub(crate) next_frame_callbacks: HashMap<DisplayId, Vec<FrameCallback>>,
pub(crate) frame_consumers: HashMap<DisplayId, Task<()>>,
pub(crate) background_executor: BackgroundExecutor,
@ -215,6 +220,7 @@ impl AppContext {
flushing_effects: false,
pending_updates: 0,
active_drag: None,
active_tooltip: None,
next_frame_callbacks: HashMap::default(),
frame_consumers: HashMap::default(),
background_executor: executor,
@ -896,3 +902,9 @@ pub(crate) struct AnyDrag {
pub view: AnyView,
pub cursor_offset: Point<Pixels>,
}
#[derive(Clone)]
pub(crate) struct AnyTooltip {
pub view: AnyView,
pub cursor_offset: Point<Pixels>,
}

View file

@ -189,3 +189,22 @@ impl TestAppContext {
.unwrap();
}
}
impl<T: Send + EventEmitter> Model<T> {
pub fn next_event(&self, cx: &mut TestAppContext) -> T::Event
where
T::Event: Send + Clone,
{
let (tx, mut rx) = futures::channel::mpsc::unbounded();
let _subscription = self.update(cx, |_, cx| {
cx.subscribe(self, move |_, _, event, _| {
tx.unbounded_send(event.clone()).ok();
})
});
cx.executor().run_until_parked();
rx.try_next()
.expect("no event received")
.expect("model was dropped")
}
}

View file

@ -212,6 +212,19 @@ pub trait Component<V> {
{
self.map(|this| if condition { then(this) } else { this })
}
fn when_some<T>(self, option: Option<T>, then: impl FnOnce(Self, T) -> Self) -> Self
where
Self: Sized,
{
self.map(|this| {
if let Some(value) = option {
then(this, value)
} else {
this
}
})
}
}
impl<V> Component<V> for AnyElement<V> {

View file

@ -3,7 +3,7 @@ use crate::{
ElementInteraction, FocusDisabled, FocusEnabled, FocusHandle, FocusListeners, Focusable,
GlobalElementId, GroupBounds, InteractiveElementState, LayoutId, Overflow, ParentElement,
Pixels, Point, SharedString, StatefulInteraction, StatefulInteractive, StatelessInteraction,
StatelessInteractive, Style, StyleRefinement, Styled, ViewContext,
StatelessInteractive, Style, StyleRefinement, Styled, ViewContext, Visibility,
};
use refineable::Refineable;
use smallvec::SmallVec;
@ -249,11 +249,22 @@ where
cx: &mut ViewContext<V>,
) {
self.with_element_id(cx, |this, _global_id, cx| {
let style = this.compute_style(bounds, element_state, cx);
if style.visibility == Visibility::Hidden {
return;
}
if let Some(mouse_cursor) = style.mouse_cursor {
let hovered = bounds.contains_point(&cx.mouse_position());
if hovered {
cx.set_cursor_style(mouse_cursor);
}
}
if let Some(group) = this.group.clone() {
GroupBounds::push(group, bounds, cx);
}
let style = this.compute_style(bounds, element_state, cx);
let z_index = style.z_index.unwrap_or(0);
let mut child_min = point(Pixels::MAX, Pixels::MAX);

View file

@ -21,7 +21,7 @@ pub fn point<T: Clone + Debug + Default>(x: T, y: T) -> Point<T> {
}
impl<T: Clone + Debug + Default> Point<T> {
pub fn new(x: T, y: T) -> Self {
pub const fn new(x: T, y: T) -> Self {
Self { x, y }
}

View file

@ -1,8 +1,8 @@
use crate::{
div, point, px, Action, AnyDrag, AnyView, AppContext, BorrowWindow, Bounds, Component,
DispatchContext, DispatchPhase, Div, Element, ElementId, FocusHandle, KeyMatch, Keystroke,
Modifiers, Overflow, Pixels, Point, Render, SharedString, Size, Style, StyleRefinement, View,
ViewContext,
div, point, px, Action, AnyDrag, AnyTooltip, AnyView, AppContext, BorrowWindow, Bounds,
Component, DispatchContext, DispatchPhase, Div, Element, ElementId, FocusHandle, KeyMatch,
Keystroke, Modifiers, Overflow, Pixels, Point, Render, SharedString, Size, Style,
StyleRefinement, Task, View, ViewContext,
};
use collections::HashMap;
use derive_more::{Deref, DerefMut};
@ -17,9 +17,12 @@ use std::{
ops::Deref,
path::PathBuf,
sync::Arc,
time::Duration,
};
const DRAG_THRESHOLD: f64 = 2.;
const TOOLTIP_DELAY: Duration = Duration::from_millis(500);
const TOOLTIP_OFFSET: Point<Pixels> = Point::new(px(10.0), px(8.0));
pub trait StatelessInteractive<V: 'static>: Element<V> {
fn stateless_interaction(&mut self) -> &mut StatelessInteraction<V>;
@ -333,6 +336,37 @@ pub trait StatefulInteractive<V: 'static>: StatelessInteractive<V> {
}));
self
}
fn on_hover(mut self, listener: impl 'static + Fn(&mut V, bool, &mut ViewContext<V>)) -> Self
where
Self: Sized,
{
debug_assert!(
self.stateful_interaction().hover_listener.is_none(),
"calling on_hover more than once on the same element is not supported"
);
self.stateful_interaction().hover_listener = Some(Box::new(listener));
self
}
fn tooltip<W>(
mut self,
build_tooltip: impl Fn(&mut V, &mut ViewContext<V>) -> View<W> + 'static,
) -> Self
where
Self: Sized,
W: 'static + Render,
{
debug_assert!(
self.stateful_interaction().tooltip_builder.is_none(),
"calling tooltip more than once on the same element is not supported"
);
self.stateful_interaction().tooltip_builder = Some(Arc::new(move |view_state, cx| {
build_tooltip(view_state, cx).into()
}));
self
}
}
pub trait ElementInteraction<V: 'static>: 'static {
@ -568,6 +602,77 @@ pub trait ElementInteraction<V: 'static>: 'static {
}
}
if let Some(hover_listener) = stateful.hover_listener.take() {
let was_hovered = element_state.hover_state.clone();
let has_mouse_down = element_state.pending_mouse_down.clone();
cx.on_mouse_event(move |view_state, event: &MouseMoveEvent, phase, cx| {
if phase != DispatchPhase::Bubble {
return;
}
let is_hovered =
bounds.contains_point(&event.position) && has_mouse_down.lock().is_none();
let mut was_hovered = was_hovered.lock();
if is_hovered != was_hovered.clone() {
*was_hovered = is_hovered;
drop(was_hovered);
hover_listener(view_state, is_hovered, cx);
}
});
}
if let Some(tooltip_builder) = stateful.tooltip_builder.take() {
let active_tooltip = element_state.active_tooltip.clone();
let pending_mouse_down = element_state.pending_mouse_down.clone();
cx.on_mouse_event(move |_, event: &MouseMoveEvent, phase, cx| {
if phase != DispatchPhase::Bubble {
return;
}
let is_hovered = bounds.contains_point(&event.position)
&& pending_mouse_down.lock().is_none();
if !is_hovered {
active_tooltip.lock().take();
return;
}
if active_tooltip.lock().is_none() {
let task = cx.spawn({
let active_tooltip = active_tooltip.clone();
let tooltip_builder = tooltip_builder.clone();
move |view, mut cx| async move {
cx.background_executor().timer(TOOLTIP_DELAY).await;
view.update(&mut cx, move |view_state, cx| {
active_tooltip.lock().replace(ActiveTooltip {
waiting: None,
tooltip: Some(AnyTooltip {
view: tooltip_builder(view_state, cx),
cursor_offset: cx.mouse_position() + TOOLTIP_OFFSET,
}),
});
cx.notify();
})
.ok();
}
});
active_tooltip.lock().replace(ActiveTooltip {
waiting: Some(task),
tooltip: None,
});
}
});
if let Some(active_tooltip) = element_state.active_tooltip.lock().as_ref() {
if active_tooltip.tooltip.is_some() {
cx.active_tooltip = active_tooltip.tooltip.clone()
}
}
}
let active_state = element_state.active_state.clone();
if active_state.lock().is_none() {
let active_group_bounds = stateful
@ -639,6 +744,8 @@ pub struct StatefulInteraction<V> {
active_style: StyleRefinement,
group_active_style: Option<GroupStyle>,
drag_listener: Option<DragListener<V>>,
hover_listener: Option<HoverListener<V>>,
tooltip_builder: Option<TooltipBuilder<V>>,
}
impl<V: 'static> ElementInteraction<V> for StatefulInteraction<V> {
@ -666,6 +773,8 @@ impl<V> From<ElementId> for StatefulInteraction<V> {
stateless: StatelessInteraction::default(),
click_listeners: SmallVec::new(),
drag_listener: None,
hover_listener: None,
tooltip_builder: None,
active_style: StyleRefinement::default(),
group_active_style: None,
}
@ -695,6 +804,8 @@ impl<V> StatelessInteraction<V> {
stateless: self,
click_listeners: SmallVec::new(),
drag_listener: None,
hover_listener: None,
tooltip_builder: None,
active_style: StyleRefinement::default(),
group_active_style: None,
}
@ -746,8 +857,16 @@ impl ActiveState {
#[derive(Default)]
pub struct InteractiveElementState {
active_state: Arc<Mutex<ActiveState>>,
hover_state: Arc<Mutex<bool>>,
pending_mouse_down: Arc<Mutex<Option<MouseDownEvent>>>,
scroll_offset: Option<Arc<Mutex<Point<Pixels>>>>,
active_tooltip: Arc<Mutex<Option<ActiveTooltip>>>,
}
struct ActiveTooltip {
#[allow(unused)] // used to drop the task
waiting: Option<Task<()>>,
tooltip: Option<AnyTooltip>,
}
impl InteractiveElementState {
@ -1097,6 +1216,10 @@ pub type ClickListener<V> = Box<dyn Fn(&mut V, &ClickEvent, &mut ViewContext<V>)
pub(crate) type DragListener<V> =
Box<dyn Fn(&mut V, Point<Pixels>, &mut ViewContext<V>) -> AnyDrag + 'static>;
pub(crate) type HoverListener<V> = Box<dyn Fn(&mut V, bool, &mut ViewContext<V>) + 'static>;
pub(crate) type TooltipBuilder<V> = Arc<dyn Fn(&mut V, &mut ViewContext<V>) -> AnyView + 'static>;
pub type KeyListener<V> = Box<
dyn Fn(
&mut V,

View file

@ -11,11 +11,7 @@ use objc::{
};
use parking::{Parker, Unparker};
use parking_lot::Mutex;
use std::{
ffi::c_void,
sync::Arc,
time::{Duration, SystemTime},
};
use std::{ffi::c_void, sync::Arc, time::Duration};
include!(concat!(env!("OUT_DIR"), "/dispatch_sys.rs"));
@ -62,16 +58,10 @@ impl PlatformDispatcher for MacDispatcher {
}
fn dispatch_after(&self, duration: Duration, runnable: Runnable) {
let now = SystemTime::now();
let after_duration = now
.duration_since(SystemTime::UNIX_EPOCH)
.unwrap()
.as_nanos() as u64
+ duration.as_nanos() as u64;
unsafe {
let queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT.try_into().unwrap(), 0);
let when = dispatch_time(0, after_duration as i64);
let when = dispatch_time(DISPATCH_TIME_NOW as u64, duration.as_nanos() as i64);
dispatch_after_f(
when,
queue,

View file

@ -1,8 +1,8 @@
use crate::{
black, phi, point, rems, AbsoluteLength, BorrowAppContext, BorrowWindow, Bounds, ContentMask,
Corners, CornersRefinement, DefiniteLength, Edges, EdgesRefinement, Font, FontFeatures,
FontStyle, FontWeight, Hsla, Length, Pixels, Point, PointRefinement, Result, Rgba,
SharedString, Size, SizeRefinement, Styled, TextRun, ViewContext, WindowContext,
Corners, CornersRefinement, CursorStyle, DefiniteLength, Edges, EdgesRefinement, Font,
FontFeatures, FontStyle, FontWeight, Hsla, Length, Pixels, Point, PointRefinement, Result,
Rgba, SharedString, Size, SizeRefinement, Styled, TextRun, ViewContext, WindowContext,
};
use refineable::{Cascade, Refineable};
use smallvec::SmallVec;
@ -19,6 +19,9 @@ pub struct Style {
/// What layout strategy should be used?
pub display: Display,
/// Should the element be painted on screen?
pub visibility: Visibility,
// Overflow properties
/// How children overflowing their container should affect layout
#[refineable]
@ -98,6 +101,9 @@ pub struct Style {
/// TEXT
pub text: TextStyleRefinement,
/// The mouse cursor style shown when the mouse pointer is over an element.
pub mouse_cursor: Option<CursorStyle>,
pub z_index: Option<u32>,
}
@ -107,6 +113,13 @@ impl Styled for StyleRefinement {
}
}
#[derive(Default, Clone, Copy, Debug, Eq, PartialEq)]
pub enum Visibility {
#[default]
Visible,
Hidden,
}
#[derive(Clone, Debug)]
pub struct BoxShadow {
pub color: Hsla,
@ -297,6 +310,7 @@ impl Default for Style {
fn default() -> Self {
Style {
display: Display::Block,
visibility: Visibility::Visible,
overflow: Point {
x: Overflow::Visible,
y: Overflow::Visible,
@ -328,6 +342,7 @@ impl Default for Style {
corner_radii: Corners::default(),
box_shadow: Default::default(),
text: TextStyleRefinement::default(),
mouse_cursor: None,
z_index: None,
}
}

View file

@ -1,7 +1,7 @@
use crate::{
self as gpui2, hsla, point, px, relative, rems, AbsoluteLength, AlignItems, DefiniteLength,
Display, Fill, FlexDirection, Hsla, JustifyContent, Length, Position, SharedString,
StyleRefinement,
self as gpui, hsla, point, px, relative, rems, AbsoluteLength, AlignItems, CursorStyle,
DefiniteLength, Display, Fill, FlexDirection, Hsla, JustifyContent, Length, Position,
SharedString, StyleRefinement, Visibility,
};
use crate::{BoxShadow, TextStyleRefinement};
use smallvec::smallvec;
@ -61,6 +61,54 @@ pub trait Styled {
self
}
/// Sets the visibility of the element to `visible`.
/// [Docs](https://tailwindcss.com/docs/visibility)
fn visible(mut self) -> Self
where
Self: Sized,
{
self.style().visibility = Some(Visibility::Visible);
self
}
/// Sets the visibility of the element to `hidden`.
/// [Docs](https://tailwindcss.com/docs/visibility)
fn invisible(mut self) -> Self
where
Self: Sized,
{
self.style().visibility = Some(Visibility::Hidden);
self
}
fn cursor(mut self, cursor: CursorStyle) -> Self
where
Self: Sized,
{
self.style().mouse_cursor = Some(cursor);
self
}
/// Sets the cursor style when hovering an element to `default`.
/// [Docs](https://tailwindcss.com/docs/cursor)
fn cursor_default(mut self) -> Self
where
Self: Sized,
{
self.style().mouse_cursor = Some(CursorStyle::Arrow);
self
}
/// Sets the cursor style when hovering an element to `pointer`.
/// [Docs](https://tailwindcss.com/docs/cursor)
fn cursor_pointer(mut self) -> Self
where
Self: Sized,
{
self.style().mouse_cursor = Some(CursorStyle::PointingHand);
self
}
/// Sets the flex direction of the element to `column`.
/// [Docs](https://tailwindcss.com/docs/flex-direction#column)
fn flex_col(mut self) -> Self

View file

@ -38,7 +38,7 @@ where
lock.subscribers
.entry(emitter_key.clone())
.or_default()
.insert(Default::default())
.get_or_insert_with(|| Default::default())
.insert(subscriber_id, callback);
let this = self.0.clone();
Subscription {

View file

@ -1,14 +1,14 @@
use crate::{
px, size, Action, AnyBox, AnyDrag, AnyView, AppContext, AsyncWindowContext, AvailableSpace,
Bounds, BoxShadow, Context, Corners, DevicePixels, DispatchContext, DisplayId, Edges, Effect,
Entity, EntityId, EventEmitter, FileDropEvent, FocusEvent, FontId, GlobalElementId, GlyphId,
Hsla, ImageData, InputEvent, IsZero, KeyListener, KeyMatch, KeyMatcher, Keystroke, LayoutId,
Model, ModelContext, Modifiers, MonochromeSprite, MouseButton, MouseDownEvent, MouseMoveEvent,
MouseUpEvent, Path, Pixels, PlatformAtlas, PlatformDisplay, PlatformWindow, Point,
PolychromeSprite, PromptLevel, Quad, Render, RenderGlyphParams, RenderImageParams,
RenderSvgParams, ScaledPixels, SceneBuilder, Shadow, SharedString, Size, Style, SubscriberSet,
Subscription, TaffyLayoutEngine, Task, Underline, UnderlineStyle, View, VisualContext,
WeakView, WindowBounds, WindowOptions, SUBPIXEL_VARIANTS,
Bounds, BoxShadow, Context, Corners, CursorStyle, DevicePixels, DispatchContext, DisplayId,
Edges, Effect, Entity, EntityId, EventEmitter, FileDropEvent, FocusEvent, FontId,
GlobalElementId, GlyphId, Hsla, ImageData, InputEvent, IsZero, KeyListener, KeyMatch,
KeyMatcher, Keystroke, LayoutId, Model, ModelContext, Modifiers, MonochromeSprite, MouseButton,
MouseDownEvent, MouseMoveEvent, MouseUpEvent, Path, Pixels, PlatformAtlas, PlatformDisplay,
PlatformWindow, Point, PolychromeSprite, PromptLevel, Quad, Render, RenderGlyphParams,
RenderImageParams, RenderSvgParams, ScaledPixels, SceneBuilder, Shadow, SharedString, Size,
Style, SubscriberSet, Subscription, TaffyLayoutEngine, Task, Underline, UnderlineStyle, View,
VisualContext, WeakView, WindowBounds, WindowOptions, SUBPIXEL_VARIANTS,
};
use anyhow::{anyhow, Result};
use collections::HashMap;
@ -190,6 +190,7 @@ pub struct Window {
pub(crate) focus_handles: Arc<RwLock<SlotMap<FocusId, AtomicUsize>>>,
default_prevented: bool,
mouse_position: Point<Pixels>,
requested_cursor_style: Option<CursorStyle>,
scale_factor: f32,
bounds: WindowBounds,
bounds_observers: SubscriberSet<(), AnyObserver>,
@ -283,6 +284,7 @@ impl Window {
focus_handles: Arc::new(RwLock::new(SlotMap::with_key())),
default_prevented: true,
mouse_position,
requested_cursor_style: None,
scale_factor,
bounds,
bounds_observers: SubscriberSet::new(),
@ -669,6 +671,10 @@ impl<'a> WindowContext<'a> {
self.window.mouse_position
}
pub fn set_cursor_style(&mut self, style: CursorStyle) {
self.window.requested_cursor_style = Some(style)
}
/// Called during painting to invoke the given closure in a new stacking context. The given
/// z-index is interpreted relative to the previous call to `stack`.
pub fn stack<R>(&mut self, z_index: u32, f: impl FnOnce(&mut Self) -> R) -> R {
@ -981,12 +987,27 @@ impl<'a> WindowContext<'a> {
cx.active_drag = Some(active_drag);
});
});
} else if let Some(active_tooltip) = self.app.active_tooltip.take() {
self.stack(1, |cx| {
cx.with_element_offset(Some(active_tooltip.cursor_offset), |cx| {
let available_space =
size(AvailableSpace::MinContent, AvailableSpace::MinContent);
active_tooltip.view.draw(available_space, cx);
});
});
}
self.window.root_view = Some(root_view);
let scene = self.window.scene_builder.build();
self.window.platform_window.draw(scene);
let cursor_style = self
.window
.requested_cursor_style
.take()
.unwrap_or(CursorStyle::Arrow);
self.platform.set_cursor_style(cursor_style);
self.window.dirty = false;
}

View file

@ -28,9 +28,9 @@ pub fn derive_component(input: TokenStream) -> TokenStream {
let (_, ty_generics, _) = ast.generics.split_for_impl();
let expanded = quote! {
impl #impl_generics gpui2::Component<#view_type> for #name #ty_generics #where_clause {
fn render(self) -> gpui2::AnyElement<#view_type> {
(move |view_state: &mut #view_type, cx: &mut gpui2::ViewContext<'_, #view_type>| self.render(view_state, cx))
impl #impl_generics gpui::Component<#view_type> for #name #ty_generics #where_clause {
fn render(self) -> gpui::AnyElement<#view_type> {
(move |view_state: &mut #view_type, cx: &mut gpui::ViewContext<'_, #view_type>| self.render(view_state, cx))
.render()
}
}

View file

@ -123,7 +123,7 @@ fn generate_predefined_setter(
.iter()
.map(|field_tokens| {
quote! {
style.#field_tokens = Some((#negation_token gpui2::#length_tokens).into());
style.#field_tokens = Some((#negation_token gpui::#length_tokens).into());
}
})
.collect::<Vec<_>>();
@ -163,7 +163,7 @@ fn generate_custom_value_setter(
let method = quote! {
#[doc = #doc_string]
fn #method_name(mut self, length: impl std::clone::Clone + Into<gpui2::#length_type>) -> Self where Self: std::marker::Sized {
fn #method_name(mut self, length: impl std::clone::Clone + Into<gpui::#length_type>) -> Self where Self: std::marker::Sized {
let style = self.style();
#(#field_assignments)*
self

View file

@ -175,6 +175,7 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
inner_fn_args.extend(quote!(&mut #cx_varname_lock,));
cx_teardowns.extend(quote!(
#cx_varname_lock.quit();
drop(#cx_varname_lock);
dispatcher.run_until_parked();
));
continue;

View file

@ -170,6 +170,8 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
#max_retries,
#detect_nondeterminism,
&mut |cx, foreground_platform, deterministic, seed| {
// some of the macro contents do not use all variables, silence the warnings
let _ = (&cx, &foreground_platform, &deterministic, &seed);
#cx_vars
cx.foreground().run(#inner_fn_name(#inner_fn_args));
#cx_teardowns
@ -247,6 +249,8 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
#max_retries,
#detect_nondeterminism,
&mut |cx, foreground_platform, deterministic, seed| {
// some of the macro contents do not use all variables, silence the warnings
let _ = (&cx, &foreground_platform, &deterministic, &seed);
#cx_vars
#inner_fn_name(#inner_fn_args);
#cx_teardowns

View file

@ -16,14 +16,14 @@ name = "test_app"
test-support = [
"async-trait",
"collections/test-support",
"gpui2/test-support",
"gpui/test-support",
"live_kit_server",
"nanoid",
]
[dependencies]
collections = { path = "../collections", optional = true }
gpui2 = { package = "gpui2", path = "../gpui2", optional = true }
gpui = { package = "gpui2", path = "../gpui2", optional = true }
live_kit_server = { path = "../live_kit_server", optional = true }
media = { path = "../media" }
@ -41,7 +41,7 @@ nanoid = { version ="0.4", optional = true}
[dev-dependencies]
collections = { path = "../collections", features = ["test-support"] }
gpui2 = { package = "gpui2", path = "../gpui2", features = ["test-support"] }
gpui = { package = "gpui2", path = "../gpui2", features = ["test-support"] }
live_kit_server = { path = "../live_kit_server" }
media = { path = "../media" }
nanoid = "0.4"

View file

@ -1,7 +1,7 @@
use std::{sync::Arc, time::Duration};
use futures::StreamExt;
use gpui2::KeyBinding;
use gpui::KeyBinding;
use live_kit_client2::{
LocalAudioTrack, LocalVideoTrack, RemoteAudioTrackUpdate, RemoteVideoTrackUpdate, Room,
};
@ -16,7 +16,7 @@ struct Quit;
fn main() {
SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger");
gpui2::App::production(Arc::new(())).run(|cx| {
gpui::App::production(Arc::new(())).run(|cx| {
#[cfg(any(test, feature = "test-support"))]
println!("USING TEST LIVEKIT");
@ -173,6 +173,6 @@ fn main() {
});
}
fn quit(_: &Quit, cx: &mut gpui2::AppContext) {
fn quit(_: &Quit, cx: &mut gpui::AppContext) {
cx.quit();
}

View file

@ -2,7 +2,7 @@ use anyhow::{anyhow, Context, Result};
use async_trait::async_trait;
use collections::{BTreeMap, HashMap};
use futures::Stream;
use gpui2::BackgroundExecutor;
use gpui::BackgroundExecutor;
use live_kit_server::token;
use media::core_video::CVImageBuffer;
use parking_lot::Mutex;

View file

@ -16,9 +16,33 @@ pub fn derive_refineable(input: TokenStream) -> TokenStream {
..
} = parse_macro_input!(input);
let impl_debug_on_refinement = attrs
.iter()
.any(|attr| attr.path.is_ident("refineable") && attr.tokens.to_string().contains("debug"));
let refineable_attr = attrs.iter().find(|attr| attr.path.is_ident("refineable"));
let mut impl_debug_on_refinement = false;
let mut derive_serialize_on_refinement = false;
let mut derive_deserialize_on_refinement = false;
if let Some(refineable_attr) = refineable_attr {
if let Ok(syn::Meta::List(meta_list)) = refineable_attr.parse_meta() {
for nested in meta_list.nested {
let syn::NestedMeta::Meta(syn::Meta::Path(path)) = nested else {
continue;
};
if path.is_ident("debug") {
impl_debug_on_refinement = true;
}
if path.is_ident("serialize") {
derive_serialize_on_refinement = true;
}
if path.is_ident("deserialize") {
derive_deserialize_on_refinement = true;
}
}
}
}
let refinement_ident = format_ident!("{}Refinement", ident);
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
@ -235,8 +259,22 @@ pub fn derive_refineable(input: TokenStream) -> TokenStream {
quote! {}
};
let derive_serialize = if derive_serialize_on_refinement {
quote! { #[derive(serde::Serialize)]}
} else {
quote! {}
};
let derive_deserialize = if derive_deserialize_on_refinement {
quote! { #[derive(serde::Deserialize)]}
} else {
quote! {}
};
let gen = quote! {
#[derive(Clone)]
#derive_serialize
#derive_deserialize
pub struct #refinement_ident #impl_generics {
#( #field_visibilities #field_names: #wrapped_types ),*
}

View file

@ -89,88 +89,96 @@ message Envelope {
FormatBuffersResponse format_buffers_response = 70;
GetCompletions get_completions = 71;
GetCompletionsResponse get_completions_response = 72;
ApplyCompletionAdditionalEdits apply_completion_additional_edits = 73;
ApplyCompletionAdditionalEditsResponse apply_completion_additional_edits_response = 74;
GetCodeActions get_code_actions = 75;
GetCodeActionsResponse get_code_actions_response = 76;
GetHover get_hover = 77;
GetHoverResponse get_hover_response = 78;
ApplyCodeAction apply_code_action = 79;
ApplyCodeActionResponse apply_code_action_response = 80;
PrepareRename prepare_rename = 81;
PrepareRenameResponse prepare_rename_response = 82;
PerformRename perform_rename = 83;
PerformRenameResponse perform_rename_response = 84;
SearchProject search_project = 85;
SearchProjectResponse search_project_response = 86;
ResolveCompletionDocumentation resolve_completion_documentation = 73;
ResolveCompletionDocumentationResponse resolve_completion_documentation_response = 74;
ApplyCompletionAdditionalEdits apply_completion_additional_edits = 75;
ApplyCompletionAdditionalEditsResponse apply_completion_additional_edits_response = 76;
GetCodeActions get_code_actions = 77;
GetCodeActionsResponse get_code_actions_response = 78;
GetHover get_hover = 79;
GetHoverResponse get_hover_response = 80;
ApplyCodeAction apply_code_action = 81;
ApplyCodeActionResponse apply_code_action_response = 82;
PrepareRename prepare_rename = 83;
PrepareRenameResponse prepare_rename_response = 84;
PerformRename perform_rename = 85;
PerformRenameResponse perform_rename_response = 86;
SearchProject search_project = 87;
SearchProjectResponse search_project_response = 88;
UpdateContacts update_contacts = 87;
UpdateInviteInfo update_invite_info = 88;
ShowContacts show_contacts = 89;
UpdateContacts update_contacts = 89;
UpdateInviteInfo update_invite_info = 90;
ShowContacts show_contacts = 91;
GetUsers get_users = 90;
FuzzySearchUsers fuzzy_search_users = 91;
UsersResponse users_response = 92;
RequestContact request_contact = 93;
RespondToContactRequest respond_to_contact_request = 94;
RemoveContact remove_contact = 95;
GetUsers get_users = 92;
FuzzySearchUsers fuzzy_search_users = 93;
UsersResponse users_response = 94;
RequestContact request_contact = 95;
RespondToContactRequest respond_to_contact_request = 96;
RemoveContact remove_contact = 97;
Follow follow = 96;
FollowResponse follow_response = 97;
UpdateFollowers update_followers = 98;
Unfollow unfollow = 99;
GetPrivateUserInfo get_private_user_info = 100;
GetPrivateUserInfoResponse get_private_user_info_response = 101;
UpdateDiffBase update_diff_base = 102;
Follow follow = 98;
FollowResponse follow_response = 99;
UpdateFollowers update_followers = 100;
Unfollow unfollow = 101;
GetPrivateUserInfo get_private_user_info = 102;
GetPrivateUserInfoResponse get_private_user_info_response = 103;
UpdateDiffBase update_diff_base = 104;
OnTypeFormatting on_type_formatting = 103;
OnTypeFormattingResponse on_type_formatting_response = 104;
OnTypeFormatting on_type_formatting = 105;
OnTypeFormattingResponse on_type_formatting_response = 106;
UpdateWorktreeSettings update_worktree_settings = 105;
UpdateWorktreeSettings update_worktree_settings = 107;
InlayHints inlay_hints = 106;
InlayHintsResponse inlay_hints_response = 107;
ResolveInlayHint resolve_inlay_hint = 108;
ResolveInlayHintResponse resolve_inlay_hint_response = 109;
RefreshInlayHints refresh_inlay_hints = 110;
InlayHints inlay_hints = 108;
InlayHintsResponse inlay_hints_response = 109;
ResolveInlayHint resolve_inlay_hint = 110;
ResolveInlayHintResponse resolve_inlay_hint_response = 111;
RefreshInlayHints refresh_inlay_hints = 112;
CreateChannel create_channel = 111;
CreateChannelResponse create_channel_response = 112;
InviteChannelMember invite_channel_member = 113;
RemoveChannelMember remove_channel_member = 114;
RespondToChannelInvite respond_to_channel_invite = 115;
UpdateChannels update_channels = 116;
JoinChannel join_channel = 117;
DeleteChannel delete_channel = 118;
GetChannelMembers get_channel_members = 119;
GetChannelMembersResponse get_channel_members_response = 120;
SetChannelMemberAdmin set_channel_member_admin = 121;
RenameChannel rename_channel = 122;
RenameChannelResponse rename_channel_response = 123;
CreateChannel create_channel = 113;
CreateChannelResponse create_channel_response = 114;
InviteChannelMember invite_channel_member = 115;
RemoveChannelMember remove_channel_member = 116;
RespondToChannelInvite respond_to_channel_invite = 117;
UpdateChannels update_channels = 118;
JoinChannel join_channel = 119;
DeleteChannel delete_channel = 120;
GetChannelMembers get_channel_members = 121;
GetChannelMembersResponse get_channel_members_response = 122;
SetChannelMemberRole set_channel_member_role = 123;
RenameChannel rename_channel = 124;
RenameChannelResponse rename_channel_response = 125;
JoinChannelBuffer join_channel_buffer = 124;
JoinChannelBufferResponse join_channel_buffer_response = 125;
UpdateChannelBuffer update_channel_buffer = 126;
LeaveChannelBuffer leave_channel_buffer = 127;
UpdateChannelBufferCollaborators update_channel_buffer_collaborators = 128;
RejoinChannelBuffers rejoin_channel_buffers = 129;
RejoinChannelBuffersResponse rejoin_channel_buffers_response = 130;
AckBufferOperation ack_buffer_operation = 143;
JoinChannelBuffer join_channel_buffer = 126;
JoinChannelBufferResponse join_channel_buffer_response = 127;
UpdateChannelBuffer update_channel_buffer = 128;
LeaveChannelBuffer leave_channel_buffer = 129;
UpdateChannelBufferCollaborators update_channel_buffer_collaborators = 130;
RejoinChannelBuffers rejoin_channel_buffers = 131;
RejoinChannelBuffersResponse rejoin_channel_buffers_response = 132;
AckBufferOperation ack_buffer_operation = 133;
JoinChannelChat join_channel_chat = 131;
JoinChannelChatResponse join_channel_chat_response = 132;
LeaveChannelChat leave_channel_chat = 133;
SendChannelMessage send_channel_message = 134;
SendChannelMessageResponse send_channel_message_response = 135;
ChannelMessageSent channel_message_sent = 136;
GetChannelMessages get_channel_messages = 137;
GetChannelMessagesResponse get_channel_messages_response = 138;
RemoveChannelMessage remove_channel_message = 139;
AckChannelMessage ack_channel_message = 144;
JoinChannelChat join_channel_chat = 134;
JoinChannelChatResponse join_channel_chat_response = 135;
LeaveChannelChat leave_channel_chat = 136;
SendChannelMessage send_channel_message = 137;
SendChannelMessageResponse send_channel_message_response = 138;
ChannelMessageSent channel_message_sent = 139;
GetChannelMessages get_channel_messages = 140;
GetChannelMessagesResponse get_channel_messages_response = 141;
RemoveChannelMessage remove_channel_message = 142;
AckChannelMessage ack_channel_message = 143;
GetChannelMessagesById get_channel_messages_by_id = 144;
LinkChannel link_channel = 140;
UnlinkChannel unlink_channel = 141;
MoveChannel move_channel = 142; // current max: 144
MoveChannel move_channel = 147;
SetChannelVisibility set_channel_visibility = 148;
AddNotification add_notification = 149;
GetNotifications get_notifications = 150;
GetNotificationsResponse get_notifications_response = 151;
DeleteNotification delete_notification = 152;
MarkNotificationRead mark_notification_read = 153; // Current max
}
}
@ -332,6 +340,7 @@ message RoomUpdated {
message LiveKitConnectionInfo {
string server_url = 1;
string token = 2;
bool can_publish = 3;
}
message ShareProject {
@ -832,6 +841,17 @@ message ResolveState {
}
}
message ResolveCompletionDocumentation {
uint64 project_id = 1;
uint64 language_server_id = 2;
bytes lsp_completion = 3;
}
message ResolveCompletionDocumentationResponse {
string text = 1;
bool is_markdown = 2;
}
message ResolveInlayHint {
uint64 project_id = 1;
uint64 buffer_id = 2;
@ -950,13 +970,10 @@ message LspDiskBasedDiagnosticsUpdated {}
message UpdateChannels {
repeated Channel channels = 1;
repeated ChannelEdge insert_edge = 2;
repeated ChannelEdge delete_edge = 3;
repeated uint64 delete_channels = 4;
repeated Channel channel_invitations = 5;
repeated uint64 remove_channel_invitations = 6;
repeated ChannelParticipants channel_participants = 7;
repeated ChannelPermission channel_permissions = 8;
repeated UnseenChannelMessage unseen_channel_messages = 9;
repeated UnseenChannelBufferChange unseen_channel_buffer_changes = 10;
}
@ -972,14 +989,9 @@ message UnseenChannelBufferChange {
repeated VectorClockEntry version = 3;
}
message ChannelEdge {
uint64 channel_id = 1;
uint64 parent_id = 2;
}
message ChannelPermission {
uint64 channel_id = 1;
bool is_admin = 2;
ChannelRole role = 3;
}
message ChannelParticipants {
@ -1005,8 +1017,8 @@ message GetChannelMembersResponse {
message ChannelMember {
uint64 user_id = 1;
bool admin = 2;
Kind kind = 3;
ChannelRole role = 4;
enum Kind {
Member = 0;
@ -1028,7 +1040,7 @@ message CreateChannelResponse {
message InviteChannelMember {
uint64 channel_id = 1;
uint64 user_id = 2;
bool admin = 3;
ChannelRole role = 4;
}
message RemoveChannelMember {
@ -1036,10 +1048,22 @@ message RemoveChannelMember {
uint64 user_id = 2;
}
message SetChannelMemberAdmin {
enum ChannelRole {
Admin = 0;
Member = 1;
Guest = 2;
Banned = 3;
}
message SetChannelMemberRole {
uint64 channel_id = 1;
uint64 user_id = 2;
bool admin = 3;
ChannelRole role = 3;
}
message SetChannelVisibility {
uint64 channel_id = 1;
ChannelVisibility visibility = 2;
}
message RenameChannel {
@ -1068,6 +1092,7 @@ message SendChannelMessage {
uint64 channel_id = 1;
string body = 2;
Nonce nonce = 3;
repeated ChatMention mentions = 4;
}
message RemoveChannelMessage {
@ -1099,20 +1124,13 @@ message GetChannelMessagesResponse {
bool done = 2;
}
message LinkChannel {
uint64 channel_id = 1;
uint64 to = 2;
}
message UnlinkChannel {
uint64 channel_id = 1;
uint64 from = 2;
message GetChannelMessagesById {
repeated uint64 message_ids = 1;
}
message MoveChannel {
uint64 channel_id = 1;
uint64 from = 2;
uint64 to = 3;
optional uint64 to = 2;
}
message JoinChannelBuffer {
@ -1125,6 +1143,12 @@ message ChannelMessage {
uint64 timestamp = 3;
uint64 sender_id = 4;
Nonce nonce = 5;
repeated ChatMention mentions = 6;
}
message ChatMention {
Range range = 1;
uint64 user_id = 2;
}
message RejoinChannelBuffers {
@ -1216,7 +1240,6 @@ message ShowContacts {}
message IncomingContactRequest {
uint64 requester_id = 1;
bool should_notify = 2;
}
message UpdateDiagnostics {
@ -1533,16 +1556,23 @@ message Nonce {
uint64 lower_half = 2;
}
enum ChannelVisibility {
Public = 0;
Members = 1;
}
message Channel {
uint64 id = 1;
string name = 2;
ChannelVisibility visibility = 3;
ChannelRole role = 4;
repeated uint64 parent_path = 5;
}
message Contact {
uint64 user_id = 1;
bool online = 2;
bool busy = 3;
bool should_notify = 4;
}
message WorktreeMetadata {
@ -1557,3 +1587,34 @@ message UpdateDiffBase {
uint64 buffer_id = 2;
optional string diff_base = 3;
}
message GetNotifications {
optional uint64 before_id = 1;
}
message AddNotification {
Notification notification = 1;
}
message GetNotificationsResponse {
repeated Notification notifications = 1;
bool done = 2;
}
message DeleteNotification {
uint64 notification_id = 1;
}
message MarkNotificationRead {
uint64 notification_id = 1;
}
message Notification {
uint64 id = 1;
uint64 timestamp = 2;
string kind = 3;
optional uint64 entity_id = 4;
string content = 5;
bool is_read = 6;
optional bool response = 7;
}

View file

@ -133,6 +133,9 @@ impl fmt::Display for PeerId {
messages!(
(Ack, Foreground),
(AckBufferOperation, Background),
(AckChannelMessage, Background),
(AddNotification, Foreground),
(AddProjectCollaborator, Foreground),
(ApplyCodeAction, Background),
(ApplyCodeActionResponse, Background),
@ -143,57 +146,74 @@ messages!(
(Call, Foreground),
(CallCanceled, Foreground),
(CancelCall, Foreground),
(ChannelMessageSent, Foreground),
(CopyProjectEntry, Foreground),
(CreateBufferForPeer, Foreground),
(CreateChannel, Foreground),
(CreateChannelResponse, Foreground),
(ChannelMessageSent, Foreground),
(CreateProjectEntry, Foreground),
(CreateRoom, Foreground),
(CreateRoomResponse, Foreground),
(DeclineCall, Foreground),
(DeleteChannel, Foreground),
(DeleteNotification, Foreground),
(DeleteProjectEntry, Foreground),
(Error, Foreground),
(ExpandProjectEntry, Foreground),
(ExpandProjectEntryResponse, Foreground),
(Follow, Foreground),
(FollowResponse, Foreground),
(FormatBuffers, Foreground),
(FormatBuffersResponse, Foreground),
(FuzzySearchUsers, Foreground),
(GetChannelMembers, Foreground),
(GetChannelMembersResponse, Foreground),
(GetChannelMessages, Background),
(GetChannelMessagesById, Background),
(GetChannelMessagesResponse, Background),
(GetCodeActions, Background),
(GetCodeActionsResponse, Background),
(GetHover, Background),
(GetHoverResponse, Background),
(GetChannelMessages, Background),
(GetChannelMessagesResponse, Background),
(SendChannelMessage, Background),
(SendChannelMessageResponse, Background),
(GetCompletions, Background),
(GetCompletionsResponse, Background),
(GetDefinition, Background),
(GetDefinitionResponse, Background),
(GetTypeDefinition, Background),
(GetTypeDefinitionResponse, Background),
(GetDocumentHighlights, Background),
(GetDocumentHighlightsResponse, Background),
(GetReferences, Background),
(GetReferencesResponse, Background),
(GetHover, Background),
(GetHoverResponse, Background),
(GetNotifications, Foreground),
(GetNotificationsResponse, Foreground),
(GetPrivateUserInfo, Foreground),
(GetPrivateUserInfoResponse, Foreground),
(GetProjectSymbols, Background),
(GetProjectSymbolsResponse, Background),
(GetReferences, Background),
(GetReferencesResponse, Background),
(GetTypeDefinition, Background),
(GetTypeDefinitionResponse, Background),
(GetUsers, Foreground),
(Hello, Foreground),
(IncomingCall, Foreground),
(InlayHints, Background),
(InlayHintsResponse, Background),
(InviteChannelMember, Foreground),
(UsersResponse, Foreground),
(JoinChannel, Foreground),
(JoinChannelBuffer, Foreground),
(JoinChannelBufferResponse, Foreground),
(JoinChannelChat, Foreground),
(JoinChannelChatResponse, Foreground),
(JoinProject, Foreground),
(JoinProjectResponse, Foreground),
(JoinRoom, Foreground),
(JoinRoomResponse, Foreground),
(JoinChannelChat, Foreground),
(JoinChannelChatResponse, Foreground),
(LeaveChannelBuffer, Background),
(LeaveChannelChat, Foreground),
(LeaveProject, Foreground),
(LeaveRoom, Foreground),
(MarkNotificationRead, Foreground),
(MoveChannel, Foreground),
(OnTypeFormatting, Background),
(OnTypeFormattingResponse, Background),
(OpenBufferById, Background),
(OpenBufferByPath, Background),
(OpenBufferForSymbol, Background),
@ -201,58 +221,56 @@ messages!(
(OpenBufferResponse, Background),
(PerformRename, Background),
(PerformRenameResponse, Background),
(OnTypeFormatting, Background),
(OnTypeFormattingResponse, Background),
(InlayHints, Background),
(InlayHintsResponse, Background),
(ResolveInlayHint, Background),
(ResolveInlayHintResponse, Background),
(RefreshInlayHints, Foreground),
(Ping, Foreground),
(PrepareRename, Background),
(PrepareRenameResponse, Background),
(ExpandProjectEntryResponse, Foreground),
(ProjectEntryResponse, Foreground),
(RefreshInlayHints, Foreground),
(RejoinChannelBuffers, Foreground),
(RejoinChannelBuffersResponse, Foreground),
(RejoinRoom, Foreground),
(RejoinRoomResponse, Foreground),
(RemoveContact, Foreground),
(RemoveChannelMember, Foreground),
(RemoveChannelMessage, Foreground),
(ReloadBuffers, Foreground),
(ReloadBuffersResponse, Foreground),
(RemoveChannelMember, Foreground),
(RemoveChannelMessage, Foreground),
(RemoveContact, Foreground),
(RemoveProjectCollaborator, Foreground),
(RenameProjectEntry, Foreground),
(RequestContact, Foreground),
(RespondToContactRequest, Foreground),
(RespondToChannelInvite, Foreground),
(JoinChannel, Foreground),
(RoomUpdated, Foreground),
(SaveBuffer, Foreground),
(RenameChannel, Foreground),
(RenameChannelResponse, Foreground),
(SetChannelMemberAdmin, Foreground),
(RenameProjectEntry, Foreground),
(RequestContact, Foreground),
(ResolveCompletionDocumentation, Background),
(ResolveCompletionDocumentationResponse, Background),
(ResolveInlayHint, Background),
(ResolveInlayHintResponse, Background),
(RespondToChannelInvite, Foreground),
(RespondToContactRequest, Foreground),
(RoomUpdated, Foreground),
(SaveBuffer, Foreground),
(SetChannelMemberRole, Foreground),
(SetChannelVisibility, Foreground),
(SearchProject, Background),
(SearchProjectResponse, Background),
(SendChannelMessage, Background),
(SendChannelMessageResponse, Background),
(ShareProject, Foreground),
(ShareProjectResponse, Foreground),
(ShowContacts, Foreground),
(StartLanguageServer, Foreground),
(SynchronizeBuffers, Foreground),
(SynchronizeBuffersResponse, Foreground),
(RejoinChannelBuffers, Foreground),
(RejoinChannelBuffersResponse, Foreground),
(Test, Foreground),
(Unfollow, Foreground),
(UnshareProject, Foreground),
(UpdateBuffer, Foreground),
(UpdateBufferFile, Foreground),
(UpdateContacts, Foreground),
(DeleteChannel, Foreground),
(MoveChannel, Foreground),
(LinkChannel, Foreground),
(UnlinkChannel, Foreground),
(UpdateChannelBuffer, Foreground),
(UpdateChannelBufferCollaborators, Foreground),
(UpdateChannels, Foreground),
(UpdateContacts, Foreground),
(UpdateDiagnosticSummary, Foreground),
(UpdateDiffBase, Foreground),
(UpdateFollowers, Foreground),
(UpdateInviteInfo, Foreground),
(UpdateLanguageServer, Foreground),
@ -261,18 +279,7 @@ messages!(
(UpdateProjectCollaborator, Foreground),
(UpdateWorktree, Foreground),
(UpdateWorktreeSettings, Foreground),
(UpdateDiffBase, Foreground),
(GetPrivateUserInfo, Foreground),
(GetPrivateUserInfoResponse, Foreground),
(GetChannelMembers, Foreground),
(GetChannelMembersResponse, Foreground),
(JoinChannelBuffer, Foreground),
(JoinChannelBufferResponse, Foreground),
(LeaveChannelBuffer, Background),
(UpdateChannelBuffer, Foreground),
(UpdateChannelBufferCollaborators, Foreground),
(AckBufferOperation, Background),
(AckChannelMessage, Background),
(UsersResponse, Foreground),
);
request_messages!(
@ -284,72 +291,78 @@ request_messages!(
(Call, Ack),
(CancelCall, Ack),
(CopyProjectEntry, ProjectEntryResponse),
(CreateChannel, CreateChannelResponse),
(CreateProjectEntry, ProjectEntryResponse),
(CreateRoom, CreateRoomResponse),
(CreateChannel, CreateChannelResponse),
(DeclineCall, Ack),
(DeleteChannel, Ack),
(DeleteProjectEntry, ProjectEntryResponse),
(ExpandProjectEntry, ExpandProjectEntryResponse),
(Follow, FollowResponse),
(FormatBuffers, FormatBuffersResponse),
(FuzzySearchUsers, UsersResponse),
(GetChannelMembers, GetChannelMembersResponse),
(GetChannelMessages, GetChannelMessagesResponse),
(GetChannelMessagesById, GetChannelMessagesResponse),
(GetCodeActions, GetCodeActionsResponse),
(GetHover, GetHoverResponse),
(GetCompletions, GetCompletionsResponse),
(GetDefinition, GetDefinitionResponse),
(GetTypeDefinition, GetTypeDefinitionResponse),
(GetDocumentHighlights, GetDocumentHighlightsResponse),
(GetReferences, GetReferencesResponse),
(GetHover, GetHoverResponse),
(GetNotifications, GetNotificationsResponse),
(GetPrivateUserInfo, GetPrivateUserInfoResponse),
(GetProjectSymbols, GetProjectSymbolsResponse),
(FuzzySearchUsers, UsersResponse),
(GetReferences, GetReferencesResponse),
(GetTypeDefinition, GetTypeDefinitionResponse),
(GetUsers, UsersResponse),
(IncomingCall, Ack),
(InlayHints, InlayHintsResponse),
(InviteChannelMember, Ack),
(JoinChannel, JoinRoomResponse),
(JoinChannelBuffer, JoinChannelBufferResponse),
(JoinChannelChat, JoinChannelChatResponse),
(JoinProject, JoinProjectResponse),
(JoinRoom, JoinRoomResponse),
(JoinChannelChat, JoinChannelChatResponse),
(LeaveChannelBuffer, Ack),
(LeaveRoom, Ack),
(RejoinRoom, RejoinRoomResponse),
(IncomingCall, Ack),
(MarkNotificationRead, Ack),
(MoveChannel, Ack),
(OnTypeFormatting, OnTypeFormattingResponse),
(OpenBufferById, OpenBufferResponse),
(OpenBufferByPath, OpenBufferResponse),
(OpenBufferForSymbol, OpenBufferForSymbolResponse),
(Ping, Ack),
(PerformRename, PerformRenameResponse),
(Ping, Ack),
(PrepareRename, PrepareRenameResponse),
(OnTypeFormatting, OnTypeFormattingResponse),
(InlayHints, InlayHintsResponse),
(ResolveInlayHint, ResolveInlayHintResponse),
(RefreshInlayHints, Ack),
(RejoinChannelBuffers, RejoinChannelBuffersResponse),
(RejoinRoom, RejoinRoomResponse),
(ReloadBuffers, ReloadBuffersResponse),
(RequestContact, Ack),
(RemoveChannelMember, Ack),
(RemoveContact, Ack),
(RespondToContactRequest, Ack),
(RespondToChannelInvite, Ack),
(SetChannelMemberAdmin, Ack),
(SendChannelMessage, SendChannelMessageResponse),
(GetChannelMessages, GetChannelMessagesResponse),
(GetChannelMembers, GetChannelMembersResponse),
(JoinChannel, JoinRoomResponse),
(RemoveChannelMessage, Ack),
(DeleteChannel, Ack),
(RenameProjectEntry, ProjectEntryResponse),
(RemoveContact, Ack),
(RenameChannel, RenameChannelResponse),
(LinkChannel, Ack),
(UnlinkChannel, Ack),
(MoveChannel, Ack),
(RenameProjectEntry, ProjectEntryResponse),
(RequestContact, Ack),
(
ResolveCompletionDocumentation,
ResolveCompletionDocumentationResponse
),
(ResolveInlayHint, ResolveInlayHintResponse),
(RespondToChannelInvite, Ack),
(RespondToContactRequest, Ack),
(SaveBuffer, BufferSaved),
(SearchProject, SearchProjectResponse),
(SendChannelMessage, SendChannelMessageResponse),
(SetChannelMemberRole, Ack),
(SetChannelVisibility, Ack),
(ShareProject, ShareProjectResponse),
(SynchronizeBuffers, SynchronizeBuffersResponse),
(RejoinChannelBuffers, RejoinChannelBuffersResponse),
(Test, Test),
(UpdateBuffer, Ack),
(UpdateParticipantLocation, Ack),
(UpdateProject, Ack),
(UpdateWorktree, Ack),
(JoinChannelBuffer, JoinChannelBufferResponse),
(LeaveChannelBuffer, Ack)
);
entity_messages!(
@ -368,25 +381,26 @@ entity_messages!(
GetCodeActions,
GetCompletions,
GetDefinition,
GetTypeDefinition,
GetDocumentHighlights,
GetHover,
GetReferences,
GetProjectSymbols,
GetReferences,
GetTypeDefinition,
InlayHints,
JoinProject,
LeaveProject,
OnTypeFormatting,
OpenBufferById,
OpenBufferByPath,
OpenBufferForSymbol,
PerformRename,
OnTypeFormatting,
InlayHints,
ResolveInlayHint,
RefreshInlayHints,
PrepareRename,
RefreshInlayHints,
ReloadBuffers,
RemoveProjectCollaborator,
RenameProjectEntry,
ResolveCompletionDocumentation,
ResolveInlayHint,
SaveBuffer,
SearchProject,
StartLanguageServer,
@ -395,19 +409,19 @@ entity_messages!(
UpdateBuffer,
UpdateBufferFile,
UpdateDiagnosticSummary,
UpdateDiffBase,
UpdateLanguageServer,
UpdateProject,
UpdateProjectCollaborator,
UpdateWorktree,
UpdateWorktreeSettings,
UpdateDiffBase
);
entity_messages!(
channel_id,
ChannelMessageSent,
UpdateChannelBuffer,
RemoveChannelMessage,
UpdateChannelBuffer,
UpdateChannelBufferCollaborators,
);

View file

@ -14,7 +14,7 @@ anyhow.workspace = true
backtrace-on-stack-overflow = "0.3.0"
clap = { version = "4.4", features = ["derive", "string"] }
chrono = "0.4"
gpui2 = { path = "../gpui2" }
gpui = { package = "gpui2", path = "../gpui2" }
itertools = "0.11.0"
log.workspace = true
rust-embed.workspace = true
@ -29,4 +29,4 @@ ui = { package = "ui2", path = "../ui2", features = ["stories"] }
util = { path = "../util" }
[dev-dependencies]
gpui2 = { path = "../gpui2", features = ["test-support"] }
gpui = { package = "gpui2", path = "../gpui2", features = ["test-support"] }

View file

@ -1,7 +1,7 @@
use std::borrow::Cow;
use anyhow::{anyhow, Result};
use gpui2::{AssetSource, SharedString};
use gpui::{AssetSource, SharedString};
use rust_embed::RustEmbed;
#[derive(RustEmbed)]

View file

@ -1,97 +0,0 @@
use gpui2::{
div, ArcCow, Element, EventContext, Interactive, IntoElement, MouseButton, ParentElement,
StyleHelpers, ViewContext,
};
use std::{marker::PhantomData, rc::Rc};
struct ButtonHandlers<V, D> {
click: Option<Rc<dyn Fn(&mut V, &D, &mut EventContext<V>)>>,
}
impl<V, D> Default for ButtonHandlers<V, D> {
fn default() -> Self {
Self { click: None }
}
}
#[derive(Component)]
pub struct Button<V: 'static, D: 'static> {
handlers: ButtonHandlers<V, D>,
label: Option<ArcCow<'static, str>>,
icon: Option<ArcCow<'static, str>>,
data: Rc<D>,
view_type: PhantomData<V>,
}
// Impl block for buttons without data.
// See below for an impl block for any button.
impl<V: 'static> Button<V, ()> {
fn new() -> Self {
Self {
handlers: ButtonHandlers::default(),
label: None,
icon: None,
data: Rc::new(()),
view_type: PhantomData,
}
}
pub fn data<D: 'static>(self, data: D) -> Button<V, D> {
Button {
handlers: ButtonHandlers::default(),
label: self.label,
icon: self.icon,
data: Rc::new(data),
view_type: PhantomData,
}
}
}
// Impl block for button regardless of its data type.
impl<V: 'static, D: 'static> Button<V, D> {
pub fn label(mut self, label: impl Into<ArcCow<'static, str>>) -> Self {
self.label = Some(label.into());
self
}
pub fn icon(mut self, icon: impl Into<ArcCow<'static, str>>) -> Self {
self.icon = Some(icon.into());
self
}
pub fn on_click(
mut self,
handler: impl Fn(&mut V, &D, &mut EventContext<V>) + 'static,
) -> Self {
self.handlers.click = Some(Rc::new(handler));
self
}
}
pub fn button<V>() -> Button<V, ()> {
Button::new()
}
impl<V: 'static, D: 'static> Button<V, D> {
fn render(
&mut self,
view: &mut V,
cx: &mut ViewContext<V>,
) -> impl IntoElement<V> + Interactive<V> {
// let colors = &cx.theme::<Theme>().colors;
let button = div()
// .fill(colors.error(0.5))
.h_4()
.children(self.label.clone());
if let Some(handler) = self.handlers.click.clone() {
let data = self.data.clone();
button.on_mouse_down(MouseButton::Left, move |view, event, cx| {
handler(view, data.as_ref(), cx)
})
} else {
button
}
}
}

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