Compare commits

..
Author SHA1 Message Date
Adam 3e988d640d wip(app): generate color palettes
publish / version (push) Has been cancelled
publish / build-cli (push) Has been cancelled
publish / build-tauri (map[host:blacksmith-4vcpu-ubuntu-2404 target:x86_64-unknown-linux-gnu]) (push) Has been cancelled
publish / build-tauri (map[host:blacksmith-4vcpu-windows-2025 target:x86_64-pc-windows-msvc]) (push) Has been cancelled
publish / build-tauri (map[host:blacksmith-8vcpu-ubuntu-2404-arm target:aarch64-unknown-linux-gnu]) (push) Has been cancelled
publish / build-tauri (map[host:macos-latest target:aarch64-apple-darwin]) (push) Has been cancelled
publish / build-tauri (map[host:macos-latest target:x86_64-apple-darwin]) (push) Has been cancelled
publish / build-electron (map[host:blacksmith-4vcpu-ubuntu-2404 platform_flag:--linux target:aarch64-unknown-linux-gnu]) (push) Has been cancelled
publish / build-electron (map[host:blacksmith-4vcpu-ubuntu-2404 platform_flag:--linux target:x86_64-unknown-linux-gnu]) (push) Has been cancelled
publish / build-electron (map[host:blacksmith-4vcpu-windows-2025 platform_flag:--win target:x86_64-pc-windows-msvc]) (push) Has been cancelled
publish / build-electron (map[host:macos-latest platform_flag:--mac --arm64 target:aarch64-apple-darwin]) (push) Has been cancelled
publish / build-electron (map[host:macos-latest platform_flag:--mac --x64 target:x86_64-apple-darwin]) (push) Has been cancelled
publish / publish (push) Has been cancelled
2026-03-05 15:30:41 -06:00
Adam 2ba1ecabc9 fix(app): load tab on open file 2026-03-05 13:40:25 -06:00
opencode-agent[bot] e3b6d84b57 docs(i18n): sync locale docs from english changes 2026-03-05 19:01:10 +00:00
Frank 0638e49b02 zen: gpt5.4 2026-03-05 19:01:10 +00:00
opencode 2c58964a6b release: v1.2.18 2026-03-05 19:01:03 +00:00
opencode-agent[bot] 9507b0eace chore: update nix node_modules hashes 2026-03-05 15:09:14 +00:00
Dax 4da199697b feat(tui): add onClick handler to InlineTool and Task components (#16187) 2026-03-05 15:02:30 +00:00
Adam 9cccaa693a chore(app): ghostty-web fork 2026-03-05 08:58:11 -06:00
Dax Raad bb37e908ad ci: remove unused publishConfig that was breaking npm publishing 2026-03-05 09:45:30 -05:00
Dax Raad d802e28381 update sdk package.json 2026-03-05 09:45:30 -05:00
Adam 7665b8e30d fix(app): stale keyed show errors 2026-03-05 08:42:50 -06:00
Adam a3d4ea0de1 fix(app): locale error 2026-03-05 08:10:36 -06:00
Adam 152df2428d fix(app): stale read error 2026-03-05 08:09:29 -06:00
Adam 1a420a1a71 fix(app): websearch and codesearch tool rendering 2026-03-05 08:00:42 -06:00
Adam 4c185c70f2 fix(app): provider settings consistency 2026-03-05 08:00:42 -06:00
Adam 6f9e5335dc fix(app): file icon stability 2026-03-05 08:00:42 -06:00
Adam 6c9ae5ce9f fix(app): file path truncation in session turn 2026-03-05 08:00:42 -06:00
Adam 8cbe7b4a01 fix(app): file icon stability 2026-03-05 08:00:41 -06:00
98 changed files with 1336 additions and 2807 deletions
+18 -18
View File
@@ -26,7 +26,7 @@
}, },
"packages/app": { "packages/app": {
"name": "@opencode-ai/app", "name": "@opencode-ai/app",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@kobalte/core": "catalog:", "@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*", "@opencode-ai/sdk": "workspace:*",
@@ -47,7 +47,7 @@
"@thisbeyond/solid-dnd": "0.7.5", "@thisbeyond/solid-dnd": "0.7.5",
"diff": "catalog:", "diff": "catalog:",
"fuzzysort": "catalog:", "fuzzysort": "catalog:",
"ghostty-web": "0.4.0", "ghostty-web": "github:anomalyco/ghostty-web#main",
"luxon": "catalog:", "luxon": "catalog:",
"marked": "catalog:", "marked": "catalog:",
"marked-shiki": "catalog:", "marked-shiki": "catalog:",
@@ -76,7 +76,7 @@
}, },
"packages/console/app": { "packages/console/app": {
"name": "@opencode-ai/console-app", "name": "@opencode-ai/console-app",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@cloudflare/vite-plugin": "1.15.2", "@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1", "@ibm/plex": "6.4.1",
@@ -110,7 +110,7 @@
}, },
"packages/console/core": { "packages/console/core": {
"name": "@opencode-ai/console-core", "name": "@opencode-ai/console-core",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@aws-sdk/client-sts": "3.782.0", "@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1", "@jsx-email/render": "1.1.1",
@@ -137,7 +137,7 @@
}, },
"packages/console/function": { "packages/console/function": {
"name": "@opencode-ai/console-function", "name": "@opencode-ai/console-function",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@ai-sdk/anthropic": "2.0.0", "@ai-sdk/anthropic": "2.0.0",
"@ai-sdk/openai": "2.0.2", "@ai-sdk/openai": "2.0.2",
@@ -161,7 +161,7 @@
}, },
"packages/console/mail": { "packages/console/mail": {
"name": "@opencode-ai/console-mail", "name": "@opencode-ai/console-mail",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@jsx-email/all": "2.2.3", "@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3", "@jsx-email/cli": "1.4.3",
@@ -185,7 +185,7 @@
}, },
"packages/desktop": { "packages/desktop": {
"name": "@opencode-ai/desktop", "name": "@opencode-ai/desktop",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@opencode-ai/app": "workspace:*", "@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*", "@opencode-ai/ui": "workspace:*",
@@ -218,7 +218,7 @@
}, },
"packages/desktop-electron": { "packages/desktop-electron": {
"name": "@opencode-ai/desktop-electron", "name": "@opencode-ai/desktop-electron",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@opencode-ai/app": "workspace:*", "@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*", "@opencode-ai/ui": "workspace:*",
@@ -248,7 +248,7 @@
}, },
"packages/enterprise": { "packages/enterprise": {
"name": "@opencode-ai/enterprise", "name": "@opencode-ai/enterprise",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@opencode-ai/ui": "workspace:*", "@opencode-ai/ui": "workspace:*",
"@opencode-ai/util": "workspace:*", "@opencode-ai/util": "workspace:*",
@@ -277,7 +277,7 @@
}, },
"packages/function": { "packages/function": {
"name": "@opencode-ai/function", "name": "@opencode-ai/function",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@octokit/auth-app": "8.0.1", "@octokit/auth-app": "8.0.1",
"@octokit/rest": "catalog:", "@octokit/rest": "catalog:",
@@ -293,7 +293,7 @@
}, },
"packages/opencode": { "packages/opencode": {
"name": "opencode", "name": "opencode",
"version": "1.2.17", "version": "1.2.18",
"bin": { "bin": {
"opencode": "./bin/opencode", "opencode": "./bin/opencode",
}, },
@@ -407,7 +407,7 @@
}, },
"packages/plugin": { "packages/plugin": {
"name": "@opencode-ai/plugin", "name": "@opencode-ai/plugin",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@opencode-ai/sdk": "workspace:*", "@opencode-ai/sdk": "workspace:*",
"zod": "catalog:", "zod": "catalog:",
@@ -427,7 +427,7 @@
}, },
"packages/sdk/js": { "packages/sdk/js": {
"name": "@opencode-ai/sdk", "name": "@opencode-ai/sdk",
"version": "1.2.17", "version": "1.2.18",
"devDependencies": { "devDependencies": {
"@hey-api/openapi-ts": "0.90.10", "@hey-api/openapi-ts": "0.90.10",
"@tsconfig/node22": "catalog:", "@tsconfig/node22": "catalog:",
@@ -438,7 +438,7 @@
}, },
"packages/slack": { "packages/slack": {
"name": "@opencode-ai/slack", "name": "@opencode-ai/slack",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@opencode-ai/sdk": "workspace:*", "@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1", "@slack/bolt": "^3.17.1",
@@ -473,7 +473,7 @@
}, },
"packages/ui": { "packages/ui": {
"name": "@opencode-ai/ui", "name": "@opencode-ai/ui",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@kobalte/core": "catalog:", "@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*", "@opencode-ai/sdk": "workspace:*",
@@ -519,7 +519,7 @@
}, },
"packages/util": { "packages/util": {
"name": "@opencode-ai/util", "name": "@opencode-ai/util",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"zod": "catalog:", "zod": "catalog:",
}, },
@@ -530,7 +530,7 @@
}, },
"packages/web": { "packages/web": {
"name": "@opencode-ai/web", "name": "@opencode-ai/web",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@astrojs/cloudflare": "12.6.3", "@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1", "@astrojs/markdown-remark": "6.3.1",
@@ -2958,7 +2958,7 @@
"get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="],
"ghostty-web": ["ghostty-web@0.4.0", "", {}, "sha512-0puDBik2qapbD/QQBW9o5ZHfXnZBqZWx/ctBiVtKZ6ZLds4NYb+wZuw1cRLXZk9zYovIQ908z3rvFhexAvc5Hg=="], "ghostty-web": ["ghostty-web@github:anomalyco/ghostty-web#4af877d", {}, "anomalyco-ghostty-web-4af877d", "sha512-fbEK8mtr7ar4ySsF+JUGjhaZrane7dKphanN+SxHt5XXI6yLMAh/Hpf6sNCOyyVa2UlGCd7YpXG/T2v2RUAX+A=="],
"gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="], "gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="],
+4 -4
View File
@@ -1,8 +1,8 @@
{ {
"nodeModules": { "nodeModules": {
"x86_64-linux": "sha256-ZmxeRNy2chc9py4m1iW6B+c/NSccMnVZ0lfni/EMdHw=", "x86_64-linux": "sha256-v83hWzYVg/g4zJiBpGsQ71wTdndPk3BQVZ2mjMApUIQ=",
"aarch64-linux": "sha256-R+1mxsmAQicerN8ixVy0ff6V8bZ4GH18MHpihvWnaTg=", "aarch64-linux": "sha256-inpMwkQqwBFP2wL8w/pTOP7q3fg1aOqvE0wgzVd3/B8=",
"aarch64-darwin": "sha256-m+QT20ohlqo9e86qXu67eKthZm6VDRLwlqJ9CNlEV+0=", "aarch64-darwin": "sha256-r42LGrQWqDyIy62mBSU5Nf3M22dJ3NNo7mjN/1h8d8Y=",
"x86_64-darwin": "sha256-4GeNPyTT2Hq4rxHGSON23ul5Ud3yFGE0QUVsB03Gidc=" "x86_64-darwin": "sha256-J6XrrdK5qBK3sQBQOO/B3ZluOnsAf5f65l4q/K1nDTI="
} }
} }
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/app", "name": "@opencode-ai/app",
"version": "1.2.17", "version": "1.2.18",
"description": "", "description": "",
"type": "module", "type": "module",
"exports": { "exports": {
@@ -57,7 +57,7 @@
"@thisbeyond/solid-dnd": "0.7.5", "@thisbeyond/solid-dnd": "0.7.5",
"diff": "catalog:", "diff": "catalog:",
"fuzzysort": "catalog:", "fuzzysort": "catalog:",
"ghostty-web": "0.4.0", "ghostty-web": "github:anomalyco/ghostty-web#main",
"luxon": "catalog:", "luxon": "catalog:",
"marked": "catalog:", "marked": "catalog:",
"marked-shiki": "catalog:", "marked-shiki": "catalog:",
@@ -39,7 +39,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
const usd = createMemo( const usd = createMemo(
() => () =>
new Intl.NumberFormat(language.locale(), { new Intl.NumberFormat(language.intl(), {
style: "currency", style: "currency",
currency: "USD", currency: "USD",
}), }),
@@ -77,7 +77,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
{(ctx) => ( {(ctx) => (
<> <>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="text-text-invert-strong">{ctx().total.toLocaleString(language.locale())}</span> <span class="text-text-invert-strong">{ctx().total.toLocaleString(language.intl())}</span>
<span class="text-text-invert-base">{language.t("context.usage.tokens")}</span> <span class="text-text-invert-base">{language.t("context.usage.tokens")}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
@@ -128,7 +128,7 @@ export function SessionContextTab() {
const usd = createMemo( const usd = createMemo(
() => () =>
new Intl.NumberFormat(language.locale(), { new Intl.NumberFormat(language.intl(), {
style: "currency", style: "currency",
currency: "USD", currency: "USD",
}), }),
@@ -136,7 +136,7 @@ export function SessionContextTab() {
const metrics = createMemo(() => getSessionContextMetrics(messages(), sync.data.provider.all)) const metrics = createMemo(() => getSessionContextMetrics(messages(), sync.data.provider.all))
const ctx = createMemo(() => metrics().context) const ctx = createMemo(() => metrics().context)
const formatter = createMemo(() => createSessionContextFormatter(language.locale())) const formatter = createMemo(() => createSessionContextFormatter(language.intl()))
const cost = createMemo(() => { const cost = createMemo(() => {
return usd().format(metrics().totalCost) return usd().format(metrics().totalCost)
@@ -200,7 +200,7 @@ export function SessionContextTab() {
const stats = [ const stats = [
{ label: "context.stats.session", value: () => info()?.title ?? params.id ?? "—" }, { label: "context.stats.session", value: () => info()?.title ?? params.id ?? "—" },
{ label: "context.stats.messages", value: () => counts().all.toLocaleString(language.locale()) }, { label: "context.stats.messages", value: () => counts().all.toLocaleString(language.intl()) },
{ label: "context.stats.provider", value: providerLabel }, { label: "context.stats.provider", value: providerLabel },
{ label: "context.stats.model", value: modelLabel }, { label: "context.stats.model", value: modelLabel },
{ label: "context.stats.limit", value: () => formatter().number(ctx()?.limit) }, { label: "context.stats.limit", value: () => formatter().number(ctx()?.limit) },
@@ -213,8 +213,8 @@ export function SessionContextTab() {
label: "context.stats.cacheTokens", label: "context.stats.cacheTokens",
value: () => `${formatter().number(ctx()?.cacheRead)} / ${formatter().number(ctx()?.cacheWrite)}`, value: () => `${formatter().number(ctx()?.cacheRead)} / ${formatter().number(ctx()?.cacheWrite)}`,
}, },
{ label: "context.stats.userMessages", value: () => counts().user.toLocaleString(language.locale()) }, { label: "context.stats.userMessages", value: () => counts().user.toLocaleString(language.intl()) },
{ label: "context.stats.assistantMessages", value: () => counts().assistant.toLocaleString(language.locale()) }, { label: "context.stats.assistantMessages", value: () => counts().assistant.toLocaleString(language.intl()) },
{ label: "context.stats.totalCost", value: cost }, { label: "context.stats.totalCost", value: cost },
{ label: "context.stats.sessionCreated", value: () => formatter().time(info()?.time.created) }, { label: "context.stats.sessionCreated", value: () => formatter().time(info()?.time.created) },
{ label: "context.stats.lastActivity", value: () => formatter().time(ctx()?.message.time.created) }, { label: "context.stats.lastActivity", value: () => formatter().time(ctx()?.message.time.created) },
@@ -307,7 +307,7 @@ export function SessionContextTab() {
<div class="flex items-center gap-1 text-11-regular text-text-weak"> <div class="flex items-center gap-1 text-11-regular text-text-weak">
<div class="size-2 rounded-sm" style={{ "background-color": BREAKDOWN_COLOR[segment.key] }} /> <div class="size-2 rounded-sm" style={{ "background-color": BREAKDOWN_COLOR[segment.key] }} />
<div>{breakdownLabel(segment.key)}</div> <div>{breakdownLabel(segment.key)}</div>
<div class="text-text-weaker">{segment.percent.toLocaleString(language.locale())}%</div> <div class="text-text-weaker">{segment.percent.toLocaleString(language.intl())}%</div>
</div> </div>
)} )}
</For> </For>
@@ -70,7 +70,7 @@ export function NewSessionView(props: NewSessionViewProps) {
{language.t("session.new.lastModified")}&nbsp; {language.t("session.new.lastModified")}&nbsp;
<span class="text-text-strong"> <span class="text-text-strong">
{DateTime.fromMillis(project().time.updated ?? project().time.created) {DateTime.fromMillis(project().time.updated ?? project().time.created)
.setLocale(language.locale()) .setLocale(language.intl())
.toRelative()} .toRelative()}
</span> </span>
</div> </div>
@@ -17,6 +17,7 @@ type ProviderItem = ReturnType<ReturnType<typeof useProviders>["connected"]>[num
const PROVIDER_NOTES = [ const PROVIDER_NOTES = [
{ match: (id: string) => id === "opencode", key: "dialog.provider.opencode.note" }, { match: (id: string) => id === "opencode", key: "dialog.provider.opencode.note" },
{ match: (id: string) => id === "opencode-go", key: "dialog.provider.opencodeGo.tagline" },
{ match: (id: string) => id === "anthropic", key: "dialog.provider.anthropic.note" }, { match: (id: string) => id === "anthropic", key: "dialog.provider.anthropic.note" },
{ match: (id: string) => id.startsWith("github-copilot"), key: "dialog.provider.copilot.note" }, { match: (id: string) => id.startsWith("github-copilot"), key: "dialog.provider.copilot.note" },
{ match: (id: string) => id === "openai", key: "dialog.provider.openai.note" }, { match: (id: string) => id === "openai", key: "dialog.provider.openai.note" },
@@ -181,21 +182,11 @@ export const SettingsProviders: Component = () => {
<div class="flex items-center gap-x-3"> <div class="flex items-center gap-x-3">
<ProviderIcon id={item.id} class="size-5 shrink-0 icon-strong-base" /> <ProviderIcon id={item.id} class="size-5 shrink-0 icon-strong-base" />
<span class="text-14-medium text-text-strong">{item.name}</span> <span class="text-14-medium text-text-strong">{item.name}</span>
<Show when={item.id === "opencode"}>
<span class="text-14-regular text-text-weak">
{language.t("dialog.provider.opencode.tagline")}
</span>
</Show>
<Show when={item.id === "opencode"}> <Show when={item.id === "opencode"}>
<Tag>{language.t("dialog.provider.tag.recommended")}</Tag> <Tag>{language.t("dialog.provider.tag.recommended")}</Tag>
</Show> </Show>
<Show when={item.id === "opencode-go"}> <Show when={item.id === "opencode-go"}>
<> <Tag>{language.t("dialog.provider.tag.recommended")}</Tag>
<span class="text-14-regular text-text-weak">
{language.t("dialog.provider.opencodeGo.tagline")}
</span>
<Tag>{language.t("dialog.provider.tag.recommended")}</Tag>
</>
</Show> </Show>
</div> </div>
<Show when={note(item.id)}> <Show when={note(item.id)}>
+1 -1
View File
@@ -217,7 +217,7 @@ export const Terminal = (props: TerminalProps) => {
const currentTheme = theme.themes()[theme.themeId()] const currentTheme = theme.themes()[theme.themeId()]
if (!currentTheme) return fallback if (!currentTheme) return fallback
const variant = mode === "dark" ? currentTheme.dark : currentTheme.light const variant = mode === "dark" ? currentTheme.dark : currentTheme.light
if (!variant?.seeds) return fallback if (!variant?.seeds && !variant?.palette) return fallback
const resolved = resolveThemeVariant(variant, mode === "dark") const resolved = resolveThemeVariant(variant, mode === "dark")
const text = resolved["text-stronger"] ?? fallback.foreground const text = resolved["text-stronger"] ?? fallback.foreground
const background = resolved["background-stronger"] ?? fallback.background const background = resolved["background-stronger"] ?? fallback.background
+22
View File
@@ -84,6 +84,26 @@ const LOCALES: readonly Locale[] = [
"tr", "tr",
] ]
const INTL: Record<Locale, string> = {
en: "en",
zh: "zh-Hans",
zht: "zh-Hant",
ko: "ko",
de: "de",
es: "es",
fr: "fr",
da: "da",
ja: "ja",
pl: "pl",
ru: "ru",
ar: "ar",
no: "nb-NO",
br: "pt-BR",
th: "th",
bs: "bs",
tr: "tr",
}
const LABEL_KEY: Record<Locale, keyof Dictionary> = { const LABEL_KEY: Record<Locale, keyof Dictionary> = {
en: "language.en", en: "language.en",
zh: "language.zh", zh: "language.zh",
@@ -197,6 +217,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
) )
const locale = createMemo<Locale>(() => normalizeLocale(store.locale)) const locale = createMemo<Locale>(() => normalizeLocale(store.locale))
const intl = createMemo(() => INTL[locale()])
const dict = createMemo<Dictionary>(() => DICT[locale()]) const dict = createMemo<Dictionary>(() => DICT[locale()])
@@ -213,6 +234,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
return { return {
ready, ready,
locale, locale,
intl,
locales: LOCALES, locales: LOCALES,
label, label,
t, t,
+17 -17
View File
@@ -1846,7 +1846,7 @@ export default function Layout(props: ParentProps) {
}} }}
style={{ width: panelProps.mobile ? undefined : `${Math.max(layout.sidebar.width() - 64, 0)}px` }} style={{ width: panelProps.mobile ? undefined : `${Math.max(layout.sidebar.width() - 64, 0)}px` }}
> >
<Show when={panelProps.project}> <Show when={panelProps.project} keyed>
{(p) => ( {(p) => (
<> <>
<div class="shrink-0 px-2 py-1"> <div class="shrink-0 px-2 py-1">
@@ -1855,7 +1855,7 @@ export default function Layout(props: ParentProps) {
<InlineEditor <InlineEditor
id={`project:${projectId()}`} id={`project:${projectId()}`}
value={projectName} value={projectName}
onSave={(next) => renameProject(p(), next)} onSave={(next) => renameProject(p, next)}
class="text-14-medium text-text-strong truncate" class="text-14-medium text-text-strong truncate"
displayClass="text-14-medium text-text-strong truncate" displayClass="text-14-medium text-text-strong truncate"
stopPropagation stopPropagation
@@ -1864,7 +1864,7 @@ export default function Layout(props: ParentProps) {
<Tooltip <Tooltip
placement="bottom" placement="bottom"
gutter={2} gutter={2}
value={p().worktree} value={p.worktree}
class="shrink-0" class="shrink-0"
contentStyle={{ contentStyle={{
"max-width": "640px", "max-width": "640px",
@@ -1872,7 +1872,7 @@ export default function Layout(props: ParentProps) {
}} }}
> >
<span class="text-12-regular text-text-base truncate select-text"> <span class="text-12-regular text-text-base truncate select-text">
{p().worktree.replace(homedir(), "~")} {p.worktree.replace(homedir(), "~")}
</span> </span>
</Tooltip> </Tooltip>
</div> </div>
@@ -1883,7 +1883,7 @@ export default function Layout(props: ParentProps) {
icon="dot-grid" icon="dot-grid"
variant="ghost" variant="ghost"
data-action="project-menu" data-action="project-menu"
data-project={base64Encode(p().worktree)} data-project={base64Encode(p.worktree)}
class="shrink-0 size-6 rounded-md data-[expanded]:bg-surface-base-active" class="shrink-0 size-6 rounded-md data-[expanded]:bg-surface-base-active"
classList={{ classList={{
"opacity-0 group-hover/project:opacity-100 data-[expanded]:opacity-100": !panelProps.mobile, "opacity-0 group-hover/project:opacity-100 data-[expanded]:opacity-100": !panelProps.mobile,
@@ -1892,24 +1892,24 @@ export default function Layout(props: ParentProps) {
/> />
<DropdownMenu.Portal mount={!panelProps.mobile ? state.nav : undefined}> <DropdownMenu.Portal mount={!panelProps.mobile ? state.nav : undefined}>
<DropdownMenu.Content class="mt-1"> <DropdownMenu.Content class="mt-1">
<DropdownMenu.Item onSelect={() => showEditProjectDialog(p())}> <DropdownMenu.Item onSelect={() => showEditProjectDialog(p)}>
<DropdownMenu.ItemLabel>{language.t("common.edit")}</DropdownMenu.ItemLabel> <DropdownMenu.ItemLabel>{language.t("common.edit")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
data-action="project-workspaces-toggle" data-action="project-workspaces-toggle"
data-project={base64Encode(p().worktree)} data-project={base64Encode(p.worktree)}
disabled={p().vcs !== "git" && !layout.sidebar.workspaces(p().worktree)()} disabled={p.vcs !== "git" && !layout.sidebar.workspaces(p.worktree)()}
onSelect={() => toggleProjectWorkspaces(p())} onSelect={() => toggleProjectWorkspaces(p)}
> >
<DropdownMenu.ItemLabel> <DropdownMenu.ItemLabel>
{layout.sidebar.workspaces(p().worktree)() {layout.sidebar.workspaces(p.worktree)()
? language.t("sidebar.workspaces.disable") ? language.t("sidebar.workspaces.disable")
: language.t("sidebar.workspaces.enable")} : language.t("sidebar.workspaces.enable")}
</DropdownMenu.ItemLabel> </DropdownMenu.ItemLabel>
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
data-action="project-clear-notifications" data-action="project-clear-notifications"
data-project={base64Encode(p().worktree)} data-project={base64Encode(p.worktree)}
disabled={unseenCount() === 0} disabled={unseenCount() === 0}
onSelect={clearNotifications} onSelect={clearNotifications}
> >
@@ -1920,8 +1920,8 @@ export default function Layout(props: ParentProps) {
<DropdownMenu.Separator /> <DropdownMenu.Separator />
<DropdownMenu.Item <DropdownMenu.Item
data-action="project-close-menu" data-action="project-close-menu"
data-project={base64Encode(p().worktree)} data-project={base64Encode(p.worktree)}
onSelect={() => closeProject(p().worktree)} onSelect={() => closeProject(p.worktree)}
> >
<DropdownMenu.ItemLabel>{language.t("common.close")}</DropdownMenu.ItemLabel> <DropdownMenu.ItemLabel>{language.t("common.close")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item> </DropdownMenu.Item>
@@ -1946,7 +1946,7 @@ export default function Layout(props: ParentProps) {
size="large" size="large"
icon="plus-small" icon="plus-small"
class="w-full" class="w-full"
onClick={() => navigateWithSidebarReset(`/${base64Encode(p().worktree)}/session`)} onClick={() => navigateWithSidebarReset(`/${base64Encode(p.worktree)}/session`)}
> >
{language.t("command.session.new")} {language.t("command.session.new")}
</Button> </Button>
@@ -1955,7 +1955,7 @@ export default function Layout(props: ParentProps) {
<div class="flex-1 min-h-0"> <div class="flex-1 min-h-0">
<LocalWorkspace <LocalWorkspace
ctx={workspaceSidebarCtx} ctx={workspaceSidebarCtx}
project={p()} project={p}
sortNow={sortNow} sortNow={sortNow}
mobile={panelProps.mobile} mobile={panelProps.mobile}
/> />
@@ -1970,7 +1970,7 @@ export default function Layout(props: ParentProps) {
keybind={command.keybind("workspace.new")} keybind={command.keybind("workspace.new")}
placement="top" placement="top"
> >
<Button size="large" icon="plus-small" class="w-full" onClick={() => createWorkspace(p())}> <Button size="large" icon="plus-small" class="w-full" onClick={() => createWorkspace(p)}>
{language.t("workspace.new")} {language.t("workspace.new")}
</Button> </Button>
</TooltipKeybind> </TooltipKeybind>
@@ -1996,7 +1996,7 @@ export default function Layout(props: ParentProps) {
<SortableWorkspace <SortableWorkspace
ctx={workspaceSidebarCtx} ctx={workspaceSidebarCtx}
directory={directory} directory={directory}
project={p()} project={p}
sortNow={sortNow} sortNow={sortNow}
mobile={panelProps.mobile} mobile={panelProps.mobile}
/> />
+1
View File
@@ -720,6 +720,7 @@ export default function Page() {
showAllFiles, showAllFiles,
tabForPath: file.tab, tabForPath: file.tab,
openTab: tabs().open, openTab: tabs().open,
setActive: tabs().setActive,
loadFile: file.load, loadFile: file.load,
}) })
@@ -11,12 +11,13 @@ describe("createOpenReviewFile", () => {
return `file://${path}` return `file://${path}`
}, },
openTab: (tab) => calls.push(`open:${tab}`), openTab: (tab) => calls.push(`open:${tab}`),
setActive: (tab) => calls.push(`active:${tab}`),
loadFile: (path) => calls.push(`load:${path}`), loadFile: (path) => calls.push(`load:${path}`),
}) })
openReviewFile("src/a.ts") openReviewFile("src/a.ts")
expect(calls).toEqual(["show", "load:src/a.ts", "tab:src/a.ts", "open:file://src/a.ts"]) expect(calls).toEqual(["show", "load:src/a.ts", "tab:src/a.ts", "open:file://src/a.ts", "active:file://src/a.ts"])
}) })
}) })
+8 -3
View File
@@ -24,15 +24,20 @@ export const createOpenReviewFile = (input: {
showAllFiles: () => void showAllFiles: () => void
tabForPath: (path: string) => string tabForPath: (path: string) => string
openTab: (tab: string) => void openTab: (tab: string) => void
setActive: (tab: string) => void
loadFile: (path: string) => any | Promise<void> loadFile: (path: string) => any | Promise<void>
}) => { }) => {
return (path: string) => { return (path: string) => {
batch(() => { batch(() => {
input.showAllFiles() input.showAllFiles()
const maybePromise = input.loadFile(path) const maybePromise = input.loadFile(path)
const openTab = () => input.openTab(input.tabForPath(path)) const open = () => {
if (maybePromise instanceof Promise) maybePromise.then(openTab) const tab = input.tabForPath(path)
else openTab() input.openTab(tab)
input.setActive(tab)
}
if (maybePromise instanceof Promise) maybePromise.then(open)
else open()
}) })
} }
} }
@@ -611,7 +611,7 @@ export function MessageTimeline(props: {
</Show> </Show>
</Show> </Show>
</div> </div>
<Show when={sessionID()}> <Show when={sessionID()} keyed>
{(id) => ( {(id) => (
<div class="shrink-0 flex items-center gap-3"> <div class="shrink-0 flex items-center gap-3">
<SessionContextUsage placement="bottom" /> <SessionContextUsage placement="bottom" />
@@ -646,12 +646,12 @@ export function MessageTimeline(props: {
> >
<DropdownMenu.ItemLabel>{language.t("common.rename")}</DropdownMenu.ItemLabel> <DropdownMenu.ItemLabel>{language.t("common.rename")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item onSelect={() => void archiveSession(id())}> <DropdownMenu.Item onSelect={() => void archiveSession(id)}>
<DropdownMenu.ItemLabel>{language.t("common.archive")}</DropdownMenu.ItemLabel> <DropdownMenu.ItemLabel>{language.t("common.archive")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Separator /> <DropdownMenu.Separator />
<DropdownMenu.Item <DropdownMenu.Item
onSelect={() => dialog.show(() => <DialogDeleteSession sessionID={id()} />)} onSelect={() => dialog.show(() => <DialogDeleteSession sessionID={id} />)}
> >
<DropdownMenu.ItemLabel>{language.t("common.delete")}</DropdownMenu.ItemLabel> <DropdownMenu.ItemLabel>{language.t("common.delete")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item> </DropdownMenu.Item>
@@ -331,7 +331,9 @@ export function SessionSidePanel(props: {
const path = createMemo(() => file.pathFromTab(tab)) const path = createMemo(() => file.pathFromTab(tab))
return ( return (
<div data-component="tabs-drag-preview"> <div data-component="tabs-drag-preview">
<Show when={path()}>{(p) => <FileVisual active path={p()} />}</Show> <Show when={path()} keyed>
{(p) => <FileVisual active path={p} />}
</Show>
</div> </div>
) )
}} }}
@@ -191,8 +191,8 @@ export function TerminalPanel() {
<SortableProvider ids={ids()}> <SortableProvider ids={ids()}>
<For each={ids()}> <For each={ids()}>
{(id) => ( {(id) => (
<Show when={byId().get(id)}> <Show when={byId().get(id)} keyed>
{(pty) => <SortableTerminalTab terminal={pty()} onClose={close} />} {(pty) => <SortableTerminalTab terminal={pty} onClose={close} />}
</Show> </Show>
)} )}
</For> </For>
@@ -217,10 +217,10 @@ export function TerminalPanel() {
<div class="flex-1 min-h-0 relative"> <div class="flex-1 min-h-0 relative">
<Show when={terminal.active()} keyed> <Show when={terminal.active()} keyed>
{(id) => ( {(id) => (
<Show when={byId().get(id)}> <Show when={byId().get(id)} keyed>
{(pty) => ( {(pty) => (
<div id={`terminal-wrapper-${id}`} class="absolute inset-0"> <div id={`terminal-wrapper-${id}`} class="absolute inset-0">
<Terminal pty={pty()} onCleanup={terminal.update} onConnectError={() => terminal.clone(id)} /> <Terminal pty={pty} onCleanup={terminal.update} onConnectError={() => terminal.clone(id)} />
</div> </div>
)} )}
</Show> </Show>
@@ -229,14 +229,14 @@ export function TerminalPanel() {
</div> </div>
</div> </div>
<DragOverlay> <DragOverlay>
<Show when={store.activeDraggable}> <Show when={store.activeDraggable} keyed>
{(draggedId) => ( {(draggedId) => (
<Show when={byId().get(draggedId())}> <Show when={byId().get(draggedId)} keyed>
{(t) => ( {(t) => (
<div class="relative p-1 h-10 flex items-center bg-background-stronger text-14-regular"> <div class="relative p-1 h-10 flex items-center bg-background-stronger text-14-regular">
{terminalTabLabel({ {terminalTabLabel({
title: t().title, title: t.title,
titleNumber: t().titleNumber, titleNumber: t.titleNumber,
t: language.t as (key: string, vars?: Record<string, string | number | boolean>) => string, t: language.t as (key: string, vars?: Record<string, string | number | boolean>) => string,
})} })}
</div> </div>
+1 -2
View File
@@ -22,6 +22,5 @@
} }
}, },
"include": ["src", "package.json"], "include": ["src", "package.json"],
"exclude": ["dist", "ts-dist"], "exclude": ["dist", "ts-dist"]
"references": [{ "path": "../sdk/js" }]
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/console-app", "name": "@opencode-ai/console-app",
"version": "1.2.17", "version": "1.2.18",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core", "name": "@opencode-ai/console-core",
"version": "1.2.17", "version": "1.2.18",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/console-function", "name": "@opencode-ai/console-function",
"version": "1.2.17", "version": "1.2.18",
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"private": true, "private": true,
"type": "module", "type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/console-mail", "name": "@opencode-ai/console-mail",
"version": "1.2.17", "version": "1.2.18",
"dependencies": { "dependencies": {
"@jsx-email/all": "2.2.3", "@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3", "@jsx-email/cli": "1.4.3",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@opencode-ai/desktop-electron", "name": "@opencode-ai/desktop-electron",
"private": true, "private": true,
"version": "1.2.17", "version": "1.2.18",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"homepage": "https://opencode.ai", "homepage": "https://opencode.ai",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@opencode-ai/desktop", "name": "@opencode-ai/desktop",
"private": true, "private": true,
"version": "1.2.17", "version": "1.2.18",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/enterprise", "name": "@opencode-ai/enterprise",
"version": "1.2.17", "version": "1.2.18",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
+6 -6
View File
@@ -1,7 +1,7 @@
id = "opencode" id = "opencode"
name = "OpenCode" name = "OpenCode"
description = "The open source coding agent." description = "The open source coding agent."
version = "1.2.17" version = "1.2.18"
schema_version = 1 schema_version = 1
authors = ["Anomaly"] authors = ["Anomaly"]
repository = "https://github.com/anomalyco/opencode" repository = "https://github.com/anomalyco/opencode"
@@ -11,26 +11,26 @@ name = "OpenCode"
icon = "./icons/opencode.svg" icon = "./icons/opencode.svg"
[agent_servers.opencode.targets.darwin-aarch64] [agent_servers.opencode.targets.darwin-aarch64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-darwin-arm64.zip" archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-darwin-arm64.zip"
cmd = "./opencode" cmd = "./opencode"
args = ["acp"] args = ["acp"]
[agent_servers.opencode.targets.darwin-x86_64] [agent_servers.opencode.targets.darwin-x86_64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-darwin-x64.zip" archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-darwin-x64.zip"
cmd = "./opencode" cmd = "./opencode"
args = ["acp"] args = ["acp"]
[agent_servers.opencode.targets.linux-aarch64] [agent_servers.opencode.targets.linux-aarch64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-linux-arm64.tar.gz" archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-linux-arm64.tar.gz"
cmd = "./opencode" cmd = "./opencode"
args = ["acp"] args = ["acp"]
[agent_servers.opencode.targets.linux-x86_64] [agent_servers.opencode.targets.linux-x86_64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-linux-x64.tar.gz" archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-linux-x64.tar.gz"
cmd = "./opencode" cmd = "./opencode"
args = ["acp"] args = ["acp"]
[agent_servers.opencode.targets.windows-x86_64] [agent_servers.opencode.targets.windows-x86_64]
archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.17/opencode-windows-x64.zip" archive = "https://github.com/anomalyco/opencode/releases/download/v1.2.18/opencode-windows-x64.zip"
cmd = "./opencode.exe" cmd = "./opencode.exe"
args = ["acp"] args = ["acp"]
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/function", "name": "@opencode-ai/function",
"version": "1.2.17", "version": "1.2.18",
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"private": true, "private": true,
"type": "module", "type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"version": "1.2.17", "version": "1.2.18",
"name": "opencode", "name": "opencode",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
@@ -128,11 +128,6 @@ export function Session() {
.filter((x) => x.parentID === parentID || x.id === parentID) .filter((x) => x.parentID === parentID || x.id === parentID)
.toSorted((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)) .toSorted((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
}) })
const subagents = createMemo(() => {
return sync.data.session
.filter((x) => x.parentID === route.sessionID)
.toSorted((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
})
const messages = createMemo(() => sync.data.message[route.sessionID] ?? []) const messages = createMemo(() => sync.data.message[route.sessionID] ?? [])
const permissions = createMemo(() => { const permissions = createMemo(() => {
if (session()?.parentID) return [] if (session()?.parentID) return []
@@ -321,14 +316,20 @@ export function Session() {
const local = useLocal() const local = useLocal()
function moveFirstChild() { function moveFirstChild() {
const next = subagents()[0] if (children().length === 1) return
if (!next) return const next = children().find((x) => !!x.parentID)
navigate({ type: "session", sessionID: next.id }) if (next) {
navigate({
type: "session",
sessionID: next.id,
})
}
} }
function moveChild(direction: number) { function moveChild(direction: number) {
if (children().length === 1) return
const sessions = children().filter((x) => !!x.parentID) const sessions = children().filter((x) => !!x.parentID)
if (sessions.length === 0) return
let next = sessions.findIndex((x) => x.id === session()?.id) + direction let next = sessions.findIndex((x) => x.id === session()?.id) + direction
if (next >= sessions.length) next = 0 if (next >= sessions.length) next = 0
@@ -1123,7 +1124,7 @@ export function Session() {
<UserMessage <UserMessage
index={index()} index={index()}
onMouseUp={() => { onMouseUp={() => {
if (renderer.hasSelection) return if (renderer.getSelection()?.getSelectedText()) return
dialog.replace(() => ( dialog.replace(() => (
<DialogMessage <DialogMessage
messageID={message.id} messageID={message.id}
@@ -1622,9 +1623,9 @@ function InlineTool(props: {
complete: any complete: any
pending: string pending: string
spinner?: boolean spinner?: boolean
onClick?: () => void
children: JSX.Element children: JSX.Element
part: ToolPart part: ToolPart
onClick?: () => void
}) { }) {
const [margin, setMargin] = createSignal(0) const [margin, setMargin] = createSignal(0)
const { theme } = useTheme() const { theme } = useTheme()
@@ -1641,6 +1642,7 @@ function InlineTool(props: {
const fg = createMemo(() => { const fg = createMemo(() => {
if (permission()) return theme.warning if (permission()) return theme.warning
if (hover() && props.onClick) return theme.text
if (props.complete) return theme.textMuted if (props.complete) return theme.textMuted
return theme.text return theme.text
}) })
@@ -1658,6 +1660,12 @@ function InlineTool(props: {
<box <box
marginTop={margin()} marginTop={margin()}
paddingLeft={3} paddingLeft={3}
onMouseOver={() => props.onClick && setHover(true)}
onMouseOut={() => setHover(false)}
onMouseUp={() => {
if (renderer.getSelection()?.getSelectedText()) return
props.onClick?.()
}}
renderBefore={function () { renderBefore={function () {
const el = this as BoxRenderable const el = this as BoxRenderable
const parent = el.parent const parent = el.parent
@@ -1680,23 +1688,13 @@ function InlineTool(props: {
return return
} }
}} }}
onMouseOver={() => props.onClick && setHover(true)}
onMouseOut={() => setHover(false)}
onMouseUp={() => {
if (renderer.hasSelection) return
props.onClick?.()
}}
> >
<Switch> <Switch>
<Match when={props.spinner}> <Match when={props.spinner}>
<Spinner color={hover() ? theme.text : fg()} children={props.children} /> <Spinner color={fg()} children={props.children} />
</Match> </Match>
<Match when={true}> <Match when={true}>
<text <text paddingLeft={3} fg={fg()} attributes={denied() ? TextAttributes.STRIKETHROUGH : undefined}>
paddingLeft={3}
fg={hover() ? theme.text : fg()}
attributes={denied() ? TextAttributes.STRIKETHROUGH : undefined}
>
<Show fallback={<>~ {props.pending}</>} when={props.complete}> <Show fallback={<>~ {props.pending}</>} when={props.complete}>
<span style={{ fg: props.iconColor }}>{props.icon}</span> {props.children} <span style={{ fg: props.iconColor }}>{props.icon}</span> {props.children}
</Show> </Show>
@@ -1735,7 +1733,7 @@ function BlockTool(props: {
onMouseOver={() => props.onClick && setHover(true)} onMouseOver={() => props.onClick && setHover(true)}
onMouseOut={() => setHover(false)} onMouseOut={() => setHover(false)}
onMouseUp={() => { onMouseUp={() => {
if (renderer.hasSelection) return if (renderer.getSelection()?.getSelectedText()) return
props.onClick?.() props.onClick?.()
}} }}
> >
@@ -1955,7 +1953,10 @@ function WebSearch(props: ToolProps<any>) {
} }
function Task(props: ToolProps<typeof TaskTool>) { function Task(props: ToolProps<typeof TaskTool>) {
const { theme } = useTheme()
const keybind = useKeybind()
const { navigate } = useRoute() const { navigate } = useRoute()
const local = useLocal()
const sync = useSync() const sync = useSync()
onMount(() => { onMount(() => {
@@ -2008,15 +2009,11 @@ function Task(props: ToolProps<typeof TaskTool>) {
complete={props.input.description} complete={props.input.description}
pending="Delegating..." pending="Delegating..."
part={props.part} part={props.part}
onClick={ onClick={() => {
props.metadata.sessionId if (props.metadata.sessionId) {
? () => { navigate({ type: "session", sessionID: props.metadata.sessionId })
const id = props.metadata.sessionId }
if (!id) return }}
navigate({ type: "session", sessionID: id })
}
: undefined
}
> >
{content()} {content()}
</InlineTool> </InlineTool>
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/plugin", "name": "@opencode-ai/plugin",
"version": "1.2.17", "version": "1.2.18",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
+5 -17
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/sdk", "name": "@opencode-ai/sdk",
"version": "1.2.17", "version": "1.2.18",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
@@ -12,18 +12,9 @@
".": "./src/index.ts", ".": "./src/index.ts",
"./client": "./src/client.ts", "./client": "./src/client.ts",
"./server": "./src/server.ts", "./server": "./src/server.ts",
"./v2": { "./v2": "./src/v2/index.ts",
"types": "./dist/v2/index.d.ts", "./v2/client": "./src/v2/client.ts",
"default": "./src/v2/index.ts" "./v2/gen/client": "./src/v2/gen/client/index.ts",
},
"./v2/client": {
"types": "./dist/v2/client.d.ts",
"default": "./src/v2/client.ts"
},
"./v2/gen/client": {
"types": "./dist/v2/gen/client/index.d.ts",
"default": "./src/v2/gen/client/index.ts"
},
"./v2/server": "./src/v2/server.ts" "./v2/server": "./src/v2/server.ts"
}, },
"files": [ "files": [
@@ -36,8 +27,5 @@
"typescript": "catalog:", "typescript": "catalog:",
"@typescript/native-preview": "catalog:" "@typescript/native-preview": "catalog:"
}, },
"dependencies": {}, "dependencies": {}
"publishConfig": {
"directory": "dist"
}
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/slack", "name": "@opencode-ai/slack",
"version": "1.2.17", "version": "1.2.18",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/ui", "name": "@opencode-ai/ui",
"version": "1.2.17", "version": "1.2.18",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"exports": { "exports": {
+37 -2
View File
@@ -203,6 +203,41 @@ export function BasicTool(props: BasicToolProps) {
) )
} }
export function GenericTool(props: { tool: string; status?: string; hideDetails?: boolean }) { function label(input: Record<string, unknown> | undefined) {
return <BasicTool icon="mcp" status={props.status} trigger={{ title: props.tool }} hideDetails={props.hideDetails} /> const keys = ["description", "query", "url", "filePath", "path", "pattern", "name"]
return keys.map((key) => input?.[key]).find((value): value is string => typeof value === "string" && value.length > 0)
}
function args(input: Record<string, unknown> | undefined) {
if (!input) return []
const skip = new Set(["description", "query", "url", "filePath", "path", "pattern", "name"])
return Object.entries(input)
.filter(([key]) => !skip.has(key))
.flatMap(([key, value]) => {
if (typeof value === "string") return [`${key}=${value}`]
if (typeof value === "number") return [`${key}=${value}`]
if (typeof value === "boolean") return [`${key}=${value}`]
return []
})
.slice(0, 3)
}
export function GenericTool(props: {
tool: string
status?: string
hideDetails?: boolean
input?: Record<string, unknown>
}) {
return (
<BasicTool
icon="mcp"
status={props.status}
trigger={{
title: `Called \`${props.tool}\``,
subtitle: label(props.input),
args: args(props.input),
}}
hideDetails={props.hideDetails}
/>
)
} }
+1
View File
@@ -1,4 +1,5 @@
[data-component="file-icon"] { [data-component="file-icon"] {
display: block;
flex-shrink: 0; flex-shrink: 0;
width: 16px; width: 16px;
height: 16px; height: 16px;
+7 -10
View File
@@ -1,10 +1,8 @@
import type { Component, JSX } from "solid-js" import type { Component, JSX } from "solid-js"
import { createMemo, splitProps, Show } from "solid-js" import { createMemo, createUniqueId, splitProps, Show } from "solid-js"
import sprite from "./file-icons/sprite.svg" import sprite from "./file-icons/sprite.svg"
import type { IconName } from "./file-icons/types" import type { IconName } from "./file-icons/types"
let filter = 0
export type FileIconProps = JSX.GSVGAttributes<SVGSVGElement> & { export type FileIconProps = JSX.GSVGAttributes<SVGSVGElement> & {
node: { path: string; type: "file" | "directory" } node: { path: string; type: "file" | "directory" }
expanded?: boolean expanded?: boolean
@@ -14,7 +12,7 @@ export type FileIconProps = JSX.GSVGAttributes<SVGSVGElement> & {
export const FileIcon: Component<FileIconProps> = (props) => { export const FileIcon: Component<FileIconProps> = (props) => {
const [local, rest] = splitProps(props, ["node", "class", "classList", "expanded", "mono"]) const [local, rest] = splitProps(props, ["node", "class", "classList", "expanded", "mono"])
const name = createMemo(() => chooseIconName(local.node.path, local.node.type, local.expanded || false)) const name = createMemo(() => chooseIconName(local.node.path, local.node.type, local.expanded || false))
const id = `file-icon-mono-${filter++}` const id = `file-icon-mono-${createUniqueId()}`
return ( return (
<svg <svg
data-component="file-icon" data-component="file-icon"
@@ -24,15 +22,14 @@ export const FileIcon: Component<FileIconProps> = (props) => {
[local.class ?? ""]: !!local.class, [local.class ?? ""]: !!local.class,
}} }}
> >
<Show when={local.mono}> <Show when={local.mono} fallback={<use href={`${sprite}#${name()}`} />}>
<defs> <defs>
<filter id={id} color-interpolation-filters="sRGB"> <mask id={id} mask-type="alpha">
<feFlood flood-color="currentColor" result="flood" /> <use href={`${sprite}#${name()}`} />
<feComposite in="flood" in2="SourceAlpha" operator="in" /> </mask>
</filter>
</defs> </defs>
<rect width="100%" height="100%" fill="currentColor" mask={`url(#${id})`} />
</Show> </Show>
<use href={`${sprite}#${name()}`} filter={local.mono ? `url(#${id})` : undefined} />
</svg> </svg>
) )
} }
@@ -577,6 +577,46 @@
justify-content: center; justify-content: center;
} }
[data-component="exa-tool-output"] {
width: 100%;
padding-top: 8px;
display: flex;
flex-direction: column;
}
[data-slot="basic-tool-tool-subtitle"].exa-tool-query {
display: block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
[data-slot="exa-tool-links"] {
display: flex;
flex-direction: column;
gap: 4px;
}
[data-slot="exa-tool-link"] {
display: block;
max-width: 100%;
color: var(--text-interactive-base);
text-decoration: underline;
text-underline-offset: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
&:hover {
color: var(--text-interactive-base);
}
&:visited {
color: var(--text-interactive-base);
}
}
[data-component="todos"] { [data-component="todos"] {
padding: 10px 0 24px 0; padding: 10px 0 24px 0;
display: flex; display: flex;
+102
View File
@@ -243,6 +243,18 @@ export function getToolInfo(tool: string, input: any = {}): ToolInfo {
title: i18n.t("ui.tool.webfetch"), title: i18n.t("ui.tool.webfetch"),
subtitle: input.url, subtitle: input.url,
} }
case "websearch":
return {
icon: "window-cursor",
title: i18n.t("ui.tool.websearch"),
subtitle: input.query,
}
case "codesearch":
return {
icon: "code",
title: i18n.t("ui.tool.codesearch"),
subtitle: input.query,
}
case "task": case "task":
return { return {
icon: "task", icon: "task",
@@ -303,6 +315,18 @@ export function getToolInfo(tool: string, input: any = {}): ToolInfo {
} }
} }
function urls(text: string | undefined) {
if (!text) return []
const seen = new Set<string>()
return [...text.matchAll(/https?:\/\/[^\s<>"'`)\]]+/g)]
.map((item) => item[0].replace(/[),.;:!?]+$/g, ""))
.filter((item) => {
if (seen.has(item)) return false
seen.add(item)
return true
})
}
const CONTEXT_GROUP_TOOLS = new Set(["read", "glob", "grep", "list"]) const CONTEXT_GROUP_TOOLS = new Set(["read", "glob", "grep", "list"])
const HIDDEN_TOOLS = new Set(["todowrite", "todoread"]) const HIDDEN_TOOLS = new Set(["todowrite", "todoread"])
@@ -598,6 +622,32 @@ function contextToolSummary(parts: ToolPart[]) {
return { read, search, list } return { read, search, list }
} }
function ExaOutput(props: { output?: string }) {
const links = createMemo(() => urls(props.output))
return (
<Show when={links().length > 0}>
<div data-component="exa-tool-output">
<div data-slot="exa-tool-links">
<For each={links()}>
{(url) => (
<a
data-slot="exa-tool-link"
href={url}
target="_blank"
rel="noopener noreferrer"
onClick={(event) => event.stopPropagation()}
>
{url}
</a>
)}
</For>
</div>
</div>
</Show>
)
}
export function registerPartComponent(type: string, component: PartComponent) { export function registerPartComponent(type: string, component: PartComponent) {
PART_MAPPING[type] = component PART_MAPPING[type] = component
} }
@@ -1467,6 +1517,58 @@ ToolRegistry.register({
}, },
}) })
ToolRegistry.register({
name: "websearch",
render(props) {
const i18n = useI18n()
const query = createMemo(() => {
const value = props.input.query
if (typeof value !== "string") return ""
return value
})
return (
<BasicTool
{...props}
icon="window-cursor"
trigger={{
title: i18n.t("ui.tool.websearch"),
subtitle: query(),
subtitleClass: "exa-tool-query",
}}
>
<ExaOutput output={props.output} />
</BasicTool>
)
},
})
ToolRegistry.register({
name: "codesearch",
render(props) {
const i18n = useI18n()
const query = createMemo(() => {
const value = props.input.query
if (typeof value !== "string") return ""
return value
})
return (
<BasicTool
{...props}
icon="code"
trigger={{
title: i18n.t("ui.tool.codesearch"),
subtitle: query(),
subtitleClass: "exa-tool-query",
}}
>
<ExaOutput output={props.output} />
</BasicTool>
)
},
})
ToolRegistry.register({ ToolRegistry.register({
name: "task", name: "task",
render(props) { render(props) {
+2 -12
View File
@@ -171,10 +171,8 @@
[data-slot="session-turn-diff-path"] { [data-slot="session-turn-diff-path"] {
display: flex; display: flex;
flex-grow: 1;
min-width: 0; min-width: 0;
align-items: baseline;
overflow: hidden;
white-space: nowrap;
font-family: var(--font-family-sans); font-family: var(--font-family-sans);
font-size: var(--font-size-small); font-size: var(--font-size-small);
@@ -182,24 +180,16 @@
} }
[data-slot="session-turn-diff-directory"] { [data-slot="session-turn-diff-directory"] {
flex: 1 1 auto; color: var(--text-base);
color: var(--text-weak);
min-width: 0;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
direction: rtl; direction: rtl;
unicode-bidi: plaintext;
text-align: left; text-align: left;
} }
[data-slot="session-turn-diff-filename"] { [data-slot="session-turn-diff-filename"] {
flex-shrink: 0; flex-shrink: 0;
max-width: 100%;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-strong); color: var(--text-strong);
font-weight: var(--font-weight-medium); font-weight: var(--font-weight-medium);
} }
+5 -5
View File
@@ -241,26 +241,26 @@
[data-slot="tabs-trigger"] { [data-slot="tabs-trigger"] {
.tab-fileicon-color, .tab-fileicon-color,
.tab-fileicon-mono { .tab-fileicon-mono {
transition: opacity 120ms ease; pointer-events: none;
} }
.tab-fileicon-color { .tab-fileicon-color {
opacity: 0; display: none;
} }
.tab-fileicon-mono { .tab-fileicon-mono {
opacity: 1; display: block;
color: currentColor; color: currentColor;
} }
&[data-selected], &[data-selected],
&:hover { &:hover {
.tab-fileicon-color { .tab-fileicon-color {
opacity: 1; display: block;
} }
.tab-fileicon-mono { .tab-fileicon-mono {
opacity: 0; display: none;
} }
} }
} }
+2
View File
@@ -94,6 +94,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "جلب الويب", "ui.tool.webfetch": "جلب الويب",
"ui.tool.websearch": "بحث الويب",
"ui.tool.codesearch": "بحث الكود",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "تصحيح", "ui.tool.patch": "تصحيح",
"ui.tool.todos": "المهام", "ui.tool.todos": "المهام",
+2
View File
@@ -94,6 +94,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Buscar Web", "ui.tool.webfetch": "Buscar Web",
"ui.tool.websearch": "Pesquisa na Web",
"ui.tool.codesearch": "Pesquisa de Código",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Tarefas", "ui.tool.todos": "Tarefas",
+2
View File
@@ -98,6 +98,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Web preuzimanje", "ui.tool.webfetch": "Web preuzimanje",
"ui.tool.websearch": "Pretraga weba",
"ui.tool.codesearch": "Pretraga koda",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Lista zadataka", "ui.tool.todos": "Lista zadataka",
+2
View File
@@ -93,6 +93,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webhentning", "ui.tool.webfetch": "Webhentning",
"ui.tool.websearch": "Websøgning",
"ui.tool.codesearch": "Kodesøgning",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Opgaver", "ui.tool.todos": "Opgaver",
+2
View File
@@ -99,6 +99,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webabruf", "ui.tool.webfetch": "Webabruf",
"ui.tool.websearch": "Websuche",
"ui.tool.codesearch": "Codesuche",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Aufgaben", "ui.tool.todos": "Aufgaben",
+2
View File
@@ -95,6 +95,8 @@ export const dict: Record<string, string> = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch", "ui.tool.webfetch": "Webfetch",
"ui.tool.websearch": "Web Search",
"ui.tool.codesearch": "Code Search",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "To-dos", "ui.tool.todos": "To-dos",
+2
View File
@@ -94,6 +94,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch", "ui.tool.webfetch": "Webfetch",
"ui.tool.websearch": "Búsqueda web",
"ui.tool.codesearch": "Búsqueda de código",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Parche", "ui.tool.patch": "Parche",
"ui.tool.todos": "Tareas", "ui.tool.todos": "Tareas",
+2
View File
@@ -94,6 +94,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch", "ui.tool.webfetch": "Webfetch",
"ui.tool.websearch": "Recherche Web",
"ui.tool.codesearch": "Recherche de code",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Tâches", "ui.tool.todos": "Tâches",
+2
View File
@@ -93,6 +93,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch", "ui.tool.webfetch": "Webfetch",
"ui.tool.websearch": "Web検索",
"ui.tool.codesearch": "コード検索",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Todo", "ui.tool.todos": "Todo",
+2
View File
@@ -94,6 +94,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "웹 가져오기", "ui.tool.webfetch": "웹 가져오기",
"ui.tool.websearch": "웹 검색",
"ui.tool.codesearch": "코드 검색",
"ui.tool.shell": "셸", "ui.tool.shell": "셸",
"ui.tool.patch": "패치", "ui.tool.patch": "패치",
"ui.tool.todos": "할 일", "ui.tool.todos": "할 일",
+2
View File
@@ -97,6 +97,8 @@ export const dict: Record<Keys, string> = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webhenting", "ui.tool.webfetch": "Webhenting",
"ui.tool.websearch": "Nettsøk",
"ui.tool.codesearch": "Kodesøk",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Gjøremål", "ui.tool.todos": "Gjøremål",
+2
View File
@@ -93,6 +93,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Pobieranie sieciowe", "ui.tool.webfetch": "Pobieranie sieciowe",
"ui.tool.websearch": "Wyszukiwanie w sieci",
"ui.tool.codesearch": "Wyszukiwanie kodu",
"ui.tool.shell": "Terminal", "ui.tool.shell": "Terminal",
"ui.tool.patch": "Patch", "ui.tool.patch": "Patch",
"ui.tool.todos": "Zadania", "ui.tool.todos": "Zadania",
+2
View File
@@ -93,6 +93,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch", "ui.tool.webfetch": "Webfetch",
"ui.tool.websearch": "Веб-поиск",
"ui.tool.codesearch": "Поиск кода",
"ui.tool.shell": "Оболочка", "ui.tool.shell": "Оболочка",
"ui.tool.patch": "Патч", "ui.tool.patch": "Патч",
"ui.tool.todos": "Задачи", "ui.tool.todos": "Задачи",
+2
View File
@@ -95,6 +95,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "ดึงจากเว็บ", "ui.tool.webfetch": "ดึงจากเว็บ",
"ui.tool.websearch": "ค้นหาเว็บ",
"ui.tool.codesearch": "ค้นหาโค้ด",
"ui.tool.shell": "เชลล์", "ui.tool.shell": "เชลล์",
"ui.tool.patch": "แพตช์", "ui.tool.patch": "แพตช์",
"ui.tool.todos": "รายการงาน", "ui.tool.todos": "รายการงาน",
+2
View File
@@ -90,6 +90,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Web getir", "ui.tool.webfetch": "Web getir",
"ui.tool.websearch": "Web Araması",
"ui.tool.codesearch": "Kod Araması",
"ui.tool.shell": "Kabuk", "ui.tool.shell": "Kabuk",
"ui.tool.patch": "Yama", "ui.tool.patch": "Yama",
"ui.tool.todos": "Görevler", "ui.tool.todos": "Görevler",
+2
View File
@@ -98,6 +98,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch", "ui.tool.webfetch": "Webfetch",
"ui.tool.websearch": "网络搜索",
"ui.tool.codesearch": "代码搜索",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "补丁", "ui.tool.patch": "补丁",
"ui.tool.todos": "待办", "ui.tool.todos": "待办",
+2
View File
@@ -98,6 +98,8 @@ export const dict = {
"ui.tool.glob": "Glob", "ui.tool.glob": "Glob",
"ui.tool.grep": "Grep", "ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch", "ui.tool.webfetch": "Webfetch",
"ui.tool.websearch": "網頁搜尋",
"ui.tool.codesearch": "程式碼搜尋",
"ui.tool.shell": "Shell", "ui.tool.shell": "Shell",
"ui.tool.patch": "修補", "ui.tool.patch": "修補",
"ui.tool.todos": "待辦", "ui.tool.todos": "待辦",
+61 -7
View File
@@ -1,16 +1,25 @@
import type { HexColor, OklchColor } from "./types" import type { HexColor, OklchColor } from "./types"
function clamp(v: number, min: number, max: number) {
return Math.max(min, Math.min(max, v))
}
function hue(v: number) {
return ((v % 360) + 360) % 360
}
export function hexToRgb(hex: HexColor): { r: number; g: number; b: number } { export function hexToRgb(hex: HexColor): { r: number; g: number; b: number } {
const h = hex.replace("#", "") const h = hex.replace("#", "")
const full = const full =
h.length === 3 h.length === 3 || h.length === 4
? h ? h
.split("") .split("")
.map((c) => c + c) .map((c) => c + c)
.join("") .join("")
: h : h
const rgb = full.length === 8 ? full.slice(0, 6) : full
const num = parseInt(full, 16) const num = parseInt(rgb, 16)
return { return {
r: ((num >> 16) & 255) / 255, r: ((num >> 16) & 255) / 255,
g: ((num >> 8) & 255) / 255, g: ((num >> 8) & 255) / 255,
@@ -20,7 +29,7 @@ export function hexToRgb(hex: HexColor): { r: number; g: number; b: number } {
export function rgbToHex(r: number, g: number, b: number): HexColor { export function rgbToHex(r: number, g: number, b: number): HexColor {
const toHex = (v: number) => { const toHex = (v: number) => {
const clamped = Math.max(0, Math.min(1, v)) const clamped = clamp(v, 0, 1)
const int = Math.round(clamped * 255) const int = Math.round(clamped * 255)
return int.toString(16).padStart(2, "0") return int.toString(16).padStart(2, "0")
} }
@@ -91,8 +100,33 @@ export function hexToOklch(hex: HexColor): OklchColor {
return rgbToOklch(r, g, b) return rgbToOklch(r, g, b)
} }
export function fitOklch(oklch: OklchColor): OklchColor {
const base = {
l: clamp(oklch.l, 0, 1),
c: Math.max(0, oklch.c),
h: hue(oklch.h),
}
const rgb = oklchToRgb(base)
if (rgb.r >= 0 && rgb.r <= 1 && rgb.g >= 0 && rgb.g <= 1 && rgb.b >= 0 && rgb.b <= 1) {
return base
}
let c = base.c
for (let i = 0; i < 24; i++) {
c *= 0.9
const next = { ...base, c }
const out = oklchToRgb(next)
if (out.r >= 0 && out.r <= 1 && out.g >= 0 && out.g <= 1 && out.b >= 0 && out.b <= 1) {
return next
}
}
return { ...base, c: 0 }
}
export function oklchToHex(oklch: OklchColor): HexColor { export function oklchToHex(oklch: OklchColor): HexColor {
const { r, g, b } = oklchToRgb(oklch) const { r, g, b } = oklchToRgb(fitOklch(oklch))
return rgbToHex(r, g, b) return rgbToHex(r, g, b)
} }
@@ -164,19 +198,39 @@ export function generateAlphaScale(scale: HexColor[], isDark: boolean): HexColor
export function mixColors(color1: HexColor, color2: HexColor, amount: number): HexColor { export function mixColors(color1: HexColor, color2: HexColor, amount: number): HexColor {
const c1 = hexToOklch(color1) const c1 = hexToOklch(color1)
const c2 = hexToOklch(color2) const c2 = hexToOklch(color2)
const delta = ((((c2.h - c1.h) % 360) + 540) % 360) - 180
return oklchToHex({ return oklchToHex({
l: c1.l + (c2.l - c1.l) * amount, l: c1.l + (c2.l - c1.l) * amount,
c: c1.c + (c2.c - c1.c) * amount, c: c1.c + (c2.c - c1.c) * amount,
h: c1.h + (c2.h - c1.h) * amount, h: c1.h + delta * amount,
}) })
} }
export function shift(color: HexColor, value: { l?: number; c?: number; h?: number }): HexColor {
const base = hexToOklch(color)
return oklchToHex({
l: base.l + (value.l ?? 0),
c: base.c * (value.c ?? 1),
h: base.h + (value.h ?? 0),
})
}
export function blend(color: HexColor, background: HexColor, alpha: number): HexColor {
const fg = hexToRgb(color)
const bg = hexToRgb(background)
return rgbToHex(
fg.r * alpha + bg.r * (1 - alpha),
fg.g * alpha + bg.g * (1 - alpha),
fg.b * alpha + bg.b * (1 - alpha),
)
}
export function lighten(color: HexColor, amount: number): HexColor { export function lighten(color: HexColor, amount: number): HexColor {
const oklch = hexToOklch(color) const oklch = hexToOklch(color)
return oklchToHex({ return oklchToHex({
...oklch, ...oklch,
l: Math.min(1, oklch.l + amount), l: clamp(oklch.l + amount, 0, 1),
}) })
} }
@@ -184,7 +238,7 @@ export function darken(color: HexColor, amount: number): HexColor {
const oklch = hexToOklch(color) const oklch = hexToOklch(color)
return oklchToHex({ return oklchToHex({
...oklch, ...oklch,
l: Math.max(0, oklch.l - amount), l: clamp(oklch.l - amount, 0, 1),
}) })
} }
@@ -36,12 +36,13 @@
}, },
"ColorValue": { "ColorValue": {
"type": "string", "type": "string",
"pattern": "^(#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})|var\(--[a-z0-9-]+\))$", "pattern": "^(#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})|var\\(--[a-z0-9-]+\\))$",
"description": "Either a hex color value (#rgb/#rgba/#rrggbb/#rrggbbaa) or a CSS variable reference" "description": "Either a hex color value (#rgb/#rgba/#rrggbb/#rrggbbaa) or a CSS variable reference"
}, },
"ThemeSeedColors": { "ThemeSeedColors": {
"type": "object", "type": "object",
"description": "The minimum set of colors needed to generate a theme", "description": "The legacy semantic seed set used to generate a theme",
"additionalProperties": false,
"required": ["neutral", "primary", "success", "warning", "error", "info", "interactive", "diffAdd", "diffDelete"], "required": ["neutral", "primary", "success", "warning", "error", "info", "interactive", "diffAdd", "diffDelete"],
"properties": { "properties": {
"neutral": { "neutral": {
@@ -82,14 +83,70 @@
} }
} }
}, },
"ThemePaletteColors": {
"type": "object",
"description": "A compact semantic palette used to derive the full theme programmatically",
"additionalProperties": false,
"required": ["neutral", "primary", "success", "warning", "error", "info"],
"properties": {
"neutral": {
"$ref": "#/definitions/HexColor",
"description": "Base neutral color for generating the gray scale"
},
"ink": {
"$ref": "#/definitions/HexColor",
"description": "Optional foreground or chrome color used to derive text and border tones"
},
"primary": {
"$ref": "#/definitions/HexColor",
"description": "Primary brand color used for brand surfaces and strong emphasis"
},
"success": {
"$ref": "#/definitions/HexColor",
"description": "Success state color"
},
"warning": {
"$ref": "#/definitions/HexColor",
"description": "Warning state color"
},
"error": {
"$ref": "#/definitions/HexColor",
"description": "Error or critical state color"
},
"info": {
"$ref": "#/definitions/HexColor",
"description": "Informational state color"
},
"accent": {
"$ref": "#/definitions/HexColor",
"description": "Optional extra expressive accent for syntax and rich content"
},
"interactive": {
"$ref": "#/definitions/HexColor",
"description": "Optional dedicated interactive color; falls back to primary"
},
"diffAdd": {
"$ref": "#/definitions/HexColor",
"description": "Optional diff-add seed; falls back to a softened success color"
},
"diffDelete": {
"$ref": "#/definitions/HexColor",
"description": "Optional diff-delete seed; falls back to error"
}
}
},
"ThemeVariant": { "ThemeVariant": {
"type": "object", "type": "object",
"description": "A theme variant (light or dark) with seed colors and optional overrides", "description": "A theme variant (light or dark) with either a compact palette or legacy seeds and optional overrides",
"required": ["seeds"], "oneOf": [{ "required": ["seeds"] }, { "required": ["palette"] }],
"properties": { "properties": {
"seeds": { "seeds": {
"$ref": "#/definitions/ThemeSeedColors", "$ref": "#/definitions/ThemeSeedColors",
"description": "Seed colors used to generate the full palette" "description": "Legacy seed colors used to generate the full palette"
},
"palette": {
"$ref": "#/definitions/ThemePaletteColors",
"description": "Compact palette used to derive the full token set"
}, },
"overrides": { "overrides": {
"type": "object", "type": "object",
+4
View File
@@ -1,5 +1,6 @@
export type { export type {
DesktopTheme, DesktopTheme,
ThemePaletteColors,
ThemeSeedColors, ThemeSeedColors,
ThemeVariant, ThemeVariant,
HexColor, HexColor,
@@ -19,7 +20,10 @@ export {
generateScale, generateScale,
generateNeutralScale, generateNeutralScale,
generateAlphaScale, generateAlphaScale,
fitOklch,
blend,
mixColors, mixColors,
shift,
lighten, lighten,
darken, darken,
withAlpha, withAlpha,
+403 -79
View File
@@ -1,27 +1,117 @@
import type { ColorValue, DesktopTheme, HexColor, ResolvedTheme, ThemeVariant } from "./types" import type { ColorValue, DesktopTheme, HexColor, ResolvedTheme, ThemeVariant } from "./types"
import { generateNeutralScale, generateScale, hexToOklch, oklchToHex, withAlpha } from "./color" import { blend, generateNeutralScale, generateScale, hexToOklch, oklchToHex, shift, withAlpha } from "./color"
export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): ResolvedTheme { export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): ResolvedTheme {
const { seeds, overrides = {} } = variant const colors = getColors(variant)
const { overrides = {} } = variant
const neutral = generateNeutralScale(seeds.neutral, isDark) const neutral = generateNeutralScale(colors.neutral, isDark)
const primary = generateScale(seeds.primary, isDark) const primary = generateScale(colors.primary, isDark)
const success = generateScale(seeds.success, isDark) const accent = generateScale(colors.accent, isDark)
const warning = generateScale(seeds.warning, isDark) const success = generateScale(colors.success, isDark)
const error = generateScale(seeds.error, isDark) const warning = generateScale(colors.warning, isDark)
const info = generateScale(seeds.info, isDark) const error = generateScale(colors.error, isDark)
const interactive = generateScale(seeds.interactive, isDark) const info = generateScale(colors.info, isDark)
const diffAdd = generateScale(seeds.diffAdd, isDark) const interactive = generateScale(colors.interactive, isDark)
const diffDelete = generateScale(seeds.diffDelete, isDark) const hasInk = colors.compact && Boolean(colors.ink)
const noInk = colors.compact && !hasInk
const diffAdd = generateScale(
colors.diffAdd ??
(noInk
? shift(colors.success, { c: isDark ? 0.54 : 0.6, l: isDark ? 0.22 : 0.16 })
: shift(colors.success, { c: isDark ? 0.7 : 0.55, l: isDark ? -0.18 : 0.14 })),
isDark,
)
const diffDelete = generateScale(
colors.diffDelete ??
(noInk ? colors.error : shift(colors.error, { c: isDark ? 0.82 : 0.7, l: isDark ? -0.08 : 0.08 })),
isDark,
)
const ink = colors.ink ?? colors.neutral
const backgroundOverride = overrides["background-base"]
const backgroundHex = getHex(backgroundOverride)
const overlay = noInk || (Boolean(backgroundOverride) && !backgroundHex)
const content = (seed: HexColor, scale: HexColor[]) => {
if (isDark) return seed
return hexToOklch(seed).l > 0.82 ? scale[10] : seed
}
const modified = () => {
if (!colors.compact) return isDark ? "#ffba92" : "#FF8C00"
if (!hasInk) return isDark ? "#ffba92" : "#FF8C00"
const warningHue = hexToOklch(colors.warning).h
const deleteHue = hexToOklch(colors.diffDelete ?? colors.error).h
const delta = Math.abs(((((deleteHue - warningHue) % 360) + 540) % 360) - 180)
if (delta < 48) return isDark ? "#ffba92" : "#FF8C00"
return content(colors.warning, warning)
}
const surface = (
seed: HexColor,
alpha: { base: number; weak: number; weaker: number; strong: number; stronger: number },
) => {
const base = alphaTone(seed, alpha.base)
return {
base,
weak: alphaTone(seed, alpha.weak),
weaker: alphaTone(seed, alpha.weaker),
strong: alphaTone(seed, alpha.strong),
stronger: alphaTone(seed, alpha.stronger),
}
}
const compactBackground =
colors.compact && !hasInk
? isDark
? {
base: shift(blend(colors.neutral, "#000000", 0.145), { c: 0 }),
weak: shift(blend(colors.neutral, "#000000", 0.27), { c: 0 }),
strong: shift(blend(colors.neutral, "#000000", 0.165), { c: 0 }),
stronger: shift(blend(colors.neutral, "#000000", 0.19), { c: 0 }),
}
: {
base: blend(colors.neutral, "#ffffff", 0.066),
weak: blend(colors.neutral, "#ffffff", 0.12),
strong: blend(colors.neutral, "#ffffff", 0.022),
stronger: blend(colors.neutral, "#ffffff", 0.024),
}
: undefined
const compactInkBackground =
colors.compact && hasInk && isDark
? {
base: neutral[2],
weak: neutral[3],
strong: neutral[1],
stronger: neutral[2],
}
: undefined
const neutralAlpha = generateNeutralAlphaScale(neutral, isDark) const background = backgroundHex ?? compactInkBackground?.base ?? compactBackground?.base ?? neutral[0]
const alphaTone = (color: HexColor, alpha: number) =>
overlay ? (withAlpha(color, alpha) as ColorValue) : blend(color, background, alpha)
const borderTone = (light: number, dark: number) =>
alphaTone(ink, isDark ? Math.min(1, dark + (colors.compact && hasInk ? 0.08 : 0)) : light)
const diffHiddenSurface = noInk
? {
base: interactive[isDark ? 1 : 2],
weak: interactive[isDark ? 0 : 1],
weaker: interactive[isDark ? 2 : 0],
strong: interactive[4],
stronger: interactive[isDark ? 10 : 8],
}
: surface(
isDark ? shift(colors.interactive, { c: 0.55, l: 0 }) : shift(colors.interactive, { c: 0.45, l: 0.08 }),
isDark
? { base: 0.14, weak: 0.08, weaker: 0.18, strong: 0.26, stronger: 0.42 }
: { base: 0.12, weak: 0.08, weaker: 0.16, strong: 0.24, stronger: 0.36 },
)
const neutralAlpha = noInk ? generateNeutralOverlayScale(neutral, isDark) : generateNeutralAlphaScale(neutral, isDark)
const tokens: ResolvedTheme = {} const tokens: ResolvedTheme = {}
tokens["background-base"] = neutral[0] tokens["background-base"] = compactInkBackground?.base ?? compactBackground?.base ?? neutral[0]
tokens["background-weak"] = neutral[2] tokens["background-weak"] = compactInkBackground?.weak ?? compactBackground?.weak ?? neutral[2]
tokens["background-strong"] = neutral[0] tokens["background-strong"] = compactInkBackground?.strong ?? compactBackground?.strong ?? neutral[0]
tokens["background-stronger"] = isDark ? neutral[1] : "#fcfcfc" tokens["background-stronger"] =
compactInkBackground?.stronger ?? compactBackground?.stronger ?? (isDark ? neutral[1] : "#fcfcfc")
tokens["surface-base"] = neutralAlpha[1] tokens["surface-base"] = neutralAlpha[1]
tokens["base"] = neutralAlpha[1] tokens["base"] = neutralAlpha[1]
@@ -73,11 +163,11 @@ export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): Res
tokens["surface-diff-unchanged-base"] = isDark ? neutral[0] : "#ffffff00" tokens["surface-diff-unchanged-base"] = isDark ? neutral[0] : "#ffffff00"
tokens["surface-diff-skip-base"] = isDark ? neutralAlpha[0] : neutral[1] tokens["surface-diff-skip-base"] = isDark ? neutralAlpha[0] : neutral[1]
tokens["surface-diff-hidden-base"] = interactive[isDark ? 1 : 2] tokens["surface-diff-hidden-base"] = diffHiddenSurface.base
tokens["surface-diff-hidden-weak"] = interactive[isDark ? 0 : 1] tokens["surface-diff-hidden-weak"] = diffHiddenSurface.weak
tokens["surface-diff-hidden-weaker"] = interactive[isDark ? 2 : 0] tokens["surface-diff-hidden-weaker"] = diffHiddenSurface.weaker
tokens["surface-diff-hidden-strong"] = interactive[4] tokens["surface-diff-hidden-strong"] = diffHiddenSurface.strong
tokens["surface-diff-hidden-stronger"] = interactive[isDark ? 10 : 8] tokens["surface-diff-hidden-stronger"] = diffHiddenSurface.stronger
tokens["surface-diff-add-base"] = diffAdd[2] tokens["surface-diff-add-base"] = diffAdd[2]
tokens["surface-diff-add-weak"] = diffAdd[isDark ? 3 : 1] tokens["surface-diff-add-weak"] = diffAdd[isDark ? 3 : 1]
tokens["surface-diff-add-weaker"] = diffAdd[isDark ? 2 : 0] tokens["surface-diff-add-weaker"] = diffAdd[isDark ? 2 : 0]
@@ -96,10 +186,44 @@ export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): Res
tokens["input-focus"] = interactive[0] tokens["input-focus"] = interactive[0]
tokens["input-disabled"] = neutral[3] tokens["input-disabled"] = neutral[3]
tokens["text-base"] = neutral[10] tokens["text-base"] = hasInk
tokens["text-weak"] = neutral[8] ? ink
tokens["text-weaker"] = neutral[7] : noInk && isDark
tokens["text-strong"] = neutral[11] ? neutralAlpha[10]
: noInk
? isDark
? blend(neutral[10], neutral[9], 0.65)
: blend(neutral[10], neutral[9], 0.6)
: neutral[10]
tokens["text-weak"] = hasInk
? shift(ink, { l: isDark ? -0.14 : 0.12, c: 0.8 })
: noInk && isDark
? neutralAlpha[8]
: noInk
? isDark
? blend(neutral[8], neutral[7], 0.45)
: blend(neutral[8], neutral[7], 0.88)
: neutral[8]
tokens["text-weaker"] = hasInk
? shift(ink, { l: isDark ? -0.24 : 0.2, c: isDark ? 0.65 : 0.6 })
: noInk && isDark
? neutralAlpha[7]
: noInk
? isDark
? blend(neutral[7], neutral[6], 0.75)
: blend(neutral[7], neutral[6], 0.9)
: neutral[7]
tokens["text-strong"] = hasInk
? isDark && colors.compact
? blend("#ffffff", ink, 0.82)
: shift(ink, { l: isDark ? 0.03 : -0.06, c: 0.96 })
: noInk && isDark
? neutralAlpha[11]
: noInk
? isDark
? blend(neutral[11], neutral[10], 0.9)
: blend(neutral[11], neutral[10], 0.86)
: neutral[11]
tokens["text-invert-base"] = isDark ? neutral[10] : neutral[1] tokens["text-invert-base"] = isDark ? neutral[10] : neutral[1]
tokens["text-invert-weak"] = isDark ? neutral[8] : neutral[2] tokens["text-invert-weak"] = isDark ? neutral[8] : neutral[2]
tokens["text-invert-weaker"] = isDark ? neutral[7] : neutral[3] tokens["text-invert-weaker"] = isDark ? neutral[7] : neutral[3]
@@ -133,30 +257,59 @@ export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): Res
tokens["button-ghost-hover"] = neutralAlpha[1] tokens["button-ghost-hover"] = neutralAlpha[1]
tokens["button-ghost-hover2"] = neutralAlpha[2] tokens["button-ghost-hover2"] = neutralAlpha[2]
tokens["border-base"] = neutralAlpha[6] if (noInk) {
tokens["border-hover"] = neutralAlpha[7] const tone = (alpha: number) => alphaTone((isDark ? "#fdfbfb" : neutral[11]) as HexColor, alpha)
tokens["border-active"] = neutralAlpha[8] if (isDark) {
tokens["surface-base"] = tone(0.043)
tokens["surface-base-hover"] = tone(0.039)
tokens["surface-base-active"] = tone(0.086)
tokens["surface-raised-base"] = tone(0.086)
tokens["surface-raised-base-hover"] = tone(0.118)
tokens["surface-raised-base-active"] = tone(0.149)
tokens["button-secondary-hover"] = tone(0.039)
tokens["button-ghost-hover"] = tone(0.043)
tokens["button-ghost-hover2"] = tone(0.086)
tokens["input-base"] = tone(0.043)
tokens["input-hover"] = tone(0.043)
}
if (!isDark) {
tokens["surface-base"] = tone(0.027)
tokens["surface-base-hover"] = tone(0.059)
tokens["surface-base-active"] = tone(0.059)
tokens["surface-raised-base"] = tone(0.027)
tokens["surface-raised-base-hover"] = tone(0.059)
tokens["surface-raised-base-active"] = tone(0.122)
tokens["button-secondary-hover"] = blend("#ffffff", background, 0.04)
tokens["button-ghost-hover"] = tone(0.027)
tokens["button-ghost-hover2"] = tone(0.059)
}
}
tokens["border-base"] = hasInk ? borderTone(0.22, 0.16) : neutralAlpha[6]
tokens["border-hover"] = hasInk ? borderTone(0.28, 0.2) : neutralAlpha[7]
tokens["border-active"] = hasInk ? borderTone(0.34, 0.24) : neutralAlpha[8]
tokens["border-selected"] = withAlpha(interactive[8], isDark ? 0.9 : 0.99) as ColorValue tokens["border-selected"] = withAlpha(interactive[8], isDark ? 0.9 : 0.99) as ColorValue
tokens["border-disabled"] = neutralAlpha[7] tokens["border-disabled"] = hasInk ? borderTone(0.18, 0.12) : neutralAlpha[7]
tokens["border-focus"] = neutralAlpha[8] tokens["border-focus"] = hasInk ? borderTone(0.34, 0.24) : neutralAlpha[8]
tokens["border-weak-base"] = neutralAlpha[isDark ? 5 : 4] tokens["border-weak-base"] = hasInk ? borderTone(0.1, 0.08) : neutralAlpha[isDark ? 5 : 4]
tokens["border-strong-base"] = neutralAlpha[isDark ? 7 : 6] tokens["border-strong-base"] = hasInk ? borderTone(0.34, 0.24) : neutralAlpha[isDark ? 7 : 6]
tokens["border-strong-hover"] = neutralAlpha[7] tokens["border-strong-hover"] = hasInk ? borderTone(0.4, 0.28) : neutralAlpha[7]
tokens["border-strong-active"] = neutralAlpha[isDark ? 7 : 6] tokens["border-strong-active"] = hasInk ? borderTone(0.46, 0.32) : neutralAlpha[isDark ? 7 : 6]
tokens["border-strong-selected"] = withAlpha(interactive[5], 0.6) as ColorValue tokens["border-strong-selected"] = withAlpha(interactive[5], 0.6) as ColorValue
tokens["border-strong-disabled"] = neutralAlpha[5] tokens["border-strong-disabled"] = hasInk ? borderTone(0.14, 0.1) : neutralAlpha[5]
tokens["border-strong-focus"] = neutralAlpha[isDark ? 7 : 6] tokens["border-strong-focus"] = hasInk ? borderTone(0.46, 0.32) : neutralAlpha[isDark ? 7 : 6]
tokens["border-weak-hover"] = neutralAlpha[isDark ? 6 : 5] tokens["border-weak-hover"] = hasInk ? borderTone(0.16, 0.12) : neutralAlpha[isDark ? 6 : 5]
tokens["border-weak-active"] = neutralAlpha[isDark ? 7 : 6] tokens["border-weak-active"] = hasInk ? borderTone(0.22, 0.16) : neutralAlpha[isDark ? 7 : 6]
tokens["border-weak-selected"] = withAlpha(interactive[4], isDark ? 0.6 : 0.5) as ColorValue tokens["border-weak-selected"] = withAlpha(interactive[4], isDark ? 0.6 : 0.5) as ColorValue
tokens["border-weak-disabled"] = neutralAlpha[5] tokens["border-weak-disabled"] = hasInk ? borderTone(0.08, 0.06) : neutralAlpha[5]
tokens["border-weak-focus"] = neutralAlpha[isDark ? 7 : 6] tokens["border-weak-focus"] = hasInk ? borderTone(0.22, 0.16) : neutralAlpha[isDark ? 7 : 6]
tokens["border-weaker-base"] = neutralAlpha[2] tokens["border-weaker-base"] = hasInk ? borderTone(0.06, 0.04) : neutralAlpha[2]
tokens["border-weaker-hover"] = neutralAlpha[3] tokens["border-weaker-hover"] = hasInk ? borderTone(0.1, 0.08) : neutralAlpha[3]
tokens["border-weaker-active"] = neutralAlpha[5] tokens["border-weaker-active"] = hasInk ? borderTone(0.16, 0.12) : neutralAlpha[5]
tokens["border-weaker-selected"] = withAlpha(interactive[3], isDark ? 0.3 : 0.4) as ColorValue tokens["border-weaker-selected"] = withAlpha(interactive[3], isDark ? 0.3 : 0.4) as ColorValue
tokens["border-weaker-disabled"] = neutralAlpha[1] tokens["border-weaker-disabled"] = hasInk ? borderTone(0.04, 0.02) : neutralAlpha[1]
tokens["border-weaker-focus"] = neutralAlpha[5] tokens["border-weaker-focus"] = hasInk ? borderTone(0.16, 0.12) : neutralAlpha[5]
tokens["border-interactive-base"] = interactive[6] tokens["border-interactive-base"] = interactive[6]
tokens["border-interactive-hover"] = interactive[7] tokens["border-interactive-hover"] = interactive[7]
@@ -240,42 +393,120 @@ export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): Res
tokens["icon-diff-add-active"] = diffAdd[isDark ? 10 : 11] tokens["icon-diff-add-active"] = diffAdd[isDark ? 10 : 11]
tokens["icon-diff-delete-base"] = diffDelete[isDark ? 8 : 9] tokens["icon-diff-delete-base"] = diffDelete[isDark ? 8 : 9]
tokens["icon-diff-delete-hover"] = diffDelete[isDark ? 9 : 10] tokens["icon-diff-delete-hover"] = diffDelete[isDark ? 9 : 10]
tokens["icon-diff-modified-base"] = isDark ? "#ffba92" : "#FF8C00" tokens["icon-diff-modified-base"] = modified()
tokens["syntax-comment"] = "var(--text-weak)" if (colors.compact) {
tokens["syntax-regexp"] = "var(--text-base)" if (!hasInk) {
tokens["syntax-string"] = isDark ? "#00ceb9" : "#006656" tokens["syntax-comment"] = "var(--text-weak)"
tokens["syntax-keyword"] = "var(--text-weak)" tokens["syntax-regexp"] = "var(--text-base)"
tokens["syntax-primitive"] = isDark ? "#ffba92" : "#fb4804" tokens["syntax-string"] = isDark ? "#00ceb9" : "#006656"
tokens["syntax-operator"] = isDark ? "var(--text-weak)" : "var(--text-base)" tokens["syntax-keyword"] = "var(--text-weak)"
tokens["syntax-variable"] = "var(--text-strong)" tokens["syntax-primitive"] = isDark ? "#ffba92" : "#fb4804"
tokens["syntax-property"] = isDark ? "#ff9ae2" : "#ed6dc8" tokens["syntax-operator"] = isDark ? "var(--text-weak)" : "var(--text-base)"
tokens["syntax-type"] = isDark ? "#ecf58c" : "#596600" tokens["syntax-variable"] = "var(--text-strong)"
tokens["syntax-constant"] = isDark ? "#93e9f6" : "#007b80" tokens["syntax-property"] = isDark ? "#ff9ae2" : "#ed6dc8"
tokens["syntax-punctuation"] = isDark ? "var(--text-weak)" : "var(--text-base)" tokens["syntax-type"] = isDark ? "#ecf58c" : "#596600"
tokens["syntax-object"] = "var(--text-strong)" tokens["syntax-constant"] = isDark ? "#93e9f6" : "#007b80"
tokens["syntax-success"] = success[9] tokens["syntax-punctuation"] = isDark ? "var(--text-weak)" : "var(--text-base)"
tokens["syntax-warning"] = warning[9] tokens["syntax-object"] = "var(--text-strong)"
tokens["syntax-critical"] = error[isDark ? 9 : 9] tokens["syntax-success"] = success[9]
tokens["syntax-info"] = isDark ? "#93e9f6" : "#0092a8" tokens["syntax-warning"] = warning[9]
tokens["syntax-diff-add"] = diffAdd[10] tokens["syntax-critical"] = error[9]
tokens["syntax-diff-delete"] = diffDelete[10] tokens["syntax-info"] = isDark ? "#93e9f6" : "#0092a8"
tokens["syntax-diff-unknown"] = "#ff0000" tokens["syntax-diff-add"] = diffAdd[10]
tokens["syntax-diff-delete"] = diffDelete[10]
tokens["syntax-diff-unknown"] = "#ff0000"
tokens["markdown-heading"] = isDark ? "#9d7cd8" : "#d68c27" tokens["markdown-heading"] = isDark ? "#9d7cd8" : "#d68c27"
tokens["markdown-text"] = isDark ? "#eeeeee" : "#1a1a1a" tokens["markdown-text"] = isDark ? "#eeeeee" : "#1a1a1a"
tokens["markdown-link"] = isDark ? "#fab283" : "#3b7dd8" tokens["markdown-link"] = isDark ? "#fab283" : "#3b7dd8"
tokens["markdown-link-text"] = isDark ? "#56b6c2" : "#318795" tokens["markdown-link-text"] = isDark ? "#56b6c2" : "#318795"
tokens["markdown-code"] = isDark ? "#7fd88f" : "#3d9a57" tokens["markdown-code"] = isDark ? "#7fd88f" : "#3d9a57"
tokens["markdown-block-quote"] = isDark ? "#e5c07b" : "#b0851f" tokens["markdown-block-quote"] = isDark ? "#e5c07b" : "#b0851f"
tokens["markdown-emph"] = isDark ? "#e5c07b" : "#b0851f" tokens["markdown-emph"] = isDark ? "#e5c07b" : "#b0851f"
tokens["markdown-strong"] = isDark ? "#f5a742" : "#d68c27" tokens["markdown-strong"] = isDark ? "#f5a742" : "#d68c27"
tokens["markdown-horizontal-rule"] = isDark ? "#808080" : "#8a8a8a" tokens["markdown-horizontal-rule"] = isDark ? "#808080" : "#8a8a8a"
tokens["markdown-list-item"] = isDark ? "#fab283" : "#3b7dd8" tokens["markdown-list-item"] = isDark ? "#fab283" : "#3b7dd8"
tokens["markdown-list-enumeration"] = isDark ? "#56b6c2" : "#318795" tokens["markdown-list-enumeration"] = isDark ? "#56b6c2" : "#318795"
tokens["markdown-image"] = isDark ? "#fab283" : "#3b7dd8" tokens["markdown-image"] = isDark ? "#fab283" : "#3b7dd8"
tokens["markdown-image-text"] = isDark ? "#56b6c2" : "#318795" tokens["markdown-image-text"] = isDark ? "#56b6c2" : "#318795"
tokens["markdown-code-block"] = isDark ? "#eeeeee" : "#1a1a1a" tokens["markdown-code-block"] = isDark ? "#eeeeee" : "#1a1a1a"
}
if (hasInk) {
tokens["syntax-comment"] = "var(--text-weak)"
tokens["syntax-regexp"] = "var(--text-base)"
tokens["syntax-string"] = content(colors.success, success)
tokens["syntax-keyword"] = "var(--text-weak)"
tokens["syntax-primitive"] = content(colors.accent, accent)
tokens["syntax-operator"] = isDark ? "var(--text-weak)" : "var(--text-base)"
tokens["syntax-variable"] = "var(--text-strong)"
tokens["syntax-property"] = content(colors.primary, primary)
tokens["syntax-type"] = content(colors.warning, warning)
tokens["syntax-constant"] = content(colors.info, info)
tokens["syntax-punctuation"] = isDark ? "var(--text-weak)" : "var(--text-base)"
tokens["syntax-object"] = "var(--text-strong)"
tokens["syntax-success"] = success[9]
tokens["syntax-warning"] = warning[9]
tokens["syntax-critical"] = error[9]
tokens["syntax-info"] = content(colors.info, info)
tokens["syntax-diff-add"] = diffAdd[10]
tokens["syntax-diff-delete"] = diffDelete[10]
tokens["syntax-diff-unknown"] = "#ff0000"
tokens["markdown-heading"] = content(colors.primary, primary)
tokens["markdown-text"] = tokens["text-base"]
tokens["markdown-link"] = content(colors.interactive, interactive)
tokens["markdown-link-text"] = content(colors.info, info)
tokens["markdown-code"] = content(colors.success, success)
tokens["markdown-block-quote"] = content(colors.warning, warning)
tokens["markdown-emph"] = content(colors.warning, warning)
tokens["markdown-strong"] = content(colors.accent, accent)
tokens["markdown-horizontal-rule"] = tokens["border-base"]
tokens["markdown-list-item"] = content(colors.interactive, interactive)
tokens["markdown-list-enumeration"] = content(colors.info, info)
tokens["markdown-image"] = content(colors.interactive, interactive)
tokens["markdown-image-text"] = content(colors.info, info)
tokens["markdown-code-block"] = tokens["text-base"]
}
}
if (!colors.compact) {
tokens["syntax-comment"] = "var(--text-weak)"
tokens["syntax-regexp"] = "var(--text-base)"
tokens["syntax-string"] = isDark ? "#00ceb9" : "#006656"
tokens["syntax-keyword"] = "var(--text-weak)"
tokens["syntax-primitive"] = isDark ? "#ffba92" : "#fb4804"
tokens["syntax-operator"] = isDark ? "var(--text-weak)" : "var(--text-base)"
tokens["syntax-variable"] = "var(--text-strong)"
tokens["syntax-property"] = isDark ? "#ff9ae2" : "#ed6dc8"
tokens["syntax-type"] = isDark ? "#ecf58c" : "#596600"
tokens["syntax-constant"] = isDark ? "#93e9f6" : "#007b80"
tokens["syntax-punctuation"] = isDark ? "var(--text-weak)" : "var(--text-base)"
tokens["syntax-object"] = "var(--text-strong)"
tokens["syntax-success"] = success[9]
tokens["syntax-warning"] = warning[9]
tokens["syntax-critical"] = error[9]
tokens["syntax-info"] = isDark ? "#93e9f6" : "#0092a8"
tokens["syntax-diff-add"] = diffAdd[10]
tokens["syntax-diff-delete"] = diffDelete[10]
tokens["syntax-diff-unknown"] = "#ff0000"
tokens["markdown-heading"] = isDark ? "#9d7cd8" : "#d68c27"
tokens["markdown-text"] = isDark ? "#eeeeee" : "#1a1a1a"
tokens["markdown-link"] = isDark ? "#fab283" : "#3b7dd8"
tokens["markdown-link-text"] = isDark ? "#56b6c2" : "#318795"
tokens["markdown-code"] = isDark ? "#7fd88f" : "#3d9a57"
tokens["markdown-block-quote"] = isDark ? "#e5c07b" : "#b0851f"
tokens["markdown-emph"] = isDark ? "#e5c07b" : "#b0851f"
tokens["markdown-strong"] = isDark ? "#f5a742" : "#d68c27"
tokens["markdown-horizontal-rule"] = isDark ? "#808080" : "#8a8a8a"
tokens["markdown-list-item"] = isDark ? "#fab283" : "#3b7dd8"
tokens["markdown-list-enumeration"] = isDark ? "#56b6c2" : "#318795"
tokens["markdown-image"] = isDark ? "#fab283" : "#3b7dd8"
tokens["markdown-image-text"] = isDark ? "#56b6c2" : "#318795"
tokens["markdown-code-block"] = isDark ? "#eeeeee" : "#1a1a1a"
}
tokens["avatar-background-pink"] = isDark ? "#501b3f" : "#feeef8" tokens["avatar-background-pink"] = isDark ? "#501b3f" : "#feeef8"
tokens["avatar-background-mint"] = isDark ? "#033a34" : "#e1fbf4" tokens["avatar-background-mint"] = isDark ? "#033a34" : "#e1fbf4"
@@ -294,9 +525,97 @@ export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): Res
tokens[key] = value tokens[key] = value
} }
if (hasInk && "text-weak" in overrides && !("text-weaker" in overrides)) {
const weak = tokens["text-weak"]
if (weak.startsWith("#")) {
tokens["text-weaker"] = shift(weak as HexColor, { l: isDark ? -0.12 : 0.12, c: 0.75 })
} else {
tokens["text-weaker"] = weak
}
}
if (colors.compact && hasInk) {
if (!("markdown-text" in overrides)) {
tokens["markdown-text"] = tokens["text-base"]
}
if (!("markdown-code-block" in overrides)) {
tokens["markdown-code-block"] = tokens["text-base"]
}
}
if (!("text-stronger" in overrides)) {
tokens["text-stronger"] = tokens["text-strong"]
}
return tokens return tokens
} }
interface ThemeColors {
compact: boolean
neutral: HexColor
ink?: HexColor
primary: HexColor
accent: HexColor
success: HexColor
warning: HexColor
error: HexColor
info: HexColor
interactive: HexColor
diffAdd?: HexColor
diffDelete?: HexColor
}
function getColors(variant: ThemeVariant): ThemeColors {
const input = variant as { palette?: unknown; seeds?: unknown }
if (input.palette && input.seeds) {
throw new Error("Theme variant cannot define both `palette` and `seeds`")
}
if (variant.palette) {
return {
compact: true,
neutral: variant.palette.neutral,
ink: variant.palette.ink,
primary: variant.palette.primary,
accent: variant.palette.accent ?? variant.palette.info,
success: variant.palette.success,
warning: variant.palette.warning,
error: variant.palette.error,
info: variant.palette.info,
interactive: variant.palette.interactive ?? variant.palette.primary,
diffAdd: variant.palette.diffAdd,
diffDelete: variant.palette.diffDelete,
}
}
if (variant.seeds) {
return {
compact: false,
neutral: variant.seeds.neutral,
ink: undefined,
primary: variant.seeds.primary,
accent: variant.seeds.info,
success: variant.seeds.success,
warning: variant.seeds.warning,
error: variant.seeds.error,
info: variant.seeds.info,
interactive: variant.seeds.interactive,
diffAdd: variant.seeds.diffAdd,
diffDelete: variant.seeds.diffDelete,
}
}
throw new Error("Theme variant requires `palette` or `seeds`")
}
function generateNeutralOverlayScale(neutralScale: HexColor[], isDark: boolean): ColorValue[] {
const alphas = isDark
? [0.012, 0.043, 0.086, 0.118, 0.149, 0.192, 0.247, 0.349, 0.404, 0.463, 0.698, 0.941]
: [0.012, 0.027, 0.059, 0.09, 0.122, 0.149, 0.196, 0.267, 0.455, 0.612, 0.494, 0.875]
const color = (isDark ? "#fdfbfb" : "#000000") as HexColor
return alphas.map((alpha) => withAlpha(color, alpha) as ColorValue)
}
function generateNeutralAlphaScale(neutralScale: HexColor[], isDark: boolean): HexColor[] { function generateNeutralAlphaScale(neutralScale: HexColor[], isDark: boolean): HexColor[] {
const alphas = isDark const alphas = isDark
? [0.02, 0.04, 0.08, 0.12, 0.16, 0.2, 0.26, 0.36, 0.44, 0.52, 0.72, 0.94] ? [0.02, 0.04, 0.08, 0.12, 0.16, 0.2, 0.26, 0.36, 0.44, 0.52, 0.72, 0.94]
@@ -312,6 +631,11 @@ function generateNeutralAlphaScale(neutralScale: HexColor[], isDark: boolean): H
}) })
} }
function getHex(value: ColorValue | undefined): HexColor | undefined {
if (!value?.startsWith("#")) return
return value as HexColor
}
export function resolveTheme(theme: DesktopTheme): { light: ResolvedTheme; dark: ResolvedTheme } { export function resolveTheme(theme: DesktopTheme): { light: ResolvedTheme; dark: ResolvedTheme } {
return { return {
light: resolveThemeVariant(theme.light, false), light: resolveThemeVariant(theme.light, false),
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Aura", "name": "Aura",
"id": "aura", "id": "aura",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#f5f0ff", "neutral": "#f5f0ff",
"ink": "#2d2640",
"primary": "#a277ff", "primary": "#a277ff",
"accent": "#d94f4f",
"success": "#40bf7a", "success": "#40bf7a",
"warning": "#d9a24a", "warning": "#d9a24a",
"error": "#d94f4f", "error": "#d94f4f",
"info": "#5bb8d9", "info": "#5bb8d9",
"interactive": "#a277ff",
"diffAdd": "#b3e6cc", "diffAdd": "#b3e6cc",
"diffDelete": "#f5b3b3" "diffDelete": "#f5b3b3"
},
"overrides": {
"background-base": "#f5f0ff",
"background-weak": "#efe8fc",
"background-strong": "#faf7ff",
"background-stronger": "#fdfcff",
"border-weak-base": "#e0d6f2",
"border-weak-hover": "#d5c9eb",
"border-weak-active": "#cbbee3",
"border-weak-selected": "#c0b3dc",
"border-weak-disabled": "#f9f6ff",
"border-weak-focus": "#c5b8df",
"border-base": "#b5a6d4",
"border-hover": "#aa99cc",
"border-active": "#9f8dc4",
"border-selected": "#9480bc",
"border-disabled": "#ede7f9",
"border-focus": "#a593c8",
"border-strong-base": "#8068a8",
"border-strong-hover": "#735a9c",
"border-strong-active": "#664d90",
"border-strong-selected": "#5a4184",
"border-strong-disabled": "#d4c8ed",
"border-strong-focus": "#6d5396",
"surface-diff-add-base": "#e8f5ed",
"surface-diff-delete-base": "#fae8e8",
"surface-diff-hidden-base": "#e8e4f5",
"text-base": "#2d2640",
"text-weak": "#5c5270",
"text-strong": "#15101f",
"syntax-string": "#40bf7a",
"syntax-primitive": "#d94f4f",
"syntax-property": "#a277ff",
"syntax-type": "#d9a24a",
"syntax-constant": "#5bb8d9",
"syntax-info": "#5bb8d9",
"markdown-heading": "#a277ff",
"markdown-text": "#2d2640",
"markdown-link": "#c17ac8",
"markdown-link-text": "#a277ff",
"markdown-code": "#40bf7a",
"markdown-block-quote": "#6d6d6d",
"markdown-emph": "#d9a24a",
"markdown-strong": "#a277ff",
"markdown-horizontal-rule": "#d4c8ed",
"markdown-list-item": "#a277ff",
"markdown-list-enumeration": "#a277ff",
"markdown-image": "#c17ac8",
"markdown-image-text": "#a277ff",
"markdown-code-block": "#5bb8d9"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#15141b", "neutral": "#15141b",
"ink": "#edecee",
"primary": "#a277ff", "primary": "#a277ff",
"accent": "#ff6767",
"success": "#61ffca", "success": "#61ffca",
"warning": "#ffca85", "warning": "#ffca85",
"error": "#ff6767", "error": "#ff6767",
"info": "#82e2ff", "info": "#82e2ff",
"interactive": "#a277ff",
"diffAdd": "#61ffca", "diffAdd": "#61ffca",
"diffDelete": "#ff6767" "diffDelete": "#ff6767"
},
"overrides": {
"background-base": "#15141b",
"background-weak": "#1a1921",
"background-strong": "#121118",
"background-stronger": "#0f0e14",
"border-weak-base": "#2d2b38",
"border-weak-hover": "#332f42",
"border-weak-active": "#38354c",
"border-weak-selected": "#3e3a56",
"border-weak-disabled": "#1a1921",
"border-weak-focus": "#363350",
"border-base": "#433f5a",
"border-hover": "#4a4565",
"border-active": "#514c70",
"border-selected": "#58527b",
"border-disabled": "#1f1e28",
"border-focus": "#4e496c",
"border-strong-base": "#635c8a",
"border-strong-hover": "#6d6597",
"border-strong-active": "#776fa4",
"border-strong-selected": "#8179b1",
"border-strong-disabled": "#2a283a",
"border-strong-focus": "#716a9e",
"surface-diff-add-base": "#162620",
"surface-diff-delete-base": "#26161a",
"surface-diff-hidden-base": "#1e1d2a",
"text-base": "#edecee",
"text-weak": "#6d6d6d",
"text-strong": "#ffffff",
"syntax-string": "#61ffca",
"syntax-primitive": "#ff6767",
"syntax-property": "#a277ff",
"syntax-type": "#ffca85",
"syntax-constant": "#82e2ff",
"syntax-info": "#82e2ff",
"markdown-heading": "#a277ff",
"markdown-text": "#edecee",
"markdown-link": "#f694ff",
"markdown-link-text": "#a277ff",
"markdown-code": "#61ffca",
"markdown-block-quote": "#6d6d6d",
"markdown-emph": "#ffca85",
"markdown-strong": "#a277ff",
"markdown-horizontal-rule": "#2d2b38",
"markdown-list-item": "#a277ff",
"markdown-list-enumeration": "#a277ff",
"markdown-image": "#f694ff",
"markdown-image-text": "#a277ff",
"markdown-code-block": "#edecee"
} }
} }
} }
+6 -106
View File
@@ -3,131 +3,31 @@
"name": "Ayu", "name": "Ayu",
"id": "ayu", "id": "ayu",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#fdfaf4", "neutral": "#fdfaf4",
"ink": "#4f5964",
"primary": "#4aa8c8", "primary": "#4aa8c8",
"accent": "#ef7d71",
"success": "#5fb978", "success": "#5fb978",
"warning": "#ea9f41", "warning": "#ea9f41",
"error": "#e6656a", "error": "#e6656a",
"info": "#2f9bce", "info": "#2f9bce",
"interactive": "#4aa8c8",
"diffAdd": "#b1d780", "diffAdd": "#b1d780",
"diffDelete": "#e6656a" "diffDelete": "#e6656a"
},
"overrides": {
"background-base": "#fdfaf4",
"background-weak": "#fcf9f3",
"background-strong": "#fbf8f2",
"background-stronger": "#faf7f1",
"surface-raised-base-hover": "#f4f0e9",
"border-weak-base": "#e6ddcf",
"border-weak-hover": "#dcd3c5",
"border-weak-active": "#d1c9ba",
"border-weak-selected": "#c6bfaf",
"border-weak-disabled": "#f7f0e6",
"border-weak-focus": "#cbc4b6",
"border-base": "#bfb3a3",
"border-hover": "#b4a898",
"border-active": "#a99e8e",
"border-selected": "#9e9383",
"border-disabled": "#efe5d8",
"border-focus": "#b09f8f",
"border-strong-base": "#837765",
"border-strong-hover": "#7a6f5f",
"border-strong-active": "#716655",
"border-strong-selected": "#685e4e",
"border-strong-disabled": "#d8cabc",
"border-strong-focus": "#766b5c",
"surface-diff-add-base": "#eef5e4",
"surface-diff-delete-base": "#fde5e5",
"surface-diff-hidden-base": "#e3edf3",
"text-base": "#4f5964",
"text-weak": "#77818d",
"text-strong": "#1b232b",
"syntax-string": "#7fad00",
"syntax-primitive": "#ef7d71",
"syntax-property": "#4aa8c8",
"syntax-type": "#ed982e",
"syntax-constant": "#2f9bce",
"syntax-info": "#2f9bce",
"markdown-heading": "#4aa8c8",
"markdown-text": "#4f5964",
"markdown-link": "#4aa8c8",
"markdown-link-text": "#2f9bce",
"markdown-code": "#7fad00",
"markdown-block-quote": "#ed982e",
"markdown-emph": "#ed982e",
"markdown-strong": "#f07f72",
"markdown-horizontal-rule": "#d7cec0",
"markdown-list-item": "#4aa8c8",
"markdown-list-enumeration": "#2f9bce",
"markdown-image": "#4aa8c8",
"markdown-image-text": "#2f9bce",
"markdown-code-block": "#4aa8c8"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#0f1419", "neutral": "#0f1419",
"ink": "#d6dae0",
"primary": "#3fb7e3", "primary": "#3fb7e3",
"accent": "#f2856f",
"success": "#78d05c", "success": "#78d05c",
"warning": "#e4a75c", "warning": "#e4a75c",
"error": "#f58572", "error": "#f58572",
"info": "#66c6f1", "info": "#66c6f1",
"interactive": "#3fb7e3",
"diffAdd": "#59c57c", "diffAdd": "#59c57c",
"diffDelete": "#f58572" "diffDelete": "#f58572"
},
"overrides": {
"background-base": "#0f1419",
"background-weak": "#18222c",
"background-strong": "#0b1015",
"background-stronger": "#080c10",
"surface-raised-base-hover": "#0f1419",
"border-weak-base": "#2b3440",
"border-weak-hover": "#323c49",
"border-weak-active": "#394454",
"border-weak-selected": "#415063",
"border-weak-disabled": "#0a0e12",
"border-weak-focus": "#374453",
"border-base": "#475367",
"border-hover": "#515f75",
"border-active": "#5d6b83",
"border-selected": "#687795",
"border-disabled": "#11161d",
"border-focus": "#56647c",
"border-strong-base": "#73819b",
"border-strong-hover": "#7f8da8",
"border-strong-active": "#8b99b5",
"border-strong-selected": "#98a6c3",
"border-strong-disabled": "#1b222c",
"border-strong-focus": "#8391ad",
"surface-diff-add-base": "#132f27",
"surface-diff-delete-base": "#361d20",
"surface-diff-hidden-base": "#1b2632",
"text-base": "#d6dae0",
"text-weak": "#a3adba",
"text-strong": "#fbfbfd",
"syntax-string": "#b1c74a",
"syntax-primitive": "#f2856f",
"syntax-property": "#3fb7e3",
"syntax-type": "#e4a75c",
"syntax-constant": "#66c6f1",
"syntax-info": "#66c6f1",
"markdown-heading": "#3fb7e3",
"markdown-text": "#d6dae0",
"markdown-link": "#3fb7e3",
"markdown-link-text": "#66c6f1",
"markdown-code": "#b1c74a",
"markdown-block-quote": "#e4a75c",
"markdown-emph": "#e4a75c",
"markdown-strong": "#f2856f",
"markdown-horizontal-rule": "#2b3542",
"markdown-list-item": "#3fb7e3",
"markdown-list-enumeration": "#66c6f1",
"markdown-image": "#3fb7e3",
"markdown-image-text": "#66c6f1",
"markdown-code-block": "#d6dae0"
} }
} }
} }
+6 -93
View File
@@ -3,9 +3,11 @@
"name": "Carbonfox", "name": "Carbonfox",
"id": "carbonfox", "id": "carbonfox",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#8e8e8e", "neutral": "#8e8e8e",
"ink": "#161616",
"primary": "#0072c3", "primary": "#0072c3",
"accent": "#da1e28",
"success": "#198038", "success": "#198038",
"warning": "#f1c21b", "warning": "#f1c21b",
"error": "#da1e28", "error": "#da1e28",
@@ -13,46 +15,14 @@
"interactive": "#0f62fe", "interactive": "#0f62fe",
"diffAdd": "#198038", "diffAdd": "#198038",
"diffDelete": "#da1e28" "diffDelete": "#da1e28"
},
"overrides": {
"background-base": "#ffffff",
"background-weak": "#f4f4f4",
"background-strong": "#e8e8e8",
"background-stronger": "#dcdcdc",
"surface-raised-strong": "#ffffff",
"surface-raised-stronger": "#ffffff",
"surface-float-base": "#161616",
"surface-float-base-hover": "#262626",
"text-base": "#161616",
"text-weak": "#525252",
"text-strong": "#000000",
"syntax-string": "#198038",
"syntax-primitive": "#da1e28",
"syntax-property": "#0043ce",
"syntax-type": "#007d79",
"syntax-constant": "#6929c4",
"syntax-keyword": "#525252",
"syntax-info": "#0043ce",
"markdown-heading": "#0043ce",
"markdown-text": "#161616",
"markdown-link": "#0043ce",
"markdown-link-text": "#0072c3",
"markdown-code": "#198038",
"markdown-block-quote": "#525252",
"markdown-emph": "#6929c4",
"markdown-strong": "#161616",
"markdown-horizontal-rule": "#c6c6c6",
"markdown-list-item": "#0072c3",
"markdown-list-enumeration": "#0072c3",
"markdown-image": "#0043ce",
"markdown-image-text": "#0072c3",
"markdown-code-block": "#393939"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#393939", "neutral": "#393939",
"ink": "#f2f4f8",
"primary": "#33b1ff", "primary": "#33b1ff",
"accent": "#ff8389",
"success": "#42be65", "success": "#42be65",
"warning": "#f1c21b", "warning": "#f1c21b",
"error": "#ff8389", "error": "#ff8389",
@@ -60,63 +30,6 @@
"interactive": "#4589ff", "interactive": "#4589ff",
"diffAdd": "#42be65", "diffAdd": "#42be65",
"diffDelete": "#ff8389" "diffDelete": "#ff8389"
},
"overrides": {
"background-base": "#161616",
"background-weak": "#262626",
"background-strong": "#0d0d0d",
"background-stronger": "#000000",
"surface-raised-base": "#1c1c1c",
"surface-raised-base-hover": "#262626",
"surface-raised-strong": "#262626",
"surface-raised-strong-hover": "#303030",
"surface-raised-stronger": "#303030",
"surface-raised-stronger-hover": "#393939",
"surface-raised-stronger-non-alpha": "#303030",
"surface-float-base": "#0d0d0d",
"surface-float-base-hover": "#1a1a1a",
"surface-inset-base": "#0d0d0d",
"surface-inset-strong": "#000000",
"surface-base": "#1e1e1e",
"surface-base-hover": "#262626",
"surface-diff-add-base": "#0e3a22",
"surface-diff-delete-base": "#4d1a1f",
"input-base": "#262626",
"input-hover": "#303030",
"button-secondary-base": "#393939",
"button-secondary-hover": "#4c4c4c",
"border-weak-base": "#393939",
"border-weak-hover": "#4c4c4c",
"border-base": "#525252",
"border-hover": "#636363",
"border-strong-base": "#6f6f6f",
"text-base": "#f2f4f8",
"text-weak": "#8d8d8d",
"text-weaker": "#6f6f6f",
"text-strong": "#ffffff",
"icon-base": "#8d8d8d",
"icon-weak-base": "#6f6f6f",
"syntax-string": "#42be65",
"syntax-primitive": "#ff8389",
"syntax-property": "#78a9ff",
"syntax-type": "#08bdba",
"syntax-constant": "#be95ff",
"syntax-keyword": "#8d8d8d",
"syntax-info": "#78a9ff",
"markdown-heading": "#82cfff",
"markdown-text": "#f2f4f8",
"markdown-link": "#78a9ff",
"markdown-link-text": "#33b1ff",
"markdown-code": "#42be65",
"markdown-block-quote": "#8d8d8d",
"markdown-emph": "#be95ff",
"markdown-strong": "#ffffff",
"markdown-horizontal-rule": "#393939",
"markdown-list-item": "#33b1ff",
"markdown-list-enumeration": "#33b1ff",
"markdown-image": "#78a9ff",
"markdown-image-text": "#33b1ff",
"markdown-code-block": "#c6c6c6"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Catppuccin", "name": "Catppuccin",
"id": "catppuccin", "id": "catppuccin",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#f5e0dc", "neutral": "#f5e0dc",
"ink": "#4c4f69",
"primary": "#7287fd", "primary": "#7287fd",
"accent": "#d20f39",
"success": "#40a02b", "success": "#40a02b",
"warning": "#df8e1d", "warning": "#df8e1d",
"error": "#d20f39", "error": "#d20f39",
"info": "#04a5e5", "info": "#04a5e5",
"interactive": "#7287fd",
"diffAdd": "#a6d189", "diffAdd": "#a6d189",
"diffDelete": "#e78284" "diffDelete": "#e78284"
},
"overrides": {
"background-base": "#f5e0dc",
"background-weak": "#f2d8d4",
"background-strong": "#f9e8e4",
"background-stronger": "#fdeeee",
"border-weak-base": "#e0cfd3",
"border-weak-hover": "#d6c4c8",
"border-weak-active": "#cdb9be",
"border-weak-selected": "#c2aeb4",
"border-weak-disabled": "#fbeff2",
"border-weak-focus": "#c7b4ba",
"border-base": "#bca6b2",
"border-hover": "#b19ca8",
"border-active": "#a6929e",
"border-selected": "#9a8894",
"border-disabled": "#f3e4e7",
"border-focus": "#ab97a1",
"border-strong-base": "#83677f",
"border-strong-hover": "#775b73",
"border-strong-active": "#6b5068",
"border-strong-selected": "#5f465d",
"border-strong-disabled": "#d9c5cf",
"border-strong-focus": "#714f66",
"surface-diff-add-base": "#edf5e6",
"surface-diff-delete-base": "#fde1e3",
"surface-diff-hidden-base": "#e4e2f6",
"text-base": "#4c4f69",
"text-weak": "#6c6f85",
"text-strong": "#1f1f2a",
"syntax-string": "#40a02b",
"syntax-primitive": "#d20f39",
"syntax-property": "#7287fd",
"syntax-type": "#df8e1d",
"syntax-constant": "#04a5e5",
"syntax-info": "#04a5e5",
"markdown-heading": "#7287fd",
"markdown-text": "#4c4f69",
"markdown-link": "#7287fd",
"markdown-link-text": "#04a5e5",
"markdown-code": "#40a02b",
"markdown-block-quote": "#df8e1d",
"markdown-emph": "#df8e1d",
"markdown-strong": "#d20f39",
"markdown-horizontal-rule": "#d4c5cf",
"markdown-list-item": "#7287fd",
"markdown-list-enumeration": "#04a5e5",
"markdown-image": "#7287fd",
"markdown-image-text": "#04a5e5",
"markdown-code-block": "#7287fd"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#1e1e2e", "neutral": "#1e1e2e",
"ink": "#cdd6f4",
"primary": "#b4befe", "primary": "#b4befe",
"accent": "#f38ba8",
"success": "#a6d189", "success": "#a6d189",
"warning": "#f4b8e4", "warning": "#f4b8e4",
"error": "#f38ba8", "error": "#f38ba8",
"info": "#89dceb", "info": "#89dceb",
"interactive": "#b4befe",
"diffAdd": "#94e2d5", "diffAdd": "#94e2d5",
"diffDelete": "#f38ba8" "diffDelete": "#f38ba8"
},
"overrides": {
"background-base": "#1e1e2e",
"background-weak": "#211f31",
"background-strong": "#1c1c29",
"background-stronger": "#191926",
"border-weak-base": "#35324a",
"border-weak-hover": "#393655",
"border-weak-active": "#403c61",
"border-weak-selected": "#47436d",
"border-weak-disabled": "#141426",
"border-weak-focus": "#3d3a63",
"border-base": "#4a4763",
"border-hover": "#524f70",
"border-active": "#5a577d",
"border-selected": "#625f8a",
"border-disabled": "#1b1a2c",
"border-focus": "#575379",
"border-strong-base": "#6e6a8c",
"border-strong-hover": "#787497",
"border-strong-active": "#8380a2",
"border-strong-selected": "#8d8bad",
"border-strong-disabled": "#232237",
"border-strong-focus": "#7b779b",
"surface-diff-add-base": "#1d2c30",
"surface-diff-delete-base": "#2c1f2a",
"surface-diff-hidden-base": "#232538",
"text-base": "#cdd6f4",
"text-weak": "#a6adc8",
"text-strong": "#f4f2ff",
"syntax-string": "#a6e3a1",
"syntax-primitive": "#f38ba8",
"syntax-property": "#b4befe",
"syntax-type": "#f9e2af",
"syntax-constant": "#89dceb",
"syntax-info": "#89dceb",
"markdown-heading": "#b4befe",
"markdown-text": "#cdd6f4",
"markdown-link": "#b4befe",
"markdown-link-text": "#89dceb",
"markdown-code": "#a6e3a1",
"markdown-block-quote": "#f9e2af",
"markdown-emph": "#f9e2af",
"markdown-strong": "#f38ba8",
"markdown-horizontal-rule": "#2e2d45",
"markdown-list-item": "#b4befe",
"markdown-list-enumeration": "#89dceb",
"markdown-image": "#b4befe",
"markdown-image-text": "#89dceb",
"markdown-code-block": "#cdd6f4"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Dracula", "name": "Dracula",
"id": "dracula", "id": "dracula",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#f8f8f2", "neutral": "#f8f8f2",
"ink": "#1f1f2f",
"primary": "#7c6bf5", "primary": "#7c6bf5",
"accent": "#d16090",
"success": "#2fbf71", "success": "#2fbf71",
"warning": "#f7a14d", "warning": "#f7a14d",
"error": "#d9536f", "error": "#d9536f",
"info": "#1d7fc5", "info": "#1d7fc5",
"interactive": "#7c6bf5",
"diffAdd": "#9fe3b3", "diffAdd": "#9fe3b3",
"diffDelete": "#f8a1b8" "diffDelete": "#f8a1b8"
},
"overrides": {
"background-base": "#f8f8f2",
"background-weak": "#f1f2ed",
"background-strong": "#f6f6f1",
"background-stronger": "#f2f2ec",
"border-weak-base": "#e2e3da",
"border-weak-hover": "#d8d9d0",
"border-weak-active": "#cfd0c7",
"border-weak-selected": "#c4c6bc",
"border-weak-disabled": "#eceee3",
"border-weak-focus": "#c9cabf",
"border-base": "#c4c6ba",
"border-hover": "#b8baae",
"border-active": "#abada3",
"border-selected": "#979a90",
"border-disabled": "#e5e7dd",
"border-focus": "#b0b2a7",
"border-strong-base": "#9fa293",
"border-strong-hover": "#8e9185",
"border-strong-active": "#7e8176",
"border-strong-selected": "#6f7268",
"border-strong-disabled": "#c7c9be",
"border-strong-focus": "#878b7f",
"surface-diff-add-base": "#e4f5e6",
"surface-diff-delete-base": "#fae4eb",
"surface-diff-hidden-base": "#dedfe9",
"text-base": "#1f1f2f",
"text-weak": "#52526b",
"text-strong": "#05040c",
"syntax-string": "#2fbf71",
"syntax-primitive": "#d16090",
"syntax-property": "#7c6bf5",
"syntax-type": "#f7a14d",
"syntax-constant": "#1d7fc5",
"syntax-info": "#1d7fc5",
"markdown-heading": "#7c6bf5",
"markdown-text": "#1f1f2f",
"markdown-link": "#7c6bf5",
"markdown-link-text": "#1d7fc5",
"markdown-code": "#2fbf71",
"markdown-block-quote": "#f7a14d",
"markdown-emph": "#f7a14d",
"markdown-strong": "#d16090",
"markdown-horizontal-rule": "#c3c5d4",
"markdown-list-item": "#7c6bf5",
"markdown-list-enumeration": "#1d7fc5",
"markdown-image": "#7c6bf5",
"markdown-image-text": "#1d7fc5",
"markdown-code-block": "#1d7fc5"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#1d1e28", "neutral": "#1d1e28",
"ink": "#f8f8f2",
"primary": "#bd93f9", "primary": "#bd93f9",
"accent": "#ff79c6",
"success": "#50fa7b", "success": "#50fa7b",
"warning": "#ffb86c", "warning": "#ffb86c",
"error": "#ff5555", "error": "#ff5555",
"info": "#8be9fd", "info": "#8be9fd",
"interactive": "#bd93f9",
"diffAdd": "#2fb27d", "diffAdd": "#2fb27d",
"diffDelete": "#ff6b81" "diffDelete": "#ff6b81"
},
"overrides": {
"background-base": "#14151f",
"background-weak": "#181926",
"background-strong": "#161722",
"background-stronger": "#191a26",
"border-weak-base": "#2d2f3c",
"border-weak-hover": "#303244",
"border-weak-active": "#35364c",
"border-weak-selected": "#3b3d55",
"border-weak-disabled": "#1e1f2b",
"border-weak-focus": "#383a50",
"border-base": "#3f415a",
"border-hover": "#464967",
"border-active": "#4d5073",
"border-selected": "#55587f",
"border-disabled": "#272834",
"border-focus": "#4a4d6d",
"border-strong-base": "#606488",
"border-strong-hover": "#6a6e96",
"border-strong-active": "#7378a3",
"border-strong-selected": "#7d82b1",
"border-strong-disabled": "#343649",
"border-strong-focus": "#6f739c",
"surface-diff-add-base": "#1f2a2f",
"surface-diff-delete-base": "#2d1f27",
"surface-diff-hidden-base": "#24253a",
"text-base": "#f8f8f2",
"text-weak": "#b6b9e4",
"text-strong": "#ffffff",
"syntax-string": "#50fa7b",
"syntax-primitive": "#ff79c6",
"syntax-property": "#bd93f9",
"syntax-type": "#ffb86c",
"syntax-constant": "#8be9fd",
"syntax-info": "#8be9fd",
"markdown-heading": "#bd93f9",
"markdown-text": "#f8f8f2",
"markdown-link": "#bd93f9",
"markdown-link-text": "#8be9fd",
"markdown-code": "#50fa7b",
"markdown-block-quote": "#ffb86c",
"markdown-emph": "#ffb86c",
"markdown-strong": "#ff79c6",
"markdown-horizontal-rule": "#44475a",
"markdown-list-item": "#bd93f9",
"markdown-list-enumeration": "#8be9fd",
"markdown-image": "#bd93f9",
"markdown-image-text": "#8be9fd",
"markdown-code-block": "#f8f8f2"
} }
} }
} }
+6 -105
View File
@@ -3,130 +3,31 @@
"name": "Gruvbox", "name": "Gruvbox",
"id": "gruvbox", "id": "gruvbox",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#fbf1c7", "neutral": "#fbf1c7",
"ink": "#3c3836",
"primary": "#076678", "primary": "#076678",
"accent": "#9d0006",
"success": "#79740e", "success": "#79740e",
"warning": "#b57614", "warning": "#b57614",
"error": "#9d0006", "error": "#9d0006",
"info": "#8f3f71", "info": "#8f3f71",
"interactive": "#076678",
"diffAdd": "#79740e", "diffAdd": "#79740e",
"diffDelete": "#9d0006" "diffDelete": "#9d0006"
},
"overrides": {
"background-base": "#fbf1c7",
"background-weak": "#f2e5bc",
"background-strong": "#f9f5d7",
"background-stronger": "#fdf9e8",
"surface-raised-stronger-non-alpha": "#fbfaf5",
"border-weak-base": "#d5c4a1",
"border-weak-hover": "#c9b897",
"border-weak-active": "#bdae93",
"border-weak-selected": "#b0a285",
"border-weak-disabled": "#f0e4b8",
"border-weak-focus": "#c4b590",
"border-base": "#bdae93",
"border-hover": "#b0a285",
"border-active": "#a89984",
"border-selected": "#928374",
"border-disabled": "#e5d9ad",
"border-focus": "#a89984",
"border-strong-base": "#7c6f64",
"border-strong-hover": "#6e6259",
"border-strong-active": "#665c54",
"border-strong-selected": "#5a524b",
"border-strong-disabled": "#c9bda1",
"border-strong-focus": "#665c54",
"surface-diff-add-base": "#dde3b1",
"surface-diff-delete-base": "#e8c7c3",
"surface-diff-hidden-base": "#ebdfb5",
"text-base": "#3c3836",
"text-weak": "#7c6f64",
"text-strong": "#282828",
"syntax-string": "#79740e",
"syntax-primitive": "#9d0006",
"syntax-property": "#076678",
"syntax-type": "#b57614",
"syntax-constant": "#8f3f71",
"syntax-info": "#427b58",
"markdown-heading": "#076678",
"markdown-text": "#3c3836",
"markdown-link": "#076678",
"markdown-link-text": "#427b58",
"markdown-code": "#79740e",
"markdown-block-quote": "#928374",
"markdown-emph": "#8f3f71",
"markdown-strong": "#af3a03",
"markdown-horizontal-rule": "#d5c4a1",
"markdown-list-item": "#076678",
"markdown-list-enumeration": "#427b58",
"markdown-image": "#076678",
"markdown-image-text": "#427b58",
"markdown-code-block": "#3c3836"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#282828", "neutral": "#282828",
"ink": "#ebdbb2",
"primary": "#83a598", "primary": "#83a598",
"accent": "#fb4934",
"success": "#b8bb26", "success": "#b8bb26",
"warning": "#fabd2f", "warning": "#fabd2f",
"error": "#fb4934", "error": "#fb4934",
"info": "#d3869b", "info": "#d3869b",
"interactive": "#83a598",
"diffAdd": "#b8bb26", "diffAdd": "#b8bb26",
"diffDelete": "#fb4934" "diffDelete": "#fb4934"
},
"overrides": {
"background-base": "#282828",
"background-weak": "#32302f",
"background-strong": "#1d2021",
"background-stronger": "#141617",
"border-weak-base": "#504945",
"border-weak-hover": "#5a524b",
"border-weak-active": "#665c54",
"border-weak-selected": "#70665d",
"border-weak-disabled": "#1e1d1c",
"border-weak-focus": "#5e5650",
"border-base": "#665c54",
"border-hover": "#70665d",
"border-active": "#7c6f64",
"border-selected": "#928374",
"border-disabled": "#2a2827",
"border-focus": "#7c6f64",
"border-strong-base": "#928374",
"border-strong-hover": "#9d8e7f",
"border-strong-active": "#a89984",
"border-strong-selected": "#b3a48f",
"border-strong-disabled": "#3c3836",
"border-strong-focus": "#a89984",
"surface-diff-add-base": "#2a3325",
"surface-diff-delete-base": "#3c2222",
"surface-diff-hidden-base": "#32302f",
"text-base": "#ebdbb2",
"text-weak": "#a89984",
"text-strong": "#fbf1c7",
"syntax-string": "#b8bb26",
"syntax-primitive": "#fb4934",
"syntax-property": "#83a598",
"syntax-type": "#fabd2f",
"syntax-constant": "#d3869b",
"syntax-info": "#8ec07c",
"markdown-heading": "#83a598",
"markdown-text": "#ebdbb2",
"markdown-link": "#83a598",
"markdown-link-text": "#8ec07c",
"markdown-code": "#b8bb26",
"markdown-block-quote": "#928374",
"markdown-emph": "#d3869b",
"markdown-strong": "#fe8019",
"markdown-horizontal-rule": "#504945",
"markdown-list-item": "#83a598",
"markdown-list-enumeration": "#8ec07c",
"markdown-image": "#83a598",
"markdown-image-text": "#8ec07c",
"markdown-code-block": "#ebdbb2"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Monokai", "name": "Monokai",
"id": "monokai", "id": "monokai",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#fdf8ec", "neutral": "#fdf8ec",
"ink": "#292318",
"primary": "#bf7bff", "primary": "#bf7bff",
"accent": "#d9487c",
"success": "#4fb54b", "success": "#4fb54b",
"warning": "#f1a948", "warning": "#f1a948",
"error": "#e54b4b", "error": "#e54b4b",
"info": "#2d9ad7", "info": "#2d9ad7",
"interactive": "#bf7bff",
"diffAdd": "#bfe7a3", "diffAdd": "#bfe7a3",
"diffDelete": "#f6a3ae" "diffDelete": "#f6a3ae"
},
"overrides": {
"background-base": "#fdf8ec",
"background-weak": "#f8f2e6",
"background-strong": "#fbf5e8",
"background-stronger": "#f7efdd",
"border-weak-base": "#e9e0cf",
"border-weak-hover": "#dfd5c3",
"border-weak-active": "#d5cab7",
"border-weak-selected": "#cabfad",
"border-weak-disabled": "#f3ebdd",
"border-weak-focus": "#d0c2b1",
"border-base": "#c7b9a5",
"border-hover": "#bcae98",
"border-active": "#b0a28c",
"border-selected": "#a49781",
"border-disabled": "#efe5d6",
"border-focus": "#b6a893",
"border-strong-base": "#998b76",
"border-strong-hover": "#8a7c67",
"border-strong-active": "#7a6d58",
"border-strong-selected": "#6c604c",
"border-strong-disabled": "#d7cabc",
"border-strong-focus": "#82745f",
"surface-diff-add-base": "#e8f7e1",
"surface-diff-delete-base": "#fde5e4",
"surface-diff-hidden-base": "#e9e0d0",
"text-base": "#292318",
"text-weak": "#6d5c40",
"text-strong": "#1c150c",
"syntax-string": "#4fb54b",
"syntax-primitive": "#d9487c",
"syntax-property": "#bf7bff",
"syntax-type": "#f1a948",
"syntax-constant": "#2d9ad7",
"syntax-info": "#2d9ad7",
"markdown-heading": "#bf7bff",
"markdown-text": "#292318",
"markdown-link": "#bf7bff",
"markdown-link-text": "#2d9ad7",
"markdown-code": "#4fb54b",
"markdown-block-quote": "#f1a948",
"markdown-emph": "#f1a948",
"markdown-strong": "#d9487c",
"markdown-horizontal-rule": "#cdbdab",
"markdown-list-item": "#bf7bff",
"markdown-list-enumeration": "#2d9ad7",
"markdown-image": "#bf7bff",
"markdown-image-text": "#2d9ad7",
"markdown-code-block": "#2d9ad7"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#272822", "neutral": "#272822",
"ink": "#f8f8f2",
"primary": "#ae81ff", "primary": "#ae81ff",
"accent": "#f92672",
"success": "#a6e22e", "success": "#a6e22e",
"warning": "#fd971f", "warning": "#fd971f",
"error": "#f92672", "error": "#f92672",
"info": "#66d9ef", "info": "#66d9ef",
"interactive": "#ae81ff",
"diffAdd": "#4d7f2a", "diffAdd": "#4d7f2a",
"diffDelete": "#f4477c" "diffDelete": "#f4477c"
},
"overrides": {
"background-base": "#23241e",
"background-weak": "#27281f",
"background-strong": "#25261f",
"background-stronger": "#292a23",
"border-weak-base": "#343528",
"border-weak-hover": "#393a2d",
"border-weak-active": "#3f4033",
"border-weak-selected": "#454639",
"border-weak-disabled": "#1d1e16",
"border-weak-focus": "#414235",
"border-base": "#494a3a",
"border-hover": "#50523f",
"border-active": "#585a45",
"border-selected": "#60624b",
"border-disabled": "#23241b",
"border-focus": "#555741",
"border-strong-base": "#6a6c55",
"border-strong-hover": "#73755d",
"border-strong-active": "#7d7f66",
"border-strong-selected": "#878970",
"border-strong-disabled": "#2c2d23",
"border-strong-focus": "#7a7c63",
"surface-diff-add-base": "#1e2a1d",
"surface-diff-delete-base": "#301c24",
"surface-diff-hidden-base": "#2f2f24",
"text-base": "#f8f8f2",
"text-weak": "#c5c5c0",
"text-strong": "#ffffff",
"syntax-string": "#a6e22e",
"syntax-primitive": "#f92672",
"syntax-property": "#ae81ff",
"syntax-type": "#fd971f",
"syntax-constant": "#66d9ef",
"syntax-info": "#66d9ef",
"markdown-heading": "#ae81ff",
"markdown-text": "#f8f8f2",
"markdown-link": "#ae81ff",
"markdown-link-text": "#66d9ef",
"markdown-code": "#a6e22e",
"markdown-block-quote": "#fd971f",
"markdown-emph": "#fd971f",
"markdown-strong": "#f92672",
"markdown-horizontal-rule": "#3b3c34",
"markdown-list-item": "#ae81ff",
"markdown-list-enumeration": "#66d9ef",
"markdown-image": "#ae81ff",
"markdown-image-text": "#66d9ef",
"markdown-code-block": "#f8f8f2"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Night Owl", "name": "Night Owl",
"id": "nightowl", "id": "nightowl",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#f0f0f0", "neutral": "#f0f0f0",
"ink": "#403f53",
"primary": "#4876d6", "primary": "#4876d6",
"accent": "#aa0982",
"success": "#2aa298", "success": "#2aa298",
"warning": "#c96765", "warning": "#c96765",
"error": "#de3d3b", "error": "#de3d3b",
"info": "#4876d6", "info": "#4876d6",
"interactive": "#4876d6",
"diffAdd": "#2aa298", "diffAdd": "#2aa298",
"diffDelete": "#de3d3b" "diffDelete": "#de3d3b"
},
"overrides": {
"background-base": "#fbfbfb",
"background-weak": "#f0f0f0",
"background-strong": "#ffffff",
"background-stronger": "#ffffff",
"border-weak-base": "#d9d9d9",
"border-weak-hover": "#cccccc",
"border-weak-active": "#bfbfbf",
"border-weak-selected": "#4876d6",
"border-weak-disabled": "#e6e6e6",
"border-weak-focus": "#4876d6",
"border-base": "#c0c0c0",
"border-hover": "#b3b3b3",
"border-active": "#a6a6a6",
"border-selected": "#4876d6",
"border-disabled": "#d9d9d9",
"border-focus": "#4876d6",
"border-strong-base": "#90a7b2",
"border-strong-hover": "#7d9aa6",
"border-strong-active": "#6a8d9a",
"border-strong-selected": "#4876d6",
"border-strong-disabled": "#c0c0c0",
"border-strong-focus": "#4876d6",
"surface-diff-add-base": "#eaf8f6",
"surface-diff-delete-base": "#fbe9e9",
"surface-diff-hidden-base": "#e8f0fc",
"text-base": "#403f53",
"text-weak": "#7a8181",
"text-strong": "#1a1a1a",
"syntax-string": "#c96765",
"syntax-primitive": "#aa0982",
"syntax-property": "#4876d6",
"syntax-type": "#994cc3",
"syntax-constant": "#2aa298",
"syntax-info": "#4876d6",
"markdown-heading": "#4876d6",
"markdown-text": "#403f53",
"markdown-link": "#4876d6",
"markdown-link-text": "#2aa298",
"markdown-code": "#2aa298",
"markdown-block-quote": "#7a8181",
"markdown-emph": "#994cc3",
"markdown-strong": "#c96765",
"markdown-horizontal-rule": "#90a7b2",
"markdown-list-item": "#4876d6",
"markdown-list-enumeration": "#2aa298",
"markdown-image": "#4876d6",
"markdown-image-text": "#2aa298",
"markdown-code-block": "#403f53"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#011627", "neutral": "#011627",
"ink": "#d6deeb",
"primary": "#82aaff", "primary": "#82aaff",
"accent": "#f78c6c",
"success": "#c5e478", "success": "#c5e478",
"warning": "#ecc48d", "warning": "#ecc48d",
"error": "#ef5350", "error": "#ef5350",
"info": "#82aaff", "info": "#82aaff",
"interactive": "#82aaff",
"diffAdd": "#c5e478", "diffAdd": "#c5e478",
"diffDelete": "#ef5350" "diffDelete": "#ef5350"
},
"overrides": {
"background-base": "#011627",
"background-weak": "#0b253a",
"background-strong": "#001122",
"background-stronger": "#000c17",
"border-weak-base": "#1d3b53",
"border-weak-hover": "#234561",
"border-weak-active": "#2a506f",
"border-weak-selected": "#82aaff",
"border-weak-disabled": "#0f2132",
"border-weak-focus": "#82aaff",
"border-base": "#3a5a75",
"border-hover": "#456785",
"border-active": "#507494",
"border-selected": "#82aaff",
"border-disabled": "#1a3347",
"border-focus": "#82aaff",
"border-strong-base": "#5f7e97",
"border-strong-hover": "#6e8da6",
"border-strong-active": "#7d9cb5",
"border-strong-selected": "#82aaff",
"border-strong-disabled": "#2c4a63",
"border-strong-focus": "#82aaff",
"surface-diff-add-base": "#0a2e1a",
"surface-diff-delete-base": "#2d1b1b",
"surface-diff-hidden-base": "#0b253a",
"text-base": "#d6deeb",
"text-weak": "#5f7e97",
"text-strong": "#ffffff",
"syntax-string": "#ecc48d",
"syntax-primitive": "#f78c6c",
"syntax-property": "#82aaff",
"syntax-type": "#c5e478",
"syntax-constant": "#7fdbca",
"syntax-info": "#82aaff",
"markdown-heading": "#82aaff",
"markdown-text": "#d6deeb",
"markdown-link": "#82aaff",
"markdown-link-text": "#7fdbca",
"markdown-code": "#c5e478",
"markdown-block-quote": "#5f7e97",
"markdown-emph": "#c792ea",
"markdown-strong": "#ecc48d",
"markdown-horizontal-rule": "#5f7e97",
"markdown-list-item": "#82aaff",
"markdown-list-enumeration": "#7fdbca",
"markdown-image": "#82aaff",
"markdown-image-text": "#7fdbca",
"markdown-code-block": "#d6deeb"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Nord", "name": "Nord",
"id": "nord", "id": "nord",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#eceff4", "neutral": "#eceff4",
"ink": "#2e3440",
"primary": "#5e81ac", "primary": "#5e81ac",
"accent": "#bf616a",
"success": "#8fbcbb", "success": "#8fbcbb",
"warning": "#d08770", "warning": "#d08770",
"error": "#bf616a", "error": "#bf616a",
"info": "#81a1c1", "info": "#81a1c1",
"interactive": "#5e81ac",
"diffAdd": "#a3be8c", "diffAdd": "#a3be8c",
"diffDelete": "#bf616a" "diffDelete": "#bf616a"
},
"overrides": {
"background-base": "#eceff4",
"background-weak": "#e4e8f0",
"background-strong": "#f1f3f8",
"background-stronger": "#f6f8fc",
"border-weak-base": "#d5dbe7",
"border-weak-hover": "#c9d0de",
"border-weak-active": "#bec5d4",
"border-weak-selected": "#b2bacc",
"border-weak-disabled": "#f0f3fa",
"border-weak-focus": "#b9bfd0",
"border-base": "#afb7cb",
"border-hover": "#a3abc1",
"border-active": "#979fb7",
"border-selected": "#8b94ad",
"border-disabled": "#e5e9f2",
"border-focus": "#9ca4ba",
"border-strong-base": "#757f97",
"border-strong-hover": "#69718a",
"border-strong-active": "#5d647d",
"border-strong-selected": "#525970",
"border-strong-disabled": "#c9cedc",
"border-strong-focus": "#636c84",
"surface-diff-add-base": "#e4f0e4",
"surface-diff-delete-base": "#f4e1e4",
"surface-diff-hidden-base": "#dfe6f2",
"text-base": "#2e3440",
"text-weak": "#4c566a",
"text-strong": "#1f2530",
"syntax-string": "#a3be8c",
"syntax-primitive": "#bf616a",
"syntax-property": "#5e81ac",
"syntax-type": "#d08770",
"syntax-constant": "#81a1c1",
"syntax-info": "#81a1c1",
"markdown-heading": "#5e81ac",
"markdown-text": "#2e3440",
"markdown-link": "#5e81ac",
"markdown-link-text": "#81a1c1",
"markdown-code": "#a3be8c",
"markdown-block-quote": "#d08770",
"markdown-emph": "#d08770",
"markdown-strong": "#bf616a",
"markdown-horizontal-rule": "#cbd3e1",
"markdown-list-item": "#5e81ac",
"markdown-list-enumeration": "#81a1c1",
"markdown-image": "#5e81ac",
"markdown-image-text": "#81a1c1",
"markdown-code-block": "#5e81ac"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#2e3440", "neutral": "#2e3440",
"ink": "#e5e9f0",
"primary": "#88c0d0", "primary": "#88c0d0",
"accent": "#d57780",
"success": "#a3be8c", "success": "#a3be8c",
"warning": "#d08770", "warning": "#d08770",
"error": "#bf616a", "error": "#bf616a",
"info": "#81a1c1", "info": "#81a1c1",
"interactive": "#88c0d0",
"diffAdd": "#81a1c1", "diffAdd": "#81a1c1",
"diffDelete": "#bf616a" "diffDelete": "#bf616a"
},
"overrides": {
"background-base": "#1f2430",
"background-weak": "#222938",
"background-strong": "#1c202a",
"background-stronger": "#181c24",
"border-weak-base": "#343a47",
"border-weak-hover": "#383f50",
"border-weak-active": "#3d4458",
"border-weak-selected": "#434a62",
"border-weak-disabled": "#151923",
"border-weak-focus": "#3f4359",
"border-base": "#4a5163",
"border-hover": "#515870",
"border-active": "#585f7c",
"border-selected": "#606889",
"border-disabled": "#1b202a",
"border-focus": "#545b78",
"border-strong-base": "#6a7492",
"border-strong-hover": "#747e9f",
"border-strong-active": "#7e88ac",
"border-strong-selected": "#8993b9",
"border-strong-disabled": "#232836",
"border-strong-focus": "#76819f",
"surface-diff-add-base": "#1f2e33",
"surface-diff-delete-base": "#2e212a",
"surface-diff-hidden-base": "#222b3a",
"text-base": "#e5e9f0",
"text-weak": "#a4adbf",
"text-strong": "#f8fafc",
"syntax-string": "#a3be8c",
"syntax-primitive": "#d57780",
"syntax-property": "#88c0d0",
"syntax-type": "#eac196",
"syntax-constant": "#81a1c1",
"syntax-info": "#81a1c1",
"markdown-heading": "#88c0d0",
"markdown-text": "#e5e9f0",
"markdown-link": "#88c0d0",
"markdown-link-text": "#81a1c1",
"markdown-code": "#a3be8c",
"markdown-block-quote": "#d08770",
"markdown-emph": "#d08770",
"markdown-strong": "#bf616a",
"markdown-horizontal-rule": "#2f384a",
"markdown-list-item": "#88c0d0",
"markdown-list-enumeration": "#81a1c1",
"markdown-image": "#88c0d0",
"markdown-image-text": "#81a1c1",
"markdown-code-block": "#cbd3e1"
} }
} }
} }
+6 -508
View File
@@ -3,9 +3,11 @@
"name": "OC-1", "name": "OC-1",
"id": "oc-1", "id": "oc-1",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#8e8b8b", "neutral": "#8e8b8b",
"ink": "#656363",
"primary": "#dcde8d", "primary": "#dcde8d",
"accent": "#fb4804",
"success": "#12c905", "success": "#12c905",
"warning": "#ffdc17", "warning": "#ffdc17",
"error": "#fc533a", "error": "#fc533a",
@@ -13,265 +15,14 @@
"interactive": "#034cff", "interactive": "#034cff",
"diffAdd": "#9ff29a", "diffAdd": "#9ff29a",
"diffDelete": "#fc533a" "diffDelete": "#fc533a"
},
"overrides": {
"background-base": "#f8f7f7",
"background-weak": "var(--smoke-light-3)",
"background-strong": "var(--smoke-light-1)",
"background-stronger": "#fcfcfc",
"surface-base": "var(--smoke-light-alpha-2)",
"base": "var(--smoke-light-alpha-2)",
"surface-base-hover": "#0500000f",
"surface-base-active": "var(--smoke-light-alpha-3)",
"surface-base-interactive-active": "var(--cobalt-light-alpha-3)",
"base2": "var(--smoke-light-alpha-2)",
"base3": "var(--smoke-light-alpha-2)",
"surface-inset-base": "var(--smoke-light-alpha-2)",
"surface-inset-base-hover": "var(--smoke-light-alpha-3)",
"surface-inset-strong": "#1f000017",
"surface-inset-strong-hover": "#1f000017",
"surface-raised-base": "var(--smoke-light-alpha-2)",
"surface-float-base": "var(--smoke-dark-1)",
"surface-float-base-hover": "var(--smoke-dark-2)",
"surface-raised-base-hover": "var(--smoke-light-alpha-3)",
"surface-raised-base-active": "var(--smoke-light-alpha-4)",
"surface-raised-strong": "var(--smoke-light-1)",
"surface-raised-strong-hover": "var(--white)",
"surface-raised-stronger": "var(--white)",
"surface-raised-stronger-hover": "var(--white)",
"surface-weak": "var(--smoke-light-alpha-3)",
"surface-weaker": "var(--smoke-light-alpha-4)",
"surface-strong": "#ffffff",
"surface-raised-stronger-non-alpha": "var(--white)",
"surface-brand-base": "var(--yuzu-light-9)",
"surface-brand-hover": "var(--yuzu-light-10)",
"surface-interactive-base": "var(--cobalt-light-3)",
"surface-interactive-hover": "#E5F0FF",
"surface-interactive-weak": "var(--cobalt-light-2)",
"surface-interactive-weak-hover": "var(--cobalt-light-3)",
"surface-success-base": "var(--apple-light-3)",
"surface-success-weak": "var(--apple-light-2)",
"surface-success-strong": "var(--apple-light-9)",
"surface-warning-base": "var(--solaris-light-3)",
"surface-warning-weak": "var(--solaris-light-2)",
"surface-warning-strong": "var(--solaris-light-9)",
"surface-critical-base": "var(--ember-light-3)",
"surface-critical-weak": "var(--ember-light-2)",
"surface-critical-strong": "var(--ember-light-9)",
"surface-info-base": "var(--lilac-light-3)",
"surface-info-weak": "var(--lilac-light-2)",
"surface-info-strong": "var(--lilac-light-9)",
"surface-diff-unchanged-base": "#ffffff00",
"surface-diff-skip-base": "var(--smoke-light-2)",
"surface-diff-hidden-base": "var(--blue-light-3)",
"surface-diff-hidden-weak": "var(--blue-light-2)",
"surface-diff-hidden-weaker": "var(--blue-light-1)",
"surface-diff-hidden-strong": "var(--blue-light-5)",
"surface-diff-hidden-stronger": "var(--blue-light-9)",
"surface-diff-add-base": "#dafbe0",
"surface-diff-add-weak": "var(--mint-light-2)",
"surface-diff-add-weaker": "var(--mint-light-1)",
"surface-diff-add-strong": "var(--mint-light-5)",
"surface-diff-add-stronger": "var(--mint-light-9)",
"surface-diff-delete-base": "var(--ember-light-3)",
"surface-diff-delete-weak": "var(--ember-light-2)",
"surface-diff-delete-weaker": "var(--ember-light-1)",
"surface-diff-delete-strong": "var(--ember-light-6)",
"surface-diff-delete-stronger": "var(--ember-light-9)",
"input-base": "var(--smoke-light-1)",
"input-hover": "var(--smoke-light-2)",
"input-active": "var(--cobalt-light-1)",
"input-selected": "var(--cobalt-light-4)",
"input-focus": "var(--cobalt-light-1)",
"input-disabled": "var(--smoke-light-4)",
"text-base": "var(--smoke-light-11)",
"text-weak": "var(--smoke-light-9)",
"text-weaker": "var(--smoke-light-8)",
"text-strong": "var(--smoke-light-12)",
"text-invert-base": "var(--smoke-dark-alpha-11)",
"text-invert-weak": "var(--smoke-dark-alpha-9)",
"text-invert-weaker": "var(--smoke-dark-alpha-8)",
"text-invert-strong": "var(--smoke-dark-alpha-12)",
"text-interactive-base": "var(--cobalt-light-9)",
"text-on-brand-base": "var(--smoke-light-alpha-11)",
"text-on-interactive-base": "var(--smoke-light-1)",
"text-on-interactive-weak": "var(--smoke-dark-alpha-11)",
"text-on-success-base": "var(--apple-light-10)",
"text-on-critical-base": "var(--ember-light-10)",
"text-on-critical-weak": "var(--ember-light-8)",
"text-on-critical-strong": "var(--ember-light-12)",
"text-on-warning-base": "var(--smoke-dark-alpha-11)",
"text-on-info-base": "var(--smoke-dark-alpha-11)",
"text-diff-add-base": "var(--mint-light-11)",
"text-diff-delete-base": "var(--ember-light-10)",
"text-diff-delete-strong": "var(--ember-light-12)",
"text-diff-add-strong": "var(--mint-light-12)",
"text-on-info-weak": "var(--smoke-dark-alpha-9)",
"text-on-info-strong": "var(--smoke-dark-alpha-12)",
"text-on-warning-weak": "var(--smoke-dark-alpha-9)",
"text-on-warning-strong": "var(--smoke-dark-alpha-12)",
"text-on-success-weak": "var(--apple-light-6)",
"text-on-success-strong": "var(--apple-light-12)",
"text-on-brand-weak": "var(--smoke-light-alpha-9)",
"text-on-brand-weaker": "var(--smoke-light-alpha-8)",
"text-on-brand-strong": "var(--smoke-light-alpha-12)",
"button-primary-base": "var(--smoke-light-12)",
"button-secondary-base": "#fdfcfc",
"button-secondary-hover": "#faf9f9",
"border-base": "var(--smoke-light-alpha-7)",
"border-hover": "var(--smoke-light-alpha-8)",
"border-active": "var(--smoke-light-alpha-9)",
"border-selected": "var(--cobalt-light-alpha-9)",
"border-disabled": "var(--smoke-light-alpha-8)",
"border-focus": "var(--smoke-light-alpha-9)",
"border-weak-base": "var(--smoke-light-alpha-5)",
"border-strong-base": "var(--smoke-light-alpha-7)",
"border-strong-hover": "var(--smoke-light-alpha-8)",
"border-strong-active": "var(--smoke-light-alpha-7)",
"border-strong-selected": "var(--cobalt-light-alpha-6)",
"border-strong-disabled": "var(--smoke-light-alpha-6)",
"border-strong-focus": "var(--smoke-light-alpha-7)",
"border-weak-hover": "var(--smoke-light-alpha-6)",
"border-weak-active": "var(--smoke-light-alpha-7)",
"border-weak-selected": "var(--cobalt-light-alpha-5)",
"border-weak-disabled": "var(--smoke-light-alpha-6)",
"border-weak-focus": "var(--smoke-light-alpha-7)",
"border-interactive-base": "var(--cobalt-light-7)",
"border-interactive-hover": "var(--cobalt-light-8)",
"border-interactive-active": "var(--cobalt-light-9)",
"border-interactive-selected": "var(--cobalt-light-9)",
"border-interactive-disabled": "var(--smoke-light-8)",
"border-interactive-focus": "var(--cobalt-light-9)",
"border-success-base": "var(--apple-light-6)",
"border-success-hover": "var(--apple-light-7)",
"border-success-selected": "var(--apple-light-9)",
"border-warning-base": "var(--solaris-light-6)",
"border-warning-hover": "var(--solaris-light-7)",
"border-warning-selected": "var(--solaris-light-9)",
"border-critical-base": "var(--ember-light-6)",
"border-critical-hover": "var(--ember-light-7)",
"border-critical-selected": "var(--ember-light-9)",
"border-info-base": "var(--lilac-light-6)",
"border-info-hover": "var(--lilac-light-7)",
"border-info-selected": "var(--lilac-light-9)",
"icon-base": "var(--smoke-light-9)",
"icon-hover": "var(--smoke-light-11)",
"icon-active": "var(--smoke-light-12)",
"icon-selected": "var(--smoke-light-12)",
"icon-disabled": "var(--smoke-light-8)",
"icon-focus": "var(--smoke-light-12)",
"icon-invert-base": "#ffffff",
"icon-weak-base": "var(--smoke-light-7)",
"icon-weak-hover": "var(--smoke-light-8)",
"icon-weak-active": "var(--smoke-light-9)",
"icon-weak-selected": "var(--smoke-light-10)",
"icon-weak-disabled": "var(--smoke-light-6)",
"icon-weak-focus": "var(--smoke-light-9)",
"icon-strong-base": "var(--smoke-light-12)",
"icon-strong-hover": "#151313",
"icon-strong-active": "#020202",
"icon-strong-selected": "#020202",
"icon-strong-disabled": "var(--smoke-light-8)",
"icon-strong-focus": "#020202",
"icon-brand-base": "var(--smoke-light-12)",
"icon-interactive-base": "var(--cobalt-light-9)",
"icon-success-base": "var(--apple-light-7)",
"icon-success-hover": "var(--apple-light-8)",
"icon-success-active": "var(--apple-light-11)",
"icon-warning-base": "var(--amber-light-7)",
"icon-warning-hover": "var(--amber-light-8)",
"icon-warning-active": "var(--amber-light-11)",
"icon-critical-base": "var(--ember-light-10)",
"icon-critical-hover": "var(--ember-light-11)",
"icon-critical-active": "var(--ember-light-12)",
"icon-info-base": "var(--lilac-light-7)",
"icon-info-hover": "var(--lilac-light-8)",
"icon-info-active": "var(--lilac-light-11)",
"icon-on-brand-base": "var(--smoke-light-alpha-11)",
"icon-on-brand-hover": "var(--smoke-light-alpha-12)",
"icon-on-brand-selected": "var(--smoke-light-alpha-12)",
"icon-on-interactive-base": "var(--smoke-light-1)",
"icon-agent-plan-base": "var(--purple-light-9)",
"icon-agent-docs-base": "var(--amber-light-9)",
"icon-agent-ask-base": "var(--cyan-light-9)",
"icon-agent-build-base": "var(--cobalt-light-9)",
"icon-on-success-base": "var(--apple-light-alpha-9)",
"icon-on-success-hover": "var(--apple-light-alpha-10)",
"icon-on-success-selected": "var(--apple-light-alpha-11)",
"icon-on-warning-base": "var(--amber-lightalpha-9)",
"icon-on-warning-hover": "var(--amber-lightalpha-10)",
"icon-on-warning-selected": "var(--amber-lightalpha-11)",
"icon-on-critical-base": "var(--ember-light-alpha-9)",
"icon-on-critical-hover": "var(--ember-light-alpha-10)",
"icon-on-critical-selected": "var(--ember-light-alpha-11)",
"icon-on-info-base": "var(--lilac-light-9)",
"icon-on-info-hover": "var(--lilac-light-alpha-10)",
"icon-on-info-selected": "var(--lilac-light-alpha-11)",
"icon-diff-add-base": "var(--mint-light-11)",
"icon-diff-add-hover": "var(--mint-light-12)",
"icon-diff-add-active": "var(--mint-light-12)",
"icon-diff-delete-base": "var(--ember-light-10)",
"icon-diff-delete-hover": "var(--ember-light-11)",
"syntax-comment": "var(--text-weak)",
"syntax-regexp": "var(--text-base)",
"syntax-string": "#006656",
"syntax-keyword": "var(--text-weak)",
"syntax-primitive": "#fb4804",
"syntax-operator": "var(--text-base)",
"syntax-variable": "var(--text-strong)",
"syntax-property": "#ed6dc8",
"syntax-type": "#596600",
"syntax-constant": "#007b80",
"syntax-punctuation": "var(--text-base)",
"syntax-object": "var(--text-strong)",
"syntax-success": "var(--apple-light-10)",
"syntax-warning": "var(--amber-light-10)",
"syntax-critical": "var(--ember-light-10)",
"syntax-info": "#0092a8",
"syntax-diff-add": "var(--mint-light-11)",
"syntax-diff-delete": "var(--ember-light-11)",
"syntax-diff-unknown": "#ff0000",
"markdown-heading": "#d68c27",
"markdown-text": "#1a1a1a",
"markdown-link": "#3b7dd8",
"markdown-link-text": "#318795",
"markdown-code": "#3d9a57",
"markdown-block-quote": "#b0851f",
"markdown-emph": "#b0851f",
"markdown-strong": "#d68c27",
"markdown-horizontal-rule": "#8a8a8a",
"markdown-list-item": "#3b7dd8",
"markdown-list-enumeration": "#318795",
"markdown-image": "#3b7dd8",
"markdown-image-text": "#318795",
"markdown-code-block": "#1a1a1a",
"border-color": "#ffffff",
"border-weaker-base": "var(--smoke-light-alpha-3)",
"border-weaker-hover": "var(--smoke-light-alpha-4)",
"border-weaker-active": "var(--smoke-light-alpha-6)",
"border-weaker-selected": "var(--cobalt-light-alpha-4)",
"border-weaker-disabled": "var(--smoke-light-alpha-2)",
"border-weaker-focus": "var(--smoke-light-alpha-6)",
"button-ghost-hover": "var(--smoke-light-alpha-2)",
"button-ghost-hover2": "var(--smoke-light-alpha-3)",
"avatar-background-pink": "#feeef8",
"avatar-background-mint": "#e1fbf4",
"avatar-background-orange": "#fff1e7",
"avatar-background-purple": "#f9f1fe",
"avatar-background-cyan": "#e7f9fb",
"avatar-background-lime": "#eefadc",
"avatar-text-pink": "#cd1d8d",
"avatar-text-mint": "#147d6f",
"avatar-text-orange": "#ed5f00",
"avatar-text-purple": "#8445bc",
"avatar-text-cyan": "#0894b3",
"avatar-text-lime": "#5d770d"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#716c6b", "neutral": "#716c6b",
"ink": "#b7b1b1",
"primary": "#fab283", "primary": "#fab283",
"accent": "#ffba92",
"success": "#12c905", "success": "#12c905",
"warning": "#fcd53a", "warning": "#fcd53a",
"error": "#fc533a", "error": "#fc533a",
@@ -279,259 +30,6 @@
"interactive": "#034cff", "interactive": "#034cff",
"diffAdd": "#c8ffc4", "diffAdd": "#c8ffc4",
"diffDelete": "#fc533a" "diffDelete": "#fc533a"
},
"overrides": {
"background-base": "var(--smoke-dark-1)",
"background-weak": "#1c1717",
"background-strong": "#151313",
"background-stronger": "#191515",
"surface-base": "var(--smoke-dark-alpha-2)",
"base": "var(--smoke-dark-alpha-2)",
"surface-base-hover": "#e0b7b716",
"surface-base-active": "var(--smoke-dark-alpha-3)",
"surface-base-interactive-active": "var(--cobalt-dark-alpha-2)",
"base2": "var(--smoke-dark-alpha-2)",
"base3": "var(--smoke-dark-alpha-2)",
"surface-inset-base": "#0e0b0b7f",
"surface-inset-base-hover": "#0e0b0b7f",
"surface-inset-strong": "#060505cc",
"surface-inset-strong-hover": "#060505cc",
"surface-raised-base": "var(--smoke-dark-alpha-3)",
"surface-float-base": "var(--smoke-dark-1)",
"surface-float-base-hover": "var(--smoke-dark-2)",
"surface-raised-base-hover": "var(--smoke-dark-alpha-4)",
"surface-raised-base-active": "var(--smoke-dark-alpha-5)",
"surface-raised-strong": "var(--smoke-dark-alpha-4)",
"surface-raised-strong-hover": "var(--smoke-dark-alpha-6)",
"surface-raised-stronger": "var(--smoke-dark-alpha-6)",
"surface-raised-stronger-hover": "var(--smoke-dark-alpha-7)",
"surface-weak": "var(--smoke-dark-alpha-4)",
"surface-weaker": "var(--smoke-dark-alpha-5)",
"surface-strong": "var(--smoke-dark-alpha-7)",
"surface-raised-stronger-non-alpha": "var(--smoke-dark-3)",
"surface-brand-base": "var(--yuzu-light-9)",
"surface-brand-hover": "var(--yuzu-light-10)",
"surface-interactive-base": "var(--cobalt-dark-3)",
"surface-interactive-hover": "#0A1D4D",
"surface-interactive-weak": "var(--cobalt-dark-2)",
"surface-interactive-weak-hover": "var(--cobalt-light-3)",
"surface-success-base": "var(--apple-dark-3)",
"surface-success-weak": "var(--apple-dark-2)",
"surface-success-strong": "var(--apple-dark-9)",
"surface-warning-base": "var(--solaris-light-3)",
"surface-warning-weak": "var(--solaris-light-2)",
"surface-warning-strong": "var(--solaris-light-9)",
"surface-critical-base": "var(--ember-dark-3)",
"surface-critical-weak": "var(--ember-dark-2)",
"surface-critical-strong": "var(--ember-dark-9)",
"surface-info-base": "var(--lilac-light-3)",
"surface-info-weak": "var(--lilac-light-2)",
"surface-info-strong": "var(--lilac-light-9)",
"surface-diff-unchanged-base": "var(--smoke-dark-1)",
"surface-diff-skip-base": "var(--smoke-dark-alpha-1)",
"surface-diff-hidden-base": "var(--blue-dark-2)",
"surface-diff-hidden-weak": "var(--blue-dark-1)",
"surface-diff-hidden-weaker": "var(--blue-dark-3)",
"surface-diff-hidden-strong": "var(--blue-dark-5)",
"surface-diff-hidden-stronger": "var(--blue-dark-11)",
"surface-diff-add-base": "var(--mint-dark-3)",
"surface-diff-add-weak": "var(--mint-dark-4)",
"surface-diff-add-weaker": "var(--mint-dark-3)",
"surface-diff-add-strong": "var(--mint-dark-5)",
"surface-diff-add-stronger": "var(--mint-dark-11)",
"surface-diff-delete-base": "var(--ember-dark-3)",
"surface-diff-delete-weak": "var(--ember-dark-4)",
"surface-diff-delete-weaker": "var(--ember-dark-3)",
"surface-diff-delete-strong": "var(--ember-dark-5)",
"surface-diff-delete-stronger": "var(--ember-dark-11)",
"input-base": "var(--smoke-dark-2)",
"input-hover": "var(--smoke-dark-2)",
"input-active": "var(--cobalt-dark-1)",
"input-selected": "var(--cobalt-dark-2)",
"input-focus": "var(--cobalt-dark-1)",
"input-disabled": "var(--smoke-dark-4)",
"text-base": "var(--smoke-dark-alpha-11)",
"text-weak": "var(--smoke-dark-alpha-9)",
"text-weaker": "var(--smoke-dark-alpha-8)",
"text-strong": "var(--smoke-dark-alpha-12)",
"text-invert-base": "var(--smoke-dark-alpha-11)",
"text-invert-weak": "var(--smoke-dark-alpha-9)",
"text-invert-weaker": "var(--smoke-dark-alpha-8)",
"text-invert-strong": "var(--smoke-dark-alpha-12)",
"text-interactive-base": "var(--cobalt-dark-11)",
"text-on-brand-base": "var(--smoke-dark-alpha-11)",
"text-on-interactive-base": "var(--smoke-dark-12)",
"text-on-interactive-weak": "var(--smoke-dark-alpha-11)",
"text-on-success-base": "var(--apple-dark-9)",
"text-on-critical-base": "var(--ember-dark-9)",
"text-on-critical-weak": "var(--ember-dark-8)",
"text-on-critical-strong": "var(--ember-dark-12)",
"text-on-warning-base": "var(--smoke-dark-alpha-11)",
"text-on-info-base": "var(--smoke-dark-alpha-11)",
"text-diff-add-base": "var(--mint-dark-11)",
"text-diff-delete-base": "var(--ember-dark-9)",
"text-diff-delete-strong": "var(--ember-dark-12)",
"text-diff-add-strong": "var(--mint-dark-8)",
"text-on-info-weak": "var(--smoke-dark-alpha-9)",
"text-on-info-strong": "var(--smoke-dark-alpha-12)",
"text-on-warning-weak": "var(--smoke-dark-alpha-9)",
"text-on-warning-strong": "var(--smoke-dark-alpha-12)",
"text-on-success-weak": "var(--apple-dark-8)",
"text-on-success-strong": "var(--apple-dark-12)",
"text-on-brand-weak": "var(--smoke-dark-alpha-9)",
"text-on-brand-weaker": "var(--smoke-dark-alpha-8)",
"text-on-brand-strong": "var(--smoke-dark-alpha-12)",
"button-primary-base": "var(--smoke-dark-12)",
"button-secondary-base": "#231f1f",
"button-secondary-hover": "#2a2727",
"border-base": "var(--smoke-dark-alpha-7)",
"border-hover": "var(--smoke-dark-alpha-8)",
"border-active": "var(--smoke-dark-alpha-9)",
"border-selected": "var(--cobalt-dark-alpha-11)",
"border-disabled": "var(--smoke-dark-alpha-8)",
"border-focus": "var(--smoke-dark-alpha-9)",
"border-weak-base": "var(--smoke-dark-alpha-6)",
"border-strong-base": "var(--smoke-dark-alpha-8)",
"border-strong-hover": "var(--smoke-dark-alpha-7)",
"border-strong-active": "var(--smoke-dark-alpha-8)",
"border-strong-selected": "var(--cobalt-dark-alpha-6)",
"border-strong-disabled": "var(--smoke-dark-alpha-6)",
"border-strong-focus": "var(--smoke-dark-alpha-8)",
"border-weak-hover": "var(--smoke-dark-alpha-7)",
"border-weak-active": "var(--smoke-dark-alpha-8)",
"border-weak-selected": "var(--cobalt-dark-alpha-6)",
"border-weak-disabled": "var(--smoke-dark-alpha-6)",
"border-weak-focus": "var(--smoke-dark-alpha-8)",
"border-interactive-base": "var(--cobalt-light-7)",
"border-interactive-hover": "var(--cobalt-light-8)",
"border-interactive-active": "var(--cobalt-light-9)",
"border-interactive-selected": "var(--cobalt-light-9)",
"border-interactive-disabled": "var(--smoke-light-8)",
"border-interactive-focus": "var(--cobalt-light-9)",
"border-success-base": "var(--apple-light-6)",
"border-success-hover": "var(--apple-light-7)",
"border-success-selected": "var(--apple-light-9)",
"border-warning-base": "var(--solaris-light-6)",
"border-warning-hover": "var(--solaris-light-7)",
"border-warning-selected": "var(--solaris-light-9)",
"border-critical-base": "var(--ember-dark-5)",
"border-critical-hover": "var(--ember-dark-7)",
"border-critical-selected": "var(--ember-dark-9)",
"border-info-base": "var(--lilac-light-6)",
"border-info-hover": "var(--lilac-light-7)",
"border-info-selected": "var(--lilac-light-9)",
"icon-base": "var(--smoke-dark-9)",
"icon-hover": "var(--smoke-dark-10)",
"icon-active": "var(--smoke-dark-11)",
"icon-selected": "var(--smoke-dark-12)",
"icon-disabled": "var(--smoke-dark-7)",
"icon-focus": "var(--smoke-dark-12)",
"icon-invert-base": "var(--smoke-dark-1)",
"icon-weak-base": "var(--smoke-dark-6)",
"icon-weak-hover": "var(--smoke-light-7)",
"icon-weak-active": "var(--smoke-light-8)",
"icon-weak-selected": "var(--smoke-light-9)",
"icon-weak-disabled": "var(--smoke-light-4)",
"icon-weak-focus": "var(--smoke-light-9)",
"icon-strong-base": "var(--smoke-dark-12)",
"icon-strong-hover": "#f6f3f3",
"icon-strong-active": "#fcfcfc",
"icon-strong-selected": "#fdfcfc",
"icon-strong-disabled": "var(--smoke-dark-8)",
"icon-strong-focus": "#fdfcfc",
"icon-brand-base": "var(--white)",
"icon-interactive-base": "var(--cobalt-dark-11)",
"icon-success-base": "var(--apple-dark-9)",
"icon-success-hover": "var(--apple-dark-10)",
"icon-success-active": "var(--apple-dark-11)",
"icon-warning-base": "var(--amber-dark-9)",
"icon-warning-hover": "var(--amber-dark-8)",
"icon-warning-active": "var(--amber-dark-11)",
"icon-critical-base": "var(--ember-dark-9)",
"icon-critical-hover": "var(--ember-dark-11)",
"icon-critical-active": "var(--ember-dark-12)",
"icon-info-base": "var(--lilac-dark-7)",
"icon-info-hover": "var(--lilac-dark-8)",
"icon-info-active": "var(--lilac-dark-11)",
"icon-on-brand-base": "var(--smoke-light-alpha-11)",
"icon-on-brand-hover": "var(--smoke-light-alpha-12)",
"icon-on-brand-selected": "var(--smoke-light-alpha-12)",
"icon-on-interactive-base": "var(--smoke-dark-12)",
"icon-agent-plan-base": "var(--purple-dark-9)",
"icon-agent-docs-base": "var(--amber-dark-9)",
"icon-agent-ask-base": "var(--cyan-dark-9)",
"icon-agent-build-base": "var(--cobalt-dark-11)",
"icon-on-success-base": "var(--apple-dark-alpha-9)",
"icon-on-success-hover": "var(--apple-dark-alpha-10)",
"icon-on-success-selected": "var(--apple-dark-alpha-11)",
"icon-on-warning-base": "var(--amber-darkalpha-9)",
"icon-on-warning-hover": "var(--amber-darkalpha-10)",
"icon-on-warning-selected": "var(--amber-darkalpha-11)",
"icon-on-critical-base": "var(--ember-dark-alpha-9)",
"icon-on-critical-hover": "var(--ember-dark-alpha-10)",
"icon-on-critical-selected": "var(--ember-dark-alpha-11)",
"icon-on-info-base": "var(--lilac-dark-9)",
"icon-on-info-hover": "var(--lilac-dark-alpha-10)",
"icon-on-info-selected": "var(--lilac-dark-alpha-11)",
"icon-diff-add-base": "var(--mint-dark-11)",
"icon-diff-add-hover": "var(--mint-dark-10)",
"icon-diff-add-active": "var(--mint-dark-11)",
"icon-diff-delete-base": "var(--ember-dark-9)",
"icon-diff-delete-hover": "var(--ember-dark-10)",
"syntax-comment": "var(--text-weak)",
"syntax-regexp": "var(--text-base)",
"syntax-string": "#00ceb9",
"syntax-keyword": "var(--text-weak)",
"syntax-primitive": "#ffba92",
"syntax-operator": "var(--text-weak)",
"syntax-variable": "var(--text-strong)",
"syntax-property": "#ff9ae2",
"syntax-type": "#ecf58c",
"syntax-constant": "#93e9f6",
"syntax-punctuation": "var(--text-weak)",
"syntax-object": "var(--text-strong)",
"syntax-success": "var(--apple-dark-10)",
"syntax-warning": "var(--amber-dark-10)",
"syntax-critical": "var(--ember-dark-10)",
"syntax-info": "#93e9f6",
"syntax-diff-add": "var(--mint-dark-11)",
"syntax-diff-delete": "var(--ember-dark-11)",
"syntax-diff-unknown": "#ff0000",
"markdown-heading": "#9d7cd8",
"markdown-text": "#eeeeee",
"markdown-link": "#fab283",
"markdown-link-text": "#56b6c2",
"markdown-code": "#7fd88f",
"markdown-block-quote": "#e5c07b",
"markdown-emph": "#e5c07b",
"markdown-strong": "#f5a742",
"markdown-horizontal-rule": "#808080",
"markdown-list-item": "#fab283",
"markdown-list-enumeration": "#56b6c2",
"markdown-image": "#fab283",
"markdown-image-text": "#56b6c2",
"markdown-code-block": "#eeeeee",
"border-color": "#ffffff",
"border-weaker-base": "var(--smoke-dark-alpha-3)",
"border-weaker-hover": "var(--smoke-dark-alpha-4)",
"border-weaker-active": "var(--smoke-dark-alpha-6)",
"border-weaker-selected": "var(--cobalt-dark-alpha-3)",
"border-weaker-disabled": "var(--smoke-dark-alpha-2)",
"border-weaker-focus": "var(--smoke-dark-alpha-6)",
"button-ghost-hover": "var(--smoke-dark-alpha-2)",
"button-ghost-hover2": "var(--smoke-dark-alpha-3)",
"avatar-background-pink": "#501b3f",
"avatar-background-mint": "#033a34",
"avatar-background-orange": "#5f2a06",
"avatar-background-purple": "#432155",
"avatar-background-cyan": "#0f3058",
"avatar-background-lime": "#2b3711",
"avatar-text-pink": "#e34ba9",
"avatar-text-mint": "#95f3d9",
"avatar-text-orange": "#ff802b",
"avatar-text-purple": "#9d5bd2",
"avatar-text-cyan": "#369eff",
"avatar-text-lime": "#c4f042"
} }
} }
} }
+4 -503
View File
@@ -3,9 +3,10 @@
"name": "OC-2", "name": "OC-2",
"id": "oc-2", "id": "oc-2",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#8e8b8b", "neutral": "#8e8b8b",
"primary": "#dcde8d", "primary": "#dcde8d",
"accent": "#ed6dc8",
"success": "#12c905", "success": "#12c905",
"warning": "#ffdc17", "warning": "#ffdc17",
"error": "#fc533a", "error": "#fc533a",
@@ -13,265 +14,13 @@
"interactive": "#034cff", "interactive": "#034cff",
"diffAdd": "#9ff29a", "diffAdd": "#9ff29a",
"diffDelete": "#fc533a" "diffDelete": "#fc533a"
},
"overrides": {
"background-base": "#f8f7f7",
"background-weak": "var(--gray-light-3)",
"background-strong": "var(--gray-light-1)",
"background-stronger": "#fcfcfc",
"surface-base": "var(--gray-light-alpha-2)",
"base": "var(--gray-light-alpha-2)",
"surface-base-hover": "#0500000f",
"surface-base-active": "var(--gray-light-alpha-3)",
"surface-base-interactive-active": "var(--cobalt-light-alpha-3)",
"base2": "var(--gray-light-alpha-2)",
"base3": "var(--gray-light-alpha-2)",
"surface-inset-base": "var(--gray-light-alpha-2)",
"surface-inset-base-hover": "var(--gray-light-alpha-3)",
"surface-inset-strong": "#1f000017",
"surface-inset-strong-hover": "#1f000017",
"surface-raised-base": "var(--gray-light-alpha-2)",
"surface-float-base": "var(--gray-dark-1)",
"surface-float-base-hover": "var(--gray-dark-2)",
"surface-raised-base-hover": "var(--gray-light-alpha-3)",
"surface-raised-base-active": "var(--gray-light-alpha-5)",
"surface-raised-strong": "var(--gray-light-1)",
"surface-raised-strong-hover": "var(--white)",
"surface-raised-stronger": "var(--white)",
"surface-raised-stronger-hover": "var(--white)",
"surface-weak": "var(--gray-light-alpha-3)",
"surface-weaker": "var(--gray-light-alpha-4)",
"surface-strong": "#ffffff",
"surface-raised-stronger-non-alpha": "var(--white)",
"surface-brand-base": "var(--yuzu-light-9)",
"surface-brand-hover": "var(--yuzu-light-10)",
"surface-interactive-base": "var(--cobalt-light-3)",
"surface-interactive-hover": "#E5F0FF",
"surface-interactive-weak": "var(--cobalt-light-2)",
"surface-interactive-weak-hover": "var(--cobalt-light-3)",
"surface-success-base": "var(--apple-light-3)",
"surface-success-weak": "var(--apple-light-2)",
"surface-success-strong": "var(--apple-light-9)",
"surface-warning-base": "var(--solaris-light-3)",
"surface-warning-weak": "var(--solaris-light-2)",
"surface-warning-strong": "var(--solaris-light-9)",
"surface-critical-base": "var(--ember-light-3)",
"surface-critical-weak": "var(--ember-light-2)",
"surface-critical-strong": "var(--ember-light-9)",
"surface-info-base": "var(--lilac-light-3)",
"surface-info-weak": "var(--lilac-light-2)",
"surface-info-strong": "var(--lilac-light-9)",
"surface-diff-unchanged-base": "#ffffff00",
"surface-diff-skip-base": "var(--gray-light-2)",
"surface-diff-hidden-base": "var(--blue-light-3)",
"surface-diff-hidden-weak": "var(--blue-light-2)",
"surface-diff-hidden-weaker": "var(--blue-light-1)",
"surface-diff-hidden-strong": "var(--blue-light-5)",
"surface-diff-hidden-stronger": "var(--blue-light-9)",
"surface-diff-add-base": "#dafbe0",
"surface-diff-add-weak": "var(--mint-light-2)",
"surface-diff-add-weaker": "var(--mint-light-1)",
"surface-diff-add-strong": "var(--mint-light-5)",
"surface-diff-add-stronger": "var(--mint-light-9)",
"surface-diff-delete-base": "var(--ember-light-3)",
"surface-diff-delete-weak": "var(--ember-light-2)",
"surface-diff-delete-weaker": "var(--ember-light-1)",
"surface-diff-delete-strong": "var(--ember-light-6)",
"surface-diff-delete-stronger": "var(--ember-light-9)",
"input-base": "var(--gray-light-1)",
"input-hover": "var(--gray-light-2)",
"input-active": "var(--cobalt-light-1)",
"input-selected": "var(--cobalt-light-4)",
"input-focus": "var(--cobalt-light-1)",
"input-disabled": "var(--gray-light-4)",
"text-base": "var(--gray-light-11)",
"text-weak": "var(--gray-light-9)",
"text-weaker": "var(--gray-light-8)",
"text-strong": "var(--gray-light-12)",
"text-invert-base": "var(--gray-dark-alpha-11)",
"text-invert-weak": "var(--gray-dark-alpha-9)",
"text-invert-weaker": "var(--gray-dark-alpha-8)",
"text-invert-strong": "var(--gray-dark-alpha-12)",
"text-interactive-base": "var(--cobalt-light-9)",
"text-on-brand-base": "var(--gray-light-alpha-11)",
"text-on-interactive-base": "var(--gray-light-1)",
"text-on-interactive-weak": "var(--gray-dark-alpha-11)",
"text-on-success-base": "var(--apple-light-10)",
"text-on-critical-base": "var(--ember-light-10)",
"text-on-critical-weak": "var(--ember-light-8)",
"text-on-critical-strong": "var(--ember-light-12)",
"text-on-warning-base": "var(--gray-dark-alpha-11)",
"text-on-info-base": "var(--gray-dark-alpha-11)",
"text-diff-add-base": "var(--mint-light-11)",
"text-diff-delete-base": "var(--ember-light-10)",
"text-diff-delete-strong": "var(--ember-light-12)",
"text-diff-add-strong": "var(--mint-light-12)",
"text-on-info-weak": "var(--gray-dark-alpha-9)",
"text-on-info-strong": "var(--gray-dark-alpha-12)",
"text-on-warning-weak": "var(--gray-dark-alpha-9)",
"text-on-warning-strong": "var(--gray-dark-alpha-12)",
"text-on-success-weak": "var(--apple-light-6)",
"text-on-success-strong": "var(--apple-light-12)",
"text-on-brand-weak": "var(--gray-light-alpha-9)",
"text-on-brand-weaker": "var(--gray-light-alpha-8)",
"text-on-brand-strong": "var(--gray-light-alpha-12)",
"button-primary-base": "var(--gray-light-12)",
"button-secondary-base": "var(--gray-light-1)",
"button-secondary-hover": "FFFFFF0A",
"border-base": "var(--gray-light-alpha-7)",
"border-hover": "var(--gray-light-alpha-8)",
"border-active": "var(--gray-light-alpha-9)",
"border-selected": "var(--cobalt-light-alpha-9)",
"border-disabled": "var(--gray-light-alpha-8)",
"border-focus": "var(--gray-light-alpha-9)",
"border-weak-base": "var(--gray-light-alpha-5)",
"border-strong-base": "var(--gray-light-alpha-7)",
"border-strong-hover": "var(--gray-light-alpha-8)",
"border-strong-active": "var(--gray-light-alpha-7)",
"border-strong-selected": "var(--cobalt-light-alpha-6)",
"border-strong-disabled": "var(--gray-light-alpha-6)",
"border-strong-focus": "var(--gray-light-alpha-7)",
"border-weak-hover": "var(--gray-light-alpha-6)",
"border-weak-active": "var(--gray-light-alpha-7)",
"border-weak-selected": "var(--cobalt-light-alpha-5)",
"border-weak-disabled": "var(--gray-light-alpha-6)",
"border-weak-focus": "var(--gray-light-alpha-7)",
"border-interactive-base": "var(--cobalt-light-7)",
"border-interactive-hover": "var(--cobalt-light-8)",
"border-interactive-active": "var(--cobalt-light-9)",
"border-interactive-selected": "var(--cobalt-light-9)",
"border-interactive-disabled": "var(--gray-light-8)",
"border-interactive-focus": "var(--cobalt-light-9)",
"border-success-base": "var(--apple-light-6)",
"border-success-hover": "var(--apple-light-7)",
"border-success-selected": "var(--apple-light-9)",
"border-warning-base": "var(--solaris-light-6)",
"border-warning-hover": "var(--solaris-light-7)",
"border-warning-selected": "var(--solaris-light-9)",
"border-critical-base": "var(--ember-light-6)",
"border-critical-hover": "var(--ember-light-7)",
"border-critical-selected": "var(--ember-light-9)",
"border-info-base": "var(--lilac-light-6)",
"border-info-hover": "var(--lilac-light-7)",
"border-info-selected": "var(--lilac-light-9)",
"icon-base": "var(--gray-light-9)",
"icon-hover": "var(--gray-light-11)",
"icon-active": "var(--gray-light-12)",
"icon-selected": "var(--gray-light-12)",
"icon-disabled": "var(--gray-light-8)",
"icon-focus": "var(--gray-light-12)",
"icon-invert-base": "#ffffff",
"icon-weak-base": "var(--gray-light-7)",
"icon-weak-hover": "var(--gray-light-8)",
"icon-weak-active": "var(--gray-light-9)",
"icon-weak-selected": "var(--gray-light-10)",
"icon-weak-disabled": "var(--gray-light-6)",
"icon-weak-focus": "var(--gray-light-9)",
"icon-strong-base": "var(--gray-light-12)",
"icon-strong-hover": "#151313",
"icon-strong-active": "#020202",
"icon-strong-selected": "#020202",
"icon-strong-disabled": "var(--gray-light-6)",
"icon-strong-focus": "#020202",
"icon-brand-base": "var(--gray-light-12)",
"icon-interactive-base": "var(--cobalt-light-9)",
"icon-success-base": "var(--apple-light-7)",
"icon-success-hover": "var(--apple-light-8)",
"icon-success-active": "var(--apple-light-11)",
"icon-warning-base": "var(--amber-light-7)",
"icon-warning-hover": "var(--amber-light-8)",
"icon-warning-active": "var(--amber-light-11)",
"icon-critical-base": "var(--ember-light-10)",
"icon-critical-hover": "var(--ember-light-11)",
"icon-critical-active": "var(--ember-light-12)",
"icon-info-base": "var(--lilac-light-7)",
"icon-info-hover": "var(--lilac-light-8)",
"icon-info-active": "var(--lilac-light-11)",
"icon-on-brand-base": "var(--gray-light-alpha-11)",
"icon-on-brand-hover": "var(--gray-light-alpha-12)",
"icon-on-brand-selected": "var(--gray-light-alpha-12)",
"icon-on-interactive-base": "var(--gray-light-1)",
"icon-agent-plan-base": "var(--purple-light-9)",
"icon-agent-docs-base": "var(--amber-light-9)",
"icon-agent-ask-base": "var(--cyan-light-9)",
"icon-agent-build-base": "var(--cobalt-light-9)",
"icon-on-success-base": "var(--apple-light-alpha-9)",
"icon-on-success-hover": "var(--apple-light-alpha-10)",
"icon-on-success-selected": "var(--apple-light-alpha-11)",
"icon-on-warning-base": "var(--amber-lightalpha-9)",
"icon-on-warning-hover": "var(--amber-lightalpha-10)",
"icon-on-warning-selected": "var(--amber-lightalpha-11)",
"icon-on-critical-base": "var(--ember-light-alpha-9)",
"icon-on-critical-hover": "var(--ember-light-alpha-10)",
"icon-on-critical-selected": "var(--ember-light-alpha-11)",
"icon-on-info-base": "var(--lilac-light-9)",
"icon-on-info-hover": "var(--lilac-light-alpha-10)",
"icon-on-info-selected": "var(--lilac-light-alpha-11)",
"icon-diff-add-base": "var(--mint-light-11)",
"icon-diff-add-hover": "var(--mint-light-12)",
"icon-diff-add-active": "var(--mint-light-12)",
"icon-diff-delete-base": "var(--ember-light-10)",
"icon-diff-delete-hover": "var(--ember-light-11)",
"syntax-comment": "var(--text-weak)",
"syntax-regexp": "var(--text-base)",
"syntax-string": "#006656",
"syntax-keyword": "var(--text-weak)",
"syntax-primitive": "#fb4804",
"syntax-operator": "var(--text-base)",
"syntax-variable": "var(--text-strong)",
"syntax-property": "#ed6dc8",
"syntax-type": "#596600",
"syntax-constant": "#007b80",
"syntax-punctuation": "var(--text-base)",
"syntax-object": "var(--text-strong)",
"syntax-success": "var(--apple-light-10)",
"syntax-warning": "var(--amber-light-10)",
"syntax-critical": "var(--ember-light-10)",
"syntax-info": "#0092a8",
"syntax-diff-add": "var(--mint-light-11)",
"syntax-diff-delete": "var(--ember-light-11)",
"syntax-diff-unknown": "#ff0000",
"markdown-heading": "#d68c27",
"markdown-text": "#1a1a1a",
"markdown-link": "#3b7dd8",
"markdown-link-text": "#318795",
"markdown-code": "#3d9a57",
"markdown-block-quote": "#b0851f",
"markdown-emph": "#b0851f",
"markdown-strong": "#d68c27",
"markdown-horizontal-rule": "#8a8a8a",
"markdown-list-item": "#3b7dd8",
"markdown-list-enumeration": "#318795",
"markdown-image": "#3b7dd8",
"markdown-image-text": "#318795",
"markdown-code-block": "#1a1a1a",
"border-color": "#ffffff",
"border-weaker-base": "var(--gray-light-alpha-3)",
"border-weaker-hover": "var(--gray-light-alpha-4)",
"border-weaker-active": "var(--gray-light-alpha-6)",
"border-weaker-selected": "var(--cobalt-light-alpha-4)",
"border-weaker-disabled": "var(--gray-light-alpha-2)",
"border-weaker-focus": "var(--gray-light-alpha-6)",
"button-ghost-hover": "var(--gray-light-alpha-2)",
"button-ghost-hover2": "var(--gray-light-alpha-3)",
"avatar-background-pink": "#feeef8",
"avatar-background-mint": "#e1fbf4",
"avatar-background-orange": "#fff1e7",
"avatar-background-purple": "#f9f1fe",
"avatar-background-cyan": "#e7f9fb",
"avatar-background-lime": "#eefadc",
"avatar-text-pink": "#cd1d8d",
"avatar-text-mint": "#147d6f",
"avatar-text-orange": "#ed5f00",
"avatar-text-purple": "#8445bc",
"avatar-text-cyan": "#0894b3",
"avatar-text-lime": "#5d770d"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#716c6b", "neutral": "#716c6b",
"primary": "#fab283", "primary": "#fab283",
"accent": "#ff9ae2",
"success": "#12c905", "success": "#12c905",
"warning": "#fcd53a", "warning": "#fcd53a",
"error": "#fc533a", "error": "#fc533a",
@@ -279,254 +28,6 @@
"interactive": "#034cff", "interactive": "#034cff",
"diffAdd": "#c8ffc4", "diffAdd": "#c8ffc4",
"diffDelete": "#fc533a" "diffDelete": "#fc533a"
},
"overrides": {
"base": "var(--gray-dark-alpha-2)",
"base2": "var(--gray-dark-alpha-2)",
"base3": "var(--gray-dark-alpha-2)",
"background-base": "#101010",
"background-weak": "#1E1E1E",
"background-strong": "#121212",
"background-stronger": "#151515",
"surface-base": "var(--gray-dark-alpha-2)",
"surface-base-hover": "#FFFFFF0A",
"surface-base-active": "var(--gray-dark-alpha-3)",
"surface-base-interactive-active": "var(--cobalt-dark-alpha-2)",
"surface-inset-base": "#0e0b0b7f",
"surface-inset-base-hover": "#0e0b0b7f",
"surface-inset-strong": "#060505cc",
"surface-inset-strong-hover": "#060505cc",
"surface-raised-base": "var(--gray-dark-alpha-3)",
"surface-float-base": "var(--gray-dark-1)",
"surface-float-base-hover": "var(--gray-dark-2)",
"surface-raised-base-hover": "var(--gray-dark-alpha-4)",
"surface-raised-base-active": "var(--gray-dark-alpha-5)",
"surface-raised-strong": "var(--gray-dark-alpha-4)",
"surface-raised-strong-hover": "var(--gray-dark-alpha-6)",
"surface-raised-stronger": "var(--gray-dark-alpha-6)",
"surface-raised-stronger-hover": "var(--gray-dark-alpha-7)",
"surface-weak": "var(--gray-dark-alpha-4)",
"surface-weaker": "var(--gray-dark-alpha-5)",
"surface-strong": "var(--gray-dark-alpha-7)",
"surface-raised-stronger-non-alpha": "#1B1B1B",
"surface-brand-base": "var(--yuzu-light-9)",
"surface-brand-hover": "var(--yuzu-light-10)",
"surface-interactive-base": "var(--cobalt-dark-3)",
"surface-interactive-hover": "#0A1D4D",
"surface-interactive-weak": "var(--cobalt-dark-2)",
"surface-interactive-weak-hover": "var(--cobalt-light-3)",
"surface-success-base": "var(--apple-dark-3)",
"surface-success-weak": "var(--apple-dark-2)",
"surface-success-strong": "var(--apple-dark-9)",
"surface-warning-base": "var(--solaris-light-3)",
"surface-warning-weak": "var(--solaris-light-2)",
"surface-warning-strong": "var(--solaris-light-9)",
"surface-critical-base": "var(--ember-dark-3)",
"surface-critical-weak": "var(--ember-dark-2)",
"surface-critical-strong": "var(--ember-dark-9)",
"surface-info-base": "var(--lilac-light-3)",
"surface-info-weak": "var(--lilac-light-2)",
"surface-info-strong": "var(--lilac-light-9)",
"surface-diff-unchanged-base": "var(--gray-dark-1)",
"surface-diff-skip-base": "var(--gray-dark-alpha-1)",
"surface-diff-hidden-base": "var(--blue-dark-2)",
"surface-diff-hidden-weak": "var(--blue-dark-1)",
"surface-diff-hidden-weaker": "var(--blue-dark-3)",
"surface-diff-hidden-strong": "var(--blue-dark-5)",
"surface-diff-hidden-stronger": "var(--blue-dark-11)",
"surface-diff-add-base": "var(--mint-dark-3)",
"surface-diff-add-weak": "var(--mint-dark-4)",
"surface-diff-add-weaker": "var(--mint-dark-3)",
"surface-diff-add-strong": "var(--mint-dark-5)",
"surface-diff-add-stronger": "var(--mint-dark-11)",
"surface-diff-delete-base": "var(--ember-dark-3)",
"surface-diff-delete-weak": "var(--ember-dark-4)",
"surface-diff-delete-weaker": "var(--ember-dark-3)",
"surface-diff-delete-strong": "var(--ember-dark-5)",
"surface-diff-delete-stronger": "var(--ember-dark-11)",
"input-base": "var(--gray-dark-2)",
"input-hover": "var(--gray-dark-2)",
"input-active": "var(--cobalt-dark-1)",
"input-selected": "var(--cobalt-dark-2)",
"input-focus": "var(--cobalt-dark-1)",
"input-disabled": "var(--gray-dark-4)",
"text-base": "var(--gray-dark-alpha-11)",
"text-weak": "var(--gray-dark-alpha-9)",
"text-weaker": "var(--gray-dark-alpha-8)",
"text-strong": "var(--gray-dark-alpha-12)",
"text-invert-base": "var(--gray-dark-alpha-11)",
"text-invert-weak": "var(--gray-dark-alpha-9)",
"text-invert-weaker": "var(--gray-dark-alpha-8)",
"text-invert-strong": "var(--gray-dark-alpha-12)",
"text-interactive-base": "var(--cobalt-dark-11)",
"text-on-brand-base": "var(--gray-dark-alpha-11)",
"text-on-interactive-base": "var(--gray-dark-12)",
"text-on-interactive-weak": "var(--gray-dark-alpha-11)",
"text-on-success-base": "var(--apple-dark-9)",
"text-on-critical-base": "var(--ember-dark-9)",
"text-on-critical-weak": "var(--ember-dark-8)",
"text-on-critical-strong": "var(--ember-dark-12)",
"text-on-warning-base": "var(--gray-dark-alpha-11)",
"text-on-info-base": "var(--gray-dark-alpha-11)",
"text-diff-add-base": "var(--mint-dark-11)",
"text-diff-delete-base": "var(--ember-dark-9)",
"text-diff-delete-strong": "var(--ember-dark-12)",
"text-diff-add-strong": "var(--mint-dark-8)",
"text-on-info-weak": "var(--gray-dark-alpha-9)",
"text-on-info-strong": "var(--gray-dark-alpha-12)",
"text-on-warning-weak": "var(--gray-dark-alpha-9)",
"text-on-warning-strong": "var(--gray-dark-alpha-12)",
"text-on-success-weak": "var(--apple-dark-8)",
"text-on-success-strong": "var(--apple-dark-12)",
"text-on-brand-weak": "var(--gray-dark-alpha-9)",
"text-on-brand-weaker": "var(--gray-dark-alpha-8)",
"text-on-brand-strong": "var(--gray-dark-alpha-12)",
"button-primary-base": "var(--gray-dark-12)",
"button-secondary-base": "var(--gray-dark-2)",
"button-secondary-hover": "#FFFFFF0A",
"border-base": "var(--gray-dark-alpha-7)",
"border-hover": "var(--gray-dark-alpha-8)",
"border-active": "var(--gray-dark-alpha-9)",
"border-selected": "var(--cobalt-dark-alpha-11)",
"border-disabled": "var(--gray-dark-alpha-8)",
"border-focus": "var(--gray-dark-alpha-9)",
"border-weak-base": "var(--gray-dark-alpha-5)",
"border-weak-hover": "var(--gray-dark-alpha-7)",
"border-weak-active": "var(--gray-dark-alpha-8)",
"border-weak-selected": "var(--cobalt-dark-alpha-6)",
"border-weak-disabled": "var(--gray-dark-alpha-6)",
"border-weak-focus": "var(--gray-dark-alpha-8)",
"border-strong-base": "var(--gray-dark-alpha-8)",
"border-interactive-base": "var(--cobalt-light-7)",
"border-interactive-hover": "var(--cobalt-light-8)",
"border-interactive-active": "var(--cobalt-light-9)",
"border-interactive-selected": "var(--cobalt-light-9)",
"border-interactive-disabled": "var(--gray-light-8)",
"border-interactive-focus": "var(--cobalt-light-9)",
"border-success-base": "var(--apple-light-6)",
"border-success-hover": "var(--apple-light-7)",
"border-success-selected": "var(--apple-light-9)",
"border-warning-base": "var(--solaris-light-6)",
"border-warning-hover": "var(--solaris-light-7)",
"border-warning-selected": "var(--solaris-light-9)",
"border-critical-base": "var(--ember-dark-5)",
"border-critical-hover": "var(--ember-dark-7)",
"border-critical-selected": "var(--ember-dark-9)",
"border-info-base": "var(--lilac-light-6)",
"border-info-hover": "var(--lilac-light-7)",
"border-info-selected": "var(--lilac-light-9)",
"icon-base": "var(--gray-dark-10)",
"icon-hover": "var(--gray-dark-11)",
"icon-active": "var(--gray-dark-12)",
"icon-selected": "var(--gray-dark-12)",
"icon-disabled": "var(--gray-dark-8)",
"icon-focus": "var(--gray-dark-12)",
"icon-invert-base": "var(--gray-dark-1)",
"icon-weak-base": "var(--gray-dark-6)",
"icon-weak-hover": "var(--gray-light-7)",
"icon-weak-active": "var(--gray-light-8)",
"icon-weak-selected": "var(--gray-light-9)",
"icon-weak-disabled": "var(--gray-light-4)",
"icon-weak-focus": "var(--gray-light-9)",
"icon-strong-base": "var(--gray-dark-12)",
"icon-strong-hover": "#F3F3F3",
"icon-strong-active": "#EBEBEB",
"icon-strong-selected": "#FCFCFC",
"icon-strong-disabled": "var(--gray-dark-7)",
"icon-strong-focus": "#FCFCFC",
"icon-brand-base": "var(--white)",
"icon-interactive-base": "var(--cobalt-dark-11)",
"icon-success-base": "var(--apple-dark-9)",
"icon-success-hover": "var(--apple-dark-10)",
"icon-success-active": "var(--apple-dark-11)",
"icon-warning-base": "var(--amber-dark-9)",
"icon-warning-hover": "var(--amber-dark-8)",
"icon-warning-active": "var(--amber-dark-11)",
"icon-critical-base": "var(--ember-dark-9)",
"icon-critical-hover": "var(--ember-dark-11)",
"icon-critical-active": "var(--ember-dark-12)",
"icon-info-base": "var(--lilac-dark-7)",
"icon-info-hover": "var(--lilac-dark-8)",
"icon-info-active": "var(--lilac-dark-11)",
"icon-on-brand-base": "var(--gray-light-alpha-11)",
"icon-on-brand-hover": "var(--gray-light-alpha-12)",
"icon-on-brand-selected": "var(--gray-light-alpha-12)",
"icon-on-interactive-base": "var(--gray-dark-12)",
"icon-agent-plan-base": "var(--purple-dark-9)",
"icon-agent-docs-base": "var(--amber-dark-9)",
"icon-agent-ask-base": "var(--cyan-dark-9)",
"icon-agent-build-base": "var(--cobalt-dark-11)",
"icon-on-success-base": "var(--apple-dark-alpha-9)",
"icon-on-success-hover": "var(--apple-dark-alpha-10)",
"icon-on-success-selected": "var(--apple-dark-alpha-11)",
"icon-on-warning-base": "var(--amber-darkalpha-9)",
"icon-on-warning-hover": "var(--amber-darkalpha-10)",
"icon-on-warning-selected": "var(--amber-darkalpha-11)",
"icon-on-critical-base": "var(--ember-dark-alpha-9)",
"icon-on-critical-hover": "var(--ember-dark-alpha-10)",
"icon-on-critical-selected": "var(--ember-dark-alpha-11)",
"icon-on-info-base": "var(--lilac-dark-9)",
"icon-on-info-hover": "var(--lilac-dark-alpha-10)",
"icon-on-info-selected": "var(--lilac-dark-alpha-11)",
"icon-diff-add-base": "var(--mint-dark-11)",
"icon-diff-add-hover": "var(--mint-dark-10)",
"icon-diff-add-active": "var(--mint-dark-11)",
"icon-diff-delete-base": "var(--ember-dark-9)",
"icon-diff-delete-hover": "var(--ember-dark-10)",
"syntax-comment": "var(--text-weak)",
"syntax-regexp": "var(--text-base)",
"syntax-string": "#00ceb9",
"syntax-keyword": "var(--text-weak)",
"syntax-primitive": "#ffba92",
"syntax-operator": "var(--text-weak)",
"syntax-variable": "var(--text-strong)",
"syntax-property": "#ff9ae2",
"syntax-type": "#ecf58c",
"syntax-constant": "#93e9f6",
"syntax-punctuation": "var(--text-weak)",
"syntax-object": "var(--text-strong)",
"syntax-success": "var(--apple-dark-10)",
"syntax-warning": "var(--amber-dark-10)",
"syntax-critical": "var(--ember-dark-10)",
"syntax-info": "#93e9f6",
"syntax-diff-add": "var(--mint-dark-11)",
"syntax-diff-delete": "var(--ember-dark-11)",
"syntax-diff-unknown": "#ff0000",
"markdown-heading": "#9d7cd8",
"markdown-text": "#eeeeee",
"markdown-link": "#fab283",
"markdown-link-text": "#56b6c2",
"markdown-code": "#7fd88f",
"markdown-block-quote": "#e5c07b",
"markdown-emph": "#e5c07b",
"markdown-strong": "#f5a742",
"markdown-horizontal-rule": "#808080",
"markdown-list-item": "#fab283",
"markdown-list-enumeration": "#56b6c2",
"markdown-image": "#fab283",
"markdown-image-text": "#56b6c2",
"markdown-code-block": "#eeeeee",
"border-color": "#ffffff",
"border-weaker-base": "var(--gray-dark-alpha-3)",
"border-weaker-hover": "var(--gray-dark-alpha-4)",
"border-weaker-active": "var(--gray-dark-alpha-6)",
"border-weaker-selected": "var(--cobalt-dark-alpha-3)",
"border-weaker-disabled": "var(--gray-dark-alpha-2)",
"border-weaker-focus": "var(--gray-dark-alpha-6)",
"button-ghost-hover": "var(--gray-dark-alpha-2)",
"button-ghost-hover2": "var(--gray-dark-alpha-3)",
"avatar-background-pink": "#501b3f",
"avatar-background-mint": "#033a34",
"avatar-background-orange": "#5f2a06",
"avatar-background-purple": "#432155",
"avatar-background-cyan": "#0f3058",
"avatar-background-lime": "#2b3711",
"avatar-text-pink": "#e34ba9",
"avatar-text-mint": "#95f3d9",
"avatar-text-orange": "#ff802b",
"avatar-text-purple": "#9d5bd2",
"avatar-text-cyan": "#369eff",
"avatar-text-lime": "#c4f042"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "One Dark Pro", "name": "One Dark Pro",
"id": "onedarkpro", "id": "onedarkpro",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#f5f6f8", "neutral": "#f5f6f8",
"ink": "#2b303b",
"primary": "#528bff", "primary": "#528bff",
"accent": "#d85462",
"success": "#4fa66d", "success": "#4fa66d",
"warning": "#d19a66", "warning": "#d19a66",
"error": "#e06c75", "error": "#e06c75",
"info": "#61afef", "info": "#61afef",
"interactive": "#528bff",
"diffAdd": "#c2ebcf", "diffAdd": "#c2ebcf",
"diffDelete": "#f7c1c5" "diffDelete": "#f7c1c5"
},
"overrides": {
"background-base": "#f5f6f8",
"background-weak": "#eef0f4",
"background-strong": "#fafbfc",
"background-stronger": "#ffffff",
"border-weak-base": "#dee2eb",
"border-weak-hover": "#d4d9e3",
"border-weak-active": "#caced6",
"border-weak-selected": "#bec4d0",
"border-weak-disabled": "#f4f6fb",
"border-weak-focus": "#c4cada",
"border-base": "#b5bccd",
"border-hover": "#aab1c2",
"border-active": "#a0a7b8",
"border-selected": "#959cae",
"border-disabled": "#eceef4",
"border-focus": "#a6adbf",
"border-strong-base": "#747c92",
"border-strong-hover": "#6a7287",
"border-strong-active": "#60687c",
"border-strong-selected": "#565e71",
"border-strong-disabled": "#cbd0dd",
"border-strong-focus": "#666d82",
"surface-diff-add-base": "#e5f4ea",
"surface-diff-delete-base": "#fde7ea",
"surface-diff-hidden-base": "#e4e8f4",
"text-base": "#2b303b",
"text-weak": "#6b717f",
"text-strong": "#0e1118",
"syntax-string": "#4fa66d",
"syntax-primitive": "#d85462",
"syntax-property": "#528bff",
"syntax-type": "#d19a66",
"syntax-constant": "#61afef",
"syntax-info": "#61afef",
"markdown-heading": "#528bff",
"markdown-text": "#2b303b",
"markdown-link": "#528bff",
"markdown-link-text": "#61afef",
"markdown-code": "#4fa66d",
"markdown-block-quote": "#d19a66",
"markdown-emph": "#d19a66",
"markdown-strong": "#d85462",
"markdown-horizontal-rule": "#d3d7e4",
"markdown-list-item": "#528bff",
"markdown-list-enumeration": "#61afef",
"markdown-image": "#528bff",
"markdown-image-text": "#61afef",
"markdown-code-block": "#528bff"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#1e222a", "neutral": "#1e222a",
"ink": "#abb2bf",
"primary": "#61afef", "primary": "#61afef",
"accent": "#e06c75",
"success": "#98c379", "success": "#98c379",
"warning": "#e5c07b", "warning": "#e5c07b",
"error": "#e06c75", "error": "#e06c75",
"info": "#56b6c2", "info": "#56b6c2",
"interactive": "#61afef",
"diffAdd": "#4b815a", "diffAdd": "#4b815a",
"diffDelete": "#b2555f" "diffDelete": "#b2555f"
},
"overrides": {
"background-base": "#1e222a",
"background-weak": "#212631",
"background-strong": "#1b1f27",
"background-stronger": "#171b23",
"border-weak-base": "#323848",
"border-weak-hover": "#363d52",
"border-weak-active": "#3c435c",
"border-weak-selected": "#424967",
"border-weak-disabled": "#141720",
"border-weak-focus": "#3f4560",
"border-base": "#4a5164",
"border-hover": "#515871",
"border-active": "#585f7e",
"border-selected": "#60688a",
"border-disabled": "#1a1e27",
"border-focus": "#555c79",
"border-strong-base": "#6a7390",
"border-strong-hover": "#737c9d",
"border-strong-active": "#7d87ab",
"border-strong-selected": "#8791b8",
"border-strong-disabled": "#212533",
"border-strong-focus": "#7680a2",
"surface-diff-add-base": "#1c2a26",
"surface-diff-delete-base": "#2a1c22",
"surface-diff-hidden-base": "#232836",
"text-base": "#abb2bf",
"text-weak": "#818899",
"text-strong": "#f6f7fb",
"syntax-string": "#98c379",
"syntax-primitive": "#e06c75",
"syntax-property": "#61afef",
"syntax-type": "#e5c07b",
"syntax-constant": "#56b6c2",
"syntax-info": "#56b6c2",
"markdown-heading": "#61afef",
"markdown-text": "#abb2bf",
"markdown-link": "#61afef",
"markdown-link-text": "#56b6c2",
"markdown-code": "#98c379",
"markdown-block-quote": "#e5c07b",
"markdown-emph": "#e5c07b",
"markdown-strong": "#e06c75",
"markdown-horizontal-rule": "#2d3444",
"markdown-list-item": "#61afef",
"markdown-list-enumeration": "#56b6c2",
"markdown-image": "#61afef",
"markdown-image-text": "#56b6c2",
"markdown-code-block": "#abb2bf"
} }
} }
} }
@@ -3,129 +3,31 @@
"name": "Shades of Purple", "name": "Shades of Purple",
"id": "shadesofpurple", "id": "shadesofpurple",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#f7ebff", "neutral": "#f7ebff",
"ink": "#3b2c59",
"primary": "#7a5af8", "primary": "#7a5af8",
"accent": "#ff6bd5",
"success": "#3dd598", "success": "#3dd598",
"warning": "#f7c948", "warning": "#f7c948",
"error": "#ff6bd5", "error": "#ff6bd5",
"info": "#62d4ff", "info": "#62d4ff",
"interactive": "#7a5af8",
"diffAdd": "#c8f8da", "diffAdd": "#c8f8da",
"diffDelete": "#ffc3ef" "diffDelete": "#ffc3ef"
},
"overrides": {
"background-base": "#f7ebff",
"background-weak": "#f2e2ff",
"background-strong": "#fbf2ff",
"background-stronger": "#fff7ff",
"border-weak-base": "#e5d3ff",
"border-weak-hover": "#dac8f5",
"border-weak-active": "#d1bdeb",
"border-weak-selected": "#c6b3e1",
"border-weak-disabled": "#fcf6ff",
"border-weak-focus": "#ccb9e7",
"border-base": "#baa4d5",
"border-hover": "#b098cb",
"border-active": "#a68dc2",
"border-selected": "#9b82b8",
"border-disabled": "#f1e7ff",
"border-focus": "#a692c6",
"border-strong-base": "#8769a9",
"border-strong-hover": "#7b5c9d",
"border-strong-active": "#704f91",
"border-strong-selected": "#664587",
"border-strong-disabled": "#d8c4f0",
"border-strong-focus": "#755495",
"surface-diff-add-base": "#edf8f1",
"surface-diff-delete-base": "#ffe4f4",
"surface-diff-hidden-base": "#e9e4ff",
"text-base": "#3b2c59",
"text-weak": "#6c568f",
"text-strong": "#1c1033",
"syntax-string": "#3dd598",
"syntax-primitive": "#ff6bd5",
"syntax-property": "#7a5af8",
"syntax-type": "#f7c948",
"syntax-constant": "#62d4ff",
"syntax-info": "#62d4ff",
"markdown-heading": "#7a5af8",
"markdown-text": "#3b2c59",
"markdown-link": "#7a5af8",
"markdown-link-text": "#62d4ff",
"markdown-code": "#3dd598",
"markdown-block-quote": "#f7c948",
"markdown-emph": "#f7c948",
"markdown-strong": "#ff6bd5",
"markdown-horizontal-rule": "#decbed",
"markdown-list-item": "#7a5af8",
"markdown-list-enumeration": "#62d4ff",
"markdown-image": "#7a5af8",
"markdown-image-text": "#62d4ff",
"markdown-code-block": "#7a5af8"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#1a102b", "neutral": "#1a102b",
"ink": "#f5f0ff",
"primary": "#c792ff", "primary": "#c792ff",
"accent": "#ff7ac6",
"success": "#7be0b0", "success": "#7be0b0",
"warning": "#ffd580", "warning": "#ffd580",
"error": "#ff7ac6", "error": "#ff7ac6",
"info": "#7dd4ff", "info": "#7dd4ff",
"interactive": "#c792ff",
"diffAdd": "#53c39f", "diffAdd": "#53c39f",
"diffDelete": "#d85aa0" "diffDelete": "#d85aa0"
},
"overrides": {
"background-base": "#1a102b",
"background-weak": "#1f1434",
"background-strong": "#1c122f",
"background-stronger": "#170e26",
"border-weak-base": "#352552",
"border-weak-hover": "#3a2a5d",
"border-weak-active": "#402f68",
"border-weak-selected": "#463674",
"border-weak-disabled": "#10091b",
"border-weak-focus": "#3d2d65",
"border-base": "#4d3a73",
"border-hover": "#553f7f",
"border-active": "#5d468c",
"border-selected": "#654c99",
"border-disabled": "#150d21",
"border-focus": "#594283",
"border-strong-base": "#7659b0",
"border-strong-hover": "#8262be",
"border-strong-active": "#8e6ccc",
"border-strong-selected": "#9a77da",
"border-strong-disabled": "#1c122c",
"border-strong-focus": "#8666c4",
"surface-diff-add-base": "#142c27",
"surface-diff-delete-base": "#2d1424",
"surface-diff-hidden-base": "#231737",
"text-base": "#f5f0ff",
"text-weak": "#c9b6ff",
"text-strong": "#ffffff",
"syntax-string": "#7be0b0",
"syntax-primitive": "#ff7ac6",
"syntax-property": "#c792ff",
"syntax-type": "#ffd580",
"syntax-constant": "#7dd4ff",
"syntax-info": "#7dd4ff",
"markdown-heading": "#c792ff",
"markdown-text": "#f5f0ff",
"markdown-link": "#c792ff",
"markdown-link-text": "#7dd4ff",
"markdown-code": "#7be0b0",
"markdown-block-quote": "#ffd580",
"markdown-emph": "#ffd580",
"markdown-strong": "#ff7ac6",
"markdown-horizontal-rule": "#2d1d41",
"markdown-list-item": "#c792ff",
"markdown-list-enumeration": "#7dd4ff",
"markdown-image": "#c792ff",
"markdown-image-text": "#7dd4ff",
"markdown-code-block": "#f5f0ff"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Solarized", "name": "Solarized",
"id": "solarized", "id": "solarized",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#fdf6e3", "neutral": "#fdf6e3",
"ink": "#586e75",
"primary": "#268bd2", "primary": "#268bd2",
"accent": "#d33682",
"success": "#859900", "success": "#859900",
"warning": "#b58900", "warning": "#b58900",
"error": "#dc322f", "error": "#dc322f",
"info": "#2aa198", "info": "#2aa198",
"interactive": "#268bd2",
"diffAdd": "#c6dc7a", "diffAdd": "#c6dc7a",
"diffDelete": "#f2a1a1" "diffDelete": "#f2a1a1"
},
"overrides": {
"background-base": "#fdf6e3",
"background-weak": "#f6efda",
"background-strong": "#faf3dc",
"background-stronger": "#f6edd4",
"border-weak-base": "#e3e0cd",
"border-weak-hover": "#d9d4c2",
"border-weak-active": "#cfcab7",
"border-weak-selected": "#c5c0ad",
"border-weak-disabled": "#f2edda",
"border-weak-focus": "#cbc6b2",
"border-base": "#bcb5a0",
"border-hover": "#b1aa96",
"border-active": "#a59f8c",
"border-selected": "#999382",
"border-disabled": "#ede7d4",
"border-focus": "#aca58f",
"border-strong-base": "#8c8572",
"border-strong-hover": "#7f7866",
"border-strong-active": "#716b5b",
"border-strong-selected": "#645f50",
"border-strong-disabled": "#d5cdb8",
"border-strong-focus": "#78715f",
"surface-diff-add-base": "#eef5d6",
"surface-diff-delete-base": "#fde4dd",
"surface-diff-hidden-base": "#e3ecf3",
"text-base": "#586e75",
"text-weak": "#7a8c8e",
"text-strong": "#073642",
"syntax-string": "#859900",
"syntax-primitive": "#d33682",
"syntax-property": "#268bd2",
"syntax-type": "#b58900",
"syntax-constant": "#2aa198",
"syntax-info": "#2aa198",
"markdown-heading": "#268bd2",
"markdown-text": "#586e75",
"markdown-link": "#268bd2",
"markdown-link-text": "#2aa198",
"markdown-code": "#859900",
"markdown-block-quote": "#b58900",
"markdown-emph": "#b58900",
"markdown-strong": "#d33682",
"markdown-horizontal-rule": "#cfd1bf",
"markdown-list-item": "#268bd2",
"markdown-list-enumeration": "#2aa198",
"markdown-image": "#268bd2",
"markdown-image-text": "#2aa198",
"markdown-code-block": "#2aa198"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#002b36", "neutral": "#002b36",
"ink": "#93a1a1",
"primary": "#6c71c4", "primary": "#6c71c4",
"accent": "#d33682",
"success": "#859900", "success": "#859900",
"warning": "#b58900", "warning": "#b58900",
"error": "#dc322f", "error": "#dc322f",
"info": "#2aa198", "info": "#2aa198",
"interactive": "#6c71c4",
"diffAdd": "#4c7654", "diffAdd": "#4c7654",
"diffDelete": "#c34b4b" "diffDelete": "#c34b4b"
},
"overrides": {
"background-base": "#001f27",
"background-weak": "#022733",
"background-strong": "#01222b",
"background-stronger": "#032830",
"border-weak-base": "#20373f",
"border-weak-hover": "#243e47",
"border-weak-active": "#28434f",
"border-weak-selected": "#2d4958",
"border-weak-disabled": "#0f2026",
"border-weak-focus": "#2a4552",
"border-base": "#31505b",
"border-hover": "#365765",
"border-active": "#3c5e70",
"border-selected": "#42657a",
"border-disabled": "#13272e",
"border-focus": "#3a5a6b",
"border-strong-base": "#4a7887",
"border-strong-hover": "#528294",
"border-strong-active": "#5a8ca1",
"border-strong-selected": "#6396ae",
"border-strong-disabled": "#1b323b",
"border-strong-focus": "#56879a",
"surface-diff-add-base": "#0f2f29",
"surface-diff-delete-base": "#321c1c",
"surface-diff-hidden-base": "#0f3844",
"text-base": "#93a1a1",
"text-weak": "#6c7f80",
"text-strong": "#fdf6e3",
"syntax-string": "#859900",
"syntax-primitive": "#d33682",
"syntax-property": "#6c71c4",
"syntax-type": "#b58900",
"syntax-constant": "#2aa198",
"syntax-info": "#2aa198",
"markdown-heading": "#6c71c4",
"markdown-text": "#93a1a1",
"markdown-link": "#6c71c4",
"markdown-link-text": "#2aa198",
"markdown-code": "#859900",
"markdown-block-quote": "#b58900",
"markdown-emph": "#b58900",
"markdown-strong": "#d33682",
"markdown-horizontal-rule": "#0e3b46",
"markdown-list-item": "#6c71c4",
"markdown-list-enumeration": "#2aa198",
"markdown-image": "#6c71c4",
"markdown-image-text": "#2aa198",
"markdown-code-block": "#93a1a1"
} }
} }
} }
+6 -128
View File
@@ -3,153 +3,31 @@
"name": "Tokyonight", "name": "Tokyonight",
"id": "tokyonight", "id": "tokyonight",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#e1e2e7", "neutral": "#e1e2e7",
"ink": "#273153",
"primary": "#2e7de9", "primary": "#2e7de9",
"accent": "#b15c00",
"success": "#587539", "success": "#587539",
"warning": "#8c6c3e", "warning": "#8c6c3e",
"error": "#c94060", "error": "#c94060",
"info": "#007197", "info": "#007197",
"interactive": "#2e7de9",
"diffAdd": "#4f8f7b", "diffAdd": "#4f8f7b",
"diffDelete": "#d05f7c" "diffDelete": "#d05f7c"
},
"overrides": {
"background-base": "#e1e2e7",
"background-weak": "#dee0ea",
"background-strong": "#e5e6ee",
"background-stronger": "#e9eaf1",
"border-weak-base": "#cdd0dc",
"border-weak-hover": "#c3c6d2",
"border-weak-active": "#b9bcc8",
"border-weak-selected": "#aeb2bf",
"border-weak-disabled": "#e6e7ef",
"border-weak-focus": "#b3b6c3",
"border-base": "#a7abbb",
"border-hover": "#9ba0b1",
"border-active": "#9095a8",
"border-selected": "#83889e",
"border-disabled": "#dedfe6",
"border-focus": "#9599a8",
"border-strong-base": "#757b90",
"border-strong-hover": "#6a7084",
"border-strong-active": "#5f6578",
"border-strong-selected": "#545a6d",
"border-strong-disabled": "#c4c6d0",
"border-strong-focus": "#666b7f",
"surface-diff-add-base": "#dfe7da",
"surface-diff-delete-base": "#f4dadd",
"surface-diff-hidden-base": "#cfd1dd",
"text-base": "#273153",
"text-weak": "#5c6390",
"text-strong": "#1c2544",
"syntax-string": "#587539",
"syntax-primitive": "#b15c00",
"syntax-property": "#9854f1",
"syntax-type": "#3760bf",
"syntax-constant": "#007197",
"syntax-info": "#007197",
"markdown-heading": "#9854f1",
"markdown-text": "#273153",
"markdown-link": "#2e7de9",
"markdown-link-text": "#007197",
"markdown-code": "#587539",
"markdown-block-quote": "#8c6c3e",
"markdown-emph": "#8c6c3e",
"markdown-strong": "#b15c00",
"markdown-horizontal-rule": "#a1a6c5",
"markdown-list-item": "#2e7de9",
"markdown-list-enumeration": "#007197",
"markdown-image": "#2e7de9",
"markdown-image-text": "#007197",
"markdown-code-block": "#3760bf"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#1a1b26", "neutral": "#1a1b26",
"ink": "#c0caf5",
"primary": "#7aa2f7", "primary": "#7aa2f7",
"accent": "#ff9e64",
"success": "#9ece6a", "success": "#9ece6a",
"warning": "#e0af68", "warning": "#e0af68",
"error": "#f7768e", "error": "#f7768e",
"info": "#7dcfff", "info": "#7dcfff",
"interactive": "#7aa2f7",
"diffAdd": "#41a6b5", "diffAdd": "#41a6b5",
"diffDelete": "#c34043" "diffDelete": "#c34043"
},
"overrides": {
"background-base": "#0f111a",
"background-weak": "#111428",
"background-strong": "#101324",
"background-stronger": "#13172a",
"border-weak-base": "#25283b",
"border-weak-hover": "#292c43",
"border-weak-active": "#2e314b",
"border-weak-selected": "#343755",
"border-weak-disabled": "#151727",
"border-weak-focus": "#30324f",
"border-base": "#3a3e57",
"border-hover": "#414264",
"border-active": "#474972",
"border-selected": "#4f507f",
"border-disabled": "#1c1d2d",
"border-focus": "#45496f",
"border-strong-base": "#5a5f82",
"border-strong-hover": "#646994",
"border-strong-active": "#6f74a6",
"border-strong-selected": "#7a7fb8",
"border-strong-disabled": "#23243a",
"border-strong-focus": "#6a6f9f",
"surface-base": "#1f2335",
"base": "#1f2335",
"surface-base-hover": "#232840",
"surface-base-active": "#262c46",
"surface-base-interactive-active": "#2b3357",
"base2": "#1f2335",
"base3": "#1f2335",
"surface-inset-base": "#161a2ab3",
"surface-inset-base-hover": "#161a2acc",
"surface-inset-strong": "#0d111fcc",
"surface-inset-strong-hover": "#0d111fcc",
"surface-raised-base": "#242a42",
"surface-float-base": "#242b45",
"surface-float-base-hover": "#2a3154",
"surface-raised-base-hover": "#272e49",
"surface-raised-base-active": "#2c3353",
"surface-raised-strong": "#31385a",
"surface-raised-strong-hover": "#373f6b",
"surface-raised-stronger": "#3b4261",
"surface-raised-stronger-hover": "#444c82",
"surface-weak": "#1b2033",
"surface-weaker": "#181d2d",
"surface-strong": "#323858",
"surface-raised-stronger-non-alpha": "#2b3150",
"surface-diff-add-base": "#1c2a38",
"surface-diff-delete-base": "#2a1f32",
"surface-diff-hidden-base": "#24283b",
"text-base": "#c0caf5",
"text-weak": "#7a88cf",
"text-strong": "#eaeaff",
"syntax-string": "#9ece6a",
"syntax-primitive": "#ff9e64",
"syntax-property": "#bb9af7",
"syntax-type": "#e0af68",
"syntax-constant": "#7dcfff",
"syntax-info": "#7dcfff",
"markdown-heading": "#bb9af7",
"markdown-text": "#c0caf5",
"markdown-link": "#7aa2f7",
"markdown-link-text": "#7dcfff",
"markdown-code": "#9ece6a",
"markdown-block-quote": "#e0af68",
"markdown-emph": "#e0af68",
"markdown-strong": "#ff9e64",
"markdown-horizontal-rule": "#3b4261",
"markdown-list-item": "#7aa2f7",
"markdown-list-enumeration": "#7dcfff",
"markdown-image": "#7aa2f7",
"markdown-image-text": "#7dcfff",
"markdown-code-block": "#c0caf5"
} }
} }
} }
+6 -104
View File
@@ -3,129 +3,31 @@
"name": "Vesper", "name": "Vesper",
"id": "vesper", "id": "vesper",
"light": { "light": {
"seeds": { "palette": {
"neutral": "#F0F0F0", "neutral": "#F0F0F0",
"ink": "#101010",
"primary": "#FFC799", "primary": "#FFC799",
"accent": "#B30000",
"success": "#99FFE4", "success": "#99FFE4",
"warning": "#FFC799", "warning": "#FFC799",
"error": "#FF8080", "error": "#FF8080",
"info": "#FFC799", "info": "#FFC799",
"interactive": "#FFC799",
"diffAdd": "#99FFE4", "diffAdd": "#99FFE4",
"diffDelete": "#FF8080" "diffDelete": "#FF8080"
},
"overrides": {
"background-base": "#FFF",
"background-weak": "#F8F8F8",
"background-strong": "#F0F0F0",
"background-stronger": "#FBFBFB",
"border-weak-hover": "#E0E0E0",
"border-weak-active": "#D8D8D8",
"border-weak-selected": "#D0D0D0",
"border-weak-disabled": "#F0F0F0",
"border-weak-focus": "#D8D8D8",
"border-base": "#D0D0D0",
"border-hover": "#C8C8C8",
"border-active": "#C0C0C0",
"border-selected": "#B8B8B8",
"border-disabled": "#E8E8E8",
"border-focus": "#C0C0C0",
"border-strong-base": "#A0A0A0",
"border-strong-hover": "#989898",
"border-strong-active": "#909090",
"border-strong-selected": "#888888",
"border-strong-disabled": "#D0D0D0",
"border-strong-focus": "#909090",
"surface-diff-add-base": "#e8f5e8",
"surface-diff-delete-base": "#f5e8e8",
"surface-diff-hidden-base": "#F0F0F0",
"text-base": "#101010",
"text-invert-strong": "var(--smoke-dark-alpha-12)",
"text-weak": "#606060",
"text-strong": "#000000",
"syntax-string": "#0D5C4F",
"syntax-primitive": "#B30000",
"syntax-property": "#C66C00",
"syntax-type": "#9C5C12",
"syntax-constant": "#404040",
"syntax-info": "#606060",
"markdown-heading": "#FFC799",
"markdown-text": "#101010",
"markdown-link": "#FFC799",
"markdown-link-text": "#A0A0A0",
"markdown-code": "#A0A0A0",
"markdown-block-quote": "#101010",
"markdown-emph": "#101010",
"markdown-strong": "#101010",
"markdown-horizontal-rule": "#65737E",
"markdown-list-item": "#101010",
"markdown-list-enumeration": "#101010",
"markdown-image": "#FFC799",
"markdown-image-text": "#A0A0A0",
"markdown-code-block": "#FFC799"
} }
}, },
"dark": { "dark": {
"seeds": { "palette": {
"neutral": "#101010", "neutral": "#101010",
"ink": "#FFF",
"primary": "#FFC799", "primary": "#FFC799",
"accent": "#FF8080",
"success": "#99FFE4", "success": "#99FFE4",
"warning": "#FFC799", "warning": "#FFC799",
"error": "#FF8080", "error": "#FF8080",
"info": "#FFC799", "info": "#FFC799",
"interactive": "#FFC799",
"diffAdd": "#99FFE4", "diffAdd": "#99FFE4",
"diffDelete": "#FF8080" "diffDelete": "#FF8080"
},
"overrides": {
"background-base": "#101010",
"background-weak": "#141414",
"background-strong": "#0C0C0C",
"background-stronger": "#080808",
"border-weak-base": "#1C1C1C",
"border-weak-hover": "#202020",
"border-weak-active": "#242424",
"border-weak-selected": "#282828",
"border-weak-disabled": "#141414",
"border-weak-focus": "#242424",
"border-base": "#282828",
"border-hover": "#303030",
"border-active": "#383838",
"border-selected": "#404040",
"border-disabled": "#181818",
"border-focus": "#383838",
"border-strong-base": "#505050",
"border-strong-hover": "#585858",
"border-strong-active": "#606060",
"border-strong-selected": "#686868",
"border-strong-disabled": "#202020",
"border-strong-focus": "#606060",
"surface-diff-add-base": "#0d2818",
"surface-diff-delete-base": "#281a1a",
"surface-diff-hidden-base": "#141414",
"text-base": "#FFF",
"text-weak": "#A0A0A0",
"text-strong": "#FFFFFF",
"syntax-string": "#99FFE4",
"syntax-primitive": "#FF8080",
"syntax-property": "#FFC799",
"syntax-type": "#FFC799",
"syntax-constant": "#A0A0A0",
"syntax-info": "#8b8b8b",
"markdown-heading": "#FFC799",
"markdown-text": "#FFF",
"markdown-link": "#FFC799",
"markdown-link-text": "#A0A0A0",
"markdown-code": "#A0A0A0",
"markdown-block-quote": "#FFF",
"markdown-emph": "#FFF",
"markdown-strong": "#FFF",
"markdown-horizontal-rule": "#65737E",
"markdown-list-item": "#FFF",
"markdown-list-enumeration": "#FFF",
"markdown-image": "#FFC799",
"markdown-image-text": "#A0A0A0",
"markdown-code-block": "#FFF"
} }
} }
} }
+19 -2
View File
@@ -18,11 +18,28 @@ export interface ThemeSeedColors {
diffDelete: HexColor diffDelete: HexColor
} }
export interface ThemeVariant { export interface ThemePaletteColors {
seeds: ThemeSeedColors neutral: HexColor
ink?: HexColor
primary: HexColor
success: HexColor
warning: HexColor
error: HexColor
info: HexColor
accent?: HexColor
interactive?: HexColor
diffAdd?: HexColor
diffDelete?: HexColor
}
type ThemeVariantBase = {
overrides?: Record<string, ColorValue> overrides?: Record<string, ColorValue>
} }
export type ThemeVariant =
| ({ seeds: ThemeSeedColors; palette?: never } & ThemeVariantBase)
| ({ palette: ThemePaletteColors; seeds?: never } & ThemeVariantBase)
export interface DesktopTheme { export interface DesktopTheme {
$schema?: string $schema?: string
name: string name: string
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@opencode-ai/util", "name": "@opencode-ai/util",
"version": "1.2.17", "version": "1.2.18",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "@opencode-ai/web", "name": "@opencode-ai/web",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"version": "1.2.17", "version": "1.2.18",
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
"dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev",
+15
View File
@@ -59,6 +59,7 @@ OpenCode Zen هو بوابة للذكاء الاصطناعي تتيح لك ال
| النموذج | معرّف النموذج | نقطة النهاية | حزمة AI SDK | | النموذج | معرّف النموذج | نقطة النهاية | حزمة AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -141,6 +142,7 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -184,6 +186,19 @@ https://opencode.ai/zen/v1/models
--- ---
### نماذج مهملة
| النموذج | تاريخ الإيقاف |
| ---------------- | ------------- |
| Qwen3 Coder 480B | 6 فبراير 2026 |
| Kimi K2 Thinking | 6 مارس 2026 |
| Kimi K2 | 6 مارس 2026 |
| MiniMax M2.1 | 15 مارس 2026 |
| GLM 4.7 | 15 مارس 2026 |
| GLM 4.6 | 15 مارس 2026 |
---
## الخصوصية ## الخصوصية
تتم استضافة جميع نماذجنا في الولايات المتحدة. يلتزم مزوّدونا بسياسة عدم الاحتفاظ بالبيانات (zero-retention) ولا يستخدمون بياناتك لتدريب النماذج، مع الاستثناءات التالية: تتم استضافة جميع نماذجنا في الولايات المتحدة. يلتزم مزوّدونا بسياسة عدم الاحتفاظ بالبيانات (zero-retention) ولا يستخدمون بياناتك لتدريب النماذج، مع الاستثناءات التالية:
+15
View File
@@ -55,6 +55,7 @@ Nasim modelima mozete pristupiti i preko sljedecih API endpointa.
| Model | Model ID | Endpoint | AI SDK Package | | Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,6 +137,7 @@ Podrzavamo pay-as-you-go model. Ispod su cijene **po 1M tokena**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -178,6 +180,19 @@ Na primjer, ako postavite mjesecni limit na $20, Zen nece potrositi vise od $20
--- ---
### Zastarjeli modeli
| Model | Datum ukidanja |
| ---------------- | -------------- |
| Qwen3 Coder 480B | 6. feb. 2026. |
| Kimi K2 Thinking | 6. mart 2026. |
| Kimi K2 | 6. mart 2026. |
| MiniMax M2.1 | 15. mart 2026. |
| GLM 4.7 | 15. mart 2026. |
| GLM 4.6 | 15. mart 2026. |
---
## Privatnost ## Privatnost
Svi nasi modeli su hostovani u SAD-u. Provajderi prate zero-retention politiku i ne koriste vase podatke za treniranje modela, uz sljedece izuzetke: Svi nasi modeli su hostovani u SAD-u. Provajderi prate zero-retention politiku i ne koriste vase podatke za treniranje modela, uz sljedece izuzetke:
+15
View File
@@ -64,6 +64,7 @@ Du kan også få adgang til vores modeller gennem følgende API-endpoints.
| Model | Model ID | Endpoint | AI SDK Pakke | | Model | Model ID | Endpoint | AI SDK Pakke |
| ------------------- | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------- | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,6 +148,7 @@ Vi støtter en pay-as-you-go-model. Nedenfor er priserne **per 1 million tokens*
| Gemini 3 Pro (≤ 200K tokens) | $2,00 | $12,00 | $0,20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2,00 | $12,00 | $0,20 | - |
| Gemini 3 Pro (> 200K tokens) | $4,00 | $18,00 | $0,40 | - | | Gemini 3 Pro (> 200K tokens) | $4,00 | $18,00 | $0,40 | - |
| Gemini 3 Flash | $0,50 | $3,00 | $0,05 | - | | Gemini 3 Flash | $0,50 | $3,00 | $0,05 | - |
| GPT 5.4 | $2,50 | $15,00 | $0,25 | - |
| GPT 5.3 Codex | $1,75 | $14,00 | $0,175 | - | | GPT 5.3 Codex | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 | $1,75 | $14,00 | $0,175 | - | | GPT 5.2 | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 Codex | $1,75 | $14,00 | $0,175 | - | | GPT 5.2 Codex | $1,75 | $14,00 | $0,175 | - |
@@ -192,6 +194,19 @@ at opkræve dig mere end $20, hvis din saldo går under $5.
--- ---
### Udfasede modeller
| Model | Udfasningsdato |
| ---------------- | -------------- |
| Qwen3-koder 480B | 6. feb. 2026 |
| Kimi K2 Tenker | 6. marts 2026 |
| Kimi K2 | 6. marts 2026 |
| MiniMax M2.1 | 15. marts 2026 |
| GLM 4.7 | 15. marts 2026 |
| GLM 4.6 | 15. marts 2026 |
---
## Privatliv ## Privatliv
Alle vores modeller er hostet i USA. Vores udbydere følger en nul-opbevaringspolitik og bruger ikke dine data til modeltræning, med følgende undtagelser: Alle vores modeller er hostet i USA. Vores udbydere følger en nul-opbevaringspolitik og bruger ikke dine data til modeltræning, med følgende undtagelser:
+17 -2
View File
@@ -57,6 +57,7 @@ Du kannst unsere Modelle auch ueber die folgenden API-Endpunkte aufrufen.
| Model | Model ID | Endpoint | AI SDK Package | | Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -114,12 +115,12 @@ Unten siehst du die Preise **pro 1 Mio. Tokens**.
| --------------------------------- | ------ | ------ | ----------- | ------------ | | --------------------------------- | ------ | ------ | ----------- | ------------ |
| Big Pickle | Free | Free | Free | - | | Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - | | MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - | | MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - | | MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - | | GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - | | GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - | | GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - | | Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - | | Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - | | Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - | | Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -140,6 +141,7 @@ Unten siehst du die Preise **pro 1 Mio. Tokens**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -184,6 +186,19 @@ Mit aktiviertem Auto-Reload kann die Abrechnung dennoch darueber liegen, falls d
--- ---
### Veraltete Modelle
| Model | Datum der Abschaltung |
| ---------------- | --------------------- |
| Qwen3 Coder 480B | 6. Feb. 2026 |
| Kimi K2 Thinking | 6. Maerz 2026 |
| Kimi K2 | 6. Maerz 2026 |
| MiniMax M2.1 | 15. Maerz 2026 |
| GLM 4.7 | 15. Maerz 2026 |
| GLM 4.6 | 15. Maerz 2026 |
---
## Datenschutz ## Datenschutz
Alle Modelle werden in den USA gehostet. Alle Modelle werden in den USA gehostet.
+15
View File
@@ -62,6 +62,7 @@ También puede acceder a nuestros modelos a través de los siguientes puntos fin
| Modelo | Model ID | Endpoint | AI SDK package | | Modelo | Model ID | Endpoint | AI SDK package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -145,6 +146,7 @@ Apoyamos un modelo de pago por uso. A continuación se muestran los precios **po
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0,20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0,20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0,40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0,40 | - |
| Gemini 3 Flash | $0,50 | $3.00 | $0,05 | - | | Gemini 3 Flash | $0,50 | $3.00 | $0,05 | - |
| GPT 5.4 | $2,50 | $15,00 | $0,25 | - |
| GPT 5.3 Codex | $1,75 | $14.00 | $0,175 | - | | GPT 5.3 Codex | $1,75 | $14.00 | $0,175 | - |
| GPT 5.2 | $1,75 | $14.00 | $0,175 | - | | GPT 5.2 | $1,75 | $14.00 | $0,175 | - |
| GPT 5.2 Codex | $1,75 | $14.00 | $0,175 | - | | GPT 5.2 Codex | $1,75 | $14.00 | $0,175 | - |
@@ -190,6 +192,19 @@ cobrarle más de $20 si su saldo es inferior a $5.
--- ---
### Modelos obsoletos
| Modelo | Fecha de retiro |
| ---------------- | ------------------- |
| Qwen3 Coder 480B | 6 de feb. de 2026 |
| Kimi K2 Thinking | 6 de marzo de 2026 |
| Kimi K2 | 6 de marzo de 2026 |
| MiniMax M2.1 | 15 de marzo de 2026 |
| GLM 4.7 | 15 de marzo de 2026 |
| GLM 4.6 | 15 de marzo de 2026 |
---
## Privacidad ## Privacidad
Todos nuestros modelos están alojados en los EE. UU. Nuestros proveedores siguen una política de retención cero y no utilizan sus datos para la capacitación de modelos, con las siguientes excepciones: Todos nuestros modelos están alojados en los EE. UU. Nuestros proveedores siguen una política de retención cero y no utilizan sus datos para la capacitación de modelos, con las siguientes excepciones:
+15
View File
@@ -55,6 +55,7 @@ Vous pouvez également accéder à nos modèles via les points de terminaison AP
| Modèle | ID du modèle | Point de terminaison | Package SDK IA | | Modèle | ID du modèle | Point de terminaison | Package SDK IA |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,6 +137,7 @@ Nous soutenons un modèle de paiement à l'utilisation. Vous trouverez ci-dessou
| Gemini 3 Pro (≤ 200K jetons) | 2,00 $ | 12,00 $ | 0,20 $ | - | | Gemini 3 Pro (≤ 200K jetons) | 2,00 $ | 12,00 $ | 0,20 $ | - |
| Gemini 3 Pro (> 200K jetons) | 4,00 $ | 18,00 $ | 0,40 $ | - | | Gemini 3 Pro (> 200K jetons) | 4,00 $ | 18,00 $ | 0,40 $ | - |
| Gemini 3 Flash | 0,50 $ | 3,00 $ | 0,05 $ | - | | Gemini 3 Flash | 0,50 $ | 3,00 $ | 0,05 $ | - |
| GPT 5.4 | 2,50 $ | 15,00 $ | 0,25 $ | - |
| GPT 5.3 Codex | 1,75 $ | 14,00 $ | 0,175 $ | - | | GPT 5.3 Codex | 1,75 $ | 14,00 $ | 0,175 $ | - |
| GPT 5.2 | 1,75 $ | 14,00 $ | 0,175 $ | - | | GPT 5.2 | 1,75 $ | 14,00 $ | 0,175 $ | - |
| GPT 5.2 Codex | 1,75 $ | 14,00 $ | 0,175 $ | - | | GPT 5.2 Codex | 1,75 $ | 14,00 $ | 0,175 $ | - |
@@ -178,6 +180,19 @@ Par exemple, disons que vous définissez une limite d'utilisation mensuelle à 2
--- ---
### Modèles obsolètes
| Modèle | Date de dépréciation |
| ---------------- | -------------------- |
| Qwen3 Coder 480B | 6 février 2026 |
| Kimi K2 Thinking | 6 mars 2026 |
| Kimi K2 | 6 mars 2026 |
| MiniMax M2.1 | 15 mars 2026 |
| GLM 4.7 | 15 mars 2026 |
| GLM 4.6 | 15 mars 2026 |
---
## Confidentialité ## Confidentialité
Tous nos modèles sont hébergés aux États-Unis. Nos fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour la formation de modèles, avec les exceptions suivantes : Tous nos modèles sont hébergés aux États-Unis. Nos fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour la formation de modèles, avec les exceptions suivantes :
+15
View File
@@ -55,6 +55,7 @@ Puoi anche accedere ai nostri modelli tramite i seguenti endpoint API.
| Modello | ID modello | Endpoint | Pacchetto AI SDK | | Modello | ID modello | Endpoint | Pacchetto AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,6 +137,7 @@ Supportiamo un modello pay-as-you-go. Qui sotto trovi i prezzi **per 1M token**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -178,6 +180,19 @@ Per esempio, se imposti un limite mensile a $20, Zen non usera piu di $20 in un
--- ---
### Modelli deprecati
| Modello | Data di deprecazione |
| ---------------- | -------------------- |
| Qwen3 Coder 480B | 6 feb 2026 |
| Kimi K2 Thinking | 6 mar 2026 |
| Kimi K2 | 6 mar 2026 |
| MiniMax M2.1 | 15 mar 2026 |
| GLM 4.7 | 15 mar 2026 |
| GLM 4.6 | 15 mar 2026 |
---
## Privacy ## Privacy
Tutti i nostri modelli sono ospitati negli US. I nostri provider seguono una policy di zero-retention e non usano i tuoi dati per training dei modelli, con le seguenti eccezioni: Tutti i nostri modelli sono ospitati negli US. I nostri provider seguono una policy di zero-retention e non usano i tuoi dati per training dei modelli, con le seguenti eccezioni:
+15
View File
@@ -54,6 +54,7 @@ OpenCode Zen は、OpenCode の他のプロバイダーと同様に機能しま
| Model | Model ID | Endpoint | AI SDK Package | | Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -137,6 +138,7 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -179,6 +181,19 @@ https://opencode.ai/zen/v1/models
--- ---
### 非推奨モデル
| Model | Deprecation date |
| ---------------- | ---------------- |
| Qwen3 Coder 480B | 2026年2月6日 |
| Kimi K2 Thinking | 2026年3月6日 |
| Kimi K2 | 2026年3月6日 |
| MiniMax M2.1 | 2026年3月15日 |
| GLM 4.7 | 2026年3月15日 |
| GLM 4.6 | 2026年3月15日 |
---
## プライバシー ## プライバシー
すべてのモデルは米国でホストされています。当社のプロバイダーはゼロ保持ポリシーに従い、次の例外を除いて、モデルのトレーニングにデータを使用しません。 すべてのモデルは米国でホストされています。当社のプロバイダーはゼロ保持ポリシーに従い、次の例外を除いて、モデルのトレーニングにデータを使用しません。
+17 -2
View File
@@ -55,6 +55,7 @@ OpenCode Zen은 OpenCode의 다른 제공자와 동일한 방식으로 작동합
| 모델 | 모델 ID | 엔드포인트 | AI SDK 패키지 | | 모델 | 모델 ID | 엔드포인트 | AI SDK 패키지 |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -111,12 +112,12 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ------ | ------ | --------- | --------- | | --------------------------------- | ------ | ------ | --------- | --------- |
| Big Pickle | Free | Free | Free | - | | Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - | | MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - | | MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - | | MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - | | GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - | | GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - | | GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - | | Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - | | Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - | | Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - | | Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -137,6 +138,7 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -180,6 +182,19 @@ https://opencode.ai/zen/v1/models
--- ---
### 지원 중단 모델
| 모델 | 지원 중단일 |
| ---------------- | --------------- |
| Qwen3 Coder 480B | 2026년 2월 6일 |
| Kimi K2 Thinking | 2026년 3월 6일 |
| Kimi K2 | 2026년 3월 6일 |
| MiniMax M2.1 | 2026년 3월 15일 |
| GLM 4.7 | 2026년 3월 15일 |
| GLM 4.6 | 2026년 3월 15일 |
---
## 개인정보 보호 ## 개인정보 보호
당사의 모든 모델은 미국에서 호스팅됩니다. 당사 제공자는 데이터 무보존(zero-retention) 정책을 따르며, 아래의 예외를 제외하고는 귀하의 데이터를 모델 학습에 사용하지 않습니다. 당사의 모든 모델은 미국에서 호스팅됩니다. 당사 제공자는 데이터 무보존(zero-retention) 정책을 따르며, 아래의 예외를 제외하고는 귀하의 데이터를 모델 학습에 사용하지 않습니다.
+16 -1
View File
@@ -64,6 +64,7 @@ Du kan også få tilgang til modellene våre gjennom følgende API-endepunkter.
| Modell | Modell ID | Endepunkt | AI SDK Pakke | | Modell | Modell ID | Endepunkt | AI SDK Pakke |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -121,7 +122,7 @@ Vi støtter en pay-as-you-go-modell. Nedenfor er prisene **per 1 million tokens*
| --------------------------------- | ------- | ------ | ------------- | --------------- | | --------------------------------- | ------- | ------ | ------------- | --------------- |
| Big Pickle | Gratis | Gratis | Gratis | - | | Big Pickle | Gratis | Gratis | Gratis | - |
| MiniMax M2.5 Free | Gratis | Gratis | Gratis | - | | MiniMax M2.5 Free | Gratis | Gratis | Gratis | - |
| MiniMax M2.5 | $0,30 | $1,20 | $0,06 | - | | MiniMax M2.5 | $0,30 | $1,20 | $0,06 | $0,375 |
| MiniMax M2.1 | $0,30 | $1,20 | $0,10 | - | | MiniMax M2.1 | $0,30 | $1,20 | $0,10 | - |
| GLM 5 | $1,00 | $3,20 | $0,20 | - | | GLM 5 | $1,00 | $3,20 | $0,20 | - |
| GLM 4.7 | $0,60 | $2,20 | $0,10 | - | | GLM 4.7 | $0,60 | $2,20 | $0,10 | - |
@@ -147,6 +148,7 @@ Vi støtter en pay-as-you-go-modell. Nedenfor er prisene **per 1 million tokens*
| Gemini 3 Pro (≤ 200K tokens) | $2,00 | $12,00 | $0,20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2,00 | $12,00 | $0,20 | - |
| Gemini 3 Pro (> 200K tokens) | $4,00 | $18,00 | $0,40 | - | | Gemini 3 Pro (> 200K tokens) | $4,00 | $18,00 | $0,40 | - |
| Gemini 3 Flash | $0,50 | $3,00 | $0,05 | - | | Gemini 3 Flash | $0,50 | $3,00 | $0,05 | - |
| GPT 5.4 | $2,50 | $15,00 | $0,25 | - |
| GPT 5.3 Codex | $1,75 | $14,00 | $0,175 | - | | GPT 5.3 Codex | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 | $1,75 | $14,00 | $0,175 | - | | GPT 5.2 | $1,75 | $14,00 | $0,175 | - |
| GPT 5.2 Codex | $1,75 | $14,00 | $0,175 | - | | GPT 5.2 Codex | $1,75 | $14,00 | $0,175 | - |
@@ -192,6 +194,19 @@ belaster deg mer enn $20 hvis saldoen din går under $5.
--- ---
### Utfasede modeller
| Modell | Utfasingdato |
| ---------------- | ------------- |
| Qwen3 Coder 480B | 6. feb. 2026 |
| Kimi K2 Thinking | 6. mars 2026 |
| Kimi K2 | 6. mars 2026 |
| MiniMax M2.1 | 15. mars 2026 |
| GLM 4.7 | 15. mars 2026 |
| GLM 4.6 | 15. mars 2026 |
---
## Personvern ## Personvern
Alle våre modeller er hostet i USA. Leverandørene våre følger retningslinjer om ingen datalagring og bruker ikke dataene dine til modellopplæring, med følgende unntak: Alle våre modeller er hostet i USA. Leverandørene våre følger retningslinjer om ingen datalagring og bruker ikke dataene dine til modellopplæring, med følgende unntak:
+58 -43
View File
@@ -1,21 +1,21 @@
--- ---
title: Zen title: Zen
description: Wyselekcjonowana lista modeli dostarczonych przez opencode. description: Wyselekcjonowana lista modeli dostarczonych przez OpenCode.
--- ---
import config from "../../../../config.mjs" import config from "../../../config.mjs"
export const console = config.console export const console = config.console
export const email = `mailto:${config.email}` export const email = `mailto:${config.email}`
OpenCode Zen to lista przetestowanych i zweryfikowanych modeli udostępniona przez zespół opencode. OpenCode Zen to lista przetestowanych i zweryfikowanych modeli udostępniona przez zespół OpenCode.
:::note :::note
OpenCode Zen is currently in beta. OpenCode Zen jest obecnie w wersji beta.
::: :::
Zen działa jak każdy inny dostawca opencode. Logujesz się do OpenCode Zen i dostajesz Zen działa jak każdy inny dostawca w OpenCode. Logujesz się do OpenCode Zen i otrzymujesz
Twój klucz API. Jest **całkowicie opcjonalny** i nie musisz go używać, aby z niego korzystać swój klucz API. Jest to **całkowicie opcjonalne** i nie musisz tego używać, aby korzystać z
opencode. OpenCode.
--- ---
@@ -23,23 +23,23 @@ opencode.
Istnieje ogromna liczba modeli, ale tylko kilka z nich Istnieje ogromna liczba modeli, ale tylko kilka z nich
działa dobrze jako agenci kodujący. Dodatkowo większość dostawców jest działa dobrze jako agenci kodujący. Dodatkowo większość dostawców jest
skonfigurowana bardzo różnie; więc otrzymujesz zupełnie inną wydajność i jakość. skonfigurowana bardzo różnie, więc otrzymujesz bardzo różną wydajność i jakość.
:::tip :::tip
Przetestowaliśmy wybraną grupę modeli i dostawców, którzy dobrze współpracują z opencode. Przetestowaliśmy wybraną grupę modeli i dostawców, którzy dobrze współpracują z OpenCode.
::: :::
Jeśli więc używasz modelu za pośrednictwem czegoś takiego jak OpenRouter, nigdy nie będzie to możliwe Jeśli więc używasz modelu za pośrednictwem czegoś takiego jak OpenRouter, nigdy nie możesz być
pewien, czy otrzymujesz najlepszą wersję modelu, jaki chcesz. pewien, czy otrzymujesz najlepszą wersję modelu, jaki chcesz.
Aby to naprawić, zrobiliśmy kilka rzeczy: Aby to naprawić, zrobiliśmy kilka rzeczy:
1. Przetestowaliśmy wybraną grupę modeli i rozmawialiśmy z ich zespołami o tym, jak to zrobić 1. Przetestowaliśmy wybraną grupę modeli i rozmawialiśmy z ich zespołami o tym, jak
najlepiej je uruchom. najlepiej je uruchamiać.
2. Następnie współpracowaliśmy z kilkoma dostawcami, aby upewnić się, że są one obsługiwane 2. Następnie współpracowaliśmy z kilkoma dostawcami, aby upewnić się, że są one obsługiwane
correctly. poprawnie.
3. Na koniec porównaliśmy kombinację modelu/dostawcy i otrzymaliśmy wynik 3. Na koniec sprawdziliśmy wydajność kombinacji modelu/dostawcy i stworzyliśmy
z listą, którą z przyjemnością polecamy. listę, którą z czystym sumieniem polecamy.
OpenCode Zen to brama AI, która zapewnia dostęp do tych modeli. OpenCode Zen to brama AI, która zapewnia dostęp do tych modeli.
@@ -47,14 +47,14 @@ OpenCode Zen to brama AI, która zapewnia dostęp do tych modeli.
## Jak to działa ## Jak to działa
OpenCode Zen działa jak każdy inny dostawca opencode. OpenCode Zen działa jak każdy inny dostawca w OpenCode.
1. Logujesz się do **<a href={console}>OpenCode Zen</a>**, dodajesz swoje rozliczenia 1. Logujesz się do **<a href={console}>OpenCode Zen</a>**, dodajesz dane rozliczeniowe
szczegóły i skopiuj klucz API. i kopiujesz swój klucz API.
2. Uruchamiasz polecenie `/connect` w TUI, wybierasz OpenCode Zen i wklejasz klucz API. 2. Uruchamiasz polecenie `/connect` w TUI, wybierasz OpenCode Zen i wklejasz klucz API.
3. Uruchom `/models` w TUI, aby zobaczyć listę zalecanych przez nas modeli. 3. Uruchom `/models` w TUI, aby zobaczyć listę zalecanych przez nas modeli.
Opłata jest pobierana za każde żądanie i możesz dodać kredyty do swojego konta. Opłata jest pobierana za każde żądanie i możesz dodać środki do swojego konta.
--- ---
@@ -64,6 +64,7 @@ Dostęp do naszych modeli można również uzyskać za pośrednictwem następuj
| Model | Identyfikator modelu | Punkt końcowy | Pakiet SDK AI | | Model | Identyfikator modelu | Punkt końcowy | Pakiet SDK AI |
| ------------------ | -------------------- | -------------------------------------------------- | --------------------------- | | ------------------ | -------------------- | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -97,9 +98,9 @@ Dostęp do naszych modeli można również uzyskać za pośrednictwem następuj
| Qwen3 Coder 480B | qwen3-coder | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | | Qwen3 Coder 480B | qwen3-coder | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | | Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` |
[Identyfikator modelu](/docs/config/#models) w konfiguracji opencode [Identyfikator modelu](/docs/config/#models) w konfiguracji OpenCode
używa formatu `opencode/<model-id>`. Na przykład w przypadku Kodeksu GPT 5.2 zrobiłbyś to używa formatu `opencode/<model-id>`. Na przykład w przypadku GPT 5.2 Codex użyłbyś
użyj `opencode/gpt-5.2-codex` w swojej konfiguracji. `opencode/gpt-5.2-codex` w swojej konfiguracji.
--- ---
@@ -121,12 +122,12 @@ Wspieramy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów**.
| --------------------------------- | ------- | ------- | --------------------------- | -------------------------- | | --------------------------------- | ------- | ------- | --------------------------- | -------------------------- |
| Big Pickle | Free | Free | Free | - | | Big Pickle | Free | Free | Free | - |
| MiniMax M2.5 Free | Free | Free | Free | - | | MiniMax M2.5 Free | Free | Free | Free | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - | | MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - | | MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - | | GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - | | GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - | | GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - | | Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - | | Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - | | Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - | | Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -147,6 +148,7 @@ Wspieramy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -158,10 +160,10 @@ Wspieramy model pay-as-you-go. Poniżej znajdują się ceny **za 1M tokenów**.
| GPT 5 Codex | $1.07 | $8.50 | $0.107 | - | | GPT 5 Codex | $1.07 | $8.50 | $0.107 | - |
| GPT 5 Nano | Free | Free | Free | - | | GPT 5 Nano | Free | Free | Free | - |
Możesz zauważyć _Claude Haiku 3.5_ w swojej historii użytkowania. To jest [model niskokosztowy](/docs/config/#models), który służy do generowania tytułów sesji. Możesz zauważyć _Claude Haiku 3.5_ w swojej historii użytkowania. Jest to [tani model](/docs/config/#models), który jest używany do generowania tytułów Twoich sesji.
:::note :::note
Opłaty za karty kredytowe są przenoszone na koszt (4,4% + 0,30 USD za transakcję); nie pobieramy żadnych dodatkowych opłat. Opłaty za karty kredytowe są przenoszone po kosztach (4,4% + 0,30 USD za transakcję); nie pobieramy nic poza tym.
::: :::
Darmowe modele: Darmowe modele:
@@ -177,18 +179,31 @@ Darmowe modele:
Jeśli Twoje saldo spadnie poniżej 5 USD, Zen automatycznie doładuje 20 USD. Jeśli Twoje saldo spadnie poniżej 5 USD, Zen automatycznie doładuje 20 USD.
Możesz zmienić kwotę automatycznego doładowania. Możesz także całkowicie wyłączyć automatyczne przeładowywanie. Możesz zmienić kwotę automatycznego doładowania. Możesz także całkowicie wyłączyć automatyczne doładowanie.
--- ---
### Limity miesięczne ### Limity miesięczne
Możesz także ustawić miesięczny limit wykorzystania dla całego obszaru roboczego i dla każdego z nich Możesz także ustawić miesięczny limit użytkowania dla całego obszaru roboczego i dla każdego
członek Twojego zespołu. członka Twojego zespołu.
Załóżmy na przykład, że ustawiłeś miesięczny limit użytkowania na 20 USD, Zen nie będzie z niego korzystał Na przykład, jeśli ustawisz miesięczny limit użytkowania na 20 USD, Zen nie zużyje
ponad 20 dolarów miesięcznie. Ale jeśli masz włączone automatyczne przeładowywanie, Zen może się skończyć więcej niż 20 dolarów w miesiącu. Ale jeśli masz włączone automatyczne doładowanie, Zen może
obciąży Cię kwotą wyższą niż 20 USD, jeśli saldo spadnie poniżej 5 USD. obciążyć Cię kwotą wyższą niż 20 USD, jeśli saldo spadnie poniżej 5 USD.
---
### Przestarzałe modele
| Model | Data wycofania |
| ---------------- | -------------- |
| Qwen3 Coder 480B | 6 lutego 2026 |
| Kimi K2 Thinking | 6 marca 2026 |
| Kimi K2 | 6 marca 2026 |
| MiniMax M2.1 | 15 marca 2026 |
| GLM 4.7 | 15 marca 2026 |
| GLM 4.6 | 15 marca 2026 |
--- ---
@@ -198,22 +213,22 @@ Wszystkie nasze modele są hostowane w USA. Nasi dostawcy przestrzegają polityk
- Big Pickle: W okresie bezpłatnym zebrane dane mogą zostać wykorzystane do udoskonalenia modelu. - Big Pickle: W okresie bezpłatnym zebrane dane mogą zostać wykorzystane do udoskonalenia modelu.
- MiniMax M2.5 Free: W okresie bezpłatnym zebrane dane mogą zostać wykorzystane do udoskonalenia modelu. - MiniMax M2.5 Free: W okresie bezpłatnym zebrane dane mogą zostać wykorzystane do udoskonalenia modelu.
- Interfejsy API OpenAI: żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych OpenAI](https://platform.openai.com/docs/guides/your-data). - API OpenAI: Żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych OpenAI](https://platform.openai.com/docs/guides/your-data).
- Interfejsy API Anthropic: żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych firmy Anthropic](https://docs.anthropic.com/en/docs/claude-code/data-usage). - API Anthropic: Żądania są przechowywane przez 30 dni zgodnie z [Zasadami dotyczącymi danych Anthropic](https://docs.anthropic.com/en/docs/claude-code/data-usage).
--- ---
## Dla zespołów ## Dla zespołów
Zen świetnie sprawdza się także w zespołach. Możesz zapraszać członków zespołu, przypisywać role, zarządz Zen działa świetnie także dla zespołów. Możesz zapraszać członków zespołu, przypisywać role, dobier
modele, z których korzysta Twój zespół i nie tylko. modele, z których korzysta Twój zespół i nie tylko.
:::note :::note
Obszary robocze są obecnie bezpłatne dla zespołów w ramach wersji beta. Obszary robocze są obecnie bezpłatne dla zespołów w ramach wersji beta.
::: :::
Zarządzanie obszarem roboczym jest obecnie bezpłatne dla zespołów w ramach wersji beta. Będziemy Zarządzanie obszarem roboczym jest obecnie bezpłatne dla zespołów w ramach wersji beta.
wkrótce udostępnimy więcej szczegółów na temat cen. Wkrótce udostępnimy więcej szczegółów na temat cen.
--- ---
@@ -221,8 +236,8 @@ wkrótce udostępnimy więcej szczegółów na temat cen.
Możesz zapraszać członków zespołu do swojego obszaru roboczego i przypisywać role: Możesz zapraszać członków zespołu do swojego obszaru roboczego i przypisywać role:
- **Administrator**: Zarządzaj modelami, członkami, kluczami API i rozliczeniami - **Admin**: Zarządzanie modelami, członkami, kluczami API i rozliczeniami
- **Członek**: Zarządzaj tylko własnymi kluczami API - **Członek**: Zarządzanie tylko własnymi kluczami API
Administratorzy mogą także ustawić miesięczne limity wydatków dla każdego członka, aby utrzymać koszty pod kontrolą. Administratorzy mogą także ustawić miesięczne limity wydatków dla każdego członka, aby utrzymać koszty pod kontrolą.
@@ -233,7 +248,7 @@ Administratorzy mogą także ustawić miesięczne limity wydatków dla każdego
Administratorzy mogą włączać i wyłączać określone modele w obszarze roboczym. Żądania skierowane do wyłączonego modelu zwrócą błąd. Administratorzy mogą włączać i wyłączać określone modele w obszarze roboczym. Żądania skierowane do wyłączonego modelu zwrócą błąd.
Jest to przydatne w przypadkach, gdy chcesz wyłączyć korzystanie z modelu, który Jest to przydatne w przypadkach, gdy chcesz wyłączyć korzystanie z modelu, który
collects data. zbiera dane.
--- ---
@@ -253,6 +268,6 @@ i chcesz go używać zamiast tego, który zapewnia Zen.
Stworzyliśmy OpenCode Zen, aby: Stworzyliśmy OpenCode Zen, aby:
1. **Testować** (Benchmark) najlepsze modele/dostawców dla agentów kodujących. 1. **Testować** (Benchmark) najlepsze modele/dostawców dla agentów kodujących.
2. Miej dostęp do opcji **najwyższej jakości**, a nie obniżaj wydajności ani nie kieruj się do tańszych dostawców. 2. Mieć dostęp do opcji **najwyższej jakości**, a nie obniżać wydajności ani nie kierować do tańszych dostawców.
3. Przekaż wszelkie **obniżki cen**, sprzedając po kosztach; więc jedyną marżą jest pokrycie naszych opłat manipulacyjnych. 3. Przekazywać wszelkie **obniżki cen**, sprzedając po kosztach; więc jedyną marżą jest pokrycie naszych opłat manipulacyjnych.
4. Nie **nie blokuj**, umożliwiając używanie go z dowolnym innym agentem kodującym. I zawsze pozwalaj na korzystanie z opencode dowolnego innego dostawcy. 4. Nie **mieć blokady** (no lock-in), umożliwiając używanie go z dowolnym innym agentem kodującym. I zawsze pozwalać na korzystanie z dowolnego innego dostawcy w OpenCode.
@@ -55,6 +55,7 @@ Você também pode acessar nossos modelos através dos seguintes endpoints da AP
| Modelo | ID do Modelo | Endpoint | Pacote AI SDK | | Modelo | ID do Modelo | Endpoint | Pacote AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,6 +137,7 @@ Nós suportamos um modelo de pagamento conforme o uso. Abaixo estão os preços
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -178,6 +180,19 @@ Por exemplo, digamos que você defina um limite de uso mensal de $20, o Zen não
--- ---
### Modelos obsoletos
| Modelo | Data de descontinuação |
| ---------------- | ---------------------- |
| Qwen3 Coder 480B | 6 de fev. de 2026 |
| Kimi K2 Thinking | 6 de mar. de 2026 |
| Kimi K2 | 6 de mar. de 2026 |
| MiniMax M2.1 | 15 de mar. de 2026 |
| GLM 4.7 | 15 de mar. de 2026 |
| GLM 4.6 | 15 de mar. de 2026 |
---
## Privacidade ## Privacidade
Todos os nossos modelos estão hospedados nos EUA. Nossos provedores seguem uma política de zero retenção e não usam seus dados para treinamento de modelos, com as seguintes exceções: Todos os nossos modelos estão hospedados nos EUA. Nossos provedores seguem uma política de zero retenção e não usam seus dados para treinamento de modelos, com as seguintes exceções:
+15
View File
@@ -63,6 +63,7 @@ OpenCode Zen работает так же, как и любой другой п
| Модель | Идентификатор модели | Конечная точка | Пакет AI SDK | | Модель | Идентификатор модели | Конечная точка | Пакет AI SDK |
| ------------------ | -------------------- | -------------------------------------------------- | --------------------------- | | ------------------ | -------------------- | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -146,6 +147,7 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200 тыс. токенов) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200 тыс. токенов) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200 тыс. токенов) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200 тыс. токенов) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -191,6 +193,19 @@ https://opencode.ai/zen/v1/models
--- ---
### Устаревшие модели
| Модель | Дата отключения |
| ---------------- | ---------------- |
| Qwen3 Coder 480B | 6 февр. 2026 г. |
| Kimi K2 Thinking | 6 марта 2026 г. |
| Kimi K2 | 6 марта 2026 г. |
| MiniMax M2.1 | 15 марта 2026 г. |
| GLM 4.7 | 15 марта 2026 г. |
| GLM 4.6 | 15 марта 2026 г. |
---
## Конфиденциальность ## Конфиденциальность
Все наши модели размещены в США. Наши поставщики придерживаются политики нулевого хранения и не используют ваши данные для обучения моделей, за следующими исключениями: Все наши модели размещены в США. Наши поставщики придерживаются политики нулевого хранения и не используют ваши данные для обучения моделей, за следующими исключениями:
+18 -3
View File
@@ -64,6 +64,7 @@ OpenCode Zen ทำงานเหมือนกับผู้ให้บร
| Model | Model ID | Endpoint | แพ็คเกจ AI SDK | | Model | Model ID | Endpoint | แพ็คเกจ AI SDK |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -121,12 +122,12 @@ https://opencode.ai/zen/v1/models
| --------------------------------- | ---------- | -------- | ------- | ---------- | | --------------------------------- | ---------- | -------- | ------- | ---------- |
| Big Pickle | ฟรี | ฟรี | ฟรี | - | | Big Pickle | ฟรี | ฟรี | ฟรี | - |
| MiniMax M2.5 Free | ฟรี | ฟรี | ฟรี | - | | MiniMax M2.5 Free | ฟรี | ฟรี | ฟรี | - |
| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - | | MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 |
| MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - | | MiniMax M2.1 | $0.30 | $1.20 | $0.10 | - |
| GLM 5 | $1.00 | $3.20 | $0.20 | - | | GLM 5 | $1.00 | $3.20 | $0.20 | - |
| GLM 4.7 | $0.60 | $2.20 | $0.10 | - | | GLM 4.7 | $0.60 | $2.20 | $0.10 | - |
| GLM 4.6 | $0.60 | $2.20 | $0.10 | - | | GLM 4.6 | $0.60 | $2.20 | $0.10 | - |
| Kimi K2.5 | $0.60 | $3.00 | $0.08 | - | | Kimi K2.5 | $0.60 | $3.00 | $0.10 | - |
| Kimi K2 Thinking | $0.40 | $2.50 | - | - | | Kimi K2 Thinking | $0.40 | $2.50 | - | - |
| Kimi K2 | $0.40 | $2.50 | - | - | | Kimi K2 | $0.40 | $2.50 | - | - |
| Qwen3 Coder 480B | $0.45 | $1.50 | - | - | | Qwen3 Coder 480B | $0.45 | $1.50 | - | - |
@@ -147,6 +148,7 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -192,11 +194,24 @@ https://opencode.ai/zen/v1/models
--- ---
### โมเดลที่เลิกใช้แล้ว
| Model | วันที่เลิกใช้ |
| ---------------- | ------------- |
| Qwen3 Coder 480B | 6 ก.พ. 2026 |
| Kimi K2 Thinking | 6 มี.ค. 2026 |
| Kimi K2 | 6 มี.ค. 2026 |
| MiniMax M2.1 | 15 มี.ค. 2026 |
| GLM 4.7 | 15 มี.ค. 2026 |
| GLM 4.6 | 15 มี.ค. 2026 |
---
## ความเป็นส่วนตัว ## ความเป็นส่วนตัว
โมเดลทั้งหมดของเราโฮสต์ในสหรัฐอเมริกา ผู้ให้บริการของเราปฏิบัติตามนโยบายการเก็บรักษาเป็นศูนย์ และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมีข้อยกเว้นต่อไปนี้: โมเดลทั้งหมดของเราโฮสต์ในสหรัฐอเมริกา ผู้ให้บริการของเราปฏิบัติตามนโยบายการเก็บรักษาเป็นศูนย์ และไม่ใช้ข้อมูลของคุณสำหรับการฝึกโมเดล โดยมีข้อยกเว้นต่อไปนี้:
- Big Pickle: ในช่วงระยะเวลาว่าง ข้อมูลที่รวบรวมอาจนำไปใช้ในการปรับปรุงโมเดลได้ - Big Pickle: ในช่วงระยะเวลาฟรี ข้อมูลที่รวบรวมอาจนำไปใช้ในการปรับปรุงโมเดลได้
- MiniMax M2.5 Free: ในช่วงระยะเวลาฟรี ข้อมูลที่รวบรวมอาจนำไปใช้ในการปรับปรุงโมเดล - MiniMax M2.5 Free: ในช่วงระยะเวลาฟรี ข้อมูลที่รวบรวมอาจนำไปใช้ในการปรับปรุงโมเดล
- OpenAI API: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [นโยบายข้อมูลของ OpenAI](https://platform.openai.com/docs/guides/your-data) - OpenAI API: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [นโยบายข้อมูลของ OpenAI](https://platform.openai.com/docs/guides/your-data)
- Anthropic API: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [นโยบายข้อมูลของ Anthropic](https://docs.anthropic.com/en/docs/claude-code/data-usage) - Anthropic API: คำขอจะถูกเก็บไว้เป็นเวลา 30 วันตาม [นโยบายข้อมูลของ Anthropic](https://docs.anthropic.com/en/docs/claude-code/data-usage)
+15
View File
@@ -55,6 +55,7 @@ Modellerimize aşağıdaki API uç noktaları aracılığıyla da erişebilirsin
| Model | Model ID | Endpoint | AI SDK Package | | Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,6 +137,7 @@ Kullandıkça öde modelini destekliyoruz. Aşağıda **1 milyon token başına*
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -178,6 +180,19 @@ Ayrıca tüm çalışma alanı ve ekibinizin her üyesi için aylık kullanım l
--- ---
### Kullanımdan kaldırılan modeller
| Model | Kullanımdan kaldırılma tarihi |
| ---------------- | ----------------------------- |
| Qwen3 Coder 480B | 6 Şub 2026 |
| Kimi K2 Thinking | 6 Mar 2026 |
| Kimi K2 | 6 Mar 2026 |
| MiniMax M2.1 | 15 Mar 2026 |
| GLM 4.7 | 15 Mar 2026 |
| GLM 4.6 | 15 Mar 2026 |
---
## Gizlilik ## Gizlilik
Tüm modellerimiz ABD'de barındırılmaktadır. Sağlayıcılarımız sıfır saklama politikasını izler ve aşağıdaki istisnalar dışında verilerinizi model eğitimi için kullanmaz: Tüm modellerimiz ABD'de barındırılmaktadır. Sağlayıcılarımız sıfır saklama politikasını izler ve aşağıdaki istisnalar dışında verilerinizi model eğitimi için kullanmaz:
+2
View File
@@ -64,6 +64,7 @@ You can also access our models through the following API endpoints.
| Model | Model ID | Endpoint | AI SDK Package | | Model | Model ID | Endpoint | AI SDK Package |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -147,6 +148,7 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**.
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -55,6 +55,7 @@ OpenCode Zen 的工作方式与 OpenCode 中的任何其他提供商相同。
| 模型 | 模型 ID | 端点 | AI SDK 包 | | 模型 | 模型 ID | 端点 | AI SDK 包 |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,6 +137,7 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -178,6 +180,19 @@ https://opencode.ai/zen/v1/models
--- ---
### 已弃用模型
| 模型 | 弃用日期 |
| ---------------- | ------------------ |
| Qwen3 Coder 480B | 2026 年 2 月 6 日 |
| Kimi K2 Thinking | 2026 年 3 月 6 日 |
| Kimi K2 | 2026 年 3 月 6 日 |
| MiniMax M2.1 | 2026 年 3 月 15 日 |
| GLM 4.7 | 2026 年 3 月 15 日 |
| GLM 4.6 | 2026 年 3 月 15 日 |
---
## 隐私 ## 隐私
我们所有的模型都托管在美国。我们的提供商遵循零保留政策,不会将你的数据用于模型训练,但以下情况除外: 我们所有的模型都托管在美国。我们的提供商遵循零保留政策,不会将你的数据用于模型训练,但以下情况除外:
@@ -55,6 +55,7 @@ OpenCode Zen 的工作方式與 OpenCode 中的任何其他供應商相同。
| 模型 | 模型 ID | 端點 | AI SDK 套件 | | 模型 | 模型 ID | 端點 | AI SDK 套件 |
| ------------------ | ------------------ | -------------------------------------------------- | --------------------------- | | ------------------ | ------------------ | -------------------------------------------------- | --------------------------- |
| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | | GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` |
@@ -136,6 +137,7 @@ https://opencode.ai/zen/v1/models
| Gemini 3 Pro (≤ 200K Token) | $2.00 | $12.00 | $0.20 | - | | Gemini 3 Pro (≤ 200K Token) | $2.00 | $12.00 | $0.20 | - |
| Gemini 3 Pro (> 200K Token) | $4.00 | $18.00 | $0.40 | - | | Gemini 3 Pro (> 200K Token) | $4.00 | $18.00 | $0.40 | - |
| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | | Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - |
| GPT 5.4 | $2.50 | $15.00 | $0.25 | - |
| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 | $1.75 | $14.00 | $0.175 | - |
| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | | GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - |
@@ -178,6 +180,19 @@ https://opencode.ai/zen/v1/models
--- ---
### 已棄用的模型
| 模型 | 棄用日期 |
| ---------------- | ------------------ |
| Qwen3 Coder 480B | 2026 年 2 月 6 日 |
| Kimi K2 Thinking | 2026 年 3 月 6 日 |
| Kimi K2 | 2026 年 3 月 6 日 |
| MiniMax M2.1 | 2026 年 3 月 15 日 |
| GLM 4.7 | 2026 年 3 月 15 日 |
| GLM 4.6 | 2026 年 3 月 15 日 |
---
## 隱私 ## 隱私
我們所有的模型都託管在美國。我們的供應商遵循零保留政策,不會將你的資料用於模型訓練,但以下情況除外: 我們所有的模型都託管在美國。我們的供應商遵循零保留政策,不會將你的資料用於模型訓練,但以下情況除外:
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "opencode", "name": "opencode",
"displayName": "opencode", "displayName": "opencode",
"description": "opencode for VS Code", "description": "opencode for VS Code",
"version": "1.2.17", "version": "1.2.18",
"publisher": "sst-dev", "publisher": "sst-dev",
"repository": { "repository": {
"type": "git", "type": "git",