diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 837ce85c7..e30b8b51a 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1,7 +1,8 @@ {"_type":"issue","id":"nixmac-cmu","title":"Rust dead_code errors in e2e_runtime.rs (release build)","description":"cargo build fails on apps/native/src-tauri/src/e2e_runtime.rs with five dead_code/unused_imports errors:\\n\\n- unused import: std::fs\\n- constant RUNTIME_FILE_NAME is never used\\n- constant BUNDLE_ID is never used\\n- struct E2eRuntimeFile is never constructed\\n- function runtime_file_path is never used\\n\\nFile was added in 911b08e4 (PR #90, Peekaboo Product Proof lane) as debug-only runtime overrides. The cfg-gating on consumers excludes them in release builds, but the declarations are unconditional, so cargo (with warnings-as-errors) flags them as dead.\\n\\nSurfaced now (not earlier) because env.ts fix (9cc24118) lets the build progress past tsc into cargo. Previously the run failed at tsc with TS6133/TS6192/TS2339 errors and never reached cargo compilation.\\n\\nFix options:\\n1. Add #[cfg(debug_assertions)] to the affected declarations\\n2. Add #[allow(dead_code)] on the affected items\\n3. Use the declarations in release builds too (probably wrong intent)\\n\\nOption 1 is most correct semantically — matches the comment 'Release builds ignore the file.'\\n\\nNot blocking PR #195 (nightly-release): this PR adds shell scripts / workflow YAML / one Schema migration, zero Rust changes. Surfaced as part of the cascade unblocked by nixmac-62s fix.","status":"open","priority":1,"issue_type":"bug","owner":"me@cooperm.com","created_at":"2026-05-24T10:38:44Z","created_by":"Cooper Maruyama","updated_at":"2026-05-24T10:38:44Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"nixmac-62s","title":"Fix TypeScript errors blocking build on main","description":"The build.yaml check has been red on main since 2026-05-10 (commit bd658afc). Errors:\\n\\n- apps/native/src/components/widget/promptinput/prompt-input.tsx:20 — unused Plus import (TS6133)\\n- apps/native/src/components/widget/promptinput/prompt-input.tsx:22 — all imports unused (TS6192)\\n- apps/native/src/lib/env.ts:5 — Schema.BooleanFromString missing (TS2339)\\n- apps/native/src/lib/env.ts:10 — Decoder type mismatch (TS2345)\\n\\nLast green build: 502d2dfc on 2026-05-04. The env.ts errors look like effect-ts beta-version regression (effect@4.0.0-beta.62 in lockfile). Fix tsc errors so PR builds pass and the nightly-release shipping path is unblocked.\\n\\nDiscovered while triaging build failure on PR #195 (nightly-release feature, beads nixmac-srn).","status":"closed","priority":1,"issue_type":"bug","assignee":"Cooper Maruyama","owner":"me@cooperm.com","created_at":"2026-05-24T08:12:27Z","created_by":"Cooper Maruyama","updated_at":"2026-05-24T09:21:32Z","started_at":"2026-05-24T09:17:59Z","closed_at":"2026-05-24T09:21:32Z","close_reason":"Fixed in 44780754: removed unused Plus and DropdownMenu imports from prompt-input.tsx. env.ts errors did not reproduce — apps/native resolves effect to 3.21.0 (transitive) which still has BooleanFromString. tsc + vite build pass clean.","dependency_count":0,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"nixmac-ntg","title":"Fix CI failures on filesystem branch","description":"Investigate the latest CI failures on branch claude/implement-filesystem-0EY4O, reproduce the root cause locally where possible, and apply the minimal fix with verification.","notes":"Local fixes applied for Build macOS App, Danger unit failures, and E2E artifact race. Verified: bun -F native build; bunx vitest run --project=unit --coverage --coverage.reporter=json-summary --coverage.reporter=text --reporter=basic; bash -n tests/e2e/ci-runner.sh; ReadLints on edited files.","status":"in_progress","priority":1,"issue_type":"bug","assignee":"Cooper Maruyama","owner":"me@cooperm.com","created_at":"2026-05-07T05:37:56Z","created_by":"Cooper Maruyama","updated_at":"2026-05-07T05:46:29Z","started_at":"2026-05-07T05:37:59Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"nixmac-gr3","title":"Add repo-scoped storage backend for Configurable settings (.nixmac/settings.json)","description":"Today, Configurable structs read from tauri-plugin-store's default location (OS app data dir) — per-device, doesn't survive reinstall, doesn't sync across machines. The user's nix-darwin config repo IS the source of truth for their machine setup, and it already syncs across devices (they clone/pull it).\n\nAdding a repo-scoped store at \u003cconfig_dir\u003e/.nixmac/settings.json lets settings that are 'about how I use nixmac' (max iterations, provider preferences, confirmations) ride along with the config repo via git. Per-device settings (developer_mode, pinned_version, update_channel) stay in the OS app data dir where they belong.\n\nDesign:\n- configurable-derive learns #[config(store_path_fn = \u003cpath\u003e)] in addition to #[config(store_path = \"...\")]. The fn variant calls a path resolver at runtime, so the derive stays decoupled from nixmac internals.\n- New storage::configurable_scope module exposes repo_store_path(app) -\u003e Result\u003cString\u003e which returns absolute path to \u003cconfig_dir\u003e/.nixmac/settings.json and ensures the dir exists.\n- EvolutionLimits opts into repo scope (these are user prefs that should follow the user).\n- Auto-write a small .nixmac/README.md the first time the dir is created, so a curious git user understands what's there.\n\nOut of scope for this issue:\n- Migration of existing local-store EvolutionLimits values (users with non-default values will see them reset to defaults on first launch after upgrade — acceptable since this is dev-mode/pre-launch software)\n- UiPrefs migration (still tracked under nixmac-e53)\n- UI toggle to disable repo sync (premature — gitignore is the existing escape hatch)","acceptance_criteria":"repo_store_path() function returns absolute path under \u003cconfig_dir\u003e/.nixmac/; #[config(store_path_fn = ...)] supported by the derive; EvolutionLimits uses repo scope; on first read, .nixmac/ directory and a small README.md are auto-created in the config dir; existing per-device behavior preserved for any Configurable still using store_path; cargo + bun tests green","status":"closed","priority":2,"issue_type":"feature","owner":"me@cooperm.com","created_at":"2026-05-25T03:21:14Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T03:26:38Z","closed_at":"2026-05-25T03:26:38Z","close_reason":"Shipped in 11d6407c. EvolutionLimits now repo-scoped via .nixmac/settings.json with one-time migration from local store.","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"nixmac-4lz","title":"Tweak diff diagnostics padding and default theme","description":"Add right-side padding in the diff editor for LSP diagnostics readability, and include the minted theme from the local apathy-theme checkout as the app default.","status":"closed","priority":2,"issue_type":"task","assignee":"Cooper Maruyama","owner":"me@cooperm.com","created_at":"2026-05-25T12:32:27Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T12:44:20Z","started_at":"2026-05-25T12:34:26Z","closed_at":"2026-05-25T12:44:20Z","close_reason":"Added Minted theme defaults and right padding for diff editor diagnostics","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"nixmac-gr3","title":"Add repo-scoped storage backend for Configurable settings (.nixmac/settings.json)","description":"Today, Configurable structs read from tauri-plugin-store's default location (OS app data dir) — per-device, doesn't survive reinstall, doesn't sync across machines. The user's nix-darwin config repo IS the source of truth for their machine setup, and it already syncs across devices (they clone/pull it).\n\nAdding a repo-scoped store at \u003cconfig_dir\u003e/.nixmac/settings.json lets settings that are 'about how I use nixmac' (max iterations, provider preferences, confirmations) ride along with the config repo via git. Per-device settings (developer_mode, pinned_version, update_channel) stay in the OS app data dir where they belong.\n\nDesign:\n- configurable-derive learns #[config(store_path_fn = \u003cpath\u003e)] in addition to #[config(store_path = \"...\")]. The fn variant calls a path resolver at runtime, so the derive stays decoupled from nixmac internals.\n- New storage::configurable_scope module exposes repo_store_path(app) -\u003e Result\u003cString\u003e which returns absolute path to \u003cconfig_dir\u003e/.nixmac/settings.json and ensures the dir exists.\n- EvolutionLimits opts into repo scope (these are user prefs that should follow the user).\n- Auto-write a small .nixmac/README.md the first time the dir is created, so a curious git user understands what's there.\n\nOut of scope for this issue:\n- Migration of existing local-store EvolutionLimits values (users with non-default values will see them reset to defaults on first launch after upgrade — acceptable since this is dev-mode/pre-launch software)\n- UiPrefs migration (still tracked under nixmac-e53)\n- UI toggle to disable repo sync (premature — gitignore is the existing escape hatch)","acceptance_criteria":"repo_store_path() function returns absolute path under \u003cconfig_dir\u003e/.nixmac/; #[config(store_path_fn = ...)] supported by the derive; EvolutionLimits uses repo scope; on first read, .nixmac/ directory and a small README.md are auto-created in the config dir; existing per-device behavior preserved for any Configurable still using store_path; cargo + bun tests green","status":"open","priority":2,"issue_type":"feature","owner":"me@cooperm.com","created_at":"2026-05-25T03:21:14Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T03:21:14Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"nixmac-4yh","title":"Rename VLLM provider label","description":"Rename the provider shown in settings from VLLM to OpenAI Compatible.","status":"closed","priority":2,"issue_type":"task","assignee":"Cooper Maruyama","owner":"me@cooperm.com","created_at":"2026-05-25T03:10:50Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T03:21:26Z","started_at":"2026-05-25T03:12:41Z","closed_at":"2026-05-25T03:21:26Z","close_reason":"Renamed settings provider label from vLLM to OpenAI Compatible","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"nixmac-cqb","title":"Add Tuning + Backup/Restore sections to Developer settings tab","description":"Move Evolution Limits (max_iterations, max_build_attempts) out of the AI Models tab (where it's awkward) into a new Tuning section in the Developer tab. Add a sibling Backup \u0026 Restore section with Export/Import settings.json buttons.\n\nUX:\n- Tuning section: home for behavior knobs (currently 2 numbers, will grow with future Configurable structs)\n- Backup \u0026 Restore section: Export button (sanitized by default — strips API keys; opt-in checkbox to include); Import button (replace entire store, with confirmation dialog)\n- Both gated behind existing developerMode toggle (no new gating needed — they live in the already-gated Developer tab)\n\nBackend:\n- New Tauri commands: settings_export(path, include_secrets) -\u003e Result\u003c()\u003e, settings_import(path) -\u003e Result\u003c()\u003e\n- Denylist for sanitized export: openrouterApiKey, openaiApiKey, vllmApiKey, and anything matching *ApiKey naming convention\n- Import validates the JSON structure, then replaces the store contents (replace semantics, not merge)\n\nFrontend:\n- Move Evolution Limits inputs out of ai-models-tab.tsx into developer-tab.tsx Tuning section\n- Add Backup \u0026 Restore section with file-picker dialogs via tauri-plugin-dialog\n\nSnapshot test for ai-models-tab.stories.tsx will need updating after the move.","acceptance_criteria":"Evolution Limits moved out of AI Models tab; Tuning section visible in Developer tab; Backup \u0026 Restore section with Export/Import buttons; export defaults to sanitized (API keys stripped); export checkbox opt-in adds them; import shows confirmation dialog then wholesale-replaces store contents; bun test green; cargo test green","status":"closed","priority":2,"issue_type":"feature","assignee":"Cooper Maruyama","owner":"me@cooperm.com","created_at":"2026-05-25T03:06:33Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T03:18:04Z","started_at":"2026-05-25T03:08:38Z","closed_at":"2026-05-25T03:18:04Z","close_reason":"Shipped in c1ca5bbd. Tuning + Backup/Restore sections live in Developer tab; Evolution Limits moved out of AI Models.","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"nixmac-8ka","title":"Configurable derive macro for typed dev settings (PoC)","description":"Build a Rust proc-macro derive Configurable that eliminates per-setting boilerplate. Today a single knob (e.g. max_build_attempts) touches 6+ files: store.rs getter/setter, UiPrefs + UiPrefsUpdate fields, ui_get_prefs read + ui_set_prefs write, TS bindings (via specta), and UI form. The derive co-locates config with the module that uses it; the dev settings panel auto-discovers via an inventory registry.\n\nPoC scope: implement the configurable crate + migrate EvolutionLimits (max_iterations + max_build_attempts) only. Validates the macro design before broader migration.\n\nBug-fix bonus: DEFAULT_MAX_BUILD_ATTEMPTS is declared in evolve/mod.rs:281 AND hardcoded as 5 in ui_prefs.rs:32 — the single-source-of-truth field default eliminates this drift.","acceptance_criteria":"configurable crate exists at apps/native/src-tauri/configurable/; EvolutionLimits struct with #[derive(Configurable)] replaces DEFAULT_MAX_BUILD_ATTEMPTS + DEFAULT_MAX_ITERATIONS; evolve/mod.rs:458 uses EvolutionLimits::load(app); existing store::get_max_iterations / set_max_iterations / get_max_build_attempts / set_max_build_attempts still work for back-compat during transition; specta-derived TS types still emitted for the new struct; cargo build + cargo test green","status":"closed","priority":2,"issue_type":"feature","assignee":"Cooper Maruyama","owner":"me@cooperm.com","created_at":"2026-05-25T02:42:27Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T02:53:19Z","started_at":"2026-05-25T02:43:21Z","closed_at":"2026-05-25T02:53:19Z","close_reason":"Shipped in 94a90036. EvolutionLimits migrated, macro proves the pattern, full migration tracked under nixmac-e53.","dependency_count":0,"dependent_count":6,"comment_count":0} @@ -27,5 +28,5 @@ {"_type":"issue","id":"nixmac-orl","title":"Migrate AppBehaviorPrefs (auto_summarize, dev_mode, etc.) to Configurable","description":"Replace auto_summarize_on_focus, scan_homebrew_on_startup, default_to_diff_tab, developer_mode, send_diagnostics in UiPrefs with an AppBehaviorPrefs Configurable struct. Five booleans currently get five hand-written branches in ui_set_prefs. Blocked by configurable PoC.","status":"open","priority":3,"issue_type":"task","owner":"me@cooperm.com","created_at":"2026-05-25T02:42:51Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T02:42:51Z","dependencies":[{"issue_id":"nixmac-orl","depends_on_id":"nixmac-8ka","type":"blocks","created_at":"2026-05-24T19:43:11Z","created_by":"Cooper Maruyama","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"nixmac-5nc","title":"Migrate ConfirmationPrefs (confirm_build/clear/rollback) to Configurable","description":"Replace confirm_build, confirm_clear, confirm_rollback in UiPrefs with a ConfirmationPrefs Configurable struct. Three booleans currently each get their own store::set_bool_pref branch — replaces them all with one derive. Blocked by configurable PoC.","status":"open","priority":3,"issue_type":"task","owner":"me@cooperm.com","created_at":"2026-05-25T02:42:49Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T02:42:49Z","dependencies":[{"issue_id":"nixmac-5nc","depends_on_id":"nixmac-8ka","type":"blocks","created_at":"2026-05-24T19:43:10Z","created_by":"Cooper Maruyama","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"nixmac-2rr","title":"Migrate ModelPrefs (provider+model selections) to Configurable","description":"Replace evolve_provider, evolve_model, summary_provider, summary_model in UiPrefs with a ModelPrefs Configurable struct. Lives near AI orchestration code. Blocked by configurable PoC.","status":"open","priority":3,"issue_type":"task","owner":"me@cooperm.com","created_at":"2026-05-25T02:42:45Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T02:42:45Z","dependencies":[{"issue_id":"nixmac-2rr","depends_on_id":"nixmac-8ka","type":"blocks","created_at":"2026-05-24T19:43:09Z","created_by":"Cooper Maruyama","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"nixmac-e53","title":"Full UiPrefs → Configurable migration (umbrella)","description":"Once the PoC lands, dissolve the UiPrefs / UiPrefsUpdate god-blob in apps/native/src-tauri/src/shared_types/prefs.rs into ~6 domain-specific Configurable structs that live next to the code that uses them. Each sub-issue migrates one category and deletes the corresponding store::get_*/set_* helpers + ui_prefs.rs branches.\n\nEnd state: ui_prefs.rs commands shrink to ~10 lines (delegate to the registry). UiPrefs / UiPrefsUpdate structs are deleted. Adding a new knob = one struct field.","acceptance_criteria":"All sub-issues closed; UiPrefs/UiPrefsUpdate removed; ui_get_prefs/ui_set_prefs reduced to registry walkthrough; no per-field store::get_/set_ helpers remain except for genuinely non-trivial cases (e.g. keychain-backed api keys); apps/native/src/ipc/types.ts still resolves cleanly via specta","status":"open","priority":3,"issue_type":"feature","owner":"me@cooperm.com","created_at":"2026-05-25T02:42:33Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T02:42:33Z","dependencies":[{"issue_id":"nixmac-e53","depends_on_id":"nixmac-27g","type":"blocks","created_at":"2026-05-24T19:43:19Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-2rr","type":"blocks","created_at":"2026-05-24T19:43:14Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-2tt","type":"blocks","created_at":"2026-05-24T19:43:17Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-5nc","type":"blocks","created_at":"2026-05-24T19:43:15Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-elj","type":"blocks","created_at":"2026-05-24T19:43:18Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-orl","type":"blocks","created_at":"2026-05-24T19:43:16Z","created_by":"Cooper Maruyama","metadata":"{}"}],"dependency_count":6,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"nixmac-93p","title":"Auto-generated dev settings UI via Configurable registry","description":"Once all UiPrefs categories are migrated, add a Tauri command dev_configs_list() that walks the inventory registry and returns {struct_name, fields[{name, type, default, range, current_value}]} for every registered Configurable. Frontend renders a ConfigField\u003cT\u003e component per type (number/bool/string/enum). Adding a new struct = new section auto-appears. Future work after full migration.","status":"closed","priority":4,"issue_type":"feature","owner":"me@cooperm.com","created_at":"2026-05-25T02:43:03Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T05:12:22Z","closed_at":"2026-05-25T05:12:22Z","close_reason":"Shipped in f557789d. Inventory registry + rich schema + AutoConfigField. Adding a Configurable field auto-appears in Developer \u003e Tuning.","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"nixmac-e53","title":"Full UiPrefs → Configurable migration (umbrella)","description":"Once the PoC lands, dissolve the UiPrefs / UiPrefsUpdate god-blob in apps/native/src-tauri/src/shared_types/prefs.rs into ~6 domain-specific Configurable structs that live next to the code that uses them. Each sub-issue migrates one category and deletes the corresponding store::get_*/set_* helpers + ui_prefs.rs branches.\n\nEnd state: ui_prefs.rs commands shrink to ~10 lines (delegate to the registry). UiPrefs / UiPrefsUpdate structs are deleted. Adding a new knob = one struct field.","acceptance_criteria":"All sub-issues closed; UiPrefs/UiPrefsUpdate removed; ui_get_prefs/ui_set_prefs reduced to registry walkthrough; no per-field store::get_/set_ helpers remain except for genuinely non-trivial cases (e.g. keychain-backed api keys); apps/native/src/ipc/types.ts still resolves cleanly via specta","status":"open","priority":3,"issue_type":"feature","owner":"me@cooperm.com","created_at":"2026-05-25T02:42:33Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T02:42:33Z","dependencies":[{"issue_id":"nixmac-e53","depends_on_id":"nixmac-27g","type":"blocks","created_at":"2026-05-24T19:43:19Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-2rr","type":"blocks","created_at":"2026-05-24T19:43:14Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-2tt","type":"blocks","created_at":"2026-05-24T19:43:17Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-5nc","type":"blocks","created_at":"2026-05-24T19:43:15Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-elj","type":"blocks","created_at":"2026-05-24T19:43:18Z","created_by":"Cooper Maruyama","metadata":"{}"},{"issue_id":"nixmac-e53","depends_on_id":"nixmac-orl","type":"blocks","created_at":"2026-05-24T19:43:16Z","created_by":"Cooper Maruyama","metadata":"{}"}],"dependency_count":6,"dependent_count":1,"comment_count":0} +{"_type":"issue","id":"nixmac-93p","title":"Auto-generated dev settings UI via Configurable registry","description":"Once all UiPrefs categories are migrated, add a Tauri command dev_configs_list() that walks the inventory registry and returns {struct_name, fields[{name, type, default, range, current_value}]} for every registered Configurable. Frontend renders a ConfigField\u003cT\u003e component per type (number/bool/string/enum). Adding a new struct = new section auto-appears. Future work after full migration.","status":"open","priority":4,"issue_type":"feature","owner":"me@cooperm.com","created_at":"2026-05-25T02:43:03Z","created_by":"Cooper Maruyama","updated_at":"2026-05-25T02:43:03Z","dependencies":[{"issue_id":"nixmac-93p","depends_on_id":"nixmac-e53","type":"blocks","created_at":"2026-05-24T19:43:20Z","created_by":"Cooper Maruyama","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} diff --git a/apps/native/src/components/widget/summaries/monaco-theme.ts b/apps/native/src/components/widget/summaries/monaco-theme.ts index 2360031ff..8bd1938c9 100644 --- a/apps/native/src/components/widget/summaries/monaco-theme.ts +++ b/apps/native/src/components/widget/summaries/monaco-theme.ts @@ -1,80 +1,128 @@ -export const NIXMAC_THEME = "nixmac-dark"; +import mintedThemeJson from "@/themes/minted.json"; +import type { editor } from "monaco-editor"; -export const NIXMAC_THEME_DATA = { - base: "vs-dark" as const, +export const NIXMAC_THEME = "apathy-minted"; + +type VscodeTokenColor = { + scope?: string | string[]; + settings?: { + foreground?: string; + fontStyle?: string; + }; +}; + +type VscodeTheme = { + colors?: Record; + tokenColors?: VscodeTokenColor[]; +}; + +const mintedTheme = mintedThemeJson as VscodeTheme; + +function tokenColor(color: string | undefined): string | undefined { + if (!color) return undefined; + const normalized = color.trim().replace(/^#/, ""); + return normalized.length >= 6 ? normalized.slice(0, 6) : undefined; +} + +function scopes(scope: string | string[] | undefined): string[] { + if (!scope) return []; + return (Array.isArray(scope) ? scope : scope.split(",")) + .map((part) => part.trim()) + .filter((part) => part.length > 0 && !/\s/.test(part)); +} + +const tokenRules: editor.ITokenThemeRule[] = (mintedTheme.tokenColors ?? []).flatMap((entry) => { + const foreground = tokenColor(entry.settings?.foreground); + const fontStyle = entry.settings?.fontStyle; + + if (!foreground && !fontStyle) return []; + + return scopes(entry.scope).map((token) => ({ + token, + ...(foreground ? { foreground } : {}), + ...(fontStyle ? { fontStyle } : {}), + })); +}); + +const mintedForeground = tokenColor(mintedTheme.colors?.["editor.foreground"]) ?? "e1e2e5"; +const mintedComment = "282948"; +const mintedString = "b7ce99"; +const mintedKeyword = "4a5585"; +const mintedNumber = "7bc2df"; +const mintedFunction = "99d3b9"; +const mintedType = "998fe1"; +const mintedWarning = "fcb086"; +const mintedDeleted = "f09fad"; +const mintedAdded = "9ff0e3"; + +export const NIXMAC_THEME_DATA: editor.IStandaloneThemeData = { + base: "vs-dark", inherit: true, rules: [ - { token: "", foreground: "fafafa" }, - { token: "comment", foreground: "a3a3a3", fontStyle: "italic" }, - { token: "string", foreground: "23d0e7" }, - { token: "string.escape", foreground: "f7b23b" }, - { token: "keyword", foreground: "55a0f6" }, - { token: "keyword.control", foreground: "55a0f6" }, - { token: "keyword.operator", foreground: "a3a3a3" }, - { token: "constant", foreground: "f7b23b" }, - { token: "constant.language", foreground: "f7b23b" }, - { token: "constant.numeric", foreground: "f7b23b" }, - { token: "number", foreground: "f7b23b" }, - { token: "type", foreground: "55a0f6" }, - { token: "type.identifier", foreground: "55a0f6" }, - { token: "entity.name.function", foreground: "23d0e7" }, - { token: "entity.name.type", foreground: "55a0f6" }, - { token: "entity.name.tag", foreground: "f4587c" }, - { token: "support.function", foreground: "23d0e7" }, - { token: "variable.parameter", foreground: "f7b23b" }, - { token: "invalid", foreground: "f4587c" }, - { token: "addition.diff", foreground: "23d0e7" }, - { token: "deletion.diff", foreground: "f4587c" }, - { token: "info.diff", foreground: "a3a3a3" }, - // JSON-specific (vs-dark has more specific rules that override our generic "string"/"keyword"; explicit suffix wins) - { token: "string.key.json", foreground: "55a0f6" }, - { token: "string.value.json", foreground: "23d0e7" }, - { token: "keyword.json", foreground: "f7b23b" }, - { token: "number.json", foreground: "f7b23b" }, - // YAML-specific - { token: "string.yaml", foreground: "23d0e7" }, - { token: "comment.yaml", foreground: "a3a3a3", fontStyle: "italic" }, - { token: "keyword.yaml", foreground: "55a0f6" }, - { token: "number.yaml", foreground: "f7b23b" }, - { token: "type.yaml", foreground: "55a0f6" }, - { token: "tag.yaml", foreground: "f4587c" }, - // TOML-specific - { token: "string.toml", foreground: "23d0e7" }, - { token: "comment.toml", foreground: "a3a3a3", fontStyle: "italic" }, - { token: "keyword.toml", foreground: "55a0f6" }, - { token: "number.toml", foreground: "f7b23b" }, - { token: "type.toml", foreground: "55a0f6" }, - // Shell-specific - { token: "string.shell", foreground: "23d0e7" }, - { token: "comment.shell", foreground: "a3a3a3", fontStyle: "italic" }, - { token: "keyword.shell", foreground: "55a0f6" }, - { token: "number.shell", foreground: "f7b23b" }, - { token: "variable.shell", foreground: "f7b23b" }, - { token: "predefined.shell", foreground: "23d0e7" }, + { token: "", foreground: mintedForeground }, + ...tokenRules, + // Monaco's built-in tokenizers use language-specific suffixes that can outrank + // the generic TextMate scopes from the Minted theme. Keep these explicit so + // bundled JSON/YAML/TOML/Shell views still inherit the Minted palette. + { token: "comment", foreground: mintedComment, fontStyle: "italic" }, + { token: "string", foreground: mintedString }, + { token: "string.escape", foreground: mintedString }, + { token: "keyword", foreground: mintedKeyword }, + { token: "keyword.control", foreground: mintedKeyword }, + { token: "keyword.operator", foreground: mintedForeground }, + { token: "constant", foreground: mintedNumber }, + { token: "constant.language", foreground: mintedNumber }, + { token: "constant.numeric", foreground: mintedNumber }, + { token: "number", foreground: mintedNumber }, + { token: "type", foreground: mintedType }, + { token: "type.identifier", foreground: mintedType }, + { token: "entity.name.function", foreground: mintedFunction }, + { token: "entity.name.type", foreground: mintedType }, + { token: "support.function", foreground: mintedFunction }, + { token: "variable.parameter", foreground: mintedWarning }, + { token: "invalid", foreground: mintedDeleted }, + { token: "addition.diff", foreground: mintedAdded }, + { token: "deletion.diff", foreground: mintedDeleted }, + { token: "info.diff", foreground: mintedForeground }, + { token: "string.key.json", foreground: mintedKeyword }, + { token: "string.value.json", foreground: mintedString }, + { token: "keyword.json", foreground: mintedNumber }, + { token: "number.json", foreground: mintedNumber }, + { token: "string.yaml", foreground: mintedString }, + { token: "comment.yaml", foreground: mintedComment, fontStyle: "italic" }, + { token: "keyword.yaml", foreground: mintedKeyword }, + { token: "number.yaml", foreground: mintedNumber }, + { token: "type.yaml", foreground: mintedType }, + { token: "tag.yaml", foreground: mintedDeleted }, + { token: "string.toml", foreground: mintedString }, + { token: "comment.toml", foreground: mintedComment, fontStyle: "italic" }, + { token: "keyword.toml", foreground: mintedKeyword }, + { token: "number.toml", foreground: mintedNumber }, + { token: "type.toml", foreground: mintedType }, + { token: "string.shell", foreground: mintedString }, + { token: "comment.shell", foreground: mintedComment, fontStyle: "italic" }, + { token: "keyword.shell", foreground: mintedKeyword }, + { token: "number.shell", foreground: mintedNumber }, + { token: "variable.shell", foreground: mintedWarning }, + { token: "predefined.shell", foreground: mintedFunction }, ], colors: { - "editor.background": "#0a0a0a", - "editor.foreground": "#fafafa", - "editorLineNumber.foreground": "#404040", - "editorLineNumber.activeForeground": "#a3a3a3", - "editor.selectionBackground": "#23d0e730", - "editor.inactiveSelectionBackground": "#23d0e718", - "editor.lineHighlightBackground": "#141414", - "editorCursor.foreground": "#23d0e7", - "editorGutter.background": "#0a0a0a", - "editorGutter.addedBackground": "#23d0e740", - "editorGutter.deletedBackground": "#f4587c40", - "editorGutter.modifiedBackground": "#f7b23b40", - "scrollbarSlider.background": "#26262680", - "scrollbarSlider.hoverBackground": "#404040aa", - "scrollbarSlider.activeBackground": "#555555aa", - "editorWidget.background": "#141414", - "editorWidget.border": "#262626", - "diffEditor.insertedLineBackground": "#23d0e715", - "diffEditor.removedLineBackground": "#f4587c15", - "diffEditor.insertedTextBackground": "#00000000", - "diffEditor.removedTextBackground": "#00000000", - "diffEditorGutter.insertedLineBackground": "#00000000", - "diffEditorGutter.removedLineBackground": "#00000000", + ...(mintedTheme.colors ?? {}), + "editor.background": "#090910", + "editor.foreground": "#e1e2e5", + "editorGutter.background": "#090910", + "editor.selectionBackground": "#191a25fa", + "editor.inactiveSelectionBackground": "#0c002ecf", + "editor.lineHighlightBackground": "#1b162994", + "editorCursor.foreground": "#da4c51", + "scrollbarSlider.background": "#1b1b364d", + "scrollbarSlider.hoverBackground": "#383d51aa", + "scrollbarSlider.activeBackground": "#4a4854cc", + "diffEditor.insertedLineBackground": "#010e0daa", + "diffEditor.removedLineBackground": "#0f0404ff", + "diffEditor.insertedTextBackground": "#112b2a42", + "diffEditor.removedTextBackground": "#20030cbb", + "diffEditorGutter.insertedLineBackground": "#011211e2", + "diffEditorGutter.removedLineBackground": "#2d0a12b4", }, }; diff --git a/apps/native/src/index.css b/apps/native/src/index.css index 1ce1e50ba..822cbac64 100644 --- a/apps/native/src/index.css +++ b/apps/native/src/index.css @@ -4,57 +4,59 @@ @layer base { :root { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - --ring: 0 0% 3.9%; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; - --radius: 0.5rem; + /* Minted light tokens, adapted from apathy-theme for Tailwind v3 HSL variables. */ + --background: 165 40% 98%; + --foreground: 230 12% 18%; + --card: 165 35% 97%; + --card-foreground: 230 12% 18%; + --popover: 165 35% 97%; + --popover-foreground: 230 12% 18%; + --primary: 156 68% 69%; + --primary-foreground: 240 17% 7%; + --secondary: 165 20% 93%; + --secondary-foreground: 230 12% 25%; + --muted: 165 20% 93%; + --muted-foreground: 230 9% 50%; + --accent: 85 53% 72%; + --accent-foreground: 230 12% 18%; + --destructive: 337 80% 44%; + --destructive-foreground: 165 35% 98%; + --border: 165 20% 88%; + --input: 165 20% 88%; + --ring: 156 68% 69%; + --chart-1: 156 68% 69%; + --chart-2: 85 53% 72%; + --chart-3: 191 60% 50%; + --chart-4: 21 100% 77%; + --chart-5: 247 58% 72%; + --radius: 0.625rem; } .dark { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - --ring: 0 0% 83.1%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; + /* Minted dark tokens from apathy-theme, used by default via index.html. */ + --background: 240 17% 7%; + --foreground: 225 7% 89%; + --card: 234 22% 9%; + --card-foreground: 225 7% 89%; + --popover: 245 30% 8%; + --popover-foreground: 225 7% 89%; + --primary: 156 68% 69%; + --primary-foreground: 240 17% 7%; + --secondary: 246 12% 16%; + --secondary-foreground: 225 7% 89%; + --muted: 228 18% 27%; + --muted-foreground: 230 13% 52%; + --accent: 85 53% 72%; + --accent-foreground: 240 17% 7%; + --destructive: 337 80% 44%; + --destructive-foreground: 225 7% 89%; + --border: 262 8% 28%; + --input: 250 8% 31%; + --ring: 156 68% 69%; + --chart-1: 156 68% 69%; + --chart-2: 85 53% 72%; + --chart-3: 191 60% 50%; + --chart-4: 21 100% 77%; + --chart-5: 247 58% 72%; } } @@ -74,27 +76,27 @@ @apply text-foreground; } - /* Monaco diff text colors (emerald-400 / red-400) */ + /* Monaco diff text colors (Minted added / deleted) */ .nixmac-line-added, .nixmac-line-added * { - color: #34d399 !important; + color: #9ff0e3 !important; } /* Deleted lines in inline diff are rendered as view zones, not model lines */ .monaco-editor .view-zones .view-line, .monaco-editor .view-zones .view-line * { - color: #f87171 !important; + color: #f09fad !important; } /* Diff gutter +/- indicator colors (match line text) */ .monaco-diff-editor .codicon-diff-insert, .monaco-diff-editor .margin .insert-sign { - background: #34d39930; - color: #34d399 !important; + background: #9ff0e330; + color: #9ff0e3 !important; } .monaco-diff-editor .codicon-diff-remove, .monaco-diff-editor .margin .delete-sign { - background: #f8717130; - color: #f87171 !important; + background: #f09fad30; + color: #f09fad !important; } /* Hide the bleeding delete indicator inside the margin overlay */ .monaco-editor .margin-view-overlays .cldr.delete-sign.codicon-diff-remove, @@ -102,14 +104,20 @@ display: none !important; } - /* Monaco scrollbar matching nixmac style */ + /* Give Monaco diff diagnostics and the right edge a little breathing room. */ + [data-testid="monaco-diff-view"] { + box-sizing: border-box; + padding-right: 2px; + } + + /* Monaco scrollbar matching Minted style */ .monaco-scrollable-element > .scrollbar.vertical > .slider { - background: hsl(173 80% 75% / 0.6) !important; + background: hsl(var(--primary) / 0.6) !important; border-radius: 4px !important; } .monaco-scrollable-element > .scrollbar.vertical > .slider:hover, .monaco-scrollable-element > .scrollbar.vertical.active > .slider { - background: hsl(173 80% 75%) !important; + background: hsl(var(--primary)) !important; } /* Scrollbar styling */ @@ -122,11 +130,11 @@ border-radius: 4px; } ::-webkit-scrollbar-thumb { - background-color: hsl(173 80% 75% / 0.6); + background-color: hsl(var(--primary) / 0.6); border-radius: 4px; width: 2px; } ::-webkit-scrollbar-thumb:hover { - background-color: hsl(173 80% 75%); + background-color: hsl(var(--primary)); } } diff --git a/apps/native/src/themes/minted.json b/apps/native/src/themes/minted.json new file mode 100644 index 000000000..27e4a04f0 --- /dev/null +++ b/apps/native/src/themes/minted.json @@ -0,0 +1,1472 @@ +{ + "name": "apathy /// minted", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#090910ff", + "editor.foreground": "#545c7ee6", + "editor.hoverHighlightBackground": "#19163154", + "editor.selectionHighlightBorder": "#292931ff", + "list.highlightForeground": "#96a5b6ff", + "editor.selectionBackground": "#191a25fa", + "editor.selectionHighlightBackground": "#23223680", + "editor.inactiveSelectionBackground": "#0c002ecf", + "editor.findMatchBackground": "#343d5daa", + "editor.findMatchHighlightBackground": "#23223680", + "editor.findRangeHighlightBackground": "#23223680", + "editorGutter.modifiedBackground": "#8b7940ff", + "editorGutter.addedBackground": "#468a74cf", + "editorGutter.deletedBackground": "#a36673ff", + "quickInput.background": "#100f1cd6", + "quickInput.foreground": "#7b8ab1b5", + "quickInputList.focusBackground": "#3a3f541a", + "quickInputList.focusForeground": "#fcb086ff", + "list.hoverBackground": "#0c0c13ff", + "list.hoverForeground": "#767b95c2", + "quickInput.list.focusBackground": "#3a3f541a", + "activityBar.background": "#07070eff", + "activityBar.foreground": "#656a83c2", + "activityBar.inactiveForeground": "#272a40c2", + "activityBar.border": "#0a0a0cff", + "activityBarBadge.background": "#0f0f1280", + "activityBarBadge.foreground": "#bfde93ff", + "sideBar.background": "#0c0c13ff", + "sideBar.foreground": "#515b76c9", + "sideBar.border": "#52559e14", + "sideBarSectionHeader.background": "#0c0c13ff", + "sideBarSectionHeader.foreground": "#767b95c2", + "panel.border": "#52559e14", + "sash.hoverBorder": "#4b3f8166", + "editorGroup.border": "#14151ee6", + "editor.compositionBorder": "#4b3f8166", + "editorWidget.background": "#100f1cd6", + "editorWidget.border": "#52559e14", + "editorWidget.foreground": "#7b8ab1b5", + "input.border": "#14151ee6", + "panelInput.border": "#14151ee6", + "diffEditorGutter.insertedLineBackground": "#011211e2", + "diffEditorGutter.removedLineBackground": "#2d0a12b4", + "panel.background": "#0a0a11ff", + "panelTitle.activeForeground": "#767b95c2", + "panelTitle.inactiveForeground": "#767b95c2", + "panelTitle.activeBorder": "#96a5b6ff", + "titleBar.activeBackground": "#0c0c13ff", + "titleBar.activeForeground": "#767b95c2", + "titleBar.inactiveBackground": "#0c0c13ff", + "titleBar.inactiveForeground": "#767b95c2", + "statusBar.background": "#0c0c13ff", + "statusBar.foreground": "#767b95c2", + "statusBar.border": "#52559e14", + "statusBar.noFolderBackground": "#0c0c13ff", + "statusBar.noFolderForeground": "#767b95c2", + "tab.activeBackground": "#0a0a15ff", + "tab.activeForeground": "#767b95c2", + "tab.activeBorder": "#52559e14", + "tab.activeBorderTop": "#96a5b6ff", + "tab.inactiveBackground": "#0c0c13ff", + "tab.inactiveForeground": "#767b95c2", + "tab.hoverBackground": "#0c0c13ff", + "tab.hoverForeground": "#767b95c2", + "tab.unfocusedActiveBackground": "#0c0c13ff", + "tab.unfocusedActiveForeground": "#767b95c2", + "tab.lastPinnedBorder": "#fcb086ff", + "editorGroupHeader.tabsBackground": "#0f0f12ff", + "editorGroupHeader.tabsBorder": "#14151ee6", + "editorGroupHeader.noTabsBackground": "#100f1cd6", + "editorGroupHeader.border": "#52559e14", + "list.activeSelectionBackground": "#0c0c13ff", + "list.activeSelectionForeground": "#767b95c2", + "list.inactiveSelectionBackground": "#0c0c13ff", + "list.inactiveSelectionForeground": "#767b95c2", + "list.focusBackground": "#2a2441ff", + "list.focusForeground": "#767b95c2", + "input.background": "#100f1cd6", + "input.foreground": "#a8adc9c2", + "input.placeholderForeground": "#555972c2", + "button.background": "#24232df8", + "button.foreground": "#b1b3b8ff", + "button.border": "#3d374978", + "button.secondaryBorder": "#4a4854f8", + "button.hoverBackground": "#4a4854f8", + "button.secondaryBackground": "#0c0c131a", + "button.secondaryForeground": "#e8aadbe6", + "button.secondaryHoverBackground": "#0c0c13ff", + "dropdown.background": "#0c0c13ff", + "dropdown.foreground": "#767b95c2", + "dropdown.border": "#6c7a8aff", + "dropdown.listBackground": "#0c0c13ff", + "badge.background": "#0c0c13ff", + "badge.foreground": "#767b95c2", + "scrollbar.shadow": "#0c0c13ff", + "scrollbarSlider.background": "#1b1b364d", + "scrollbarSlider.hoverBackground": "#0c0c13ff", + "scrollbarSlider.activeBackground": "#0c0c13ff", + "minimap.background": "#0c0c13ff", + "minimap.selectionHighlight": "#767b95c2", + "minimap.errorHighlight": "#cb195fff", + "minimap.warningHighlight": "#fcb086ff", + "minimap.findMatchHighlight": "#4f4a76d3", + "breadcrumb.background": "#0c0c13ff", + "breadcrumb.foreground": "#767b95c2", + "breadcrumb.focusForeground": "#767b95c2", + "breadcrumb.activeSelectionForeground": "#767b95c2", + "terminal.background": "#07070dff", + "terminal.foreground": "#666b95c2", + "terminal.border": "#12131cff", + "terminalCursor.foreground": "#767b95c2", + "terminal.selectionBackground": "#1f1f27ff", + "terminal.ansiBlack": "#383d51ff", + "terminal.ansiRed": "#cb195fff", + "terminal.ansiGreen": "#99d3b9ff", + "terminal.ansiYellow": "#fcb086ff", + "terminal.ansiBlue": "#33b3ccff", + "terminal.ansiMagenta": "#998ee0cf", + "terminal.ansiCyan": "#b4e7dfff", + "terminal.ansiWhite": "#e1e3e5ff", + "terminal.ansiBrightBlack": "#96a5b6ff", + "terminal.ansiBrightRed": "#cb195fff", + "terminal.ansiBrightGreen": "#99d3b9ff", + "terminal.ansiBrightYellow": "#fcb086ff", + "terminal.ansiBrightBlue": "#33b3ccff", + "terminal.ansiBrightMagenta": "#998ee0cf", + "terminal.ansiBrightCyan": "#b4e7dfff", + "terminal.ansiBrightWhite": "#b1b1bffa", + "notifications.background": "#0c0c13ff", + "notifications.foreground": "#767b95c2", + "notifications.border": "#96a5b6ff", + "peekViewEditor.background": "#0c0c13ff", + "peekView.border": "#96a5b6ff", + "peekViewResult.background": "#0c0c13ff", + "peekViewResult.selectionBackground": "#0c0c13ff", + "peekViewTitle.background": "#0c0c13ff", + "peekViewTitleLabel.foreground": "#767b95c2", + "diffEditor.insertedTextBackground": "#112b2a42", + "diffEditor.removedTextBackground": "#20030cbb", + "diffEditor.insertedLineBackground": "#010e0daa", + "diffEditor.removedLineBackground": "#0f0404ff", + "diffEditor.diagonalFill": "#fecf0dff", + "editorInlayHint.insertedTextBackground": "#020403ff", + "editorInlayHint.removedTextBackground": "#090505ff", + "editorInlayHint.insertedLineBackground": "#020403ff", + "editorInlayHint.removedLineBackground": "#090505ff", + "editorInlayHint.diagonalFill": "#fecf0dff", + "merge.currentHeaderBackground": "#080820ff", + "merge.currentContentBackground": "#05051cff", + "merge.incomingHeaderBackground": "#080c1fff", + "merge.incomingContentBackground": "#05081bff", + "merge.commonHeaderBackground": "#10081fff", + "merge.commonContentBackground": "#0c051bff", + "editorSuggestWidget.background": "#10101bff", + "editorIndentGuide.background1": "#25183b59", + "editorIndentGuide.activeBackground1": "#6b40b859", + "editorWhitespace.foreground": "#272636ff", + "editorRuler.foreground": "#25183b59", + "editorLineNumber.foreground": "#434249cc", + "editorLineNumber.activeForeground": "#7d7196ff", + "editorHoverWidget.background": "#13141bbd", + "editorHoverWidget.border": "#131a24ff", + "editorHoverWidget.foreground": "#d4edffa6", + "sideBarTitle.background": "#0e0e18b3", + "sideBarTitle.foreground": "#e1e3e580", + "tab.border": "#212131ff", + "button.separator": "#584b7036", + "tree.indentGuidesStroke": "#38377299", + "composerPane.background": "#12151cff", + "gitDecoration.addedResourceForeground": "#86cebeff", + "gitDecoration.modifiedResourceForeground": "#7786b7ff", + "gitDecoration.deletedResourceForeground": "#f09fadff", + "gitDecoration.untrackedResourceForeground": "#82809dff", + "gitDecoration.ignoredResourceForeground": "#454d61c9", + "gitDecoration.conflictingResourceForeground": "#f09fadff", + "gitDecoration.renamedResourceForeground": "#9fa0f0ff", + "gitDecoration.stageModifiedResourceForeground": "#f0de9feb", + "gitDecoration.stageDeletedResourceForeground": "#704752f5", + "gitDecoration.submoduleResourceForeground": "#8db9e2ff", + "editorCursor.foreground": "#da4c51ff", + "window.activeBorder": "#183856ff", + "window.inactiveBorder": "#14151ee6", + "icon.foreground": "#d7f7f2ff", + "focusBorder": "#a099ae14", + "contrastBorder": "#a099ae14", + "menu.background": "#14121dff", + "menu.foreground": "#96a5b6ff", + "menu.selectionBackground": "#2a2441ff", + "menu.selectionForeground": "#e1e3e5ff", + "menu.separatorBackground": "#45414cff", + "editorSuggestWidget.border": "#45414cff", + "editorSuggestWidget.foreground": "#e1e3e5ff", + "editorSuggestWidget.selectedBackground": "#2a2441ff", + "progressBar.background": "#bfde93ff", + "debugConsole.infoForeground": "#78dde9ff", + "debugConsole.warningForeground": "#ffcb6cff", + "debugConsole.errorForeground": "#ff6261ff", + "debugConsole.sourceForeground": "#e1e3e5ff", + "textLink.foreground": "#99d3b9ff", + "textLink.activeForeground": "#99d3b9ff", + "textPreformat.background": "#050e0cf0", + "textPreformat.foreground": "#90e3bccf", + "textSeparator.foreground": "#45414c80", + "editorError.background": "#52000045", + "list.errorForeground": "#a94f4fff", + "peekViewEditor.matchHighlightBackground": "#2d3143f3", + "peekViewResult.matchHighlightBackground": "#2d3143f3", + "peekViewTitleDescription.foreground": "#676597ab", + "editorError.foreground": "#d96a92ff", + "editorWarning.foreground": "#ebd8bee8", + "editorInfo.foreground": "#93a7e6f0", + "terminal.dropBackground": "#10101bff", + "foreground": "#7b8ab1b5", + "editorPane.background": "#0e0e15ff", + "editor.lineHighlightBackground": "#1b162994", + "editor.wordHighlightBackground": "#20275333", + "editor.wordHighlightStrongBackground": "#564f66ab", + "statusBar.debuggingBackground": "#41ffbcf2", + "statusBar.debuggingForeground": "#5b0092ff", + "statusBar.debuggingBorder": "#4ce4b4f2", + "tree.inactiveIndentGuidesStroke": "#12131dde", + "settings.headerForeground": "#d1deeacc", + "settings.textInputBackground": "#121217ff", + "settings.textInputForeground": "#96a5b6ff", + "settings.textInputBorder": "#1c1c25ff", + "pullRequests.draft": "#331f57ff", + "chat.requestBackground": "#04041bff", + "minimapGutter.addedBackground": "#264b3fff", + "gitlens.decorations.addedForegroundColor": "#9ff0e3ea", + "diffEditor.insertedTextBorder": "#142f2a22", + "diffEditor.removedTextBorder": "#300e1622" + }, + "tokenColors": [ + { + "name": "source", + "scope": [ + "source" + ], + "settings": { + "foreground": "#4e5c7ae6" + } + }, + { + "name": "text", + "scope": [ + "text" + ], + "settings": { + "foreground": "#4e5c7ae6" + } + }, + { + "name": "comment", + "scope": [ + "comment" + ], + "settings": { + "foreground": "#282948de", + "fontStyle": "italic" + } + }, + { + "name": "punctuation.definition.comment", + "scope": [ + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#282948de", + "fontStyle": "italic" + } + }, + { + "name": "string", + "scope": [ + "string" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "string.regexp", + "scope": [ + "string.regexp" + ], + "settings": { + "foreground": "#fcb086ff", + "fontStyle": "italic" + } + }, + { + "name": "constant.character.escape", + "scope": [ + "constant.character.escape" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "constant.other.placeholder", + "scope": [ + "constant.other.placeholder" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "separator.border", + "scope": [ + "separator.border" + ], + "settings": { + "foreground": "#767b951a" + } + }, + { + "name": "focusBorder", + "scope": [ + "focusBorder" + ], + "settings": { + "foreground": "#4b3f8166" + } + }, + { + "name": "gauge.border", + "scope": [ + "gauge.border" + ], + "settings": { + "foreground": "#52559e14" + } + }, + { + "name": "sash.hoverBorder", + "scope": [ + "sash.hoverBorder" + ], + "settings": { + "foreground": "#4b3f8166" + } + }, + { + "name": "editorGroup.border", + "scope": [ + "editorGroup.border" + ], + "settings": { + "foreground": "#14151ee6" + } + }, + { + "name": "punctuation.definition.template-expression", + "scope": [ + "punctuation.definition.template-expression" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "meta.template.expression", + "scope": [ + "meta.template.expression" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "constant", + "scope": [ + "constant" + ], + "settings": { + "foreground": "#767b95c2" + } + }, + { + "name": "constant.numeric", + "scope": [ + "constant.numeric" + ], + "settings": { + "foreground": "#7bc2dfff" + } + }, + { + "name": "constant.language", + "scope": [ + "constant.language" + ], + "settings": { + "foreground": "#7bc2dfff" + } + }, + { + "name": "quickInput.background", + "scope": [ + "quickInput.background" + ], + "settings": { + "foreground": "#100f1cd6" + } + }, + { + "name": "quickInput.foreground", + "scope": [ + "quickInput.foreground" + ], + "settings": { + "foreground": "#7b8ab1b5" + } + }, + { + "name": "quickInput.focusBackground", + "scope": [ + "quickInput.focusBackground" + ], + "settings": { + "foreground": "#100f1cd6" + } + }, + { + "name": "quickInput.focusForeground", + "scope": [ + "quickInput.focusForeground" + ], + "settings": { + "foreground": "#7b8ab1b5" + } + }, + { + "name": "quickInputList.background", + "scope": [ + "quickInputList.background" + ], + "settings": { + "foreground": "#100f1cd6" + } + }, + { + "name": "quickInputList.foreground", + "scope": [ + "quickInputList.foreground" + ], + "settings": { + "foreground": "#7b8ab1b5" + } + }, + { + "name": "quickInputList.focusBackground", + "scope": [ + "quickInputList.focusBackground" + ], + "settings": { + "foreground": "#100f1cd6" + } + }, + { + "name": "quickInputList.focusForeground", + "scope": [ + "quickInputList.focusForeground" + ], + "settings": { + "foreground": "#7b8ab1b5" + } + }, + { + "name": "list.hoverBackground", + "scope": [ + "list.hoverBackground" + ], + "settings": { + "foreground": "#3a3f541a" + } + }, + { + "name": "list.hoverForeground", + "scope": [ + "list.hoverForeground" + ], + "settings": { + "foreground": "#7b8ab1b5" + } + }, + { + "name": "keyword", + "scope": [ + "keyword" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "keyword.control", + "scope": [ + "keyword.control" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "keyword.control.conditional", + "scope": [ + "keyword.control.conditional" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "keyword.control.loop", + "scope": [ + "keyword.control.loop" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "keyword.control.flow", + "scope": [ + "keyword.control.flow" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "keyword.control.import", + "scope": [ + "keyword.control.import" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "keyword.control.export", + "scope": [ + "keyword.control.export" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "keyword.directive", + "scope": [ + "keyword.directive" + ], + "settings": { + "foreground": "#cd5cf2ff" + } + }, + { + "name": "keyword.directive.define", + "scope": [ + "keyword.directive.define" + ], + "settings": { + "foreground": "#cd5cf2ff" + } + }, + { + "name": "keyword.operator", + "scope": [ + "keyword.operator" + ], + "settings": { + "foreground": "#adaca2ff" + } + }, + { + "name": "keyword.operator.logical", + "scope": [ + "keyword.operator.logical" + ], + "settings": { + "foreground": "#adaca2ff" + } + }, + { + "name": "keyword.operator.assignment", + "scope": [ + "keyword.operator.assignment" + ], + "settings": { + "foreground": "#adaca2ff" + } + }, + { + "name": "keyword.operator.arithmetic", + "scope": [ + "keyword.operator.arithmetic" + ], + "settings": { + "foreground": "#adaca2ff" + } + }, + { + "name": "keyword.operator.comparison", + "scope": [ + "keyword.operator.comparison" + ], + "settings": { + "foreground": "#adaca2ff" + } + }, + { + "name": "keyword.operator.wordlike", + "scope": [ + "keyword.operator.wordlike" + ], + "settings": { + "foreground": "#adaca2ff" + } + }, + { + "name": "storage", + "scope": [ + "storage" + ], + "settings": { + "foreground": "#6372a1ff" + } + }, + { + "name": "storage.type", + "scope": [ + "storage.type" + ], + "settings": { + "foreground": "#6372a1ff" + } + }, + { + "name": "storage.type.function", + "scope": [ + "storage.type.function" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "storage.type.class", + "scope": [ + "storage.type.class" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "storage.modifier", + "scope": [ + "storage.modifier" + ], + "settings": { + "foreground": "#4a5585ff" + } + }, + { + "name": "storage.type.primitive", + "scope": [ + "storage.type.primitive" + ], + "settings": { + "foreground": "#4f4980ff" + } + }, + { + "name": "variable", + "scope": [ + "variable" + ], + "settings": { + "foreground": "#9599bffa" + } + }, + { + "name": "variable.other", + "scope": [ + "variable.other" + ], + "settings": { + "foreground": "#b1b1bffa" + } + }, + { + "name": "variable.parameter", + "scope": [ + "variable.parameter" + ], + "settings": { + "foreground": "#9599bffa", + "fontStyle": "italic" + } + }, + { + "name": "variable.language", + "scope": [ + "variable.language" + ], + "settings": { + "foreground": "#9599bffa", + "fontStyle": "italic" + } + }, + { + "name": "variable.language.this", + "scope": [ + "variable.language.this" + ], + "settings": { + "foreground": "#9599bffa", + "fontStyle": "italic" + } + }, + { + "name": "variable.language.super", + "scope": [ + "variable.language.super" + ], + "settings": { + "foreground": "#9599bffa", + "fontStyle": "italic" + } + }, + { + "name": "entity.name.function", + "scope": [ + "entity.name.function" + ], + "settings": { + "foreground": "#f2cdcdff" + } + }, + { + "name": "support.function", + "scope": [ + "support.function" + ], + "settings": { + "foreground": "#4f4980ff" + } + }, + { + "name": "meta.function-call.generic", + "scope": [ + "meta.function-call.generic" + ], + "settings": { + "foreground": "#f2cdcdff" + } + }, + { + "name": "entity.name.class", + "scope": [ + "entity.name.class" + ], + "settings": { + "foreground": "#f2cdcdff", + "fontStyle": "bold underline" + } + }, + { + "name": "entity.other.inherited-class", + "scope": [ + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#f2cdcdff", + "fontStyle": "bold underline" + } + }, + { + "name": "support.class", + "scope": [ + "support.class" + ], + "settings": { + "foreground": "#f2cdcdff" + } + }, + { + "name": "entity.name.type", + "scope": [ + "entity.name.type" + ], + "settings": { + "foreground": "#9599cfff" + } + }, + { + "name": "support.type", + "scope": [ + "support.type" + ], + "settings": { + "foreground": "#9599cfff" + } + }, + { + "name": "support.type.builtin", + "scope": [ + "support.type.builtin" + ], + "settings": { + "foreground": "#4f4980ff" + } + }, + { + "name": "entity.name.tag", + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#5c5675ff" + } + }, + { + "name": "support.class.component", + "scope": [ + "support.class.component" + ], + "settings": { + "foreground": "#e1a3d4ff" + } + }, + { + "name": "support.class.component.jsx", + "scope": [ + "support.class.component.jsx" + ], + "settings": { + "foreground": "#e1a3d4ff" + } + }, + { + "name": "entity.other.attribute-name", + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "meta.tag keyword.operator.assignment", + "scope": [ + "meta.tag keyword.operator.assignment" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "meta.tag.attributes", + "scope": [ + "meta.tag.attributes" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "support.type.property-name", + "scope": [ + "support.type.property-name" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "support.type.property-name.css", + "scope": [ + "support.type.property-name.css" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "meta.object-literal.key", + "scope": [ + "meta.object-literal.key" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "variable.other.property", + "scope": [ + "variable.other.property" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "list.hoverBackground", + "scope": [ + "list.hoverBackground" + ], + "settings": { + "foreground": "#3a3f541a" + } + }, + { + "name": "list.hoverForeground", + "scope": [ + "list.hoverForeground" + ], + "settings": { + "foreground": "#7b8ab1b5" + } + }, + { + "name": "support.type.property-name.css", + "scope": [ + "support.type.property-name.css" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "meta.property-name", + "scope": [ + "meta.property-name" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "support.constant.property-value", + "scope": [ + "support.constant.property-value" + ], + "settings": { + "foreground": "#7bc2dfff" + } + }, + { + "name": "constant.other.color", + "scope": [ + "constant.other.color" + ], + "settings": { + "foreground": "#7bc2dfff" + } + }, + { + "name": "meta.property-value", + "scope": [ + "meta.property-value" + ], + "settings": { + "foreground": "#7bc2dfff" + } + }, + { + "name": "meta.selector", + "scope": [ + "meta.selector" + ], + "settings": { + "foreground": "#9599cfff" + } + }, + { + "name": "entity.name.tag.css", + "scope": [ + "entity.name.tag.css" + ], + "settings": { + "foreground": "#9599cfff" + } + }, + { + "name": "entity.other.attribute-name.class.css", + "scope": [ + "entity.other.attribute-name.class.css" + ], + "settings": { + "foreground": "#9599cfff" + } + }, + { + "name": "entity.other.attribute-name.id.css", + "scope": [ + "entity.other.attribute-name.id.css" + ], + "settings": { + "foreground": "#9599cfff" + } + }, + { + "name": "punctuation", + "scope": [ + "punctuation" + ], + "settings": { + "foreground": "#767b95c2" + } + }, + { + "name": "punctuation.definition", + "scope": [ + "punctuation.definition" + ], + "settings": { + "foreground": "#3c394bd1" + } + }, + { + "name": "punctuation.separator", + "scope": [ + "punctuation.separator" + ], + "settings": { + "foreground": "#383d51ff" + } + }, + { + "name": "punctuation.terminator", + "scope": [ + "punctuation.terminator" + ], + "settings": { + "foreground": "#383d51ff" + } + }, + { + "name": "punctuation.accessor", + "scope": [ + "punctuation.accessor" + ], + "settings": { + "foreground": "#383d51ff" + } + }, + { + "name": "punctuation.definition.tag", + "scope": [ + "punctuation.definition.tag" + ], + "settings": { + "foreground": "#3c394bd1" + } + }, + { + "name": "meta.brace", + "scope": [ + "meta.brace" + ], + "settings": { + "foreground": "#383d51ff" + } + }, + { + "name": "meta.brace.round", + "scope": [ + "meta.brace.round" + ], + "settings": { + "foreground": "#383d51ff" + } + }, + { + "name": "meta.brace.square", + "scope": [ + "meta.brace.square" + ], + "settings": { + "foreground": "#383d51ff" + } + }, + { + "name": "meta.brace.curly", + "scope": [ + "meta.brace.curly" + ], + "settings": { + "foreground": "#383d51ff" + } + }, + { + "name": "entity.name.function.decorator", + "scope": [ + "entity.name.function.decorator" + ], + "settings": { + "foreground": "#6a6c85ff" + } + }, + { + "name": "punctuation.definition.decorator", + "scope": [ + "punctuation.definition.decorator" + ], + "settings": { + "foreground": "#6a6c85ff" + } + }, + { + "name": "markup.heading", + "scope": [ + "markup.heading" + ], + "settings": { + "foreground": "#ababffff", + "fontStyle": "bold" + } + }, + { + "name": "entity.name.section.markdown", + "scope": [ + "entity.name.section.markdown" + ], + "settings": { + "foreground": "#ababffff", + "fontStyle": "bold" + } + }, + { + "name": "markup.bold", + "scope": [ + "markup.bold" + ], + "settings": { + "foreground": "#4a5585ff", + "fontStyle": "bold" + } + }, + { + "name": "markup.italic", + "scope": [ + "markup.italic" + ], + "settings": { + "foreground": "#b7ce99ff", + "fontStyle": "italic" + } + }, + { + "name": "markup.inline.raw", + "scope": [ + "markup.inline.raw" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "markup.fenced_code.block.markdown", + "scope": [ + "markup.fenced_code.block.markdown" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "markup.quote", + "scope": [ + "markup.quote" + ], + "settings": { + "foreground": "#282948de", + "fontStyle": "italic" + } + }, + { + "name": "markup.underline.link", + "scope": [ + "markup.underline.link" + ], + "settings": { + "foreground": "#f2cdcdff", + "fontStyle": "underline" + } + }, + { + "name": "markup.inserted", + "scope": [ + "markup.inserted" + ], + "settings": { + "foreground": "#4c867c45" + } + }, + { + "name": "markup.inserted.git_gutter", + "scope": [ + "markup.inserted.git_gutter" + ], + "settings": { + "foreground": "#4c867c45" + } + }, + { + "name": "markup.changed", + "scope": [ + "markup.changed" + ], + "settings": { + "foreground": "#6273a354" + } + }, + { + "name": "markup.changed.git_gutter", + "scope": [ + "markup.changed.git_gutter" + ], + "settings": { + "foreground": "#6273a354" + } + }, + { + "name": "markup.deleted", + "scope": [ + "markup.deleted" + ], + "settings": { + "foreground": "#a43a644d" + } + }, + { + "name": "markup.deleted.git_gutter", + "scope": [ + "markup.deleted.git_gutter" + ], + "settings": { + "foreground": "#a43a644d" + } + }, + { + "name": "invalid", + "scope": [ + "invalid" + ], + "settings": { + "foreground": "#d96a92ff" + } + }, + { + "name": "invalid.illegal", + "scope": [ + "invalid.illegal" + ], + "settings": { + "foreground": "#d96a92ff" + } + }, + { + "name": "invalid.deprecated", + "scope": [ + "invalid.deprecated" + ], + "settings": { + "foreground": "#282948de" + } + }, + { + "name": "comment.line.todo", + "scope": [ + "comment.line.todo" + ], + "settings": { + "foreground": "#6a6c85ff", + "fontStyle": "bold" + } + }, + { + "name": "comment.block.todo", + "scope": [ + "comment.block.todo" + ], + "settings": { + "foreground": "#6a6c85ff", + "fontStyle": "bold" + } + }, + { + "name": "comment.line.fixme", + "scope": [ + "comment.line.fixme" + ], + "settings": { + "foreground": "#ebd8bee8", + "fontStyle": "bold" + } + }, + { + "name": "comment.block.fixme", + "scope": [ + "comment.block.fixme" + ], + "settings": { + "foreground": "#ebd8bee8", + "fontStyle": "bold" + } + }, + { + "name": "comment.line.note", + "scope": [ + "comment.line.note" + ], + "settings": { + "foreground": "#93a7e6f0", + "fontStyle": "bold" + } + }, + { + "name": "comment.block.note", + "scope": [ + "comment.block.note" + ], + "settings": { + "foreground": "#93a7e6f0", + "fontStyle": "bold" + } + }, + { + "name": "string.quoted.docstring", + "scope": [ + "string.quoted.docstring" + ], + "settings": { + "foreground": "#282948de", + "fontStyle": "italic" + } + }, + { + "name": "string.quoted.docstring.multi.python", + "scope": [ + "string.quoted.docstring.multi.python" + ], + "settings": { + "foreground": "#282948de", + "fontStyle": "italic" + } + }, + { + "name": "string.quoted.docstring.raw.multi.python", + "scope": [ + "string.quoted.docstring.raw.multi.python" + ], + "settings": { + "foreground": "#282948de", + "fontStyle": "italic" + } + }, + { + "name": "source.yaml", + "scope": [ + "source.yaml" + ], + "settings": { + "foreground": "#4e5c7ae6" + } + }, + { + "name": "entity.name.tag.yaml", + "scope": [ + "entity.name.tag.yaml" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "string.unquoted.plain.out.yaml", + "scope": [ + "string.unquoted.plain.out.yaml" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "string.quoted.single.yaml", + "scope": [ + "string.quoted.single.yaml" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "meta.structure.dictionary.key.json", + "scope": [ + "meta.structure.dictionary.key.json" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "support.type.property-name.json", + "scope": [ + "support.type.property-name.json" + ], + "settings": { + "foreground": "#8380a8cc" + } + }, + { + "name": "meta.structure.dictionary.value.json", + "scope": [ + "meta.structure.dictionary.value.json" + ], + "settings": { + "foreground": "#b7ce99ff" + } + }, + { + "name": "meta.property-list.css", + "scope": [ + "meta.property-list.css" + ], + "settings": { + "foreground": "#8380a8cc" + } + } + ], + "semanticTokenColors": { + "comment": "#282948de", + "string": "#b7ce99ff", + "number": "#7bc2dfff", + "regexp": "#fcb086ff", + "keyword": "#4a5585ff", + "operator": "#adaca2ff", + "variable": "#9599bffa", + "parameter": "#9599bffa", + "property": "#8380a8cc", + "function": "#f2cdcdff", + "method": "#f2cdcdff", + "class": "#f2cdcdff", + "interface": "#f2cdcdff", + "enum": "#9aa1c7ff", + "enumMember": "#767b95c2", + "type": "#9599cfff", + "typeParameter": "#f2cdcdff", + "namespace": "#f2cdcdff", + "decorator": "#6a6c85ff", + "macro": "#cd5cf2ff", + "*.deprecated": { + "fontStyle": "strikethrough" + }, + "*.documentation": { + "foreground": "#383d51ff", + "fontStyle": "italic" + } + } +} \ No newline at end of file