From 3817a5947f26262f680f4e081116decb0c41add4 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Thu, 28 May 2026 01:13:37 +0300 Subject: [PATCH] feat: add JetBrains themes --- .../src/lib/theme/themes/jetbrains-dark.json | 182 ++++++++++++++++++ .../src/lib/theme/themes/jetbrains-light.json | 182 ++++++++++++++++++ packages/ui/src/lib/theme/themes/presets.ts | 4 + 3 files changed, 368 insertions(+) create mode 100644 packages/ui/src/lib/theme/themes/jetbrains-dark.json create mode 100644 packages/ui/src/lib/theme/themes/jetbrains-light.json diff --git a/packages/ui/src/lib/theme/themes/jetbrains-dark.json b/packages/ui/src/lib/theme/themes/jetbrains-dark.json new file mode 100644 index 00000000..6bca8d0b --- /dev/null +++ b/packages/ui/src/lib/theme/themes/jetbrains-dark.json @@ -0,0 +1,182 @@ +{ + "metadata": { + "id": "jetbrains-dark", + "name": "JetBrains", + "description": "JetBrains IDE-inspired colors for OpenChamber - dark variant", + "author": "Artem Evsevev, adapted for OpenChamber", + "version": "1.0.0", + "variant": "dark", + "tags": [ + "dark", + "jetbrains", + "ide", + "blue" + ] + }, + "colors": { + "primary": { + "base": "#6796f5", + "hover": "#70AEFF", + "active": "#5594FA", + "foreground": "#1E1F22", + "muted": "#6796f580", + "emphasis": "#70AEFF" + }, + "surface": { + "background": "#1E1F22", + "foreground": "#DFE1E5", + "muted": "#26282B", + "mutedForeground": "#9fa0a2", + "elevated": "#2B2D30", + "elevatedForeground": "#DFE1E5", + "overlay": "#00000080", + "subtle": "#2c2d32" + }, + "interactive": { + "border": "#474a51", + "borderHover": "#4B5059", + "borderFocus": "#6796f5", + "selection": "#43454A", + "selectionForeground": "#DFE1E5", + "focus": "#6796f5", + "focusRing": "#6796f550", + "cursor": "#CED0D6", + "hover": "#3C3E41", + "active": "#494A4D" + }, + "status": { + "error": "#FA6675", + "errorForeground": "#1E1F22", + "errorBackground": "#402929", + "errorBorder": "#FA6675", + "warning": "#F2C55C", + "warningForeground": "#1E1F22", + "warningBackground": "#665014", + "warningBorder": "#F2C55C", + "success": "#57965D", + "successForeground": "#1E1F22", + "successBackground": "#253627", + "successBorder": "#57965D", + "info": "#3592C4", + "infoForeground": "#1E1F22", + "infoBackground": "#243846", + "infoBorder": "#3592C4" + }, + "pr": { + "open": "#5FAD65", + "draft": "#868A91", + "blocked": "#F2C55C", + "merged": "#A571E6", + "closed": "#DB5C5C" + }, + "syntax": { + "base": { + "background": "#1E1F22", + "foreground": "#BCBEC4", + "comment": "#7A7E85", + "keyword": "#CF8E6D", + "string": "#6AAB73", + "number": "#2AACB8", + "function": "#6AA2D7", + "variable": "#BCBEC4", + "type": "#A6BB77", + "operator": "#BCBEC4" + }, + "tokens": { + "commentDoc": "#5F826B", + "stringEscape": "#CF8E6D", + "keywordImport": "#CF8E6D", + "storageModifier": "#CF8E6D", + "functionCall": "#6AA2D7", + "method": "#6AA2D7", + "functionBuiltin": "#D5A563", + "variableProperty": "#C77DBB", + "variableOther": "#BCBEC4", + "variableGlobal": "#E59EAE", + "variableLocal": "#BCBEC4", + "parameter": "#3CACAC", + "constant": "#C77DBB", + "class": "#57AAF7", + "className": "#57AAF7", + "interface": "#8D91DC", + "struct": "#A6BB77", + "enum": "#A6BB77", + "typeParameter": "#3CACAC", + "namespace": "#BCBEC4", + "module": "#8D91DC", + "tag": "#D5B778", + "jsxTag": "#D5B778", + "tagAttribute": "#B3AE60", + "tagAttributeValue": "#6AAB73", + "boolean": "#CF8E6D", + "decorator": "#B3AE60", + "label": "#D5A563", + "punctuation": "#BCBEC4", + "macro": "#D5A563", + "preprocessor": "#D5A563", + "regex": "#6AAB73", + "url": "#57AAF7", + "key": "#C77DBB", + "exception": "#E59EAE" + }, + "highlights": { + "diffAdded": "#549159", + "diffAddedBackground": "#294436", + "diffRemoved": "#F75464", + "diffRemovedBackground": "#45302B", + "diffModified": "#70AEFF", + "diffModifiedBackground": "#243C63", + "lineNumber": "#4B5059", + "lineNumberActive": "#A1A3AB" + } + }, + "markdown": { + "heading1": "#FFFFFF", + "heading2": "#DFE1E5", + "heading3": "#CED0D6", + "heading4": "#BCBEC4", + "link": "#56A8F5", + "linkHover": "#6796f5", + "inlineCode": "#6AAB73", + "inlineCodeBackground": "#26282B", + "blockquote": "#7A7E85", + "blockquoteBorder": "#393B41", + "listMarker": "#B3AE6099" + }, + "chat": { + "userMessage": "#DFE1E5", + "userMessageBackground": "#3a5b9d76", + "assistantMessage": "#DFE1E5", + "assistantMessageBackground": "#1E1F22", + "timestamp": "#7A7E85", + "divider": "#393B41" + }, + "tools": { + "background": "#26282B50", + "border": "#393B41", + "headerHover": "#3C3E4150", + "icon": "#B0B1B3", + "title": "#DFE1E5", + "description": "#B0B1B3", + "edit": { + "added": "#549159", + "addedBackground": "#29443640", + "removed": "#F75464", + "removedBackground": "#45302B40", + "lineNumber": "#4B5059" + } + } + }, + "config": { + "fonts": { + "sans": "\"JetBrains Mono\", \"IBM Plex Mono\", monospace", + "mono": "\"JetBrains Mono\", \"IBM Plex Mono\", monospace", + "heading": "\"JetBrains Mono\", \"IBM Plex Mono\", monospace" + }, + "transitions": { + "fast": "150ms ease", + "normal": "250ms ease", + "slow": "350ms ease" + } + } +} diff --git a/packages/ui/src/lib/theme/themes/jetbrains-light.json b/packages/ui/src/lib/theme/themes/jetbrains-light.json new file mode 100644 index 00000000..3c7d3f97 --- /dev/null +++ b/packages/ui/src/lib/theme/themes/jetbrains-light.json @@ -0,0 +1,182 @@ +{ + "metadata": { + "id": "jetbrains-light", + "name": "JetBrains", + "description": "JetBrains IDE-inspired colors for OpenChamber - light variant", + "author": "Artem Evsevev, adapted for OpenChamber", + "version": "1.0.0", + "variant": "light", + "tags": [ + "light", + "jetbrains", + "ide", + "blue" + ] + }, + "colors": { + "primary": { + "base": "#195ce3", + "hover": "#2D61F0", + "active": "#0055FF", + "foreground": "#FFFFFF", + "muted": "#3573F080", + "emphasis": "#006DCC" + }, + "surface": { + "background": "#FFF", + "foreground": "#000000", + "muted": "#F7F8FA", + "mutedForeground": "#404040", + "elevated": "#FFFFFF", + "elevatedForeground": "#000000", + "overlay": "#00000025", + "subtle": "#ecf0f8" + }, + "interactive": { + "border": "#cfd3de", + "borderHover": "#AEB3C2", + "borderFocus": "#0055FF", + "selection": "#DFE1E5", + "selectionForeground": "#000000", + "focus": "#0055FF", + "focusRing": "#0055FF40", + "cursor": "#000000", + "hover": "#E6E6E8", + "active": "#DBDCDE" + }, + "status": { + "error": "#CE0606", + "errorForeground": "#FFFFFF", + "errorBackground": "#FFE8E8", + "errorBorder": "#CF5B56", + "warning": "#F49810", + "warningForeground": "#000000", + "warningBackground": "#FFF8DC", + "warningBorder": "#F49810", + "success": "#077D18", + "successForeground": "#FFFFFF", + "successBackground": "#E9F5E6", + "successBorder": "#55A76A", + "info": "#389FD6", + "infoForeground": "#000000", + "infoBackground": "#E7F4FB", + "infoBorder": "#389FD6" + }, + "pr": { + "open": "#369650", + "draft": "#808080", + "blocked": "#F49810", + "merged": "#834DF0", + "closed": "#E55765" + }, + "syntax": { + "base": { + "background": "#FFFFFF", + "foreground": "#080808", + "comment": "#8C8C8C", + "keyword": "#0033B3", + "string": "#067D17", + "number": "#1750EB", + "function": "#00627A", + "variable": "#000000", + "type": "#A04908", + "operator": "#080808" + }, + "tokens": { + "commentDoc": "#8C8C8C", + "stringEscape": "#0037A6", + "keywordImport": "#0033B3", + "storageModifier": "#0033B3", + "functionCall": "#00627A", + "method": "#00627A", + "functionBuiltin": "#C27203", + "variableProperty": "#871094", + "variableOther": "#000000", + "variableGlobal": "#1C5DFE", + "variableLocal": "#000000", + "parameter": "#007E8A", + "constant": "#871094", + "class": "#00627A", + "className": "#00627A", + "interface": "#835DDA", + "struct": "#A04908", + "enum": "#A04908", + "typeParameter": "#007E8A", + "namespace": "#000000", + "module": "#835DDA", + "tag": "#0033B3", + "jsxTag": "#0033B3", + "tagAttribute": "#9E880D", + "tagAttributeValue": "#067D17", + "boolean": "#0033B3", + "decorator": "#9E880D", + "label": "#C27203", + "punctuation": "#080808", + "macro": "#C27203", + "preprocessor": "#C27203", + "regex": "#067D17", + "url": "#00627A", + "key": "#871094", + "exception": "#1C5DFE" + }, + "highlights": { + "diffAdded": "#077D18", + "diffAddedBackground": "#BEE6BE", + "diffRemoved": "#FF0000", + "diffRemovedBackground": "#FFD5CC", + "diffModified": "#0133B3", + "diffModifiedBackground": "#DDE8FF", + "lineNumber": "#AEB3C2", + "lineNumberActive": "#767A8A" + } + }, + "markdown": { + "heading1": "#000000", + "heading2": "#161617", + "heading3": "#404040", + "heading4": "#404040", + "link": "#006DCC", + "linkHover": "#3573F0", + "inlineCode": "#067D17", + "inlineCodeBackground": "#F5F7F9", + "blockquote": "#8C8C8C", + "blockquoteBorder": "#C9CCD6", + "listMarker": "#9E880D99" + }, + "chat": { + "userMessage": "#000000", + "userMessageBackground": "#E8F1FF", + "assistantMessage": "#000000", + "assistantMessageBackground": "#F7F8FA", + "timestamp": "#767A8A", + "divider": "#C9CCD6" + }, + "tools": { + "background": "#F5F7F950", + "border": "#AEB3C280", + "headerHover": "#E6E6E8", + "icon": "#404040", + "title": "#000000", + "description": "#404040", + "edit": { + "added": "#077D18", + "addedBackground": "#BEE6BE50", + "removed": "#FF0000", + "removedBackground": "#FFD5CC50", + "lineNumber": "#AEB3C2" + } + } + }, + "config": { + "fonts": { + "sans": "\"JetBrains Mono\", \"IBM Plex Mono\", monospace", + "mono": "\"JetBrains Mono\", \"IBM Plex Mono\", monospace", + "heading": "\"JetBrains Mono\", \"IBM Plex Mono\", monospace" + }, + "transitions": { + "fast": "150ms ease", + "normal": "250ms ease", + "slow": "350ms ease" + } + } +} diff --git a/packages/ui/src/lib/theme/themes/presets.ts b/packages/ui/src/lib/theme/themes/presets.ts index c7dadda3..9b46b0a2 100644 --- a/packages/ui/src/lib/theme/themes/presets.ts +++ b/packages/ui/src/lib/theme/themes/presets.ts @@ -19,6 +19,8 @@ import dracula_light_Raw from './dracula-light.json'; // import github_light_Raw from './github-light.json'; import gruvbox_dark_Raw from './gruvbox-dark.json'; import gruvbox_light_Raw from './gruvbox-light.json'; +import jetbrains_dark_Raw from './jetbrains-dark.json'; +import jetbrains_light_Raw from './jetbrains-light.json'; import kanagawa_dark_Raw from './kanagawa-dark.json'; import kanagawa_light_Raw from './kanagawa-light.json'; // import lucent_orng_dark_Raw from './lucent-orng-dark.json'; @@ -79,6 +81,8 @@ export const presetThemes: Theme[] = [ // github_light_Raw as Theme, gruvbox_dark_Raw as Theme, gruvbox_light_Raw as Theme, + jetbrains_dark_Raw as Theme, + jetbrains_light_Raw as Theme, kanagawa_dark_Raw as Theme, kanagawa_light_Raw as Theme, // lucent_orng_dark_Raw as Theme,