Compare commits

...

15 Commits

Author SHA1 Message Date
cor 1a028d12c5
Merge ef56d34f60 into b01fbb4a22 2025-07-21 12:11:35 -07:00
Alexander Meinhardt Scheurer-Volkmann b01fbb4a22
Fix symlink directories in file explorer (#14028) 2025-07-21 14:10:06 -04:00
MrWheatley f75a26cb9b
added janet indents (#14020) 2025-07-21 14:07:11 -04:00
MrWheatley 21ae1c98fb
fix janet highlights (#14017) 2025-07-21 14:00:21 -04:00
Fea 7b8a4b7a51
feat: Add `kotlin-lsp` to `languages.toml` (#14021) 2025-07-21 14:00:08 -04:00
Yorick Peterse 715d4ae2d5
tree-sitter: update Inko grammar and queries (#14022) 2025-07-21 13:51:50 -04:00
Ivan Shymkiv 22b184b570
Fixed theme location (#14016) 2025-07-19 17:33:47 -05:00
Ivan Shymkiv 665ee4da22
feat(theme): add Gruvbox Material Dark theme variants (#14005) 2025-07-19 15:45:15 -05:00
Ivan Shymkiv ecd18e3eb2
feat(themes): add Gruvbox Material Light theme (#14007) 2025-07-19 15:44:42 -05:00
Poliorcetics e7f95ca6b2
just: bump grammar support to handle module path in aliases and recipes dependencies (#14009) 2025-07-19 15:18:18 -04:00
cor ef56d34f60
chore: fmt 2025-06-25 16:35:23 +02:00
cor 0fa6b1408b
fix: clippy fixes 2025-06-23 19:31:58 +02:00
cor 7d17fd7ba3
fix: show primary cursor when command prompt is active
When the command prompt (:) is active, the terminal cursor moves to the
prompt line, leaving the primary cursor position in the editor invisible.
This change detects when a prompt component is active and forces the
primary cursor to be drawn manually in the editor while the prompt
is shown.

- Add prompt_active field to EditorView to track prompt state
- Update compositor to detect and communicate prompt state to EditorView
- Modify cursor highlighting logic to force primary cursor drawing when prompt is active
- Maintain real terminal cursor for prompt while showing fake cursor in editor
2025-06-23 16:52:27 +02:00
cor 5af123a4d9
fix: address clippy warning about match single binding 2025-06-23 15:17:22 +02:00
cor 395371db51
fix: use real terminal cursor for block mode
Previously, block cursors were always drawn manually as part of the
selection/highlight rendering, which prevented terminal cursor effects
(like cursor trails) from working. This change makes block cursors
behave like bar/underline cursors by using the terminal's real cursor
for the primary selection.

- Skip rendering primary cursor in block mode when terminal is focused
- Let terminal handle primary cursor rendering for all cursor types
- Simplify cursor method to return actual cursor kind when focused

This allows terminal-based cursor effects to work with block cursors
while maintaining proper cursor visibility when the terminal is unfocused.
2025-06-23 15:07:26 +02:00
21 changed files with 406 additions and 160 deletions

View File

@ -112,8 +112,8 @@
| iex | ✓ | | | | | | iex | ✓ | | | | |
| ini | ✓ | | | | | | ini | ✓ | | | | |
| ink | ✓ | | | | | | ink | ✓ | | | | |
| inko | ✓ | ✓ | ✓ | | | | inko | ✓ | ✓ | ✓ | | |
| janet | ✓ | | | | | | janet | ✓ | | | | |
| java | ✓ | ✓ | ✓ | | `jdtls` | | java | ✓ | ✓ | ✓ | | `jdtls` |
| javascript | ✓ | ✓ | ✓ | ✓ | `typescript-language-server` | | javascript | ✓ | ✓ | ✓ | ✓ | `typescript-language-server` |
| jinja | ✓ | | | | | | jinja | ✓ | | | | |

View File

@ -177,7 +177,14 @@ impl Compositor {
} }
pub fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { pub fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) {
// Check if there are prompt layers active and update EditorView
let has_prompt = self.has_component("helix_term::ui::prompt::Prompt");
for layer in &mut self.layers { for layer in &mut self.layers {
// Update prompt state for EditorView
if let Some(editor_view) = layer.as_any_mut().downcast_mut::<crate::ui::EditorView>() {
editor_view.prompt_active = has_prompt;
}
layer.render(area, surface, cx); layer.render(area, surface, cx);
} }
} }

View File

@ -44,6 +44,8 @@ pub struct EditorView {
spinners: ProgressSpinners, spinners: ProgressSpinners,
/// Tracks if the terminal window is focused by reaction to terminal focus events /// Tracks if the terminal window is focused by reaction to terminal focus events
terminal_focused: bool, terminal_focused: bool,
/// Tracks if there are prompt layers active (updated by compositor)
pub prompt_active: bool,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -67,6 +69,7 @@ impl EditorView {
completion: None, completion: None,
spinners: ProgressSpinners::default(), spinners: ProgressSpinners::default(),
terminal_focused: true, terminal_focused: true,
prompt_active: false,
} }
} }
@ -133,7 +136,7 @@ impl EditorView {
if let Some(tabstops) = Self::tabstop_highlights(doc, theme) { if let Some(tabstops) = Self::tabstop_highlights(doc, theme) {
overlays.push(tabstops); overlays.push(tabstops);
} }
overlays.push(Self::doc_selection_highlights( overlays.push(self.doc_selection_highlights(
editor.mode(), editor.mode(),
doc, doc,
view, view,
@ -427,7 +430,8 @@ impl EditorView {
} }
/// Get highlight spans for selections in a document view. /// Get highlight spans for selections in a document view.
pub fn doc_selection_highlights( fn doc_selection_highlights(
&self,
mode: Mode, mode: Mode,
doc: &Document, doc: &Document,
view: &View, view: &View,
@ -481,12 +485,9 @@ impl EditorView {
// Special-case: cursor at end of the rope. // Special-case: cursor at end of the rope.
if range.head == range.anchor && range.head == text.len_chars() { if range.head == range.anchor && range.head == text.len_chars() {
if !selection_is_primary || (cursor_is_block && is_terminal_focused) { if !selection_is_primary || !is_terminal_focused || self.prompt_active {
// Bar and underline cursors are drawn by the terminal // Primary cursor is drawn by the terminal when focused and no prompt is active
// BUG: If the editor area loses focus while having a bar or // Secondary cursors, unfocused primary cursor, and editor cursor when prompt is active are drawn manually
// underline cursor (eg. when a regex prompt has focus) then
// the primary cursor will be invisible. This doesn't happen
// with block cursors since we manually draw *all* cursors.
spans.push((cursor_scope, range.head..range.head + 1)); spans.push((cursor_scope, range.head..range.head + 1));
} }
continue; continue;
@ -504,17 +505,17 @@ impl EditorView {
cursor_start cursor_start
}; };
spans.push((selection_scope, range.anchor..selection_end)); spans.push((selection_scope, range.anchor..selection_end));
// add block cursors // add cursors
// skip primary cursor if terminal is unfocused - crossterm cursor is used in that case // skip primary cursor if terminal is focused and no prompt is active - terminal cursor is used in that case
if !selection_is_primary || (cursor_is_block && is_terminal_focused) { if !selection_is_primary || !is_terminal_focused || self.prompt_active {
spans.push((cursor_scope, cursor_start..range.head)); spans.push((cursor_scope, cursor_start..range.head));
} }
} else { } else {
// Reverse case. // Reverse case.
let cursor_end = next_grapheme_boundary(text, range.head); let cursor_end = next_grapheme_boundary(text, range.head);
// add block cursors // add cursors
// skip primary cursor if terminal is unfocused - crossterm cursor is used in that case // skip primary cursor if terminal is focused and no prompt is active - terminal cursor is used in that case
if !selection_is_primary || (cursor_is_block && is_terminal_focused) { if !selection_is_primary || !is_terminal_focused || self.prompt_active {
spans.push((cursor_scope, range.head..cursor_end)); spans.push((cursor_scope, range.head..cursor_end));
} }
// non block cursors look like they exclude the cursor // non block cursors look like they exclude the cursor
@ -1591,19 +1592,14 @@ impl Component for EditorView {
} }
fn cursor(&self, _area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) { fn cursor(&self, _area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) {
match editor.cursor() { let (pos, kind) = editor.cursor();
// all block cursors are drawn manually
(pos, CursorKind::Block) => {
if self.terminal_focused { if self.terminal_focused {
(pos, CursorKind::Hidden) (pos, kind)
} else { } else {
// use crossterm cursor when terminal loses focus // use underline cursor when terminal loses focus for visibility
(pos, CursorKind::Underline) (pos, CursorKind::Underline)
} }
} }
cursor => cursor,
}
}
} }
fn canonicalize_key(key: &mut KeyEvent) { fn canonicalize_key(key: &mut KeyEvent) {

View File

@ -356,7 +356,7 @@ fn directory_content(path: &Path) -> Result<Vec<(PathBuf, bool)>, std::io::Error
.map(|entry| { .map(|entry| {
( (
entry.path(), entry.path(),
entry.file_type().is_ok_and(|file_type| file_type.is_dir()), std::fs::metadata(entry.path()).is_ok_and(|metadata| metadata.is_dir()),
) )
}) })
.collect(); .collect();

View File

@ -746,7 +746,7 @@ async fn test_hardlink_write() -> anyhow::Result<()> {
async fn edit_file_with_content(file_content: &[u8]) -> anyhow::Result<()> { async fn edit_file_with_content(file_content: &[u8]) -> anyhow::Result<()> {
let mut file = tempfile::NamedTempFile::new()?; let mut file = tempfile::NamedTempFile::new()?;
file.as_file_mut().write_all(&file_content)?; file.as_file_mut().write_all(file_content)?;
helpers::test_key_sequence( helpers::test_key_sequence(
&mut helpers::AppBuilder::new() &mut helpers::AppBuilder::new()

View File

@ -61,6 +61,7 @@ pub struct TestCase {
pub out_text: String, pub out_text: String,
pub out_selection: Selection, pub out_selection: Selection,
#[allow(dead_code)]
pub line_feed_handling: LineFeedHandling, pub line_feed_handling: LineFeedHandling,
} }
@ -425,7 +426,7 @@ pub fn reload_file(file: &mut NamedTempFile) -> anyhow::Result<()> {
let f = std::fs::OpenOptions::new() let f = std::fs::OpenOptions::new()
.write(true) .write(true)
.read(true) .read(true)
.open(&path)?; .open(path)?;
*file.as_file_mut() = f; *file.as_file_mut() = f;
Ok(()) Ok(())
} }

View File

@ -65,6 +65,7 @@ julia = { command = "julia", timeout = 60, args = [ "--startup-file=no", "--hist
just-lsp = { command = "just-lsp" } just-lsp = { command = "just-lsp" }
koka = { command = "koka", args = ["--language-server", "--lsstdio"] } koka = { command = "koka", args = ["--language-server", "--lsstdio"] }
koto-ls = { command = "koto-ls" } koto-ls = { command = "koto-ls" }
kotlin-lsp = { command = "kotlin-lsp", args = ["--stdio"] }
kotlin-language-server = { command = "kotlin-language-server" } kotlin-language-server = { command = "kotlin-language-server" }
lean = { command = "lean", args = [ "--server", "--memory=1024" ] } lean = { command = "lean", args = [ "--server", "--memory=1024" ] }
ltex-ls = { command = "ltex-ls" } ltex-ls = { command = "ltex-ls" }
@ -3068,7 +3069,7 @@ formatter = { command = "inko", args = ["fmt", "-"] }
[[grammar]] [[grammar]]
name = "inko" name = "inko"
source = { git = "https://github.com/inko-lang/tree-sitter-inko", rev = "7860637ce1b43f5f79cfb7cc3311bf3234e9479f" } source = { git = "https://github.com/inko-lang/tree-sitter-inko", rev = "f58a87ac4dc6a7955c64c9e4408fbd693e804686" }
[[language]] [[language]]
name = "bicep" name = "bicep"
@ -3422,7 +3423,7 @@ language-servers = ["just-lsp"]
[[grammar]] [[grammar]]
name = "just" name = "just"
source = { git = "https://github.com/poliorcetics/tree-sitter-just", rev = "8d03cfdd7ab89ff76d935827de1b93450fa0ec0a" } source = { git = "https://github.com/poliorcetics/tree-sitter-just", rev = "0f84211c637813bcf1eb32c9e35847cdaea8760d" }
[[language]] [[language]]
name = "gn" name = "gn"

View File

@ -78,7 +78,7 @@
] @keyword.operator ] @keyword.operator
[ [
"class" "type"
"trait" "trait"
] @keyword.storage.type ] @keyword.storage.type

View File

@ -0,0 +1,14 @@
(class
name: _ @definition.struct)
(trait
name: _ @definition.interface)
(external_function
name: _ @definition.function)
(method
name: _ @definition.function)
(define_constant
name: _ @definition.constant)

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,28 @@
; aligns forms to the second position if there's two in a line:
; (-> 10
; (* 2)
; (print))
(par_tup_lit . (sym_lit) @first . (_) @anchor
(#set! "scope" "tail")
(#same-line? @first @anchor)
; anything that doesn't match should be indented normally
; from https://github.com/janet-lang/spork/blob/5601dc883535473bca28351cc6df04ed6c656c65/spork/fmt.janet#L87C12-L93C38
(#not-match? @first "^(fn|match|with|with-dyns|def|def-|var|var-|defn|defn-|varfn|defmacro|defmacro-|defer|edefer|loop|seq|tabseq|catseq|generate|coro|for|each|eachp|eachk|case|cond|do|defglobal|varglobal|if|when|when-let|when-with|while|with-syms|with-vars|if-let|if-not|if-with|let|short-fn|try|unless|default|forever|upscope|repeat|forv|compwhen|compif|ev/spawn|ev/do-thread|ev/spawn-thread|ev/with-deadline|label|prompt|forever)$")) @align
; everything else should be indented normally:
;
; (let [foo 10]
; (print foo))
;
; (foo
; bar)
(par_tup_lit . (sym_lit)) @indent
; for `{}` and `[]`:
; {:foo 10
; :bar 20}
(struct_lit . (_) @anchor) @align
; [foo
; bar]
(sqr_tup_lit . (_) @anchor) @align

View File

@ -0,0 +1,2 @@
((comment) @injection.content
(#set! injection.language "comment"))

View File

@ -61,6 +61,9 @@
(mod (mod
name: (identifier) @namespace) name: (identifier) @namespace)
(module_path
name: (identifier) @namespace)
; Paths ; Paths
(mod (mod

View File

@ -30,6 +30,9 @@
(function_call (function_call
name: (identifier) @local.reference) name: (identifier) @local.reference)
(module_path
name: (identifier) @local.reference)
(recipe_dependency (recipe_dependency
name: (identifier) @local.reference) name: (identifier) @local.reference)

View File

@ -3,126 +3,4 @@
# Ported by: @satoqz # Ported by: @satoqz
# License: MIT # License: MIT
"attribute" = "green" inherits = "gruvbox_material_dark_medium"
"comment" = { fg = "grey1", modifiers = ["italic"] }
"constant" = "fg0"
"constant.builtin" = "purple"
"constant.character.escape" = "green"
"constant.numeric" = "purple"
"constructor" = "green"
"function" = "green"
"keyword" = "red"
"keyword.directive" = "purple"
"keyword.operator" = "orange"
"label" = "red"
"namespace" = "yellow"
"operator" = "orange"
"punctuation" = "grey1"
"punctuation.bracket" = "fg0"
"punctuation.delimiter" = "grey1"
"punctuation.special" = "blue"
"special" = "green"
"string" = "aqua"
"string.regexp" = "green"
"string.special.path" = "yellow"
"string.special.symbol" = "fg0"
"string.special.url" = { fg = "fg0", modifiers = ["underlined"] }
"tag" = "orange"
"type" = "yellow"
"type.enum.variant" = "purple"
"variable" = "fg0"
"variable.builtin" = "purple"
"variable.other.member" = "blue"
"variable.parameter" = "fg0"
"markup.heading.1" = "red"
"markup.heading.2" = "orange"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "blue"
"markup.heading.6" = "purple"
"markup.bold" = { fg = "fg0", modifiers = ["bold"] }
"markup.italic" = { fg = "fg0", modifiers = ["italic"] }
"markup.strikethrough" = { fg = "fg0", modifiers = ["crossed_out"] }
"markup.link.label" = "blue"
"markup.link.text" = "yellow"
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.list" = "blue"
"markup.list.checked" = "green"
"markup.list.unchecked" = "grey1"
"markup.quote" = "grey1"
"markup.raw" = "green"
"diff.delta" = "blue"
"diff.minus" = "red"
"diff.plus" = "green"
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.hint" = { underline = { color = "green", style = "curl" } }
"diagnostic.info" = { underline = { color = "blue", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
error = "red"
hint = "green"
info = "blue"
warning = "yellow"
"ui.background" = { fg = "fg0", bg = "bg0" }
"ui.bufferline" = { fg = "fg1", bg = "bg4" }
"ui.bufferline.active" = { fg = "bg0", bg = "grey2" }
"ui.bufferline.background" = { bg = "bg1" }
"ui.cursor" = { fg = "bg0", bg = "grey1" }
"ui.cursor.primary" = { fg = "bg0", bg = "fg0" }
"ui.cursor.match" = { bg = "bg2" }
"ui.cursorline.primary" = { bg = "bg1" }
"ui.help" = { fg = "grey1", bg = "bg0" }
"ui.highlight" = { bg = "bg2" }
"ui.linenr" = "bg3"
"ui.linenr.selected" = "grey1"
"ui.menu" = { fg = "fg1", bg = "bg2" }
"ui.menu.scroll" = { fg = "grey0", bg = "bg1" }
"ui.menu.selected" = { fg = "bg2", bg = "grey2" }
"ui.popup" = { fg = "fg1", bg = "bg2" }
"ui.popup.info" = { "fg" = "grey1", bg = "bg0" }
"ui.selection" = { bg = "bg2" }
"ui.statusline" = { fg = "fg1", bg = "bg1" }
"ui.statusline.inactive" = { fg = "grey1", bg = "bg1" }
"ui.statusline.insert" = { fg = "bg0", bg = "green" }
"ui.statusline.normal" = { fg = "bg0", bg = "grey2" }
"ui.statusline.select" = { fg = "bg0", bg = "red" }
"ui.text" = "fg0"
"ui.text.directory" = { fg = "blue" }
"ui.text.focus" = { bg = "bg2" }
"ui.text.inactive" = { fg = "grey1" }
"ui.text.info" = "grey1"
"ui.virtual" = "grey0"
"ui.virtual.indent-guide" = "bg3"
"ui.virtual.inlay-hint" = "grey0"
"ui.virtual.jump-label" = "grey2"
"ui.virtual.ruler" = { bg = "bg1" }
"ui.window" = { fg = "bg3" }
[palette]
fg0 = "#d4be98"
fg1 = "#ddc7a1"
bg0 = "#282828"
bg1 = "#32302f"
bg2 = "#45403d"
bg3 = "#5a524c"
bg4 = "#504945"
grey0 = "#7c6f64"
grey1 = "#928374"
grey2 = "#a89984"
aqua = "#89b482"
blue = "#7daea3"
green = "#a9b665"
orange = "#e78a4e"
purple = "#d3869b"
red = "#ea6962"
yellow = "#d8a657"

View File

@ -0,0 +1,13 @@
# Gruvbox Material Dark Hard for Helix
# Original Author: @sainnhe (https://github.com/sainnhe/gruvbox-material)
# Base theme ported by: @satoqz
# Palette ported by: @ivan-shymkiv
# License: MIT
inherits = "gruvbox_material_dark_medium"
[palette]
bg0 = "#1d2021"
bg1 = "#282828"
bg2 = "#3c3836"
bg3 = "#504945"

View File

@ -0,0 +1,128 @@
# Gruvbox Material Dark Medium for Helix
# Original Author: @sainnhe (https://github.com/sainnhe/gruvbox-material)
# Ported by: @satoqz
# License: MIT
"attribute" = "green"
"comment" = { fg = "grey1", modifiers = ["italic"] }
"constant" = "fg0"
"constant.builtin" = "purple"
"constant.character.escape" = "green"
"constant.numeric" = "purple"
"constructor" = "green"
"function" = "green"
"keyword" = "red"
"keyword.directive" = "purple"
"keyword.operator" = "orange"
"label" = "red"
"namespace" = "yellow"
"operator" = "orange"
"punctuation" = "grey1"
"punctuation.bracket" = "fg0"
"punctuation.delimiter" = "grey1"
"punctuation.special" = "blue"
"special" = "green"
"string" = "aqua"
"string.regexp" = "green"
"string.special.path" = "yellow"
"string.special.symbol" = "fg0"
"string.special.url" = { fg = "fg0", modifiers = ["underlined"] }
"tag" = "orange"
"type" = "yellow"
"type.enum.variant" = "purple"
"variable" = "fg0"
"variable.builtin" = "purple"
"variable.other.member" = "blue"
"variable.parameter" = "fg0"
"markup.heading.1" = "red"
"markup.heading.2" = "orange"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "blue"
"markup.heading.6" = "purple"
"markup.bold" = { fg = "fg0", modifiers = ["bold"] }
"markup.italic" = { fg = "fg0", modifiers = ["italic"] }
"markup.strikethrough" = { fg = "fg0", modifiers = ["crossed_out"] }
"markup.link.label" = "blue"
"markup.link.text" = "yellow"
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.list" = "blue"
"markup.list.checked" = "green"
"markup.list.unchecked" = "grey1"
"markup.quote" = "grey1"
"markup.raw" = "green"
"diff.delta" = "blue"
"diff.minus" = "red"
"diff.plus" = "green"
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.hint" = { underline = { color = "green", style = "curl" } }
"diagnostic.info" = { underline = { color = "blue", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
error = "red"
hint = "green"
info = "blue"
warning = "yellow"
"ui.background" = { fg = "fg0", bg = "bg0" }
"ui.bufferline" = { fg = "fg1", bg = "bg4" }
"ui.bufferline.active" = { fg = "bg0", bg = "grey2" }
"ui.bufferline.background" = { bg = "bg1" }
"ui.cursor" = { fg = "bg0", bg = "grey1" }
"ui.cursor.primary" = { fg = "bg0", bg = "fg0" }
"ui.cursor.match" = { bg = "bg2" }
"ui.cursorline.primary" = { bg = "bg1" }
"ui.help" = { fg = "grey1", bg = "bg0" }
"ui.highlight" = { bg = "bg2" }
"ui.linenr" = "bg3"
"ui.linenr.selected" = "grey1"
"ui.menu" = { fg = "fg1", bg = "bg2" }
"ui.menu.scroll" = { fg = "grey0", bg = "bg1" }
"ui.menu.selected" = { fg = "bg2", bg = "grey2" }
"ui.popup" = { fg = "fg1", bg = "bg2" }
"ui.popup.info" = { "fg" = "grey1", bg = "bg0" }
"ui.selection" = { bg = "bg2" }
"ui.statusline" = { fg = "fg1", bg = "bg1" }
"ui.statusline.inactive" = { fg = "grey1", bg = "bg1" }
"ui.statusline.insert" = { fg = "bg0", bg = "green" }
"ui.statusline.normal" = { fg = "bg0", bg = "grey2" }
"ui.statusline.select" = { fg = "bg0", bg = "red" }
"ui.text" = "fg0"
"ui.text.directory" = { fg = "blue" }
"ui.text.focus" = { bg = "bg2" }
"ui.text.inactive" = { fg = "grey1" }
"ui.text.info" = "grey1"
"ui.virtual" = "grey0"
"ui.virtual.indent-guide" = "bg3"
"ui.virtual.inlay-hint" = "grey0"
"ui.virtual.jump-label" = "grey2"
"ui.virtual.ruler" = { bg = "bg1" }
"ui.window" = { fg = "bg3" }
[palette]
fg0 = "#d4be98"
fg1 = "#ddc7a1"
bg0 = "#282828"
bg1 = "#32302f"
bg2 = "#45403d"
bg3 = "#5a524c"
bg4 = "#504945"
grey0 = "#7c6f64"
grey1 = "#928374"
grey2 = "#a89984"
aqua = "#89b482"
blue = "#7daea3"
green = "#a9b665"
orange = "#e78a4e"
purple = "#d3869b"
red = "#ea6962"
yellow = "#d8a657"

View File

@ -0,0 +1,14 @@
# Gruvbox Material Dark Soft for Helix
# Original Author: @sainnhe (https://github.com/sainnhe/gruvbox-material)
# Base theme ported by: @satoqz
# Palette ported by: @ivan-shymkiv
# License: MIT
inherits = "gruvbox_material_dark_medium"
[palette]
bg0 = "#32302f"
bg1 = "#3c3836"
bg2 = "#504945"
bg3 = "#665c54"
bg4 = "#5b534d"

View File

@ -0,0 +1,14 @@
# Gruvbox Material Light Hard for Helix
# Original Author: @sainnhe (https://github.com/sainnhe/gruvbox-material)
# Base theme ported by: @satoqz
# Palette ported by: @ivan-shymkiv
# License: MIT
inherits = "gruvbox_material_light_medium"
[palette]
bg0 = "#f9f5d7"
bg1 = "#f5edca"
bg2 = "#f2e5bc"
bg3 = "#ebdbb2"
bg4 = "#eee0b7"

View File

@ -0,0 +1,129 @@
# Gruvbox Material Light Medium for Helix
# Original Author: @sainnhe (https://github.com/sainnhe/gruvbox-material)
# Base theme ported by: @satoqz
# Palette ported by: @ivan-shymkiv
# License: MIT
"attribute" = "green"
"comment" = { fg = "grey1", modifiers = ["italic"] }
"constant" = "fg0"
"constant.builtin" = "purple"
"constant.character.escape" = "green"
"constant.numeric" = "purple"
"constructor" = "green"
"function" = "green"
"keyword" = "red"
"keyword.directive" = "purple"
"keyword.operator" = "orange"
"label" = "red"
"namespace" = "yellow"
"operator" = "orange"
"punctuation" = "grey1"
"punctuation.bracket" = "fg0"
"punctuation.delimiter" = "grey1"
"punctuation.special" = "blue"
"special" = "green"
"string" = "aqua"
"string.regexp" = "green"
"string.special.path" = "yellow"
"string.special.symbol" = "fg0"
"string.special.url" = { fg = "fg0", modifiers = ["underlined"] }
"tag" = "orange"
"type" = "yellow"
"type.enum.variant" = "purple"
"variable" = "fg0"
"variable.builtin" = "purple"
"variable.other.member" = "blue"
"variable.parameter" = "fg0"
"markup.heading.1" = "red"
"markup.heading.2" = "orange"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "blue"
"markup.heading.6" = "purple"
"markup.bold" = { fg = "fg0", modifiers = ["bold"] }
"markup.italic" = { fg = "fg0", modifiers = ["italic"] }
"markup.strikethrough" = { fg = "fg0", modifiers = ["crossed_out"] }
"markup.link.label" = "blue"
"markup.link.text" = "yellow"
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.list" = "blue"
"markup.list.checked" = "green"
"markup.list.unchecked" = "grey1"
"markup.quote" = "grey1"
"markup.raw" = "green"
"diff.delta" = "blue"
"diff.minus" = "red"
"diff.plus" = "green"
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.hint" = { underline = { color = "green", style = "curl" } }
"diagnostic.info" = { underline = { color = "blue", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
error = "red"
hint = "green"
info = "blue"
warning = "yellow"
"ui.background" = { fg = "fg0", bg = "bg0" }
"ui.bufferline" = { fg = "fg1", bg = "bg4" }
"ui.bufferline.active" = { fg = "bg0", bg = "grey2" }
"ui.bufferline.background" = { bg = "bg1" }
"ui.cursor" = { fg = "bg0", bg = "grey1" }
"ui.cursor.primary" = { fg = "bg0", bg = "fg0" }
"ui.cursor.match" = { bg = "bg2" }
"ui.cursorline.primary" = { bg = "bg1" }
"ui.help" = { fg = "grey1", bg = "bg0" }
"ui.highlight" = { bg = "bg2" }
"ui.linenr" = "bg3"
"ui.linenr.selected" = "grey1"
"ui.menu" = { fg = "fg1", bg = "bg2" }
"ui.menu.scroll" = { fg = "grey0", bg = "bg1" }
"ui.menu.selected" = { fg = "bg2", bg = "grey2" }
"ui.popup" = { fg = "fg1", bg = "bg2" }
"ui.popup.info" = { "fg" = "grey1", bg = "bg0" }
"ui.selection" = { bg = "bg2" }
"ui.statusline" = { fg = "fg1", bg = "bg1" }
"ui.statusline.inactive" = { fg = "grey1", bg = "bg1" }
"ui.statusline.insert" = { fg = "bg0", bg = "green" }
"ui.statusline.normal" = { fg = "bg0", bg = "grey2" }
"ui.statusline.select" = { fg = "bg0", bg = "red" }
"ui.text" = "fg0"
"ui.text.directory" = { fg = "blue" }
"ui.text.focus" = { bg = "bg2" }
"ui.text.inactive" = { fg = "grey1" }
"ui.text.info" = "grey1"
"ui.virtual" = "grey0"
"ui.virtual.indent-guide" = "bg3"
"ui.virtual.inlay-hint" = "grey0"
"ui.virtual.jump-label" = "grey2"
"ui.virtual.ruler" = { bg = "bg1" }
"ui.window" = { fg = "bg3" }
[palette]
fg0 = "#654735"
fg1 = "#4f3829"
bg0 = "#fbf1c7"
bg1 = "#f4e8be"
bg2 = "#eee0b7"
bg3 = "#ddccab"
bg4 = "#e5d5ad"
grey0 = "#a89984"
grey1 = "#928374"
grey2 = "#7c6f64"
aqua = "#4c7a5d"
blue = "#45707a"
green = "#6c782e"
orange = "#c35e0a"
purple = "#945e80"
red = "#c14a4a"
yellow = "#b47109"

View File

@ -0,0 +1,14 @@
# Gruvbox Material Light Soft for Helix
# Original Author: @sainnhe (https://github.com/sainnhe/gruvbox-material)
# Base theme ported by: @satoqz
# Palette ported by: @ivan-shymkiv
# License: MIT
inherits = "gruvbox_material_light_medium"
[palette]
bg0 = "#f2e5bc"
bg1 = "#eddeb5"
bg2 = "#e6d5ae"
bg3 = "#d5c4a1"
bg4 = "#dac9a5"