feat: introduced a token-based theming system across the UI

* feat: added themes system

* feat: smart sidebar auto-hide for files/diff tabs + lower files sidebar threshold

* feat: added Checkbox component and update theming

- Add reusable Checkbox component for toggles across UI
- Replace several inputs with Checkbox in settings and commands panels
- Add DiffIcon and apply surface/border theming to key UI areas

* feat: Add convert-vscode-theme.cjs to convert VS Code themes to OpenChamber format

* refactor: remove unused permission logic from ChatInput

- Remove unused permission rules parsing logic from ChatInput
- Memoize renderTheme in DiffWorkerProvider to avoid unnecessary recalculations
- Remove forceOpaque helper in vscode theme adapter

* fix: guard VSCode theme loading in MarkdownRenderer

* feat: add custom user themes loading and reload

- Load user themes from ~/.config/openchamber/themes at runtime
- Expose /api/config/themes to fetch custom themes
- Allow theme reloading from Settings → Theme → Reload themes in the UI
This commit is contained in:
Bohdan Triapitsyn
2026-02-01 18:29:34 +02:00
committed by GitHub
parent 5bb2c56bc0
commit ddedc02687
147 changed files with 9853 additions and 2435 deletions
@@ -0,0 +1,95 @@
import { registerCustomTheme } from '@pierre/diffs';
import type { Theme } from '@/types/theme';
import type { VSCodeTextMateTheme, VSCodeTokenColorRule } from './vscodeTextMateTheme';
import { buildTextMateThemeFromAppTheme } from './textMateThemeFromAppTheme';
export type ShikiThemeRegistrationResolvedLike = VSCodeTextMateTheme & {
settings: VSCodeTokenColorRule[];
fg: string;
bg: string;
};
const isHex8 = (value: string): boolean => /^#[0-9a-fA-F]{8}$/.test(value);
const stripAlpha = (value: string): string => {
if (isHex8(value)) {
return value.slice(0, 7);
}
return value;
};
function withStableStringId<T extends object>(value: T, id: string): T {
Object.defineProperty(value, 'toString', {
value: () => id,
enumerable: false,
configurable: true,
});
Object.defineProperty(value, Symbol.toPrimitive, {
value: () => id,
enumerable: false,
configurable: true,
});
return value;
}
const resolvedThemeCache = new Map<string, ShikiThemeRegistrationResolvedLike>();
const registeredPierreThemes = new Set<string>();
const toResolvedTheme = (raw: VSCodeTextMateTheme, id: string): ShikiThemeRegistrationResolvedLike => {
const bgRaw = raw.colors?.['editor.background'];
const fgRaw = raw.colors?.['editor.foreground'];
const bg = bgRaw ? stripAlpha(bgRaw) : undefined;
const fg = fgRaw ? stripAlpha(fgRaw) : undefined;
if (!bg || !fg) {
throw new Error(`Theme "${id}" is missing editor.background/editor.foreground`);
}
const settings = raw.tokenColors ?? [];
return withStableStringId(
{
...raw,
name: id,
fg,
bg,
settings,
},
id,
);
};
const buildTextMateTheme = (theme: Theme): VSCodeTextMateTheme => {
return buildTextMateThemeFromAppTheme(theme);
};
export const getResolvedShikiTheme = (theme: Theme): ShikiThemeRegistrationResolvedLike => {
const cached = resolvedThemeCache.get(theme.metadata.id);
if (cached) {
return cached;
}
const raw = buildTextMateTheme(theme);
const resolved = toResolvedTheme(raw, theme.metadata.id);
resolvedThemeCache.set(theme.metadata.id, resolved);
return resolved;
};
export const ensurePierreThemeRegistered = (theme: Theme): void => {
const id = theme.metadata.id;
if (registeredPierreThemes.has(id)) {
return;
}
const resolved = getResolvedShikiTheme(theme);
registerCustomTheme(id, async () => resolved);
registeredPierreThemes.add(id);
};
export const getStreamdownThemePair = (light: Theme, dark: Theme) => {
return [getResolvedShikiTheme(light), getResolvedShikiTheme(dark)] as const;
};
@@ -1,96 +0,0 @@
import flexokiDarkRawJson from './themes/flexoki-dark.json';
import flexokiLightRawJson from './themes/flexoki-light.json';
export const FLEXOKI_SHIKI_DARK_THEME_NAME = 'flexoki-dark';
export const FLEXOKI_SHIKI_LIGHT_THEME_NAME = 'flexoki-light';
type VSCodeTokenColorRule = {
name?: string;
scope?: string | string[];
settings: Record<string, string | undefined>;
};
type VSCodeTextMateTheme = {
name: string;
type: 'dark' | 'light';
colors?: Record<string, string>;
tokenColors?: VSCodeTokenColorRule[];
semanticHighlighting?: boolean;
semanticTokenColors?: Record<string, string>;
};
type ShikiThemeRegistrationResolvedLike = VSCodeTextMateTheme & {
settings: VSCodeTokenColorRule[];
fg: string;
bg: string;
};
const flexokiDarkRaw = flexokiDarkRawJson as VSCodeTextMateTheme;
const flexokiLightRaw = flexokiLightRawJson as VSCodeTextMateTheme;
function withStableStringId<T extends object>(value: T, id: string): T {
Object.defineProperty(value, 'toString', {
value: () => id,
enumerable: false,
configurable: true,
});
Object.defineProperty(value, Symbol.toPrimitive, {
value: () => id,
enumerable: false,
configurable: true,
});
return value;
}
function toResolvedTheme(
raw: VSCodeTextMateTheme,
name: string,
type: VSCodeTextMateTheme['type']
): ShikiThemeRegistrationResolvedLike {
const bg = raw.colors?.['editor.background'];
const fg = raw.colors?.['editor.foreground'];
if (!bg || !fg) {
throw new Error(
`Flexoki Shiki theme "${name}" is missing editor.background/editor.foreground`
);
}
const settings = raw.tokenColors ?? [];
return {
...raw,
name,
type,
fg,
bg,
settings,
};
}
export const flexokiDarkTheme = toResolvedTheme(
flexokiDarkRaw,
FLEXOKI_SHIKI_DARK_THEME_NAME,
'dark'
);
export const flexokiLightTheme = toResolvedTheme(
flexokiLightRaw,
FLEXOKI_SHIKI_LIGHT_THEME_NAME,
'light'
);
withStableStringId(flexokiDarkTheme, FLEXOKI_SHIKI_DARK_THEME_NAME);
withStableStringId(flexokiLightTheme, FLEXOKI_SHIKI_LIGHT_THEME_NAME);
export const flexokiThemeNames = {
dark: FLEXOKI_SHIKI_DARK_THEME_NAME,
light: FLEXOKI_SHIKI_LIGHT_THEME_NAME,
} as const;
export const flexokiStreamdownThemes = [
flexokiLightTheme,
flexokiDarkTheme,
] as const;
@@ -1,15 +0,0 @@
import { registerCustomTheme } from '@pierre/diffs';
import { flexokiDarkTheme, flexokiLightTheme, flexokiThemeNames } from './flexokiThemes';
let hasRegistered = false;
export function ensureFlexokiThemesRegistered(): void {
if (hasRegistered) return;
registerCustomTheme(flexokiThemeNames.dark, async () => flexokiDarkTheme);
registerCustomTheme(flexokiThemeNames.light, async () => flexokiLightTheme);
hasRegistered = true;
}
@@ -0,0 +1,482 @@
import type { Theme } from '@/types/theme';
import type { VSCodeTextMateTheme, VSCodeTokenColorRule } from './vscodeTextMateTheme';
const isHex6 = (value: string): boolean => /^#[0-9a-fA-F]{6}$/.test(value);
const isHex8 = (value: string): boolean => /^#[0-9a-fA-F]{8}$/.test(value);
const addAlpha = (value: string, alphaHex: string): string => {
if (!/^[0-9a-fA-F]{2}$/.test(alphaHex)) {
return value;
}
if (isHex6(value)) {
return `${value}${alphaHex}`;
}
if (isHex8(value)) {
return `${value.slice(0, 7)}${alphaHex}`;
}
return value;
};
const pick = (value: string | undefined, fallback: string): string => {
if (typeof value === 'string' && value.trim().length > 0) {
return value;
}
return fallback;
};
const buildTokenColors = (theme: Theme): VSCodeTokenColorRule[] => {
const base = theme.colors.syntax.base;
const tokens = theme.colors.syntax.tokens ?? {};
const t = (key: string, fallback: string): string => pick(tokens[key], fallback);
return [
{
name: 'plain',
scope: ['source', 'support.type.property-name.css'],
settings: { foreground: base.foreground },
},
{
name: 'classes',
scope: ['entity.name.type.class'],
settings: { foreground: t('className', t('class', base.function)) },
},
{
name: 'interfaces',
scope: ['entity.name.type.interface', 'entity.name.type'],
settings: { foreground: t('interface', base.type) },
},
{
name: 'structs',
scope: ['entity.name.type.struct'],
settings: { foreground: t('struct', base.function) },
},
{
name: 'enums',
scope: ['entity.name.type.enum'],
settings: { foreground: t('enum', base.function) },
},
{
name: 'keys',
scope: ['meta.object-literal.key', 'support.type.property-name'],
settings: { foreground: t('key', base.function) },
},
{
name: 'methods',
scope: ['entity.name.function.method', 'meta.function.method'],
settings: { foreground: t('method', theme.colors.status.success) },
},
{
name: 'functions',
scope: ['entity.name.function', 'support.function', 'meta.function-call.generic'],
settings: { foreground: base.function, fontStyle: 'bold' },
},
{
name: 'variables',
scope: ['variable', 'meta.variable', 'variable.other.object.property'],
settings: { foreground: base.variable },
},
{
name: 'variablesOther',
scope: ['variable.other.object', 'variable.other.readwrite.alias'],
settings: { foreground: t('variableOther', t('method', theme.colors.status.success)) },
},
{
name: 'globalVariables',
scope: ['variable.other.global', 'variable.language.this'],
settings: { foreground: t('variableGlobal', base.number) },
},
{
name: 'localVariables',
scope: ['variable.other.local'],
settings: { foreground: t('variableLocal', theme.colors.surface.elevated) },
},
{
name: 'parameters',
scope: ['variable.parameter', 'meta.parameter'],
settings: { foreground: t('parameter', base.foreground) },
},
{
name: 'properties',
scope: ['variable.other.property', 'meta.property'],
settings: { foreground: t('variableProperty', theme.colors.status.info) },
},
{
name: 'strings',
scope: ['string', 'string.other.link', 'markup.inline.raw.string.markdown'],
settings: { foreground: base.string },
},
{
name: 'stringEscapeSequences',
scope: ['constant.character.escape', 'constant.other.placeholder'],
settings: { foreground: t('stringEscape', base.foreground) },
},
{
name: 'keywords',
scope: ['keyword'],
settings: { foreground: base.keyword },
},
{
name: 'keywordsControl',
scope: ['keyword.control.import', 'keyword.control.from', 'keyword.import'],
settings: { foreground: t('keywordImport', base.operator) },
},
{
name: 'storageModifiers',
scope: ['storage.modifier', 'keyword.modifier', 'storage.type'],
settings: { foreground: t('storageModifier', base.keyword) },
},
{
name: 'comments',
scope: ['comment', 'punctuation.definition.comment'],
settings: { foreground: base.comment },
},
{
name: 'docComments',
scope: ['comment.documentation', 'comment.line.documentation'],
settings: { foreground: t('commentDoc', theme.colors.surface.mutedForeground) },
},
{
name: 'numbers',
scope: ['constant.numeric'],
settings: { foreground: base.number },
},
{
name: 'booleans',
scope: ['constant.language.boolean', 'constant.language.json'],
settings: { foreground: t('boolean', base.type) },
},
{
name: 'operators',
scope: ['keyword.operator'],
settings: { foreground: base.operator },
},
{
name: 'macros',
scope: ['entity.name.function.preprocessor', 'meta.preprocessor'],
settings: { foreground: t('macro', base.keyword) },
},
{
name: 'preprocessor',
scope: ['meta.preprocessor'],
settings: { foreground: t('preprocessor', t('label', base.number)) },
},
{
name: 'urls',
scope: ['markup.underline.link'],
settings: { foreground: t('url', theme.colors.status.info) },
},
{
name: 'tags',
scope: ['entity.name.tag'],
settings: { foreground: t('tag', base.keyword) },
},
{
name: 'jsxTags',
scope: ['support.class.component'],
settings: { foreground: t('jsxTag', t('label', base.number)) },
},
{
name: 'attributes',
scope: ['entity.other.attribute-name', 'meta.attribute'],
settings: { foreground: t('tagAttribute', base.type) },
},
{
name: 'types',
scope: ['support.type'],
settings: { foreground: base.type },
},
{
name: 'constants',
scope: ['variable.other.constant', 'variable.readonly'],
settings: { foreground: t('constant', base.foreground) },
},
{
name: 'labels',
scope: ['entity.name.label', 'punctuation.definition.label'],
settings: { foreground: t('label', t('variableGlobal', base.number)) },
},
{
name: 'namespaces',
scope: ['entity.name.namespace', 'storage.modifier.namespace', 'markup.bold.markdown'],
settings: { foreground: t('namespace', base.type) },
},
{
name: 'modules',
scope: ['entity.name.module', 'storage.modifier.module'],
settings: { foreground: t('module', base.operator) },
},
{
name: 'typeParameters',
scope: ['variable.type.parameter', 'variable.parameter.type'],
settings: { foreground: t('typeParameter', base.function) },
},
{
name: 'exceptions',
scope: ['keyword.control.exception', 'keyword.control.trycatch'],
settings: { foreground: t('exception', t('label', base.number)) },
},
{
name: 'decorators',
scope: ['meta.decorator', 'punctuation.decorator', 'entity.name.function.decorator'],
settings: { foreground: t('decorator', base.type) },
},
{
name: 'calls',
scope: ['variable.function'],
settings: { foreground: base.foreground },
},
{
name: 'punctuation',
scope: [
'punctuation',
'punctuation.terminator',
'punctuation.definition.tag',
'punctuation.separator',
'punctuation.definition.string',
'punctuation.section.block',
],
settings: { foreground: t('punctuation', base.comment) },
},
{
name: 'yellow',
scope: [
'storage.type.numeric.go',
'storage.type.byte.go',
'storage.type.boolean.go',
'storage.type.string.go',
'storage.type.uintptr.go',
'storage.type.error.go',
'storage.type.rune.go',
'constant.language.go',
'support.class.dart',
'keyword.other.documentation',
'storage.modifier.import.java',
'punctuation.definition.list.begin.markdown',
'punctuation.definition.quote.begin.markdown',
'meta.separator.markdown',
'entity.name.section.markdown',
],
settings: { foreground: base.type },
},
{
name: 'green',
scope: [],
settings: { foreground: t('method', theme.colors.status.success) },
},
{
name: 'cyan',
scope: [
'markup.italic.markdown',
'support.type.python',
'variable.legacy.builtin.python',
'support.constant.property-value.css',
'storage.modifier.attribute.swift',
],
settings: { foreground: base.string },
},
{
name: 'blue',
scope: [],
settings: { foreground: base.keyword },
},
{
name: 'purple',
scope: ['keyword.channel.go', 'keyword.other.platform.os.swift'],
settings: { foreground: base.number },
},
{
name: 'magenta',
scope: ['punctuation.definition.heading.markdown'],
settings: { foreground: t('label', t('variableGlobal', base.number)) },
},
{
name: 'red',
scope: [],
settings: { foreground: base.operator },
},
{
name: 'orange',
scope: [],
settings: { foreground: base.function },
},
];
};
const buildColors = (theme: Theme): Record<string, string> => {
const s = theme.colors.surface;
const i = theme.colors.interactive;
const st = theme.colors.status;
const base = theme.colors.syntax.base;
const hl = theme.colors.syntax.highlights ?? {};
const diffAddedBg = pick(hl.diffAddedBackground, st.successBackground);
const diffRemovedBg = pick(hl.diffRemovedBackground, st.errorBackground);
return {
'editor.background': s.background,
'editor.foreground': s.foreground,
'editor.hoverHighlightBackground': pick(i.hover, s.subtle),
'editor.lineHighlightBackground': s.muted,
'editor.selectionBackground': i.selection,
'editor.selectionHighlightBackground': i.selection,
'editor.findMatchBackground': base.type,
'editor.findMatchHighlightBackground': addAlpha(base.type, 'cc'),
'editor.findRangeHighlightBackground': s.muted,
'editor.inactiveSelectionBackground': s.elevated,
'editor.lineHighlightBorder': s.elevated,
'editor.rangeHighlightBackground': pick(i.active, i.borderHover),
'notifications.background': s.elevated,
'editorInlayHint.typeBackground': s.subtle,
'editorInlayHint.typeForeground': s.foreground,
'editorWhitespace.foreground': i.borderHover,
'editorIndentGuide.background1': s.subtle,
'editorHoverWidget.background': s.elevated,
'editorLineNumber.activeForeground': pick(hl.lineNumberActive, s.foreground),
'editorLineNumber.foreground': pick(hl.lineNumber, s.mutedForeground),
'editorGutter.background': s.background,
'editorGutter.modifiedBackground': st.info,
'editorGutter.addedBackground': st.success,
'editorGutter.deletedBackground': st.error,
'editorBracketMatch.background': s.elevated,
'editorBracketMatch.border': s.subtle,
'editorError.foreground': st.error,
'editorWarning.foreground': st.warning,
'editorInfo.foreground': st.info,
'diffEditor.insertedTextBackground': diffAddedBg,
'diffEditor.removedTextBackground': diffRemovedBg,
'editorGroupHeader.tabsBackground': s.background,
'editorGroup.border': i.border,
'tab.activeBackground': s.background,
'tab.inactiveBackground': s.muted,
'tab.inactiveForeground': s.mutedForeground,
'tab.activeForeground': s.foreground,
'tab.hoverBackground': s.subtle,
'tab.unfocusedHoverBackground': s.subtle,
'tab.border': i.border,
'tab.activeModifiedBorder': base.type,
'tab.inactiveModifiedBorder': st.info,
'tab.unfocusedActiveModifiedBorder': base.type,
'tab.unfocusedInactiveModifiedBorder': st.info,
'editorWidget.background': s.muted,
'editorWidget.border': i.border,
'editorSuggestWidget.background': s.background,
'editorSuggestWidget.border': i.border,
'editorSuggestWidget.foreground': s.foreground,
'editorSuggestWidget.highlightForeground': s.mutedForeground,
'editorSuggestWidget.selectedBackground': s.subtle,
'peekView.border': i.border,
'peekViewEditor.background': s.background,
'peekViewEditor.matchHighlightBackground': s.subtle,
'peekViewResult.background': s.muted,
'peekViewResult.fileForeground': s.foreground,
'peekViewResult.lineForeground': s.mutedForeground,
'peekViewResult.matchHighlightBackground': s.subtle,
'peekViewResult.selectionBackground': s.elevated,
'peekViewResult.selectionForeground': s.mutedForeground,
'peekViewTitle.background': s.subtle,
'peekViewTitleDescription.foreground': s.mutedForeground,
'peekViewTitleLabel.foreground': s.foreground,
'merge.currentHeaderBackground': st.success,
'merge.currentContentBackground': pick(hl.diffAdded, st.success),
'merge.incomingHeaderBackground': st.info,
'merge.incomingContentBackground': pick(hl.diffModified, st.info),
'merge.border': i.border,
'merge.commonContentBackground': s.subtle,
'merge.commonHeaderBackground': s.muted,
'panel.background': s.background,
'panel.border': i.border,
'panelTitle.activeBorder': i.borderHover,
'panelTitle.activeForeground': s.foreground,
'panelTitle.inactiveForeground': s.mutedForeground,
'statusBar.background': s.background,
'statusBar.foreground': s.foreground,
'statusBar.border': i.border,
'statusBar.debuggingBackground': st.error,
'statusBar.debuggingForeground': st.errorForeground,
'statusBar.noFolderBackground': s.subtle,
'statusBar.noFolderForeground': s.mutedForeground,
'titleBar.activeBackground': s.background,
'titleBar.activeForeground': s.foreground,
'titleBar.inactiveBackground': s.muted,
'titleBar.inactiveForeground': s.mutedForeground,
'titleBar.border': i.border,
'menu.foreground': s.foreground,
'menu.background': s.background,
'menu.selectionForeground': s.foreground,
'menu.selectionBackground': s.subtle,
'menu.border': i.border,
'editorInlayHint.foreground': s.mutedForeground,
'editorInlayHint.background': s.subtle,
'terminal.foreground': s.foreground,
'terminal.background': s.background,
'terminalCursor.foreground': s.foreground,
'terminalCursor.background': s.background,
'terminal.ansiRed': pick(hl.diffRemoved, st.error),
'terminal.ansiGreen': pick(hl.diffAdded, st.success),
'terminal.ansiYellow': st.warning,
'terminal.ansiBlue': pick(hl.diffModified, st.info),
'terminal.ansiMagenta': base.keyword,
'terminal.ansiCyan': base.type,
'activityBar.background': s.background,
'activityBar.foreground': s.foreground,
'activityBar.inactiveForeground': s.mutedForeground,
'activityBar.activeBorder': s.foreground,
'activityBar.border': i.border,
'sideBar.background': s.background,
'sideBar.foreground': s.foreground,
'sideBar.border': i.border,
'sideBarTitle.foreground': s.foreground,
'sideBarSectionHeader.background': s.muted,
'sideBarSectionHeader.foreground': s.foreground,
'sideBarSectionHeader.border': i.border,
'sideBar.activeBackground': s.subtle,
'sideBar.activeForeground': s.foreground,
'sideBar.hoverBackground': s.muted,
'sideBar.hoverForeground': s.foreground,
'list.warningForeground': st.warning,
'list.errorForeground': st.error,
'list.inactiveSelectionBackground': s.subtle,
'list.activeSelectionBackground': s.elevated,
'list.inactiveSelectionForeground': s.foreground,
'list.activeSelectionForeground': s.foreground,
'list.hoverForeground': s.foreground,
'list.hoverBackground': s.muted,
'input.background': s.muted,
'input.foreground': s.foreground,
'input.border': i.border,
'input.placeholderForeground': s.mutedForeground,
'inputOption.activeBorder': i.border,
'inputOption.activeBackground': s.elevated,
'inputOption.activeForeground': s.foreground,
'inputValidation.infoBackground': st.infoBackground,
'inputValidation.infoBorder': st.infoBorder,
'inputValidation.warningBackground': st.warningBackground,
'inputValidation.warningBorder': st.warningBorder,
'inputValidation.errorBackground': st.errorBackground,
'inputValidation.errorBorder': st.errorBorder,
'dropdown.background': s.muted,
'dropdown.foreground': s.foreground,
'dropdown.border': i.border,
'dropdown.listBackground': s.background,
'badge.background': theme.colors.primary.base,
'activityBarBadge.background': theme.colors.primary.base,
'button.background': theme.colors.primary.base,
'button.foreground': pick(theme.colors.primary.foreground, s.background),
'badge.foreground': pick(theme.colors.primary.foreground, s.background),
'activityBarBadge.foreground': pick(theme.colors.primary.foreground, s.background),
};
};
export function buildTextMateThemeFromAppTheme(theme: Theme): VSCodeTextMateTheme {
return {
name: theme.metadata.name,
type: theme.metadata.variant,
colors: buildColors(theme),
tokenColors: buildTokenColors(theme),
};
}
@@ -1,547 +0,0 @@
{
"name": "Flexoki",
"type": "dark",
"colors": {
"editor.background": "#100F0F",
"editor.foreground": "#CECDC3",
"editor.hoverHighlightBackground": "#343331",
"editor.lineHighlightBackground": "#1C1B1A",
"editor.selectionBackground": "#CECDC333",
"editor.selectionHighlightBackground": "#CECDC333",
"editor.findMatchBackground": "#AD8301",
"editor.findMatchHighlightBackground": "#AD8301cc",
"editor.findRangeHighlightBackground": "#1C1B1A",
"editor.inactiveSelectionBackground": "#282726",
"editor.lineHighlightBorder": "#282726",
"editor.rangeHighlightBackground": "#403E3C",
"notifications.background": "#282726",
"editorInlayHint.typeBackground": "#343331",
"editorInlayHint.typeForeground": "#CECDC3",
"editorWhitespace.foreground": "#403E3C",
"editorIndentGuide.background1": "#343331",
"editorHoverWidget.background": "#282726",
"editorLineNumber.activeForeground": "#CECDC3",
"editorLineNumber.foreground": "#403E3C",
"editorGutter.background": "#100F0F",
"editorGutter.modifiedBackground": "#3AA99F",
"editorGutter.addedBackground": "#879A39",
"editorGutter.deletedBackground": "#D14D41",
"editorBracketMatch.background": "#282726",
"editorBracketMatch.border": "#343331",
"editorError.foreground": "#D14D41",
"editorWarning.foreground": "#DA702C",
"editorInfo.foreground": "#4385BE",
"diffEditor.insertedTextBackground": "#66800B99",
"diffEditor.removedTextBackground": "#AF302999",
"editorGroupHeader.tabsBackground": "#100F0F",
"editorGroup.border": "#343331",
"tab.activeBackground": "#100F0F",
"tab.inactiveBackground": "#1C1B1A",
"tab.inactiveForeground": "#878580",
"tab.activeForeground": "#CECDC3",
"tab.hoverBackground": "#343331",
"tab.unfocusedHoverBackground": "#343331",
"tab.border": "#343331",
"tab.activeModifiedBorder": "#D0A215",
"tab.inactiveModifiedBorder": "#4385BE",
"tab.unfocusedActiveModifiedBorder": "#AD8301",
"tab.unfocusedInactiveModifiedBorder": "#205EA6",
"editorWidget.background": "#1C1B1A",
"editorWidget.border": "#343331",
"editorSuggestWidget.background": "#100F0F",
"editorSuggestWidget.border": "#343331",
"editorSuggestWidget.foreground": "#CECDC3",
"editorSuggestWidget.highlightForeground": "#878580",
"editorSuggestWidget.selectedBackground": "#343331",
"peekView.border": "#343331",
"peekViewEditor.background": "#100F0F",
"peekViewEditor.matchHighlightBackground": "#403E3C",
"peekViewResult.background": "#1C1B1A",
"peekViewResult.fileForeground": "#CECDC3",
"peekViewResult.lineForeground": "#878580",
"peekViewResult.matchHighlightBackground": "#403E3C",
"peekViewResult.selectionBackground": "#282726",
"peekViewResult.selectionForeground": "#575653",
"peekViewTitle.background": "#343331",
"peekViewTitleDescription.foreground": "#878580",
"peekViewTitleLabel.foreground": "#CECDC3",
"merge.currentHeaderBackground": "#879A39",
"merge.currentContentBackground": "#66800B",
"merge.incomingHeaderBackground": "#3AA99F",
"merge.incomingContentBackground": "#24837B",
"merge.border": "#343331",
"merge.commonContentBackground": "#403E3C",
"merge.commonHeaderBackground": "#343331",
"panel.background": "#100F0F",
"panel.border": "#343331",
"panelTitle.activeBorder": "#403E3C",
"panelTitle.activeForeground": "#CECDC3",
"panelTitle.inactiveForeground": "#878580",
"statusBar.background": "#100F0F",
"statusBar.foreground": "#CECDC3",
"statusBar.border": "#343331",
"statusBar.debuggingBackground": "#D14D41",
"statusBar.debuggingForeground": "#CECDC3",
"statusBar.noFolderBackground": "#403E3C",
"statusBar.noFolderForeground": "#575653",
"titleBar.activeBackground": "#100F0F",
"titleBar.activeForeground": "#CECDC3",
"titleBar.inactiveBackground": "#1C1B1A",
"titleBar.inactiveForeground": "#878580",
"titleBar.border": "#343331",
"menu.foreground": "#CECDC3",
"menu.background": "#100F0F",
"menu.selectionForeground": "#CECDC3",
"menu.selectionBackground": "#343331",
"menu.border": "#343331",
"editorInlayHint.foreground": "#878580",
"editorInlayHint.background": "#343331",
"terminal.foreground": "#CECDC3",
"terminal.background": "#100F0F",
"terminalCursor.foreground": "#CECDC3",
"terminalCursor.background": "#100F0F",
"terminal.ansiRed": "#D14D41",
"terminal.ansiGreen": "#879A39",
"terminal.ansiYellow": "#D0A215",
"terminal.ansiBlue": "#4385BE",
"terminal.ansiMagenta": "#3AA99F",
"terminal.ansiCyan": "#3AA99F",
"activityBar.background": "#100F0F",
"activityBar.foreground": "#CECDC3",
"activityBar.inactiveForeground": "#878580",
"activityBar.activeBorder": "#CECDC3",
"activityBar.border": "#343331",
"sideBar.background": "#100F0F",
"sideBar.foreground": "#CECDC3",
"sideBar.border": "#343331",
"sideBarTitle.foreground": "#CECDC3",
"sideBarSectionHeader.background": "#1C1B1A",
"sideBarSectionHeader.foreground": "#CECDC3",
"sideBarSectionHeader.border": "#343331",
"sideBar.activeBackground": "#403E3C",
"sideBar.activeForeground": "#CECDC3",
"sideBar.hoverBackground": "#343331",
"sideBar.hoverForeground": "#878580",
"sideBar.folderIcon.foreground": "#879A39",
"sideBar.fileIcon.foreground": "#4385BE",
"list.warningForeground": "#DA702C",
"list.errorForeground": "#D14D41",
"list.inactiveSelectionBackground": "#343331",
"list.activeSelectionBackground": "#403E3C",
"list.inactiveSelectionForeground": "#CECDC3",
"list.activeSelectionForeground": "#CECDC3",
"list.hoverForeground": "#CECDC3",
"list.hoverBackground": "#343331",
"input.background": "#1C1B1A",
"input.foreground": "#CECDC3",
"input.border": "#343331",
"input.placeholderForeground": "#878580",
"inputOption.activeBorder": "#343331",
"inputOption.activeBackground": "#282726",
"inputOption.activeForeground": "#CECDC3",
"inputValidation.infoBackground": "#3AA99F",
"inputValidation.infoBorder": "#24837B",
"inputValidation.warningBackground": "#DA702C",
"inputValidation.warningBorder": "#BC5215",
"inputValidation.errorBackground": "#D14D41",
"inputValidation.errorBorder": "#AF3029",
"dropdown.background": "#1C1B1A",
"dropdown.foreground": "#CECDC3",
"dropdown.border": "#343331",
"dropdown.listBackground": "#100F0F",
"badge.background": "#3AA99F",
"activityBarBadge.background": "#3AA99F",
"button.background": "#3AA99F",
"button.foreground": "#100F0F",
"badge.foreground": "#100F0F",
"activityBarBadge.foreground": "#100F0F"
},
"tokenColors": [
{
"name": "plain",
"scope": ["source", "support.type.property-name.css"],
"settings": {
"foreground": "#CECDC3"
}
},
{
"name": "classes",
"scope": ["entity.name.type.class"],
"settings": {
"foreground": "#DA702C"
}
},
{
"name": "interfaces",
"scope": ["entity.name.type.interface", "entity.name.type"],
"settings": {
"foreground": "#D0A215"
}
},
{
"name": "structs",
"scope": ["entity.name.type.struct"],
"settings": {
"foreground": "#DA702C"
}
},
{
"name": "enums",
"scope": ["entity.name.type.enum"],
"settings": {
"foreground": "#DA702C"
}
},
{
"name": "keys",
"scope": ["meta.object-literal.key", "support.type.property-name"],
"settings": {
"foreground": "#DA702C"
}
},
{
"name": "methods",
"scope": ["entity.name.function.method", "meta.function.method"],
"settings": {
"foreground": "#879A39"
}
},
{
"name": "functions",
"scope": [
"entity.name.function",
"support.function",
"meta.function-call.generic"
],
"settings": {
"foreground": "#DA702C",
"fontStyle": "bold"
}
},
{
"name": "variables",
"scope": ["variable", "meta.variable", "variable.other.object.property"],
"settings": {
"foreground": "#CECDC3"
}
},
{
"name": "variablesOther",
"scope": ["variable.other.object", "variable.other.readwrite.alias"],
"settings": {
"foreground": "#879A39"
}
},
{
"name": "globalVariables",
"scope": ["variable.other.global", "variable.language.this"],
"settings": {
"foreground": "#CE5D97"
}
},
{
"name": "localVariables",
"scope": ["variable.other.local"],
"settings": {
"foreground": "#282726"
}
},
{
"name": "parameters",
"scope": ["variable.parameter", "meta.parameter"],
"settings": {
"foreground": "#CECDC3"
}
},
{
"name": "properties",
"scope": ["variable.other.property", "meta.property"],
"settings": {
"foreground": "#4385BE"
}
},
{
"name": "strings",
"scope": [
"string",
"string.other.link",
"markup.inline.raw.string.markdown"
],
"settings": {
"foreground": "#3AA99F"
}
},
{
"name": "stringEscapeSequences",
"scope": ["constant.character.escape", "constant.other.placeholder"],
"settings": {
"foreground": "#CECDC3"
}
},
{
"name": "keywords",
"scope": ["keyword"],
"settings": {
"foreground": "#879A39"
}
},
{
"name": "keywordsControl",
"scope": [
"keyword.control.import",
"keyword.control.from",
"keyword.import"
],
"settings": {
"foreground": "#D14D41"
}
},
{
"name": "storageModifiers",
"scope": ["storage.modifier", "keyword.modifier", "storage.type"],
"settings": {
"foreground": "#4385BE"
}
},
{
"name": "comments",
"scope": ["comment", "punctuation.definition.comment"],
"settings": {
"foreground": "#878580"
}
},
{
"name": "docComments",
"scope": ["comment.documentation", "comment.line.documentation"],
"settings": {
"foreground": "#575653"
}
},
{
"name": "numbers",
"scope": ["constant.numeric"],
"settings": {
"foreground": "#8B7EC8"
}
},
{
"name": "booleans",
"scope": ["constant.language.boolean", "constant.language.json"],
"settings": {
"foreground": "#D0A215"
}
},
{
"name": "operators",
"scope": ["keyword.operator"],
"settings": {
"foreground": "#D14D41"
}
},
{
"name": "macros",
"scope": ["entity.name.function.preprocessor", "meta.preprocessor"],
"settings": {
"foreground": "#4385BE"
}
},
{
"name": "preprocessor",
"scope": ["meta.preprocessor"],
"settings": {
"foreground": "#CE5D97"
}
},
{
"name": "urls",
"scope": ["markup.underline.link"],
"settings": {
"foreground": "#4385BE"
}
},
{
"name": "tags",
"scope": ["entity.name.tag"],
"settings": {
"foreground": "#4385BE"
}
},
{
"name": "jsxTags",
"scope": ["support.class.component"],
"settings": {
"foreground": "#CE5D97"
}
},
{
"name": "attributes",
"scope": ["entity.other.attribute-name", "meta.attribute"],
"settings": {
"foreground": "#D0A215"
}
},
{
"name": "types",
"scope": ["support.type"],
"settings": {
"foreground": "#D0A215"
}
},
{
"name": "constants",
"scope": ["variable.other.constant", "variable.readonly"],
"settings": {
"foreground": "#CECDC3"
}
},
{
"name": "labels",
"scope": ["entity.name.label", "punctuation.definition.label"],
"settings": {
"foreground": "#CE5D97"
}
},
{
"name": "namespaces",
"scope": [
"entity.name.namespace",
"storage.modifier.namespace",
"markup.bold.markdown"
],
"settings": {
"foreground": "#D0A215"
}
},
{
"name": "modules",
"scope": ["entity.name.module", "storage.modifier.module"],
"settings": {
"foreground": "#D14D41"
}
},
{
"name": "typeParameters",
"scope": ["variable.type.parameter", "variable.parameter.type"],
"settings": {
"foreground": "#DA702C"
}
},
{
"name": "exceptions",
"scope": ["keyword.control.exception", "keyword.control.trycatch"],
"settings": {
"foreground": "#CE5D97"
}
},
{
"name": "decorators",
"scope": [
"meta.decorator",
"punctuation.decorator",
"entity.name.function.decorator"
],
"settings": {
"foreground": "#D0A215"
}
},
{
"name": "calls",
"scope": ["variable.function"],
"settings": {
"foreground": "#CECDC3"
}
},
{
"name": "punctuation",
"scope": [
"punctuation",
"punctuation.terminator",
"punctuation.definition.tag",
"punctuation.separator",
"punctuation.definition.string",
"punctuation.section.block"
],
"settings": {
"foreground": "#878580"
}
},
{
"name": "yellow",
"scope": [
"storage.type.numeric.go",
"storage.type.byte.go",
"storage.type.boolean.go",
"storage.type.string.go",
"storage.type.uintptr.go",
"storage.type.error.go",
"storage.type.rune.go",
"constant.language.go",
"support.class.dart",
"keyword.other.documentation",
"storage.modifier.import.java",
"punctuation.definition.list.begin.markdown",
"punctuation.definition.quote.begin.markdown",
"meta.separator.markdown",
"entity.name.section.markdown"
],
"settings": {
"foreground": "#D0A215"
}
},
{
"name": "green",
"scope": [],
"settings": {
"foreground": "#879A39"
}
},
{
"name": "cyan",
"scope": [
"markup.italic.markdown",
"support.type.python",
"variable.legacy.builtin.python",
"support.constant.property-value.css",
"storage.modifier.attribute.swift"
],
"settings": {
"foreground": "#3AA99F"
}
},
{
"name": "blue",
"scope": [],
"settings": {
"foreground": "#4385BE"
}
},
{
"name": "purple",
"scope": ["keyword.channel.go", "keyword.other.platform.os.swift"],
"settings": {
"foreground": "#8B7EC8"
}
},
{
"name": "magenta",
"scope": ["punctuation.definition.heading.markdown"],
"settings": {
"foreground": "#CE5D97"
}
},
{
"name": "red",
"scope": [],
"settings": {
"foreground": "#D14D41"
}
},
{
"name": "orange",
"scope": [],
"settings": {
"foreground": "#DA702C"
}
}
]
}
@@ -1,547 +0,0 @@
{
"name": "Flexoki",
"type": "light",
"colors": {
"editor.background": "#FFFCF0",
"editor.foreground": "#100F0F",
"editor.hoverHighlightBackground": "#DAD8CE",
"editor.lineHighlightBackground": "#F2F0E5",
"editor.selectionBackground": "#100F0F44",
"editor.selectionHighlightBackground": "#100F0F44",
"editor.findMatchBackground": "#D0A215",
"editor.findMatchHighlightBackground": "#D0A215cc",
"editor.findRangeHighlightBackground": "#F2F0E5",
"editor.inactiveSelectionBackground": "#E6E4D9",
"editor.lineHighlightBorder": "#E6E4D9",
"editor.rangeHighlightBackground": "#CECDC3",
"notifications.background": "#E6E4D9",
"editorInlayHint.typeBackground": "#DAD8CE",
"editorInlayHint.typeForeground": "#100F0F",
"editorWhitespace.foreground": "#CECDC3",
"editorIndentGuide.background1": "#DAD8CE",
"editorHoverWidget.background": "#E6E4D9",
"editorLineNumber.activeForeground": "#100F0F",
"editorLineNumber.foreground": "#CECDC3",
"editorGutter.background": "#FFFCF0",
"editorGutter.modifiedBackground": "#24837B",
"editorGutter.addedBackground": "#66800B",
"editorGutter.deletedBackground": "#AF3029",
"editorBracketMatch.background": "#E6E4D9",
"editorBracketMatch.border": "#DAD8CE",
"editorError.foreground": "#AF3029",
"editorWarning.foreground": "#BC5215",
"editorInfo.foreground": "#205EA6",
"diffEditor.insertedTextBackground": "#879A3999",
"diffEditor.removedTextBackground": "#D14D4199",
"editorGroupHeader.tabsBackground": "#FFFCF0",
"editorGroup.border": "#DAD8CE",
"tab.activeBackground": "#FFFCF0",
"tab.inactiveBackground": "#F2F0E5",
"tab.inactiveForeground": "#6F6E69",
"tab.activeForeground": "#100F0F",
"tab.hoverBackground": "#DAD8CE",
"tab.unfocusedHoverBackground": "#DAD8CE",
"tab.border": "#DAD8CE",
"tab.activeModifiedBorder": "#AD8301",
"tab.inactiveModifiedBorder": "#205EA6",
"tab.unfocusedActiveModifiedBorder": "#D0A215",
"tab.unfocusedInactiveModifiedBorder": "#4385BE",
"editorWidget.background": "#F2F0E5",
"editorWidget.border": "#DAD8CE",
"editorSuggestWidget.background": "#FFFCF0",
"editorSuggestWidget.border": "#DAD8CE",
"editorSuggestWidget.foreground": "#100F0F",
"editorSuggestWidget.highlightForeground": "#6F6E69",
"editorSuggestWidget.selectedBackground": "#DAD8CE",
"peekView.border": "#DAD8CE",
"peekViewEditor.background": "#FFFCF0",
"peekViewEditor.matchHighlightBackground": "#CECDC3",
"peekViewResult.background": "#F2F0E5",
"peekViewResult.fileForeground": "#100F0F",
"peekViewResult.lineForeground": "#6F6E69",
"peekViewResult.matchHighlightBackground": "#CECDC3",
"peekViewResult.selectionBackground": "#E6E4D9",
"peekViewResult.selectionForeground": "#B7B5AC",
"peekViewTitle.background": "#DAD8CE",
"peekViewTitleDescription.foreground": "#6F6E69",
"peekViewTitleLabel.foreground": "#100F0F",
"merge.currentHeaderBackground": "#66800B",
"merge.currentContentBackground": "#879A39",
"merge.incomingHeaderBackground": "#24837B",
"merge.incomingContentBackground": "#3AA99F",
"merge.border": "#DAD8CE",
"merge.commonContentBackground": "#CECDC3",
"merge.commonHeaderBackground": "#DAD8CE",
"panel.background": "#FFFCF0",
"panel.border": "#DAD8CE",
"panelTitle.activeBorder": "#CECDC3",
"panelTitle.activeForeground": "#100F0F",
"panelTitle.inactiveForeground": "#6F6E69",
"statusBar.background": "#FFFCF0",
"statusBar.foreground": "#100F0F",
"statusBar.border": "#DAD8CE",
"statusBar.debuggingBackground": "#AF3029",
"statusBar.debuggingForeground": "#100F0F",
"statusBar.noFolderBackground": "#CECDC3",
"statusBar.noFolderForeground": "#B7B5AC",
"titleBar.activeBackground": "#FFFCF0",
"titleBar.activeForeground": "#100F0F",
"titleBar.inactiveBackground": "#F2F0E5",
"titleBar.inactiveForeground": "#6F6E69",
"titleBar.border": "#DAD8CE",
"menu.foreground": "#100F0F",
"menu.background": "#FFFCF0",
"menu.selectionForeground": "#100F0F",
"menu.selectionBackground": "#DAD8CE",
"menu.border": "#DAD8CE",
"editorInlayHint.foreground": "#6F6E69",
"editorInlayHint.background": "#DAD8CE",
"terminal.foreground": "#100F0F",
"terminal.background": "#FFFCF0",
"terminalCursor.foreground": "#100F0F",
"terminalCursor.background": "#FFFCF0",
"terminal.ansiRed": "#AF3029",
"terminal.ansiGreen": "#66800B",
"terminal.ansiYellow": "#AD8301",
"terminal.ansiBlue": "#205EA6",
"terminal.ansiMagenta": "#24837B",
"terminal.ansiCyan": "#24837B",
"activityBar.background": "#FFFCF0",
"activityBar.foreground": "#100F0F",
"activityBar.inactiveForeground": "#6F6E69",
"activityBar.activeBorder": "#100F0F",
"activityBar.border": "#DAD8CE",
"sideBar.background": "#FFFCF0",
"sideBar.foreground": "#100F0F",
"sideBar.border": "#DAD8CE",
"sideBarTitle.foreground": "#100F0F",
"sideBarSectionHeader.background": "#F2F0E5",
"sideBarSectionHeader.foreground": "#100F0F",
"sideBarSectionHeader.border": "#DAD8CE",
"sideBar.activeBackground": "#CECDC3",
"sideBar.activeForeground": "#100F0F",
"sideBar.hoverBackground": "#DAD8CE",
"sideBar.hoverForeground": "#6F6E69",
"sideBar.folderIcon.foreground": "#66800B",
"sideBar.fileIcon.foreground": "#205EA6",
"list.warningForeground": "#BC5215",
"list.errorForeground": "#AF3029",
"list.inactiveSelectionBackground": "#DAD8CE",
"list.activeSelectionBackground": "#CECDC3",
"list.inactiveSelectionForeground": "#100F0F",
"list.activeSelectionForeground": "#100F0F",
"list.hoverForeground": "#100F0F",
"list.hoverBackground": "#DAD8CE",
"input.background": "#F2F0E5",
"input.foreground": "#100F0F",
"input.border": "#DAD8CE",
"input.placeholderForeground": "#6F6E69",
"inputOption.activeBorder": "#DAD8CE",
"inputOption.activeBackground": "#E6E4D9",
"inputOption.activeForeground": "#100F0F",
"inputValidation.infoBackground": "#24837B",
"inputValidation.infoBorder": "#3AA99F",
"inputValidation.warningBackground": "#BC5215",
"inputValidation.warningBorder": "#DA702C",
"inputValidation.errorBackground": "#AF3029",
"inputValidation.errorBorder": "#D14D41",
"dropdown.background": "#F2F0E5",
"dropdown.foreground": "#100F0F",
"dropdown.border": "#DAD8CE",
"dropdown.listBackground": "#FFFCF0",
"badge.background": "#24837B",
"activityBarBadge.background": "#24837B",
"button.background": "#24837B",
"button.foreground": "#FFFCF0",
"badge.foreground": "#FFFCF0",
"activityBarBadge.foreground": "#FFFCF0"
},
"tokenColors": [
{
"name": "plain",
"scope": ["source", "support.type.property-name.css"],
"settings": {
"foreground": "#100F0F"
}
},
{
"name": "classes",
"scope": ["entity.name.type.class"],
"settings": {
"foreground": "#BC5215"
}
},
{
"name": "interfaces",
"scope": ["entity.name.type.interface", "entity.name.type"],
"settings": {
"foreground": "#AD8301"
}
},
{
"name": "structs",
"scope": ["entity.name.type.struct"],
"settings": {
"foreground": "#BC5215"
}
},
{
"name": "enums",
"scope": ["entity.name.type.enum"],
"settings": {
"foreground": "#BC5215"
}
},
{
"name": "keys",
"scope": ["meta.object-literal.key", "support.type.property-name"],
"settings": {
"foreground": "#BC5215"
}
},
{
"name": "methods",
"scope": ["entity.name.function.method", "meta.function.method"],
"settings": {
"foreground": "#66800B"
}
},
{
"name": "functions",
"scope": [
"entity.name.function",
"support.function",
"meta.function-call.generic"
],
"settings": {
"foreground": "#BC5215",
"fontStyle": "bold"
}
},
{
"name": "variables",
"scope": ["variable", "meta.variable", "variable.other.object.property"],
"settings": {
"foreground": "#100F0F"
}
},
{
"name": "variablesOther",
"scope": ["variable.other.object", "variable.other.readwrite.alias"],
"settings": {
"foreground": "#66800B"
}
},
{
"name": "globalVariables",
"scope": ["variable.other.global", "variable.language.this"],
"settings": {
"foreground": "#A02F6F"
}
},
{
"name": "localVariables",
"scope": ["variable.other.local"],
"settings": {
"foreground": "#E6E4D9"
}
},
{
"name": "parameters",
"scope": ["variable.parameter", "meta.parameter"],
"settings": {
"foreground": "#100F0F"
}
},
{
"name": "properties",
"scope": ["variable.other.property", "meta.property"],
"settings": {
"foreground": "#205EA6"
}
},
{
"name": "strings",
"scope": [
"string",
"string.other.link",
"markup.inline.raw.string.markdown"
],
"settings": {
"foreground": "#24837B"
}
},
{
"name": "stringEscapeSequences",
"scope": ["constant.character.escape", "constant.other.placeholder"],
"settings": {
"foreground": "#100F0F"
}
},
{
"name": "keywords",
"scope": ["keyword"],
"settings": {
"foreground": "#66800B"
}
},
{
"name": "keywordsControl",
"scope": [
"keyword.control.import",
"keyword.control.from",
"keyword.import"
],
"settings": {
"foreground": "#AF3029"
}
},
{
"name": "storageModifiers",
"scope": ["storage.modifier", "keyword.modifier", "storage.type"],
"settings": {
"foreground": "#205EA6"
}
},
{
"name": "comments",
"scope": ["comment", "punctuation.definition.comment"],
"settings": {
"foreground": "#6F6E69"
}
},
{
"name": "docComments",
"scope": ["comment.documentation", "comment.line.documentation"],
"settings": {
"foreground": "#B7B5AC"
}
},
{
"name": "numbers",
"scope": ["constant.numeric"],
"settings": {
"foreground": "#5E409D"
}
},
{
"name": "booleans",
"scope": ["constant.language.boolean", "constant.language.json"],
"settings": {
"foreground": "#AD8301"
}
},
{
"name": "operators",
"scope": ["keyword.operator"],
"settings": {
"foreground": "#AF3029"
}
},
{
"name": "macros",
"scope": ["entity.name.function.preprocessor", "meta.preprocessor"],
"settings": {
"foreground": "#205EA6"
}
},
{
"name": "preprocessor",
"scope": ["meta.preprocessor"],
"settings": {
"foreground": "#A02F6F"
}
},
{
"name": "urls",
"scope": ["markup.underline.link"],
"settings": {
"foreground": "#205EA6"
}
},
{
"name": "tags",
"scope": ["entity.name.tag"],
"settings": {
"foreground": "#205EA6"
}
},
{
"name": "jsxTags",
"scope": ["support.class.component"],
"settings": {
"foreground": "#A02F6F"
}
},
{
"name": "attributes",
"scope": ["entity.other.attribute-name", "meta.attribute"],
"settings": {
"foreground": "#AD8301"
}
},
{
"name": "types",
"scope": ["support.type"],
"settings": {
"foreground": "#AD8301"
}
},
{
"name": "constants",
"scope": ["variable.other.constant", "variable.readonly"],
"settings": {
"foreground": "#100F0F"
}
},
{
"name": "labels",
"scope": ["entity.name.label", "punctuation.definition.label"],
"settings": {
"foreground": "#A02F6F"
}
},
{
"name": "namespaces",
"scope": [
"entity.name.namespace",
"storage.modifier.namespace",
"markup.bold.markdown"
],
"settings": {
"foreground": "#AD8301"
}
},
{
"name": "modules",
"scope": ["entity.name.module", "storage.modifier.module"],
"settings": {
"foreground": "#AF3029"
}
},
{
"name": "typeParameters",
"scope": ["variable.type.parameter", "variable.parameter.type"],
"settings": {
"foreground": "#BC5215"
}
},
{
"name": "exceptions",
"scope": ["keyword.control.exception", "keyword.control.trycatch"],
"settings": {
"foreground": "#A02F6F"
}
},
{
"name": "decorators",
"scope": [
"meta.decorator",
"punctuation.decorator",
"entity.name.function.decorator"
],
"settings": {
"foreground": "#AD8301"
}
},
{
"name": "calls",
"scope": ["variable.function"],
"settings": {
"foreground": "#100F0F"
}
},
{
"name": "punctuation",
"scope": [
"punctuation",
"punctuation.terminator",
"punctuation.definition.tag",
"punctuation.separator",
"punctuation.definition.string",
"punctuation.section.block"
],
"settings": {
"foreground": "#6F6E69"
}
},
{
"name": "yellow",
"scope": [
"storage.type.numeric.go",
"storage.type.byte.go",
"storage.type.boolean.go",
"storage.type.string.go",
"storage.type.uintptr.go",
"storage.type.error.go",
"storage.type.rune.go",
"constant.language.go",
"support.class.dart",
"keyword.other.documentation",
"storage.modifier.import.java",
"punctuation.definition.list.begin.markdown",
"punctuation.definition.quote.begin.markdown",
"meta.separator.markdown",
"entity.name.section.markdown"
],
"settings": {
"foreground": "#AD8301"
}
},
{
"name": "green",
"scope": [],
"settings": {
"foreground": "#66800B"
}
},
{
"name": "cyan",
"scope": [
"markup.italic.markdown",
"support.type.python",
"variable.legacy.builtin.python",
"support.constant.property-value.css",
"storage.modifier.attribute.swift"
],
"settings": {
"foreground": "#24837B"
}
},
{
"name": "blue",
"scope": [],
"settings": {
"foreground": "#205EA6"
}
},
{
"name": "purple",
"scope": ["keyword.channel.go", "keyword.other.platform.os.swift"],
"settings": {
"foreground": "#5E409D"
}
},
{
"name": "magenta",
"scope": ["punctuation.definition.heading.markdown"],
"settings": {
"foreground": "#A02F6F"
}
},
{
"name": "red",
"scope": [],
"settings": {
"foreground": "#AF3029"
}
},
{
"name": "orange",
"scope": [],
"settings": {
"foreground": "#BC5215"
}
}
]
}
@@ -0,0 +1,14 @@
export type VSCodeTokenColorRule = {
name?: string;
scope?: string | string[];
settings: Record<string, string | undefined>;
};
export type VSCodeTextMateTheme = {
name: string;
type: 'dark' | 'light';
colors?: Record<string, string>;
tokenColors?: VSCodeTokenColorRule[];
semanticHighlighting?: boolean;
semanticTokenColors?: Record<string, string>;
};