chore: initialize qiming workspace repository
This commit is contained in:
286
qimingcode/packages/ui/src/theme/color.ts
Normal file
286
qimingcode/packages/ui/src/theme/color.ts
Normal file
@@ -0,0 +1,286 @@
|
||||
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 } {
|
||||
const h = hex.replace("#", "")
|
||||
const full =
|
||||
h.length === 3 || h.length === 4
|
||||
? h
|
||||
.split("")
|
||||
.map((c) => c + c)
|
||||
.join("")
|
||||
: h
|
||||
const rgb = full.length === 8 ? full.slice(0, 6) : full
|
||||
|
||||
const num = parseInt(rgb, 16)
|
||||
return {
|
||||
r: ((num >> 16) & 255) / 255,
|
||||
g: ((num >> 8) & 255) / 255,
|
||||
b: (num & 255) / 255,
|
||||
}
|
||||
}
|
||||
|
||||
export function rgbToHex(r: number, g: number, b: number): HexColor {
|
||||
const toHex = (v: number) => {
|
||||
const clamped = clamp(v, 0, 1)
|
||||
const int = Math.round(clamped * 255)
|
||||
return int.toString(16).padStart(2, "0")
|
||||
}
|
||||
return `#${toHex(r)}${toHex(g)}${toHex(b)}`
|
||||
}
|
||||
|
||||
function linearToSrgb(c: number): number {
|
||||
if (c <= 0.0031308) return c * 12.92
|
||||
return 1.055 * Math.pow(c, 1 / 2.4) - 0.055
|
||||
}
|
||||
|
||||
function srgbToLinear(c: number): number {
|
||||
if (c <= 0.04045) return c / 12.92
|
||||
return Math.pow((c + 0.055) / 1.055, 2.4)
|
||||
}
|
||||
|
||||
export function rgbToOklch(r: number, g: number, b: number): OklchColor {
|
||||
const lr = srgbToLinear(r)
|
||||
const lg = srgbToLinear(g)
|
||||
const lb = srgbToLinear(b)
|
||||
|
||||
const l_ = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb
|
||||
const m_ = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb
|
||||
const s_ = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb
|
||||
|
||||
const l = Math.cbrt(l_)
|
||||
const m = Math.cbrt(m_)
|
||||
const s = Math.cbrt(s_)
|
||||
|
||||
const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s
|
||||
const a = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s
|
||||
const bOk = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s
|
||||
|
||||
const C = Math.sqrt(a * a + bOk * bOk)
|
||||
let H = Math.atan2(bOk, a) * (180 / Math.PI)
|
||||
if (H < 0) H += 360
|
||||
|
||||
return { l: L, c: C, h: H }
|
||||
}
|
||||
|
||||
export function oklchToRgb(oklch: OklchColor): { r: number; g: number; b: number } {
|
||||
const { l: L, c: C, h: H } = oklch
|
||||
|
||||
const a = C * Math.cos((H * Math.PI) / 180)
|
||||
const b = C * Math.sin((H * Math.PI) / 180)
|
||||
|
||||
const l = L + 0.3963377774 * a + 0.2158037573 * b
|
||||
const m = L - 0.1055613458 * a - 0.0638541728 * b
|
||||
const s = L - 0.0894841775 * a - 1.291485548 * b
|
||||
|
||||
const l3 = l * l * l
|
||||
const m3 = m * m * m
|
||||
const s3 = s * s * s
|
||||
|
||||
const lr = 4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3
|
||||
const lg = -1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3
|
||||
const lb = -0.0041960863 * l3 - 0.7034186147 * m3 + 1.707614701 * s3
|
||||
|
||||
return {
|
||||
r: linearToSrgb(lr),
|
||||
g: linearToSrgb(lg),
|
||||
b: linearToSrgb(lb),
|
||||
}
|
||||
}
|
||||
|
||||
export function hexToOklch(hex: HexColor): OklchColor {
|
||||
const { r, g, b } = hexToRgb(hex)
|
||||
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 {
|
||||
const { r, g, b } = oklchToRgb(fitOklch(oklch))
|
||||
return rgbToHex(r, g, b)
|
||||
}
|
||||
|
||||
export function generateScale(seed: HexColor, isDark: boolean): HexColor[] {
|
||||
const base = hexToOklch(seed)
|
||||
const scale: HexColor[] = []
|
||||
|
||||
const lightSteps = isDark
|
||||
? [
|
||||
0.118,
|
||||
0.138,
|
||||
0.167,
|
||||
0.202,
|
||||
0.246,
|
||||
0.304,
|
||||
0.378,
|
||||
0.468,
|
||||
clamp(base.l * 0.825, 0.53, 0.705),
|
||||
clamp(base.l * 0.89, 0.61, 0.79),
|
||||
clamp(base.l + 0.033, 0.868, 0.943),
|
||||
0.984,
|
||||
]
|
||||
: [0.993, 0.983, 0.962, 0.936, 0.906, 0.866, 0.811, 0.74, base.l, Math.max(0, base.l - 0.036), 0.49, 0.27]
|
||||
|
||||
const chromaMultipliers = isDark
|
||||
? [0.52, 0.68, 0.86, 1.02, 1.14, 1.24, 1.36, 1.48, 1.56, 1.64, 1.62, 1.15]
|
||||
: [0.12, 0.24, 0.46, 0.68, 0.84, 0.98, 1.08, 1.16, 1.22, 1.26, 1.18, 0.98]
|
||||
|
||||
for (let i = 0; i < 12; i++) {
|
||||
scale.push(
|
||||
oklchToHex({
|
||||
l: lightSteps[i],
|
||||
c: base.c * chromaMultipliers[i],
|
||||
h: base.h,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
return scale
|
||||
}
|
||||
|
||||
export function generateNeutralScale(seed: HexColor, isDark: boolean, ink?: HexColor): HexColor[] {
|
||||
if (ink) {
|
||||
const base = hexToOklch(seed)
|
||||
const lift = (tone: number) =>
|
||||
oklchToHex({
|
||||
l: base.l + (1 - base.l) * tone,
|
||||
c: base.c * Math.max(0, 1 - tone),
|
||||
h: base.h,
|
||||
})
|
||||
const sink = (tone: number) =>
|
||||
oklchToHex({
|
||||
l: base.l * (1 - tone),
|
||||
c: base.c * Math.max(0, 1 - tone * (isDark ? 0.12 : 0.3)),
|
||||
h: base.h,
|
||||
})
|
||||
const bg = isDark
|
||||
? sink(clamp(0.19 + Math.max(0, base.l - 0.12) * 0.33 + base.c * 1.95, 0.17, 0.27))
|
||||
: base.l < 0.82
|
||||
? lift(0.86)
|
||||
: lift(clamp(0.1 + base.c * 3.2 + Math.max(0, 0.95 - base.l) * 0.35, 0.1, 0.28))
|
||||
const steps = isDark
|
||||
? [0, 0.018, 0.039, 0.064, 0.097, 0.143, 0.212, 0.31, 0.46, 0.649, 0.845, 0.984]
|
||||
: [0, 0.022, 0.042, 0.068, 0.102, 0.146, 0.208, 0.296, 0.432, 0.61, 0.81, 0.965]
|
||||
return steps.map((step) => mixColors(bg, ink, step))
|
||||
}
|
||||
|
||||
const base = hexToOklch(seed)
|
||||
const scale: HexColor[] = []
|
||||
const neutralChroma = Math.min(base.c, isDark ? 0.068 : 0.04)
|
||||
|
||||
const lightSteps = isDark
|
||||
? [0.138, 0.156, 0.178, 0.202, 0.232, 0.272, 0.326, 0.404, clamp(base.l * 0.83, 0.43, 0.55), 0.596, 0.719, 0.956]
|
||||
: [0.991, 0.979, 0.964, 0.946, 0.931, 0.913, 0.891, 0.83, base.l, 0.617, 0.542, 0.205]
|
||||
|
||||
for (let i = 0; i < 12; i++) {
|
||||
scale.push(
|
||||
oklchToHex({
|
||||
l: lightSteps[i],
|
||||
c: neutralChroma,
|
||||
h: base.h,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
return scale
|
||||
}
|
||||
|
||||
export function generateAlphaScale(scale: HexColor[], isDark: boolean): HexColor[] {
|
||||
const alphas = isDark
|
||||
? [0.02, 0.04, 0.08, 0.12, 0.16, 0.2, 0.26, 0.36, 0.44, 0.52, 0.76, 0.96]
|
||||
: [0.01, 0.03, 0.06, 0.09, 0.12, 0.15, 0.2, 0.28, 0.48, 0.56, 0.64, 0.88]
|
||||
|
||||
return scale.map((hex, i) => {
|
||||
const { r, g, b } = hexToRgb(hex)
|
||||
const a = alphas[i]
|
||||
|
||||
const bg = isDark ? 0 : 1
|
||||
const blendedR = r * a + bg * (1 - a)
|
||||
const blendedG = g * a + bg * (1 - a)
|
||||
const blendedB = b * a + bg * (1 - a)
|
||||
|
||||
return rgbToHex(blendedR, blendedG, blendedB)
|
||||
})
|
||||
}
|
||||
|
||||
export function mixColors(color1: HexColor, color2: HexColor, amount: number): HexColor {
|
||||
const c1 = hexToOklch(color1)
|
||||
const c2 = hexToOklch(color2)
|
||||
const delta = ((((c2.h - c1.h) % 360) + 540) % 360) - 180
|
||||
|
||||
return oklchToHex({
|
||||
l: c1.l + (c2.l - c1.l) * amount,
|
||||
c: c1.c + (c2.c - c1.c) * 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 {
|
||||
const oklch = hexToOklch(color)
|
||||
return oklchToHex({
|
||||
...oklch,
|
||||
l: clamp(oklch.l + amount, 0, 1),
|
||||
})
|
||||
}
|
||||
|
||||
export function darken(color: HexColor, amount: number): HexColor {
|
||||
const oklch = hexToOklch(color)
|
||||
return oklchToHex({
|
||||
...oklch,
|
||||
l: clamp(oklch.l - amount, 0, 1),
|
||||
})
|
||||
}
|
||||
|
||||
export function withAlpha(color: HexColor, alpha: number): string {
|
||||
const { r, g, b } = hexToRgb(color)
|
||||
return `rgba(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)}, ${alpha})`
|
||||
}
|
||||
359
qimingcode/packages/ui/src/theme/context.tsx
Normal file
359
qimingcode/packages/ui/src/theme/context.tsx
Normal file
@@ -0,0 +1,359 @@
|
||||
import { createEffect, onMount } from "solid-js"
|
||||
import { createStore } from "solid-js/store"
|
||||
import { makeEventListener } from "@solid-primitives/event-listener"
|
||||
import { createSimpleContext } from "../context/helper"
|
||||
import oc2ThemeJson from "./themes/oc-2.json"
|
||||
import { resolveThemeVariant, themeToCss } from "./resolve"
|
||||
import type { DesktopTheme } from "./types"
|
||||
|
||||
export type ColorScheme = "light" | "dark" | "system"
|
||||
|
||||
const STORAGE_KEYS = {
|
||||
THEME_ID: "opencode-theme-id",
|
||||
COLOR_SCHEME: "opencode-color-scheme",
|
||||
THEME_CSS_LIGHT: "opencode-theme-css-light",
|
||||
THEME_CSS_DARK: "opencode-theme-css-dark",
|
||||
} as const
|
||||
|
||||
const THEME_STYLE_ID = "oc-theme"
|
||||
let files: Record<string, () => Promise<{ default: DesktopTheme }>> | undefined
|
||||
let ids: string[] | undefined
|
||||
let known: Set<string> | undefined
|
||||
|
||||
function getFiles() {
|
||||
if (files) return files
|
||||
files = import.meta.glob<{ default: DesktopTheme }>("./themes/*.json")
|
||||
return files
|
||||
}
|
||||
|
||||
function themeIDs() {
|
||||
if (ids) return ids
|
||||
ids = Object.keys(getFiles())
|
||||
.map((path) => path.slice("./themes/".length, -".json".length))
|
||||
.sort()
|
||||
return ids
|
||||
}
|
||||
|
||||
function knownThemes() {
|
||||
if (known) return known
|
||||
known = new Set(themeIDs())
|
||||
return known
|
||||
}
|
||||
|
||||
const names: Record<string, string> = {
|
||||
"oc-2": "OC-2",
|
||||
amoled: "AMOLED",
|
||||
aura: "Aura",
|
||||
ayu: "Ayu",
|
||||
carbonfox: "Carbonfox",
|
||||
catppuccin: "Catppuccin",
|
||||
"catppuccin-frappe": "Catppuccin Frappe",
|
||||
"catppuccin-macchiato": "Catppuccin Macchiato",
|
||||
cobalt2: "Cobalt2",
|
||||
cursor: "Cursor",
|
||||
dracula: "Dracula",
|
||||
everforest: "Everforest",
|
||||
flexoki: "Flexoki",
|
||||
github: "GitHub",
|
||||
gruvbox: "Gruvbox",
|
||||
kanagawa: "Kanagawa",
|
||||
"lucent-orng": "Lucent Orng",
|
||||
material: "Material",
|
||||
matrix: "Matrix",
|
||||
mercury: "Mercury",
|
||||
monokai: "Monokai",
|
||||
nightowl: "Night Owl",
|
||||
nord: "Nord",
|
||||
"one-dark": "One Dark",
|
||||
onedarkpro: "One Dark Pro",
|
||||
opencode: "OpenCode",
|
||||
orng: "Orng",
|
||||
"osaka-jade": "Osaka Jade",
|
||||
palenight: "Palenight",
|
||||
rosepine: "Rose Pine",
|
||||
shadesofpurple: "Shades of Purple",
|
||||
solarized: "Solarized",
|
||||
synthwave84: "Synthwave '84",
|
||||
tokyonight: "Tokyonight",
|
||||
vercel: "Vercel",
|
||||
vesper: "Vesper",
|
||||
zenburn: "Zenburn",
|
||||
}
|
||||
const oc2Theme = oc2ThemeJson as DesktopTheme
|
||||
|
||||
function normalize(id: string | null | undefined) {
|
||||
return id === "oc-1" ? "oc-2" : id
|
||||
}
|
||||
|
||||
function read(key: string) {
|
||||
if (typeof localStorage !== "object") return null
|
||||
try {
|
||||
return localStorage.getItem(key)
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
function write(key: string, value: string) {
|
||||
if (typeof localStorage !== "object") return
|
||||
try {
|
||||
localStorage.setItem(key, value)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
function drop(key: string) {
|
||||
if (typeof localStorage !== "object") return
|
||||
try {
|
||||
localStorage.removeItem(key)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
function clear() {
|
||||
drop(STORAGE_KEYS.THEME_CSS_LIGHT)
|
||||
drop(STORAGE_KEYS.THEME_CSS_DARK)
|
||||
}
|
||||
|
||||
function ensureThemeStyleElement(): HTMLStyleElement {
|
||||
const existing = document.getElementById(THEME_STYLE_ID) as HTMLStyleElement | null
|
||||
if (existing) return existing
|
||||
const element = document.createElement("style")
|
||||
element.id = THEME_STYLE_ID
|
||||
document.head.appendChild(element)
|
||||
return element
|
||||
}
|
||||
|
||||
function getSystemMode(): "light" | "dark" {
|
||||
if (typeof window !== "object") return "light"
|
||||
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"
|
||||
}
|
||||
|
||||
function applyThemeCss(theme: DesktopTheme, themeId: string, mode: "light" | "dark") {
|
||||
const isDark = mode === "dark"
|
||||
const variant = isDark ? theme.dark : theme.light
|
||||
const tokens = resolveThemeVariant(variant, isDark)
|
||||
const css = themeToCss(tokens)
|
||||
|
||||
if (themeId !== "oc-2") {
|
||||
write(isDark ? STORAGE_KEYS.THEME_CSS_DARK : STORAGE_KEYS.THEME_CSS_LIGHT, css)
|
||||
}
|
||||
|
||||
const fullCss = `:root {
|
||||
color-scheme: ${mode};
|
||||
--text-mix-blend-mode: ${isDark ? "plus-lighter" : "multiply"};
|
||||
${css}
|
||||
}`
|
||||
|
||||
document.getElementById("oc-theme-preload")?.remove()
|
||||
ensureThemeStyleElement().textContent = fullCss
|
||||
document.documentElement.dataset.theme = themeId
|
||||
document.documentElement.dataset.colorScheme = mode
|
||||
}
|
||||
|
||||
function cacheThemeVariants(theme: DesktopTheme, themeId: string) {
|
||||
if (themeId === "oc-2") return
|
||||
for (const mode of ["light", "dark"] as const) {
|
||||
const isDark = mode === "dark"
|
||||
const variant = isDark ? theme.dark : theme.light
|
||||
const tokens = resolveThemeVariant(variant, isDark)
|
||||
const css = themeToCss(tokens)
|
||||
write(isDark ? STORAGE_KEYS.THEME_CSS_DARK : STORAGE_KEYS.THEME_CSS_LIGHT, css)
|
||||
}
|
||||
}
|
||||
|
||||
export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
|
||||
name: "Theme",
|
||||
init: (props: { defaultTheme?: string; onThemeApplied?: (theme: DesktopTheme, mode: "light" | "dark") => void }) => {
|
||||
const themeId = normalize(read(STORAGE_KEYS.THEME_ID) ?? props.defaultTheme) ?? "oc-2"
|
||||
const colorScheme = (read(STORAGE_KEYS.COLOR_SCHEME) as ColorScheme | null) ?? "system"
|
||||
const mode = colorScheme === "system" ? getSystemMode() : colorScheme
|
||||
const [store, setStore] = createStore({
|
||||
themes: {
|
||||
"oc-2": oc2Theme,
|
||||
} as Record<string, DesktopTheme>,
|
||||
themeId,
|
||||
colorScheme,
|
||||
mode,
|
||||
previewThemeId: null as string | null,
|
||||
previewScheme: null as ColorScheme | null,
|
||||
})
|
||||
|
||||
const loads = new Map<string, Promise<DesktopTheme | undefined>>()
|
||||
|
||||
const load = (id: string) => {
|
||||
const next = normalize(id)
|
||||
if (!next) return Promise.resolve(undefined)
|
||||
const hit = store.themes[next]
|
||||
if (hit) return Promise.resolve(hit)
|
||||
const pending = loads.get(next)
|
||||
if (pending) return pending
|
||||
const file = getFiles()[`./themes/${next}.json`]
|
||||
if (!file) return Promise.resolve(undefined)
|
||||
const task = file()
|
||||
.then((mod) => {
|
||||
const theme = mod.default
|
||||
setStore("themes", next, theme)
|
||||
return theme
|
||||
})
|
||||
.finally(() => {
|
||||
loads.delete(next)
|
||||
})
|
||||
loads.set(next, task)
|
||||
return task
|
||||
}
|
||||
|
||||
const applyTheme = (theme: DesktopTheme, themeId: string, mode: "light" | "dark") => {
|
||||
applyThemeCss(theme, themeId, mode)
|
||||
props.onThemeApplied?.(theme, mode)
|
||||
}
|
||||
|
||||
const ids = () => {
|
||||
const extra = Object.keys(store.themes)
|
||||
.filter((id) => !knownThemes().has(id))
|
||||
.sort()
|
||||
const all = themeIDs()
|
||||
if (extra.length === 0) return all
|
||||
return [...all, ...extra]
|
||||
}
|
||||
|
||||
const loadThemes = () => Promise.all(themeIDs().map(load)).then(() => store.themes)
|
||||
|
||||
const onStorage = (e: StorageEvent) => {
|
||||
if (e.key === STORAGE_KEYS.THEME_ID && e.newValue) {
|
||||
const next = normalize(e.newValue)
|
||||
if (!next) return
|
||||
if (next !== "oc-2" && !knownThemes().has(next) && !store.themes[next]) return
|
||||
setStore("themeId", next)
|
||||
if (next === "oc-2") {
|
||||
clear()
|
||||
return
|
||||
}
|
||||
void load(next).then((theme) => {
|
||||
if (!theme || store.themeId !== next) return
|
||||
cacheThemeVariants(theme, next)
|
||||
})
|
||||
}
|
||||
if (e.key === STORAGE_KEYS.COLOR_SCHEME && e.newValue) {
|
||||
setStore("colorScheme", e.newValue as ColorScheme)
|
||||
setStore("mode", e.newValue === "system" ? getSystemMode() : (e.newValue as "light" | "dark"))
|
||||
}
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
makeEventListener(window, "storage", onStorage)
|
||||
|
||||
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)")
|
||||
const onMedia = () => {
|
||||
if (store.colorScheme !== "system") return
|
||||
setStore("mode", getSystemMode())
|
||||
}
|
||||
makeEventListener(mediaQuery, "change", onMedia)
|
||||
|
||||
const rawTheme = read(STORAGE_KEYS.THEME_ID)
|
||||
const savedTheme = normalize(rawTheme ?? props.defaultTheme) ?? "oc-2"
|
||||
const savedScheme = (read(STORAGE_KEYS.COLOR_SCHEME) as ColorScheme | null) ?? "system"
|
||||
if (rawTheme && rawTheme !== savedTheme) {
|
||||
write(STORAGE_KEYS.THEME_ID, savedTheme)
|
||||
clear()
|
||||
}
|
||||
if (savedTheme !== store.themeId) setStore("themeId", savedTheme)
|
||||
if (savedScheme !== store.colorScheme) setStore("colorScheme", savedScheme)
|
||||
setStore("mode", savedScheme === "system" ? getSystemMode() : savedScheme)
|
||||
void load(savedTheme).then((theme) => {
|
||||
if (!theme || store.themeId !== savedTheme) return
|
||||
cacheThemeVariants(theme, savedTheme)
|
||||
})
|
||||
})
|
||||
|
||||
createEffect(() => {
|
||||
const theme = store.themes[store.themeId]
|
||||
if (!theme) return
|
||||
applyTheme(theme, store.themeId, store.mode)
|
||||
})
|
||||
|
||||
const setTheme = (id: string) => {
|
||||
const next = normalize(id)
|
||||
if (!next) {
|
||||
console.warn(`Theme "${id}" not found`)
|
||||
return
|
||||
}
|
||||
if (next !== "oc-2" && !knownThemes().has(next) && !store.themes[next]) {
|
||||
console.warn(`Theme "${id}" not found`)
|
||||
return
|
||||
}
|
||||
setStore("themeId", next)
|
||||
if (next === "oc-2") {
|
||||
write(STORAGE_KEYS.THEME_ID, next)
|
||||
clear()
|
||||
return
|
||||
}
|
||||
void load(next).then((theme) => {
|
||||
if (!theme || store.themeId !== next) return
|
||||
cacheThemeVariants(theme, next)
|
||||
write(STORAGE_KEYS.THEME_ID, next)
|
||||
})
|
||||
}
|
||||
|
||||
const setColorScheme = (scheme: ColorScheme) => {
|
||||
setStore("colorScheme", scheme)
|
||||
write(STORAGE_KEYS.COLOR_SCHEME, scheme)
|
||||
setStore("mode", scheme === "system" ? getSystemMode() : scheme)
|
||||
}
|
||||
|
||||
return {
|
||||
themeId: () => store.themeId,
|
||||
colorScheme: () => store.colorScheme,
|
||||
mode: () => store.mode,
|
||||
ids,
|
||||
name: (id: string) => store.themes[id]?.name ?? names[id] ?? id,
|
||||
loadThemes,
|
||||
themes: () => store.themes,
|
||||
setTheme,
|
||||
setColorScheme,
|
||||
registerTheme: (theme: DesktopTheme) => setStore("themes", theme.id, theme),
|
||||
previewTheme: (id: string) => {
|
||||
const next = normalize(id)
|
||||
if (!next) return
|
||||
if (next !== "oc-2" && !knownThemes().has(next) && !store.themes[next]) return
|
||||
setStore("previewThemeId", next)
|
||||
void load(next).then((theme) => {
|
||||
if (!theme || store.previewThemeId !== next) return
|
||||
const mode = store.previewScheme
|
||||
? store.previewScheme === "system"
|
||||
? getSystemMode()
|
||||
: store.previewScheme
|
||||
: store.mode
|
||||
applyTheme(theme, next, mode)
|
||||
})
|
||||
},
|
||||
previewColorScheme: (scheme: ColorScheme) => {
|
||||
setStore("previewScheme", scheme)
|
||||
const mode = scheme === "system" ? getSystemMode() : scheme
|
||||
const id = store.previewThemeId ?? store.themeId
|
||||
void load(id).then((theme) => {
|
||||
if (!theme) return
|
||||
if ((store.previewThemeId ?? store.themeId) !== id) return
|
||||
if (store.previewScheme !== scheme) return
|
||||
applyTheme(theme, id, mode)
|
||||
})
|
||||
},
|
||||
commitPreview: () => {
|
||||
if (store.previewThemeId) {
|
||||
setTheme(store.previewThemeId)
|
||||
}
|
||||
if (store.previewScheme) {
|
||||
setColorScheme(store.previewScheme)
|
||||
}
|
||||
setStore("previewThemeId", null)
|
||||
setStore("previewScheme", null)
|
||||
},
|
||||
cancelPreview: () => {
|
||||
setStore("previewThemeId", null)
|
||||
setStore("previewScheme", null)
|
||||
void load(store.themeId).then((theme) => {
|
||||
if (!theme) return
|
||||
applyTheme(theme, store.themeId, store.mode)
|
||||
})
|
||||
},
|
||||
}
|
||||
},
|
||||
})
|
||||
116
qimingcode/packages/ui/src/theme/default-themes.ts
Normal file
116
qimingcode/packages/ui/src/theme/default-themes.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
import type { DesktopTheme } from "./types"
|
||||
import oc2ThemeJson from "./themes/oc-2.json"
|
||||
import amoledThemeJson from "./themes/amoled.json"
|
||||
import auraThemeJson from "./themes/aura.json"
|
||||
import ayuThemeJson from "./themes/ayu.json"
|
||||
import carbonfoxThemeJson from "./themes/carbonfox.json"
|
||||
import catppuccinThemeJson from "./themes/catppuccin.json"
|
||||
import catppuccinFrappeThemeJson from "./themes/catppuccin-frappe.json"
|
||||
import catppuccinMacchiatoThemeJson from "./themes/catppuccin-macchiato.json"
|
||||
import cobalt2ThemeJson from "./themes/cobalt2.json"
|
||||
import cursorThemeJson from "./themes/cursor.json"
|
||||
import draculaThemeJson from "./themes/dracula.json"
|
||||
import everforestThemeJson from "./themes/everforest.json"
|
||||
import flexokiThemeJson from "./themes/flexoki.json"
|
||||
import githubThemeJson from "./themes/github.json"
|
||||
import gruvboxThemeJson from "./themes/gruvbox.json"
|
||||
import kanagawaThemeJson from "./themes/kanagawa.json"
|
||||
import lucentOrngThemeJson from "./themes/lucent-orng.json"
|
||||
import materialThemeJson from "./themes/material.json"
|
||||
import matrixThemeJson from "./themes/matrix.json"
|
||||
import mercuryThemeJson from "./themes/mercury.json"
|
||||
import monokaiThemeJson from "./themes/monokai.json"
|
||||
import nightowlThemeJson from "./themes/nightowl.json"
|
||||
import nordThemeJson from "./themes/nord.json"
|
||||
import oneDarkThemeJson from "./themes/one-dark.json"
|
||||
import oneDarkProThemeJson from "./themes/onedarkpro.json"
|
||||
import opencodeThemeJson from "./themes/opencode.json"
|
||||
import orngThemeJson from "./themes/orng.json"
|
||||
import osakaJadeThemeJson from "./themes/osaka-jade.json"
|
||||
import palenightThemeJson from "./themes/palenight.json"
|
||||
import rosepineThemeJson from "./themes/rosepine.json"
|
||||
import shadesOfPurpleThemeJson from "./themes/shadesofpurple.json"
|
||||
import solarizedThemeJson from "./themes/solarized.json"
|
||||
import synthwave84ThemeJson from "./themes/synthwave84.json"
|
||||
import tokyonightThemeJson from "./themes/tokyonight.json"
|
||||
import vercelThemeJson from "./themes/vercel.json"
|
||||
import vesperThemeJson from "./themes/vesper.json"
|
||||
import zenburnThemeJson from "./themes/zenburn.json"
|
||||
|
||||
export const oc2Theme = oc2ThemeJson as DesktopTheme
|
||||
export const amoledTheme = amoledThemeJson as DesktopTheme
|
||||
export const auraTheme = auraThemeJson as DesktopTheme
|
||||
export const ayuTheme = ayuThemeJson as DesktopTheme
|
||||
export const carbonfoxTheme = carbonfoxThemeJson as DesktopTheme
|
||||
export const catppuccinTheme = catppuccinThemeJson as DesktopTheme
|
||||
export const catppuccinFrappeTheme = catppuccinFrappeThemeJson as DesktopTheme
|
||||
export const catppuccinMacchiatoTheme = catppuccinMacchiatoThemeJson as DesktopTheme
|
||||
export const cobalt2Theme = cobalt2ThemeJson as DesktopTheme
|
||||
export const cursorTheme = cursorThemeJson as DesktopTheme
|
||||
export const draculaTheme = draculaThemeJson as DesktopTheme
|
||||
export const everforestTheme = everforestThemeJson as DesktopTheme
|
||||
export const flexokiTheme = flexokiThemeJson as DesktopTheme
|
||||
export const githubTheme = githubThemeJson as DesktopTheme
|
||||
export const gruvboxTheme = gruvboxThemeJson as DesktopTheme
|
||||
export const kanagawaTheme = kanagawaThemeJson as DesktopTheme
|
||||
export const lucentOrngTheme = lucentOrngThemeJson as DesktopTheme
|
||||
export const materialTheme = materialThemeJson as DesktopTheme
|
||||
export const matrixTheme = matrixThemeJson as DesktopTheme
|
||||
export const mercuryTheme = mercuryThemeJson as DesktopTheme
|
||||
export const monokaiTheme = monokaiThemeJson as DesktopTheme
|
||||
export const nightowlTheme = nightowlThemeJson as DesktopTheme
|
||||
export const nordTheme = nordThemeJson as DesktopTheme
|
||||
export const oneDarkTheme = oneDarkThemeJson as DesktopTheme
|
||||
export const oneDarkProTheme = oneDarkProThemeJson as DesktopTheme
|
||||
export const opencodeTheme = opencodeThemeJson as DesktopTheme
|
||||
export const orngTheme = orngThemeJson as DesktopTheme
|
||||
export const osakaJadeTheme = osakaJadeThemeJson as DesktopTheme
|
||||
export const palenightTheme = palenightThemeJson as DesktopTheme
|
||||
export const rosepineTheme = rosepineThemeJson as DesktopTheme
|
||||
export const shadesOfPurpleTheme = shadesOfPurpleThemeJson as DesktopTheme
|
||||
export const solarizedTheme = solarizedThemeJson as DesktopTheme
|
||||
export const synthwave84Theme = synthwave84ThemeJson as DesktopTheme
|
||||
export const tokyonightTheme = tokyonightThemeJson as DesktopTheme
|
||||
export const vercelTheme = vercelThemeJson as DesktopTheme
|
||||
export const vesperTheme = vesperThemeJson as DesktopTheme
|
||||
export const zenburnTheme = zenburnThemeJson as DesktopTheme
|
||||
|
||||
export const DEFAULT_THEMES: Record<string, DesktopTheme> = {
|
||||
"oc-2": oc2Theme,
|
||||
amoled: amoledTheme,
|
||||
aura: auraTheme,
|
||||
ayu: ayuTheme,
|
||||
carbonfox: carbonfoxTheme,
|
||||
catppuccin: catppuccinTheme,
|
||||
"catppuccin-frappe": catppuccinFrappeTheme,
|
||||
"catppuccin-macchiato": catppuccinMacchiatoTheme,
|
||||
cobalt2: cobalt2Theme,
|
||||
cursor: cursorTheme,
|
||||
dracula: draculaTheme,
|
||||
everforest: everforestTheme,
|
||||
flexoki: flexokiTheme,
|
||||
github: githubTheme,
|
||||
gruvbox: gruvboxTheme,
|
||||
kanagawa: kanagawaTheme,
|
||||
"lucent-orng": lucentOrngTheme,
|
||||
material: materialTheme,
|
||||
matrix: matrixTheme,
|
||||
mercury: mercuryTheme,
|
||||
monokai: monokaiTheme,
|
||||
nightowl: nightowlTheme,
|
||||
nord: nordTheme,
|
||||
"one-dark": oneDarkTheme,
|
||||
onedarkpro: oneDarkProTheme,
|
||||
opencode: opencodeTheme,
|
||||
orng: orngTheme,
|
||||
"osaka-jade": osakaJadeTheme,
|
||||
palenight: palenightTheme,
|
||||
rosepine: rosepineTheme,
|
||||
shadesofpurple: shadesOfPurpleTheme,
|
||||
solarized: solarizedTheme,
|
||||
synthwave84: synthwave84Theme,
|
||||
tokyonight: tokyonightTheme,
|
||||
vercel: vercelTheme,
|
||||
vesper: vesperTheme,
|
||||
zenburn: zenburnTheme,
|
||||
}
|
||||
161
qimingcode/packages/ui/src/theme/desktop-theme.schema.json
Normal file
161
qimingcode/packages/ui/src/theme/desktop-theme.schema.json
Normal file
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://opencode.ai/desktop-theme.json",
|
||||
"title": "OpenCode Desktop Theme",
|
||||
"description": "A theme definition for the OpenCode desktop application",
|
||||
"type": "object",
|
||||
"required": ["name", "id", "light", "dark"],
|
||||
"properties": {
|
||||
"$schema": {
|
||||
"type": "string",
|
||||
"description": "JSON Schema reference"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Human-readable theme name"
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Unique theme identifier (slug)",
|
||||
"pattern": "^[a-z0-9-]+$"
|
||||
},
|
||||
"light": {
|
||||
"$ref": "#/definitions/ThemeVariant",
|
||||
"description": "Light mode color variant"
|
||||
},
|
||||
"dark": {
|
||||
"$ref": "#/definitions/ThemeVariant",
|
||||
"description": "Dark mode color variant"
|
||||
}
|
||||
},
|
||||
"definitions": {
|
||||
"HexColor": {
|
||||
"type": "string",
|
||||
"pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
|
||||
"description": "A hex color value like #fff, #ffff, #ffffff, or #ffffffff"
|
||||
},
|
||||
"ColorValue": {
|
||||
"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-]+\\))$",
|
||||
"description": "Either a hex color value (#rgb/#rgba/#rrggbb/#rrggbbaa) or a CSS variable reference"
|
||||
},
|
||||
"ThemeSeedColors": {
|
||||
"type": "object",
|
||||
"description": "The legacy semantic seed set used to generate a theme",
|
||||
"additionalProperties": false,
|
||||
"required": ["neutral", "primary", "success", "warning", "error", "info", "interactive", "diffAdd", "diffDelete"],
|
||||
"properties": {
|
||||
"neutral": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Base neutral color for generating the gray scale"
|
||||
},
|
||||
"primary": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Primary brand/accent color"
|
||||
},
|
||||
"success": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Success state color (typically green)"
|
||||
},
|
||||
"warning": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Warning state color (typically yellow/orange)"
|
||||
},
|
||||
"error": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Error/critical state color (typically red)"
|
||||
},
|
||||
"info": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Informational state color (typically purple/blue)"
|
||||
},
|
||||
"interactive": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Interactive element color (links, buttons)"
|
||||
},
|
||||
"diffAdd": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Color for diff additions"
|
||||
},
|
||||
"diffDelete": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Color for diff deletions"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ThemePaletteColors": {
|
||||
"type": "object",
|
||||
"description": "A compact semantic palette used to derive the full theme programmatically",
|
||||
"additionalProperties": false,
|
||||
"required": ["neutral", "ink", "primary", "success", "warning", "error", "info"],
|
||||
"properties": {
|
||||
"neutral": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "Base neutral color for generating the gray scale"
|
||||
},
|
||||
"ink": {
|
||||
"$ref": "#/definitions/HexColor",
|
||||
"description": "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": {
|
||||
"type": "object",
|
||||
"description": "A theme variant (light or dark) with either a compact palette or legacy seeds and optional overrides",
|
||||
"oneOf": [{ "required": ["seeds"] }, { "required": ["palette"] }],
|
||||
"properties": {
|
||||
"seeds": {
|
||||
"$ref": "#/definitions/ThemeSeedColors",
|
||||
"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": {
|
||||
"type": "object",
|
||||
"description": "Optional direct overrides for any CSS variable (without -- prefix)",
|
||||
"additionalProperties": {
|
||||
"$ref": "#/definitions/ColorValue"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
75
qimingcode/packages/ui/src/theme/index.ts
Normal file
75
qimingcode/packages/ui/src/theme/index.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
export type {
|
||||
DesktopTheme,
|
||||
ThemePaletteColors,
|
||||
ThemeSeedColors,
|
||||
ThemeVariant,
|
||||
HexColor,
|
||||
OklchColor,
|
||||
ResolvedTheme,
|
||||
ColorValue,
|
||||
CssVarRef,
|
||||
} from "./types"
|
||||
|
||||
export {
|
||||
hexToRgb,
|
||||
rgbToHex,
|
||||
hexToOklch,
|
||||
oklchToHex,
|
||||
rgbToOklch,
|
||||
oklchToRgb,
|
||||
generateScale,
|
||||
generateNeutralScale,
|
||||
generateAlphaScale,
|
||||
fitOklch,
|
||||
blend,
|
||||
mixColors,
|
||||
shift,
|
||||
lighten,
|
||||
darken,
|
||||
withAlpha,
|
||||
} from "./color"
|
||||
|
||||
export { resolveThemeVariant, resolveTheme, themeToCss } from "./resolve"
|
||||
export { applyTheme, loadThemeFromUrl, getActiveTheme, removeTheme, setColorScheme } from "./loader"
|
||||
export { ThemeProvider, useTheme, type ColorScheme } from "./context"
|
||||
|
||||
export {
|
||||
DEFAULT_THEMES,
|
||||
oc2Theme,
|
||||
amoledTheme,
|
||||
auraTheme,
|
||||
ayuTheme,
|
||||
carbonfoxTheme,
|
||||
catppuccinTheme,
|
||||
catppuccinFrappeTheme,
|
||||
catppuccinMacchiatoTheme,
|
||||
cobalt2Theme,
|
||||
cursorTheme,
|
||||
draculaTheme,
|
||||
everforestTheme,
|
||||
flexokiTheme,
|
||||
githubTheme,
|
||||
gruvboxTheme,
|
||||
kanagawaTheme,
|
||||
lucentOrngTheme,
|
||||
materialTheme,
|
||||
matrixTheme,
|
||||
mercuryTheme,
|
||||
monokaiTheme,
|
||||
nightowlTheme,
|
||||
nordTheme,
|
||||
oneDarkTheme,
|
||||
oneDarkProTheme,
|
||||
opencodeTheme,
|
||||
orngTheme,
|
||||
osakaJadeTheme,
|
||||
palenightTheme,
|
||||
rosepineTheme,
|
||||
shadesOfPurpleTheme,
|
||||
solarizedTheme,
|
||||
synthwave84Theme,
|
||||
tokyonightTheme,
|
||||
vercelTheme,
|
||||
vesperTheme,
|
||||
zenburnTheme,
|
||||
} from "./default-themes"
|
||||
103
qimingcode/packages/ui/src/theme/loader.ts
Normal file
103
qimingcode/packages/ui/src/theme/loader.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import type { DesktopTheme, ResolvedTheme } from "./types"
|
||||
import { resolveThemeVariant, themeToCss } from "./resolve"
|
||||
|
||||
let activeTheme: DesktopTheme | null = null
|
||||
const THEME_STYLE_ID = "opencode-theme"
|
||||
|
||||
function ensureLoaderStyleElement(): HTMLStyleElement {
|
||||
const existing = document.getElementById(THEME_STYLE_ID) as HTMLStyleElement | null
|
||||
if (existing) {
|
||||
return existing
|
||||
}
|
||||
const element = document.createElement("style")
|
||||
element.id = THEME_STYLE_ID
|
||||
document.head.appendChild(element)
|
||||
return element
|
||||
}
|
||||
|
||||
export function applyTheme(theme: DesktopTheme, themeId?: string): void {
|
||||
activeTheme = theme
|
||||
const lightTokens = resolveThemeVariant(theme.light, false)
|
||||
const darkTokens = resolveThemeVariant(theme.dark, true)
|
||||
const targetThemeId = themeId ?? theme.id
|
||||
const css = buildThemeCss(lightTokens, darkTokens, targetThemeId)
|
||||
const themeStyleElement = ensureLoaderStyleElement()
|
||||
themeStyleElement.textContent = css
|
||||
document.documentElement.setAttribute("data-theme", targetThemeId)
|
||||
}
|
||||
|
||||
function buildThemeCss(light: ResolvedTheme, dark: ResolvedTheme, themeId: string): string {
|
||||
const isDefaultTheme = themeId === "oc-2"
|
||||
const lightCss = themeToCss(light)
|
||||
const darkCss = themeToCss(dark)
|
||||
|
||||
if (isDefaultTheme) {
|
||||
return `
|
||||
:root {
|
||||
color-scheme: light;
|
||||
--text-mix-blend-mode: multiply;
|
||||
|
||||
${lightCss}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
color-scheme: dark;
|
||||
--text-mix-blend-mode: plus-lighter;
|
||||
|
||||
${darkCss}
|
||||
}
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
return `
|
||||
html[data-theme="${themeId}"] {
|
||||
color-scheme: light;
|
||||
--text-mix-blend-mode: multiply;
|
||||
|
||||
${lightCss}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
color-scheme: dark;
|
||||
--text-mix-blend-mode: plus-lighter;
|
||||
|
||||
${darkCss}
|
||||
}
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
export async function loadThemeFromUrl(url: string): Promise<DesktopTheme> {
|
||||
const response = await fetch(url)
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to load theme from ${url}: ${response.statusText}`)
|
||||
}
|
||||
return response.json()
|
||||
}
|
||||
|
||||
export function getActiveTheme(): DesktopTheme | null {
|
||||
const activeId = document.documentElement.getAttribute("data-theme")
|
||||
if (!activeId) {
|
||||
return null
|
||||
}
|
||||
if (activeTheme?.id === activeId) {
|
||||
return activeTheme
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
export function removeTheme(): void {
|
||||
activeTheme = null
|
||||
const existingElement = document.getElementById(THEME_STYLE_ID)
|
||||
if (existingElement) {
|
||||
existingElement.remove()
|
||||
}
|
||||
document.documentElement.removeAttribute("data-theme")
|
||||
}
|
||||
|
||||
export function setColorScheme(scheme: "light" | "dark" | "auto"): void {
|
||||
if (scheme === "auto") {
|
||||
document.documentElement.style.removeProperty("color-scheme")
|
||||
} else {
|
||||
document.documentElement.style.setProperty("color-scheme", scheme)
|
||||
}
|
||||
}
|
||||
540
qimingcode/packages/ui/src/theme/resolve.ts
Normal file
540
qimingcode/packages/ui/src/theme/resolve.ts
Normal file
@@ -0,0 +1,540 @@
|
||||
import type { ColorValue, DesktopTheme, HexColor, ResolvedTheme, ThemeVariant } from "./types"
|
||||
import { blend, generateNeutralScale, generateScale, hexToOklch, hexToRgb, shift, withAlpha } from "./color"
|
||||
|
||||
export function resolveThemeVariant(variant: ThemeVariant, isDark: boolean): ResolvedTheme {
|
||||
const colors = getColors(variant)
|
||||
const { overrides = {} } = variant
|
||||
|
||||
const neutral = generateNeutralScale(colors.neutral, isDark, colors.ink)
|
||||
const primary = generateScale(colors.primary, isDark)
|
||||
const accent = generateScale(colors.accent, isDark)
|
||||
const success = generateScale(colors.success, isDark)
|
||||
const warning = generateScale(colors.warning, isDark)
|
||||
const error = generateScale(colors.error, isDark)
|
||||
const info = generateScale(colors.info, isDark)
|
||||
const interactive = generateScale(colors.interactive, isDark)
|
||||
const amber = generateScale(
|
||||
shift(colors.warning, isDark ? { h: -16, l: -0.058, c: 1.14 } : { h: -22, l: -0.082, c: 0.94 }),
|
||||
isDark,
|
||||
)
|
||||
const blue = generateScale(shift(colors.interactive, { h: -12, l: 0.128, c: 1.12 }), isDark)
|
||||
const diffAdd = generateScale(
|
||||
colors.diffAdd ?? shift(colors.success, { c: isDark ? 0.7 : 0.55, l: isDark ? -0.18 : 0.14 }),
|
||||
isDark,
|
||||
)
|
||||
const diffDelete = generateScale(
|
||||
colors.diffDelete ?? shift(colors.error, { c: isDark ? 0.82 : 0.7, l: isDark ? -0.08 : 0.08 }),
|
||||
isDark,
|
||||
)
|
||||
const ink = colors.ink ?? colors.neutral
|
||||
const tint = colors.compact ? hexToOklch(ink) : undefined
|
||||
const body = tint
|
||||
? shift(ink, {
|
||||
l: isDark ? Math.max(0, 0.88 - tint.l) * 0.4 : -Math.max(0, tint.l - 0.18) * 0.24,
|
||||
c: isDark ? 1.04 : 1.02,
|
||||
})
|
||||
: undefined
|
||||
const backgroundOverride = overrides["background-base"]
|
||||
const backgroundHex = getHex(backgroundOverride)
|
||||
const overlay = Boolean(backgroundOverride) && !backgroundHex
|
||||
const content = (seed: HexColor, scale: HexColor[]) => {
|
||||
const base = hexToOklch(seed)
|
||||
const value = isDark ? (base.l > 0.84 ? shift(seed, { c: 1.18 }) : scale[10]) : scale[10]
|
||||
return shift(value, { l: isDark ? 0.034 : -0.024, c: isDark ? 1.3 : 1.18 })
|
||||
}
|
||||
const modified = () => {
|
||||
if (!colors.compact) 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 background = backgroundHex ?? 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 + 0.024 + (colors.compact ? 0.08 : 0)) : Math.min(1, light + 0.024))
|
||||
const diffHiddenSurface = 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 = generateNeutralAlphaScale(neutral, isDark)
|
||||
const brandb = primary[8]
|
||||
const brandh = primary[9]
|
||||
const interb = interactive[isDark ? 6 : 4]
|
||||
const interh = interactive[isDark ? 7 : 5]
|
||||
const interw = interactive[isDark ? 5 : 3]
|
||||
const succb = success[isDark ? 6 : 4]
|
||||
const succw = success[isDark ? 5 : 3]
|
||||
const succs = success[10]
|
||||
const warnb = warning[isDark ? 6 : 4]
|
||||
const warnw = warning[isDark ? 5 : 3]
|
||||
const warns = warning[10]
|
||||
const critb = error[isDark ? 6 : 4]
|
||||
const critw = error[isDark ? 5 : 3]
|
||||
const crits = error[10]
|
||||
const infob = info[isDark ? 6 : 4]
|
||||
const infow = info[isDark ? 5 : 3]
|
||||
const infos = info[10]
|
||||
const lum = (hex: HexColor) => {
|
||||
const rgb = hexToRgb(hex)
|
||||
const lift = (v: number) => (v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4))
|
||||
return 0.2126 * lift(rgb.r) + 0.7152 * lift(rgb.g) + 0.0722 * lift(rgb.b)
|
||||
}
|
||||
const hit = (a: HexColor, b: HexColor) => {
|
||||
const x = lum(a)
|
||||
const y = lum(b)
|
||||
const light = Math.max(x, y)
|
||||
const dark = Math.min(x, y)
|
||||
return (light + 0.05) / (dark + 0.05)
|
||||
}
|
||||
const on = (fill: HexColor) => {
|
||||
const light = "#ffffff" as HexColor
|
||||
const dark = "#000000" as HexColor
|
||||
return hit(light, fill) > hit(dark, fill) ? light : dark
|
||||
}
|
||||
|
||||
const tokens: ResolvedTheme = {}
|
||||
|
||||
tokens["background-base"] = neutral[0]
|
||||
tokens["background-weak"] = neutral[2]
|
||||
tokens["background-strong"] = neutral[0]
|
||||
tokens["background-stronger"] = isDark ? neutral[1] : "#fcfcfc"
|
||||
|
||||
tokens["surface-base"] = neutralAlpha[1]
|
||||
tokens["base"] = neutralAlpha[1]
|
||||
tokens["surface-base-hover"] = neutralAlpha[2]
|
||||
tokens["surface-base-active"] = neutralAlpha[2]
|
||||
tokens["surface-base-interactive-active"] = withAlpha(interactive[2], 0.3) as ColorValue
|
||||
tokens["base2"] = neutralAlpha[1]
|
||||
tokens["base3"] = neutralAlpha[1]
|
||||
tokens["surface-inset-base"] = neutralAlpha[1]
|
||||
tokens["surface-inset-base-hover"] = neutralAlpha[2]
|
||||
tokens["surface-inset-strong"] = isDark
|
||||
? (withAlpha(neutral[0], 0.5) as ColorValue)
|
||||
: (withAlpha(neutral[3], 0.09) as ColorValue)
|
||||
tokens["surface-inset-strong-hover"] = tokens["surface-inset-strong"]
|
||||
tokens["surface-raised-base"] = neutralAlpha[0]
|
||||
tokens["surface-float-base"] = isDark ? neutral[1] : neutral[11]
|
||||
tokens["surface-float-base-hover"] = isDark ? neutral[2] : neutral[10]
|
||||
tokens["surface-raised-base-hover"] = neutralAlpha[1]
|
||||
tokens["surface-raised-base-active"] = neutralAlpha[2]
|
||||
tokens["surface-raised-strong"] = isDark ? neutralAlpha[3] : neutral[0]
|
||||
tokens["surface-raised-strong-hover"] = isDark ? neutralAlpha[5] : "#ffffff"
|
||||
tokens["surface-raised-stronger"] = isDark ? neutralAlpha[5] : "#ffffff"
|
||||
tokens["surface-raised-stronger-hover"] = isDark ? neutralAlpha[6] : "#ffffff"
|
||||
tokens["surface-weak"] = neutralAlpha[2]
|
||||
tokens["surface-weaker"] = neutralAlpha[3]
|
||||
tokens["surface-strong"] = isDark ? neutralAlpha[6] : "#ffffff"
|
||||
tokens["surface-raised-stronger-non-alpha"] = isDark ? neutral[2] : "#ffffff"
|
||||
|
||||
tokens["surface-brand-base"] = brandb
|
||||
tokens["surface-brand-hover"] = brandh
|
||||
|
||||
tokens["surface-interactive-base"] = interb
|
||||
tokens["surface-interactive-hover"] = interh
|
||||
tokens["surface-interactive-weak"] = interw
|
||||
tokens["surface-interactive-weak-hover"] = interb
|
||||
|
||||
tokens["surface-success-base"] = succb
|
||||
tokens["surface-success-weak"] = succw
|
||||
tokens["surface-success-strong"] = succs
|
||||
tokens["surface-warning-base"] = warnb
|
||||
tokens["surface-warning-weak"] = warnw
|
||||
tokens["surface-warning-strong"] = warns
|
||||
tokens["surface-critical-base"] = critb
|
||||
tokens["surface-critical-weak"] = critw
|
||||
tokens["surface-critical-strong"] = crits
|
||||
tokens["surface-info-base"] = infob
|
||||
tokens["surface-info-weak"] = infow
|
||||
tokens["surface-info-strong"] = infos
|
||||
|
||||
tokens["surface-diff-unchanged-base"] = isDark ? neutral[0] : "#ffffff00"
|
||||
tokens["surface-diff-skip-base"] = isDark ? neutralAlpha[0] : neutral[1]
|
||||
tokens["surface-diff-hidden-base"] = diffHiddenSurface.base
|
||||
tokens["surface-diff-hidden-weak"] = diffHiddenSurface.weak
|
||||
tokens["surface-diff-hidden-weaker"] = diffHiddenSurface.weaker
|
||||
tokens["surface-diff-hidden-strong"] = diffHiddenSurface.strong
|
||||
tokens["surface-diff-hidden-stronger"] = diffHiddenSurface.stronger
|
||||
tokens["surface-diff-add-base"] = diffAdd[2]
|
||||
tokens["surface-diff-add-weak"] = diffAdd[isDark ? 3 : 1]
|
||||
tokens["surface-diff-add-weaker"] = diffAdd[isDark ? 2 : 0]
|
||||
tokens["surface-diff-add-strong"] = diffAdd[4]
|
||||
tokens["surface-diff-add-stronger"] = diffAdd[isDark ? 10 : 8]
|
||||
tokens["surface-diff-delete-base"] = diffDelete[2]
|
||||
tokens["surface-diff-delete-weak"] = diffDelete[isDark ? 3 : 1]
|
||||
tokens["surface-diff-delete-weaker"] = diffDelete[isDark ? 2 : 0]
|
||||
tokens["surface-diff-delete-strong"] = diffDelete[isDark ? 4 : 5]
|
||||
tokens["surface-diff-delete-stronger"] = diffDelete[isDark ? 10 : 8]
|
||||
|
||||
tokens["input-base"] = isDark ? neutral[1] : neutral[0]
|
||||
tokens["input-hover"] = isDark ? neutral[2] : neutral[1]
|
||||
tokens["input-active"] = isDark ? interactive[6] : interactive[0]
|
||||
tokens["input-selected"] = isDark ? interactive[7] : interactive[3]
|
||||
tokens["input-focus"] = isDark ? interactive[6] : interactive[0]
|
||||
tokens["input-disabled"] = neutral[3]
|
||||
|
||||
tokens["text-base"] = colors.compact ? (body as HexColor) : neutral[10]
|
||||
tokens["text-weak"] = colors.compact ? shift(body as HexColor, { l: isDark ? -0.11 : 0.11, c: 0.9 }) : neutral[8]
|
||||
tokens["text-weaker"] = colors.compact
|
||||
? shift(body as HexColor, { l: isDark ? -0.2 : 0.21, c: isDark ? 0.78 : 0.72 })
|
||||
: neutral[7]
|
||||
tokens["text-strong"] = colors.compact
|
||||
? isDark
|
||||
? blend("#ffffff", body as HexColor, 0.9)
|
||||
: shift(body as HexColor, { l: -0.07, c: 1.04 })
|
||||
: neutral[11]
|
||||
tokens["text-invert-base"] = isDark ? neutral[10] : neutral[1]
|
||||
tokens["text-invert-weak"] = isDark ? neutral[8] : neutral[2]
|
||||
tokens["text-invert-weaker"] = isDark ? neutral[7] : neutral[3]
|
||||
tokens["text-invert-strong"] = isDark ? neutral[11] : neutral[0]
|
||||
tokens["text-interactive-base"] = interactive[isDark ? 10 : 9]
|
||||
tokens["text-on-brand-base"] = on(brandb)
|
||||
tokens["text-on-interactive-base"] = on(interb)
|
||||
tokens["text-on-interactive-weak"] = on(interb)
|
||||
tokens["text-on-success-base"] = on(succb)
|
||||
tokens["text-on-critical-base"] = on(critb)
|
||||
tokens["text-on-critical-weak"] = on(critb)
|
||||
tokens["text-on-critical-strong"] = on(crits)
|
||||
tokens["text-on-warning-base"] = on(warnb)
|
||||
tokens["text-on-info-base"] = on(infob)
|
||||
tokens["text-diff-add-base"] = diffAdd[10]
|
||||
tokens["text-diff-delete-base"] = diffDelete[9]
|
||||
tokens["text-diff-delete-strong"] = diffDelete[11]
|
||||
tokens["text-diff-add-strong"] = diffAdd[isDark ? 7 : 11]
|
||||
tokens["text-on-info-weak"] = on(infob)
|
||||
tokens["text-on-info-strong"] = on(infos)
|
||||
tokens["text-on-warning-weak"] = on(warnb)
|
||||
tokens["text-on-warning-strong"] = on(warns)
|
||||
tokens["text-on-success-weak"] = on(succb)
|
||||
tokens["text-on-success-strong"] = on(succs)
|
||||
tokens["text-on-brand-weak"] = on(brandb)
|
||||
tokens["text-on-brand-weaker"] = on(brandb)
|
||||
tokens["text-on-brand-strong"] = on(brandh)
|
||||
|
||||
tokens["button-primary-base"] = neutral[11]
|
||||
tokens["button-secondary-base"] = isDark ? neutral[2] : neutral[0]
|
||||
tokens["button-secondary-hover"] = isDark ? neutral[3] : neutral[1]
|
||||
tokens["button-ghost-hover"] = neutralAlpha[1]
|
||||
tokens["button-ghost-hover2"] = neutralAlpha[2]
|
||||
|
||||
tokens["border-base"] = colors.compact ? borderTone(0.22, 0.16) : neutralAlpha[6]
|
||||
tokens["border-hover"] = colors.compact ? borderTone(0.28, 0.2) : neutralAlpha[7]
|
||||
tokens["border-active"] = colors.compact ? borderTone(0.34, 0.24) : neutralAlpha[8]
|
||||
tokens["border-selected"] = withAlpha(interactive[8], isDark ? 0.9 : 0.99) as ColorValue
|
||||
tokens["border-disabled"] = colors.compact ? borderTone(0.18, 0.12) : neutralAlpha[7]
|
||||
tokens["border-focus"] = colors.compact ? borderTone(0.34, 0.24) : neutralAlpha[8]
|
||||
tokens["border-weak-base"] = colors.compact ? borderTone(0.1, 0.08) : neutralAlpha[isDark ? 5 : 4]
|
||||
tokens["border-strong-base"] = colors.compact ? borderTone(0.34, 0.24) : neutralAlpha[isDark ? 7 : 6]
|
||||
tokens["border-strong-hover"] = colors.compact ? borderTone(0.4, 0.28) : neutralAlpha[7]
|
||||
tokens["border-strong-active"] = colors.compact ? borderTone(0.46, 0.32) : neutralAlpha[isDark ? 7 : 6]
|
||||
tokens["border-strong-selected"] = withAlpha(interactive[5], 0.6) as ColorValue
|
||||
tokens["border-strong-disabled"] = colors.compact ? borderTone(0.14, 0.1) : neutralAlpha[5]
|
||||
tokens["border-strong-focus"] = colors.compact ? borderTone(0.46, 0.32) : neutralAlpha[isDark ? 7 : 6]
|
||||
tokens["border-weak-hover"] = colors.compact ? borderTone(0.16, 0.12) : neutralAlpha[isDark ? 6 : 5]
|
||||
tokens["border-weak-active"] = colors.compact ? 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-disabled"] = colors.compact ? borderTone(0.08, 0.06) : neutralAlpha[5]
|
||||
tokens["border-weak-focus"] = colors.compact ? borderTone(0.22, 0.16) : neutralAlpha[isDark ? 7 : 6]
|
||||
tokens["border-weaker-base"] = colors.compact ? borderTone(0.06, 0.04) : neutralAlpha[2]
|
||||
|
||||
tokens["border-interactive-base"] = interactive[6]
|
||||
tokens["border-interactive-hover"] = interactive[7]
|
||||
tokens["border-interactive-active"] = interactive[8]
|
||||
tokens["border-interactive-selected"] = interactive[8]
|
||||
tokens["border-interactive-disabled"] = neutral[7]
|
||||
tokens["border-interactive-focus"] = interactive[8]
|
||||
|
||||
tokens["border-success-base"] = success[isDark ? 6 : 6]
|
||||
tokens["border-success-hover"] = success[isDark ? 7 : 7]
|
||||
tokens["border-success-selected"] = success[8]
|
||||
tokens["border-warning-base"] = warning[isDark ? 6 : 6]
|
||||
tokens["border-warning-hover"] = warning[isDark ? 7 : 7]
|
||||
tokens["border-warning-selected"] = warning[8]
|
||||
tokens["border-critical-base"] = error[isDark ? 6 : 6]
|
||||
tokens["border-critical-hover"] = error[isDark ? 7 : 7]
|
||||
tokens["border-critical-selected"] = error[8]
|
||||
tokens["border-info-base"] = info[isDark ? 6 : 6]
|
||||
tokens["border-info-hover"] = info[isDark ? 7 : 7]
|
||||
tokens["border-info-selected"] = info[8]
|
||||
tokens["border-color"] = "#ffffff"
|
||||
|
||||
tokens["icon-base"] = colors.compact && !isDark ? tokens["text-weak"] : neutral[isDark ? 9 : 8]
|
||||
tokens["icon-hover"] = colors.compact && !isDark ? tokens["text-base"] : neutral[10]
|
||||
tokens["icon-active"] = colors.compact && !isDark ? tokens["text-strong"] : neutral[11]
|
||||
tokens["icon-selected"] = colors.compact && !isDark ? tokens["text-strong"] : neutral[11]
|
||||
tokens["icon-disabled"] = neutral[isDark ? 6 : 7]
|
||||
tokens["icon-focus"] = colors.compact && !isDark ? tokens["text-strong"] : neutral[11]
|
||||
tokens["icon-invert-base"] = isDark ? neutral[0] : "#ffffff"
|
||||
tokens["icon-weak-base"] = neutral[isDark ? 5 : 6]
|
||||
tokens["icon-weak-hover"] = neutral[isDark ? 11 : 7]
|
||||
tokens["icon-weak-active"] = neutral[8]
|
||||
tokens["icon-weak-selected"] = neutral[isDark ? 8 : 9]
|
||||
tokens["icon-weak-disabled"] = neutral[isDark ? 3 : 5]
|
||||
tokens["icon-weak-focus"] = neutral[8]
|
||||
tokens["icon-strong-base"] = neutral[11]
|
||||
tokens["icon-strong-hover"] = isDark ? "#f6f3f3" : "#151313"
|
||||
tokens["icon-strong-active"] = isDark ? "#fcfcfc" : "#020202"
|
||||
tokens["icon-strong-selected"] = isDark ? "#fdfcfc" : "#020202"
|
||||
tokens["icon-strong-disabled"] = neutral[7]
|
||||
tokens["icon-strong-focus"] = isDark ? "#fdfcfc" : "#020202"
|
||||
tokens["icon-brand-base"] = isDark ? "#ffffff" : neutral[11]
|
||||
tokens["icon-interactive-base"] = interactive[8]
|
||||
tokens["icon-success-base"] = success[isDark ? 8 : 6]
|
||||
tokens["icon-success-hover"] = success[9]
|
||||
tokens["icon-success-active"] = success[10]
|
||||
tokens["icon-warning-base"] = amber[isDark ? 8 : 6]
|
||||
tokens["icon-warning-hover"] = amber[9]
|
||||
tokens["icon-warning-active"] = amber[10]
|
||||
tokens["icon-critical-base"] = error[isDark ? 8 : 9]
|
||||
tokens["icon-critical-hover"] = error[9]
|
||||
tokens["icon-critical-active"] = error[10]
|
||||
tokens["icon-info-base"] = info[isDark ? 8 : 6]
|
||||
tokens["icon-info-hover"] = info[isDark ? 9 : 7]
|
||||
tokens["icon-info-active"] = info[10]
|
||||
tokens["icon-on-brand-base"] = on(brandb)
|
||||
tokens["icon-on-brand-hover"] = on(brandh)
|
||||
tokens["icon-on-brand-selected"] = on(brandh)
|
||||
tokens["icon-on-interactive-base"] = on(interb)
|
||||
|
||||
tokens["icon-agent-plan-base"] = info[8]
|
||||
tokens["icon-agent-docs-base"] = amber[8]
|
||||
tokens["icon-agent-ask-base"] = blue[8]
|
||||
tokens["icon-agent-build-base"] = interactive[isDark ? 10 : 8]
|
||||
|
||||
tokens["icon-on-success-base"] = on(succb)
|
||||
tokens["icon-on-success-hover"] = on(succs)
|
||||
tokens["icon-on-success-selected"] = on(succs)
|
||||
tokens["icon-on-warning-base"] = on(warnb)
|
||||
tokens["icon-on-warning-hover"] = on(warns)
|
||||
tokens["icon-on-warning-selected"] = on(warns)
|
||||
tokens["icon-on-critical-base"] = on(critb)
|
||||
tokens["icon-on-critical-hover"] = on(crits)
|
||||
tokens["icon-on-critical-selected"] = on(crits)
|
||||
tokens["icon-on-info-base"] = on(infob)
|
||||
tokens["icon-on-info-hover"] = on(infos)
|
||||
tokens["icon-on-info-selected"] = on(infos)
|
||||
|
||||
tokens["icon-diff-add-base"] = diffAdd[10]
|
||||
tokens["icon-diff-add-hover"] = diffAdd[isDark ? 9 : 11]
|
||||
tokens["icon-diff-add-active"] = diffAdd[isDark ? 10 : 11]
|
||||
tokens["icon-diff-delete-base"] = diffDelete[9]
|
||||
tokens["icon-diff-delete-hover"] = diffDelete[isDark ? 10 : 10]
|
||||
tokens["icon-diff-modified-base"] = modified()
|
||||
|
||||
if (colors.compact) {
|
||||
tokens["syntax-comment"] = "var(--text-weak)"
|
||||
tokens["syntax-regexp"] = "var(--text-base)"
|
||||
tokens["syntax-string"] = content(colors.success, success)
|
||||
tokens["syntax-keyword"] = content(colors.accent, accent)
|
||||
tokens["syntax-primitive"] = content(colors.primary, primary)
|
||||
tokens["syntax-operator"] = isDark ? "var(--text-weak)" : "var(--text-base)"
|
||||
tokens["syntax-variable"] = "var(--text-strong)"
|
||||
tokens["syntax-property"] = content(colors.info, info)
|
||||
tokens["syntax-type"] = content(colors.warning, warning)
|
||||
tokens["syntax-constant"] = content(colors.accent, accent)
|
||||
tokens["syntax-punctuation"] = isDark ? "var(--text-weak)" : "var(--text-base)"
|
||||
tokens["syntax-object"] = "var(--text-strong)"
|
||||
tokens["syntax-success"] = success[10]
|
||||
tokens["syntax-warning"] = amber[10]
|
||||
tokens["syntax-critical"] = error[10]
|
||||
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[10]
|
||||
tokens["syntax-warning"] = amber[10]
|
||||
tokens["syntax-critical"] = error[10]
|
||||
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-mint"] = isDark ? "#033a34" : "#e1fbf4"
|
||||
tokens["avatar-background-orange"] = isDark ? "#5f2a06" : "#fff1e7"
|
||||
tokens["avatar-background-purple"] = isDark ? "#432155" : "#f9f1fe"
|
||||
tokens["avatar-background-cyan"] = isDark ? "#0f3058" : "#e7f9fb"
|
||||
tokens["avatar-background-lime"] = isDark ? "#2b3711" : "#eefadc"
|
||||
tokens["avatar-text-pink"] = isDark ? "#e34ba9" : "#cd1d8d"
|
||||
tokens["avatar-text-mint"] = isDark ? "#95f3d9" : "#147d6f"
|
||||
tokens["avatar-text-orange"] = isDark ? "#ff802b" : "#ed5f00"
|
||||
tokens["avatar-text-purple"] = isDark ? "#9d5bd2" : "#8445bc"
|
||||
tokens["avatar-text-cyan"] = isDark ? "#369eff" : "#0894b3"
|
||||
tokens["avatar-text-lime"] = isDark ? "#c4f042" : "#5d770d"
|
||||
|
||||
for (const [key, value] of Object.entries(overrides)) {
|
||||
tokens[key] = value
|
||||
}
|
||||
|
||||
if (colors.compact && "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) {
|
||||
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
|
||||
}
|
||||
|
||||
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 generateNeutralAlphaScale(neutralScale: HexColor[], isDark: boolean): HexColor[] {
|
||||
const alphas = isDark
|
||||
? [0.038, 0.066, 0.1, 0.142, 0.19, 0.252, 0.334, 0.446, 0.58, 0.718, 0.854, 0.985]
|
||||
: [0.03, 0.06, 0.1, 0.145, 0.2, 0.265, 0.35, 0.47, 0.61, 0.74, 0.86, 0.97]
|
||||
|
||||
return alphas.map((alpha) => blend(neutralScale[11], neutralScale[0], alpha))
|
||||
}
|
||||
|
||||
function getHex(value: ColorValue | undefined): HexColor | undefined {
|
||||
if (!value?.startsWith("#")) return
|
||||
return value as HexColor
|
||||
}
|
||||
|
||||
export function resolveTheme(theme: DesktopTheme): { light: ResolvedTheme; dark: ResolvedTheme } {
|
||||
return {
|
||||
light: resolveThemeVariant(theme.light, false),
|
||||
dark: resolveThemeVariant(theme.dark, true),
|
||||
}
|
||||
}
|
||||
|
||||
export function themeToCss(tokens: ResolvedTheme): string {
|
||||
return Object.entries(tokens)
|
||||
.map(([key, value]) => `--${key}: ${value};`)
|
||||
.join("\n ")
|
||||
}
|
||||
49
qimingcode/packages/ui/src/theme/themes/amoled.json
Normal file
49
qimingcode/packages/ui/src/theme/themes/amoled.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "AMOLED",
|
||||
"id": "amoled",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f0f0f0",
|
||||
"ink": "#0a0a0a",
|
||||
"primary": "#6200ff",
|
||||
"accent": "#ff0080",
|
||||
"success": "#00e676",
|
||||
"warning": "#ffab00",
|
||||
"error": "#ff1744",
|
||||
"info": "#00b0ff",
|
||||
"diffAdd": "#00e676",
|
||||
"diffDelete": "#ff1744"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#757575",
|
||||
"syntax-keyword": "#d500f9",
|
||||
"syntax-string": "#00e676",
|
||||
"syntax-primitive": "#00b0ff",
|
||||
"syntax-property": "#ff9100",
|
||||
"syntax-constant": "#6200ff"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#000000",
|
||||
"ink": "#ffffff",
|
||||
"primary": "#b388ff",
|
||||
"accent": "#ff4081",
|
||||
"success": "#00ff88",
|
||||
"warning": "#ffea00",
|
||||
"error": "#ff1744",
|
||||
"info": "#18ffff",
|
||||
"diffAdd": "#00ff88",
|
||||
"diffDelete": "#ff1744"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#555555",
|
||||
"syntax-keyword": "#ff00ff",
|
||||
"syntax-string": "#00ff88",
|
||||
"syntax-primitive": "#18ffff",
|
||||
"syntax-property": "#ffea00",
|
||||
"syntax-constant": "#b388ff"
|
||||
}
|
||||
}
|
||||
}
|
||||
51
qimingcode/packages/ui/src/theme/themes/aura.json
Normal file
51
qimingcode/packages/ui/src/theme/themes/aura.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Aura",
|
||||
"id": "aura",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f5f0ff",
|
||||
"ink": "#2d2640",
|
||||
"primary": "#a277ff",
|
||||
"accent": "#d94f4f",
|
||||
"success": "#40bf7a",
|
||||
"warning": "#d9a24a",
|
||||
"error": "#d94f4f",
|
||||
"info": "#5bb8d9",
|
||||
"diffAdd": "#b3e6cc",
|
||||
"diffDelete": "#f5b3b3"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#8d88a3",
|
||||
"syntax-keyword": "#7b5ae0",
|
||||
"syntax-string": "#2b8a57",
|
||||
"syntax-primitive": "#2f78b8",
|
||||
"syntax-property": "#a96a22",
|
||||
"syntax-type": "#2b8a57",
|
||||
"syntax-constant": "#d94f4f"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#15141b",
|
||||
"ink": "#edecee",
|
||||
"primary": "#a277ff",
|
||||
"accent": "#ff6767",
|
||||
"success": "#61ffca",
|
||||
"warning": "#ffca85",
|
||||
"error": "#ff6767",
|
||||
"info": "#82e2ff",
|
||||
"diffAdd": "#61ffca",
|
||||
"diffDelete": "#ff6767"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6d6a7e",
|
||||
"syntax-keyword": "#a277ff",
|
||||
"syntax-string": "#61ffca",
|
||||
"syntax-primitive": "#82e2ff",
|
||||
"syntax-property": "#ffca85",
|
||||
"syntax-type": "#61ffca",
|
||||
"syntax-constant": "#ff6767"
|
||||
}
|
||||
}
|
||||
}
|
||||
51
qimingcode/packages/ui/src/theme/themes/ayu.json
Normal file
51
qimingcode/packages/ui/src/theme/themes/ayu.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Ayu",
|
||||
"id": "ayu",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fdfaf4",
|
||||
"ink": "#4f5964",
|
||||
"primary": "#4aa8c8",
|
||||
"accent": "#ef7d71",
|
||||
"success": "#5fb978",
|
||||
"warning": "#ea9f41",
|
||||
"error": "#e6656a",
|
||||
"info": "#2f9bce",
|
||||
"diffAdd": "#b1d780",
|
||||
"diffDelete": "#e6656a"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6e7681",
|
||||
"syntax-keyword": "#c76a1a",
|
||||
"syntax-string": "#6f8f00",
|
||||
"syntax-primitive": "#b87500",
|
||||
"syntax-property": "#2f86b7",
|
||||
"syntax-type": "#227fc0",
|
||||
"syntax-constant": "#a37acc"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#0f1419",
|
||||
"ink": "#d6dae0",
|
||||
"primary": "#3fb7e3",
|
||||
"accent": "#f2856f",
|
||||
"success": "#78d05c",
|
||||
"warning": "#e4a75c",
|
||||
"error": "#f58572",
|
||||
"info": "#66c6f1",
|
||||
"diffAdd": "#59c57c",
|
||||
"diffDelete": "#f58572"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#5a6673",
|
||||
"syntax-keyword": "#ff8f40",
|
||||
"syntax-string": "#aad94c",
|
||||
"syntax-primitive": "#ffb454",
|
||||
"syntax-property": "#39bae6",
|
||||
"syntax-type": "#59c2ff",
|
||||
"syntax-constant": "#d2a6ff"
|
||||
}
|
||||
}
|
||||
}
|
||||
53
qimingcode/packages/ui/src/theme/themes/carbonfox.json
Normal file
53
qimingcode/packages/ui/src/theme/themes/carbonfox.json
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Carbonfox",
|
||||
"id": "carbonfox",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#8e8e8e",
|
||||
"ink": "#161616",
|
||||
"primary": "#0072c3",
|
||||
"accent": "#da1e28",
|
||||
"success": "#198038",
|
||||
"warning": "#f1c21b",
|
||||
"error": "#da1e28",
|
||||
"info": "#0043ce",
|
||||
"interactive": "#0f62fe",
|
||||
"diffAdd": "#198038",
|
||||
"diffDelete": "#da1e28"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6f6f6f",
|
||||
"syntax-keyword": "#8a3ffc",
|
||||
"syntax-string": "#198038",
|
||||
"syntax-primitive": "#0f62fe",
|
||||
"syntax-property": "#0043ce",
|
||||
"syntax-type": "#8a5f00",
|
||||
"syntax-constant": "#da1e28"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#393939",
|
||||
"ink": "#f2f4f8",
|
||||
"primary": "#33b1ff",
|
||||
"accent": "#ff8389",
|
||||
"success": "#42be65",
|
||||
"warning": "#f1c21b",
|
||||
"error": "#ff8389",
|
||||
"info": "#78a9ff",
|
||||
"interactive": "#4589ff",
|
||||
"diffAdd": "#42be65",
|
||||
"diffDelete": "#ff8389"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6f6f6f",
|
||||
"syntax-keyword": "#be95ff",
|
||||
"syntax-string": "#42be65",
|
||||
"syntax-primitive": "#33b1ff",
|
||||
"syntax-property": "#78a9ff",
|
||||
"syntax-type": "#f1c21b",
|
||||
"syntax-constant": "#ff8389"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Catppuccin Frappe",
|
||||
"id": "catppuccin-frappe",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#303446",
|
||||
"ink": "#c6d0f5",
|
||||
"primary": "#8da4e2",
|
||||
"accent": "#f4b8e4",
|
||||
"success": "#a6d189",
|
||||
"warning": "#e5c890",
|
||||
"error": "#e78284",
|
||||
"info": "#81c8be"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#b5bfe2",
|
||||
"syntax-comment": "#949cb8",
|
||||
"syntax-keyword": "#ca9ee6",
|
||||
"syntax-string": "#a6d189",
|
||||
"syntax-primitive": "#8da4e2",
|
||||
"syntax-variable": "#e78284",
|
||||
"syntax-property": "#99d1db",
|
||||
"syntax-type": "#e5c890",
|
||||
"syntax-constant": "#ef9f76",
|
||||
"syntax-operator": "#99d1db",
|
||||
"syntax-punctuation": "#c6d0f5",
|
||||
"syntax-object": "#e78284",
|
||||
"markdown-heading": "#ca9ee6",
|
||||
"markdown-text": "#c6d0f5",
|
||||
"markdown-link": "#8da4e2",
|
||||
"markdown-link-text": "#99d1db",
|
||||
"markdown-code": "#a6d189",
|
||||
"markdown-block-quote": "#e5c890",
|
||||
"markdown-emph": "#e5c890",
|
||||
"markdown-strong": "#ef9f76",
|
||||
"markdown-horizontal-rule": "#a5adce",
|
||||
"markdown-list-item": "#8da4e2",
|
||||
"markdown-list-enumeration": "#99d1db",
|
||||
"markdown-image": "#8da4e2",
|
||||
"markdown-image-text": "#99d1db",
|
||||
"markdown-code-block": "#c6d0f5"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#303446",
|
||||
"ink": "#c6d0f5",
|
||||
"primary": "#8da4e2",
|
||||
"accent": "#f4b8e4",
|
||||
"success": "#a6d189",
|
||||
"warning": "#e5c890",
|
||||
"error": "#e78284",
|
||||
"info": "#81c8be"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#b5bfe2",
|
||||
"syntax-comment": "#949cb8",
|
||||
"syntax-keyword": "#ca9ee6",
|
||||
"syntax-string": "#a6d189",
|
||||
"syntax-primitive": "#8da4e2",
|
||||
"syntax-variable": "#e78284",
|
||||
"syntax-property": "#99d1db",
|
||||
"syntax-type": "#e5c890",
|
||||
"syntax-constant": "#ef9f76",
|
||||
"syntax-operator": "#99d1db",
|
||||
"syntax-punctuation": "#c6d0f5",
|
||||
"syntax-object": "#e78284",
|
||||
"markdown-heading": "#ca9ee6",
|
||||
"markdown-text": "#c6d0f5",
|
||||
"markdown-link": "#8da4e2",
|
||||
"markdown-link-text": "#99d1db",
|
||||
"markdown-code": "#a6d189",
|
||||
"markdown-block-quote": "#e5c890",
|
||||
"markdown-emph": "#e5c890",
|
||||
"markdown-strong": "#ef9f76",
|
||||
"markdown-horizontal-rule": "#a5adce",
|
||||
"markdown-list-item": "#8da4e2",
|
||||
"markdown-list-enumeration": "#99d1db",
|
||||
"markdown-image": "#8da4e2",
|
||||
"markdown-image-text": "#99d1db",
|
||||
"markdown-code-block": "#c6d0f5"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Catppuccin Macchiato",
|
||||
"id": "catppuccin-macchiato",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#24273a",
|
||||
"ink": "#cad3f5",
|
||||
"primary": "#8aadf4",
|
||||
"accent": "#f5bde6",
|
||||
"success": "#a6da95",
|
||||
"warning": "#eed49f",
|
||||
"error": "#ed8796",
|
||||
"info": "#8bd5ca"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#b8c0e0",
|
||||
"syntax-comment": "#939ab7",
|
||||
"syntax-keyword": "#c6a0f6",
|
||||
"syntax-string": "#a6da95",
|
||||
"syntax-primitive": "#8aadf4",
|
||||
"syntax-variable": "#ed8796",
|
||||
"syntax-property": "#91d7e3",
|
||||
"syntax-type": "#eed49f",
|
||||
"syntax-constant": "#f5a97f",
|
||||
"syntax-operator": "#91d7e3",
|
||||
"syntax-punctuation": "#cad3f5",
|
||||
"syntax-object": "#ed8796",
|
||||
"markdown-heading": "#c6a0f6",
|
||||
"markdown-text": "#cad3f5",
|
||||
"markdown-link": "#8aadf4",
|
||||
"markdown-link-text": "#91d7e3",
|
||||
"markdown-code": "#a6da95",
|
||||
"markdown-block-quote": "#eed49f",
|
||||
"markdown-emph": "#eed49f",
|
||||
"markdown-strong": "#f5a97f",
|
||||
"markdown-horizontal-rule": "#a5adcb",
|
||||
"markdown-list-item": "#8aadf4",
|
||||
"markdown-list-enumeration": "#91d7e3",
|
||||
"markdown-image": "#8aadf4",
|
||||
"markdown-image-text": "#91d7e3",
|
||||
"markdown-code-block": "#cad3f5"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#24273a",
|
||||
"ink": "#cad3f5",
|
||||
"primary": "#8aadf4",
|
||||
"accent": "#f5bde6",
|
||||
"success": "#a6da95",
|
||||
"warning": "#eed49f",
|
||||
"error": "#ed8796",
|
||||
"info": "#8bd5ca"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#b8c0e0",
|
||||
"syntax-comment": "#939ab7",
|
||||
"syntax-keyword": "#c6a0f6",
|
||||
"syntax-string": "#a6da95",
|
||||
"syntax-primitive": "#8aadf4",
|
||||
"syntax-variable": "#ed8796",
|
||||
"syntax-property": "#91d7e3",
|
||||
"syntax-type": "#eed49f",
|
||||
"syntax-constant": "#f5a97f",
|
||||
"syntax-operator": "#91d7e3",
|
||||
"syntax-punctuation": "#cad3f5",
|
||||
"syntax-object": "#ed8796",
|
||||
"markdown-heading": "#c6a0f6",
|
||||
"markdown-text": "#cad3f5",
|
||||
"markdown-link": "#8aadf4",
|
||||
"markdown-link-text": "#91d7e3",
|
||||
"markdown-code": "#a6da95",
|
||||
"markdown-block-quote": "#eed49f",
|
||||
"markdown-emph": "#eed49f",
|
||||
"markdown-strong": "#f5a97f",
|
||||
"markdown-horizontal-rule": "#a5adcb",
|
||||
"markdown-list-item": "#8aadf4",
|
||||
"markdown-list-enumeration": "#91d7e3",
|
||||
"markdown-image": "#8aadf4",
|
||||
"markdown-image-text": "#91d7e3",
|
||||
"markdown-code-block": "#cad3f5"
|
||||
}
|
||||
}
|
||||
}
|
||||
45
qimingcode/packages/ui/src/theme/themes/catppuccin.json
Normal file
45
qimingcode/packages/ui/src/theme/themes/catppuccin.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Catppuccin",
|
||||
"id": "catppuccin",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f5e0dc",
|
||||
"ink": "#4c4f69",
|
||||
"primary": "#7287fd",
|
||||
"accent": "#d20f39",
|
||||
"success": "#40a02b",
|
||||
"warning": "#df8e1d",
|
||||
"error": "#d20f39",
|
||||
"info": "#04a5e5",
|
||||
"diffAdd": "#a6d189",
|
||||
"diffDelete": "#e78284"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6c7086",
|
||||
"syntax-keyword": "#8839ef",
|
||||
"syntax-primitive": "#1e66f5",
|
||||
"syntax-constant": "#ca6702"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#1e1e2e",
|
||||
"ink": "#cdd6f4",
|
||||
"primary": "#b4befe",
|
||||
"accent": "#f38ba8",
|
||||
"success": "#a6d189",
|
||||
"warning": "#f4b8e4",
|
||||
"error": "#f38ba8",
|
||||
"info": "#89dceb",
|
||||
"diffAdd": "#94e2d5",
|
||||
"diffDelete": "#f38ba8"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6c7086",
|
||||
"syntax-keyword": "#cba6f7",
|
||||
"syntax-primitive": "#89b4fa",
|
||||
"syntax-constant": "#fab387"
|
||||
}
|
||||
}
|
||||
}
|
||||
87
qimingcode/packages/ui/src/theme/themes/cobalt2.json
Normal file
87
qimingcode/packages/ui/src/theme/themes/cobalt2.json
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Cobalt2",
|
||||
"id": "cobalt2",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#ffffff",
|
||||
"ink": "#193549",
|
||||
"primary": "#0066cc",
|
||||
"accent": "#00acc1",
|
||||
"success": "#4caf50",
|
||||
"warning": "#ff9800",
|
||||
"error": "#e91e63",
|
||||
"info": "#ff5722"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#5c6b7d",
|
||||
"syntax-comment": "#5c6b7d",
|
||||
"syntax-keyword": "#ff5722",
|
||||
"syntax-string": "#4caf50",
|
||||
"syntax-primitive": "#ff9800",
|
||||
"syntax-variable": "#193549",
|
||||
"syntax-property": "#00acc1",
|
||||
"syntax-type": "#00acc1",
|
||||
"syntax-constant": "#e91e63",
|
||||
"syntax-operator": "#ff5722",
|
||||
"syntax-punctuation": "#193549",
|
||||
"syntax-object": "#193549",
|
||||
"markdown-heading": "#ff9800",
|
||||
"markdown-text": "#193549",
|
||||
"markdown-link": "#0066cc",
|
||||
"markdown-link-text": "#00acc1",
|
||||
"markdown-code": "#4caf50",
|
||||
"markdown-block-quote": "#5c6b7d",
|
||||
"markdown-emph": "#ff5722",
|
||||
"markdown-strong": "#e91e63",
|
||||
"markdown-horizontal-rule": "#d3dae3",
|
||||
"markdown-list-item": "#0066cc",
|
||||
"markdown-list-enumeration": "#00acc1",
|
||||
"markdown-image": "#0066cc",
|
||||
"markdown-image-text": "#00acc1",
|
||||
"markdown-code-block": "#193549"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#193549",
|
||||
"ink": "#ffffff",
|
||||
"primary": "#0088ff",
|
||||
"accent": "#2affdf",
|
||||
"success": "#9eff80",
|
||||
"warning": "#ffc600",
|
||||
"error": "#ff0088",
|
||||
"info": "#ff9d00",
|
||||
"diffAdd": "#b9ff9f",
|
||||
"diffDelete": "#ff5fb3"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#adb7c9",
|
||||
"syntax-comment": "#0088ff",
|
||||
"syntax-keyword": "#ff9d00",
|
||||
"syntax-string": "#9eff80",
|
||||
"syntax-primitive": "#ffc600",
|
||||
"syntax-variable": "#ffffff",
|
||||
"syntax-property": "#2affdf",
|
||||
"syntax-type": "#2affdf",
|
||||
"syntax-constant": "#ff628c",
|
||||
"syntax-operator": "#ff9d00",
|
||||
"syntax-punctuation": "#ffffff",
|
||||
"syntax-object": "#ffffff",
|
||||
"markdown-heading": "#ffc600",
|
||||
"markdown-text": "#ffffff",
|
||||
"markdown-link": "#0088ff",
|
||||
"markdown-link-text": "#2affdf",
|
||||
"markdown-code": "#9eff80",
|
||||
"markdown-block-quote": "#adb7c9",
|
||||
"markdown-emph": "#ff9d00",
|
||||
"markdown-strong": "#ff628c",
|
||||
"markdown-horizontal-rule": "#2d5a7b",
|
||||
"markdown-list-item": "#0088ff",
|
||||
"markdown-list-enumeration": "#2affdf",
|
||||
"markdown-image": "#0088ff",
|
||||
"markdown-image-text": "#2affdf",
|
||||
"markdown-code-block": "#ffffff"
|
||||
}
|
||||
}
|
||||
}
|
||||
91
qimingcode/packages/ui/src/theme/themes/cursor.json
Normal file
91
qimingcode/packages/ui/src/theme/themes/cursor.json
Normal file
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Cursor",
|
||||
"id": "cursor",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fcfcfc",
|
||||
"ink": "#141414",
|
||||
"primary": "#6f9ba6",
|
||||
"accent": "#6f9ba6",
|
||||
"success": "#1f8a65",
|
||||
"warning": "#db704b",
|
||||
"error": "#cf2d56",
|
||||
"info": "#3c7cab",
|
||||
"interactive": "#206595",
|
||||
"diffAdd": "#55a583",
|
||||
"diffDelete": "#e75e78"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#141414ad",
|
||||
"syntax-comment": "#141414ad",
|
||||
"syntax-keyword": "#b3003f",
|
||||
"syntax-string": "#9e94d5",
|
||||
"syntax-primitive": "#db704b",
|
||||
"syntax-variable": "#141414",
|
||||
"syntax-property": "#141414ad",
|
||||
"syntax-type": "#206595",
|
||||
"syntax-constant": "#b8448b",
|
||||
"syntax-operator": "#141414",
|
||||
"syntax-punctuation": "#141414",
|
||||
"syntax-object": "#141414",
|
||||
"markdown-heading": "#206595",
|
||||
"markdown-text": "#141414",
|
||||
"markdown-link": "#206595",
|
||||
"markdown-link-text": "#141414ad",
|
||||
"markdown-code": "#1f8a65",
|
||||
"markdown-block-quote": "#141414ad",
|
||||
"markdown-emph": "#141414",
|
||||
"markdown-strong": "#141414",
|
||||
"markdown-horizontal-rule": "#141414ad",
|
||||
"markdown-list-item": "#141414",
|
||||
"markdown-list-enumeration": "#141414ad",
|
||||
"markdown-image": "#206595",
|
||||
"markdown-image-text": "#141414ad",
|
||||
"markdown-code-block": "#141414"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#181818",
|
||||
"ink": "#e4e4e4",
|
||||
"primary": "#88c0d0",
|
||||
"accent": "#88c0d0",
|
||||
"success": "#3fa266",
|
||||
"warning": "#f1b467",
|
||||
"error": "#e34671",
|
||||
"info": "#81a1c1",
|
||||
"interactive": "#82D2CE",
|
||||
"diffAdd": "#70b489",
|
||||
"diffDelete": "#fc6b83"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#e4e4e45e",
|
||||
"syntax-comment": "#e4e4e45e",
|
||||
"syntax-keyword": "#82D2CE",
|
||||
"syntax-string": "#E394DC",
|
||||
"syntax-primitive": "#EFB080",
|
||||
"syntax-variable": "#e4e4e4",
|
||||
"syntax-property": "#81a1c1",
|
||||
"syntax-type": "#EFB080",
|
||||
"syntax-constant": "#F8C762",
|
||||
"syntax-operator": "#e4e4e4",
|
||||
"syntax-punctuation": "#e4e4e4",
|
||||
"syntax-object": "#e4e4e4",
|
||||
"markdown-heading": "#AAA0FA",
|
||||
"markdown-text": "#e4e4e4",
|
||||
"markdown-link": "#82D2CE",
|
||||
"markdown-link-text": "#81a1c1",
|
||||
"markdown-code": "#E394DC",
|
||||
"markdown-block-quote": "#e4e4e45e",
|
||||
"markdown-emph": "#82D2CE",
|
||||
"markdown-strong": "#F8C762",
|
||||
"markdown-horizontal-rule": "#e4e4e45e",
|
||||
"markdown-list-item": "#e4e4e4",
|
||||
"markdown-list-enumeration": "#88c0d0",
|
||||
"markdown-image": "#88c0d0",
|
||||
"markdown-image-text": "#81a1c1",
|
||||
"markdown-code-block": "#e4e4e4"
|
||||
}
|
||||
}
|
||||
}
|
||||
49
qimingcode/packages/ui/src/theme/themes/dracula.json
Normal file
49
qimingcode/packages/ui/src/theme/themes/dracula.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Dracula",
|
||||
"id": "dracula",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f8f8f2",
|
||||
"ink": "#1f1f2f",
|
||||
"primary": "#7c6bf5",
|
||||
"accent": "#d16090",
|
||||
"success": "#2fbf71",
|
||||
"warning": "#f7a14d",
|
||||
"error": "#d9536f",
|
||||
"info": "#1d7fc5",
|
||||
"diffAdd": "#9fe3b3",
|
||||
"diffDelete": "#f8a1b8"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#7d7f97",
|
||||
"syntax-keyword": "#d16090",
|
||||
"syntax-string": "#596600",
|
||||
"syntax-primitive": "#2f8f57",
|
||||
"syntax-property": "#1d7fc5",
|
||||
"syntax-constant": "#7c6bf5"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#1d1e28",
|
||||
"ink": "#f8f8f2",
|
||||
"primary": "#bd93f9",
|
||||
"accent": "#ff79c6",
|
||||
"success": "#50fa7b",
|
||||
"warning": "#ffb86c",
|
||||
"error": "#ff5555",
|
||||
"info": "#8be9fd",
|
||||
"diffAdd": "#2fb27d",
|
||||
"diffDelete": "#ff6b81"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6272a4",
|
||||
"syntax-keyword": "#ff79c6",
|
||||
"syntax-string": "#f1fa8c",
|
||||
"syntax-primitive": "#50fa7b",
|
||||
"syntax-property": "#8be9fd",
|
||||
"syntax-constant": "#bd93f9"
|
||||
}
|
||||
}
|
||||
}
|
||||
89
qimingcode/packages/ui/src/theme/themes/everforest.json
Normal file
89
qimingcode/packages/ui/src/theme/themes/everforest.json
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Everforest",
|
||||
"id": "everforest",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fdf6e3",
|
||||
"ink": "#5c6a72",
|
||||
"primary": "#8da101",
|
||||
"accent": "#df69ba",
|
||||
"success": "#8da101",
|
||||
"warning": "#f57d26",
|
||||
"error": "#f85552",
|
||||
"info": "#35a77c",
|
||||
"diffAdd": "#4db380",
|
||||
"diffDelete": "#f52a65"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#a6b0a0",
|
||||
"syntax-comment": "#a6b0a0",
|
||||
"syntax-keyword": "#df69ba",
|
||||
"syntax-string": "#8da101",
|
||||
"syntax-primitive": "#8da101",
|
||||
"syntax-variable": "#f85552",
|
||||
"syntax-property": "#35a77c",
|
||||
"syntax-type": "#dfa000",
|
||||
"syntax-constant": "#f57d26",
|
||||
"syntax-operator": "#35a77c",
|
||||
"syntax-punctuation": "#5c6a72",
|
||||
"syntax-object": "#f85552",
|
||||
"markdown-heading": "#df69ba",
|
||||
"markdown-text": "#5c6a72",
|
||||
"markdown-link": "#8da101",
|
||||
"markdown-link-text": "#35a77c",
|
||||
"markdown-code": "#8da101",
|
||||
"markdown-block-quote": "#dfa000",
|
||||
"markdown-emph": "#dfa000",
|
||||
"markdown-strong": "#f57d26",
|
||||
"markdown-horizontal-rule": "#a6b0a0",
|
||||
"markdown-list-item": "#8da101",
|
||||
"markdown-list-enumeration": "#35a77c",
|
||||
"markdown-image": "#8da101",
|
||||
"markdown-image-text": "#35a77c",
|
||||
"markdown-code-block": "#5c6a72"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#2d353b",
|
||||
"ink": "#d3c6aa",
|
||||
"primary": "#a7c080",
|
||||
"accent": "#d699b6",
|
||||
"success": "#a7c080",
|
||||
"warning": "#e69875",
|
||||
"error": "#e67e80",
|
||||
"info": "#83c092",
|
||||
"diffAdd": "#b8db87",
|
||||
"diffDelete": "#e26a75"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#7a8478",
|
||||
"syntax-comment": "#7a8478",
|
||||
"syntax-keyword": "#d699b6",
|
||||
"syntax-string": "#a7c080",
|
||||
"syntax-primitive": "#a7c080",
|
||||
"syntax-variable": "#e67e80",
|
||||
"syntax-property": "#83c092",
|
||||
"syntax-type": "#dbbc7f",
|
||||
"syntax-constant": "#e69875",
|
||||
"syntax-operator": "#83c092",
|
||||
"syntax-punctuation": "#d3c6aa",
|
||||
"syntax-object": "#e67e80",
|
||||
"markdown-heading": "#d699b6",
|
||||
"markdown-text": "#d3c6aa",
|
||||
"markdown-link": "#a7c080",
|
||||
"markdown-link-text": "#83c092",
|
||||
"markdown-code": "#a7c080",
|
||||
"markdown-block-quote": "#dbbc7f",
|
||||
"markdown-emph": "#dbbc7f",
|
||||
"markdown-strong": "#e69875",
|
||||
"markdown-horizontal-rule": "#7a8478",
|
||||
"markdown-list-item": "#a7c080",
|
||||
"markdown-list-enumeration": "#83c092",
|
||||
"markdown-image": "#a7c080",
|
||||
"markdown-image-text": "#83c092",
|
||||
"markdown-code-block": "#d3c6aa"
|
||||
}
|
||||
}
|
||||
}
|
||||
86
qimingcode/packages/ui/src/theme/themes/flexoki.json
Normal file
86
qimingcode/packages/ui/src/theme/themes/flexoki.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Flexoki",
|
||||
"id": "flexoki",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#FFFCF0",
|
||||
"ink": "#100F0F",
|
||||
"primary": "#205EA6",
|
||||
"accent": "#BC5215",
|
||||
"success": "#66800B",
|
||||
"warning": "#BC5215",
|
||||
"error": "#AF3029",
|
||||
"info": "#24837B"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#6F6E69",
|
||||
"syntax-comment": "#6F6E69",
|
||||
"syntax-keyword": "#66800B",
|
||||
"syntax-string": "#24837B",
|
||||
"syntax-primitive": "#BC5215",
|
||||
"syntax-variable": "#205EA6",
|
||||
"syntax-property": "#24837B",
|
||||
"syntax-type": "#AD8301",
|
||||
"syntax-constant": "#5E409D",
|
||||
"syntax-operator": "#6F6E69",
|
||||
"syntax-punctuation": "#6F6E69",
|
||||
"syntax-object": "#205EA6",
|
||||
"markdown-heading": "#5E409D",
|
||||
"markdown-text": "#100F0F",
|
||||
"markdown-link": "#205EA6",
|
||||
"markdown-link-text": "#24837B",
|
||||
"markdown-code": "#24837B",
|
||||
"markdown-block-quote": "#AD8301",
|
||||
"markdown-emph": "#AD8301",
|
||||
"markdown-strong": "#BC5215",
|
||||
"markdown-horizontal-rule": "#6F6E69",
|
||||
"markdown-list-item": "#BC5215",
|
||||
"markdown-list-enumeration": "#24837B",
|
||||
"markdown-image": "#A02F6F",
|
||||
"markdown-image-text": "#24837B",
|
||||
"markdown-code-block": "#100F0F"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#100F0F",
|
||||
"ink": "#CECDC3",
|
||||
"primary": "#DA702C",
|
||||
"accent": "#8B7EC8",
|
||||
"success": "#879A39",
|
||||
"warning": "#DA702C",
|
||||
"error": "#D14D41",
|
||||
"info": "#3AA99F",
|
||||
"interactive": "#4385BE"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#6F6E69",
|
||||
"syntax-comment": "#6F6E69",
|
||||
"syntax-keyword": "#879A39",
|
||||
"syntax-string": "#3AA99F",
|
||||
"syntax-primitive": "#DA702C",
|
||||
"syntax-variable": "#4385BE",
|
||||
"syntax-property": "#3AA99F",
|
||||
"syntax-type": "#D0A215",
|
||||
"syntax-constant": "#8B7EC8",
|
||||
"syntax-operator": "#B7B5AC",
|
||||
"syntax-punctuation": "#B7B5AC",
|
||||
"syntax-object": "#4385BE",
|
||||
"markdown-heading": "#8B7EC8",
|
||||
"markdown-text": "#CECDC3",
|
||||
"markdown-link": "#4385BE",
|
||||
"markdown-link-text": "#3AA99F",
|
||||
"markdown-code": "#3AA99F",
|
||||
"markdown-block-quote": "#D0A215",
|
||||
"markdown-emph": "#D0A215",
|
||||
"markdown-strong": "#DA702C",
|
||||
"markdown-horizontal-rule": "#6F6E69",
|
||||
"markdown-list-item": "#DA702C",
|
||||
"markdown-list-enumeration": "#3AA99F",
|
||||
"markdown-image": "#CE5D97",
|
||||
"markdown-image-text": "#3AA99F",
|
||||
"markdown-code-block": "#CECDC3"
|
||||
}
|
||||
}
|
||||
}
|
||||
85
qimingcode/packages/ui/src/theme/themes/github.json
Normal file
85
qimingcode/packages/ui/src/theme/themes/github.json
Normal file
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "GitHub",
|
||||
"id": "github",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#ffffff",
|
||||
"ink": "#24292f",
|
||||
"primary": "#0969da",
|
||||
"accent": "#1b7c83",
|
||||
"success": "#1a7f37",
|
||||
"warning": "#9a6700",
|
||||
"error": "#cf222e",
|
||||
"info": "#bc4c00"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#57606a",
|
||||
"syntax-comment": "#57606a",
|
||||
"syntax-keyword": "#cf222e",
|
||||
"syntax-string": "#0969da",
|
||||
"syntax-primitive": "#8250df",
|
||||
"syntax-variable": "#bc4c00",
|
||||
"syntax-property": "#1b7c83",
|
||||
"syntax-type": "#bc4c00",
|
||||
"syntax-constant": "#1b7c83",
|
||||
"syntax-operator": "#cf222e",
|
||||
"syntax-punctuation": "#24292f",
|
||||
"syntax-object": "#bc4c00",
|
||||
"markdown-heading": "#0969da",
|
||||
"markdown-text": "#24292f",
|
||||
"markdown-link": "#0969da",
|
||||
"markdown-link-text": "#1b7c83",
|
||||
"markdown-code": "#bf3989",
|
||||
"markdown-block-quote": "#57606a",
|
||||
"markdown-emph": "#9a6700",
|
||||
"markdown-strong": "#bc4c00",
|
||||
"markdown-horizontal-rule": "#d0d7de",
|
||||
"markdown-list-item": "#0969da",
|
||||
"markdown-list-enumeration": "#1b7c83",
|
||||
"markdown-image": "#0969da",
|
||||
"markdown-image-text": "#1b7c83",
|
||||
"markdown-code-block": "#24292f"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#0d1117",
|
||||
"ink": "#c9d1d9",
|
||||
"primary": "#58a6ff",
|
||||
"accent": "#39c5cf",
|
||||
"success": "#3fb950",
|
||||
"warning": "#e3b341",
|
||||
"error": "#f85149",
|
||||
"info": "#d29922"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#8b949e",
|
||||
"syntax-comment": "#8b949e",
|
||||
"syntax-keyword": "#ff7b72",
|
||||
"syntax-string": "#39c5cf",
|
||||
"syntax-primitive": "#bc8cff",
|
||||
"syntax-variable": "#d29922",
|
||||
"syntax-property": "#39c5cf",
|
||||
"syntax-type": "#d29922",
|
||||
"syntax-constant": "#58a6ff",
|
||||
"syntax-operator": "#ff7b72",
|
||||
"syntax-punctuation": "#c9d1d9",
|
||||
"syntax-object": "#d29922",
|
||||
"markdown-heading": "#58a6ff",
|
||||
"markdown-text": "#c9d1d9",
|
||||
"markdown-link": "#58a6ff",
|
||||
"markdown-link-text": "#39c5cf",
|
||||
"markdown-code": "#ff7b72",
|
||||
"markdown-block-quote": "#8b949e",
|
||||
"markdown-emph": "#e3b341",
|
||||
"markdown-strong": "#d29922",
|
||||
"markdown-horizontal-rule": "#30363d",
|
||||
"markdown-list-item": "#58a6ff",
|
||||
"markdown-list-enumeration": "#39c5cf",
|
||||
"markdown-image": "#58a6ff",
|
||||
"markdown-image-text": "#39c5cf",
|
||||
"markdown-code-block": "#c9d1d9"
|
||||
}
|
||||
}
|
||||
}
|
||||
45
qimingcode/packages/ui/src/theme/themes/gruvbox.json
Normal file
45
qimingcode/packages/ui/src/theme/themes/gruvbox.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Gruvbox",
|
||||
"id": "gruvbox",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fbf1c7",
|
||||
"ink": "#3c3836",
|
||||
"primary": "#076678",
|
||||
"accent": "#9d0006",
|
||||
"success": "#79740e",
|
||||
"warning": "#b57614",
|
||||
"error": "#9d0006",
|
||||
"info": "#8f3f71",
|
||||
"diffAdd": "#79740e",
|
||||
"diffDelete": "#9d0006"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#928374",
|
||||
"syntax-keyword": "#9d0006",
|
||||
"syntax-primitive": "#076678",
|
||||
"syntax-constant": "#8f3f71"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#282828",
|
||||
"ink": "#ebdbb2",
|
||||
"primary": "#83a598",
|
||||
"accent": "#fb4934",
|
||||
"success": "#b8bb26",
|
||||
"warning": "#fabd2f",
|
||||
"error": "#fb4934",
|
||||
"info": "#d3869b",
|
||||
"diffAdd": "#b8bb26",
|
||||
"diffDelete": "#fb4934"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#928374",
|
||||
"syntax-keyword": "#fb4934",
|
||||
"syntax-primitive": "#83a598",
|
||||
"syntax-constant": "#d3869b"
|
||||
}
|
||||
}
|
||||
}
|
||||
89
qimingcode/packages/ui/src/theme/themes/kanagawa.json
Normal file
89
qimingcode/packages/ui/src/theme/themes/kanagawa.json
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Kanagawa",
|
||||
"id": "kanagawa",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#F2E9DE",
|
||||
"ink": "#54433A",
|
||||
"primary": "#2D4F67",
|
||||
"accent": "#D27E99",
|
||||
"success": "#98BB6C",
|
||||
"warning": "#D7A657",
|
||||
"error": "#E82424",
|
||||
"info": "#76946A",
|
||||
"diffAdd": "#89AF5B",
|
||||
"diffDelete": "#D61F1F"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#9E9389",
|
||||
"syntax-comment": "#9E9389",
|
||||
"syntax-keyword": "#957FB8",
|
||||
"syntax-string": "#98BB6C",
|
||||
"syntax-primitive": "#2D4F67",
|
||||
"syntax-variable": "#54433A",
|
||||
"syntax-property": "#76946A",
|
||||
"syntax-type": "#C38D9D",
|
||||
"syntax-constant": "#D7A657",
|
||||
"syntax-operator": "#D27E99",
|
||||
"syntax-punctuation": "#54433A",
|
||||
"syntax-object": "#54433A",
|
||||
"markdown-heading": "#957FB8",
|
||||
"markdown-text": "#54433A",
|
||||
"markdown-link": "#2D4F67",
|
||||
"markdown-link-text": "#76946A",
|
||||
"markdown-code": "#98BB6C",
|
||||
"markdown-block-quote": "#9E9389",
|
||||
"markdown-emph": "#C38D9D",
|
||||
"markdown-strong": "#D7A657",
|
||||
"markdown-horizontal-rule": "#9E9389",
|
||||
"markdown-list-item": "#2D4F67",
|
||||
"markdown-list-enumeration": "#76946A",
|
||||
"markdown-image": "#2D4F67",
|
||||
"markdown-image-text": "#76946A",
|
||||
"markdown-code-block": "#54433A"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#1F1F28",
|
||||
"ink": "#DCD7BA",
|
||||
"primary": "#7E9CD8",
|
||||
"accent": "#D27E99",
|
||||
"success": "#98BB6C",
|
||||
"warning": "#D7A657",
|
||||
"error": "#E82424",
|
||||
"info": "#76946A",
|
||||
"diffAdd": "#A9D977",
|
||||
"diffDelete": "#F24A4A"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#727169",
|
||||
"syntax-comment": "#727169",
|
||||
"syntax-keyword": "#957FB8",
|
||||
"syntax-string": "#98BB6C",
|
||||
"syntax-primitive": "#7E9CD8",
|
||||
"syntax-variable": "#DCD7BA",
|
||||
"syntax-property": "#76946A",
|
||||
"syntax-type": "#C38D9D",
|
||||
"syntax-constant": "#D7A657",
|
||||
"syntax-operator": "#D27E99",
|
||||
"syntax-punctuation": "#DCD7BA",
|
||||
"syntax-object": "#DCD7BA",
|
||||
"markdown-heading": "#957FB8",
|
||||
"markdown-text": "#DCD7BA",
|
||||
"markdown-link": "#7E9CD8",
|
||||
"markdown-link-text": "#76946A",
|
||||
"markdown-code": "#98BB6C",
|
||||
"markdown-block-quote": "#727169",
|
||||
"markdown-emph": "#C38D9D",
|
||||
"markdown-strong": "#D7A657",
|
||||
"markdown-horizontal-rule": "#727169",
|
||||
"markdown-list-item": "#7E9CD8",
|
||||
"markdown-list-enumeration": "#76946A",
|
||||
"markdown-image": "#7E9CD8",
|
||||
"markdown-image-text": "#76946A",
|
||||
"markdown-code-block": "#DCD7BA"
|
||||
}
|
||||
}
|
||||
}
|
||||
87
qimingcode/packages/ui/src/theme/themes/lucent-orng.json
Normal file
87
qimingcode/packages/ui/src/theme/themes/lucent-orng.json
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Lucent Orng",
|
||||
"id": "lucent-orng",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fff5f0",
|
||||
"ink": "#1a1a1a",
|
||||
"primary": "#EC5B2B",
|
||||
"accent": "#c94d24",
|
||||
"success": "#0062d1",
|
||||
"warning": "#EC5B2B",
|
||||
"error": "#d1383d",
|
||||
"info": "#318795",
|
||||
"diffDelete": "#f52a65"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#8a8a8a",
|
||||
"syntax-comment": "#8a8a8a",
|
||||
"syntax-keyword": "#EC5B2B",
|
||||
"syntax-string": "#0062d1",
|
||||
"syntax-primitive": "#c94d24",
|
||||
"syntax-variable": "#d1383d",
|
||||
"syntax-property": "#318795",
|
||||
"syntax-type": "#b0851f",
|
||||
"syntax-constant": "#EC5B2B",
|
||||
"syntax-operator": "#318795",
|
||||
"syntax-punctuation": "#1a1a1a",
|
||||
"syntax-object": "#d1383d",
|
||||
"markdown-heading": "#EC5B2B",
|
||||
"markdown-text": "#1a1a1a",
|
||||
"markdown-link": "#EC5B2B",
|
||||
"markdown-link-text": "#318795",
|
||||
"markdown-code": "#0062d1",
|
||||
"markdown-block-quote": "#b0851f",
|
||||
"markdown-emph": "#b0851f",
|
||||
"markdown-strong": "#EC5B2B",
|
||||
"markdown-horizontal-rule": "#8a8a8a",
|
||||
"markdown-list-item": "#EC5B2B",
|
||||
"markdown-list-enumeration": "#318795",
|
||||
"markdown-image": "#EC5B2B",
|
||||
"markdown-image-text": "#318795",
|
||||
"markdown-code-block": "#1a1a1a"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#2a1a15",
|
||||
"ink": "#eeeeee",
|
||||
"primary": "#EC5B2B",
|
||||
"accent": "#FFF7F1",
|
||||
"success": "#6ba1e6",
|
||||
"warning": "#EC5B2B",
|
||||
"error": "#e06c75",
|
||||
"info": "#56b6c2",
|
||||
"diffDelete": "#e26a75"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#808080",
|
||||
"syntax-comment": "#808080",
|
||||
"syntax-keyword": "#EC5B2B",
|
||||
"syntax-string": "#6ba1e6",
|
||||
"syntax-primitive": "#EE7948",
|
||||
"syntax-variable": "#e06c75",
|
||||
"syntax-property": "#56b6c2",
|
||||
"syntax-type": "#e5c07b",
|
||||
"syntax-constant": "#FFF7F1",
|
||||
"syntax-operator": "#56b6c2",
|
||||
"syntax-punctuation": "#eeeeee",
|
||||
"syntax-object": "#e06c75",
|
||||
"markdown-heading": "#EC5B2B",
|
||||
"markdown-text": "#eeeeee",
|
||||
"markdown-link": "#EC5B2B",
|
||||
"markdown-link-text": "#56b6c2",
|
||||
"markdown-code": "#6ba1e6",
|
||||
"markdown-block-quote": "#FFF7F1",
|
||||
"markdown-emph": "#e5c07b",
|
||||
"markdown-strong": "#EE7948",
|
||||
"markdown-horizontal-rule": "#808080",
|
||||
"markdown-list-item": "#EC5B2B",
|
||||
"markdown-list-enumeration": "#56b6c2",
|
||||
"markdown-image": "#EC5B2B",
|
||||
"markdown-image-text": "#56b6c2",
|
||||
"markdown-code-block": "#eeeeee"
|
||||
}
|
||||
}
|
||||
}
|
||||
87
qimingcode/packages/ui/src/theme/themes/material.json
Normal file
87
qimingcode/packages/ui/src/theme/themes/material.json
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Material",
|
||||
"id": "material",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fafafa",
|
||||
"ink": "#263238",
|
||||
"primary": "#6182b8",
|
||||
"accent": "#39adb5",
|
||||
"success": "#91b859",
|
||||
"warning": "#ffb300",
|
||||
"error": "#e53935",
|
||||
"info": "#f4511e",
|
||||
"interactive": "#39adb5"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#90a4ae",
|
||||
"syntax-comment": "#90a4ae",
|
||||
"syntax-keyword": "#7c4dff",
|
||||
"syntax-string": "#91b859",
|
||||
"syntax-primitive": "#6182b8",
|
||||
"syntax-variable": "#263238",
|
||||
"syntax-property": "#7c4dff",
|
||||
"syntax-type": "#ffb300",
|
||||
"syntax-constant": "#f4511e",
|
||||
"syntax-operator": "#39adb5",
|
||||
"syntax-punctuation": "#263238",
|
||||
"syntax-object": "#263238",
|
||||
"markdown-heading": "#6182b8",
|
||||
"markdown-text": "#263238",
|
||||
"markdown-link": "#39adb5",
|
||||
"markdown-link-text": "#7c4dff",
|
||||
"markdown-code": "#91b859",
|
||||
"markdown-block-quote": "#90a4ae",
|
||||
"markdown-emph": "#ffb300",
|
||||
"markdown-strong": "#f4511e",
|
||||
"markdown-horizontal-rule": "#e0e0e0",
|
||||
"markdown-list-item": "#6182b8",
|
||||
"markdown-list-enumeration": "#39adb5",
|
||||
"markdown-image": "#39adb5",
|
||||
"markdown-image-text": "#7c4dff",
|
||||
"markdown-code-block": "#263238"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#263238",
|
||||
"ink": "#eeffff",
|
||||
"primary": "#82aaff",
|
||||
"accent": "#89ddff",
|
||||
"success": "#c3e88d",
|
||||
"warning": "#ffcb6b",
|
||||
"error": "#f07178",
|
||||
"info": "#ffcb6b",
|
||||
"interactive": "#89ddff"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#546e7a",
|
||||
"syntax-comment": "#546e7a",
|
||||
"syntax-keyword": "#c792ea",
|
||||
"syntax-string": "#c3e88d",
|
||||
"syntax-primitive": "#82aaff",
|
||||
"syntax-variable": "#eeffff",
|
||||
"syntax-property": "#c792ea",
|
||||
"syntax-type": "#ffcb6b",
|
||||
"syntax-constant": "#ffcb6b",
|
||||
"syntax-operator": "#89ddff",
|
||||
"syntax-punctuation": "#eeffff",
|
||||
"syntax-object": "#eeffff",
|
||||
"markdown-heading": "#82aaff",
|
||||
"markdown-text": "#eeffff",
|
||||
"markdown-link": "#89ddff",
|
||||
"markdown-link-text": "#c792ea",
|
||||
"markdown-code": "#c3e88d",
|
||||
"markdown-block-quote": "#546e7a",
|
||||
"markdown-emph": "#ffcb6b",
|
||||
"markdown-strong": "#ffcb6b",
|
||||
"markdown-horizontal-rule": "#37474f",
|
||||
"markdown-list-item": "#82aaff",
|
||||
"markdown-list-enumeration": "#89ddff",
|
||||
"markdown-image": "#89ddff",
|
||||
"markdown-image-text": "#c792ea",
|
||||
"markdown-code-block": "#eeffff"
|
||||
}
|
||||
}
|
||||
}
|
||||
91
qimingcode/packages/ui/src/theme/themes/matrix.json
Normal file
91
qimingcode/packages/ui/src/theme/themes/matrix.json
Normal file
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Matrix",
|
||||
"id": "matrix",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#eef3ea",
|
||||
"ink": "#203022",
|
||||
"primary": "#1cc24b",
|
||||
"accent": "#c770ff",
|
||||
"success": "#1cc24b",
|
||||
"warning": "#e6ff57",
|
||||
"error": "#ff4b4b",
|
||||
"info": "#30b3ff",
|
||||
"interactive": "#30b3ff",
|
||||
"diffAdd": "#5dac7e",
|
||||
"diffDelete": "#d53a3a"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#748476",
|
||||
"syntax-comment": "#748476",
|
||||
"syntax-keyword": "#c770ff",
|
||||
"syntax-string": "#1cc24b",
|
||||
"syntax-primitive": "#30b3ff",
|
||||
"syntax-variable": "#203022",
|
||||
"syntax-property": "#24f6d9",
|
||||
"syntax-type": "#e6ff57",
|
||||
"syntax-constant": "#ffa83d",
|
||||
"syntax-operator": "#24f6d9",
|
||||
"syntax-punctuation": "#203022",
|
||||
"syntax-object": "#203022",
|
||||
"markdown-heading": "#24f6d9",
|
||||
"markdown-text": "#203022",
|
||||
"markdown-link": "#30b3ff",
|
||||
"markdown-link-text": "#24f6d9",
|
||||
"markdown-code": "#1cc24b",
|
||||
"markdown-block-quote": "#748476",
|
||||
"markdown-emph": "#ffa83d",
|
||||
"markdown-strong": "#e6ff57",
|
||||
"markdown-horizontal-rule": "#748476",
|
||||
"markdown-list-item": "#30b3ff",
|
||||
"markdown-list-enumeration": "#24f6d9",
|
||||
"markdown-image": "#30b3ff",
|
||||
"markdown-image-text": "#24f6d9",
|
||||
"markdown-code-block": "#203022"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#0a0e0a",
|
||||
"ink": "#62ff94",
|
||||
"primary": "#2eff6a",
|
||||
"accent": "#c770ff",
|
||||
"success": "#62ff94",
|
||||
"warning": "#e6ff57",
|
||||
"error": "#ff4b4b",
|
||||
"info": "#30b3ff",
|
||||
"interactive": "#30b3ff",
|
||||
"diffAdd": "#77ffaf",
|
||||
"diffDelete": "#ff7171"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#8ca391",
|
||||
"syntax-comment": "#8ca391",
|
||||
"syntax-keyword": "#c770ff",
|
||||
"syntax-string": "#1cc24b",
|
||||
"syntax-primitive": "#30b3ff",
|
||||
"syntax-variable": "#62ff94",
|
||||
"syntax-property": "#24f6d9",
|
||||
"syntax-type": "#e6ff57",
|
||||
"syntax-constant": "#ffa83d",
|
||||
"syntax-operator": "#24f6d9",
|
||||
"syntax-punctuation": "#62ff94",
|
||||
"syntax-object": "#62ff94",
|
||||
"markdown-heading": "#00efff",
|
||||
"markdown-text": "#62ff94",
|
||||
"markdown-link": "#30b3ff",
|
||||
"markdown-link-text": "#24f6d9",
|
||||
"markdown-code": "#1cc24b",
|
||||
"markdown-block-quote": "#8ca391",
|
||||
"markdown-emph": "#ffa83d",
|
||||
"markdown-strong": "#e6ff57",
|
||||
"markdown-horizontal-rule": "#8ca391",
|
||||
"markdown-list-item": "#30b3ff",
|
||||
"markdown-list-enumeration": "#24f6d9",
|
||||
"markdown-image": "#30b3ff",
|
||||
"markdown-image-text": "#24f6d9",
|
||||
"markdown-code-block": "#62ff94"
|
||||
}
|
||||
}
|
||||
}
|
||||
86
qimingcode/packages/ui/src/theme/themes/mercury.json
Normal file
86
qimingcode/packages/ui/src/theme/themes/mercury.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Mercury",
|
||||
"id": "mercury",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#ffffff",
|
||||
"ink": "#363644",
|
||||
"primary": "#5266eb",
|
||||
"accent": "#8da4f5",
|
||||
"success": "#036e43",
|
||||
"warning": "#a44200",
|
||||
"error": "#b0175f",
|
||||
"info": "#007f95",
|
||||
"interactive": "#465bd1"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#70707d",
|
||||
"syntax-comment": "#70707d",
|
||||
"syntax-keyword": "#465bd1",
|
||||
"syntax-string": "#036e43",
|
||||
"syntax-primitive": "#5266eb",
|
||||
"syntax-variable": "#007f95",
|
||||
"syntax-property": "#5266eb",
|
||||
"syntax-type": "#007f95",
|
||||
"syntax-constant": "#a44200",
|
||||
"syntax-operator": "#465bd1",
|
||||
"syntax-punctuation": "#363644",
|
||||
"syntax-object": "#007f95",
|
||||
"markdown-heading": "#1e1e2a",
|
||||
"markdown-text": "#363644",
|
||||
"markdown-link": "#465bd1",
|
||||
"markdown-link-text": "#5266eb",
|
||||
"markdown-code": "#036e43",
|
||||
"markdown-block-quote": "#70707d",
|
||||
"markdown-emph": "#a44200",
|
||||
"markdown-strong": "#1e1e2a",
|
||||
"markdown-horizontal-rule": "#7073931a",
|
||||
"markdown-list-item": "#1e1e2a",
|
||||
"markdown-list-enumeration": "#5266eb",
|
||||
"markdown-image": "#465bd1",
|
||||
"markdown-image-text": "#5266eb",
|
||||
"markdown-code-block": "#363644"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#171721",
|
||||
"ink": "#dddde5",
|
||||
"primary": "#8da4f5",
|
||||
"accent": "#8da4f5",
|
||||
"success": "#77c599",
|
||||
"warning": "#fc9b6f",
|
||||
"error": "#fc92b4",
|
||||
"info": "#77becf"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#9d9da8",
|
||||
"syntax-comment": "#9d9da8",
|
||||
"syntax-keyword": "#8da4f5",
|
||||
"syntax-string": "#77c599",
|
||||
"syntax-primitive": "#8da4f5",
|
||||
"syntax-variable": "#77becf",
|
||||
"syntax-property": "#a7b6f8",
|
||||
"syntax-type": "#77becf",
|
||||
"syntax-constant": "#fc9b6f",
|
||||
"syntax-operator": "#8da4f5",
|
||||
"syntax-punctuation": "#dddde5",
|
||||
"syntax-object": "#77becf",
|
||||
"markdown-heading": "#ffffff",
|
||||
"markdown-text": "#dddde5",
|
||||
"markdown-link": "#8da4f5",
|
||||
"markdown-link-text": "#a7b6f8",
|
||||
"markdown-code": "#77c599",
|
||||
"markdown-block-quote": "#9d9da8",
|
||||
"markdown-emph": "#fc9b6f",
|
||||
"markdown-strong": "#f4f5f9",
|
||||
"markdown-horizontal-rule": "#b4b7c81f",
|
||||
"markdown-list-item": "#ffffff",
|
||||
"markdown-list-enumeration": "#8da4f5",
|
||||
"markdown-image": "#8da4f5",
|
||||
"markdown-image-text": "#a7b6f8",
|
||||
"markdown-code-block": "#dddde5"
|
||||
}
|
||||
}
|
||||
}
|
||||
49
qimingcode/packages/ui/src/theme/themes/monokai.json
Normal file
49
qimingcode/packages/ui/src/theme/themes/monokai.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Monokai",
|
||||
"id": "monokai",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fdf8ec",
|
||||
"ink": "#292318",
|
||||
"primary": "#bf7bff",
|
||||
"accent": "#d9487c",
|
||||
"success": "#4fb54b",
|
||||
"warning": "#f1a948",
|
||||
"error": "#e54b4b",
|
||||
"info": "#2d9ad7",
|
||||
"diffAdd": "#bfe7a3",
|
||||
"diffDelete": "#f6a3ae"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#8a816f",
|
||||
"syntax-keyword": "#d9487c",
|
||||
"syntax-string": "#8a6500",
|
||||
"syntax-primitive": "#3c8d2f",
|
||||
"syntax-property": "#1f88c8",
|
||||
"syntax-constant": "#9b5fe0"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#272822",
|
||||
"ink": "#f8f8f2",
|
||||
"primary": "#ae81ff",
|
||||
"accent": "#f92672",
|
||||
"success": "#a6e22e",
|
||||
"warning": "#fd971f",
|
||||
"error": "#f92672",
|
||||
"info": "#66d9ef",
|
||||
"diffAdd": "#4d7f2a",
|
||||
"diffDelete": "#f4477c"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#75715e",
|
||||
"syntax-keyword": "#f92672",
|
||||
"syntax-string": "#e6db74",
|
||||
"syntax-primitive": "#a6e22e",
|
||||
"syntax-property": "#66d9ef",
|
||||
"syntax-constant": "#ae81ff"
|
||||
}
|
||||
}
|
||||
}
|
||||
46
qimingcode/packages/ui/src/theme/themes/nightowl.json
Normal file
46
qimingcode/packages/ui/src/theme/themes/nightowl.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Night Owl",
|
||||
"id": "nightowl",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f0f0f0",
|
||||
"ink": "#403f53",
|
||||
"primary": "#4876d6",
|
||||
"accent": "#aa0982",
|
||||
"success": "#2aa298",
|
||||
"warning": "#c96765",
|
||||
"error": "#de3d3b",
|
||||
"info": "#4876d6",
|
||||
"diffAdd": "#2aa298",
|
||||
"diffDelete": "#de3d3b"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#7a8181",
|
||||
"syntax-keyword": "#994cc3",
|
||||
"syntax-primitive": "#4876d6",
|
||||
"syntax-constant": "#c96765"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#011627",
|
||||
"ink": "#d6deeb",
|
||||
"primary": "#82aaff",
|
||||
"accent": "#f78c6c",
|
||||
"success": "#c5e478",
|
||||
"warning": "#ecc48d",
|
||||
"error": "#ef5350",
|
||||
"info": "#82aaff",
|
||||
"diffAdd": "#c5e478",
|
||||
"diffDelete": "#ef5350"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#637777",
|
||||
"syntax-keyword": "#c792ea",
|
||||
"syntax-string": "#ecc48d",
|
||||
"syntax-primitive": "#82aaff",
|
||||
"syntax-constant": "#f78c6c"
|
||||
}
|
||||
}
|
||||
}
|
||||
46
qimingcode/packages/ui/src/theme/themes/nord.json
Normal file
46
qimingcode/packages/ui/src/theme/themes/nord.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Nord",
|
||||
"id": "nord",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#eceff4",
|
||||
"ink": "#2e3440",
|
||||
"primary": "#5e81ac",
|
||||
"accent": "#bf616a",
|
||||
"success": "#8fbcbb",
|
||||
"warning": "#d08770",
|
||||
"error": "#bf616a",
|
||||
"info": "#81a1c1",
|
||||
"diffAdd": "#a3be8c",
|
||||
"diffDelete": "#bf616a"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6b7282",
|
||||
"syntax-keyword": "#5e81ac",
|
||||
"syntax-string": "#6f8758",
|
||||
"syntax-primitive": "#5e81ac",
|
||||
"syntax-constant": "#8d6886"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#2e3440",
|
||||
"ink": "#e5e9f0",
|
||||
"primary": "#88c0d0",
|
||||
"accent": "#d57780",
|
||||
"success": "#a3be8c",
|
||||
"warning": "#d08770",
|
||||
"error": "#bf616a",
|
||||
"info": "#81a1c1",
|
||||
"diffAdd": "#81a1c1",
|
||||
"diffDelete": "#bf616a"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#616e88",
|
||||
"syntax-keyword": "#81a1c1",
|
||||
"syntax-primitive": "#88c0d0",
|
||||
"syntax-constant": "#b48ead"
|
||||
}
|
||||
}
|
||||
}
|
||||
88
qimingcode/packages/ui/src/theme/themes/oc-2.json
Normal file
88
qimingcode/packages/ui/src/theme/themes/oc-2.json
Normal file
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "OC-2",
|
||||
"id": "oc-2",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f7f7f7",
|
||||
"ink": "#171311",
|
||||
"primary": "#dcde8d",
|
||||
"success": "#12c905",
|
||||
"warning": "#ffdc17",
|
||||
"error": "#fc533a",
|
||||
"info": "#a753ae",
|
||||
"interactive": "#034cff",
|
||||
"diffAdd": "#9ff29a",
|
||||
"diffDelete": "#fc533a"
|
||||
},
|
||||
"overrides": {
|
||||
"text-strong": "#171717",
|
||||
"text-base": "#6F6F6F",
|
||||
"text-weak": "#8F8F8F",
|
||||
"text-weaker": "#C7C7C7",
|
||||
"border-weak-base": "#DBDBDB",
|
||||
"border-weaker-base": "#E8E8E8",
|
||||
"icon-base": "#8F8F8F",
|
||||
"icon-weak-base": "C7C7C7",
|
||||
"surface-raised-base": "#F3F3F3",
|
||||
"surface-raised-base-hover": "#EDEDED",
|
||||
"surface-base": "#F8F8F8",
|
||||
"surface-base-hover": "#0000000A",
|
||||
"surface-interactive-weak": "#F5FAFF",
|
||||
"icon-success-base": "#0ABE00",
|
||||
"surface-success-base": "#E6FFE5",
|
||||
"syntax-comment": "#7a7a7a",
|
||||
"syntax-keyword": "#a753ae",
|
||||
"syntax-string": "#00ceb9",
|
||||
"syntax-primitive": "#034cff",
|
||||
"syntax-property": "#a753ae",
|
||||
"syntax-type": "#8a6f00",
|
||||
"syntax-constant": "#007b80",
|
||||
"syntax-critical": "#ff8c00",
|
||||
"syntax-diff-delete": "#ff8c00",
|
||||
"syntax-diff-unknown": "#a753ae",
|
||||
"surface-critical-base": "#FFF2F0"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#1f1f1f",
|
||||
"ink": "#f1ece8",
|
||||
"primary": "#fab283",
|
||||
"success": "#12c905",
|
||||
"warning": "#fcd53a",
|
||||
"error": "#fc533a",
|
||||
"info": "#edb2f1",
|
||||
"interactive": "#034cff",
|
||||
"diffAdd": "#c8ffc4",
|
||||
"diffDelete": "#fc533a"
|
||||
},
|
||||
"overrides": {
|
||||
"text-strong": "#EDEDED",
|
||||
"text-base": "#A0A0A0",
|
||||
"text-weak": "#707070",
|
||||
"text-weaker": "#505050",
|
||||
"border-weak-base": "#282828",
|
||||
"border-weaker-base": "#232323",
|
||||
"icon-base": "#7E7E7E",
|
||||
"icon-weak-base": "#343434",
|
||||
"surface-raised-base": "#232323",
|
||||
"surface-raised-base-hover": "#282828",
|
||||
"surface-base": "#1C1C1C",
|
||||
"surface-base-hover": "#FFFFFF0D",
|
||||
"surface-interactive-weak": "#0D172B",
|
||||
"surface-success-base": "#022B00",
|
||||
"syntax-comment": "#8f8f8f",
|
||||
"syntax-keyword": "#edb2f1",
|
||||
"syntax-string": "#00ceb9",
|
||||
"syntax-primitive": "#8cb0ff",
|
||||
"syntax-property": "#fab283",
|
||||
"syntax-type": "#fcd53a",
|
||||
"syntax-constant": "#93e9f6",
|
||||
"syntax-critical": "#fab283",
|
||||
"syntax-diff-delete": "#fab283",
|
||||
"syntax-diff-unknown": "#edb2f1",
|
||||
"surface-critical-base": "#1F0603"
|
||||
}
|
||||
}
|
||||
}
|
||||
89
qimingcode/packages/ui/src/theme/themes/one-dark.json
Normal file
89
qimingcode/packages/ui/src/theme/themes/one-dark.json
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "One Dark",
|
||||
"id": "one-dark",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fafafa",
|
||||
"ink": "#383a42",
|
||||
"primary": "#4078f2",
|
||||
"accent": "#0184bc",
|
||||
"success": "#50a14f",
|
||||
"warning": "#c18401",
|
||||
"error": "#e45649",
|
||||
"info": "#986801",
|
||||
"diffAdd": "#489447",
|
||||
"diffDelete": "#d65145"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#a0a1a7",
|
||||
"syntax-comment": "#a0a1a7",
|
||||
"syntax-keyword": "#a626a4",
|
||||
"syntax-string": "#50a14f",
|
||||
"syntax-primitive": "#4078f2",
|
||||
"syntax-variable": "#e45649",
|
||||
"syntax-property": "#0184bc",
|
||||
"syntax-type": "#c18401",
|
||||
"syntax-constant": "#986801",
|
||||
"syntax-operator": "#0184bc",
|
||||
"syntax-punctuation": "#383a42",
|
||||
"syntax-object": "#e45649",
|
||||
"markdown-heading": "#a626a4",
|
||||
"markdown-text": "#383a42",
|
||||
"markdown-link": "#4078f2",
|
||||
"markdown-link-text": "#0184bc",
|
||||
"markdown-code": "#50a14f",
|
||||
"markdown-block-quote": "#a0a1a7",
|
||||
"markdown-emph": "#c18401",
|
||||
"markdown-strong": "#986801",
|
||||
"markdown-horizontal-rule": "#a0a1a7",
|
||||
"markdown-list-item": "#4078f2",
|
||||
"markdown-list-enumeration": "#0184bc",
|
||||
"markdown-image": "#4078f2",
|
||||
"markdown-image-text": "#0184bc",
|
||||
"markdown-code-block": "#383a42"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#282c34",
|
||||
"ink": "#abb2bf",
|
||||
"primary": "#61afef",
|
||||
"accent": "#56b6c2",
|
||||
"success": "#98c379",
|
||||
"warning": "#e5c07b",
|
||||
"error": "#e06c75",
|
||||
"info": "#d19a66",
|
||||
"diffAdd": "#aad482",
|
||||
"diffDelete": "#e8828b"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#5c6370",
|
||||
"syntax-comment": "#5c6370",
|
||||
"syntax-keyword": "#c678dd",
|
||||
"syntax-string": "#98c379",
|
||||
"syntax-primitive": "#61afef",
|
||||
"syntax-variable": "#e06c75",
|
||||
"syntax-property": "#56b6c2",
|
||||
"syntax-type": "#e5c07b",
|
||||
"syntax-constant": "#d19a66",
|
||||
"syntax-operator": "#56b6c2",
|
||||
"syntax-punctuation": "#abb2bf",
|
||||
"syntax-object": "#e06c75",
|
||||
"markdown-heading": "#c678dd",
|
||||
"markdown-text": "#abb2bf",
|
||||
"markdown-link": "#61afef",
|
||||
"markdown-link-text": "#56b6c2",
|
||||
"markdown-code": "#98c379",
|
||||
"markdown-block-quote": "#5c6370",
|
||||
"markdown-emph": "#e5c07b",
|
||||
"markdown-strong": "#d19a66",
|
||||
"markdown-horizontal-rule": "#5c6370",
|
||||
"markdown-list-item": "#61afef",
|
||||
"markdown-list-enumeration": "#56b6c2",
|
||||
"markdown-image": "#61afef",
|
||||
"markdown-image-text": "#56b6c2",
|
||||
"markdown-code-block": "#abb2bf"
|
||||
}
|
||||
}
|
||||
}
|
||||
45
qimingcode/packages/ui/src/theme/themes/onedarkpro.json
Normal file
45
qimingcode/packages/ui/src/theme/themes/onedarkpro.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "One Dark Pro",
|
||||
"id": "onedarkpro",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f5f6f8",
|
||||
"ink": "#2b303b",
|
||||
"primary": "#528bff",
|
||||
"accent": "#d85462",
|
||||
"success": "#4fa66d",
|
||||
"warning": "#d19a66",
|
||||
"error": "#e06c75",
|
||||
"info": "#61afef",
|
||||
"diffAdd": "#c2ebcf",
|
||||
"diffDelete": "#f7c1c5"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6a717d",
|
||||
"syntax-keyword": "#a626a4",
|
||||
"syntax-primitive": "#4078f2",
|
||||
"syntax-constant": "#986801"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#1e222a",
|
||||
"ink": "#abb2bf",
|
||||
"primary": "#61afef",
|
||||
"accent": "#e06c75",
|
||||
"success": "#98c379",
|
||||
"warning": "#e5c07b",
|
||||
"error": "#e06c75",
|
||||
"info": "#56b6c2",
|
||||
"diffAdd": "#4b815a",
|
||||
"diffDelete": "#b2555f"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#5c6370",
|
||||
"syntax-keyword": "#c678dd",
|
||||
"syntax-primitive": "#61afef",
|
||||
"syntax-constant": "#d19a66"
|
||||
}
|
||||
}
|
||||
}
|
||||
87
qimingcode/packages/ui/src/theme/themes/orng.json
Normal file
87
qimingcode/packages/ui/src/theme/themes/orng.json
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Orng",
|
||||
"id": "orng",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#ffffff",
|
||||
"ink": "#1a1a1a",
|
||||
"primary": "#EC5B2B",
|
||||
"accent": "#c94d24",
|
||||
"success": "#0062d1",
|
||||
"warning": "#EC5B2B",
|
||||
"error": "#d1383d",
|
||||
"info": "#318795",
|
||||
"diffDelete": "#f52a65"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#8a8a8a",
|
||||
"syntax-comment": "#8a8a8a",
|
||||
"syntax-keyword": "#EC5B2B",
|
||||
"syntax-string": "#0062d1",
|
||||
"syntax-primitive": "#c94d24",
|
||||
"syntax-variable": "#d1383d",
|
||||
"syntax-property": "#318795",
|
||||
"syntax-type": "#b0851f",
|
||||
"syntax-constant": "#EC5B2B",
|
||||
"syntax-operator": "#318795",
|
||||
"syntax-punctuation": "#1a1a1a",
|
||||
"syntax-object": "#d1383d",
|
||||
"markdown-heading": "#EC5B2B",
|
||||
"markdown-text": "#1a1a1a",
|
||||
"markdown-link": "#EC5B2B",
|
||||
"markdown-link-text": "#318795",
|
||||
"markdown-code": "#0062d1",
|
||||
"markdown-block-quote": "#b0851f",
|
||||
"markdown-emph": "#b0851f",
|
||||
"markdown-strong": "#EC5B2B",
|
||||
"markdown-horizontal-rule": "#8a8a8a",
|
||||
"markdown-list-item": "#EC5B2B",
|
||||
"markdown-list-enumeration": "#318795",
|
||||
"markdown-image": "#EC5B2B",
|
||||
"markdown-image-text": "#318795",
|
||||
"markdown-code-block": "#1a1a1a"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#0a0a0a",
|
||||
"ink": "#eeeeee",
|
||||
"primary": "#EC5B2B",
|
||||
"accent": "#FFF7F1",
|
||||
"success": "#6ba1e6",
|
||||
"warning": "#EC5B2B",
|
||||
"error": "#e06c75",
|
||||
"info": "#56b6c2",
|
||||
"diffDelete": "#e26a75"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#808080",
|
||||
"syntax-comment": "#808080",
|
||||
"syntax-keyword": "#EC5B2B",
|
||||
"syntax-string": "#6ba1e6",
|
||||
"syntax-primitive": "#EE7948",
|
||||
"syntax-variable": "#e06c75",
|
||||
"syntax-property": "#56b6c2",
|
||||
"syntax-type": "#e5c07b",
|
||||
"syntax-constant": "#FFF7F1",
|
||||
"syntax-operator": "#56b6c2",
|
||||
"syntax-punctuation": "#eeeeee",
|
||||
"syntax-object": "#e06c75",
|
||||
"markdown-heading": "#EC5B2B",
|
||||
"markdown-text": "#eeeeee",
|
||||
"markdown-link": "#EC5B2B",
|
||||
"markdown-link-text": "#56b6c2",
|
||||
"markdown-code": "#6ba1e6",
|
||||
"markdown-block-quote": "#FFF7F1",
|
||||
"markdown-emph": "#e5c07b",
|
||||
"markdown-strong": "#EE7948",
|
||||
"markdown-horizontal-rule": "#808080",
|
||||
"markdown-list-item": "#EC5B2B",
|
||||
"markdown-list-enumeration": "#56b6c2",
|
||||
"markdown-image": "#EC5B2B",
|
||||
"markdown-image-text": "#56b6c2",
|
||||
"markdown-code-block": "#eeeeee"
|
||||
}
|
||||
}
|
||||
}
|
||||
88
qimingcode/packages/ui/src/theme/themes/osaka-jade.json
Normal file
88
qimingcode/packages/ui/src/theme/themes/osaka-jade.json
Normal file
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Osaka Jade",
|
||||
"id": "osaka-jade",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#F6F5DD",
|
||||
"ink": "#111c18",
|
||||
"primary": "#1faa90",
|
||||
"accent": "#3d7a52",
|
||||
"success": "#3d7a52",
|
||||
"warning": "#b5a020",
|
||||
"error": "#c7392d",
|
||||
"info": "#1faa90"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#53685B",
|
||||
"syntax-comment": "#53685B",
|
||||
"syntax-keyword": "#1faa90",
|
||||
"syntax-string": "#3d7a52",
|
||||
"syntax-primitive": "#3d7560",
|
||||
"syntax-variable": "#111c18",
|
||||
"syntax-property": "#3d7a52",
|
||||
"syntax-type": "#3d7a52",
|
||||
"syntax-constant": "#a8527a",
|
||||
"syntax-operator": "#b5a020",
|
||||
"syntax-punctuation": "#111c18",
|
||||
"syntax-object": "#111c18",
|
||||
"markdown-heading": "#1faa90",
|
||||
"markdown-text": "#111c18",
|
||||
"markdown-link": "#1faa90",
|
||||
"markdown-link-text": "#3d7a52",
|
||||
"markdown-code": "#3d7a52",
|
||||
"markdown-block-quote": "#53685B",
|
||||
"markdown-emph": "#a8527a",
|
||||
"markdown-strong": "#111c18",
|
||||
"markdown-horizontal-rule": "#53685B",
|
||||
"markdown-list-item": "#1faa90",
|
||||
"markdown-list-enumeration": "#1faa90",
|
||||
"markdown-image": "#1faa90",
|
||||
"markdown-image-text": "#3d7a52",
|
||||
"markdown-code-block": "#111c18"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#111c18",
|
||||
"ink": "#C1C497",
|
||||
"primary": "#2DD5B7",
|
||||
"accent": "#549e6a",
|
||||
"success": "#549e6a",
|
||||
"warning": "#E5C736",
|
||||
"error": "#FF5345",
|
||||
"info": "#2DD5B7",
|
||||
"interactive": "#8CD3CB",
|
||||
"diffAdd": "#63b07a",
|
||||
"diffDelete": "#db9f9c"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#53685B",
|
||||
"syntax-comment": "#53685B",
|
||||
"syntax-keyword": "#2DD5B7",
|
||||
"syntax-string": "#63b07a",
|
||||
"syntax-primitive": "#509475",
|
||||
"syntax-variable": "#C1C497",
|
||||
"syntax-property": "#549e6a",
|
||||
"syntax-type": "#549e6a",
|
||||
"syntax-constant": "#D2689C",
|
||||
"syntax-operator": "#459451",
|
||||
"syntax-punctuation": "#C1C497",
|
||||
"syntax-object": "#C1C497",
|
||||
"markdown-heading": "#2DD5B7",
|
||||
"markdown-text": "#C1C497",
|
||||
"markdown-link": "#8CD3CB",
|
||||
"markdown-link-text": "#549e6a",
|
||||
"markdown-code": "#63b07a",
|
||||
"markdown-block-quote": "#53685B",
|
||||
"markdown-emph": "#D2689C",
|
||||
"markdown-strong": "#C1C497",
|
||||
"markdown-horizontal-rule": "#53685B",
|
||||
"markdown-list-item": "#2DD5B7",
|
||||
"markdown-list-enumeration": "#8CD3CB",
|
||||
"markdown-image": "#8CD3CB",
|
||||
"markdown-image-text": "#549e6a",
|
||||
"markdown-code-block": "#C1C497"
|
||||
}
|
||||
}
|
||||
}
|
||||
85
qimingcode/packages/ui/src/theme/themes/palenight.json
Normal file
85
qimingcode/packages/ui/src/theme/themes/palenight.json
Normal file
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Palenight",
|
||||
"id": "palenight",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fafafa",
|
||||
"ink": "#292d3e",
|
||||
"primary": "#4976eb",
|
||||
"accent": "#00acc1",
|
||||
"success": "#91b859",
|
||||
"warning": "#ffb300",
|
||||
"error": "#e53935",
|
||||
"info": "#f4511e"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#8796b0",
|
||||
"syntax-comment": "#8796b0",
|
||||
"syntax-keyword": "#a854f2",
|
||||
"syntax-string": "#91b859",
|
||||
"syntax-primitive": "#4976eb",
|
||||
"syntax-variable": "#292d3e",
|
||||
"syntax-property": "#00acc1",
|
||||
"syntax-type": "#ffb300",
|
||||
"syntax-constant": "#f4511e",
|
||||
"syntax-operator": "#00acc1",
|
||||
"syntax-punctuation": "#292d3e",
|
||||
"syntax-object": "#292d3e",
|
||||
"markdown-heading": "#a854f2",
|
||||
"markdown-text": "#292d3e",
|
||||
"markdown-link": "#4976eb",
|
||||
"markdown-link-text": "#00acc1",
|
||||
"markdown-code": "#91b859",
|
||||
"markdown-block-quote": "#8796b0",
|
||||
"markdown-emph": "#ffb300",
|
||||
"markdown-strong": "#f4511e",
|
||||
"markdown-horizontal-rule": "#8796b0",
|
||||
"markdown-list-item": "#4976eb",
|
||||
"markdown-list-enumeration": "#00acc1",
|
||||
"markdown-image": "#4976eb",
|
||||
"markdown-image-text": "#00acc1",
|
||||
"markdown-code-block": "#292d3e"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#292d3e",
|
||||
"ink": "#a6accd",
|
||||
"primary": "#82aaff",
|
||||
"accent": "#89ddff",
|
||||
"success": "#c3e88d",
|
||||
"warning": "#ffcb6b",
|
||||
"error": "#f07178",
|
||||
"info": "#f78c6c"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#676e95",
|
||||
"syntax-comment": "#676e95",
|
||||
"syntax-keyword": "#c792ea",
|
||||
"syntax-string": "#c3e88d",
|
||||
"syntax-primitive": "#82aaff",
|
||||
"syntax-variable": "#a6accd",
|
||||
"syntax-property": "#89ddff",
|
||||
"syntax-type": "#ffcb6b",
|
||||
"syntax-constant": "#f78c6c",
|
||||
"syntax-operator": "#89ddff",
|
||||
"syntax-punctuation": "#a6accd",
|
||||
"syntax-object": "#a6accd",
|
||||
"markdown-heading": "#c792ea",
|
||||
"markdown-text": "#a6accd",
|
||||
"markdown-link": "#82aaff",
|
||||
"markdown-link-text": "#89ddff",
|
||||
"markdown-code": "#c3e88d",
|
||||
"markdown-block-quote": "#676e95",
|
||||
"markdown-emph": "#ffcb6b",
|
||||
"markdown-strong": "#f78c6c",
|
||||
"markdown-horizontal-rule": "#676e95",
|
||||
"markdown-list-item": "#82aaff",
|
||||
"markdown-list-enumeration": "#89ddff",
|
||||
"markdown-image": "#82aaff",
|
||||
"markdown-image-text": "#89ddff",
|
||||
"markdown-code-block": "#a6accd"
|
||||
}
|
||||
}
|
||||
}
|
||||
85
qimingcode/packages/ui/src/theme/themes/rosepine.json
Normal file
85
qimingcode/packages/ui/src/theme/themes/rosepine.json
Normal file
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Rose Pine",
|
||||
"id": "rosepine",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#faf4ed",
|
||||
"ink": "#575279",
|
||||
"primary": "#31748f",
|
||||
"accent": "#d7827e",
|
||||
"success": "#286983",
|
||||
"warning": "#ea9d34",
|
||||
"error": "#b4637a",
|
||||
"info": "#56949f"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#9893a5",
|
||||
"syntax-comment": "#9893a5",
|
||||
"syntax-keyword": "#286983",
|
||||
"syntax-string": "#ea9d34",
|
||||
"syntax-primitive": "#d7827e",
|
||||
"syntax-variable": "#575279",
|
||||
"syntax-property": "#d7827e",
|
||||
"syntax-type": "#56949f",
|
||||
"syntax-constant": "#907aa9",
|
||||
"syntax-operator": "#797593",
|
||||
"syntax-punctuation": "#797593",
|
||||
"syntax-object": "#575279",
|
||||
"markdown-heading": "#907aa9",
|
||||
"markdown-text": "#575279",
|
||||
"markdown-link": "#31748f",
|
||||
"markdown-link-text": "#d7827e",
|
||||
"markdown-code": "#286983",
|
||||
"markdown-block-quote": "#9893a5",
|
||||
"markdown-emph": "#ea9d34",
|
||||
"markdown-strong": "#b4637a",
|
||||
"markdown-horizontal-rule": "#dfdad9",
|
||||
"markdown-list-item": "#31748f",
|
||||
"markdown-list-enumeration": "#d7827e",
|
||||
"markdown-image": "#31748f",
|
||||
"markdown-image-text": "#d7827e",
|
||||
"markdown-code-block": "#575279"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#191724",
|
||||
"ink": "#e0def4",
|
||||
"primary": "#9ccfd8",
|
||||
"accent": "#ebbcba",
|
||||
"success": "#31748f",
|
||||
"warning": "#f6c177",
|
||||
"error": "#eb6f92",
|
||||
"info": "#9ccfd8"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#6e6a86",
|
||||
"syntax-comment": "#6e6a86",
|
||||
"syntax-keyword": "#31748f",
|
||||
"syntax-string": "#f6c177",
|
||||
"syntax-primitive": "#ebbcba",
|
||||
"syntax-variable": "#e0def4",
|
||||
"syntax-property": "#ebbcba",
|
||||
"syntax-type": "#9ccfd8",
|
||||
"syntax-constant": "#c4a7e7",
|
||||
"syntax-operator": "#908caa",
|
||||
"syntax-punctuation": "#908caa",
|
||||
"syntax-object": "#e0def4",
|
||||
"markdown-heading": "#c4a7e7",
|
||||
"markdown-text": "#e0def4",
|
||||
"markdown-link": "#9ccfd8",
|
||||
"markdown-link-text": "#ebbcba",
|
||||
"markdown-code": "#31748f",
|
||||
"markdown-block-quote": "#6e6a86",
|
||||
"markdown-emph": "#f6c177",
|
||||
"markdown-strong": "#eb6f92",
|
||||
"markdown-horizontal-rule": "#403d52",
|
||||
"markdown-list-item": "#9ccfd8",
|
||||
"markdown-list-enumeration": "#ebbcba",
|
||||
"markdown-image": "#9ccfd8",
|
||||
"markdown-image-text": "#ebbcba",
|
||||
"markdown-code-block": "#e0def4"
|
||||
}
|
||||
}
|
||||
}
|
||||
51
qimingcode/packages/ui/src/theme/themes/shadesofpurple.json
Normal file
51
qimingcode/packages/ui/src/theme/themes/shadesofpurple.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Shades of Purple",
|
||||
"id": "shadesofpurple",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#f7ebff",
|
||||
"ink": "#3b2c59",
|
||||
"primary": "#7a5af8",
|
||||
"accent": "#ff6bd5",
|
||||
"success": "#3dd598",
|
||||
"warning": "#f7c948",
|
||||
"error": "#ff6bd5",
|
||||
"info": "#62d4ff",
|
||||
"diffAdd": "#c8f8da",
|
||||
"diffDelete": "#ffc3ef"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#8e4be3",
|
||||
"syntax-keyword": "#c45f00",
|
||||
"syntax-string": "#2f8b32",
|
||||
"syntax-primitive": "#a13bd6",
|
||||
"syntax-property": "#008fb8",
|
||||
"syntax-type": "#9d7a00",
|
||||
"syntax-constant": "#e04d7a"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#1a102b",
|
||||
"ink": "#f5f0ff",
|
||||
"primary": "#c792ff",
|
||||
"accent": "#ff7ac6",
|
||||
"success": "#7be0b0",
|
||||
"warning": "#ffd580",
|
||||
"error": "#ff7ac6",
|
||||
"info": "#7dd4ff",
|
||||
"diffAdd": "#53c39f",
|
||||
"diffDelete": "#d85aa0"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#b362ff",
|
||||
"syntax-keyword": "#ff9d00",
|
||||
"syntax-string": "#a5ff90",
|
||||
"syntax-primitive": "#fb94ff",
|
||||
"syntax-property": "#9effff",
|
||||
"syntax-type": "#fad000",
|
||||
"syntax-constant": "#ff628c"
|
||||
}
|
||||
}
|
||||
}
|
||||
49
qimingcode/packages/ui/src/theme/themes/solarized.json
Normal file
49
qimingcode/packages/ui/src/theme/themes/solarized.json
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Solarized",
|
||||
"id": "solarized",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fdf6e3",
|
||||
"ink": "#586e75",
|
||||
"primary": "#268bd2",
|
||||
"accent": "#d33682",
|
||||
"success": "#859900",
|
||||
"warning": "#b58900",
|
||||
"error": "#dc322f",
|
||||
"info": "#2aa198",
|
||||
"diffAdd": "#c6dc7a",
|
||||
"diffDelete": "#f2a1a1"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#657b83",
|
||||
"syntax-keyword": "#728600",
|
||||
"syntax-string": "#1f8f88",
|
||||
"syntax-primitive": "#268bd2",
|
||||
"syntax-property": "#268bd2",
|
||||
"syntax-constant": "#d33682"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#002b36",
|
||||
"ink": "#93a1a1",
|
||||
"primary": "#6c71c4",
|
||||
"accent": "#d33682",
|
||||
"success": "#859900",
|
||||
"warning": "#b58900",
|
||||
"error": "#dc322f",
|
||||
"info": "#2aa198",
|
||||
"diffAdd": "#4c7654",
|
||||
"diffDelete": "#c34b4b"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#586e75",
|
||||
"syntax-keyword": "#859900",
|
||||
"syntax-string": "#2aa198",
|
||||
"syntax-primitive": "#268bd2",
|
||||
"syntax-property": "#268bd2",
|
||||
"syntax-constant": "#d33682"
|
||||
}
|
||||
}
|
||||
}
|
||||
87
qimingcode/packages/ui/src/theme/themes/synthwave84.json
Normal file
87
qimingcode/packages/ui/src/theme/themes/synthwave84.json
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Synthwave '84",
|
||||
"id": "synthwave84",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#fafafa",
|
||||
"ink": "#262335",
|
||||
"primary": "#00bcd4",
|
||||
"accent": "#9c27b0",
|
||||
"success": "#4caf50",
|
||||
"warning": "#ff9800",
|
||||
"error": "#f44336",
|
||||
"info": "#ff5722"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#5c5c8a",
|
||||
"syntax-comment": "#5c5c8a",
|
||||
"syntax-keyword": "#e91e63",
|
||||
"syntax-string": "#ff9800",
|
||||
"syntax-primitive": "#ff5722",
|
||||
"syntax-variable": "#262335",
|
||||
"syntax-property": "#9c27b0",
|
||||
"syntax-type": "#00bcd4",
|
||||
"syntax-constant": "#9c27b0",
|
||||
"syntax-operator": "#e91e63",
|
||||
"syntax-punctuation": "#262335",
|
||||
"syntax-object": "#262335",
|
||||
"markdown-heading": "#e91e63",
|
||||
"markdown-text": "#262335",
|
||||
"markdown-link": "#00bcd4",
|
||||
"markdown-link-text": "#9c27b0",
|
||||
"markdown-code": "#4caf50",
|
||||
"markdown-block-quote": "#5c5c8a",
|
||||
"markdown-emph": "#ff9800",
|
||||
"markdown-strong": "#ff5722",
|
||||
"markdown-horizontal-rule": "#e0e0e0",
|
||||
"markdown-list-item": "#00bcd4",
|
||||
"markdown-list-enumeration": "#9c27b0",
|
||||
"markdown-image": "#00bcd4",
|
||||
"markdown-image-text": "#9c27b0",
|
||||
"markdown-code-block": "#262335"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#262335",
|
||||
"ink": "#ffffff",
|
||||
"primary": "#36f9f6",
|
||||
"accent": "#b084eb",
|
||||
"success": "#72f1b8",
|
||||
"warning": "#fede5d",
|
||||
"error": "#fe4450",
|
||||
"info": "#ff8b39",
|
||||
"diffAdd": "#97f1d8",
|
||||
"diffDelete": "#ff5e5b"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#848bbd",
|
||||
"syntax-comment": "#848bbd",
|
||||
"syntax-keyword": "#ff7edb",
|
||||
"syntax-string": "#fede5d",
|
||||
"syntax-primitive": "#ff8b39",
|
||||
"syntax-variable": "#ffffff",
|
||||
"syntax-property": "#b084eb",
|
||||
"syntax-type": "#36f9f6",
|
||||
"syntax-constant": "#b084eb",
|
||||
"syntax-operator": "#ff7edb",
|
||||
"syntax-punctuation": "#ffffff",
|
||||
"syntax-object": "#ffffff",
|
||||
"markdown-heading": "#ff7edb",
|
||||
"markdown-text": "#ffffff",
|
||||
"markdown-link": "#36f9f6",
|
||||
"markdown-link-text": "#b084eb",
|
||||
"markdown-code": "#72f1b8",
|
||||
"markdown-block-quote": "#848bbd",
|
||||
"markdown-emph": "#fede5d",
|
||||
"markdown-strong": "#ff8b39",
|
||||
"markdown-horizontal-rule": "#495495",
|
||||
"markdown-list-item": "#36f9f6",
|
||||
"markdown-list-enumeration": "#b084eb",
|
||||
"markdown-image": "#36f9f6",
|
||||
"markdown-image-text": "#b084eb",
|
||||
"markdown-code-block": "#ffffff"
|
||||
}
|
||||
}
|
||||
}
|
||||
47
qimingcode/packages/ui/src/theme/themes/tokyonight.json
Normal file
47
qimingcode/packages/ui/src/theme/themes/tokyonight.json
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Tokyonight",
|
||||
"id": "tokyonight",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#e1e2e7",
|
||||
"ink": "#273153",
|
||||
"primary": "#2e7de9",
|
||||
"accent": "#b15c00",
|
||||
"success": "#587539",
|
||||
"warning": "#8c6c3e",
|
||||
"error": "#c94060",
|
||||
"info": "#007197",
|
||||
"diffAdd": "#4f8f7b",
|
||||
"diffDelete": "#d05f7c"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#6b6f7a",
|
||||
"syntax-keyword": "#9854f1",
|
||||
"syntax-primitive": "#1f6fd4",
|
||||
"syntax-property": "#007197",
|
||||
"syntax-constant": "#b15c00"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#1a1b26",
|
||||
"ink": "#c0caf5",
|
||||
"primary": "#7aa2f7",
|
||||
"accent": "#ff9e64",
|
||||
"success": "#9ece6a",
|
||||
"warning": "#e0af68",
|
||||
"error": "#f7768e",
|
||||
"info": "#7dcfff",
|
||||
"diffAdd": "#41a6b5",
|
||||
"diffDelete": "#c34043"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#565f89",
|
||||
"syntax-keyword": "#bb9af7",
|
||||
"syntax-primitive": "#7aa2f7",
|
||||
"syntax-property": "#7dcfff",
|
||||
"syntax-constant": "#ff9e64"
|
||||
}
|
||||
}
|
||||
}
|
||||
90
qimingcode/packages/ui/src/theme/themes/vercel.json
Normal file
90
qimingcode/packages/ui/src/theme/themes/vercel.json
Normal file
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Vercel",
|
||||
"id": "vercel",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#FFFFFF",
|
||||
"ink": "#171717",
|
||||
"primary": "#0070F3",
|
||||
"accent": "#8E4EC6",
|
||||
"success": "#388E3C",
|
||||
"warning": "#FF9500",
|
||||
"error": "#DC3545",
|
||||
"info": "#0070F3",
|
||||
"diffAdd": "#46A758",
|
||||
"diffDelete": "#E5484D"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#666666",
|
||||
"syntax-comment": "#888888",
|
||||
"syntax-keyword": "#E93D82",
|
||||
"syntax-string": "#46A758",
|
||||
"syntax-primitive": "#8E4EC6",
|
||||
"syntax-variable": "#0070F3",
|
||||
"syntax-property": "#12A594",
|
||||
"syntax-type": "#12A594",
|
||||
"syntax-constant": "#FFB224",
|
||||
"syntax-operator": "#E93D82",
|
||||
"syntax-punctuation": "#171717",
|
||||
"syntax-object": "#0070F3",
|
||||
"markdown-heading": "#8E4EC6",
|
||||
"markdown-text": "#171717",
|
||||
"markdown-link": "#0070F3",
|
||||
"markdown-link-text": "#12A594",
|
||||
"markdown-code": "#46A758",
|
||||
"markdown-block-quote": "#666666",
|
||||
"markdown-emph": "#FFB224",
|
||||
"markdown-strong": "#E93D82",
|
||||
"markdown-horizontal-rule": "#999999",
|
||||
"markdown-list-item": "#171717",
|
||||
"markdown-list-enumeration": "#0070F3",
|
||||
"markdown-image": "#12A594",
|
||||
"markdown-image-text": "#12A594",
|
||||
"markdown-code-block": "#171717"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#000000",
|
||||
"ink": "#EDEDED",
|
||||
"primary": "#0070F3",
|
||||
"accent": "#8E4EC6",
|
||||
"success": "#46A758",
|
||||
"warning": "#FFB224",
|
||||
"error": "#E5484D",
|
||||
"info": "#52A8FF",
|
||||
"interactive": "#52A8FF",
|
||||
"diffAdd": "#63C46D",
|
||||
"diffDelete": "#FF6166"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#878787",
|
||||
"syntax-comment": "#878787",
|
||||
"syntax-keyword": "#F75590",
|
||||
"syntax-string": "#63C46D",
|
||||
"syntax-primitive": "#BF7AF0",
|
||||
"syntax-variable": "#52A8FF",
|
||||
"syntax-property": "#0AC7AC",
|
||||
"syntax-type": "#0AC7AC",
|
||||
"syntax-constant": "#F2A700",
|
||||
"syntax-operator": "#F75590",
|
||||
"syntax-punctuation": "#EDEDED",
|
||||
"syntax-object": "#52A8FF",
|
||||
"markdown-heading": "#BF7AF0",
|
||||
"markdown-text": "#EDEDED",
|
||||
"markdown-link": "#52A8FF",
|
||||
"markdown-link-text": "#0AC7AC",
|
||||
"markdown-code": "#63C46D",
|
||||
"markdown-block-quote": "#878787",
|
||||
"markdown-emph": "#F2A700",
|
||||
"markdown-strong": "#F75590",
|
||||
"markdown-horizontal-rule": "#454545",
|
||||
"markdown-list-item": "#EDEDED",
|
||||
"markdown-list-enumeration": "#52A8FF",
|
||||
"markdown-image": "#0AC7AC",
|
||||
"markdown-image-text": "#50E3C2",
|
||||
"markdown-code-block": "#EDEDED"
|
||||
}
|
||||
}
|
||||
}
|
||||
51
qimingcode/packages/ui/src/theme/themes/vesper.json
Normal file
51
qimingcode/packages/ui/src/theme/themes/vesper.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Vesper",
|
||||
"id": "vesper",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#F0F0F0",
|
||||
"ink": "#101010",
|
||||
"primary": "#FFC799",
|
||||
"accent": "#B30000",
|
||||
"success": "#99FFE4",
|
||||
"warning": "#FFC799",
|
||||
"error": "#FF8080",
|
||||
"info": "#FFC799",
|
||||
"diffAdd": "#99FFE4",
|
||||
"diffDelete": "#FF8080"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#7a7a7a",
|
||||
"syntax-keyword": "#6e6e6e",
|
||||
"syntax-string": "#117e69",
|
||||
"syntax-primitive": "#8d541c",
|
||||
"syntax-property": "#101010",
|
||||
"syntax-type": "#8d541c",
|
||||
"syntax-constant": "#8d541c"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#101010",
|
||||
"ink": "#FFF",
|
||||
"primary": "#FFC799",
|
||||
"accent": "#FF8080",
|
||||
"success": "#99FFE4",
|
||||
"warning": "#FFC799",
|
||||
"error": "#FF8080",
|
||||
"info": "#FFC799",
|
||||
"diffAdd": "#99FFE4",
|
||||
"diffDelete": "#FF8080"
|
||||
},
|
||||
"overrides": {
|
||||
"syntax-comment": "#8b8b8b",
|
||||
"syntax-keyword": "#a0a0a0",
|
||||
"syntax-string": "#99ffe4",
|
||||
"syntax-primitive": "#ffc799",
|
||||
"syntax-property": "#ffffff",
|
||||
"syntax-type": "#ffc799",
|
||||
"syntax-constant": "#ffc799"
|
||||
}
|
||||
}
|
||||
}
|
||||
87
qimingcode/packages/ui/src/theme/themes/zenburn.json
Normal file
87
qimingcode/packages/ui/src/theme/themes/zenburn.json
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/desktop-theme.json",
|
||||
"name": "Zenburn",
|
||||
"id": "zenburn",
|
||||
"light": {
|
||||
"palette": {
|
||||
"neutral": "#ffffef",
|
||||
"ink": "#3f3f3f",
|
||||
"primary": "#5f7f8f",
|
||||
"accent": "#5f8f8f",
|
||||
"success": "#5f8f5f",
|
||||
"warning": "#8f8f5f",
|
||||
"error": "#8f5f5f",
|
||||
"info": "#8f7f5f"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#6f6f6f",
|
||||
"syntax-comment": "#5f7f5f",
|
||||
"syntax-keyword": "#8f8f5f",
|
||||
"syntax-string": "#8f5f5f",
|
||||
"syntax-primitive": "#5f7f8f",
|
||||
"syntax-variable": "#3f3f3f",
|
||||
"syntax-property": "#5f8f8f",
|
||||
"syntax-type": "#5f8f8f",
|
||||
"syntax-constant": "#5f8f5f",
|
||||
"syntax-operator": "#8f8f5f",
|
||||
"syntax-punctuation": "#3f3f3f",
|
||||
"syntax-object": "#3f3f3f",
|
||||
"markdown-heading": "#8f8f5f",
|
||||
"markdown-text": "#3f3f3f",
|
||||
"markdown-link": "#5f7f8f",
|
||||
"markdown-link-text": "#5f8f8f",
|
||||
"markdown-code": "#5f8f5f",
|
||||
"markdown-block-quote": "#6f6f6f",
|
||||
"markdown-emph": "#8f8f5f",
|
||||
"markdown-strong": "#8f7f5f",
|
||||
"markdown-horizontal-rule": "#6f6f6f",
|
||||
"markdown-list-item": "#5f7f8f",
|
||||
"markdown-list-enumeration": "#5f8f8f",
|
||||
"markdown-image": "#5f7f8f",
|
||||
"markdown-image-text": "#5f8f8f",
|
||||
"markdown-code-block": "#3f3f3f"
|
||||
}
|
||||
},
|
||||
"dark": {
|
||||
"palette": {
|
||||
"neutral": "#3f3f3f",
|
||||
"ink": "#dcdccc",
|
||||
"primary": "#8cd0d3",
|
||||
"accent": "#93e0e3",
|
||||
"success": "#7f9f7f",
|
||||
"warning": "#f0dfaf",
|
||||
"error": "#cc9393",
|
||||
"info": "#dfaf8f",
|
||||
"diffAdd": "#8fb28f",
|
||||
"diffDelete": "#dca3a3"
|
||||
},
|
||||
"overrides": {
|
||||
"text-weak": "#9f9f9f",
|
||||
"syntax-comment": "#7f9f7f",
|
||||
"syntax-keyword": "#f0dfaf",
|
||||
"syntax-string": "#cc9393",
|
||||
"syntax-primitive": "#8cd0d3",
|
||||
"syntax-variable": "#dcdccc",
|
||||
"syntax-property": "#93e0e3",
|
||||
"syntax-type": "#93e0e3",
|
||||
"syntax-constant": "#8fb28f",
|
||||
"syntax-operator": "#f0dfaf",
|
||||
"syntax-punctuation": "#dcdccc",
|
||||
"syntax-object": "#dcdccc",
|
||||
"markdown-heading": "#f0dfaf",
|
||||
"markdown-text": "#dcdccc",
|
||||
"markdown-link": "#8cd0d3",
|
||||
"markdown-link-text": "#93e0e3",
|
||||
"markdown-code": "#7f9f7f",
|
||||
"markdown-block-quote": "#9f9f9f",
|
||||
"markdown-emph": "#e0cf9f",
|
||||
"markdown-strong": "#dfaf8f",
|
||||
"markdown-horizontal-rule": "#9f9f9f",
|
||||
"markdown-list-item": "#8cd0d3",
|
||||
"markdown-list-enumeration": "#93e0e3",
|
||||
"markdown-image": "#8cd0d3",
|
||||
"markdown-image-text": "#93e0e3",
|
||||
"markdown-code-block": "#dcdccc"
|
||||
}
|
||||
}
|
||||
}
|
||||
70
qimingcode/packages/ui/src/theme/types.ts
Normal file
70
qimingcode/packages/ui/src/theme/types.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
export type HexColor = `#${string}`
|
||||
|
||||
export interface OklchColor {
|
||||
l: number // Lightness 0-1
|
||||
c: number // Chroma 0-0.4+
|
||||
h: number // Hue 0-360
|
||||
}
|
||||
|
||||
export interface ThemeSeedColors {
|
||||
neutral: HexColor
|
||||
primary: HexColor
|
||||
success: HexColor
|
||||
warning: HexColor
|
||||
error: HexColor
|
||||
info: HexColor
|
||||
interactive: HexColor
|
||||
diffAdd: HexColor
|
||||
diffDelete: HexColor
|
||||
}
|
||||
|
||||
export interface ThemePaletteColors {
|
||||
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>
|
||||
}
|
||||
|
||||
export type ThemeVariant =
|
||||
| ({ seeds: ThemeSeedColors; palette?: never } & ThemeVariantBase)
|
||||
| ({ palette: ThemePaletteColors; seeds?: never } & ThemeVariantBase)
|
||||
|
||||
export interface DesktopTheme {
|
||||
$schema?: string
|
||||
name: string
|
||||
id: string
|
||||
light: ThemeVariant
|
||||
dark: ThemeVariant
|
||||
}
|
||||
|
||||
export type TokenCategory =
|
||||
| "background"
|
||||
| "surface"
|
||||
| "text"
|
||||
| "border"
|
||||
| "icon"
|
||||
| "input"
|
||||
| "button"
|
||||
| "syntax"
|
||||
| "markdown"
|
||||
| "diff"
|
||||
| "avatar"
|
||||
|
||||
export type ThemeToken = string
|
||||
|
||||
export type CssVarRef = `var(--${string})`
|
||||
|
||||
export type ColorValue = HexColor | CssVarRef
|
||||
|
||||
export type ResolvedTheme = Record<ThemeToken, ColorValue>
|
||||
Reference in New Issue
Block a user