diff --git a/.github/screenshots/theme-switcher-github-light.png b/.github/screenshots/theme-switcher-github-light.png new file mode 100644 index 00000000..49fe341d Binary files /dev/null and b/.github/screenshots/theme-switcher-github-light.png differ diff --git a/.github/screenshots/theme-switcher-opencode-dark.png b/.github/screenshots/theme-switcher-opencode-dark.png new file mode 100644 index 00000000..d63a33e0 Binary files /dev/null and b/.github/screenshots/theme-switcher-opencode-dark.png differ diff --git a/.github/screenshots/theme-switcher-tokyonight-dark.png b/.github/screenshots/theme-switcher-tokyonight-dark.png new file mode 100644 index 00000000..85906507 Binary files /dev/null and b/.github/screenshots/theme-switcher-tokyonight-dark.png differ diff --git a/frontend/components.json b/frontend/components.json index 7673dbac..77cd0363 100644 --- a/frontend/components.json +++ b/frontend/components.json @@ -1,14 +1,15 @@ { "$schema": "https://ui.shadcn.com/schema.json", - "style": "default", + "style": "new-york", "rsc": false, "tsx": true, "tailwind": { - "config": "tailwind.config.js", + "config": "", "css": "src/index.css", "baseColor": "slate", "cssVariables": true }, + "iconLibrary": "lucide", "aliases": { "components": "@/components", "utils": "@/lib/utils", diff --git a/frontend/package.json b/frontend/package.json index 809c8e4b..c2e70f92 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,12 +44,14 @@ "react-dom": "^19.1.1", "react-hook-form": "^7.65.0", "react-markdown": "^10.1.0", + "react-resizable-panels": "^4.7.2", "react-router-dom": "^7.13.0", "rehype-highlight": "^7.0.2", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "sonner": "^2.0.7", "tailwind-merge": "^3.3.1", + "vaul": "^1.1.2", "zod": "^4.1.12", "zustand": "^5.0.8" }, diff --git a/frontend/src/api/types/settings.ts b/frontend/src/api/types/settings.ts index 1e342325..91f2b427 100644 --- a/frontend/src/api/types/settings.ts +++ b/frontend/src/api/types/settings.ts @@ -42,6 +42,7 @@ export interface GitIdentity { export interface UserPreferences { theme: 'dark' | 'light' | 'system' + themePreset?: string mode: 'plan' | 'build' defaultModel?: string defaultAgent?: string diff --git a/frontend/src/components/file-browser/FileDiffView.tsx b/frontend/src/components/file-browser/FileDiffView.tsx index eaca2544..30ca7b95 100644 --- a/frontend/src/components/file-browser/FileDiffView.tsx +++ b/frontend/src/components/file-browser/FileDiffView.tsx @@ -93,25 +93,25 @@ const statusConfig: Record< modified: { icon: FileEdit, color: GIT_STATUS_COLORS.modified, - bgColor: "bg-amber-500/10", + bgColor: "bg-warning/10", label: GIT_STATUS_LABELS.modified, }, added: { icon: FilePlus, color: GIT_STATUS_COLORS.added, - bgColor: "bg-emerald-500/10", + bgColor: "bg-success/10", label: GIT_STATUS_LABELS.added, }, deleted: { icon: FileX, color: GIT_STATUS_COLORS.deleted, - bgColor: "bg-rose-500/10", + bgColor: "bg-destructive/10", label: GIT_STATUS_LABELS.deleted, }, renamed: { icon: FileText, color: GIT_STATUS_COLORS.renamed, - bgColor: "bg-blue-500/10", + bgColor: "bg-info/10", label: GIT_STATUS_LABELS.renamed, }, untracked: { @@ -123,7 +123,7 @@ const statusConfig: Record< copied: { icon: FileText, color: GIT_STATUS_COLORS.copied, - bgColor: "bg-emerald-500/10", + bgColor: "bg-success/10", label: GIT_STATUS_LABELS.copied, }, }; @@ -155,16 +155,16 @@ function DiffLineComponent({ const bgClass = line.type === "add" - ? "bg-emerald-500/10" + ? "bg-success/10" : line.type === "remove" - ? "bg-rose-500/10" + ? "bg-destructive/10" : ""; const textClass = line.type === "add" - ? "text-emerald-700 dark:text-emerald-300" + ? "text-success" : line.type === "remove" - ? "text-rose-700 dark:text-rose-300" + ? "text-destructive" : "text-foreground"; const lineNumber = line.newLineNumber ?? line.oldLineNumber; @@ -172,14 +172,14 @@ function DiffLineComponent({ return (
isClickable && lineNumber !== undefined && onLineClick(lineNumber) } @@ -196,10 +196,10 @@ function DiffLineComponent({ )}
{line.type === "add" && ( - + )} {line.type === "remove" && ( - + )}
           {!diffData.isBinary && (
             <>
-              +{diffData.additions}
-              -{diffData.deletions}
+              +{diffData.additions}
+              -{diffData.deletions}
             
           )}
           {diffData.diff && (
diff --git a/frontend/src/components/file-browser/FilePreview.tsx b/frontend/src/components/file-browser/FilePreview.tsx
index a7bd732f..401c7545 100644
--- a/frontend/src/components/file-browser/FilePreview.tsx
+++ b/frontend/src/components/file-browser/FilePreview.tsx
@@ -282,7 +282,7 @@ export const FilePreview = memo(function FilePreview({ file, hideHeader = false,
               return (
                 
@@ -342,10 +342,10 @@ export const FilePreview = memo(function FilePreview({ file, hideHeader = false, {formatFileSize(file.size)} {formatDate(file.lastModified)} {shouldVirtualize && ( - Virtualized + Virtualized )} {hasVirtualizedChanges && ( - Unsaved changes + Unsaved changes )}
@@ -382,7 +382,7 @@ export const FilePreview = memo(function FilePreview({ file, hideHeader = false, )} {showSaveButton && ( - )} diff --git a/frontend/src/components/file-browser/FileTree.tsx b/frontend/src/components/file-browser/FileTree.tsx index 75012104..dea4e6b3 100644 --- a/frontend/src/components/file-browser/FileTree.tsx +++ b/frontend/src/components/file-browser/FileTree.tsx @@ -200,7 +200,7 @@ function TreeNode({ file, level, onFileSelect, onDirectoryClick, selectedFile, o Rename - + Delete diff --git a/frontend/src/components/memory/MemoryList.tsx b/frontend/src/components/memory/MemoryList.tsx index e251a4a6..3ab36a3a 100644 --- a/frontend/src/components/memory/MemoryList.tsx +++ b/frontend/src/components/memory/MemoryList.tsx @@ -17,9 +17,9 @@ interface MemoryListProps { } const scopeColors: Record = { - convention: 'bg-blue-600/20 text-blue-400 border-blue-600/40', - decision: 'bg-green-600/20 text-green-400 border-green-600/40', - context: 'bg-purple-600/20 text-purple-400 border-purple-600/40', + convention: 'border-info/25 bg-info/12 text-info', + decision: 'border-success/25 bg-success/12 text-success', + context: 'border-accent-foreground/10 bg-accent text-accent-foreground', } export function MemoryList({ projectId, scope, showFilters = true }: MemoryListProps) { diff --git a/frontend/src/components/message/ContentDiffViewer.tsx b/frontend/src/components/message/ContentDiffViewer.tsx index f439517a..301c7a33 100644 --- a/frontend/src/components/message/ContentDiffViewer.tsx +++ b/frontend/src/components/message/ContentDiffViewer.tsx @@ -117,8 +117,8 @@ export function ContentDiffViewer({ before, after }: ContentDiffViewerProps) { key={index} className={cn( 'flex font-mono text-xs', - isAdd && 'bg-green-500/10', - isRemove && 'bg-red-500/10', + isAdd && 'bg-success/10', + isRemove && 'bg-destructive/10', )} > {!isMobile && ( @@ -132,14 +132,14 @@ export function ContentDiffViewer({ before, after }: ContentDiffViewerProps) { )}
- {isAdd && } - {isRemove && } + {isAdd && } + {isRemove && }
                 {truncateLine(line.content)}
@@ -170,4 +170,4 @@ export function ContentDiffViewer({ before, after }: ContentDiffViewerProps) {
       )}
     
   )
-}
\ No newline at end of file
+}
diff --git a/frontend/src/components/message/DiffStats.tsx b/frontend/src/components/message/DiffStats.tsx
index cdc0e0c2..32469cd2 100644
--- a/frontend/src/components/message/DiffStats.tsx
+++ b/frontend/src/components/message/DiffStats.tsx
@@ -14,7 +14,7 @@ export function DiffStats({ additions, deletions, variant = 'default' }: DiffSta
   return (
     
       {additions > 0 && (
-        
+        
           {compact ? `+${additions}` : `+${additions}`}
         
       )}
@@ -22,10 +22,10 @@ export function DiffStats({ additions, deletions, variant = 'default' }: DiffSta
         {compact ? '/' : ' '}
       )}
       {deletions > 0 && (
-        
+        
           {compact ? `-${deletions}` : `-${deletions}`}
         
       )}
     
   )
-}
\ No newline at end of file
+}
diff --git a/frontend/src/components/message/EditableUserMessage.tsx b/frontend/src/components/message/EditableUserMessage.tsx
index cc3aa8ce..ce757543 100644
--- a/frontend/src/components/message/EditableUserMessage.tsx
+++ b/frontend/src/components/message/EditableUserMessage.tsx
@@ -151,11 +151,11 @@ export const ClickableUserMessage = memo(function ClickableUserMessage({
   return (
     
   )
-})
\ No newline at end of file
+})
diff --git a/frontend/src/components/message/FileToolRender.tsx b/frontend/src/components/message/FileToolRender.tsx
index b77c7072..3b609bd2 100644
--- a/frontend/src/components/message/FileToolRender.tsx
+++ b/frontend/src/components/message/FileToolRender.tsx
@@ -94,12 +94,12 @@ export function FileToolRender({ part, filediff, filePath, content, toolName, on
         className="w-full px-3 py-1.5 bg-card hover:bg-card-hover text-left flex items-center justify-between text-sm gap-2"
       >
         
- + {toolName} {filePath && ( {getRelativePath(filePath)} @@ -151,4 +151,4 @@ export function getToolSpecificRender(part: ToolPart, onFileClick?: (filePath: s } return null -} \ No newline at end of file +} diff --git a/frontend/src/components/message/MessagePart.tsx b/frontend/src/components/message/MessagePart.tsx index 15931ea2..6976cfd8 100644 --- a/frontend/src/components/message/MessagePart.tsx +++ b/frontend/src/components/message/MessagePart.tsx @@ -83,7 +83,7 @@ function TTSButton({ content, className = "" }: TTSButtonProps) { return ( )} {isQueued && ( - + QUEUED )} diff --git a/frontend/src/components/message/PatchPart.tsx b/frontend/src/components/message/PatchPart.tsx index 725a7636..f16db500 100644 --- a/frontend/src/components/message/PatchPart.tsx +++ b/frontend/src/components/message/PatchPart.tsx @@ -38,7 +38,7 @@ export function PatchPart({ part, onFileClick }: PatchPartProps) { {displayedFiles.map((file, index) => (
onFileClick?.(file)} > {getRelativePath(file)} @@ -67,4 +67,4 @@ export function PatchPart({ part, onFileClick }: PatchPartProps) {
) -} \ No newline at end of file +} diff --git a/frontend/src/components/message/PromptInput.tsx b/frontend/src/components/message/PromptInput.tsx index fb3c5c5b..595e05b7 100644 --- a/frontend/src/components/message/PromptInput.tsx +++ b/frontend/src/components/message/PromptInput.tsx @@ -762,12 +762,12 @@ const { model, modelString } = useModelSelection(opcodeUrl, directory) return ( -
+
{showStopButton && !(isFocused && prompt.trim().length > 0) && ( ) @@ -854,20 +854,20 @@ return (
- {showStopButton && ( - )} @@ -891,11 +891,11 @@ return ( type="button" onClick={handleVoiceToggle} disabled={disabled || isProcessing} - className={`hidden md:flex p-2 rounded-lg transition-all duration-200 active:scale-95 hover:scale-105 shadow-md border items-center justify-center ${ - isRecording - ? 'bg-gradient-to-br from-red-600 to-red-700 hover:from-red-500 hover:to-red-600 text-destructive-foreground border-red-500/60 animate-pulse' + className={`hidden md:flex p-2 rounded-lg transition-all duration-200 active:scale-95 hover:scale-105 shadow-md border items-center justify-center ${ + isRecording + ? 'animate-pulse border-destructive/50 bg-destructive text-destructive-foreground' : 'bg-muted hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground border-border' - }`} + }`} title={isRecording ? 'Stop recording' : 'Voice input'} > {isTogglingRecording && !isRecording ? ( @@ -913,11 +913,11 @@ return (
- )} - + className={cn( + 'rounded-2xl border border-border/70 bg-background/70 p-4 text-left transition-[transform,border-color,background-color] hover:border-primary/20 hover:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50', + isSelected && 'border-primary/35 bg-primary/10' + )} + > +

+ {option.label} +

+

{option.description}

+ + ) + })} +
+ + +
+
+
+ + { + if (repoType === 'remote') { + handleRepoUrlChange(e.target.value) + } else if (repoType === 'local') { + setLocalPath(e.target.value) + } else { + setFolderPath(e.target.value) + } + }} + disabled={mutation.isPending} + /> +

{sourceDescription}

+
- + setBranch(e.target.value)} disabled={mutation.isPending || repoType === 'folder'} - className="bg-[#1a1a1a] border-[#2a2a2a] text-white placeholder:text-zinc-500" /> -

- {repoType === 'folder' - ? 'Folder discovery links each repository on its current branch' - : branch - ? repoType === 'remote' - ? `Clones repository directly to '${branch}' branch` - : localPath?.startsWith('/') - ? `Links the repo in place and checks out '${branch}' branch` - : `Initializes repository with '${branch}' branch` - : repoType === 'remote' - ? "Clones repository to default branch" - : localPath?.startsWith('/') - ? 'Links the repo in place and keeps its current branch' - : "Initializes repository with 'main' branch" - } -

+

{branchOutcome}

{showSkipSSHCheckbox && ( -
+
+ )} +
+
- - {mutation.isError && ( -

- {mutation.error.message} -

- )} + {mutation.isError && ( +

{mutation.error.message}

+ )} + + ) + + const submitButton = ( + + ) + + if (isMobile) { + return ( + + + + + Add Repository + Bring a remote repo into the workspace, import a local Git directory, or discover repos in a folder. + +
+ {formSections} +
+ + {submitButton} + + +
+
+ ) + } + + return ( + + + + Add Repository + Bring a remote repo into the workspace, import a local Git directory, or discover repos in a folder. + +
+ {formSections} + {submitButton}
diff --git a/frontend/src/components/repo/RepoCard.tsx b/frontend/src/components/repo/RepoCard.tsx index fba03bd7..006e4542 100644 --- a/frontend/src/components/repo/RepoCard.tsx +++ b/frontend/src/components/repo/RepoCard.tsx @@ -78,10 +78,10 @@ export function RepoCard({
@@ -105,7 +105,7 @@ export function RepoCard({ {repoName} {isReady && ( -
+
)}
@@ -115,17 +115,17 @@ export function RepoCard({
{isCloning ? ( - + Cloning... ) : ( <> - + {branchToDisplay || "main"} {isDirty && ( - + {unstagedCount > 0 && unstagedCount} @@ -135,7 +135,7 @@ export function RepoCard({ )} {(ahead > 0 || behind > 0) && ( - + {ahead > 0 && `↑${ahead}`} {behind > 0 && `↓${behind}`} diff --git a/frontend/src/components/repo/RepoList.tsx b/frontend/src/components/repo/RepoList.tsx index 2a988f6a..e87b5375 100644 --- a/frontend/src/components/repo/RepoList.tsx +++ b/frontend/src/components/repo/RepoList.tsx @@ -244,8 +244,8 @@ export function RepoList() { if (!repos || repos.length === 0) { return (
- -

+ +

No repositories yet. Add one to get started.

@@ -337,8 +337,8 @@ export function RepoList() {
{filteredRepos.length === 0 ? (
- -

+ +

No repositories found matching "{searchQuery}"

diff --git a/frontend/src/components/repo/RepoMcpServerList.tsx b/frontend/src/components/repo/RepoMcpServerList.tsx index fa7c1bc8..17171996 100644 --- a/frontend/src/components/repo/RepoMcpServerList.tsx +++ b/frontend/src/components/repo/RepoMcpServerList.tsx @@ -66,9 +66,9 @@ export function RepoMcpServerList({ switch (status.status) { case 'connected': - return Connected + return Connected case 'disabled': - return Disabled + return Disabled case 'failed': return ( @@ -78,7 +78,7 @@ export function RepoMcpServerList({ ) case 'needs_auth': return ( - + Needs Auth ) @@ -97,7 +97,7 @@ export function RepoMcpServerList({
) : isLoadingStatus ? (
- + Loading...
) : ( @@ -133,19 +133,19 @@ export function RepoMcpServerList({ title="Click for options" > {status?.status === 'connected' && ( - + Connected - + )} {status?.status === 'needs_auth' && ( - + Needs Auth - + )} {status?.status === 'failed' && ( - + Failed - + )} @@ -184,7 +184,7 @@ export function RepoMcpServerList({ {serverConfig ? getDescription(serverConfig) : 'MCP server'}

{failed && status.status === 'failed' && ( -
+
{status.error}
diff --git a/frontend/src/components/repo/SwitchConfigDialog.tsx b/frontend/src/components/repo/SwitchConfigDialog.tsx index 744c90f8..052c16d7 100644 --- a/frontend/src/components/repo/SwitchConfigDialog.tsx +++ b/frontend/src/components/repo/SwitchConfigDialog.tsx @@ -91,7 +91,7 @@ export function SwitchConfigDialog({ {loading ? (
- + Loading configs...
) : configs.length === 0 ? ( @@ -107,7 +107,7 @@ export function SwitchConfigDialog({
{config.name} {config.isDefault && ( - (default) + (default) )}
@@ -117,9 +117,9 @@ export function SwitchConfigDialog({ )} {error && ( -
- -

{error}

+
+ +

{error}

)} @@ -134,7 +134,6 @@ export function SwitchConfigDialog({
) -} \ No newline at end of file +} diff --git a/frontend/src/components/session/EditSessionTitleDialog.tsx b/frontend/src/components/session/EditSessionTitleDialog.tsx index 6e90c2e6..591e3686 100644 --- a/frontend/src/components/session/EditSessionTitleDialog.tsx +++ b/frontend/src/components/session/EditSessionTitleDialog.tsx @@ -75,7 +75,7 @@ export function EditSessionTitleDialog({ isOpen, currentTitle, onClose, onSave } setEditTitle(""); inputRef.current?.focus(); }} - className="absolute right-2 top-1/2 -translate-y-1/2 p-1.5 rounded-full hover:bg-red-500/10 text-red-500 transition-colors" + className="absolute right-2 top-1/2 -translate-y-1/2 rounded-full p-1.5 text-destructive transition-colors hover:bg-destructive/10" > @@ -102,4 +102,4 @@ export function EditSessionTitleDialog({ isOpen, currentTitle, onClose, onSave } ); -} \ No newline at end of file +} diff --git a/frontend/src/components/session/PermissionRequestDialog.tsx b/frontend/src/components/session/PermissionRequestDialog.tsx index de2960ee..e038f1a8 100644 --- a/frontend/src/components/session/PermissionRequestDialog.tsx +++ b/frontend/src/components/session/PermissionRequestDialog.tsx @@ -197,7 +197,7 @@ export function PermissionRequestDialog({
)} {isFromDifferentSession ? ( -
+
From another session: {displaySessionName}
) : ( diff --git a/frontend/src/components/session/QuestionPrompt.tsx b/frontend/src/components/session/QuestionPrompt.tsx index a1721c2c..d989c93c 100644 --- a/frontend/src/components/session/QuestionPrompt.tsx +++ b/frontend/src/components/session/QuestionPrompt.tsx @@ -210,40 +210,38 @@ export function QuestionPrompt({ question, onReply, onReject, onMinimize }: Ques }, [isMinimized, expandedOther, handleMinimize, onMinimize]) return ( -
-
+
+
{!isMinimized ? ( -
{isConfirmStep ? ( - ) : currentQuestion && ( @@ -264,7 +262,7 @@ export function QuestionPrompt({ question, onReply, onReject, onMinimize }: Ques
) : null} -
+
@@ -362,8 +360,8 @@ function QuestionStep({ className={cn( "w-full text-left p-2 sm:p-3 rounded-lg transition-all duration-200 active:scale-[0.98]", isSelected - ? "bg-blue-200 dark:bg-blue-700/50" - : "bg-white/40 dark:bg-white/5 hover:bg-white/60 dark:hover:bg-white/10" + ? "bg-primary/12" + : "bg-background/50 hover:bg-background/80 dark:bg-white/5 dark:hover:bg-white/10" )} >
@@ -371,14 +369,14 @@ function QuestionStep({
{isSelected && }
{option.label} @@ -404,22 +402,22 @@ function QuestionStep({ className={cn( "w-full text-left p-2 sm:p-3 rounded-lg transition-all duration-200", expandedOther || isCustomSelected - ? "bg-blue-200 dark:bg-blue-700/50" - : "bg-white/40 dark:bg-white/5 hover:bg-white/60 dark:hover:bg-white/10" + ? "bg-primary/12" + : "bg-background/50 hover:bg-background/80 dark:bg-white/5 dark:hover:bg-white/10" )} >
{isCustomSelected && }
Other... @@ -433,7 +431,7 @@ function QuestionStep({ value={customInput} onChange={(e) => onCustomInputChange(e.target.value)} placeholder="Type your own answer..." - className="min-h-[60px] sm:min-h-[80px] text-[16px] sm:text-xs md:text-sm resize-none border-blue-500/30 focus:border-blue-500" + className="min-h-[60px] resize-none border-primary/30 text-[16px] sm:min-h-[80px] sm:text-xs md:text-sm focus:border-primary" onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault() @@ -479,8 +477,8 @@ function ConfirmStep({ questions, answers, onEditQuestion }: ConfirmStepProps) { className={cn( "w-full text-left p-2 sm:p-3 rounded-lg transition-colors", hasAnswer - ? "bg-green-50 dark:bg-green-900/30 hover:bg-green-100 dark:hover:bg-green-900/50" - : "bg-red-50 dark:bg-red-900/30 hover:bg-red-100 dark:hover:bg-red-900/50" + ? "bg-success/10 hover:bg-success/16" + : "bg-destructive/10 hover:bg-destructive/14" )} >
@@ -488,7 +486,7 @@ function ConfirmStep({ questions, answers, onEditQuestion }: ConfirmStepProps) {

{q.header}

{hasAnswer ? answer.join(', ') : '(not answered)'}

diff --git a/frontend/src/components/session/SessionCard.tsx b/frontend/src/components/session/SessionCard.tsx index 6d3a89ab..36360524 100644 --- a/frontend/src/components/session/SessionCard.tsx +++ b/frontend/src/components/session/SessionCard.tsx @@ -44,12 +44,12 @@ export const SessionCard = ({ return (
40) ? "opacity-100" : "opacity-0 pointer-events-none" }`} >
-

+

{session.title || "Untitled Session"}

@@ -108,7 +108,7 @@ export const SessionCard = ({
) : (
-

+

{session.title || "Untitled Session"}

@@ -124,7 +124,7 @@ export const SessionCard = ({ )} {manageMode && ( diff --git a/frontend/src/components/settings/AgentsMdEditor.tsx b/frontend/src/components/settings/AgentsMdEditor.tsx index 3c7f9c38..467f896d 100644 --- a/frontend/src/components/settings/AgentsMdEditor.tsx +++ b/frontend/src/components/settings/AgentsMdEditor.tsx @@ -76,7 +76,7 @@ export function AgentsMdEditor() { if (error) { return ( -
+
Failed to load AGENTS.md
) @@ -127,7 +127,7 @@ export function AgentsMdEditor() { /> {hasChanges && ( -

You have unsaved changes

+

You have unsaved changes

)}
) diff --git a/frontend/src/components/settings/CommandsEditor.tsx b/frontend/src/components/settings/CommandsEditor.tsx index b9d0ec74..7bd4b561 100644 --- a/frontend/src/components/settings/CommandsEditor.tsx +++ b/frontend/src/components/settings/CommandsEditor.tsx @@ -93,7 +93,7 @@ export function CommandsEditor({ commands, onChange }: CommandsEditorProps) { variant="ghost" size="sm" onClick={() => deleteCommand(name)} - className="text-red-500 hover:text-red-600" + className="text-destructive hover:text-destructive" > diff --git a/frontend/src/components/settings/CreateConfigDialog.tsx b/frontend/src/components/settings/CreateConfigDialog.tsx index 193f3f89..851b2d27 100644 --- a/frontend/src/components/settings/CreateConfigDialog.tsx +++ b/frontend/src/components/settings/CreateConfigDialog.tsx @@ -141,7 +141,7 @@ export function CreateConfigDialog({ isOpen, onOpenChange, onCreate, isUpdating className="font-mono md:text-sm" /> {error && ( -

+

{error} {errorLine && ( (Line {errorLine}) @@ -177,4 +177,4 @@ export function CreateConfigDialog({ isOpen, onOpenChange, onCreate, isUpdating ) -} \ No newline at end of file +} diff --git a/frontend/src/components/settings/GeneralSettings.tsx b/frontend/src/components/settings/GeneralSettings.tsx index cbc0678c..0b70eee4 100644 --- a/frontend/src/components/settings/GeneralSettings.tsx +++ b/frontend/src/components/settings/GeneralSettings.tsx @@ -1,13 +1,55 @@ import { useSettings } from '@/hooks/useSettings' +import { useTheme } from '@/hooks/useTheme' import { useVersionCheck } from '@/hooks/useVersionCheck' import { Loader2 } from 'lucide-react' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Switch } from '@/components/ui/switch' +import { DEFAULT_THEME_PRESET, getThemeLabel, OPENCODE_THEME_OPTIONS, resolveOpenCodeTheme } from '@/lib/opencodeThemes' + +function PreferenceToggle({ + id, + title, + description, + checked, + onCheckedChange, +}: { + id: string + title: string + description: string + checked: boolean + onCheckedChange: (checked: boolean) => void +}) { + return ( +

+
+
+ +

{description}

+
+ +
+
+ ) +} export function GeneralSettings() { const { preferences, isLoading, updateSettings, isUpdating } = useSettings() const { data: versionInfo, isLoading: isVersionLoading } = useVersionCheck() + const currentMode = useTheme() + + const appearance = preferences?.theme || 'dark' + const themePreset = preferences?.themePreset || DEFAULT_THEME_PRESET + const previewMode = appearance === 'system' ? currentMode : appearance + const previewTheme = resolveOpenCodeTheme(themePreset, previewMode) + const previewSwatches = [ + previewTheme.primary, + previewTheme.secondary, + previewTheme.info, + previewTheme.success, + previewTheme.warning, + previewTheme.error, + ] if (isLoading) { return ( @@ -18,17 +60,19 @@ export function GeneralSettings() { } return ( -
-

General Preferences

- -
-
- OpenCode Manager +
+
+
+

Preferences

+

General Settings

+
+
+ OpenCode Manager {isVersionLoading ? ( ) : versionInfo?.currentVersion ? ( <> - + {versionInfo.currentVersion} {versionInfo.updateAvailable && versionInfo.latestVersion && ( @@ -36,7 +80,7 @@ export function GeneralSettings() { href={versionInfo.releaseUrl ?? ''} target="_blank" rel="noopener noreferrer" - className="text-xs font-medium text-green-500 hover:text-green-400 transition-colors" + className="text-xs font-medium text-success transition-colors hover:text-success/80" > v{versionInfo.latestVersion} available @@ -46,89 +90,120 @@ export function GeneralSettings() { unknown )}
+
-
- - -

- Choose your preferred color scheme -

-
+
+
+
+
+ + +

Matches the built-in palettes available in OpenCode's `/theme` picker.

+
-
-
- -

- Automatically scroll to bottom when new messages arrive -

+
+ + +

Controls whether the selected OpenCode palette renders in light, dark, or system mode.

+
- updateSettings({ autoScroll: checked })} - /> -
-
-
- -

- Display model reasoning and thought process -

-
- updateSettings({ showReasoning: checked })} - /> -
+
+
+
+

Live Preview

+

{getThemeLabel(themePreset)}

+

{previewMode === 'dark' ? 'Dark mode' : 'Light mode'} palette preview

+
+ + {previewMode} + +
-
-
- -

- Automatically expand tool call details by default -

-
- updateSettings({ expandToolCalls: checked })} - /> -
+
+ {previewSwatches.map((color) => ( +
+
+
+ ))} +
-
-
- -

- Show file diffs expanded by default for edit operations -

+
+
+
Panel
+
Workspace shell
+
+
+
Element
+
Inputs and cards
+
+
+
Diff
+
Added lines
+
+
- updateSettings({ expandDiffs: checked })} - />
+ updateSettings({ autoScroll: checked })} + /> + + updateSettings({ showReasoning: checked })} + /> + + updateSettings({ expandToolCalls: checked })} + /> + updateSettings({ expandDiffs: checked })} + /> {isUpdating && ( -
+
- Saving... + Saving theme and preference changes...
)}
diff --git a/frontend/src/components/settings/McpOAuthDialog.tsx b/frontend/src/components/settings/McpOAuthDialog.tsx index a8138ab5..c27dcf97 100644 --- a/frontend/src/components/settings/McpOAuthDialog.tsx +++ b/frontend/src/components/settings/McpOAuthDialog.tsx @@ -288,7 +288,7 @@ export function McpOAuthDialog({ {step === 'waiting' && (
- + Waiting for authorization...

@@ -321,7 +321,7 @@ export function McpOAuthDialog({ {step === 'popup_closed' && (

- + Checking authentication status...

@@ -363,7 +363,7 @@ export function McpOAuthDialog({ {step === 'success' && (

- +

Authentication successful

)} diff --git a/frontend/src/components/settings/McpServerCard.tsx b/frontend/src/components/settings/McpServerCard.tsx index d2dd0a5a..86f0497f 100644 --- a/frontend/src/components/settings/McpServerCard.tsx +++ b/frontend/src/components/settings/McpServerCard.tsx @@ -24,7 +24,7 @@ interface McpServerCardProps { function getStatusBadge(status: McpStatus) { switch (status.status) { case 'connected': - return Connected + return Connected case 'disabled': return Disabled case 'failed': @@ -36,14 +36,14 @@ function getStatusBadge(status: McpStatus) { ) case 'needs_auth': return ( - + Auth Required ) case 'needs_client_registration': return ( - + Registration Required @@ -102,7 +102,7 @@ export function McpServerCard({ const displayName = getServerDisplayName(serverId) return ( -
+

{displayName}

@@ -119,7 +119,7 @@ export function McpServerCard({ {getServerDescription(serverConfig)}

{errorMessage && ( -
+
{errorMessage}
@@ -177,7 +177,7 @@ export function McpServerCard({ onSelect={() => { setTimeout(() => onDeleteServer(serverId, displayName), 0) }} - className="text-red-600" + className="text-destructive" > Delete Server diff --git a/frontend/src/components/settings/MemoryPluginConfig.tsx b/frontend/src/components/settings/MemoryPluginConfig.tsx index e8f9c16a..c99a2d73 100644 --- a/frontend/src/components/settings/MemoryPluginConfig.tsx +++ b/frontend/src/components/settings/MemoryPluginConfig.tsx @@ -219,7 +219,7 @@ export function MemoryPluginConfig({ memoryPluginEnabled, onToggle }: MemoryPlug className="flex items-center gap-2 p-1 hover:opacity-80 transition-opacity" > {expanded ? : } - + Memory Plugin
- + Reindex
@@ -579,7 +579,7 @@ export function OpenCodeConfigManager() { }} >
- +

Global Agent Instructions (AGENTS.md)

diff --git a/frontend/src/components/settings/ProviderSettings.tsx b/frontend/src/components/settings/ProviderSettings.tsx index f32dfb0e..2c623fd2 100644 --- a/frontend/src/components/settings/ProviderSettings.tsx +++ b/frontend/src/components/settings/ProviderSettings.tsx @@ -191,7 +191,7 @@ export function ProviderSettings() { {provider.name || provider.id} {hasKey ? ( - + Connected @@ -308,7 +308,7 @@ export function ProviderSettings() { )}
- + Connected diff --git a/frontend/src/components/settings/STTSettings.tsx b/frontend/src/components/settings/STTSettings.tsx index 3826dfb2..2594e1d1 100644 --- a/frontend/src/components/settings/STTSettings.tsx +++ b/frontend/src/components/settings/STTSettings.tsx @@ -180,12 +180,12 @@ export function STTSettings() {
{saveStatus === 'saved' && ( <> - - Saved + + Saved )} {saveStatus === 'idle' && isDirty && isValid && ( - Unsaved changes + Unsaved changes )} {saveStatus === 'idle' && !isDirty && ( All changes saved @@ -376,8 +376,8 @@ export function STTSettings() { )} {sttError && ( -
-
+
+
{sttError}
@@ -411,19 +411,19 @@ export function STTSettings() {
)} {!isTesting && !isProcessing && testResult === 'success' && testTranscript && ( -
+
- - Test successful + + Test successful
-

{testTranscript}

+

{testTranscript}

)} {!isTesting && !isProcessing && testResult === 'failed' && ( -
+
- - Test failed - {sttError || 'no speech detected'} + + Test failed - {sttError || 'no speech detected'}
)} @@ -435,8 +435,8 @@ export function STTSettings() { className={`px-4 py-2 rounded-lg transition-all duration-200 active:scale-95 flex items-center gap-2 ${ !canTest && !isRecording && !isProcessing ? 'bg-muted text-muted-foreground cursor-not-allowed' - : isRecording - ? 'bg-gradient-to-br from-red-600 to-red-700 hover:from-red-500 hover:to-red-600 text-destructive-foreground border-2 border-red-500/60 shadow-lg shadow-red-500/30' + : isRecording + ? 'border-2 border-destructive/50 bg-destructive text-destructive-foreground shadow-lg shadow-destructive/20 hover:bg-destructive/92' : isProcessing ? 'bg-muted text-muted-foreground cursor-wait' : 'bg-primary hover:bg-primary/90 text-primary-foreground' diff --git a/frontend/src/components/settings/SettingsDialog.tsx b/frontend/src/components/settings/SettingsDialog.tsx index 82fc15ae..eaf5d728 100644 --- a/frontend/src/components/settings/SettingsDialog.tsx +++ b/frontend/src/components/settings/SettingsDialog.tsx @@ -9,12 +9,22 @@ import { VoiceSettings } from '@/components/settings/VoiceSettings' import { NotificationSettings } from '@/components/settings/NotificationSettings' import { Dialog, DialogContent } from '@/components/ui/dialog' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' -import { Settings2, Keyboard, Code, ChevronLeft, Key, GitBranch, User, Volume2, Bell, X } from 'lucide-react' +import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@/components/ui/resizable' +import { Settings2, Keyboard, Code, ChevronLeft, Key, GitBranch, User, Volume2, Bell, X, type LucideIcon } from 'lucide-react' import { Button } from '@/components/ui/button' import { useSwipeBack } from '@/hooks/useMobile' import { useSettingsDialog } from '@/hooks/useSettingsDialog' +import { cn } from '@/lib/utils' type SettingsView = 'menu' | 'general' | 'git' | 'shortcuts' | 'opencode' | 'providers' | 'account' | 'voice' | 'notifications' +type SettingsSection = Exclude + +interface SettingsMenuItem { + id: SettingsSection + icon: LucideIcon + label: string + description: string +} export function SettingsDialog() { const { isOpen, close, activeTab, setActiveTab } = useSettingsDialog() @@ -50,7 +60,7 @@ export function SettingsDialog() { return () => document.removeEventListener('keydown', handleKeyDown) }, [isOpen, close]) - const menuItems = [ + const menuItems: SettingsMenuItem[] = [ { id: 'account', icon: User, label: 'Account', description: 'Profile, passkeys, and sign out' }, { id: 'general', icon: Settings2, label: 'General Settings', description: 'App preferences and behavior' }, { id: 'notifications', icon: Bell, label: 'Notifications', description: 'Push notification preferences' }, @@ -62,7 +72,48 @@ export function SettingsDialog() { ] const handleTabChange = (tab: string) => { - setActiveTab(tab as SettingsView) + setActiveTab(tab as SettingsSection) + } + + const activeItem = menuItems.find((item) => item.id === activeTab) ?? menuItems[0] + const mobileActiveItem = mobileView === 'menu' + ? activeItem + : menuItems.find((item) => item.id === mobileView) ?? activeItem + + const renderSectionIntro = (item: SettingsMenuItem, compact = false) => ( +
+

Current Section

+
+
+ +
+
+

{item.label}

+

{item.description}

+
+
+
+ ) + + const renderSettingsContent = (value: SettingsSection) => { + switch (value) { + case 'account': + return + case 'general': + return + case 'notifications': + return + case 'voice': + return + case 'git': + return + case 'shortcuts': + return + case 'opencode': + return + case 'providers': + return + } } return ( @@ -72,12 +123,12 @@ export function SettingsDialog() { className="inset-0 w-full h-full max-w-none max-h-none p-0 rounded-none bg-gradient-to-br from-background via-background to-background border-border overflow-hidden !flex !flex-col" style={swipeStyles} fullscreen - > -
-
-

- Settings -

+ > +
+
+

+ Settings +

-
- -
- - - Account - - - General - - - Notify - - - Voice - - - Git - - - Shortcuts - - - OpenCode - - - Providers - -
+ + + +
+
+

Workspace Preferences

+

Manage your account, git identity, provider access, and OpenCode behavior.

+
+
+ + {menuItems.map((item) => { + const isActive = activeTab === item.id -
-
- - - - - - - - -
-
- -
+ return ( + +
+
+ +
+
+

{item.label}

+

+ {item.description} +

+
+
+
+ ) + })} + +
+
+
+

Quick Tip

+

Drag the divider to resize the sidebar and use `Esc` to close settings.

+
+
+
+ + + +
+
+ {renderSectionIntro(activeItem)} + {menuItems.map((item) => ( + + {renderSettingsContent(item.id)} + + ))} +
+
+
+ + +
-
-
-
+
+
+
{mobileView !== 'menu' && ( )} -

- {mobileView === 'menu' ? 'Settings' : menuItems.find(item => item.id === mobileView)?.label} -

+

+ {mobileView === 'menu' ? 'Settings' : menuItems.find(item => item.id === mobileView)?.label} +

-
- {mobileView === 'menu' && ( -
- {menuItems.map((item) => ( - +
+ {menuItems.map((item) => ( + ))} -
- )} - - {mobileView === 'account' &&
} - {mobileView === 'general' &&
} - {mobileView === 'notifications' &&
} - {mobileView === 'voice' &&
} - {mobileView === 'git' &&
} - {mobileView === 'shortcuts' &&
} - {mobileView === 'opencode' &&
} - {mobileView === 'providers' &&
} -
-
+
+ )} + + {mobileView !== 'menu' && ( +
+ {renderSectionIntro(mobileActiveItem, true)} + {renderSettingsContent(mobileView)} +
+ )} +
+
) diff --git a/frontend/src/components/settings/TTSSettings.tsx b/frontend/src/components/settings/TTSSettings.tsx index fa8923ca..fb877138 100644 --- a/frontend/src/components/settings/TTSSettings.tsx +++ b/frontend/src/components/settings/TTSSettings.tsx @@ -252,12 +252,12 @@ export function TTSSettings() { )} {saveStatus === 'saved' && ( <> - - Saved + + Saved )} {saveStatus === 'idle' && isDirty && isValid && ( - Unsaved changes + Unsaved changes )} {saveStatus === 'idle' && !isDirty && ( All changes saved @@ -297,15 +297,15 @@ export function TTSSettings() { form.setValue('provider', 'builtin', { shouldDirty: true }) form.setValue('apiKey', '', { shouldDirty: true }) form.setValue('endpoint', '', { shouldDirty: true }) - }} - className={`flex flex-col items-center justify-center gap-2 rounded-lg border-2 p-4 transition ${ - watchProvider === 'builtin' - ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20' - : 'border-border hover:border-blue-300' - }`} - > - - + }} + className={`flex flex-col items-center justify-center gap-2 rounded-lg border-2 p-4 transition ${ + watchProvider === 'builtin' + ? 'border-primary bg-primary/10' + : 'border-border hover:border-primary/40' + }`} + > + + Built-in Browser @@ -316,15 +316,15 @@ export function TTSSettings() { type="button" onClick={() => { form.setValue('provider', 'external', { shouldDirty: true }) - }} - className={`flex flex-col items-center justify-center gap-2 rounded-lg border-2 p-4 transition ${ - watchProvider === 'external' - ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20' - : 'border-border hover:border-blue-300' - }`} - > - - + }} + className={`flex flex-col items-center justify-center gap-2 rounded-lg border-2 p-4 transition ${ + watchProvider === 'external' + ? 'border-primary bg-primary/10' + : 'border-border hover:border-primary/40' + }`} + > + + External API @@ -540,8 +540,8 @@ export function TTSSettings() { /> {!hasWebSpeechSupport && ( -
-
+
+
Browser Not Supported: Your browser doesn't support Web Speech API. Please use Chrome, Safari, Firefox, or Edge, or switch to an external API provider.
diff --git a/frontend/src/components/settings/VersionSelectDialog.tsx b/frontend/src/components/settings/VersionSelectDialog.tsx index d34c0cae..93f413b3 100644 --- a/frontend/src/components/settings/VersionSelectDialog.tsx +++ b/frontend/src/components/settings/VersionSelectDialog.tsx @@ -95,7 +95,7 @@ export function VersionSelectDialog({ open, onOpenChange }: VersionSelectDialogP )} {error && ( -
+
Failed to fetch versions
)} @@ -113,20 +113,20 @@ export function VersionSelectDialog({ open, onOpenChange }: VersionSelectDialogP key={release.version} onClick={() => setSelectedVersion(isCurrent ? null : release.version)} disabled={isCurrent || installMutation.isPending} - className={`w-full text-left p-3 rounded-lg border transition-colors ${ - isSelected - ? 'border-primary bg-primary/10' - : isCurrent - ? 'border-green-500/50 bg-green-500/10 cursor-default' + className={`w-full text-left p-3 rounded-lg border transition-colors ${ + isSelected + ? 'border-primary bg-primary/10' + : isCurrent + ? 'cursor-default border-success/30 bg-success/10' : 'border-border hover:border-primary/50 hover:bg-muted/50' - }`} + }`} >
v{release.version} {isCurrent && ( - + Current )} diff --git a/frontend/src/components/source-control/BranchesTab.tsx b/frontend/src/components/source-control/BranchesTab.tsx index 2026176a..39473934 100644 --- a/frontend/src/components/source-control/BranchesTab.tsx +++ b/frontend/src/components/source-control/BranchesTab.tsx @@ -226,13 +226,13 @@ export function BranchesTab({ repoId, currentBranch, repoUrl, isRepoWorktree }: title={isCheckedOutElsewhere ? 'Branch is checked out in another worktree' : undefined} > {isRemote ? ( - + ) : ( )} {branch.name} {(isCheckedOutElsewhere || (isCurrent && isRepoWorktree)) && ( - worktree + worktree )} {branch.type === 'local' && !branch.upstream && !branch.isWorktree && !(isCurrent && isRepoWorktree) && ( local diff --git a/frontend/src/components/source-control/GitFlatFileItem.tsx b/frontend/src/components/source-control/GitFlatFileItem.tsx index 6adeb8a1..7e4d1955 100644 --- a/frontend/src/components/source-control/GitFlatFileItem.tsx +++ b/frontend/src/components/source-control/GitFlatFileItem.tsx @@ -70,10 +70,10 @@ export function GitFlatFileItem({ file, isSelected, onSelect, onStage, onUnstage {(file.additions !== undefined || file.deletions !== undefined) && (
{file.additions !== undefined && file.additions > 0 && ( - +{file.additions} + +{file.additions} )} {file.deletions !== undefined && file.deletions > 0 && ( - -{file.deletions} + -{file.deletions} )}
)} @@ -99,7 +99,7 @@ export function GitFlatFileItem({ file, isSelected, onSelect, onStage, onUnstage onClick={handleDiscard} title="Discard changes" > - + )}
diff --git a/frontend/src/components/source-control/GitFlatFileList.tsx b/frontend/src/components/source-control/GitFlatFileList.tsx index ba23ab61..0e9e4190 100644 --- a/frontend/src/components/source-control/GitFlatFileList.tsx +++ b/frontend/src/components/source-control/GitFlatFileList.tsx @@ -110,8 +110,8 @@ export function GitFlatFileList({ {(totalAdditions !== undefined && totalAdditions > 0 || totalDeletions !== undefined && totalDeletions > 0) && (
- {totalAdditions !== undefined && totalAdditions > 0 && +{totalAdditions}} - {totalDeletions !== undefined && totalDeletions > 0 && -{totalDeletions}} + {totalAdditions !== undefined && totalAdditions > 0 && +{totalAdditions}} + {totalDeletions !== undefined && totalDeletions > 0 && -{totalDeletions}}
)} {!readOnly && ( @@ -120,7 +120,7 @@ export function GitFlatFileList({ - ); -} \ No newline at end of file + ) +} diff --git a/frontend/src/components/ui/badge.tsx b/frontend/src/components/ui/badge.tsx index f000e3ef..e66bb4e0 100644 --- a/frontend/src/components/ui/badge.tsx +++ b/frontend/src/components/ui/badge.tsx @@ -9,12 +9,15 @@ const badgeVariants = cva( variants: { variant: { default: - "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + "border-primary/20 bg-primary/12 text-primary hover:bg-primary/18", secondary: - "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + "border-border/70 bg-secondary text-secondary-foreground hover:bg-secondary/80", destructive: - "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", - outline: "text-foreground", + "border-destructive/20 bg-destructive/12 text-destructive hover:bg-destructive/18", + outline: "border-border/70 bg-background/60 text-foreground", + info: "border-info/20 bg-info/12 text-info hover:bg-info/18", + success: "border-success/20 bg-success/12 text-success hover:bg-success/18", + warning: "border-warning/25 bg-warning/16 text-warning hover:bg-warning/22", }, }, defaultVariants: { diff --git a/frontend/src/components/ui/button.tsx b/frontend/src/components/ui/button.tsx index 4b7a1252..461f5b67 100644 --- a/frontend/src/components/ui/button.tsx +++ b/frontend/src/components/ui/button.tsx @@ -5,19 +5,19 @@ import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[calc(var(--radius)-0.125rem)] border text-sm font-medium transition-[color,background-color,border-color,box-shadow,transform] disabled:pointer-events-none disabled:opacity-50 active:translate-y-px [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/60 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { - default: "bg-primary text-primary-foreground hover:bg-primary/90", + default: "border-primary/60 bg-primary text-primary-foreground shadow-[inset_0_1px_0_color-mix(in_oklab,var(--primary-foreground)_12%,transparent)] hover:border-primary hover:bg-primary-hover", destructive: - "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + "border-destructive/50 bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/25 dark:focus-visible:ring-destructive/35 dark:bg-destructive/65", outline: - "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + "border-border/70 bg-panel/80 text-foreground shadow-[inset_0_1px_0_color-mix(in_oklab,var(--foreground)_4%,transparent)] hover:border-border hover:bg-accent/70 hover:text-accent-foreground", secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", + "border-border/60 bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/85", ghost: - "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + "border-transparent text-muted-foreground hover:border-border/60 hover:bg-accent/70 hover:text-accent-foreground dark:hover:bg-accent/60", link: "text-primary underline-offset-4 hover:underline", }, size: { diff --git a/frontend/src/components/ui/card.tsx b/frontend/src/components/ui/card.tsx index f62edea5..a9d895cf 100644 --- a/frontend/src/components/ui/card.tsx +++ b/frontend/src/components/ui/card.tsx @@ -9,7 +9,7 @@ const Card = React.forwardRef<
{copied ? ( - + ) : ( - + )} ) diff --git a/frontend/src/components/ui/delete-dialog.tsx b/frontend/src/components/ui/delete-dialog.tsx index b2c05db2..2f62cb69 100644 --- a/frontend/src/components/ui/delete-dialog.tsx +++ b/frontend/src/components/ui/delete-dialog.tsx @@ -51,7 +51,6 @@ export function DeleteDialog({ variant="destructive" onClick={onConfirm} disabled={isDeleting} - className="bg-red-600 hover:bg-red-700 text-white font-semibold border-red-600" > {isDeleting && 'Deleting...'} {!isDeleting && (title.includes('Configuration') ? 'Delete Configuration' : 'Delete')} diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx index c7fbc065..799fbb13 100644 --- a/frontend/src/components/ui/dialog.tsx +++ b/frontend/src/components/ui/dialog.tsx @@ -16,12 +16,13 @@ const DialogOverlay = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( - )) @@ -46,15 +47,16 @@ const DialogContent = React.forwardRef< {!fullscreen && } {isDiscarding && 'Discarding...'} {!isDiscarding && 'Discard'} diff --git a/frontend/src/components/ui/drawer.tsx b/frontend/src/components/ui/drawer.tsx new file mode 100644 index 00000000..f69f2f0c --- /dev/null +++ b/frontend/src/components/ui/drawer.tsx @@ -0,0 +1,87 @@ +"use client" + +import * as React from "react" +import { Drawer as DrawerPrimitive } from "vaul" + +import { cn } from "@/lib/utils" + +function Drawer({ + shouldScaleBackground = true, + ...props +}: React.ComponentProps) { + return +} + +const DrawerTrigger = DrawerPrimitive.Trigger +const DrawerPortal = DrawerPrimitive.Portal +const DrawerClose = DrawerPrimitive.Close + +const DrawerOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName + +const DrawerContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + +
+ {children} + + +)) +DrawerContent.displayName = DrawerPrimitive.Content.displayName + +function DrawerHeader({ className, ...props }: React.ComponentProps<"div">) { + return
+} + +function DrawerFooter({ className, ...props }: React.ComponentProps<"div">) { + return
+} + +const DrawerTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerTitle.displayName = DrawerPrimitive.Title.displayName + +const DrawerDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerDescription.displayName = DrawerPrimitive.Description.displayName + +export { + Drawer, + DrawerPortal, + DrawerOverlay, + DrawerTrigger, + DrawerClose, + DrawerContent, + DrawerHeader, + DrawerFooter, + DrawerTitle, + DrawerDescription, +} diff --git a/frontend/src/components/ui/header.tsx b/frontend/src/components/ui/header.tsx index bd79501f..9121fdd5 100644 --- a/frontend/src/components/ui/header.tsx +++ b/frontend/src/components/ui/header.tsx @@ -50,7 +50,7 @@ function HeaderTitle({ children, logo, className }: HeaderTitleProps) { className="h-6 w-auto sm:h-8" /> ) : ( -

+

{children}

)} @@ -150,7 +150,7 @@ function HeaderEditableTitle({ value, onChange, subtitle, generating, className
) : (

{value} @@ -193,23 +193,23 @@ function HeaderMobileDropdown({ children, className }: { children: ReactNode; cl {totalPending > 0 ? ( <> - + ) : ( )} - - {permissionCount > 0 && ( - { navigateToPermission(); setShowDialog(true); }} className="gap-2"> - + + {permissionCount > 0 && ( + { navigateToPermission(); setShowDialog(true); }} className="gap-2"> + {permissionCount} pending permission{permissionCount > 1 ? 's' : ''} )} {questionCount > 0 && ( - + {questionCount} pending question{questionCount > 1 ? 's' : ''} )} @@ -254,4 +254,4 @@ export const Header = Object.assign(HeaderBase, { Actions: typeof HeaderActions; MobileDropdown: typeof HeaderMobileDropdown; Settings: typeof HeaderSettingsButton; -}; \ No newline at end of file +}; diff --git a/frontend/src/components/ui/input.tsx b/frontend/src/components/ui/input.tsx index 267cead0..ed90e543 100644 --- a/frontend/src/components/ui/input.tsx +++ b/frontend/src/components/ui/input.tsx @@ -8,7 +8,7 @@ const Input = React.forwardRef>( 0.8) return 'bg-amber-500' - if (intensity > 0.5) return 'bg-amber-500/70' - if (intensity > 0.2) return 'bg-amber-500/40' - return 'bg-amber-500/20' + if (intensity > 0.8) return 'bg-warning' + if (intensity > 0.5) return 'bg-warning/70' + if (intensity > 0.2) return 'bg-warning/40' + return 'bg-warning/20' } if (statusType === 'compact') { - if (intensity > 0.8) return 'bg-purple-500' - if (intensity > 0.5) return 'bg-purple-500/70' - if (intensity > 0.2) return 'bg-purple-500/40' - return 'bg-purple-500/20' + if (intensity > 0.8) return 'bg-chart-4' + if (intensity > 0.5) return 'bg-chart-4/70' + if (intensity > 0.2) return 'bg-chart-4/40' + return 'bg-chart-4/20' } - if (intensity > 0.8) return 'bg-blue-500' - if (intensity > 0.5) return 'bg-blue-500/70' - if (intensity > 0.2) return 'bg-blue-500/40' - return 'bg-blue-500/20' + if (intensity > 0.8) return 'bg-primary' + if (intensity > 0.5) return 'bg-primary/70' + if (intensity > 0.2) return 'bg-primary/40' + return 'bg-primary/20' } return ( @@ -86,4 +86,4 @@ export const MiniScanner = memo(function MiniScanner({

) -}) \ No newline at end of file +}) diff --git a/frontend/src/components/ui/page-header.test.tsx b/frontend/src/components/ui/page-header.test.tsx index 509bc35f..3cfbddd3 100644 --- a/frontend/src/components/ui/page-header.test.tsx +++ b/frontend/src/components/ui/page-header.test.tsx @@ -56,13 +56,13 @@ describe("PageHeader", () => { render(Content); const header = screen.getByTestId("header"); expect(header).toHaveClass("border-b"); - expect(header).toHaveClass("border-border"); - expect(header).toHaveClass("bg-gradient-to-b"); + expect(header).toHaveClass("border-border/60"); + expect(header).toHaveClass("bg-background/90"); }); - it("applies backdrop-blur-sm for frosted glass effect", () => { + it("applies backdrop-blur-xl for frosted glass effect", () => { render(Content); const header = screen.getByTestId("header"); - expect(header).toHaveClass("backdrop-blur-sm"); + expect(header).toHaveClass("backdrop-blur-xl"); }); }); diff --git a/frontend/src/components/ui/page-header.tsx b/frontend/src/components/ui/page-header.tsx index beeb7194..87e9e975 100644 --- a/frontend/src/components/ui/page-header.tsx +++ b/frontend/src/components/ui/page-header.tsx @@ -1,8 +1,9 @@ -import * as React from "react"; -import { cn } from "@/lib/utils"; +import * as React from 'react' + +import { cn } from '@/lib/utils' export interface PageHeaderProps extends React.HTMLAttributes { - children: React.ReactNode; + children: React.ReactNode } export const PageHeader = React.forwardRef( @@ -11,15 +12,15 @@ export const PageHeader = React.forwardRef(
{children}
- ); + ) } -); +) -PageHeader.displayName = "PageHeader"; +PageHeader.displayName = 'PageHeader' diff --git a/frontend/src/components/ui/pending-action-badge.tsx b/frontend/src/components/ui/pending-action-badge.tsx index bed65aa8..4c858bf9 100644 --- a/frontend/src/components/ui/pending-action-badge.tsx +++ b/frontend/src/components/ui/pending-action-badge.tsx @@ -2,18 +2,18 @@ import { type LucideIcon } from 'lucide-react' import { Button } from './button' import { cn } from '@/lib/utils' -type BadgeColor = 'orange' | 'blue' +type BadgeColor = 'warning' | 'info' const colorStyles: Record = { - orange: { - bg: 'bg-orange-500/10', - hover: 'hover:bg-orange-500/20', - text: 'text-orange-500', + warning: { + bg: 'bg-warning/10', + hover: 'hover:bg-warning/18', + text: 'text-warning', }, - blue: { - bg: 'bg-blue-500/10', - hover: 'hover:bg-blue-500/20', - text: 'text-blue-500', + info: { + bg: 'bg-info/10', + hover: 'hover:bg-info/18', + text: 'text-info', }, } @@ -53,12 +53,12 @@ export function PendingActionBadge({ title={`${count} pending ${label}${count > 1 ? 's' : ''}`} > - - + + ) } diff --git a/frontend/src/components/ui/resizable.tsx b/frontend/src/components/ui/resizable.tsx new file mode 100644 index 00000000..7ccbf97a --- /dev/null +++ b/frontend/src/components/ui/resizable.tsx @@ -0,0 +1,45 @@ +"use client" + +import { GripVertical } from "lucide-react" +import * as ResizablePrimitive from "react-resizable-panels" + +import { cn } from "@/lib/utils" + +function ResizablePanelGroup({ className, ...props }: React.ComponentProps) { + return ( + + ) +} + +const ResizablePanel = ResizablePrimitive.Panel + +function ResizableHandle({ + withHandle, + className, + ...props +}: React.ComponentProps & { + withHandle?: boolean +}) { + return ( + + {withHandle && ( +
+ +
+ )} +
+ ) +} + +export { ResizablePanelGroup, ResizablePanel, ResizableHandle } diff --git a/frontend/src/components/ui/select.tsx b/frontend/src/components/ui/select.tsx index 67075a8c..b4bfd527 100644 --- a/frontend/src/components/ui/select.tsx +++ b/frontend/src/components/ui/select.tsx @@ -16,12 +16,12 @@ const SelectTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - span]:line-clamp-1 md:text-sm", - className - )} + span]:line-clamp-1 md:text-sm", + className + )} {...props} > {children} @@ -72,13 +72,13 @@ const SelectContent = React.forwardRef< React.ComponentPropsWithoutRef >(({ className, children, position = "popper", ...props }, ref) => ( - , React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - diff --git a/frontend/src/components/ui/session-status-indicator.tsx b/frontend/src/components/ui/session-status-indicator.tsx index cf1c89ae..4ad4aaa9 100644 --- a/frontend/src/components/ui/session-status-indicator.tsx +++ b/frontend/src/components/ui/session-status-indicator.tsx @@ -73,23 +73,23 @@ export const SessionStatusIndicator = memo(function SessionStatusIndicator({ const intensity = Math.max(0, 1 - distance / (maxDistance + 2)) if (statusType === 'retry') { - if (intensity > 0.8) return 'bg-amber-500' - if (intensity > 0.5) return 'bg-amber-500/70' - if (intensity > 0.2) return 'bg-amber-500/40' - return 'bg-amber-500/20' + if (intensity > 0.8) return 'bg-warning' + if (intensity > 0.5) return 'bg-warning/70' + if (intensity > 0.2) return 'bg-warning/40' + return 'bg-warning/20' } if (statusType === 'compact') { - if (intensity > 0.8) return 'bg-purple-500' - if (intensity > 0.5) return 'bg-purple-500/70' - if (intensity > 0.2) return 'bg-purple-500/40' - return 'bg-purple-500/20' + if (intensity > 0.8) return 'bg-chart-4' + if (intensity > 0.5) return 'bg-chart-4/70' + if (intensity > 0.2) return 'bg-chart-4/40' + return 'bg-chart-4/20' } - if (intensity > 0.8) return 'bg-blue-500' - if (intensity > 0.5) return 'bg-blue-500/70' - if (intensity > 0.2) return 'bg-blue-500/40' - return 'bg-blue-500/20' + if (intensity > 0.8) return 'bg-primary' + if (intensity > 0.5) return 'bg-primary/70' + if (intensity > 0.2) return 'bg-primary/40' + return 'bg-primary/20' } return ( @@ -106,7 +106,7 @@ export const SessionStatusIndicator = memo(function SessionStatusIndicator({ {status.type === 'retry' && ( <> Retry #{status.attempt} - {retryCountdown > 0 && ({retryCountdown}s)} + {retryCountdown > 0 && ({retryCountdown}s)} )} @@ -141,7 +141,7 @@ export const CompactStatusIndicator = memo(function CompactStatusIndicator({ } const pulseFrames = ['●', '◐', '○', '◑', '●', '◐', '○', '◑'] - const color = status.type === 'retry' ? 'text-amber-500' : status.type === 'compact' ? 'text-purple-500' : 'text-blue-500' + const color = status.type === 'retry' ? 'text-warning' : status.type === 'compact' ? 'text-chart-4' : 'text-primary' return ( diff --git a/frontend/src/components/ui/switch.tsx b/frontend/src/components/ui/switch.tsx index a16c1ef8..6f1124cd 100644 --- a/frontend/src/components/ui/switch.tsx +++ b/frontend/src/components/ui/switch.tsx @@ -8,17 +8,15 @@ const Switch = React.forwardRef< React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) diff --git a/frontend/src/components/ui/tabs.tsx b/frontend/src/components/ui/tabs.tsx index a1e3f965..d7563fd6 100644 --- a/frontend/src/components/ui/tabs.tsx +++ b/frontend/src/components/ui/tabs.tsx @@ -14,7 +14,7 @@ const TabsList = React.forwardRef< onLineChange(lineNum, e.target.value)} className={`flex-1 bg-transparent outline-none pl-2 text-[16px] md:text-sm ${ - isEdited ? 'bg-yellow-500/10' : '' + isEdited ? 'bg-warning/10' : '' } ${ lineWrap ? 'whitespace-pre-wrap break-all' : 'whitespace-pre' }`} diff --git a/frontend/src/hooks/useTheme.ts b/frontend/src/hooks/useTheme.ts index f152d73a..20356736 100644 --- a/frontend/src/hooks/useTheme.ts +++ b/frontend/src/hooks/useTheme.ts @@ -1,4 +1,7 @@ import { useEffect, useState } from 'react' + +import { DEFAULT_THEME_PRESET, getAppThemeVariables } from '@/lib/opencodeThemes' + import { useSettings } from './useSettings' export function useTheme() { @@ -7,29 +10,38 @@ export function useTheme() { useEffect(() => { const theme = preferences?.theme || 'dark' + const themePreset = preferences?.themePreset || DEFAULT_THEME_PRESET const root = document.documentElement - const applyTheme = (isDark: boolean) => { + const applyTheme = (mode: 'light' | 'dark') => { + const isDark = mode === 'dark' + if (isDark) { root.classList.add('dark') - setCurrentTheme('dark') } else { root.classList.remove('dark') - setCurrentTheme('light') } + + Object.entries(getAppThemeVariables(themePreset, mode)).forEach(([name, value]) => { + root.style.setProperty(name, value) + }) + + root.dataset.themePreset = themePreset + root.dataset.colorScheme = mode + setCurrentTheme(mode) } if (theme === 'system') { const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)') - applyTheme(mediaQuery.matches) + applyTheme(mediaQuery.matches ? 'dark' : 'light') - const listener = (e: MediaQueryListEvent) => applyTheme(e.matches) + const listener = (e: MediaQueryListEvent) => applyTheme(e.matches ? 'dark' : 'light') mediaQuery.addEventListener('change', listener) return () => mediaQuery.removeEventListener('change', listener) } else { - applyTheme(theme === 'dark') + applyTheme(theme === 'dark' ? 'dark' : 'light') } - }, [preferences?.theme]) + }, [preferences?.theme, preferences?.themePreset]) return currentTheme } diff --git a/frontend/src/index.css b/frontend/src/index.css index 7dc955c7..985eaf63 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,58 +1,233 @@ @import "tailwindcss"; -@theme { - --color-background: #0a0a0a; - --color-foreground: #fafafa; - --color-card: #141414; - --color-card-hover: #1a1a1a; - --color-border: #2a2a2a; - --color-primary: #1d4ed8; - --color-primary-hover: #1e40af; - --color-primary-foreground: #fafafa; - --color-muted-foreground: #d4d4d8; - --color-accent: #27272a; - --color-input: #27272a; - --color-muted: #18181b; - --color-popover: #18181b; - --color-destructive: #dc2626; - --color-secondary: #27272a; - --color-secondary-foreground: #fafafa; - --color-accent-foreground: #fafafa; +@theme inline { + --font-sans: "Berkeley Mono", "IBM Plex Mono", "SFMono-Regular", "SF Mono", Menlo, Monaco, Consolas, monospace; + --font-mono: "Berkeley Mono", "IBM Plex Mono", "SFMono-Regular", "SF Mono", Menlo, Monaco, Consolas, monospace; + --radius-sm: calc(var(--radius) - 0.25rem); + --radius-md: calc(var(--radius) - 0.125rem); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 0.25rem); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-hover: var(--card-hover); + --color-card-foreground: var(--card-foreground); + --color-panel: var(--panel); + --color-panel-foreground: var(--panel-foreground); + --color-panel-border: var(--panel-border); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-hover: var(--primary-hover); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-info: var(--info); + --color-info-foreground: var(--info-foreground); + --color-success: var(--success); + --color-success-foreground: var(--success-foreground); + --color-warning: var(--warning); + --color-warning-foreground: var(--warning-foreground); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); +} + +:root { + --radius: 0.5rem; + --background: #0a0a0a; + --foreground: #eeeeee; + --card: #141414; + --card-hover: #1e1e1e; + --card-foreground: #eeeeee; + --panel: #1e1e1e; + --panel-foreground: #eeeeee; + --panel-border: #3c3c3c; + --popover: #141414; + --popover-foreground: #eeeeee; + --primary: #fab283; + --primary-hover: #ffc09f; + --primary-foreground: #0a0a0a; + --secondary: #262626; + --secondary-foreground: #eeeeee; + --muted: #141414; + --muted-foreground: #808080; + --accent: #1e1e1e; + --accent-foreground: #eeeeee; + --destructive: #e06c75; + --destructive-foreground: #fcfcfc; + --border: #484848; + --input: #1e1e1e; + --ring: rgb(250 178 131 / 0.32); + --info: #56b6c2; + --info-foreground: #0a0a0a; + --success: #7fd88f; + --success-foreground: #0a0a0a; + --warning: #f5a742; + --warning-foreground: #0a0a0a; + --sidebar: #141414; + --sidebar-foreground: #eeeeee; + --sidebar-primary: #fab283; + --sidebar-primary-foreground: #0a0a0a; + --sidebar-accent: #1e1e1e; + --sidebar-accent-foreground: #eeeeee; + --sidebar-border: #3c3c3c; + --sidebar-ring: rgb(250 178 131 / 0.32); + --chart-1: #fab283; + --chart-2: #7fd88f; + --chart-3: #f5a742; + --chart-4: #5c9cf5; + --chart-5: #56b6c2; + --scrollbar-track: transparent; + --scrollbar-thumb: #3c3c3c; + --scrollbar-thumb-hover: #606060; + --diff-added: #4fd6be; + --diff-added-bg: #20303b; + --diff-removed: #c53b53; + --diff-removed-bg: #37222c; + --diff-context: #828bb8; + --diff-context-bg: #141414; + --diff-line-number: #1e1e1e; + --diff-added-line-number-bg: #1b2b34; + --diff-removed-line-number-bg: #2d1f26; + --markdown-text: #eeeeee; + --markdown-heading: #9d7cd8; + --markdown-link: #fab283; + --markdown-link-text: #56b6c2; + --markdown-code: #7fd88f; + --markdown-block-quote: #e5c07b; + --markdown-emph: #e5c07b; + --markdown-strong: #f5a742; + --markdown-rule: #808080; + --markdown-list-item: #fab283; + --markdown-list-enumeration: #56b6c2; + --markdown-image: #fab283; + --markdown-image-text: #56b6c2; + --markdown-code-block: #eeeeee; + --syntax-comment: #808080; + --syntax-keyword: #9d7cd8; + --syntax-function: #fab283; + --syntax-variable: #e06c75; + --syntax-string: #7fd88f; + --syntax-number: #f5a742; + --syntax-type: #e5c07b; + --syntax-operator: #56b6c2; + --syntax-punctuation: #eeeeee; + color-scheme: dark; } :root:not(.dark) { - --color-background: #ffffff; - --color-foreground: #111827; - --color-card: #f9fafb; - --color-card-hover: #f3f4f6; - --color-border: #e5e7eb; - --color-primary: #1d4ed8; - --color-primary-hover: #1e40af; - --color-primary-foreground: #ffffff; - --color-muted-foreground: #6b7280; - --color-accent: #f3f4f6; - --color-input: #e5e7eb; - --color-muted: #f4f4f5; - --color-popover: #ffffff; - --color-destructive: #dc2626; - --color-secondary: #f4f4f5; - --color-secondary-foreground: #111827; - --color-accent-foreground: #111827; + --background: #ffffff; + --foreground: #1a1a1a; + --card: #fafafa; + --card-hover: #f5f5f5; + --card-foreground: #1a1a1a; + --panel: #f5f5f5; + --panel-foreground: #1a1a1a; + --panel-border: #d4d4d4; + --popover: #fafafa; + --popover-foreground: #1a1a1a; + --primary: #3b7dd8; + --primary-hover: #2968c3; + --primary-foreground: #ffffff; + --secondary: #f0f0f0; + --secondary-foreground: #1a1a1a; + --muted: #fafafa; + --muted-foreground: #8a8a8a; + --accent: #ebebeb; + --accent-foreground: #1a1a1a; + --destructive: #d1383d; + --destructive-foreground: #ffffff; + --border: #b8b8b8; + --input: #f5f5f5; + --ring: rgb(59 125 216 / 0.24); + --info: #318795; + --info-foreground: #ffffff; + --success: #3d9a57; + --success-foreground: #ffffff; + --warning: #d68c27; + --warning-foreground: #ffffff; + --sidebar: #fafafa; + --sidebar-foreground: #1a1a1a; + --sidebar-primary: #3b7dd8; + --sidebar-primary-foreground: #ffffff; + --sidebar-accent: #f5f5f5; + --sidebar-accent-foreground: #1a1a1a; + --sidebar-border: #d4d4d4; + --sidebar-ring: rgb(59 125 216 / 0.24); + --chart-1: #3b7dd8; + --chart-2: #3d9a57; + --chart-3: #d68c27; + --chart-4: #7b5bb6; + --chart-5: #318795; + --scrollbar-track: transparent; + --scrollbar-thumb: #d4d4d4; + --scrollbar-thumb-hover: #a0a0a0; + --diff-added: #1e725c; + --diff-added-bg: #d5e5d5; + --diff-removed: #c53b53; + --diff-removed-bg: #f7d8db; + --diff-context: #7086b5; + --diff-context-bg: #fafafa; + --diff-line-number: #f5f5f5; + --diff-added-line-number-bg: #c5d5c5; + --diff-removed-line-number-bg: #e7c8cb; + --markdown-text: #1a1a1a; + --markdown-heading: #d68c27; + --markdown-link: #3b7dd8; + --markdown-link-text: #318795; + --markdown-code: #3d9a57; + --markdown-block-quote: #b0851f; + --markdown-emph: #b0851f; + --markdown-strong: #d68c27; + --markdown-rule: #8a8a8a; + --markdown-list-item: #3b7dd8; + --markdown-list-enumeration: #318795; + --markdown-image: #3b7dd8; + --markdown-image-text: #318795; + --markdown-code-block: #1a1a1a; + --syntax-comment: #8a8a8a; + --syntax-keyword: #d68c27; + --syntax-function: #3b7dd8; + --syntax-variable: #d1383d; + --syntax-string: #3d9a57; + --syntax-number: #d68c27; + --syntax-type: #b0851f; + --syntax-operator: #318795; + --syntax-punctuation: #1a1a1a; + color-scheme: light; } html { - background-color: #0a0a0a; + background-color: var(--background); min-height: calc(100% + env(safe-area-inset-top)); } -:root:not(.dark) html { - background-color: #ffffff; -} - body { - background: linear-gradient(to bottom right, #0a0a0a, #0d0d0d, #0a0a0a); - color: var(--color-foreground); - transition: background-color 0.3s ease, color 0.3s ease; + background: + linear-gradient(180deg, color-mix(in oklab, var(--background) 92%, var(--panel) 8%), var(--background)); + color: var(--foreground); + font-family: var(--font-sans); + transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease; min-height: 100vh; min-height: 100dvh; overflow: hidden; @@ -66,13 +241,65 @@ body { overflow: hidden; } -:root:not(.dark) body { - background: linear-gradient(to bottom right, #ffffff, #f0f0f0, #ffffff); - min-height: 100vh; - min-height: 100dvh; - overflow: hidden; - position: fixed; - width: 100%; +@layer base { + * { + @apply border-border outline-ring/50; + } + + body { + @apply bg-background text-foreground antialiased; + font-feature-settings: "liga" 0, "calt" 0; + } + + ::selection { + background: color-mix(in oklch, var(--primary) 26%, transparent); + color: var(--foreground); + } +} + +.surface-panel { + background: color-mix(in oklab, var(--card) 96%, transparent); + border: 1px solid color-mix(in oklab, var(--panel-border) 88%, transparent); + box-shadow: inset 0 1px 0 color-mix(in oklab, var(--foreground) 3%, transparent); +} + +.surface-panel-muted { + background: color-mix(in oklab, var(--panel) 92%, transparent); + border: 1px solid color-mix(in oklab, var(--panel-border) 68%, transparent); +} + +.heading-ink { + color: var(--foreground); +} + +.scrollbar-thin { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); + scrollbar-gutter: stable; +} + +.scrollbar-thin::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +.scrollbar-thin::-webkit-scrollbar-track { + background: var(--scrollbar-track); +} + +.scrollbar-thin::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-thumb); + border: 2px solid transparent; + border-radius: 0.5rem; + background-clip: padding-box; +} + +.scrollbar-thin::-webkit-scrollbar-thumb:hover { + background-color: var(--scrollbar-thumb-hover); +} + +.scrollbar-thin::-webkit-scrollbar-corner { + background: transparent; } /* Custom animations */ @@ -175,44 +402,31 @@ body { .prose-enhanced strong { font-weight: 600; - color: var(--color-foreground); + color: var(--markdown-strong); } .prose-enhanced a { - color: #60a5fa; + color: var(--markdown-link); text-decoration: none; } -.dark .prose-enhanced a { - color: #60a5fa; -} - .prose-enhanced a:hover { - color: #93c5fd; + color: color-mix(in oklab, var(--markdown-link) 80%, var(--foreground) 20%); text-decoration: underline; } .prose-enhanced hr { margin-top: 2em; margin-bottom: 2em; - border-color: #d0d0d0; -} - -.dark .prose-enhanced hr { - border-color: #3f3f46; + border-color: var(--color-border); } .prose-enhanced blockquote { margin-top: 1em; margin-bottom: 1em; padding-left: 1em; - border-left: 3px solid #d0d0d0; - color: #6b7280; -} - -.dark .prose-enhanced blockquote { - border-left: 3px solid #3f3f46; - color: #a1a1aa; + border-left: 3px solid var(--color-panel-border); + color: var(--markdown-block-quote); } .prose-enhanced pre { @@ -247,12 +461,12 @@ body { } .prose-enhanced th { - background-color: var(--color-accent); + background-color: color-mix(in oklab, var(--accent) 92%, transparent); font-weight: 600; } .prose-enhanced tr:nth-child(even) { - background-color: var(--color-accent); + background-color: color-mix(in oklab, var(--accent) 84%, transparent); } @media (max-width: 640px) { @@ -331,31 +545,7 @@ body { padding: 0.5em; background: var(--color-accent); color: var(--color-foreground); -} - } - -/* Custom scrollbar styling */ -.scrollbar-thin { - scrollbar-width: thin; - scrollbar-color: var(--color-border) transparent; -} - -.scrollbar-thin::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -.scrollbar-thin::-webkit-scrollbar-track { - background: transparent; -} - -.scrollbar-thin::-webkit-scrollbar-thumb { - background-color: var(--color-border); - border-radius: 3px; -} - -.scrollbar-thin::-webkit-scrollbar-thumb:hover { - background-color: var(--color-muted-foreground); + } } /* Progress bar animation for download dialog */ @@ -395,3 +585,14 @@ body { background-color: #7f1d1d; color: #fecaca; } + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + } +} diff --git a/frontend/src/lib/git-status-styles.ts b/frontend/src/lib/git-status-styles.ts index a98ffa9b..4fad8f6d 100644 --- a/frontend/src/lib/git-status-styles.ts +++ b/frontend/src/lib/git-status-styles.ts @@ -1,22 +1,22 @@ export const GIT_STATUS_COLORS = { - modified: 'text-amber-600 dark:text-amber-400', - added: 'text-emerald-600 dark:text-emerald-400', - deleted: 'text-rose-600 dark:text-rose-400', - renamed: 'text-blue-600 dark:text-blue-400', - untracked: 'text-gray-500 dark:text-gray-400', - copied: 'text-emerald-600 dark:text-emerald-400', + modified: 'text-warning', + added: 'text-success', + deleted: 'text-destructive', + renamed: 'text-info', + untracked: 'text-muted-foreground', + copied: 'text-success', } as const export const GIT_UI_COLORS = { - ahead: 'text-emerald-600 dark:text-emerald-400', - behind: 'text-amber-600 dark:text-amber-400', - current: 'text-emerald-600 dark:text-emerald-400', - remote: 'text-blue-600 dark:text-blue-400', - stage: 'text-emerald-600 dark:text-emerald-400', - unstage: 'text-rose-600 dark:text-rose-400', - stagedBadge: 'bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400', - unpushed: 'bg-blue-500/10 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400', - pushed: 'bg-purple-500/10 text-purple-600 dark:bg-purple-500/20 dark:text-purple-400', + ahead: 'text-success', + behind: 'text-warning', + current: 'text-success', + remote: 'text-info', + stage: 'text-success', + unstage: 'text-destructive', + stagedBadge: 'border border-success/20 bg-success/12 text-success', + unpushed: 'border border-info/20 bg-info/12 text-info', + pushed: 'border border-accent-foreground/10 bg-accent text-accent-foreground', } as const export const GIT_STATUS_LABELS = { diff --git a/frontend/src/lib/opencode-themes.json b/frontend/src/lib/opencode-themes.json new file mode 100644 index 00000000..3248e804 --- /dev/null +++ b/frontend/src/lib/opencode-themes.json @@ -0,0 +1,7408 @@ +{ + "aura": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg": "#0f0f0f", + "darkBgPanel": "#15141b", + "darkBorder": "#2d2d2d", + "darkFgMuted": "#6d6d6d", + "darkFg": "#edecee", + "purple": "#a277ff", + "pink": "#f694ff", + "blue": "#82e2ff", + "red": "#ff6767", + "orange": "#ffca85", + "cyan": "#61ffca", + "green": "#9dff65" + }, + "theme": { + "primary": "purple", + "secondary": "pink", + "accent": "purple", + "error": "red", + "warning": "orange", + "success": "cyan", + "info": "purple", + "text": "darkFg", + "textMuted": "darkFgMuted", + "background": "darkBg", + "backgroundPanel": "darkBgPanel", + "backgroundElement": "darkBgPanel", + "border": "darkBorder", + "borderActive": "darkFgMuted", + "borderSubtle": "darkBorder", + "diffAdded": "cyan", + "diffRemoved": "red", + "diffContext": "darkFgMuted", + "diffHunkHeader": "darkFgMuted", + "diffHighlightAdded": "cyan", + "diffHighlightRemoved": "red", + "diffAddedBg": "#354933", + "diffRemovedBg": "#3f191a", + "diffContextBg": "darkBgPanel", + "diffLineNumber": "darkBorder", + "diffAddedLineNumberBg": "#162620", + "diffRemovedLineNumberBg": "#26161a", + "markdownText": "darkFg", + "markdownHeading": "purple", + "markdownLink": "pink", + "markdownLinkText": "purple", + "markdownCode": "cyan", + "markdownBlockQuote": "darkFgMuted", + "markdownEmph": "orange", + "markdownStrong": "purple", + "markdownHorizontalRule": "darkFgMuted", + "markdownListItem": "purple", + "markdownListEnumeration": "purple", + "markdownImage": "pink", + "markdownImageText": "purple", + "markdownCodeBlock": "darkFg", + "syntaxComment": "darkFgMuted", + "syntaxKeyword": "pink", + "syntaxFunction": "purple", + "syntaxVariable": "purple", + "syntaxString": "cyan", + "syntaxNumber": "green", + "syntaxType": "purple", + "syntaxOperator": "pink", + "syntaxPunctuation": "darkFg" + } + }, + "ayu": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg": "#0B0E14", + "darkBgAlt": "#0D1017", + "darkLine": "#11151C", + "darkPanel": "#0F131A", + "darkFg": "#BFBDB6", + "darkFgMuted": "#565B66", + "darkGutter": "#6C7380", + "darkTag": "#39BAE6", + "darkFunc": "#FFB454", + "darkEntity": "#59C2FF", + "darkString": "#AAD94C", + "darkRegexp": "#95E6CB", + "darkMarkup": "#F07178", + "darkKeyword": "#FF8F40", + "darkSpecial": "#E6B673", + "darkComment": "#ACB6BF", + "darkConstant": "#D2A6FF", + "darkOperator": "#F29668", + "darkAdded": "#7FD962", + "darkRemoved": "#F26D78", + "darkAccent": "#E6B450", + "darkError": "#D95757", + "darkIndentActive": "#6C7380" + }, + "theme": { + "primary": "darkEntity", + "secondary": "darkConstant", + "accent": "darkAccent", + "error": "darkError", + "warning": "darkSpecial", + "success": "darkAdded", + "info": "darkTag", + "text": "darkFg", + "textMuted": "darkFgMuted", + "background": "darkBg", + "backgroundPanel": "darkPanel", + "backgroundElement": "darkBgAlt", + "border": "darkGutter", + "borderActive": "darkIndentActive", + "borderSubtle": "darkLine", + "diffAdded": "darkAdded", + "diffRemoved": "darkRemoved", + "diffContext": "darkComment", + "diffHunkHeader": "darkComment", + "diffHighlightAdded": "darkString", + "diffHighlightRemoved": "darkMarkup", + "diffAddedBg": "#20303b", + "diffRemovedBg": "#37222c", + "diffContextBg": "darkPanel", + "diffLineNumber": "darkGutter", + "diffAddedLineNumberBg": "#1b2b34", + "diffRemovedLineNumberBg": "#2d1f26", + "markdownText": "darkFg", + "markdownHeading": "darkConstant", + "markdownLink": "darkEntity", + "markdownLinkText": "darkTag", + "markdownCode": "darkString", + "markdownBlockQuote": "darkSpecial", + "markdownEmph": "darkSpecial", + "markdownStrong": "darkFunc", + "markdownHorizontalRule": "darkFgMuted", + "markdownListItem": "darkEntity", + "markdownListEnumeration": "darkTag", + "markdownImage": "darkEntity", + "markdownImageText": "darkTag", + "markdownCodeBlock": "darkFg", + "syntaxComment": "darkComment", + "syntaxKeyword": "darkKeyword", + "syntaxFunction": "darkFunc", + "syntaxVariable": "darkEntity", + "syntaxString": "darkString", + "syntaxNumber": "darkConstant", + "syntaxType": "darkSpecial", + "syntaxOperator": "darkOperator", + "syntaxPunctuation": "darkFg" + } + }, + "catppuccin": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "lightRosewater": "#dc8a78", + "lightFlamingo": "#dd7878", + "lightPink": "#ea76cb", + "lightMauve": "#8839ef", + "lightRed": "#d20f39", + "lightMaroon": "#e64553", + "lightPeach": "#fe640b", + "lightYellow": "#df8e1d", + "lightGreen": "#40a02b", + "lightTeal": "#179299", + "lightSky": "#04a5e5", + "lightSapphire": "#209fb5", + "lightBlue": "#1e66f5", + "lightLavender": "#7287fd", + "lightText": "#4c4f69", + "lightSubtext1": "#5c5f77", + "lightSubtext0": "#6c6f85", + "lightOverlay2": "#7c7f93", + "lightOverlay1": "#8c8fa1", + "lightOverlay0": "#9ca0b0", + "lightSurface2": "#acb0be", + "lightSurface1": "#bcc0cc", + "lightSurface0": "#ccd0da", + "lightBase": "#eff1f5", + "lightMantle": "#e6e9ef", + "lightCrust": "#dce0e8", + "darkRosewater": "#f5e0dc", + "darkFlamingo": "#f2cdcd", + "darkPink": "#f5c2e7", + "darkMauve": "#cba6f7", + "darkRed": "#f38ba8", + "darkMaroon": "#eba0ac", + "darkPeach": "#fab387", + "darkYellow": "#f9e2af", + "darkGreen": "#a6e3a1", + "darkTeal": "#94e2d5", + "darkSky": "#89dceb", + "darkSapphire": "#74c7ec", + "darkBlue": "#89b4fa", + "darkLavender": "#b4befe", + "darkText": "#cdd6f4", + "darkSubtext1": "#bac2de", + "darkSubtext0": "#a6adc8", + "darkOverlay2": "#9399b2", + "darkOverlay1": "#7f849c", + "darkOverlay0": "#6c7086", + "darkSurface2": "#585b70", + "darkSurface1": "#45475a", + "darkSurface0": "#313244", + "darkBase": "#1e1e2e", + "darkMantle": "#181825", + "darkCrust": "#11111b" + }, + "theme": { + "primary": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "secondary": { + "dark": "darkMauve", + "light": "lightMauve" + }, + "accent": { + "dark": "darkPink", + "light": "lightPink" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkTeal", + "light": "lightTeal" + }, + "text": { + "dark": "darkText", + "light": "lightText" + }, + "textMuted": { + "dark": "darkSubtext1", + "light": "lightSubtext1" + }, + "background": { + "dark": "darkBase", + "light": "lightBase" + }, + "backgroundPanel": { + "dark": "darkMantle", + "light": "lightMantle" + }, + "backgroundElement": { + "dark": "darkCrust", + "light": "lightCrust" + }, + "border": { + "dark": "darkSurface0", + "light": "lightSurface0" + }, + "borderActive": { + "dark": "darkSurface1", + "light": "lightSurface1" + }, + "borderSubtle": { + "dark": "darkSurface2", + "light": "lightSurface2" + }, + "diffAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffContext": { + "dark": "darkOverlay2", + "light": "lightOverlay2" + }, + "diffHunkHeader": { + "dark": "darkPeach", + "light": "lightPeach" + }, + "diffHighlightAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffHighlightRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffAddedBg": { + "dark": "#24312b", + "light": "#d6f0d9" + }, + "diffRemovedBg": { + "dark": "#3c2a32", + "light": "#f6dfe2" + }, + "diffContextBg": { + "dark": "darkMantle", + "light": "lightMantle" + }, + "diffLineNumber": { + "dark": "darkSurface1", + "light": "lightSurface1" + }, + "diffAddedLineNumberBg": { + "dark": "#1e2a25", + "light": "#c9e3cb" + }, + "diffRemovedLineNumberBg": { + "dark": "#32232a", + "light": "#e9d3d6" + }, + "markdownText": { + "dark": "darkText", + "light": "lightText" + }, + "markdownHeading": { + "dark": "darkMauve", + "light": "lightMauve" + }, + "markdownLink": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownLinkText": { + "dark": "darkSky", + "light": "lightSky" + }, + "markdownCode": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkPeach", + "light": "lightPeach" + }, + "markdownHorizontalRule": { + "dark": "darkSubtext0", + "light": "lightSubtext0" + }, + "markdownListItem": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownListEnumeration": { + "dark": "darkSky", + "light": "lightSky" + }, + "markdownImage": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownImageText": { + "dark": "darkSky", + "light": "lightSky" + }, + "markdownCodeBlock": { + "dark": "darkText", + "light": "lightText" + }, + "syntaxComment": { + "dark": "darkOverlay2", + "light": "lightOverlay2" + }, + "syntaxKeyword": { + "dark": "darkMauve", + "light": "lightMauve" + }, + "syntaxFunction": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "syntaxVariable": { + "dark": "darkRed", + "light": "lightRed" + }, + "syntaxString": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "syntaxNumber": { + "dark": "darkPeach", + "light": "lightPeach" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkSky", + "light": "lightSky" + }, + "syntaxPunctuation": { + "dark": "darkText", + "light": "lightText" + } + } + }, + "catppuccin-frappe": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "frappeRosewater": "#f2d5cf", + "frappeFlamingo": "#eebebe", + "frappePink": "#f4b8e4", + "frappeMauve": "#ca9ee6", + "frappeRed": "#e78284", + "frappeMaroon": "#ea999c", + "frappePeach": "#ef9f76", + "frappeYellow": "#e5c890", + "frappeGreen": "#a6d189", + "frappeTeal": "#81c8be", + "frappeSky": "#99d1db", + "frappeSapphire": "#85c1dc", + "frappeBlue": "#8da4e2", + "frappeLavender": "#babbf1", + "frappeText": "#c6d0f5", + "frappeSubtext1": "#b5bfe2", + "frappeSubtext0": "#a5adce", + "frappeOverlay2": "#949cb8", + "frappeOverlay1": "#838ba7", + "frappeOverlay0": "#737994", + "frappeSurface2": "#626880", + "frappeSurface1": "#51576d", + "frappeSurface0": "#414559", + "frappeBase": "#303446", + "frappeMantle": "#292c3c", + "frappeCrust": "#232634" + }, + "theme": { + "primary": { + "dark": "frappeBlue", + "light": "frappeBlue" + }, + "secondary": { + "dark": "frappeMauve", + "light": "frappeMauve" + }, + "accent": { + "dark": "frappePink", + "light": "frappePink" + }, + "error": { + "dark": "frappeRed", + "light": "frappeRed" + }, + "warning": { + "dark": "frappeYellow", + "light": "frappeYellow" + }, + "success": { + "dark": "frappeGreen", + "light": "frappeGreen" + }, + "info": { + "dark": "frappeTeal", + "light": "frappeTeal" + }, + "text": { + "dark": "frappeText", + "light": "frappeText" + }, + "textMuted": { + "dark": "frappeSubtext1", + "light": "frappeSubtext1" + }, + "background": { + "dark": "frappeBase", + "light": "frappeBase" + }, + "backgroundPanel": { + "dark": "frappeMantle", + "light": "frappeMantle" + }, + "backgroundElement": { + "dark": "frappeCrust", + "light": "frappeCrust" + }, + "border": { + "dark": "frappeSurface0", + "light": "frappeSurface0" + }, + "borderActive": { + "dark": "frappeSurface1", + "light": "frappeSurface1" + }, + "borderSubtle": { + "dark": "frappeSurface2", + "light": "frappeSurface2" + }, + "diffAdded": { + "dark": "frappeGreen", + "light": "frappeGreen" + }, + "diffRemoved": { + "dark": "frappeRed", + "light": "frappeRed" + }, + "diffContext": { + "dark": "frappeOverlay2", + "light": "frappeOverlay2" + }, + "diffHunkHeader": { + "dark": "frappePeach", + "light": "frappePeach" + }, + "diffHighlightAdded": { + "dark": "frappeGreen", + "light": "frappeGreen" + }, + "diffHighlightRemoved": { + "dark": "frappeRed", + "light": "frappeRed" + }, + "diffAddedBg": { + "dark": "#29342b", + "light": "#29342b" + }, + "diffRemovedBg": { + "dark": "#3a2a31", + "light": "#3a2a31" + }, + "diffContextBg": { + "dark": "frappeMantle", + "light": "frappeMantle" + }, + "diffLineNumber": { + "dark": "frappeSurface1", + "light": "frappeSurface1" + }, + "diffAddedLineNumberBg": { + "dark": "#223025", + "light": "#223025" + }, + "diffRemovedLineNumberBg": { + "dark": "#2f242b", + "light": "#2f242b" + }, + "markdownText": { + "dark": "frappeText", + "light": "frappeText" + }, + "markdownHeading": { + "dark": "frappeMauve", + "light": "frappeMauve" + }, + "markdownLink": { + "dark": "frappeBlue", + "light": "frappeBlue" + }, + "markdownLinkText": { + "dark": "frappeSky", + "light": "frappeSky" + }, + "markdownCode": { + "dark": "frappeGreen", + "light": "frappeGreen" + }, + "markdownBlockQuote": { + "dark": "frappeYellow", + "light": "frappeYellow" + }, + "markdownEmph": { + "dark": "frappeYellow", + "light": "frappeYellow" + }, + "markdownStrong": { + "dark": "frappePeach", + "light": "frappePeach" + }, + "markdownHorizontalRule": { + "dark": "frappeSubtext0", + "light": "frappeSubtext0" + }, + "markdownListItem": { + "dark": "frappeBlue", + "light": "frappeBlue" + }, + "markdownListEnumeration": { + "dark": "frappeSky", + "light": "frappeSky" + }, + "markdownImage": { + "dark": "frappeBlue", + "light": "frappeBlue" + }, + "markdownImageText": { + "dark": "frappeSky", + "light": "frappeSky" + }, + "markdownCodeBlock": { + "dark": "frappeText", + "light": "frappeText" + }, + "syntaxComment": { + "dark": "frappeOverlay2", + "light": "frappeOverlay2" + }, + "syntaxKeyword": { + "dark": "frappeMauve", + "light": "frappeMauve" + }, + "syntaxFunction": { + "dark": "frappeBlue", + "light": "frappeBlue" + }, + "syntaxVariable": { + "dark": "frappeRed", + "light": "frappeRed" + }, + "syntaxString": { + "dark": "frappeGreen", + "light": "frappeGreen" + }, + "syntaxNumber": { + "dark": "frappePeach", + "light": "frappePeach" + }, + "syntaxType": { + "dark": "frappeYellow", + "light": "frappeYellow" + }, + "syntaxOperator": { + "dark": "frappeSky", + "light": "frappeSky" + }, + "syntaxPunctuation": { + "dark": "frappeText", + "light": "frappeText" + } + } + }, + "catppuccin-macchiato": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "macRosewater": "#f4dbd6", + "macFlamingo": "#f0c6c6", + "macPink": "#f5bde6", + "macMauve": "#c6a0f6", + "macRed": "#ed8796", + "macMaroon": "#ee99a0", + "macPeach": "#f5a97f", + "macYellow": "#eed49f", + "macGreen": "#a6da95", + "macTeal": "#8bd5ca", + "macSky": "#91d7e3", + "macSapphire": "#7dc4e4", + "macBlue": "#8aadf4", + "macLavender": "#b7bdf8", + "macText": "#cad3f5", + "macSubtext1": "#b8c0e0", + "macSubtext0": "#a5adcb", + "macOverlay2": "#939ab7", + "macOverlay1": "#8087a2", + "macOverlay0": "#6e738d", + "macSurface2": "#5b6078", + "macSurface1": "#494d64", + "macSurface0": "#363a4f", + "macBase": "#24273a", + "macMantle": "#1e2030", + "macCrust": "#181926" + }, + "theme": { + "primary": { + "dark": "macBlue", + "light": "macBlue" + }, + "secondary": { + "dark": "macMauve", + "light": "macMauve" + }, + "accent": { + "dark": "macPink", + "light": "macPink" + }, + "error": { + "dark": "macRed", + "light": "macRed" + }, + "warning": { + "dark": "macYellow", + "light": "macYellow" + }, + "success": { + "dark": "macGreen", + "light": "macGreen" + }, + "info": { + "dark": "macTeal", + "light": "macTeal" + }, + "text": { + "dark": "macText", + "light": "macText" + }, + "textMuted": { + "dark": "macSubtext1", + "light": "macSubtext1" + }, + "background": { + "dark": "macBase", + "light": "macBase" + }, + "backgroundPanel": { + "dark": "macMantle", + "light": "macMantle" + }, + "backgroundElement": { + "dark": "macCrust", + "light": "macCrust" + }, + "border": { + "dark": "macSurface0", + "light": "macSurface0" + }, + "borderActive": { + "dark": "macSurface1", + "light": "macSurface1" + }, + "borderSubtle": { + "dark": "macSurface2", + "light": "macSurface2" + }, + "diffAdded": { + "dark": "macGreen", + "light": "macGreen" + }, + "diffRemoved": { + "dark": "macRed", + "light": "macRed" + }, + "diffContext": { + "dark": "macOverlay2", + "light": "macOverlay2" + }, + "diffHunkHeader": { + "dark": "macPeach", + "light": "macPeach" + }, + "diffHighlightAdded": { + "dark": "macGreen", + "light": "macGreen" + }, + "diffHighlightRemoved": { + "dark": "macRed", + "light": "macRed" + }, + "diffAddedBg": { + "dark": "#29342b", + "light": "#29342b" + }, + "diffRemovedBg": { + "dark": "#3a2a31", + "light": "#3a2a31" + }, + "diffContextBg": { + "dark": "macMantle", + "light": "macMantle" + }, + "diffLineNumber": { + "dark": "macSurface1", + "light": "macSurface1" + }, + "diffAddedLineNumberBg": { + "dark": "#223025", + "light": "#223025" + }, + "diffRemovedLineNumberBg": { + "dark": "#2f242b", + "light": "#2f242b" + }, + "markdownText": { + "dark": "macText", + "light": "macText" + }, + "markdownHeading": { + "dark": "macMauve", + "light": "macMauve" + }, + "markdownLink": { + "dark": "macBlue", + "light": "macBlue" + }, + "markdownLinkText": { + "dark": "macSky", + "light": "macSky" + }, + "markdownCode": { + "dark": "macGreen", + "light": "macGreen" + }, + "markdownBlockQuote": { + "dark": "macYellow", + "light": "macYellow" + }, + "markdownEmph": { + "dark": "macYellow", + "light": "macYellow" + }, + "markdownStrong": { + "dark": "macPeach", + "light": "macPeach" + }, + "markdownHorizontalRule": { + "dark": "macSubtext0", + "light": "macSubtext0" + }, + "markdownListItem": { + "dark": "macBlue", + "light": "macBlue" + }, + "markdownListEnumeration": { + "dark": "macSky", + "light": "macSky" + }, + "markdownImage": { + "dark": "macBlue", + "light": "macBlue" + }, + "markdownImageText": { + "dark": "macSky", + "light": "macSky" + }, + "markdownCodeBlock": { + "dark": "macText", + "light": "macText" + }, + "syntaxComment": { + "dark": "macOverlay2", + "light": "macOverlay2" + }, + "syntaxKeyword": { + "dark": "macMauve", + "light": "macMauve" + }, + "syntaxFunction": { + "dark": "macBlue", + "light": "macBlue" + }, + "syntaxVariable": { + "dark": "macRed", + "light": "macRed" + }, + "syntaxString": { + "dark": "macGreen", + "light": "macGreen" + }, + "syntaxNumber": { + "dark": "macPeach", + "light": "macPeach" + }, + "syntaxType": { + "dark": "macYellow", + "light": "macYellow" + }, + "syntaxOperator": { + "dark": "macSky", + "light": "macSky" + }, + "syntaxPunctuation": { + "dark": "macText", + "light": "macText" + } + } + }, + "cobalt2": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "background": "#193549", + "backgroundAlt": "#122738", + "backgroundPanel": "#1f4662", + "foreground": "#ffffff", + "foregroundMuted": "#adb7c9", + "yellow": "#ffc600", + "yellowBright": "#ffe14c", + "orange": "#ff9d00", + "orangeBright": "#ffb454", + "mint": "#2affdf", + "mintBright": "#7efff5", + "blue": "#0088ff", + "blueBright": "#5cb7ff", + "pink": "#ff628c", + "pinkBright": "#ff86a5", + "green": "#9eff80", + "greenBright": "#b9ff9f", + "purple": "#9a5feb", + "purpleBright": "#b88cfd", + "red": "#ff0088", + "redBright": "#ff5fb3" + }, + "theme": { + "primary": { + "dark": "blue", + "light": "#0066cc" + }, + "secondary": { + "dark": "purple", + "light": "#7c4dff" + }, + "accent": { + "dark": "mint", + "light": "#00acc1" + }, + "error": { + "dark": "red", + "light": "#e91e63" + }, + "warning": { + "dark": "yellow", + "light": "#ff9800" + }, + "success": { + "dark": "green", + "light": "#4caf50" + }, + "info": { + "dark": "orange", + "light": "#ff5722" + }, + "text": { + "dark": "foreground", + "light": "#193549" + }, + "textMuted": { + "dark": "foregroundMuted", + "light": "#5c6b7d" + }, + "background": { + "dark": "#193549", + "light": "#ffffff" + }, + "backgroundPanel": { + "dark": "#122738", + "light": "#f5f7fa" + }, + "backgroundElement": { + "dark": "#1f4662", + "light": "#e8ecf1" + }, + "border": { + "dark": "#1f4662", + "light": "#d3dae3" + }, + "borderActive": { + "dark": "blue", + "light": "#0066cc" + }, + "borderSubtle": { + "dark": "#0e1e2e", + "light": "#e8ecf1" + }, + "diffAdded": { + "dark": "green", + "light": "#4caf50" + }, + "diffRemoved": { + "dark": "red", + "light": "#e91e63" + }, + "diffContext": { + "dark": "foregroundMuted", + "light": "#5c6b7d" + }, + "diffHunkHeader": { + "dark": "mint", + "light": "#00acc1" + }, + "diffHighlightAdded": { + "dark": "greenBright", + "light": "#4caf50" + }, + "diffHighlightRemoved": { + "dark": "redBright", + "light": "#e91e63" + }, + "diffAddedBg": { + "dark": "#1a3a2a", + "light": "#e8f5e9" + }, + "diffRemovedBg": { + "dark": "#3a1a2a", + "light": "#ffebee" + }, + "diffContextBg": { + "dark": "#122738", + "light": "#f5f7fa" + }, + "diffLineNumber": { + "dark": "#2d5a7b", + "light": "#b0bec5" + }, + "diffAddedLineNumberBg": { + "dark": "#1a3a2a", + "light": "#e8f5e9" + }, + "diffRemovedLineNumberBg": { + "dark": "#3a1a2a", + "light": "#ffebee" + }, + "markdownText": { + "dark": "foreground", + "light": "#193549" + }, + "markdownHeading": { + "dark": "yellow", + "light": "#ff9800" + }, + "markdownLink": { + "dark": "blue", + "light": "#0066cc" + }, + "markdownLinkText": { + "dark": "mint", + "light": "#00acc1" + }, + "markdownCode": { + "dark": "green", + "light": "#4caf50" + }, + "markdownBlockQuote": { + "dark": "foregroundMuted", + "light": "#5c6b7d" + }, + "markdownEmph": { + "dark": "orange", + "light": "#ff5722" + }, + "markdownStrong": { + "dark": "pink", + "light": "#e91e63" + }, + "markdownHorizontalRule": { + "dark": "#2d5a7b", + "light": "#d3dae3" + }, + "markdownListItem": { + "dark": "blue", + "light": "#0066cc" + }, + "markdownListEnumeration": { + "dark": "mint", + "light": "#00acc1" + }, + "markdownImage": { + "dark": "blue", + "light": "#0066cc" + }, + "markdownImageText": { + "dark": "mint", + "light": "#00acc1" + }, + "markdownCodeBlock": { + "dark": "foreground", + "light": "#193549" + }, + "syntaxComment": { + "dark": "#0088ff", + "light": "#5c6b7d" + }, + "syntaxKeyword": { + "dark": "orange", + "light": "#ff5722" + }, + "syntaxFunction": { + "dark": "yellow", + "light": "#ff9800" + }, + "syntaxVariable": { + "dark": "foreground", + "light": "#193549" + }, + "syntaxString": { + "dark": "green", + "light": "#4caf50" + }, + "syntaxNumber": { + "dark": "pink", + "light": "#e91e63" + }, + "syntaxType": { + "dark": "mint", + "light": "#00acc1" + }, + "syntaxOperator": { + "dark": "orange", + "light": "#ff5722" + }, + "syntaxPunctuation": { + "dark": "foreground", + "light": "#193549" + } + } + }, + "cursor": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg": "#181818", + "darkPanel": "#141414", + "darkElement": "#262626", + "darkFg": "#e4e4e4", + "darkMuted": "#e4e4e45e", + "darkBorder": "#e4e4e413", + "darkBorderActive": "#e4e4e426", + "darkCyan": "#88c0d0", + "darkBlue": "#81a1c1", + "darkGreen": "#3fa266", + "darkGreenBright": "#70b489", + "darkRed": "#e34671", + "darkRedBright": "#fc6b83", + "darkYellow": "#f1b467", + "darkOrange": "#d2943e", + "darkPink": "#E394DC", + "darkPurple": "#AAA0FA", + "darkTeal": "#82D2CE", + "darkSyntaxYellow": "#F8C762", + "darkSyntaxOrange": "#EFB080", + "darkSyntaxGreen": "#A8CC7C", + "darkSyntaxBlue": "#87C3FF", + "lightBg": "#fcfcfc", + "lightPanel": "#f3f3f3", + "lightElement": "#ededed", + "lightFg": "#141414", + "lightMuted": "#141414ad", + "lightBorder": "#14141413", + "lightBorderActive": "#14141426", + "lightTeal": "#6f9ba6", + "lightBlue": "#3c7cab", + "lightBlueDark": "#206595", + "lightGreen": "#1f8a65", + "lightGreenBright": "#55a583", + "lightRed": "#cf2d56", + "lightRedBright": "#e75e78", + "lightOrange": "#db704b", + "lightYellow": "#c08532", + "lightPurple": "#9e94d5", + "lightPurpleDark": "#6049b3", + "lightPink": "#b8448b", + "lightMagenta": "#b3003f" + }, + "theme": { + "primary": { + "dark": "darkCyan", + "light": "lightTeal" + }, + "secondary": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "accent": { + "dark": "darkCyan", + "light": "lightTeal" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkYellow", + "light": "lightOrange" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "text": { + "dark": "darkFg", + "light": "lightFg" + }, + "textMuted": { + "dark": "darkMuted", + "light": "lightMuted" + }, + "background": { + "dark": "darkBg", + "light": "lightBg" + }, + "backgroundPanel": { + "dark": "darkPanel", + "light": "lightPanel" + }, + "backgroundElement": { + "dark": "darkElement", + "light": "lightElement" + }, + "border": { + "dark": "darkBorder", + "light": "lightBorder" + }, + "borderActive": { + "dark": "darkCyan", + "light": "lightTeal" + }, + "borderSubtle": { + "dark": "#0f0f0f", + "light": "#e0e0e0" + }, + "diffAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffContext": { + "dark": "darkMuted", + "light": "lightMuted" + }, + "diffHunkHeader": { + "dark": "darkMuted", + "light": "lightMuted" + }, + "diffHighlightAdded": { + "dark": "darkGreenBright", + "light": "lightGreenBright" + }, + "diffHighlightRemoved": { + "dark": "darkRedBright", + "light": "lightRedBright" + }, + "diffAddedBg": { + "dark": "#3fa26633", + "light": "#1f8a651f" + }, + "diffRemovedBg": { + "dark": "#b8004933", + "light": "#cf2d5614" + }, + "diffContextBg": { + "dark": "darkPanel", + "light": "lightPanel" + }, + "diffLineNumber": { + "dark": "#e4e4e442", + "light": "#1414147a" + }, + "diffAddedLineNumberBg": { + "dark": "#3fa26633", + "light": "#1f8a651f" + }, + "diffRemovedLineNumberBg": { + "dark": "#b8004933", + "light": "#cf2d5614" + }, + "markdownText": { + "dark": "darkFg", + "light": "lightFg" + }, + "markdownHeading": { + "dark": "darkPurple", + "light": "lightBlueDark" + }, + "markdownLink": { + "dark": "darkTeal", + "light": "lightBlueDark" + }, + "markdownLinkText": { + "dark": "darkBlue", + "light": "lightMuted" + }, + "markdownCode": { + "dark": "darkPink", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkMuted", + "light": "lightMuted" + }, + "markdownEmph": { + "dark": "darkTeal", + "light": "lightFg" + }, + "markdownStrong": { + "dark": "darkSyntaxYellow", + "light": "lightFg" + }, + "markdownHorizontalRule": { + "dark": "darkMuted", + "light": "lightMuted" + }, + "markdownListItem": { + "dark": "darkFg", + "light": "lightFg" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightMuted" + }, + "markdownImage": { + "dark": "darkCyan", + "light": "lightBlueDark" + }, + "markdownImageText": { + "dark": "darkBlue", + "light": "lightMuted" + }, + "markdownCodeBlock": { + "dark": "darkFg", + "light": "lightFg" + }, + "syntaxComment": { + "dark": "darkMuted", + "light": "lightMuted" + }, + "syntaxKeyword": { + "dark": "darkTeal", + "light": "lightMagenta" + }, + "syntaxFunction": { + "dark": "darkSyntaxOrange", + "light": "lightOrange" + }, + "syntaxVariable": { + "dark": "darkFg", + "light": "lightFg" + }, + "syntaxString": { + "dark": "darkPink", + "light": "lightPurple" + }, + "syntaxNumber": { + "dark": "darkSyntaxYellow", + "light": "lightPink" + }, + "syntaxType": { + "dark": "darkSyntaxOrange", + "light": "lightBlueDark" + }, + "syntaxOperator": { + "dark": "darkFg", + "light": "lightFg" + }, + "syntaxPunctuation": { + "dark": "darkFg", + "light": "lightFg" + } + } + }, + "dracula": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "background": "#282a36", + "currentLine": "#44475a", + "selection": "#44475a", + "foreground": "#f8f8f2", + "comment": "#6272a4", + "cyan": "#8be9fd", + "green": "#50fa7b", + "orange": "#ffb86c", + "pink": "#ff79c6", + "purple": "#bd93f9", + "red": "#ff5555", + "yellow": "#f1fa8c" + }, + "theme": { + "primary": { + "dark": "purple", + "light": "purple" + }, + "secondary": { + "dark": "pink", + "light": "pink" + }, + "accent": { + "dark": "cyan", + "light": "cyan" + }, + "error": { + "dark": "red", + "light": "red" + }, + "warning": { + "dark": "yellow", + "light": "yellow" + }, + "success": { + "dark": "green", + "light": "green" + }, + "info": { + "dark": "orange", + "light": "orange" + }, + "text": { + "dark": "foreground", + "light": "#282a36" + }, + "textMuted": { + "dark": "comment", + "light": "#6272a4" + }, + "background": { + "dark": "#282a36", + "light": "#f8f8f2" + }, + "backgroundPanel": { + "dark": "#21222c", + "light": "#e8e8e2" + }, + "backgroundElement": { + "dark": "currentLine", + "light": "#d8d8d2" + }, + "border": { + "dark": "currentLine", + "light": "#c8c8c2" + }, + "borderActive": { + "dark": "purple", + "light": "purple" + }, + "borderSubtle": { + "dark": "#191a21", + "light": "#e0e0e0" + }, + "diffAdded": { + "dark": "green", + "light": "green" + }, + "diffRemoved": { + "dark": "red", + "light": "red" + }, + "diffContext": { + "dark": "comment", + "light": "#6272a4" + }, + "diffHunkHeader": { + "dark": "comment", + "light": "#6272a4" + }, + "diffHighlightAdded": { + "dark": "green", + "light": "green" + }, + "diffHighlightRemoved": { + "dark": "red", + "light": "red" + }, + "diffAddedBg": { + "dark": "#1a3a1a", + "light": "#e0ffe0" + }, + "diffRemovedBg": { + "dark": "#3a1a1a", + "light": "#ffe0e0" + }, + "diffContextBg": { + "dark": "#21222c", + "light": "#e8e8e2" + }, + "diffLineNumber": { + "dark": "currentLine", + "light": "#c8c8c2" + }, + "diffAddedLineNumberBg": { + "dark": "#1a3a1a", + "light": "#e0ffe0" + }, + "diffRemovedLineNumberBg": { + "dark": "#3a1a1a", + "light": "#ffe0e0" + }, + "markdownText": { + "dark": "foreground", + "light": "#282a36" + }, + "markdownHeading": { + "dark": "purple", + "light": "purple" + }, + "markdownLink": { + "dark": "cyan", + "light": "cyan" + }, + "markdownLinkText": { + "dark": "pink", + "light": "pink" + }, + "markdownCode": { + "dark": "green", + "light": "green" + }, + "markdownBlockQuote": { + "dark": "comment", + "light": "#6272a4" + }, + "markdownEmph": { + "dark": "yellow", + "light": "yellow" + }, + "markdownStrong": { + "dark": "orange", + "light": "orange" + }, + "markdownHorizontalRule": { + "dark": "comment", + "light": "#6272a4" + }, + "markdownListItem": { + "dark": "purple", + "light": "purple" + }, + "markdownListEnumeration": { + "dark": "cyan", + "light": "cyan" + }, + "markdownImage": { + "dark": "cyan", + "light": "cyan" + }, + "markdownImageText": { + "dark": "pink", + "light": "pink" + }, + "markdownCodeBlock": { + "dark": "foreground", + "light": "#282a36" + }, + "syntaxComment": { + "dark": "comment", + "light": "#6272a4" + }, + "syntaxKeyword": { + "dark": "pink", + "light": "pink" + }, + "syntaxFunction": { + "dark": "green", + "light": "green" + }, + "syntaxVariable": { + "dark": "foreground", + "light": "#282a36" + }, + "syntaxString": { + "dark": "yellow", + "light": "yellow" + }, + "syntaxNumber": { + "dark": "purple", + "light": "purple" + }, + "syntaxType": { + "dark": "cyan", + "light": "cyan" + }, + "syntaxOperator": { + "dark": "pink", + "light": "pink" + }, + "syntaxPunctuation": { + "dark": "foreground", + "light": "#282a36" + } + } + }, + "everforest": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkStep1": "#2d353b", + "darkStep2": "#333c43", + "darkStep3": "#343f44", + "darkStep4": "#3d484d", + "darkStep5": "#475258", + "darkStep6": "#7a8478", + "darkStep7": "#859289", + "darkStep8": "#9da9a0", + "darkStep9": "#a7c080", + "darkStep10": "#83c092", + "darkStep11": "#7a8478", + "darkStep12": "#d3c6aa", + "darkRed": "#e67e80", + "darkOrange": "#e69875", + "darkGreen": "#a7c080", + "darkCyan": "#83c092", + "darkYellow": "#dbbc7f", + "lightStep1": "#fdf6e3", + "lightStep2": "#efebd4", + "lightStep3": "#f4f0d9", + "lightStep4": "#efebd4", + "lightStep5": "#e6e2cc", + "lightStep6": "#a6b0a0", + "lightStep7": "#939f91", + "lightStep8": "#829181", + "lightStep9": "#8da101", + "lightStep10": "#35a77c", + "lightStep11": "#a6b0a0", + "lightStep12": "#5c6a72", + "lightRed": "#f85552", + "lightOrange": "#f57d26", + "lightGreen": "#8da101", + "lightCyan": "#35a77c", + "lightYellow": "#dfa000" + }, + "theme": { + "primary": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "secondary": { + "dark": "#7fbbb3", + "light": "#3a94c5" + }, + "accent": { + "dark": "#d699b6", + "light": "#df69ba" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "text": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "textMuted": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "background": { + "dark": "darkStep1", + "light": "lightStep1" + }, + "backgroundPanel": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "backgroundElement": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "border": { + "dark": "darkStep7", + "light": "lightStep7" + }, + "borderActive": { + "dark": "darkStep8", + "light": "lightStep8" + }, + "borderSubtle": { + "dark": "darkStep6", + "light": "lightStep6" + }, + "diffAdded": { + "dark": "#4fd6be", + "light": "#1e725c" + }, + "diffRemoved": { + "dark": "#c53b53", + "light": "#c53b53" + }, + "diffContext": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHunkHeader": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHighlightAdded": { + "dark": "#b8db87", + "light": "#4db380" + }, + "diffHighlightRemoved": { + "dark": "#e26a75", + "light": "#f52a65" + }, + "diffAddedBg": { + "dark": "#20303b", + "light": "#d5e5d5" + }, + "diffRemovedBg": { + "dark": "#37222c", + "light": "#f7d8db" + }, + "diffContextBg": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "diffLineNumber": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "diffAddedLineNumberBg": { + "dark": "#1b2b34", + "light": "#c5d5c5" + }, + "diffRemovedLineNumberBg": { + "dark": "#2d1f26", + "light": "#e7c8cb" + }, + "markdownText": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "markdownHeading": { + "dark": "#d699b6", + "light": "#df69ba" + }, + "markdownLink": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownLinkText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCode": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "markdownListItem": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownImageText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCodeBlock": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "syntaxComment": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "syntaxKeyword": { + "dark": "#d699b6", + "light": "#df69ba" + }, + "syntaxFunction": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "syntaxVariable": { + "dark": "darkRed", + "light": "lightRed" + }, + "syntaxString": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "syntaxNumber": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxPunctuation": { + "dark": "darkStep12", + "light": "lightStep12" + } + } + }, + "flexoki": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "black": "#100F0F", + "base950": "#1C1B1A", + "base900": "#282726", + "base850": "#343331", + "base800": "#403E3C", + "base700": "#575653", + "base600": "#6F6E69", + "base500": "#878580", + "base300": "#B7B5AC", + "base200": "#CECDC3", + "base150": "#DAD8CE", + "base100": "#E6E4D9", + "base50": "#F2F0E5", + "paper": "#FFFCF0", + "red400": "#D14D41", + "red600": "#AF3029", + "orange400": "#DA702C", + "orange600": "#BC5215", + "yellow400": "#D0A215", + "yellow600": "#AD8301", + "green400": "#879A39", + "green600": "#66800B", + "cyan400": "#3AA99F", + "cyan600": "#24837B", + "blue400": "#4385BE", + "blue600": "#205EA6", + "purple400": "#8B7EC8", + "purple600": "#5E409D", + "magenta400": "#CE5D97", + "magenta600": "#A02F6F" + }, + "theme": { + "primary": { + "dark": "orange400", + "light": "blue600" + }, + "secondary": { + "dark": "blue400", + "light": "purple600" + }, + "accent": { + "dark": "purple400", + "light": "orange600" + }, + "error": { + "dark": "red400", + "light": "red600" + }, + "warning": { + "dark": "orange400", + "light": "orange600" + }, + "success": { + "dark": "green400", + "light": "green600" + }, + "info": { + "dark": "cyan400", + "light": "cyan600" + }, + "text": { + "dark": "base200", + "light": "black" + }, + "textMuted": { + "dark": "base600", + "light": "base600" + }, + "background": { + "dark": "black", + "light": "paper" + }, + "backgroundPanel": { + "dark": "base950", + "light": "base50" + }, + "backgroundElement": { + "dark": "base900", + "light": "base100" + }, + "border": { + "dark": "base700", + "light": "base300" + }, + "borderActive": { + "dark": "base600", + "light": "base500" + }, + "borderSubtle": { + "dark": "base800", + "light": "base200" + }, + "diffAdded": { + "dark": "green400", + "light": "green600" + }, + "diffRemoved": { + "dark": "red400", + "light": "red600" + }, + "diffContext": { + "dark": "base600", + "light": "base600" + }, + "diffHunkHeader": { + "dark": "blue400", + "light": "blue600" + }, + "diffHighlightAdded": { + "dark": "green400", + "light": "green600" + }, + "diffHighlightRemoved": { + "dark": "red400", + "light": "red600" + }, + "diffAddedBg": { + "dark": "#1A2D1A", + "light": "#D5E5D5" + }, + "diffRemovedBg": { + "dark": "#2D1A1A", + "light": "#F7D8DB" + }, + "diffContextBg": { + "dark": "base950", + "light": "base50" + }, + "diffLineNumber": { + "dark": "base600", + "light": "base600" + }, + "diffAddedLineNumberBg": { + "dark": "#152515", + "light": "#C5D5C5" + }, + "diffRemovedLineNumberBg": { + "dark": "#251515", + "light": "#E7C8CB" + }, + "markdownText": { + "dark": "base200", + "light": "black" + }, + "markdownHeading": { + "dark": "purple400", + "light": "purple600" + }, + "markdownLink": { + "dark": "blue400", + "light": "blue600" + }, + "markdownLinkText": { + "dark": "cyan400", + "light": "cyan600" + }, + "markdownCode": { + "dark": "cyan400", + "light": "cyan600" + }, + "markdownBlockQuote": { + "dark": "yellow400", + "light": "yellow600" + }, + "markdownEmph": { + "dark": "yellow400", + "light": "yellow600" + }, + "markdownStrong": { + "dark": "orange400", + "light": "orange600" + }, + "markdownHorizontalRule": { + "dark": "base600", + "light": "base600" + }, + "markdownListItem": { + "dark": "orange400", + "light": "orange600" + }, + "markdownListEnumeration": { + "dark": "cyan400", + "light": "cyan600" + }, + "markdownImage": { + "dark": "magenta400", + "light": "magenta600" + }, + "markdownImageText": { + "dark": "cyan400", + "light": "cyan600" + }, + "markdownCodeBlock": { + "dark": "base200", + "light": "black" + }, + "syntaxComment": { + "dark": "base600", + "light": "base600" + }, + "syntaxKeyword": { + "dark": "green400", + "light": "green600" + }, + "syntaxFunction": { + "dark": "orange400", + "light": "orange600" + }, + "syntaxVariable": { + "dark": "blue400", + "light": "blue600" + }, + "syntaxString": { + "dark": "cyan400", + "light": "cyan600" + }, + "syntaxNumber": { + "dark": "purple400", + "light": "purple600" + }, + "syntaxType": { + "dark": "yellow400", + "light": "yellow600" + }, + "syntaxOperator": { + "dark": "base300", + "light": "base600" + }, + "syntaxPunctuation": { + "dark": "base300", + "light": "base600" + } + } + }, + "github": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg": "#0d1117", + "darkBgAlt": "#010409", + "darkBgPanel": "#161b22", + "darkFg": "#c9d1d9", + "darkFgMuted": "#8b949e", + "darkBlue": "#58a6ff", + "darkGreen": "#3fb950", + "darkRed": "#f85149", + "darkOrange": "#d29922", + "darkPurple": "#bc8cff", + "darkPink": "#ff7b72", + "darkYellow": "#e3b341", + "darkCyan": "#39c5cf", + "lightBg": "#ffffff", + "lightBgAlt": "#f6f8fa", + "lightBgPanel": "#f0f3f6", + "lightFg": "#24292f", + "lightFgMuted": "#57606a", + "lightBlue": "#0969da", + "lightGreen": "#1a7f37", + "lightRed": "#cf222e", + "lightOrange": "#bc4c00", + "lightPurple": "#8250df", + "lightPink": "#bf3989", + "lightYellow": "#9a6700", + "lightCyan": "#1b7c83" + }, + "theme": { + "primary": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "secondary": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "accent": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "text": { + "dark": "darkFg", + "light": "lightFg" + }, + "textMuted": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "background": { + "dark": "darkBg", + "light": "lightBg" + }, + "backgroundPanel": { + "dark": "darkBgAlt", + "light": "lightBgAlt" + }, + "backgroundElement": { + "dark": "darkBgPanel", + "light": "lightBgPanel" + }, + "border": { + "dark": "#30363d", + "light": "#d0d7de" + }, + "borderActive": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "borderSubtle": { + "dark": "#21262d", + "light": "#d8dee4" + }, + "diffAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffContext": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "diffHunkHeader": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "diffHighlightAdded": { + "dark": "#3fb950", + "light": "#1a7f37" + }, + "diffHighlightRemoved": { + "dark": "#f85149", + "light": "#cf222e" + }, + "diffAddedBg": { + "dark": "#033a16", + "light": "#dafbe1" + }, + "diffRemovedBg": { + "dark": "#67060c", + "light": "#ffebe9" + }, + "diffContextBg": { + "dark": "darkBgAlt", + "light": "lightBgAlt" + }, + "diffLineNumber": { + "dark": "#484f58", + "light": "#afb8c1" + }, + "diffAddedLineNumberBg": { + "dark": "#033a16", + "light": "#dafbe1" + }, + "diffRemovedLineNumberBg": { + "dark": "#67060c", + "light": "#ffebe9" + }, + "markdownText": { + "dark": "darkFg", + "light": "lightFg" + }, + "markdownHeading": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownLink": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownLinkText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCode": { + "dark": "darkPink", + "light": "lightPink" + }, + "markdownBlockQuote": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "#30363d", + "light": "#d0d7de" + }, + "markdownListItem": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownImageText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCodeBlock": { + "dark": "darkFg", + "light": "lightFg" + }, + "syntaxComment": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "syntaxKeyword": { + "dark": "darkPink", + "light": "lightRed" + }, + "syntaxFunction": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "syntaxVariable": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxString": { + "dark": "darkCyan", + "light": "lightBlue" + }, + "syntaxNumber": { + "dark": "darkBlue", + "light": "lightCyan" + }, + "syntaxType": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxOperator": { + "dark": "darkPink", + "light": "lightRed" + }, + "syntaxPunctuation": { + "dark": "darkFg", + "light": "lightFg" + } + } + }, + "gruvbox": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg0": "#282828", + "darkBg1": "#3c3836", + "darkBg2": "#504945", + "darkBg3": "#665c54", + "darkFg0": "#fbf1c7", + "darkFg1": "#ebdbb2", + "darkGray": "#928374", + "darkRed": "#cc241d", + "darkGreen": "#98971a", + "darkYellow": "#d79921", + "darkBlue": "#458588", + "darkPurple": "#b16286", + "darkAqua": "#689d6a", + "darkOrange": "#d65d0e", + "darkRedBright": "#fb4934", + "darkGreenBright": "#b8bb26", + "darkYellowBright": "#fabd2f", + "darkBlueBright": "#83a598", + "darkPurpleBright": "#d3869b", + "darkAquaBright": "#8ec07c", + "darkOrangeBright": "#fe8019", + "lightBg0": "#fbf1c7", + "lightBg1": "#ebdbb2", + "lightBg2": "#d5c4a1", + "lightBg3": "#bdae93", + "lightFg0": "#282828", + "lightFg1": "#3c3836", + "lightGray": "#7c6f64", + "lightRed": "#9d0006", + "lightGreen": "#79740e", + "lightYellow": "#b57614", + "lightBlue": "#076678", + "lightPurple": "#8f3f71", + "lightAqua": "#427b58", + "lightOrange": "#af3a03" + }, + "theme": { + "primary": { + "dark": "darkBlueBright", + "light": "lightBlue" + }, + "secondary": { + "dark": "darkPurpleBright", + "light": "lightPurple" + }, + "accent": { + "dark": "darkAquaBright", + "light": "lightAqua" + }, + "error": { + "dark": "darkRedBright", + "light": "lightRed" + }, + "warning": { + "dark": "darkOrangeBright", + "light": "lightOrange" + }, + "success": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "info": { + "dark": "darkYellowBright", + "light": "lightYellow" + }, + "text": { + "dark": "darkFg1", + "light": "lightFg1" + }, + "textMuted": { + "dark": "darkGray", + "light": "lightGray" + }, + "background": { + "dark": "darkBg0", + "light": "lightBg0" + }, + "backgroundPanel": { + "dark": "darkBg1", + "light": "lightBg1" + }, + "backgroundElement": { + "dark": "darkBg2", + "light": "lightBg2" + }, + "border": { + "dark": "darkBg3", + "light": "lightBg3" + }, + "borderActive": { + "dark": "darkFg1", + "light": "lightFg1" + }, + "borderSubtle": { + "dark": "darkBg2", + "light": "lightBg2" + }, + "diffAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffContext": { + "dark": "darkGray", + "light": "lightGray" + }, + "diffHunkHeader": { + "dark": "darkAqua", + "light": "lightAqua" + }, + "diffHighlightAdded": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "diffHighlightRemoved": { + "dark": "darkRedBright", + "light": "lightRed" + }, + "diffAddedBg": { + "dark": "#32302f", + "light": "#dcd8a4" + }, + "diffRemovedBg": { + "dark": "#322929", + "light": "#e2c7c3" + }, + "diffContextBg": { + "dark": "darkBg1", + "light": "lightBg1" + }, + "diffLineNumber": { + "dark": "darkBg3", + "light": "lightBg3" + }, + "diffAddedLineNumberBg": { + "dark": "#2a2827", + "light": "#cec99e" + }, + "diffRemovedLineNumberBg": { + "dark": "#2a2222", + "light": "#d3bdb9" + }, + "markdownText": { + "dark": "darkFg1", + "light": "lightFg1" + }, + "markdownHeading": { + "dark": "darkBlueBright", + "light": "lightBlue" + }, + "markdownLink": { + "dark": "darkAquaBright", + "light": "lightAqua" + }, + "markdownLinkText": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "markdownCode": { + "dark": "darkYellowBright", + "light": "lightYellow" + }, + "markdownBlockQuote": { + "dark": "darkGray", + "light": "lightGray" + }, + "markdownEmph": { + "dark": "darkPurpleBright", + "light": "lightPurple" + }, + "markdownStrong": { + "dark": "darkOrangeBright", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "darkGray", + "light": "lightGray" + }, + "markdownListItem": { + "dark": "darkBlueBright", + "light": "lightBlue" + }, + "markdownListEnumeration": { + "dark": "darkAquaBright", + "light": "lightAqua" + }, + "markdownImage": { + "dark": "darkAquaBright", + "light": "lightAqua" + }, + "markdownImageText": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "markdownCodeBlock": { + "dark": "darkFg1", + "light": "lightFg1" + }, + "syntaxComment": { + "dark": "darkGray", + "light": "lightGray" + }, + "syntaxKeyword": { + "dark": "darkRedBright", + "light": "lightRed" + }, + "syntaxFunction": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "syntaxVariable": { + "dark": "darkBlueBright", + "light": "lightBlue" + }, + "syntaxString": { + "dark": "darkYellowBright", + "light": "lightYellow" + }, + "syntaxNumber": { + "dark": "darkPurpleBright", + "light": "lightPurple" + }, + "syntaxType": { + "dark": "darkAquaBright", + "light": "lightAqua" + }, + "syntaxOperator": { + "dark": "darkOrangeBright", + "light": "lightOrange" + }, + "syntaxPunctuation": { + "dark": "darkFg1", + "light": "lightFg1" + } + } + }, + "kanagawa": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "sumiInk0": "#1F1F28", + "sumiInk1": "#2A2A37", + "sumiInk2": "#363646", + "sumiInk3": "#54546D", + "fujiWhite": "#DCD7BA", + "oldWhite": "#C8C093", + "fujiGray": "#727169", + "oniViolet": "#957FB8", + "crystalBlue": "#7E9CD8", + "carpYellow": "#C38D9D", + "sakuraPink": "#D27E99", + "waveAqua": "#76946A", + "roninYellow": "#D7A657", + "dragonRed": "#E82424", + "lotusGreen": "#98BB6C", + "waveBlue": "#2D4F67", + "lightBg": "#F2E9DE", + "lightPaper": "#EAE4D7", + "lightText": "#54433A", + "lightGray": "#9E9389" + }, + "theme": { + "primary": { + "dark": "crystalBlue", + "light": "waveBlue" + }, + "secondary": { + "dark": "oniViolet", + "light": "oniViolet" + }, + "accent": { + "dark": "sakuraPink", + "light": "sakuraPink" + }, + "error": { + "dark": "dragonRed", + "light": "dragonRed" + }, + "warning": { + "dark": "roninYellow", + "light": "roninYellow" + }, + "success": { + "dark": "lotusGreen", + "light": "lotusGreen" + }, + "info": { + "dark": "waveAqua", + "light": "waveAqua" + }, + "text": { + "dark": "fujiWhite", + "light": "lightText" + }, + "textMuted": { + "dark": "fujiGray", + "light": "lightGray" + }, + "background": { + "dark": "sumiInk0", + "light": "lightBg" + }, + "backgroundPanel": { + "dark": "sumiInk1", + "light": "lightPaper" + }, + "backgroundElement": { + "dark": "sumiInk2", + "light": "#E3DCD2" + }, + "border": { + "dark": "sumiInk3", + "light": "#D4CBBF" + }, + "borderActive": { + "dark": "carpYellow", + "light": "carpYellow" + }, + "borderSubtle": { + "dark": "sumiInk2", + "light": "#DCD4C9" + }, + "diffAdded": { + "dark": "lotusGreen", + "light": "lotusGreen" + }, + "diffRemoved": { + "dark": "dragonRed", + "light": "dragonRed" + }, + "diffContext": { + "dark": "fujiGray", + "light": "lightGray" + }, + "diffHunkHeader": { + "dark": "waveBlue", + "light": "waveBlue" + }, + "diffHighlightAdded": { + "dark": "#A9D977", + "light": "#89AF5B" + }, + "diffHighlightRemoved": { + "dark": "#F24A4A", + "light": "#D61F1F" + }, + "diffAddedBg": { + "dark": "#252E25", + "light": "#EAF3E4" + }, + "diffRemovedBg": { + "dark": "#362020", + "light": "#FBE6E6" + }, + "diffContextBg": { + "dark": "sumiInk1", + "light": "lightPaper" + }, + "diffLineNumber": { + "dark": "sumiInk3", + "light": "#C7BEB4" + }, + "diffAddedLineNumberBg": { + "dark": "#202820", + "light": "#DDE8D6" + }, + "diffRemovedLineNumberBg": { + "dark": "#2D1C1C", + "light": "#F2DADA" + }, + "markdownText": { + "dark": "fujiWhite", + "light": "lightText" + }, + "markdownHeading": { + "dark": "oniViolet", + "light": "oniViolet" + }, + "markdownLink": { + "dark": "crystalBlue", + "light": "waveBlue" + }, + "markdownLinkText": { + "dark": "waveAqua", + "light": "waveAqua" + }, + "markdownCode": { + "dark": "lotusGreen", + "light": "lotusGreen" + }, + "markdownBlockQuote": { + "dark": "fujiGray", + "light": "lightGray" + }, + "markdownEmph": { + "dark": "carpYellow", + "light": "carpYellow" + }, + "markdownStrong": { + "dark": "roninYellow", + "light": "roninYellow" + }, + "markdownHorizontalRule": { + "dark": "fujiGray", + "light": "lightGray" + }, + "markdownListItem": { + "dark": "crystalBlue", + "light": "waveBlue" + }, + "markdownListEnumeration": { + "dark": "waveAqua", + "light": "waveAqua" + }, + "markdownImage": { + "dark": "crystalBlue", + "light": "waveBlue" + }, + "markdownImageText": { + "dark": "waveAqua", + "light": "waveAqua" + }, + "markdownCodeBlock": { + "dark": "fujiWhite", + "light": "lightText" + }, + "syntaxComment": { + "dark": "fujiGray", + "light": "lightGray" + }, + "syntaxKeyword": { + "dark": "oniViolet", + "light": "oniViolet" + }, + "syntaxFunction": { + "dark": "crystalBlue", + "light": "waveBlue" + }, + "syntaxVariable": { + "dark": "fujiWhite", + "light": "lightText" + }, + "syntaxString": { + "dark": "lotusGreen", + "light": "lotusGreen" + }, + "syntaxNumber": { + "dark": "roninYellow", + "light": "roninYellow" + }, + "syntaxType": { + "dark": "carpYellow", + "light": "carpYellow" + }, + "syntaxOperator": { + "dark": "sakuraPink", + "light": "sakuraPink" + }, + "syntaxPunctuation": { + "dark": "fujiWhite", + "light": "lightText" + } + } + }, + "material": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg": "#263238", + "darkBgAlt": "#1e272c", + "darkBgPanel": "#37474f", + "darkFg": "#eeffff", + "darkFgMuted": "#546e7a", + "darkRed": "#f07178", + "darkPink": "#f78c6c", + "darkOrange": "#ffcb6b", + "darkYellow": "#ffcb6b", + "darkGreen": "#c3e88d", + "darkCyan": "#89ddff", + "darkBlue": "#82aaff", + "darkPurple": "#c792ea", + "darkViolet": "#bb80b3", + "lightBg": "#fafafa", + "lightBgAlt": "#f5f5f5", + "lightBgPanel": "#e7e7e8", + "lightFg": "#263238", + "lightFgMuted": "#90a4ae", + "lightRed": "#e53935", + "lightPink": "#ec407a", + "lightOrange": "#f4511e", + "lightYellow": "#ffb300", + "lightGreen": "#91b859", + "lightCyan": "#39adb5", + "lightBlue": "#6182b8", + "lightPurple": "#7c4dff", + "lightViolet": "#945eb8" + }, + "theme": { + "primary": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "secondary": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "accent": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "text": { + "dark": "darkFg", + "light": "lightFg" + }, + "textMuted": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "background": { + "dark": "darkBg", + "light": "lightBg" + }, + "backgroundPanel": { + "dark": "darkBgAlt", + "light": "lightBgAlt" + }, + "backgroundElement": { + "dark": "darkBgPanel", + "light": "lightBgPanel" + }, + "border": { + "dark": "#37474f", + "light": "#e0e0e0" + }, + "borderActive": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "borderSubtle": { + "dark": "#1e272c", + "light": "#eeeeee" + }, + "diffAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffContext": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "diffHunkHeader": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "diffHighlightAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffHighlightRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffAddedBg": { + "dark": "#2e3c2b", + "light": "#e8f5e9" + }, + "diffRemovedBg": { + "dark": "#3c2b2b", + "light": "#ffebee" + }, + "diffContextBg": { + "dark": "darkBgAlt", + "light": "lightBgAlt" + }, + "diffLineNumber": { + "dark": "#37474f", + "light": "#cfd8dc" + }, + "diffAddedLineNumberBg": { + "dark": "#2e3c2b", + "light": "#e8f5e9" + }, + "diffRemovedLineNumberBg": { + "dark": "#3c2b2b", + "light": "#ffebee" + }, + "markdownText": { + "dark": "darkFg", + "light": "lightFg" + }, + "markdownHeading": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownLink": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownLinkText": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "markdownCode": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "#37474f", + "light": "#e0e0e0" + }, + "markdownListItem": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImageText": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "markdownCodeBlock": { + "dark": "darkFg", + "light": "lightFg" + }, + "syntaxComment": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "syntaxKeyword": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "syntaxFunction": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "syntaxVariable": { + "dark": "darkFg", + "light": "lightFg" + }, + "syntaxString": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "syntaxNumber": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxPunctuation": { + "dark": "darkFg", + "light": "lightFg" + } + } + }, + "matrix": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "matrixInk0": "#0a0e0a", + "matrixInk1": "#0e130d", + "matrixInk2": "#141c12", + "matrixInk3": "#1e2a1b", + "rainGreen": "#2eff6a", + "rainGreenDim": "#1cc24b", + "rainGreenHi": "#62ff94", + "rainCyan": "#00efff", + "rainTeal": "#24f6d9", + "rainPurple": "#c770ff", + "rainOrange": "#ffa83d", + "alertRed": "#ff4b4b", + "alertYellow": "#e6ff57", + "alertBlue": "#30b3ff", + "rainGray": "#8ca391", + "lightBg": "#eef3ea", + "lightPaper": "#e4ebe1", + "lightInk1": "#dae1d7", + "lightText": "#203022", + "lightGray": "#748476" + }, + "theme": { + "primary": { + "dark": "rainGreen", + "light": "rainGreenDim" + }, + "secondary": { + "dark": "rainCyan", + "light": "rainTeal" + }, + "accent": { + "dark": "rainPurple", + "light": "rainPurple" + }, + "error": { + "dark": "alertRed", + "light": "alertRed" + }, + "warning": { + "dark": "alertYellow", + "light": "alertYellow" + }, + "success": { + "dark": "rainGreenHi", + "light": "rainGreenDim" + }, + "info": { + "dark": "alertBlue", + "light": "alertBlue" + }, + "text": { + "dark": "rainGreenHi", + "light": "lightText" + }, + "textMuted": { + "dark": "rainGray", + "light": "lightGray" + }, + "background": { + "dark": "matrixInk0", + "light": "lightBg" + }, + "backgroundPanel": { + "dark": "matrixInk1", + "light": "lightPaper" + }, + "backgroundElement": { + "dark": "matrixInk2", + "light": "lightInk1" + }, + "border": { + "dark": "matrixInk3", + "light": "lightGray" + }, + "borderActive": { + "dark": "rainGreen", + "light": "rainGreenDim" + }, + "borderSubtle": { + "dark": "matrixInk2", + "light": "lightInk1" + }, + "diffAdded": { + "dark": "rainGreenDim", + "light": "rainGreenDim" + }, + "diffRemoved": { + "dark": "alertRed", + "light": "alertRed" + }, + "diffContext": { + "dark": "rainGray", + "light": "lightGray" + }, + "diffHunkHeader": { + "dark": "alertBlue", + "light": "alertBlue" + }, + "diffHighlightAdded": { + "dark": "#77ffaf", + "light": "#5dac7e" + }, + "diffHighlightRemoved": { + "dark": "#ff7171", + "light": "#d53a3a" + }, + "diffAddedBg": { + "dark": "#132616", + "light": "#e0efde" + }, + "diffRemovedBg": { + "dark": "#261212", + "light": "#f9e5e5" + }, + "diffContextBg": { + "dark": "matrixInk1", + "light": "lightPaper" + }, + "diffLineNumber": { + "dark": "matrixInk3", + "light": "lightGray" + }, + "diffAddedLineNumberBg": { + "dark": "#0f1b11", + "light": "#d6e7d2" + }, + "diffRemovedLineNumberBg": { + "dark": "#1b1414", + "light": "#f2d2d2" + }, + "markdownText": { + "dark": "rainGreenHi", + "light": "lightText" + }, + "markdownHeading": { + "dark": "rainCyan", + "light": "rainTeal" + }, + "markdownLink": { + "dark": "alertBlue", + "light": "alertBlue" + }, + "markdownLinkText": { + "dark": "rainTeal", + "light": "rainTeal" + }, + "markdownCode": { + "dark": "rainGreenDim", + "light": "rainGreenDim" + }, + "markdownBlockQuote": { + "dark": "rainGray", + "light": "lightGray" + }, + "markdownEmph": { + "dark": "rainOrange", + "light": "rainOrange" + }, + "markdownStrong": { + "dark": "alertYellow", + "light": "alertYellow" + }, + "markdownHorizontalRule": { + "dark": "rainGray", + "light": "lightGray" + }, + "markdownListItem": { + "dark": "alertBlue", + "light": "alertBlue" + }, + "markdownListEnumeration": { + "dark": "rainTeal", + "light": "rainTeal" + }, + "markdownImage": { + "dark": "alertBlue", + "light": "alertBlue" + }, + "markdownImageText": { + "dark": "rainTeal", + "light": "rainTeal" + }, + "markdownCodeBlock": { + "dark": "rainGreenHi", + "light": "lightText" + }, + "syntaxComment": { + "dark": "rainGray", + "light": "lightGray" + }, + "syntaxKeyword": { + "dark": "rainPurple", + "light": "rainPurple" + }, + "syntaxFunction": { + "dark": "alertBlue", + "light": "alertBlue" + }, + "syntaxVariable": { + "dark": "rainGreenHi", + "light": "lightText" + }, + "syntaxString": { + "dark": "rainGreenDim", + "light": "rainGreenDim" + }, + "syntaxNumber": { + "dark": "rainOrange", + "light": "rainOrange" + }, + "syntaxType": { + "dark": "alertYellow", + "light": "alertYellow" + }, + "syntaxOperator": { + "dark": "rainTeal", + "light": "rainTeal" + }, + "syntaxPunctuation": { + "dark": "rainGreenHi", + "light": "lightText" + } + } + }, + "mercury": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "purple-800": "#3442a6", + "purple-700": "#465bd1", + "purple-600": "#5266eb", + "purple-400": "#8da4f5", + "purple-300": "#a7b6f8", + "red-700": "#b0175f", + "red-600": "#d03275", + "red-400": "#fc92b4", + "green-700": "#036e43", + "green-600": "#188554", + "green-400": "#77c599", + "orange-700": "#a44200", + "orange-600": "#c45000", + "orange-400": "#fc9b6f", + "blue-600": "#007f95", + "blue-400": "#77becf", + "neutral-1000": "#10101a", + "neutral-950": "#171721", + "neutral-900": "#1e1e2a", + "neutral-800": "#272735", + "neutral-700": "#363644", + "neutral-600": "#535461", + "neutral-500": "#70707d", + "neutral-400": "#9d9da8", + "neutral-300": "#c3c3cc", + "neutral-200": "#dddde5", + "neutral-100": "#f4f5f9", + "neutral-050": "#fbfcfd", + "neutral-000": "#ffffff", + "neutral-150": "#ededf3", + "border-light": "#7073931a", + "border-light-subtle": "#7073930f", + "border-dark": "#b4b7c81f", + "border-dark-subtle": "#b4b7c814", + "diff-added-light": "#1885541a", + "diff-removed-light": "#d032751a", + "diff-added-dark": "#77c59933", + "diff-removed-dark": "#fc92b433" + }, + "theme": { + "primary": { + "light": "purple-600", + "dark": "purple-400" + }, + "secondary": { + "light": "purple-700", + "dark": "purple-300" + }, + "accent": { + "light": "purple-400", + "dark": "purple-400" + }, + "error": { + "light": "red-700", + "dark": "red-400" + }, + "warning": { + "light": "orange-700", + "dark": "orange-400" + }, + "success": { + "light": "green-700", + "dark": "green-400" + }, + "info": { + "light": "blue-600", + "dark": "blue-400" + }, + "text": { + "light": "neutral-700", + "dark": "neutral-200" + }, + "textMuted": { + "light": "neutral-500", + "dark": "neutral-400" + }, + "background": { + "light": "neutral-000", + "dark": "neutral-950" + }, + "backgroundPanel": { + "light": "neutral-050", + "dark": "neutral-1000" + }, + "backgroundElement": { + "light": "neutral-100", + "dark": "neutral-800" + }, + "border": { + "light": "border-light", + "dark": "border-dark" + }, + "borderActive": { + "light": "purple-600", + "dark": "purple-400" + }, + "borderSubtle": { + "light": "border-light-subtle", + "dark": "border-dark-subtle" + }, + "diffAdded": { + "light": "green-700", + "dark": "green-400" + }, + "diffRemoved": { + "light": "red-700", + "dark": "red-400" + }, + "diffContext": { + "light": "neutral-500", + "dark": "neutral-400" + }, + "diffHunkHeader": { + "light": "neutral-500", + "dark": "neutral-400" + }, + "diffHighlightAdded": { + "light": "green-700", + "dark": "green-400" + }, + "diffHighlightRemoved": { + "light": "red-700", + "dark": "red-400" + }, + "diffAddedBg": { + "light": "diff-added-light", + "dark": "diff-added-dark" + }, + "diffRemovedBg": { + "light": "diff-removed-light", + "dark": "diff-removed-dark" + }, + "diffContextBg": { + "light": "neutral-050", + "dark": "neutral-900" + }, + "diffLineNumber": { + "light": "neutral-600", + "dark": "neutral-300" + }, + "diffAddedLineNumberBg": { + "light": "diff-added-light", + "dark": "diff-added-dark" + }, + "diffRemovedLineNumberBg": { + "light": "diff-removed-light", + "dark": "diff-removed-dark" + }, + "markdownText": { + "light": "neutral-700", + "dark": "neutral-200" + }, + "markdownHeading": { + "light": "neutral-900", + "dark": "neutral-000" + }, + "markdownLink": { + "light": "purple-700", + "dark": "purple-400" + }, + "markdownLinkText": { + "light": "purple-600", + "dark": "purple-300" + }, + "markdownCode": { + "light": "green-700", + "dark": "green-400" + }, + "markdownBlockQuote": { + "light": "neutral-500", + "dark": "neutral-400" + }, + "markdownEmph": { + "light": "orange-700", + "dark": "orange-400" + }, + "markdownStrong": { + "light": "neutral-900", + "dark": "neutral-100" + }, + "markdownHorizontalRule": { + "light": "border-light", + "dark": "border-dark" + }, + "markdownListItem": { + "light": "neutral-900", + "dark": "neutral-000" + }, + "markdownListEnumeration": { + "light": "purple-600", + "dark": "purple-400" + }, + "markdownImage": { + "light": "purple-700", + "dark": "purple-400" + }, + "markdownImageText": { + "light": "purple-600", + "dark": "purple-300" + }, + "markdownCodeBlock": { + "light": "neutral-700", + "dark": "neutral-200" + }, + "syntaxComment": { + "light": "neutral-500", + "dark": "neutral-400" + }, + "syntaxKeyword": { + "light": "purple-700", + "dark": "purple-400" + }, + "syntaxFunction": { + "light": "purple-600", + "dark": "purple-400" + }, + "syntaxVariable": { + "light": "blue-600", + "dark": "blue-400" + }, + "syntaxString": { + "light": "green-700", + "dark": "green-400" + }, + "syntaxNumber": { + "light": "orange-700", + "dark": "orange-400" + }, + "syntaxType": { + "light": "blue-600", + "dark": "blue-400" + }, + "syntaxOperator": { + "light": "purple-700", + "dark": "purple-400" + }, + "syntaxPunctuation": { + "light": "neutral-700", + "dark": "neutral-200" + } + } + }, + "monokai": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "background": "#272822", + "backgroundAlt": "#1e1f1c", + "backgroundPanel": "#3e3d32", + "foreground": "#f8f8f2", + "comment": "#75715e", + "red": "#f92672", + "orange": "#fd971f", + "lightOrange": "#e69f66", + "yellow": "#e6db74", + "green": "#a6e22e", + "cyan": "#66d9ef", + "blue": "#66d9ef", + "purple": "#ae81ff", + "pink": "#f92672" + }, + "theme": { + "primary": { + "dark": "cyan", + "light": "blue" + }, + "secondary": { + "dark": "purple", + "light": "purple" + }, + "accent": { + "dark": "green", + "light": "green" + }, + "error": { + "dark": "red", + "light": "red" + }, + "warning": { + "dark": "yellow", + "light": "orange" + }, + "success": { + "dark": "green", + "light": "green" + }, + "info": { + "dark": "orange", + "light": "orange" + }, + "text": { + "dark": "foreground", + "light": "#272822" + }, + "textMuted": { + "dark": "comment", + "light": "#75715e" + }, + "background": { + "dark": "#272822", + "light": "#fafafa" + }, + "backgroundPanel": { + "dark": "#1e1f1c", + "light": "#f0f0f0" + }, + "backgroundElement": { + "dark": "#3e3d32", + "light": "#e0e0e0" + }, + "border": { + "dark": "#3e3d32", + "light": "#d0d0d0" + }, + "borderActive": { + "dark": "cyan", + "light": "blue" + }, + "borderSubtle": { + "dark": "#1e1f1c", + "light": "#e8e8e8" + }, + "diffAdded": { + "dark": "green", + "light": "green" + }, + "diffRemoved": { + "dark": "red", + "light": "red" + }, + "diffContext": { + "dark": "comment", + "light": "#75715e" + }, + "diffHunkHeader": { + "dark": "comment", + "light": "#75715e" + }, + "diffHighlightAdded": { + "dark": "green", + "light": "green" + }, + "diffHighlightRemoved": { + "dark": "red", + "light": "red" + }, + "diffAddedBg": { + "dark": "#1a3a1a", + "light": "#e0ffe0" + }, + "diffRemovedBg": { + "dark": "#3a1a1a", + "light": "#ffe0e0" + }, + "diffContextBg": { + "dark": "#1e1f1c", + "light": "#f0f0f0" + }, + "diffLineNumber": { + "dark": "#3e3d32", + "light": "#d0d0d0" + }, + "diffAddedLineNumberBg": { + "dark": "#1a3a1a", + "light": "#e0ffe0" + }, + "diffRemovedLineNumberBg": { + "dark": "#3a1a1a", + "light": "#ffe0e0" + }, + "markdownText": { + "dark": "foreground", + "light": "#272822" + }, + "markdownHeading": { + "dark": "pink", + "light": "pink" + }, + "markdownLink": { + "dark": "cyan", + "light": "blue" + }, + "markdownLinkText": { + "dark": "purple", + "light": "purple" + }, + "markdownCode": { + "dark": "green", + "light": "green" + }, + "markdownBlockQuote": { + "dark": "comment", + "light": "#75715e" + }, + "markdownEmph": { + "dark": "yellow", + "light": "orange" + }, + "markdownStrong": { + "dark": "orange", + "light": "orange" + }, + "markdownHorizontalRule": { + "dark": "comment", + "light": "#75715e" + }, + "markdownListItem": { + "dark": "cyan", + "light": "blue" + }, + "markdownListEnumeration": { + "dark": "purple", + "light": "purple" + }, + "markdownImage": { + "dark": "cyan", + "light": "blue" + }, + "markdownImageText": { + "dark": "purple", + "light": "purple" + }, + "markdownCodeBlock": { + "dark": "foreground", + "light": "#272822" + }, + "syntaxComment": { + "dark": "comment", + "light": "#75715e" + }, + "syntaxKeyword": { + "dark": "pink", + "light": "pink" + }, + "syntaxFunction": { + "dark": "green", + "light": "green" + }, + "syntaxVariable": { + "dark": "foreground", + "light": "#272822" + }, + "syntaxString": { + "dark": "yellow", + "light": "orange" + }, + "syntaxNumber": { + "dark": "purple", + "light": "purple" + }, + "syntaxType": { + "dark": "cyan", + "light": "blue" + }, + "syntaxOperator": { + "dark": "pink", + "light": "pink" + }, + "syntaxPunctuation": { + "dark": "foreground", + "light": "#272822" + } + } + }, + "nightowl": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "nightOwlBg": "#011627", + "nightOwlFg": "#d6deeb", + "nightOwlBlue": "#82AAFF", + "nightOwlCyan": "#7fdbca", + "nightOwlGreen": "#c5e478", + "nightOwlYellow": "#ecc48d", + "nightOwlOrange": "#F78C6C", + "nightOwlRed": "#EF5350", + "nightOwlPink": "#ff5874", + "nightOwlPurple": "#c792ea", + "nightOwlMuted": "#5f7e97", + "nightOwlGray": "#637777", + "nightOwlLightGray": "#89a4bb", + "nightOwlPanel": "#0b253a" + }, + "theme": { + "primary": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "secondary": { + "dark": "nightOwlCyan", + "light": "nightOwlCyan" + }, + "accent": { + "dark": "nightOwlPurple", + "light": "nightOwlPurple" + }, + "error": { + "dark": "nightOwlRed", + "light": "nightOwlRed" + }, + "warning": { + "dark": "nightOwlYellow", + "light": "nightOwlYellow" + }, + "success": { + "dark": "nightOwlGreen", + "light": "nightOwlGreen" + }, + "info": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "text": { + "dark": "nightOwlFg", + "light": "nightOwlFg" + }, + "textMuted": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "background": { + "dark": "nightOwlBg", + "light": "nightOwlBg" + }, + "backgroundPanel": { + "dark": "nightOwlPanel", + "light": "nightOwlPanel" + }, + "backgroundElement": { + "dark": "nightOwlPanel", + "light": "nightOwlPanel" + }, + "border": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "borderActive": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "borderSubtle": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "diffAdded": { + "dark": "nightOwlGreen", + "light": "nightOwlGreen" + }, + "diffRemoved": { + "dark": "nightOwlRed", + "light": "nightOwlRed" + }, + "diffContext": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "diffHunkHeader": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "diffHighlightAdded": { + "dark": "nightOwlGreen", + "light": "nightOwlGreen" + }, + "diffHighlightRemoved": { + "dark": "nightOwlRed", + "light": "nightOwlRed" + }, + "diffAddedBg": { + "dark": "#0a2e1a", + "light": "#0a2e1a" + }, + "diffRemovedBg": { + "dark": "#2d1b1b", + "light": "#2d1b1b" + }, + "diffContextBg": { + "dark": "nightOwlPanel", + "light": "nightOwlPanel" + }, + "diffLineNumber": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "diffAddedLineNumberBg": { + "dark": "#0a2e1a", + "light": "#0a2e1a" + }, + "diffRemovedLineNumberBg": { + "dark": "#2d1b1b", + "light": "#2d1b1b" + }, + "markdownText": { + "dark": "nightOwlFg", + "light": "nightOwlFg" + }, + "markdownHeading": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "markdownLink": { + "dark": "nightOwlCyan", + "light": "nightOwlCyan" + }, + "markdownLinkText": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "markdownCode": { + "dark": "nightOwlGreen", + "light": "nightOwlGreen" + }, + "markdownBlockQuote": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "markdownEmph": { + "dark": "nightOwlPurple", + "light": "nightOwlPurple" + }, + "markdownStrong": { + "dark": "nightOwlYellow", + "light": "nightOwlYellow" + }, + "markdownHorizontalRule": { + "dark": "nightOwlMuted", + "light": "nightOwlMuted" + }, + "markdownListItem": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "markdownListEnumeration": { + "dark": "nightOwlCyan", + "light": "nightOwlCyan" + }, + "markdownImage": { + "dark": "nightOwlCyan", + "light": "nightOwlCyan" + }, + "markdownImageText": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "markdownCodeBlock": { + "dark": "nightOwlFg", + "light": "nightOwlFg" + }, + "syntaxComment": { + "dark": "nightOwlGray", + "light": "nightOwlGray" + }, + "syntaxKeyword": { + "dark": "nightOwlPurple", + "light": "nightOwlPurple" + }, + "syntaxFunction": { + "dark": "nightOwlBlue", + "light": "nightOwlBlue" + }, + "syntaxVariable": { + "dark": "nightOwlFg", + "light": "nightOwlFg" + }, + "syntaxString": { + "dark": "nightOwlYellow", + "light": "nightOwlYellow" + }, + "syntaxNumber": { + "dark": "nightOwlOrange", + "light": "nightOwlOrange" + }, + "syntaxType": { + "dark": "nightOwlGreen", + "light": "nightOwlGreen" + }, + "syntaxOperator": { + "dark": "nightOwlCyan", + "light": "nightOwlCyan" + }, + "syntaxPunctuation": { + "dark": "nightOwlFg", + "light": "nightOwlFg" + } + } + }, + "nord": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "nord0": "#2E3440", + "nord1": "#3B4252", + "nord2": "#434C5E", + "nord3": "#4C566A", + "nord4": "#D8DEE9", + "nord5": "#E5E9F0", + "nord6": "#ECEFF4", + "nord7": "#8FBCBB", + "nord8": "#88C0D0", + "nord9": "#81A1C1", + "nord10": "#5E81AC", + "nord11": "#BF616A", + "nord12": "#D08770", + "nord13": "#EBCB8B", + "nord14": "#A3BE8C", + "nord15": "#B48EAD" + }, + "theme": { + "primary": { + "dark": "nord8", + "light": "nord10" + }, + "secondary": { + "dark": "nord9", + "light": "nord9" + }, + "accent": { + "dark": "nord7", + "light": "nord7" + }, + "error": { + "dark": "nord11", + "light": "nord11" + }, + "warning": { + "dark": "nord12", + "light": "nord12" + }, + "success": { + "dark": "nord14", + "light": "nord14" + }, + "info": { + "dark": "nord8", + "light": "nord10" + }, + "text": { + "dark": "nord6", + "light": "nord0" + }, + "textMuted": { + "dark": "#8B95A7", + "light": "nord1" + }, + "background": { + "dark": "nord0", + "light": "nord6" + }, + "backgroundPanel": { + "dark": "nord1", + "light": "nord5" + }, + "backgroundElement": { + "dark": "nord2", + "light": "nord4" + }, + "border": { + "dark": "nord2", + "light": "nord3" + }, + "borderActive": { + "dark": "nord3", + "light": "nord2" + }, + "borderSubtle": { + "dark": "nord2", + "light": "nord3" + }, + "diffAdded": { + "dark": "nord14", + "light": "nord14" + }, + "diffRemoved": { + "dark": "nord11", + "light": "nord11" + }, + "diffContext": { + "dark": "#8B95A7", + "light": "nord3" + }, + "diffHunkHeader": { + "dark": "#8B95A7", + "light": "nord3" + }, + "diffHighlightAdded": { + "dark": "nord14", + "light": "nord14" + }, + "diffHighlightRemoved": { + "dark": "nord11", + "light": "nord11" + }, + "diffAddedBg": { + "dark": "#3B4252", + "light": "#E5E9F0" + }, + "diffRemovedBg": { + "dark": "#3B4252", + "light": "#E5E9F0" + }, + "diffContextBg": { + "dark": "nord1", + "light": "nord5" + }, + "diffLineNumber": { + "dark": "nord2", + "light": "nord4" + }, + "diffAddedLineNumberBg": { + "dark": "#3B4252", + "light": "#E5E9F0" + }, + "diffRemovedLineNumberBg": { + "dark": "#3B4252", + "light": "#E5E9F0" + }, + "markdownText": { + "dark": "nord4", + "light": "nord0" + }, + "markdownHeading": { + "dark": "nord8", + "light": "nord10" + }, + "markdownLink": { + "dark": "nord9", + "light": "nord9" + }, + "markdownLinkText": { + "dark": "nord7", + "light": "nord7" + }, + "markdownCode": { + "dark": "nord14", + "light": "nord14" + }, + "markdownBlockQuote": { + "dark": "#8B95A7", + "light": "nord3" + }, + "markdownEmph": { + "dark": "nord12", + "light": "nord12" + }, + "markdownStrong": { + "dark": "nord13", + "light": "nord13" + }, + "markdownHorizontalRule": { + "dark": "#8B95A7", + "light": "nord3" + }, + "markdownListItem": { + "dark": "nord8", + "light": "nord10" + }, + "markdownListEnumeration": { + "dark": "nord7", + "light": "nord7" + }, + "markdownImage": { + "dark": "nord9", + "light": "nord9" + }, + "markdownImageText": { + "dark": "nord7", + "light": "nord7" + }, + "markdownCodeBlock": { + "dark": "nord4", + "light": "nord0" + }, + "syntaxComment": { + "dark": "#8B95A7", + "light": "nord3" + }, + "syntaxKeyword": { + "dark": "nord9", + "light": "nord9" + }, + "syntaxFunction": { + "dark": "nord8", + "light": "nord8" + }, + "syntaxVariable": { + "dark": "nord7", + "light": "nord7" + }, + "syntaxString": { + "dark": "nord14", + "light": "nord14" + }, + "syntaxNumber": { + "dark": "nord15", + "light": "nord15" + }, + "syntaxType": { + "dark": "nord7", + "light": "nord7" + }, + "syntaxOperator": { + "dark": "nord9", + "light": "nord9" + }, + "syntaxPunctuation": { + "dark": "nord4", + "light": "nord0" + } + } + }, + "one-dark": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg": "#282c34", + "darkBgAlt": "#21252b", + "darkBgPanel": "#353b45", + "darkFg": "#abb2bf", + "darkFgMuted": "#5c6370", + "darkPurple": "#c678dd", + "darkBlue": "#61afef", + "darkRed": "#e06c75", + "darkGreen": "#98c379", + "darkYellow": "#e5c07b", + "darkOrange": "#d19a66", + "darkCyan": "#56b6c2", + "lightBg": "#fafafa", + "lightBgAlt": "#f0f0f1", + "lightBgPanel": "#eaeaeb", + "lightFg": "#383a42", + "lightFgMuted": "#a0a1a7", + "lightPurple": "#a626a4", + "lightBlue": "#4078f2", + "lightRed": "#e45649", + "lightGreen": "#50a14f", + "lightYellow": "#c18401", + "lightOrange": "#986801", + "lightCyan": "#0184bc" + }, + "theme": { + "primary": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "secondary": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "accent": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "text": { + "dark": "darkFg", + "light": "lightFg" + }, + "textMuted": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "background": { + "dark": "darkBg", + "light": "lightBg" + }, + "backgroundPanel": { + "dark": "darkBgAlt", + "light": "lightBgAlt" + }, + "backgroundElement": { + "dark": "darkBgPanel", + "light": "lightBgPanel" + }, + "border": { + "dark": "#393f4a", + "light": "#d1d1d2" + }, + "borderActive": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "borderSubtle": { + "dark": "#2c313a", + "light": "#e0e0e1" + }, + "diffAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffContext": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "diffHunkHeader": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "diffHighlightAdded": { + "dark": "#aad482", + "light": "#489447" + }, + "diffHighlightRemoved": { + "dark": "#e8828b", + "light": "#d65145" + }, + "diffAddedBg": { + "dark": "#2c382b", + "light": "#eafbe9" + }, + "diffRemovedBg": { + "dark": "#3a2d2f", + "light": "#fce9e8" + }, + "diffContextBg": { + "dark": "darkBgAlt", + "light": "lightBgAlt" + }, + "diffLineNumber": { + "dark": "#495162", + "light": "#c9c9ca" + }, + "diffAddedLineNumberBg": { + "dark": "#283427", + "light": "#e1f3df" + }, + "diffRemovedLineNumberBg": { + "dark": "#36292b", + "light": "#f5e2e1" + }, + "markdownText": { + "dark": "darkFg", + "light": "lightFg" + }, + "markdownHeading": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "markdownLink": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownLinkText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCode": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "markdownListItem": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownImageText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCodeBlock": { + "dark": "darkFg", + "light": "lightFg" + }, + "syntaxComment": { + "dark": "darkFgMuted", + "light": "lightFgMuted" + }, + "syntaxKeyword": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "syntaxFunction": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "syntaxVariable": { + "dark": "darkRed", + "light": "lightRed" + }, + "syntaxString": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "syntaxNumber": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxPunctuation": { + "dark": "darkFg", + "light": "lightFg" + } + } + }, + "opencode": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkStep1": "#0a0a0a", + "darkStep2": "#141414", + "darkStep3": "#1e1e1e", + "darkStep4": "#282828", + "darkStep5": "#323232", + "darkStep6": "#3c3c3c", + "darkStep7": "#484848", + "darkStep8": "#606060", + "darkStep9": "#fab283", + "darkStep10": "#ffc09f", + "darkStep11": "#808080", + "darkStep12": "#eeeeee", + "darkSecondary": "#5c9cf5", + "darkAccent": "#9d7cd8", + "darkRed": "#e06c75", + "darkOrange": "#f5a742", + "darkGreen": "#7fd88f", + "darkCyan": "#56b6c2", + "darkYellow": "#e5c07b", + "lightStep1": "#ffffff", + "lightStep2": "#fafafa", + "lightStep3": "#f5f5f5", + "lightStep4": "#ebebeb", + "lightStep5": "#e1e1e1", + "lightStep6": "#d4d4d4", + "lightStep7": "#b8b8b8", + "lightStep8": "#a0a0a0", + "lightStep9": "#3b7dd8", + "lightStep10": "#2968c3", + "lightStep11": "#8a8a8a", + "lightStep12": "#1a1a1a", + "lightSecondary": "#7b5bb6", + "lightAccent": "#d68c27", + "lightRed": "#d1383d", + "lightOrange": "#d68c27", + "lightGreen": "#3d9a57", + "lightCyan": "#318795", + "lightYellow": "#b0851f" + }, + "theme": { + "primary": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "secondary": { + "dark": "darkSecondary", + "light": "lightSecondary" + }, + "accent": { + "dark": "darkAccent", + "light": "lightAccent" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "text": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "textMuted": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "background": { + "dark": "darkStep1", + "light": "lightStep1" + }, + "backgroundPanel": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "backgroundElement": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "border": { + "dark": "darkStep7", + "light": "lightStep7" + }, + "borderActive": { + "dark": "darkStep8", + "light": "lightStep8" + }, + "borderSubtle": { + "dark": "darkStep6", + "light": "lightStep6" + }, + "diffAdded": { + "dark": "#4fd6be", + "light": "#1e725c" + }, + "diffRemoved": { + "dark": "#c53b53", + "light": "#c53b53" + }, + "diffContext": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHunkHeader": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHighlightAdded": { + "dark": "#b8db87", + "light": "#4db380" + }, + "diffHighlightRemoved": { + "dark": "#e26a75", + "light": "#f52a65" + }, + "diffAddedBg": { + "dark": "#20303b", + "light": "#d5e5d5" + }, + "diffRemovedBg": { + "dark": "#37222c", + "light": "#f7d8db" + }, + "diffContextBg": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "diffLineNumber": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "diffAddedLineNumberBg": { + "dark": "#1b2b34", + "light": "#c5d5c5" + }, + "diffRemovedLineNumberBg": { + "dark": "#2d1f26", + "light": "#e7c8cb" + }, + "markdownText": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "markdownHeading": { + "dark": "darkAccent", + "light": "lightAccent" + }, + "markdownLink": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownLinkText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCode": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "markdownListItem": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownImageText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCodeBlock": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "syntaxComment": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "syntaxKeyword": { + "dark": "darkAccent", + "light": "lightAccent" + }, + "syntaxFunction": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "syntaxVariable": { + "dark": "darkRed", + "light": "lightRed" + }, + "syntaxString": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "syntaxNumber": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxPunctuation": { + "dark": "darkStep12", + "light": "lightStep12" + } + } + }, + "orng": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkStep1": "#0a0a0a", + "darkStep2": "#141414", + "darkStep3": "#1e1e1e", + "darkStep4": "#282828", + "darkStep5": "#323232", + "darkStep6": "#3c3c3c", + "darkStep7": "#484848", + "darkStep8": "#606060", + "darkStep9": "#EC5B2B", + "darkStep10": "#EE7948", + "darkStep11": "#808080", + "darkStep12": "#eeeeee", + "darkSecondary": "#EE7948", + "darkAccent": "#FFF7F1", + "darkRed": "#e06c75", + "darkOrange": "#EC5B2B", + "darkBlue": "#6ba1e6", + "darkCyan": "#56b6c2", + "darkYellow": "#e5c07b", + "lightStep1": "#ffffff", + "lightStep2": "#FFF7F1", + "lightStep3": "#f5f0eb", + "lightStep4": "#ebebeb", + "lightStep5": "#e1e1e1", + "lightStep6": "#d4d4d4", + "lightStep7": "#b8b8b8", + "lightStep8": "#a0a0a0", + "lightStep9": "#EC5B2B", + "lightStep10": "#c94d24", + "lightStep11": "#8a8a8a", + "lightStep12": "#1a1a1a", + "lightSecondary": "#EE7948", + "lightAccent": "#c94d24", + "lightRed": "#d1383d", + "lightOrange": "#EC5B2B", + "lightBlue": "#0062d1", + "lightCyan": "#318795", + "lightYellow": "#b0851f" + }, + "theme": { + "primary": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "secondary": { + "dark": "darkSecondary", + "light": "lightSecondary" + }, + "accent": { + "dark": "darkAccent", + "light": "lightAccent" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "success": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "info": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "text": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "textMuted": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "selectedListItemText": { + "dark": "#0a0a0a", + "light": "#ffffff" + }, + "background": { + "dark": "darkStep1", + "light": "lightStep1" + }, + "backgroundPanel": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "backgroundElement": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "border": { + "dark": "#EC5B2B", + "light": "#EC5B2B" + }, + "borderActive": { + "dark": "#EE7948", + "light": "#c94d24" + }, + "borderSubtle": { + "dark": "darkStep6", + "light": "lightStep6" + }, + "diffAdded": { + "dark": "#6ba1e6", + "light": "#0062d1" + }, + "diffRemoved": { + "dark": "#c53b53", + "light": "#c53b53" + }, + "diffContext": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHunkHeader": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHighlightAdded": { + "dark": "#6ba1e6", + "light": "#0062d1" + }, + "diffHighlightRemoved": { + "dark": "#e26a75", + "light": "#f52a65" + }, + "diffAddedBg": { + "dark": "#1a2a3d", + "light": "#e0edfa" + }, + "diffRemovedBg": { + "dark": "#37222c", + "light": "#f7d8db" + }, + "diffContextBg": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "diffLineNumber": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "diffAddedLineNumberBg": { + "dark": "#162535", + "light": "#d0e5f5" + }, + "diffRemovedLineNumberBg": { + "dark": "#2d1f26", + "light": "#e7c8cb" + }, + "markdownText": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "markdownHeading": { + "dark": "#EC5B2B", + "light": "#EC5B2B" + }, + "markdownLink": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownLinkText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCode": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownBlockQuote": { + "dark": "#FFF7F1", + "light": "lightYellow" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "#EE7948", + "light": "#EC5B2B" + }, + "markdownHorizontalRule": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "markdownListItem": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownImageText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCodeBlock": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "syntaxComment": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "syntaxKeyword": { + "dark": "#EC5B2B", + "light": "#EC5B2B" + }, + "syntaxFunction": { + "dark": "#EE7948", + "light": "#c94d24" + }, + "syntaxVariable": { + "dark": "darkRed", + "light": "lightRed" + }, + "syntaxString": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "syntaxNumber": { + "dark": "#FFF7F1", + "light": "#EC5B2B" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxPunctuation": { + "dark": "darkStep12", + "light": "lightStep12" + } + } + }, + "lucent-orng": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkStep6": "#3c3c3c", + "darkStep11": "#808080", + "darkStep12": "#eeeeee", + "darkSecondary": "#EE7948", + "darkAccent": "#FFF7F1", + "darkRed": "#e06c75", + "darkOrange": "#EC5B2B", + "darkBlue": "#6ba1e6", + "darkCyan": "#56b6c2", + "darkYellow": "#e5c07b", + "darkPanelBg": "#2a1a1599", + "lightStep6": "#d4d4d4", + "lightStep11": "#8a8a8a", + "lightStep12": "#1a1a1a", + "lightSecondary": "#EE7948", + "lightAccent": "#c94d24", + "lightRed": "#d1383d", + "lightOrange": "#EC5B2B", + "lightBlue": "#0062d1", + "lightCyan": "#318795", + "lightYellow": "#b0851f", + "lightPanelBg": "#fff5f099" + }, + "theme": { + "primary": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "secondary": { + "dark": "darkSecondary", + "light": "lightSecondary" + }, + "accent": { + "dark": "darkAccent", + "light": "lightAccent" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "success": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "info": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "text": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "textMuted": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "selectedListItemText": { + "dark": "#0a0a0a", + "light": "#ffffff" + }, + "background": { + "dark": "transparent", + "light": "transparent" + }, + "backgroundPanel": { + "dark": "transparent", + "light": "transparent" + }, + "backgroundElement": { + "dark": "transparent", + "light": "transparent" + }, + "backgroundMenu": { + "dark": "darkPanelBg", + "light": "lightPanelBg" + }, + "border": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "borderActive": { + "dark": "darkSecondary", + "light": "lightAccent" + }, + "borderSubtle": { + "dark": "darkStep6", + "light": "lightStep6" + }, + "diffAdded": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "diffRemoved": { + "dark": "#c53b53", + "light": "#c53b53" + }, + "diffContext": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHunkHeader": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHighlightAdded": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "diffHighlightRemoved": { + "dark": "#e26a75", + "light": "#f52a65" + }, + "diffAddedBg": { + "dark": "transparent", + "light": "transparent" + }, + "diffRemovedBg": { + "dark": "transparent", + "light": "transparent" + }, + "diffContextBg": { + "dark": "transparent", + "light": "transparent" + }, + "diffLineNumber": { + "dark": "#666666", + "light": "#999999" + }, + "diffAddedLineNumberBg": { + "dark": "transparent", + "light": "transparent" + }, + "diffRemovedLineNumberBg": { + "dark": "transparent", + "light": "transparent" + }, + "markdownText": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "markdownHeading": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownLink": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownLinkText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCode": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "markdownBlockQuote": { + "dark": "darkAccent", + "light": "lightYellow" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkSecondary", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "markdownListItem": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownImageText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCodeBlock": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "syntaxComment": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "syntaxKeyword": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxFunction": { + "dark": "darkSecondary", + "light": "lightAccent" + }, + "syntaxVariable": { + "dark": "darkRed", + "light": "lightRed" + }, + "syntaxString": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "syntaxNumber": { + "dark": "darkAccent", + "light": "lightOrange" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxPunctuation": { + "dark": "darkStep12", + "light": "lightStep12" + } + } + }, + "osaka-jade": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkBg0": "#111c18", + "darkBg1": "#1a2520", + "darkBg2": "#23372B", + "darkBg3": "#3d4a44", + "darkFg0": "#C1C497", + "darkFg1": "#9aa88a", + "darkGray": "#53685B", + "darkRed": "#FF5345", + "darkGreen": "#549e6a", + "darkYellow": "#459451", + "darkBlue": "#509475", + "darkMagenta": "#D2689C", + "darkCyan": "#2DD5B7", + "darkWhite": "#F6F5DD", + "darkRedBright": "#db9f9c", + "darkGreenBright": "#63b07a", + "darkYellowBright": "#E5C736", + "darkBlueBright": "#ACD4CF", + "darkMagentaBright": "#75bbb3", + "darkCyanBright": "#8CD3CB", + "lightBg0": "#F6F5DD", + "lightBg1": "#E8E7CC", + "lightBg2": "#D5D4B8", + "lightBg3": "#A8A78C", + "lightFg0": "#111c18", + "lightFg1": "#1a2520", + "lightGray": "#53685B", + "lightRed": "#c7392d", + "lightGreen": "#3d7a52", + "lightYellow": "#b5a020", + "lightBlue": "#3d7560", + "lightMagenta": "#a8527a", + "lightCyan": "#1faa90" + }, + "theme": { + "primary": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "secondary": { + "dark": "darkMagenta", + "light": "lightMagenta" + }, + "accent": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkYellowBright", + "light": "lightYellow" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "text": { + "dark": "darkFg0", + "light": "lightFg0" + }, + "textMuted": { + "dark": "darkGray", + "light": "lightGray" + }, + "background": { + "dark": "darkBg0", + "light": "lightBg0" + }, + "backgroundPanel": { + "dark": "darkBg1", + "light": "lightBg1" + }, + "backgroundElement": { + "dark": "darkBg2", + "light": "lightBg2" + }, + "border": { + "dark": "darkBg3", + "light": "lightBg3" + }, + "borderActive": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "borderSubtle": { + "dark": "darkBg2", + "light": "lightBg2" + }, + "diffAdded": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "diffRemoved": { + "dark": "darkRed", + "light": "lightRed" + }, + "diffContext": { + "dark": "darkGray", + "light": "lightGray" + }, + "diffHunkHeader": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "diffHighlightAdded": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "diffHighlightRemoved": { + "dark": "darkRedBright", + "light": "lightRed" + }, + "diffAddedBg": { + "dark": "#15241c", + "light": "#e0eee5" + }, + "diffRemovedBg": { + "dark": "#241515", + "light": "#eee0e0" + }, + "diffContextBg": { + "dark": "darkBg1", + "light": "lightBg1" + }, + "diffLineNumber": { + "dark": "darkBg3", + "light": "lightBg3" + }, + "diffAddedLineNumberBg": { + "dark": "#121f18", + "light": "#d5e5da" + }, + "diffRemovedLineNumberBg": { + "dark": "#1f1212", + "light": "#e5d5d5" + }, + "markdownText": { + "dark": "darkFg0", + "light": "lightFg0" + }, + "markdownHeading": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownLink": { + "dark": "darkCyanBright", + "light": "lightCyan" + }, + "markdownLinkText": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownCode": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkGray", + "light": "lightGray" + }, + "markdownEmph": { + "dark": "darkMagenta", + "light": "lightMagenta" + }, + "markdownStrong": { + "dark": "darkFg0", + "light": "lightFg0" + }, + "markdownHorizontalRule": { + "dark": "darkGray", + "light": "lightGray" + }, + "markdownListItem": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownListEnumeration": { + "dark": "darkCyanBright", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkCyanBright", + "light": "lightCyan" + }, + "markdownImageText": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownCodeBlock": { + "dark": "darkFg0", + "light": "lightFg0" + }, + "syntaxComment": { + "dark": "darkGray", + "light": "lightGray" + }, + "syntaxKeyword": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxFunction": { + "dark": "darkBlue", + "light": "lightBlue" + }, + "syntaxVariable": { + "dark": "darkFg0", + "light": "lightFg0" + }, + "syntaxString": { + "dark": "darkGreenBright", + "light": "lightGreen" + }, + "syntaxNumber": { + "dark": "darkMagenta", + "light": "lightMagenta" + }, + "syntaxType": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "syntaxOperator": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxPunctuation": { + "dark": "darkFg0", + "light": "lightFg0" + } + } + }, + "palenight": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "background": "#292d3e", + "backgroundAlt": "#1e2132", + "backgroundPanel": "#32364a", + "foreground": "#a6accd", + "foregroundBright": "#bfc7d5", + "comment": "#676e95", + "red": "#f07178", + "orange": "#f78c6c", + "yellow": "#ffcb6b", + "green": "#c3e88d", + "cyan": "#89ddff", + "blue": "#82aaff", + "purple": "#c792ea", + "magenta": "#ff5370", + "pink": "#f07178" + }, + "theme": { + "primary": { + "dark": "blue", + "light": "#4976eb" + }, + "secondary": { + "dark": "purple", + "light": "#a854f2" + }, + "accent": { + "dark": "cyan", + "light": "#00acc1" + }, + "error": { + "dark": "red", + "light": "#e53935" + }, + "warning": { + "dark": "yellow", + "light": "#ffb300" + }, + "success": { + "dark": "green", + "light": "#91b859" + }, + "info": { + "dark": "orange", + "light": "#f4511e" + }, + "text": { + "dark": "foreground", + "light": "#292d3e" + }, + "textMuted": { + "dark": "comment", + "light": "#8796b0" + }, + "background": { + "dark": "#292d3e", + "light": "#fafafa" + }, + "backgroundPanel": { + "dark": "#1e2132", + "light": "#f5f5f5" + }, + "backgroundElement": { + "dark": "#32364a", + "light": "#e7e7e8" + }, + "border": { + "dark": "#32364a", + "light": "#e0e0e0" + }, + "borderActive": { + "dark": "blue", + "light": "#4976eb" + }, + "borderSubtle": { + "dark": "#1e2132", + "light": "#eeeeee" + }, + "diffAdded": { + "dark": "green", + "light": "#91b859" + }, + "diffRemoved": { + "dark": "red", + "light": "#e53935" + }, + "diffContext": { + "dark": "comment", + "light": "#8796b0" + }, + "diffHunkHeader": { + "dark": "cyan", + "light": "#00acc1" + }, + "diffHighlightAdded": { + "dark": "green", + "light": "#91b859" + }, + "diffHighlightRemoved": { + "dark": "red", + "light": "#e53935" + }, + "diffAddedBg": { + "dark": "#2e3c2b", + "light": "#e8f5e9" + }, + "diffRemovedBg": { + "dark": "#3c2b2b", + "light": "#ffebee" + }, + "diffContextBg": { + "dark": "#1e2132", + "light": "#f5f5f5" + }, + "diffLineNumber": { + "dark": "#444760", + "light": "#cfd8dc" + }, + "diffAddedLineNumberBg": { + "dark": "#2e3c2b", + "light": "#e8f5e9" + }, + "diffRemovedLineNumberBg": { + "dark": "#3c2b2b", + "light": "#ffebee" + }, + "markdownText": { + "dark": "foreground", + "light": "#292d3e" + }, + "markdownHeading": { + "dark": "purple", + "light": "#a854f2" + }, + "markdownLink": { + "dark": "blue", + "light": "#4976eb" + }, + "markdownLinkText": { + "dark": "cyan", + "light": "#00acc1" + }, + "markdownCode": { + "dark": "green", + "light": "#91b859" + }, + "markdownBlockQuote": { + "dark": "comment", + "light": "#8796b0" + }, + "markdownEmph": { + "dark": "yellow", + "light": "#ffb300" + }, + "markdownStrong": { + "dark": "orange", + "light": "#f4511e" + }, + "markdownHorizontalRule": { + "dark": "comment", + "light": "#8796b0" + }, + "markdownListItem": { + "dark": "blue", + "light": "#4976eb" + }, + "markdownListEnumeration": { + "dark": "cyan", + "light": "#00acc1" + }, + "markdownImage": { + "dark": "blue", + "light": "#4976eb" + }, + "markdownImageText": { + "dark": "cyan", + "light": "#00acc1" + }, + "markdownCodeBlock": { + "dark": "foreground", + "light": "#292d3e" + }, + "syntaxComment": { + "dark": "comment", + "light": "#8796b0" + }, + "syntaxKeyword": { + "dark": "purple", + "light": "#a854f2" + }, + "syntaxFunction": { + "dark": "blue", + "light": "#4976eb" + }, + "syntaxVariable": { + "dark": "foreground", + "light": "#292d3e" + }, + "syntaxString": { + "dark": "green", + "light": "#91b859" + }, + "syntaxNumber": { + "dark": "orange", + "light": "#f4511e" + }, + "syntaxType": { + "dark": "yellow", + "light": "#ffb300" + }, + "syntaxOperator": { + "dark": "cyan", + "light": "#00acc1" + }, + "syntaxPunctuation": { + "dark": "foreground", + "light": "#292d3e" + } + } + }, + "rosepine": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "base": "#191724", + "surface": "#1f1d2e", + "overlay": "#26233a", + "muted": "#6e6a86", + "subtle": "#908caa", + "text": "#e0def4", + "love": "#eb6f92", + "gold": "#f6c177", + "rose": "#ebbcba", + "pine": "#31748f", + "foam": "#9ccfd8", + "iris": "#c4a7e7", + "highlightLow": "#21202e", + "highlightMed": "#403d52", + "highlightHigh": "#524f67", + "moonBase": "#232136", + "moonSurface": "#2a273f", + "moonOverlay": "#393552", + "moonMuted": "#6e6a86", + "moonSubtle": "#908caa", + "moonText": "#e0def4", + "dawnBase": "#faf4ed", + "dawnSurface": "#fffaf3", + "dawnOverlay": "#f2e9e1", + "dawnMuted": "#9893a5", + "dawnSubtle": "#797593", + "dawnText": "#575279" + }, + "theme": { + "primary": { + "dark": "foam", + "light": "pine" + }, + "secondary": { + "dark": "iris", + "light": "#907aa9" + }, + "accent": { + "dark": "rose", + "light": "#d7827e" + }, + "error": { + "dark": "love", + "light": "#b4637a" + }, + "warning": { + "dark": "gold", + "light": "#ea9d34" + }, + "success": { + "dark": "pine", + "light": "#286983" + }, + "info": { + "dark": "foam", + "light": "#56949f" + }, + "text": { + "dark": "#e0def4", + "light": "#575279" + }, + "textMuted": { + "dark": "muted", + "light": "dawnMuted" + }, + "background": { + "dark": "base", + "light": "dawnBase" + }, + "backgroundPanel": { + "dark": "surface", + "light": "dawnSurface" + }, + "backgroundElement": { + "dark": "overlay", + "light": "dawnOverlay" + }, + "border": { + "dark": "highlightMed", + "light": "#dfdad9" + }, + "borderActive": { + "dark": "foam", + "light": "pine" + }, + "borderSubtle": { + "dark": "highlightLow", + "light": "#f4ede8" + }, + "diffAdded": { + "dark": "pine", + "light": "#286983" + }, + "diffRemoved": { + "dark": "love", + "light": "#b4637a" + }, + "diffContext": { + "dark": "muted", + "light": "dawnMuted" + }, + "diffHunkHeader": { + "dark": "iris", + "light": "#907aa9" + }, + "diffHighlightAdded": { + "dark": "pine", + "light": "#286983" + }, + "diffHighlightRemoved": { + "dark": "love", + "light": "#b4637a" + }, + "diffAddedBg": { + "dark": "#1f2d3a", + "light": "#e5f2f3" + }, + "diffRemovedBg": { + "dark": "#3a1f2d", + "light": "#fce5e8" + }, + "diffContextBg": { + "dark": "surface", + "light": "dawnSurface" + }, + "diffLineNumber": { + "dark": "muted", + "light": "dawnMuted" + }, + "diffAddedLineNumberBg": { + "dark": "#1f2d3a", + "light": "#e5f2f3" + }, + "diffRemovedLineNumberBg": { + "dark": "#3a1f2d", + "light": "#fce5e8" + }, + "markdownText": { + "dark": "#e0def4", + "light": "#575279" + }, + "markdownHeading": { + "dark": "iris", + "light": "#907aa9" + }, + "markdownLink": { + "dark": "foam", + "light": "pine" + }, + "markdownLinkText": { + "dark": "rose", + "light": "#d7827e" + }, + "markdownCode": { + "dark": "pine", + "light": "#286983" + }, + "markdownBlockQuote": { + "dark": "muted", + "light": "dawnMuted" + }, + "markdownEmph": { + "dark": "gold", + "light": "#ea9d34" + }, + "markdownStrong": { + "dark": "love", + "light": "#b4637a" + }, + "markdownHorizontalRule": { + "dark": "highlightMed", + "light": "#dfdad9" + }, + "markdownListItem": { + "dark": "foam", + "light": "pine" + }, + "markdownListEnumeration": { + "dark": "rose", + "light": "#d7827e" + }, + "markdownImage": { + "dark": "foam", + "light": "pine" + }, + "markdownImageText": { + "dark": "rose", + "light": "#d7827e" + }, + "markdownCodeBlock": { + "dark": "#e0def4", + "light": "#575279" + }, + "syntaxComment": { + "dark": "muted", + "light": "dawnMuted" + }, + "syntaxKeyword": { + "dark": "pine", + "light": "#286983" + }, + "syntaxFunction": { + "dark": "rose", + "light": "#d7827e" + }, + "syntaxVariable": { + "dark": "#e0def4", + "light": "#575279" + }, + "syntaxString": { + "dark": "gold", + "light": "#ea9d34" + }, + "syntaxNumber": { + "dark": "iris", + "light": "#907aa9" + }, + "syntaxType": { + "dark": "foam", + "light": "#56949f" + }, + "syntaxOperator": { + "dark": "subtle", + "light": "dawnSubtle" + }, + "syntaxPunctuation": { + "dark": "subtle", + "light": "dawnSubtle" + } + } + }, + "solarized": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "base03": "#002b36", + "base02": "#073642", + "base01": "#586e75", + "base00": "#657b83", + "base0": "#839496", + "base1": "#93a1a1", + "base2": "#eee8d5", + "base3": "#fdf6e3", + "yellow": "#b58900", + "orange": "#cb4b16", + "red": "#dc322f", + "magenta": "#d33682", + "violet": "#6c71c4", + "blue": "#268bd2", + "cyan": "#2aa198", + "green": "#859900" + }, + "theme": { + "primary": { + "dark": "blue", + "light": "blue" + }, + "secondary": { + "dark": "violet", + "light": "violet" + }, + "accent": { + "dark": "cyan", + "light": "cyan" + }, + "error": { + "dark": "red", + "light": "red" + }, + "warning": { + "dark": "yellow", + "light": "yellow" + }, + "success": { + "dark": "green", + "light": "green" + }, + "info": { + "dark": "orange", + "light": "orange" + }, + "text": { + "dark": "base0", + "light": "base00" + }, + "textMuted": { + "dark": "base01", + "light": "base1" + }, + "background": { + "dark": "base03", + "light": "base3" + }, + "backgroundPanel": { + "dark": "base02", + "light": "base2" + }, + "backgroundElement": { + "dark": "#073642", + "light": "#eee8d5" + }, + "border": { + "dark": "base02", + "light": "base2" + }, + "borderActive": { + "dark": "base01", + "light": "base1" + }, + "borderSubtle": { + "dark": "#073642", + "light": "#eee8d5" + }, + "diffAdded": { + "dark": "green", + "light": "green" + }, + "diffRemoved": { + "dark": "red", + "light": "red" + }, + "diffContext": { + "dark": "base01", + "light": "base1" + }, + "diffHunkHeader": { + "dark": "base01", + "light": "base1" + }, + "diffHighlightAdded": { + "dark": "green", + "light": "green" + }, + "diffHighlightRemoved": { + "dark": "red", + "light": "red" + }, + "diffAddedBg": { + "dark": "#073642", + "light": "#eee8d5" + }, + "diffRemovedBg": { + "dark": "#073642", + "light": "#eee8d5" + }, + "diffContextBg": { + "dark": "base02", + "light": "base2" + }, + "diffLineNumber": { + "dark": "base01", + "light": "base1" + }, + "diffAddedLineNumberBg": { + "dark": "#073642", + "light": "#eee8d5" + }, + "diffRemovedLineNumberBg": { + "dark": "#073642", + "light": "#eee8d5" + }, + "markdownText": { + "dark": "base0", + "light": "base00" + }, + "markdownHeading": { + "dark": "blue", + "light": "blue" + }, + "markdownLink": { + "dark": "cyan", + "light": "cyan" + }, + "markdownLinkText": { + "dark": "violet", + "light": "violet" + }, + "markdownCode": { + "dark": "green", + "light": "green" + }, + "markdownBlockQuote": { + "dark": "base01", + "light": "base1" + }, + "markdownEmph": { + "dark": "yellow", + "light": "yellow" + }, + "markdownStrong": { + "dark": "orange", + "light": "orange" + }, + "markdownHorizontalRule": { + "dark": "base01", + "light": "base1" + }, + "markdownListItem": { + "dark": "blue", + "light": "blue" + }, + "markdownListEnumeration": { + "dark": "cyan", + "light": "cyan" + }, + "markdownImage": { + "dark": "cyan", + "light": "cyan" + }, + "markdownImageText": { + "dark": "violet", + "light": "violet" + }, + "markdownCodeBlock": { + "dark": "base0", + "light": "base00" + }, + "syntaxComment": { + "dark": "base01", + "light": "base1" + }, + "syntaxKeyword": { + "dark": "green", + "light": "green" + }, + "syntaxFunction": { + "dark": "blue", + "light": "blue" + }, + "syntaxVariable": { + "dark": "cyan", + "light": "cyan" + }, + "syntaxString": { + "dark": "cyan", + "light": "cyan" + }, + "syntaxNumber": { + "dark": "magenta", + "light": "magenta" + }, + "syntaxType": { + "dark": "yellow", + "light": "yellow" + }, + "syntaxOperator": { + "dark": "green", + "light": "green" + }, + "syntaxPunctuation": { + "dark": "base0", + "light": "base00" + } + } + }, + "synthwave84": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "background": "#262335", + "backgroundAlt": "#1e1a29", + "backgroundPanel": "#2a2139", + "foreground": "#ffffff", + "foregroundMuted": "#848bbd", + "pink": "#ff7edb", + "pinkBright": "#ff92df", + "cyan": "#36f9f6", + "cyanBright": "#72f1f8", + "yellow": "#fede5d", + "yellowBright": "#fff95d", + "orange": "#ff8b39", + "orangeBright": "#ff9f43", + "purple": "#b084eb", + "purpleBright": "#c792ea", + "red": "#fe4450", + "redBright": "#ff5e5b", + "green": "#72f1b8", + "greenBright": "#97f1d8" + }, + "theme": { + "primary": { + "dark": "cyan", + "light": "#00bcd4" + }, + "secondary": { + "dark": "pink", + "light": "#e91e63" + }, + "accent": { + "dark": "purple", + "light": "#9c27b0" + }, + "error": { + "dark": "red", + "light": "#f44336" + }, + "warning": { + "dark": "yellow", + "light": "#ff9800" + }, + "success": { + "dark": "green", + "light": "#4caf50" + }, + "info": { + "dark": "orange", + "light": "#ff5722" + }, + "text": { + "dark": "foreground", + "light": "#262335" + }, + "textMuted": { + "dark": "foregroundMuted", + "light": "#5c5c8a" + }, + "background": { + "dark": "#262335", + "light": "#fafafa" + }, + "backgroundPanel": { + "dark": "#1e1a29", + "light": "#f5f5f5" + }, + "backgroundElement": { + "dark": "#2a2139", + "light": "#eeeeee" + }, + "border": { + "dark": "#495495", + "light": "#e0e0e0" + }, + "borderActive": { + "dark": "cyan", + "light": "#00bcd4" + }, + "borderSubtle": { + "dark": "#241b2f", + "light": "#f0f0f0" + }, + "diffAdded": { + "dark": "green", + "light": "#4caf50" + }, + "diffRemoved": { + "dark": "red", + "light": "#f44336" + }, + "diffContext": { + "dark": "foregroundMuted", + "light": "#5c5c8a" + }, + "diffHunkHeader": { + "dark": "purple", + "light": "#9c27b0" + }, + "diffHighlightAdded": { + "dark": "greenBright", + "light": "#4caf50" + }, + "diffHighlightRemoved": { + "dark": "redBright", + "light": "#f44336" + }, + "diffAddedBg": { + "dark": "#1a3a2a", + "light": "#e8f5e9" + }, + "diffRemovedBg": { + "dark": "#3a1a2a", + "light": "#ffebee" + }, + "diffContextBg": { + "dark": "#1e1a29", + "light": "#f5f5f5" + }, + "diffLineNumber": { + "dark": "#495495", + "light": "#b0b0b0" + }, + "diffAddedLineNumberBg": { + "dark": "#1a3a2a", + "light": "#e8f5e9" + }, + "diffRemovedLineNumberBg": { + "dark": "#3a1a2a", + "light": "#ffebee" + }, + "markdownText": { + "dark": "foreground", + "light": "#262335" + }, + "markdownHeading": { + "dark": "pink", + "light": "#e91e63" + }, + "markdownLink": { + "dark": "cyan", + "light": "#00bcd4" + }, + "markdownLinkText": { + "dark": "purple", + "light": "#9c27b0" + }, + "markdownCode": { + "dark": "green", + "light": "#4caf50" + }, + "markdownBlockQuote": { + "dark": "foregroundMuted", + "light": "#5c5c8a" + }, + "markdownEmph": { + "dark": "yellow", + "light": "#ff9800" + }, + "markdownStrong": { + "dark": "orange", + "light": "#ff5722" + }, + "markdownHorizontalRule": { + "dark": "#495495", + "light": "#e0e0e0" + }, + "markdownListItem": { + "dark": "cyan", + "light": "#00bcd4" + }, + "markdownListEnumeration": { + "dark": "purple", + "light": "#9c27b0" + }, + "markdownImage": { + "dark": "cyan", + "light": "#00bcd4" + }, + "markdownImageText": { + "dark": "purple", + "light": "#9c27b0" + }, + "markdownCodeBlock": { + "dark": "foreground", + "light": "#262335" + }, + "syntaxComment": { + "dark": "foregroundMuted", + "light": "#5c5c8a" + }, + "syntaxKeyword": { + "dark": "pink", + "light": "#e91e63" + }, + "syntaxFunction": { + "dark": "orange", + "light": "#ff5722" + }, + "syntaxVariable": { + "dark": "foreground", + "light": "#262335" + }, + "syntaxString": { + "dark": "yellow", + "light": "#ff9800" + }, + "syntaxNumber": { + "dark": "purple", + "light": "#9c27b0" + }, + "syntaxType": { + "dark": "cyan", + "light": "#00bcd4" + }, + "syntaxOperator": { + "dark": "pink", + "light": "#e91e63" + }, + "syntaxPunctuation": { + "dark": "foreground", + "light": "#262335" + } + } + }, + "tokyonight": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "darkStep1": "#1a1b26", + "darkStep2": "#1e2030", + "darkStep3": "#222436", + "darkStep4": "#292e42", + "darkStep5": "#3b4261", + "darkStep6": "#545c7e", + "darkStep7": "#737aa2", + "darkStep8": "#9099b2", + "darkStep9": "#82aaff", + "darkStep10": "#89b4fa", + "darkStep11": "#828bb8", + "darkStep12": "#c8d3f5", + "darkRed": "#ff757f", + "darkOrange": "#ff966c", + "darkYellow": "#ffc777", + "darkGreen": "#c3e88d", + "darkCyan": "#86e1fc", + "darkPurple": "#c099ff", + "lightStep1": "#e1e2e7", + "lightStep2": "#d5d6db", + "lightStep3": "#c8c9ce", + "lightStep4": "#b9bac1", + "lightStep5": "#a8aecb", + "lightStep6": "#9699a8", + "lightStep7": "#737a8c", + "lightStep8": "#5a607d", + "lightStep9": "#2e7de9", + "lightStep10": "#1a6ce7", + "lightStep11": "#8990a3", + "lightStep12": "#3760bf", + "lightRed": "#f52a65", + "lightOrange": "#b15c00", + "lightYellow": "#8c6c3e", + "lightGreen": "#587539", + "lightCyan": "#007197", + "lightPurple": "#9854f1" + }, + "theme": { + "primary": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "secondary": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "accent": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "error": { + "dark": "darkRed", + "light": "lightRed" + }, + "warning": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "success": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "info": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "text": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "textMuted": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "background": { + "dark": "darkStep1", + "light": "lightStep1" + }, + "backgroundPanel": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "backgroundElement": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "border": { + "dark": "darkStep7", + "light": "lightStep7" + }, + "borderActive": { + "dark": "darkStep8", + "light": "lightStep8" + }, + "borderSubtle": { + "dark": "darkStep6", + "light": "lightStep6" + }, + "diffAdded": { + "dark": "#4fd6be", + "light": "#1e725c" + }, + "diffRemoved": { + "dark": "#c53b53", + "light": "#c53b53" + }, + "diffContext": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHunkHeader": { + "dark": "#828bb8", + "light": "#7086b5" + }, + "diffHighlightAdded": { + "dark": "#b8db87", + "light": "#4db380" + }, + "diffHighlightRemoved": { + "dark": "#e26a75", + "light": "#f52a65" + }, + "diffAddedBg": { + "dark": "#20303b", + "light": "#d5e5d5" + }, + "diffRemovedBg": { + "dark": "#37222c", + "light": "#f7d8db" + }, + "diffContextBg": { + "dark": "darkStep2", + "light": "lightStep2" + }, + "diffLineNumber": { + "dark": "darkStep3", + "light": "lightStep3" + }, + "diffAddedLineNumberBg": { + "dark": "#1b2b34", + "light": "#c5d5c5" + }, + "diffRemovedLineNumberBg": { + "dark": "#2d1f26", + "light": "#e7c8cb" + }, + "markdownText": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "markdownHeading": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "markdownLink": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownLinkText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCode": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "markdownBlockQuote": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownEmph": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "markdownStrong": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "markdownHorizontalRule": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "markdownListItem": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownListEnumeration": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownImage": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "markdownImageText": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "markdownCodeBlock": { + "dark": "darkStep12", + "light": "lightStep12" + }, + "syntaxComment": { + "dark": "darkStep11", + "light": "lightStep11" + }, + "syntaxKeyword": { + "dark": "darkPurple", + "light": "lightPurple" + }, + "syntaxFunction": { + "dark": "darkStep9", + "light": "lightStep9" + }, + "syntaxVariable": { + "dark": "darkRed", + "light": "lightRed" + }, + "syntaxString": { + "dark": "darkGreen", + "light": "lightGreen" + }, + "syntaxNumber": { + "dark": "darkOrange", + "light": "lightOrange" + }, + "syntaxType": { + "dark": "darkYellow", + "light": "lightYellow" + }, + "syntaxOperator": { + "dark": "darkCyan", + "light": "lightCyan" + }, + "syntaxPunctuation": { + "dark": "darkStep12", + "light": "lightStep12" + } + } + }, + "vercel": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "background100": "#0A0A0A", + "background200": "#000000", + "gray100": "#1A1A1A", + "gray200": "#1F1F1F", + "gray300": "#292929", + "gray400": "#2E2E2E", + "gray500": "#454545", + "gray600": "#878787", + "gray700": "#8F8F8F", + "gray900": "#A1A1A1", + "gray1000": "#EDEDED", + "blue600": "#0099FF", + "blue700": "#0070F3", + "blue900": "#52A8FF", + "blue1000": "#EBF8FF", + "red700": "#E5484D", + "red900": "#FF6166", + "red1000": "#FDECED", + "amber700": "#FFB224", + "amber900": "#F2A700", + "amber1000": "#FDF4DC", + "green700": "#46A758", + "green900": "#63C46D", + "green1000": "#E6F9E9", + "teal700": "#12A594", + "teal900": "#0AC7AC", + "purple700": "#8E4EC6", + "purple900": "#BF7AF0", + "pink700": "#E93D82", + "pink900": "#F75590", + "highlightPink": "#FF0080", + "highlightPurple": "#F81CE5", + "cyan": "#50E3C2", + "lightBackground": "#FFFFFF", + "lightGray100": "#FAFAFA", + "lightGray200": "#EAEAEA", + "lightGray600": "#666666", + "lightGray1000": "#171717" + }, + "theme": { + "primary": { + "dark": "blue700", + "light": "blue700" + }, + "secondary": { + "dark": "blue900", + "light": "#0062D1" + }, + "accent": { + "dark": "purple700", + "light": "purple700" + }, + "error": { + "dark": "red700", + "light": "#DC3545" + }, + "warning": { + "dark": "amber700", + "light": "#FF9500" + }, + "success": { + "dark": "green700", + "light": "#388E3C" + }, + "info": { + "dark": "blue900", + "light": "blue700" + }, + "text": { + "dark": "gray1000", + "light": "lightGray1000" + }, + "textMuted": { + "dark": "gray600", + "light": "lightGray600" + }, + "background": { + "dark": "background200", + "light": "lightBackground" + }, + "backgroundPanel": { + "dark": "gray100", + "light": "lightGray100" + }, + "backgroundElement": { + "dark": "gray300", + "light": "lightGray200" + }, + "border": { + "dark": "gray200", + "light": "lightGray200" + }, + "borderActive": { + "dark": "gray500", + "light": "#999999" + }, + "borderSubtle": { + "dark": "gray100", + "light": "#EAEAEA" + }, + "diffAdded": { + "dark": "green900", + "light": "green700" + }, + "diffRemoved": { + "dark": "red900", + "light": "red700" + }, + "diffContext": { + "dark": "gray600", + "light": "lightGray600" + }, + "diffHunkHeader": { + "dark": "gray600", + "light": "lightGray600" + }, + "diffHighlightAdded": { + "dark": "green900", + "light": "green700" + }, + "diffHighlightRemoved": { + "dark": "red900", + "light": "red700" + }, + "diffAddedBg": { + "dark": "#0B1D0F", + "light": "#E6F9E9" + }, + "diffRemovedBg": { + "dark": "#2A1314", + "light": "#FDECED" + }, + "diffContextBg": { + "dark": "background200", + "light": "lightBackground" + }, + "diffLineNumber": { + "dark": "gray600", + "light": "lightGray600" + }, + "diffAddedLineNumberBg": { + "dark": "#0F2613", + "light": "#D6F5D6" + }, + "diffRemovedLineNumberBg": { + "dark": "#3C1618", + "light": "#FFE5E5" + }, + "markdownText": { + "dark": "gray1000", + "light": "lightGray1000" + }, + "markdownHeading": { + "dark": "purple900", + "light": "purple700" + }, + "markdownLink": { + "dark": "blue900", + "light": "blue700" + }, + "markdownLinkText": { + "dark": "teal900", + "light": "teal700" + }, + "markdownCode": { + "dark": "green900", + "light": "green700" + }, + "markdownBlockQuote": { + "dark": "gray600", + "light": "lightGray600" + }, + "markdownEmph": { + "dark": "amber900", + "light": "amber700" + }, + "markdownStrong": { + "dark": "pink900", + "light": "pink700" + }, + "markdownHorizontalRule": { + "dark": "gray500", + "light": "#999999" + }, + "markdownListItem": { + "dark": "gray1000", + "light": "lightGray1000" + }, + "markdownListEnumeration": { + "dark": "blue900", + "light": "blue700" + }, + "markdownImage": { + "dark": "teal900", + "light": "teal700" + }, + "markdownImageText": { + "dark": "cyan", + "light": "teal700" + }, + "markdownCodeBlock": { + "dark": "gray1000", + "light": "lightGray1000" + }, + "syntaxComment": { + "dark": "gray600", + "light": "#888888" + }, + "syntaxKeyword": { + "dark": "pink900", + "light": "pink700" + }, + "syntaxFunction": { + "dark": "purple900", + "light": "purple700" + }, + "syntaxVariable": { + "dark": "blue900", + "light": "blue700" + }, + "syntaxString": { + "dark": "green900", + "light": "green700" + }, + "syntaxNumber": { + "dark": "amber900", + "light": "amber700" + }, + "syntaxType": { + "dark": "teal900", + "light": "teal700" + }, + "syntaxOperator": { + "dark": "pink900", + "light": "pink700" + }, + "syntaxPunctuation": { + "dark": "gray1000", + "light": "lightGray1000" + } + } + }, + "vesper": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "vesperBg": "#101010", + "vesperFg": "#FFF", + "vesperComment": "#8b8b8b", + "vesperKeyword": "#A0A0A0", + "vesperFunction": "#FFC799", + "vesperString": "#99FFE4", + "vesperNumber": "#FFC799", + "vesperError": "#FF8080", + "vesperWarning": "#FFC799", + "vesperSuccess": "#99FFE4", + "vesperMuted": "#A0A0A0" + }, + "theme": { + "primary": { + "dark": "#FFC799", + "light": "#FFC799" + }, + "secondary": { + "dark": "#99FFE4", + "light": "#99FFE4" + }, + "accent": { + "dark": "#FFC799", + "light": "#FFC799" + }, + "error": { + "dark": "vesperError", + "light": "vesperError" + }, + "warning": { + "dark": "vesperWarning", + "light": "vesperWarning" + }, + "success": { + "dark": "vesperSuccess", + "light": "vesperSuccess" + }, + "info": { + "dark": "#FFC799", + "light": "#FFC799" + }, + "text": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "textMuted": { + "dark": "vesperMuted", + "light": "vesperMuted" + }, + "background": { + "dark": "vesperBg", + "light": "#FFF" + }, + "backgroundPanel": { + "dark": "vesperBg", + "light": "#F0F0F0" + }, + "backgroundElement": { + "dark": "vesperBg", + "light": "#E0E0E0" + }, + "border": { + "dark": "#282828", + "light": "#D0D0D0" + }, + "borderActive": { + "dark": "#FFC799", + "light": "#FFC799" + }, + "borderSubtle": { + "dark": "#1C1C1C", + "light": "#E8E8E8" + }, + "diffAdded": { + "dark": "vesperSuccess", + "light": "vesperSuccess" + }, + "diffRemoved": { + "dark": "vesperError", + "light": "vesperError" + }, + "diffContext": { + "dark": "vesperMuted", + "light": "vesperMuted" + }, + "diffHunkHeader": { + "dark": "vesperMuted", + "light": "vesperMuted" + }, + "diffHighlightAdded": { + "dark": "vesperSuccess", + "light": "vesperSuccess" + }, + "diffHighlightRemoved": { + "dark": "vesperError", + "light": "vesperError" + }, + "diffAddedBg": { + "dark": "#0d2818", + "light": "#e8f5e8" + }, + "diffRemovedBg": { + "dark": "#281a1a", + "light": "#f5e8e8" + }, + "diffContextBg": { + "dark": "vesperBg", + "light": "#F8F8F8" + }, + "diffLineNumber": { + "dark": "#505050", + "light": "#808080" + }, + "diffAddedLineNumberBg": { + "dark": "#0d2818", + "light": "#e8f5e8" + }, + "diffRemovedLineNumberBg": { + "dark": "#281a1a", + "light": "#f5e8e8" + }, + "markdownText": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "markdownHeading": { + "dark": "#FFC799", + "light": "#FFC799" + }, + "markdownLink": { + "dark": "#FFC799", + "light": "#FFC799" + }, + "markdownLinkText": { + "dark": "vesperMuted", + "light": "vesperMuted" + }, + "markdownCode": { + "dark": "vesperMuted", + "light": "vesperMuted" + }, + "markdownBlockQuote": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "markdownEmph": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "markdownStrong": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "markdownHorizontalRule": { + "dark": "#65737E", + "light": "#65737E" + }, + "markdownListItem": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "markdownListEnumeration": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "markdownImage": { + "dark": "#FFC799", + "light": "#FFC799" + }, + "markdownImageText": { + "dark": "vesperMuted", + "light": "vesperMuted" + }, + "markdownCodeBlock": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "syntaxComment": { + "dark": "vesperComment", + "light": "vesperComment" + }, + "syntaxKeyword": { + "dark": "vesperKeyword", + "light": "vesperKeyword" + }, + "syntaxFunction": { + "dark": "vesperFunction", + "light": "vesperFunction" + }, + "syntaxVariable": { + "dark": "vesperFg", + "light": "vesperBg" + }, + "syntaxString": { + "dark": "vesperString", + "light": "vesperString" + }, + "syntaxNumber": { + "dark": "vesperNumber", + "light": "vesperNumber" + }, + "syntaxType": { + "dark": "vesperFunction", + "light": "vesperFunction" + }, + "syntaxOperator": { + "dark": "vesperKeyword", + "light": "vesperKeyword" + }, + "syntaxPunctuation": { + "dark": "vesperFg", + "light": "vesperBg" + } + } + }, + "zenburn": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "bg": "#3f3f3f", + "bgAlt": "#4f4f4f", + "bgPanel": "#5f5f5f", + "fg": "#dcdccc", + "fgMuted": "#9f9f9f", + "red": "#cc9393", + "redBright": "#dca3a3", + "green": "#7f9f7f", + "greenBright": "#8fb28f", + "yellow": "#f0dfaf", + "yellowDim": "#e0cf9f", + "blue": "#8cd0d3", + "blueDim": "#7cb8bb", + "magenta": "#dc8cc3", + "cyan": "#93e0e3", + "orange": "#dfaf8f" + }, + "theme": { + "primary": { + "dark": "blue", + "light": "#5f7f8f" + }, + "secondary": { + "dark": "magenta", + "light": "#8f5f8f" + }, + "accent": { + "dark": "cyan", + "light": "#5f8f8f" + }, + "error": { + "dark": "red", + "light": "#8f5f5f" + }, + "warning": { + "dark": "yellow", + "light": "#8f8f5f" + }, + "success": { + "dark": "green", + "light": "#5f8f5f" + }, + "info": { + "dark": "orange", + "light": "#8f7f5f" + }, + "text": { + "dark": "fg", + "light": "#3f3f3f" + }, + "textMuted": { + "dark": "fgMuted", + "light": "#6f6f6f" + }, + "background": { + "dark": "bg", + "light": "#ffffef" + }, + "backgroundPanel": { + "dark": "bgAlt", + "light": "#f5f5e5" + }, + "backgroundElement": { + "dark": "bgPanel", + "light": "#ebebdb" + }, + "border": { + "dark": "#5f5f5f", + "light": "#d0d0c0" + }, + "borderActive": { + "dark": "blue", + "light": "#5f7f8f" + }, + "borderSubtle": { + "dark": "#4f4f4f", + "light": "#e0e0d0" + }, + "diffAdded": { + "dark": "green", + "light": "#5f8f5f" + }, + "diffRemoved": { + "dark": "red", + "light": "#8f5f5f" + }, + "diffContext": { + "dark": "fgMuted", + "light": "#6f6f6f" + }, + "diffHunkHeader": { + "dark": "cyan", + "light": "#5f8f8f" + }, + "diffHighlightAdded": { + "dark": "greenBright", + "light": "#5f8f5f" + }, + "diffHighlightRemoved": { + "dark": "redBright", + "light": "#8f5f5f" + }, + "diffAddedBg": { + "dark": "#4f5f4f", + "light": "#efffef" + }, + "diffRemovedBg": { + "dark": "#5f4f4f", + "light": "#ffefef" + }, + "diffContextBg": { + "dark": "bgAlt", + "light": "#f5f5e5" + }, + "diffLineNumber": { + "dark": "#6f6f6f", + "light": "#b0b0a0" + }, + "diffAddedLineNumberBg": { + "dark": "#4f5f4f", + "light": "#efffef" + }, + "diffRemovedLineNumberBg": { + "dark": "#5f4f4f", + "light": "#ffefef" + }, + "markdownText": { + "dark": "fg", + "light": "#3f3f3f" + }, + "markdownHeading": { + "dark": "yellow", + "light": "#8f8f5f" + }, + "markdownLink": { + "dark": "blue", + "light": "#5f7f8f" + }, + "markdownLinkText": { + "dark": "cyan", + "light": "#5f8f8f" + }, + "markdownCode": { + "dark": "green", + "light": "#5f8f5f" + }, + "markdownBlockQuote": { + "dark": "fgMuted", + "light": "#6f6f6f" + }, + "markdownEmph": { + "dark": "yellowDim", + "light": "#8f8f5f" + }, + "markdownStrong": { + "dark": "orange", + "light": "#8f7f5f" + }, + "markdownHorizontalRule": { + "dark": "fgMuted", + "light": "#6f6f6f" + }, + "markdownListItem": { + "dark": "blue", + "light": "#5f7f8f" + }, + "markdownListEnumeration": { + "dark": "cyan", + "light": "#5f8f8f" + }, + "markdownImage": { + "dark": "blue", + "light": "#5f7f8f" + }, + "markdownImageText": { + "dark": "cyan", + "light": "#5f8f8f" + }, + "markdownCodeBlock": { + "dark": "fg", + "light": "#3f3f3f" + }, + "syntaxComment": { + "dark": "#7f9f7f", + "light": "#5f7f5f" + }, + "syntaxKeyword": { + "dark": "yellow", + "light": "#8f8f5f" + }, + "syntaxFunction": { + "dark": "blue", + "light": "#5f7f8f" + }, + "syntaxVariable": { + "dark": "fg", + "light": "#3f3f3f" + }, + "syntaxString": { + "dark": "red", + "light": "#8f5f5f" + }, + "syntaxNumber": { + "dark": "greenBright", + "light": "#5f8f5f" + }, + "syntaxType": { + "dark": "cyan", + "light": "#5f8f8f" + }, + "syntaxOperator": { + "dark": "yellow", + "light": "#8f8f5f" + }, + "syntaxPunctuation": { + "dark": "fg", + "light": "#3f3f3f" + } + } + }, + "carbonfox": { + "$schema": "https://opencode.ai/theme.json", + "defs": { + "bg0": "#0d0d0d", + "bg1": "#161616", + "bg1a": "#1a1a1a", + "bg2": "#1e1e1e", + "bg3": "#262626", + "bg4": "#303030", + "fg0": "#ffffff", + "fg1": "#f2f4f8", + "fg2": "#a9afbc", + "fg3": "#7d848f", + "lbg0": "#ffffff", + "lbg1": "#f4f4f4", + "lbg2": "#e8e8e8", + "lbg3": "#dcdcdc", + "lfg0": "#000000", + "lfg1": "#161616", + "lfg2": "#525252", + "lfg3": "#6f6f6f", + "red": "#ee5396", + "green": "#25be6a", + "yellow": "#08bdba", + "blue": "#78a9ff", + "magenta": "#be95ff", + "cyan": "#33b1ff", + "white": "#dfdfe0", + "orange": "#3ddbd9", + "pink": "#ff7eb6", + "blueBright": "#8cb6ff", + "cyanBright": "#52c7ff", + "greenBright": "#46c880", + "redLight": "#9f1853", + "greenLight": "#198038", + "yellowLight": "#007d79", + "blueLight": "#0043ce", + "magentaLight": "#6929c4", + "cyanLight": "#0072c3", + "warning": "#f1c21b", + "diffGreen": "#50fa7b", + "diffRed": "#ff6b6b", + "diffGreenBg": "#0f2418", + "diffRedBg": "#2a1216" + }, + "theme": { + "primary": { + "dark": "cyan", + "light": "blueLight" + }, + "secondary": { + "dark": "blue", + "light": "blueLight" + }, + "accent": { + "dark": "pink", + "light": "redLight" + }, + "error": { + "dark": "red", + "light": "redLight" + }, + "warning": { + "dark": "warning", + "light": "yellowLight" + }, + "success": { + "dark": "green", + "light": "greenLight" + }, + "info": { + "dark": "blue", + "light": "blueLight" + }, + "text": { + "dark": "fg1", + "light": "lfg1" + }, + "textMuted": { + "dark": "fg3", + "light": "lfg3" + }, + "background": { + "dark": "bg1", + "light": "lbg0" + }, + "backgroundPanel": { + "dark": "bg1a", + "light": "lbg1" + }, + "backgroundElement": { + "dark": "bg2", + "light": "lbg1" + }, + "border": { + "dark": "bg4", + "light": "lbg3" + }, + "borderActive": { + "dark": "cyan", + "light": "blueLight" + }, + "borderSubtle": { + "dark": "bg3", + "light": "lbg2" + }, + "diffAdded": { + "dark": "diffGreen", + "light": "greenLight" + }, + "diffRemoved": { + "dark": "diffRed", + "light": "redLight" + }, + "diffContext": { + "dark": "fg3", + "light": "lfg3" + }, + "diffHunkHeader": { + "dark": "blue", + "light": "blueLight" + }, + "diffHighlightAdded": { + "dark": "#7dffaa", + "light": "greenLight" + }, + "diffHighlightRemoved": { + "dark": "#ff9999", + "light": "redLight" + }, + "diffAddedBg": { + "dark": "diffGreenBg", + "light": "#defbe6" + }, + "diffRemovedBg": { + "dark": "diffRedBg", + "light": "#fff1f1" + }, + "diffContextBg": { + "dark": "bg1", + "light": "lbg1" + }, + "diffLineNumber": { + "dark": "fg3", + "light": "lfg3" + }, + "diffAddedLineNumberBg": { + "dark": "diffGreenBg", + "light": "#defbe6" + }, + "diffRemovedLineNumberBg": { + "dark": "diffRedBg", + "light": "#fff1f1" + }, + "markdownText": { + "dark": "fg1", + "light": "lfg1" + }, + "markdownHeading": { + "dark": "blueBright", + "light": "blueLight" + }, + "markdownLink": { + "dark": "blue", + "light": "blueLight" + }, + "markdownLinkText": { + "dark": "cyan", + "light": "cyanLight" + }, + "markdownCode": { + "dark": "green", + "light": "greenLight" + }, + "markdownBlockQuote": { + "dark": "fg3", + "light": "lfg3" + }, + "markdownEmph": { + "dark": "magenta", + "light": "magentaLight" + }, + "markdownStrong": { + "dark": "fg0", + "light": "lfg0" + }, + "markdownHorizontalRule": { + "dark": "bg4", + "light": "lbg3" + }, + "markdownListItem": { + "dark": "cyan", + "light": "cyanLight" + }, + "markdownListEnumeration": { + "dark": "cyan", + "light": "cyanLight" + }, + "markdownImage": { + "dark": "blue", + "light": "blueLight" + }, + "markdownImageText": { + "dark": "cyan", + "light": "cyanLight" + }, + "markdownCodeBlock": { + "dark": "fg2", + "light": "lfg2" + }, + "syntaxComment": { + "dark": "fg3", + "light": "lfg3" + }, + "syntaxKeyword": { + "dark": "magenta", + "light": "magentaLight" + }, + "syntaxFunction": { + "dark": "blueBright", + "light": "blueLight" + }, + "syntaxVariable": { + "dark": "white", + "light": "lfg1" + }, + "syntaxString": { + "dark": "green", + "light": "greenLight" + }, + "syntaxNumber": { + "dark": "orange", + "light": "yellowLight" + }, + "syntaxType": { + "dark": "yellow", + "light": "yellowLight" + }, + "syntaxOperator": { + "dark": "fg2", + "light": "lfg2" + }, + "syntaxPunctuation": { + "dark": "fg2", + "light": "lfg1" + } + } + } +} diff --git a/frontend/src/lib/opencodeThemes.ts b/frontend/src/lib/opencodeThemes.ts new file mode 100644 index 00000000..e83e6f2c --- /dev/null +++ b/frontend/src/lib/opencodeThemes.ts @@ -0,0 +1,215 @@ +import rawThemes from './opencode-themes.json' + +type ThemeMode = 'light' | 'dark' + +type ThemeValue = string | { dark: string; light: string } + +interface OpenCodeThemeDefinition { + defs?: Record + theme: Record +} + +type ResolvedThemeTokens = Record + +const OPENCODE_THEME_MAP = rawThemes as Record + +export const DEFAULT_THEME_PRESET = 'opencode' + +export const OPENCODE_THEME_OPTIONS = [ + { id: 'opencode', label: 'OpenCode' }, + { id: 'github', label: 'GitHub' }, + { id: 'tokyonight', label: 'Tokyo Night' }, + { id: 'vesper', label: 'Vesper' }, + { id: 'carbonfox', label: 'Carbonfox' }, + { id: 'cursor', label: 'Cursor' }, + { id: 'dracula', label: 'Dracula' }, + { id: 'nightowl', label: 'Night Owl' }, + { id: 'everforest', label: 'Everforest' }, + { id: 'flexoki', label: 'Flexoki' }, + { id: 'gruvbox', label: 'Gruvbox' }, + { id: 'kanagawa', label: 'Kanagawa' }, + { id: 'catppuccin', label: 'Catppuccin' }, + { id: 'catppuccin-frappe', label: 'Catppuccin Frappe' }, + { id: 'catppuccin-macchiato', label: 'Catppuccin Macchiato' }, + { id: 'ayu', label: 'Ayu' }, + { id: 'one-dark', label: 'One Dark' }, + { id: 'material', label: 'Material' }, + { id: 'monokai', label: 'Monokai' }, + { id: 'palenight', label: 'Palenight' }, + { id: 'rosepine', label: 'Rose Pine' }, + { id: 'solarized', label: 'Solarized' }, + { id: 'aura', label: 'Aura' }, + { id: 'cobalt2', label: 'Cobalt2' }, + { id: 'matrix', label: 'Matrix' }, + { id: 'mercury', label: 'Mercury' }, + { id: 'nord', label: 'Nord' }, + { id: 'orng', label: 'Orng' }, + { id: 'lucent-orng', label: 'Lucent Orng' }, + { id: 'osaka-jade', label: 'Osaka Jade' }, + { id: 'synthwave84', label: 'Synthwave 84' }, + { id: 'vercel', label: 'Vercel' }, + { id: 'zenburn', label: 'Zenburn' }, +] as const + +export type OpenCodeThemePreset = (typeof OPENCODE_THEME_OPTIONS)[number]['id'] + +function resolveThemeValue( + definition: OpenCodeThemeDefinition, + value: ThemeValue, + mode: ThemeMode, + trail = new Set(), +): string { + if (typeof value !== 'string') { + return resolveThemeValue(definition, value[mode], mode, trail) + } + + if (value === 'none' || value === 'transparent') { + return 'transparent' + } + + if (value.startsWith('#') || value.startsWith('rgb') || value.startsWith('hsl')) { + return value + } + + if (trail.has(value)) { + return value + } + + trail.add(value) + + const definitionValue = definition.defs?.[value] + if (definitionValue) { + return resolveThemeValue(definition, definitionValue, mode, trail) + } + + const themeToken = definition.theme[value] + if (themeToken) { + return resolveThemeValue(definition, themeToken, mode, trail) + } + + return value +} + +function contrastForeground(color: string, darkValue = '#0f0f10', lightValue = '#fcfcfc') { + const normalized = color.trim() + if (!normalized.startsWith('#')) { + return lightValue + } + + const hex = normalized.slice(1) + const channelLength = hex.length === 3 ? 1 : 2 + const expand = (start: number) => { + const chunk = hex.slice(start, start + channelLength) + return channelLength === 1 ? chunk + chunk : chunk + } + + const red = Number.parseInt(expand(0), 16) + const green = Number.parseInt(expand(channelLength), 16) + const blue = Number.parseInt(expand(channelLength * 2), 16) + + const luminance = (0.299 * red + 0.587 * green + 0.114 * blue) / 255 + return luminance > 0.62 ? darkValue : lightValue +} + +export function resolveOpenCodeTheme(themeId: string, mode: ThemeMode): ResolvedThemeTokens { + const definition = OPENCODE_THEME_MAP[themeId] ?? OPENCODE_THEME_MAP[DEFAULT_THEME_PRESET] + + return Object.fromEntries( + Object.entries(definition.theme).map(([key, value]) => [key, resolveThemeValue(definition, value, mode)]) + ) +} + +export function getThemeLabel(themeId: string) { + return OPENCODE_THEME_OPTIONS.find((theme) => theme.id === themeId)?.label ?? themeId +} + +export function getAppThemeVariables(themeId: string, mode: ThemeMode) { + const theme = resolveOpenCodeTheme(themeId, mode) + const primaryForeground = contrastForeground(theme.primary) + const infoForeground = contrastForeground(theme.info) + const successForeground = contrastForeground(theme.success) + const warningForeground = contrastForeground(theme.warning) + const destructiveForeground = contrastForeground(theme.error) + const surfaceTint = mode === 'dark' ? '#ffffff' : '#000000' + + return { + '--background': theme.background, + '--foreground': theme.text, + '--card': theme.backgroundPanel, + '--card-hover': `color-mix(in oklab, ${theme.backgroundElement} 92%, ${surfaceTint} 8%)`, + '--card-foreground': theme.text, + '--panel': theme.backgroundElement, + '--panel-foreground': theme.text, + '--panel-border': theme.borderSubtle, + '--popover': theme.backgroundPanel, + '--popover-foreground': theme.text, + '--primary': theme.primary, + '--primary-hover': `color-mix(in oklab, ${theme.primary} 86%, ${surfaceTint} 14%)`, + '--primary-foreground': primaryForeground, + '--secondary': `color-mix(in oklab, ${theme.backgroundElement} 86%, ${theme.secondary} 14%)`, + '--secondary-foreground': theme.text, + '--muted': `color-mix(in oklab, ${theme.backgroundPanel} 88%, ${theme.background} 12%)`, + '--muted-foreground': theme.textMuted, + '--accent': `color-mix(in oklab, ${theme.backgroundElement} 82%, ${theme.primary} 18%)`, + '--accent-foreground': theme.text, + '--destructive': theme.error, + '--destructive-foreground': destructiveForeground, + '--border': theme.border, + '--input': theme.backgroundElement, + '--ring': `color-mix(in oklab, ${theme.borderActive} 44%, transparent)`, + '--info': theme.info, + '--info-foreground': infoForeground, + '--success': theme.success, + '--success-foreground': successForeground, + '--warning': theme.warning, + '--warning-foreground': warningForeground, + '--sidebar': theme.backgroundPanel, + '--sidebar-foreground': theme.text, + '--sidebar-primary': theme.primary, + '--sidebar-primary-foreground': primaryForeground, + '--sidebar-accent': theme.backgroundElement, + '--sidebar-accent-foreground': theme.text, + '--sidebar-border': theme.borderSubtle, + '--sidebar-ring': `color-mix(in oklab, ${theme.borderActive} 44%, transparent)`, + '--chart-1': theme.primary, + '--chart-2': theme.success, + '--chart-3': theme.warning, + '--chart-4': theme.secondary, + '--chart-5': theme.info, + '--scrollbar-track': 'transparent', + '--scrollbar-thumb': theme.border, + '--scrollbar-thumb-hover': theme.borderActive, + '--diff-added': theme.diffAdded, + '--diff-added-bg': theme.diffAddedBg, + '--diff-removed': theme.diffRemoved, + '--diff-removed-bg': theme.diffRemovedBg, + '--diff-context': theme.diffContext, + '--diff-context-bg': theme.diffContextBg, + '--diff-line-number': theme.diffLineNumber, + '--diff-added-line-number-bg': theme.diffAddedLineNumberBg, + '--diff-removed-line-number-bg': theme.diffRemovedLineNumberBg, + '--markdown-text': theme.markdownText, + '--markdown-heading': theme.markdownHeading, + '--markdown-link': theme.markdownLink, + '--markdown-link-text': theme.markdownLinkText, + '--markdown-code': theme.markdownCode, + '--markdown-block-quote': theme.markdownBlockQuote, + '--markdown-emph': theme.markdownEmph, + '--markdown-strong': theme.markdownStrong, + '--markdown-rule': theme.markdownHorizontalRule, + '--markdown-list-item': theme.markdownListItem, + '--markdown-list-enumeration': theme.markdownListEnumeration, + '--markdown-image': theme.markdownImage, + '--markdown-image-text': theme.markdownImageText, + '--markdown-code-block': theme.markdownCodeBlock, + '--syntax-comment': theme.syntaxComment, + '--syntax-keyword': theme.syntaxKeyword, + '--syntax-function': theme.syntaxFunction, + '--syntax-variable': theme.syntaxVariable, + '--syntax-string': theme.syntaxString, + '--syntax-number': theme.syntaxNumber, + '--syntax-type': theme.syntaxType, + '--syntax-operator': theme.syntaxOperator, + '--syntax-punctuation': theme.syntaxPunctuation, + } as const +} diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index 90ad4b60..273eb8ef 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -80,17 +80,21 @@ export function Login() { const hasCredentials = config.enabledProviders.includes('credentials') return ( -
+
-
+
OpenCode +
+

OpenCode Manager

+

Use the same theme-aware workspace account you use for your coding sessions.

+
-
+
{error && ( diff --git a/frontend/src/pages/Memories.tsx b/frontend/src/pages/Memories.tsx index 1904b2fb..4dc0c603 100644 --- a/frontend/src/pages/Memories.tsx +++ b/frontend/src/pages/Memories.tsx @@ -97,7 +97,7 @@ export function Memories() {
- + Total Memories: {stats.total}
{Object.keys(stats.byScope).length > 0 && ( diff --git a/frontend/src/pages/RepoDetail.tsx b/frontend/src/pages/RepoDetail.tsx index 98bc74d0..3bf2edb0 100644 --- a/frontend/src/pages/RepoDetail.tsx +++ b/frontend/src/pages/RepoDetail.tsx @@ -129,7 +129,7 @@ export function RepoDetail() {
{repoName} {isWorktree ? ( - + WT: {currentBranch} @@ -233,7 +233,7 @@ export function RepoDetail() { onClick={() => handleCreateSession()} disabled={!opcodeUrl || createSessionMutation.isPending} size="sm" - className="bg-blue-600 hover:bg-blue-700 text-white transition-all duration-200 hover:scale-105" + className="transition-all duration-200 hover:scale-105" > New Session diff --git a/frontend/src/pages/SessionDetail.tsx b/frontend/src/pages/SessionDetail.tsx index 7bd5198d..0f2cb4cd 100644 --- a/frontend/src/pages/SessionDetail.tsx +++ b/frontend/src/pages/SessionDetail.tsx @@ -76,11 +76,11 @@ export function SessionDetail() { const [showScrollButton, setShowScrollButton] = useState(false); const [hasPromptContent, setHasPromptContent] = useState(false); const [minimizedQuestion, setMinimizedQuestion] = useState(null); - + const handleSwipeBack = useCallback(() => { navigate(`/repos/${repoId}`); }, [navigate, repoId]); - + const { bind: bindSwipe, swipeStyles } = useSwipeBack(handleSwipeBack, { enabled: !fileBrowserOpen && !modelDialogOpen && !sessionsDialogOpen, }); @@ -173,7 +173,7 @@ export function SessionDetail() { const handleMinimizeQuestion = useCallback((question: QuestionRequest) => { setMinimizedQuestion(question) }, []) - + const handleRestoreQuestion = useCallback(() => { setMinimizedQuestion(null) }, []) @@ -379,7 +379,7 @@ export function SessionDetail() { variant="ghost" size="sm" onClick={handleParentSessionClick} - className="text-purple-600 dark:text-purple-400 hover:text-purple-700 dark:hover:text-purple-300 hover:bg-purple-100 dark:hover:bg-purple-900/20 h-7 px-2 gap-1" + className="h-7 gap-1 px-2 text-info hover:bg-info/12 hover:text-info" title="Back to parent session" > @@ -395,7 +395,7 @@ export function SessionDetail() { {getRepoDisplayName(repo.repoUrl, repo.localPath, repo.sourcePath)}} + subtitle={{getRepoDisplayName(repo.repoUrl, repo.localPath, repo.sourcePath)}} generating={isTitleGenerating} />
@@ -538,7 +538,7 @@ export function SessionDetail() { handleClearPrompt() }} onClick={handleClearPrompt} - className="absolute -top-12 right-0 md:right-4 z-50 flex items-center gap-2 px-4 py-2 rounded-xl bg-gradient-to-br from-red-600 to-red-700 hover:from-red-500 hover:to-red-600 text-destructive-foreground border-2 border-red-500/60 hover:border-red-400 shadow-lg shadow-red-500/30 hover:shadow-red-500/50 backdrop-blur-md transition-all duration-200 active:scale-95 hover:scale-105 ring-2 ring-red-500/20 hover:ring-red-500/40" + className="absolute -top-12 right-0 z-50 flex items-center gap-2 rounded-xl border border-destructive/50 bg-destructive px-4 py-2 text-destructive-foreground shadow-lg shadow-destructive/20 backdrop-blur-md transition-all duration-200 active:scale-95 hover:scale-105 hover:border-destructive/70 hover:bg-destructive/92 hover:shadow-destructive/30 md:right-4" aria-label="Clear" > @@ -550,7 +550,6 @@ export function SessionDetail() { Waiting for shortcut key...
)} - {ttsEnabled && lastAssistantText && !hasPromptContent && !hasActiveStream && ( )} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e40396d1..4affffa2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,6 +196,9 @@ importers: react-markdown: specifier: ^10.1.0 version: 10.1.0(@types/react@19.2.7)(react@19.2.3) + react-resizable-panels: + specifier: ^4.7.2 + version: 4.7.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-router-dom: specifier: ^7.13.0 version: 7.13.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -214,6 +217,9 @@ importers: tailwind-merge: specifier: ^3.3.1 version: 3.4.0 + vaul: + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) zod: specifier: ^4.1.12 version: 4.3.2 @@ -3739,6 +3745,12 @@ packages: '@types/react': optional: true + react-resizable-panels@4.7.2: + resolution: {integrity: sha512-1L2vyeBG96hp7N6x6rzYXJ8EjYiDiffMsqj3cd+T9aOKwscvuyCn2CuZ5q3PoUSTIJUM6Q5DgXH1bdDe6uvh2w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + react-router-dom@7.13.0: resolution: {integrity: sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==} engines: {node: '>=20.0.0'} @@ -4217,6 +4229,12 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -8101,6 +8119,11 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + react-resizable-panels@4.7.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-router-dom@7.13.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 @@ -8646,6 +8669,15 @@ snapshots: uuid@11.1.0: {} + vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 diff --git a/shared/src/schemas/settings.ts b/shared/src/schemas/settings.ts index c5f785cd..8e01238d 100644 --- a/shared/src/schemas/settings.ts +++ b/shared/src/schemas/settings.ts @@ -108,6 +108,7 @@ export const DEFAULT_GIT_IDENTITY: GitIdentity = { export const UserPreferencesSchema = z.object({ theme: z.enum(["dark", "light", "system"]), + themePreset: z.string().optional(), mode: z.enum(["plan", "build"]), defaultModel: z.string().optional(), defaultAgent: z.string().optional(), @@ -155,6 +156,7 @@ export const DEFAULT_STT_CONFIG: STTConfig = { export const DEFAULT_USER_PREFERENCES = { theme: "dark" as const, + themePreset: "opencode", mode: "build" as const, autoScroll: true, showReasoning: false,