diff --git a/packages/app/src/custom-elements.d.ts b/packages/app/src/custom-elements.d.ts index e4ea0d6cebd..49ec4449fa2 120000 --- a/packages/app/src/custom-elements.d.ts +++ b/packages/app/src/custom-elements.d.ts @@ -1 +1,17 @@ -../../ui/src/custom-elements.d.ts \ No newline at end of file +import { DIFFS_TAG_NAME } from "@pierre/diffs" + +/** + * TypeScript declaration for the custom element. + * This tells TypeScript that is a valid JSX element in SolidJS. + * Required for using the @pierre/diffs web component in .tsx files. + */ + +declare module "solid-js" { + namespace JSX { + interface IntrinsicElements { + [DIFFS_TAG_NAME]: HTMLAttributes + } + } +} + +export {} diff --git a/packages/enterprise/src/custom-elements.d.ts b/packages/enterprise/src/custom-elements.d.ts index e4ea0d6cebd..49ec4449fa2 120000 --- a/packages/enterprise/src/custom-elements.d.ts +++ b/packages/enterprise/src/custom-elements.d.ts @@ -1 +1,17 @@ -../../ui/src/custom-elements.d.ts \ No newline at end of file +import { DIFFS_TAG_NAME } from "@pierre/diffs" + +/** + * TypeScript declaration for the custom element. + * This tells TypeScript that is a valid JSX element in SolidJS. + * Required for using the @pierre/diffs web component in .tsx files. + */ + +declare module "solid-js" { + namespace JSX { + interface IntrinsicElements { + [DIFFS_TAG_NAME]: HTMLAttributes + } + } +} + +export {} diff --git a/packages/ui/src/theme/default-themes.ts b/packages/ui/src/theme/default-themes.ts index 88dffeb3f05..e119a42e275 100644 --- a/packages/ui/src/theme/default-themes.ts +++ b/packages/ui/src/theme/default-themes.ts @@ -14,6 +14,26 @@ import vesperThemeJson from "./themes/vesper.json" import carbonfoxThemeJson from "./themes/carbonfox.json" import gruvboxThemeJson from "./themes/gruvbox.json" import auraThemeJson from "./themes/aura.json" +import cobalt2ThemeJson from "./themes/cobalt2.json" +import cursorThemeJson from "./themes/cursor.json" +import everforestThemeJson from "./themes/everforest.json" +import flexokiThemeJson from "./themes/flexoki.json" +import githubThemeJson from "./themes/github.json" +import kanagawaThemeJson from "./themes/kanagawa.json" +import materialThemeJson from "./themes/material.json" +import matrixThemeJson from "./themes/matrix.json" +import mercuryThemeJson from "./themes/mercury.json" +import oneDarkThemeJson from "./themes/one-dark.json" +import rosepineThemeJson from "./themes/rosepine.json" +import orngThemeJson from "./themes/orng.json" +import osakaJadeThemeJson from "./themes/osaka-jade.json" +import palenightThemeJson from "./themes/palenight.json" +import synthwave84ThemeJson from "./themes/synthwave84.json" +import vercelThemeJson from "./themes/vercel.json" +import zenburnThemeJson from "./themes/zenburn.json" +import catppuccinFrappeThemeJson from "./themes/catppuccin-frappe.json" +import catppuccinMacchiatoThemeJson from "./themes/catppuccin-macchiato.json" +import lucentOrngThemeJson from "./themes/lucent-orng.json" export const oc1Theme = oc1ThemeJson as DesktopTheme export const tokyonightTheme = tokyoThemeJson as DesktopTheme @@ -30,6 +50,26 @@ export const vesperTheme = vesperThemeJson as DesktopTheme export const carbonfoxTheme = carbonfoxThemeJson as DesktopTheme export const gruvboxTheme = gruvboxThemeJson as DesktopTheme export const auraTheme = auraThemeJson as DesktopTheme +export const cobalt2Theme = cobalt2ThemeJson as DesktopTheme +export const cursorTheme = cursorThemeJson as DesktopTheme +export const everforestTheme = everforestThemeJson as DesktopTheme +export const flexokiTheme = flexokiThemeJson as DesktopTheme +export const githubTheme = githubThemeJson as DesktopTheme +export const kanagawaTheme = kanagawaThemeJson as DesktopTheme +export const materialTheme = materialThemeJson as DesktopTheme +export const matrixTheme = matrixThemeJson as DesktopTheme +export const mercuryTheme = mercuryThemeJson as DesktopTheme +export const oneDarkTheme = oneDarkThemeJson as DesktopTheme +export const rosepineTheme = rosepineThemeJson as DesktopTheme +export const orngTheme = orngThemeJson as DesktopTheme +export const osakaJadeTheme = osakaJadeThemeJson as DesktopTheme +export const palenightTheme = palenightThemeJson as DesktopTheme +export const synthwave84Theme = synthwave84ThemeJson as DesktopTheme +export const vercelTheme = vercelThemeJson as DesktopTheme +export const zenburnTheme = zenburnThemeJson as DesktopTheme +export const catppuccinFrappeTheme = catppuccinFrappeThemeJson as DesktopTheme +export const catppuccinMacchiatoTheme = catppuccinMacchiatoThemeJson as DesktopTheme +export const lucentOrngTheme = lucentOrngThemeJson as DesktopTheme export const DEFAULT_THEMES: Record = { "oc-1": oc1Theme, @@ -47,4 +87,24 @@ export const DEFAULT_THEMES: Record = { carbonfox: carbonfoxTheme, gruvbox: gruvboxTheme, aura: auraTheme, + cobalt2: cobalt2Theme, + cursor: cursorTheme, + everforest: everforestTheme, + flexoki: flexokiTheme, + github: githubTheme, + kanagawa: kanagawaTheme, + material: materialTheme, + matrix: matrixTheme, + mercury: mercuryTheme, + "one-dark": oneDarkTheme, + rosepine: rosepineTheme, + orng: orngTheme, + "osaka-jade": osakaJadeTheme, + palenight: palenightTheme, + synthwave84: synthwave84Theme, + vercel: vercelTheme, + zenburn: zenburnTheme, + "catppuccin-frappe": catppuccinFrappeTheme, + "catppuccin-macchiato": catppuccinMacchiatoTheme, + "lucent-orng": lucentOrngTheme, } diff --git a/packages/ui/src/theme/themes/catppuccin-frappe.json b/packages/ui/src/theme/themes/catppuccin-frappe.json new file mode 100644 index 00000000000..4d08c2e70c0 --- /dev/null +++ b/packages/ui/src/theme/themes/catppuccin-frappe.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Catppuccin Frappe", + "id": "catppuccin-frappe", + "light": { + "seeds": { + "neutral": "#303446", + "primary": "#8da4e2", + "success": "#a6d189", + "warning": "#e5c890", + "error": "#e78284", + "info": "#81c8be", + "interactive": "#8da4e2", + "diffAdd": "#a6d189", + "diffDelete": "#e78284" + }, + "overrides": { + "background-base": "#303446", + "background-weak": "#292c3c", + "background-strong": "#232634", + "text-base": "#c6d0f5", + "text-weak": "#b5bfe2", + "border-base": "#414559", + "border-strong-base": "#51576d", + "syntax-string": "#a6d189", + "syntax-primitive": "#e78284", + "syntax-property": "#8da4e2", + "syntax-type": "#e5c890", + "syntax-constant": "#b5bfe2", + "syntax-info": "#b5bfe2", + "markdown-heading": "#ca9ee6", + "markdown-text": "#c6d0f5", + "markdown-link": "#8da4e2", + "markdown-link-text": "#99d1db", + "markdown-code": "#a6d189", + "markdown-block-quote": "#b5bfe2", + "markdown-emph": "#e5c890", + "markdown-strong": "#e78284", + "markdown-horizontal-rule": "#b5bfe2", + "markdown-list-item": "#8da4e2", + "markdown-list-enumeration": "#99d1db", + "markdown-image": "#8da4e2", + "markdown-image-text": "#99d1db", + "markdown-code-block": "#c6d0f5", + "surface-diff-add-base": "#2a3a2a", + "surface-diff-delete-base": "#3a2a2a" + } + }, + "dark": { + "seeds": { + "neutral": "#303446", + "primary": "#8da4e2", + "success": "#a6d189", + "warning": "#e5c890", + "error": "#e78284", + "info": "#81c8be", + "interactive": "#8da4e2", + "diffAdd": "#a6d189", + "diffDelete": "#e78284" + }, + "overrides": { + "background-base": "#303446", + "background-weak": "#292c3c", + "background-strong": "#232634", + "text-base": "#c6d0f5", + "text-weak": "#b5bfe2", + "border-base": "#414559", + "border-strong-base": "#51576d", + "syntax-string": "#a6d189", + "syntax-primitive": "#e78284", + "syntax-property": "#8da4e2", + "syntax-type": "#e5c890", + "syntax-constant": "#b5bfe2", + "syntax-info": "#b5bfe2", + "markdown-heading": "#ca9ee6", + "markdown-text": "#c6d0f5", + "markdown-link": "#8da4e2", + "markdown-link-text": "#99d1db", + "markdown-code": "#a6d189", + "markdown-block-quote": "#b5bfe2", + "markdown-emph": "#e5c890", + "markdown-strong": "#e78284", + "markdown-horizontal-rule": "#b5bfe2", + "markdown-list-item": "#8da4e2", + "markdown-list-enumeration": "#99d1db", + "markdown-image": "#8da4e2", + "markdown-image-text": "#99d1db", + "markdown-code-block": "#c6d0f5", + "surface-diff-add-base": "#2a3a2a", + "surface-diff-delete-base": "#3a2a2a" + } + } +} diff --git a/packages/ui/src/theme/themes/catppuccin-macchiato.json b/packages/ui/src/theme/themes/catppuccin-macchiato.json new file mode 100644 index 00000000000..9a408b296fc --- /dev/null +++ b/packages/ui/src/theme/themes/catppuccin-macchiato.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Catppuccin Macchiato", + "id": "catppuccin-macchiato", + "light": { + "seeds": { + "neutral": "#24273a", + "primary": "#8aadf4", + "success": "#a6da95", + "warning": "#eed49f", + "error": "#ed8796", + "info": "#8bd5ca", + "interactive": "#8aadf4", + "diffAdd": "#a6da95", + "diffDelete": "#ed8796" + }, + "overrides": { + "background-base": "#24273a", + "background-weak": "#1e2030", + "background-strong": "#181926", + "text-base": "#cad3f5", + "text-weak": "#b8c0e0", + "border-base": "#363a4f", + "border-strong-base": "#494d64", + "syntax-string": "#a6da95", + "syntax-primitive": "#ed8796", + "syntax-property": "#8aadf4", + "syntax-type": "#eed49f", + "syntax-constant": "#b8c0e0", + "syntax-info": "#b8c0e0", + "markdown-heading": "#c6a0f6", + "markdown-text": "#cad3f5", + "markdown-link": "#8aadf4", + "markdown-link-text": "#91d7e3", + "markdown-code": "#a6da95", + "markdown-block-quote": "#b8c0e0", + "markdown-emph": "#eed49f", + "markdown-strong": "#ed8796", + "markdown-horizontal-rule": "#b8c0e0", + "markdown-list-item": "#8aadf4", + "markdown-list-enumeration": "#91d7e3", + "markdown-image": "#8aadf4", + "markdown-image-text": "#91d7e3", + "markdown-code-block": "#cad3f5", + "surface-diff-add-base": "#2a3a2a", + "surface-diff-delete-base": "#3a2a2a" + } + }, + "dark": { + "seeds": { + "neutral": "#24273a", + "primary": "#8aadf4", + "success": "#a6da95", + "warning": "#eed49f", + "error": "#ed8796", + "info": "#8bd5ca", + "interactive": "#8aadf4", + "diffAdd": "#a6da95", + "diffDelete": "#ed8796" + }, + "overrides": { + "background-base": "#24273a", + "background-weak": "#1e2030", + "background-strong": "#181926", + "text-base": "#cad3f5", + "text-weak": "#b8c0e0", + "border-base": "#363a4f", + "border-strong-base": "#494d64", + "syntax-string": "#a6da95", + "syntax-primitive": "#ed8796", + "syntax-property": "#8aadf4", + "syntax-type": "#eed49f", + "syntax-constant": "#b8c0e0", + "syntax-info": "#b8c0e0", + "markdown-heading": "#c6a0f6", + "markdown-text": "#cad3f5", + "markdown-link": "#8aadf4", + "markdown-link-text": "#91d7e3", + "markdown-code": "#a6da95", + "markdown-block-quote": "#b8c0e0", + "markdown-emph": "#eed49f", + "markdown-strong": "#ed8796", + "markdown-horizontal-rule": "#b8c0e0", + "markdown-list-item": "#8aadf4", + "markdown-list-enumeration": "#91d7e3", + "markdown-image": "#8aadf4", + "markdown-image-text": "#91d7e3", + "markdown-code-block": "#cad3f5", + "surface-diff-add-base": "#2a3a2a", + "surface-diff-delete-base": "#3a2a2a" + } + } +} diff --git a/packages/ui/src/theme/themes/cobalt2.json b/packages/ui/src/theme/themes/cobalt2.json new file mode 100644 index 00000000000..61a49fbb587 --- /dev/null +++ b/packages/ui/src/theme/themes/cobalt2.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Cobalt2", + "id": "cobalt2", + "light": { + "seeds": { + "neutral": "#ffffff", + "primary": "#0066cc", + "success": "#4caf50", + "warning": "#ff9800", + "error": "#e91e63", + "info": "#00acc1", + "interactive": "#0066cc", + "diffAdd": "#4caf50", + "diffDelete": "#e91e63" + }, + "overrides": { + "background-base": "#ffffff", + "background-weak": "#f5f7fa", + "background-strong": "#e8ecf1", + "text-base": "#193549", + "text-weak": "#5c6b7d", + "border-base": "#d3dae3", + "border-strong-base": "#0066cc", + "syntax-string": "#4caf50", + "syntax-primitive": "#e91e63", + "syntax-property": "#ff9800", + "syntax-type": "#00acc1", + "syntax-constant": "#5c6b7d", + "syntax-info": "#5c6b7d", + "markdown-heading": "#ff9800", + "markdown-text": "#193549", + "markdown-link": "#0066cc", + "markdown-link-text": "#00acc1", + "markdown-code": "#4caf50", + "markdown-block-quote": "#5c6b7d", + "markdown-emph": "#ff5722", + "markdown-strong": "#e91e63", + "markdown-horizontal-rule": "#d3dae3", + "markdown-list-item": "#0066cc", + "markdown-list-enumeration": "#00acc1", + "markdown-image": "#0066cc", + "markdown-image-text": "#00acc1", + "markdown-code-block": "#193549", + "surface-diff-add-base": "#e8f5e9", + "surface-diff-delete-base": "#ffebee" + } + }, + "dark": { + "seeds": { + "neutral": "#193549", + "primary": "#0088ff", + "success": "#9eff80", + "warning": "#ffc600", + "error": "#ff0088", + "info": "#ff9d00", + "interactive": "#0088ff", + "diffAdd": "#9eff80", + "diffDelete": "#ff0088" + }, + "overrides": { + "background-base": "#193549", + "background-weak": "#122738", + "background-strong": "#1f4662", + "text-base": "#ffffff", + "text-weak": "#adb7c9", + "border-base": "#1f4662", + "border-strong-base": "#0088ff", + "syntax-string": "#9eff80", + "syntax-primitive": "#ff628c", + "syntax-property": "#ffc600", + "syntax-type": "#2affdf", + "syntax-constant": "#0088ff", + "syntax-info": "#0088ff", + "markdown-heading": "#ffc600", + "markdown-text": "#ffffff", + "markdown-link": "#0088ff", + "markdown-link-text": "#2affdf", + "markdown-code": "#9eff80", + "markdown-block-quote": "#adb7c9", + "markdown-emph": "#ff9d00", + "markdown-strong": "#ff628c", + "markdown-horizontal-rule": "#2d5a7b", + "markdown-list-item": "#0088ff", + "markdown-list-enumeration": "#2affdf", + "markdown-image": "#0088ff", + "markdown-image-text": "#2affdf", + "markdown-code-block": "#ffffff", + "surface-diff-add-base": "#1a3a2a", + "surface-diff-delete-base": "#3a1a2a" + } + } +} diff --git a/packages/ui/src/theme/themes/cursor.json b/packages/ui/src/theme/themes/cursor.json new file mode 100644 index 00000000000..e2e87257421 --- /dev/null +++ b/packages/ui/src/theme/themes/cursor.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Cursor", + "id": "cursor", + "light": { + "seeds": { + "neutral": "#fcfcfc", + "primary": "#6f9ba6", + "success": "#1f8a65", + "warning": "#db704b", + "error": "#cf2d56", + "info": "#3c7cab", + "interactive": "#6f9ba6", + "diffAdd": "#1f8a65", + "diffDelete": "#cf2d56" + }, + "overrides": { + "background-base": "#fcfcfc", + "background-weak": "#f3f3f3", + "background-strong": "#ededed", + "text-base": "#141414", + "text-weak": "#141414ad", + "border-base": "#14141413", + "border-strong-base": "#6f9ba6", + "syntax-string": "#9e94d5", + "syntax-primitive": "#b8448b", + "syntax-property": "#db704b", + "syntax-type": "#206595", + "syntax-constant": "#141414ad", + "syntax-info": "#141414ad", + "markdown-heading": "#206595", + "markdown-text": "#141414", + "markdown-link": "#6f9ba6", + "markdown-link-text": "#141414ad", + "markdown-code": "#1f8a65", + "markdown-block-quote": "#141414ad", + "markdown-emph": "#141414", + "markdown-strong": "#141414", + "markdown-horizontal-rule": "#141414ad", + "markdown-list-item": "#141414", + "markdown-list-enumeration": "#141414ad", + "markdown-image": "#6f9ba6", + "markdown-image-text": "#141414ad", + "markdown-code-block": "#141414", + "surface-diff-add-base": "#1f8a651f", + "surface-diff-delete-base": "#cf2d5614" + } + }, + "dark": { + "seeds": { + "neutral": "#181818", + "primary": "#88c0d0", + "success": "#3fa266", + "warning": "#f1b467", + "error": "#e34671", + "info": "#81a1c1", + "interactive": "#88c0d0", + "diffAdd": "#3fa266", + "diffDelete": "#e34671" + }, + "overrides": { + "background-base": "#181818", + "background-weak": "#141414", + "background-strong": "#262626", + "text-base": "#e4e4e4", + "text-weak": "#e4e4e45e", + "border-base": "#e4e4e413", + "border-strong-base": "#88c0d0", + "syntax-string": "#E394DC", + "syntax-primitive": "#F8C762", + "syntax-property": "#EFB080", + "syntax-type": "#EFB080", + "syntax-constant": "#e4e4e45e", + "syntax-info": "#e4e4e45e", + "markdown-heading": "#AAA0FA", + "markdown-text": "#e4e4e4", + "markdown-link": "#82D2CE", + "markdown-link-text": "#81a1c1", + "markdown-code": "#E394DC", + "markdown-block-quote": "#e4e4e45e", + "markdown-emph": "#82D2CE", + "markdown-strong": "#F8C762", + "markdown-horizontal-rule": "#e4e4e45e", + "markdown-list-item": "#e4e4e4", + "markdown-list-enumeration": "#88c0d0", + "markdown-image": "#88c0d0", + "markdown-image-text": "#81a1c1", + "markdown-code-block": "#e4e4e4", + "surface-diff-add-base": "#3fa26633", + "surface-diff-delete-base": "#b8004933" + } + } +} diff --git a/packages/ui/src/theme/themes/everforest.json b/packages/ui/src/theme/themes/everforest.json new file mode 100644 index 00000000000..e8a6c12c3c9 --- /dev/null +++ b/packages/ui/src/theme/themes/everforest.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Everforest", + "id": "everforest", + "light": { + "seeds": { + "neutral": "#fdf6e3", + "primary": "#8da101", + "success": "#8da101", + "warning": "#f57d26", + "error": "#f85552", + "info": "#35a77c", + "interactive": "#8da101", + "diffAdd": "#8da101", + "diffDelete": "#f85552" + }, + "overrides": { + "background-base": "#fdf6e3", + "background-weak": "#efebd4", + "background-strong": "#f4f0d9", + "text-base": "#5c6a72", + "text-weak": "#a6b0a0", + "border-base": "#939f91", + "border-strong-base": "#829181", + "syntax-string": "#8da101", + "syntax-primitive": "#f57d26", + "syntax-property": "#8da101", + "syntax-type": "#dfa000", + "syntax-constant": "#a6b0a0", + "syntax-info": "#a6b0a0", + "markdown-heading": "#df69ba", + "markdown-text": "#5c6a72", + "markdown-link": "#8da101", + "markdown-link-text": "#35a77c", + "markdown-code": "#8da101", + "markdown-block-quote": "#dfa000", + "markdown-emph": "#dfa000", + "markdown-strong": "#f57d26", + "markdown-horizontal-rule": "#a6b0a0", + "markdown-list-item": "#8da101", + "markdown-list-enumeration": "#35a77c", + "markdown-image": "#8da101", + "markdown-image-text": "#35a77c", + "markdown-code-block": "#5c6a72", + "surface-diff-add-base": "#d5e5d5", + "surface-diff-delete-base": "#f7d8db" + } + }, + "dark": { + "seeds": { + "neutral": "#2d353b", + "primary": "#a7c080", + "success": "#a7c080", + "warning": "#e69875", + "error": "#e67e80", + "info": "#83c092", + "interactive": "#a7c080", + "diffAdd": "#a7c080", + "diffDelete": "#e67e80" + }, + "overrides": { + "background-base": "#2d353b", + "background-weak": "#333c43", + "background-strong": "#343f44", + "text-base": "#d3c6aa", + "text-weak": "#7a8478", + "border-base": "#859289", + "border-strong-base": "#9da9a0", + "syntax-string": "#a7c080", + "syntax-primitive": "#e67e80", + "syntax-property": "#a7c080", + "syntax-type": "#dbbc7f", + "syntax-constant": "#7a8478", + "syntax-info": "#7a8478", + "markdown-heading": "#d699b6", + "markdown-text": "#d3c6aa", + "markdown-link": "#a7c080", + "markdown-link-text": "#83c092", + "markdown-code": "#a7c080", + "markdown-block-quote": "#dbbc7f", + "markdown-emph": "#dbbc7f", + "markdown-strong": "#e69875", + "markdown-horizontal-rule": "#7a8478", + "markdown-list-item": "#a7c080", + "markdown-list-enumeration": "#83c092", + "markdown-image": "#a7c080", + "markdown-image-text": "#83c092", + "markdown-code-block": "#d3c6aa", + "surface-diff-add-base": "#20303b", + "surface-diff-delete-base": "#37222c" + } + } +} diff --git a/packages/ui/src/theme/themes/flexoki.json b/packages/ui/src/theme/themes/flexoki.json new file mode 100644 index 00000000000..774b4eccbf8 --- /dev/null +++ b/packages/ui/src/theme/themes/flexoki.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Flexoki", + "id": "flexoki", + "light": { + "seeds": { + "neutral": "#FFFCF0", + "primary": "#205EA6", + "success": "#66800B", + "warning": "#BC5215", + "error": "#AF3029", + "info": "#24837B", + "interactive": "#205EA6", + "diffAdd": "#66800B", + "diffDelete": "#AF3029" + }, + "overrides": { + "background-base": "#FFFCF0", + "background-weak": "#F2F0E5", + "background-strong": "#E6E4D9", + "text-base": "#100F0F", + "text-weak": "#6F6E69", + "border-base": "#B7B5AC", + "border-strong-base": "#878580", + "syntax-string": "#24837B", + "syntax-primitive": "#5E409D", + "syntax-property": "#BC5215", + "syntax-type": "#AD8301", + "syntax-constant": "#6F6E69", + "syntax-info": "#6F6E69", + "markdown-heading": "#5E409D", + "markdown-text": "#100F0F", + "markdown-link": "#4385BE", + "markdown-link-text": "#24837B", + "markdown-code": "#3AA99F", + "markdown-block-quote": "#AD8301", + "markdown-emph": "#AD8301", + "markdown-strong": "#BC5215", + "markdown-horizontal-rule": "#6F6E69", + "markdown-list-item": "#DA702C", + "markdown-list-enumeration": "#3AA99F", + "markdown-image": "#CE5D97", + "markdown-image-text": "#3AA99F", + "markdown-code-block": "#100F0F", + "surface-diff-add-base": "#D5E5D5", + "surface-diff-delete-base": "#F7D8DB" + } + }, + "dark": { + "seeds": { + "neutral": "#100F0F", + "primary": "#DA702C", + "success": "#879A39", + "warning": "#DA702C", + "error": "#D14D41", + "info": "#3AA99F", + "interactive": "#DA702C", + "diffAdd": "#879A39", + "diffDelete": "#D14D41" + }, + "overrides": { + "background-base": "#100F0F", + "background-weak": "#1C1B1A", + "background-strong": "#282726", + "text-base": "#CECDC3", + "text-weak": "#6F6E69", + "border-base": "#575653", + "border-strong-base": "#6F6E69", + "syntax-string": "#3AA99F", + "syntax-primitive": "#8B7EC8", + "syntax-property": "#DA702C", + "syntax-type": "#D0A215", + "syntax-constant": "#6F6E69", + "syntax-info": "#6F6E69", + "markdown-heading": "#8B7EC8", + "markdown-text": "#CECDC3", + "markdown-link": "#4385BE", + "markdown-link-text": "#3AA99F", + "markdown-code": "#3AA99F", + "markdown-block-quote": "#D0A215", + "markdown-emph": "#D0A215", + "markdown-strong": "#DA702C", + "markdown-horizontal-rule": "#6F6E69", + "markdown-list-item": "#DA702C", + "markdown-list-enumeration": "#3AA99F", + "markdown-image": "#CE5D97", + "markdown-image-text": "#3AA99F", + "markdown-code-block": "#CECDC3", + "surface-diff-add-base": "#1A2D1A", + "surface-diff-delete-base": "#2D1A1A" + } + } +} diff --git a/packages/ui/src/theme/themes/github.json b/packages/ui/src/theme/themes/github.json new file mode 100644 index 00000000000..1c371ca185f --- /dev/null +++ b/packages/ui/src/theme/themes/github.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Github", + "id": "github", + "light": { + "seeds": { + "neutral": "#ffffff", + "primary": "#0969da", + "success": "#1a7f37", + "warning": "#9a6700", + "error": "#cf222e", + "info": "#bc4c00", + "interactive": "#0969da", + "diffAdd": "#1a7f37", + "diffDelete": "#cf222e" + }, + "overrides": { + "background-base": "#ffffff", + "background-weak": "#f6f8fa", + "background-strong": "#f0f3f6", + "text-base": "#24292f", + "text-weak": "#57606a", + "border-base": "#d0d7de", + "border-strong-base": "#0969da", + "syntax-string": "#0969da", + "syntax-primitive": "#1b7c83", + "syntax-property": "#8250df", + "syntax-type": "#bc4c00", + "syntax-constant": "#57606a", + "syntax-info": "#57606a", + "markdown-heading": "#0969da", + "markdown-text": "#24292f", + "markdown-link": "#0969da", + "markdown-link-text": "#1b7c83", + "markdown-code": "#bf3989", + "markdown-block-quote": "#57606a", + "markdown-emph": "#9a6700", + "markdown-strong": "#bc4c00", + "markdown-horizontal-rule": "#d0d7de", + "markdown-list-item": "#0969da", + "markdown-list-enumeration": "#1b7c83", + "markdown-image": "#0969da", + "markdown-image-text": "#1b7c83", + "markdown-code-block": "#24292f", + "surface-diff-add-base": "#dafbe1", + "surface-diff-delete-base": "#ffebe9" + } + }, + "dark": { + "seeds": { + "neutral": "#0d1117", + "primary": "#58a6ff", + "success": "#3fb950", + "warning": "#e3b341", + "error": "#f85149", + "info": "#d29922", + "interactive": "#58a6ff", + "diffAdd": "#3fb950", + "diffDelete": "#f85149" + }, + "overrides": { + "background-base": "#0d1117", + "background-weak": "#010409", + "background-strong": "#161b22", + "text-base": "#c9d1d9", + "text-weak": "#8b949e", + "border-base": "#30363d", + "border-strong-base": "#58a6ff", + "syntax-string": "#39c5cf", + "syntax-primitive": "#61afef", + "syntax-property": "#bc8cff", + "syntax-type": "#d29922", + "syntax-constant": "#8b949e", + "syntax-info": "#8b949e", + "markdown-heading": "#58a6ff", + "markdown-text": "#c9d1d9", + "markdown-link": "#58a6ff", + "markdown-link-text": "#39c5cf", + "markdown-code": "#ff7b72", + "markdown-block-quote": "#8b949e", + "markdown-emph": "#e3b341", + "markdown-strong": "#d29922", + "markdown-horizontal-rule": "#30363d", + "markdown-list-item": "#58a6ff", + "markdown-list-enumeration": "#39c5cf", + "markdown-image": "#58a6ff", + "markdown-image-text": "#39c5cf", + "markdown-code-block": "#c9d1d9", + "surface-diff-add-base": "#033a16", + "surface-diff-delete-base": "#67060c" + } + } +} diff --git a/packages/ui/src/theme/themes/kanagawa.json b/packages/ui/src/theme/themes/kanagawa.json new file mode 100644 index 00000000000..ae1109cfad5 --- /dev/null +++ b/packages/ui/src/theme/themes/kanagawa.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Kanagawa", + "id": "kanagawa", + "light": { + "seeds": { + "neutral": "#F2E9DE", + "primary": "#2D4F67", + "success": "#98BB6C", + "warning": "#D7A657", + "error": "#E82424", + "info": "#76946A", + "interactive": "#2D4F67", + "diffAdd": "#98BB6C", + "diffDelete": "#E82424" + }, + "overrides": { + "background-base": "#F2E9DE", + "background-weak": "#EAE4D7", + "background-strong": "#E3DCD2", + "text-base": "#54433A", + "text-weak": "#9E9389", + "border-base": "#D4CBBF", + "border-strong-base": "#C38D9D", + "syntax-string": "#98BB6C", + "syntax-primitive": "#D7A657", + "syntax-property": "#2D4F67", + "syntax-type": "#C38D9D", + "syntax-constant": "#9E9389", + "syntax-info": "#9E9389", + "markdown-heading": "#957FB8", + "markdown-text": "#54433A", + "markdown-link": "#2D4F67", + "markdown-link-text": "#76946A", + "markdown-code": "#98BB6C", + "markdown-block-quote": "#9E9389", + "markdown-emph": "#C38D9D", + "markdown-strong": "#D7A657", + "markdown-horizontal-rule": "#9E9389", + "markdown-list-item": "#2D4F67", + "markdown-list-enumeration": "#76946A", + "markdown-image": "#2D4F67", + "markdown-image-text": "#76946A", + "markdown-code-block": "#54433A", + "surface-diff-add-base": "#EAF3E4", + "surface-diff-delete-base": "#FBE6E6" + } + }, + "dark": { + "seeds": { + "neutral": "#1F1F28", + "primary": "#7E9CD8", + "success": "#98BB6C", + "warning": "#D7A657", + "error": "#E82424", + "info": "#76946A", + "interactive": "#7E9CD8", + "diffAdd": "#98BB6C", + "diffDelete": "#E82424" + }, + "overrides": { + "background-base": "#1F1F28", + "background-weak": "#2A2A37", + "background-strong": "#363646", + "text-base": "#DCD7BA", + "text-weak": "#727169", + "border-base": "#54546D", + "border-strong-base": "#C38D9D", + "syntax-string": "#98BB6C", + "syntax-primitive": "#D7A657", + "syntax-property": "#7E9CD8", + "syntax-type": "#C38D9D", + "syntax-constant": "#727169", + "syntax-info": "#727169", + "markdown-heading": "#957FB8", + "markdown-text": "#DCD7BA", + "markdown-link": "#7E9CD8", + "markdown-link-text": "#76946A", + "markdown-code": "#98BB6C", + "markdown-block-quote": "#727169", + "markdown-emph": "#C38D9D", + "markdown-strong": "#D7A657", + "markdown-horizontal-rule": "#727169", + "markdown-list-item": "#7E9CD8", + "markdown-list-enumeration": "#76946A", + "markdown-image": "#7E9CD8", + "markdown-image-text": "#76946A", + "markdown-code-block": "#DCD7BA", + "surface-diff-add-base": "#252E25", + "surface-diff-delete-base": "#362020" + } + } +} diff --git a/packages/ui/src/theme/themes/lucent-orng.json b/packages/ui/src/theme/themes/lucent-orng.json new file mode 100644 index 00000000000..82dc3de57a7 --- /dev/null +++ b/packages/ui/src/theme/themes/lucent-orng.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Lucent Orng", + "id": "lucent-orng", + "light": { + "seeds": { + "neutral": "#ffffff", + "primary": "#EC5B2B", + "success": "#0062d1", + "warning": "#EC5B2B", + "error": "#d1383d", + "info": "#318795", + "interactive": "#EC5B2B", + "diffAdd": "#0062d1", + "diffDelete": "#d1383d" + }, + "overrides": { + "background-base": "#ffffff", + "background-weak": "#fff5f099", + "background-strong": "#fff5f099", + "text-base": "#1a1a1a", + "text-weak": "#8a8a8a", + "border-base": "#EC5B2B", + "border-strong-base": "#c94d24", + "syntax-string": "#0062d1", + "syntax-primitive": "#EC5B2B", + "syntax-property": "#c94d24", + "syntax-type": "#b0851f", + "syntax-constant": "#8a8a8a", + "syntax-info": "#8a8a8a", + "markdown-heading": "#EC5B2B", + "markdown-text": "#1a1a1a", + "markdown-link": "#EC5B2B", + "markdown-link-text": "#318795", + "markdown-code": "#0062d1", + "markdown-block-quote": "#b0851f", + "markdown-emph": "#b0851f", + "markdown-strong": "#EC5B2B", + "markdown-horizontal-rule": "#8a8a8a", + "markdown-list-item": "#EC5B2B", + "markdown-list-enumeration": "#318795", + "markdown-image": "#EC5B2B", + "markdown-image-text": "#318795", + "markdown-code-block": "#1a1a1a", + "surface-diff-add-base": "#e0edfa", + "surface-diff-delete-base": "#f7d8db" + } + }, + "dark": { + "seeds": { + "neutral": "#0a0a0a", + "primary": "#EC5B2B", + "success": "#6ba1e6", + "warning": "#EC5B2B", + "error": "#e06c75", + "info": "#56b6c2", + "interactive": "#EC5B2B", + "diffAdd": "#6ba1e6", + "diffDelete": "#e06c75" + }, + "overrides": { + "background-base": "#0a0a0a", + "background-weak": "#2a1a1599", + "background-strong": "#2a1a1599", + "text-base": "#eeeeee", + "text-weak": "#808080", + "border-base": "#EC5B2B", + "border-strong-base": "#EE7948", + "syntax-string": "#6ba1e6", + "syntax-primitive": "#FFF7F1", + "syntax-property": "#EE7948", + "syntax-type": "#e5c07b", + "syntax-constant": "#808080", + "syntax-info": "#808080", + "markdown-heading": "#EC5B2B", + "markdown-text": "#eeeeee", + "markdown-link": "#EC5B2B", + "markdown-link-text": "#56b6c2", + "markdown-code": "#6ba1e6", + "markdown-block-quote": "#FFF7F1", + "markdown-emph": "#e5c07b", + "markdown-strong": "#EE7948", + "markdown-horizontal-rule": "#808080", + "markdown-list-item": "#EC5B2B", + "markdown-list-enumeration": "#56b6c2", + "markdown-image": "#EC5B2B", + "markdown-image-text": "#56b6c2", + "markdown-code-block": "#eeeeee", + "surface-diff-add-base": "#1a2a3d", + "surface-diff-delete-base": "#37222c" + } + } +} diff --git a/packages/ui/src/theme/themes/material.json b/packages/ui/src/theme/themes/material.json new file mode 100644 index 00000000000..55c85e6335e --- /dev/null +++ b/packages/ui/src/theme/themes/material.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Material", + "id": "material", + "light": { + "seeds": { + "neutral": "#fafafa", + "primary": "#6182b8", + "success": "#91b859", + "warning": "#ffb300", + "error": "#e53935", + "info": "#f4511e", + "interactive": "#6182b8", + "diffAdd": "#91b859", + "diffDelete": "#e53935" + }, + "overrides": { + "background-base": "#fafafa", + "background-weak": "#f5f5f5", + "background-strong": "#e7e7e8", + "text-base": "#263238", + "text-weak": "#90a4ae", + "border-base": "#e0e0e0", + "border-strong-base": "#6182b8", + "syntax-string": "#91b859", + "syntax-primitive": "#f4511e", + "syntax-property": "#6182b8", + "syntax-type": "#ffb300", + "syntax-constant": "#90a4ae", + "syntax-info": "#90a4ae", + "markdown-heading": "#6182b8", + "markdown-text": "#263238", + "markdown-link": "#39adb5", + "markdown-link-text": "#7c4dff", + "markdown-code": "#91b859", + "markdown-block-quote": "#90a4ae", + "markdown-emph": "#ffb300", + "markdown-strong": "#f4511e", + "markdown-horizontal-rule": "#e0e0e0", + "markdown-list-item": "#6182b8", + "markdown-list-enumeration": "#39adb5", + "markdown-image": "#39adb5", + "markdown-image-text": "#7c4dff", + "markdown-code-block": "#263238", + "surface-diff-add-base": "#e8f5e9", + "surface-diff-delete-base": "#ffebee" + } + }, + "dark": { + "seeds": { + "neutral": "#263238", + "primary": "#82aaff", + "success": "#c3e88d", + "warning": "#ffcb6b", + "error": "#f07178", + "info": "#ffcb6b", + "interactive": "#82aaff", + "diffAdd": "#c3e88d", + "diffDelete": "#f07178" + }, + "overrides": { + "background-base": "#263238", + "background-weak": "#1e272c", + "background-strong": "#37474f", + "text-base": "#eeffff", + "text-weak": "#546e7a", + "border-base": "#37474f", + "border-strong-base": "#82aaff", + "syntax-string": "#c3e88d", + "syntax-primitive": "#ffcb6b", + "syntax-property": "#82aaff", + "syntax-type": "#ffcb6b", + "syntax-constant": "#546e7a", + "syntax-info": "#546e7a", + "markdown-heading": "#82aaff", + "markdown-text": "#eeffff", + "markdown-link": "#89ddff", + "markdown-link-text": "#c792ea", + "markdown-code": "#c3e88d", + "markdown-block-quote": "#546e7a", + "markdown-emph": "#ffcb6b", + "markdown-strong": "#ffcb6b", + "markdown-horizontal-rule": "#37474f", + "markdown-list-item": "#82aaff", + "markdown-list-enumeration": "#89ddff", + "markdown-image": "#89ddff", + "markdown-image-text": "#c792ea", + "markdown-code-block": "#eeffff", + "surface-diff-add-base": "#2e3c2b", + "surface-diff-delete-base": "#3c2b2b" + } + } +} diff --git a/packages/ui/src/theme/themes/matrix.json b/packages/ui/src/theme/themes/matrix.json new file mode 100644 index 00000000000..155f4ddefd2 --- /dev/null +++ b/packages/ui/src/theme/themes/matrix.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Matrix", + "id": "matrix", + "light": { + "seeds": { + "neutral": "#eef3ea", + "primary": "#1cc24b", + "success": "#1cc24b", + "warning": "#e6ff57", + "error": "#ff4b4b", + "info": "#30b3ff", + "interactive": "#1cc24b", + "diffAdd": "#1cc24b", + "diffDelete": "#ff4b4b" + }, + "overrides": { + "background-base": "#eef3ea", + "background-weak": "#e4ebe1", + "background-strong": "#dae1d7", + "text-base": "#203022", + "text-weak": "#748476", + "border-base": "#748476", + "border-strong-base": "#1cc24b", + "syntax-string": "#1cc24b", + "syntax-primitive": "#ffa83d", + "syntax-property": "#30b3ff", + "syntax-type": "#e6ff57", + "syntax-constant": "#748476", + "syntax-info": "#748476", + "markdown-heading": "#24f6d9", + "markdown-text": "#203022", + "markdown-link": "#30b3ff", + "markdown-link-text": "#24f6d9", + "markdown-code": "#1cc24b", + "markdown-block-quote": "#748476", + "markdown-emph": "#ffa83d", + "markdown-strong": "#e6ff57", + "markdown-horizontal-rule": "#748476", + "markdown-list-item": "#30b3ff", + "markdown-list-enumeration": "#24f6d9", + "markdown-image": "#30b3ff", + "markdown-image-text": "#24f6d9", + "markdown-code-block": "#203022", + "surface-diff-add-base": "#e0efde", + "surface-diff-delete-base": "#f9e5e5" + } + }, + "dark": { + "seeds": { + "neutral": "#0a0e0a", + "primary": "#2eff6a", + "success": "#62ff94", + "warning": "#e6ff57", + "error": "#ff4b4b", + "info": "#30b3ff", + "interactive": "#2eff6a", + "diffAdd": "#62ff94", + "diffDelete": "#ff4b4b" + }, + "overrides": { + "background-base": "#0a0e0a", + "background-weak": "#0e130d", + "background-strong": "#141c12", + "text-base": "#62ff94", + "text-weak": "#8ca391", + "border-base": "#1e2a1b", + "border-strong-base": "#2eff6a", + "syntax-string": "#1cc24b", + "syntax-primitive": "#ffa83d", + "syntax-property": "#30b3ff", + "syntax-type": "#e6ff57", + "syntax-constant": "#8ca391", + "syntax-info": "#8ca391", + "markdown-heading": "#00efff", + "markdown-text": "#62ff94", + "markdown-link": "#30b3ff", + "markdown-link-text": "#24f6d9", + "markdown-code": "#1cc24b", + "markdown-block-quote": "#8ca391", + "markdown-emph": "#ffa83d", + "markdown-strong": "#e6ff57", + "markdown-horizontal-rule": "#8ca391", + "markdown-list-item": "#30b3ff", + "markdown-list-enumeration": "#24f6d9", + "markdown-image": "#30b3ff", + "markdown-image-text": "#24f6d9", + "markdown-code-block": "#62ff94", + "surface-diff-add-base": "#132616", + "surface-diff-delete-base": "#261212" + } + } +} diff --git a/packages/ui/src/theme/themes/mercury.json b/packages/ui/src/theme/themes/mercury.json new file mode 100644 index 00000000000..283a8748a87 --- /dev/null +++ b/packages/ui/src/theme/themes/mercury.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Mercury", + "id": "mercury", + "light": { + "seeds": { + "neutral": "#ffffff", + "primary": "#5266eb", + "success": "#188554", + "warning": "#c45000", + "error": "#d03275", + "info": "#007f95", + "interactive": "#5266eb", + "diffAdd": "#188554", + "diffDelete": "#d03275" + }, + "overrides": { + "background-base": "#ffffff", + "background-weak": "#fbfcfd", + "background-strong": "#f4f5f9", + "text-base": "#363644", + "text-weak": "#70707d", + "border-base": "#7073931a", + "border-strong-base": "#5266eb", + "syntax-string": "#188554", + "syntax-primitive": "#c45000", + "syntax-property": "#5266eb", + "syntax-type": "#007f95", + "syntax-constant": "#70707d", + "syntax-info": "#70707d", + "markdown-heading": "#1e1e2a", + "markdown-text": "#363644", + "markdown-link": "#465bd1", + "markdown-link-text": "#5266eb", + "markdown-code": "#188554", + "markdown-block-quote": "#70707d", + "markdown-emph": "#c45000", + "markdown-strong": "#1e1e2a", + "markdown-horizontal-rule": "#7073931a", + "markdown-list-item": "#1e1e2a", + "markdown-list-enumeration": "#5266eb", + "markdown-image": "#465bd1", + "markdown-image-text": "#5266eb", + "markdown-code-block": "#363644", + "surface-diff-add-base": "#1885541a", + "surface-diff-delete-base": "#d032751a" + } + }, + "dark": { + "seeds": { + "neutral": "#171721", + "primary": "#8da4f5", + "success": "#77c599", + "warning": "#fc9b6f", + "error": "#fc92b4", + "info": "#77becf", + "interactive": "#8da4f5", + "diffAdd": "#77c599", + "diffDelete": "#fc92b4" + }, + "overrides": { + "background-base": "#171721", + "background-weak": "#10101a", + "background-strong": "#272735", + "text-base": "#dddde5", + "text-weak": "#9d9da8", + "border-base": "#b4b7c81f", + "border-strong-base": "#8da4f5", + "syntax-string": "#77c599", + "syntax-primitive": "#fc9b6f", + "syntax-property": "#8da4f5", + "syntax-type": "#77becf", + "syntax-constant": "#9d9da8", + "syntax-info": "#9d9da8", + "markdown-heading": "#ffffff", + "markdown-text": "#dddde5", + "markdown-link": "#8da4f5", + "markdown-link-text": "#a7b6f8", + "markdown-code": "#77c599", + "markdown-block-quote": "#9d9da8", + "markdown-emph": "#fc9b6f", + "markdown-strong": "#f4f5f9", + "markdown-horizontal-rule": "#b4b7c81f", + "markdown-list-item": "#ffffff", + "markdown-list-enumeration": "#8da4f5", + "markdown-image": "#8da4f5", + "markdown-image-text": "#a7b6f8", + "markdown-code-block": "#dddde5", + "surface-diff-add-base": "#77c59933", + "surface-diff-delete-base": "#fc92b433" + } + } +} diff --git a/packages/ui/src/theme/themes/one-dark.json b/packages/ui/src/theme/themes/one-dark.json new file mode 100644 index 00000000000..edd81f3b370 --- /dev/null +++ b/packages/ui/src/theme/themes/one-dark.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "One Dark", + "id": "one-dark", + "light": { + "seeds": { + "neutral": "#fafafa", + "primary": "#4078f2", + "success": "#50a14f", + "warning": "#c18401", + "error": "#e45649", + "info": "#986801", + "interactive": "#4078f2", + "diffAdd": "#50a14f", + "diffDelete": "#e45649" + }, + "overrides": { + "background-base": "#fafafa", + "background-weak": "#f0f0f1", + "background-strong": "#eaeaeb", + "text-base": "#383a42", + "text-weak": "#a0a1a7", + "border-base": "#d1d1d2", + "border-strong-base": "#4078f2", + "syntax-string": "#50a14f", + "syntax-primitive": "#986801", + "syntax-property": "#4078f2", + "syntax-type": "#c18401", + "syntax-constant": "#a0a1a7", + "syntax-info": "#a0a1a7", + "markdown-heading": "#a626a4", + "markdown-text": "#383a42", + "markdown-link": "#4078f2", + "markdown-link-text": "#0184bc", + "markdown-code": "#50a14f", + "markdown-block-quote": "#a0a1a7", + "markdown-emph": "#c18401", + "markdown-strong": "#986801", + "markdown-horizontal-rule": "#a0a1a7", + "markdown-list-item": "#4078f2", + "markdown-list-enumeration": "#0184bc", + "markdown-image": "#4078f2", + "markdown-image-text": "#0184bc", + "markdown-code-block": "#383a42", + "surface-diff-add-base": "#eafbe9", + "surface-diff-delete-base": "#fce9e8" + } + }, + "dark": { + "seeds": { + "neutral": "#282c34", + "primary": "#61afef", + "success": "#98c379", + "warning": "#e5c07b", + "error": "#e06c75", + "info": "#d19a66", + "interactive": "#61afef", + "diffAdd": "#98c379", + "diffDelete": "#e06c75" + }, + "overrides": { + "background-base": "#282c34", + "background-weak": "#21252b", + "background-strong": "#353b45", + "text-base": "#abb2bf", + "text-weak": "#5c6370", + "border-base": "#393f4a", + "border-strong-base": "#61afef", + "syntax-string": "#98c379", + "syntax-primitive": "#d19a66", + "syntax-property": "#61afef", + "syntax-type": "#e5c07b", + "syntax-constant": "#5c6370", + "syntax-info": "#5c6370", + "markdown-heading": "#c678dd", + "markdown-text": "#abb2bf", + "markdown-link": "#61afef", + "markdown-link-text": "#56b6c2", + "markdown-code": "#98c379", + "markdown-block-quote": "#5c6370", + "markdown-emph": "#e5c07b", + "markdown-strong": "#d19a66", + "markdown-horizontal-rule": "#5c6370", + "markdown-list-item": "#61afef", + "markdown-list-enumeration": "#56b6c2", + "markdown-image": "#61afef", + "markdown-image-text": "#56b6c2", + "markdown-code-block": "#abb2bf", + "surface-diff-add-base": "#2c382b", + "surface-diff-delete-base": "#3a2d2f" + } + } +} diff --git a/packages/ui/src/theme/themes/orng.json b/packages/ui/src/theme/themes/orng.json new file mode 100644 index 00000000000..0340f14b607 --- /dev/null +++ b/packages/ui/src/theme/themes/orng.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Orng", + "id": "orng", + "light": { + "seeds": { + "neutral": "#ffffff", + "primary": "#EC5B2B", + "success": "#0062d1", + "warning": "#EC5B2B", + "error": "#d1383d", + "info": "#318795", + "interactive": "#EC5B2B", + "diffAdd": "#0062d1", + "diffDelete": "#d1383d" + }, + "overrides": { + "background-base": "#ffffff", + "background-weak": "#FFF7F1", + "background-strong": "#f5f0eb", + "text-base": "#1a1a1a", + "text-weak": "#8a8a8a", + "border-base": "#EC5B2B", + "border-strong-base": "#c94d24", + "syntax-string": "#0062d1", + "syntax-primitive": "#EC5B2B", + "syntax-property": "#c94d24", + "syntax-type": "#b0851f", + "syntax-constant": "#8a8a8a", + "syntax-info": "#8a8a8a", + "markdown-heading": "#EC5B2B", + "markdown-text": "#1a1a1a", + "markdown-link": "#EC5B2B", + "markdown-link-text": "#318795", + "markdown-code": "#0062d1", + "markdown-block-quote": "#b0851f", + "markdown-emph": "#b0851f", + "markdown-strong": "#EC5B2B", + "markdown-horizontal-rule": "#8a8a8a", + "markdown-list-item": "#EC5B2B", + "markdown-list-enumeration": "#318795", + "markdown-image": "#EC5B2B", + "markdown-image-text": "#318795", + "markdown-code-block": "#1a1a1a", + "surface-diff-add-base": "#e0edfa", + "surface-diff-delete-base": "#f7d8db" + } + }, + "dark": { + "seeds": { + "neutral": "#0a0a0a", + "primary": "#EC5B2B", + "success": "#6ba1e6", + "warning": "#EC5B2B", + "error": "#e06c75", + "info": "#56b6c2", + "interactive": "#EC5B2B", + "diffAdd": "#6ba1e6", + "diffDelete": "#e06c75" + }, + "overrides": { + "background-base": "#0a0a0a", + "background-weak": "#141414", + "background-strong": "#1e1e1e", + "text-base": "#eeeeee", + "text-weak": "#808080", + "border-base": "#EC5B2B", + "border-strong-base": "#EE7948", + "syntax-string": "#6ba1e6", + "syntax-primitive": "#FFF7F1", + "syntax-property": "#EE7948", + "syntax-type": "#e5c07b", + "syntax-constant": "#808080", + "syntax-info": "#808080", + "markdown-heading": "#EC5B2B", + "markdown-text": "#eeeeee", + "markdown-link": "#EC5B2B", + "markdown-link-text": "#56b6c2", + "markdown-code": "#6ba1e6", + "markdown-block-quote": "#FFF7F1", + "markdown-emph": "#e5c07b", + "markdown-strong": "#EE7948", + "markdown-horizontal-rule": "#808080", + "markdown-list-item": "#EC5B2B", + "markdown-list-enumeration": "#56b6c2", + "markdown-image": "#EC5B2B", + "markdown-image-text": "#56b6c2", + "markdown-code-block": "#eeeeee", + "surface-diff-add-base": "#1a2a3d", + "surface-diff-delete-base": "#37222c" + } + } +} diff --git a/packages/ui/src/theme/themes/osaka-jade.json b/packages/ui/src/theme/themes/osaka-jade.json new file mode 100644 index 00000000000..28604b3407e --- /dev/null +++ b/packages/ui/src/theme/themes/osaka-jade.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Osaka Jade", + "id": "osaka-jade", + "light": { + "seeds": { + "neutral": "#F6F5DD", + "primary": "#1faa90", + "success": "#3d7a52", + "warning": "#b5a020", + "error": "#c7392d", + "info": "#1faa90", + "interactive": "#1faa90", + "diffAdd": "#3d7a52", + "diffDelete": "#c7392d" + }, + "overrides": { + "background-base": "#F6F5DD", + "background-weak": "#E8E7CC", + "background-strong": "#D5D4B8", + "text-base": "#111c18", + "text-weak": "#53685B", + "border-base": "#A8A78C", + "border-strong-base": "#1faa90", + "syntax-string": "#3d7a52", + "syntax-primitive": "#a8527a", + "syntax-property": "#3d7560", + "syntax-type": "#3d7a52", + "syntax-constant": "#53685B", + "syntax-info": "#53685B", + "markdown-heading": "#1faa90", + "markdown-text": "#111c18", + "markdown-link": "#8CD3CB", + "markdown-link-text": "#3d7a52", + "markdown-code": "#63b07a", + "markdown-block-quote": "#53685B", + "markdown-emph": "#a8527a", + "markdown-strong": "#111c18", + "markdown-horizontal-rule": "#53685B", + "markdown-list-item": "#1faa90", + "markdown-list-enumeration": "#1faa90", + "markdown-image": "#8CD3CB", + "markdown-image-text": "#3d7a52", + "markdown-code-block": "#111c18", + "surface-diff-add-base": "#e0eee5", + "surface-diff-delete-base": "#eee0e0" + } + }, + "dark": { + "seeds": { + "neutral": "#111c18", + "primary": "#2DD5B7", + "success": "#549e6a", + "warning": "#E5C736", + "error": "#FF5345", + "info": "#2DD5B7", + "interactive": "#2DD5B7", + "diffAdd": "#549e6a", + "diffDelete": "#FF5345" + }, + "overrides": { + "background-base": "#111c18", + "background-weak": "#1a2520", + "background-strong": "#23372B", + "text-base": "#C1C497", + "text-weak": "#53685B", + "border-base": "#3d4a44", + "border-strong-base": "#2DD5B7", + "syntax-string": "#63b07a", + "syntax-primitive": "#D2689C", + "syntax-property": "#509475", + "syntax-type": "#549e6a", + "syntax-constant": "#53685B", + "syntax-info": "#53685B", + "markdown-heading": "#2DD5B7", + "markdown-text": "#C1C497", + "markdown-link": "#8CD3CB", + "markdown-link-text": "#549e6a", + "markdown-code": "#63b07a", + "markdown-block-quote": "#53685B", + "markdown-emph": "#D2689C", + "markdown-strong": "#C1C497", + "markdown-horizontal-rule": "#53685B", + "markdown-list-item": "#2DD5B7", + "markdown-list-enumeration": "#8CD3CB", + "markdown-image": "#8CD3CB", + "markdown-image-text": "#549e6a", + "markdown-code-block": "#C1C497", + "surface-diff-add-base": "#15241c", + "surface-diff-delete-base": "#241515" + } + } +} diff --git a/packages/ui/src/theme/themes/palenight.json b/packages/ui/src/theme/themes/palenight.json new file mode 100644 index 00000000000..e1147e8d2f1 --- /dev/null +++ b/packages/ui/src/theme/themes/palenight.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Palenight", + "id": "palenight", + "light": { + "seeds": { + "neutral": "#fafafa", + "primary": "#4976eb", + "success": "#91b859", + "warning": "#ffb300", + "error": "#e53935", + "info": "#00acc1", + "interactive": "#4976eb", + "diffAdd": "#91b859", + "diffDelete": "#e53935" + }, + "overrides": { + "background-base": "#fafafa", + "background-weak": "#f5f5f5", + "background-strong": "#e7e7e8", + "text-base": "#292d3e", + "text-weak": "#8796b0", + "border-base": "#e0e0e0", + "border-strong-base": "#4976eb", + "syntax-string": "#91b859", + "syntax-primitive": "#f4511e", + "syntax-property": "#4976eb", + "syntax-type": "#ffb300", + "syntax-constant": "#8796b0", + "syntax-info": "#8796b0", + "markdown-heading": "#a854f2", + "markdown-text": "#292d3e", + "markdown-link": "#4976eb", + "markdown-link-text": "#00acc1", + "markdown-code": "#91b859", + "markdown-block-quote": "#8796b0", + "markdown-emph": "#ffb300", + "markdown-strong": "#f4511e", + "markdown-horizontal-rule": "#8796b0", + "markdown-list-item": "#4976eb", + "markdown-list-enumeration": "#00acc1", + "markdown-image": "#4976eb", + "markdown-image-text": "#00acc1", + "markdown-code-block": "#292d3e", + "surface-diff-add-base": "#e8f5e9", + "surface-diff-delete-base": "#ffebee" + } + }, + "dark": { + "seeds": { + "neutral": "#292d3e", + "primary": "#82aaff", + "success": "#c3e88d", + "warning": "#ffcb6b", + "error": "#f07178", + "info": "#89ddff", + "interactive": "#82aaff", + "diffAdd": "#c3e88d", + "diffDelete": "#f07178" + }, + "overrides": { + "background-base": "#292d3e", + "background-weak": "#1e2132", + "background-strong": "#32364a", + "text-base": "#a6accd", + "text-weak": "#676e95", + "border-base": "#32364a", + "border-strong-base": "#82aaff", + "syntax-string": "#c3e88d", + "syntax-primitive": "#f78c6c", + "syntax-property": "#82aaff", + "syntax-type": "#ffcb6b", + "syntax-constant": "#676e95", + "syntax-info": "#676e95", + "markdown-heading": "#c792ea", + "markdown-text": "#a6accd", + "markdown-link": "#82aaff", + "markdown-link-text": "#89ddff", + "markdown-code": "#c3e88d", + "markdown-block-quote": "#676e95", + "markdown-emph": "#ffcb6b", + "markdown-strong": "#f78c6c", + "markdown-horizontal-rule": "#676e95", + "markdown-list-item": "#82aaff", + "markdown-list-enumeration": "#89ddff", + "markdown-image": "#82aaff", + "markdown-image-text": "#89ddff", + "markdown-code-block": "#a6accd", + "surface-diff-add-base": "#2e3c2b", + "surface-diff-delete-base": "#3c2b2b" + } + } +} diff --git a/packages/ui/src/theme/themes/rosepine.json b/packages/ui/src/theme/themes/rosepine.json new file mode 100644 index 00000000000..cfa7e04cc3b --- /dev/null +++ b/packages/ui/src/theme/themes/rosepine.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Rosepine", + "id": "rosepine", + "light": { + "seeds": { + "neutral": "#faf4ed", + "primary": "#31748f", + "success": "#286983", + "warning": "#ea9d34", + "error": "#b4637a", + "info": "#56949f", + "interactive": "#31748f", + "diffAdd": "#286983", + "diffDelete": "#b4637a" + }, + "overrides": { + "background-base": "#faf4ed", + "background-weak": "#fffaf3", + "background-strong": "#f2e9e1", + "text-base": "#575279", + "text-weak": "#9893a5", + "border-base": "#dfdad9", + "border-strong-base": "#31748f", + "syntax-string": "#ea9d34", + "syntax-primitive": "#907aa9", + "syntax-property": "#d7827e", + "syntax-type": "#56949f", + "syntax-constant": "#9893a5", + "syntax-info": "#9893a5", + "markdown-heading": "#907aa9", + "markdown-text": "#575279", + "markdown-link": "#31748f", + "markdown-link-text": "#d7827e", + "markdown-code": "#286983", + "markdown-block-quote": "#9893a5", + "markdown-emph": "#ea9d34", + "markdown-strong": "#b4637a", + "markdown-horizontal-rule": "#dfdad9", + "markdown-list-item": "#31748f", + "markdown-list-enumeration": "#d7827e", + "markdown-image": "#31748f", + "markdown-image-text": "#d7827e", + "markdown-code-block": "#575279", + "surface-diff-add-base": "#e5f2f3", + "surface-diff-delete-base": "#fce5e8" + } + }, + "dark": { + "seeds": { + "neutral": "#191724", + "primary": "#9ccfd8", + "success": "#31748f", + "warning": "#f6c177", + "error": "#eb6f92", + "info": "#9ccfd8", + "interactive": "#9ccfd8", + "diffAdd": "#31748f", + "diffDelete": "#eb6f92" + }, + "overrides": { + "background-base": "#191724", + "background-weak": "#1f1d2e", + "background-strong": "#26233a", + "text-base": "#e0def4", + "text-weak": "#6e6a86", + "border-base": "#403d52", + "border-strong-base": "#9ccfd8", + "syntax-string": "#f6c177", + "syntax-primitive": "#c4a7e7", + "syntax-property": "#ebbcba", + "syntax-type": "#9ccfd8", + "syntax-constant": "#6e6a86", + "syntax-info": "#6e6a86", + "markdown-heading": "#c4a7e7", + "markdown-text": "#e0def4", + "markdown-link": "#9ccfd8", + "markdown-link-text": "#ebbcba", + "markdown-code": "#31748f", + "markdown-block-quote": "#6e6a86", + "markdown-emph": "#f6c177", + "markdown-strong": "#eb6f92", + "markdown-horizontal-rule": "#403d52", + "markdown-list-item": "#9ccfd8", + "markdown-list-enumeration": "#ebbcba", + "markdown-image": "#9ccfd8", + "markdown-image-text": "#ebbcba", + "markdown-code-block": "#e0def4", + "surface-diff-add-base": "#1f2d3a", + "surface-diff-delete-base": "#3a1f2d" + } + } +} diff --git a/packages/ui/src/theme/themes/synthwave84.json b/packages/ui/src/theme/themes/synthwave84.json new file mode 100644 index 00000000000..97876604933 --- /dev/null +++ b/packages/ui/src/theme/themes/synthwave84.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Synthwave84", + "id": "synthwave84", + "light": { + "seeds": { + "neutral": "#fafafa", + "primary": "#00bcd4", + "success": "#4caf50", + "warning": "#ff9800", + "error": "#f44336", + "info": "#ff5722", + "interactive": "#00bcd4", + "diffAdd": "#4caf50", + "diffDelete": "#f44336" + }, + "overrides": { + "background-base": "#fafafa", + "background-weak": "#f5f5f5", + "background-strong": "#eeeeee", + "text-base": "#262335", + "text-weak": "#5c5c8a", + "border-base": "#e0e0e0", + "border-strong-base": "#00bcd4", + "syntax-string": "#ff9800", + "syntax-primitive": "#9c27b0", + "syntax-property": "#ff5722", + "syntax-type": "#00bcd4", + "syntax-constant": "#5c5c8a", + "syntax-info": "#5c5c8a", + "markdown-heading": "#e91e63", + "markdown-text": "#262335", + "markdown-link": "#00bcd4", + "markdown-link-text": "#9c27b0", + "markdown-code": "#4caf50", + "markdown-block-quote": "#5c5c8a", + "markdown-emph": "#ff9800", + "markdown-strong": "#ff5722", + "markdown-horizontal-rule": "#e0e0e0", + "markdown-list-item": "#00bcd4", + "markdown-list-enumeration": "#9c27b0", + "markdown-image": "#00bcd4", + "markdown-image-text": "#9c27b0", + "markdown-code-block": "#262335", + "surface-diff-add-base": "#e8f5e9", + "surface-diff-delete-base": "#ffebee" + } + }, + "dark": { + "seeds": { + "neutral": "#262335", + "primary": "#36f9f6", + "success": "#72f1b8", + "warning": "#fede5d", + "error": "#fe4450", + "info": "#ff8b39", + "interactive": "#36f9f6", + "diffAdd": "#72f1b8", + "diffDelete": "#fe4450" + }, + "overrides": { + "background-base": "#262335", + "background-weak": "#1e1a29", + "background-strong": "#2a2139", + "text-base": "#ffffff", + "text-weak": "#848bbd", + "border-base": "#495495", + "border-strong-base": "#36f9f6", + "syntax-string": "#fede5d", + "syntax-primitive": "#b084eb", + "syntax-property": "#ff8b39", + "syntax-type": "#36f9f6", + "syntax-constant": "#848bbd", + "syntax-info": "#848bbd", + "markdown-heading": "#ff7edb", + "markdown-text": "#ffffff", + "markdown-link": "#36f9f6", + "markdown-link-text": "#b084eb", + "markdown-code": "#72f1b8", + "markdown-block-quote": "#848bbd", + "markdown-emph": "#fede5d", + "markdown-strong": "#ff8b39", + "markdown-horizontal-rule": "#495495", + "markdown-list-item": "#36f9f6", + "markdown-list-enumeration": "#b084eb", + "markdown-image": "#36f9f6", + "markdown-image-text": "#b084eb", + "markdown-code-block": "#ffffff", + "surface-diff-add-base": "#1a3a2a", + "surface-diff-delete-base": "#3a1a2a" + } + } +} diff --git a/packages/ui/src/theme/themes/vercel.json b/packages/ui/src/theme/themes/vercel.json new file mode 100644 index 00000000000..484c74a8401 --- /dev/null +++ b/packages/ui/src/theme/themes/vercel.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Vercel", + "id": "vercel", + "light": { + "seeds": { + "neutral": "#FFFFFF", + "primary": "#0070F3", + "success": "#388E3C", + "warning": "#FF9500", + "error": "#DC3545", + "info": "#0070F3", + "interactive": "#0070F3", + "diffAdd": "#388E3C", + "diffDelete": "#DC3545" + }, + "overrides": { + "background-base": "#FFFFFF", + "background-weak": "#FAFAFA", + "background-strong": "#EAEAEA", + "text-base": "#171717", + "text-weak": "#666666", + "border-base": "#EAEAEA", + "border-strong-base": "#999999", + "syntax-string": "#388E3C", + "syntax-primitive": "#FFB224", + "syntax-property": "#8E4EC6", + "syntax-type": "#12A594", + "syntax-constant": "#666666", + "syntax-info": "#666666", + "markdown-heading": "#8E4EC6", + "markdown-text": "#171717", + "markdown-link": "#0070F3", + "markdown-link-text": "#12A594", + "markdown-code": "#388E3C", + "markdown-block-quote": "#666666", + "markdown-emph": "#FFB224", + "markdown-strong": "#E93D82", + "markdown-horizontal-rule": "#999999", + "markdown-list-item": "#171717", + "markdown-list-enumeration": "#0070F3", + "markdown-image": "#12A594", + "markdown-image-text": "#12A594", + "markdown-code-block": "#171717", + "surface-diff-add-base": "#E6F9E9", + "surface-diff-delete-base": "#FDECED" + } + }, + "dark": { + "seeds": { + "neutral": "#000000", + "primary": "#0070F3", + "success": "#46A758", + "warning": "#FFB224", + "error": "#E5484D", + "info": "#52A8FF", + "interactive": "#0070F3", + "diffAdd": "#46A758", + "diffDelete": "#E5484D" + }, + "overrides": { + "background-base": "#000000", + "background-weak": "#1A1A1A", + "background-strong": "#292929", + "text-base": "#EDEDED", + "text-weak": "#878787", + "border-base": "#1F1F1F", + "border-strong-base": "#454545", + "syntax-string": "#46A758", + "syntax-primitive": "#FFB224", + "syntax-property": "#BF7AF0", + "syntax-type": "#0AC7AC", + "syntax-constant": "#878787", + "syntax-info": "#878787", + "markdown-heading": "#BF7AF0", + "markdown-text": "#EDEDED", + "markdown-link": "#0070F3", + "markdown-link-text": "#12A594", + "markdown-code": "#46A758", + "markdown-block-quote": "#878787", + "markdown-emph": "#F2A700", + "markdown-strong": "#F75590", + "markdown-horizontal-rule": "#454545", + "markdown-list-item": "#EDEDED", + "markdown-list-enumeration": "#0070F3", + "markdown-image": "#0AC7AC", + "markdown-image-text": "#50E3C2", + "markdown-code-block": "#EDEDED", + "surface-diff-add-base": "#0B1D0F", + "surface-diff-delete-base": "#2A1314" + } + } +} diff --git a/packages/ui/src/theme/themes/zenburn.json b/packages/ui/src/theme/themes/zenburn.json new file mode 100644 index 00000000000..e1f672e40ff --- /dev/null +++ b/packages/ui/src/theme/themes/zenburn.json @@ -0,0 +1,93 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Zenburn", + "id": "zenburn", + "light": { + "seeds": { + "neutral": "#ffffef", + "primary": "#5f7f8f", + "success": "#5f8f5f", + "warning": "#8f8f5f", + "error": "#8f5f5f", + "info": "#8f7f5f", + "interactive": "#5f7f8f", + "diffAdd": "#5f8f5f", + "diffDelete": "#8f5f5f" + }, + "overrides": { + "background-base": "#ffffef", + "background-weak": "#f5f5e5", + "background-strong": "#ebebdb", + "text-base": "#3f3f3f", + "text-weak": "#6f6f6f", + "border-base": "#d0d0c0", + "border-strong-base": "#5f7f8f", + "syntax-string": "#8f5f5f", + "syntax-primitive": "#5f8f5f", + "syntax-property": "#5f7f8f", + "syntax-type": "#5f8f8f", + "syntax-constant": "#6f6f6f", + "syntax-info": "#6f6f6f", + "markdown-heading": "#8f8f5f", + "markdown-text": "#3f3f3f", + "markdown-link": "#5f7f8f", + "markdown-link-text": "#5f8f8f", + "markdown-code": "#5f8f5f", + "markdown-block-quote": "#6f6f6f", + "markdown-emph": "#8f8f5f", + "markdown-strong": "#8f7f5f", + "markdown-horizontal-rule": "#6f6f6f", + "markdown-list-item": "#5f7f8f", + "markdown-list-enumeration": "#5f8f8f", + "markdown-image": "#5f7f8f", + "markdown-image-text": "#5f8f8f", + "markdown-code-block": "#3f3f3f", + "surface-diff-add-base": "#efffef", + "surface-diff-delete-base": "#ffefef" + } + }, + "dark": { + "seeds": { + "neutral": "#3f3f3f", + "primary": "#8cd0d3", + "success": "#7f9f7f", + "warning": "#f0dfaf", + "error": "#cc9393", + "info": "#dfaf8f", + "interactive": "#8cd0d3", + "diffAdd": "#7f9f7f", + "diffDelete": "#cc9393" + }, + "overrides": { + "background-base": "#3f3f3f", + "background-weak": "#4f4f4f", + "background-strong": "#5f5f5f", + "text-base": "#dcdccc", + "text-weak": "#9f9f9f", + "border-base": "#5f5f5f", + "border-strong-base": "#8cd0d3", + "syntax-string": "#cc9393", + "syntax-primitive": "#8fb28f", + "syntax-property": "#8cd0d3", + "syntax-type": "#93e0e3", + "syntax-constant": "#9f9f9f", + "syntax-info": "#9f9f9f", + "markdown-heading": "#f0dfaf", + "markdown-text": "#dcdccc", + "markdown-link": "#8cd0d3", + "markdown-link-text": "#93e0e3", + "markdown-code": "#7f9f7f", + "markdown-block-quote": "#9f9f9f", + "markdown-emph": "#e0cf9f", + "markdown-strong": "#dfaf8f", + "markdown-horizontal-rule": "#9f9f9f", + "markdown-list-item": "#8cd0d3", + "markdown-list-enumeration": "#93e0e3", + "markdown-image": "#8cd0d3", + "markdown-image-text": "#93e0e3", + "markdown-code-block": "#dcdccc", + "surface-diff-add-base": "#4f5f4f", + "surface-diff-delete-base": "#5f4f4f" + } + } +} diff --git a/script/convert-tui-themes.ts b/script/convert-tui-themes.ts new file mode 100644 index 00000000000..36691f7e3f6 --- /dev/null +++ b/script/convert-tui-themes.ts @@ -0,0 +1,280 @@ +import { readFileSync, writeFileSync } from "fs" +import { join } from "path" + +// Get root directory - script is in script/ folder +const rootDir = process.cwd() + +type HexColor = `#${string}` +type RefName = string +type Variant = { + dark: HexColor | RefName + light: HexColor | RefName +} +type ColorValue = HexColor | RefName | Variant + +type TuiThemeJson = { + $schema?: string + defs?: Record + theme: Record +} + +type DesktopTheme = { + $schema: string + name: string + id: string + light: { + seeds: { + neutral: HexColor + primary: HexColor + success: HexColor + warning: HexColor + error: HexColor + info: HexColor + interactive: HexColor + diffAdd: HexColor + diffDelete: HexColor + } + overrides: Record + } + dark: { + seeds: { + neutral: HexColor + primary: HexColor + success: HexColor + warning: HexColor + error: HexColor + info: HexColor + interactive: HexColor + diffAdd: HexColor + diffDelete: HexColor + } + overrides: Record + } +} + +function resolveColor( + c: ColorValue, + defs: Record, + theme: Record, + mode: "dark" | "light", +): HexColor { + if (typeof c === "string") { + if (c === "transparent" || c === "none") { + return mode === "dark" ? "#000000" : "#ffffff" + } + if (c.startsWith("#")) { + return c as HexColor + } + // Reference to defs + if (defs[c] != null) { + const defValue = defs[c] + if (typeof defValue === "string" && defValue.startsWith("#")) { + return defValue as HexColor + } + if (typeof defValue === "string") { + return resolveColor(defValue, defs, theme, mode) + } + } + // Reference to theme property + if (theme[c] !== undefined) { + return resolveColor(theme[c], defs, theme, mode) + } + throw new Error(`Color reference "${c}" not found`) + } + // Variant object + return resolveColor(c[mode], defs, theme, mode) +} + +function convertTuiThemeToDesktop( + tuiTheme: TuiThemeJson, + themeId: string, + themeName: string, +): DesktopTheme { + const defs = tuiTheme.defs ?? {} + + // Resolve colors for both modes + const resolveForMode = (mode: "dark" | "light") => { + const resolved: Record = {} + for (const [key, value] of Object.entries(tuiTheme.theme)) { + if (key === "selectedListItemText" || key === "backgroundMenu" || key === "thinkingOpacity") { + continue + } + try { + resolved[key] = resolveColor(value, defs, tuiTheme.theme, mode) + } catch (e) { + console.warn(`Failed to resolve ${key} for ${mode}: ${e}`) + resolved[key] = mode === "dark" ? "#ffffff" : "#000000" + } + } + return resolved + } + + const darkColors = resolveForMode("dark") + const lightColors = resolveForMode("light") + + const darkSeeds = { + neutral: darkColors.background || "#1a1a1a", + primary: darkColors.primary || "#007acc", + success: darkColors.success || "#4ec9b0", + warning: darkColors.warning || "#dcdcaa", + error: darkColors.error || "#f48771", + info: darkColors.info || "#4ec9b0", + interactive: darkColors.primary || "#007acc", + diffAdd: darkColors.diffAdded || "#4ec9b0", + diffDelete: darkColors.diffRemoved || "#f48771", + } + + const lightSeeds = { + neutral: lightColors.background || "#ffffff", + primary: lightColors.primary || "#0066cc", + success: lightColors.success || "#4caf50", + warning: lightColors.warning || "#ff9800", + error: lightColors.error || "#e91e63", + info: lightColors.info || "#00acc1", + interactive: lightColors.primary || "#0066cc", + diffAdd: lightColors.diffAdded || "#4caf50", + diffDelete: lightColors.diffRemoved || "#e91e63", + } + + // Map syntax and markdown colors to overrides + const mapOverrides = (colors: Record, mode: "dark" | "light") => { + const overrides: Record = {} + + // Background colors + if (colors.background) overrides["background-base"] = colors.background + if (colors.backgroundPanel) overrides["background-weak"] = colors.backgroundPanel + if (colors.backgroundElement) overrides["background-strong"] = colors.backgroundElement + + // Text colors + if (colors.text) overrides["text-base"] = colors.text + if (colors.textMuted) overrides["text-weak"] = colors.textMuted + + // Border colors + if (colors.border) overrides["border-base"] = colors.border + if (colors.borderActive) overrides["border-strong-base"] = colors.borderActive + + // Syntax colors + if (colors.syntaxString) overrides["syntax-string"] = colors.syntaxString + if (colors.syntaxNumber) overrides["syntax-primitive"] = colors.syntaxNumber + if (colors.syntaxFunction) overrides["syntax-property"] = colors.syntaxFunction + if (colors.syntaxType) overrides["syntax-type"] = colors.syntaxType + if (colors.syntaxComment) overrides["syntax-constant"] = colors.syntaxComment + if (colors.syntaxComment) overrides["syntax-info"] = colors.syntaxComment + + // Markdown colors + if (colors.markdownHeading) overrides["markdown-heading"] = colors.markdownHeading + if (colors.markdownText) overrides["markdown-text"] = colors.markdownText + if (colors.markdownLink) overrides["markdown-link"] = colors.markdownLink + if (colors.markdownLinkText) overrides["markdown-link-text"] = colors.markdownLinkText + if (colors.markdownCode) overrides["markdown-code"] = colors.markdownCode + if (colors.markdownBlockQuote) overrides["markdown-block-quote"] = colors.markdownBlockQuote + if (colors.markdownEmph) overrides["markdown-emph"] = colors.markdownEmph + if (colors.markdownStrong) overrides["markdown-strong"] = colors.markdownStrong + if (colors.markdownHorizontalRule) overrides["markdown-horizontal-rule"] = colors.markdownHorizontalRule + if (colors.markdownListItem) overrides["markdown-list-item"] = colors.markdownListItem + if (colors.markdownListEnumeration) overrides["markdown-list-enumeration"] = colors.markdownListEnumeration + if (colors.markdownImage) overrides["markdown-image"] = colors.markdownImage + if (colors.markdownImageText) overrides["markdown-image-text"] = colors.markdownImageText + if (colors.markdownCodeBlock) overrides["markdown-code-block"] = colors.markdownCodeBlock + + // Diff colors + if (colors.diffAddedBg) overrides["surface-diff-add-base"] = colors.diffAddedBg + if (colors.diffRemovedBg) overrides["surface-diff-delete-base"] = colors.diffRemovedBg + + return overrides + } + + return { + $schema: "https://opencode.ai/desktop-theme.json", + name: themeName, + id: themeId, + light: { + seeds: lightSeeds, + overrides: mapOverrides(lightColors, "light"), + }, + dark: { + seeds: darkSeeds, + overrides: mapOverrides(darkColors, "dark"), + }, + } +} + +function toTitleCase(str: string): string { + return str + .split(/[-_]/) + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" ") +} + +function main() { + const tuiThemeDir = join(rootDir, "packages/opencode/src/cli/cmd/tui/context/theme") + const desktopThemeDir = join(rootDir, "packages/ui/src/theme/themes") + + // Themes that already exist in desktop (skip these) + const existingThemes = new Set([ + "aura", + "ayu", + "carbonfox", + "catppuccin", + "dracula", + "gruvbox", + "monokai", + "nightowl", + "nord", + "solarized", + "tokyonight", + "vesper", + "onedarkpro", // Note: TUI has "one-dark" but desktop has "onedarkpro" + ]) + + // Themes to convert (all TUI themes minus existing ones) + const themesToConvert = [ + "cobalt2", + "cursor", + "everforest", + "flexoki", + "github", + "kanagawa", + "lucent-orng", + "material", + "matrix", + "mercury", + "one-dark", + "orng", + "osaka-jade", + "palenight", + "rosepine", + "synthwave84", + "vercel", + "zenburn", + "catppuccin-frappe", + "catppuccin-macchiato", + ] + + console.log(`Converting ${themesToConvert.length} themes...`) + + for (const themeFile of themesToConvert) { + try { + const tuiThemePath = join(tuiThemeDir, `${themeFile}.json`) + const tuiThemeContent = readFileSync(tuiThemePath, "utf-8") + const tuiTheme: TuiThemeJson = JSON.parse(tuiThemeContent) + + // Generate theme name and ID + const themeId = themeFile === "one-dark" ? "one-dark" : themeFile + const themeName = toTitleCase(themeFile.replace(/-/g, " ")) + + const desktopTheme = convertTuiThemeToDesktop(tuiTheme, themeId, themeName) + + const desktopThemePath = join(desktopThemeDir, `${themeId}.json`) + writeFileSync(desktopThemePath, JSON.stringify(desktopTheme, null, 2) + "\n", "utf-8") + + console.log(`✓ Converted ${themeFile} -> ${themeId}.json`) + } catch (error) { + console.error(`✗ Failed to convert ${themeFile}:`, error) + } + } + + console.log("\nConversion complete!") +} + +main()