diff options
| author | Adam <[email protected]> | 2025-10-24 16:04:44 -0500 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-10-24 16:04:44 -0500 |
| commit | fea6a357bc1a25a05d3bcbbeb7bacf6286d4a7de (patch) | |
| tree | 42e35c2303260805006ccff5460f287c83500c3d /packages/desktop/src/components | |
| parent | 6b821532634e9821f7a7ded1629954a814d5db82 (diff) | |
| download | opencode-fea6a357bc1a25a05d3bcbbeb7bacf6286d4a7de.tar.gz opencode-fea6a357bc1a25a05d3bcbbeb7bacf6286d4a7de.zip | |
wip: desktop work
Diffstat (limited to 'packages/desktop/src/components')
| -rw-r--r-- | packages/desktop/src/components/diff.tsx | 13 | ||||
| -rw-r--r-- | packages/desktop/src/components/theme.json | 558 |
2 files changed, 569 insertions, 2 deletions
diff --git a/packages/desktop/src/components/diff.tsx b/packages/desktop/src/components/diff.tsx index 0facaba47..d8457b528 100644 --- a/packages/desktop/src/components/diff.tsx +++ b/packages/desktop/src/components/diff.tsx @@ -1,4 +1,10 @@ -import { type FileContents, FileDiff, type DiffLineAnnotation, DiffFileRendererOptions } from "@pierre/precision-diffs" +import { + type FileContents, + FileDiff, + type DiffLineAnnotation, + DiffFileRendererOptions, + registerCustomTheme, +} from "@pierre/precision-diffs" import { ComponentProps, createEffect, splitProps } from "solid-js" export type DiffProps<T = {}> = Omit<DiffFileRendererOptions<T>, "themes"> & { @@ -9,6 +15,9 @@ export type DiffProps<T = {}> = Omit<DiffFileRendererOptions<T>, "themes"> & { classList?: ComponentProps<"div">["classList"] } +// @ts-expect-error +registerCustomTheme("opencode", () => import("./theme.json")) + // interface ThreadMetadata { // threadId: string // } @@ -40,7 +49,7 @@ export function Diff<T>(props: DiffProps<T>) { // annotations and a container element to hold the diff createEffect(() => { const instance = new FileDiff<T>({ - theme: "pierre-light", + theme: "opencode", // Or can also provide a 'themes' prop, which allows the code to adapt // to your OS light or dark theme // themes: { dark: 'pierre-night', light: 'pierre-light' }, diff --git a/packages/desktop/src/components/theme.json b/packages/desktop/src/components/theme.json new file mode 100644 index 000000000..36a4d020d --- /dev/null +++ b/packages/desktop/src/components/theme.json @@ -0,0 +1,558 @@ +{ + "colors": { + "actionBar.toggledBackground": "var(--surface-raised-base)", + "activityBarBadge.background": "var(--surface-brand-base)", + "checkbox.border": "var(--border-base)", + "editor.background": "transparent", + "editor.foreground": "var(--text-base)", + "editor.inactiveSelectionBackground": "var(--surface-raised-base)", + "editor.selectionHighlightBackground": "var(--border-active)", + "editorIndentGuide.activeBackground1": "var(--border-weak-base)", + "editorIndentGuide.background1": "var(--border-weak-base)", + "input.placeholderForeground": "var(--text-weak)", + "list.activeSelectionIconForeground": "var(--text-base)", + "list.dropBackground": "var(--surface-raised-base)", + "menu.background": "var(--surface-base)", + "menu.border": "var(--border-base)", + "menu.foreground": "var(--text-base)", + "menu.selectionBackground": "var(--surface-interactive-base)", + "menu.separatorBackground": "var(--border-base)", + "ports.iconRunningProcessForeground": "var(--icon-success-base)", + "sideBarSectionHeader.background": "transparent", + "sideBarSectionHeader.border": "var(--border-weak-base)", + "sideBarTitle.foreground": "var(--text-weak)", + "statusBarItem.remoteBackground": "var(--surface-success-base)", + "statusBarItem.remoteForeground": "var(--text-base)", + "tab.lastPinnedBorder": "var(--border-weak-base)", + "tab.selectedBackground": "var(--surface-raised-base)", + "tab.selectedForeground": "var(--text-weak)", + "terminal.inactiveSelectionBackground": "var(--surface-raised-base)", + "widget.border": "var(--border-base)" + }, + "displayName": "opencode", + "name": "opencode", + "semanticHighlighting": true, + "semanticTokenColors": { + "customLiteral": "var(--syntax-function)", + "newOperator": "var(--syntax-operator)", + "numberLiteral": "var(--syntax-number)", + "stringLiteral": "var(--syntax-string)" + }, + "tokenColors": [ + { + "scope": [ + "meta.embedded", + "source.groovy.embedded", + "string meta.image.inline.markdown", + "variable.legacy.builtin.python" + ], + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": "emphasis", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "strong", + "settings": { + "fontStyle": "bold" + } + }, + { + "scope": "header", + "settings": { + "foreground": "var(--markdown-heading)" + } + }, + { + "scope": "comment", + "settings": { + "foreground": "var(--syntax-comment)" + } + }, + { + "scope": "constant.language", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": [ + "constant.numeric", + "variable.other.enummember", + "keyword.operator.plus.exponent", + "keyword.operator.minus.exponent" + ], + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": "constant.regexp", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "entity.name.tag", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["entity.name.tag.css", "entity.name.tag.less"], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "entity.other.attribute-name", + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": [ + "entity.other.attribute-name.class.css", + "source.css entity.other.attribute-name.class", + "entity.other.attribute-name.id.css", + "entity.other.attribute-name.parent-selector.css", + "entity.other.attribute-name.parent.less", + "source.css entity.other.attribute-name.pseudo-class", + "entity.other.attribute-name.pseudo-element.css", + "source.css.less entity.other.attribute-name.id", + "entity.other.attribute-name.scss" + ], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "invalid", + "settings": { + "foreground": "var(--syntax-critical)" + } + }, + { + "scope": "markup.underline", + "settings": { + "fontStyle": "underline" + } + }, + { + "scope": "markup.bold", + "settings": { + "fontStyle": "bold", + "foreground": "var(--markdown-strong)" + } + }, + { + "scope": "markup.heading", + "settings": { + "fontStyle": "bold", + "foreground": "var(--theme-markdown-heading)" + } + }, + { + "scope": "markup.italic", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "markup.strikethrough", + "settings": { + "fontStyle": "strikethrough" + } + }, + { + "scope": "markup.inserted", + "settings": { + "foreground": "var(--text-diff-add-base)" + } + }, + { + "scope": "markup.deleted", + "settings": { + "foreground": "var(--text-diff-delete-base)" + } + }, + { + "scope": "markup.changed", + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": "punctuation.definition.quote.begin.markdown", + "settings": { + "foreground": "var(--markdown-block-quote)" + } + }, + { + "scope": "punctuation.definition.list.begin.markdown", + "settings": { + "foreground": "var(--markdown-list-enumeration)" + } + }, + { + "scope": "markup.inline.raw", + "settings": { + "foreground": "var(--markdown-code)" + } + }, + { + "scope": "punctuation.definition.tag", + "settings": { + "foreground": "var(--syntax-punctuation)" + } + }, + { + "scope": ["meta.preprocessor", "entity.name.function.preprocessor"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "meta.preprocessor.string", + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "meta.preprocessor.numeric", + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": "meta.structure.dictionary.key.python", + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": "meta.diff.header", + "settings": { + "foreground": "var(--text-weak)" + } + }, + { + "scope": "storage", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "storage.type", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["storage.modifier", "keyword.operator.noexcept"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["string", "meta.embedded.assembly"], + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "string.tag", + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "string.value", + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "string.regexp", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": [ + "punctuation.definition.template-expression.begin", + "punctuation.definition.template-expression.end", + "punctuation.section.embedded" + ], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["meta.template.expression"], + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": [ + "support.type.vendored.property-name", + "support.type.property-name", + "source.css variable", + "source.coffee.embedded" + ], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": "keyword", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "keyword.control", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "keyword.operator", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": [ + "keyword.operator.new", + "keyword.operator.expression", + "keyword.operator.cast", + "keyword.operator.sizeof", + "keyword.operator.alignof", + "keyword.operator.typeid", + "keyword.operator.alignas", + "keyword.operator.instanceof", + "keyword.operator.logical.python", + "keyword.operator.wordlike" + ], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "keyword.other.unit", + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": ["punctuation.section.embedded.begin.php", "punctuation.section.embedded.end.php"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "support.function.git-rebase", + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": "constant.sha.git-rebase", + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": ["storage.modifier.import.java", "variable.language.wildcard.java", "storage.modifier.package.java"], + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": "variable.language", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "support.constant.handlebars", + "source.powershell variable.other.member", + "entity.name.operator.custom-literal" + ], + "settings": { + "foreground": "var(--syntax-function)" + } + }, + { + "scope": [ + "support.class", + "support.type", + "entity.name.type", + "entity.name.namespace", + "entity.other.attribute", + "entity.name.scope-resolution", + "entity.name.class", + "storage.type.numeric.go", + "storage.type.byte.go", + "storage.type.boolean.go", + "storage.type.string.go", + "storage.type.uintptr.go", + "storage.type.error.go", + "storage.type.rune.go", + "storage.type.cs", + "storage.type.generic.cs", + "storage.type.modifier.cs", + "storage.type.variable.cs", + "storage.type.annotation.java", + "storage.type.generic.java", + "storage.type.java", + "storage.type.object.array.java", + "storage.type.primitive.array.java", + "storage.type.primitive.java", + "storage.type.token.java", + "storage.type.groovy", + "storage.type.annotation.groovy", + "storage.type.parameters.groovy", + "storage.type.generic.groovy", + "storage.type.object.array.groovy", + "storage.type.primitive.array.groovy", + "storage.type.primitive.groovy" + ], + "settings": { + "foreground": "var(--syntax-type)" + } + }, + { + "scope": [ + "meta.type.cast.expr", + "meta.type.new.expr", + "support.constant.math", + "support.constant.dom", + "support.constant.json", + "entity.other.inherited-class", + "punctuation.separator.namespace.ruby" + ], + "settings": { + "foreground": "var(--syntax-type)" + } + }, + { + "scope": [ + "keyword.control", + "source.cpp keyword.operator.new", + "keyword.operator.delete", + "keyword.other.using", + "keyword.other.directive.using", + "keyword.other.operator", + "entity.name.operator" + ], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": [ + "variable", + "meta.definition.variable.name", + "support.variable", + "entity.name.variable", + "constant.other.placeholder" + ], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": ["variable.other.constant", "variable.other.enummember"], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": ["meta.object-literal.key"], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": [ + "support.constant.property-value", + "support.constant.font-name", + "support.constant.media-type", + "support.constant.media", + "constant.other.color.rgb-value", + "constant.other.rgb-value", + "support.constant.color" + ], + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": [ + "punctuation.definition.group.regexp", + "punctuation.definition.group.assertion.regexp", + "punctuation.definition.character-class.regexp", + "punctuation.character.set.begin.regexp", + "punctuation.character.set.end.regexp", + "keyword.operator.negation.regexp", + "support.other.parenthesis.regexp" + ], + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": [ + "constant.character.character-class.regexp", + "constant.other.character-class.set.regexp", + "constant.other.character-class.regexp", + "constant.character.set.regexp" + ], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": ["keyword.operator.or.regexp", "keyword.control.anchor.regexp"], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "keyword.operator.quantifier.regexp", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": ["constant.character", "constant.other.option"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "constant.character.escape", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "entity.name.label", + "settings": { + "foreground": "var(--text-weak)" + } + } + ], + "type": "dark" +} |
