Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d8e1ecafc | ||
|
|
4885c3a5d3 |
@@ -52,7 +52,7 @@ function Mcp(props: { context: Plugin.Context }) {
|
||||
function View(props: { context: Plugin.Context }) {
|
||||
const { themeV2, mode, setMode } = useTheme()
|
||||
const dimensions = useTerminalDimensions()
|
||||
const modeLabel = createMemo(() => (mode() === "dark" ? "Light mode" : "Dark mode"))
|
||||
const modeLabel = createMemo(() => (mode() === "dark" ? "Switch to light" : "Switch to dark"))
|
||||
const mcpWidth = createMemo(() => {
|
||||
const list = props.context.data.location.mcp.server.list(props.context.location) ?? []
|
||||
if (list.length === 0) return 0
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
# TUI theme screenshot gallery
|
||||
|
||||
This gallery runs one repeatable OpenCode Drive workflow for every V1 theme in a directory. Each theme runs in
|
||||
light and dark mode and produces a flat set of screenshots covering the home screen, markdown, permission prompt,
|
||||
form prompt, and session switcher.
|
||||
|
||||
It expects `opencode-drive` to be installed globally and available on `PATH`.
|
||||
|
||||
The checked-in fixtures include selected built-in OpenCode themes and community themes from
|
||||
[`vaprdev/opencode-themes`](https://github.com/vaprdev/opencode-themes). Theme-specific attribution and licenses
|
||||
remain documented in that source repository.
|
||||
|
||||
## Run
|
||||
|
||||
Place theme JSON files in `themes/`, then run from the repository root:
|
||||
|
||||
```sh
|
||||
bun packages/tui/test/theme/gallery/run.ts
|
||||
```
|
||||
|
||||
Custom input and output directories can be passed as positional arguments:
|
||||
|
||||
```sh
|
||||
bun packages/tui/test/theme/gallery/run.ts ./my-themes ./theme-screenshots
|
||||
```
|
||||
|
||||
Output files are named `<theme>-<mode>-<state>.png` in one flat directory. Existing files with the same names are
|
||||
overwritten. Runs are sequential so each isolated OpenCode Drive instance owns its own ports and artifacts.
|
||||
|
||||
The current TUI discovers V1 theme files and migrates them to V2 at runtime. Native V2 JSON files are reported as
|
||||
unsupported and make the runner exit nonzero; they are not converted or silently rendered with a fallback theme.
|
||||
|
||||
Before changing the scenario, typecheck it with:
|
||||
|
||||
```sh
|
||||
opencode-drive check packages/tui/test/theme/gallery/scenario.ts
|
||||
```
|
||||
@@ -0,0 +1,79 @@
|
||||
import path from "node:path"
|
||||
import { mkdir } from "node:fs/promises"
|
||||
|
||||
const root = path.resolve(import.meta.dir, "../../../../..")
|
||||
const themes = path.resolve(Bun.argv[2] ?? path.join(import.meta.dir, "themes"))
|
||||
const screenshots = path.resolve(Bun.argv[3] ?? path.join(import.meta.dir, "screenshots"))
|
||||
const scenario = path.join(import.meta.dir, "scenario.ts")
|
||||
const files = await Array.fromAsync(new Bun.Glob("**/*.json").scan({ cwd: themes, absolute: true }))
|
||||
|
||||
if (!files.length) {
|
||||
console.error(`No JSON themes found in ${themes}`)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
await mkdir(screenshots, { recursive: true })
|
||||
|
||||
const failures: string[] = []
|
||||
const slugs = new Set<string>()
|
||||
|
||||
for (const file of files.sort()) {
|
||||
const source = await Bun.file(file).json().catch(() => undefined)
|
||||
const slug = path.basename(file, ".json").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")
|
||||
if (!slug) {
|
||||
failures.push(`${file}: filename does not produce a usable theme prefix`)
|
||||
continue
|
||||
}
|
||||
if (slugs.has(slug)) {
|
||||
failures.push(`${file}: duplicate theme prefix "${slug}"`)
|
||||
continue
|
||||
}
|
||||
slugs.add(slug)
|
||||
|
||||
if (!isRecord(source)) {
|
||||
failures.push(`${file}: invalid JSON theme object`)
|
||||
continue
|
||||
}
|
||||
if (source.version === 2) {
|
||||
failures.push(`${file}: native V2 theme loading is not supported by the TUI yet`)
|
||||
continue
|
||||
}
|
||||
if (!isRecord(source.theme)) {
|
||||
failures.push(`${file}: expected a V1 theme with a "theme" object`)
|
||||
continue
|
||||
}
|
||||
|
||||
for (const mode of ["light", "dark"] as const) {
|
||||
const name = `theme-gallery-${slug}-${mode}-${process.pid}`
|
||||
console.log(`\n[${slug}/${mode}] capturing screenshots`)
|
||||
const child = Bun.spawn(
|
||||
["opencode-drive", "start", "--name", name, "--script", scenario, "--dev", root],
|
||||
{
|
||||
cwd: root,
|
||||
env: {
|
||||
...process.env,
|
||||
OPENCODE_THEME_GALLERY_FILE: file,
|
||||
OPENCODE_THEME_GALLERY_MODE: mode,
|
||||
OPENCODE_THEME_GALLERY_OUTPUT: screenshots,
|
||||
OPENCODE_THEME_GALLERY_SLUG: slug,
|
||||
},
|
||||
stdout: "inherit",
|
||||
stderr: "inherit",
|
||||
},
|
||||
)
|
||||
const exit = await child.exited
|
||||
if (exit !== 0) failures.push(`${file} (${mode}): OpenCode Drive exited with ${exit}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (failures.length) {
|
||||
console.error("\nTheme gallery completed with errors:")
|
||||
failures.forEach((failure) => console.error(`- ${failure}`))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log(`\nScreenshots written to ${screenshots}`)
|
||||
|
||||
function isRecord(value: unknown): value is Record<string, unknown> {
|
||||
return !!value && typeof value === "object" && !Array.isArray(value)
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
import path from "node:path"
|
||||
import { mkdir } from "node:fs/promises"
|
||||
import { defineScript, wait } from "opencode-drive"
|
||||
|
||||
const file = required("OPENCODE_THEME_GALLERY_FILE")
|
||||
const mode = required("OPENCODE_THEME_GALLERY_MODE")
|
||||
const output = required("OPENCODE_THEME_GALLERY_OUTPUT")
|
||||
const slug = required("OPENCODE_THEME_GALLERY_SLUG")
|
||||
const themeName = `gallery-${slug}`
|
||||
|
||||
export default defineScript({
|
||||
async setup({ fs, config }) {
|
||||
await fs.writeFile("README.md", "# Theme gallery fixture\n\nA stable project for OpenCode TUI screenshots.\n")
|
||||
await fs.writeFile("src/example.ts", "export const palette = ['neutral', 'accent', 'interactive']\n")
|
||||
await fs.writeFile(`.opencode/themes/${themeName}.json`, await Bun.file(file).text())
|
||||
await fs.writeFile(
|
||||
".opencode/cli.json",
|
||||
`${JSON.stringify({
|
||||
theme: { name: themeName, mode },
|
||||
}, undefined, 2)}\n`,
|
||||
)
|
||||
config.permissions = [
|
||||
{ action: "*", resource: "*", effect: "allow" },
|
||||
{ action: "shell", resource: "*", effect: "ask" },
|
||||
]
|
||||
},
|
||||
async run({ llm, ui }) {
|
||||
await mkdir(output, { recursive: true })
|
||||
llm.title((_request, index) => (index === 0 ? "Theme gallery" : `Theme gallery ${index + 1}`))
|
||||
|
||||
await ui.waitFor((state) => state.focused.editor)
|
||||
await ui.waitFor("local")
|
||||
await wait(750)
|
||||
await capture(ui, "01-home")
|
||||
|
||||
await ui.submit("Show me a compact markdown theme specimen")
|
||||
await llm.send(
|
||||
llm.reasoning("I will provide a stable markdown sample for the theme gallery."),
|
||||
llm.text(
|
||||
[
|
||||
"# Theme Review",
|
||||
"",
|
||||
"A compact response with **strong text**, *emphasis*, and an `inline token`.",
|
||||
"",
|
||||
"> Good themes preserve hierarchy without losing contrast.",
|
||||
"",
|
||||
"- Neutral surfaces",
|
||||
"- Interactive accents",
|
||||
"- Success, warning, and error feedback",
|
||||
"",
|
||||
"```ts",
|
||||
"const mode = 'gallery'",
|
||||
"```",
|
||||
].join("\n"),
|
||||
),
|
||||
)
|
||||
await ui.waitFor("Theme Review")
|
||||
await capture(ui, "02-markdown")
|
||||
|
||||
const permission = llm.send(
|
||||
llm.toolCall({
|
||||
id: "theme-gallery-permission",
|
||||
index: 0,
|
||||
name: "shell",
|
||||
input: { command: "printf 'theme gallery permission'" },
|
||||
}),
|
||||
)
|
||||
await ui.submit("Run a protected command so I can inspect the permission prompt")
|
||||
await ui.waitFor("Permission required")
|
||||
await capture(ui, "03-permission")
|
||||
await ui.enter()
|
||||
await permission
|
||||
await llm.send(llm.text("The protected command completed successfully."))
|
||||
await ui.waitFor("completed successfully")
|
||||
|
||||
const form = llm.send(
|
||||
llm.toolCall({
|
||||
id: "theme-gallery-question",
|
||||
index: 0,
|
||||
name: "question",
|
||||
input: {
|
||||
questions: [
|
||||
{
|
||||
header: "Theme direction",
|
||||
question: "Which direction should this theme emphasize?",
|
||||
options: [
|
||||
{ label: "Balanced", description: "Keep surfaces and accents evenly weighted" },
|
||||
{ label: "Expressive", description: "Give accent colors more visual presence" },
|
||||
{ label: "Quiet", description: "Favor neutral surfaces and restrained contrast" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
)
|
||||
await ui.submit("Ask me for a theme direction")
|
||||
await ui.waitFor("Which direction should this theme emphasize?")
|
||||
await capture(ui, "04-form")
|
||||
await ui.enter()
|
||||
await form
|
||||
await llm.send(llm.text("The theme review form was submitted."))
|
||||
await ui.waitFor("form was submitted")
|
||||
|
||||
await ui.submit("/new")
|
||||
await ui.waitFor((state) => state.focused.editor)
|
||||
await ui.submit("Create a second session for the session switcher gallery")
|
||||
await llm.send(llm.text("This second session makes the switcher state visible."))
|
||||
await ui.submit("/sessions")
|
||||
await ui.waitFor("Sessions")
|
||||
await capture(ui, "05-session-switcher")
|
||||
},
|
||||
})
|
||||
|
||||
async function capture(ui: { screenshot(name?: string): Promise<string> }, state: string) {
|
||||
const source = await ui.screenshot(`${slug}-${mode}-${state}`)
|
||||
await Bun.write(path.join(output, `${slug}-${mode}-${state}.png`), Bun.file(source))
|
||||
}
|
||||
|
||||
function required(name: string) {
|
||||
const value = process.env[name]
|
||||
if (!value) throw new Error(`${name} is required`)
|
||||
return value
|
||||
}
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/theme.json",
|
||||
"defs": {
|
||||
"bg": "#2e1a47",
|
||||
"panel": "#371f54",
|
||||
"element": "#4a2b7a",
|
||||
"borderSubtle": "#553183",
|
||||
"border": "#683b9f",
|
||||
"text": "#ffffff",
|
||||
"textSoft": "#e0c3fc",
|
||||
"textMuted": "#b39ddb",
|
||||
"pink": "#ec4899",
|
||||
"pinkBright": "#f472b6",
|
||||
"purple": "#a78bfa",
|
||||
"cyan": "#22d3ee",
|
||||
"green": "#34d399",
|
||||
"greenBright": "#6ee7b7",
|
||||
"yellow": "#facc15",
|
||||
"red": "#fb7185",
|
||||
"addedBg": "#2f294e",
|
||||
"removedBg": "#3f214c",
|
||||
"contextBg": "#371f54",
|
||||
"addedLineBg": "#304052",
|
||||
"removedLineBg": "#54294f"
|
||||
},
|
||||
"theme": {
|
||||
"primary": "pink",
|
||||
"secondary": "cyan",
|
||||
"accent": "pinkBright",
|
||||
"error": "red",
|
||||
"warning": "yellow",
|
||||
"success": "green",
|
||||
"info": "cyan",
|
||||
"text": "text",
|
||||
"textMuted": "textMuted",
|
||||
"background": "bg",
|
||||
"backgroundPanel": "panel",
|
||||
"backgroundElement": "element",
|
||||
"backgroundMenu": "element",
|
||||
"border": "border",
|
||||
"borderActive": "pink",
|
||||
"borderSubtle": "borderSubtle",
|
||||
"diffAdded": "green",
|
||||
"diffRemoved": "red",
|
||||
"diffContext": "textMuted",
|
||||
"diffHunkHeader": "pink",
|
||||
"diffHighlightAdded": "greenBright",
|
||||
"diffHighlightRemoved": "pinkBright",
|
||||
"diffAddedBg": "addedBg",
|
||||
"diffRemovedBg": "removedBg",
|
||||
"diffContextBg": "contextBg",
|
||||
"diffLineNumber": "textMuted",
|
||||
"diffAddedLineNumberBg": "addedLineBg",
|
||||
"diffRemovedLineNumberBg": "removedLineBg",
|
||||
"markdownText": "text",
|
||||
"markdownHeading": "pink",
|
||||
"markdownLink": "cyan",
|
||||
"markdownLinkText": "pinkBright",
|
||||
"markdownCode": "green",
|
||||
"markdownBlockQuote": "purple",
|
||||
"markdownEmph": "pinkBright",
|
||||
"markdownStrong": "text",
|
||||
"markdownHorizontalRule": "border",
|
||||
"markdownListItem": "pink",
|
||||
"markdownListEnumeration": "cyan",
|
||||
"markdownImage": "cyan",
|
||||
"markdownImageText": "pinkBright",
|
||||
"markdownCodeBlock": "textSoft",
|
||||
"syntaxComment": "textMuted",
|
||||
"syntaxKeyword": "pink",
|
||||
"syntaxFunction": "cyan",
|
||||
"syntaxVariable": "text",
|
||||
"syntaxString": "green",
|
||||
"syntaxNumber": "yellow",
|
||||
"syntaxType": "pinkBright",
|
||||
"syntaxOperator": "textSoft",
|
||||
"syntaxPunctuation": "textMuted"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/theme.json",
|
||||
"defs": {
|
||||
"bg": "#fdf2f8",
|
||||
"panel": "#fce7f3",
|
||||
"element": "#fbcfe8",
|
||||
"menu": "#ffffff",
|
||||
"borderSubtle": "#fbcfe8",
|
||||
"border": "#f9a8d4",
|
||||
"text": "#831843",
|
||||
"textSoft": "#9d174d",
|
||||
"textMuted": "#be185d",
|
||||
"pink": "#db2777",
|
||||
"pinkBright": "#be185d",
|
||||
"purple": "#7c3aed",
|
||||
"cyan": "#0891b2",
|
||||
"green": "#059669",
|
||||
"greenBright": "#047857",
|
||||
"yellow": "#d97706",
|
||||
"red": "#e11d48",
|
||||
"addedBg": "#e0f2e8",
|
||||
"removedBg": "#fce1e8",
|
||||
"contextBg": "#fce7f3",
|
||||
"addedLineBg": "#c9ead9",
|
||||
"removedLineBg": "#f8cbd7"
|
||||
},
|
||||
"theme": {
|
||||
"primary": "pink",
|
||||
"secondary": "cyan",
|
||||
"accent": "pinkBright",
|
||||
"error": "red",
|
||||
"warning": "yellow",
|
||||
"success": "green",
|
||||
"info": "cyan",
|
||||
"text": "text",
|
||||
"textMuted": "textMuted",
|
||||
"background": "bg",
|
||||
"backgroundPanel": "panel",
|
||||
"backgroundElement": "element",
|
||||
"backgroundMenu": "menu",
|
||||
"border": "border",
|
||||
"borderActive": "pink",
|
||||
"borderSubtle": "borderSubtle",
|
||||
"diffAdded": "green",
|
||||
"diffRemoved": "red",
|
||||
"diffContext": "textMuted",
|
||||
"diffHunkHeader": "pink",
|
||||
"diffHighlightAdded": "greenBright",
|
||||
"diffHighlightRemoved": "pinkBright",
|
||||
"diffAddedBg": "addedBg",
|
||||
"diffRemovedBg": "removedBg",
|
||||
"diffContextBg": "contextBg",
|
||||
"diffLineNumber": "textMuted",
|
||||
"diffAddedLineNumberBg": "addedLineBg",
|
||||
"diffRemovedLineNumberBg": "removedLineBg",
|
||||
"markdownText": "text",
|
||||
"markdownHeading": "pink",
|
||||
"markdownLink": "cyan",
|
||||
"markdownLinkText": "pinkBright",
|
||||
"markdownCode": "green",
|
||||
"markdownBlockQuote": "purple",
|
||||
"markdownEmph": "pinkBright",
|
||||
"markdownStrong": "text",
|
||||
"markdownHorizontalRule": "border",
|
||||
"markdownListItem": "pink",
|
||||
"markdownListEnumeration": "cyan",
|
||||
"markdownImage": "cyan",
|
||||
"markdownImageText": "pinkBright",
|
||||
"markdownCodeBlock": "textSoft",
|
||||
"syntaxComment": "textMuted",
|
||||
"syntaxKeyword": "pink",
|
||||
"syntaxFunction": "cyan",
|
||||
"syntaxVariable": "text",
|
||||
"syntaxString": "green",
|
||||
"syntaxNumber": "yellow",
|
||||
"syntaxType": "pinkBright",
|
||||
"syntaxOperator": "textSoft",
|
||||
"syntaxPunctuation": "textMuted"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/theme.json",
|
||||
"defs": {
|
||||
"bg": "#1C2427",
|
||||
"panel": "#273136",
|
||||
"element": "#323E45",
|
||||
"borderSubtle": "#304E37",
|
||||
"text": "#D1DED3",
|
||||
"textMuted": "#9AAEA7",
|
||||
"commentMuted": "#60777D",
|
||||
"green": "#7EB08A",
|
||||
"tan": "#D2B48C",
|
||||
"pink": "#FF819F",
|
||||
"purple": "#BA8EAF",
|
||||
"blue": "#7EA4B0",
|
||||
"violet": "#8A7EB0",
|
||||
"addedBg": "#2B3D33",
|
||||
"removedBg": "#4D3740",
|
||||
"contextBg": "#222A2E",
|
||||
"addedLineBg": "#3A5244",
|
||||
"removedLineBg": "#60414B"
|
||||
},
|
||||
"theme": {
|
||||
"primary": "green",
|
||||
"secondary": "tan",
|
||||
"accent": "pink",
|
||||
"error": "pink",
|
||||
"warning": "purple",
|
||||
"success": "green",
|
||||
"info": "tan",
|
||||
"text": "text",
|
||||
"textMuted": "textMuted",
|
||||
"background": "bg",
|
||||
"backgroundPanel": "panel",
|
||||
"backgroundElement": "element",
|
||||
"border": "element",
|
||||
"borderActive": "green",
|
||||
"borderSubtle": "borderSubtle",
|
||||
"diffAdded": "green",
|
||||
"diffRemoved": "pink",
|
||||
"diffContext": "textMuted",
|
||||
"diffHunkHeader": "tan",
|
||||
"diffHighlightAdded": "green",
|
||||
"diffHighlightRemoved": "pink",
|
||||
"diffAddedBg": "addedBg",
|
||||
"diffRemovedBg": "removedBg",
|
||||
"diffContextBg": "contextBg",
|
||||
"diffLineNumber": "blue",
|
||||
"diffAddedLineNumberBg": "addedLineBg",
|
||||
"diffRemovedLineNumberBg": "removedLineBg",
|
||||
"markdownText": "text",
|
||||
"markdownHeading": "tan",
|
||||
"markdownLink": "tan",
|
||||
"markdownLinkText": "green",
|
||||
"markdownCode": "tan",
|
||||
"markdownBlockQuote": "blue",
|
||||
"markdownEmph": "text",
|
||||
"markdownStrong": "text",
|
||||
"markdownHorizontalRule": "tan",
|
||||
"markdownListItem": "tan",
|
||||
"markdownListEnumeration": "tan",
|
||||
"markdownImage": "tan",
|
||||
"markdownImageText": "pink",
|
||||
"markdownCodeBlock": "green",
|
||||
"syntaxComment": "commentMuted",
|
||||
"syntaxKeyword": "tan",
|
||||
"syntaxFunction": "green",
|
||||
"syntaxVariable": "text",
|
||||
"syntaxString": "purple",
|
||||
"syntaxNumber": "blue",
|
||||
"syntaxType": "blue",
|
||||
"syntaxOperator": "tan",
|
||||
"syntaxPunctuation": "blue"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,221 @@
|
||||
{
|
||||
"$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": "#7791a6",
|
||||
"light": "#7791a6"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,245 @@
|
||||
{
|
||||
"$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": "#8f8f8f",
|
||||
"light": "#595959"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/theme.json",
|
||||
"defs": {
|
||||
"bg": "#1b1e28",
|
||||
"panel": "#202430",
|
||||
"element": "#303340",
|
||||
"borderSubtle": "#252834",
|
||||
"text": "#a6accd",
|
||||
"textMuted": "#767c9d",
|
||||
"offWhite": "#e4f0fb",
|
||||
"blue": "#ADD7FF",
|
||||
"cyan": "#89ddff",
|
||||
"mint": "#5DE4c7",
|
||||
"green": "#5fb3a1",
|
||||
"typeBlue": "#91B4D5",
|
||||
"slate": "#7390AA",
|
||||
"red": "#d0679d",
|
||||
"pink": "#f087bd",
|
||||
"yellow": "#fffac2",
|
||||
"addedBg": "#233037",
|
||||
"removedBg": "#332631",
|
||||
"contextBg": "#1e212c",
|
||||
"addedLineBg": "#2b3c40",
|
||||
"removedLineBg": "#422938"
|
||||
},
|
||||
"theme": {
|
||||
"primary": "blue",
|
||||
"secondary": "mint",
|
||||
"accent": "cyan",
|
||||
"error": "red",
|
||||
"warning": "yellow",
|
||||
"success": "mint",
|
||||
"info": "cyan",
|
||||
"text": "text",
|
||||
"textMuted": "textMuted",
|
||||
"background": "bg",
|
||||
"backgroundPanel": "panel",
|
||||
"backgroundElement": "element",
|
||||
"border": "element",
|
||||
"borderActive": "blue",
|
||||
"borderSubtle": "borderSubtle",
|
||||
"diffAdded": "green",
|
||||
"diffRemoved": "red",
|
||||
"diffContext": "textMuted",
|
||||
"diffHunkHeader": "cyan",
|
||||
"diffHighlightAdded": "mint",
|
||||
"diffHighlightRemoved": "pink",
|
||||
"diffAddedBg": "addedBg",
|
||||
"diffRemovedBg": "removedBg",
|
||||
"diffContextBg": "contextBg",
|
||||
"diffLineNumber": "slate",
|
||||
"diffAddedLineNumberBg": "addedLineBg",
|
||||
"diffRemovedLineNumberBg": "removedLineBg",
|
||||
"markdownText": "offWhite",
|
||||
"markdownHeading": "offWhite",
|
||||
"markdownLink": "blue",
|
||||
"markdownLinkText": "mint",
|
||||
"markdownCode": "typeBlue",
|
||||
"markdownBlockQuote": "mint",
|
||||
"markdownEmph": "slate",
|
||||
"markdownStrong": "offWhite",
|
||||
"markdownHorizontalRule": "textMuted",
|
||||
"markdownListItem": "blue",
|
||||
"markdownListEnumeration": "blue",
|
||||
"markdownImage": "blue",
|
||||
"markdownImageText": "mint",
|
||||
"markdownCodeBlock": "blue",
|
||||
"syntaxComment": "textMuted",
|
||||
"syntaxKeyword": "text",
|
||||
"syntaxFunction": "blue",
|
||||
"syntaxVariable": "offWhite",
|
||||
"syntaxString": "mint",
|
||||
"syntaxNumber": "mint",
|
||||
"syntaxType": "typeBlue",
|
||||
"syntaxOperator": "typeBlue",
|
||||
"syntaxPunctuation": "text"
|
||||
}
|
||||
}
|
||||