From baea9cd9ff35f8be6ae63a6fb25e7e64cb29bc5b Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Wed, 11 Nov 2026 15:16:12 +0700 Subject: [PATCH] themes: add bundled theme registry and picker --- Cargo.lock | 76 +-- Cargo.toml | 3 - assets/themes/adventure.json | 307 +++++++++ assets/themes/alduin.json | 148 ++++ assets/themes/asciinema.json | 147 ++++ assets/themes/aurora.json | 246 +++++++ assets/themes/ayu.json | 459 +++++++++++++ assets/themes/catppuccin.json | 829 +++++++++++++++++++++++ assets/themes/everforest.json | 286 ++++++++ assets/themes/fahrenheit.json | 137 ++++ assets/themes/flexoki.json | 307 +++++++++ assets/themes/gruvbox.json | 302 +++++++++ assets/themes/harper.json | 150 ++++ assets/themes/hybrid.json | 303 +++++++++ assets/themes/jellybeans.json | 147 ++++ assets/themes/kibble.json | 157 +++++ assets/themes/macos-classic.json | 288 ++++++++ assets/themes/mellifluous.json | 330 +++++++++ assets/themes/molokai.json | 283 ++++++++ assets/themes/solarized.json | 291 ++++++++ assets/themes/spaceduck.json | 148 ++++ assets/themes/tokyonight.json | 421 ++++++++++++ assets/themes/twilight.json | 141 ++++ crates/assets/Cargo.toml | 3 + crates/assets/src/lib.rs | 27 + crates/settings/src/lib.rs | 426 ++++++++---- crates/workspace/src/dialogs/settings.rs | 69 +- crates/workspace/src/lib.rs | 111 ++- crates/workspace/src/sidebar/header.rs | 1 + desktop/Cargo.toml | 3 - desktop/src/main.rs | 89 +-- web/src/lib.rs | 22 +- 32 files changed, 6348 insertions(+), 309 deletions(-) create mode 100644 assets/themes/adventure.json create mode 100644 assets/themes/alduin.json create mode 100644 assets/themes/asciinema.json create mode 100644 assets/themes/aurora.json create mode 100644 assets/themes/ayu.json create mode 100644 assets/themes/catppuccin.json create mode 100644 assets/themes/everforest.json create mode 100644 assets/themes/fahrenheit.json create mode 100644 assets/themes/flexoki.json create mode 100644 assets/themes/gruvbox.json create mode 100644 assets/themes/harper.json create mode 100644 assets/themes/hybrid.json create mode 100644 assets/themes/jellybeans.json create mode 100644 assets/themes/kibble.json create mode 100644 assets/themes/macos-classic.json create mode 100644 assets/themes/mellifluous.json create mode 100644 assets/themes/molokai.json create mode 100644 assets/themes/solarized.json create mode 100644 assets/themes/spaceduck.json create mode 100644 assets/themes/tokyonight.json create mode 100644 assets/themes/twilight.json diff --git a/Cargo.lock b/Cargo.lock index 3362e729..fca25d88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -385,6 +385,7 @@ dependencies = [ "gpui-kit", "gpui-pre", "rust-embed", + "serde_json", ] [[package]] @@ -1707,12 +1708,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "configparser" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031ad3d167622974ed636505ae4556267ed4aa2aea0464122fa6bc9698a32825" - [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -1811,7 +1806,6 @@ dependencies = [ "auto_update", "chat", "chat_ui", - "flume 0.11.1", "gpui-kit", "gpui-pre", "gpui-pre-linux", @@ -1820,8 +1814,6 @@ dependencies = [ "gpui-pre-reqwest-client", "gpui-pre-windows", "log", - "native-theme", - "native-theme-gpui", "nip29", "nip4e", "nip60", @@ -3677,7 +3669,7 @@ dependencies = [ "parking", "parking_lot", "pin-project", - "pollster 0.4.0", + "pollster", "profiling", "rand 0.9.5", "raw-window-handle", @@ -5937,62 +5929,6 @@ dependencies = [ "thiserror 2.0.21", ] -[[package]] -name = "native-theme" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2a6c2d7520b94d53802c0c94d0450280a7c10380246756661bd1c6ffc64dd1" -dependencies = [ - "arc-swap", - "ashpd", - "async-io", - "async-trait", - "block2 0.6.2", - "configparser", - "fontdb", - "inventory", - "native-theme-derive", - "notify", - "objc2 0.6.5", - "objc2-app-kit 0.3.2", - "objc2-core-foundation", - "objc2-core-text", - "objc2-foundation 0.3.2", - "pollster 1.0.1", - "serde", - "serde_with", - "toml 1.2.1+spec-1.1.0", - "unicase", - "windows 0.62.2", - "windows-version", - "zbus 5.19.0", -] - -[[package]] -name = "native-theme-derive" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba9ec586e35be9d05bdd279adc9cbe213b5bd630536b8066b82caaaf4021dba7" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.10", -] - -[[package]] -name = "native-theme-gpui" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e13cbaa86f1f0a1ac947380f5d8d47a5e9f7f939c77afd05d7039041abae146" -dependencies = [ - "gpui-base", - "gpui-component", - "gpui-kit", - "gpui-pre", - "image", - "native-theme", -] - [[package]] name = "native-tls" version = "0.2.18" @@ -6799,8 +6735,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ "bitflags 2.13.2", - "block2 0.6.2", - "libc", "objc2 0.6.5", "objc2-core-foundation", "objc2-core-graphics", @@ -7605,12 +7539,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" -[[package]] -name = "pollster" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6355899e1c9462875b6757c79f3caa011a1fdae12bbb1a2e72dd1f234f8336" - [[package]] name = "poly1305" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index e1e5da7a..5183037a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,6 @@ gpui_tokio = { path = "crates/gpui_tokio" } gpui-base = "0.8.1" gpui-kit = "0.8.1" -native-theme = { version = "0.7", features = ["native", "watch"] } -native-theme-gpui = { version = "0.7", default-features = false, features = ["system-fonts"] } - # Nostr nostr-lmdb = { git = "https://github.com/rust-nostr/nostr" } nostr-memory = { git = "https://github.com/rust-nostr/nostr" } diff --git a/assets/themes/adventure.json b/assets/themes/adventure.json new file mode 100644 index 00000000..35dddad2 --- /dev/null +++ b/assets/themes/adventure.json @@ -0,0 +1,307 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Adventure", + "author": "iTerm2-Color-Schemes", + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "themes": [ + { + "name": "Adventure", + "mode": "dark", + "colors": { + "accent.background": "#25292d", + "accent.foreground": "#feffff", + "background": "#040404", + "border": "#282828", + "danger.background": "#d84a33", + "foreground": "#feffff", + "input.border": "#333333", + "link.active.foreground": "#417AB3", + "link.foreground": "#417AB3", + "link.hover.foreground": "#417AB3", + "list.active.background": "#5da60222", + "list.active.border": "#5da602", + "list.even.background": "#0e0e0e", + "muted.background": "#171717", + "muted.foreground": "#5d6165", + "panel.background": "#003a5b", + "popover.background": "#040404", + "popover.foreground": "#feffff", + "primary.active.background": "#0265a799", + "primary.background": "#4384ad", + "primary.foreground": "#feffff", + "primary.hover.background": "#417AB3", + "scrollbar.background": "#003a5b00", + "scrollbar.thumb.background": "#606060", + "secondary.background": "#171a1c", + "secondary.active.background": "#191d1e", + "secondary.foreground": "#e4d5c7", + "secondary.hover.background": "#1e2224", + "tab.active.background": "#040404", + "tab.active.foreground": "#feffff", + "tab.background": "#04040400", + "tab.foreground": "#677179", + "tab_bar.background": "#040404", + "table.background": "#040404", + "table.head.foreground": "#feffffb3", + "table.row.border": "#4b647970", + "title_bar.background": "#0f1112", + "title_bar.border": "#282828", + "ring": "#5da602", + "base.red": "#d84a33", + "base.red.light": "#d76b42", + "base.green": "#5da602", + "base.green.light": "#99b52c", + "base.blue": "#417ab3", + "base.blue.light": "#97d7ef", + "base.cyan": "#41b3a9", + "base.cyan.light": "#97efd6", + "base.magenta": "#882252", + "base.magenta.light": "#e599bc", + "base.yellow": "#aa7900", + "base.yellow.light": "#ffb670" + }, + "highlight": { + "editor.foreground": "#feffff", + "editor.background": "#040404", + "editor.active_line.background": "#0e0e0e", + "editor.line_number": "#5d6165", + "editor.active_line_number": "#feffff", + "editor.invisible": "#5d616566", + "conflict": "#d84a33", + "created": "#5da602", + "deleted": "#d84a33", + "error": "#d84a33", + "hidden": "#5d6165", + "hint": "#99b52c", + "ignored": "#5d6165", + "info": "#417ab3", + "modified": "#eebb6e", + "predictive": "#5d6165", + "renamed": "#5da602", + "success": "#5da602", + "unreachable": "#5d6165", + "warning": "#eebb6e", + "syntax": { + "attribute": { + "color": "#eebb6e" + }, + "boolean": { + "color": "#5da602" + }, + "comment": { + "color": "#5d6165", + "font_style": "italic" + }, + "comment.doc": { + "color": "#5d6165", + "font_style": "italic" + }, + "constant": { + "color": "#d84a33" + }, + "constructor": { + "color": "#eebb6e" + }, + "embedded": { + "color": "#feffff" + }, + "function": { + "color": "#5da602" + }, + "keyword": { + "color": "#417ab3" + }, + "link_text": { + "color": "#97d7ef", + "font_style": "normal" + }, + "link_uri": { + "color": "#4b6479", + "font_style": "italic" + }, + "number": { + "color": "#d84a33" + }, + "string": { + "color": "#5da602" + }, + "string.escape": { + "color": "#5da602" + }, + "string.regex": { + "color": "#5da602" + }, + "string.special": { + "color": "#eebb6e" + }, + "string.special.symbol": { + "color": "#eebb6e" + }, + "tag": { + "color": "#eebb6e" + }, + "text.literal": { + "color": "#d84a33" + }, + "title": { + "color": "#97d7ef", + "font_weight": 600 + }, + "type": { + "color": "#eebb6e" + }, + "property": { + "color": "#feffff" + }, + "variable.special": { + "color": "#d84a33" + } + } + } + }, + { + "name": "Adventure Time", + "mode": "dark", + "colors": { + "accent.background": "#36345f", + "accent.foreground": "#C7C7D4", + "background": "#1f1d45", + "border": "#333150", + "foreground": "#C7C7D4", + "input.border": "#555465", + "link.active.foreground": "#4b61bf", + "link.foreground": "#5f72c6", + "link.hover.foreground": "#8593d3", + "list.active.background": "#4ab11822", + "list.active.border": "#549235", + "list.even.background": "#1c1a37", + "muted.background": "#29274a", + "muted.foreground": "#717192", + "panel.background": "#003a5b", + "popover.background": "#1f1d45", + "popover.foreground": "#C7C7D4", + "primary.active.background": "#5f72c699", + "primary.background": "#5f72c6", + "primary.foreground": "#ffffff", + "primary.hover.background": "#5f72c6aa", + "scrollbar.background": "#003a5b00", + "scrollbar.thumb.background": "#555465", + "secondary.background": "#2e2c51", + "secondary.active.background": "#36345f", + "secondary.foreground": "#C7C7D4", + "secondary.hover.background": "#34325b", + "tab.active.background": "#1f1d45", + "tab.active.foreground": "#C7C7D4", + "tab.background": "#1f1d4500", + "tab.foreground": "#aeab9e", + "tab_bar.background": "#1f1d45", + "table.active.background": "#4ab11811", + "table.active.border": "#549235", + "table.head.foreground": "#f8dcc0b3", + "table.row.border": "#333333", + "title_bar.background": "#1c1a3e", + "title_bar.border": "#333150", + "base.red": "#a02733", + "base.red.light": "#fc5f5a", + "base.green": "#549235", + "base.green.light": "#9eff6e", + "base.blue": "#2b53ab", + "base.blue.light": "#1997c6", + "base.cyan": "#26977b", + "base.cyan.light": "#5afcd4", + "base.magenta": "#665993", + "base.magenta.light": "#9b5953", + "base.yellow": "#ce7837", + "base.yellow.light": "#efc11a" + }, + "highlight": { + "editor.foreground": "#f8dcc0", + "editor.background": "#1f1d45", + "editor.active_line.background": "#36345f", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#5d616566", + "conflict": "#D2602D", + "created": "#3f72e2", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "modified": "#B0A878", + "predictive": "#5D5945", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/alduin.json b/assets/themes/alduin.json new file mode 100644 index 00000000..e266a292 --- /dev/null +++ b/assets/themes/alduin.json @@ -0,0 +1,148 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Alduin", + "author": "AlessandroYorba", + "url": "https://github.com/AlessandroYorba/Alduin", + "themes": [ + { + "name": "Alduin", + "mode": "dark", + "colors": { + "accent.background": "#2e2b29", + "accent.foreground": "#ebdbb2", + "background": "#1C1C1C", + "border": "#3a3a3a", + "danger.background": "#cc241d", + "danger.active.background": "#cc241d", + "danger.hover.background": "#fb4934", + "foreground": "#9E9E9E", + "input.border": "#504945", + "link.active.foreground": "#83a598", + "link.foreground": "#83a598", + "link.hover.foreground": "#83a598", + "list.active.background": "#262626", + "list.active.border": "#9E9E9E", + "list.even.background": "#262626", + "list.head.background": "#1C1C1C", + "muted.background": "#262626", + "muted.foreground": "#878787", + "panel.background": "#282828", + "primary.active.background": "#45858899", + "primary.background": "#458588", + "primary.foreground": "#F0F0F0", + "primary.hover.background": "#458588AA", + "scrollbar.background": "#28282800", + "scrollbar.thumb.background": "#504945", + "secondary.background": "#282828", + "secondary.active.background": "#35322f", + "secondary.foreground": "#9E9E9E", + "secondary.hover.background": "#36323099", + "tab.active.background": "#1C1C1C", + "tab.active.foreground": "#ebdbb2", + "tab.background": "#14141400", + "tab.foreground": "#848382", + "table.row.border": "#50494570", + "title_bar.background": "#262626", + "title_bar.border": "#3a3a3a", + "ring": "#9E9E9E", + "base.blue": "#87afaf", + "base.cyan": "#878787", + "base.green": "#7a875f", + "base.magenta": "#af8787", + "base.magenta.light": "#af878788", + "base.red": "#8b5f61", + "base.yellow": "#9d906c" + }, + "highlight": { + "editor.foreground": "#DDDDDD", + "editor.background": "#000000", + "editor.active_line.background": "#131313", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#9E9E9E66", + "conflict": "#8b5f61", + "created": "#87afaf", + "error": "#8b5f61", + "hidden": "#9E9E9E", + "hint": "#af8787", + "info": "#878787", + "modified": "#B0A878", + "predictive": "#5D5945", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/asciinema.json b/assets/themes/asciinema.json new file mode 100644 index 00000000..5858e8a1 --- /dev/null +++ b/assets/themes/asciinema.json @@ -0,0 +1,147 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Asciinema", + "author": "asciinema.org", + "url": "https://asciinema.org", + "themes": [ + { + "name": "Asciinema", + "mode": "dark", + "colors": { + "accent.background": "#262829", + "accent.foreground": "#cccccc", + "background": "#121314", + "border": "#303030", + "danger.background": "#dd3c69", + "danger.active.background": "#dd3c69", + "danger.hover.background": "#e94f7a", + "foreground": "#cccccc", + "input.border": "#3a3a3a", + "link.active.foreground": "#26b0d7", + "link.foreground": "#26b0d7", + "link.hover.foreground": "#3cc0e7", + "list.active.background": "#1a1b1c", + "list.active.border": "#cccccc", + "list.even.background": "#1a1b1c", + "list.head.background": "#121314", + "muted.background": "#1a1b1c", + "muted.foreground": "#6d6d6d", + "panel.background": "#181919", + "primary.active.background": "#26b0d799", + "primary.background": "#26b0d7", + "primary.foreground": "#ffffff", + "primary.hover.background": "#26b0d7AA", + "scrollbar.background": "#12131400", + "scrollbar.thumb.background": "#2a2a2a", + "secondary.background": "#181919", + "secondary.active.background": "#1f2020", + "secondary.foreground": "#cccccc", + "secondary.hover.background": "#1f202099", + "tab.active.background": "#121314", + "tab.active.foreground": "#cccccc", + "tab.background": "#12131400", + "tab.foreground": "#6d6d6d", + "table.row.border": "#2a2a2a70", + "title_bar.background": "#181919", + "title_bar.border": "#303030", + "ring": "#5d5d5d", + "base.blue": "#26b0d7", + "base.cyan": "#54e1b9", + "base.green": "#4ebf22", + "base.magenta": "#b954e1", + "base.red": "#dd3c69", + "base.yellow": "#ddaf3c" + }, + "highlight": { + "editor.foreground": "#cccccc", + "editor.background": "#121314", + "editor.active_line.background": "#1a1b1c", + "editor.line_number": "#6d6d6d", + "editor.active_line_number": "#cccccc", + "editor.invisible": "#6d6d6d66", + "conflict": "#dd3c69", + "created": "#4ebf22", + "error": "#dd3c69", + "hidden": "#6d6d6d", + "hint": "#b954e1", + "info": "#26b0d7", + "modified": "#ddaf3c", + "predictive": "#2a2a2a", + "syntax": { + "attribute": { + "color": "#ddaf3c" + }, + "boolean": { + "color": "#b954e1" + }, + "comment": { + "color": "#5d5d5d" + }, + "comment.doc": { + "color": "#5d5d5d" + }, + "constant": { + "color": "#b954e1" + }, + "constructor": { + "color": "#26b0d7" + }, + "embedded": { + "color": "#cccccc" + }, + "function": { + "color": "#54e1b9" + }, + "keyword": { + "color": "#dd3c69" + }, + "link_text": { + "color": "#26b0d7", + "font_style": "normal" + }, + "link_uri": { + "color": "#54e1b9", + "font_style": "italic" + }, + "number": { + "color": "#b954e1" + }, + "string": { + "color": "#4ebf22" + }, + "string.escape": { + "color": "#54e1b9" + }, + "string.regex": { + "color": "#4ebf22" + }, + "string.special": { + "color": "#ddaf3c" + }, + "string.special.symbol": { + "color": "#ddaf3c" + }, + "tag": { + "color": "#dd3c69" + }, + "text.literal": { + "color": "#cccccc" + }, + "title": { + "color": "#ddaf3c", + "font_weight": 600 + }, + "type": { + "color": "#26b0d7" + }, + "property": { + "color": "#cccccc" + }, + "variable.special": { + "color": "#dd3c69" + } + } + } + } + ] +} diff --git a/assets/themes/aurora.json b/assets/themes/aurora.json new file mode 100644 index 00000000..c8c63936 --- /dev/null +++ b/assets/themes/aurora.json @@ -0,0 +1,246 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Aurora", + "author": "Longbridge", + "url": "https://github.com/longbridge/gpui-kit", + "themes": [ + { + "name": "Aurora Light", + "mode": "light", + "colors": { + "accent.background": "#F1F5F9", + "accent.foreground": "#0F172A", + "accordion.background": "#FFFFFF", + "accordion.hover.background": "#F8FAFC", + "background": "#FFFFFF", + "border": "#E2E8F0", + "button.background": "linear-gradient(180deg, #FFFFFF, #F8FAFC)", + "button.hover.background": "linear-gradient(180deg, #F8FAFC, #F1F5F9)", + "button.active.background": "linear-gradient(180deg, #F1F5F9, #E2E8F0)", + "button.foreground": "#0F172A", + "button.primary.background": "linear-gradient(180deg, #1E293B, #0F172A)", + "button.primary.hover.background": "linear-gradient(180deg, #334155, #1E293B)", + "button.primary.active.background": "linear-gradient(180deg, #0F172A, #020617)", + "button.primary.foreground": "#F8FAFC", + "button.secondary.background": "linear-gradient(180deg, #F1F5F9, #E2E8F0)", + "button.secondary.hover.background": "linear-gradient(180deg, #E2E8F0, #CBD5E1)", + "button.secondary.active.background": "linear-gradient(180deg, #CBD5E1, #94A3B8)", + "button.secondary.foreground": "#0F172A", + "button.danger.background": "linear-gradient(180deg, #FEF2F2, #FEE2E2)", + "button.danger.hover.background": "linear-gradient(180deg, #FEE2E2, #FECACA)", + "button.danger.active.background": "linear-gradient(180deg, #FECACA, #FCA5A5)", + "button.danger.foreground": "#B91C1C", + "button.info.background": "linear-gradient(180deg, #ECFEFF, #CFFAFE)", + "button.info.hover.background": "linear-gradient(180deg, #CFFAFE, #A5F3FC)", + "button.info.active.background": "linear-gradient(180deg, #A5F3FC, #67E8F9)", + "button.info.foreground": "#0E7490", + "button.success.background": "linear-gradient(180deg, #F0FDF4, #DCFCE7)", + "button.success.hover.background": "linear-gradient(180deg, #DCFCE7, #BBF7D0)", + "button.success.active.background": "linear-gradient(180deg, #BBF7D0, #86EFAC)", + "button.success.foreground": "#15803D", + "button.warning.background": "linear-gradient(180deg, #FEFCE8, #FEF3C7)", + "button.warning.hover.background": "linear-gradient(180deg, #FEF3C7, #FDE68A)", + "button.warning.active.background": "linear-gradient(180deg, #FDE68A, #FCD34D)", + "button.warning.foreground": "#A16207", + "caret": "#0F172A", + "chart.1": "#93C5FD", + "chart.2": "#3B82F6", + "chart.3": "#2563EB", + "chart.4": "#1D4ED8", + "chart.5": "#1E40AF", + "chart.bullish": "green-600", + "chart.bearish": "red-600", + "danger.background": "linear-gradient(180deg, #EF4444, #DC2626)", + "danger.active.background": "linear-gradient(180deg, #DC2626, #B91C1C)", + "danger.foreground": "#FFFFFF", + "danger.hover.background": "linear-gradient(180deg, #F87171, #EF4444)", + "description_list.label.background": "#F8FAFC", + "description_list.label.foreground": "#0F172A", + "drag.border": "#3B82F6", + "drop_target.background": "#3B82F640", + "foreground": "#020617", + "group_box.background": "#F8FAFC", + "group_box.foreground": "#0F172A", + "info.background": "linear-gradient(180deg, #06B6D4, #0891B2)", + "info.active.background": "linear-gradient(180deg, #0891B2, #0E7490)", + "info.foreground": "#FFFFFF", + "info.hover.background": "linear-gradient(180deg, #22D3EE, #06B6D4)", + "input.border": "#E2E8F0", + "link": "#0F172A", + "link.active": "#020617", + "link.hover": "#334155", + "list.background": "#FFFFFF", + "list.active.background": "#BFDBFE33", + "list.active.border": "#60A5FA", + "list.even.background": "#F8FAFC", + "list.head.background": "#F8FAFC", + "list.hover.background": "#F1F5F9", + "muted.background": "#F1F5F9", + "muted.foreground": "#64748B", + "popover.background": "#FFFFFF", + "popover.foreground": "#020617", + "primary.background": "linear-gradient(180deg, #1E293B, #0F172A)", + "primary.active.background": "linear-gradient(180deg, #0F172A, #020617)", + "primary.foreground": "#F8FAFC", + "primary.hover.background": "linear-gradient(180deg, #334155, #1E293B)", + "progress.bar.background": "linear-gradient(180deg, #1E293B, #0F172A)", + "ring": "#0F172A", + "scrollbar.background": "#F8FAFC00", + "scrollbar.thumb.background": "linear-gradient(to right, #CBD5E173, #94A3B873)", + "scrollbar.thumb.hover.background": "linear-gradient(to right, #CBD5E199, #94A3B899)", + "secondary.background": "#E2E8F0", + "secondary.active.background": "#CBD5E1", + "secondary.foreground": "#0F172A", + "secondary.hover.background": "#E2E8F0", + "selection.background": "#55A0FC", + "sidebar.background": "#F8FAFC", + "sidebar.accent.background": "#E2E8F0", + "sidebar.accent.foreground": "#0F172A", + "sidebar.border": "#E2E8F0", + "sidebar.foreground": "#0F172A", + "sidebar.primary.background": "#0F172A", + "sidebar.primary.foreground": "#F8FAFC", + "skeleton.background": "#F1F5F9", + "slider.background": "#0F172A", + "slider.thumb.background": "linear-gradient(180deg, #FFFFFF, #F8FAFC)", + "success.background": "linear-gradient(180deg, #22C55E, #16A34A)", + "success.active.background": "linear-gradient(180deg, #16A34A, #15803D)", + "success.foreground": "#FFFFFF", + "success.hover.background": "linear-gradient(180deg, #4ADE80, #22C55E)", + "switch.background": "linear-gradient(180deg, #E2E8F0, #CBD5E1)", + "switch.thumb.background": "linear-gradient(180deg, #FFFFFF, #F8FAFC)", + "tab.background": "#00000000", + "tab.active.background": "#FFFFFF", + "tab.active.foreground": "#0F172A", + "tab.foreground": "#334155", + "tab_bar.background": "#F1F5F9", + "tab_bar.segmented.background": "#F1F5F9", + "table.background": "#FFFFFF", + "table.active.background": "#BFDBFE33", + "table.active.border": "#60A5FA", + "table.even.background": "#F8FAFC", + "table.head.background": "#F8FAFC", + "table.head.foreground": "#64748B", + "table.foot.background": "#F8FAFC", + "table.foot.foreground": "#64748B", + "table.hover.background": "#F1F5F9", + "table.row.border": "#E2E8F0B3", + "title_bar.background": "linear-gradient(180deg, #FFFFFF, #F8FAFC)", + "title_bar.border": "#E2E8F0", + "status_bar.background": "linear-gradient(180deg, #F8FAFC, #F1F5F9)", + "status_bar.border": "#E2E8F0", + "warning.background": "linear-gradient(180deg, #EAB308, #CA8A04)", + "warning.active.background": "linear-gradient(180deg, #CA8A04, #A16207)", + "warning.hover.background": "linear-gradient(180deg, #FACC15, #EAB308)", + "warning.foreground": "#422006", + "overlay": "#0000000D", + "window.border": "#E2E8F0", + "base.red": "red-600", + "base.red.light": "red-400", + "base.green": "green-600", + "base.green.light": "green-400", + "base.blue": "blue-600", + "base.blue.light": "blue-400", + "base.yellow": "yellow-600", + "base.yellow.light": "yellow-400", + "base.magenta": "purple-600", + "base.magenta.light": "purple-400", + "base.cyan": "cyan-600", + "base.cyan.light": "cyan-400" + }, + "highlight": { + "editor.foreground": "#020617", + "editor.background": "#FFFFFF", + "editor.active_line.background": "#F8FAFC", + "editor.line_number": "#94A3B8", + "editor.active_line_number": "#0F172A", + "editor.invisible": "#64748B66", + "syntax": { + "attribute": { + "color": "#957931" + }, + "boolean": { + "color": "#C5060B" + }, + "comment": { + "color": "#007fff" + }, + "comment.doc": { + "color": "#007fff" + }, + "constant": { + "color": "#C5060B" + }, + "constructor": { + "color": "#0433ff" + }, + "embedded": { + "color": "#333333" + }, + "emphasis": { + "font_style": "italic" + }, + "emphasis.strong": { + "font_weight": 700 + }, + "function": { + "color": "#0000A2" + }, + "keyword": { + "color": "#0433ff" + }, + "link_text": { + "color": "#0000A2", + "font_style": "normal" + }, + "link_uri": { + "color": "#6A7293", + "font_style": "italic" + }, + "number": { + "color": "#0433ff" + }, + "string": { + "color": "#036A07" + }, + "string.escape": { + "color": "#036A07" + }, + "string.regex": { + "color": "#036A07" + }, + "string.special": { + "color": "#d21f07" + }, + "string.special.symbol": { + "color": "#d21f07" + }, + "tag": { + "color": "#0433ff" + }, + "text.literal": { + "color": "#6F42C1" + }, + "text.code.span": { + "color": "#6F42C1" + }, + "title": { + "color": "#0433FF" + }, + "type": { + "color": "#6f42c1" + }, + "property": { + "color": "#333333" + }, + "variable": { + "color": "#333333" + }, + "variable.special": { + "color": "#C5060B" + } + } + } + } + ] +} diff --git a/assets/themes/ayu.json b/assets/themes/ayu.json new file mode 100644 index 00000000..aceb8a4a --- /dev/null +++ b/assets/themes/ayu.json @@ -0,0 +1,459 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Ayu", + "author": "Zed Industries", + "url": "https://github.com/zed-industries/zed/blob/e62dd2a0e584154886ff86cc1e9e3e060558b977/assets/themes/ayu", + "themes": [ + { + "name": "Ayu Light", + "mode": "light", + "colors": { + "accent.background": "#dadadc", + "accent.foreground": "#5C6773", + "background": "#FCFCFC", + "foreground": "#5c6166", + "border": "#cfd1d2ff", + "ring": "#FF9940", + "input.border": "#D9DCE3", + "list.active.background": "#55B4D422", + "list.active.border": "#55B4D4", + "list.even.background": "#E6E6E6", + "list.head.background": "#F4F4F599", + "muted.background": "#F4F4F5", + "muted.foreground": "#99a0a6", + "panel.background": "#F3F4F5", + "popover.background": "#ECECED", + "popover.foreground": "#5C6773", + "primary.active.background": "#42accf", + "primary.background": "#55b4d3", + "primary.foreground": "#FAFAFA", + "primary.hover.background": "#5fb9d7", + "scrollbar.background": "#FAFAFA00", + "scrollbar.thumb.background": "#5c61664c", + "secondary.active.background": "#CECECE", + "secondary.background": "#ECECED", + "secondary.foreground": "#5C6773", + "secondary.hover.background": "#e0e0e0", + "tab.active.background": "#FCFCFC", + "tab.active.foreground": "#5C6773", + "tab.background": "#ECECED00", + "tab_bar.background": "#F4F4F5", + "title_bar.background": "#ECECED", + "title_bar.border": "#CFD1D2", + "base.yellow": "#F1AD49", + "base.red": "#F07171", + "base.blue": "#55b4d3", + "base.green": "#85b304", + "base.magenta": "#9371f0", + "base.cyan": "#4dbf99" + }, + "highlight": { + "editor.foreground": "#5C6773", + "editor.background": "#FCFCFC", + "editor.active_line.background": "#ECECED", + "editor.line_number": "#ABB0B6", + "editor.active_line_number": "#5C6773", + "editor.invisible": "#73777b66", + "conflict": "#f1ad49ff", + "conflict.background": "#ffeedaff", + "conflict.border": "#ffe1beff", + "created": "#85b304ff", + "created.background": "#e9efd2ff", + "created.border": "#d7e3aeff", + "deleted": "#ef7271ff", + "deleted.background": "#ffe3e1ff", + "deleted.border": "#ffcdcaff", + "error": "#ef7271ff", + "error.background": "#ffe3e1ff", + "error.border": "#ffcdcaff", + "hidden": "#a9acaeff", + "hidden.background": "#dcdddeff", + "hidden.border": "#d5d6d8ff", + "hint": "#8ca7c2ff", + "hint.background": "#deebfaff", + "hint.border": "#c4daf6ff", + "ignored": "#a9acaeff", + "ignored.background": "#dcdddeff", + "ignored.border": "#cfd1d2ff", + "info": "#3b9ee5ff", + "info.background": "#deebfaff", + "info.border": "#c4daf6ff", + "modified": "#f1ad49ff", + "modified.background": "#ffeedaff", + "modified.border": "#ffe1beff", + "predictive": "#9eb9d3ff", + "predictive.background": "#e9efd2ff", + "predictive.border": "#d7e3aeff", + "renamed": "#3b9ee5ff", + "renamed.background": "#deebfaff", + "renamed.border": "#c4daf6ff", + "success": "#85b304ff", + "success.background": "#e9efd2ff", + "success.border": "#d7e3aeff", + "unreachable": "#8b8e92ff", + "unreachable.background": "#dcdddeff", + "unreachable.border": "#cfd1d2ff", + "warning": "#f1ad49ff", + "warning.background": "#ffeedaff", + "warning.border": "#ffe1beff", + "syntax": { + "attribute": { + "color": "#3b9ee5ff" + }, + "boolean": { + "color": "#a37accff" + }, + "comment": { + "color": "#898d90ff" + }, + "comment.doc": { + "color": "#898d90ff" + }, + "constant": { + "color": "#a37accff" + }, + "constructor": { + "color": "#3b9ee5ff" + }, + "embedded": { + "color": "#5c6166ff" + }, + "emphasis": { + "color": "#3b9ee5ff" + }, + "emphasis.strong": { + "color": "#3b9ee5ff", + "font_weight": 700 + }, + "enum": { + "color": "#f98d3fff" + }, + "function": { + "color": "#f2ad48ff" + }, + "hint": { + "color": "#8ca7c2ff", + "font_weight": 700 + }, + "keyword": { + "color": "#fa8d3eff" + }, + "label": { + "color": "#3b9ee5ff" + }, + "link_text": { + "color": "#f98d3fff", + "font_style": "italic" + }, + "link_uri": { + "color": "#85b304ff" + }, + "namespace": { + "color": "#5c6166ff" + }, + "number": { + "color": "#a37accff" + }, + "operator": { + "color": "#ed9365ff" + }, + "predictive": { + "color": "#9eb9d3ff", + "font_style": "italic" + }, + "preproc": { + "color": "#5c6166ff" + }, + "primary": { + "color": "#5c6166ff" + }, + "property": { + "color": "#3b9ee5ff" + }, + "punctuation": { + "color": "#73777bff" + }, + "punctuation.bracket": { + "color": "#73777bff" + }, + "punctuation.delimiter": { + "color": "#73777bff" + }, + "punctuation.list_marker": { + "color": "#73777bff" + }, + "punctuation.markup": { + "color": "#73777bff" + }, + "punctuation.special": { + "color": "#a37accff" + }, + "selector": { + "color": "#a37accff" + }, + "selector.pseudo": { + "color": "#3b9ee5ff" + }, + "string": { + "color": "#86b300ff" + }, + "string.escape": { + "color": "#898d90ff" + }, + "string.regex": { + "color": "#4bbf98ff" + }, + "string.special": { + "color": "#e6ba7eff" + }, + "string.special.symbol": { + "color": "#f98d3fff" + }, + "tag": { + "color": "#3b9ee5ff" + }, + "text.literal": { + "color": "#f98d3fff" + }, + "title": { + "color": "#5c6166ff", + "font_weight": 700 + }, + "type": { + "color": "#389ee6ff" + }, + "variable": { + "color": "#5c6166ff" + }, + "variant": { + "color": "#3b9ee5ff" + } + } + } + }, + { + "name": "Ayu Dark", + "mode": "dark", + "colors": { + "accent.background": "#20242b", + "accent.foreground": "#B3B1AD", + "background": "#0D1016", + "border": "#292a2c", + "ring": "#FFB454", + "foreground": "#B3B1AD", + "input.border": "#2D2F34", + "list.active.background": "#36A3D922", + "list.active.border": "#36A3D9", + "list.even.background": "#191F2A99", + "muted.background": "#16191F", + "muted.foreground": "#52514f", + "popover.background": "#0D1016", + "popover.foreground": "#B3B1AD", + "primary.active.background": "#36A3D9", + "primary.background": "#5ac1fe", + "primary.foreground": "#1F2430", + "primary.hover.background": "#3DAEE9", + "scrollbar.background": "#0A0E1400", + "scrollbar.thumb.background": "#bfbdb64c", + "secondary.active.background": "#26282f", + "secondary.background": "#1F2127", + "secondary.foreground": "#B3B1AD", + "secondary.hover.background": "#26282f99", + "tab.active.foreground": "#B3B1AD", + "tab.active.background": "#0D1016", + "tab_bar.background": "#16191F", + "title_bar.background": "#16191F", + "title_bar.border": "#292a2c", + "base.yellow": "#FEB454", + "base.red": "#ef7177", + "base.blue": "#5ac1fe", + "base.green": "#aad84c", + "base.magenta": "#d2a6ff", + "base.cyan": "#5a728b" + }, + "highlight": { + "editor.foreground": "#bfbdb6", + "editor.background": "#0d1016", + "editor.active_line.background": "#1f2127bf", + "editor.line_number": "#4b4c4e", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#73777b66", + "conflict": "#feb454ff", + "conflict.background": "#572815ff", + "conflict.border": "#754221ff", + "created": "#aad84cff", + "created.background": "#294113ff", + "created.border": "#405c1cff", + "deleted": "#ef7177ff", + "deleted.background": "#48161bff", + "deleted.border": "#66272dff", + "error": "#ef7177ff", + "error.background": "#48161bff", + "error.border": "#66272dff", + "hidden": "#696a6aff", + "hidden.background": "#313337ff", + "hidden.border": "#383a3eff", + "hint": "#628b80ff", + "hint.background": "#0d2f4eff", + "hint.border": "#1b4a6eff", + "ignored": "#696a6aff", + "ignored.background": "#313337ff", + "ignored.border": "#3f4043ff", + "info": "#5ac1feff", + "info.background": "#0d2f4eff", + "info.border": "#1b4a6eff", + "modified": "#feb454ff", + "modified.background": "#572815ff", + "modified.border": "#754221ff", + "predictive": "#5a728bff", + "predictive.background": "#294113ff", + "predictive.border": "#405c1cff", + "renamed": "#5ac1feff", + "renamed.background": "#0d2f4eff", + "renamed.border": "#1b4a6eff", + "success": "#aad84cff", + "success.background": "#294113ff", + "success.border": "#405c1cff", + "unreachable": "#8a8986ff", + "unreachable.background": "#313337ff", + "unreachable.border": "#3f4043ff", + "warning": "#feb454ff", + "warning.background": "#572815ff", + "warning.border": "#754221ff", + "syntax": { + "attribute": { + "color": "#5ac1feff" + }, + "boolean": { + "color": "#d2a6ffff" + }, + "comment": { + "color": "#8c8b88ff" + }, + "comment.doc": { + "color": "#8c8b88ff" + }, + "constant": { + "color": "#d2a6ffff" + }, + "constructor": { + "color": "#5ac1feff" + }, + "embedded": { + "color": "#bfbdb6ff" + }, + "emphasis": { + "color": "#5ac1feff" + }, + "emphasis.strong": { + "color": "#5ac1feff", + "font_weight": 700 + }, + "enum": { + "color": "#fe8f40ff" + }, + "function": { + "color": "#ffb353ff" + }, + "hint": { + "color": "#628b80ff", + "font_weight": 700 + }, + "keyword": { + "color": "#ff8f3fff" + }, + "label": { + "color": "#5ac1feff" + }, + "link_text": { + "color": "#fe8f40ff", + "font_style": "italic" + }, + "link_uri": { + "color": "#aad84cff" + }, + "namespace": { + "color": "#bfbdb6ff" + }, + "number": { + "color": "#d2a6ffff" + }, + "operator": { + "color": "#f29668ff" + }, + "predictive": { + "color": "#5a728bff", + "font_style": "italic" + }, + "preproc": { + "color": "#bfbdb6ff" + }, + "primary": { + "color": "#bfbdb6ff" + }, + "property": { + "color": "#5ac1feff" + }, + "punctuation": { + "color": "#a6a5a0ff" + }, + "punctuation.bracket": { + "color": "#a6a5a0ff" + }, + "punctuation.delimiter": { + "color": "#a6a5a0ff" + }, + "punctuation.list_marker": { + "color": "#a6a5a0ff" + }, + "punctuation.markup": { + "color": "#a6a5a0ff" + }, + "punctuation.special": { + "color": "#d2a6ffff" + }, + "selector": { + "color": "#d2a6ffff" + }, + "selector.pseudo": { + "color": "#5ac1feff" + }, + "string": { + "color": "#a9d94bff" + }, + "string.escape": { + "color": "#8c8b88ff" + }, + "string.regex": { + "color": "#95e6cbff" + }, + "string.special": { + "color": "#e5b572ff" + }, + "string.special.symbol": { + "color": "#fe8f40ff" + }, + "tag": { + "color": "#5ac1feff" + }, + "text.literal": { + "color": "#fe8f40ff" + }, + "title": { + "color": "#bfbdb6ff", + "font_weight": 700 + }, + "type": { + "color": "#59c2ffff" + }, + "variable": { + "color": "#bfbdb6ff" + }, + "variant": { + "color": "#5ac1feff" + } + } + } + } + ] +} diff --git a/assets/themes/catppuccin.json b/assets/themes/catppuccin.json new file mode 100644 index 00000000..33684da3 --- /dev/null +++ b/assets/themes/catppuccin.json @@ -0,0 +1,829 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Catppuccin", + "author": "Catppuccino", + "url": "https://github.com/catppuccin/catppuccin", + "themes": [ + { + "name": "Catppuccin Latte", + "mode": "light", + "colors": { + "accent.background": "#d3d8e0", + "accent.foreground": "#4c4f69", + "background": "#E5E9EF", + "border": "#CCD0DA", + "ring": "#7287fd", + "foreground": "#4c4f69", + "input.border": "#acb0be", + "link.active.foreground": "#7287fd", + "link.foreground": "#7287fd", + "link.hover.foreground": "#7287fd", + "list.active.background": "#7287fd22", + "list.active.border": "#7287fd", + "list.even.background": "#EFF1F5", + "list.head.background": "#dce0e8", + "muted.background": "#dce0e8", + "muted.foreground": "#9a9db2", + "panel.background": "#dce0e8", + "primary.active.background": "#7287fd", + "primary.background": "#7287fd", + "primary.foreground": "#EFF1F5", + "scrollbar.background": "#EFF1F500", + "scrollbar.thumb.background": "#acb0be", + "secondary.active.background": "#CCD2DE", + "secondary.background": "#dce0e8", + "secondary.foreground": "#4c4f69", + "secondary.hover.background": "#CCD2DE99", + "tab.active.background": "#E5E9EF", + "tab.active.foreground": "#4c4f69", + "tab.background": "#D2D7E200", + "tab.foreground": "#82848c", + "tab_bar.background": "#DCE0E8", + "title_bar.background": "#DCE0E8", + "title_bar.border": "#bec3d0", + "base.red": "#d26a53", + "base.green": "#5aa93b", + "base.yellow": "#df8e1d", + "base.blue": "#78acdc", + "base.magenta": "#8778dc", + "base.magenta.light": "#9978dc66", + "base.cyan": "#53d2b0" + }, + "highlight": { + "editor.foreground": "#4c4f69", + "editor.background": "#EFF1F5", + "editor.active_line.background": "#dce0e8", + "editor.line_number": "#9a9db2", + "editor.active_line_number": "#4c4f69", + "editor.invisible": "#7c7f9366", + "conflict": "#d20f39", + "created": "#85dc78", + "deleted": "#dc8a78", + "error": "#d20f39", + "hidden": "#9a9db2", + "hint": "#7287fd", + "ignored": "#acb0be", + "info": "#1e66f5", + "modified": "#df8e1d", + "predictive": "#9a9db2", + "renamed": "#9978dc", + "success": "#85dc78", + "unreachable": "#acb0be", + "warning": "#df8e1d", + "syntax": { + "variable": { + "color": "#4c4f69" + }, + "variable.builtin": { + "color": "#d20f39" + }, + "variable.parameter": { + "color": "#e64553" + }, + "variable.member": { + "color": "#1e66f5" + }, + "variable.special": { + "color": "#d20f39", + "font_style": "italic" + }, + "constant": { + "color": "#fe640b" + }, + "constant.builtin": { + "color": "#fe640b" + }, + "constant.macro": { + "color": "#8839ef" + }, + "module": { + "color": "#df8e1d", + "font_style": "italic" + }, + "label": { + "color": "#209fb5" + }, + "string": { + "color": "#85dc78" + }, + "string.documentation": { + "color": "#179299" + }, + "string.regexp": { + "color": "#fe640b" + }, + "string.escape": { + "color": "#ea76cb" + }, + "string.special": { + "color": "#ea76cb" + }, + "string.special.path": { + "color": "#ea76cb" + }, + "string.special.symbol": { + "color": "#dd7878" + }, + "string.special.url": { + "color": "#dc8a78", + "font_style": "italic" + }, + "character": { + "color": "#179299" + }, + "character.special": { + "color": "#ea76cb" + }, + "boolean": { + "color": "#fe640b" + }, + "number": { + "color": "#fe640b" + }, + "number.float": { + "color": "#fe640b" + }, + "type": { + "color": "#df8e1d" + }, + "type.builtin": { + "color": "#8839ef", + "font_style": "italic" + }, + "type.definition": { + "color": "#df8e1d" + }, + "type.interface": { + "color": "#df8e1d", + "font_style": "italic" + }, + "type.super": { + "color": "#df8e1d", + "font_style": "italic" + }, + "attribute": { + "color": "#fe640b" + }, + "property": { + "color": "#1e66f5" + }, + "function": { + "color": "#1e66f5" + }, + "function.builtin": { + "color": "#fe640b" + }, + "function.call": { + "color": "#1e66f5" + }, + "function.macro": { + "color": "#179299" + }, + "function.method": { + "color": "#1e66f5" + }, + "function.method.call": { + "color": "#1e66f5" + }, + "constructor": { + "color": "#dd7878" + }, + "operator": { + "color": "#04a5e5" + }, + "keyword": { + "color": "#8839ef" + }, + "keyword.modifier": { + "color": "#8839ef" + }, + "keyword.type": { + "color": "#8839ef" + }, + "keyword.coroutine": { + "color": "#8839ef" + }, + "keyword.function": { + "color": "#8839ef" + }, + "keyword.operator": { + "color": "#8839ef" + }, + "keyword.import": { + "color": "#8839ef" + }, + "keyword.repeat": { + "color": "#8839ef" + }, + "keyword.return": { + "color": "#8839ef" + }, + "keyword.debug": { + "color": "#8839ef" + }, + "keyword.exception": { + "color": "#8839ef" + }, + "keyword.conditional": { + "color": "#8839ef" + }, + "keyword.conditional.ternary": { + "color": "#8839ef" + }, + "keyword.directive": { + "color": "#ea76cb" + }, + "keyword.directive.define": { + "color": "#ea76cb" + }, + "keyword.export": { + "color": "#04a5e5" + }, + "punctuation": { + "color": "#7c7f93" + }, + "punctuation.delimiter": { + "color": "#7c7f93" + }, + "punctuation.bracket": { + "color": "#7c7f93" + }, + "punctuation.special": { + "color": "#ea76cb" + }, + "punctuation.special.symbol": { + "color": "#dd7878" + }, + "punctuation.list_marker": { + "color": "#179299" + }, + "comment": { + "color": "#7c7f93", + "font_style": "italic" + }, + "comment.doc": { + "color": "#7c7f93", + "font_style": "italic" + }, + "comment.documentation": { + "color": "#7c7f93", + "font_style": "italic" + }, + "comment.error": { + "color": "#d20f39", + "font_style": "italic" + }, + "comment.warning": { + "color": "#df8e1d", + "font_style": "italic" + }, + "comment.hint": { + "color": "#1e66f5", + "font_style": "italic" + }, + "comment.todo": { + "color": "#dd7878", + "font_style": "italic" + }, + "comment.note": { + "color": "#dc8a78", + "font_style": "italic" + }, + "diff.plus": { + "color": "#40a02b" + }, + "diff.minus": { + "color": "#d20f39" + }, + "tag": { + "color": "#1e66f5" + }, + "tag.attribute": { + "color": "#df8e1d", + "font_style": "italic" + }, + "tag.delimiter": { + "color": "#179299" + }, + "parameter": { + "color": "#e64553" + }, + "field": { + "color": "#7287fd" + }, + "namespace": { + "color": "#df8e1d", + "font_style": "italic" + }, + "float": { + "color": "#fe640b" + }, + "symbol": { + "color": "#ea76cb" + }, + "string.regex": { + "color": "#fe640b" + }, + "text": { + "color": "#4c4f69" + }, + "emphasis.strong": { + "color": "#e64553", + "font_weight": 700 + }, + "emphasis": { + "color": "#e64553", + "font_style": "italic" + }, + "embedded": { + "color": "#e64553" + }, + "text.literal": { + "color": "#40a02b" + }, + "concept": { + "color": "#209fb5" + }, + "enum": { + "color": "#179299", + "font_weight": 700 + }, + "function.decorator": { + "color": "#fe640b" + }, + "type.class.definition": { + "color": "#df8e1d", + "font_weight": 700 + }, + "hint": { + "color": "#acb0be", + "font_style": "italic" + }, + "link_text": { + "color": "#7287fd" + }, + "link_uri": { + "color": "#1e66f5", + "font_style": "italic" + }, + "parent": { + "color": "#fe640b" + }, + "predictive": { + "color": "#9ca0b0" + }, + "predoc": { + "color": "#d20f39" + }, + "primary": { + "color": "#e64553" + }, + "tag.doctype": { + "color": "#8839ef" + }, + "string.doc": { + "color": "#179299", + "font_style": "italic" + }, + "title": { + "color": "#4c4f69", + "font_weight": 800 + }, + "variant": { + "color": "#d20f39" + } + } + } + }, + { + "name": "Catppuccin Frappe", + "mode": "dark", + "colors": { + "accent.background": "#3b3f4f", + "accent.foreground": "#c6d0f5", + "background": "#232634", + "border": "#3e4255", + "ring": "#f2d5cf", + "foreground": "#c6d0f5", + "input.border": "#51576d", + "list.active.background": "#8caaee15", + "list.even.background": "#303446", + "list.head.background": "#2A2C3C", + "muted.background": "#2c303f", + "muted.foreground": "#979db5", + "panel.background": "#414559", + "popover.background": "#1E202B", + "popover.foreground": "#c6d0f5", + "primary.active.background": "#8caaee", + "primary.background": "#8caaee", + "primary.foreground": "#232634", + "primary.hover.background": "#8caaee", + "scrollbar.background": "#30344600", + "scrollbar.thumb.background": "#51576d", + "secondary.active.background": "#313445", + "secondary.background": "#414559", + "secondary.foreground": "#c6d0f5", + "secondary.hover.background": "#31344599", + "tab.active.background": "#232634", + "tab.active.foreground": "#dce2f9", + "tab.background": "#1E202B00", + "tab.foreground": "#abb5d9", + "tab_bar.background": "#1E202B", + "title_bar.background": "#1D202B", + "title_bar.border": "#30354b", + "base.red": "#e78284", + "base.green": "#a6d189", + "base.yellow": "#e7d682", + "base.blue": "#8caaee", + "base.magenta": "#9882e7", + "base.magenta.light": "#9882e766", + "base.cyan": "#81c8be" + }, + "highlight": { + "editor.foreground": "#c6d0f5", + "editor.background": "#232634", + "editor.active_line.background": "#41455977", + "editor.line_number": "#979db5", + "editor.active_line_number": "#c6d0f5", + "editor.invisible": "#7c7f9366", + "conflict": "#e78284", + "created": "#a6d189", + "deleted": "#3b2e2e", + "error": "#3b2e2e", + "hidden": "#51576d", + "hint": "#8caaee", + "info": "#1e2b4d", + "modified": "#e7d682", + "predictive": "#51576d", + "syntax": { + "attribute": { + "color": "#e7d682" + }, + "boolean": { + "color": "#e78284" + }, + "comment": { + "color": "#51576d" + }, + "comment.doc": { + "color": "#51576d" + }, + "constant": { + "color": "#e7d682" + }, + "constructor": { + "color": "#a6d189" + }, + "embedded": { + "color": "#c6d0f5" + }, + "function": { + "color": "#8caaee" + }, + "keyword": { + "color": "#e78284" + }, + "link_text": { + "color": "#8caaee", + "font_style": "normal" + }, + "link_uri": { + "color": "#51576d", + "font_style": "italic" + }, + "number": { + "color": "#e78284" + }, + "string": { + "color": "#a6d189" + }, + "string.escape": { + "color": "#a6d189" + }, + "string.regex": { + "color": "#a6d189" + }, + "string.special": { + "color": "#e7d682" + }, + "string.special.symbol": { + "color": "#e7d682" + }, + "tag": { + "color": "#8caaee" + }, + "text.literal": { + "color": "#c6d0f5" + }, + "title": { + "color": "#e78284", + "font_weight": 600 + }, + "type": { + "color": "#8caaee" + }, + "property": { + "color": "#c6d0f5" + }, + "variable.special": { + "color": "#e78284" + } + } + } + }, + { + "name": "Catppuccin Macchiato", + "mode": "dark", + "colors": { + "accent.background": "#30344d", + "accent.foreground": "#cad3f5", + "action_bar.background": "#1E2030", + "background": "#1E2030", + "border": "#494d64", + "ring": "#f4dbd6", + "danger.background": "#ed8796", + "foreground": "#cad3f5", + "input.border": "#494d64", + "link.active.foreground": "#8aadf4", + "link.foreground": "#8aadf4", + "link.hover.foreground": "#8aadf4", + "list.active.background": "#8aadf420", + "list.active.border": "#8aadf4", + "list.even.background": "#24273a", + "list.head.background": "#363a4f33", + "muted.background": "#282a3a", + "muted.foreground": "#b8c0e0", + "popover.foreground": "#cad3f5", + "primary.active.background": "#8aadf499", + "primary.background": "#8aadf4", + "primary.foreground": "#24273a", + "primary.hover.background": "#8aadf4", + "scrollbar.background": "#24273a00", + "scrollbar.thumb.background": "#494d64", + "secondary.active.background": "#3a3f55", + "secondary.background": "#363a4f", + "secondary.foreground": "#cad3f5", + "secondary.hover.background": "#24273a99", + "tab.background": "#17192600", + "tab.foreground": "#aeb8db", + "tab_bar.background": "#171926", + "title_bar.background": "#171926", + "title_bar.border": "#363A4F", + "base.red": "#ed8796", + "base.green": "#a6da95", + "base.yellow": "#eed49f", + "base.blue": "#8aadf4", + "base.magenta": "#f5bde6", + "base.magenta.light": "#f5bde666", + "base.cyan": "#8bd5ca" + }, + "highlight": { + "editor.foreground": "#cad3f5", + "editor.background": "#1E2030", + "editor.active_line.background": "#363a4f", + "editor.line_number": "#b8c0e0", + "editor.active_line_number": "#cad3f5", + "editor.invisible": "#7c7f9366", + "conflict": "#ed8796", + "created": "#a6da95", + "deleted": "#ed8796", + "error": "#ed8796", + "hidden": "#b8c0e0", + "hint": "#8aadf4", + "ignored": "#494d64", + "info": "#8aadf4", + "modified": "#eed49f", + "predictive": "#b8c0e0", + "renamed": "#f5bde6", + "success": "#a6da95", + "unreachable": "#b8c0e0", + "warning": "#eed49f", + "syntax": { + "attribute": { + "color": "#eed49f" + }, + "boolean": { + "color": "#f5bde6" + }, + "comment": { + "color": "#b8c0e0", + "font_style": "italic" + }, + "comment.doc": { + "color": "#b8c0e0", + "font_style": "italic" + }, + "constant": { + "color": "#eed49f" + }, + "constructor": { + "color": "#8aadf4" + }, + "embedded": { + "color": "#cad3f5" + }, + "function": { + "color": "#8aadf4" + }, + "keyword": { + "color": "#f5bde6" + }, + "link_text": { + "color": "#8aadf4", + "font_style": "normal" + }, + "link_uri": { + "color": "#b8c0e0", + "font_style": "italic" + }, + "number": { + "color": "#eed49f" + }, + "string": { + "color": "#a6da95" + }, + "string.escape": { + "color": "#a6da95" + }, + "string.regex": { + "color": "#a6da95" + }, + "string.special": { + "color": "#eed49f" + }, + "string.special.symbol": { + "color": "#eed49f" + }, + "tag": { + "color": "#8aadf4" + }, + "text.literal": { + "color": "#cad3f5" + }, + "title": { + "color": "#f5bde6", + "font_weight": 600 + }, + "type": { + "color": "#8aadf4" + }, + "property": { + "color": "#cad3f5" + }, + "variable.special": { + "color": "#f5bde6" + } + } + } + }, + { + "name": "Catppuccin Mocha", + "mode": "dark", + "colors": { + "accent.background": "#2e2e3e", + "accent.foreground": "#cdd6f4", + "background": "#181825", + "border": "#313244", + "ring": "#cba6f7", + "danger.background": "#f38ba8", + "danger.active.background": "#eba0ac", + "danger.hover.background": "#f38ba8", + "foreground": "#cdd6f4", + "input.border": "#6c7086", + "link.active.foreground": "#89b4fa", + "link.foreground": "#89b4fa", + "link.hover.foreground": "#89b4fa", + "list.active.background": "#89b4fa15", + "list.active.border": "#89b4fa77", + "list.hover.background": "#202031", + "list.even.background": "#161622", + "list.head.background": "#1E1E2E", + "muted.background": "#302d41", + "muted.foreground": "#6c7086", + "panel.background": "#302d41", + "popover.background": "#1e1e2e", + "popover.foreground": "#cdd6f4", + "primary.active.background": "#89b4fa", + "primary.background": "#89b4fa", + "primary.foreground": "#1e1e2e", + "primary.hover.background": "#74c7ec", + "scrollbar.background": "#1e1e2e00", + "scrollbar.thumb.background": "#4e4e5e", + "secondary.active.background": "#45475a", + "secondary.background": "#302d41", + "secondary.foreground": "#cdd6f4", + "secondary.hover.background": "#575268", + "tab.background": "#0B0B1100", + "tab.foreground": "#aeb7d5", + "tab_bar.background": "#0B0B11", + "title_bar.background": "#11111B", + "title_bar.border": "#313244", + "base.red": "#f38ba8", + "base.green": "#a6e3a1", + "base.yellow": "#f9e2af", + "base.blue": "#89b4fa", + "base.magenta": "#f5c2e7", + "base.magenta.light": "#f38ba866", + "base.cyan": "#94e2d5" + }, + "highlight": { + "editor.foreground": "#cdd6f4", + "editor.background": "#181825", + "editor.active_line.background": "#222230AA", + "editor.line_number": "#6c7086", + "editor.active_line_number": "#cdd6f4", + "editor.invisible": "#7c7f9366", + "conflict": "#f38ba8", + "created": "#a6e3a1", + "deleted": "#f38ba8", + "error": "#f38ba8", + "hidden": "#6c7086", + "hint": "#89b4fa", + "ignored": "#6c7086", + "info": "#89b4fa", + "modified": "#f9e2af", + "predictive": "#6c7086", + "renamed": "#f5c2e7", + "success": "#a6e3a1", + "unreachable": "#6c7086", + "warning": "#f9e2af", + "syntax": { + "attribute": { + "color": "#f9e2af" + }, + "boolean": { + "color": "#f5c2e7" + }, + "comment": { + "color": "#6c7086", + "font_style": "italic" + }, + "comment.doc": { + "color": "#6c7086", + "font_style": "italic" + }, + "constant": { + "color": "#f9e2af" + }, + "constructor": { + "color": "#89b4fa" + }, + "embedded": { + "color": "#cdd6f4" + }, + "function": { + "color": "#89b4fa" + }, + "keyword": { + "color": "#f5c2e7" + }, + "link_text": { + "color": "#89b4fa", + "font_style": "normal" + }, + "link_uri": { + "color": "#6c7086", + "font_style": "italic" + }, + "number": { + "color": "#f9e2af" + }, + "string": { + "color": "#a6e3a1" + }, + "string.escape": { + "color": "#a6e3a1" + }, + "string.regex": { + "color": "#a6e3a1" + }, + "string.special": { + "color": "#f9e2af" + }, + "string.special.symbol": { + "color": "#f9e2af" + }, + "tag": { + "color": "#89b4fa" + }, + "text.literal": { + "color": "#cdd6f4" + }, + "title": { + "color": "#f5c2e7", + "font_weight": 600 + }, + "type": { + "color": "#89b4fa" + }, + "property": { + "color": "#cdd6f4" + }, + "variable.special": { + "color": "#f5c2e7" + } + } + } + } + ] +} diff --git a/assets/themes/everforest.json b/assets/themes/everforest.json new file mode 100644 index 00000000..9736ebaa --- /dev/null +++ b/assets/themes/everforest.json @@ -0,0 +1,286 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Everforest", + "author": "sainnhe", + "url": "https://github.com/sainnhe/everforest", + "themes": [ + { + "name": "Everforest Light", + "mode": "light", + "colors": { + "accent.background": "#E7E5D4", + "accent.foreground": "#5F6D75", + "background": "#FEFCEE", + "border": "#E7E5D4", + "danger.background": "#e67e80", + "danger.foreground": "#ffffff", + "foreground": "#5F6D75", + "input.border": "#E7E5D4", + "link.active.foreground": "#7fbbb3", + "link.foreground": "#7fbbb3", + "link.hover.foreground": "#7fbbb3", + "list.active.background": "#a7c08025", + "list.active.border": "#a7c080", + "list.even.background": "#F4F1E2", + "list.head.background": "#F4F1E2", + "muted.background": "#f1f0e2", + "muted.foreground": "#959a9d", + "popover.background": "#FEFCEE", + "popover.foreground": "#5F6D75", + "primary.background": "#e69875", + "primary.foreground": "#FEFCEE", + "scrollbar.background": "#e0e0e000", + "scrollbar.thumb.background": "#D7D5C4", + "secondary.background": "#EEEADA", + "secondary.foreground": "#5F6D75", + "tab.active.background": "#FEFCEE", + "tab.active.foreground": "#5F6D75", + "tab.background": "#F4F1E200", + "tab.foreground": "#6b7b84", + "tab_bar.background": "#F4F1E2", + "title_bar.background": "#F9F5E4", + "title_bar.border": "#E7E5D4", + "status_bar.background": "#F9F5E4", + "base.red": "#e67e80", + "base.green": "#a7c080", + "base.yellow": "#dbbc7f", + "base.blue": "#7fbbb3", + "base.magenta": "#d699b6", + "base.magenta.light": "#d699b699", + "base.cyan": "#83c092" + }, + "highlight": { + "editor.foreground": "#5F6D75", + "editor.background": "#FEFCEE", + "editor.active_line.background": "#E7E5D4", + "editor.line_number": "#959a9d", + "editor.active_line_number": "#5F6D75", + "editor.invisible": "#959a9d66", + "conflict": "#e67e80", + "created": "#a7c080", + "deleted": "#e67e80", + "error": "#e67e80", + "hidden": "#959a9d", + "hint": "#7fbbb3", + "ignored": "#959a9d", + "info": "#7fbbb3", + "modified": "#dbbc7f", + "predictive": "#5F6D75", + "renamed": "#a7c080", + "success": "#a7c080", + "unreachable": "#959a9d", + "warning": "#dbbc7f", + "syntax": { + "attribute": { + "color": "#dbbc7f" + }, + "boolean": { + "color": "#e69875" + }, + "comment": { + "color": "#959a9d", + "font_style": "italic" + }, + "comment.doc": { + "color": "#959a9d", + "font_style": "italic" + }, + "constant": { + "color": "#e69875" + }, + "constructor": { + "color": "#a7c080" + }, + "embedded": { + "color": "#5F6D75" + }, + "function": { + "color": "#a7c080" + }, + "keyword": { + "color": "#e67e80" + }, + "link_text": { + "color": "#7fbbb3", + "font_style": "normal" + }, + "link_uri": { + "color": "#5F6D75", + "font_style": "italic" + }, + "number": { + "color": "#e69875" + }, + "string": { + "color": "#a7c080" + }, + "string.escape": { + "color": "#a7c080" + }, + "string.regex": { + "color": "#a7c080" + }, + "string.special": { + "color": "#dbbc7f" + }, + "string.special.symbol": { + "color": "#dbbc7f" + }, + "tag": { + "color": "#a7c080" + }, + "text.literal": { + "color": "#dbbc7f" + }, + "title": { + "color": "#e69875", + "font_weight": 600 + }, + "type": { + "color": "#7fbbb3" + }, + "property": { + "color": "#5F6D75" + }, + "variable.special": { + "color": "#e67e80" + } + } + } + }, + { + "name": "Everforest Dark", + "mode": "dark", + "colors": { + "accent.background": "#3c4448", + "accent.foreground": "#d3c6aa", + "background": "#262E34", + "border": "#40484c", + "foreground": "#d3c6aa", + "input.border": "#485156", + "link.active.foreground": "#7fbbb3", + "link.foreground": "#7fbbb3", + "link.hover.foreground": "#7fbbb3", + "list.active.background": "#a7c08022", + "list.active.border": "#a7c08088", + "list.even.background": "#2E383B", + "list.head.background": "#2E383B", + "muted.background": "#2E383B", + "muted.foreground": "#6D7873", + "panel.background": "#2E383B", + "popover.background": "#262E34", + "popover.foreground": "#d3c6aa", + "primary.background": "#e69875", + "primary.foreground": "#262E34", + "scrollbar.background": "#2E383B00", + "scrollbar.thumb.background": "#485156", + "secondary.background": "#2E383B", + "secondary.foreground": "#849087", + "secondary.active.background": "#303b3e", + "secondary.hover.background": "#3E474B99", + "tab.active.background": "#262E34", + "tab.active.foreground": "#d3c6aa", + "tab.background": "#262E3400", + "tab.foreground": "#849087", + "tab_bar.background": "#2E383B", + "title_bar.background": "#1f262b", + "title_bar.border": "#40484c", + "base.red": "#e67e80", + "base.green": "#a7c080", + "base.yellow": "#dbbc7f", + "base.blue": "#7fbbb3", + "base.magenta": "#844d64", + "base.magenta.light": "#844d6499", + "base.cyan": "#83c092" + }, + "highlight": { + "editor.foreground": "#d3c6aa", + "editor.background": "#262E34", + "editor.active_line.background": "#3c4448", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#959a9d66", + "conflict": "#D2602D", + "created": "#3f72e2", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "modified": "#B0A878", + "predictive": "#5D5945", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/fahrenheit.json b/assets/themes/fahrenheit.json new file mode 100644 index 00000000..cd8eca86 --- /dev/null +++ b/assets/themes/fahrenheit.json @@ -0,0 +1,137 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Fahrenheit", + "author": "iTerm2-Color-Schemes", + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "themes": [ + { + "name": "Fahrenheit", + "mode": "dark", + "colors": { + "accent.background": "#171717", + "accent.foreground": "#FFFFCE", + "background": "#000000", + "border": "#252525", + "danger.background": "#593002", + "foreground": "#FFFFCE", + "input.border": "#252525", + "list.active.background": "#72020222", + "list.active.border": "#720202", + "list.even.background": "#090909", + "list.hover.background": "#111111", + "muted.background": "#20202099", + "muted.foreground": "#828282", + "panel.background": "#1e1e1e", + "popover.background": "#090909", + "popover.foreground": "#FFFFCE", + "primary.background": "#720202", + "primary.foreground": "#FFFFCE", + "scrollbar.background": "#1e1e1e00", + "scrollbar.thumb.background": "#3e3e3e", + "secondary.background": "#202020", + "secondary.active.background": "#202020DD", + "secondary.foreground": "#979797", + "secondary.hover.background": "#20202099", + "tab.foreground": "#808080", + "title_bar.background": "#0e0e0e", + "table.background": "#1e1e1e00", + "table.hover.background": "#1E1E1E", + "ring": "#570101", + "base.red": "#723202", + "base.red.light": "#c97636", + "base.green": "#027225", + "base.green.light": "#39c936", + "base.yellow": "#726302", + "base.yellow.light": "#c9b536", + "base.blue": "#022d72", + "base.blue.light": "#0551cb", + "base.magenta": "#3a286c", + "base.magenta.light": "#58197a", + "base.cyan": "#027272", + "base.cyan.light": "#36c9c9" + }, + "highlight": { + "editor.foreground": "#FFFFCE", + "editor.background": "#000000", + "editor.active_line.background": "#1e1e1e", + "editor.line_number": "#828282", + "editor.invisible": "#82828266", + "warning.border": "#720202", + "syntax": { + "attribute": { + "color": "#fecf75" + }, + "boolean": { + "color": "#fd9f4d" + }, + "comment": { + "color": "#828282" + }, + "comment.doc": { + "color": "#828282" + }, + "constant": { + "color": "#fd9f4d" + }, + "constructor": { + "color": "#cb4a05" + }, + "embedded": { + "color": "#dcdcdc" + }, + "function": { + "color": "#fd9f4d" + }, + "keyword": { + "color": "#cb4a05" + }, + "link_text": { + "color": "#cda074", + "font_style": "normal" + }, + "link_uri": { + "color": "#9e744d", + "font_style": "italic" + }, + "number": { + "color": "#cb4a05" + }, + "string": { + "color": "#cc734d" + }, + "string.escape": { + "color": "#cc734d" + }, + "string.regex": { + "color": "#cc734d" + }, + "string.special": { + "color": "#fd9f4d" + }, + "string.special.symbol": { + "color": "#fd9f4d" + }, + "tag": { + "color": "#cb4a05" + }, + "text.literal": { + "color": "#fd9f4d" + }, + "title": { + "color": "#cda074", + "font_weight": 600 + }, + "type": { + "color": "#cda074" + }, + "property": { + "color": "#dcdcdc" + }, + "variable.special": { + "color": "#cb4a05" + } + } + } + } + ] +} diff --git a/assets/themes/flexoki.json b/assets/themes/flexoki.json new file mode 100644 index 00000000..5515ac65 --- /dev/null +++ b/assets/themes/flexoki.json @@ -0,0 +1,307 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Flexoki", + "author": "kepano", + "url": "https://github.com/kepano/flexoki", + "themes": [ + { + "name": "Flexoki Light", + "mode": "light", + "colors": { + "accent.background": "#E8E4CE", + "accent.foreground": "#100F0F", + "background": "#FFFCF0", + "foreground": "#100F0F", + "border": "#E6E4D9", + "ring": "#D0A215", + "selection.background": "#D0A21577", + "input.border": "#E6E4D9", + "list.active.background": "#D0A21520", + "list.active.border": "#D0A215", + "list.background": "#FFFCF0", + "list.even.background": "#F2F0E5", + "muted.background": "#F2F0E5", + "muted.foreground": "#6F6E69", + "primary.background": "#3AA99F", + "primary.foreground": "#FAFAFA", + "info.background": "#4385BE", + "scrollbar.background": "#FAFAFA00", + "scrollbar.thumb.background": "#E6E4D9", + "scrollbar.thumb.hover.background": "#DAD8CE", + "secondary.active.background": "#DAD8CE", + "secondary.background": "#F2F0E5", + "secondary.foreground": "#100F0F", + "secondary.hover.background": "#E6E4D9", + "tab.active.background": "#FFFCF0", + "tab.active.foreground": "#100F0F", + "tab.background": "#ECECED00", + "tab.foreground": "#8d8986", + "tab_bar.background": "#F2F0E5", + "title_bar.background": "#F2F0E5", + "title_bar.border": "#DAD8CE", + "base.yellow": "#D0A215", + "base.red": "#D14D41", + "base.blue": "#4385BE", + "base.green": "#879A39", + "base.magenta": "#CE5D97", + "base.cyan": "#3AA99F" + }, + "highlight": { + "editor.foreground": "#100F0F", + "editor.background": "#FFFCF0", + "editor.active_line.background": "#F2F0E5", + "editor.line_number": "#B7B5AC", + "editor.active_line_number": "#24837B", + "editor.invisible": "#B7B5AC66", + "conflict": "#AD8301", + "conflict.background": "#FAEEC6", + "conflict.border": "#AD8301", + "created": "#66800B", + "created.background": "#EDEECF", + "created.border": "#66800B", + "deleted": "#AF3029", + "deleted.background": "#FFE1D5", + "deleted.border": "#AF3029", + "error": "#AF3029", + "error.background": "#FFE1D5", + "error.border": "#AF3029", + "hidden": "#B7B5AC", + "hidden.background": "#F2F0E5", + "hidden.border": "#B7B5AC", + "hint": "#B7B5AC", + "hint.background": "#F2F0E5", + "hint.border": "#B7B5AC", + "ignored": "#B7B5AC", + "ignored.background": "#F2F0E5", + "ignored.border": "#B7B5AC", + "info": "#24837B", + "info.background": "#DDF1E4", + "info.border": "#24837B", + "modified": "#AD8301", + "modified.background": "#FAEEC6", + "modified.border": "#AD8301", + "predictive": "#B7B5AC", + "renamed": "#24837B", + "renamed.background": "#DDF1E4", + "renamed.border": "#24837B", + "success": "#66800B", + "success.background": "#EDEECF", + "success.border": "#66800B", + "unreachable": "#6F6E69", + "unreachable.background": "#F2F0E5", + "unreachable.border": "#6F6E69", + "warning": "#AD8301", + "warning.background": "#FAEEC6", + "warning.border": "#AD8301", + "syntax": { + "attribute": { + "color": "#205EA6" + }, + "boolean": { + "color": "#BC5215" + }, + "comment": { + "color": "#B7B5AC" + }, + "comment.doc": { + "color": "#B7B5AC" + }, + "constant": { + "color": "#F07171" + }, + "constructor": { + "color": "#205EA6" + }, + "embedded": { + "color": "#5C6773" + }, + "function": { + "color": "#BC5215" + }, + "keyword": { + "color": "#66800B" + }, + "link_text": { + "color": "#24837B" + }, + "link_uri": { + "color": "#24837B" + }, + "number": { + "color": "#5E409D" + }, + "string": { + "color": "#24837B" + }, + "string.escape": { + "color": "#24837B" + }, + "string.regex": { + "color": "#24837B" + }, + "string.special": { + "color": "#24837B" + }, + "string.special.symbol": { + "color": "#24837B" + }, + "tag": { + "color": "#205EA6" + }, + "text.literal": { + "color": "#24837B" + }, + "title": { + "color": "#24837B", + "font_weight": 600 + }, + "type": { + "color": "#AD8301" + }, + "property": { + "color": "#BC5215" + }, + "variable.special": { + "color": "#205EA6" + } + } + } + }, + { + "name": "Flexoki Dark", + "mode": "dark", + "colors": { + "accent.background": "#242221", + "accent.foreground": "#CECDC3", + "background": "#100F0F", + "border": "#282726", + "ring": "#AD8301", + "selection.background": "#D0A21577", + "foreground": "#CECDC3", + "input.border": "#282726", + "list.active.background": "#D0A21515", + "list.active.border": "#AD8301", + "list.even.background": "#1C1B1A", + "muted.background": "#1C1B1A", + "muted.foreground": "#878580", + "panel.background": "#1C1B1A", + "popover.background": "#100F0F", + "popover.foreground": "#CECDC3", + "primary.background": "#24837B", + "primary.foreground": "#FFFCF0", + "info.background": "#205EA6", + "scrollbar.background": "#100F0F00", + "scrollbar.thumb.background": "#282726", + "scrollbar.thumb.hover.background": "#343331", + "secondary.background": "#232221", + "secondary.active.background": "#262423", + "secondary.foreground": "#CECDC3", + "secondary.hover.background": "#232221", + "tab.active.background": "#100F0F", + "tab.active.foreground": "#CECDC3", + "tab.background": "#1C1B1A", + "tab.foreground": "#878580", + "tab_bar.background": "#1C1B1A99", + "title_bar.background": "#191818", + "base.yellow": "#AD8301", + "base.yellow.light": "#D0A215", + "base.red": "#AF3029", + "base.red.light": "#D14D41", + "base.blue": "#205EA6", + "base.blue.light": "#4385BE", + "base.green": "#66800B", + "base.green.light": "#879A39", + "base.magenta": "#A02F6F", + "base.magenta.light": "#CE5D97", + "base.cyan": "#24837B", + "base.cyan.light": "#3AA99F" + }, + "highlight": { + "editor.foreground": "#CECDC3", + "editor.background": "#100F0F", + "editor.active_line.background": "#1C1B1A", + "editor.line_number": "#575653", + "editor.active_line_number": "#3AA99F", + "editor.invisible": "#B7B5AC66", + "conflict": "#D0A215", + "created": "#879A39", + "hidden": "#575653", + "hint": "#575653", + "modified": "#D0A215", + "predictive": "#878580", + "syntax": { + "attribute": { + "color": "#4385BE" + }, + "boolean": { + "color": "#DA702C" + }, + "comment": { + "color": "#575653" + }, + "comment.doc": { + "color": "#575653" + }, + "constant": { + "color": "#CE5D97" + }, + "constructor": { + "color": "#4385BE" + }, + "embedded": { + "color": "#878580" + }, + "function": { + "color": "#DA702C" + }, + "keyword": { + "color": "#879A39" + }, + "link_text": { + "color": "#3AA99F" + }, + "link_uri": { + "color": "#3AA99F" + }, + "number": { + "color": "#8B7EC8" + }, + "string": { + "color": "#3AA99F" + }, + "string.escape": { + "color": "#3AA99F" + }, + "string.regex": { + "color": "#3AA99F" + }, + "string.special": { + "color": "#3AA99F" + }, + "string.special.symbol": { + "color": "#3AA99F" + }, + "tag": { + "color": "#4385BE" + }, + "text.literal": { + "color": "#3AA99F" + }, + "title": { + "color": "#D0A215", + "font_weight": 600 + }, + "type": { + "color": "#D0A215" + }, + "property": { + "color": "#DA702C" + }, + "variable.special": { + "color": "#4385BE" + } + } + } + } + ] +} diff --git a/assets/themes/gruvbox.json b/assets/themes/gruvbox.json new file mode 100644 index 00000000..1e79f7fd --- /dev/null +++ b/assets/themes/gruvbox.json @@ -0,0 +1,302 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Gruvbox", + "author": "Pavel Pertsev", + "url": "https://github.com/morhetz/gruvbox", + "themes": [ + { + "name": "Gruvbox Light", + "mode": "light", + "colors": { + "accent.background": "#e6d19e", + "accent.foreground": "#3c3836", + "background": "#fbf1c7", + "border": "#d5c4a1", + "danger.background": "#fb4934", + "danger.active.background": "#cc241d", + "danger.foreground": "#fbf1c7", + "foreground": "#3c3836", + "input.border": "#d5c4a1", + "link.active.foreground": "#458588", + "link.foreground": "#458588", + "link.hover.foreground": "#458588", + "list.active.background": "#d7992122", + "list.hover.background": "#ebdbb2", + "list.active.border": "#d79921", + "list.even.background": "#f9ecba", + "muted.background": "#d5c4a166", + "muted.foreground": "#928374", + "panel.background": "#ebdbb2", + "popover.background": "#fbf1c7", + "popover.foreground": "#3c3836", + "primary.active.background": "#b7841f", + "primary.background": "#d79921", + "primary.foreground": "#fbf1c7", + "primary.hover.background": "#d79921ee", + "ring": "#d79921", + "scrollbar.background": "#fbf1c700", + "scrollbar.thumb.background": "#d5c4a1", + "secondary.background": "#EBDBB2", + "secondary.active.background": "#d5c4a1", + "secondary.foreground": "#3c3836", + "secondary.hover.background": "#e8d5a6", + "tab.active.background": "#fbf1c7", + "tab.active.foreground": "#3c3836", + "tab.background": "#ebdbb200", + "tab.foreground": "#928374", + "tab_bar.background": "#ebdbb2", + "title_bar.background": "#ebdbb2", + "title_bar.border": "#d5c4a1", + "base.magenta.light": "#D3869B66", + "base.red": "#fb4934", + "base.green": "#67a64f", + "base.yellow": "#b57614", + "base.blue": "#076678", + "base.magenta": "#8f3f71", + "base.cyan": "#427b58" + }, + "highlight": { + "editor.foreground": "#3c3836", + "editor.background": "#fbf1c7", + "editor.active_line.background": "#ebdbb2", + "editor.line_number": "#928374", + "editor.active_line_number": "#3c3836", + "editor.invisible": "#92837466", + "conflict": "#cc241d", + "created": "#79740e", + "deleted": "#9d0006", + "error": "#cc241d", + "hidden": "#928374", + "hint": "#458588", + "ignored": "#928374", + "info": "#458588", + "modified": "#b57614", + "predictive": "#928374", + "renamed": "#b57614", + "success": "#79740e", + "unreachable": "#928374", + "warning": "#d79921", + "syntax": { + "attribute": { + "color": "#b57614" + }, + "boolean": { + "color": "#d79921" + }, + "comment": { + "color": "#928374", + "font_style": "italic" + }, + "comment.doc": { + "color": "#928374", + "font_style": "italic" + }, + "constant": { + "color": "#d79921" + }, + "constructor": { + "color": "#b57614" + }, + "embedded": { + "color": "#3c3836" + }, + "function": { + "color": "#d79921" + }, + "keyword": { + "color": "#cc241d" + }, + "link_text": { + "color": "#458588", + "font_style": "normal" + }, + "link_uri": { + "color": "#076678", + "font_style": "italic" + }, + "number": { + "color": "#cc241d" + }, + "string": { + "color": "#79740e" + }, + "string.escape": { + "color": "#79740e" + }, + "string.regex": { + "color": "#79740e" + }, + "string.special": { + "color": "#d79921" + }, + "string.special.symbol": { + "color": "#d79921" + }, + "tag": { + "color": "#b57614" + }, + "text.literal": { + "color": "#d79921" + }, + "title": { + "color": "#b57614", + "font_weight": 600 + }, + "type": { + "color": "#b57614" + }, + "property": { + "color": "#3c3836" + }, + "variable.special": { + "color": "#cc241d" + } + } + } + }, + { + "name": "Gruvbox Dark", + "mode": "dark", + "colors": { + "accent.background": "#303030", + "accent.foreground": "#ebdbb2", + "background": "#1d2021", + "border": "#3e3936", + "danger.active.background": "#fb4934", + "foreground": "#ebdbb2", + "input.border": "#504945", + "link.active.foreground": "#83a598", + "link.foreground": "#83a598", + "link.hover.foreground": "#83a598", + "list.active.background": "#d7992111", + "list.active.border": "#b17f1b", + "list.even.background": "#282828", + "muted.background": "#3c383655", + "muted.foreground": "#928374", + "panel.background": "#282828", + "popover.background": "#1d2021", + "popover.foreground": "#ebdbb2", + "primary.background": "#d79921", + "primary.foreground": "#282828", + "primary.hover.background": "#fabd2f", + "ring": "#b17f1b", + "scrollbar.background": "#1d202100", + "scrollbar.thumb.background": "#504945", + "secondary.active.background": "#333332", + "secondary.background": "#282828", + "secondary.foreground": "#ebdbb2", + "secondary.hover.background": "#33333299", + "tab.active.background": "#1d2021", + "tab.active.foreground": "#ebdbb2", + "tab.background": "#28282800", + "tab.foreground": "#928374", + "tab_bar.background": "#28282899", + "title_bar.background": "#252525", + "title_bar.border": "#3e3936", + "base.magenta.light": "#D3869B66", + "base.red": "#f06555", + "base.green": "#98971a", + "base.yellow": "#d79921", + "base.blue": "#458588", + "base.magenta": "#b16286", + "base.cyan": "#689d6a" + }, + "highlight": { + "editor.foreground": "#DDDDDD", + "editor.background": "#1d2021", + "editor.active_line.background": "#131313", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#92837466", + "conflict": "#f06555", + "created": "#3f72e2", + "deleted": "#9d0006", + "error": "#cc241d", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "ignored": "#928374", + "info": "#458588", + "modified": "#B0A878", + "predictive": "#5D5945", + "renamed": "#b57614", + "success": "#79740e", + "unreachable": "#928374", + "warning": "#d79921", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/harper.json b/assets/themes/harper.json new file mode 100644 index 00000000..470b7a98 --- /dev/null +++ b/assets/themes/harper.json @@ -0,0 +1,150 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Harper", + "author": "iTerm2-Color-Schemes", + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "themes": [ + { + "name": "Harper", + "mode": "dark", + "colors": { + "accent.background": "#27222c", + "accent.foreground": "#a8a49d", + "background": "#010101", + "border": "#333333", + "foreground": "#a8a49d", + "input.border": "#333333", + "list.active.background": "#B196C622", + "list.active.border": "#B196C699", + "list.even.background": "#18151B77", + "muted.background": "#171717", + "muted.foreground": "#726E69", + "panel.background": "#003a5b", + "popover.background": "#010101", + "popover.foreground": "#a8a49d", + "primary.background": "#B196C6", + "primary.foreground": "#000000", + "scrollbar.background": "#003a5b00", + "scrollbar.thumb.background": "#726E69", + "secondary.background": "#1b1b1b", + "secondary.active.background": "#2c2632", + "secondary.foreground": "#A8A49D", + "secondary.hover.background": "#23232399", + "tab.active.background": "#010101", + "tab.active.foreground": "#a8a49d", + "tab.foreground": "#787878", + "title_bar.background": "#101010", + "base.red": "#ff5874", + "base.red.light": "#ff587499", + "base.green": "#489e48", + "base.green.light": "#489e4899", + "base.blue": "#7fb5e1", + "base.blue.light": "#7fb5e199", + "base.cyan": "#bff5e5", + "base.cyan.light": "#bff5e599", + "base.magenta": "#b296c6", + "base.magenta.light": "#b296c699", + "base.yellow": "#f8b63f", + "base.yellow.light": "#f8b63f99" + }, + "highlight": { + "editor.foreground": "#a8a49d", + "editor.background": "#010101", + "editor.active_line.background": "#18151B", + "editor.line_number": "#726E69", + "editor.active_line_number": "#a8a49d", + "editor.invisible": "#726E6966", + "conflict": "#ff5874", + "created": "#489e48", + "deleted": "#ff5874", + "error": "#ff5874", + "hidden": "#726E69", + "hint": "#7fb5e1", + "ignored": "#726E69", + "info": "#7fb5e1", + "modified": "#b296c6", + "predictive": "#726E69", + "renamed": "#b296c6", + "success": "#489e48", + "unreachable": "#726E69", + "warning": "#f8b63f", + "syntax": { + "attribute": { + "color": "#b296c6" + }, + "boolean": { + "color": "#f8b63f" + }, + "comment": { + "color": "#726E69", + "font_style": "italic" + }, + "comment.doc": { + "color": "#726E69", + "font_style": "italic" + }, + "constant": { + "color": "#f8b63f" + }, + "constructor": { + "color": "#b296c6" + }, + "embedded": { + "color": "#a8a49d" + }, + "function": { + "color": "#f8b63f" + }, + "keyword": { + "color": "#ff5874" + }, + "link_text": { + "color": "#7fb5e1", + "font_style": "normal" + }, + "link_uri": { + "color": "#bff5e5", + "font_style": "italic" + }, + "number": { + "color": "#ff5874" + }, + "string": { + "color": "#489e48" + }, + "string.escape": { + "color": "#489e48" + }, + "string.regex": { + "color": "#489e48" + }, + "string.special": { + "color": "#f8b63f" + }, + "string.special.symbol": { + "color": "#f8b63f" + }, + "tag": { + "color": "#b296c6" + }, + "text.literal": { + "color": "#f8b63f" + }, + "title": { + "color": "#b296c6", + "font_weight": 600 + }, + "type": { + "color": "#b296c6" + }, + "property": { + "color": "#a8a49d" + }, + "variable.special": { + "color": "#ff5874" + } + } + } + } + ] +} diff --git a/assets/themes/hybrid.json b/assets/themes/hybrid.json new file mode 100644 index 00000000..4ef5ee4b --- /dev/null +++ b/assets/themes/hybrid.json @@ -0,0 +1,303 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Hybrid", + "author": "Andrew Wong", + "url": "https://github.com/w0ng/vim-hybrid", + "themes": [ + { + "name": "Hybrid Light", + "mode": "light", + "shadow": false, + "colors": { + "accent.background": "#c8ced1", + "accent.foreground": "#1c1c1c", + "background": "#E4E4E4", + "border": "#CACACA", + "danger.background": "#ff5f5f", + "danger.foreground": "#ffffff", + "foreground": "#1c1c1c", + "input.border": "#CACACA", + "link.active.foreground": "#005f87", + "link.foreground": "#005f87", + "link.hover.foreground": "#005f87", + "list.active.background": "#79792C20", + "list.active.border": "#79792C", + "list.hover.background": "#D5D5D5", + "list.even.background": "#DFDFDF", + "muted.background": "#d7d7d7", + "muted.foreground": "#5f5f5f", + "primary.background": "#005f87", + "primary.foreground": "#ffffff", + "scrollbar.background": "#E0E0E000", + "scrollbar.thumb.background": "#8f8f8f", + "secondary.background": "#D0D0D0", + "secondary.active.background": "#c4c4c4", + "secondary.foreground": "#1c1c1c", + "secondary.hover.background": "#c4c4c499", + "tab.active.background": "#E4E4E4", + "tab.active.foreground": "#1c1c1c", + "tab.background": "#e8e8e800", + "tab.foreground": "#5f5f5f", + "tab_bar.background": "#e8e8e8", + "title_bar.background": "#D0D0D0", + "title_bar.border": "#B3B3B3", + "status_bar.background": "#DADADA", + "base.red": "#5F0000", + "base.green": "#005F00", + "base.yellow": "#948000", + "base.blue": "#00195f", + "base.magenta": "#5f1c51", + "base.magenta.light": "#5f1c5111", + "base.cyan": "#005a5f" + }, + "highlight": { + "editor.foreground": "#1c1c1c", + "editor.background": "#E4E4E4", + "editor.active_line.background": "#D3D3D3", + "editor.line_number": "#5F5F5F", + "editor.active_line_number": "#1C1C1C", + "editor.invisible": "#5F5F5F66", + "conflict": "#D2602D", + "created": "#3F72E2", + "deleted": "#FF5F5F", + "error": "#FF5F5F", + "hidden": "#9E9E9E", + "hint": "#5F87AF", + "ignored": "#B3B3B3", + "info": "#005F87", + "modified": "#B0A878", + "predictive": "#5D5945", + "renamed": "#5F87AF", + "success": "#005F00", + "unreachable": "#9E9E9E", + "warning": "#948000", + "syntax": { + "attribute": { + "color": "#948000" + }, + "boolean": { + "color": "#005F00" + }, + "comment": { + "color": "#5F5F5F", + "font_style": "italic" + }, + "comment.doc": { + "color": "#5F5F5F", + "font_style": "italic" + }, + "constant": { + "color": "#005F87" + }, + "constructor": { + "color": "#79792C" + }, + "embedded": { + "color": "#1C1C1C" + }, + "function": { + "color": "#005F87" + }, + "keyword": { + "color": "#5F1C51" + }, + "link_text": { + "color": "#005F87", + "font_style": "underline" + }, + "link_uri": { + "color": "#005F87", + "font_style": "italic" + }, + "number": { + "color": "#005F00" + }, + "string": { + "color": "#005F00" + }, + "string.escape": { + "color": "#005F00" + }, + "string.regex": { + "color": "#005F00" + }, + "string.special": { + "color": "#005F87" + }, + "string.special.symbol": { + "color": "#005F87" + }, + "tag": { + "color": "#79792C" + }, + "text.literal": { + "color": "#005F87" + }, + "title": { + "color": "#005F87", + "font_weight": 600 + }, + "type": { + "color": "#5F1C51" + }, + "property": { + "color": "#1C1C1C" + }, + "variable.special": { + "color": "#5F1C51" + } + } + } + }, + { + "name": "Hybrid Dark", + "mode": "dark", + "colors": { + "accent.background": "#31393a", + "accent.foreground": "#e8e8e8", + "background": "#1D1F21", + "border": "#34373c", + "foreground": "#e8e8e8", + "input.border": "#34373c", + "link.active.foreground": "#87d7ff", + "link.foreground": "#81A2BE", + "link.hover.foreground": "#006f9f", + "list.active.background": "#15678a10", + "list.active.border": "#15678a", + "list.even.background": "#282A2E", + "muted.background": "#282A2E99", + "muted.foreground": "#878787", + "panel.background": "#1D1F21", + "popover.background": "#1D1F21", + "popover.foreground": "#e8e8e8", + "primary.background": "#15678a", + "primary.foreground": "#e8e8e8", + "scrollbar.background": "#1D1F2100", + "scrollbar.thumb.background": "#5f5f5f", + "secondary.background": "#303336", + "secondary.active.background": "#33363b", + "secondary.foreground": "#e8e8e8", + "secondary.hover.background": "#373b3e", + "tab.active.background": "#1D1F21", + "tab.active.foreground": "#d4d4d4", + "tab.background": "#24262700", + "tab.foreground": "#999999", + "tab_bar.background": "#242627", + "title_bar.background": "#242629", + "title_bar.border": "#34373c", + "base.red": "#8a1515", + "base.red.light": "#ff5f5f", + "base.green": "#7c8a15", + "base.green.light": "#b3bf5a", + "base.yellow": "#8a7c15", + "base.yellow.light": "#e4b55e", + "base.blue": "#15678a", + "base.blue.light": "#6e90b0", + "base.magenta": "#8a1567", + "base.magenta.light": "#B294BB", + "base.cyan": "#15678a", + "base.cyan.light": "#7fbfb4" + }, + "highlight": { + "editor.foreground": "#DDDDDD", + "editor.background": "#000000", + "editor.active_line.background": "#131313", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#5F5F5F66", + "conflict": "#D2602D", + "created": "#3f72e2", + "created.background": "#0C4619", + "deleted.background": "#46190C", + "error.background": "#46190C", + "error.border": "#802207", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "hint.background": "#250c4b", + "hint.border": "#3f0891", + "info.background": "#0C194D", + "info.border": "#082190", + "modified": "#B0A878", + "modified.background": "#3A310E", + "predictive": "#5D5945", + "success.background": "#0C4619", + "warning.background": "#3A310E", + "warning.border": "#7B6508", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/jellybeans.json b/assets/themes/jellybeans.json new file mode 100644 index 00000000..e9ba1a07 --- /dev/null +++ b/assets/themes/jellybeans.json @@ -0,0 +1,147 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Jellybeans", + "author": "nanotech", + "url": "https://github.com/nanotech/jellybeans.vim", + "themes": [ + { + "name": "Jellybeans", + "mode": "dark", + "colors": { + "accent.background": "#292929", + "accent.foreground": "#e8e8e8", + "background": "#151515", + "border": "#2e2e2e", + "danger.foreground": "#151515", + "foreground": "#E8E8D3", + "input.border": "#4E4847", + "link.active.foreground": "#97bedc", + "link.foreground": "#97bedc", + "link.hover.foreground": "#97bedc", + "list.active.background": "#97bedc15", + "list.active.border": "#97bedc", + "list.even.background": "#1C1C1C", + "muted.background": "#242424", + "muted.foreground": "#767676", + "panel.background": "#151515", + "popover.background": "#151515", + "popover.foreground": "#e8e8e8", + "primary.background": "#97bedc", + "primary.foreground": "#151515", + "scrollbar.background": "#26262600", + "scrollbar.thumb.background": "#6e6e6e", + "secondary.background": "#2F2F2F", + "secondary.active.background": "#2f2f2f", + "secondary.foreground": "#e8e8e8", + "secondary.hover.background": "#252525", + "tab.active.background": "#151515", + "tab.active.foreground": "#e8e8e8", + "tab.background": "#10101000", + "tab.foreground": "#969696", + "tab_bar.background": "#101010", + "title_bar.background": "#101010", + "title_bar.border": "#2e2e2e", + "base.red": "#e27373", + "base.red.light": "#ffa1a1", + "base.green": "#94b979", + "base.green.light": "#bddeab", + "base.yellow": "#ffba7b", + "base.yellow.light": "#ffdca0", + "base.blue": "#97bedc", + "base.blue.light": "#b1d8f6", + "base.magenta": "#B294BB", + "base.magenta.light": "#fbdaff", + "base.cyan": "#00988e", + "base.cyan.light": "#1ab2a8" + }, + "highlight": { + "editor.foreground": "#DDDDDD", + "editor.background": "#000000", + "editor.active_line.background": "#131313", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#9E9E9E66", + "conflict": "#D2602D", + "created": "#3f72e2", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "modified": "#B0A878", + "predictive": "#5D5945", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/kibble.json b/assets/themes/kibble.json new file mode 100644 index 00000000..87ea9db0 --- /dev/null +++ b/assets/themes/kibble.json @@ -0,0 +1,157 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Kibble", + "author": "iTerm2-Color-Schemes", + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "themes": [ + { + "name": "Kibble", + "mode": "dark", + "colors": { + "accent.background": "#252525", + "accent.foreground": "#f7f7f7", + "background": "#0e100a", + "border": "#292a24", + "danger.background": "#e07b5c", + "foreground": "#f7f7f7", + "input.border": "#333333", + "list.active.background": "#2BCF1315", + "list.active.border": "#2BCF13", + "list.hover.background": "#2c292b54", + "list.even.background": "#24222355", + "muted.background": "#292a2455", + "muted.foreground": "#777777", + "panel.background": "#003a5b", + "popover.background": "#0e100a", + "popover.foreground": "#f7f7f7", + "primary.active.background": "#6ce05c99", + "primary.background": "#6ce05c", + "primary.foreground": "#101010", + "scrollbar.background": "#003a5b00", + "scrollbar.thumb.background": "#726E69", + "secondary.background": "#22231f", + "secondary.active.background": "#292825", + "secondary.foreground": "#f7f7f7", + "secondary.hover.background": "#22231f", + "success.background": "#5c6ee0", + "warning.background": "#e0c85c", + "info.background": "#5cd1e0", + "selection.background": "#9ba787", + "tab.active.background": "#0e100a", + "tab.active.foreground": "#f7f7f7", + "tab.foreground": "#969696", + "title_bar.background": "#161712", + "base.red": "#C70231", + "base.red.light": "#e07b5c", + "base.green": "#2BCF13", + "base.green.light": "#6ce05c", + "base.blue": "#3449d1", + "base.blue.light": "#5c6ee0", + "base.cyan": "#0798ab", + "base.cyan.light": "#5cd1e0", + "base.magenta": "#8400ff", + "base.magenta.light": "#C495F0", + "base.yellow": "#c7a302", + "base.yellow.light": "#e0c85c" + }, + "highlight": { + "editor.foreground": "#f7f7f7", + "editor.background": "#0e100a", + "editor.active_line.background": "#242223", + "editor.line_number": "#726E69", + "editor.active_line_number": "#f7f7f7", + "editor.invisible": "#726E6966", + "conflict": "#c70031", + "created": "#2BCF13", + "deleted": "#c70031", + "error": "#c70031", + "hidden": "#726E69", + "hint": "#0798ab", + "ignored": "#726E69", + "info": "#0798ab", + "modified": "#3449d1", + "predictive": "#726E69", + "renamed": "#3449d1", + "success": "#2BCF13", + "unreachable": "#726E69", + "warning": "#c7a302", + "syntax": { + "attribute": { + "color": "#3449d1" + }, + "boolean": { + "color": "#c7a302" + }, + "comment": { + "color": "#726E69", + "font_style": "italic" + }, + "comment.doc": { + "color": "#726E69", + "font_style": "italic" + }, + "constant": { + "color": "#c7a302" + }, + "constructor": { + "color": "#3449d1" + }, + "embedded": { + "color": "#f7f7f7" + }, + "function": { + "color": "#c7a302" + }, + "keyword": { + "color": "#c70031" + }, + "link_text": { + "color": "#0798ab", + "font_style": "normal" + }, + "link_uri": { + "color": "#68f2e0", + "font_style": "italic" + }, + "number": { + "color": "#c70031" + }, + "string": { + "color": "#2BCF13" + }, + "string.escape": { + "color": "#2BCF13" + }, + "string.regex": { + "color": "#2BCF13" + }, + "string.special": { + "color": "#c7a302" + }, + "string.special.symbol": { + "color": "#c7a302" + }, + "tag": { + "color": "#3449d1" + }, + "text.literal": { + "color": "#c7a302" + }, + "title": { + "color": "#3449d1", + "font_weight": 600 + }, + "type": { + "color": "#3449d1" + }, + "property": { + "color": "#f7f7f7" + }, + "variable.special": { + "color": "#c70031" + } + } + } + } + ] +} diff --git a/assets/themes/macos-classic.json b/assets/themes/macos-classic.json new file mode 100644 index 00000000..342a9b3a --- /dev/null +++ b/assets/themes/macos-classic.json @@ -0,0 +1,288 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "macOS Classic", + "author": "huacnlee", + "url": "https://github.com/huacnlee/zed-theme-macos-classic", + "themes": [ + { + "name": "macOS Classic Light", + "mode": "light", + "shadow": false, + "colors": { + "accent.background": "#E0E0E0", + "accent.foreground": "#000000", + "background": "#F9F9F9", + "foreground": "#000000", + "border": "#D2D2D2", + "ring": "#0060de", + "danger.foreground": "#FFFFFF", + "list.active.background": "#0060de15", + "list.active.border": "#0060de", + "list.even.background": "#EFEFEF", + "list.hover.background": "#E7E7E7", + "muted.background": "#EAEAEA", + "muted.foreground": "#707070", + "popover.background": "#F5F5F5", + "popover.foreground": "#000000", + "primary.background": "#0060de", + "primary.foreground": "#FFFFFF", + "scrollbar.background": "#FFFFFF00", + "scrollbar.thumb.background": "#C8C8C8", + "secondary.active.background": "#D9D9D9", + "secondary.background": "#E0E0E0", + "secondary.foreground": "#000000", + "secondary.hover.background": "#E5E5E5", + "tab.active.foreground": "#000000", + "tab.background": "#E9E9E9", + "tab.foreground": "#606060", + "tab_bar.background": "#E9E9E9", + "title_bar.background": "#F7F7F7", + "title_bar.border": "#DADADA", + "status_bar.background": "#E9E9E9", + "base.yellow": "#B59A00", + "base.red": "#d21f07", + "base.blue": "#0060de", + "base.green": "#319a00", + "base.magenta": "#9A0068", + "base.cyan": "#007E8A" + }, + "highlight": { + "editor.foreground": "#000000", + "editor.background": "#ffffff", + "editor.active_line.background": "#F5F5F5", + "editor.line_number": "#929292", + "editor.active_line_number": "#000000", + "editor.invisible": "#007fff66", + "conflict": "#d21f07", + "created": "#0060de", + "hidden": "#6D6D6D", + "hint": "#9A0068", + "modified": "#319a00", + "predictive": "#A4ABB6", + "warning": "#B59A00", + "syntax": { + "attribute": { + "color": "#957931" + }, + "boolean": { + "color": "#C5060B" + }, + "comment": { + "color": "#007fff" + }, + "comment.doc": { + "color": "#007fff" + }, + "constant": { + "color": "#C5060B" + }, + "constructor": { + "color": "#0433ff" + }, + "embedded": { + "color": "#333333" + }, + "function": { + "color": "#0000A2" + }, + "keyword": { + "color": "#0433ff" + }, + "link_text": { + "color": "#0000A2", + "font_style": "normal" + }, + "link_uri": { + "color": "#6A7293", + "font_style": "italic" + }, + "number": { + "color": "#0433ff" + }, + "string": { + "color": "#036A07" + }, + "string.escape": { + "color": "#036A07" + }, + "string.regex": { + "color": "#036A07" + }, + "string.special": { + "color": "#d21f07" + }, + "string.special.symbol": { + "color": "#d21f07" + }, + "tag": { + "color": "#0433ff" + }, + "text.literal": { + "color": "#6F42C1" + }, + "title": { + "color": "#0433FF" + }, + "type": { + "color": "#6f42c1" + }, + "property": { + "color": "#333333" + }, + "variable": { + "color": "#333333" + }, + "variable.special": { + "color": "#C5060B" + } + } + } + }, + { + "name": "macOS Classic Dark", + "mode": "dark", + "shadow": false, + "colors": { + "accent.background": "#282629", + "accent.foreground": "#CACCCA", + "background": "#131313", + "border": "#303030", + "ring": "#077CFD", + "foreground": "#DEDEDE", + "danger.background": "#E44A4F", + "list.even.background": "#232323", + "list.active.background": "#0059D115", + "list.active.border": "#077CFD", + "muted.background": "#202020", + "muted.foreground": "#9D9D9D", + "popover.background": "#101010", + "popover.foreground": "#CACCCA", + "primary.background": "#077CFD", + "primary.foreground": "#F2F9FF", + "switch.background": "#393939", + "switch.thumb.background": "#DAECFF", + "scrollbar.background": "#13131300", + "scrollbar.thumb.background": "#9F9F9F", + "secondary.active.background": "#353535", + "secondary.background": "#353535", + "secondary.foreground": "#DEDEDE", + "secondary.hover.background": "#35353599", + "link": "#419CFF", + "tab_bar.background": "#1C1C1E", + "tab.active.background": "#131313", + "tab.foreground": "#8F8F8F", + "title_bar.background": "#171717", + "selection.background": "#3F638B", + "base.blue": "#419CFF", + "base.cyan": "#07FDD3", + "base.green": "#30D158", + "base.magenta": "#A550A7", + "base.red": "#FF5257", + "base.yellow": "#FFC600" + }, + "highlight": { + "editor.foreground": "#CACCCA", + "editor.background": "#131313", + "editor.active_line.background": "#35343666", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#007fff66", + "conflict": "#D2602D", + "created": "#3f72e2", + "created.background": "#0C4619", + "deleted.background": "#46190C", + "error.background": "#46190C", + "error.border": "#E44A4F", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "hint.background": "#250c4b", + "hint.border": "#3f0891", + "info.background": "#0059D1", + "info.border": "#0059D1", + "modified": "#B0A878", + "modified.background": "#3A310E", + "predictive": "#5D5945", + "success.background": "#0C4619", + "warning.background": "#3A310E", + "warning.border": "#7B6508", + "syntax": { + "attribute": { + "color": "#7FAEF9" + }, + "boolean": { + "color": "#CC9E00" + }, + "comment": { + "color": "#9D9D9D" + }, + "comment.doc": { + "color": "#9D9D9D" + }, + "constant": { + "color": "#CC9E00" + }, + "constructor": { + "color": "#CBA6F7" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#B3C5F3" + }, + "keyword": { + "color": "#87B1F6" + }, + "link_text": { + "color": "#419CFF", + "font_style": "normal" + }, + "link_uri": { + "color": "#7faef9", + "font_style": "italic" + }, + "number": { + "color": "#CC9E00" + }, + "string": { + "color": "#A3E09F" + }, + "text.code.span": { + "color": "#A3E09F" + }, + "string.escape": { + "color": "#68DC7C" + }, + "string.regex": { + "color": "#68DC7C" + }, + "string.special": { + "color": "#A3E09F" + }, + "string.special.symbol": { + "color": "#A3E09F" + }, + "tag": { + "color": "#419CFF" + }, + "text.literal": { + "color": "#A3E09F" + }, + "title": { + "color": "#CC9E00", + "font_weight": 600 + }, + "type": { + "color": "#CBA6F7" + }, + "property": { + "color": "#BCC4E0" + }, + "variable.special": { + "color": "#419CFF" + } + } + } + } + ] +} diff --git a/assets/themes/mellifluous.json b/assets/themes/mellifluous.json new file mode 100644 index 00000000..8bf4429a --- /dev/null +++ b/assets/themes/mellifluous.json @@ -0,0 +1,330 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Mellifluous", + "author": "Ramojus Lapinskas", + "url": "https://github.com/ramojus/mellifluous.nvim", + "themes": [ + { + "name": "Mellifluous Light", + "mode": "light", + "shadow": false, + "colors": { + "accent.background": "#d4d4d4", + "accent.foreground": "#383a42", + "background": "#E7E7E7", + "border": "#CACACA", + "danger.active.background": "#e06c75", + "danger.hover.background": "#be5046", + "foreground": "#383a42", + "link.active.foreground": "#5A6599", + "link.foreground": "#5A6599", + "link.hover.foreground": "#5A6599", + "list.hover.background": "#d5d5d5", + "list.active.background": "#5A659912", + "list.active.border": "#5A6599", + "list.even.background": "#F0F0F0", + "muted.background": "#E0E0E0", + "muted.foreground": "#828997", + "panel.background": "#fafafa", + "popover.background": "#E4E4E4", + "popover.foreground": "#383a42", + "primary.active.background": "#5A6599AA", + "primary.background": "#5A6599", + "primary.foreground": "#F0F0F0", + "primary.hover.background": "#626ca2", + "scrollbar.background": "#fafafa00", + "scrollbar.thumb.background": "#c0c0c0", + "secondary.background": "#d0d0d0", + "secondary.active.background": "#cccccc", + "secondary.foreground": "#383a42", + "secondary.hover.background": "#d7d7d7", + "tab.active.background": "#E7E7E7", + "tab.active.foreground": "#383a42", + "tab.background": "#F0F0F000", + "tab.foreground": "#727272", + "tab_bar.background": "#E7E7E7", + "title_bar.background": "#dfdfdf", + "title_bar.border": "#CACACA", + "status_bar.background": "#dfdfdf", + "base.red": "#C95954", + "base.green": "#828040", + "base.yellow": "#c98f54", + "base.blue": "#a8a1be", + "base.magenta": "#b39fb0", + "base.magenta.light": "#9C699588", + "base.cyan": "#54c981" + }, + "highlight": { + "editor.foreground": "#383a42", + "editor.background": "#E7E7E7", + "editor.active_line.background": "#d5d5d5", + "editor.line_number": "#727272", + "editor.active_line_number": "#383a42", + "editor.invisible": "#A0A0A066", + "conflict": "#e06c75", + "created": "#828040", + "deleted": "#be5046", + "error": "#e06c75", + "hidden": "#727272", + "hint": "#5A6599", + "ignored": "#727272", + "info": "#5A6599", + "modified": "#727272", + "predictive": "#727272", + "renamed": "#727272", + "success": "#828040", + "unreachable": "#727272", + "warning": "#cbaa89", + "syntax": { + "attribute": { + "color": "#727272" + }, + "boolean": { + "color": "#cbaa89" + }, + "comment": { + "color": "#A0A0A0", + "font_style": "italic" + }, + "comment.doc": { + "color": "#A0A0A0", + "font_style": "italic" + }, + "constant": { + "color": "#cbaa89" + }, + "constructor": { + "color": "#727272" + }, + "embedded": { + "color": "#383a42" + }, + "function": { + "color": "#cbaa89" + }, + "keyword": { + "color": "#e06c75" + }, + "link_text": { + "color": "#5A6599", + "font_style": "normal" + }, + "link_uri": { + "color": "#5A6599", + "font_style": "italic" + }, + "number": { + "color": "#e06c75" + }, + "string": { + "color": "#828040" + }, + "string.escape": { + "color": "#828040" + }, + "string.regex": { + "color": "#828040" + }, + "string.special": { + "color": "#cbaa89" + }, + "string.special.symbol": { + "color": "#cbaa89" + }, + "tag": { + "color": "#727272" + }, + "text.literal": { + "color": "#cbaa89" + }, + "title": { + "color": "#727272", + "font_weight": 600 + }, + "type": { + "color": "#727272" + }, + "property": { + "color": "#383a42" + }, + "variable.special": { + "color": "#e06c75" + } + } + } + }, + { + "name": "Mellifluous Dark", + "mode": "dark", + "shadow": false, + "colors": { + "accent.background": "#2f2f2f", + "accent.foreground": "#abb2bf", + "background": "#1A1A1A", + "border": "#444444", + "foreground": "#abb2bf", + "input.border": "#444444", + "link.active.foreground": "#5A6599", + "link.foreground": "#5A6599", + "link.hover.foreground": "#5A6599", + "list.active.background": "#5A659922", + "list.active.border": "#5A6599", + "list.even.background": "#29292988", + "muted.background": "#44444455", + "muted.foreground": "#828997", + "panel.background": "#282c34", + "popover.background": "#1A1A1A", + "popover.foreground": "#abb2bf", + "primary.active.background": "#5A6599AA", + "primary.background": "#5A6599", + "primary.foreground": "#ecedf4", + "primary.hover.background": "#626ca2", + "scrollbar.background": "#282c3400", + "scrollbar.thumb.background": "#444444", + "secondary.background": "#292929", + "secondary.active.background": "#323232", + "secondary.foreground": "#abb2bf", + "secondary.hover.background": "#292929", + "tab.active.background": "#1A1A1A", + "tab.active.foreground": "#abb2bf", + "tab.background": "#1A1A1A00", + "tab.foreground": "#abb2bf", + "title_bar.background": "#171717", + "title_bar.border": "#444444", + "base.red": "#C95954", + "base.green": "#828040", + "base.yellow": "#c98d54", + "base.blue": "#5481c9", + "base.magenta": "#9C6995", + "base.magenta.light": "#9C699577", + "base.cyan": "#54c9bd" + }, + "highlight": { + "editor.foreground": "#abb2bf", + "editor.background": "#1A1A1A", + "editor.active_line.background": "#29292977", + "editor.line_number": "#828997", + "editor.active_line_number": "#abb2bf", + "editor.invisible": "#A0A0A066", + "conflict": "#e06c75", + "conflict.background": "#1A1A1A", + "conflict.border": "#be5046", + "created": "#828040", + "created.background": "#292929", + "created.border": "#929292", + "deleted": "#be5046", + "deleted.background": "#1A1A1A", + "deleted.border": "#e06c75", + "error": "#e06c75", + "error.background": "#1A1A1A", + "error.border": "#be5046", + "hidden": "#828997", + "hidden.background": "#292929", + "hidden.border": "#444444", + "hint": "#5A6599", + "hint.background": "#292929", + "hint.border": "#626ca2", + "ignored": "#828997", + "ignored.background": "#292929", + "ignored.border": "#444444", + "info": "#5A6599", + "info.background": "#292929", + "info.border": "#626ca2", + "modified": "#929292", + "modified.background": "#292929", + "modified.border": "#444444", + "predictive": "#828997", + "predictive.background": "#292929", + "predictive.border": "#444444", + "renamed": "#929292", + "renamed.background": "#292929", + "renamed.border": "#444444", + "success": "#828040", + "success.background": "#292929", + "success.border": "#929292", + "unreachable": "#828997", + "unreachable.background": "#292929", + "unreachable.border": "#444444", + "warning": "#d19a66", + "warning.background": "#292929", + "warning.border": "#929292", + "syntax": { + "attribute": { + "color": "#929292" + }, + "boolean": { + "color": "#d19a66" + }, + "comment": { + "color": "#828997", + "font_style": "italic" + }, + "comment.doc": { + "color": "#828997", + "font_style": "italic" + }, + "constant": { + "color": "#d19a66" + }, + "constructor": { + "color": "#929292" + }, + "embedded": { + "color": "#abb2bf" + }, + "function": { + "color": "#d19a66" + }, + "keyword": { + "color": "#e06c75" + }, + "link_text": { + "color": "#5A6599", + "font_style": "normal" + }, + "link_uri": { + "color": "#5A6599", + "font_style": "italic" + }, + "number": { + "color": "#e06c75" + }, + "string": { + "color": "#828040" + }, + "string.escape": { + "color": "#828040" + }, + "string.regex": { + "color": "#828040" + }, + "string.special": { + "color": "#d19a66" + }, + "string.special.symbol": { + "color": "#d19a66" + }, + "tag": { + "color": "#929292" + }, + "text.literal": { + "color": "#d19a66" + }, + "title": { + "color": "#929292", + "font_weight": 600 + }, + "type": { + "color": "#929292" + }, + "property": { + "color": "#abb2bf" + }, + "variable.special": { + "color": "#e06c75" + } + } + } + } + ] +} diff --git a/assets/themes/molokai.json b/assets/themes/molokai.json new file mode 100644 index 00000000..f82cb7f6 --- /dev/null +++ b/assets/themes/molokai.json @@ -0,0 +1,283 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Molokai", + "author": "Tomas Restrepo", + "url": "https://github.com/tomasr/molokai", + "themes": [ + { + "name": "Molokai Light", + "mode": "light", + "shadow": false, + "colors": { + "accent.background": "#EBE4E1", + "accent.foreground": "#060606", + "background": "#FEFAF9", + "border": "#E4DEDA", + "window_border": "#d6d6d6", + "ring": "#a0a0ab", + "foreground": "#0a0a0a", + "input.border": "#E4DEDA", + "list.active.background": "#E1477411", + "list.active.border": "#E14774AA", + "list.even.background": "#E4DEDA33", + "muted.background": "#f1eded", + "muted.foreground": "#767676", + "panel.background": "#FEFAF9", + "popover.background": "#FEFAF9", + "popover.foreground": "#0a0a0a", + "primary.background": "#E14774", + "primary.foreground": "#fafafa", + "scrollbar.background": "#FEFAF900", + "scrollbar.thumb.background": "#ADADB0", + "secondary.background": "#E4DEDA", + "secondary.foreground": "#060606", + "secondary.hover.background": "#E4DEDA99", + "title_bar.background": "#e8e3e0", + "title_bar.border": "#d5ccc6", + "base.red": "#e17047", + "base.green": "#82cc0a", + "base.yellow": "#ccac0a", + "base.blue": "#e16032", + "base.blue.light": "#e16032", + "base.magenta": "#7058be", + "base.cyan": "#0acc78" + }, + "highlight": { + "editor.foreground": "#0a0a0a", + "editor.background": "#FEFAF9", + "editor.active_line.background": "#E4DEDA", + "editor.line_number": "#767676", + "editor.active_line_number": "#0a0a0a", + "editor.invisible": "#76767666", + "conflict": "#e14775", + "created": "#269D69", + "deleted": "#e14775", + "error": "#e14775", + "hidden": "#767676", + "hint": "#7058be", + "ignored": "#767676", + "info": "#1c8ca8", + "modified": "#cc7a0a", + "predictive": "#ADADB0", + "renamed": "#E14774", + "success": "#269D69", + "unreachable": "#767676", + "warning": "#cc7a0a", + "syntax": { + "attribute": { + "color": "#e14775" + }, + "boolean": { + "color": "#cc7a0a" + }, + "comment": { + "color": "#767676", + "font_style": "italic" + }, + "comment.doc": { + "color": "#767676", + "font_style": "italic" + }, + "constant": { + "color": "#7058be" + }, + "constructor": { + "color": "#269D69" + }, + "embedded": { + "color": "#1c8ca8" + }, + "function": { + "color": "#e14775" + }, + "keyword": { + "color": "#e14775", + "font_style": "normal" + }, + "link_text": { + "color": "#cc7a0a", + "font_style": "underline" + }, + "link_uri": { + "color": "#7058be", + "font_style": "italic" + }, + "number": { + "color": "#cc7a0a" + }, + "string": { + "color": "#269D69" + }, + "string.escape": { + "color": "#7058be" + }, + "string.regex": { + "color": "#269D69" + }, + "string.special": { + "color": "#e14775" + }, + "string.special.symbol": { + "color": "#e14775" + }, + "tag": { + "color": "#e14775" + }, + "text.literal": { + "color": "#7058be" + }, + "title": { + "color": "#cc7a0a", + "font_weight": 600 + }, + "type": { + "color": "#1c8ca8" + }, + "property": { + "color": "#7058be" + }, + "variable.special": { + "color": "#e14775" + } + } + } + }, + { + "name": "Molokai Dark", + "mode": "dark", + "colors": { + "accent.background": "#2b2f30", + "accent.foreground": "#f8f8f2", + "background": "#1b1d1e", + "border": "#393939", + "foreground": "#f8f8f2", + "input.border": "#3b3b3b", + "list.active.background": "#f9267211", + "list.active.border": "#f9267288", + "list.even.background": "#292c2e", + "muted.background": "#232526", + "muted.foreground": "#5b5a54", + "panel.background": "#1b1d1e", + "popover.background": "#1b1d1e", + "popover.foreground": "#f8f8f2", + "primary.background": "#dc1860", + "primary.foreground": "#f8f8f2", + "scrollbar.background": "#1b1d1e00", + "scrollbar.thumb.background": "#4b4b4b", + "secondary.background": "#292c2e", + "secondary.active.background": "#303436", + "secondary.foreground": "#f5f5f4", + "secondary.hover.background": "#30343699", + "table.row.border": "#3b3b3b70", + "title_bar.background": "#202223", + "title_bar.border": "#3b3b3b", + "base.red": "#dc1860", + "base.green": "#82cc0a", + "base.yellow": "#807607", + "base.blue": "#075880", + "base.magenta": "#800780", + "base.cyan": "#07807e" + }, + "highlight": { + "editor.foreground": "#DDDDDD", + "editor.background": "#000000", + "editor.active_line.background": "#131313", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#76767666", + "conflict": "#D2602D", + "created": "#3f72e2", + "created.background": "#0C4619", + "deleted.background": "#46190C", + "error.background": "#46190C", + "error.border": "#802207", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "hint.background": "#250c4b", + "hint.border": "#3f0891", + "info.background": "#0C194D", + "info.border": "#082190", + "modified": "#B0A878", + "modified.background": "#3A310E", + "predictive": "#5D5945", + "success.background": "#0C4619", + "warning.background": "#3A310E", + "warning.border": "#7B6508", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/solarized.json b/assets/themes/solarized.json new file mode 100644 index 00000000..e5621f19 --- /dev/null +++ b/assets/themes/solarized.json @@ -0,0 +1,291 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Solarized", + "author": "Ethan Schoonover", + "url": "https://ethanschoonover.com/solarized", + "themes": [ + { + "name": "Solarized Light", + "mode": "light", + "colors": { + "accent.background": "#ebe4ce", + "accent.foreground": "#073642", + "background": "#FDF6E3", + "border": "#DCD4BC", + "foreground": "#586E75", + "input.border": "#DCD4BC", + "link.foreground": "#587573", + "list.active.background": "#586E75", + "list.active.border": "#586E75", + "list.even.background": "#EEE8D599", + "muted.background": "#eee8d5", + "muted.foreground": "#93a1a1", + "panel.background": "#fdf6e3", + "popover.background": "#fdf6e3", + "popover.foreground": "#073642", + "primary.background": "#586E75", + "primary.foreground": "#fdf6e3", + "scrollbar.background": "#EEE8D500", + "scrollbar.thumb.background": "#d5cbaf", + "secondary.background": "#EEE8D5", + "secondary.active.background": "#DCD4BC", + "secondary.foreground": "#073642", + "secondary.hover.background": "#DCD4BC88", + "tab.active.background": "#fdf6e3", + "tab.active.foreground": "#073642", + "tab.background": "#fdf6e300", + "tab.foreground": "#657b83", + "tab_bar.background": "#eee8d5", + "title_bar.background": "#f4ecd7", + "title_bar.border": "#dcd4bc", + "chart.grid": "#ebe5d4", + "base.red": "#755858", + "base.green": "#717558", + "base.yellow": "#756e58", + "base.blue": "#586975", + "base.magenta": "#755866", + "base.cyan": "#587573" + }, + "highlight": { + "editor.foreground": "#586E75", + "editor.background": "#FDF6E3", + "editor.active_line.background": "#EEE8D5", + "editor.line_number": "#93A1A1", + "editor.active_line_number": "#073642", + "editor.invisible": "#93A1A166", + "conflict": "#DC322F", + "created": "#859900", + "deleted": "#DC322F", + "error": "#DC322F", + "hidden": "#93A1A1", + "hint": "#2AA198", + "ignored": "#93A1A1", + "info": "#268BD2", + "modified": "#B58900", + "predictive": "#586E75", + "renamed": "#2AA198", + "success": "#859900", + "unreachable": "#DC322F", + "warning": "#B58900", + "syntax": { + "attribute": { + "color": "#B58900" + }, + "boolean": { + "color": "#CB4B16" + }, + "comment": { + "color": "#93A1A1", + "font_style": "italic" + }, + "comment.doc": { + "color": "#93A1A1", + "font_style": "italic" + }, + "constant": { + "color": "#268BD2" + }, + "constructor": { + "color": "#859900" + }, + "embedded": { + "color": "#2AA198" + }, + "function": { + "color": "#268BD2" + }, + "keyword": { + "color": "#DC322F" + }, + "link_text": { + "color": "#268BD2", + "font_style": "underline" + }, + "link_uri": { + "color": "#2AA198", + "font_style": "italic" + }, + "number": { + "color": "#D33682" + }, + "string": { + "color": "#859900" + }, + "string.escape": { + "color": "#2AA198" + }, + "string.regex": { + "color": "#D33682" + }, + "string.special": { + "color": "#B58900" + }, + "string.special.symbol": { + "color": "#B58900" + }, + "tag": { + "color": "#268BD2" + }, + "text.literal": { + "color": "#586E75" + }, + "title": { + "color": "#073642", + "font_weight": 600 + }, + "type": { + "color": "#2AA198" + }, + "property": { + "color": "#586E75" + }, + "variable.special": { + "color": "#DC322F" + } + } + } + }, + { + "name": "Solarized Dark", + "author": "Ethan Schoonover", + "url": "https://ethanschoonover.com/solarized", + "mode": "dark", + "colors": { + "accent.background": "#073945", + "accent.foreground": "#fdf6e3", + "background": "#002B36", + "border": "#103a44", + "foreground": "#fdf6e3", + "input.border": "#083e4c", + "list.active.background": "#0d667d25", + "list.active.border": "#0d667d", + "list.even.background": "#15333A99", + "muted.background": "#073642", + "muted.foreground": "#839496", + "panel.background": "#002b36", + "popover.background": "#002b36", + "popover.foreground": "#fdf6e3", + "primary.background": "#0d667d", + "primary.foreground": "#fdf6e3", + "scrollbar.background": "#002b3600", + "scrollbar.thumb.background": "#586e75", + "secondary.background": "#073642", + "secondary.active.background": "#083e4b", + "secondary.foreground": "#fdf6e3", + "secondary.hover.background": "#073945", + "tab.active.background": "#002b36", + "tab.active.foreground": "#fdf6e3", + "tab.foreground": "#93a1a1", + "tab_bar.background": "#07364266", + "title_bar.background": "#09323d", + "title_bar.border": "#16404b", + "base.red": "#7d2f0d", + "base.green": "#0d7d3f", + "base.yellow": "#7d650d", + "base.blue": "#0d507d", + "base.magenta": "#7d0d43", + "base.cyan": "#0d7d70" + }, + "highlight": { + "editor.foreground": "#DDDDDD", + "editor.background": "#002B36", + "editor.active_line.background": "#073642", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#93A1A166", + "conflict": "#D2602D", + "created": "#3f72e2", + "created.background": "#0C4619", + "deleted.background": "#46190C", + "error.background": "#46190C", + "error.border": "#802207", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "hint.background": "#250c4b", + "hint.border": "#3f0891", + "info.background": "#0C194D", + "info.border": "#082190", + "modified": "#B0A878", + "modified.background": "#3A310E", + "predictive": "#5D5945", + "success.background": "#0C4619", + "warning.background": "#3A310E", + "warning.border": "#7B6508", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/assets/themes/spaceduck.json b/assets/themes/spaceduck.json new file mode 100644 index 00000000..82c1538a --- /dev/null +++ b/assets/themes/spaceduck.json @@ -0,0 +1,148 @@ +{ + "name": "Spaceduck", + "author": "Guillermo Rodriguez", + "url": "https://github.com/pineapplegiant/spaceduck", + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "themes": [ + { + "name": "Spaceduck", + "mode": "dark", + "colors": { + "accent.background": "#212440", + "accent.foreground": "#a3a49d", + "background": "#0F111B", + "border": "#272C42", + "foreground": "#a3a49d", + "input.border": "#272C42", + "link.active.foreground": "#089CC5", + "link.foreground": "#089CC5", + "link.hover.foreground": "#089CC5", + "list.active.background": "#089CC511", + "list.active.border": "#089CC5", + "list.even.background": "#161928", + "muted.background": "#272C4255", + "muted.foreground": "#4b6479", + "panel.background": "#003a5b", + "popover.background": "#0F111B", + "popover.foreground": "#a3a49d", + "primary.background": "#089CC5", + "primary.foreground": "#ecf0c1", + "scrollbar.background": "#003a5b00", + "scrollbar.thumb.background": "#24303a", + "secondary.background": "#242547", + "secondary.active.background": "#292b51", + "secondary.foreground": "#a3a49d", + "secondary.hover.background": "#242547", + "tab.active.background": "#0F111B", + "tab.foreground": "#838182", + "title_bar.background": "#141724", + "title_bar.border": "#272C42", + "base.red": "#e33400", + "base.green": "#5ccc96", + "base.blue": "#00a3cc", + "base.cyan": "#089CC5", + "base.magenta": "#C86D8C", + "base.magenta.light": "#C86D8C33", + "base.yellow": "#b89c00" + }, + "highlight": { + "editor.foreground": "#ecf0c1", + "editor.background": "#0F111B", + "editor.active_line.background": "#1c1d39", + "editor.line_number": "#4b6479", + "editor.active_line_number": "#ecf0c1", + "editor.invisible": "#4b647966", + "conflict": "#e33400", + "created": "#5ccc96", + "deleted": "#e33400", + "error": "#e33400", + "hidden": "#4b6479", + "hint": "#C86D8C", + "ignored": "#4b6479", + "info": "#089CC5", + "modified": "#f2ce00", + "predictive": "#5D5945", + "renamed": "#089CC5", + "success": "#5ccc96", + "unreachable": "#4b6479", + "warning": "#f2ce00", + "syntax": { + "attribute": { + "color": "#f2ce00" + }, + "boolean": { + "color": "#f2ce00" + }, + "comment": { + "color": "#4b6479", + "font_style": "italic" + }, + "comment.doc": { + "color": "#4b6479", + "font_style": "italic" + }, + "constant": { + "color": "#e33400" + }, + "constructor": { + "color": "#5ccc96" + }, + "embedded": { + "color": "#ecf0c1" + }, + "function": { + "color": "#089CC5" + }, + "keyword": { + "color": "#C86D8C" + }, + "link_text": { + "color": "#089CC5", + "font_style": "underline" + }, + "link_uri": { + "color": "#089CC5", + "font_style": "italic" + }, + "number": { + "color": "#f2ce00" + }, + "string": { + "color": "#5ccc96" + }, + "string.escape": { + "color": "#5ccc96" + }, + "string.regex": { + "color": "#5ccc96" + }, + "string.special": { + "color": "#f2ce00" + }, + "string.special.symbol": { + "color": "#f2ce00" + }, + "tag": { + "color": "#C86D8C" + }, + "text.literal": { + "color": "#ecf0c1" + }, + "title": { + "color": "#f2ce00", + "font_weight": 600 + }, + "type": { + "color": "#089CC5" + }, + "property": { + "color": "#ecf0c1" + }, + "variable.special": { + "color": "#C86D8C" + } + } + } + } + ] +} diff --git a/assets/themes/tokyonight.json b/assets/themes/tokyonight.json new file mode 100644 index 00000000..ef45992d --- /dev/null +++ b/assets/themes/tokyonight.json @@ -0,0 +1,421 @@ +{ + "name": "Tokyo", + "author": "Folke Lemaitre", + "url": "https://github.com/folke/tokyonight.nvim", + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "themes": [ + { + "name": "Tokyo Night", + "mode": "dark", + "colors": { + "accent.background": "#2C3045", + "accent.foreground": "#c0caf5", + "background": "#1a1b26", + "border": "#292e42", + "window_border": "#3d4462", + "ring": "#7aa2f7", + "foreground": "#c0caf5", + "link.active.foreground": "#7aa2f722", + "link.foreground": "#7aa2f7", + "link.hover.foreground": "#7aa2f7", + "list.active.background": "#7aa2f722", + "list.active.border": "#7aa2f7", + "list.even.background": "#2C304599", + "muted.background": "#2C304544", + "muted.foreground": "#565f89", + "panel.background": "#292e42", + "popover.background": "#1a1b26", + "popover.foreground": "#c0caf5", + "primary.background": "#7aa2f7", + "primary.foreground": "#1a1b26", + "scrollbar.background": "#1a1b2600", + "scrollbar.thumb.background": "#414868", + "secondary.active.background": "#292e42", + "secondary.background": "#292e42", + "secondary.foreground": "#C0CAF5", + "secondary.hover.background": "#2d3349", + "title_bar.background": "#161720", + "title_bar.border": "#292e42", + "chart.grid": "#222332", + "base.red": "#f7768e", + "base.green": "#9ece6a", + "base.yellow": "#e0af68", + "base.blue": "#7aa2f7", + "base.magenta": "#565f89", + "base.cyan": "#7dcfff" + }, + "highlight": { + "editor.foreground": "#c0caf5", + "editor.background": "#1a1b26", + "editor.active_line.background": "#292e42", + "editor.line_number": "#565f89", + "editor.active_line_number": "#c0caf5", + "editor.invisible": "#565f8966", + "conflict": "#f7768e", + "created": "#9ece6a", + "deleted": "#f7768e", + "error": "#f7768e", + "hidden": "#565f89", + "hint": "#7dcfff", + "ignored": "#565f89", + "info": "#7aa2f7", + "modified": "#e0af68", + "predictive": "#565f89", + "renamed": "#7aa2f7", + "success": "#9ece6a", + "unreachable": "#565f89", + "warning": "#e0af68", + "syntax": { + "attribute": { + "color": "#e0af68" + }, + "boolean": { + "color": "#9ece6a" + }, + "comment": { + "color": "#565f89", + "font_style": "italic" + }, + "comment.doc": { + "color": "#565f89", + "font_style": "italic" + }, + "constant": { + "color": "#7aa2f7" + }, + "constructor": { + "color": "#e0af68" + }, + "embedded": { + "color": "#c0caf5" + }, + "function": { + "color": "#7aa2f7" + }, + "keyword": { + "color": "#f7768e" + }, + "link_text": { + "color": "#7dcfff", + "font_style": "underline" + }, + "link_uri": { + "color": "#7aa2f7", + "font_style": "italic" + }, + "number": { + "color": "#e0af68" + }, + "string": { + "color": "#9ece6a" + }, + "string.escape": { + "color": "#7dcfff" + }, + "string.regex": { + "color": "#9ece6a" + }, + "string.special": { + "color": "#e0af68" + }, + "string.special.symbol": { + "color": "#e0af68" + }, + "tag": { + "color": "#f7768e" + }, + "text.literal": { + "color": "#c0caf5" + }, + "title": { + "color": "#7aa2f7", + "font_weight": 600 + }, + "type": { + "color": "#7dcfff" + }, + "property": { + "color": "#c0caf5" + }, + "variable.special": { + "color": "#f7768e" + } + } + } + }, + { + "name": "Tokyo Storm", + "mode": "dark", + "colors": { + "accent.background": "#414868", + "accent.foreground": "#c0caf5", + "background": "#24283b", + "border": "#3d4462", + "window_border": "#3d4462", + "ring": "#7aa2f7", + "foreground": "#c0caf5", + "input.border": "#414868", + "link.active.foreground": "#7aa2f7", + "link.foreground": "#7aa2f7", + "link.hover.foreground": "#7aa2f7", + "list.active.background": "#7aa2f711", + "list.active.border": "#7aa2f7", + "list.even.background": "#41486844", + "muted.background": "#292e42", + "muted.foreground": "#565f89", + "panel.background": "#292e42", + "popover.background": "#24283b", + "popover.foreground": "#c0caf5", + "primary.background": "#7aa2f7", + "primary.foreground": "#24283b", + "scrollbar.background": "#24283b00", + "scrollbar.thumb.background": "#414868", + "secondary.active.background": "#323750", + "secondary.background": "#292e42", + "secondary.foreground": "#c0caf5", + "secondary.hover.background": "#32375099", + "title_bar.background": "#202435", + "title_bar.border": "#3d4462", + "base.red": "#f7768e", + "base.green": "#9ece6a", + "base.yellow": "#e0af68", + "base.blue": "#7aa2f7", + "base.magenta": "#b283f8", + "base.cyan": "#7dcfff" + }, + "highlight": { + "editor.foreground": "#B0B9E2", + "editor.background": "#24283B", + "editor.active_line.background": "#292E42", + "editor.line_number": "#363C58", + "editor.active_line_number": "#B0B9E2", + "editor.invisible": "#565f8966", + "conflict": "#D2602D", + "created": "#3f72e2", + "deleted": "#f7768e", + "error": "#f7768e", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "modified": "#B0A878", + "predictive": "#5D5945", + "success": "#9ece6a", + "warning": "#e0af68", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + }, + { + "name": "Tokyo Moon", + "mode": "dark", + "colors": { + "accent.background": "#32364E", + "accent.foreground": "#c0caf5", + "background": "#222436", + "border": "#323752", + "window_border": "#404668", + "ring": "#82aaff", + "foreground": "#c0caf5", + "input.border": "#444b6a", + "link.active.foreground": "#82aaff", + "link.foreground": "#82aaff", + "link.hover.foreground": "#82aaff", + "list.active.background": "#82aaff22", + "list.active.border": "#82aaff", + "list.background": "#222436", + "list.even.background": "#282a40", + "muted.background": "#2d3149", + "muted.foreground": "#6e738d", + "panel.background": "#2d3149", + "popover.background": "#222436", + "popover.foreground": "#c0caf5", + "primary.background": "#82aaff", + "primary.foreground": "#222436", + "scrollbar.background": "#22243600", + "scrollbar.thumb.background": "#444b6a", + "secondary.active.background": "#2f334c", + "secondary.background": "#2d3149", + "secondary.foreground": "#8c94b5", + "secondary.hover.background": "#31354f", + "table.row.border": "#2d3149", + "title_bar.background": "#1e2030", + "title_bar.border": "#323752", + "base.red": "#ff757f", + "base.green": "#c3e88d", + "base.yellow": "#ffc777", + "base.blue": "#82aaff", + "base.magenta": "#6e738d", + "base.cyan": "#86e1fc" + }, + "highlight": { + "editor.foreground": "#c0caf5", + "editor.background": "#222436", + "editor.active_line.background": "#2d3149", + "editor.line_number": "#6e738d", + "editor.active_line_number": "#c0caf5", + "editor.invisible": "#565f8966", + "conflict": "#ed8796", + "created": "#c3e88d", + "deleted": "#ed8796", + "error": "#ed8796", + "hidden": "#6e738d", + "hint": "#86e1fc", + "ignored": "#6e738d", + "info": "#82aaff", + "modified": "#ffc777", + "predictive": "#6e738d", + "renamed": "#82aaff", + "success": "#c3e88d", + "unreachable": "#6e738d", + "warning": "#ffc777", + "syntax": { + "attribute": { + "color": "#ffc777" + }, + "boolean": { + "color": "#c3e88d" + }, + "comment": { + "color": "#6e738d", + "font_style": "italic" + }, + "comment.doc": { + "color": "#6e738d", + "font_style": "italic" + }, + "constant": { + "color": "#82aaff" + }, + "constructor": { + "color": "#ffc777" + }, + "embedded": { + "color": "#c0caf5" + }, + "function": { + "color": "#82aaff" + }, + "keyword": { + "color": "#ed8796" + }, + "link_text": { + "color": "#86e1fc", + "font_style": "underline" + }, + "link_uri": { + "color": "#82aaff", + "font_style": "italic" + }, + "number": { + "color": "#ffc777" + }, + "string": { + "color": "#c3e88d" + }, + "string.escape": { + "color": "#86e1fc" + }, + "string.regex": { + "color": "#c3e88d" + }, + "string.special": { + "color": "#ffc777" + }, + "string.special.symbol": { + "color": "#ffc777" + }, + "tag": { + "color": "#ed8796" + }, + "text.literal": { + "color": "#c0caf5" + }, + "title": { + "color": "#82aaff", + "font_weight": 600 + }, + "type": { + "color": "#86e1fc" + }, + "property": { + "color": "#c0caf5" + }, + "variable.special": { + "color": "#ed8796" + } + } + } + } + ] +} diff --git a/assets/themes/twilight.json b/assets/themes/twilight.json new file mode 100644 index 00000000..8487a66e --- /dev/null +++ b/assets/themes/twilight.json @@ -0,0 +1,141 @@ +{ + "$schema": "https://github.com/longbridge/gpui-kit/raw/refs/heads/main/.theme-schema.json", + "name": "Twilight", + "author": "MacroMates", + "url": "https://macromates.com", + "themes": [ + { + "name": "Twilight", + "mode": "dark", + "colors": { + "accent.background": "#2b2b2b", + "accent.foreground": "#dcdcdc", + "background": "#141414", + "border": "#343434", + "foreground": "#dcdcdc", + "input.border": "#3e3e3e", + "list.active.background": "#CDA86911", + "list.active.border": "#CDA86988", + "list.even.background": "#1E1E1E99", + "muted.background": "#2e2e2e88", + "muted.foreground": "#828282", + "primary.background": "#CDA869", + "primary.foreground": "#1e1e1e", + "scrollbar.background": "#1e1e1e00", + "scrollbar.thumb.background": "#3e3e3e", + "secondary.background": "#262626", + "secondary.active.background": "#2a2a2a", + "secondary.foreground": "#dcdcdc", + "secondary.hover.background": "#272727", + "tab.active.background": "#141414", + "tab.active.foreground": "#dcdcdc", + "tab.background": "#1E1E1E00", + "tab.foreground": "#A9A9A9", + "tab_bar.background": "#1E1E1E", + "table.background": "#1e1e1e00", + "title_bar.background": "#1e1e1e", + "title_bar.border": "#343434", + "base.red": "#c06d44", + "base.red.light": "#de7c4c", + "base.green": "#afb97a", + "base.green.light": "#ccd88c", + "base.yellow": "#c2a86c", + "base.yellow.light": "#e2c47e", + "base.blue": "#44474a", + "base.blue.light": "#5a5e62", + "base.magenta": "#b4be7c", + "base.magenta.light": "#d0dc8e99", + "base.cyan": "#778385", + "base.cyan.light": "#8a989b" + }, + "highlight": { + "editor.foreground": "#DDDDDD", + "editor.background": "#000000", + "editor.active_line.background": "#131313", + "editor.line_number": "#8F8F8F", + "editor.active_line_number": "#DDDDDD", + "editor.invisible": "#9E9E9E66", + "conflict": "#D2602D", + "created": "#3f72e2", + "hidden": "#9E9E9E", + "hint": "#b283f8", + "modified": "#B0A878", + "predictive": "#5D5945", + "syntax": { + "attribute": { + "color": "#be9a52" + }, + "boolean": { + "color": "#E1D797" + }, + "comment": { + "color": "#9E9E9E" + }, + "comment.doc": { + "color": "#9E9E9E" + }, + "constant": { + "color": "#E1D797" + }, + "constructor": { + "color": "#b5af9a" + }, + "embedded": { + "color": "#CACCCA" + }, + "function": { + "color": "#E1D797" + }, + "keyword": { + "color": "#E19773" + }, + "link_text": { + "color": "#A86D3B", + "font_style": "normal" + }, + "link_uri": { + "color": "#6F6D66", + "font_style": "italic" + }, + "number": { + "color": "#E19773" + }, + "string": { + "color": "#76BA53" + }, + "string.escape": { + "color": "#76BA53" + }, + "string.regex": { + "color": "#76BA53" + }, + "string.special": { + "color": "#E1D797" + }, + "string.special.symbol": { + "color": "#E1D797" + }, + "tag": { + "color": "#b5af9a" + }, + "text.literal": { + "color": "#E1D797" + }, + "title": { + "color": "#A76D3B", + "font_weight": 600 + }, + "type": { + "color": "#A86D3B" + }, + "property": { + "color": "#CACCCA" + }, + "variable.special": { + "color": "#E19773" + } + } + } + } + ] +} diff --git a/crates/assets/Cargo.toml b/crates/assets/Cargo.toml index 97af1380..54d49e18 100644 --- a/crates/assets/Cargo.toml +++ b/crates/assets/Cargo.toml @@ -10,6 +10,9 @@ anyhow.workspace = true rust-embed.workspace = true gpui-kit.workspace = true +[dev-dependencies] +serde_json.workspace = true + # On wasm there is no filesystem to read from, so rust-embed's debug-mode # disk loading returns nothing; embed the assets even in debug builds. [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/crates/assets/src/lib.rs b/crates/assets/src/lib.rs index 8cc8cc90..7e879c3b 100644 --- a/crates/assets/src/lib.rs +++ b/crates/assets/src/lib.rs @@ -8,6 +8,7 @@ use rust_embed::RustEmbed; #[include = "fonts/**/*"] #[include = "brand/**/*"] #[include = "icons/**/*"] +#[include = "themes/**/*"] #[exclude = "*.DS_Store"] pub struct Assets; @@ -74,3 +75,29 @@ impl AssetSource for Assets { .collect()) } } + +#[cfg(test)] +mod tests { + use gpui_kit::component::ThemeSet; + + use super::*; + + /// Every bundled theme file must parse against gpui-kit's schema. + #[test] + fn bundled_themes_parse() { + let mut count = 0; + + for entry in Assets::iter().filter(|p| p.starts_with("themes/")) { + let file = Assets::get(&entry).expect("theme file exists"); + let content = std::str::from_utf8(&file.data).expect("theme is UTF-8"); + let set: ThemeSet = serde_json::from_str(content).expect("theme parses"); + assert!(!set.themes.is_empty(), "{entry} has no themes"); + count += set.themes.len(); + } + + assert!( + count >= 36, + "expected the bundled gpui-kit themes, got {count}" + ); + } +} diff --git a/crates/settings/src/lib.rs b/crates/settings/src/lib.rs index 714add2c..ce077450 100644 --- a/crates/settings/src/lib.rs +++ b/crates/settings/src/lib.rs @@ -1,9 +1,11 @@ use std::path::PathBuf; +use std::rc::Rc; use anyhow::{Error, anyhow}; #[cfg(not(target_arch = "wasm32"))] use common::config_dir; use gpui::{App, AppContext, Context, Entity, Global, ImageSource, Subscription, Task, px}; +use gpui_kit::component::{Theme, ThemeConfig, ThemeMode, ThemeRegistry}; use nostr_sdk::prelude::*; use serde::{Deserialize, Serialize}; use smallvec::{SmallVec, smallvec}; @@ -12,6 +14,20 @@ use smallvec::{SmallVec, smallvec}; #[cfg(target_arch = "wasm32")] const SETTINGS_KEY: &str = "coop.settings"; +/// The default base font size for the interface +pub const DEFAULT_FONT_SIZE: f32 = 16.0; + +const DEFAULT_FILE_SERVER: &str = "https://nostr.download/"; +const LEGACY_FILE_SERVER: &str = "blossom.band"; +/// Minimum days between automatic encryption key rotations +pub const NIP4E_ROTATION_MIN_DAYS: u32 = 1; +/// Maximum days between automatic encryption key rotations +pub const NIP4E_ROTATION_MAX_DAYS: u32 = 90; +/// Days between automatic encryption key rotations when enabled +pub const NIP4E_ROTATION_DEFAULT_DAYS: u32 = 30; +/// Built-in image shown behind chat and group panels +pub const DEFAULT_BACKGROUND: &str = "brand/default-bg.jpg"; + /// The user's appearance preference, persisted with the rest of the settings. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] pub enum AppearanceMode { @@ -36,8 +52,20 @@ impl AppearanceMode { } } -/// The default base font size for the interface -pub const DEFAULT_FONT_SIZE: f32 = 16.0; +/// Signer kind +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +pub enum SignerKind { + Auto, + Encryption, + #[default] + User, +} + +impl SignerKind { + pub fn encryption(&self) -> bool { + matches!(self, SignerKind::Encryption) + } +} /// User tuning applied on top of the native OS theme #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] @@ -63,123 +91,6 @@ impl Default for ThemeSettings { } } -pub fn init(cx: &mut App) { - AppSettings::set_global(cx.new(AppSettings::new), cx) -} - -/// Read the persisted appearance mode synchronously. -fn persisted_settings() -> Option { - let content = persisted_content(); - content.and_then(|content| serde_json::from_str(&content).ok()) -} - -/// The persisted settings JSON, from the config file or browser storage -#[cfg(not(target_arch = "wasm32"))] -fn persisted_content() -> Option { - let path = config_dir().join(".settings"); - std::fs::read_to_string(path).ok() -} - -#[cfg(target_arch = "wasm32")] -fn persisted_content() -> Option { - common::web_store::get(SETTINGS_KEY).ok().flatten() -} - -pub fn persisted_appearance_mode() -> AppearanceMode { - persisted_settings() - .map(|settings| settings.appearance_mode) - .unwrap_or_default() -} - -/// Read the persisted theme tuning synchronously. -pub fn persisted_theme() -> ThemeSettings { - persisted_settings() - .map(|settings| settings.theme) - .unwrap_or_default() -} - -const DEFAULT_FILE_SERVER: &str = "https://nostr.download/"; -const LEGACY_FILE_SERVER: &str = "blossom.band"; -/// Minimum days between automatic encryption key rotations -pub const NIP4E_ROTATION_MIN_DAYS: u32 = 1; -/// Maximum days between automatic encryption key rotations -pub const NIP4E_ROTATION_MAX_DAYS: u32 = 90; -/// Days between automatic encryption key rotations when enabled -pub const NIP4E_ROTATION_DEFAULT_DAYS: u32 = 30; -/// Built-in image shown behind chat and group panels -pub const DEFAULT_BACKGROUND: &str = "brand/default-bg.jpg"; - -macro_rules! setting_accessors { - ($(pub $field:ident: $type:ty),* $(,)?) => { - impl AppSettings { - $( - paste::paste! { - pub fn [](cx: &App) -> $type { - Self::global(cx).read(cx).inner.read(cx).$field.clone() - } - - pub fn [](value: $type, cx: &mut App) { - Self::global(cx).update(cx, |this, cx| { - this.inner.update(cx, |inner, cx| { - inner.$field = value; - cx.notify(); - }); - }); - } - } - )* - } - }; -} - -macro_rules! setting_getters { - ($(pub $field:ident: $type:ty),* $(,)?) => { - impl AppSettings { - $( - paste::paste! { - pub fn [](cx: &App) -> $type { - Self::global(cx).read(cx).inner.read(cx).$field.clone() - } - } - )* - } - }; -} - -setting_accessors! { - pub appearance_mode: AppearanceMode, - pub hide_avatar: bool, - pub screening: bool, - pub wot_auto_trust: bool, - pub nip4e: bool, - pub nip4e_rotation_days: Option, - pub hide_group_notice: bool, - pub file_server: Url, - pub panel_background: bool, - pub panel_background_path: Option, -} - -setting_getters! { - pub theme: ThemeSettings, - pub pinned_rooms: Vec, - pub pinned_groups: Vec, -} - -/// Signer kind -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub enum SignerKind { - Auto, - Encryption, - #[default] - User, -} - -impl SignerKind { - pub fn encryption(&self) -> bool { - matches!(self, SignerKind::Encryption) - } -} - /// Room configuration #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct RoomConfig { @@ -237,6 +148,12 @@ pub struct Settings { /// Tuning applied on top of the native OS theme #[serde(default)] pub theme: ThemeSettings, + /// Bundled theme applied in light appearance; None uses the default light theme + #[serde(default)] + pub theme_light: Option, + /// Bundled theme applied in dark appearance; None uses the default dark theme + #[serde(default)] + pub theme_dark: Option, /// Show an image behind chat and group panels #[serde(default)] pub panel_background: bool, @@ -266,6 +183,8 @@ impl Default for Settings { nip4e_rotation_days: None, hide_group_notice: false, theme: ThemeSettings::default(), + theme_light: None, + theme_dark: None, panel_background: true, panel_background_path: None, trusted_relays: vec![], @@ -288,6 +207,64 @@ pub struct AppSettings { _subscriptions: SmallVec<[Subscription; 2]>, } +macro_rules! setting_accessors { + ($(pub $field:ident: $type:ty),* $(,)?) => { + impl AppSettings { + $( + paste::paste! { + pub fn [](cx: &App) -> $type { + Self::global(cx).read(cx).inner.read(cx).$field.clone() + } + + pub fn [](value: $type, cx: &mut App) { + Self::global(cx).update(cx, |this, cx| { + this.inner.update(cx, |inner, cx| { + inner.$field = value; + cx.notify(); + }); + }); + } + } + )* + } + }; +} + +macro_rules! setting_getters { + ($(pub $field:ident: $type:ty),* $(,)?) => { + impl AppSettings { + $( + paste::paste! { + pub fn [](cx: &App) -> $type { + Self::global(cx).read(cx).inner.read(cx).$field.clone() + } + } + )* + } + }; +} + +setting_accessors! { + pub appearance_mode: AppearanceMode, + pub hide_avatar: bool, + pub screening: bool, + pub wot_auto_trust: bool, + pub nip4e: bool, + pub nip4e_rotation_days: Option, + pub hide_group_notice: bool, + pub file_server: Url, + pub panel_background: bool, + pub panel_background_path: Option, + pub theme_light: Option, + pub theme_dark: Option, +} + +setting_getters! { + pub theme: ThemeSettings, + pub pinned_rooms: Vec, + pub pinned_groups: Vec, +} + impl AppSettings { /// Retrieve the global settings instance pub fn global(cx: &App) -> Entity { @@ -345,8 +322,6 @@ impl AppSettings { } fn apply_theme_tuning(tuning: ThemeSettings, cx: &mut App) { - use gpui_kit::component::Theme; - { let styled = Theme::global_mut(cx); styled.font_size = px(tuning.font_size); @@ -434,20 +409,81 @@ impl AppSettings { } } - /// Apply the persisted appearance mode to the app + /// Apply the persisted appearance mode and theme selection to the app pub fn apply_theme(&mut self, cx: &mut Context) { - use gpui_kit::component::Theme; - - let mode = self.inner.read(cx).appearance_mode; - match mode { + let appearance = self.inner.read(cx).appearance_mode; + match appearance { AppearanceMode::System => Theme::sync_system_appearance(None, cx), - AppearanceMode::Light => Theme::change(gpui_kit::component::ThemeMode::Light, None, cx), - AppearanceMode::Dark => Theme::change(gpui_kit::component::ThemeMode::Dark, None, cx), + AppearanceMode::Light => Theme::change(ThemeMode::Light, None, cx), + AppearanceMode::Dark => Theme::change(ThemeMode::Dark, None, cx), } + + let (light, dark) = { + let inner = self.inner.read(cx); + (inner.theme_light.clone(), inner.theme_dark.clone()) + }; + apply_theme_selection(light.as_deref(), dark.as_deref(), cx); + let tuning = self.inner.read(cx).theme; Self::apply_theme_tuning(tuning, cx); } + /// Select a registered theme by name. + pub fn select_theme(name: &str, cx: &mut App) { + let Some(config) = registered_theme(name, cx) else { + log::warn!("theme is not registered: {name}"); + return; + }; + + let dark = config.mode.is_dark(); + + if dark { + Self::update_theme_dark(Some(name.to_string()), cx); + Self::update_appearance_mode(AppearanceMode::Dark, cx); + } else { + Self::update_theme_light(Some(name.to_string()), cx); + Self::update_appearance_mode(AppearanceMode::Light, cx); + } + + Theme::change( + if dark { + ThemeMode::Dark + } else { + ThemeMode::Light + }, + None, + cx, + ); + Self::reapply_theme(cx); + } + + /// Select the theme applied in light appearance; `None` restores the default + pub fn set_theme_light(name: Option, cx: &mut App) { + Self::update_theme_light(name, cx); + Self::reapply_theme(cx); + } + + /// Select the theme applied in dark appearance; `None` restores the default + pub fn set_theme_dark(name: Option, cx: &mut App) { + Self::update_theme_dark(name, cx); + Self::reapply_theme(cx); + } + + /// Re-apply the selected themes and tuning from the current settings + fn reapply_theme(cx: &mut App) { + let (light, dark, tuning) = AppSettings::global(cx).read_with(cx, |this, cx| { + let inner = this.inner.read(cx); + ( + inner.theme_light.clone(), + inner.theme_dark.clone(), + inner.theme, + ) + }); + + apply_theme_selection(light.as_deref(), dark.as_deref(), cx); + Self::apply_theme_tuning(tuning, cx); + } + /// Check if decoupling encryption key is enabled pub fn is_nip4e_enabled(&self, cx: &App) -> bool { self.inner.read(cx).nip4e @@ -503,6 +539,116 @@ impl AppSettings { } } +pub fn init(cx: &mut App) { + AppSettings::set_global(cx.new(AppSettings::new), cx) +} + +/// Register the bundled gpui-kit themes with the theme registry +pub fn init_themes(cx: &mut App) { + let assets = cx.asset_source().clone(); + + for path in assets.list("themes").unwrap_or_default() { + let Some(content) = assets.load(&path).unwrap_or_default() else { + log::warn!("bundled theme {path} is listed but missing"); + continue; + }; + + let Ok(content) = std::str::from_utf8(&content) else { + log::warn!("bundled theme {path} is not valid UTF-8"); + continue; + }; + + if let Err(error) = ThemeRegistry::global_mut(cx).load_themes_from_str(content) { + log::warn!("failed to load bundled theme {path} ({error})"); + } + } +} + +/// Read the persisted appearance mode synchronously. +fn persisted_settings() -> Option { + let content = persisted_content(); + content.and_then(|content| serde_json::from_str(&content).ok()) +} + +/// The persisted settings JSON, from the config file or browser storage +#[cfg(not(target_arch = "wasm32"))] +fn persisted_content() -> Option { + let path = config_dir().join(".settings"); + std::fs::read_to_string(path).ok() +} + +#[cfg(target_arch = "wasm32")] +fn persisted_content() -> Option { + common::web_store::get(SETTINGS_KEY).ok().flatten() +} + +pub fn persisted_appearance_mode() -> AppearanceMode { + persisted_settings() + .map(|settings| settings.appearance_mode) + .unwrap_or_default() +} + +/// Read the persisted theme tuning synchronously. +pub fn persisted_theme() -> ThemeSettings { + persisted_settings() + .map(|settings| settings.theme) + .unwrap_or_default() +} + +/// Read the persisted theme selection for light appearance. +pub fn persisted_theme_light() -> Option { + persisted_settings().and_then(|settings| settings.theme_light) +} + +/// Read the persisted theme selection for dark appearance. +pub fn persisted_theme_dark() -> Option { + persisted_settings().and_then(|settings| settings.theme_dark) +} + +/// The registered theme for a persisted theme name, if any +fn registered_theme(name: &str, cx: &App) -> Option> { + ThemeRegistry::global(cx).themes().get(name).cloned() +} + +/// Swap the selected themes into the light/dark slots and reload the active mode. +/// An unset or unknown theme falls back to the registry's default theme. +fn apply_theme_selection(light: Option<&str>, dark: Option<&str>, cx: &mut App) { + let light_config = light + .and_then(|name| registered_theme(name, cx)) + .or_else(|| Some(ThemeRegistry::global(cx).default_light_theme().clone())); + let dark_config = dark + .and_then(|name| registered_theme(name, cx)) + .or_else(|| Some(ThemeRegistry::global(cx).default_dark_theme().clone())); + + { + let theme = Theme::global_mut(cx); + if let Some(config) = light_config { + theme.light_theme = config; + } + if let Some(config) = dark_config { + theme.dark_theme = config; + } + } + + let mode = Theme::global(cx).mode; + Theme::change(mode, None, cx); +} + +/// Apply the persisted appearance, theme selection and tuning synchronously. +pub fn apply_persisted_theme(cx: &mut App) { + match persisted_appearance_mode() { + AppearanceMode::System => Theme::sync_system_appearance(None, cx), + AppearanceMode::Light => Theme::change(ThemeMode::Light, None, cx), + AppearanceMode::Dark => Theme::change(ThemeMode::Dark, None, cx), + } + + let light = persisted_theme_light(); + let dark = persisted_theme_dark(); + apply_theme_selection(light.as_deref(), dark.as_deref(), cx); + + AppSettings::apply_theme_tuning(persisted_theme(), cx); +} + #[cfg(test)] mod tests { use super::*; @@ -524,5 +670,29 @@ mod tests { .unwrap(); assert_eq!(settings.theme, ThemeSettings::default()); + assert_eq!(settings.theme_light, None); + assert_eq!(settings.theme_dark, None); + } + + /// The theme selection round-trips through serde. + #[test] + fn theme_selection_persists() { + let settings: Settings = serde_json::from_str( + r#"{ + "appearance_mode": "Dark", + "hide_avatar": false, + "screening": true, + "wot_auto_trust": true, + "nip4e": false, + "trusted_relays": [], + "file_server": "https://nostr.download/", + "theme_light": "Solarized Light", + "theme_dark": "Tokyo Night" + }"#, + ) + .unwrap(); + + assert_eq!(settings.theme_light.as_deref(), Some("Solarized Light")); + assert_eq!(settings.theme_dark.as_deref(), Some("Tokyo Night")); } } diff --git a/crates/workspace/src/dialogs/settings.rs b/crates/workspace/src/dialogs/settings.rs index eb3adb5f..725530e0 100644 --- a/crates/workspace/src/dialogs/settings.rs +++ b/crates/workspace/src/dialogs/settings.rs @@ -21,7 +21,7 @@ use gpui_kit::component::notification::Notification; use gpui_kit::component::progress::Progress; use gpui_kit::component::separator::Separator; use gpui_kit::component::switch::Switch; -use gpui_kit::component::{Disableable, Sizable, WindowExt, h_flex, v_flex}; +use gpui_kit::component::{Disableable, Sizable, ThemeRegistry, WindowExt, h_flex, v_flex}; use settings::{AppSettings, AppearanceMode, NIP4E_ROTATION_DEFAULT_DAYS}; #[cfg(not(target_arch = "wasm32"))] use speech::model::{self as speech_model}; @@ -250,6 +250,69 @@ impl Preferences { }); } + /// Dropdown to pick the bundled theme applied in an appearance. + fn render_theme_choice( + &self, + id: &'static str, + label: &'static str, + description: &'static str, + dark: bool, + cx: &Context, + ) -> impl IntoElement { + const DEFAULT: &str = "Default"; + + let selected = if dark { + AppSettings::get_theme_dark(cx) + } else { + AppSettings::get_theme_light(cx) + }; + + let themes: Vec = ThemeRegistry::global(cx) + .sorted_themes() + .into_iter() + .filter(|theme| theme.mode.is_dark() == dark) + .map(|theme| theme.name.to_string()) + .collect(); + + let current = selected + .filter(|name| themes.contains(name)) + .unwrap_or_else(|| DEFAULT.into()); + + settings_row( + label, + description, + Button::new(id) + .label(current) + .ghost() + .small() + .dropdown_menu(move |menu, _window, _cx| { + let reset = move |name: Option, cx: &mut App| { + if dark { + AppSettings::set_theme_dark(name, cx); + } else { + AppSettings::set_theme_light(name, cx); + } + }; + + let menu = + menu.item(PopupMenuItem::new(DEFAULT).on_click(move |_, _window, cx| { + reset(None, cx); + })); + + themes.iter().fold(menu, |menu, name| { + let name = name.clone(); + + menu.item(PopupMenuItem::new(name.clone()).on_click( + move |_, _window, cx| { + reset(Some(name.clone()), cx); + }, + )) + }) + }), + cx, + ) + } + /// Ask the user for an image to show behind chat and group panels fn choose_background( #[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))] window: &mut Window, @@ -388,6 +451,8 @@ impl Render for Preferences { const AVATAR: &str = "Hide all avatar pictures to improve performance."; const APPEARANCE: &str = "Choose whether the app follows the system theme or uses a light/dark theme."; + const LIGHT_THEME: &str = "Bundled theme applied in light appearance."; + const DARK_THEME: &str = "Bundled theme applied in dark appearance."; const FONT_SIZE: &str = "The base font size for the interface."; const RADIUS: &str = "Corner radius for UI elements. Empty follows the OS theme."; const RADIUS_LG: &str = @@ -471,6 +536,8 @@ impl Render for Preferences { }), cx, )) + .child(self.render_theme_choice("theme-light", "Light Theme", LIGHT_THEME, false, cx)) + .child(self.render_theme_choice("theme-dark", "Dark Theme", DARK_THEME, true, cx)) .child(Separator::horizontal()) .child( v_flex() diff --git a/crates/workspace/src/lib.rs b/crates/workspace/src/lib.rs index cc9a72b1..11f56705 100644 --- a/crates/workspace/src/lib.rs +++ b/crates/workspace/src/lib.rs @@ -1,3 +1,5 @@ +use std::cell::Cell; +use std::rc::Rc; use std::sync::Arc; use ::settings::{AppSettings, AppearanceMode}; @@ -8,13 +10,18 @@ use chat::{ChatEvent, ChatRegistry}; #[cfg(not(target_arch = "wasm32"))] use common::download_dir; use gpui::{ - Action, App, AppContext, Context, Entity, InteractiveElement, IntoElement, ParentElement, - Pixels, Render, SharedString, Styled, Subscription, Task, Window, div, px, + Action, App, AppContext, Context, Entity, Focusable, InteractiveElement, IntoElement, + ParentElement, Pixels, Render, SharedString, Styled, Subscription, Task, Window, div, px, }; use gpui_kit::component::button::Button; +use gpui_kit::component::command::{ + Command as CommandPalette, CommandGroup, CommandItem, CommandState, +}; use gpui_kit::component::dock::{DockArea, DockLayout, DockPlacement, Panel, PanelHandle}; use gpui_kit::component::notification::{Notification, NotificationType}; -use gpui_kit::component::{ActiveTheme, Theme, WindowExt, v_flex}; +use gpui_kit::component::{ + ActiveTheme, IndexPath, Theme, ThemeConfig, ThemeRegistry, WindowExt, v_flex, +}; use nip4e::{DeviceEvent, DeviceRegistry}; use nip29::{GroupId, GroupKey}; use nostr_sdk::prelude::*; @@ -57,6 +64,7 @@ enum Command { ShowRelayList, ShowProfile, ShowSettings, + ToggleTheme, ShowBackup, ShowContactList, ShowInbox, @@ -310,6 +318,9 @@ impl Workspace { .child(view.clone()) }); } + Command::ToggleTheme => { + self.theme_selector(window, cx); + } Command::ShowProfile => { let nostr = NostrRegistry::global(cx); @@ -440,6 +451,100 @@ impl Workspace { } } + /// Browse and apply the bundled themes. + fn theme_selector(&mut self, window: &mut Window, cx: &mut Context) { + let state = cx.new(|cx| CommandState::new(window, cx)); + let focus_on_mount = Rc::new(Cell::new(true)); + + window.open_dialog(cx, move |dialog, _, _| { + let state = state.clone(); + let focus_on_mount = focus_on_mount.clone(); + + dialog + .close_button(false) + .p_0() + .width(px(420.)) + .content(move |content, window, cx| { + if focus_on_mount.replace(false) { + let state = state.clone(); + window.defer(cx, move |window, cx| { + state.read(cx).focus_handle(cx).focus(window, cx); + }); + } + + let active = Theme::global(cx).theme_name().clone(); + let (lights, darks) = Self::theme_entries(cx); + + content.child( + CommandPalette::new(&state) + .bordered(false) + .rounded(cx.theme().radius_lg) + .placeholder("Search themes...") + .max_h(px(420.)) + .on_confirm(move |index, _, cx| { + if let Some(name) = Self::theme_name_at(index, cx) { + AppSettings::select_theme(&name, cx); + } + }) + .group( + CommandGroup::new() + .label("Light Themes") + .items(Self::theme_items(&lights, &active)), + ) + .group( + CommandGroup::new() + .label("Dark Themes") + .items(Self::theme_items(&darks, &active)), + ), + ) + }) + }); + } + + /// Sorted bundled themes partitioned into light and dark groups + fn theme_entries(cx: &App) -> (Vec>, Vec>) { + let (mut lights, mut darks) = (vec![], vec![]); + + for theme in ThemeRegistry::global(cx).sorted_themes() { + if theme.mode.is_dark() { + darks.push(theme.clone()); + } else { + lights.push(theme.clone()); + } + } + + (lights, darks) + } + + /// One palette row per theme. + fn theme_items(themes: &[Rc], active: &SharedString) -> Vec { + themes + .iter() + .map(|theme| { + CommandItem::new() + .label(theme.name.clone()) + .checked(&theme.name == active) + .keywords([if theme.mode.is_dark() { + "dark" + } else { + "light" + }]) + }) + .collect() + } + + /// The theme registered at the palette's original group position. + fn theme_name_at(index: IndexPath, cx: &App) -> Option { + let (lights, darks) = Self::theme_entries(cx); + + match index.section { + 0 => lights.get(index.row), + 1 => darks.get(index.row), + _ => None, + } + .map(|theme| theme.name.clone()) + } + /// Open the channel creation dialog under the action's group. fn on_create_channel( &mut self, diff --git a/crates/workspace/src/sidebar/header.rs b/crates/workspace/src/sidebar/header.rs index d9ade48c..3ae83d35 100644 --- a/crates/workspace/src/sidebar/header.rs +++ b/crates/workspace/src/sidebar/header.rs @@ -61,6 +61,7 @@ impl Sidebar { .dropdown_menu(move |this, _window, _cx| { this.menu("Profile", Box::new(Command::ShowProfile)) .menu("Relays", Box::new(Command::ShowRelayList)) + .menu("Themes", Box::new(Command::ToggleTheme)) .separator() .label(format!("{CLIENT_NAME} {}", env!("CARGO_PKG_VERSION"))) .item( diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 6c710c20..2e05e7ee 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -51,9 +51,6 @@ gpui-kit.workspace = true gpui_linux.workspace = true gpui_windows.workspace = true gpui_macos.workspace = true -native-theme.workspace = true -native-theme-gpui.workspace = true -flume.workspace = true reqwest_client.workspace = true log.workspace = true diff --git a/desktop/src/main.rs b/desktop/src/main.rs index 5a2e3665..c66c9447 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -2,16 +2,12 @@ use std::sync::{Arc, Mutex}; use chat_ui::ToggleDictation; use gpui::{ - App, Bounds, Global, KeyBinding, Menu, MenuItem, SharedString, TitlebarOptions, + App, Bounds, KeyBinding, Menu, MenuItem, SharedString, TitlebarOptions, WindowBackgroundAppearance, WindowBounds, WindowDecorations, WindowKind, WindowOptions, actions, point, px, size, }; -use gpui_kit::component::{Theme, ThemeMode}; use gpui_platform::application; -use native_theme::watch::ThemeSubscription; -use native_theme_gpui::apply_system_theme; use nostr_sdk::prelude::SecretKey; -use settings::{AppSettings, AppearanceMode}; use state::{APP_ID, CLIENT_NAME}; use workspace::TAB_BAR_HEIGHT; @@ -37,6 +33,9 @@ fn main() { // Initialize the framework before anything renders gpui_kit::init(cx); + // Register the bundled gpui-kit themes before anything renders + settings::init_themes(cx); + // Load embedded fonts in assets/fonts load_embedded_fonts(cx); @@ -70,15 +69,8 @@ fn main() { // Initialize settings settings::init(cx); - let appearance = settings::persisted_appearance_mode(); - let font_size = settings::persisted_theme().font_size; - - if let Err(error) = apply_native_theme(appearance, font_size, cx) { - log::warn!("native theme unavailable ({error})"); - apply_appearance(appearance, cx); - AppSettings::apply_theme_style(cx); - } - start_theme_watcher(cx); + // Apply the persisted appearance, theme selection and tuning + settings::apply_persisted_theme(cx); // Initialize the nostr client state::init(cx, cli_key); @@ -181,72 +173,3 @@ fn quit(_ev: &Quit, cx: &mut App) { log::info!("Gracefully quitting the application . . ."); cx.quit(); } - -/// Apply the native theme to the app, scaled to the user's font size, -/// then layer the persisted theme tuning on top -fn apply_native_theme( - appearance: AppearanceMode, - font_size: f32, - cx: &mut App, -) -> native_theme::Result<()> { - let mut system = native_theme_gpui::SystemTheme::from_system()?; - let native = system.light.defaults.font.size; - - if native > 0.0 { - system.accessibility.text_scaling_factor *= font_size / native; - } - - apply_system_theme(&system, cx); - apply_appearance(appearance, cx); - // Applying the native theme replaces the whole theme, so the user's - // tuning must be layered on afterwards. - AppSettings::apply_theme_style(cx); - - Ok(()) -} - -/// Honor the appearance mode against the installed (native) palettes -fn apply_appearance(appearance: AppearanceMode, cx: &mut App) { - match appearance { - AppearanceMode::System => Theme::sync_system_appearance(None, cx), - AppearanceMode::Light => Theme::change(ThemeMode::Light, None, cx), - AppearanceMode::Dark => Theme::change(ThemeMode::Dark, None, cx), - } -} - -/// Holds the watcher subscription so it lives as long as the app. -struct ThemeWatcher { - _subscription: ThemeSubscription, -} - -impl Global for ThemeWatcher {} - -/// Start a background task to watch for OS theme changes and re-apply the native theme. -fn start_theme_watcher(cx: &mut App) { - let (sender, receiver) = flume::unbounded(); - match native_theme::watch::on_theme_change(move |event| { - if let Err(error) = sender.send(event) { - log::warn!("theme change dropped ({error})"); - } - }) { - Ok(subscription) => { - cx.set_global(ThemeWatcher { - _subscription: subscription, - }); - cx.spawn(async move |cx| { - while receiver.recv_async().await.is_ok() { - log::info!("OS theme changed; re-applying"); - cx.update(|cx| { - let appearance = AppSettings::get_appearance_mode(cx); - let font_size = AppSettings::get_theme(cx).font_size; - if let Err(error) = apply_native_theme(appearance, font_size, cx) { - log::warn!("failed to apply updated OS theme ({error})"); - } - }); - } - }) - .detach(); - } - Err(error) => log::warn!("OS theme watching unavailable ({error})"), - } -} diff --git a/web/src/lib.rs b/web/src/lib.rs index abc91bac..d2d1064a 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -85,14 +85,19 @@ pub fn run() -> Result<(), JsValue> { gpui_kit::init(cx); + // Register the bundled gpui-kit themes before anything renders + settings::init_themes(cx); + load_embedded_fonts(cx); - apply_web_fonts(cx); // Initialize settings settings::init(cx); - apply_appearance(settings::persisted_appearance_mode(), cx); - settings::AppSettings::apply_theme_style(cx); + // Apply the persisted appearance, theme selection and tuning + settings::apply_persisted_theme(cx); + + // Layer the web font overrides on top of the applied theme + apply_web_fonts(cx); // Initialize the nostr client state::init(cx, None); @@ -156,14 +161,3 @@ fn apply_web_fonts(cx: &mut App) { } }); } - -/// Honor the appearance mode against the default palettes -fn apply_appearance(appearance: settings::AppearanceMode, cx: &mut App) { - use gpui_kit::component::{Theme, ThemeMode}; - - match appearance { - settings::AppearanceMode::System => Theme::sync_system_appearance(None, cx), - settings::AppearanceMode::Light => Theme::change(ThemeMode::Light, None, cx), - settings::AppearanceMode::Dark => Theme::change(ThemeMode::Dark, None, cx), - } -}