turbo-themes 0.44.21 → 0.44.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/assets/js/homepage-showcase.js +2 -2
- data/assets/js/homepage-showcase.js.map +1 -1
- data/assets/js/homepage-showcase.min.js +1 -1
- data/assets/js/theme-selector.min.js +1 -1
- data/lib/turbo-themes/version.rb +1 -1
- metadata +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage-showcase.js","names":["tokensData","VENDOR_ORDER","DEFAULT_THEME","GENERATED_VENDOR_ORDER","allThemeIds","THEME_FAMILIES","CORE_DEFAULT_THEME","GENERATED_THEME_FAMILIES","applyTheme","getCurrentTheme","applyThemeToDocument","getCurrentThemeFromDocument"],"sources":["../../packages/core/dist/themes/tokens.json","../../packages/core/dist/tokens/index.js","../../packages/core/dist/themes/generated/metadata.js","../../packages/core/dist/themes/metadata.js","../../packages/core/dist/catalog/create.js","../../packages/core/dist/catalog/sets.js","../../packages/theme-selector/src/appearance.ts","../../packages/theme-selector/src/generated/theme-maps.ts","../../packages/theme-selector/src/constants.ts","../../packages/theme-selector/src/errors.ts","../../packages/theme-selector/src/theme-loader.ts","../../packages/theme-selector/src/dropdown/helpers.ts","../../packages/theme-selector/src/theme-mapper.ts","../../packages/theme-selector/src/theme-resolver.ts","../../packages/theme-selector/src/apply-theme.ts","../../packages/theme-selector/src/storage.ts","../../packages/theme-selector/src/integration.ts","../../packages/theme-selector/src/lazy-css.ts","homepage-showcase.ts"],"sourcesContent":["{\n \"$schema\": \"https://design-tokens.org/schema.json\",\n \"$description\": \"Turbo Themes - Flat tokens for 43 themes\",\n \"$version\": \"0.44.21\",\n \"$generated\": \"9bc3e613013dd627943c5d51166b2285109be876b4d8362408fc6c0f88c9d282\",\n \"meta\": {\n \"themeIds\": [\n \"ayu-dark\",\n \"ayu-light\",\n \"ayu-mirage\",\n \"bulma-dark\",\n \"bulma-light\",\n \"catppuccin-frappe\",\n \"catppuccin-latte\",\n \"catppuccin-macchiato\",\n \"catppuccin-mocha\",\n \"dracula\",\n \"everforest-dark-hard\",\n \"everforest-dark-soft\",\n \"everforest-dark\",\n \"everforest-light-hard\",\n \"everforest-light-soft\",\n \"everforest-light\",\n \"github-dark\",\n \"github-light\",\n \"gruvbox-dark-hard\",\n \"gruvbox-dark-soft\",\n \"gruvbox-dark\",\n \"gruvbox-light-hard\",\n \"gruvbox-light-soft\",\n \"gruvbox-light\",\n \"kanagawa-dragon\",\n \"kanagawa-lotus\",\n \"kanagawa-wave\",\n \"nord\",\n \"one-dark\",\n \"one-light\",\n \"radix-mauve-dark\",\n \"radix-mauve-light\",\n \"radix-slate-dark\",\n \"radix-slate-light\",\n \"rose-pine-dawn\",\n \"rose-pine-moon\",\n \"rose-pine\",\n \"solarized-dark\",\n \"solarized-light\",\n \"terminal\",\n \"tokyo-night-dark\",\n \"tokyo-night-light\",\n \"tokyo-night-storm\"\n ],\n \"totalThemes\": 43\n },\n \"shared\": {\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n }\n },\n \"themes\": {\n \"ayu-dark\": {\n \"id\": \"ayu-dark\",\n \"label\": \"Ayu Dark\",\n \"vendor\": \"ayu\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#0d1017\",\n \"surface\": \"#141821\",\n \"overlay\": \"#1b1f29\"\n },\n \"text\": {\n \"primary\": \"#bfbdb6\",\n \"secondary\": \"#818b96\",\n \"inverse\": \"#0d1017\"\n },\n \"brand\": {\n \"primary\": \"#e6b450\",\n \"primaryText\": \"#0d1017\"\n },\n \"state\": {\n \"info\": \"#39bae6\",\n \"success\": \"#aad94c\",\n \"warning\": \"#ff8f40\",\n \"danger\": \"#d95757\",\n \"infoText\": \"#0d1017\",\n \"successText\": \"#0d1017\",\n \"warningText\": \"#0d1017\",\n \"dangerText\": \"#0d1017\"\n },\n \"border\": {\n \"default\": \"#1b1f29\"\n },\n \"accent\": {\n \"link\": \"#ffb454\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#ffb454\",\n \"h2\": \"#59c2ff\",\n \"h3\": \"#39bae6\",\n \"h4\": \"#aad94c\",\n \"h5\": \"#d2a6ff\",\n \"h6\": \"#ff8f40\"\n },\n \"body\": {\n \"primary\": \"#bfbdb6\",\n \"secondary\": \"#7c8691\"\n },\n \"link\": {\n \"default\": \"#ffb454\"\n },\n \"selection\": {\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#1c212b\"\n },\n \"blockquote\": {\n \"border\": \"#1b1f29\",\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#141821\"\n },\n \"codeInline\": {\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#1b1f29\"\n },\n \"codeBlock\": {\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#1b1f29\"\n },\n \"table\": {\n \"border\": \"#1b1f29\",\n \"stripe\": \"#141821\",\n \"theadBg\": \"#1b1f29\"\n }\n }\n }\n },\n \"ayu-light\": {\n \"id\": \"ayu-light\",\n \"label\": \"Ayu Light\",\n \"vendor\": \"ayu\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f8f9fa\",\n \"surface\": \"#fafafa\",\n \"overlay\": \"#e7eaed\"\n },\n \"text\": {\n \"primary\": \"#5c6166\",\n \"secondary\": \"#5e6672\",\n \"inverse\": \"#f8f9fa\"\n },\n \"brand\": {\n \"primary\": \"#f29718\",\n \"primaryText\": \"#343435\"\n },\n \"state\": {\n \"info\": \"#55b4d4\",\n \"success\": \"#86b300\",\n \"warning\": \"#ff7e33\",\n \"danger\": \"#e65050\",\n \"infoText\": \"#39393a\",\n \"successText\": \"#373737\",\n \"warningText\": \"#343435\",\n \"dangerText\": \"#161617\"\n },\n \"border\": {\n \"default\": \"#e7eaed\"\n },\n \"accent\": {\n \"link\": \"#775995\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#c28200\",\n \"h2\": \"#3696db\",\n \"h3\": \"#4899b4\",\n \"h4\": \"#759c00\",\n \"h5\": \"#a37acc\",\n \"h6\": \"#e3702d\"\n },\n \"body\": {\n \"primary\": \"#5c6166\",\n \"secondary\": \"#656f7c\"\n },\n \"link\": {\n \"default\": \"#775995\"\n },\n \"selection\": {\n \"fg\": \"#5c6166\",\n \"bg\": \"#e5e9ed\"\n },\n \"blockquote\": {\n \"border\": \"#e7eaed\",\n \"fg\": \"#5c6166\",\n \"bg\": \"#fafafa\"\n },\n \"codeInline\": {\n \"fg\": \"#5c6166\",\n \"bg\": \"#e7eaed\"\n },\n \"codeBlock\": {\n \"fg\": \"#5c6166\",\n \"bg\": \"#e7eaed\"\n },\n \"table\": {\n \"border\": \"#e7eaed\",\n \"stripe\": \"#fafafa\",\n \"theadBg\": \"#e7eaed\"\n }\n }\n }\n },\n \"ayu-mirage\": {\n \"id\": \"ayu-mirage\",\n \"label\": \"Ayu Mirage\",\n \"vendor\": \"ayu\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1f2430\",\n \"surface\": \"#282e3b\",\n \"overlay\": \"#293040\"\n },\n \"text\": {\n \"primary\": \"#cccac2\",\n \"secondary\": \"#959daa\",\n \"inverse\": \"#1f2430\"\n },\n \"brand\": {\n \"primary\": \"#ffcc66\",\n \"primaryText\": \"#1f2430\"\n },\n \"state\": {\n \"info\": \"#5ccfe6\",\n \"success\": \"#d5ff80\",\n \"warning\": \"#ffad66\",\n \"danger\": \"#ff6666\",\n \"infoText\": \"#1f2430\",\n \"successText\": \"#1f2430\",\n \"warningText\": \"#1f2430\",\n \"dangerText\": \"#1f2430\"\n },\n \"border\": {\n \"default\": \"#171b24\"\n },\n \"accent\": {\n \"link\": \"#ffd173\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#ffd173\",\n \"h2\": \"#73d0ff\",\n \"h3\": \"#5ccfe6\",\n \"h4\": \"#d5ff80\",\n \"h5\": \"#dfbfff\",\n \"h6\": \"#ffad66\"\n },\n \"body\": {\n \"primary\": \"#cccac2\",\n \"secondary\": \"#929aa8\"\n },\n \"link\": {\n \"default\": \"#ffd173\"\n },\n \"selection\": {\n \"fg\": \"#cccac2\",\n \"bg\": \"#293040\"\n },\n \"blockquote\": {\n \"border\": \"#171b24\",\n \"fg\": \"#cccac2\",\n \"bg\": \"#282e3b\"\n },\n \"codeInline\": {\n \"fg\": \"#cccac2\",\n \"bg\": \"#293040\"\n },\n \"codeBlock\": {\n \"fg\": \"#cccac2\",\n \"bg\": \"#293040\"\n },\n \"table\": {\n \"border\": \"#171b24\",\n \"stripe\": \"#282e3b\",\n \"theadBg\": \"#293040\"\n }\n }\n }\n },\n \"bulma-dark\": {\n \"id\": \"bulma-dark\",\n \"label\": \"Bulma Dark\",\n \"vendor\": \"bulma\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#141414\",\n \"surface\": \"#1f1f1f\",\n \"overlay\": \"#2b2b2b\"\n },\n \"text\": {\n \"primary\": \"#f5f5f5\",\n \"secondary\": \"#dbdbdb\",\n \"inverse\": \"#141414\"\n },\n \"brand\": {\n \"primary\": \"#00d1b2\",\n \"primaryText\": \"#141414\"\n },\n \"state\": {\n \"info\": \"#3e8ed0\",\n \"success\": \"#48c78e\",\n \"warning\": \"#ffe08a\",\n \"danger\": \"#f14668\",\n \"infoText\": \"#141414\",\n \"successText\": \"#141414\",\n \"warningText\": \"#141414\",\n \"dangerText\": \"#141414\"\n },\n \"border\": {\n \"default\": \"#363636\"\n },\n \"accent\": {\n \"link\": \"#8293d9\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Nunito Sans\\\", BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", Roboto, Oxygen, Ubuntu, Cantarell, \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif\",\n \"mono\": \"\\\"JetBrains Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,400;0,6..12,600;0,6..12,700;1,6..12,400&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#00d1b2\",\n \"h2\": \"#7289da\",\n \"h3\": \"#5dade2\",\n \"h4\": \"#58d68d\",\n \"h5\": \"#f7dc6f\",\n \"h6\": \"#f1948a\"\n },\n \"body\": {\n \"primary\": \"#dbdbdb\",\n \"secondary\": \"#b5b5b5\"\n },\n \"link\": {\n \"default\": \"#8293d9\"\n },\n \"selection\": {\n \"fg\": \"#f5f5f5\",\n \"bg\": \"#2f6acb\"\n },\n \"blockquote\": {\n \"border\": \"#363636\",\n \"fg\": \"#dbdbdb\",\n \"bg\": \"#1f1f1f\"\n },\n \"codeInline\": {\n \"fg\": \"#f46884\",\n \"bg\": \"#2b2b2b\"\n },\n \"codeBlock\": {\n \"fg\": \"#f5f5f5\",\n \"bg\": \"#2b2b2b\"\n },\n \"table\": {\n \"border\": \"#404040\",\n \"stripe\": \"#1c1c1c\",\n \"theadBg\": \"#2d2d2d\",\n \"cellBg\": \"#1a1a1a\",\n \"headerFg\": \"#f5f5f5\"\n }\n },\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#1c1c1c\",\n \"border\": \"#3a3a3a\",\n \"headerBg\": \"#252525\",\n \"footerBg\": \"#1f1f1f\"\n },\n \"message\": {\n \"bg\": \"#1f1f1f\",\n \"headerBg\": \"#2a2a2a\",\n \"border\": \"#404040\",\n \"bodyFg\": \"#e0e0e0\"\n },\n \"panel\": {\n \"bg\": \"#1c1c1c\",\n \"headerBg\": \"#2a2a2a\",\n \"headerFg\": \"#f5f5f5\",\n \"border\": \"#3a3a3a\",\n \"blockBg\": \"#1f1f1f\",\n \"blockHoverBg\": \"#262626\",\n \"blockActiveBg\": \"#2d3748\"\n },\n \"box\": {\n \"bg\": \"#1c1c1c\",\n \"border\": \"#3a3a3a\"\n },\n \"notification\": {\n \"bg\": \"#252525\",\n \"border\": \"#404040\"\n },\n \"modal\": {\n \"bg\": \"rgba(0, 0, 0, 0.86)\",\n \"cardBg\": \"#1c1c1c\",\n \"headerBg\": \"#252525\",\n \"footerBg\": \"#1f1f1f\"\n },\n \"dropdown\": {\n \"bg\": \"#1c1c1c\",\n \"itemHoverBg\": \"#2a2a2a\",\n \"border\": \"#404040\"\n },\n \"tabs\": {\n \"border\": \"#404040\",\n \"linkBg\": \"#252525\",\n \"linkActiveBg\": \"#1c1c1c\",\n \"linkHoverBg\": \"#2a2a2a\"\n }\n }\n }\n },\n \"bulma-light\": {\n \"id\": \"bulma-light\",\n \"label\": \"Bulma Light\",\n \"vendor\": \"bulma\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#ffffff\",\n \"surface\": \"#f5f5f5\",\n \"overlay\": \"#eeeeee\"\n },\n \"text\": {\n \"primary\": \"#363636\",\n \"secondary\": \"#4a4a4a\",\n \"inverse\": \"#ffffff\"\n },\n \"brand\": {\n \"primary\": \"#00d1b2\",\n \"primaryText\": \"#1c1c1c\"\n },\n \"state\": {\n \"info\": \"#3e8ed0\",\n \"success\": \"#48c78e\",\n \"warning\": \"#ffe08a\",\n \"danger\": \"#f14668\",\n \"successText\": \"#363636\",\n \"warningText\": \"#363636\",\n \"infoText\": \"#1e1e1e\",\n \"dangerText\": \"#1b1b1b\"\n },\n \"border\": {\n \"default\": \"#dbdbdb\"\n },\n \"accent\": {\n \"link\": \"#485fc7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Nunito Sans\\\", BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", Roboto, Oxygen, Ubuntu, Cantarell, \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif\",\n \"mono\": \"\\\"JetBrains Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,400;0,6..12,600;0,6..12,700;1,6..12,400&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#00a088\",\n \"h2\": \"#485fc7\",\n \"h3\": \"#3e8ed0\",\n \"h4\": \"#399f71\",\n \"h5\": \"#9f8c56\",\n \"h6\": \"#f14668\"\n },\n \"body\": {\n \"primary\": \"#4a4a4a\",\n \"secondary\": \"#6b6b6b\"\n },\n \"link\": {\n \"default\": \"#485fc7\"\n },\n \"selection\": {\n \"fg\": \"#363636\",\n \"bg\": \"#b5d5ff\"\n },\n \"blockquote\": {\n \"border\": \"#dbdbdb\",\n \"fg\": \"#4a4a4a\",\n \"bg\": \"#f5f5f5\"\n },\n \"codeInline\": {\n \"fg\": \"#c23853\",\n \"bg\": \"#f5f5f5\"\n },\n \"codeBlock\": {\n \"fg\": \"#363636\",\n \"bg\": \"#f5f5f5\"\n },\n \"table\": {\n \"border\": \"#dbdbdb\",\n \"stripe\": \"#fafafa\",\n \"theadBg\": \"#f0f0f0\",\n \"cellBg\": \"#ffffff\",\n \"headerFg\": \"#363636\"\n }\n },\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#ffffff\",\n \"border\": \"#d5d5d5\",\n \"headerBg\": \"#f5f5f5\",\n \"footerBg\": \"#fafafa\"\n },\n \"message\": {\n \"bg\": \"#f8f9fa\",\n \"headerBg\": \"#eef1f4\",\n \"border\": \"#d5dbe1\",\n \"bodyFg\": \"#4a4a4a\"\n },\n \"panel\": {\n \"bg\": \"#ffffff\",\n \"headerBg\": \"#f0f0f0\",\n \"headerFg\": \"#363636\",\n \"border\": \"#d5d5d5\",\n \"blockBg\": \"#fafafa\",\n \"blockHoverBg\": \"#f5f5f5\",\n \"blockActiveBg\": \"#eef6fc\"\n },\n \"box\": {\n \"bg\": \"#ffffff\",\n \"border\": \"#e0e0e0\"\n },\n \"notification\": {\n \"bg\": \"#f5f5f5\",\n \"border\": \"#e0e0e0\"\n },\n \"modal\": {\n \"bg\": \"rgba(10, 10, 10, 0.86)\",\n \"cardBg\": \"#ffffff\",\n \"headerBg\": \"#f5f5f5\",\n \"footerBg\": \"#fafafa\"\n },\n \"dropdown\": {\n \"bg\": \"#ffffff\",\n \"itemHoverBg\": \"#f5f5f5\",\n \"border\": \"#dbdbdb\"\n },\n \"tabs\": {\n \"border\": \"#dbdbdb\",\n \"linkBg\": \"#f5f5f5\",\n \"linkActiveBg\": \"#ffffff\",\n \"linkHoverBg\": \"#eeeeee\"\n }\n }\n }\n },\n \"catppuccin-frappe\": {\n \"id\": \"catppuccin-frappe\",\n \"label\": \"Catppuccin Frappé\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#303446\",\n \"surface\": \"#292c3c\",\n \"overlay\": \"#232634\"\n },\n \"text\": {\n \"primary\": \"#c6d0f5\",\n \"secondary\": \"#a5adce\",\n \"inverse\": \"#303446\"\n },\n \"brand\": {\n \"primary\": \"#8caaee\",\n \"primaryText\": \"#303446\"\n },\n \"state\": {\n \"info\": \"#99d1db\",\n \"success\": \"#a6d189\",\n \"warning\": \"#e5c890\",\n \"danger\": \"#e78284\",\n \"infoText\": \"#303446\",\n \"successText\": \"#303446\",\n \"warningText\": \"#303446\",\n \"dangerText\": \"#2f3244\"\n },\n \"border\": {\n \"default\": \"#737994\"\n },\n \"accent\": {\n \"link\": \"#8caaee\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#a6d189\",\n \"h2\": \"#8caaee\",\n \"h3\": \"#85c1dc\",\n \"h4\": \"#e5c890\",\n \"h5\": \"#ca9ee6\",\n \"h6\": \"#e78284\"\n },\n \"body\": {\n \"primary\": \"#c6d0f5\",\n \"secondary\": \"#a5adce\"\n },\n \"link\": {\n \"default\": \"#8caaee\"\n },\n \"selection\": {\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#515668\"\n },\n \"blockquote\": {\n \"border\": \"#838ba7\",\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#292c3c\"\n },\n \"codeInline\": {\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#414559\"\n },\n \"codeBlock\": {\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#414559\"\n },\n \"table\": {\n \"border\": \"#838ba7\",\n \"stripe\": \"#414559\",\n \"theadBg\": \"#50566c\"\n }\n }\n }\n },\n \"catppuccin-latte\": {\n \"id\": \"catppuccin-latte\",\n \"label\": \"Catppuccin Latte\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#eff1f5\",\n \"surface\": \"#e6e9ef\",\n \"overlay\": \"#dce0e8\"\n },\n \"text\": {\n \"primary\": \"#4c4f69\",\n \"secondary\": \"#5c5f71\",\n \"inverse\": \"#eff1f5\"\n },\n \"brand\": {\n \"primary\": \"#1e66f5\",\n \"primaryText\": \"#fbfbfc\"\n },\n \"state\": {\n \"info\": \"#0378a7\",\n \"success\": \"#40a02b\",\n \"warning\": \"#df8e1d\",\n \"danger\": \"#d20f39\",\n \"infoText\": \"#fbfbfb\",\n \"successText\": \"#212222\",\n \"warningText\": \"#323333\",\n \"dangerText\": \"#eff1f5\"\n },\n \"border\": {\n \"default\": \"#9ca0b0\"\n },\n \"accent\": {\n \"link\": \"#1a57d2\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3c9829\",\n \"h2\": \"#1e66f5\",\n \"h3\": \"#1d92a7\",\n \"h4\": \"#ba7618\",\n \"h5\": \"#8839ef\",\n \"h6\": \"#d20f39\"\n },\n \"body\": {\n \"primary\": \"#4c4f69\",\n \"secondary\": \"#616477\"\n },\n \"link\": {\n \"default\": \"#1a57d2\"\n },\n \"selection\": {\n \"fg\": \"#4c4f69\",\n \"bg\": \"#c6c8d0\"\n },\n \"blockquote\": {\n \"border\": \"#8c8fa1\",\n \"fg\": \"#4c4f69\",\n \"bg\": \"#e6e9ef\"\n },\n \"codeInline\": {\n \"fg\": \"#4c4f69\",\n \"bg\": \"#ccd0da\"\n },\n \"codeBlock\": {\n \"fg\": \"#4c4f69\",\n \"bg\": \"#ccd0da\"\n },\n \"table\": {\n \"border\": \"#8c8fa1\",\n \"stripe\": \"#ccd0da\",\n \"theadBg\": \"#c4c8d2\"\n }\n }\n }\n },\n \"catppuccin-macchiato\": {\n \"id\": \"catppuccin-macchiato\",\n \"label\": \"Catppuccin Macchiato\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#24273a\",\n \"surface\": \"#1e2030\",\n \"overlay\": \"#181926\"\n },\n \"text\": {\n \"primary\": \"#cad3f5\",\n \"secondary\": \"#a5adcb\",\n \"inverse\": \"#24273a\"\n },\n \"brand\": {\n \"primary\": \"#8aadf4\",\n \"primaryText\": \"#24273a\"\n },\n \"state\": {\n \"info\": \"#91d7e3\",\n \"success\": \"#a6da95\",\n \"warning\": \"#eed49f\",\n \"danger\": \"#ed8796\",\n \"infoText\": \"#24273a\",\n \"successText\": \"#24273a\",\n \"warningText\": \"#24273a\",\n \"dangerText\": \"#24273a\"\n },\n \"border\": {\n \"default\": \"#6e738d\"\n },\n \"accent\": {\n \"link\": \"#8aadf4\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#a6da95\",\n \"h2\": \"#8aadf4\",\n \"h3\": \"#7dc4e4\",\n \"h4\": \"#eed49f\",\n \"h5\": \"#c6a0f6\",\n \"h6\": \"#ed8796\"\n },\n \"body\": {\n \"primary\": \"#cad3f5\",\n \"secondary\": \"#a5adcb\"\n },\n \"link\": {\n \"default\": \"#8aadf4\"\n },\n \"selection\": {\n \"fg\": \"#cad3f5\",\n \"bg\": \"#53576a\"\n },\n \"blockquote\": {\n \"border\": \"#8087a2\",\n \"fg\": \"#cad3f5\",\n \"bg\": \"#1e2030\"\n },\n \"codeInline\": {\n \"fg\": \"#cad3f5\",\n \"bg\": \"#363a4f\"\n },\n \"codeBlock\": {\n \"fg\": \"#cad3f5\",\n \"bg\": \"#363a4f\"\n },\n \"table\": {\n \"border\": \"#8087a2\",\n \"stripe\": \"#363a4f\",\n \"theadBg\": \"#494d64\"\n }\n }\n }\n },\n \"catppuccin-mocha\": {\n \"id\": \"catppuccin-mocha\",\n \"label\": \"Catppuccin Mocha\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1e1e2e\",\n \"surface\": \"#181825\",\n \"overlay\": \"#11111b\"\n },\n \"text\": {\n \"primary\": \"#cdd6f4\",\n \"secondary\": \"#a6adc8\",\n \"inverse\": \"#1e1e2e\"\n },\n \"brand\": {\n \"primary\": \"#89b4fa\",\n \"primaryText\": \"#1e1e2e\"\n },\n \"state\": {\n \"info\": \"#89dceb\",\n \"success\": \"#a6e3a1\",\n \"warning\": \"#f9e2af\",\n \"danger\": \"#f38ba8\",\n \"infoText\": \"#1e1e2e\",\n \"successText\": \"#1e1e2e\",\n \"warningText\": \"#1e1e2e\",\n \"dangerText\": \"#1e1e2e\"\n },\n \"border\": {\n \"default\": \"#6c7086\"\n },\n \"accent\": {\n \"link\": \"#89b4fa\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#a6e3a1\",\n \"h2\": \"#89b4fa\",\n \"h3\": \"#74c7ec\",\n \"h4\": \"#f9e2af\",\n \"h5\": \"#cba6f7\",\n \"h6\": \"#f38ba8\"\n },\n \"body\": {\n \"primary\": \"#cdd6f4\",\n \"secondary\": \"#a6adc8\"\n },\n \"link\": {\n \"default\": \"#89b4fa\"\n },\n \"selection\": {\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#56596a\"\n },\n \"blockquote\": {\n \"border\": \"#7f849c\",\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#181825\"\n },\n \"codeInline\": {\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#313244\"\n },\n \"codeBlock\": {\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#313244\"\n },\n \"table\": {\n \"border\": \"#7f849c\",\n \"stripe\": \"#313244\",\n \"theadBg\": \"#45475a\"\n }\n }\n }\n },\n \"dracula\": {\n \"id\": \"dracula\",\n \"label\": \"Dracula\",\n \"vendor\": \"dracula\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#282a36\",\n \"surface\": \"#21222c\",\n \"overlay\": \"#44475a\"\n },\n \"text\": {\n \"primary\": \"#f8f8f2\",\n \"secondary\": \"#b3bbd3\",\n \"inverse\": \"#282a36\"\n },\n \"brand\": {\n \"primary\": \"#bd93f9\",\n \"primaryText\": \"#282a36\"\n },\n \"state\": {\n \"info\": \"#8be9fd\",\n \"success\": \"#50fa7b\",\n \"warning\": \"#f1fa8c\",\n \"danger\": \"#ff5555\",\n \"infoText\": \"#282a36\",\n \"successText\": \"#282a36\",\n \"warningText\": \"#282a36\",\n \"dangerText\": \"#242631\"\n },\n \"border\": {\n \"default\": \"#44475a\"\n },\n \"accent\": {\n \"link\": \"#8be9fd\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, sans-serif\",\n \"mono\": \"\\\"Fira Code\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#ff79c6\",\n \"h2\": \"#bd93f9\",\n \"h3\": \"#8be9fd\",\n \"h4\": \"#50fa7b\",\n \"h5\": \"#ffb86c\",\n \"h6\": \"#f1fa8c\"\n },\n \"body\": {\n \"primary\": \"#f8f8f2\",\n \"secondary\": \"#8995bb\"\n },\n \"link\": {\n \"default\": \"#8be9fd\"\n },\n \"selection\": {\n \"fg\": \"#f8f8f2\",\n \"bg\": \"#44475a\"\n },\n \"blockquote\": {\n \"border\": \"#bd93f9\",\n \"fg\": \"#7f8db5\",\n \"bg\": \"#21222c\"\n },\n \"codeInline\": {\n \"fg\": \"#50fa7b\",\n \"bg\": \"#21222c\"\n },\n \"codeBlock\": {\n \"fg\": \"#f8f8f2\",\n \"bg\": \"#21222c\"\n },\n \"table\": {\n \"border\": \"#44475a\",\n \"stripe\": \"#21222c\",\n \"theadBg\": \"#44475a\",\n \"cellBg\": \"#282a36\",\n \"headerFg\": \"#f8f8f2\"\n }\n },\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#21222c\",\n \"border\": \"#6272a4\",\n \"headerBg\": \"#282a36\",\n \"footerBg\": \"#21222c\"\n },\n \"message\": {\n \"bg\": \"#282a36\",\n \"headerBg\": \"#44475a\",\n \"border\": \"#6272a4\",\n \"bodyFg\": \"#f8f8f2\"\n },\n \"panel\": {\n \"bg\": \"#21222c\",\n \"headerBg\": \"#44475a\",\n \"headerFg\": \"#f8f8f2\",\n \"border\": \"#6272a4\",\n \"blockBg\": \"#282a36\",\n \"blockHoverBg\": \"#2e303e\",\n \"blockActiveBg\": \"#44475a\"\n },\n \"box\": {\n \"bg\": \"#21222c\",\n \"border\": \"#6272a4\"\n },\n \"notification\": {\n \"bg\": \"#282a36\",\n \"border\": \"#6272a4\"\n },\n \"modal\": {\n \"bg\": \"rgba(40, 42, 54, 0.9)\",\n \"cardBg\": \"#21222c\",\n \"headerBg\": \"#282a36\",\n \"footerBg\": \"#21222c\"\n },\n \"dropdown\": {\n \"bg\": \"#21222c\",\n \"itemHoverBg\": \"#2e303e\",\n \"border\": \"#6272a4\"\n },\n \"tabs\": {\n \"border\": \"#6272a4\",\n \"linkBg\": \"#2e303e\",\n \"linkActiveBg\": \"#21222c\",\n \"linkHoverBg\": \"#44475a\"\n }\n }\n }\n },\n \"everforest-dark-hard\": {\n \"id\": \"everforest-dark-hard\",\n \"label\": \"Everforest Dark Hard\",\n \"vendor\": \"everforest\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#272E33\",\n \"surface\": \"#2E383C\",\n \"overlay\": \"#374145\"\n },\n \"text\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#a7b2aa\",\n \"inverse\": \"#272E33\"\n },\n \"brand\": {\n \"primary\": \"#A7C080\",\n \"primaryText\": \"#272E33\"\n },\n \"state\": {\n \"info\": \"#7FBBB3\",\n \"success\": \"#A7C080\",\n \"warning\": \"#DBBC7F\",\n \"danger\": \"#E67E80\",\n \"infoText\": \"#272E33\",\n \"successText\": \"#272E33\",\n \"warningText\": \"#272E33\",\n \"dangerText\": \"#272E33\"\n },\n \"border\": {\n \"default\": \"#495156\"\n },\n \"accent\": {\n \"link\": \"#83C092\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#A7C080\",\n \"h2\": \"#7FBBB3\",\n \"h3\": \"#83C092\",\n \"h4\": \"#DBBC7F\",\n \"h5\": \"#D699B6\",\n \"h6\": \"#E67E80\"\n },\n \"body\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#9DA9A0\"\n },\n \"link\": {\n \"default\": \"#83C092\"\n },\n \"selection\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#374145\"\n },\n \"blockquote\": {\n \"border\": \"#495156\",\n \"fg\": \"#9DA9A0\",\n \"bg\": \"#2E383C\"\n },\n \"codeInline\": {\n \"fg\": \"#e79e7d\",\n \"bg\": \"#374145\"\n },\n \"codeBlock\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#2E383C\"\n },\n \"table\": {\n \"border\": \"#495156\",\n \"stripe\": \"#374145\",\n \"theadBg\": \"#2E383C\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#2E383C\",\n \"border\": \"#495156\",\n \"headerBg\": \"#272E33\",\n \"footerBg\": \"#2E383C\"\n },\n \"message\": {\n \"bg\": \"#272E33\",\n \"headerBg\": \"#2E383C\",\n \"border\": \"#495156\",\n \"bodyFg\": \"#D3C6AA\"\n },\n \"panel\": {\n \"bg\": \"#2E383C\",\n \"headerBg\": \"#272E33\",\n \"headerFg\": \"#D3C6AA\",\n \"border\": \"#495156\",\n \"blockBg\": \"#272E33\",\n \"blockHoverBg\": \"#2E383C\",\n \"blockActiveBg\": \"#374145\"\n },\n \"box\": {\n \"bg\": \"#2E383C\",\n \"border\": \"#495156\"\n },\n \"notification\": {\n \"bg\": \"#272E33\",\n \"border\": \"#495156\"\n },\n \"modal\": {\n \"bg\": \"rgba(39, 46, 51, 0.9)\",\n \"cardBg\": \"#2E383C\",\n \"headerBg\": \"#272E33\",\n \"footerBg\": \"#2E383C\"\n },\n \"dropdown\": {\n \"bg\": \"#2E383C\",\n \"itemHoverBg\": \"#374145\",\n \"border\": \"#495156\"\n },\n \"tabs\": {\n \"border\": \"#495156\",\n \"linkBg\": \"#2E383C\",\n \"linkActiveBg\": \"#272E33\",\n \"linkHoverBg\": \"#374145\"\n }\n }\n }\n },\n \"everforest-dark-soft\": {\n \"id\": \"everforest-dark-soft\",\n \"label\": \"Everforest Dark Soft\",\n \"vendor\": \"everforest\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#333C43\",\n \"surface\": \"#3A464C\",\n \"overlay\": \"#434F55\"\n },\n \"text\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#bdc5be\",\n \"inverse\": \"#333C43\"\n },\n \"brand\": {\n \"primary\": \"#A7C080\",\n \"primaryText\": \"#333C43\"\n },\n \"state\": {\n \"info\": \"#7FBBB3\",\n \"success\": \"#A7C080\",\n \"warning\": \"#DBBC7F\",\n \"danger\": \"#E67E80\",\n \"dangerText\": \"#2a3238\",\n \"infoText\": \"#333C43\",\n \"successText\": \"#333C43\",\n \"warningText\": \"#333C43\"\n },\n \"border\": {\n \"default\": \"#555F66\"\n },\n \"accent\": {\n \"link\": \"#9dcea9\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#A7C080\",\n \"h2\": \"#7FBBB3\",\n \"h3\": \"#83C092\",\n \"h4\": \"#DBBC7F\",\n \"h5\": \"#D699B6\",\n \"h6\": \"#E67E80\"\n },\n \"body\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#aeb8b0\"\n },\n \"link\": {\n \"default\": \"#9dcea9\"\n },\n \"selection\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#434F55\"\n },\n \"blockquote\": {\n \"border\": \"#555F66\",\n \"fg\": \"#aeb8b0\",\n \"bg\": \"#3A464C\"\n },\n \"codeInline\": {\n \"fg\": \"#edb79d\",\n \"bg\": \"#434F55\"\n },\n \"codeBlock\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#3A464C\"\n },\n \"table\": {\n \"border\": \"#555F66\",\n \"stripe\": \"#434F55\",\n \"theadBg\": \"#3A464C\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#3A464C\",\n \"border\": \"#555F66\",\n \"headerBg\": \"#333C43\",\n \"footerBg\": \"#3A464C\"\n },\n \"message\": {\n \"bg\": \"#333C43\",\n \"headerBg\": \"#3A464C\",\n \"border\": \"#555F66\",\n \"bodyFg\": \"#D3C6AA\"\n },\n \"panel\": {\n \"bg\": \"#3A464C\",\n \"headerBg\": \"#333C43\",\n \"headerFg\": \"#D3C6AA\",\n \"border\": \"#555F66\",\n \"blockBg\": \"#333C43\",\n \"blockHoverBg\": \"#3A464C\",\n \"blockActiveBg\": \"#434F55\"\n },\n \"box\": {\n \"bg\": \"#3A464C\",\n \"border\": \"#555F66\"\n },\n \"notification\": {\n \"bg\": \"#333C43\",\n \"border\": \"#555F66\"\n },\n \"modal\": {\n \"bg\": \"rgba(51, 60, 67, 0.9)\",\n \"cardBg\": \"#3A464C\",\n \"headerBg\": \"#333C43\",\n \"footerBg\": \"#3A464C\"\n },\n \"dropdown\": {\n \"bg\": \"#3A464C\",\n \"itemHoverBg\": \"#434F55\",\n \"border\": \"#555F66\"\n },\n \"tabs\": {\n \"border\": \"#555F66\",\n \"linkBg\": \"#3A464C\",\n \"linkActiveBg\": \"#333C43\",\n \"linkHoverBg\": \"#434F55\"\n }\n }\n }\n },\n \"everforest-dark\": {\n \"id\": \"everforest-dark\",\n \"label\": \"Everforest Dark\",\n \"vendor\": \"everforest\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#2D353B\",\n \"surface\": \"#343F44\",\n \"overlay\": \"#3D484D\"\n },\n \"text\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#b2bbb4\",\n \"inverse\": \"#2D353B\"\n },\n \"brand\": {\n \"primary\": \"#A7C080\",\n \"primaryText\": \"#2D353B\"\n },\n \"state\": {\n \"info\": \"#7FBBB3\",\n \"success\": \"#A7C080\",\n \"warning\": \"#DBBC7F\",\n \"danger\": \"#E67E80\",\n \"infoText\": \"#2D353B\",\n \"successText\": \"#2D353B\",\n \"warningText\": \"#2D353B\",\n \"dangerText\": \"#2a3237\"\n },\n \"border\": {\n \"default\": \"#4F585E\"\n },\n \"accent\": {\n \"link\": \"#8ec69c\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#A7C080\",\n \"h2\": \"#7FBBB3\",\n \"h3\": \"#83C092\",\n \"h4\": \"#DBBC7F\",\n \"h5\": \"#D699B6\",\n \"h6\": \"#E67E80\"\n },\n \"body\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#a4afa7\"\n },\n \"link\": {\n \"default\": \"#8ec69c\"\n },\n \"selection\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#3D484D\"\n },\n \"blockquote\": {\n \"border\": \"#4F585E\",\n \"fg\": \"#a4afa7\",\n \"bg\": \"#343F44\"\n },\n \"codeInline\": {\n \"fg\": \"#eaaa8d\",\n \"bg\": \"#3D484D\"\n },\n \"codeBlock\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#343F44\"\n },\n \"table\": {\n \"border\": \"#4F585E\",\n \"stripe\": \"#3D484D\",\n \"theadBg\": \"#343F44\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#343F44\",\n \"border\": \"#4F585E\",\n \"headerBg\": \"#2D353B\",\n \"footerBg\": \"#343F44\"\n },\n \"message\": {\n \"bg\": \"#2D353B\",\n \"headerBg\": \"#343F44\",\n \"border\": \"#4F585E\",\n \"bodyFg\": \"#D3C6AA\"\n },\n \"panel\": {\n \"bg\": \"#343F44\",\n \"headerBg\": \"#2D353B\",\n \"headerFg\": \"#D3C6AA\",\n \"border\": \"#4F585E\",\n \"blockBg\": \"#2D353B\",\n \"blockHoverBg\": \"#343F44\",\n \"blockActiveBg\": \"#3D484D\"\n },\n \"box\": {\n \"bg\": \"#343F44\",\n \"border\": \"#4F585E\"\n },\n \"notification\": {\n \"bg\": \"#2D353B\",\n \"border\": \"#4F585E\"\n },\n \"modal\": {\n \"bg\": \"rgba(45, 53, 59, 0.9)\",\n \"cardBg\": \"#343F44\",\n \"headerBg\": \"#2D353B\",\n \"footerBg\": \"#343F44\"\n },\n \"dropdown\": {\n \"bg\": \"#343F44\",\n \"itemHoverBg\": \"#3D484D\",\n \"border\": \"#4F585E\"\n },\n \"tabs\": {\n \"border\": \"#4F585E\",\n \"linkBg\": \"#343F44\",\n \"linkActiveBg\": \"#2D353B\",\n \"linkHoverBg\": \"#3D484D\"\n }\n }\n }\n },\n \"everforest-light-hard\": {\n \"id\": \"everforest-light-hard\",\n \"label\": \"Everforest Light Hard\",\n \"vendor\": \"everforest\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#FFFBEF\",\n \"surface\": \"#F8F5E4\",\n \"overlay\": \"#EDEADA\"\n },\n \"text\": {\n \"primary\": \"#5a6870\",\n \"secondary\": \"#5a676e\",\n \"inverse\": \"#FFFBEF\"\n },\n \"brand\": {\n \"primary\": \"#697a01\",\n \"primaryText\": \"#fffefc\"\n },\n \"state\": {\n \"info\": \"#2A7A9E\",\n \"success\": \"#697a01\",\n \"warning\": \"#A87800\",\n \"danger\": \"#D03A38\",\n \"infoText\": \"#fffef9\",\n \"successText\": \"#fffefc\",\n \"warningText\": \"#121211\",\n \"dangerText\": \"#fffdf7\"\n },\n \"border\": {\n \"default\": \"#E8E5D5\"\n },\n \"accent\": {\n \"link\": \"#1D6B4F\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#6B7C01\",\n \"h2\": \"#2A7A9E\",\n \"h3\": \"#1D6B4F\",\n \"h4\": \"#A87800\",\n \"h5\": \"#B84F96\",\n \"h6\": \"#D03A38\"\n },\n \"body\": {\n \"primary\": \"#5C6A72\",\n \"secondary\": \"#606e75\"\n },\n \"link\": {\n \"default\": \"#1D6B4F\"\n },\n \"selection\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#f0eddf\"\n },\n \"blockquote\": {\n \"border\": \"#E8E5D5\",\n \"fg\": \"#606e75\",\n \"bg\": \"#F8F5E4\"\n },\n \"codeInline\": {\n \"fg\": \"#a64b10\",\n \"bg\": \"#EDEADA\"\n },\n \"codeBlock\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#F8F5E4\"\n },\n \"table\": {\n \"border\": \"#E8E5D5\",\n \"stripe\": \"#EDEADA\",\n \"theadBg\": \"#F8F5E4\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#FFFBEF\",\n \"border\": \"#E8E5D5\",\n \"headerBg\": \"#F8F5E4\",\n \"footerBg\": \"#F8F5E4\"\n },\n \"message\": {\n \"bg\": \"#F8F5E4\",\n \"headerBg\": \"#FFFBEF\",\n \"border\": \"#E8E5D5\",\n \"bodyFg\": \"#5C6A72\"\n },\n \"panel\": {\n \"bg\": \"#FFFBEF\",\n \"headerBg\": \"#F8F5E4\",\n \"headerFg\": \"#5C6A72\",\n \"border\": \"#E8E5D5\",\n \"blockBg\": \"#F8F5E4\",\n \"blockHoverBg\": \"#FFFBEF\",\n \"blockActiveBg\": \"#EDEADA\"\n },\n \"box\": {\n \"bg\": \"#FFFBEF\",\n \"border\": \"#E8E5D5\"\n },\n \"notification\": {\n \"bg\": \"#F8F5E4\",\n \"border\": \"#E8E5D5\"\n },\n \"modal\": {\n \"bg\": \"rgba(92, 106, 114, 0.86)\",\n \"cardBg\": \"#FFFBEF\",\n \"headerBg\": \"#F8F5E4\",\n \"footerBg\": \"#F8F5E4\"\n },\n \"dropdown\": {\n \"bg\": \"#FFFBEF\",\n \"itemHoverBg\": \"#F8F5E4\",\n \"border\": \"#E8E5D5\"\n },\n \"tabs\": {\n \"border\": \"#E8E5D5\",\n \"linkBg\": \"#F8F5E4\",\n \"linkActiveBg\": \"#FFFBEF\",\n \"linkHoverBg\": \"#EDEADA\"\n }\n }\n }\n },\n \"everforest-light-soft\": {\n \"id\": \"everforest-light-soft\",\n \"label\": \"Everforest Light Soft\",\n \"vendor\": \"everforest\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#F3EAD3\",\n \"surface\": \"#EAE4CA\",\n \"overlay\": \"#DDD8BE\"\n },\n \"text\": {\n \"primary\": \"#4f5c63\",\n \"secondary\": \"#4f5c62\",\n \"inverse\": \"#F3EAD3\"\n },\n \"brand\": {\n \"primary\": \"#697a01\",\n \"primaryText\": \"#fffefd\"\n },\n \"state\": {\n \"info\": \"#2A7A9E\",\n \"success\": \"#697a01\",\n \"warning\": \"#A87800\",\n \"danger\": \"#D03A38\",\n \"infoText\": \"#fefefc\",\n \"successText\": \"#fffefd\",\n \"warningText\": \"#11100f\",\n \"dangerText\": \"#fefdfa\"\n },\n \"border\": {\n \"default\": \"#D8D3BA\"\n },\n \"accent\": {\n \"link\": \"#1c664b\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#6B7C01\",\n \"h2\": \"#2A7A9E\",\n \"h3\": \"#1D6B4F\",\n \"h4\": \"#A87800\",\n \"h5\": \"#B84F96\",\n \"h6\": \"#D03A38\"\n },\n \"body\": {\n \"primary\": \"#56646c\",\n \"secondary\": \"#56646a\"\n },\n \"link\": {\n \"default\": \"#1c664b\"\n },\n \"selection\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#efede0\"\n },\n \"blockquote\": {\n \"border\": \"#D8D3BA\",\n \"fg\": \"#57646b\",\n \"bg\": \"#EAE4CA\"\n },\n \"codeInline\": {\n \"fg\": \"#92430e\",\n \"bg\": \"#DDD8BE\"\n },\n \"codeBlock\": {\n \"fg\": \"#5a6870\",\n \"bg\": \"#F3EAD3\"\n },\n \"table\": {\n \"border\": \"#D8D3BA\",\n \"stripe\": \"#DDD8BE\",\n \"theadBg\": \"#EAE4CA\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#F3EAD3\",\n \"border\": \"#D8D3BA\",\n \"headerBg\": \"#EAE4CA\",\n \"footerBg\": \"#EAE4CA\"\n },\n \"message\": {\n \"bg\": \"#EAE4CA\",\n \"headerBg\": \"#F3EAD3\",\n \"border\": \"#D8D3BA\",\n \"bodyFg\": \"#5C6A72\"\n },\n \"panel\": {\n \"bg\": \"#F3EAD3\",\n \"headerBg\": \"#EAE4CA\",\n \"headerFg\": \"#5C6A72\",\n \"border\": \"#D8D3BA\",\n \"blockBg\": \"#EAE4CA\",\n \"blockHoverBg\": \"#F3EAD3\",\n \"blockActiveBg\": \"#DDD8BE\"\n },\n \"box\": {\n \"bg\": \"#F3EAD3\",\n \"border\": \"#D8D3BA\"\n },\n \"notification\": {\n \"bg\": \"#EAE4CA\",\n \"border\": \"#D8D3BA\"\n },\n \"modal\": {\n \"bg\": \"rgba(92, 106, 114, 0.86)\",\n \"cardBg\": \"#F3EAD3\",\n \"headerBg\": \"#EAE4CA\",\n \"footerBg\": \"#EAE4CA\"\n },\n \"dropdown\": {\n \"bg\": \"#F3EAD3\",\n \"itemHoverBg\": \"#EAE4CA\",\n \"border\": \"#D8D3BA\"\n },\n \"tabs\": {\n \"border\": \"#D8D3BA\",\n \"linkBg\": \"#EAE4CA\",\n \"linkActiveBg\": \"#F3EAD3\",\n \"linkHoverBg\": \"#DDD8BE\"\n }\n }\n }\n },\n \"everforest-light\": {\n \"id\": \"everforest-light\",\n \"label\": \"Everforest Light\",\n \"vendor\": \"everforest\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#FDF6E3\",\n \"surface\": \"#F4F0D9\",\n \"overlay\": \"#E6E2CC\"\n },\n \"text\": {\n \"primary\": \"#56636a\",\n \"secondary\": \"#566269\",\n \"inverse\": \"#FDF6E3\"\n },\n \"brand\": {\n \"primary\": \"#697a01\",\n \"primaryText\": \"#fffefc\"\n },\n \"state\": {\n \"info\": \"#2A7A9E\",\n \"success\": \"#697a01\",\n \"warning\": \"#A87800\",\n \"danger\": \"#D03A38\",\n \"infoText\": \"#fffefb\",\n \"successText\": \"#fffefc\",\n \"warningText\": \"#121110\",\n \"dangerText\": \"#fffdf8\"\n },\n \"border\": {\n \"default\": \"#BDC3AF\"\n },\n \"accent\": {\n \"link\": \"#1D6B4F\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#6B7C01\",\n \"h2\": \"#2A7A9E\",\n \"h3\": \"#1D6B4F\",\n \"h4\": \"#A87800\",\n \"h5\": \"#B84F96\",\n \"h6\": \"#D03A38\"\n },\n \"body\": {\n \"primary\": \"#5C6A72\",\n \"secondary\": \"#5e6b72\"\n },\n \"link\": {\n \"default\": \"#1D6B4F\"\n },\n \"selection\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#f0eddf\"\n },\n \"blockquote\": {\n \"border\": \"#BDC3AF\",\n \"fg\": \"#5d6b72\",\n \"bg\": \"#F4F0D9\"\n },\n \"codeInline\": {\n \"fg\": \"#9c480f\",\n \"bg\": \"#E6E2CC\"\n },\n \"codeBlock\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#F4F0D9\"\n },\n \"table\": {\n \"border\": \"#BDC3AF\",\n \"stripe\": \"#E6E2CC\",\n \"theadBg\": \"#F4F0D9\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#FDF6E3\",\n \"border\": \"#BDC3AF\",\n \"headerBg\": \"#F4F0D9\",\n \"footerBg\": \"#F4F0D9\"\n },\n \"message\": {\n \"bg\": \"#F4F0D9\",\n \"headerBg\": \"#FDF6E3\",\n \"border\": \"#BDC3AF\",\n \"bodyFg\": \"#5C6A72\"\n },\n \"panel\": {\n \"bg\": \"#FDF6E3\",\n \"headerBg\": \"#F4F0D9\",\n \"headerFg\": \"#5C6A72\",\n \"border\": \"#BDC3AF\",\n \"blockBg\": \"#F4F0D9\",\n \"blockHoverBg\": \"#FDF6E3\",\n \"blockActiveBg\": \"#E6E2CC\"\n },\n \"box\": {\n \"bg\": \"#FDF6E3\",\n \"border\": \"#BDC3AF\"\n },\n \"notification\": {\n \"bg\": \"#F4F0D9\",\n \"border\": \"#BDC3AF\"\n },\n \"modal\": {\n \"bg\": \"rgba(92, 106, 114, 0.86)\",\n \"cardBg\": \"#FDF6E3\",\n \"headerBg\": \"#F4F0D9\",\n \"footerBg\": \"#F4F0D9\"\n },\n \"dropdown\": {\n \"bg\": \"#FDF6E3\",\n \"itemHoverBg\": \"#F4F0D9\",\n \"border\": \"#BDC3AF\"\n },\n \"tabs\": {\n \"border\": \"#BDC3AF\",\n \"linkBg\": \"#F4F0D9\",\n \"linkActiveBg\": \"#FDF6E3\",\n \"linkHoverBg\": \"#E6E2CC\"\n }\n }\n }\n },\n \"github-dark\": {\n \"id\": \"github-dark\",\n \"label\": \"GitHub Dark\",\n \"vendor\": \"github\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#0d1117\",\n \"surface\": \"#151b23\",\n \"overlay\": \"#010409\"\n },\n \"text\": {\n \"primary\": \"#f0f6fc\",\n \"secondary\": \"#9198a1\",\n \"inverse\": \"#ffffff\"\n },\n \"brand\": {\n \"primary\": \"#1e6de6\",\n \"primaryText\": \"#ffffff\"\n },\n \"state\": {\n \"info\": \"#3573c1\",\n \"success\": \"#3fb950\",\n \"warning\": \"#d29922\",\n \"danger\": \"#f85149\",\n \"successText\": \"#0d1117\",\n \"warningText\": \"#0d1117\",\n \"infoText\": \"#fdfeff\",\n \"dangerText\": \"#0d1117\"\n },\n \"border\": {\n \"default\": \"#3d444d\"\n },\n \"accent\": {\n \"link\": \"#4493f8\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Mona Sans\\\", -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Noto Sans\\\", Helvetica, Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"\\\"Hubot Sans\\\", ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, \\\"Liberation Mono\\\", monospace\"\n },\n \"webFonts\": [\n \"https://github.githubassets.com/assets/mona-sans-webfont.woff2\",\n \"https://github.githubassets.com/assets/hubot-sans-webfont.woff2\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3fb950\",\n \"h2\": \"#4493f8\",\n \"h3\": \"#1f6feb\",\n \"h4\": \"#d29922\",\n \"h5\": \"#3fb950\",\n \"h6\": \"#f85149\"\n },\n \"body\": {\n \"primary\": \"#f0f6fc\",\n \"secondary\": \"#9198a1\"\n },\n \"link\": {\n \"default\": \"#4493f8\"\n },\n \"selection\": {\n \"fg\": \"#f0f6fc\",\n \"bg\": \"#264f78\"\n },\n \"blockquote\": {\n \"border\": \"#3d444d\",\n \"fg\": \"#9198a1\",\n \"bg\": \"#151b23\"\n },\n \"codeInline\": {\n \"fg\": \"#f0f6fc\",\n \"bg\": \"#151b23\"\n },\n \"codeBlock\": {\n \"fg\": \"#f0f6fc\",\n \"bg\": \"#151b23\"\n },\n \"table\": {\n \"border\": \"#3d444d\",\n \"stripe\": \"#151b23\",\n \"theadBg\": \"#151b23\"\n }\n }\n }\n },\n \"github-light\": {\n \"id\": \"github-light\",\n \"label\": \"GitHub Light\",\n \"vendor\": \"github\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#ffffff\",\n \"surface\": \"#f6f8fa\",\n \"overlay\": \"#f6f8fa\"\n },\n \"text\": {\n \"primary\": \"#1f2328\",\n \"secondary\": \"#59636e\",\n \"inverse\": \"#ffffff\"\n },\n \"brand\": {\n \"primary\": \"#0969da\",\n \"primaryText\": \"#fcfcfc\"\n },\n \"state\": {\n \"info\": \"#0969da\",\n \"success\": \"#1a7f37\",\n \"warning\": \"#9a6700\",\n \"danger\": \"#d1242f\",\n \"infoText\": \"#f6f6f6\",\n \"successText\": \"#f8f8f9\",\n \"warningText\": \"#fdfdfd\",\n \"dangerText\": \"#f4f4f4\"\n },\n \"border\": {\n \"default\": \"#d1d9e0\"\n },\n \"accent\": {\n \"link\": \"#0969da\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Mona Sans\\\", -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Noto Sans\\\", Helvetica, Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"\\\"Hubot Sans\\\", ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, \\\"Liberation Mono\\\", monospace\"\n },\n \"webFonts\": [\n \"https://github.githubassets.com/assets/mona-sans-webfont.woff2\",\n \"https://github.githubassets.com/assets/hubot-sans-webfont.woff2\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#1a7f37\",\n \"h2\": \"#0969da\",\n \"h3\": \"#0969da\",\n \"h4\": \"#9a6700\",\n \"h5\": \"#1a7f37\",\n \"h6\": \"#d1242f\"\n },\n \"body\": {\n \"primary\": \"#1f2328\",\n \"secondary\": \"#59636e\"\n },\n \"link\": {\n \"default\": \"#0969da\"\n },\n \"selection\": {\n \"fg\": \"#1f2328\",\n \"bg\": \"#b6e3ff\"\n },\n \"blockquote\": {\n \"border\": \"#d1d9e0\",\n \"fg\": \"#59636e\",\n \"bg\": \"#f6f8fa\"\n },\n \"codeInline\": {\n \"fg\": \"#1f2328\",\n \"bg\": \"#f6f8fa\"\n },\n \"codeBlock\": {\n \"fg\": \"#1f2328\",\n \"bg\": \"#f6f8fa\"\n },\n \"table\": {\n \"border\": \"#d1d9e0\",\n \"stripe\": \"#f6f8fa\",\n \"theadBg\": \"#f6f8fa\"\n }\n }\n }\n },\n \"gruvbox-dark-hard\": {\n \"id\": \"gruvbox-dark-hard\",\n \"label\": \"Gruvbox Dark Hard\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1d2021\",\n \"surface\": \"#282828\",\n \"overlay\": \"#3c3836\"\n },\n \"text\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\",\n \"inverse\": \"#1d2021\"\n },\n \"brand\": {\n \"primary\": \"#d79921\",\n \"primaryText\": \"#1d2021\"\n },\n \"state\": {\n \"info\": \"#83a598\",\n \"success\": \"#b8bb26\",\n \"warning\": \"#fabd2f\",\n \"danger\": \"#fb4934\",\n \"infoText\": \"#1d2021\",\n \"successText\": \"#1d2021\",\n \"warningText\": \"#1d2021\",\n \"dangerText\": \"#1d2021\"\n },\n \"border\": {\n \"default\": \"#665c54\"\n },\n \"accent\": {\n \"link\": \"#8eada1\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#b8bb26\",\n \"h2\": \"#83a598\",\n \"h3\": \"#8ec07c\",\n \"h4\": \"#fabd2f\",\n \"h5\": \"#d3869b\",\n \"h6\": \"#fb4934\"\n },\n \"body\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\"\n },\n \"link\": {\n \"default\": \"#8eada1\"\n },\n \"selection\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#3c3836\"\n },\n \"blockquote\": {\n \"border\": \"#665c54\",\n \"fg\": \"#d5c4a1\",\n \"bg\": \"#282828\"\n },\n \"codeInline\": {\n \"fg\": \"#fe8625\",\n \"bg\": \"#3c3836\"\n },\n \"codeBlock\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#282828\"\n },\n \"table\": {\n \"border\": \"#665c54\",\n \"stripe\": \"#3c3836\",\n \"theadBg\": \"#282828\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#282828\",\n \"border\": \"#665c54\",\n \"headerBg\": \"#1d2021\",\n \"footerBg\": \"#282828\"\n },\n \"message\": {\n \"bg\": \"#1d2021\",\n \"headerBg\": \"#282828\",\n \"border\": \"#665c54\",\n \"bodyFg\": \"#ebdbb2\"\n },\n \"panel\": {\n \"bg\": \"#282828\",\n \"headerBg\": \"#1d2021\",\n \"headerFg\": \"#ebdbb2\",\n \"border\": \"#665c54\",\n \"blockBg\": \"#1d2021\",\n \"blockHoverBg\": \"#282828\",\n \"blockActiveBg\": \"#3c3836\"\n },\n \"box\": {\n \"bg\": \"#282828\",\n \"border\": \"#665c54\"\n },\n \"notification\": {\n \"bg\": \"#1d2021\",\n \"border\": \"#665c54\"\n },\n \"modal\": {\n \"bg\": \"rgba(29, 32, 33, 0.9)\",\n \"cardBg\": \"#282828\",\n \"headerBg\": \"#1d2021\",\n \"footerBg\": \"#282828\"\n },\n \"dropdown\": {\n \"bg\": \"#282828\",\n \"itemHoverBg\": \"#3c3836\",\n \"border\": \"#665c54\"\n },\n \"tabs\": {\n \"border\": \"#665c54\",\n \"linkBg\": \"#282828\",\n \"linkActiveBg\": \"#1d2021\",\n \"linkHoverBg\": \"#3c3836\"\n }\n }\n }\n },\n \"gruvbox-dark-soft\": {\n \"id\": \"gruvbox-dark-soft\",\n \"label\": \"Gruvbox Dark Soft\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#32302f\",\n \"surface\": \"#3c3836\",\n \"overlay\": \"#504945\"\n },\n \"text\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\",\n \"inverse\": \"#32302f\"\n },\n \"brand\": {\n \"primary\": \"#d79921\",\n \"primaryText\": \"#32302f\"\n },\n \"state\": {\n \"info\": \"#83a598\",\n \"success\": \"#b8bb26\",\n \"warning\": \"#fabd2f\",\n \"danger\": \"#fb4934\",\n \"dangerText\": \"#211f1f\",\n \"infoText\": \"#32302f\",\n \"successText\": \"#32302f\",\n \"warningText\": \"#32302f\"\n },\n \"border\": {\n \"default\": \"#665c54\"\n },\n \"accent\": {\n \"link\": \"#adc4bb\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#b8bb26\",\n \"h2\": \"#83a598\",\n \"h3\": \"#8ec07c\",\n \"h4\": \"#fabd2f\",\n \"h5\": \"#d3869b\",\n \"h6\": \"#fb4934\"\n },\n \"body\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\"\n },\n \"link\": {\n \"default\": \"#adc4bb\"\n },\n \"selection\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#504945\"\n },\n \"blockquote\": {\n \"border\": \"#665c54\",\n \"fg\": \"#d5c4a1\",\n \"bg\": \"#3c3836\"\n },\n \"codeInline\": {\n \"fg\": \"#feac69\",\n \"bg\": \"#504945\"\n },\n \"codeBlock\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#3c3836\"\n },\n \"table\": {\n \"border\": \"#665c54\",\n \"stripe\": \"#504945\",\n \"theadBg\": \"#3c3836\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"headerBg\": \"#32302f\",\n \"footerBg\": \"#3c3836\"\n },\n \"message\": {\n \"bg\": \"#32302f\",\n \"headerBg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"bodyFg\": \"#ebdbb2\"\n },\n \"panel\": {\n \"bg\": \"#3c3836\",\n \"headerBg\": \"#32302f\",\n \"headerFg\": \"#ebdbb2\",\n \"border\": \"#665c54\",\n \"blockBg\": \"#32302f\",\n \"blockHoverBg\": \"#3c3836\",\n \"blockActiveBg\": \"#504945\"\n },\n \"box\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\"\n },\n \"notification\": {\n \"bg\": \"#32302f\",\n \"border\": \"#665c54\"\n },\n \"modal\": {\n \"bg\": \"rgba(50, 48, 47, 0.9)\",\n \"cardBg\": \"#3c3836\",\n \"headerBg\": \"#32302f\",\n \"footerBg\": \"#3c3836\"\n },\n \"dropdown\": {\n \"bg\": \"#3c3836\",\n \"itemHoverBg\": \"#504945\",\n \"border\": \"#665c54\"\n },\n \"tabs\": {\n \"border\": \"#665c54\",\n \"linkBg\": \"#3c3836\",\n \"linkActiveBg\": \"#32302f\",\n \"linkHoverBg\": \"#504945\"\n }\n }\n }\n },\n \"gruvbox-dark\": {\n \"id\": \"gruvbox-dark\",\n \"label\": \"Gruvbox Dark\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#282828\",\n \"surface\": \"#3c3836\",\n \"overlay\": \"#504945\"\n },\n \"text\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\",\n \"inverse\": \"#282828\"\n },\n \"brand\": {\n \"primary\": \"#d79921\",\n \"primaryText\": \"#282828\"\n },\n \"state\": {\n \"info\": \"#83a598\",\n \"success\": \"#b8bb26\",\n \"warning\": \"#fabd2f\",\n \"danger\": \"#fb4934\",\n \"dangerText\": \"#1f1f1f\",\n \"infoText\": \"#282828\",\n \"successText\": \"#282828\",\n \"warningText\": \"#282828\"\n },\n \"border\": {\n \"default\": \"#665c54\"\n },\n \"accent\": {\n \"link\": \"#adc4bb\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#b8bb26\",\n \"h2\": \"#83a598\",\n \"h3\": \"#8ec07c\",\n \"h4\": \"#fabd2f\",\n \"h5\": \"#d3869b\",\n \"h6\": \"#fb4934\"\n },\n \"body\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\"\n },\n \"link\": {\n \"default\": \"#adc4bb\"\n },\n \"selection\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#504945\"\n },\n \"blockquote\": {\n \"border\": \"#665c54\",\n \"fg\": \"#d5c4a1\",\n \"bg\": \"#3c3836\"\n },\n \"codeInline\": {\n \"fg\": \"#feac69\",\n \"bg\": \"#504945\"\n },\n \"codeBlock\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#3c3836\"\n },\n \"table\": {\n \"border\": \"#665c54\",\n \"stripe\": \"#504945\",\n \"theadBg\": \"#3c3836\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"headerBg\": \"#282828\",\n \"footerBg\": \"#3c3836\"\n },\n \"message\": {\n \"bg\": \"#282828\",\n \"headerBg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"bodyFg\": \"#ebdbb2\"\n },\n \"panel\": {\n \"bg\": \"#3c3836\",\n \"headerBg\": \"#282828\",\n \"headerFg\": \"#ebdbb2\",\n \"border\": \"#665c54\",\n \"blockBg\": \"#282828\",\n \"blockHoverBg\": \"#3c3836\",\n \"blockActiveBg\": \"#504945\"\n },\n \"box\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\"\n },\n \"notification\": {\n \"bg\": \"#282828\",\n \"border\": \"#665c54\"\n },\n \"modal\": {\n \"bg\": \"rgba(40, 40, 40, 0.9)\",\n \"cardBg\": \"#3c3836\",\n \"headerBg\": \"#282828\",\n \"footerBg\": \"#3c3836\"\n },\n \"dropdown\": {\n \"bg\": \"#3c3836\",\n \"itemHoverBg\": \"#504945\",\n \"border\": \"#665c54\"\n },\n \"tabs\": {\n \"border\": \"#665c54\",\n \"linkBg\": \"#3c3836\",\n \"linkActiveBg\": \"#282828\",\n \"linkHoverBg\": \"#504945\"\n }\n }\n }\n },\n \"gruvbox-light-hard\": {\n \"id\": \"gruvbox-light-hard\",\n \"label\": \"Gruvbox Light Hard\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f9f5d7\",\n \"surface\": \"#fbf1c7\",\n \"overlay\": \"#ebdbb2\"\n },\n \"text\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\",\n \"inverse\": \"#f9f5d7\"\n },\n \"brand\": {\n \"primary\": \"#b57614\",\n \"primaryText\": \"#0f0f0d\"\n },\n \"state\": {\n \"info\": \"#478e9b\",\n \"success\": \"#79740e\",\n \"warning\": \"#b57614\",\n \"danger\": \"#9d0006\",\n \"successText\": \"#fefdf5\",\n \"warningText\": \"#161613\",\n \"infoText\": \"#161613\",\n \"dangerText\": \"#f9f5d7\"\n },\n \"border\": {\n \"default\": \"#bdae93\"\n },\n \"accent\": {\n \"link\": \"#076678\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#79740e\",\n \"h2\": \"#076678\",\n \"h3\": \"#427b58\",\n \"h4\": \"#b57614\",\n \"h5\": \"#8f3f71\",\n \"h6\": \"#9d0006\"\n },\n \"body\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\"\n },\n \"link\": {\n \"default\": \"#076678\"\n },\n \"selection\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#ebdbb2\"\n },\n \"blockquote\": {\n \"border\": \"#bdae93\",\n \"fg\": \"#504945\",\n \"bg\": \"#fbf1c7\"\n },\n \"codeInline\": {\n \"fg\": \"#a83703\",\n \"bg\": \"#ebdbb2\"\n },\n \"codeBlock\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#fbf1c7\"\n },\n \"table\": {\n \"border\": \"#bdae93\",\n \"stripe\": \"#ebdbb2\",\n \"theadBg\": \"#fbf1c7\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#f9f5d7\",\n \"border\": \"#bdae93\",\n \"headerBg\": \"#fbf1c7\",\n \"footerBg\": \"#fbf1c7\"\n },\n \"message\": {\n \"bg\": \"#fbf1c7\",\n \"headerBg\": \"#f9f5d7\",\n \"border\": \"#bdae93\",\n \"bodyFg\": \"#3c3836\"\n },\n \"panel\": {\n \"bg\": \"#f9f5d7\",\n \"headerBg\": \"#fbf1c7\",\n \"headerFg\": \"#3c3836\",\n \"border\": \"#bdae93\",\n \"blockBg\": \"#fbf1c7\",\n \"blockHoverBg\": \"#f9f5d7\",\n \"blockActiveBg\": \"#ebdbb2\"\n },\n \"box\": {\n \"bg\": \"#f9f5d7\",\n \"border\": \"#bdae93\"\n },\n \"notification\": {\n \"bg\": \"#fbf1c7\",\n \"border\": \"#bdae93\"\n },\n \"modal\": {\n \"bg\": \"rgba(60, 56, 54, 0.86)\",\n \"cardBg\": \"#f9f5d7\",\n \"headerBg\": \"#fbf1c7\",\n \"footerBg\": \"#fbf1c7\"\n },\n \"dropdown\": {\n \"bg\": \"#f9f5d7\",\n \"itemHoverBg\": \"#fbf1c7\",\n \"border\": \"#bdae93\"\n },\n \"tabs\": {\n \"border\": \"#bdae93\",\n \"linkBg\": \"#fbf1c7\",\n \"linkActiveBg\": \"#f9f5d7\",\n \"linkHoverBg\": \"#ebdbb2\"\n }\n }\n }\n },\n \"gruvbox-light-soft\": {\n \"id\": \"gruvbox-light-soft\",\n \"label\": \"Gruvbox Light Soft\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f2e5bc\",\n \"surface\": \"#ebdbb2\",\n \"overlay\": \"#d5c4a1\"\n },\n \"text\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\",\n \"inverse\": \"#f2e5bc\"\n },\n \"brand\": {\n \"primary\": \"#b57614\",\n \"primaryText\": \"#100f0d\"\n },\n \"state\": {\n \"info\": \"#478e9b\",\n \"success\": \"#79740e\",\n \"warning\": \"#b57614\",\n \"danger\": \"#9d0006\",\n \"warningText\": \"#181713\",\n \"successText\": \"#fefdf9\",\n \"infoText\": \"#181713\",\n \"dangerText\": \"#f2e5bc\"\n },\n \"border\": {\n \"default\": \"#bdae93\"\n },\n \"accent\": {\n \"link\": \"#065766\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#79740e\",\n \"h2\": \"#076678\",\n \"h3\": \"#427b58\",\n \"h4\": \"#ac7013\",\n \"h5\": \"#8f3f71\",\n \"h6\": \"#9d0006\"\n },\n \"body\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\"\n },\n \"link\": {\n \"default\": \"#065766\"\n },\n \"selection\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#d5c4a1\"\n },\n \"blockquote\": {\n \"border\": \"#bdae93\",\n \"fg\": \"#504945\",\n \"bg\": \"#ebdbb2\"\n },\n \"codeInline\": {\n \"fg\": \"#8f2f03\",\n \"bg\": \"#d5c4a1\"\n },\n \"codeBlock\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#ebdbb2\"\n },\n \"table\": {\n \"border\": \"#bdae93\",\n \"stripe\": \"#d5c4a1\",\n \"theadBg\": \"#ebdbb2\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#f2e5bc\",\n \"border\": \"#bdae93\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"message\": {\n \"bg\": \"#ebdbb2\",\n \"headerBg\": \"#f2e5bc\",\n \"border\": \"#bdae93\",\n \"bodyFg\": \"#3c3836\"\n },\n \"panel\": {\n \"bg\": \"#f2e5bc\",\n \"headerBg\": \"#ebdbb2\",\n \"headerFg\": \"#3c3836\",\n \"border\": \"#bdae93\",\n \"blockBg\": \"#ebdbb2\",\n \"blockHoverBg\": \"#f2e5bc\",\n \"blockActiveBg\": \"#d5c4a1\"\n },\n \"box\": {\n \"bg\": \"#f2e5bc\",\n \"border\": \"#bdae93\"\n },\n \"notification\": {\n \"bg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"modal\": {\n \"bg\": \"rgba(60, 56, 54, 0.86)\",\n \"cardBg\": \"#f2e5bc\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"dropdown\": {\n \"bg\": \"#f2e5bc\",\n \"itemHoverBg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"tabs\": {\n \"border\": \"#bdae93\",\n \"linkBg\": \"#ebdbb2\",\n \"linkActiveBg\": \"#f2e5bc\",\n \"linkHoverBg\": \"#d5c4a1\"\n }\n }\n }\n },\n \"gruvbox-light\": {\n \"id\": \"gruvbox-light\",\n \"label\": \"Gruvbox Light\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fbf1c7\",\n \"surface\": \"#ebdbb2\",\n \"overlay\": \"#d5c4a1\"\n },\n \"text\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\",\n \"inverse\": \"#fbf1c7\"\n },\n \"brand\": {\n \"primary\": \"#b57614\",\n \"primaryText\": \"#100f0d\"\n },\n \"state\": {\n \"info\": \"#478e9b\",\n \"success\": \"#79740e\",\n \"warning\": \"#b57614\",\n \"danger\": \"#9d0006\",\n \"successText\": \"#fefdf5\",\n \"warningText\": \"#171612\",\n \"infoText\": \"#171612\",\n \"dangerText\": \"#fbf1c7\"\n },\n \"border\": {\n \"default\": \"#bdae93\"\n },\n \"accent\": {\n \"link\": \"#065766\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#79740e\",\n \"h2\": \"#076678\",\n \"h3\": \"#427b58\",\n \"h4\": \"#ac7013\",\n \"h5\": \"#8f3f71\",\n \"h6\": \"#9d0006\"\n },\n \"body\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\"\n },\n \"link\": {\n \"default\": \"#065766\"\n },\n \"selection\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#d5c4a1\"\n },\n \"blockquote\": {\n \"border\": \"#bdae93\",\n \"fg\": \"#504945\",\n \"bg\": \"#ebdbb2\"\n },\n \"codeInline\": {\n \"fg\": \"#8f2f03\",\n \"bg\": \"#d5c4a1\"\n },\n \"codeBlock\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#ebdbb2\"\n },\n \"table\": {\n \"border\": \"#bdae93\",\n \"stripe\": \"#d5c4a1\",\n \"theadBg\": \"#ebdbb2\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#fbf1c7\",\n \"border\": \"#bdae93\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"message\": {\n \"bg\": \"#ebdbb2\",\n \"headerBg\": \"#fbf1c7\",\n \"border\": \"#bdae93\",\n \"bodyFg\": \"#3c3836\"\n },\n \"panel\": {\n \"bg\": \"#fbf1c7\",\n \"headerBg\": \"#ebdbb2\",\n \"headerFg\": \"#3c3836\",\n \"border\": \"#bdae93\",\n \"blockBg\": \"#ebdbb2\",\n \"blockHoverBg\": \"#fbf1c7\",\n \"blockActiveBg\": \"#d5c4a1\"\n },\n \"box\": {\n \"bg\": \"#fbf1c7\",\n \"border\": \"#bdae93\"\n },\n \"notification\": {\n \"bg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"modal\": {\n \"bg\": \"rgba(60, 56, 54, 0.86)\",\n \"cardBg\": \"#fbf1c7\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"dropdown\": {\n \"bg\": \"#fbf1c7\",\n \"itemHoverBg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"tabs\": {\n \"border\": \"#bdae93\",\n \"linkBg\": \"#ebdbb2\",\n \"linkActiveBg\": \"#fbf1c7\",\n \"linkHoverBg\": \"#d5c4a1\"\n }\n }\n }\n },\n \"kanagawa-dragon\": {\n \"id\": \"kanagawa-dragon\",\n \"label\": \"Kanagawa Dragon\",\n \"vendor\": \"kanagawa\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#181616\",\n \"surface\": \"#282727\",\n \"overlay\": \"#393836\"\n },\n \"text\": {\n \"primary\": \"#c5c9c5\",\n \"secondary\": \"#C8C093\",\n \"inverse\": \"#181616\"\n },\n \"brand\": {\n \"primary\": \"#8ba4b0\",\n \"primaryText\": \"#131212\"\n },\n \"state\": {\n \"info\": \"#658594\",\n \"success\": \"#98BB6C\",\n \"warning\": \"#FF9E3B\",\n \"danger\": \"#e82828\",\n \"dangerText\": \"#000000\",\n \"infoText\": \"#131212\",\n \"successText\": \"#181616\",\n \"warningText\": \"#181616\"\n },\n \"border\": {\n \"default\": \"#54546D\"\n },\n \"accent\": {\n \"link\": \"#91a9b4\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#8ba4b0\",\n \"h2\": \"#8992a7\",\n \"h3\": \"#8ea4a2\",\n \"h4\": \"#c4b28a\",\n \"h5\": \"#b6927b\",\n \"h6\": \"#a292a3\"\n },\n \"body\": {\n \"primary\": \"#c5c9c5\",\n \"secondary\": \"#C8C093\"\n },\n \"link\": {\n \"default\": \"#91a9b4\"\n },\n \"selection\": {\n \"fg\": \"#c5c9c5\",\n \"bg\": \"#393836\"\n },\n \"blockquote\": {\n \"border\": \"#54546D\",\n \"fg\": \"#C8C093\",\n \"bg\": \"#282727\"\n },\n \"codeInline\": {\n \"fg\": \"#c4b28a\",\n \"bg\": \"#393836\"\n },\n \"codeBlock\": {\n \"fg\": \"#c5c9c5\",\n \"bg\": \"#0d0c0c\"\n },\n \"table\": {\n \"border\": \"#54546D\",\n \"stripe\": \"#282727\",\n \"theadBg\": \"#393836\"\n }\n }\n }\n },\n \"kanagawa-lotus\": {\n \"id\": \"kanagawa-lotus\",\n \"label\": \"Kanagawa Lotus\",\n \"vendor\": \"kanagawa\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f2ecbc\",\n \"surface\": \"#e7dba0\",\n \"overlay\": \"#e4d794\"\n },\n \"text\": {\n \"primary\": \"#545464\",\n \"secondary\": \"#43436c\",\n \"inverse\": \"#f2ecbc\"\n },\n \"brand\": {\n \"primary\": \"#4d699b\",\n \"primaryText\": \"#fffffe\"\n },\n \"state\": {\n \"info\": \"#5a7785\",\n \"success\": \"#6f894e\",\n \"warning\": \"#e98a00\",\n \"danger\": \"#e82828\",\n \"warningText\": \"#353429\",\n \"infoText\": \"#fffffe\",\n \"successText\": \"#13130f\",\n \"dangerText\": \"#000000\"\n },\n \"border\": {\n \"default\": \"#716e61\"\n },\n \"accent\": {\n \"link\": \"#425a85\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#4d699b\",\n \"h2\": \"#624c83\",\n \"h3\": \"#597b75\",\n \"h4\": \"#77713f\",\n \"h5\": \"#bc6400\",\n \"h6\": \"#b35b79\"\n },\n \"body\": {\n \"primary\": \"#545464\",\n \"secondary\": \"#43436c\"\n },\n \"link\": {\n \"default\": \"#425a85\"\n },\n \"selection\": {\n \"fg\": \"#545464\",\n \"bg\": \"#cdcfd4\"\n },\n \"blockquote\": {\n \"border\": \"#716e61\",\n \"fg\": \"#43436c\",\n \"bg\": \"#e7dba0\"\n },\n \"codeInline\": {\n \"fg\": \"#624c83\",\n \"bg\": \"#e4d794\"\n },\n \"codeBlock\": {\n \"fg\": \"#545464\",\n \"bg\": \"#e4d794\"\n },\n \"table\": {\n \"border\": \"#716e61\",\n \"stripe\": \"#e7dba0\",\n \"theadBg\": \"#e4d794\"\n }\n }\n }\n },\n \"kanagawa-wave\": {\n \"id\": \"kanagawa-wave\",\n \"label\": \"Kanagawa Wave\",\n \"vendor\": \"kanagawa\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1F1F28\",\n \"surface\": \"#2A2A37\",\n \"overlay\": \"#363646\"\n },\n \"text\": {\n \"primary\": \"#DCD7BA\",\n \"secondary\": \"#C8C093\",\n \"inverse\": \"#1F1F28\"\n },\n \"brand\": {\n \"primary\": \"#7E9CD8\",\n \"primaryText\": \"#111116\"\n },\n \"state\": {\n \"info\": \"#658594\",\n \"success\": \"#98BB6C\",\n \"warning\": \"#FF9E3B\",\n \"danger\": \"#e82828\",\n \"infoText\": \"#111116\",\n \"dangerText\": \"#000000\",\n \"successText\": \"#1F1F28\",\n \"warningText\": \"#1F1F28\"\n },\n \"border\": {\n \"default\": \"#54546D\"\n },\n \"accent\": {\n \"link\": \"#8aa5dc\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#7E9CD8\",\n \"h2\": \"#957FB8\",\n \"h3\": \"#7AA89F\",\n \"h4\": \"#E6C384\",\n \"h5\": \"#FFA066\",\n \"h6\": \"#D27E99\"\n },\n \"body\": {\n \"primary\": \"#DCD7BA\",\n \"secondary\": \"#C8C093\"\n },\n \"link\": {\n \"default\": \"#8aa5dc\"\n },\n \"selection\": {\n \"fg\": \"#DCD7BA\",\n \"bg\": \"#223249\"\n },\n \"blockquote\": {\n \"border\": \"#54546D\",\n \"fg\": \"#C8C093\",\n \"bg\": \"#2A2A37\"\n },\n \"codeInline\": {\n \"fg\": \"#E6C384\",\n \"bg\": \"#363646\"\n },\n \"codeBlock\": {\n \"fg\": \"#DCD7BA\",\n \"bg\": \"#16161D\"\n },\n \"table\": {\n \"border\": \"#54546D\",\n \"stripe\": \"#2A2A37\",\n \"theadBg\": \"#363646\"\n }\n }\n }\n },\n \"nord\": {\n \"id\": \"nord\",\n \"label\": \"Nord\",\n \"vendor\": \"nord\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#2e3440\",\n \"surface\": \"#3b4252\",\n \"overlay\": \"#434c5e\"\n },\n \"text\": {\n \"primary\": \"#eceff4\",\n \"secondary\": \"#d8dee9\",\n \"inverse\": \"#2e3440\"\n },\n \"brand\": {\n \"primary\": \"#88c0d0\",\n \"primaryText\": \"#0d0f13\"\n },\n \"state\": {\n \"info\": \"#5e81ac\",\n \"success\": \"#a3be8c\",\n \"warning\": \"#ebcb8b\",\n \"danger\": \"#bf616a\",\n \"infoText\": \"#0d0f13\",\n \"dangerText\": \"#0c0d10\",\n \"successText\": \"#2e3440\",\n \"warningText\": \"#2e3440\"\n },\n \"border\": {\n \"default\": \"#4c566a\"\n },\n \"accent\": {\n \"link\": \"#99c9d7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#8fbcbb\",\n \"h2\": \"#88c0d0\",\n \"h3\": \"#81a1c1\",\n \"h4\": \"#ebcb8b\",\n \"h5\": \"#d08770\",\n \"h6\": \"#b48ead\"\n },\n \"body\": {\n \"primary\": \"#eceff4\",\n \"secondary\": \"#d8dee9\"\n },\n \"link\": {\n \"default\": \"#99c9d7\"\n },\n \"selection\": {\n \"fg\": \"#eceff4\",\n \"bg\": \"#4c566a\"\n },\n \"blockquote\": {\n \"border\": \"#4c566a\",\n \"fg\": \"#d8dee9\",\n \"bg\": \"#3b4252\"\n },\n \"codeInline\": {\n \"fg\": \"#eceff4\",\n \"bg\": \"#434c5e\"\n },\n \"codeBlock\": {\n \"fg\": \"#eceff4\",\n \"bg\": \"#434c5e\"\n },\n \"table\": {\n \"border\": \"#4c566a\",\n \"stripe\": \"#434c5e\",\n \"theadBg\": \"#3b4252\"\n }\n }\n }\n },\n \"one-dark\": {\n \"id\": \"one-dark\",\n \"label\": \"One Dark\",\n \"vendor\": \"one-dark\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#282c34\",\n \"surface\": \"#2c313a\",\n \"overlay\": \"#3e4451\"\n },\n \"text\": {\n \"primary\": \"#afb6c2\",\n \"secondary\": \"#b1b6bf\",\n \"inverse\": \"#282c34\"\n },\n \"brand\": {\n \"primary\": \"#61afef\",\n \"primaryText\": \"#282c34\"\n },\n \"state\": {\n \"info\": \"#56b6c2\",\n \"success\": \"#98c379\",\n \"warning\": \"#e5c07b\",\n \"danger\": \"#e06c75\",\n \"dangerText\": \"#22262d\",\n \"infoText\": \"#282c34\",\n \"successText\": \"#282c34\",\n \"warningText\": \"#282c34\"\n },\n \"border\": {\n \"default\": \"#3e4451\"\n },\n \"accent\": {\n \"link\": \"#7abcf2\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#61afef\",\n \"h2\": \"#c678dd\",\n \"h3\": \"#98c379\",\n \"h4\": \"#e5c07b\",\n \"h5\": \"#d19a66\",\n \"h6\": \"#56b6c2\"\n },\n \"body\": {\n \"primary\": \"#abb2bf\",\n \"secondary\": \"#979da9\"\n },\n \"link\": {\n \"default\": \"#7abcf2\"\n },\n \"selection\": {\n \"fg\": \"#abb2bf\",\n \"bg\": \"#3c414e\"\n },\n \"blockquote\": {\n \"border\": \"#3e4451\",\n \"fg\": \"#979daa\",\n \"bg\": \"#2c313a\"\n },\n \"codeInline\": {\n \"fg\": \"#c980df\",\n \"bg\": \"#2c313a\"\n },\n \"codeBlock\": {\n \"fg\": \"#abb2bf\",\n \"bg\": \"#21252b\"\n },\n \"table\": {\n \"border\": \"#3e4451\",\n \"stripe\": \"#2c313a\",\n \"theadBg\": \"#3c414e\"\n }\n }\n }\n },\n \"one-light\": {\n \"id\": \"one-light\",\n \"label\": \"One Light\",\n \"vendor\": \"one-dark\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fafafa\",\n \"surface\": \"#f0f0f0\",\n \"overlay\": \"#e5e5e6\"\n },\n \"text\": {\n \"primary\": \"#383a42\",\n \"secondary\": \"#60636c\",\n \"inverse\": \"#fafafa\"\n },\n \"brand\": {\n \"primary\": \"#4078f2\",\n \"primaryText\": \"#080808\"\n },\n \"state\": {\n \"info\": \"#0184bc\",\n \"success\": \"#50a14f\",\n \"warning\": \"#c18401\",\n \"danger\": \"#e45649\",\n \"infoText\": \"#080808\",\n \"successText\": \"#232323\",\n \"warningText\": \"#232323\",\n \"dangerText\": \"#191919\"\n },\n \"border\": {\n \"default\": \"#d0d0d1\"\n },\n \"accent\": {\n \"link\": \"#315ebd\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#4078f2\",\n \"h2\": \"#a626a4\",\n \"h3\": \"#4d9b4c\",\n \"h4\": \"#b97f01\",\n \"h5\": \"#986801\",\n \"h6\": \"#0184bc\"\n },\n \"body\": {\n \"primary\": \"#383a42\",\n \"secondary\": \"#666973\"\n },\n \"link\": {\n \"default\": \"#315ebd\"\n },\n \"selection\": {\n \"fg\": \"#383a42\",\n \"bg\": \"#dfe1e5\"\n },\n \"blockquote\": {\n \"border\": \"#d0d0d1\",\n \"fg\": \"#666973\",\n \"bg\": \"#f0f0f0\"\n },\n \"codeInline\": {\n \"fg\": \"#a626a4\",\n \"bg\": \"#e5e5e6\"\n },\n \"codeBlock\": {\n \"fg\": \"#383a42\",\n \"bg\": \"#e5e5e6\"\n },\n \"table\": {\n \"border\": \"#d0d0d1\",\n \"stripe\": \"#f0f0f0\",\n \"theadBg\": \"#e5e5e6\"\n }\n }\n }\n },\n \"radix-mauve-dark\": {\n \"id\": \"radix-mauve-dark\",\n \"label\": \"Radix Colors Mauve Dark\",\n \"vendor\": \"radix\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#121113\",\n \"surface\": \"#1a191b\",\n \"overlay\": \"#232225\"\n },\n \"text\": {\n \"primary\": \"#eeeef0\",\n \"secondary\": \"#b5b2bc\",\n \"inverse\": \"#121113\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#121113\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#121113\",\n \"successText\": \"#121113\",\n \"warningText\": \"#121113\",\n \"dangerText\": \"#121113\"\n },\n \"border\": {\n \"default\": \"#3c393f\"\n },\n \"accent\": {\n \"link\": \"#70b8ff\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3dd68c\",\n \"h2\": \"#70b8ff\",\n \"h3\": \"#4ccce6\",\n \"h4\": \"#ffca16\",\n \"h5\": \"#baa7ff\",\n \"h6\": \"#ff9592\"\n },\n \"body\": {\n \"primary\": \"#eeeef0\",\n \"secondary\": \"#b5b2bc\"\n },\n \"link\": {\n \"default\": \"#70b8ff\"\n },\n \"selection\": {\n \"fg\": \"#eeeef0\",\n \"bg\": \"#323035\"\n },\n \"blockquote\": {\n \"border\": \"#49474e\",\n \"fg\": \"#eeeef0\",\n \"bg\": \"#1a191b\"\n },\n \"codeInline\": {\n \"fg\": \"#eeeef0\",\n \"bg\": \"#232225\"\n },\n \"codeBlock\": {\n \"fg\": \"#eeeef0\",\n \"bg\": \"#232225\"\n },\n \"table\": {\n \"border\": \"#49474e\",\n \"stripe\": \"#1a191b\",\n \"theadBg\": \"#2b292d\"\n }\n }\n }\n },\n \"radix-mauve-light\": {\n \"id\": \"radix-mauve-light\",\n \"label\": \"Radix Colors Mauve Light\",\n \"vendor\": \"radix\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fdfcfd\",\n \"surface\": \"#faf9fb\",\n \"overlay\": \"#f2eff3\"\n },\n \"text\": {\n \"primary\": \"#211f26\",\n \"secondary\": \"#65636d\",\n \"inverse\": \"#fdfcfd\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#232323\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#211f26\",\n \"successText\": \"#211f26\",\n \"warningText\": \"#211f26\",\n \"dangerText\": \"#121212\"\n },\n \"border\": {\n \"default\": \"#dbd8e0\"\n },\n \"accent\": {\n \"link\": \"#0c6bbe\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#218358\",\n \"h2\": \"#0d74ce\",\n \"h3\": \"#107d98\",\n \"h4\": \"#ab6400\",\n \"h5\": \"#6550b9\",\n \"h6\": \"#ce2c31\"\n },\n \"body\": {\n \"primary\": \"#211f26\",\n \"secondary\": \"#65636d\"\n },\n \"link\": {\n \"default\": \"#0c6bbe\"\n },\n \"selection\": {\n \"fg\": \"#211f26\",\n \"bg\": \"#e3dfe6\"\n },\n \"blockquote\": {\n \"border\": \"#d0cdd7\",\n \"fg\": \"#211f26\",\n \"bg\": \"#faf9fb\"\n },\n \"codeInline\": {\n \"fg\": \"#211f26\",\n \"bg\": \"#f2eff3\"\n },\n \"codeBlock\": {\n \"fg\": \"#211f26\",\n \"bg\": \"#f2eff3\"\n },\n \"table\": {\n \"border\": \"#d0cdd7\",\n \"stripe\": \"#faf9fb\",\n \"theadBg\": \"#eae7ec\"\n }\n }\n }\n },\n \"radix-slate-dark\": {\n \"id\": \"radix-slate-dark\",\n \"label\": \"Radix Colors Slate Dark\",\n \"vendor\": \"radix\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#111113\",\n \"surface\": \"#18191b\",\n \"overlay\": \"#212225\"\n },\n \"text\": {\n \"primary\": \"#edeef0\",\n \"secondary\": \"#b0b4ba\",\n \"inverse\": \"#111113\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#111113\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#111113\",\n \"successText\": \"#111113\",\n \"warningText\": \"#111113\",\n \"dangerText\": \"#111113\"\n },\n \"border\": {\n \"default\": \"#363a3f\"\n },\n \"accent\": {\n \"link\": \"#70b8ff\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3dd68c\",\n \"h2\": \"#70b8ff\",\n \"h3\": \"#4ccce6\",\n \"h4\": \"#ffca16\",\n \"h5\": \"#baa7ff\",\n \"h6\": \"#ff9592\"\n },\n \"body\": {\n \"primary\": \"#edeef0\",\n \"secondary\": \"#b0b4ba\"\n },\n \"link\": {\n \"default\": \"#70b8ff\"\n },\n \"selection\": {\n \"fg\": \"#edeef0\",\n \"bg\": \"#2e3135\"\n },\n \"blockquote\": {\n \"border\": \"#43484e\",\n \"fg\": \"#edeef0\",\n \"bg\": \"#18191b\"\n },\n \"codeInline\": {\n \"fg\": \"#edeef0\",\n \"bg\": \"#212225\"\n },\n \"codeBlock\": {\n \"fg\": \"#edeef0\",\n \"bg\": \"#212225\"\n },\n \"table\": {\n \"border\": \"#43484e\",\n \"stripe\": \"#18191b\",\n \"theadBg\": \"#272a2d\"\n }\n }\n }\n },\n \"radix-slate-light\": {\n \"id\": \"radix-slate-light\",\n \"label\": \"Radix Colors Slate Light\",\n \"vendor\": \"radix\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fcfcfd\",\n \"surface\": \"#f9f9fb\",\n \"overlay\": \"#f0f0f3\"\n },\n \"text\": {\n \"primary\": \"#1c2024\",\n \"secondary\": \"#60646c\",\n \"inverse\": \"#fcfcfd\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#232323\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#1c2024\",\n \"successText\": \"#1c2024\",\n \"warningText\": \"#1c2024\",\n \"dangerText\": \"#121212\"\n },\n \"border\": {\n \"default\": \"#d9d9e0\"\n },\n \"accent\": {\n \"link\": \"#0c6bbe\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#218358\",\n \"h2\": \"#0d74ce\",\n \"h3\": \"#107d98\",\n \"h4\": \"#ab6400\",\n \"h5\": \"#6550b9\",\n \"h6\": \"#ce2c31\"\n },\n \"body\": {\n \"primary\": \"#1c2024\",\n \"secondary\": \"#60646c\"\n },\n \"link\": {\n \"default\": \"#0c6bbe\"\n },\n \"selection\": {\n \"fg\": \"#1c2024\",\n \"bg\": \"#e0e1e6\"\n },\n \"blockquote\": {\n \"border\": \"#cdced6\",\n \"fg\": \"#1c2024\",\n \"bg\": \"#f9f9fb\"\n },\n \"codeInline\": {\n \"fg\": \"#1c2024\",\n \"bg\": \"#f0f0f3\"\n },\n \"codeBlock\": {\n \"fg\": \"#1c2024\",\n \"bg\": \"#f0f0f3\"\n },\n \"table\": {\n \"border\": \"#cdced6\",\n \"stripe\": \"#f9f9fb\",\n \"theadBg\": \"#e8e8ec\"\n }\n }\n }\n },\n \"rose-pine-dawn\": {\n \"id\": \"rose-pine-dawn\",\n \"label\": \"Rosé Pine Dawn\",\n \"vendor\": \"rose-pine\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#faf4ed\",\n \"surface\": \"#fffaf3\",\n \"overlay\": \"#f2e9e1\"\n },\n \"text\": {\n \"primary\": \"#575279\",\n \"secondary\": \"#66637c\",\n \"inverse\": \"#faf4ed\"\n },\n \"brand\": {\n \"primary\": \"#907aa9\",\n \"primaryText\": \"#171615\"\n },\n \"state\": {\n \"info\": \"#56949f\",\n \"success\": \"#286983\",\n \"warning\": \"#ea9d34\",\n \"danger\": \"#b4637a\",\n \"warningText\": \"#3f3d3b\",\n \"infoText\": \"#1e1d1c\",\n \"dangerText\": \"#080707\",\n \"successText\": \"#faf4ed\"\n },\n \"border\": {\n \"default\": \"#dfdad9\"\n },\n \"accent\": {\n \"link\": \"#6f5f84\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#286983\",\n \"h2\": \"#907aa9\",\n \"h3\": \"#56949f\",\n \"h4\": \"#be7f2a\",\n \"h5\": \"#c67874\",\n \"h6\": \"#b4637a\"\n },\n \"body\": {\n \"primary\": \"#575279\",\n \"secondary\": \"#6d6984\"\n },\n \"link\": {\n \"default\": \"#6f5f84\"\n },\n \"selection\": {\n \"fg\": \"#575279\",\n \"bg\": \"#d2d1d2\"\n },\n \"blockquote\": {\n \"border\": \"#cecacd\",\n \"fg\": \"#575279\",\n \"bg\": \"#fffaf3\"\n },\n \"codeInline\": {\n \"fg\": \"#575279\",\n \"bg\": \"#f2e9e1\"\n },\n \"codeBlock\": {\n \"fg\": \"#575279\",\n \"bg\": \"#f2e9e1\"\n },\n \"table\": {\n \"border\": \"#cecacd\",\n \"stripe\": \"#f2e9e1\",\n \"theadBg\": \"#dfdad9\"\n }\n }\n }\n },\n \"rose-pine-moon\": {\n \"id\": \"rose-pine-moon\",\n \"label\": \"Rosé Pine Moon\",\n \"vendor\": \"rose-pine\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#232136\",\n \"surface\": \"#2a273f\",\n \"overlay\": \"#393552\"\n },\n \"text\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#a6a3bb\",\n \"inverse\": \"#232136\"\n },\n \"brand\": {\n \"primary\": \"#c4a7e7\",\n \"primaryText\": \"#232136\"\n },\n \"state\": {\n \"info\": \"#9ccfd8\",\n \"success\": \"#3e8fb0\",\n \"warning\": \"#f6c177\",\n \"danger\": \"#eb6f92\",\n \"successText\": \"#1a1828\",\n \"infoText\": \"#232136\",\n \"warningText\": \"#232136\",\n \"dangerText\": \"#232136\"\n },\n \"border\": {\n \"default\": \"#44415a\"\n },\n \"accent\": {\n \"link\": \"#c4a7e7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3e8fb0\",\n \"h2\": \"#c4a7e7\",\n \"h3\": \"#9ccfd8\",\n \"h4\": \"#f6c177\",\n \"h5\": \"#ea9a97\",\n \"h6\": \"#eb6f92\"\n },\n \"body\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#9591ae\"\n },\n \"link\": {\n \"default\": \"#c4a7e7\"\n },\n \"selection\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#56526e\"\n },\n \"blockquote\": {\n \"border\": \"#56526e\",\n \"fg\": \"#e0def4\",\n \"bg\": \"#2a273f\"\n },\n \"codeInline\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#393552\"\n },\n \"codeBlock\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#393552\"\n },\n \"table\": {\n \"border\": \"#56526e\",\n \"stripe\": \"#393552\",\n \"theadBg\": \"#44415a\"\n }\n }\n }\n },\n \"rose-pine\": {\n \"id\": \"rose-pine\",\n \"label\": \"Rosé Pine\",\n \"vendor\": \"rose-pine\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#191724\",\n \"surface\": \"#1f1d2e\",\n \"overlay\": \"#26233a\"\n },\n \"text\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#918dab\",\n \"inverse\": \"#191724\"\n },\n \"brand\": {\n \"primary\": \"#c4a7e7\",\n \"primaryText\": \"#191724\"\n },\n \"state\": {\n \"info\": \"#9ccfd8\",\n \"success\": \"#31748f\",\n \"warning\": \"#f6c177\",\n \"danger\": \"#eb6f92\",\n \"successText\": \"#f6f6f6\",\n \"infoText\": \"#191724\",\n \"warningText\": \"#191724\",\n \"dangerText\": \"#191724\"\n },\n \"border\": {\n \"default\": \"#403d52\"\n },\n \"accent\": {\n \"link\": \"#c4a7e7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#31748f\",\n \"h2\": \"#c4a7e7\",\n \"h3\": \"#9ccfd8\",\n \"h4\": \"#f6c177\",\n \"h5\": \"#ebbcba\",\n \"h6\": \"#eb6f92\"\n },\n \"body\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#908caa\"\n },\n \"link\": {\n \"default\": \"#c4a7e7\"\n },\n \"selection\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#524f67\"\n },\n \"blockquote\": {\n \"border\": \"#524f67\",\n \"fg\": \"#e0def4\",\n \"bg\": \"#1f1d2e\"\n },\n \"codeInline\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#26233a\"\n },\n \"codeBlock\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#26233a\"\n },\n \"table\": {\n \"border\": \"#524f67\",\n \"stripe\": \"#26233a\",\n \"theadBg\": \"#403d52\"\n }\n }\n }\n },\n \"solarized-dark\": {\n \"id\": \"solarized-dark\",\n \"label\": \"Solarized Dark\",\n \"vendor\": \"solarized\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#002b36\",\n \"surface\": \"#073642\",\n \"overlay\": \"#586e75\"\n },\n \"text\": {\n \"primary\": \"#eff2f2\",\n \"secondary\": \"#f0f2f3\",\n \"inverse\": \"#002b36\"\n },\n \"brand\": {\n \"primary\": \"#268bd2\",\n \"primaryText\": \"#001d24\"\n },\n \"state\": {\n \"info\": \"#2aa198\",\n \"success\": \"#859900\",\n \"warning\": \"#b58900\",\n \"danger\": \"#d8312e\",\n \"dangerText\": \"#ffffff\",\n \"infoText\": \"#002b36\",\n \"successText\": \"#002934\",\n \"warningText\": \"#002934\"\n },\n \"border\": {\n \"default\": \"#586e75\"\n },\n \"accent\": {\n \"link\": \"#e9f3fa\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#268bd2\",\n \"h2\": \"#2aa198\",\n \"h3\": \"#859900\",\n \"h4\": \"#b58900\",\n \"h5\": \"#ce5422\",\n \"h6\": \"#d53e87\"\n },\n \"body\": {\n \"primary\": \"#90a0a1\",\n \"secondary\": \"#91a0a6\"\n },\n \"link\": {\n \"default\": \"#e9f3fa\"\n },\n \"selection\": {\n \"fg\": \"#fdf6e3\",\n \"bg\": \"#586e75\"\n },\n \"blockquote\": {\n \"border\": \"#657b83\",\n \"fg\": \"#92a0a2\",\n \"bg\": \"#073642\"\n },\n \"codeInline\": {\n \"fg\": \"#43aca4\",\n \"bg\": \"#073642\"\n },\n \"codeBlock\": {\n \"fg\": \"#93a1a1\",\n \"bg\": \"#073642\"\n },\n \"table\": {\n \"border\": \"#586e75\",\n \"stripe\": \"#073642\",\n \"theadBg\": \"#283336\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#073642\",\n \"border\": \"#586e75\",\n \"headerBg\": \"#002b36\",\n \"footerBg\": \"#073642\"\n },\n \"message\": {\n \"bg\": \"#002b36\",\n \"headerBg\": \"#073642\",\n \"border\": \"#586e75\",\n \"bodyFg\": \"#839496\"\n },\n \"panel\": {\n \"bg\": \"#073642\",\n \"headerBg\": \"#002b36\",\n \"headerFg\": \"#93a1a1\",\n \"border\": \"#586e75\",\n \"blockBg\": \"#002b36\",\n \"blockHoverBg\": \"#073642\",\n \"blockActiveBg\": \"#586e75\"\n },\n \"box\": {\n \"bg\": \"#073642\",\n \"border\": \"#586e75\"\n },\n \"notification\": {\n \"bg\": \"#002b36\",\n \"border\": \"#586e75\"\n },\n \"modal\": {\n \"bg\": \"rgba(0, 43, 54, 0.9)\",\n \"cardBg\": \"#073642\",\n \"headerBg\": \"#002b36\",\n \"footerBg\": \"#073642\"\n },\n \"dropdown\": {\n \"bg\": \"#073642\",\n \"itemHoverBg\": \"#586e75\",\n \"border\": \"#586e75\"\n },\n \"tabs\": {\n \"border\": \"#586e75\",\n \"linkBg\": \"#073642\",\n \"linkActiveBg\": \"#002b36\",\n \"linkHoverBg\": \"#586e75\"\n }\n }\n }\n },\n \"solarized-light\": {\n \"id\": \"solarized-light\",\n \"label\": \"Solarized Light\",\n \"vendor\": \"solarized\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fdf6e3\",\n \"surface\": \"#eee8d5\",\n \"overlay\": \"#93a1a1\"\n },\n \"text\": {\n \"primary\": \"#293437\",\n \"secondary\": \"#2a3437\",\n \"inverse\": \"#fdf6e3\"\n },\n \"brand\": {\n \"primary\": \"#268bd2\",\n \"primaryText\": \"#191917\"\n },\n \"state\": {\n \"info\": \"#2aa198\",\n \"success\": \"#859900\",\n \"warning\": \"#b58900\",\n \"danger\": \"#d8312e\",\n \"infoText\": \"#262522\",\n \"successText\": \"#262522\",\n \"warningText\": \"#262522\",\n \"dangerText\": \"#fffffe\"\n },\n \"border\": {\n \"default\": \"#93a1a1\"\n },\n \"accent\": {\n \"link\": \"#0e354f\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#268bd2\",\n \"h2\": \"#26938b\",\n \"h3\": \"#7b8c00\",\n \"h4\": \"#a67e00\",\n \"h5\": \"#cb4b16\",\n \"h6\": \"#d33682\"\n },\n \"body\": {\n \"primary\": \"#52686e\",\n \"secondary\": \"#54686e\"\n },\n \"link\": {\n \"default\": \"#0e354f\"\n },\n \"selection\": {\n \"fg\": \"#002b36\",\n \"bg\": \"#93a1a1\"\n },\n \"blockquote\": {\n \"border\": \"#93a1a1\",\n \"fg\": \"#55686f\",\n \"bg\": \"#eee8d5\"\n },\n \"codeInline\": {\n \"fg\": \"#5a5ea4\",\n \"bg\": \"#eee8d5\"\n },\n \"codeBlock\": {\n \"fg\": \"#073642\",\n \"bg\": \"#eee8d5\"\n },\n \"table\": {\n \"border\": \"#93a1a1\",\n \"stripe\": \"#eee8d5\",\n \"theadBg\": \"#eee8d5\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#fdf6e3\",\n \"border\": \"#93a1a1\",\n \"headerBg\": \"#eee8d5\",\n \"footerBg\": \"#eee8d5\"\n },\n \"message\": {\n \"bg\": \"#eee8d5\",\n \"headerBg\": \"#fdf6e3\",\n \"border\": \"#93a1a1\",\n \"bodyFg\": \"#586e75\"\n },\n \"panel\": {\n \"bg\": \"#fdf6e3\",\n \"headerBg\": \"#eee8d5\",\n \"headerFg\": \"#073642\",\n \"border\": \"#93a1a1\",\n \"blockBg\": \"#eee8d5\",\n \"blockHoverBg\": \"#fdf6e3\",\n \"blockActiveBg\": \"#93a1a1\"\n },\n \"box\": {\n \"bg\": \"#fdf6e3\",\n \"border\": \"#93a1a1\"\n },\n \"notification\": {\n \"bg\": \"#eee8d5\",\n \"border\": \"#93a1a1\"\n },\n \"modal\": {\n \"bg\": \"rgba(0, 43, 54, 0.86)\",\n \"cardBg\": \"#fdf6e3\",\n \"headerBg\": \"#eee8d5\",\n \"footerBg\": \"#eee8d5\"\n },\n \"dropdown\": {\n \"bg\": \"#fdf6e3\",\n \"itemHoverBg\": \"#eee8d5\",\n \"border\": \"#93a1a1\"\n },\n \"tabs\": {\n \"border\": \"#93a1a1\",\n \"linkBg\": \"#eee8d5\",\n \"linkActiveBg\": \"#fdf6e3\",\n \"linkHoverBg\": \"#93a1a1\"\n }\n }\n }\n },\n \"terminal\": {\n \"id\": \"terminal\",\n \"label\": \"Terminal\",\n \"vendor\": \"turbo\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#0d0d0d\",\n \"surface\": \"#080808\",\n \"overlay\": \"#111111\"\n },\n \"text\": {\n \"primary\": \"#c8ffc8\",\n \"secondary\": \"#8fbc8f\",\n \"inverse\": \"#0d0d0d\"\n },\n \"brand\": {\n \"primary\": \"#39ff14\",\n \"primaryText\": \"#0d0d0d\"\n },\n \"state\": {\n \"info\": \"#7dd3fc\",\n \"success\": \"#39ff14\",\n \"warning\": \"#ffb000\",\n \"danger\": \"#ff4444\",\n \"infoText\": \"#0d0d0d\",\n \"successText\": \"#0d0d0d\",\n \"warningText\": \"#0d0d0d\",\n \"dangerText\": \"#0d0d0d\"\n },\n \"border\": {\n \"default\": \"#1f3d1f\"\n },\n \"accent\": {\n \"link\": \"#7dd3fc\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"IBM Plex Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\",\n \"mono\": \"\\\"IBM Plex Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#39ff14\",\n \"h2\": \"#7dd3fc\",\n \"h3\": \"#ffb000\",\n \"h4\": \"#39ff14\",\n \"h5\": \"#8fbc8f\",\n \"h6\": \"#c8ffc8\"\n },\n \"body\": {\n \"primary\": \"#c8ffc8\",\n \"secondary\": \"#8fbc8f\"\n },\n \"link\": {\n \"default\": \"#7dd3fc\"\n },\n \"selection\": {\n \"fg\": \"#0d0d0d\",\n \"bg\": \"#39ff14\"\n },\n \"blockquote\": {\n \"border\": \"#39ff14\",\n \"fg\": \"#8fbc8f\",\n \"bg\": \"#111111\"\n },\n \"codeInline\": {\n \"fg\": \"#ffb000\",\n \"bg\": \"#111111\"\n },\n \"codeBlock\": {\n \"fg\": \"#c8ffc8\",\n \"bg\": \"#080808\"\n },\n \"table\": {\n \"border\": \"#1f3d1f\",\n \"stripe\": \"#111111\",\n \"theadBg\": \"#080808\",\n \"headerFg\": \"#c8ffc8\"\n }\n }\n }\n },\n \"tokyo-night-dark\": {\n \"id\": \"tokyo-night-dark\",\n \"label\": \"Tokyo Night Dark\",\n \"vendor\": \"tokyo-night\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1a1b26\",\n \"surface\": \"#24283b\",\n \"overlay\": \"#28344a\"\n },\n \"text\": {\n \"primary\": \"#c0caf5\",\n \"secondary\": \"#a9b1d6\",\n \"inverse\": \"#1a1b26\"\n },\n \"brand\": {\n \"primary\": \"#7aa2f7\",\n \"primaryText\": \"#1a1b26\"\n },\n \"state\": {\n \"info\": \"#7dcfff\",\n \"success\": \"#9ece6a\",\n \"warning\": \"#e0af68\",\n \"danger\": \"#f7768e\",\n \"infoText\": \"#1a1b26\",\n \"successText\": \"#1a1b26\",\n \"warningText\": \"#1a1b26\",\n \"dangerText\": \"#1a1b26\"\n },\n \"border\": {\n \"default\": \"#565f89\"\n },\n \"accent\": {\n \"link\": \"#7aa2f7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#7aa2f7\",\n \"h2\": \"#bb9af7\",\n \"h3\": \"#7dcfff\",\n \"h4\": \"#e0af68\",\n \"h5\": \"#ff9e64\",\n \"h6\": \"#f7768e\"\n },\n \"body\": {\n \"primary\": \"#c0caf5\",\n \"secondary\": \"#a9b1d6\"\n },\n \"link\": {\n \"default\": \"#7aa2f7\"\n },\n \"selection\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"blockquote\": {\n \"border\": \"#565f89\",\n \"fg\": \"#a9b1d6\",\n \"bg\": \"#24283b\"\n },\n \"codeInline\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"codeBlock\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"table\": {\n \"border\": \"#565f89\",\n \"stripe\": \"#24283b\",\n \"theadBg\": \"#28344a\"\n }\n }\n }\n },\n \"tokyo-night-light\": {\n \"id\": \"tokyo-night-light\",\n \"label\": \"Tokyo Night Light\",\n \"vendor\": \"tokyo-night\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#e6e7ed\",\n \"surface\": \"#d5d6dc\",\n \"overlay\": \"#c8d3f5\"\n },\n \"text\": {\n \"primary\": \"#343b58\",\n \"secondary\": \"#40434f\",\n \"inverse\": \"#e6e7ed\"\n },\n \"brand\": {\n \"primary\": \"#2e7de9\",\n \"primaryText\": \"#0b0b0b\"\n },\n \"state\": {\n \"info\": \"#0089a5\",\n \"success\": \"#31876d\",\n \"warning\": \"#8c6c3e\",\n \"danger\": \"#d81159\",\n \"infoText\": \"#0c0c0c\",\n \"successText\": \"#020202\",\n \"warningText\": \"#fdfdfd\",\n \"dangerText\": \"#f7f8f9\"\n },\n \"border\": {\n \"default\": \"#b0b4ca\"\n },\n \"accent\": {\n \"link\": \"#2057a2\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#2c77dd\",\n \"h2\": \"#7847bd\",\n \"h3\": \"#00849e\",\n \"h4\": \"#8c6c3e\",\n \"h5\": \"#bc5e3b\",\n \"h6\": \"#d81159\"\n },\n \"body\": {\n \"primary\": \"#343b58\",\n \"secondary\": \"#40434f\"\n },\n \"link\": {\n \"default\": \"#2057a2\"\n },\n \"selection\": {\n \"fg\": \"#343b58\",\n \"bg\": \"#c8d3f5\"\n },\n \"blockquote\": {\n \"border\": \"#b0b4ca\",\n \"fg\": \"#40434f\",\n \"bg\": \"#e6e7ed\"\n },\n \"codeInline\": {\n \"fg\": \"#343b58\",\n \"bg\": \"#c8d3f5\"\n },\n \"codeBlock\": {\n \"fg\": \"#343b58\",\n \"bg\": \"#c8d3f5\"\n },\n \"table\": {\n \"border\": \"#b0b4ca\",\n \"stripe\": \"#e6e7ed\",\n \"theadBg\": \"#c8d3f5\"\n }\n }\n }\n },\n \"tokyo-night-storm\": {\n \"id\": \"tokyo-night-storm\",\n \"label\": \"Tokyo Night Storm\",\n \"vendor\": \"tokyo-night\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#24283b\",\n \"surface\": \"#28344a\",\n \"overlay\": \"#565f89\"\n },\n \"text\": {\n \"primary\": \"#dbe1f9\",\n \"secondary\": \"#dee1ef\",\n \"inverse\": \"#24283b\"\n },\n \"brand\": {\n \"primary\": \"#7aa2f7\",\n \"primaryText\": \"#24283b\"\n },\n \"state\": {\n \"info\": \"#7dcfff\",\n \"success\": \"#9ece6a\",\n \"warning\": \"#e0af68\",\n \"danger\": \"#f7768e\",\n \"infoText\": \"#24283b\",\n \"successText\": \"#24283b\",\n \"warningText\": \"#24283b\",\n \"dangerText\": \"#24283b\"\n },\n \"border\": {\n \"default\": \"#565f89\"\n },\n \"accent\": {\n \"link\": \"#d6e2fd\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#7aa2f7\",\n \"h2\": \"#bb9af7\",\n \"h3\": \"#7dcfff\",\n \"h4\": \"#e0af68\",\n \"h5\": \"#ff9e64\",\n \"h6\": \"#f7768e\"\n },\n \"body\": {\n \"primary\": \"#c0caf5\",\n \"secondary\": \"#a9b1d6\"\n },\n \"link\": {\n \"default\": \"#d6e2fd\"\n },\n \"selection\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"blockquote\": {\n \"border\": \"#565f89\",\n \"fg\": \"#a9b1d6\",\n \"bg\": \"#28344a\"\n },\n \"codeInline\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"codeBlock\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"table\": {\n \"border\": \"#565f89\",\n \"stripe\": \"#28344a\",\n \"theadBg\": \"#28344a\"\n }\n }\n }\n }\n },\n \"byVendor\": {\n \"ayu\": {\n \"name\": \"Ayu\",\n \"homepage\": \"https://github.com/ayu-theme\",\n \"themes\": [\n \"ayu-dark\",\n \"ayu-light\",\n \"ayu-mirage\"\n ]\n },\n \"bulma\": {\n \"name\": \"Bulma\",\n \"homepage\": \"https://bulma.io/\",\n \"themes\": [\n \"bulma-dark\",\n \"bulma-light\"\n ]\n },\n \"catppuccin\": {\n \"name\": \"Catppuccin (synced)\",\n \"homepage\": \"https://catppuccin.com/palette/\",\n \"themes\": [\n \"catppuccin-frappe\",\n \"catppuccin-latte\",\n \"catppuccin-macchiato\",\n \"catppuccin-mocha\"\n ]\n },\n \"dracula\": {\n \"name\": \"Dracula\",\n \"homepage\": \"https://draculatheme.com/\",\n \"themes\": [\n \"dracula\"\n ]\n },\n \"everforest\": {\n \"name\": \"Everforest\",\n \"homepage\": \"https://github.com/sainnhe/everforest\",\n \"themes\": [\n \"everforest-dark-hard\",\n \"everforest-dark-soft\",\n \"everforest-dark\",\n \"everforest-light-hard\",\n \"everforest-light-soft\",\n \"everforest-light\"\n ]\n },\n \"github\": {\n \"name\": \"GitHub (synced)\",\n \"homepage\": \"https://primer.style/\",\n \"themes\": [\n \"github-dark\",\n \"github-light\"\n ]\n },\n \"gruvbox\": {\n \"name\": \"Gruvbox\",\n \"homepage\": \"https://github.com/morhetz/gruvbox\",\n \"themes\": [\n \"gruvbox-dark-hard\",\n \"gruvbox-dark-soft\",\n \"gruvbox-dark\",\n \"gruvbox-light-hard\",\n \"gruvbox-light-soft\",\n \"gruvbox-light\"\n ]\n },\n \"kanagawa\": {\n \"name\": \"Kanagawa\",\n \"homepage\": \"https://github.com/rebelot/kanagawa.nvim\",\n \"themes\": [\n \"kanagawa-dragon\",\n \"kanagawa-lotus\",\n \"kanagawa-wave\"\n ]\n },\n \"nord\": {\n \"name\": \"Nord\",\n \"homepage\": \"https://www.nordtheme.com/\",\n \"themes\": [\n \"nord\"\n ]\n },\n \"one-dark\": {\n \"name\": \"One\",\n \"homepage\": \"https://github.com/Binaryify/OneDark-Pro\",\n \"themes\": [\n \"one-dark\",\n \"one-light\"\n ]\n },\n \"radix\": {\n \"name\": \"Radix Colors (synced)\",\n \"homepage\": \"https://www.radix-ui.com/colors\",\n \"themes\": [\n \"radix-mauve-dark\",\n \"radix-mauve-light\",\n \"radix-slate-dark\",\n \"radix-slate-light\"\n ]\n },\n \"rose-pine\": {\n \"name\": \"Rosé Pine (synced)\",\n \"homepage\": \"https://rosepinetheme.com/\",\n \"themes\": [\n \"rose-pine-dawn\",\n \"rose-pine-moon\",\n \"rose-pine\"\n ]\n },\n \"solarized\": {\n \"name\": \"Solarized\",\n \"homepage\": \"https://ethanschoonover.com/solarized/\",\n \"themes\": [\n \"solarized-dark\",\n \"solarized-light\"\n ]\n },\n \"turbo\": {\n \"name\": \"Terminal\",\n \"homepage\": \"https://github.com/lgtm-hq/turbo-themes\",\n \"themes\": [\n \"terminal\"\n ]\n },\n \"tokyo-night\": {\n \"name\": \"Tokyo Night\",\n \"homepage\": \"https://github.com/enkia/tokyo-night-vscode-theme\",\n \"themes\": [\n \"tokyo-night-dark\",\n \"tokyo-night-light\",\n \"tokyo-night-storm\"\n ]\n }\n }\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Platform-agnostic design tokens export\n *\n * This module exports pure theme data (colors, typography, etc.) without\n * any DOM, CSS, or platform-specific code. Use this for:\n *\n * - React Native apps\n * - Flutter apps (via JSON export)\n * - iOS/Android native apps\n * - Any platform that needs theme colors\n *\n * For web apps, you can also import the CSS files directly:\n * import '@lgtm-hq/turbo-themes/css/catppuccin-mocha.css'\n */\nexport { THEME_IDS } from '../themes/theme-ids.js';\n// Import tokens data (copied from dist/tokens.json during build)\nimport tokensData from '../themes/tokens.json' with { type: 'json' };\nconst tokens = tokensData;\n/**\n * All available theme flavors as a flat array\n */\nexport const flavors = Object.values(tokens.themes).map((theme) => ({\n id: theme.id,\n label: theme.label,\n vendor: theme.vendor,\n appearance: theme.appearance,\n ...(theme.iconUrl !== undefined && { iconUrl: theme.iconUrl }),\n tokens: theme.tokens,\n}));\n/**\n * Theme flavors indexed by ID for quick lookup\n */\nexport const themesById = /*#__PURE__*/ Object.fromEntries(flavors.map((flavor) => [flavor.id, flavor]));\n/**\n * All available theme packages (grouped by vendor)\n */\nexport const packages = /*#__PURE__*/ Object.fromEntries(Object.entries(tokens.byVendor).map(([vendorId, vendor]) => [\n vendorId,\n {\n id: vendorId,\n name: vendor.name,\n homepage: vendor.homepage,\n flavors: vendor.themes.map((themeId) => themesById[themeId]).filter(Boolean),\n },\n]));\n/**\n * Get a theme by ID\n * @param id - Theme identifier (e.g., 'catppuccin-mocha')\n * @returns The theme flavor or undefined if not found\n */\nexport function getTheme(id) {\n return themesById[id];\n}\n/**\n * Get theme tokens by ID (convenience function)\n * @param id - Theme identifier (e.g., 'catppuccin-mocha')\n * @returns The theme tokens or undefined if not found\n */\nexport function getTokens(id) {\n return themesById[id]?.tokens;\n}\n/**\n * Get all themes matching an appearance (light/dark)\n * @param appearance - 'light' or 'dark'\n * @returns Array of matching theme flavors\n */\nexport function getThemesByAppearance(appearance) {\n return flavors.filter((f) => f.appearance === appearance);\n}\n/**\n * Get all themes from a specific vendor\n * @param vendor - Vendor name (e.g., 'catppuccin', 'github')\n * @returns Array of matching theme flavors\n */\nexport function getThemesByVendor(vendor) {\n return flavors.filter((f) => f.vendor === vendor);\n}\n/**\n * List of all available theme IDs\n */\nexport const themeIds = /*#__PURE__*/ flavors.map((f) => f.id);\n/**\n * List of all available vendors\n */\nexport const vendors = /*#__PURE__*/ [...new Set(flavors.map((f) => f.vendor))];\n//# sourceMappingURL=index.js.map","// SPDX-License-Identifier: MIT\n// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY\n// Generated from: schema/tokens/themes/*.tokens.json + schema/tokens/_vendors.json\n// Generator: scripts/codegen/generate-metadata.mjs\n// Run: bun run generate:metadata\n/**\n * All theme IDs as a readonly tuple (sorted by token filename).\n * Used to derive the {@link ThemeId} literal union.\n */\nexport const THEME_IDS = [\n 'ayu-dark',\n 'ayu-light',\n 'ayu-mirage',\n 'bulma-dark',\n 'bulma-light',\n 'catppuccin-frappe',\n 'catppuccin-latte',\n 'catppuccin-macchiato',\n 'catppuccin-mocha',\n 'dracula',\n 'everforest-dark-hard',\n 'everforest-dark-soft',\n 'everforest-dark',\n 'everforest-light-hard',\n 'everforest-light-soft',\n 'everforest-light',\n 'github-dark',\n 'github-light',\n 'gruvbox-dark-hard',\n 'gruvbox-dark-soft',\n 'gruvbox-dark',\n 'gruvbox-light-hard',\n 'gruvbox-light-soft',\n 'gruvbox-light',\n 'kanagawa-dragon',\n 'kanagawa-lotus',\n 'kanagawa-wave',\n 'nord',\n 'one-dark',\n 'one-light',\n 'radix-mauve-dark',\n 'radix-mauve-light',\n 'radix-slate-dark',\n 'radix-slate-light',\n 'rose-pine-dawn',\n 'rose-pine-moon',\n 'rose-pine',\n 'solarized-dark',\n 'solarized-light',\n 'terminal',\n 'tokyo-night-dark',\n 'tokyo-night-light',\n 'tokyo-night-storm',\n];\n/**\n * Ordered list of vendor IDs controlling display order in dropdowns.\n * Source: schema/tokens/_vendors.json\n */\nexport const VENDOR_ORDER = [\n 'catppuccin',\n 'dracula',\n 'everforest',\n 'gruvbox',\n 'github',\n 'bulma',\n 'nord',\n 'radix',\n 'solarized',\n 'rose-pine',\n 'tokyo-night',\n 'kanagawa',\n 'one-dark',\n 'ayu',\n 'turbo',\n];\n/** Per-theme human-readable descriptions for UI pickers. */\nexport const THEME_DESCRIPTIONS = {\n \"ayu-dark\": \"Deep Ayu dark theme for low-light environments.\",\n \"ayu-light\": \"Bright Ayu palette designed for comfortable daytime coding.\",\n \"ayu-mirage\": \"Soft dark Ayu variant with subtle, muted accents.\",\n \"bulma-dark\": \"Dark Bulma theme tuned for low-light reading.\",\n \"bulma-light\": \"Classic Bulma look with a bright, neutral palette.\",\n \"catppuccin-frappe\": \"Balanced dark Catppuccin theme for focused work.\",\n \"catppuccin-latte\": \"Light, soft Catppuccin palette for daytime use.\",\n \"catppuccin-macchiato\": \"Deep, atmospheric Catppuccin variant with rich contrast.\",\n \"catppuccin-mocha\": \"Cozy, high-contrast Catppuccin theme for late-night sessions.\",\n \"dracula\": \"Iconic Dracula dark theme with vibrant accents.\",\n \"everforest-dark-hard\": \"Highest contrast dark Everforest palette with deep forest shadows.\",\n \"everforest-dark-soft\": \"Softer dark Everforest palette with reduced contrast.\",\n \"everforest-dark\": \"Classic Everforest dark palette with warm, natural greens.\",\n \"everforest-light-hard\": \"Bright, crisp Everforest light palette with extra contrast.\",\n \"everforest-light-soft\": \"Soft, low-contrast Everforest light palette for long sessions.\",\n \"everforest-light\": \"Classic Everforest light palette with warm paper tones.\",\n \"github-dark\": \"GitHub dark theme optimized for code-heavy views.\",\n \"github-light\": \"GitHub-inspired light theme suited for documentation and UI heavy pages.\",\n \"gruvbox-dark-hard\": \"Highest contrast dark Gruvbox palette with deep shadows.\",\n \"gruvbox-dark-soft\": \"Softer dark Gruvbox palette with reduced contrast.\",\n \"gruvbox-dark\": \"Classic Gruvbox dark palette with warm, muted tones.\",\n \"gruvbox-light-hard\": \"Bright, crisp Gruvbox light palette with extra contrast.\",\n \"gruvbox-light-soft\": \"Soft, low-contrast Gruvbox light palette for long sessions.\",\n \"gruvbox-light\": \"Classic Gruvbox light palette with warm paper tones.\",\n \"kanagawa-dragon\": \"Darker Kanagawa variant for late-night sessions.\",\n \"kanagawa-lotus\": \"Light Kanagawa palette for daytime use.\",\n \"kanagawa-wave\": \"Heart-warming dark Kanagawa palette inspired by The Great Wave.\",\n \"nord\": \"Arctic, north-bluish color palette inspired by the polar night.\",\n \"one-dark\": \"The classic Atom One Dark palette with vivid syntax accents.\",\n \"one-light\": \"Companion One Light palette for bright, daytime editing.\",\n \"radix-mauve-dark\": \"Neutral purple-gray Radix dark theme for accessible UIs.\",\n \"radix-mauve-light\": \"Neutral purple-gray Radix light theme for accessible UIs.\",\n \"radix-slate-dark\": \"Neutral blue-gray Radix dark theme for accessible UIs.\",\n \"radix-slate-light\": \"Neutral blue-gray Radix light theme for accessible UIs.\",\n \"rose-pine-dawn\": \"Light Rosé Pine variant for daytime use.\",\n \"rose-pine-moon\": \"Deeper variant of Rosé Pine with enhanced contrast.\",\n \"rose-pine\": \"Elegant dark theme with natural pine and soho vibes.\",\n \"solarized-dark\": \"Solarized Dark with a balanced, low-contrast palette.\",\n \"solarized-light\": \"Solarized Light tuned for bright, daylight-friendly UIs.\",\n \"terminal\": \"CRT phosphor green on void with IBM Plex Mono.\",\n \"tokyo-night-dark\": \"Deep midnight blues with neon accents.\",\n \"tokyo-night-light\": \"Clean daylight palette inspired by Tokyo mornings.\",\n \"tokyo-night-storm\": \"Stormy variant with richer contrast and depth.\"\n};\n/** Per-theme icon filenames relative to assets/img/. */\nexport const THEME_ICONS = {\n \"ayu-dark\": \"ayu-dark.png\",\n \"ayu-light\": \"ayu-light.png\",\n \"ayu-mirage\": \"ayu-mirage.png\",\n \"bulma-dark\": \"bulma-logo-dark.png\",\n \"bulma-light\": \"bulma-logo.png\",\n \"catppuccin-frappe\": \"catppuccin-logo-macchiato.png\",\n \"catppuccin-latte\": \"catppuccin-logo-latte.png\",\n \"catppuccin-macchiato\": \"catppuccin-logo-macchiato.png\",\n \"catppuccin-mocha\": \"catppuccin-logo-macchiato.png\",\n \"dracula\": \"dracula-logo.png\",\n \"everforest-dark-hard\": \"everforest-dark-hard.png\",\n \"everforest-dark-soft\": \"everforest-dark-soft.png\",\n \"everforest-dark\": \"everforest-dark.png\",\n \"everforest-light-hard\": \"everforest-light-hard.png\",\n \"everforest-light-soft\": \"everforest-light-soft.png\",\n \"everforest-light\": \"everforest-light.png\",\n \"github-dark\": \"github-logo-dark.png\",\n \"github-light\": \"github-logo-light.png\",\n \"gruvbox-dark-hard\": \"gruvbox-dark-hard.png\",\n \"gruvbox-dark-soft\": \"gruvbox-dark-soft.png\",\n \"gruvbox-dark\": \"gruvbox-dark.png\",\n \"gruvbox-light-hard\": \"gruvbox-light-hard.png\",\n \"gruvbox-light-soft\": \"gruvbox-light-soft.png\",\n \"gruvbox-light\": \"gruvbox-light.png\",\n \"kanagawa-dragon\": \"kanagawa-dragon.png\",\n \"kanagawa-lotus\": \"kanagawa-lotus.png\",\n \"kanagawa-wave\": \"kanagawa-wave.png\",\n \"nord\": \"nord.png\",\n \"one-dark\": \"one-dark.png\",\n \"one-light\": \"one-light.png\",\n \"radix-mauve-dark\": \"radix-slate-dark.png\",\n \"radix-mauve-light\": \"radix-slate-light.png\",\n \"radix-slate-dark\": \"radix-slate-dark.png\",\n \"radix-slate-light\": \"radix-slate-light.png\",\n \"rose-pine-dawn\": \"rose-pine.png\",\n \"rose-pine-moon\": \"rose-pine.png\",\n \"rose-pine\": \"rose-pine.png\",\n \"solarized-dark\": \"solarized-dark.png\",\n \"solarized-light\": \"solarized-light.png\",\n \"terminal\": \"terminal.png\",\n \"tokyo-night-dark\": \"tokyo-night.png\",\n \"tokyo-night-light\": \"tokyo-night.png\",\n \"tokyo-night-storm\": \"tokyo-night.png\"\n};\n/** Per-vendor default icons (filename or light/dark pair). */\nexport const VENDOR_ICONS = {\n \"catppuccin\": {\n \"light\": \"catppuccin-logo-latte.png\",\n \"dark\": \"catppuccin-logo-macchiato.png\"\n },\n \"dracula\": \"dracula-logo.png\",\n \"everforest\": {\n \"light\": \"everforest-light.png\",\n \"dark\": \"everforest-dark.png\"\n },\n \"gruvbox\": {\n \"light\": \"gruvbox-light.png\",\n \"dark\": \"gruvbox-dark.png\"\n },\n \"github\": {\n \"light\": \"github-logo-light.png\",\n \"dark\": \"github-logo-dark.png\"\n },\n \"bulma\": {\n \"light\": \"bulma-logo.png\",\n \"dark\": \"bulma-logo-dark.png\"\n },\n \"nord\": \"nord.png\",\n \"radix\": {\n \"light\": \"radix-slate-light.png\",\n \"dark\": \"radix-slate-dark.png\"\n },\n \"solarized\": {\n \"light\": \"solarized-light.png\",\n \"dark\": \"solarized-dark.png\"\n },\n \"rose-pine\": \"rose-pine.png\",\n \"tokyo-night\": \"tokyo-night.png\",\n \"kanagawa\": {\n \"light\": \"kanagawa-lotus.png\",\n \"dark\": \"kanagawa-wave.png\"\n },\n \"one-dark\": {\n \"light\": \"one-light.png\",\n \"dark\": \"one-dark.png\"\n },\n \"ayu\": {\n \"light\": \"ayu-light.png\",\n \"dark\": \"ayu-dark.png\"\n },\n \"turbo\": \"terminal.png\"\n};\n/** Per-vendor family display metadata. */\nexport const VENDOR_FAMILY_META = {\n \"catppuccin\": {\n \"name\": \"Catppuccin\",\n \"description\": \"Soothing pastel themes\"\n },\n \"dracula\": {\n \"name\": \"Dracula\",\n \"description\": \"Dark vampire aesthetic\"\n },\n \"everforest\": {\n \"name\": \"Everforest\",\n \"description\": \"Green-based, nature-inspired palette designed for eye comfort\"\n },\n \"gruvbox\": {\n \"name\": \"Gruvbox\",\n \"description\": \"Retro groove palette with warm, earthy tones\"\n },\n \"github\": {\n \"name\": \"GitHub\",\n \"description\": \"GitHub-inspired themes\"\n },\n \"bulma\": {\n \"name\": \"Bulma\",\n \"description\": \"Classic Bulma themes\"\n },\n \"nord\": {\n \"name\": \"Nord\",\n \"description\": \"Arctic, north-bluish color palette\"\n },\n \"radix\": {\n \"name\": \"Radix Colors\",\n \"description\": \"Accessibility-focused color system with comprehensive scales\"\n },\n \"solarized\": {\n \"name\": \"Solarized\",\n \"description\": \"Precision-balanced light and dark modes\"\n },\n \"rose-pine\": {\n \"name\": \"Rosé Pine\",\n \"description\": \"All natural pine, faux fur and a bit of soho vibes\"\n },\n \"tokyo-night\": {\n \"name\": \"Tokyo Night\",\n \"description\": \"Neon-infused nightscape with crisp contrast\"\n },\n \"kanagawa\": {\n \"name\": \"Kanagawa\",\n \"description\": \"Japanese-inspired palette drawn from The Great Wave off Kanagawa\"\n },\n \"one-dark\": {\n \"name\": \"One\",\n \"description\": \"The iconic Atom editor palette in dark and light\"\n },\n \"ayu\": {\n \"name\": \"Ayu\",\n \"description\": \"Bright colors designed for comfortable all-day coding\"\n },\n \"turbo\": {\n \"name\": \"Terminal\",\n \"description\": \"CRT phosphor green on void\"\n }\n};\n//# sourceMappingURL=metadata.js.map","// SPDX-License-Identifier: MIT\n/**\n * Consolidated theme metadata derived from tokens.json.\n *\n * All display metadata (names, appearances, vendor groups) is computed from\n * the canonical token data at module evaluation time. Consumers should import\n * from here instead of maintaining their own hardcoded copies.\n *\n * Vendor order and ThemeId come from build-time codegen\n * (`packages/core/src/themes/generated/metadata.ts`).\n */\nimport { flavors, themeIds, packages } from '../tokens/index.js';\nimport { VENDOR_ORDER as GENERATED_VENDOR_ORDER } from './generated/metadata.js';\nexport { THEME_IDS, THEME_DESCRIPTIONS, THEME_ICONS, VENDOR_ICONS, VENDOR_FAMILY_META, } from './generated/metadata.js';\n/** Default theme applied when no preference is stored. */\nexport const DEFAULT_THEME = 'catppuccin-mocha';\n/** All valid theme IDs (re-export for convenience). */\nexport const VALID_THEMES = themeIds;\n/** Set of valid theme IDs for O(1) lookup. */\nexport const VALID_THEME_SET = /*#__PURE__*/ new Set(themeIds);\n/** Full human-readable label for each theme (e.g., \"Catppuccin Mocha\"). */\nexport const THEME_NAMES = /*#__PURE__*/ Object.fromEntries(flavors.map((f) => [f.id, f.label]));\n/** Appearance (light/dark) for each theme. */\nexport const THEME_APPEARANCES = \n/*#__PURE__*/ Object.fromEntries(flavors.map((f) => [f.id, f.appearance]));\n/**\n * Ordered list of vendor IDs controlling display order in dropdowns.\n * Generated from schema/tokens/_vendors.json — do not edit by hand.\n */\nexport const VENDOR_ORDER = GENERATED_VENDOR_ORDER;\n/**\n * Ordered array of vendor groups derived from packages + VENDOR_ORDER.\n * The \"(synced)\" suffix is stripped from display names.\n */\n// Dev-time validation: warn if packages has vendors not listed in VENDOR_ORDER\nconst _packageKeys = Object.keys(packages);\nconst _missingFromOrder = _packageKeys.filter((id) => !VENDOR_ORDER.includes(id));\nif (_missingFromOrder.length > 0) {\n console.warn(`[metadata] VENDOR_ORDER is missing vendor IDs present in packages: ${_missingFromOrder.join(', ')}. ` +\n 'Append them to schema/tokens/_vendors.json and regenerate metadata.');\n}\nexport const VENDOR_GROUPS = /*#__PURE__*/ VENDOR_ORDER.filter((id) => id in packages).map((id) => {\n const pkg = packages[id];\n return {\n id,\n displayName: pkg.name.replace(/\\s*\\(synced\\)\\s*/i, ''),\n themeIds: pkg.flavors.flatMap((f) => (f ? [f.id] : [])),\n };\n});\n/** O(1) flavor lookup by ID, built once at module evaluation time. */\nconst flavorById = /*#__PURE__*/ new Map(flavors.map((f) => [f.id, f]));\n/** Cache for computed short labels. */\nconst shortLabelCache = new Map();\n/**\n * Strip the vendor prefix from a theme label to produce a short label.\n *\n * For single-flavor vendors (e.g., \"Dracula\", \"Nord\") the full label is returned.\n * For multi-flavor vendors the vendor name prefix is stripped:\n * \"Catppuccin Mocha\" -> \"Mocha\"\n * \"Gruvbox Dark Hard\" -> \"Dark Hard\"\n *\n * @param themeId - A valid theme ID\n * @returns The short display label, or the full label if the theme is not found\n */\nexport function getShortLabel(themeId) {\n const cached = shortLabelCache.get(themeId);\n if (cached !== undefined)\n return cached;\n const flavor = flavorById.get(themeId);\n if (!flavor)\n return themeId;\n const vendorPkg = packages[flavor.vendor];\n if (!vendorPkg) {\n shortLabelCache.set(themeId, flavor.label);\n return flavor.label;\n }\n // Single-flavor vendors keep their full label\n if (vendorPkg.flavors.length === 1) {\n shortLabelCache.set(themeId, flavor.label);\n return flavor.label;\n }\n // Strip vendor display name prefix (case-insensitive, NFC-normalized for\n // consistent handling of composed/decomposed Unicode accents).\n const displayName = vendorPkg.name.replace(/\\s*\\(synced\\)\\s*/i, '').normalize('NFC');\n const label = flavor.label;\n let result;\n if (label.normalize('NFC').toLowerCase().startsWith(displayName.toLowerCase())) {\n const stripped = label.slice(displayName.length).trim();\n result = stripped || label;\n }\n else {\n result = label;\n }\n shortLabelCache.set(themeId, result);\n return result;\n}\n/** Pre-computed short labels for all themes. */\nexport const THEME_SHORT_LABELS = \n/*#__PURE__*/ Object.fromEntries(flavors.map((f) => [f.id, getShortLabel(f.id)]));\n//# sourceMappingURL=metadata.js.map","// SPDX-License-Identifier: MIT\n/**\n * Consumer theme curation API.\n *\n * `createThemeCatalog()` provides a single, composable surface for selecting a\n * subset of themes. It composes with the existing `flavors` (tokens) and\n * `VENDOR_GROUPS` (metadata) so consumers no longer need to hand-slice arrays.\n *\n * Filter precedence:\n * all themes -> vendors/appearances -> include -> exclude\n *\n * Invalid IDs supplied to `include`/`exclude` warn in development (never\n * throw), so a typo cannot silently drop or duplicate a theme.\n */\nimport { flavors, themeIds as allThemeIds } from '../tokens/index.js';\nimport { VENDOR_GROUPS } from '../themes/metadata.js';\nconst KNOWN_THEME_IDS = new Set(allThemeIds);\n/**\n * Emit a dev-time warning for unknown IDs. The `typeof` guard is safe even\n * when `process` is an undeclared identifier (browsers/workers without a\n * shim), and keeps the contiguous `process.env.NODE_ENV` token sequence so\n * bundler define-replacement and dead-code elimination still apply.\n */\nfunction warnInvalidIds(source, ids) {\n if (ids.length === 0)\n return;\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production')\n return;\n console.warn(`[catalog] createThemeCatalog: ignoring unknown ${source} theme ID(s): ${ids.join(', ')}. ` +\n 'Valid IDs come from the exported `themeIds`.');\n}\n/**\n * Build a curated {@link ThemeCatalog} from the full theme set.\n *\n * @param options - Vendor/appearance filters plus explicit include/exclude IDs.\n * @returns A catalog exposing `themeIds`, `flavors`, and `vendorGroups`.\n */\nexport function createThemeCatalog(options = {}) {\n const { vendors, appearances, include = [], exclude = [] } = options;\n const selected = new Set();\n for (const flavor of flavors) {\n if (vendors !== undefined && !vendors.includes(flavor.vendor))\n continue;\n if (appearances !== undefined && !appearances.includes(flavor.appearance))\n continue;\n selected.add(flavor.id);\n }\n const invalidInclude = [];\n for (const id of include) {\n if (KNOWN_THEME_IDS.has(id)) {\n selected.add(id);\n }\n else {\n invalidInclude.push(id);\n }\n }\n warnInvalidIds('include', invalidInclude);\n const invalidExclude = [];\n for (const id of exclude) {\n if (KNOWN_THEME_IDS.has(id)) {\n selected.delete(id);\n }\n else {\n invalidExclude.push(id);\n }\n }\n warnInvalidIds('exclude', invalidExclude);\n const selectedFlavors = flavors.filter((flavor) => selected.has(flavor.id));\n const selectedThemeIds = selectedFlavors.map((flavor) => flavor.id);\n const vendorGroups = VENDOR_GROUPS.map((group) => ({\n ...group,\n themeIds: group.themeIds.filter((id) => selected.has(id)),\n })).filter((group) => group.themeIds.length > 0);\n return {\n themeIds: selectedThemeIds,\n flavors: selectedFlavors,\n vendorGroups,\n };\n}\n//# sourceMappingURL=create.js.map","// SPDX-License-Identifier: MIT\n/**\n * Named theme presets built on top of {@link createThemeCatalog}.\n *\n * These provide opinionated defaults so consumers don't rebuild the same\n * \"minimal\" or \"dark-only\" lists in every app. Per-vendor sets are derived\n * from the `packages` keys, so new vendor variants appear automatically on\n * upgrade for opted-in vendors.\n */\nimport { packages } from '../tokens/index.js';\nimport { createThemeCatalog } from './create.js';\n/**\n * The curated \"minimal\" starter set: one light + one dark theme from the two\n * most common vendors.\n */\nconst MINIMAL_THEME_IDS = [\n 'catppuccin-mocha',\n 'catppuccin-latte',\n 'github-light',\n 'github-dark',\n];\nconst perVendorSets = Object.fromEntries(Object.keys(packages).map((vendor) => [vendor, createThemeCatalog({ vendors: [vendor] })]));\nexport const themeSets = {\n ...perVendorSets,\n minimal: createThemeCatalog({ vendors: [], include: MINIMAL_THEME_IDS }),\n dark: createThemeCatalog({ appearances: ['dark'] }),\n light: createThemeCatalog({ appearances: ['light'] }),\n};\n//# sourceMappingURL=sets.js.map","// SPDX-License-Identifier: MIT\n/**\n * Theme appearance (light/dark) resolution for DOM attributes.\n */\n\nimport { THEME_APPEARANCES } from '@lgtm-hq/turbo-themes-core';\n\nexport type ThemeAppearance = 'light' | 'dark';\n\n/**\n * Resolves light/dark appearance for a theme ID.\n *\n * Falls back to `'dark'` when the theme is unknown (e.g. custom themes without\n * an explicit mapping).\n */\nexport function resolveThemeAppearance(\n themeId: string,\n appearances: Readonly<Record<string, ThemeAppearance>> = THEME_APPEARANCES,\n): ThemeAppearance {\n return appearances[themeId] ?? 'dark';\n}\n","// SPDX-License-Identifier: MIT\n// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY\n// Generated from: schema/tokens/themes/*.tokens.json + schema/tokens/_vendors.json\n// Generator: scripts/codegen/generate-metadata.mjs\n// Run: bun run generate:metadata\n\n/** Theme family identifiers (one per vendor). */\nexport type ThemeFamily =\n | 'catppuccin'\n | 'dracula'\n | 'everforest'\n | 'gruvbox'\n | 'github'\n | 'bulma'\n | 'nord'\n | 'radix'\n | 'solarized'\n | 'rose-pine'\n | 'tokyo-night'\n | 'kanagawa'\n | 'one-dark'\n | 'ayu'\n | 'turbo';\n\nexport interface ThemeFamilyMeta {\n name: string;\n description: string;\n}\n\n/** Family display metadata keyed by ThemeFamily. */\nexport const THEME_FAMILIES: Record<ThemeFamily, ThemeFamilyMeta> = {\n \"catppuccin\": {\n \"name\": \"Catppuccin\",\n \"description\": \"Soothing pastel themes\"\n },\n \"dracula\": {\n \"name\": \"Dracula\",\n \"description\": \"Dark vampire aesthetic\"\n },\n \"everforest\": {\n \"name\": \"Everforest\",\n \"description\": \"Green-based, nature-inspired palette designed for eye comfort\"\n },\n \"gruvbox\": {\n \"name\": \"Gruvbox\",\n \"description\": \"Retro groove palette with warm, earthy tones\"\n },\n \"github\": {\n \"name\": \"GitHub\",\n \"description\": \"GitHub-inspired themes\"\n },\n \"bulma\": {\n \"name\": \"Bulma\",\n \"description\": \"Classic Bulma themes\"\n },\n \"nord\": {\n \"name\": \"Nord\",\n \"description\": \"Arctic, north-bluish color palette\"\n },\n \"radix\": {\n \"name\": \"Radix Colors\",\n \"description\": \"Accessibility-focused color system with comprehensive scales\"\n },\n \"solarized\": {\n \"name\": \"Solarized\",\n \"description\": \"Precision-balanced light and dark modes\"\n },\n \"rose-pine\": {\n \"name\": \"Rosé Pine\",\n \"description\": \"All natural pine, faux fur and a bit of soho vibes\"\n },\n \"tokyo-night\": {\n \"name\": \"Tokyo Night\",\n \"description\": \"Neon-infused nightscape with crisp contrast\"\n },\n \"kanagawa\": {\n \"name\": \"Kanagawa\",\n \"description\": \"Japanese-inspired palette drawn from The Great Wave off Kanagawa\"\n },\n \"one-dark\": {\n \"name\": \"One\",\n \"description\": \"The iconic Atom editor palette in dark and light\"\n },\n \"ayu\": {\n \"name\": \"Ayu\",\n \"description\": \"Bright colors designed for comfortable all-day coding\"\n },\n \"turbo\": {\n \"name\": \"Terminal\",\n \"description\": \"CRT phosphor green on void\"\n }\n};\n\n/**\n * Fallback family when a vendor is missing from {@link VENDOR_FAMILY_MAP}.\n * First entry in schema/tokens/_vendors.json (display order).\n */\nexport const DEFAULT_FAMILY: ThemeFamily = 'catppuccin';\n\n/** Vendor to family mapping. */\nexport const VENDOR_FAMILY_MAP: Record<string, ThemeFamily> = {\n \"catppuccin\": \"catppuccin\",\n \"dracula\": \"dracula\",\n \"everforest\": \"everforest\",\n \"gruvbox\": \"gruvbox\",\n \"github\": \"github\",\n \"bulma\": \"bulma\",\n \"nord\": \"nord\",\n \"radix\": \"radix\",\n \"solarized\": \"solarized\",\n \"rose-pine\": \"rose-pine\",\n \"tokyo-night\": \"tokyo-night\",\n \"kanagawa\": \"kanagawa\",\n \"one-dark\": \"one-dark\",\n \"ayu\": \"ayu\",\n \"turbo\": \"turbo\"\n};\n\n/** Icon configuration - string for single icon, object for appearance-specific. */\nexport interface AppearanceIcons {\n light: string;\n dark: string;\n}\n\n/** Vendor icon paths relative to the published package root (assets/img/...). */\nexport const VENDOR_ICON_MAP: Record<string, string | AppearanceIcons> = {\n \"catppuccin\": {\n \"light\": \"assets/img/catppuccin-logo-latte.png\",\n \"dark\": \"assets/img/catppuccin-logo-macchiato.png\"\n },\n \"dracula\": \"assets/img/dracula-logo.png\",\n \"everforest\": {\n \"light\": \"assets/img/everforest-light.png\",\n \"dark\": \"assets/img/everforest-dark.png\"\n },\n \"gruvbox\": {\n \"light\": \"assets/img/gruvbox-light.png\",\n \"dark\": \"assets/img/gruvbox-dark.png\"\n },\n \"github\": {\n \"light\": \"assets/img/github-logo-light.png\",\n \"dark\": \"assets/img/github-logo-dark.png\"\n },\n \"bulma\": {\n \"light\": \"assets/img/bulma-logo.png\",\n \"dark\": \"assets/img/bulma-logo-dark.png\"\n },\n \"nord\": \"assets/img/nord.png\",\n \"radix\": {\n \"light\": \"assets/img/radix-slate-light.png\",\n \"dark\": \"assets/img/radix-slate-dark.png\"\n },\n \"solarized\": {\n \"light\": \"assets/img/solarized-light.png\",\n \"dark\": \"assets/img/solarized-dark.png\"\n },\n \"rose-pine\": \"assets/img/rose-pine.png\",\n \"tokyo-night\": \"assets/img/tokyo-night.png\",\n \"kanagawa\": {\n \"light\": \"assets/img/kanagawa-lotus.png\",\n \"dark\": \"assets/img/kanagawa-wave.png\"\n },\n \"one-dark\": {\n \"light\": \"assets/img/one-light.png\",\n \"dark\": \"assets/img/one-dark.png\"\n },\n \"ayu\": {\n \"light\": \"assets/img/ayu-light.png\",\n \"dark\": \"assets/img/ayu-dark.png\"\n },\n \"turbo\": \"assets/img/terminal.png\"\n};\n\n/** Predefined flavor descriptions keyed by theme id. */\nexport const FLAVOR_DESCRIPTIONS: Record<string, string> = {\n \"ayu-dark\": \"Deep Ayu dark theme for low-light environments.\",\n \"ayu-light\": \"Bright Ayu palette designed for comfortable daytime coding.\",\n \"ayu-mirage\": \"Soft dark Ayu variant with subtle, muted accents.\",\n \"bulma-dark\": \"Dark Bulma theme tuned for low-light reading.\",\n \"bulma-light\": \"Classic Bulma look with a bright, neutral palette.\",\n \"catppuccin-frappe\": \"Balanced dark Catppuccin theme for focused work.\",\n \"catppuccin-latte\": \"Light, soft Catppuccin palette for daytime use.\",\n \"catppuccin-macchiato\": \"Deep, atmospheric Catppuccin variant with rich contrast.\",\n \"catppuccin-mocha\": \"Cozy, high-contrast Catppuccin theme for late-night sessions.\",\n \"dracula\": \"Iconic Dracula dark theme with vibrant accents.\",\n \"everforest-dark-hard\": \"Highest contrast dark Everforest palette with deep forest shadows.\",\n \"everforest-dark-soft\": \"Softer dark Everforest palette with reduced contrast.\",\n \"everforest-dark\": \"Classic Everforest dark palette with warm, natural greens.\",\n \"everforest-light-hard\": \"Bright, crisp Everforest light palette with extra contrast.\",\n \"everforest-light-soft\": \"Soft, low-contrast Everforest light palette for long sessions.\",\n \"everforest-light\": \"Classic Everforest light palette with warm paper tones.\",\n \"github-dark\": \"GitHub dark theme optimized for code-heavy views.\",\n \"github-light\": \"GitHub-inspired light theme suited for documentation and UI heavy pages.\",\n \"gruvbox-dark-hard\": \"Highest contrast dark Gruvbox palette with deep shadows.\",\n \"gruvbox-dark-soft\": \"Softer dark Gruvbox palette with reduced contrast.\",\n \"gruvbox-dark\": \"Classic Gruvbox dark palette with warm, muted tones.\",\n \"gruvbox-light-hard\": \"Bright, crisp Gruvbox light palette with extra contrast.\",\n \"gruvbox-light-soft\": \"Soft, low-contrast Gruvbox light palette for long sessions.\",\n \"gruvbox-light\": \"Classic Gruvbox light palette with warm paper tones.\",\n \"kanagawa-dragon\": \"Darker Kanagawa variant for late-night sessions.\",\n \"kanagawa-lotus\": \"Light Kanagawa palette for daytime use.\",\n \"kanagawa-wave\": \"Heart-warming dark Kanagawa palette inspired by The Great Wave.\",\n \"nord\": \"Arctic, north-bluish color palette inspired by the polar night.\",\n \"one-dark\": \"The classic Atom One Dark palette with vivid syntax accents.\",\n \"one-light\": \"Companion One Light palette for bright, daytime editing.\",\n \"radix-mauve-dark\": \"Neutral purple-gray Radix dark theme for accessible UIs.\",\n \"radix-mauve-light\": \"Neutral purple-gray Radix light theme for accessible UIs.\",\n \"radix-slate-dark\": \"Neutral blue-gray Radix dark theme for accessible UIs.\",\n \"radix-slate-light\": \"Neutral blue-gray Radix light theme for accessible UIs.\",\n \"rose-pine-dawn\": \"Light Rosé Pine variant for daytime use.\",\n \"rose-pine-moon\": \"Deeper variant of Rosé Pine with enhanced contrast.\",\n \"rose-pine\": \"Elegant dark theme with natural pine and soho vibes.\",\n \"solarized-dark\": \"Solarized Dark with a balanced, low-contrast palette.\",\n \"solarized-light\": \"Solarized Light tuned for bright, daylight-friendly UIs.\",\n \"terminal\": \"CRT phosphor green on void with IBM Plex Mono.\",\n \"tokyo-night-dark\": \"Deep midnight blues with neon accents.\",\n \"tokyo-night-light\": \"Clean daylight palette inspired by Tokyo mornings.\",\n \"tokyo-night-storm\": \"Stormy variant with richer contrast and depth.\"\n};\n","// SPDX-License-Identifier: MIT\n/**\n * Constants for theme selector component\n */\n\nimport { DEFAULT_THEME as CORE_DEFAULT_THEME } from '@lgtm-hq/turbo-themes-core';\nimport { THEME_FAMILIES as GENERATED_THEME_FAMILIES } from './generated/theme-maps.js';\n\n// Re-export ThemeFamily for convenience\nexport type { ThemeFamily } from './types.js';\nexport type { ThemeFamilyMeta } from './generated/theme-maps.js';\n\nexport const STORAGE_KEY = 'turbo-theme';\nexport const LEGACY_STORAGE_KEYS = ['bulma-theme-flavor'];\nexport const DEFAULT_THEME = CORE_DEFAULT_THEME;\n\n/** ID of the CSS link element used by the blocking script to prevent FOUC. */\nexport const CSS_LINK_ID = 'turbo-theme-css';\n\n// DOM element IDs and selectors - centralized to avoid magic strings\nexport const DOM_IDS = {\n THEME_FLAVOR_TRIGGER: 'theme-flavor-trigger',\n THEME_FLAVOR_TRIGGER_ICON: 'theme-flavor-trigger-icon',\n THEME_FLAVOR_TRIGGER_LABEL: 'theme-flavor-trigger-label',\n THEME_FLAVOR_MENU: 'theme-flavor-menu',\n THEME_FLAVOR_SELECT: 'theme-flavor-select',\n} as const;\n\nexport const DOM_SELECTORS = {\n DROPDOWN_ITEMS: `#${DOM_IDS.THEME_FLAVOR_MENU} .dropdown-item.theme-item`,\n NAVBAR_DROPDOWN: '.navbar-item.has-dropdown',\n NAV_REPORTS: '[data-testid=\"nav-reports\"]',\n NAVBAR_ITEM: '.navbar-item',\n HIGHLIGHT_PRE: '.highlight > pre',\n THEME_CSS_LINKS: 'link[id^=\"theme-\"][id$=\"-css\"]',\n} as const;\n\n/** Family display metadata — generated from schema/tokens/_vendors.json. */\nexport const THEME_FAMILIES = GENERATED_THEME_FAMILIES;\n","// SPDX-License-Identifier: MIT\n/**\n * Centralized error handling for Turbo Themes.\n *\n * Provides a consistent error logging strategy with standardized message\n * formatting, error levels, and optional context for debugging.\n */\n\n/** Log prefix for all theme-related messages */\nexport const LOG_PREFIX = '[turbo-themes]';\n\n/** Error severity levels */\nexport const ErrorLevel = {\n WARN: 'warn',\n ERROR: 'error',\n} as const;\n\nexport type ErrorLevel = (typeof ErrorLevel)[keyof typeof ErrorLevel];\n\n/** Structured theme error with code, message, level, and optional context */\nexport interface ThemeError {\n code: string;\n message: string;\n level: ErrorLevel;\n context?: Record<string, unknown>;\n}\n\n/**\n * Factory functions for creating structured theme errors.\n * Each function returns a ThemeError with appropriate code, message, and level.\n */\nexport const ThemeErrors = {\n /** Invalid theme ID provided */\n INVALID_THEME_ID: (themeId: string): ThemeError => ({\n code: 'INVALID_THEME_ID',\n message: `Invalid theme ID \"${themeId}\" not saved to storage`,\n level: ErrorLevel.WARN,\n context: { themeId },\n }),\n\n /** No themes available in registry */\n NO_THEMES_AVAILABLE: (): ThemeError => ({\n code: 'NO_THEMES_AVAILABLE',\n message: 'No themes available',\n level: ErrorLevel.ERROR,\n }),\n\n /** Invalid theme icon path */\n INVALID_ICON_PATH: (themeId: string): ThemeError => ({\n code: 'INVALID_ICON_PATH',\n message: `Invalid theme icon path for ${themeId}`,\n level: ErrorLevel.WARN,\n context: { themeId },\n }),\n\n /** Theme initialization failed */\n INIT_FAILED: (error: unknown): ThemeError => ({\n code: 'INIT_FAILED',\n message: 'Theme switcher initialization failed',\n level: ErrorLevel.ERROR,\n context: { error: error instanceof Error ? error.message : String(error) },\n }),\n\n /** Protocol-relative URL rejected for security */\n PROTOCOL_REJECTED: (): ThemeError => ({\n code: 'PROTOCOL_REJECTED',\n message: 'Protocol-relative base URL rejected for security',\n level: ErrorLevel.WARN,\n }),\n\n /** Insecure HTTP URL rejected */\n INSECURE_HTTP_REJECTED: (): ThemeError => ({\n code: 'INSECURE_HTTP_REJECTED',\n message: 'Insecure HTTP base URL rejected',\n level: ErrorLevel.WARN,\n }),\n\n /** Cross-origin URL rejected */\n CROSS_ORIGIN_REJECTED: (origin: string): ThemeError => ({\n code: 'CROSS_ORIGIN_REJECTED',\n message: `Cross-origin base URL rejected: ${origin}`,\n level: ErrorLevel.WARN,\n context: { origin },\n }),\n\n /** Invalid CSS path for theme */\n INVALID_CSS_PATH: (themeId: string): ThemeError => ({\n code: 'INVALID_CSS_PATH',\n message: `Invalid theme CSS path for ${themeId}`,\n level: ErrorLevel.WARN,\n context: { themeId },\n }),\n\n /** CSS failed to load */\n CSS_LOAD_FAILED: (themeId: string, error: unknown): ThemeError => ({\n code: 'CSS_LOAD_FAILED',\n message: `Theme CSS failed to load for ${themeId}`,\n level: ErrorLevel.WARN,\n context: {\n themeId,\n error: error instanceof Error ? error.message : String(error),\n },\n }),\n\n /** Storage unavailable (private browsing or disabled) */\n STORAGE_UNAVAILABLE: (operation: string, error: unknown): ThemeError => ({\n code: 'STORAGE_UNAVAILABLE',\n message: `localStorage ${operation} failed - storage may be unavailable`,\n level: ErrorLevel.WARN,\n context: {\n operation,\n error: error instanceof Error ? error.message : String(error),\n },\n }),\n};\n\n/**\n * Log a theme error to the console with consistent formatting.\n *\n * @param themeError - The structured error to log\n */\nexport function logThemeError(themeError: ThemeError): void {\n const prefixedMessage = `${LOG_PREFIX} ${themeError.message}`;\n\n if (themeError.level === ErrorLevel.ERROR) {\n if (themeError.context) {\n // Safe: prefixedMessage is constructed from controlled internal strings\n // nosemgrep: unsafe-formatstring\n console.error(prefixedMessage, themeError.context);\n } else {\n console.error(prefixedMessage);\n }\n } else {\n if (themeError.context) {\n // Safe: prefixedMessage is constructed from controlled internal strings\n // nosemgrep: unsafe-formatstring\n console.warn(prefixedMessage, themeError.context);\n } else {\n console.warn(prefixedMessage);\n }\n }\n}\n\n/**\n * Convenience function to log a ThemeError.\n *\n * @param error - The ThemeError instance to log\n */\nexport function logError<T extends ThemeError>(error: T): void {\n logThemeError(error);\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Theme CSS loading utilities\n */\n\nimport { resolveThemeAppearance } from './appearance.js';\nimport { CSS_LINK_ID, DOM_SELECTORS } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\n\nexport interface ThemeInfo {\n id: string;\n cssFile: string;\n icon?: string | undefined;\n}\n\n/**\n * Resolves an asset path relative to the site's base URL.\n */\nexport function resolveAssetPath(assetPath: string, baseUrl: string): string {\n // Normalize baseUrl - remove trailing slash if present, then add one\n const normalizedBase = baseUrl.replace(/\\/$/, '');\n const base = normalizedBase ? `${window.location.origin}${normalizedBase}/` : `${window.location.origin}/`;\n return new URL(assetPath, base).pathname;\n}\n\n/**\n * Gets the base URL from the document's data-baseurl attribute.\n * Validates the URL to prevent injection attacks:\n * - Rejects protocol-relative URLs (//example.com)\n * - Rejects non-HTTPS absolute URLs (except localhost)\n * - Only allows same-origin or relative paths\n */\nexport function getBaseUrl(doc: Document): string {\n const baseElement = doc.documentElement;\n const raw = baseElement?.getAttribute('data-baseurl') || '';\n\n // Empty base URL is valid (use site root)\n if (!raw) return '';\n\n // Reject protocol-relative URLs (security risk)\n if (raw.startsWith('//')) {\n logThemeError(ThemeErrors.PROTOCOL_REJECTED());\n return '';\n }\n\n // Reject non-HTTPS absolute URLs (except localhost for development)\n if (raw.startsWith('http://') && !raw.startsWith('http://localhost')) {\n logThemeError(ThemeErrors.INSECURE_HTTP_REJECTED());\n return '';\n }\n\n try {\n // Parse relative to current origin to validate\n const currentOrigin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const u = new URL(raw, currentOrigin);\n\n // Only allow same-origin URLs or relative paths\n if (u.origin !== currentOrigin) {\n logThemeError(ThemeErrors.CROSS_ORIGIN_REJECTED(u.origin));\n return '';\n }\n\n return u.pathname.replace(/\\/$/, '');\n } catch {\n return '';\n }\n}\n\n/**\n * Builds the element ID of a theme's stylesheet link.\n *\n * Single source of truth for the `theme-<id>-css` convention shared by\n * the loader and the lazy-CSS helpers.\n *\n * @param themeId - Theme whose stylesheet link ID to build\n * @returns The stylesheet link element ID\n */\nexport function themeLinkId(themeId: string): string {\n return `theme-${themeId}-css`;\n}\n\n/**\n * Extracts the theme ID from a theme link element's ID.\n * Strips a leading \"theme-\" prefix and trailing \"-css\" suffix.\n */\nfunction extractThemeIdFromLinkId(linkId: string): string {\n return linkId.replace(/^theme-/, '').replace(/-css$/, '');\n}\n\n/**\n * Clears onload/onerror handlers from a link element to prevent memory leaks.\n */\nfunction clearLinkHandlers(link: HTMLLinkElement): void {\n link.onload = null;\n link.onerror = null;\n}\n\n/**\n * Loads a CSS file with a timeout, returning a promise that resolves when loaded.\n */\nexport function loadCSSWithTimeout(\n link: HTMLLinkElement,\n themeId: string,\n timeoutMs = 10000\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n clearLinkHandlers(link);\n reject(new Error(`Theme ${themeId} load timeout`));\n }, timeoutMs);\n\n link.onload = () => {\n clearTimeout(timeoutId);\n clearLinkHandlers(link);\n resolve();\n };\n\n link.onerror = () => {\n clearTimeout(timeoutId);\n clearLinkHandlers(link);\n reject(new Error(`Failed to load theme ${themeId}`));\n };\n });\n}\n\n/**\n * Gets the current theme from document element classes\n */\nexport function getCurrentThemeFromClasses(element: HTMLElement): string | null {\n const classList = Array.from(element.classList);\n for (const className of classList) {\n if (className.startsWith('theme-')) {\n return className.substring(6); // Remove 'theme-' prefix\n }\n }\n return null;\n}\n\n/**\n * Applies theme class and root data attributes to the document element.\n */\nexport function applyThemeClass(doc: Document, themeId: string): void {\n // Remove existing theme classes in a single batch operation\n const themeClasses = Array.from(doc.documentElement.classList).filter((className) =>\n className.startsWith('theme-'),\n );\n if (themeClasses.length > 0) {\n doc.documentElement.classList.remove(...themeClasses);\n }\n\n // Add the new theme class\n doc.documentElement.classList.add(`theme-${themeId}`);\n\n doc.documentElement.setAttribute('data-theme', themeId);\n doc.documentElement.setAttribute('data-appearance', resolveThemeAppearance(themeId));\n}\n\n/**\n * Removes stale theme stylesheet links, keeping the given theme's link\n * and the shared base stylesheet.\n */\nfunction removeStaleThemeLinks(doc: Document, keepThemeId: string): void {\n doc.querySelectorAll(DOM_SELECTORS.THEME_CSS_LINKS).forEach((link) => {\n const linkThemeId = extractThemeIdFromLinkId(link.id);\n if (linkThemeId !== keepThemeId && linkThemeId !== 'base') {\n link.remove();\n }\n });\n}\n\n/**\n * Adopts the blocking script's link element for a theme (prevents\n * duplicate CSS loads).\n *\n * The repoint stays synchronous to preserve the blocking script's\n * FOUC-avoidance behaviour; this only makes its outcome observable by\n * awaiting the repointed link's load/error settlement. On load failure\n * the link is rolled back to its previous identity and href so the\n * document keeps the stylesheet that was already working.\n *\n * @returns true when the theme's CSS is confirmed loaded\n */\nasync function adoptBlockingLink(\n doc: Document,\n blockingLink: HTMLLinkElement,\n theme: ThemeInfo,\n baseUrl: string\n): Promise<boolean> {\n let resolvedHref: string;\n try {\n resolvedHref = resolveAssetPath(theme.cssFile, baseUrl);\n } catch {\n logThemeError(ThemeErrors.INVALID_CSS_PATH(theme.id));\n return false;\n }\n\n const previousHref = blockingLink.getAttribute('href');\n blockingLink.id = themeLinkId(theme.id);\n blockingLink.setAttribute('data-theme-id', theme.id);\n\n // Already pointing at the theme's stylesheet (e.g. the blocking script\n // loaded it before first paint) — no fetch to await.\n if (previousHref === resolvedHref) {\n removeStaleThemeLinks(doc, theme.id);\n return true;\n }\n\n blockingLink.href = resolvedHref;\n try {\n await loadCSSWithTimeout(blockingLink, theme.id);\n } catch (error) {\n // Loading failed — restore the link's prior identity and href so the\n // previously working stylesheet stays in effect.\n blockingLink.id = CSS_LINK_ID;\n blockingLink.removeAttribute('data-theme-id');\n if (previousHref !== null) {\n blockingLink.href = previousHref;\n } else {\n blockingLink.removeAttribute('href');\n }\n logThemeError(ThemeErrors.CSS_LOAD_FAILED(theme.id, error));\n return false;\n }\n\n removeStaleThemeLinks(doc, theme.id);\n return true;\n}\n\n/**\n * Loads theme CSS file if not already loaded.\n *\n * @returns true when the theme's stylesheet is present and confirmed\n * loaded (or was already linked), false when path resolution or the\n * network fetch failed\n */\nexport async function loadThemeCSS(\n doc: Document,\n theme: ThemeInfo,\n baseUrl: string\n): Promise<boolean> {\n const linkId = themeLinkId(theme.id);\n const existingThemeLink = doc.getElementById(linkId) as HTMLLinkElement | null;\n\n if (existingThemeLink) {\n // Link already exists — clean up any other stale theme links\n removeStaleThemeLinks(doc, theme.id);\n return true;\n }\n\n // Adopt the blocking script's link element if present (prevents duplicate CSS loads)\n const blockingLink = doc.getElementById(CSS_LINK_ID) as HTMLLinkElement | null;\n if (blockingLink) {\n return adoptBlockingLink(doc, blockingLink, theme, baseUrl);\n }\n\n const themeLink = doc.createElement('link');\n themeLink.id = linkId;\n themeLink.rel = 'stylesheet';\n themeLink.type = 'text/css';\n themeLink.setAttribute('data-theme-id', theme.id);\n\n try {\n themeLink.href = resolveAssetPath(theme.cssFile, baseUrl);\n } catch {\n logThemeError(ThemeErrors.INVALID_CSS_PATH(theme.id));\n return false;\n }\n\n doc.head.appendChild(themeLink);\n\n try {\n await loadCSSWithTimeout(themeLink, theme.id);\n } catch (error) {\n // Loading failed — remove the new link and keep prior theme intact\n themeLink.remove();\n logThemeError(ThemeErrors.CSS_LOAD_FAILED(theme.id, error));\n return false;\n }\n\n // Only remove old theme links after successful load\n removeStaleThemeLinks(doc, theme.id);\n return true;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Dropdown helper functions\n */\n\n/**\n * Sets the active state (is-active class and aria-checked) on a theme item element.\n */\nexport function setItemActiveState(item: Element, isActive: boolean): void {\n if (isActive) {\n item.classList.add('is-active');\n } else {\n item.classList.remove('is-active');\n }\n item.setAttribute('aria-checked', String(isActive));\n}\n\n/**\n * Sets tabindex attribute on all items in a collection.\n */\nexport function setTabindexBatch(items: HTMLElement[], value: string): void {\n for (const item of items) {\n item.setAttribute('tabindex', value);\n }\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Maps core theme flavors to UI-specific format\n */\n\nimport type { ThemeFlavor as CanonicalThemeFlavor } from '@lgtm-hq/turbo-themes-core';\nimport type { ThemeFamily } from './types.js';\nimport {\n DEFAULT_FAMILY,\n VENDOR_FAMILY_MAP,\n VENDOR_ICON_MAP,\n FLAVOR_DESCRIPTIONS,\n type AppearanceIcons,\n} from './generated/theme-maps.js';\n\nexport type { AppearanceIcons };\nexport { VENDOR_ICON_MAP };\n\nexport interface ThemeColors {\n bg: string;\n surface: string;\n accent: string;\n text: string;\n}\n\nexport interface ThemeFlavor extends Pick<CanonicalThemeFlavor, 'id' | 'appearance' | 'vendor'> {\n id: string;\n name: string;\n description: string;\n cssFile: string;\n icon?: string | undefined;\n family: ThemeFamily;\n colors: ThemeColors;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Gets the theme family from vendor name\n */\nfunction getFamily(vendor: string): ThemeFamily {\n return VENDOR_FAMILY_MAP[vendor] ?? DEFAULT_FAMILY;\n}\n\n/**\n * Gets icon path for a vendor\n */\nfunction getIconForVendor(vendor: string, appearance: 'light' | 'dark'): string | undefined {\n const iconConfig = VENDOR_ICON_MAP[vendor];\n\n if (!iconConfig) {\n return undefined;\n }\n\n if (typeof iconConfig === 'string') {\n return iconConfig;\n }\n\n return iconConfig[appearance];\n}\n\n/**\n * Gets description for a flavor\n */\nfunction getDescriptionForFlavor(id: string, label: string): string {\n return FLAVOR_DESCRIPTIONS[id] ?? `${label} theme`;\n}\n\n/**\n * Extracts preview colors from theme tokens\n */\nfunction extractPreviewColors(tokens: CanonicalThemeFlavor['tokens']): ThemeColors {\n return {\n bg: tokens.background.base,\n surface: tokens.background.surface,\n accent: tokens.brand.primary,\n text: tokens.text.primary,\n };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Maps a canonical theme flavor to UI-specific format\n */\nexport function mapFlavorToUI(flavor: CanonicalThemeFlavor): ThemeFlavor {\n const family = getFamily(flavor.vendor);\n return {\n id: flavor.id,\n name: flavor.label,\n description: getDescriptionForFlavor(flavor.id, flavor.label),\n cssFile: `assets/css/themes/turbo/${flavor.id}.css`,\n icon: getIconForVendor(flavor.vendor, flavor.appearance),\n family,\n vendor: flavor.vendor,\n appearance: flavor.appearance,\n colors: extractPreviewColors(flavor.tokens),\n };\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Theme resolution utilities - centralized theme lookup and validation.\n *\n * Provides cached access to theme data and validation to avoid\n * repeated mapping and set creation across the codebase.\n */\n\nimport { flavors } from '@lgtm-hq/turbo-themes-core';\nimport { mapFlavorToUI, type ThemeFlavor } from './theme-mapper.js';\nimport { DEFAULT_THEME } from './constants.js';\n\n// Cache mapped themes and valid IDs\nlet mappedThemes: ThemeFlavor[] | null = null;\nlet validThemeIds: Set<string> | null = null;\n\n/**\n * Gets all themes mapped to UI format.\n * Results are cached for performance.\n */\nexport function getThemes(): ThemeFlavor[] {\n if (!mappedThemes) {\n mappedThemes = flavors.map(mapFlavorToUI);\n }\n return mappedThemes || [];\n}\n\n/**\n * Gets a Set of all valid theme IDs.\n * Results are cached for performance.\n */\nexport function getValidThemeIds(): Set<string> {\n if (!validThemeIds) {\n validThemeIds = new Set(flavors.map((f) => f.id));\n }\n return validThemeIds;\n}\n\n/**\n * Resolves a theme by ID, falling back to default if not found.\n *\n * @param themeId - The theme ID to resolve\n * @returns The matching theme, default theme, or first available theme\n */\nexport function resolveTheme(themeId: string): ThemeFlavor | undefined {\n const themes = getThemes();\n return (\n themes.find((t) => t.id === themeId) ||\n themes.find((t) => t.id === DEFAULT_THEME) ||\n themes[0]\n );\n}\n\n/**\n * Validates a theme ID for safety and format correctness.\n *\n * Accepts only alphanumeric characters, hyphens, and underscores.\n * Rejects special characters, unicode, and excessively long IDs.\n *\n * @param id - The value to validate as a theme ID\n * @returns True if the ID is valid, false otherwise\n */\nexport function isValidThemeId(id: unknown): boolean {\n if (typeof id !== 'string') return false;\n if (id.length === 0) return false;\n if (id.length > 100) return false;\n return /^[a-zA-Z0-9_-]+$/.test(id);\n}\n\n/**\n * Sanitizes a theme ID by removing unsafe characters.\n *\n * Removes any characters that could cause DOM/CSS/XSS issues.\n * Used as a fallback when displaying potentially untrusted input.\n *\n * @param id - The theme ID to sanitize\n * @returns The sanitized ID containing only safe characters\n */\nexport function sanitizeThemeId(id: string): string {\n return id.replace(/[^a-zA-Z0-9_-]/g, '');\n}\n\n/**\n * Resets the cached themes. Used for testing.\n * @internal\n */\nexport function _resetThemeCache(): void {\n mappedThemes = null;\n validThemeIds = null;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Theme application logic\n */\n\nimport { DOM_IDS, DOM_SELECTORS, THEME_FAMILIES } from './constants.js';\nimport { getBaseUrl, applyThemeClass, loadThemeCSS, resolveAssetPath, getCurrentThemeFromClasses } from './theme-loader.js';\nimport { setItemActiveState } from './dropdown/helpers.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\nimport { resolveTheme } from './theme-resolver.js';\n\n/**\n * Applies a theme to the document.\n *\n * @returns true when the theme's CSS is confirmed loaded, false when the\n * theme could not be resolved or its stylesheet failed to load (the\n * root attributes/class are still applied in the latter case)\n */\nexport async function applyTheme(doc: Document, themeId: string): Promise<boolean> {\n const theme = resolveTheme(themeId);\n if (!theme) {\n logThemeError(ThemeErrors.NO_THEMES_AVAILABLE());\n return false;\n }\n const baseUrl = getBaseUrl(doc);\n\n // Add loading state to trigger button\n const trigger = doc.getElementById(DOM_IDS.THEME_FLAVOR_TRIGGER) as HTMLButtonElement | null;\n if (trigger) {\n trigger.classList.add('is-loading');\n }\n\n try {\n // Apply theme class immediately (before CSS loading)\n applyThemeClass(doc, theme.id);\n\n // Load theme CSS\n const cssLoaded = await loadThemeCSS(doc, theme, baseUrl);\n\n // Update trigger button icon\n const triggerIcon = doc.getElementById(\n DOM_IDS.THEME_FLAVOR_TRIGGER_ICON\n ) as HTMLImageElement | null;\n\n if (triggerIcon && theme.icon) {\n try {\n triggerIcon.src = resolveAssetPath(theme.icon, baseUrl);\n const familyMeta = THEME_FAMILIES[theme.family];\n const familyName = familyMeta?.name ?? theme.family;\n triggerIcon.alt = `${familyName} ${theme.name}`;\n triggerIcon.title = `${familyName} ${theme.name}`;\n } catch {\n logThemeError(ThemeErrors.INVALID_ICON_PATH(theme.id));\n }\n }\n\n // Update trigger button label\n const triggerLabel = doc.getElementById(\n DOM_IDS.THEME_FLAVOR_TRIGGER_LABEL\n ) as HTMLElement | null;\n if (triggerLabel) {\n triggerLabel.textContent = theme.name;\n }\n\n // Update active state in dropdown\n doc.querySelectorAll(DOM_SELECTORS.DROPDOWN_ITEMS).forEach((item) => {\n setItemActiveState(item, item.getAttribute('data-theme-id') === theme.id);\n });\n\n return cssLoaded;\n } finally {\n if (trigger) {\n trigger.classList.remove('is-loading');\n }\n }\n}\n\n/**\n * Gets the current theme from classes or returns default\n */\nexport function getCurrentTheme(doc: Document, defaultTheme: string): string {\n return getCurrentThemeFromClasses(doc.documentElement) || defaultTheme;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Storage utilities for theme persistence\n */\n\nimport { STORAGE_KEY, LEGACY_STORAGE_KEYS, DEFAULT_THEME } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\n\n// Re-export DEFAULT_THEME for convenience\nexport { DEFAULT_THEME } from './constants.js';\n\n/**\n * Safely get an item from localStorage.\n * Returns null if storage is unavailable (e.g., private browsing mode).\n */\nfunction safeGetItem(windowObj: Window, key: string): string | null {\n try {\n return windowObj.localStorage.getItem(key);\n } catch (error) {\n logThemeError(ThemeErrors.STORAGE_UNAVAILABLE('getItem', error));\n return null;\n }\n}\n\n/**\n * Safely set an item in localStorage.\n * Returns false if storage is unavailable.\n */\nfunction safeSetItem(windowObj: Window, key: string, value: string): boolean {\n try {\n windowObj.localStorage.setItem(key, value);\n return true;\n } catch (error) {\n logThemeError(ThemeErrors.STORAGE_UNAVAILABLE('setItem', error));\n return false;\n }\n}\n\n/**\n * Safely remove an item from localStorage.\n * Silently fails if storage is unavailable.\n */\nfunction safeRemoveItem(windowObj: Window, key: string): void {\n try {\n windowObj.localStorage.removeItem(key);\n } catch (error) {\n logThemeError(ThemeErrors.STORAGE_UNAVAILABLE('removeItem', error));\n }\n}\n\n/**\n * Validates a theme ID against a set of valid IDs.\n * Returns the theme ID if valid, otherwise returns the default theme.\n */\nexport function validateThemeId(themeId: string | null, validIds: Set<string>): string {\n if (themeId && validIds.has(themeId)) {\n return themeId;\n }\n return DEFAULT_THEME;\n}\n\n/**\n * Migrates legacy storage keys to the current format.\n * Safely handles unavailable localStorage (e.g., private browsing).\n */\nexport function migrateLegacyStorage(windowObj: Window): void {\n for (const legacyKey of LEGACY_STORAGE_KEYS) {\n const legacy = safeGetItem(windowObj, legacyKey);\n if (legacy && !safeGetItem(windowObj, STORAGE_KEY)) {\n safeSetItem(windowObj, STORAGE_KEY, legacy);\n safeRemoveItem(windowObj, legacyKey);\n }\n }\n}\n\n/**\n * Gets the saved theme from localStorage, or returns default.\n * Optionally validates against a set of valid theme IDs.\n * Safely handles unavailable localStorage (e.g., private browsing).\n */\nexport function getSavedTheme(windowObj: Window, validIds?: Set<string>): string {\n const stored = safeGetItem(windowObj, STORAGE_KEY);\n if (validIds) {\n return validateThemeId(stored, validIds);\n }\n return stored || DEFAULT_THEME;\n}\n\n/**\n * Saves a theme to localStorage.\n * Optionally validates the theme ID against a set of valid IDs before saving.\n * Safely handles unavailable localStorage (e.g., private browsing).\n *\n * @param windowObj - Window object with localStorage\n * @param themeId - Theme ID to save\n * @param validIds - Optional set of valid theme IDs for validation\n * @returns true if saved successfully, false otherwise\n */\nexport function saveTheme(windowObj: Window, themeId: string, validIds?: Set<string>): boolean {\n if (validIds && !validIds.has(themeId)) {\n logThemeError(ThemeErrors.INVALID_THEME_ID(themeId));\n return false;\n }\n return safeSetItem(windowObj, STORAGE_KEY, themeId);\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Public integration API for driving theming from outside the package.\n *\n * Site pages (e.g. the homepage showcase) use these functions to apply a\n * theme, query the active theme, and subscribe to theme changes without\n * reaching into selector internals. The theme-selector package remains\n * the owner of persistence, the `data-theme`/`data-appearance` root\n * attributes, and dropdown state.\n */\n\nimport { resolveThemeAppearance, type ThemeAppearance } from './appearance.js';\nimport {\n applyTheme as applyThemeToDocument,\n getCurrentTheme as getCurrentThemeFromDocument,\n} from './apply-theme.js';\nimport { DEFAULT_THEME } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\nimport { saveTheme } from './storage.js';\nimport { getValidThemeIds, isValidThemeId } from './theme-resolver.js';\n\n/** Name of the CustomEvent dispatched on the document after a theme change. */\nexport const THEME_CHANGE_EVENT = 'turbo-theme-change';\n\n/** Payload carried by theme-change notifications. */\nexport interface ThemeChangeDetail {\n /** ID of the theme that was applied (e.g. `catppuccin-mocha`). */\n themeId: string;\n /** Light/dark appearance of the applied theme. */\n appearance: ThemeAppearance;\n}\n\n/** Listener invoked with the payload of each theme change. */\nexport type ThemeChangeListener = (detail: ThemeChangeDetail) => void;\n\n/**\n * Outcome of an applyTheme call, reporting each stage independently so\n * consumers can distinguish full success from partial application.\n */\nexport interface ApplyThemeResult {\n /**\n * True when the theme ID was valid and the `data-theme` /\n * `data-appearance` root attributes and theme class were applied.\n */\n applied: boolean;\n /**\n * True when the theme's stylesheet is confirmed loaded (fetched now or\n * already linked). False means the DOM attributes may have changed\n * while the previous theme's CSS is still in effect.\n */\n cssLoaded: boolean;\n /**\n * True when the selection was persisted to localStorage. False when\n * storage is unavailable (e.g. private browsing) or over quota.\n */\n persisted: boolean;\n}\n\n/** Removes a listener previously registered via subscribeToThemeChanges. */\nexport type Unsubscribe = () => void;\n\n/**\n * Dispatches the theme-change CustomEvent on the document.\n *\n * @param documentObj - Document to dispatch the event on\n * @param themeId - ID of the theme that was applied\n */\nfunction emitThemeChange(documentObj: Document, themeId: string): void {\n const detail: ThemeChangeDetail = {\n themeId,\n appearance: resolveThemeAppearance(themeId),\n };\n documentObj.dispatchEvent(new CustomEvent<ThemeChangeDetail>(THEME_CHANGE_EVENT, { detail }));\n}\n\n/**\n * Applies a theme by ID through the theme-selector pipeline.\n *\n * Persists the selection, updates the `data-theme`/`data-appearance`\n * attributes and theme CSS, syncs dropdown state, and notifies\n * subscribers via the theme-change event.\n *\n * Each stage is reported independently in the returned\n * {@link ApplyThemeResult} so consumers can distinguish full success\n * from partial application:\n *\n * - Unknown or malformed theme IDs are rejected: nothing is applied, no\n * event is dispatched, and all result fields are false.\n * - `persisted` is false when localStorage is unavailable or over\n * quota; the theme is still applied visually.\n * - `cssLoaded` is false when the stylesheet fetch fails; the root\n * attributes have changed but the previous theme's CSS remains in\n * effect, so the theme-change event is NOT dispatched.\n *\n * The theme-change event fires only when the theme is visually applied\n * (`applied && cssLoaded`); persistence failure alone does not suppress\n * it.\n *\n * @param themeId - ID of the theme to apply (e.g. `catppuccin-mocha`)\n * @param documentObj - Document to apply the theme to (defaults to global)\n * @param windowObj - Window used for persistence (defaults to global)\n * @returns Per-stage outcome of the application\n */\nexport async function applyTheme(\n themeId: string,\n documentObj: Document = document,\n windowObj: Window = window,\n): Promise<ApplyThemeResult> {\n const validIds = getValidThemeIds();\n if (!isValidThemeId(themeId) || !validIds.has(themeId)) {\n logThemeError(ThemeErrors.INVALID_THEME_ID(themeId));\n return { applied: false, cssLoaded: false, persisted: false };\n }\n\n const persisted = saveTheme(windowObj, themeId, validIds);\n const cssLoaded = await applyThemeToDocument(documentObj, themeId);\n if (cssLoaded) {\n emitThemeChange(documentObj, themeId);\n }\n return { applied: true, cssLoaded, persisted };\n}\n\n/**\n * Gets the ID of the currently active theme.\n *\n * Prefers the `data-theme` root attribute (set by both the blocking\n * script and the theme-selector), falls back to the `theme-*` class,\n * and finally to the default theme.\n *\n * @param documentObj - Document to inspect (defaults to global)\n * @returns The active theme ID\n */\nexport function getCurrentTheme(documentObj: Document = document): string {\n const fromAttribute = documentObj.documentElement.getAttribute('data-theme');\n if (fromAttribute) {\n return fromAttribute;\n }\n return getCurrentThemeFromDocument(documentObj, DEFAULT_THEME);\n}\n\n/**\n * Subscribes to theme-change notifications.\n *\n * The listener fires after each successful theme application — whether\n * triggered through applyTheme or the dropdown UI — with the applied\n * theme ID and its light/dark appearance.\n *\n * @param listener - Callback invoked with each theme-change payload\n * @param documentObj - Document to listen on (defaults to global)\n * @returns Function that removes the listener when called\n */\nexport function subscribeToThemeChanges(\n listener: ThemeChangeListener,\n documentObj: Document = document,\n): Unsubscribe {\n const handler = (event: Event): void => {\n const detail = (event as CustomEvent<ThemeChangeDetail>).detail;\n if (detail) {\n listener(detail);\n }\n };\n documentObj.addEventListener(THEME_CHANGE_EVENT, handler);\n return () => documentObj.removeEventListener(THEME_CHANGE_EVENT, handler);\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Lazy theme-CSS loading helpers for showcase-style pages.\n *\n * Instead of eagerly linking every theme's stylesheet, a page loads only\n * the default/active theme CSS up front and fetches the rest on demand.\n * These helpers provide the load decision, an inject-once on-demand\n * loader built on the package's `loadThemeCSS` pipeline, and a\n * hover-triggered prefetch that hides switch latency for elements\n * marked with the `data-theme-preview` attribute (e.g. marquee cards).\n */\n\nimport { CSS_LINK_ID } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\nimport type { Unsubscribe } from './integration.js';\nimport { getBaseUrl, loadThemeCSS, resolveAssetPath, themeLinkId } from './theme-loader.js';\nimport { getValidThemeIds, isValidThemeId, resolveTheme } from './theme-resolver.js';\n\n/** Attribute whose value names the theme to prefetch on hover/focus. */\nexport const PREFETCH_TRIGGER_ATTRIBUTE = 'data-theme-preview';\n\n/**\n * Builds the element ID of a theme's prefetch link.\n *\n * @param themeId - Theme whose prefetch link ID to build\n * @returns The prefetch link element ID\n */\nfunction themePrefetchLinkId(themeId: string): string {\n return `theme-${themeId}-prefetch`;\n}\n\n/**\n * Checks whether a theme ID is well-formed and registered.\n *\n * @param themeId - Theme ID to check\n * @returns True when the ID names a known theme\n */\nfunction isKnownThemeId(themeId: string): boolean {\n return isValidThemeId(themeId) && getValidThemeIds().has(themeId);\n}\n\n/**\n * Checks whether a theme's stylesheet is already present in the document.\n *\n * Recognises both links owned by the selector (`theme-<id>-css`) and the\n * blocking script's FOUC-prevention link when it points at the theme.\n *\n * @param documentObj - Document to inspect\n * @param themeId - Theme whose stylesheet to look for\n * @returns True when the theme's CSS is already linked\n */\nexport function isThemeCSSLoaded(documentObj: Document, themeId: string): boolean {\n if (documentObj.getElementById(themeLinkId(themeId))) {\n return true;\n }\n const blockingLink = documentObj.getElementById(CSS_LINK_ID) as HTMLLinkElement | null;\n if (!blockingLink) {\n return false;\n }\n if (blockingLink.getAttribute('data-theme-id') === themeId) {\n return true;\n }\n const href = blockingLink.getAttribute('href') ?? '';\n return href.endsWith(`/${themeId}.css`);\n}\n\n/**\n * Decides whether a theme's CSS needs an on-demand load.\n *\n * @param documentObj - Document to inspect\n * @param themeId - Theme the page is about to switch to\n * @returns True when the theme is known and its CSS is not yet linked\n */\nexport function shouldLoadThemeCSS(documentObj: Document, themeId: string): boolean {\n return isKnownThemeId(themeId) && !isThemeCSSLoaded(documentObj, themeId);\n}\n\n/**\n * Loads a theme's CSS on demand through the selector's loader.\n *\n * Injects the stylesheet link at most once: repeat calls for a theme\n * whose CSS is already linked are no-ops that resolve to true. Unknown\n * or malformed theme IDs are rejected without touching the document.\n *\n * @param documentObj - Document to load the stylesheet into\n * @param themeId - Theme whose CSS to load\n * @returns True when the CSS is available (loaded now or previously)\n */\nexport async function loadThemeCSSOnDemand(\n documentObj: Document,\n themeId: string,\n): Promise<boolean> {\n if (!isKnownThemeId(themeId)) {\n logThemeError(ThemeErrors.INVALID_THEME_ID(themeId));\n return false;\n }\n if (isThemeCSSLoaded(documentObj, themeId)) {\n return true;\n }\n const theme = resolveTheme(themeId);\n if (!theme) {\n return false;\n }\n // loadThemeCSS reports whether the stylesheet was confirmed loaded,\n // including on the adoption path where the blocking link is repointed.\n return loadThemeCSS(documentObj, theme, getBaseUrl(documentObj));\n}\n\n/**\n * Prefetches a theme's CSS so a later switch hits the browser cache.\n *\n * Injects a `<link rel=\"prefetch\" as=\"style\">` at most once per theme.\n * Skips themes whose stylesheet is already linked, themes already\n * prefetched, and unknown theme IDs.\n *\n * @param documentObj - Document to inject the prefetch link into\n * @param themeId - Theme whose CSS to prefetch\n * @returns True when a prefetch link was injected by this call\n */\nexport function prefetchThemeCSS(documentObj: Document, themeId: string): boolean {\n if (!isKnownThemeId(themeId)) {\n return false;\n }\n if (isThemeCSSLoaded(documentObj, themeId)) {\n return false;\n }\n if (documentObj.getElementById(themePrefetchLinkId(themeId))) {\n return false;\n }\n const theme = resolveTheme(themeId);\n if (!theme) {\n return false;\n }\n\n let href: string;\n try {\n href = resolveAssetPath(theme.cssFile, getBaseUrl(documentObj));\n } catch {\n logThemeError(ThemeErrors.INVALID_CSS_PATH(themeId));\n return false;\n }\n\n const link = documentObj.createElement('link');\n link.id = themePrefetchLinkId(themeId);\n link.rel = 'prefetch';\n link.setAttribute('as', 'style');\n link.href = href;\n link.setAttribute('data-theme-prefetch', themeId);\n documentObj.head.appendChild(link);\n return true;\n}\n\n/**\n * Wires hover/focus-triggered CSS prefetch for marked elements.\n *\n * Listens for `mouseover` and `focusin` on the document and prefetches\n * the theme named by the nearest ancestor carrying the\n * `data-theme-preview` attribute. Delegation means marquee items added\n * after wiring are covered without re-wiring.\n *\n * @param documentObj - Document to listen on (defaults to global)\n * @returns Function that removes the listeners when called\n */\nexport function wireHoverPrefetch(documentObj: Document = document): Unsubscribe {\n const handler = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n const trigger = target.closest(`[${PREFETCH_TRIGGER_ATTRIBUTE}]`);\n if (!trigger) {\n return;\n }\n const themeId = trigger.getAttribute(PREFETCH_TRIGGER_ATTRIBUTE);\n if (!themeId) {\n return;\n }\n prefetchThemeCSS(documentObj, themeId);\n };\n\n documentObj.addEventListener('mouseover', handler);\n documentObj.addEventListener('focusin', handler);\n return () => {\n documentObj.removeEventListener('mouseover', handler);\n documentObj.removeEventListener('focusin', handler);\n };\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Homepage showcase interactions.\n *\n * Spotlight drift, comet-card tilt, text mask, scroll reveals, theme marquee\n * pause, and the interactive preview card. Pure state transitions are exported\n * for unit testing; DOM wiring stays thin and is initialized on\n * DOMContentLoaded.\n *\n * Theming goes exclusively through the theme-selector integration API\n * (ADR-0007): marquee clicks call `applyTheme`, hover prefetch comes from\n * the lazy-CSS helpers, and UI state follows `turbo-theme-change` events\n * plus a `data-theme` attribute observer (covering the header dropdown).\n * Theme metadata is server-rendered as data attributes on the marquee\n * cards (`data-theme-preview`/`data-theme-name`/`data-theme-icon`) instead\n * of an injected global.\n */\n\nimport {\n applyTheme,\n getCurrentTheme,\n subscribeToThemeChanges,\n} from '../../packages/theme-selector/src/integration.js';\nimport { wireHoverPrefetch } from '../../packages/theme-selector/src/lazy-css.js';\n\n/** Fallback icon used when a theme has no dedicated icon entry. */\nexport const DEFAULT_THEME_ICON = 'catppuccin-logo-macchiato.png';\n\n/** Maximum spotlight drift, in pixels, before the direction flips. */\nexport const SPOTLIGHT_LIMIT = 100;\n\n/** Pixels the spotlight drifts per animation frame. */\nexport const SPOTLIGHT_STEP = 0.15;\n\n/** Maximum comet-card tilt, in degrees, on each axis. */\nexport const MAX_TILT_DEGREES = 14;\n\n/** Progress percentage the preview card animates to. */\nexport const PROGRESS_TARGET = 92;\n\n/** Minimal surface needed to evaluate a media query. */\nexport interface MediaQuerySource {\n matchMedia(query: string): { matches: boolean };\n}\n\n/** Theme metadata read from server-rendered data attributes on the page. */\nexport interface ShowcaseMeta {\n baseUrl: string;\n themeFullNames: Partial<Record<string, string>>;\n themeIcons: Partial<Record<string, string>>;\n}\n\n/** Resolved display values for the preview card's theme header. */\nexport interface ThemeDisplay {\n name: string;\n iconSrc: string;\n}\n\n/** Spotlight drift animation state. */\nexport interface SpotlightState {\n offset: number;\n direction: 1 | -1;\n}\n\n/** Target values for the comet-card tilt and glare animation. */\nexport interface TiltTargets {\n rotateX: number;\n rotateY: number;\n glareX: number;\n glareY: number;\n}\n\n/** Pointer-relative bounding box (subset of DOMRect). */\nexport interface PointerRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Tilt targets when the pointer is not over the comet card. */\nexport const RESTING_TILT_TARGETS: TiltTargets = {\n rotateX: 0,\n rotateY: 0,\n glareX: 50,\n glareY: 50,\n};\n\n/** CSS animation-play-state values used by the marquee rows. */\nexport type MarqueePlayState = 'paused' | 'running';\n\n/** Attribute naming the theme a showcase element previews/applies. */\nexport const THEME_TRIGGER_ATTRIBUTE = 'data-theme-preview';\n\n/** Attribute carrying a theme's full display name on a marquee card. */\nexport const THEME_NAME_ATTRIBUTE = 'data-theme-name';\n\n/** Attribute carrying a theme's icon filename on a marquee card. */\nexport const THEME_ICON_ATTRIBUTE = 'data-theme-icon';\n\n/**\n * Check whether the user prefers reduced motion.\n *\n * @param source - Object exposing matchMedia (usually window).\n * @returns True when reduced motion is requested.\n */\nexport function prefersReducedMotion(source: MediaQuerySource): boolean {\n return source.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Advance the spotlight drift by one frame, bouncing at the limits.\n *\n * @param state - Current offset and direction.\n * @param step - Pixels to drift this frame.\n * @param limit - Absolute offset at which the direction flips.\n * @returns The next spotlight state.\n */\nexport function stepSpotlight(\n state: SpotlightState,\n step: number = SPOTLIGHT_STEP,\n limit: number = SPOTLIGHT_LIMIT,\n): SpotlightState {\n const offset = state.offset + state.direction * step;\n let direction = state.direction;\n if (offset > limit) direction = -1;\n if (offset < -limit) direction = 1;\n return { offset, direction };\n}\n\n/**\n * Compute tilt and glare targets for a pointer position over the card.\n *\n * @param clientX - Pointer x coordinate in viewport space.\n * @param clientY - Pointer y coordinate in viewport space.\n * @param rect - Card bounding box.\n * @param maxTilt - Maximum tilt in degrees on each axis.\n * @returns Rotation and glare targets.\n */\nexport function computeTiltTargets(\n clientX: number,\n clientY: number,\n rect: PointerRect,\n maxTilt: number = MAX_TILT_DEGREES,\n): TiltTargets {\n const xPct = (clientX - rect.left) / rect.width - 0.5;\n const yPct = (clientY - rect.top) / rect.height - 0.5;\n return {\n rotateX: -yPct * maxTilt,\n rotateY: xPct * maxTilt,\n glareX: ((clientX - rect.left) / rect.width) * 100,\n glareY: ((clientY - rect.top) / rect.height) * 100,\n };\n}\n\n/**\n * Move a value a fraction of the way toward a target (ease-out step).\n *\n * @param current - Current value.\n * @param target - Target value.\n * @param rate - Fraction of the remaining distance to cover (0..1).\n * @returns The eased value.\n */\nexport function approach(current: number, target: number, rate: number): number {\n return current + (target - current) * rate;\n}\n\n/**\n * Convert a pointer position into percentages within a bounding box.\n *\n * @param clientX - Pointer x coordinate in viewport space.\n * @param clientY - Pointer y coordinate in viewport space.\n * @param rect - Element bounding box.\n * @returns X/Y position as percentages (0..100).\n */\nexport function pointerPercent(\n clientX: number,\n clientY: number,\n rect: PointerRect,\n): { x: number; y: number } {\n return {\n x: ((clientX - rect.left) / rect.width) * 100,\n y: ((clientY - rect.top) / rect.height) * 100,\n };\n}\n\n/**\n * Decide the marquee row's animation-play-state for a hover state.\n *\n * @param isHovering - Whether the pointer is over the row.\n * @returns 'paused' while hovering, 'running' otherwise.\n */\nexport function marqueePlayState(isHovering: boolean): MarqueePlayState {\n return isHovering ? 'paused' : 'running';\n}\n\n/**\n * Activate the tab and panel matching a target and deactivate the rest.\n *\n * @param tabs - Preview tab buttons (data-preview-tab).\n * @param panels - Preview panels (data-preview-panel).\n * @param target - The data-preview-tab value to activate.\n */\nexport function applyTabSelection(\n tabs: readonly HTMLElement[],\n panels: readonly HTMLElement[],\n target: string,\n): void {\n for (const tab of tabs) {\n const isActive = tab.getAttribute('data-preview-tab') === target;\n tab.classList.toggle('active', isActive);\n tab.setAttribute('aria-selected', isActive ? 'true' : 'false');\n tab.tabIndex = isActive ? 0 : -1;\n }\n for (const panel of panels) {\n const isActive = panel.getAttribute('data-preview-panel') === target;\n panel.classList.toggle('is-active', isActive);\n panel.hidden = !isActive;\n }\n}\n\n/**\n * Resolve the tab index a tablist keydown should move focus to.\n *\n * Implements the horizontal ARIA tablist keyboard pattern (APG): Left/Right\n * arrows move with wrap-around, Home/End jump to the edges. Activation is\n * manual — Enter/Space fire the tab's native button click, so only focus\n * movement is handled here.\n *\n * @param key - The KeyboardEvent.key value.\n * @param currentIndex - Index of the tab that received the event.\n * @param count - Total number of tabs.\n * @returns The index to focus, or null when the key is not handled.\n */\nexport function nextTabFocusIndex(\n key: string,\n currentIndex: number,\n count: number,\n): number | null {\n if (count <= 0) return null;\n switch (key) {\n case 'ArrowRight':\n return (currentIndex + 1) % count;\n case 'ArrowLeft':\n return (currentIndex - 1 + count) % count;\n case 'Home':\n return 0;\n case 'End':\n return count - 1;\n default:\n return null;\n }\n}\n\n/**\n * Move roving-tabindex focus to a tab without changing the selection.\n *\n * Per the ARIA tablist pattern, only the focused tab stays in the tab\n * order; selection follows activation (Enter/Space/click), not focus.\n *\n * @param tabs - Preview tab buttons in document order.\n * @param index - Index of the tab to focus.\n */\nexport function focusTab(tabs: readonly HTMLElement[], index: number): void {\n const target = tabs[index];\n if (!target) return;\n for (const [i, tab] of tabs.entries()) {\n tab.tabIndex = i === index ? 0 : -1;\n }\n target.focus();\n}\n\n/**\n * Read showcase theme metadata from server-rendered data attributes.\n *\n * The page renders one marquee card per theme carrying\n * `data-theme-preview`, `data-theme-name`, and `data-theme-icon`; the\n * base URL comes from the root element's `data-baseurl` attribute.\n *\n * @param documentObj - Document to read the metadata from.\n * @returns Metadata for preview-card and marquee updates.\n */\nexport function readShowcaseMeta(documentObj: Document): ShowcaseMeta {\n const meta: ShowcaseMeta = {\n baseUrl: documentObj.documentElement.getAttribute('data-baseurl') ?? '',\n themeFullNames: {},\n themeIcons: {},\n };\n for (const el of documentObj.querySelectorAll(`[${THEME_TRIGGER_ATTRIBUTE}]`)) {\n const themeId = el.getAttribute(THEME_TRIGGER_ATTRIBUTE);\n if (!themeId) continue;\n const fullName = el.getAttribute(THEME_NAME_ATTRIBUTE);\n const icon = el.getAttribute(THEME_ICON_ATTRIBUTE);\n if (fullName) meta.themeFullNames[themeId] = fullName;\n if (icon) meta.themeIcons[themeId] = icon;\n }\n return meta;\n}\n\n/**\n * Mark the trigger matching a theme active and deactivate the rest.\n *\n * @param triggers - Elements carrying the data-theme-preview attribute.\n * @param themeId - The active theme's identifier.\n */\nexport function syncThemeTriggers(triggers: readonly Element[], themeId: string): void {\n for (const trigger of triggers) {\n const isActive = trigger.getAttribute(THEME_TRIGGER_ATTRIBUTE) === themeId;\n trigger.classList.toggle('active', isActive);\n trigger.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n }\n}\n\n/**\n * Resolve the display name and icon URL for a theme from page metadata.\n *\n * @param theme - Theme identifier (e.g. 'catppuccin-mocha').\n * @param meta - Theme metadata read from the page.\n * @returns Display name and fully-qualified icon source.\n */\nexport function resolveThemeDisplay(theme: string, meta: ShowcaseMeta): ThemeDisplay {\n const name = meta.themeFullNames[theme] ?? theme;\n const icon = meta.themeIcons[theme] ?? DEFAULT_THEME_ICON;\n return {\n name,\n iconSrc: `${meta.baseUrl}/assets/img/${icon}`,\n };\n}\n\n/** Elements that render the preview card's progress bar. */\nexport interface ProgressElements {\n fill: HTMLElement;\n value: HTMLElement;\n bar: HTMLElement | null;\n}\n\n/**\n * Render the progress bar at a given percentage.\n *\n * @param elements - Progress bar elements.\n * @param percent - Percentage to render (0..100).\n */\nexport function renderProgress(elements: ProgressElements, percent: number): void {\n elements.fill.style.width = `${percent}%`;\n elements.value.textContent = `${percent}%`;\n elements.bar?.setAttribute('aria-valuenow', String(percent));\n}\n\n/**\n * Animate the progress bar from zero to its target.\n *\n * With reduced motion the target renders immediately; otherwise the target\n * render is deferred via the scheduler so the CSS transition can play.\n *\n * @param elements - Progress bar elements.\n * @param options - Target percentage, reduced-motion flag, and scheduler.\n */\nexport function animateProgress(\n elements: ProgressElements,\n options: {\n target: number;\n reducedMotion: boolean;\n schedule?: (callback: () => void) => void;\n },\n): void {\n const { target, reducedMotion } = options;\n renderProgress(elements, 0);\n if (reducedMotion) {\n renderProgress(elements, target);\n return;\n }\n const schedule =\n options.schedule ??\n ((callback: () => void): void => {\n requestAnimationFrame(() => {\n requestAnimationFrame(callback);\n });\n });\n schedule(() => {\n renderProgress(elements, target);\n });\n}\n\n/** Tears down showcase listeners and cancels animation loops. */\nexport type ShowcaseCleanup = () => void;\n\n/** No-op cleanup used when a feature has nothing to tear down. */\nconst NOOP_CLEANUP: ShowcaseCleanup = () => undefined;\n\n/** Active showcase cleanup; replaced on each `initShowcase` call. */\nlet activeShowcaseCleanup: ShowcaseCleanup | null = null;\n\n/**\n * Start the spotlight drift animation.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that cancels the RAF loop.\n */\nfunction initSpotlight(reducedMotion: boolean): ShowcaseCleanup {\n const root = document.getElementById('showcase-spotlight');\n if (!root || reducedMotion) return NOOP_CLEANUP;\n\n const left = root.querySelector<HTMLElement>('.showcase-spotlight-left');\n const right = root.querySelector<HTMLElement>('.showcase-spotlight-right');\n if (!left || !right) return NOOP_CLEANUP;\n\n let state: SpotlightState = { offset: 0, direction: 1 };\n let cancelled = false;\n let rafId = 0;\n\n const tick = (): void => {\n if (cancelled) return;\n state = stepSpotlight(state);\n left.style.transform = `translateX(${state.offset}px)`;\n right.style.transform = `translateX(${-state.offset}px)`;\n rafId = requestAnimationFrame(tick);\n };\n\n rafId = requestAnimationFrame(tick);\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n };\n}\n\n/**\n * Wire the comet-card tilt and glare animation.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that cancels the RAF loop and removes pointer listeners.\n */\nfunction initCometCard(reducedMotion: boolean): ShowcaseCleanup {\n const card = document.getElementById('showcase-comet-card');\n const glare = document.getElementById('showcase-comet-glare');\n if (!card || reducedMotion) return NOOP_CLEANUP;\n\n let current: TiltTargets = { ...RESTING_TILT_TARGETS };\n let targets: TiltTargets = { ...RESTING_TILT_TARGETS };\n let cancelled = false;\n let rafId = 0;\n\n const onMouseMove = (event: MouseEvent): void => {\n targets = computeTiltTargets(event.clientX, event.clientY, card.getBoundingClientRect());\n };\n\n const onMouseLeave = (): void => {\n targets = { ...RESTING_TILT_TARGETS };\n };\n\n card.addEventListener('mousemove', onMouseMove);\n card.addEventListener('mouseleave', onMouseLeave);\n\n const animate = (): void => {\n if (cancelled) return;\n current = {\n rotateX: approach(current.rotateX, targets.rotateX, 0.12),\n rotateY: approach(current.rotateY, targets.rotateY, 0.12),\n glareX: approach(current.glareX, targets.glareX, 0.15),\n glareY: approach(current.glareY, targets.glareY, 0.15),\n };\n card.style.transform =\n `perspective(900px) rotateX(${current.rotateX}deg) ` +\n `rotateY(${current.rotateY}deg) scale3d(1.02,1.02,1.02)`;\n if (glare) {\n glare.style.background =\n `radial-gradient(circle at ${current.glareX}% ${current.glareY}%, ` +\n 'color-mix(in srgb, var(--turbo-text-primary) 35%, transparent) 0%, transparent 65%)';\n }\n rafId = requestAnimationFrame(animate);\n };\n\n rafId = requestAnimationFrame(animate);\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n card.removeEventListener('mousemove', onMouseMove);\n card.removeEventListener('mouseleave', onMouseLeave);\n };\n}\n\n/**\n * Wire the hover-following text mask.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that removes the hover listeners.\n */\nfunction initTextMask(reducedMotion: boolean): ShowcaseCleanup {\n const wrap = document.getElementById('showcase-text-mask');\n if (!wrap || reducedMotion) return NOOP_CLEANUP;\n\n const onMouseMove = (event: MouseEvent): void => {\n const { x, y } = pointerPercent(event.clientX, event.clientY, wrap.getBoundingClientRect());\n wrap.style.setProperty('--mx', `${x}%`);\n wrap.style.setProperty('--my', `${y}%`);\n wrap.classList.add('is-hovering');\n };\n const onMouseLeave = (): void => {\n wrap.classList.remove('is-hovering');\n wrap.style.setProperty('--mx', '50%');\n wrap.style.setProperty('--my', '50%');\n };\n\n wrap.addEventListener('mousemove', onMouseMove);\n wrap.addEventListener('mouseleave', onMouseLeave);\n return () => {\n wrap.removeEventListener('mousemove', onMouseMove);\n wrap.removeEventListener('mouseleave', onMouseLeave);\n };\n}\n\n/**\n * Reveal elements on scroll, or immediately with reduced motion.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that disconnects the reveal observer.\n */\nfunction initScrollReveal(reducedMotion: boolean): ShowcaseCleanup {\n if (!('IntersectionObserver' in window)) return NOOP_CLEANUP;\n const items = document.querySelectorAll<HTMLElement>('[data-showcase-reveal]');\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n entry.target.classList.add('is-visible');\n observer.unobserve(entry.target);\n }\n }\n },\n { threshold: 0.15, rootMargin: '0px 0px -40px 0px' },\n );\n for (const el of items) {\n if (reducedMotion) {\n el.classList.add('is-visible');\n } else {\n observer.observe(el);\n }\n }\n return () => observer.disconnect();\n}\n\n/**\n * Pause marquee rows on hover and resume on leave.\n *\n * @returns Cleanup that removes the hover listeners from every row.\n */\nfunction initMarqueePause(): ShowcaseCleanup {\n const teardowns: ShowcaseCleanup[] = [];\n for (const row of document.querySelectorAll<HTMLElement>('.showcase-marquee-row')) {\n const onEnter = (): void => {\n row.style.animationPlayState = marqueePlayState(true);\n };\n const onLeave = (): void => {\n row.style.animationPlayState = marqueePlayState(false);\n };\n row.addEventListener('mouseenter', onEnter);\n row.addEventListener('mouseleave', onLeave);\n teardowns.push(() => {\n row.removeEventListener('mouseenter', onEnter);\n row.removeEventListener('mouseleave', onLeave);\n });\n }\n return () => {\n for (const teardown of teardowns) {\n teardown();\n }\n };\n}\n\n/**\n * Wire the interactive preview card: tabs, progress bar, buttons, and\n * theme-change updates.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @param meta - Theme metadata read from the page.\n * @returns Handler that re-renders the card for a newly active theme.\n */\nfunction initPreviewCard(reducedMotion: boolean, meta: ShowcaseMeta): (themeId: string) => void {\n const tabs = Array.from(document.querySelectorAll<HTMLElement>('.showcase-preview-tab'));\n const panels = Array.from(document.querySelectorAll<HTMLElement>('.showcase-preview-panel'));\n const toast = document.getElementById('showcase-preview-toast');\n let toastTimer: ReturnType<typeof setTimeout> | undefined;\n\n const progressFill = document.getElementById('showcase-progress-fill');\n const progressValue = document.getElementById('showcase-progress-value');\n const progressBar = document.getElementById('showcase-progress-bar');\n const progressElements: ProgressElements | null =\n progressFill && progressValue\n ? { fill: progressFill, value: progressValue, bar: progressBar }\n : null;\n\n const showToast = (message: string): void => {\n if (!toast) return;\n toast.textContent = message;\n toast.hidden = false;\n clearTimeout(toastTimer);\n toastTimer = setTimeout(() => {\n toast.hidden = true;\n }, 1600);\n };\n\n const runProgress = (): void => {\n if (!progressElements) return;\n animateProgress(progressElements, { target: PROGRESS_TARGET, reducedMotion });\n };\n\n for (const [index, tab] of tabs.entries()) {\n tab.addEventListener('click', () => {\n const target = tab.getAttribute('data-preview-tab');\n if (!target) return;\n applyTabSelection(tabs, panels, target);\n if (target === 'overview') runProgress();\n });\n tab.addEventListener('keydown', (event: KeyboardEvent) => {\n const focusIndex = nextTabFocusIndex(event.key, index, tabs.length);\n if (focusIndex === null) return;\n event.preventDefault();\n focusTab(tabs, focusIndex);\n });\n }\n\n const codeBtn = document.getElementById('showcase-preview-code');\n if (codeBtn) {\n codeBtn.addEventListener('click', () => {\n const snippet = 'background: var(--turbo-bg-surface);\\ncolor: var(--turbo-text-primary);';\n if (typeof navigator.clipboard?.writeText === 'function') {\n void navigator.clipboard\n .writeText(snippet)\n .then(() => {\n showToast('Copied CSS snippet');\n })\n .catch(() => {\n showToast(snippet);\n });\n } else {\n showToast(snippet);\n }\n });\n }\n\n const primaryBtn = document.getElementById('showcase-preview-primary');\n if (primaryBtn) {\n primaryBtn.addEventListener('click', () => {\n primaryBtn.classList.add('is-pressed');\n showToast('Primary action');\n setTimeout(() => {\n primaryBtn.classList.remove('is-pressed');\n }, 300);\n });\n }\n\n const outlineBtn = document.getElementById('showcase-preview-outline');\n if (outlineBtn) {\n outlineBtn.addEventListener('click', () => {\n outlineBtn.classList.toggle('is-active');\n showToast(outlineBtn.classList.contains('is-active') ? 'Outline active' : 'Outline default');\n });\n }\n\n const renderTheme = (theme: string): void => {\n const display = resolveThemeDisplay(theme, meta);\n const nameEl = document.getElementById('showcase-preview-theme-name');\n const iconEl = document.getElementById('showcase-preview-theme-icon');\n if (nameEl) nameEl.textContent = display.name;\n if (iconEl instanceof HTMLImageElement) iconEl.src = display.iconSrc;\n\n const overviewPanel = document.querySelector('[data-preview-panel=\"overview\"]');\n if (overviewPanel?.classList.contains('is-active')) {\n runProgress();\n }\n };\n\n runProgress();\n return renderTheme;\n}\n\n/**\n * Invoke a callback on every theme change, whatever the channel.\n *\n * Covers changes driven through the integration API (marquee clicks)\n * via `turbo-theme-change` events, and changes applied outside it (the\n * header dropdown) via a `data-theme` attribute observer. Consecutive\n * duplicate notifications are collapsed.\n *\n * @param onTheme - Callback invoked with each newly active theme ID.\n * @returns Cleanup that removes the event listener and disconnects the observer.\n */\nfunction wireThemeObserver(onTheme: (themeId: string) => void): ShowcaseCleanup {\n let lastTheme: string | null = null;\n\n const notify = (themeId: string | null): void => {\n if (!themeId || themeId === lastTheme) return;\n lastTheme = themeId;\n onTheme(themeId);\n };\n\n const unsubscribe = subscribeToThemeChanges((detail) => {\n notify(detail.themeId);\n }, document);\n\n const observer = new MutationObserver(() => {\n notify(document.documentElement.getAttribute('data-theme'));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n return () => {\n unsubscribe();\n observer.disconnect();\n };\n}\n\n/**\n * Wire the marquee theme cards to the theme-selector integration API.\n *\n * Clicks on `[data-theme-preview]` elements apply the named theme through\n * `applyTheme` (which lazily loads its CSS); hovering or focusing a card\n * prefetches the theme's stylesheet via the lazy-CSS helpers.\n *\n * Partial applications are surfaced: when the stylesheet fails to load\n * the selector keeps the previous theme's CSS in effect and suppresses\n * the theme-change event, so the page logs the failure instead of\n * pretending the switch happened.\n *\n * @returns Cleanup that removes click and prefetch listeners.\n */\nfunction initThemeControls(): ShowcaseCleanup {\n const onClick = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const trigger = target.closest(`[${THEME_TRIGGER_ATTRIBUTE}]`);\n const themeId = trigger?.getAttribute(THEME_TRIGGER_ATTRIBUTE);\n if (!themeId) return;\n void applyTheme(themeId).then((result) => {\n if (!result.applied || !result.cssLoaded) {\n console.warn(\n `Theme \"${themeId}\" was not fully applied: ` +\n 'its stylesheet failed to load, keeping the previous theme CSS.',\n );\n }\n });\n };\n\n document.addEventListener('click', onClick);\n const unwirePrefetch = wireHoverPrefetch(document);\n return () => {\n document.removeEventListener('click', onClick);\n unwirePrefetch();\n };\n}\n\n/**\n * Initialize every showcase interaction on the current document.\n *\n * Re-entrant: a second call tears down the previous initialization first\n * so RAF loops and document-level listeners never accumulate.\n *\n * @returns Cleanup that cancels animations and removes listeners.\n */\nexport function initShowcase(): ShowcaseCleanup {\n activeShowcaseCleanup?.();\n\n const reducedMotion = prefersReducedMotion(window);\n const meta = readShowcaseMeta(document);\n const cleanups: ShowcaseCleanup[] = [\n initSpotlight(reducedMotion),\n initCometCard(reducedMotion),\n initThemeControls(),\n initTextMask(reducedMotion),\n initScrollReveal(reducedMotion),\n initMarqueePause(),\n ];\n const renderTheme = initPreviewCard(reducedMotion, meta);\n\n const syncTheme = (themeId: string): void => {\n syncThemeTriggers(\n Array.from(document.querySelectorAll(`[${THEME_TRIGGER_ATTRIBUTE}]`)),\n themeId,\n );\n renderTheme(themeId);\n };\n cleanups.push(wireThemeObserver(syncTheme));\n syncTheme(getCurrentTheme(document));\n\n const cleanup: ShowcaseCleanup = () => {\n for (const teardown of cleanups) {\n teardown();\n }\n if (activeShowcaseCleanup === cleanup) {\n activeShowcaseCleanup = null;\n }\n };\n activeShowcaseCleanup = cleanup;\n return cleanup;\n}\n\n// Auto-initialize on DOMContentLoaded\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n document.addEventListener('DOMContentLoaded', () => {\n initShowcase();\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"homepage-showcase.js","names":["tokensData","VENDOR_ORDER","DEFAULT_THEME","GENERATED_VENDOR_ORDER","allThemeIds","THEME_FAMILIES","CORE_DEFAULT_THEME","GENERATED_THEME_FAMILIES","applyTheme","getCurrentTheme","applyThemeToDocument","getCurrentThemeFromDocument"],"sources":["../../packages/core/dist/themes/tokens.json","../../packages/core/dist/tokens/index.js","../../packages/core/dist/themes/generated/metadata.js","../../packages/core/dist/themes/metadata.js","../../packages/core/dist/catalog/create.js","../../packages/core/dist/catalog/sets.js","../../packages/theme-selector/src/appearance.ts","../../packages/theme-selector/src/generated/theme-maps.ts","../../packages/theme-selector/src/constants.ts","../../packages/theme-selector/src/errors.ts","../../packages/theme-selector/src/theme-loader.ts","../../packages/theme-selector/src/dropdown/helpers.ts","../../packages/theme-selector/src/theme-mapper.ts","../../packages/theme-selector/src/theme-resolver.ts","../../packages/theme-selector/src/apply-theme.ts","../../packages/theme-selector/src/storage.ts","../../packages/theme-selector/src/integration.ts","../../packages/theme-selector/src/lazy-css.ts","homepage-showcase.ts"],"sourcesContent":["{\n \"$schema\": \"https://design-tokens.org/schema.json\",\n \"$description\": \"Turbo Themes - Flat tokens for 43 themes\",\n \"$version\": \"0.44.22\",\n \"$generated\": \"bf10a4cff4a798dd502eaa65b810942b8bcf5f5319d50c899c1be7fda048e75e\",\n \"meta\": {\n \"themeIds\": [\n \"ayu-dark\",\n \"ayu-light\",\n \"ayu-mirage\",\n \"bulma-dark\",\n \"bulma-light\",\n \"catppuccin-frappe\",\n \"catppuccin-latte\",\n \"catppuccin-macchiato\",\n \"catppuccin-mocha\",\n \"dracula\",\n \"everforest-dark-hard\",\n \"everforest-dark-soft\",\n \"everforest-dark\",\n \"everforest-light-hard\",\n \"everforest-light-soft\",\n \"everforest-light\",\n \"github-dark\",\n \"github-light\",\n \"gruvbox-dark-hard\",\n \"gruvbox-dark-soft\",\n \"gruvbox-dark\",\n \"gruvbox-light-hard\",\n \"gruvbox-light-soft\",\n \"gruvbox-light\",\n \"kanagawa-dragon\",\n \"kanagawa-lotus\",\n \"kanagawa-wave\",\n \"nord\",\n \"one-dark\",\n \"one-light\",\n \"radix-mauve-dark\",\n \"radix-mauve-light\",\n \"radix-slate-dark\",\n \"radix-slate-light\",\n \"rose-pine-dawn\",\n \"rose-pine-moon\",\n \"rose-pine\",\n \"solarized-dark\",\n \"solarized-light\",\n \"terminal\",\n \"tokyo-night-dark\",\n \"tokyo-night-light\",\n \"tokyo-night-storm\"\n ],\n \"totalThemes\": 43\n },\n \"shared\": {\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n }\n },\n \"themes\": {\n \"ayu-dark\": {\n \"id\": \"ayu-dark\",\n \"label\": \"Ayu Dark\",\n \"vendor\": \"ayu\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#0d1017\",\n \"surface\": \"#141821\",\n \"overlay\": \"#1b1f29\"\n },\n \"text\": {\n \"primary\": \"#bfbdb6\",\n \"secondary\": \"#818b96\",\n \"inverse\": \"#0d1017\"\n },\n \"brand\": {\n \"primary\": \"#e6b450\",\n \"primaryText\": \"#0d1017\"\n },\n \"state\": {\n \"info\": \"#39bae6\",\n \"success\": \"#aad94c\",\n \"warning\": \"#ff8f40\",\n \"danger\": \"#d95757\",\n \"infoText\": \"#0d1017\",\n \"successText\": \"#0d1017\",\n \"warningText\": \"#0d1017\",\n \"dangerText\": \"#0d1017\"\n },\n \"border\": {\n \"default\": \"#1b1f29\"\n },\n \"accent\": {\n \"link\": \"#ffb454\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#ffb454\",\n \"h2\": \"#59c2ff\",\n \"h3\": \"#39bae6\",\n \"h4\": \"#aad94c\",\n \"h5\": \"#d2a6ff\",\n \"h6\": \"#ff8f40\"\n },\n \"body\": {\n \"primary\": \"#bfbdb6\",\n \"secondary\": \"#7c8691\"\n },\n \"link\": {\n \"default\": \"#ffb454\"\n },\n \"selection\": {\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#1c212b\"\n },\n \"blockquote\": {\n \"border\": \"#1b1f29\",\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#141821\"\n },\n \"codeInline\": {\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#1b1f29\"\n },\n \"codeBlock\": {\n \"fg\": \"#bfbdb6\",\n \"bg\": \"#1b1f29\"\n },\n \"table\": {\n \"border\": \"#1b1f29\",\n \"stripe\": \"#141821\",\n \"theadBg\": \"#1b1f29\"\n }\n }\n }\n },\n \"ayu-light\": {\n \"id\": \"ayu-light\",\n \"label\": \"Ayu Light\",\n \"vendor\": \"ayu\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f8f9fa\",\n \"surface\": \"#fafafa\",\n \"overlay\": \"#e7eaed\"\n },\n \"text\": {\n \"primary\": \"#5c6166\",\n \"secondary\": \"#5e6672\",\n \"inverse\": \"#f8f9fa\"\n },\n \"brand\": {\n \"primary\": \"#f29718\",\n \"primaryText\": \"#343435\"\n },\n \"state\": {\n \"info\": \"#55b4d4\",\n \"success\": \"#86b300\",\n \"warning\": \"#ff7e33\",\n \"danger\": \"#e65050\",\n \"infoText\": \"#39393a\",\n \"successText\": \"#373737\",\n \"warningText\": \"#343435\",\n \"dangerText\": \"#161617\"\n },\n \"border\": {\n \"default\": \"#e7eaed\"\n },\n \"accent\": {\n \"link\": \"#775995\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#c28200\",\n \"h2\": \"#3696db\",\n \"h3\": \"#4899b4\",\n \"h4\": \"#759c00\",\n \"h5\": \"#a37acc\",\n \"h6\": \"#e3702d\"\n },\n \"body\": {\n \"primary\": \"#5c6166\",\n \"secondary\": \"#656f7c\"\n },\n \"link\": {\n \"default\": \"#775995\"\n },\n \"selection\": {\n \"fg\": \"#5c6166\",\n \"bg\": \"#e5e9ed\"\n },\n \"blockquote\": {\n \"border\": \"#e7eaed\",\n \"fg\": \"#5c6166\",\n \"bg\": \"#fafafa\"\n },\n \"codeInline\": {\n \"fg\": \"#5c6166\",\n \"bg\": \"#e7eaed\"\n },\n \"codeBlock\": {\n \"fg\": \"#5c6166\",\n \"bg\": \"#e7eaed\"\n },\n \"table\": {\n \"border\": \"#e7eaed\",\n \"stripe\": \"#fafafa\",\n \"theadBg\": \"#e7eaed\"\n }\n }\n }\n },\n \"ayu-mirage\": {\n \"id\": \"ayu-mirage\",\n \"label\": \"Ayu Mirage\",\n \"vendor\": \"ayu\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1f2430\",\n \"surface\": \"#282e3b\",\n \"overlay\": \"#293040\"\n },\n \"text\": {\n \"primary\": \"#cccac2\",\n \"secondary\": \"#959daa\",\n \"inverse\": \"#1f2430\"\n },\n \"brand\": {\n \"primary\": \"#ffcc66\",\n \"primaryText\": \"#1f2430\"\n },\n \"state\": {\n \"info\": \"#5ccfe6\",\n \"success\": \"#d5ff80\",\n \"warning\": \"#ffad66\",\n \"danger\": \"#ff6666\",\n \"infoText\": \"#1f2430\",\n \"successText\": \"#1f2430\",\n \"warningText\": \"#1f2430\",\n \"dangerText\": \"#1f2430\"\n },\n \"border\": {\n \"default\": \"#171b24\"\n },\n \"accent\": {\n \"link\": \"#ffd173\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#ffd173\",\n \"h2\": \"#73d0ff\",\n \"h3\": \"#5ccfe6\",\n \"h4\": \"#d5ff80\",\n \"h5\": \"#dfbfff\",\n \"h6\": \"#ffad66\"\n },\n \"body\": {\n \"primary\": \"#cccac2\",\n \"secondary\": \"#929aa8\"\n },\n \"link\": {\n \"default\": \"#ffd173\"\n },\n \"selection\": {\n \"fg\": \"#cccac2\",\n \"bg\": \"#293040\"\n },\n \"blockquote\": {\n \"border\": \"#171b24\",\n \"fg\": \"#cccac2\",\n \"bg\": \"#282e3b\"\n },\n \"codeInline\": {\n \"fg\": \"#cccac2\",\n \"bg\": \"#293040\"\n },\n \"codeBlock\": {\n \"fg\": \"#cccac2\",\n \"bg\": \"#293040\"\n },\n \"table\": {\n \"border\": \"#171b24\",\n \"stripe\": \"#282e3b\",\n \"theadBg\": \"#293040\"\n }\n }\n }\n },\n \"bulma-dark\": {\n \"id\": \"bulma-dark\",\n \"label\": \"Bulma Dark\",\n \"vendor\": \"bulma\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#141414\",\n \"surface\": \"#1f1f1f\",\n \"overlay\": \"#2b2b2b\"\n },\n \"text\": {\n \"primary\": \"#f5f5f5\",\n \"secondary\": \"#dbdbdb\",\n \"inverse\": \"#141414\"\n },\n \"brand\": {\n \"primary\": \"#00d1b2\",\n \"primaryText\": \"#141414\"\n },\n \"state\": {\n \"info\": \"#3e8ed0\",\n \"success\": \"#48c78e\",\n \"warning\": \"#ffe08a\",\n \"danger\": \"#f14668\",\n \"infoText\": \"#141414\",\n \"successText\": \"#141414\",\n \"warningText\": \"#141414\",\n \"dangerText\": \"#141414\"\n },\n \"border\": {\n \"default\": \"#363636\"\n },\n \"accent\": {\n \"link\": \"#8293d9\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Nunito Sans\\\", BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", Roboto, Oxygen, Ubuntu, Cantarell, \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif\",\n \"mono\": \"\\\"JetBrains Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,400;0,6..12,600;0,6..12,700;1,6..12,400&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#00d1b2\",\n \"h2\": \"#7289da\",\n \"h3\": \"#5dade2\",\n \"h4\": \"#58d68d\",\n \"h5\": \"#f7dc6f\",\n \"h6\": \"#f1948a\"\n },\n \"body\": {\n \"primary\": \"#dbdbdb\",\n \"secondary\": \"#b5b5b5\"\n },\n \"link\": {\n \"default\": \"#8293d9\"\n },\n \"selection\": {\n \"fg\": \"#f5f5f5\",\n \"bg\": \"#2f6acb\"\n },\n \"blockquote\": {\n \"border\": \"#363636\",\n \"fg\": \"#dbdbdb\",\n \"bg\": \"#1f1f1f\"\n },\n \"codeInline\": {\n \"fg\": \"#f46884\",\n \"bg\": \"#2b2b2b\"\n },\n \"codeBlock\": {\n \"fg\": \"#f5f5f5\",\n \"bg\": \"#2b2b2b\"\n },\n \"table\": {\n \"border\": \"#404040\",\n \"stripe\": \"#1c1c1c\",\n \"theadBg\": \"#2d2d2d\",\n \"cellBg\": \"#1a1a1a\",\n \"headerFg\": \"#f5f5f5\"\n }\n },\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#1c1c1c\",\n \"border\": \"#3a3a3a\",\n \"headerBg\": \"#252525\",\n \"footerBg\": \"#1f1f1f\"\n },\n \"message\": {\n \"bg\": \"#1f1f1f\",\n \"headerBg\": \"#2a2a2a\",\n \"border\": \"#404040\",\n \"bodyFg\": \"#e0e0e0\"\n },\n \"panel\": {\n \"bg\": \"#1c1c1c\",\n \"headerBg\": \"#2a2a2a\",\n \"headerFg\": \"#f5f5f5\",\n \"border\": \"#3a3a3a\",\n \"blockBg\": \"#1f1f1f\",\n \"blockHoverBg\": \"#262626\",\n \"blockActiveBg\": \"#2d3748\"\n },\n \"box\": {\n \"bg\": \"#1c1c1c\",\n \"border\": \"#3a3a3a\"\n },\n \"notification\": {\n \"bg\": \"#252525\",\n \"border\": \"#404040\"\n },\n \"modal\": {\n \"bg\": \"rgba(0, 0, 0, 0.86)\",\n \"cardBg\": \"#1c1c1c\",\n \"headerBg\": \"#252525\",\n \"footerBg\": \"#1f1f1f\"\n },\n \"dropdown\": {\n \"bg\": \"#1c1c1c\",\n \"itemHoverBg\": \"#2a2a2a\",\n \"border\": \"#404040\"\n },\n \"tabs\": {\n \"border\": \"#404040\",\n \"linkBg\": \"#252525\",\n \"linkActiveBg\": \"#1c1c1c\",\n \"linkHoverBg\": \"#2a2a2a\"\n }\n }\n }\n },\n \"bulma-light\": {\n \"id\": \"bulma-light\",\n \"label\": \"Bulma Light\",\n \"vendor\": \"bulma\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#ffffff\",\n \"surface\": \"#f5f5f5\",\n \"overlay\": \"#eeeeee\"\n },\n \"text\": {\n \"primary\": \"#363636\",\n \"secondary\": \"#4a4a4a\",\n \"inverse\": \"#ffffff\"\n },\n \"brand\": {\n \"primary\": \"#00d1b2\",\n \"primaryText\": \"#1c1c1c\"\n },\n \"state\": {\n \"info\": \"#3e8ed0\",\n \"success\": \"#48c78e\",\n \"warning\": \"#ffe08a\",\n \"danger\": \"#f14668\",\n \"successText\": \"#363636\",\n \"warningText\": \"#363636\",\n \"infoText\": \"#1e1e1e\",\n \"dangerText\": \"#1b1b1b\"\n },\n \"border\": {\n \"default\": \"#dbdbdb\"\n },\n \"accent\": {\n \"link\": \"#485fc7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Nunito Sans\\\", BlinkMacSystemFont, -apple-system, \\\"Segoe UI\\\", Roboto, Oxygen, Ubuntu, Cantarell, \\\"Fira Sans\\\", \\\"Droid Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif\",\n \"mono\": \"\\\"JetBrains Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,400;0,6..12,600;0,6..12,700;1,6..12,400&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#00a088\",\n \"h2\": \"#485fc7\",\n \"h3\": \"#3e8ed0\",\n \"h4\": \"#399f71\",\n \"h5\": \"#9f8c56\",\n \"h6\": \"#f14668\"\n },\n \"body\": {\n \"primary\": \"#4a4a4a\",\n \"secondary\": \"#6b6b6b\"\n },\n \"link\": {\n \"default\": \"#485fc7\"\n },\n \"selection\": {\n \"fg\": \"#363636\",\n \"bg\": \"#b5d5ff\"\n },\n \"blockquote\": {\n \"border\": \"#dbdbdb\",\n \"fg\": \"#4a4a4a\",\n \"bg\": \"#f5f5f5\"\n },\n \"codeInline\": {\n \"fg\": \"#c23853\",\n \"bg\": \"#f5f5f5\"\n },\n \"codeBlock\": {\n \"fg\": \"#363636\",\n \"bg\": \"#f5f5f5\"\n },\n \"table\": {\n \"border\": \"#dbdbdb\",\n \"stripe\": \"#fafafa\",\n \"theadBg\": \"#f0f0f0\",\n \"cellBg\": \"#ffffff\",\n \"headerFg\": \"#363636\"\n }\n },\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#ffffff\",\n \"border\": \"#d5d5d5\",\n \"headerBg\": \"#f5f5f5\",\n \"footerBg\": \"#fafafa\"\n },\n \"message\": {\n \"bg\": \"#f8f9fa\",\n \"headerBg\": \"#eef1f4\",\n \"border\": \"#d5dbe1\",\n \"bodyFg\": \"#4a4a4a\"\n },\n \"panel\": {\n \"bg\": \"#ffffff\",\n \"headerBg\": \"#f0f0f0\",\n \"headerFg\": \"#363636\",\n \"border\": \"#d5d5d5\",\n \"blockBg\": \"#fafafa\",\n \"blockHoverBg\": \"#f5f5f5\",\n \"blockActiveBg\": \"#eef6fc\"\n },\n \"box\": {\n \"bg\": \"#ffffff\",\n \"border\": \"#e0e0e0\"\n },\n \"notification\": {\n \"bg\": \"#f5f5f5\",\n \"border\": \"#e0e0e0\"\n },\n \"modal\": {\n \"bg\": \"rgba(10, 10, 10, 0.86)\",\n \"cardBg\": \"#ffffff\",\n \"headerBg\": \"#f5f5f5\",\n \"footerBg\": \"#fafafa\"\n },\n \"dropdown\": {\n \"bg\": \"#ffffff\",\n \"itemHoverBg\": \"#f5f5f5\",\n \"border\": \"#dbdbdb\"\n },\n \"tabs\": {\n \"border\": \"#dbdbdb\",\n \"linkBg\": \"#f5f5f5\",\n \"linkActiveBg\": \"#ffffff\",\n \"linkHoverBg\": \"#eeeeee\"\n }\n }\n }\n },\n \"catppuccin-frappe\": {\n \"id\": \"catppuccin-frappe\",\n \"label\": \"Catppuccin Frappé\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#303446\",\n \"surface\": \"#292c3c\",\n \"overlay\": \"#232634\"\n },\n \"text\": {\n \"primary\": \"#c6d0f5\",\n \"secondary\": \"#a5adce\",\n \"inverse\": \"#303446\"\n },\n \"brand\": {\n \"primary\": \"#8caaee\",\n \"primaryText\": \"#303446\"\n },\n \"state\": {\n \"info\": \"#99d1db\",\n \"success\": \"#a6d189\",\n \"warning\": \"#e5c890\",\n \"danger\": \"#e78284\",\n \"infoText\": \"#303446\",\n \"successText\": \"#303446\",\n \"warningText\": \"#303446\",\n \"dangerText\": \"#2f3244\"\n },\n \"border\": {\n \"default\": \"#737994\"\n },\n \"accent\": {\n \"link\": \"#8caaee\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#a6d189\",\n \"h2\": \"#8caaee\",\n \"h3\": \"#85c1dc\",\n \"h4\": \"#e5c890\",\n \"h5\": \"#ca9ee6\",\n \"h6\": \"#e78284\"\n },\n \"body\": {\n \"primary\": \"#c6d0f5\",\n \"secondary\": \"#a5adce\"\n },\n \"link\": {\n \"default\": \"#8caaee\"\n },\n \"selection\": {\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#515668\"\n },\n \"blockquote\": {\n \"border\": \"#838ba7\",\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#292c3c\"\n },\n \"codeInline\": {\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#414559\"\n },\n \"codeBlock\": {\n \"fg\": \"#c6d0f5\",\n \"bg\": \"#414559\"\n },\n \"table\": {\n \"border\": \"#838ba7\",\n \"stripe\": \"#414559\",\n \"theadBg\": \"#50566c\"\n }\n }\n }\n },\n \"catppuccin-latte\": {\n \"id\": \"catppuccin-latte\",\n \"label\": \"Catppuccin Latte\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#eff1f5\",\n \"surface\": \"#e6e9ef\",\n \"overlay\": \"#dce0e8\"\n },\n \"text\": {\n \"primary\": \"#4c4f69\",\n \"secondary\": \"#5c5f71\",\n \"inverse\": \"#eff1f5\"\n },\n \"brand\": {\n \"primary\": \"#1e66f5\",\n \"primaryText\": \"#fbfbfc\"\n },\n \"state\": {\n \"info\": \"#0378a7\",\n \"success\": \"#40a02b\",\n \"warning\": \"#df8e1d\",\n \"danger\": \"#d20f39\",\n \"infoText\": \"#fbfbfb\",\n \"successText\": \"#212222\",\n \"warningText\": \"#323333\",\n \"dangerText\": \"#eff1f5\"\n },\n \"border\": {\n \"default\": \"#9ca0b0\"\n },\n \"accent\": {\n \"link\": \"#1a57d2\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3c9829\",\n \"h2\": \"#1e66f5\",\n \"h3\": \"#1d92a7\",\n \"h4\": \"#ba7618\",\n \"h5\": \"#8839ef\",\n \"h6\": \"#d20f39\"\n },\n \"body\": {\n \"primary\": \"#4c4f69\",\n \"secondary\": \"#616477\"\n },\n \"link\": {\n \"default\": \"#1a57d2\"\n },\n \"selection\": {\n \"fg\": \"#4c4f69\",\n \"bg\": \"#c6c8d0\"\n },\n \"blockquote\": {\n \"border\": \"#8c8fa1\",\n \"fg\": \"#4c4f69\",\n \"bg\": \"#e6e9ef\"\n },\n \"codeInline\": {\n \"fg\": \"#4c4f69\",\n \"bg\": \"#ccd0da\"\n },\n \"codeBlock\": {\n \"fg\": \"#4c4f69\",\n \"bg\": \"#ccd0da\"\n },\n \"table\": {\n \"border\": \"#8c8fa1\",\n \"stripe\": \"#ccd0da\",\n \"theadBg\": \"#c4c8d2\"\n }\n }\n }\n },\n \"catppuccin-macchiato\": {\n \"id\": \"catppuccin-macchiato\",\n \"label\": \"Catppuccin Macchiato\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#24273a\",\n \"surface\": \"#1e2030\",\n \"overlay\": \"#181926\"\n },\n \"text\": {\n \"primary\": \"#cad3f5\",\n \"secondary\": \"#a5adcb\",\n \"inverse\": \"#24273a\"\n },\n \"brand\": {\n \"primary\": \"#8aadf4\",\n \"primaryText\": \"#24273a\"\n },\n \"state\": {\n \"info\": \"#91d7e3\",\n \"success\": \"#a6da95\",\n \"warning\": \"#eed49f\",\n \"danger\": \"#ed8796\",\n \"infoText\": \"#24273a\",\n \"successText\": \"#24273a\",\n \"warningText\": \"#24273a\",\n \"dangerText\": \"#24273a\"\n },\n \"border\": {\n \"default\": \"#6e738d\"\n },\n \"accent\": {\n \"link\": \"#8aadf4\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#a6da95\",\n \"h2\": \"#8aadf4\",\n \"h3\": \"#7dc4e4\",\n \"h4\": \"#eed49f\",\n \"h5\": \"#c6a0f6\",\n \"h6\": \"#ed8796\"\n },\n \"body\": {\n \"primary\": \"#cad3f5\",\n \"secondary\": \"#a5adcb\"\n },\n \"link\": {\n \"default\": \"#8aadf4\"\n },\n \"selection\": {\n \"fg\": \"#cad3f5\",\n \"bg\": \"#53576a\"\n },\n \"blockquote\": {\n \"border\": \"#8087a2\",\n \"fg\": \"#cad3f5\",\n \"bg\": \"#1e2030\"\n },\n \"codeInline\": {\n \"fg\": \"#cad3f5\",\n \"bg\": \"#363a4f\"\n },\n \"codeBlock\": {\n \"fg\": \"#cad3f5\",\n \"bg\": \"#363a4f\"\n },\n \"table\": {\n \"border\": \"#8087a2\",\n \"stripe\": \"#363a4f\",\n \"theadBg\": \"#494d64\"\n }\n }\n }\n },\n \"catppuccin-mocha\": {\n \"id\": \"catppuccin-mocha\",\n \"label\": \"Catppuccin Mocha\",\n \"vendor\": \"catppuccin\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1e1e2e\",\n \"surface\": \"#181825\",\n \"overlay\": \"#11111b\"\n },\n \"text\": {\n \"primary\": \"#cdd6f4\",\n \"secondary\": \"#a6adc8\",\n \"inverse\": \"#1e1e2e\"\n },\n \"brand\": {\n \"primary\": \"#89b4fa\",\n \"primaryText\": \"#1e1e2e\"\n },\n \"state\": {\n \"info\": \"#89dceb\",\n \"success\": \"#a6e3a1\",\n \"warning\": \"#f9e2af\",\n \"danger\": \"#f38ba8\",\n \"infoText\": \"#1e1e2e\",\n \"successText\": \"#1e1e2e\",\n \"warningText\": \"#1e1e2e\",\n \"dangerText\": \"#1e1e2e\"\n },\n \"border\": {\n \"default\": \"#6c7086\"\n },\n \"accent\": {\n \"link\": \"#89b4fa\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#a6e3a1\",\n \"h2\": \"#89b4fa\",\n \"h3\": \"#74c7ec\",\n \"h4\": \"#f9e2af\",\n \"h5\": \"#cba6f7\",\n \"h6\": \"#f38ba8\"\n },\n \"body\": {\n \"primary\": \"#cdd6f4\",\n \"secondary\": \"#a6adc8\"\n },\n \"link\": {\n \"default\": \"#89b4fa\"\n },\n \"selection\": {\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#56596a\"\n },\n \"blockquote\": {\n \"border\": \"#7f849c\",\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#181825\"\n },\n \"codeInline\": {\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#313244\"\n },\n \"codeBlock\": {\n \"fg\": \"#cdd6f4\",\n \"bg\": \"#313244\"\n },\n \"table\": {\n \"border\": \"#7f849c\",\n \"stripe\": \"#313244\",\n \"theadBg\": \"#45475a\"\n }\n }\n }\n },\n \"dracula\": {\n \"id\": \"dracula\",\n \"label\": \"Dracula\",\n \"vendor\": \"dracula\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#282a36\",\n \"surface\": \"#21222c\",\n \"overlay\": \"#44475a\"\n },\n \"text\": {\n \"primary\": \"#f8f8f2\",\n \"secondary\": \"#b3bbd3\",\n \"inverse\": \"#282a36\"\n },\n \"brand\": {\n \"primary\": \"#bd93f9\",\n \"primaryText\": \"#282a36\"\n },\n \"state\": {\n \"info\": \"#8be9fd\",\n \"success\": \"#50fa7b\",\n \"warning\": \"#f1fa8c\",\n \"danger\": \"#ff5555\",\n \"infoText\": \"#282a36\",\n \"successText\": \"#282a36\",\n \"warningText\": \"#282a36\",\n \"dangerText\": \"#242631\"\n },\n \"border\": {\n \"default\": \"#44475a\"\n },\n \"accent\": {\n \"link\": \"#8be9fd\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, sans-serif\",\n \"mono\": \"\\\"Fira Code\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#ff79c6\",\n \"h2\": \"#bd93f9\",\n \"h3\": \"#8be9fd\",\n \"h4\": \"#50fa7b\",\n \"h5\": \"#ffb86c\",\n \"h6\": \"#f1fa8c\"\n },\n \"body\": {\n \"primary\": \"#f8f8f2\",\n \"secondary\": \"#8995bb\"\n },\n \"link\": {\n \"default\": \"#8be9fd\"\n },\n \"selection\": {\n \"fg\": \"#f8f8f2\",\n \"bg\": \"#44475a\"\n },\n \"blockquote\": {\n \"border\": \"#bd93f9\",\n \"fg\": \"#7f8db5\",\n \"bg\": \"#21222c\"\n },\n \"codeInline\": {\n \"fg\": \"#50fa7b\",\n \"bg\": \"#21222c\"\n },\n \"codeBlock\": {\n \"fg\": \"#f8f8f2\",\n \"bg\": \"#21222c\"\n },\n \"table\": {\n \"border\": \"#44475a\",\n \"stripe\": \"#21222c\",\n \"theadBg\": \"#44475a\",\n \"cellBg\": \"#282a36\",\n \"headerFg\": \"#f8f8f2\"\n }\n },\n \"spacing\": {\n \"xs\": \"0.25rem\",\n \"sm\": \"0.5rem\",\n \"md\": \"1rem\",\n \"lg\": \"1.5rem\",\n \"xl\": \"2rem\"\n },\n \"elevation\": {\n \"none\": \"none\",\n \"sm\": \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"md\": \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"lg\": \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"xl\": \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n },\n \"animation\": {\n \"durationFast\": \"150ms\",\n \"durationNormal\": \"300ms\",\n \"durationSlow\": \"500ms\",\n \"easingDefault\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"easingEmphasized\": \"cubic-bezier(0.05, 0.7, 0.1, 1)\"\n },\n \"opacity\": {\n \"disabled\": 0.5,\n \"hover\": 0.8,\n \"pressed\": 0.6\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#21222c\",\n \"border\": \"#6272a4\",\n \"headerBg\": \"#282a36\",\n \"footerBg\": \"#21222c\"\n },\n \"message\": {\n \"bg\": \"#282a36\",\n \"headerBg\": \"#44475a\",\n \"border\": \"#6272a4\",\n \"bodyFg\": \"#f8f8f2\"\n },\n \"panel\": {\n \"bg\": \"#21222c\",\n \"headerBg\": \"#44475a\",\n \"headerFg\": \"#f8f8f2\",\n \"border\": \"#6272a4\",\n \"blockBg\": \"#282a36\",\n \"blockHoverBg\": \"#2e303e\",\n \"blockActiveBg\": \"#44475a\"\n },\n \"box\": {\n \"bg\": \"#21222c\",\n \"border\": \"#6272a4\"\n },\n \"notification\": {\n \"bg\": \"#282a36\",\n \"border\": \"#6272a4\"\n },\n \"modal\": {\n \"bg\": \"rgba(40, 42, 54, 0.9)\",\n \"cardBg\": \"#21222c\",\n \"headerBg\": \"#282a36\",\n \"footerBg\": \"#21222c\"\n },\n \"dropdown\": {\n \"bg\": \"#21222c\",\n \"itemHoverBg\": \"#2e303e\",\n \"border\": \"#6272a4\"\n },\n \"tabs\": {\n \"border\": \"#6272a4\",\n \"linkBg\": \"#2e303e\",\n \"linkActiveBg\": \"#21222c\",\n \"linkHoverBg\": \"#44475a\"\n }\n }\n }\n },\n \"everforest-dark-hard\": {\n \"id\": \"everforest-dark-hard\",\n \"label\": \"Everforest Dark Hard\",\n \"vendor\": \"everforest\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#272E33\",\n \"surface\": \"#2E383C\",\n \"overlay\": \"#374145\"\n },\n \"text\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#a7b2aa\",\n \"inverse\": \"#272E33\"\n },\n \"brand\": {\n \"primary\": \"#A7C080\",\n \"primaryText\": \"#272E33\"\n },\n \"state\": {\n \"info\": \"#7FBBB3\",\n \"success\": \"#A7C080\",\n \"warning\": \"#DBBC7F\",\n \"danger\": \"#E67E80\",\n \"infoText\": \"#272E33\",\n \"successText\": \"#272E33\",\n \"warningText\": \"#272E33\",\n \"dangerText\": \"#272E33\"\n },\n \"border\": {\n \"default\": \"#495156\"\n },\n \"accent\": {\n \"link\": \"#83C092\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#A7C080\",\n \"h2\": \"#7FBBB3\",\n \"h3\": \"#83C092\",\n \"h4\": \"#DBBC7F\",\n \"h5\": \"#D699B6\",\n \"h6\": \"#E67E80\"\n },\n \"body\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#9DA9A0\"\n },\n \"link\": {\n \"default\": \"#83C092\"\n },\n \"selection\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#374145\"\n },\n \"blockquote\": {\n \"border\": \"#495156\",\n \"fg\": \"#9DA9A0\",\n \"bg\": \"#2E383C\"\n },\n \"codeInline\": {\n \"fg\": \"#e79e7d\",\n \"bg\": \"#374145\"\n },\n \"codeBlock\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#2E383C\"\n },\n \"table\": {\n \"border\": \"#495156\",\n \"stripe\": \"#374145\",\n \"theadBg\": \"#2E383C\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#2E383C\",\n \"border\": \"#495156\",\n \"headerBg\": \"#272E33\",\n \"footerBg\": \"#2E383C\"\n },\n \"message\": {\n \"bg\": \"#272E33\",\n \"headerBg\": \"#2E383C\",\n \"border\": \"#495156\",\n \"bodyFg\": \"#D3C6AA\"\n },\n \"panel\": {\n \"bg\": \"#2E383C\",\n \"headerBg\": \"#272E33\",\n \"headerFg\": \"#D3C6AA\",\n \"border\": \"#495156\",\n \"blockBg\": \"#272E33\",\n \"blockHoverBg\": \"#2E383C\",\n \"blockActiveBg\": \"#374145\"\n },\n \"box\": {\n \"bg\": \"#2E383C\",\n \"border\": \"#495156\"\n },\n \"notification\": {\n \"bg\": \"#272E33\",\n \"border\": \"#495156\"\n },\n \"modal\": {\n \"bg\": \"rgba(39, 46, 51, 0.9)\",\n \"cardBg\": \"#2E383C\",\n \"headerBg\": \"#272E33\",\n \"footerBg\": \"#2E383C\"\n },\n \"dropdown\": {\n \"bg\": \"#2E383C\",\n \"itemHoverBg\": \"#374145\",\n \"border\": \"#495156\"\n },\n \"tabs\": {\n \"border\": \"#495156\",\n \"linkBg\": \"#2E383C\",\n \"linkActiveBg\": \"#272E33\",\n \"linkHoverBg\": \"#374145\"\n }\n }\n }\n },\n \"everforest-dark-soft\": {\n \"id\": \"everforest-dark-soft\",\n \"label\": \"Everforest Dark Soft\",\n \"vendor\": \"everforest\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#333C43\",\n \"surface\": \"#3A464C\",\n \"overlay\": \"#434F55\"\n },\n \"text\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#bdc5be\",\n \"inverse\": \"#333C43\"\n },\n \"brand\": {\n \"primary\": \"#A7C080\",\n \"primaryText\": \"#333C43\"\n },\n \"state\": {\n \"info\": \"#7FBBB3\",\n \"success\": \"#A7C080\",\n \"warning\": \"#DBBC7F\",\n \"danger\": \"#E67E80\",\n \"dangerText\": \"#2a3238\",\n \"infoText\": \"#333C43\",\n \"successText\": \"#333C43\",\n \"warningText\": \"#333C43\"\n },\n \"border\": {\n \"default\": \"#555F66\"\n },\n \"accent\": {\n \"link\": \"#9dcea9\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#A7C080\",\n \"h2\": \"#7FBBB3\",\n \"h3\": \"#83C092\",\n \"h4\": \"#DBBC7F\",\n \"h5\": \"#D699B6\",\n \"h6\": \"#E67E80\"\n },\n \"body\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#aeb8b0\"\n },\n \"link\": {\n \"default\": \"#9dcea9\"\n },\n \"selection\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#434F55\"\n },\n \"blockquote\": {\n \"border\": \"#555F66\",\n \"fg\": \"#aeb8b0\",\n \"bg\": \"#3A464C\"\n },\n \"codeInline\": {\n \"fg\": \"#edb79d\",\n \"bg\": \"#434F55\"\n },\n \"codeBlock\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#3A464C\"\n },\n \"table\": {\n \"border\": \"#555F66\",\n \"stripe\": \"#434F55\",\n \"theadBg\": \"#3A464C\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#3A464C\",\n \"border\": \"#555F66\",\n \"headerBg\": \"#333C43\",\n \"footerBg\": \"#3A464C\"\n },\n \"message\": {\n \"bg\": \"#333C43\",\n \"headerBg\": \"#3A464C\",\n \"border\": \"#555F66\",\n \"bodyFg\": \"#D3C6AA\"\n },\n \"panel\": {\n \"bg\": \"#3A464C\",\n \"headerBg\": \"#333C43\",\n \"headerFg\": \"#D3C6AA\",\n \"border\": \"#555F66\",\n \"blockBg\": \"#333C43\",\n \"blockHoverBg\": \"#3A464C\",\n \"blockActiveBg\": \"#434F55\"\n },\n \"box\": {\n \"bg\": \"#3A464C\",\n \"border\": \"#555F66\"\n },\n \"notification\": {\n \"bg\": \"#333C43\",\n \"border\": \"#555F66\"\n },\n \"modal\": {\n \"bg\": \"rgba(51, 60, 67, 0.9)\",\n \"cardBg\": \"#3A464C\",\n \"headerBg\": \"#333C43\",\n \"footerBg\": \"#3A464C\"\n },\n \"dropdown\": {\n \"bg\": \"#3A464C\",\n \"itemHoverBg\": \"#434F55\",\n \"border\": \"#555F66\"\n },\n \"tabs\": {\n \"border\": \"#555F66\",\n \"linkBg\": \"#3A464C\",\n \"linkActiveBg\": \"#333C43\",\n \"linkHoverBg\": \"#434F55\"\n }\n }\n }\n },\n \"everforest-dark\": {\n \"id\": \"everforest-dark\",\n \"label\": \"Everforest Dark\",\n \"vendor\": \"everforest\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#2D353B\",\n \"surface\": \"#343F44\",\n \"overlay\": \"#3D484D\"\n },\n \"text\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#b2bbb4\",\n \"inverse\": \"#2D353B\"\n },\n \"brand\": {\n \"primary\": \"#A7C080\",\n \"primaryText\": \"#2D353B\"\n },\n \"state\": {\n \"info\": \"#7FBBB3\",\n \"success\": \"#A7C080\",\n \"warning\": \"#DBBC7F\",\n \"danger\": \"#E67E80\",\n \"infoText\": \"#2D353B\",\n \"successText\": \"#2D353B\",\n \"warningText\": \"#2D353B\",\n \"dangerText\": \"#2a3237\"\n },\n \"border\": {\n \"default\": \"#4F585E\"\n },\n \"accent\": {\n \"link\": \"#8ec69c\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#A7C080\",\n \"h2\": \"#7FBBB3\",\n \"h3\": \"#83C092\",\n \"h4\": \"#DBBC7F\",\n \"h5\": \"#D699B6\",\n \"h6\": \"#E67E80\"\n },\n \"body\": {\n \"primary\": \"#D3C6AA\",\n \"secondary\": \"#a4afa7\"\n },\n \"link\": {\n \"default\": \"#8ec69c\"\n },\n \"selection\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#3D484D\"\n },\n \"blockquote\": {\n \"border\": \"#4F585E\",\n \"fg\": \"#a4afa7\",\n \"bg\": \"#343F44\"\n },\n \"codeInline\": {\n \"fg\": \"#eaaa8d\",\n \"bg\": \"#3D484D\"\n },\n \"codeBlock\": {\n \"fg\": \"#D3C6AA\",\n \"bg\": \"#343F44\"\n },\n \"table\": {\n \"border\": \"#4F585E\",\n \"stripe\": \"#3D484D\",\n \"theadBg\": \"#343F44\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#343F44\",\n \"border\": \"#4F585E\",\n \"headerBg\": \"#2D353B\",\n \"footerBg\": \"#343F44\"\n },\n \"message\": {\n \"bg\": \"#2D353B\",\n \"headerBg\": \"#343F44\",\n \"border\": \"#4F585E\",\n \"bodyFg\": \"#D3C6AA\"\n },\n \"panel\": {\n \"bg\": \"#343F44\",\n \"headerBg\": \"#2D353B\",\n \"headerFg\": \"#D3C6AA\",\n \"border\": \"#4F585E\",\n \"blockBg\": \"#2D353B\",\n \"blockHoverBg\": \"#343F44\",\n \"blockActiveBg\": \"#3D484D\"\n },\n \"box\": {\n \"bg\": \"#343F44\",\n \"border\": \"#4F585E\"\n },\n \"notification\": {\n \"bg\": \"#2D353B\",\n \"border\": \"#4F585E\"\n },\n \"modal\": {\n \"bg\": \"rgba(45, 53, 59, 0.9)\",\n \"cardBg\": \"#343F44\",\n \"headerBg\": \"#2D353B\",\n \"footerBg\": \"#343F44\"\n },\n \"dropdown\": {\n \"bg\": \"#343F44\",\n \"itemHoverBg\": \"#3D484D\",\n \"border\": \"#4F585E\"\n },\n \"tabs\": {\n \"border\": \"#4F585E\",\n \"linkBg\": \"#343F44\",\n \"linkActiveBg\": \"#2D353B\",\n \"linkHoverBg\": \"#3D484D\"\n }\n }\n }\n },\n \"everforest-light-hard\": {\n \"id\": \"everforest-light-hard\",\n \"label\": \"Everforest Light Hard\",\n \"vendor\": \"everforest\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#FFFBEF\",\n \"surface\": \"#F8F5E4\",\n \"overlay\": \"#EDEADA\"\n },\n \"text\": {\n \"primary\": \"#5a6870\",\n \"secondary\": \"#5a676e\",\n \"inverse\": \"#FFFBEF\"\n },\n \"brand\": {\n \"primary\": \"#697a01\",\n \"primaryText\": \"#fffefc\"\n },\n \"state\": {\n \"info\": \"#2A7A9E\",\n \"success\": \"#697a01\",\n \"warning\": \"#A87800\",\n \"danger\": \"#D03A38\",\n \"infoText\": \"#fffef9\",\n \"successText\": \"#fffefc\",\n \"warningText\": \"#121211\",\n \"dangerText\": \"#fffdf7\"\n },\n \"border\": {\n \"default\": \"#E8E5D5\"\n },\n \"accent\": {\n \"link\": \"#1D6B4F\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#6B7C01\",\n \"h2\": \"#2A7A9E\",\n \"h3\": \"#1D6B4F\",\n \"h4\": \"#A87800\",\n \"h5\": \"#B84F96\",\n \"h6\": \"#D03A38\"\n },\n \"body\": {\n \"primary\": \"#5C6A72\",\n \"secondary\": \"#606e75\"\n },\n \"link\": {\n \"default\": \"#1D6B4F\"\n },\n \"selection\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#f0eddf\"\n },\n \"blockquote\": {\n \"border\": \"#E8E5D5\",\n \"fg\": \"#606e75\",\n \"bg\": \"#F8F5E4\"\n },\n \"codeInline\": {\n \"fg\": \"#a64b10\",\n \"bg\": \"#EDEADA\"\n },\n \"codeBlock\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#F8F5E4\"\n },\n \"table\": {\n \"border\": \"#E8E5D5\",\n \"stripe\": \"#EDEADA\",\n \"theadBg\": \"#F8F5E4\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#FFFBEF\",\n \"border\": \"#E8E5D5\",\n \"headerBg\": \"#F8F5E4\",\n \"footerBg\": \"#F8F5E4\"\n },\n \"message\": {\n \"bg\": \"#F8F5E4\",\n \"headerBg\": \"#FFFBEF\",\n \"border\": \"#E8E5D5\",\n \"bodyFg\": \"#5C6A72\"\n },\n \"panel\": {\n \"bg\": \"#FFFBEF\",\n \"headerBg\": \"#F8F5E4\",\n \"headerFg\": \"#5C6A72\",\n \"border\": \"#E8E5D5\",\n \"blockBg\": \"#F8F5E4\",\n \"blockHoverBg\": \"#FFFBEF\",\n \"blockActiveBg\": \"#EDEADA\"\n },\n \"box\": {\n \"bg\": \"#FFFBEF\",\n \"border\": \"#E8E5D5\"\n },\n \"notification\": {\n \"bg\": \"#F8F5E4\",\n \"border\": \"#E8E5D5\"\n },\n \"modal\": {\n \"bg\": \"rgba(92, 106, 114, 0.86)\",\n \"cardBg\": \"#FFFBEF\",\n \"headerBg\": \"#F8F5E4\",\n \"footerBg\": \"#F8F5E4\"\n },\n \"dropdown\": {\n \"bg\": \"#FFFBEF\",\n \"itemHoverBg\": \"#F8F5E4\",\n \"border\": \"#E8E5D5\"\n },\n \"tabs\": {\n \"border\": \"#E8E5D5\",\n \"linkBg\": \"#F8F5E4\",\n \"linkActiveBg\": \"#FFFBEF\",\n \"linkHoverBg\": \"#EDEADA\"\n }\n }\n }\n },\n \"everforest-light-soft\": {\n \"id\": \"everforest-light-soft\",\n \"label\": \"Everforest Light Soft\",\n \"vendor\": \"everforest\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#F3EAD3\",\n \"surface\": \"#EAE4CA\",\n \"overlay\": \"#DDD8BE\"\n },\n \"text\": {\n \"primary\": \"#4f5c63\",\n \"secondary\": \"#4f5c62\",\n \"inverse\": \"#F3EAD3\"\n },\n \"brand\": {\n \"primary\": \"#697a01\",\n \"primaryText\": \"#fffefd\"\n },\n \"state\": {\n \"info\": \"#2A7A9E\",\n \"success\": \"#697a01\",\n \"warning\": \"#A87800\",\n \"danger\": \"#D03A38\",\n \"infoText\": \"#fefefc\",\n \"successText\": \"#fffefd\",\n \"warningText\": \"#11100f\",\n \"dangerText\": \"#fefdfa\"\n },\n \"border\": {\n \"default\": \"#D8D3BA\"\n },\n \"accent\": {\n \"link\": \"#1c664b\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#6B7C01\",\n \"h2\": \"#2A7A9E\",\n \"h3\": \"#1D6B4F\",\n \"h4\": \"#A87800\",\n \"h5\": \"#B84F96\",\n \"h6\": \"#D03A38\"\n },\n \"body\": {\n \"primary\": \"#56646c\",\n \"secondary\": \"#56646a\"\n },\n \"link\": {\n \"default\": \"#1c664b\"\n },\n \"selection\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#efede0\"\n },\n \"blockquote\": {\n \"border\": \"#D8D3BA\",\n \"fg\": \"#57646b\",\n \"bg\": \"#EAE4CA\"\n },\n \"codeInline\": {\n \"fg\": \"#92430e\",\n \"bg\": \"#DDD8BE\"\n },\n \"codeBlock\": {\n \"fg\": \"#5a6870\",\n \"bg\": \"#F3EAD3\"\n },\n \"table\": {\n \"border\": \"#D8D3BA\",\n \"stripe\": \"#DDD8BE\",\n \"theadBg\": \"#EAE4CA\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#F3EAD3\",\n \"border\": \"#D8D3BA\",\n \"headerBg\": \"#EAE4CA\",\n \"footerBg\": \"#EAE4CA\"\n },\n \"message\": {\n \"bg\": \"#EAE4CA\",\n \"headerBg\": \"#F3EAD3\",\n \"border\": \"#D8D3BA\",\n \"bodyFg\": \"#5C6A72\"\n },\n \"panel\": {\n \"bg\": \"#F3EAD3\",\n \"headerBg\": \"#EAE4CA\",\n \"headerFg\": \"#5C6A72\",\n \"border\": \"#D8D3BA\",\n \"blockBg\": \"#EAE4CA\",\n \"blockHoverBg\": \"#F3EAD3\",\n \"blockActiveBg\": \"#DDD8BE\"\n },\n \"box\": {\n \"bg\": \"#F3EAD3\",\n \"border\": \"#D8D3BA\"\n },\n \"notification\": {\n \"bg\": \"#EAE4CA\",\n \"border\": \"#D8D3BA\"\n },\n \"modal\": {\n \"bg\": \"rgba(92, 106, 114, 0.86)\",\n \"cardBg\": \"#F3EAD3\",\n \"headerBg\": \"#EAE4CA\",\n \"footerBg\": \"#EAE4CA\"\n },\n \"dropdown\": {\n \"bg\": \"#F3EAD3\",\n \"itemHoverBg\": \"#EAE4CA\",\n \"border\": \"#D8D3BA\"\n },\n \"tabs\": {\n \"border\": \"#D8D3BA\",\n \"linkBg\": \"#EAE4CA\",\n \"linkActiveBg\": \"#F3EAD3\",\n \"linkHoverBg\": \"#DDD8BE\"\n }\n }\n }\n },\n \"everforest-light\": {\n \"id\": \"everforest-light\",\n \"label\": \"Everforest Light\",\n \"vendor\": \"everforest\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#FDF6E3\",\n \"surface\": \"#F4F0D9\",\n \"overlay\": \"#E6E2CC\"\n },\n \"text\": {\n \"primary\": \"#56636a\",\n \"secondary\": \"#566269\",\n \"inverse\": \"#FDF6E3\"\n },\n \"brand\": {\n \"primary\": \"#697a01\",\n \"primaryText\": \"#fffefc\"\n },\n \"state\": {\n \"info\": \"#2A7A9E\",\n \"success\": \"#697a01\",\n \"warning\": \"#A87800\",\n \"danger\": \"#D03A38\",\n \"infoText\": \"#fffefb\",\n \"successText\": \"#fffefc\",\n \"warningText\": \"#121110\",\n \"dangerText\": \"#fffdf8\"\n },\n \"border\": {\n \"default\": \"#BDC3AF\"\n },\n \"accent\": {\n \"link\": \"#1D6B4F\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#6B7C01\",\n \"h2\": \"#2A7A9E\",\n \"h3\": \"#1D6B4F\",\n \"h4\": \"#A87800\",\n \"h5\": \"#B84F96\",\n \"h6\": \"#D03A38\"\n },\n \"body\": {\n \"primary\": \"#5C6A72\",\n \"secondary\": \"#5e6b72\"\n },\n \"link\": {\n \"default\": \"#1D6B4F\"\n },\n \"selection\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#f0eddf\"\n },\n \"blockquote\": {\n \"border\": \"#BDC3AF\",\n \"fg\": \"#5d6b72\",\n \"bg\": \"#F4F0D9\"\n },\n \"codeInline\": {\n \"fg\": \"#9c480f\",\n \"bg\": \"#E6E2CC\"\n },\n \"codeBlock\": {\n \"fg\": \"#5C6A72\",\n \"bg\": \"#F4F0D9\"\n },\n \"table\": {\n \"border\": \"#BDC3AF\",\n \"stripe\": \"#E6E2CC\",\n \"theadBg\": \"#F4F0D9\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#FDF6E3\",\n \"border\": \"#BDC3AF\",\n \"headerBg\": \"#F4F0D9\",\n \"footerBg\": \"#F4F0D9\"\n },\n \"message\": {\n \"bg\": \"#F4F0D9\",\n \"headerBg\": \"#FDF6E3\",\n \"border\": \"#BDC3AF\",\n \"bodyFg\": \"#5C6A72\"\n },\n \"panel\": {\n \"bg\": \"#FDF6E3\",\n \"headerBg\": \"#F4F0D9\",\n \"headerFg\": \"#5C6A72\",\n \"border\": \"#BDC3AF\",\n \"blockBg\": \"#F4F0D9\",\n \"blockHoverBg\": \"#FDF6E3\",\n \"blockActiveBg\": \"#E6E2CC\"\n },\n \"box\": {\n \"bg\": \"#FDF6E3\",\n \"border\": \"#BDC3AF\"\n },\n \"notification\": {\n \"bg\": \"#F4F0D9\",\n \"border\": \"#BDC3AF\"\n },\n \"modal\": {\n \"bg\": \"rgba(92, 106, 114, 0.86)\",\n \"cardBg\": \"#FDF6E3\",\n \"headerBg\": \"#F4F0D9\",\n \"footerBg\": \"#F4F0D9\"\n },\n \"dropdown\": {\n \"bg\": \"#FDF6E3\",\n \"itemHoverBg\": \"#F4F0D9\",\n \"border\": \"#BDC3AF\"\n },\n \"tabs\": {\n \"border\": \"#BDC3AF\",\n \"linkBg\": \"#F4F0D9\",\n \"linkActiveBg\": \"#FDF6E3\",\n \"linkHoverBg\": \"#E6E2CC\"\n }\n }\n }\n },\n \"github-dark\": {\n \"id\": \"github-dark\",\n \"label\": \"GitHub Dark\",\n \"vendor\": \"github\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#0d1117\",\n \"surface\": \"#151b23\",\n \"overlay\": \"#010409\"\n },\n \"text\": {\n \"primary\": \"#f0f6fc\",\n \"secondary\": \"#9198a1\",\n \"inverse\": \"#ffffff\"\n },\n \"brand\": {\n \"primary\": \"#1e6de6\",\n \"primaryText\": \"#ffffff\"\n },\n \"state\": {\n \"info\": \"#3573c1\",\n \"success\": \"#3fb950\",\n \"warning\": \"#d29922\",\n \"danger\": \"#f85149\",\n \"successText\": \"#0d1117\",\n \"warningText\": \"#0d1117\",\n \"infoText\": \"#fdfeff\",\n \"dangerText\": \"#0d1117\"\n },\n \"border\": {\n \"default\": \"#3d444d\"\n },\n \"accent\": {\n \"link\": \"#4493f8\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Mona Sans\\\", -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Noto Sans\\\", Helvetica, Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"\\\"Hubot Sans\\\", ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, \\\"Liberation Mono\\\", monospace\"\n },\n \"webFonts\": [\n \"https://github.githubassets.com/assets/mona-sans-webfont.woff2\",\n \"https://github.githubassets.com/assets/hubot-sans-webfont.woff2\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3fb950\",\n \"h2\": \"#4493f8\",\n \"h3\": \"#1f6feb\",\n \"h4\": \"#d29922\",\n \"h5\": \"#3fb950\",\n \"h6\": \"#f85149\"\n },\n \"body\": {\n \"primary\": \"#f0f6fc\",\n \"secondary\": \"#9198a1\"\n },\n \"link\": {\n \"default\": \"#4493f8\"\n },\n \"selection\": {\n \"fg\": \"#f0f6fc\",\n \"bg\": \"#264f78\"\n },\n \"blockquote\": {\n \"border\": \"#3d444d\",\n \"fg\": \"#9198a1\",\n \"bg\": \"#151b23\"\n },\n \"codeInline\": {\n \"fg\": \"#f0f6fc\",\n \"bg\": \"#151b23\"\n },\n \"codeBlock\": {\n \"fg\": \"#f0f6fc\",\n \"bg\": \"#151b23\"\n },\n \"table\": {\n \"border\": \"#3d444d\",\n \"stripe\": \"#151b23\",\n \"theadBg\": \"#151b23\"\n }\n }\n }\n },\n \"github-light\": {\n \"id\": \"github-light\",\n \"label\": \"GitHub Light\",\n \"vendor\": \"github\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#ffffff\",\n \"surface\": \"#f6f8fa\",\n \"overlay\": \"#f6f8fa\"\n },\n \"text\": {\n \"primary\": \"#1f2328\",\n \"secondary\": \"#59636e\",\n \"inverse\": \"#ffffff\"\n },\n \"brand\": {\n \"primary\": \"#0969da\",\n \"primaryText\": \"#fcfcfc\"\n },\n \"state\": {\n \"info\": \"#0969da\",\n \"success\": \"#1a7f37\",\n \"warning\": \"#9a6700\",\n \"danger\": \"#d1242f\",\n \"infoText\": \"#f6f6f6\",\n \"successText\": \"#f8f8f9\",\n \"warningText\": \"#fdfdfd\",\n \"dangerText\": \"#f4f4f4\"\n },\n \"border\": {\n \"default\": \"#d1d9e0\"\n },\n \"accent\": {\n \"link\": \"#0969da\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"Mona Sans\\\", -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Noto Sans\\\", Helvetica, Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"\\\"Hubot Sans\\\", ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, \\\"Liberation Mono\\\", monospace\"\n },\n \"webFonts\": [\n \"https://github.githubassets.com/assets/mona-sans-webfont.woff2\",\n \"https://github.githubassets.com/assets/hubot-sans-webfont.woff2\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#1a7f37\",\n \"h2\": \"#0969da\",\n \"h3\": \"#0969da\",\n \"h4\": \"#9a6700\",\n \"h5\": \"#1a7f37\",\n \"h6\": \"#d1242f\"\n },\n \"body\": {\n \"primary\": \"#1f2328\",\n \"secondary\": \"#59636e\"\n },\n \"link\": {\n \"default\": \"#0969da\"\n },\n \"selection\": {\n \"fg\": \"#1f2328\",\n \"bg\": \"#b6e3ff\"\n },\n \"blockquote\": {\n \"border\": \"#d1d9e0\",\n \"fg\": \"#59636e\",\n \"bg\": \"#f6f8fa\"\n },\n \"codeInline\": {\n \"fg\": \"#1f2328\",\n \"bg\": \"#f6f8fa\"\n },\n \"codeBlock\": {\n \"fg\": \"#1f2328\",\n \"bg\": \"#f6f8fa\"\n },\n \"table\": {\n \"border\": \"#d1d9e0\",\n \"stripe\": \"#f6f8fa\",\n \"theadBg\": \"#f6f8fa\"\n }\n }\n }\n },\n \"gruvbox-dark-hard\": {\n \"id\": \"gruvbox-dark-hard\",\n \"label\": \"Gruvbox Dark Hard\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1d2021\",\n \"surface\": \"#282828\",\n \"overlay\": \"#3c3836\"\n },\n \"text\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\",\n \"inverse\": \"#1d2021\"\n },\n \"brand\": {\n \"primary\": \"#d79921\",\n \"primaryText\": \"#1d2021\"\n },\n \"state\": {\n \"info\": \"#83a598\",\n \"success\": \"#b8bb26\",\n \"warning\": \"#fabd2f\",\n \"danger\": \"#fb4934\",\n \"infoText\": \"#1d2021\",\n \"successText\": \"#1d2021\",\n \"warningText\": \"#1d2021\",\n \"dangerText\": \"#1d2021\"\n },\n \"border\": {\n \"default\": \"#665c54\"\n },\n \"accent\": {\n \"link\": \"#8eada1\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#b8bb26\",\n \"h2\": \"#83a598\",\n \"h3\": \"#8ec07c\",\n \"h4\": \"#fabd2f\",\n \"h5\": \"#d3869b\",\n \"h6\": \"#fb4934\"\n },\n \"body\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\"\n },\n \"link\": {\n \"default\": \"#8eada1\"\n },\n \"selection\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#3c3836\"\n },\n \"blockquote\": {\n \"border\": \"#665c54\",\n \"fg\": \"#d5c4a1\",\n \"bg\": \"#282828\"\n },\n \"codeInline\": {\n \"fg\": \"#fe8625\",\n \"bg\": \"#3c3836\"\n },\n \"codeBlock\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#282828\"\n },\n \"table\": {\n \"border\": \"#665c54\",\n \"stripe\": \"#3c3836\",\n \"theadBg\": \"#282828\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#282828\",\n \"border\": \"#665c54\",\n \"headerBg\": \"#1d2021\",\n \"footerBg\": \"#282828\"\n },\n \"message\": {\n \"bg\": \"#1d2021\",\n \"headerBg\": \"#282828\",\n \"border\": \"#665c54\",\n \"bodyFg\": \"#ebdbb2\"\n },\n \"panel\": {\n \"bg\": \"#282828\",\n \"headerBg\": \"#1d2021\",\n \"headerFg\": \"#ebdbb2\",\n \"border\": \"#665c54\",\n \"blockBg\": \"#1d2021\",\n \"blockHoverBg\": \"#282828\",\n \"blockActiveBg\": \"#3c3836\"\n },\n \"box\": {\n \"bg\": \"#282828\",\n \"border\": \"#665c54\"\n },\n \"notification\": {\n \"bg\": \"#1d2021\",\n \"border\": \"#665c54\"\n },\n \"modal\": {\n \"bg\": \"rgba(29, 32, 33, 0.9)\",\n \"cardBg\": \"#282828\",\n \"headerBg\": \"#1d2021\",\n \"footerBg\": \"#282828\"\n },\n \"dropdown\": {\n \"bg\": \"#282828\",\n \"itemHoverBg\": \"#3c3836\",\n \"border\": \"#665c54\"\n },\n \"tabs\": {\n \"border\": \"#665c54\",\n \"linkBg\": \"#282828\",\n \"linkActiveBg\": \"#1d2021\",\n \"linkHoverBg\": \"#3c3836\"\n }\n }\n }\n },\n \"gruvbox-dark-soft\": {\n \"id\": \"gruvbox-dark-soft\",\n \"label\": \"Gruvbox Dark Soft\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#32302f\",\n \"surface\": \"#3c3836\",\n \"overlay\": \"#504945\"\n },\n \"text\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\",\n \"inverse\": \"#32302f\"\n },\n \"brand\": {\n \"primary\": \"#d79921\",\n \"primaryText\": \"#32302f\"\n },\n \"state\": {\n \"info\": \"#83a598\",\n \"success\": \"#b8bb26\",\n \"warning\": \"#fabd2f\",\n \"danger\": \"#fb4934\",\n \"dangerText\": \"#211f1f\",\n \"infoText\": \"#32302f\",\n \"successText\": \"#32302f\",\n \"warningText\": \"#32302f\"\n },\n \"border\": {\n \"default\": \"#665c54\"\n },\n \"accent\": {\n \"link\": \"#adc4bb\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#b8bb26\",\n \"h2\": \"#83a598\",\n \"h3\": \"#8ec07c\",\n \"h4\": \"#fabd2f\",\n \"h5\": \"#d3869b\",\n \"h6\": \"#fb4934\"\n },\n \"body\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\"\n },\n \"link\": {\n \"default\": \"#adc4bb\"\n },\n \"selection\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#504945\"\n },\n \"blockquote\": {\n \"border\": \"#665c54\",\n \"fg\": \"#d5c4a1\",\n \"bg\": \"#3c3836\"\n },\n \"codeInline\": {\n \"fg\": \"#feac69\",\n \"bg\": \"#504945\"\n },\n \"codeBlock\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#3c3836\"\n },\n \"table\": {\n \"border\": \"#665c54\",\n \"stripe\": \"#504945\",\n \"theadBg\": \"#3c3836\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"headerBg\": \"#32302f\",\n \"footerBg\": \"#3c3836\"\n },\n \"message\": {\n \"bg\": \"#32302f\",\n \"headerBg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"bodyFg\": \"#ebdbb2\"\n },\n \"panel\": {\n \"bg\": \"#3c3836\",\n \"headerBg\": \"#32302f\",\n \"headerFg\": \"#ebdbb2\",\n \"border\": \"#665c54\",\n \"blockBg\": \"#32302f\",\n \"blockHoverBg\": \"#3c3836\",\n \"blockActiveBg\": \"#504945\"\n },\n \"box\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\"\n },\n \"notification\": {\n \"bg\": \"#32302f\",\n \"border\": \"#665c54\"\n },\n \"modal\": {\n \"bg\": \"rgba(50, 48, 47, 0.9)\",\n \"cardBg\": \"#3c3836\",\n \"headerBg\": \"#32302f\",\n \"footerBg\": \"#3c3836\"\n },\n \"dropdown\": {\n \"bg\": \"#3c3836\",\n \"itemHoverBg\": \"#504945\",\n \"border\": \"#665c54\"\n },\n \"tabs\": {\n \"border\": \"#665c54\",\n \"linkBg\": \"#3c3836\",\n \"linkActiveBg\": \"#32302f\",\n \"linkHoverBg\": \"#504945\"\n }\n }\n }\n },\n \"gruvbox-dark\": {\n \"id\": \"gruvbox-dark\",\n \"label\": \"Gruvbox Dark\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#282828\",\n \"surface\": \"#3c3836\",\n \"overlay\": \"#504945\"\n },\n \"text\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\",\n \"inverse\": \"#282828\"\n },\n \"brand\": {\n \"primary\": \"#d79921\",\n \"primaryText\": \"#282828\"\n },\n \"state\": {\n \"info\": \"#83a598\",\n \"success\": \"#b8bb26\",\n \"warning\": \"#fabd2f\",\n \"danger\": \"#fb4934\",\n \"dangerText\": \"#1f1f1f\",\n \"infoText\": \"#282828\",\n \"successText\": \"#282828\",\n \"warningText\": \"#282828\"\n },\n \"border\": {\n \"default\": \"#665c54\"\n },\n \"accent\": {\n \"link\": \"#adc4bb\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#b8bb26\",\n \"h2\": \"#83a598\",\n \"h3\": \"#8ec07c\",\n \"h4\": \"#fabd2f\",\n \"h5\": \"#d3869b\",\n \"h6\": \"#fb4934\"\n },\n \"body\": {\n \"primary\": \"#ebdbb2\",\n \"secondary\": \"#d5c4a1\"\n },\n \"link\": {\n \"default\": \"#adc4bb\"\n },\n \"selection\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#504945\"\n },\n \"blockquote\": {\n \"border\": \"#665c54\",\n \"fg\": \"#d5c4a1\",\n \"bg\": \"#3c3836\"\n },\n \"codeInline\": {\n \"fg\": \"#feac69\",\n \"bg\": \"#504945\"\n },\n \"codeBlock\": {\n \"fg\": \"#ebdbb2\",\n \"bg\": \"#3c3836\"\n },\n \"table\": {\n \"border\": \"#665c54\",\n \"stripe\": \"#504945\",\n \"theadBg\": \"#3c3836\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"headerBg\": \"#282828\",\n \"footerBg\": \"#3c3836\"\n },\n \"message\": {\n \"bg\": \"#282828\",\n \"headerBg\": \"#3c3836\",\n \"border\": \"#665c54\",\n \"bodyFg\": \"#ebdbb2\"\n },\n \"panel\": {\n \"bg\": \"#3c3836\",\n \"headerBg\": \"#282828\",\n \"headerFg\": \"#ebdbb2\",\n \"border\": \"#665c54\",\n \"blockBg\": \"#282828\",\n \"blockHoverBg\": \"#3c3836\",\n \"blockActiveBg\": \"#504945\"\n },\n \"box\": {\n \"bg\": \"#3c3836\",\n \"border\": \"#665c54\"\n },\n \"notification\": {\n \"bg\": \"#282828\",\n \"border\": \"#665c54\"\n },\n \"modal\": {\n \"bg\": \"rgba(40, 40, 40, 0.9)\",\n \"cardBg\": \"#3c3836\",\n \"headerBg\": \"#282828\",\n \"footerBg\": \"#3c3836\"\n },\n \"dropdown\": {\n \"bg\": \"#3c3836\",\n \"itemHoverBg\": \"#504945\",\n \"border\": \"#665c54\"\n },\n \"tabs\": {\n \"border\": \"#665c54\",\n \"linkBg\": \"#3c3836\",\n \"linkActiveBg\": \"#282828\",\n \"linkHoverBg\": \"#504945\"\n }\n }\n }\n },\n \"gruvbox-light-hard\": {\n \"id\": \"gruvbox-light-hard\",\n \"label\": \"Gruvbox Light Hard\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f9f5d7\",\n \"surface\": \"#fbf1c7\",\n \"overlay\": \"#ebdbb2\"\n },\n \"text\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\",\n \"inverse\": \"#f9f5d7\"\n },\n \"brand\": {\n \"primary\": \"#b57614\",\n \"primaryText\": \"#0f0f0d\"\n },\n \"state\": {\n \"info\": \"#478e9b\",\n \"success\": \"#79740e\",\n \"warning\": \"#b57614\",\n \"danger\": \"#9d0006\",\n \"successText\": \"#fefdf5\",\n \"warningText\": \"#161613\",\n \"infoText\": \"#161613\",\n \"dangerText\": \"#f9f5d7\"\n },\n \"border\": {\n \"default\": \"#bdae93\"\n },\n \"accent\": {\n \"link\": \"#076678\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#79740e\",\n \"h2\": \"#076678\",\n \"h3\": \"#427b58\",\n \"h4\": \"#b57614\",\n \"h5\": \"#8f3f71\",\n \"h6\": \"#9d0006\"\n },\n \"body\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\"\n },\n \"link\": {\n \"default\": \"#076678\"\n },\n \"selection\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#ebdbb2\"\n },\n \"blockquote\": {\n \"border\": \"#bdae93\",\n \"fg\": \"#504945\",\n \"bg\": \"#fbf1c7\"\n },\n \"codeInline\": {\n \"fg\": \"#a83703\",\n \"bg\": \"#ebdbb2\"\n },\n \"codeBlock\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#fbf1c7\"\n },\n \"table\": {\n \"border\": \"#bdae93\",\n \"stripe\": \"#ebdbb2\",\n \"theadBg\": \"#fbf1c7\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#f9f5d7\",\n \"border\": \"#bdae93\",\n \"headerBg\": \"#fbf1c7\",\n \"footerBg\": \"#fbf1c7\"\n },\n \"message\": {\n \"bg\": \"#fbf1c7\",\n \"headerBg\": \"#f9f5d7\",\n \"border\": \"#bdae93\",\n \"bodyFg\": \"#3c3836\"\n },\n \"panel\": {\n \"bg\": \"#f9f5d7\",\n \"headerBg\": \"#fbf1c7\",\n \"headerFg\": \"#3c3836\",\n \"border\": \"#bdae93\",\n \"blockBg\": \"#fbf1c7\",\n \"blockHoverBg\": \"#f9f5d7\",\n \"blockActiveBg\": \"#ebdbb2\"\n },\n \"box\": {\n \"bg\": \"#f9f5d7\",\n \"border\": \"#bdae93\"\n },\n \"notification\": {\n \"bg\": \"#fbf1c7\",\n \"border\": \"#bdae93\"\n },\n \"modal\": {\n \"bg\": \"rgba(60, 56, 54, 0.86)\",\n \"cardBg\": \"#f9f5d7\",\n \"headerBg\": \"#fbf1c7\",\n \"footerBg\": \"#fbf1c7\"\n },\n \"dropdown\": {\n \"bg\": \"#f9f5d7\",\n \"itemHoverBg\": \"#fbf1c7\",\n \"border\": \"#bdae93\"\n },\n \"tabs\": {\n \"border\": \"#bdae93\",\n \"linkBg\": \"#fbf1c7\",\n \"linkActiveBg\": \"#f9f5d7\",\n \"linkHoverBg\": \"#ebdbb2\"\n }\n }\n }\n },\n \"gruvbox-light-soft\": {\n \"id\": \"gruvbox-light-soft\",\n \"label\": \"Gruvbox Light Soft\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f2e5bc\",\n \"surface\": \"#ebdbb2\",\n \"overlay\": \"#d5c4a1\"\n },\n \"text\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\",\n \"inverse\": \"#f2e5bc\"\n },\n \"brand\": {\n \"primary\": \"#b57614\",\n \"primaryText\": \"#100f0d\"\n },\n \"state\": {\n \"info\": \"#478e9b\",\n \"success\": \"#79740e\",\n \"warning\": \"#b57614\",\n \"danger\": \"#9d0006\",\n \"warningText\": \"#181713\",\n \"successText\": \"#fefdf9\",\n \"infoText\": \"#181713\",\n \"dangerText\": \"#f2e5bc\"\n },\n \"border\": {\n \"default\": \"#bdae93\"\n },\n \"accent\": {\n \"link\": \"#065766\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#79740e\",\n \"h2\": \"#076678\",\n \"h3\": \"#427b58\",\n \"h4\": \"#ac7013\",\n \"h5\": \"#8f3f71\",\n \"h6\": \"#9d0006\"\n },\n \"body\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\"\n },\n \"link\": {\n \"default\": \"#065766\"\n },\n \"selection\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#d5c4a1\"\n },\n \"blockquote\": {\n \"border\": \"#bdae93\",\n \"fg\": \"#504945\",\n \"bg\": \"#ebdbb2\"\n },\n \"codeInline\": {\n \"fg\": \"#8f2f03\",\n \"bg\": \"#d5c4a1\"\n },\n \"codeBlock\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#ebdbb2\"\n },\n \"table\": {\n \"border\": \"#bdae93\",\n \"stripe\": \"#d5c4a1\",\n \"theadBg\": \"#ebdbb2\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#f2e5bc\",\n \"border\": \"#bdae93\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"message\": {\n \"bg\": \"#ebdbb2\",\n \"headerBg\": \"#f2e5bc\",\n \"border\": \"#bdae93\",\n \"bodyFg\": \"#3c3836\"\n },\n \"panel\": {\n \"bg\": \"#f2e5bc\",\n \"headerBg\": \"#ebdbb2\",\n \"headerFg\": \"#3c3836\",\n \"border\": \"#bdae93\",\n \"blockBg\": \"#ebdbb2\",\n \"blockHoverBg\": \"#f2e5bc\",\n \"blockActiveBg\": \"#d5c4a1\"\n },\n \"box\": {\n \"bg\": \"#f2e5bc\",\n \"border\": \"#bdae93\"\n },\n \"notification\": {\n \"bg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"modal\": {\n \"bg\": \"rgba(60, 56, 54, 0.86)\",\n \"cardBg\": \"#f2e5bc\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"dropdown\": {\n \"bg\": \"#f2e5bc\",\n \"itemHoverBg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"tabs\": {\n \"border\": \"#bdae93\",\n \"linkBg\": \"#ebdbb2\",\n \"linkActiveBg\": \"#f2e5bc\",\n \"linkHoverBg\": \"#d5c4a1\"\n }\n }\n }\n },\n \"gruvbox-light\": {\n \"id\": \"gruvbox-light\",\n \"label\": \"Gruvbox Light\",\n \"vendor\": \"gruvbox\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fbf1c7\",\n \"surface\": \"#ebdbb2\",\n \"overlay\": \"#d5c4a1\"\n },\n \"text\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\",\n \"inverse\": \"#fbf1c7\"\n },\n \"brand\": {\n \"primary\": \"#b57614\",\n \"primaryText\": \"#100f0d\"\n },\n \"state\": {\n \"info\": \"#478e9b\",\n \"success\": \"#79740e\",\n \"warning\": \"#b57614\",\n \"danger\": \"#9d0006\",\n \"successText\": \"#fefdf5\",\n \"warningText\": \"#171612\",\n \"infoText\": \"#171612\",\n \"dangerText\": \"#fbf1c7\"\n },\n \"border\": {\n \"default\": \"#bdae93\"\n },\n \"accent\": {\n \"link\": \"#065766\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#79740e\",\n \"h2\": \"#076678\",\n \"h3\": \"#427b58\",\n \"h4\": \"#ac7013\",\n \"h5\": \"#8f3f71\",\n \"h6\": \"#9d0006\"\n },\n \"body\": {\n \"primary\": \"#3c3836\",\n \"secondary\": \"#504945\"\n },\n \"link\": {\n \"default\": \"#065766\"\n },\n \"selection\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#d5c4a1\"\n },\n \"blockquote\": {\n \"border\": \"#bdae93\",\n \"fg\": \"#504945\",\n \"bg\": \"#ebdbb2\"\n },\n \"codeInline\": {\n \"fg\": \"#8f2f03\",\n \"bg\": \"#d5c4a1\"\n },\n \"codeBlock\": {\n \"fg\": \"#3c3836\",\n \"bg\": \"#ebdbb2\"\n },\n \"table\": {\n \"border\": \"#bdae93\",\n \"stripe\": \"#d5c4a1\",\n \"theadBg\": \"#ebdbb2\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#fbf1c7\",\n \"border\": \"#bdae93\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"message\": {\n \"bg\": \"#ebdbb2\",\n \"headerBg\": \"#fbf1c7\",\n \"border\": \"#bdae93\",\n \"bodyFg\": \"#3c3836\"\n },\n \"panel\": {\n \"bg\": \"#fbf1c7\",\n \"headerBg\": \"#ebdbb2\",\n \"headerFg\": \"#3c3836\",\n \"border\": \"#bdae93\",\n \"blockBg\": \"#ebdbb2\",\n \"blockHoverBg\": \"#fbf1c7\",\n \"blockActiveBg\": \"#d5c4a1\"\n },\n \"box\": {\n \"bg\": \"#fbf1c7\",\n \"border\": \"#bdae93\"\n },\n \"notification\": {\n \"bg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"modal\": {\n \"bg\": \"rgba(60, 56, 54, 0.86)\",\n \"cardBg\": \"#fbf1c7\",\n \"headerBg\": \"#ebdbb2\",\n \"footerBg\": \"#ebdbb2\"\n },\n \"dropdown\": {\n \"bg\": \"#fbf1c7\",\n \"itemHoverBg\": \"#ebdbb2\",\n \"border\": \"#bdae93\"\n },\n \"tabs\": {\n \"border\": \"#bdae93\",\n \"linkBg\": \"#ebdbb2\",\n \"linkActiveBg\": \"#fbf1c7\",\n \"linkHoverBg\": \"#d5c4a1\"\n }\n }\n }\n },\n \"kanagawa-dragon\": {\n \"id\": \"kanagawa-dragon\",\n \"label\": \"Kanagawa Dragon\",\n \"vendor\": \"kanagawa\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#181616\",\n \"surface\": \"#282727\",\n \"overlay\": \"#393836\"\n },\n \"text\": {\n \"primary\": \"#c5c9c5\",\n \"secondary\": \"#C8C093\",\n \"inverse\": \"#181616\"\n },\n \"brand\": {\n \"primary\": \"#8ba4b0\",\n \"primaryText\": \"#131212\"\n },\n \"state\": {\n \"info\": \"#658594\",\n \"success\": \"#98BB6C\",\n \"warning\": \"#FF9E3B\",\n \"danger\": \"#e82828\",\n \"dangerText\": \"#000000\",\n \"infoText\": \"#131212\",\n \"successText\": \"#181616\",\n \"warningText\": \"#181616\"\n },\n \"border\": {\n \"default\": \"#54546D\"\n },\n \"accent\": {\n \"link\": \"#91a9b4\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#8ba4b0\",\n \"h2\": \"#8992a7\",\n \"h3\": \"#8ea4a2\",\n \"h4\": \"#c4b28a\",\n \"h5\": \"#b6927b\",\n \"h6\": \"#a292a3\"\n },\n \"body\": {\n \"primary\": \"#c5c9c5\",\n \"secondary\": \"#C8C093\"\n },\n \"link\": {\n \"default\": \"#91a9b4\"\n },\n \"selection\": {\n \"fg\": \"#c5c9c5\",\n \"bg\": \"#393836\"\n },\n \"blockquote\": {\n \"border\": \"#54546D\",\n \"fg\": \"#C8C093\",\n \"bg\": \"#282727\"\n },\n \"codeInline\": {\n \"fg\": \"#c4b28a\",\n \"bg\": \"#393836\"\n },\n \"codeBlock\": {\n \"fg\": \"#c5c9c5\",\n \"bg\": \"#0d0c0c\"\n },\n \"table\": {\n \"border\": \"#54546D\",\n \"stripe\": \"#282727\",\n \"theadBg\": \"#393836\"\n }\n }\n }\n },\n \"kanagawa-lotus\": {\n \"id\": \"kanagawa-lotus\",\n \"label\": \"Kanagawa Lotus\",\n \"vendor\": \"kanagawa\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#f2ecbc\",\n \"surface\": \"#e7dba0\",\n \"overlay\": \"#e4d794\"\n },\n \"text\": {\n \"primary\": \"#545464\",\n \"secondary\": \"#43436c\",\n \"inverse\": \"#f2ecbc\"\n },\n \"brand\": {\n \"primary\": \"#4d699b\",\n \"primaryText\": \"#fffffe\"\n },\n \"state\": {\n \"info\": \"#5a7785\",\n \"success\": \"#6f894e\",\n \"warning\": \"#e98a00\",\n \"danger\": \"#e82828\",\n \"warningText\": \"#353429\",\n \"infoText\": \"#fffffe\",\n \"successText\": \"#13130f\",\n \"dangerText\": \"#000000\"\n },\n \"border\": {\n \"default\": \"#716e61\"\n },\n \"accent\": {\n \"link\": \"#425a85\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#4d699b\",\n \"h2\": \"#624c83\",\n \"h3\": \"#597b75\",\n \"h4\": \"#77713f\",\n \"h5\": \"#bc6400\",\n \"h6\": \"#b35b79\"\n },\n \"body\": {\n \"primary\": \"#545464\",\n \"secondary\": \"#43436c\"\n },\n \"link\": {\n \"default\": \"#425a85\"\n },\n \"selection\": {\n \"fg\": \"#545464\",\n \"bg\": \"#cdcfd4\"\n },\n \"blockquote\": {\n \"border\": \"#716e61\",\n \"fg\": \"#43436c\",\n \"bg\": \"#e7dba0\"\n },\n \"codeInline\": {\n \"fg\": \"#624c83\",\n \"bg\": \"#e4d794\"\n },\n \"codeBlock\": {\n \"fg\": \"#545464\",\n \"bg\": \"#e4d794\"\n },\n \"table\": {\n \"border\": \"#716e61\",\n \"stripe\": \"#e7dba0\",\n \"theadBg\": \"#e4d794\"\n }\n }\n }\n },\n \"kanagawa-wave\": {\n \"id\": \"kanagawa-wave\",\n \"label\": \"Kanagawa Wave\",\n \"vendor\": \"kanagawa\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1F1F28\",\n \"surface\": \"#2A2A37\",\n \"overlay\": \"#363646\"\n },\n \"text\": {\n \"primary\": \"#DCD7BA\",\n \"secondary\": \"#C8C093\",\n \"inverse\": \"#1F1F28\"\n },\n \"brand\": {\n \"primary\": \"#7E9CD8\",\n \"primaryText\": \"#111116\"\n },\n \"state\": {\n \"info\": \"#658594\",\n \"success\": \"#98BB6C\",\n \"warning\": \"#FF9E3B\",\n \"danger\": \"#e82828\",\n \"infoText\": \"#111116\",\n \"dangerText\": \"#000000\",\n \"successText\": \"#1F1F28\",\n \"warningText\": \"#1F1F28\"\n },\n \"border\": {\n \"default\": \"#54546D\"\n },\n \"accent\": {\n \"link\": \"#8aa5dc\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#7E9CD8\",\n \"h2\": \"#957FB8\",\n \"h3\": \"#7AA89F\",\n \"h4\": \"#E6C384\",\n \"h5\": \"#FFA066\",\n \"h6\": \"#D27E99\"\n },\n \"body\": {\n \"primary\": \"#DCD7BA\",\n \"secondary\": \"#C8C093\"\n },\n \"link\": {\n \"default\": \"#8aa5dc\"\n },\n \"selection\": {\n \"fg\": \"#DCD7BA\",\n \"bg\": \"#223249\"\n },\n \"blockquote\": {\n \"border\": \"#54546D\",\n \"fg\": \"#C8C093\",\n \"bg\": \"#2A2A37\"\n },\n \"codeInline\": {\n \"fg\": \"#E6C384\",\n \"bg\": \"#363646\"\n },\n \"codeBlock\": {\n \"fg\": \"#DCD7BA\",\n \"bg\": \"#16161D\"\n },\n \"table\": {\n \"border\": \"#54546D\",\n \"stripe\": \"#2A2A37\",\n \"theadBg\": \"#363646\"\n }\n }\n }\n },\n \"nord\": {\n \"id\": \"nord\",\n \"label\": \"Nord\",\n \"vendor\": \"nord\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#2e3440\",\n \"surface\": \"#3b4252\",\n \"overlay\": \"#434c5e\"\n },\n \"text\": {\n \"primary\": \"#eceff4\",\n \"secondary\": \"#d8dee9\",\n \"inverse\": \"#2e3440\"\n },\n \"brand\": {\n \"primary\": \"#88c0d0\",\n \"primaryText\": \"#0d0f13\"\n },\n \"state\": {\n \"info\": \"#5e81ac\",\n \"success\": \"#a3be8c\",\n \"warning\": \"#ebcb8b\",\n \"danger\": \"#bf616a\",\n \"infoText\": \"#0d0f13\",\n \"dangerText\": \"#0c0d10\",\n \"successText\": \"#2e3440\",\n \"warningText\": \"#2e3440\"\n },\n \"border\": {\n \"default\": \"#4c566a\"\n },\n \"accent\": {\n \"link\": \"#99c9d7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#8fbcbb\",\n \"h2\": \"#88c0d0\",\n \"h3\": \"#81a1c1\",\n \"h4\": \"#ebcb8b\",\n \"h5\": \"#d08770\",\n \"h6\": \"#b48ead\"\n },\n \"body\": {\n \"primary\": \"#eceff4\",\n \"secondary\": \"#d8dee9\"\n },\n \"link\": {\n \"default\": \"#99c9d7\"\n },\n \"selection\": {\n \"fg\": \"#eceff4\",\n \"bg\": \"#4c566a\"\n },\n \"blockquote\": {\n \"border\": \"#4c566a\",\n \"fg\": \"#d8dee9\",\n \"bg\": \"#3b4252\"\n },\n \"codeInline\": {\n \"fg\": \"#eceff4\",\n \"bg\": \"#434c5e\"\n },\n \"codeBlock\": {\n \"fg\": \"#eceff4\",\n \"bg\": \"#434c5e\"\n },\n \"table\": {\n \"border\": \"#4c566a\",\n \"stripe\": \"#434c5e\",\n \"theadBg\": \"#3b4252\"\n }\n }\n }\n },\n \"one-dark\": {\n \"id\": \"one-dark\",\n \"label\": \"One Dark\",\n \"vendor\": \"one-dark\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#282c34\",\n \"surface\": \"#2c313a\",\n \"overlay\": \"#3e4451\"\n },\n \"text\": {\n \"primary\": \"#afb6c2\",\n \"secondary\": \"#b1b6bf\",\n \"inverse\": \"#282c34\"\n },\n \"brand\": {\n \"primary\": \"#61afef\",\n \"primaryText\": \"#282c34\"\n },\n \"state\": {\n \"info\": \"#56b6c2\",\n \"success\": \"#98c379\",\n \"warning\": \"#e5c07b\",\n \"danger\": \"#e06c75\",\n \"dangerText\": \"#22262d\",\n \"infoText\": \"#282c34\",\n \"successText\": \"#282c34\",\n \"warningText\": \"#282c34\"\n },\n \"border\": {\n \"default\": \"#3e4451\"\n },\n \"accent\": {\n \"link\": \"#7abcf2\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#61afef\",\n \"h2\": \"#c678dd\",\n \"h3\": \"#98c379\",\n \"h4\": \"#e5c07b\",\n \"h5\": \"#d19a66\",\n \"h6\": \"#56b6c2\"\n },\n \"body\": {\n \"primary\": \"#abb2bf\",\n \"secondary\": \"#979da9\"\n },\n \"link\": {\n \"default\": \"#7abcf2\"\n },\n \"selection\": {\n \"fg\": \"#abb2bf\",\n \"bg\": \"#3c414e\"\n },\n \"blockquote\": {\n \"border\": \"#3e4451\",\n \"fg\": \"#979daa\",\n \"bg\": \"#2c313a\"\n },\n \"codeInline\": {\n \"fg\": \"#c980df\",\n \"bg\": \"#2c313a\"\n },\n \"codeBlock\": {\n \"fg\": \"#abb2bf\",\n \"bg\": \"#21252b\"\n },\n \"table\": {\n \"border\": \"#3e4451\",\n \"stripe\": \"#2c313a\",\n \"theadBg\": \"#3c414e\"\n }\n }\n }\n },\n \"one-light\": {\n \"id\": \"one-light\",\n \"label\": \"One Light\",\n \"vendor\": \"one-dark\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fafafa\",\n \"surface\": \"#f0f0f0\",\n \"overlay\": \"#e5e5e6\"\n },\n \"text\": {\n \"primary\": \"#383a42\",\n \"secondary\": \"#60636c\",\n \"inverse\": \"#fafafa\"\n },\n \"brand\": {\n \"primary\": \"#4078f2\",\n \"primaryText\": \"#080808\"\n },\n \"state\": {\n \"info\": \"#0184bc\",\n \"success\": \"#50a14f\",\n \"warning\": \"#c18401\",\n \"danger\": \"#e45649\",\n \"infoText\": \"#080808\",\n \"successText\": \"#232323\",\n \"warningText\": \"#232323\",\n \"dangerText\": \"#191919\"\n },\n \"border\": {\n \"default\": \"#d0d0d1\"\n },\n \"accent\": {\n \"link\": \"#315ebd\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#4078f2\",\n \"h2\": \"#a626a4\",\n \"h3\": \"#4d9b4c\",\n \"h4\": \"#b97f01\",\n \"h5\": \"#986801\",\n \"h6\": \"#0184bc\"\n },\n \"body\": {\n \"primary\": \"#383a42\",\n \"secondary\": \"#666973\"\n },\n \"link\": {\n \"default\": \"#315ebd\"\n },\n \"selection\": {\n \"fg\": \"#383a42\",\n \"bg\": \"#dfe1e5\"\n },\n \"blockquote\": {\n \"border\": \"#d0d0d1\",\n \"fg\": \"#666973\",\n \"bg\": \"#f0f0f0\"\n },\n \"codeInline\": {\n \"fg\": \"#a626a4\",\n \"bg\": \"#e5e5e6\"\n },\n \"codeBlock\": {\n \"fg\": \"#383a42\",\n \"bg\": \"#e5e5e6\"\n },\n \"table\": {\n \"border\": \"#d0d0d1\",\n \"stripe\": \"#f0f0f0\",\n \"theadBg\": \"#e5e5e6\"\n }\n }\n }\n },\n \"radix-mauve-dark\": {\n \"id\": \"radix-mauve-dark\",\n \"label\": \"Radix Colors Mauve Dark\",\n \"vendor\": \"radix\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#121113\",\n \"surface\": \"#1a191b\",\n \"overlay\": \"#232225\"\n },\n \"text\": {\n \"primary\": \"#eeeef0\",\n \"secondary\": \"#b5b2bc\",\n \"inverse\": \"#121113\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#121113\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#121113\",\n \"successText\": \"#121113\",\n \"warningText\": \"#121113\",\n \"dangerText\": \"#121113\"\n },\n \"border\": {\n \"default\": \"#3c393f\"\n },\n \"accent\": {\n \"link\": \"#70b8ff\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3dd68c\",\n \"h2\": \"#70b8ff\",\n \"h3\": \"#4ccce6\",\n \"h4\": \"#ffca16\",\n \"h5\": \"#baa7ff\",\n \"h6\": \"#ff9592\"\n },\n \"body\": {\n \"primary\": \"#eeeef0\",\n \"secondary\": \"#b5b2bc\"\n },\n \"link\": {\n \"default\": \"#70b8ff\"\n },\n \"selection\": {\n \"fg\": \"#eeeef0\",\n \"bg\": \"#323035\"\n },\n \"blockquote\": {\n \"border\": \"#49474e\",\n \"fg\": \"#eeeef0\",\n \"bg\": \"#1a191b\"\n },\n \"codeInline\": {\n \"fg\": \"#eeeef0\",\n \"bg\": \"#232225\"\n },\n \"codeBlock\": {\n \"fg\": \"#eeeef0\",\n \"bg\": \"#232225\"\n },\n \"table\": {\n \"border\": \"#49474e\",\n \"stripe\": \"#1a191b\",\n \"theadBg\": \"#2b292d\"\n }\n }\n }\n },\n \"radix-mauve-light\": {\n \"id\": \"radix-mauve-light\",\n \"label\": \"Radix Colors Mauve Light\",\n \"vendor\": \"radix\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fdfcfd\",\n \"surface\": \"#faf9fb\",\n \"overlay\": \"#f2eff3\"\n },\n \"text\": {\n \"primary\": \"#211f26\",\n \"secondary\": \"#65636d\",\n \"inverse\": \"#fdfcfd\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#232323\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#211f26\",\n \"successText\": \"#211f26\",\n \"warningText\": \"#211f26\",\n \"dangerText\": \"#121212\"\n },\n \"border\": {\n \"default\": \"#dbd8e0\"\n },\n \"accent\": {\n \"link\": \"#0c6bbe\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#218358\",\n \"h2\": \"#0d74ce\",\n \"h3\": \"#107d98\",\n \"h4\": \"#ab6400\",\n \"h5\": \"#6550b9\",\n \"h6\": \"#ce2c31\"\n },\n \"body\": {\n \"primary\": \"#211f26\",\n \"secondary\": \"#65636d\"\n },\n \"link\": {\n \"default\": \"#0c6bbe\"\n },\n \"selection\": {\n \"fg\": \"#211f26\",\n \"bg\": \"#e3dfe6\"\n },\n \"blockquote\": {\n \"border\": \"#d0cdd7\",\n \"fg\": \"#211f26\",\n \"bg\": \"#faf9fb\"\n },\n \"codeInline\": {\n \"fg\": \"#211f26\",\n \"bg\": \"#f2eff3\"\n },\n \"codeBlock\": {\n \"fg\": \"#211f26\",\n \"bg\": \"#f2eff3\"\n },\n \"table\": {\n \"border\": \"#d0cdd7\",\n \"stripe\": \"#faf9fb\",\n \"theadBg\": \"#eae7ec\"\n }\n }\n }\n },\n \"radix-slate-dark\": {\n \"id\": \"radix-slate-dark\",\n \"label\": \"Radix Colors Slate Dark\",\n \"vendor\": \"radix\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#111113\",\n \"surface\": \"#18191b\",\n \"overlay\": \"#212225\"\n },\n \"text\": {\n \"primary\": \"#edeef0\",\n \"secondary\": \"#b0b4ba\",\n \"inverse\": \"#111113\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#111113\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#111113\",\n \"successText\": \"#111113\",\n \"warningText\": \"#111113\",\n \"dangerText\": \"#111113\"\n },\n \"border\": {\n \"default\": \"#363a3f\"\n },\n \"accent\": {\n \"link\": \"#70b8ff\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3dd68c\",\n \"h2\": \"#70b8ff\",\n \"h3\": \"#4ccce6\",\n \"h4\": \"#ffca16\",\n \"h5\": \"#baa7ff\",\n \"h6\": \"#ff9592\"\n },\n \"body\": {\n \"primary\": \"#edeef0\",\n \"secondary\": \"#b0b4ba\"\n },\n \"link\": {\n \"default\": \"#70b8ff\"\n },\n \"selection\": {\n \"fg\": \"#edeef0\",\n \"bg\": \"#2e3135\"\n },\n \"blockquote\": {\n \"border\": \"#43484e\",\n \"fg\": \"#edeef0\",\n \"bg\": \"#18191b\"\n },\n \"codeInline\": {\n \"fg\": \"#edeef0\",\n \"bg\": \"#212225\"\n },\n \"codeBlock\": {\n \"fg\": \"#edeef0\",\n \"bg\": \"#212225\"\n },\n \"table\": {\n \"border\": \"#43484e\",\n \"stripe\": \"#18191b\",\n \"theadBg\": \"#272a2d\"\n }\n }\n }\n },\n \"radix-slate-light\": {\n \"id\": \"radix-slate-light\",\n \"label\": \"Radix Colors Slate Light\",\n \"vendor\": \"radix\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fcfcfd\",\n \"surface\": \"#f9f9fb\",\n \"overlay\": \"#f0f0f3\"\n },\n \"text\": {\n \"primary\": \"#1c2024\",\n \"secondary\": \"#60646c\",\n \"inverse\": \"#fcfcfd\"\n },\n \"brand\": {\n \"primary\": \"#0090ff\",\n \"primaryText\": \"#232323\"\n },\n \"state\": {\n \"info\": \"#00a2c7\",\n \"success\": \"#30a46c\",\n \"warning\": \"#ffc53d\",\n \"danger\": \"#e5484d\",\n \"infoText\": \"#1c2024\",\n \"successText\": \"#1c2024\",\n \"warningText\": \"#1c2024\",\n \"dangerText\": \"#121212\"\n },\n \"border\": {\n \"default\": \"#d9d9e0\"\n },\n \"accent\": {\n \"link\": \"#0c6bbe\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#218358\",\n \"h2\": \"#0d74ce\",\n \"h3\": \"#107d98\",\n \"h4\": \"#ab6400\",\n \"h5\": \"#6550b9\",\n \"h6\": \"#ce2c31\"\n },\n \"body\": {\n \"primary\": \"#1c2024\",\n \"secondary\": \"#60646c\"\n },\n \"link\": {\n \"default\": \"#0c6bbe\"\n },\n \"selection\": {\n \"fg\": \"#1c2024\",\n \"bg\": \"#e0e1e6\"\n },\n \"blockquote\": {\n \"border\": \"#cdced6\",\n \"fg\": \"#1c2024\",\n \"bg\": \"#f9f9fb\"\n },\n \"codeInline\": {\n \"fg\": \"#1c2024\",\n \"bg\": \"#f0f0f3\"\n },\n \"codeBlock\": {\n \"fg\": \"#1c2024\",\n \"bg\": \"#f0f0f3\"\n },\n \"table\": {\n \"border\": \"#cdced6\",\n \"stripe\": \"#f9f9fb\",\n \"theadBg\": \"#e8e8ec\"\n }\n }\n }\n },\n \"rose-pine-dawn\": {\n \"id\": \"rose-pine-dawn\",\n \"label\": \"Rosé Pine Dawn\",\n \"vendor\": \"rose-pine\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#faf4ed\",\n \"surface\": \"#fffaf3\",\n \"overlay\": \"#f2e9e1\"\n },\n \"text\": {\n \"primary\": \"#575279\",\n \"secondary\": \"#66637c\",\n \"inverse\": \"#faf4ed\"\n },\n \"brand\": {\n \"primary\": \"#907aa9\",\n \"primaryText\": \"#171615\"\n },\n \"state\": {\n \"info\": \"#56949f\",\n \"success\": \"#286983\",\n \"warning\": \"#ea9d34\",\n \"danger\": \"#b4637a\",\n \"warningText\": \"#3f3d3b\",\n \"infoText\": \"#1e1d1c\",\n \"dangerText\": \"#080707\",\n \"successText\": \"#faf4ed\"\n },\n \"border\": {\n \"default\": \"#dfdad9\"\n },\n \"accent\": {\n \"link\": \"#6f5f84\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#286983\",\n \"h2\": \"#907aa9\",\n \"h3\": \"#56949f\",\n \"h4\": \"#be7f2a\",\n \"h5\": \"#c67874\",\n \"h6\": \"#b4637a\"\n },\n \"body\": {\n \"primary\": \"#575279\",\n \"secondary\": \"#6d6984\"\n },\n \"link\": {\n \"default\": \"#6f5f84\"\n },\n \"selection\": {\n \"fg\": \"#575279\",\n \"bg\": \"#d2d1d2\"\n },\n \"blockquote\": {\n \"border\": \"#cecacd\",\n \"fg\": \"#575279\",\n \"bg\": \"#fffaf3\"\n },\n \"codeInline\": {\n \"fg\": \"#575279\",\n \"bg\": \"#f2e9e1\"\n },\n \"codeBlock\": {\n \"fg\": \"#575279\",\n \"bg\": \"#f2e9e1\"\n },\n \"table\": {\n \"border\": \"#cecacd\",\n \"stripe\": \"#f2e9e1\",\n \"theadBg\": \"#dfdad9\"\n }\n }\n }\n },\n \"rose-pine-moon\": {\n \"id\": \"rose-pine-moon\",\n \"label\": \"Rosé Pine Moon\",\n \"vendor\": \"rose-pine\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#232136\",\n \"surface\": \"#2a273f\",\n \"overlay\": \"#393552\"\n },\n \"text\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#a6a3bb\",\n \"inverse\": \"#232136\"\n },\n \"brand\": {\n \"primary\": \"#c4a7e7\",\n \"primaryText\": \"#232136\"\n },\n \"state\": {\n \"info\": \"#9ccfd8\",\n \"success\": \"#3e8fb0\",\n \"warning\": \"#f6c177\",\n \"danger\": \"#eb6f92\",\n \"successText\": \"#1a1828\",\n \"infoText\": \"#232136\",\n \"warningText\": \"#232136\",\n \"dangerText\": \"#232136\"\n },\n \"border\": {\n \"default\": \"#44415a\"\n },\n \"accent\": {\n \"link\": \"#c4a7e7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#3e8fb0\",\n \"h2\": \"#c4a7e7\",\n \"h3\": \"#9ccfd8\",\n \"h4\": \"#f6c177\",\n \"h5\": \"#ea9a97\",\n \"h6\": \"#eb6f92\"\n },\n \"body\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#9591ae\"\n },\n \"link\": {\n \"default\": \"#c4a7e7\"\n },\n \"selection\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#56526e\"\n },\n \"blockquote\": {\n \"border\": \"#56526e\",\n \"fg\": \"#e0def4\",\n \"bg\": \"#2a273f\"\n },\n \"codeInline\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#393552\"\n },\n \"codeBlock\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#393552\"\n },\n \"table\": {\n \"border\": \"#56526e\",\n \"stripe\": \"#393552\",\n \"theadBg\": \"#44415a\"\n }\n }\n }\n },\n \"rose-pine\": {\n \"id\": \"rose-pine\",\n \"label\": \"Rosé Pine\",\n \"vendor\": \"rose-pine\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#191724\",\n \"surface\": \"#1f1d2e\",\n \"overlay\": \"#26233a\"\n },\n \"text\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#918dab\",\n \"inverse\": \"#191724\"\n },\n \"brand\": {\n \"primary\": \"#c4a7e7\",\n \"primaryText\": \"#191724\"\n },\n \"state\": {\n \"info\": \"#9ccfd8\",\n \"success\": \"#31748f\",\n \"warning\": \"#f6c177\",\n \"danger\": \"#eb6f92\",\n \"successText\": \"#f6f6f6\",\n \"infoText\": \"#191724\",\n \"warningText\": \"#191724\",\n \"dangerText\": \"#191724\"\n },\n \"border\": {\n \"default\": \"#403d52\"\n },\n \"accent\": {\n \"link\": \"#c4a7e7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#31748f\",\n \"h2\": \"#c4a7e7\",\n \"h3\": \"#9ccfd8\",\n \"h4\": \"#f6c177\",\n \"h5\": \"#ebbcba\",\n \"h6\": \"#eb6f92\"\n },\n \"body\": {\n \"primary\": \"#e0def4\",\n \"secondary\": \"#908caa\"\n },\n \"link\": {\n \"default\": \"#c4a7e7\"\n },\n \"selection\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#524f67\"\n },\n \"blockquote\": {\n \"border\": \"#524f67\",\n \"fg\": \"#e0def4\",\n \"bg\": \"#1f1d2e\"\n },\n \"codeInline\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#26233a\"\n },\n \"codeBlock\": {\n \"fg\": \"#e0def4\",\n \"bg\": \"#26233a\"\n },\n \"table\": {\n \"border\": \"#524f67\",\n \"stripe\": \"#26233a\",\n \"theadBg\": \"#403d52\"\n }\n }\n }\n },\n \"solarized-dark\": {\n \"id\": \"solarized-dark\",\n \"label\": \"Solarized Dark\",\n \"vendor\": \"solarized\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#002b36\",\n \"surface\": \"#073642\",\n \"overlay\": \"#586e75\"\n },\n \"text\": {\n \"primary\": \"#eff2f2\",\n \"secondary\": \"#f0f2f3\",\n \"inverse\": \"#002b36\"\n },\n \"brand\": {\n \"primary\": \"#268bd2\",\n \"primaryText\": \"#001d24\"\n },\n \"state\": {\n \"info\": \"#2aa198\",\n \"success\": \"#859900\",\n \"warning\": \"#b58900\",\n \"danger\": \"#d8312e\",\n \"dangerText\": \"#ffffff\",\n \"infoText\": \"#002b36\",\n \"successText\": \"#002934\",\n \"warningText\": \"#002934\"\n },\n \"border\": {\n \"default\": \"#586e75\"\n },\n \"accent\": {\n \"link\": \"#e9f3fa\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#268bd2\",\n \"h2\": \"#2aa198\",\n \"h3\": \"#859900\",\n \"h4\": \"#b58900\",\n \"h5\": \"#ce5422\",\n \"h6\": \"#d53e87\"\n },\n \"body\": {\n \"primary\": \"#90a0a1\",\n \"secondary\": \"#91a0a6\"\n },\n \"link\": {\n \"default\": \"#e9f3fa\"\n },\n \"selection\": {\n \"fg\": \"#fdf6e3\",\n \"bg\": \"#586e75\"\n },\n \"blockquote\": {\n \"border\": \"#657b83\",\n \"fg\": \"#92a0a2\",\n \"bg\": \"#073642\"\n },\n \"codeInline\": {\n \"fg\": \"#43aca4\",\n \"bg\": \"#073642\"\n },\n \"codeBlock\": {\n \"fg\": \"#93a1a1\",\n \"bg\": \"#073642\"\n },\n \"table\": {\n \"border\": \"#586e75\",\n \"stripe\": \"#073642\",\n \"theadBg\": \"#283336\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#073642\",\n \"border\": \"#586e75\",\n \"headerBg\": \"#002b36\",\n \"footerBg\": \"#073642\"\n },\n \"message\": {\n \"bg\": \"#002b36\",\n \"headerBg\": \"#073642\",\n \"border\": \"#586e75\",\n \"bodyFg\": \"#839496\"\n },\n \"panel\": {\n \"bg\": \"#073642\",\n \"headerBg\": \"#002b36\",\n \"headerFg\": \"#93a1a1\",\n \"border\": \"#586e75\",\n \"blockBg\": \"#002b36\",\n \"blockHoverBg\": \"#073642\",\n \"blockActiveBg\": \"#586e75\"\n },\n \"box\": {\n \"bg\": \"#073642\",\n \"border\": \"#586e75\"\n },\n \"notification\": {\n \"bg\": \"#002b36\",\n \"border\": \"#586e75\"\n },\n \"modal\": {\n \"bg\": \"rgba(0, 43, 54, 0.9)\",\n \"cardBg\": \"#073642\",\n \"headerBg\": \"#002b36\",\n \"footerBg\": \"#073642\"\n },\n \"dropdown\": {\n \"bg\": \"#073642\",\n \"itemHoverBg\": \"#586e75\",\n \"border\": \"#586e75\"\n },\n \"tabs\": {\n \"border\": \"#586e75\",\n \"linkBg\": \"#073642\",\n \"linkActiveBg\": \"#002b36\",\n \"linkHoverBg\": \"#586e75\"\n }\n }\n }\n },\n \"solarized-light\": {\n \"id\": \"solarized-light\",\n \"label\": \"Solarized Light\",\n \"vendor\": \"solarized\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#fdf6e3\",\n \"surface\": \"#eee8d5\",\n \"overlay\": \"#93a1a1\"\n },\n \"text\": {\n \"primary\": \"#293437\",\n \"secondary\": \"#2a3437\",\n \"inverse\": \"#fdf6e3\"\n },\n \"brand\": {\n \"primary\": \"#268bd2\",\n \"primaryText\": \"#191917\"\n },\n \"state\": {\n \"info\": \"#2aa198\",\n \"success\": \"#859900\",\n \"warning\": \"#b58900\",\n \"danger\": \"#d8312e\",\n \"infoText\": \"#262522\",\n \"successText\": \"#262522\",\n \"warningText\": \"#262522\",\n \"dangerText\": \"#fffffe\"\n },\n \"border\": {\n \"default\": \"#93a1a1\"\n },\n \"accent\": {\n \"link\": \"#0e354f\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#268bd2\",\n \"h2\": \"#26938b\",\n \"h3\": \"#7b8c00\",\n \"h4\": \"#a67e00\",\n \"h5\": \"#cb4b16\",\n \"h6\": \"#d33682\"\n },\n \"body\": {\n \"primary\": \"#52686e\",\n \"secondary\": \"#54686e\"\n },\n \"link\": {\n \"default\": \"#0e354f\"\n },\n \"selection\": {\n \"fg\": \"#002b36\",\n \"bg\": \"#93a1a1\"\n },\n \"blockquote\": {\n \"border\": \"#93a1a1\",\n \"fg\": \"#55686f\",\n \"bg\": \"#eee8d5\"\n },\n \"codeInline\": {\n \"fg\": \"#5a5ea4\",\n \"bg\": \"#eee8d5\"\n },\n \"codeBlock\": {\n \"fg\": \"#073642\",\n \"bg\": \"#eee8d5\"\n },\n \"table\": {\n \"border\": \"#93a1a1\",\n \"stripe\": \"#eee8d5\",\n \"theadBg\": \"#eee8d5\"\n }\n },\n \"components\": {\n \"card\": {\n \"bg\": \"#fdf6e3\",\n \"border\": \"#93a1a1\",\n \"headerBg\": \"#eee8d5\",\n \"footerBg\": \"#eee8d5\"\n },\n \"message\": {\n \"bg\": \"#eee8d5\",\n \"headerBg\": \"#fdf6e3\",\n \"border\": \"#93a1a1\",\n \"bodyFg\": \"#586e75\"\n },\n \"panel\": {\n \"bg\": \"#fdf6e3\",\n \"headerBg\": \"#eee8d5\",\n \"headerFg\": \"#073642\",\n \"border\": \"#93a1a1\",\n \"blockBg\": \"#eee8d5\",\n \"blockHoverBg\": \"#fdf6e3\",\n \"blockActiveBg\": \"#93a1a1\"\n },\n \"box\": {\n \"bg\": \"#fdf6e3\",\n \"border\": \"#93a1a1\"\n },\n \"notification\": {\n \"bg\": \"#eee8d5\",\n \"border\": \"#93a1a1\"\n },\n \"modal\": {\n \"bg\": \"rgba(0, 43, 54, 0.86)\",\n \"cardBg\": \"#fdf6e3\",\n \"headerBg\": \"#eee8d5\",\n \"footerBg\": \"#eee8d5\"\n },\n \"dropdown\": {\n \"bg\": \"#fdf6e3\",\n \"itemHoverBg\": \"#eee8d5\",\n \"border\": \"#93a1a1\"\n },\n \"tabs\": {\n \"border\": \"#93a1a1\",\n \"linkBg\": \"#eee8d5\",\n \"linkActiveBg\": \"#fdf6e3\",\n \"linkHoverBg\": \"#93a1a1\"\n }\n }\n }\n },\n \"terminal\": {\n \"id\": \"terminal\",\n \"label\": \"Terminal\",\n \"vendor\": \"turbo\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#0d0d0d\",\n \"surface\": \"#080808\",\n \"overlay\": \"#111111\"\n },\n \"text\": {\n \"primary\": \"#c8ffc8\",\n \"secondary\": \"#8fbc8f\",\n \"inverse\": \"#0d0d0d\"\n },\n \"brand\": {\n \"primary\": \"#39ff14\",\n \"primaryText\": \"#0d0d0d\"\n },\n \"state\": {\n \"info\": \"#7dd3fc\",\n \"success\": \"#39ff14\",\n \"warning\": \"#ffb000\",\n \"danger\": \"#ff4444\",\n \"infoText\": \"#0d0d0d\",\n \"successText\": \"#0d0d0d\",\n \"warningText\": \"#0d0d0d\",\n \"dangerText\": \"#0d0d0d\"\n },\n \"border\": {\n \"default\": \"#1f3d1f\"\n },\n \"accent\": {\n \"link\": \"#7dd3fc\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"\\\"IBM Plex Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\",\n \"mono\": \"\\\"IBM Plex Mono\\\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#39ff14\",\n \"h2\": \"#7dd3fc\",\n \"h3\": \"#ffb000\",\n \"h4\": \"#39ff14\",\n \"h5\": \"#8fbc8f\",\n \"h6\": \"#c8ffc8\"\n },\n \"body\": {\n \"primary\": \"#c8ffc8\",\n \"secondary\": \"#8fbc8f\"\n },\n \"link\": {\n \"default\": \"#7dd3fc\"\n },\n \"selection\": {\n \"fg\": \"#0d0d0d\",\n \"bg\": \"#39ff14\"\n },\n \"blockquote\": {\n \"border\": \"#39ff14\",\n \"fg\": \"#8fbc8f\",\n \"bg\": \"#111111\"\n },\n \"codeInline\": {\n \"fg\": \"#ffb000\",\n \"bg\": \"#111111\"\n },\n \"codeBlock\": {\n \"fg\": \"#c8ffc8\",\n \"bg\": \"#080808\"\n },\n \"table\": {\n \"border\": \"#1f3d1f\",\n \"stripe\": \"#111111\",\n \"theadBg\": \"#080808\",\n \"headerFg\": \"#c8ffc8\"\n }\n }\n }\n },\n \"tokyo-night-dark\": {\n \"id\": \"tokyo-night-dark\",\n \"label\": \"Tokyo Night Dark\",\n \"vendor\": \"tokyo-night\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#1a1b26\",\n \"surface\": \"#24283b\",\n \"overlay\": \"#28344a\"\n },\n \"text\": {\n \"primary\": \"#c0caf5\",\n \"secondary\": \"#a9b1d6\",\n \"inverse\": \"#1a1b26\"\n },\n \"brand\": {\n \"primary\": \"#7aa2f7\",\n \"primaryText\": \"#1a1b26\"\n },\n \"state\": {\n \"info\": \"#7dcfff\",\n \"success\": \"#9ece6a\",\n \"warning\": \"#e0af68\",\n \"danger\": \"#f7768e\",\n \"infoText\": \"#1a1b26\",\n \"successText\": \"#1a1b26\",\n \"warningText\": \"#1a1b26\",\n \"dangerText\": \"#1a1b26\"\n },\n \"border\": {\n \"default\": \"#565f89\"\n },\n \"accent\": {\n \"link\": \"#7aa2f7\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#7aa2f7\",\n \"h2\": \"#bb9af7\",\n \"h3\": \"#7dcfff\",\n \"h4\": \"#e0af68\",\n \"h5\": \"#ff9e64\",\n \"h6\": \"#f7768e\"\n },\n \"body\": {\n \"primary\": \"#c0caf5\",\n \"secondary\": \"#a9b1d6\"\n },\n \"link\": {\n \"default\": \"#7aa2f7\"\n },\n \"selection\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"blockquote\": {\n \"border\": \"#565f89\",\n \"fg\": \"#a9b1d6\",\n \"bg\": \"#24283b\"\n },\n \"codeInline\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"codeBlock\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"table\": {\n \"border\": \"#565f89\",\n \"stripe\": \"#24283b\",\n \"theadBg\": \"#28344a\"\n }\n }\n }\n },\n \"tokyo-night-light\": {\n \"id\": \"tokyo-night-light\",\n \"label\": \"Tokyo Night Light\",\n \"vendor\": \"tokyo-night\",\n \"appearance\": \"light\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#e6e7ed\",\n \"surface\": \"#d5d6dc\",\n \"overlay\": \"#c8d3f5\"\n },\n \"text\": {\n \"primary\": \"#343b58\",\n \"secondary\": \"#40434f\",\n \"inverse\": \"#e6e7ed\"\n },\n \"brand\": {\n \"primary\": \"#2e7de9\",\n \"primaryText\": \"#0b0b0b\"\n },\n \"state\": {\n \"info\": \"#0089a5\",\n \"success\": \"#31876d\",\n \"warning\": \"#8c6c3e\",\n \"danger\": \"#d81159\",\n \"infoText\": \"#0c0c0c\",\n \"successText\": \"#020202\",\n \"warningText\": \"#fdfdfd\",\n \"dangerText\": \"#f7f8f9\"\n },\n \"border\": {\n \"default\": \"#b0b4ca\"\n },\n \"accent\": {\n \"link\": \"#2057a2\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#2c77dd\",\n \"h2\": \"#7847bd\",\n \"h3\": \"#00849e\",\n \"h4\": \"#8c6c3e\",\n \"h5\": \"#bc5e3b\",\n \"h6\": \"#d81159\"\n },\n \"body\": {\n \"primary\": \"#343b58\",\n \"secondary\": \"#40434f\"\n },\n \"link\": {\n \"default\": \"#2057a2\"\n },\n \"selection\": {\n \"fg\": \"#343b58\",\n \"bg\": \"#c8d3f5\"\n },\n \"blockquote\": {\n \"border\": \"#b0b4ca\",\n \"fg\": \"#40434f\",\n \"bg\": \"#e6e7ed\"\n },\n \"codeInline\": {\n \"fg\": \"#343b58\",\n \"bg\": \"#c8d3f5\"\n },\n \"codeBlock\": {\n \"fg\": \"#343b58\",\n \"bg\": \"#c8d3f5\"\n },\n \"table\": {\n \"border\": \"#b0b4ca\",\n \"stripe\": \"#e6e7ed\",\n \"theadBg\": \"#c8d3f5\"\n }\n }\n }\n },\n \"tokyo-night-storm\": {\n \"id\": \"tokyo-night-storm\",\n \"label\": \"Tokyo Night Storm\",\n \"vendor\": \"tokyo-night\",\n \"appearance\": \"dark\",\n \"tokens\": {\n \"background\": {\n \"base\": \"#24283b\",\n \"surface\": \"#28344a\",\n \"overlay\": \"#565f89\"\n },\n \"text\": {\n \"primary\": \"#dbe1f9\",\n \"secondary\": \"#dee1ef\",\n \"inverse\": \"#24283b\"\n },\n \"brand\": {\n \"primary\": \"#7aa2f7\",\n \"primaryText\": \"#24283b\"\n },\n \"state\": {\n \"info\": \"#7dcfff\",\n \"success\": \"#9ece6a\",\n \"warning\": \"#e0af68\",\n \"danger\": \"#f7768e\",\n \"infoText\": \"#24283b\",\n \"successText\": \"#24283b\",\n \"warningText\": \"#24283b\",\n \"dangerText\": \"#24283b\"\n },\n \"border\": {\n \"default\": \"#565f89\"\n },\n \"accent\": {\n \"link\": \"#d6e2fd\"\n },\n \"typography\": {\n \"fonts\": {\n \"sans\": \"Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\"\",\n \"mono\": \"JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace\"\n },\n \"webFonts\": [\n \"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap\",\n \"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap\"\n ]\n },\n \"content\": {\n \"heading\": {\n \"h1\": \"#7aa2f7\",\n \"h2\": \"#bb9af7\",\n \"h3\": \"#7dcfff\",\n \"h4\": \"#e0af68\",\n \"h5\": \"#ff9e64\",\n \"h6\": \"#f7768e\"\n },\n \"body\": {\n \"primary\": \"#c0caf5\",\n \"secondary\": \"#a9b1d6\"\n },\n \"link\": {\n \"default\": \"#d6e2fd\"\n },\n \"selection\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"blockquote\": {\n \"border\": \"#565f89\",\n \"fg\": \"#a9b1d6\",\n \"bg\": \"#28344a\"\n },\n \"codeInline\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"codeBlock\": {\n \"fg\": \"#c0caf5\",\n \"bg\": \"#28344a\"\n },\n \"table\": {\n \"border\": \"#565f89\",\n \"stripe\": \"#28344a\",\n \"theadBg\": \"#28344a\"\n }\n }\n }\n }\n },\n \"byVendor\": {\n \"ayu\": {\n \"name\": \"Ayu\",\n \"homepage\": \"https://github.com/ayu-theme\",\n \"themes\": [\n \"ayu-dark\",\n \"ayu-light\",\n \"ayu-mirage\"\n ]\n },\n \"bulma\": {\n \"name\": \"Bulma\",\n \"homepage\": \"https://bulma.io/\",\n \"themes\": [\n \"bulma-dark\",\n \"bulma-light\"\n ]\n },\n \"catppuccin\": {\n \"name\": \"Catppuccin (synced)\",\n \"homepage\": \"https://catppuccin.com/palette/\",\n \"themes\": [\n \"catppuccin-frappe\",\n \"catppuccin-latte\",\n \"catppuccin-macchiato\",\n \"catppuccin-mocha\"\n ]\n },\n \"dracula\": {\n \"name\": \"Dracula\",\n \"homepage\": \"https://draculatheme.com/\",\n \"themes\": [\n \"dracula\"\n ]\n },\n \"everforest\": {\n \"name\": \"Everforest\",\n \"homepage\": \"https://github.com/sainnhe/everforest\",\n \"themes\": [\n \"everforest-dark-hard\",\n \"everforest-dark-soft\",\n \"everforest-dark\",\n \"everforest-light-hard\",\n \"everforest-light-soft\",\n \"everforest-light\"\n ]\n },\n \"github\": {\n \"name\": \"GitHub (synced)\",\n \"homepage\": \"https://primer.style/\",\n \"themes\": [\n \"github-dark\",\n \"github-light\"\n ]\n },\n \"gruvbox\": {\n \"name\": \"Gruvbox\",\n \"homepage\": \"https://github.com/morhetz/gruvbox\",\n \"themes\": [\n \"gruvbox-dark-hard\",\n \"gruvbox-dark-soft\",\n \"gruvbox-dark\",\n \"gruvbox-light-hard\",\n \"gruvbox-light-soft\",\n \"gruvbox-light\"\n ]\n },\n \"kanagawa\": {\n \"name\": \"Kanagawa\",\n \"homepage\": \"https://github.com/rebelot/kanagawa.nvim\",\n \"themes\": [\n \"kanagawa-dragon\",\n \"kanagawa-lotus\",\n \"kanagawa-wave\"\n ]\n },\n \"nord\": {\n \"name\": \"Nord\",\n \"homepage\": \"https://www.nordtheme.com/\",\n \"themes\": [\n \"nord\"\n ]\n },\n \"one-dark\": {\n \"name\": \"One\",\n \"homepage\": \"https://github.com/Binaryify/OneDark-Pro\",\n \"themes\": [\n \"one-dark\",\n \"one-light\"\n ]\n },\n \"radix\": {\n \"name\": \"Radix Colors (synced)\",\n \"homepage\": \"https://www.radix-ui.com/colors\",\n \"themes\": [\n \"radix-mauve-dark\",\n \"radix-mauve-light\",\n \"radix-slate-dark\",\n \"radix-slate-light\"\n ]\n },\n \"rose-pine\": {\n \"name\": \"Rosé Pine (synced)\",\n \"homepage\": \"https://rosepinetheme.com/\",\n \"themes\": [\n \"rose-pine-dawn\",\n \"rose-pine-moon\",\n \"rose-pine\"\n ]\n },\n \"solarized\": {\n \"name\": \"Solarized\",\n \"homepage\": \"https://ethanschoonover.com/solarized/\",\n \"themes\": [\n \"solarized-dark\",\n \"solarized-light\"\n ]\n },\n \"turbo\": {\n \"name\": \"Terminal\",\n \"homepage\": \"https://github.com/lgtm-hq/turbo-themes\",\n \"themes\": [\n \"terminal\"\n ]\n },\n \"tokyo-night\": {\n \"name\": \"Tokyo Night\",\n \"homepage\": \"https://github.com/enkia/tokyo-night-vscode-theme\",\n \"themes\": [\n \"tokyo-night-dark\",\n \"tokyo-night-light\",\n \"tokyo-night-storm\"\n ]\n }\n }\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Platform-agnostic design tokens export\n *\n * This module exports pure theme data (colors, typography, etc.) without\n * any DOM, CSS, or platform-specific code. Use this for:\n *\n * - React Native apps\n * - Flutter apps (via JSON export)\n * - iOS/Android native apps\n * - Any platform that needs theme colors\n *\n * For web apps, you can also import the CSS files directly:\n * import '@lgtm-hq/turbo-themes/css/catppuccin-mocha.css'\n */\nexport { THEME_IDS } from '../themes/theme-ids.js';\n// Import tokens data (copied from dist/tokens.json during build)\nimport tokensData from '../themes/tokens.json' with { type: 'json' };\nconst tokens = tokensData;\n/**\n * All available theme flavors as a flat array\n */\nexport const flavors = Object.values(tokens.themes).map((theme) => ({\n id: theme.id,\n label: theme.label,\n vendor: theme.vendor,\n appearance: theme.appearance,\n ...(theme.iconUrl !== undefined && { iconUrl: theme.iconUrl }),\n tokens: theme.tokens,\n}));\n/**\n * Theme flavors indexed by ID for quick lookup\n */\nexport const themesById = /*#__PURE__*/ Object.fromEntries(flavors.map((flavor) => [flavor.id, flavor]));\n/**\n * All available theme packages (grouped by vendor)\n */\nexport const packages = /*#__PURE__*/ Object.fromEntries(Object.entries(tokens.byVendor).map(([vendorId, vendor]) => [\n vendorId,\n {\n id: vendorId,\n name: vendor.name,\n homepage: vendor.homepage,\n flavors: vendor.themes.map((themeId) => themesById[themeId]).filter(Boolean),\n },\n]));\n/**\n * Get a theme by ID\n * @param id - Theme identifier (e.g., 'catppuccin-mocha')\n * @returns The theme flavor or undefined if not found\n */\nexport function getTheme(id) {\n return themesById[id];\n}\n/**\n * Get theme tokens by ID (convenience function)\n * @param id - Theme identifier (e.g., 'catppuccin-mocha')\n * @returns The theme tokens or undefined if not found\n */\nexport function getTokens(id) {\n return themesById[id]?.tokens;\n}\n/**\n * Get all themes matching an appearance (light/dark)\n * @param appearance - 'light' or 'dark'\n * @returns Array of matching theme flavors\n */\nexport function getThemesByAppearance(appearance) {\n return flavors.filter((f) => f.appearance === appearance);\n}\n/**\n * Get all themes from a specific vendor\n * @param vendor - Vendor name (e.g., 'catppuccin', 'github')\n * @returns Array of matching theme flavors\n */\nexport function getThemesByVendor(vendor) {\n return flavors.filter((f) => f.vendor === vendor);\n}\n/**\n * List of all available theme IDs\n */\nexport const themeIds = /*#__PURE__*/ flavors.map((f) => f.id);\n/**\n * List of all available vendors\n */\nexport const vendors = /*#__PURE__*/ [...new Set(flavors.map((f) => f.vendor))];\n//# sourceMappingURL=index.js.map","// SPDX-License-Identifier: MIT\n// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY\n// Generated from: schema/tokens/themes/*.tokens.json + schema/tokens/_vendors.json\n// Generator: scripts/codegen/generate-metadata.mjs\n// Run: bun run generate:metadata\n/**\n * All theme IDs as a readonly tuple (sorted by token filename).\n * Used to derive the {@link ThemeId} literal union.\n */\nexport const THEME_IDS = [\n 'ayu-dark',\n 'ayu-light',\n 'ayu-mirage',\n 'bulma-dark',\n 'bulma-light',\n 'catppuccin-frappe',\n 'catppuccin-latte',\n 'catppuccin-macchiato',\n 'catppuccin-mocha',\n 'dracula',\n 'everforest-dark-hard',\n 'everforest-dark-soft',\n 'everforest-dark',\n 'everforest-light-hard',\n 'everforest-light-soft',\n 'everforest-light',\n 'github-dark',\n 'github-light',\n 'gruvbox-dark-hard',\n 'gruvbox-dark-soft',\n 'gruvbox-dark',\n 'gruvbox-light-hard',\n 'gruvbox-light-soft',\n 'gruvbox-light',\n 'kanagawa-dragon',\n 'kanagawa-lotus',\n 'kanagawa-wave',\n 'nord',\n 'one-dark',\n 'one-light',\n 'radix-mauve-dark',\n 'radix-mauve-light',\n 'radix-slate-dark',\n 'radix-slate-light',\n 'rose-pine-dawn',\n 'rose-pine-moon',\n 'rose-pine',\n 'solarized-dark',\n 'solarized-light',\n 'terminal',\n 'tokyo-night-dark',\n 'tokyo-night-light',\n 'tokyo-night-storm',\n];\n/**\n * Ordered list of vendor IDs controlling display order in dropdowns.\n * Source: schema/tokens/_vendors.json\n */\nexport const VENDOR_ORDER = [\n 'catppuccin',\n 'dracula',\n 'everforest',\n 'gruvbox',\n 'github',\n 'bulma',\n 'nord',\n 'radix',\n 'solarized',\n 'rose-pine',\n 'tokyo-night',\n 'kanagawa',\n 'one-dark',\n 'ayu',\n 'turbo',\n];\n/** Per-theme human-readable descriptions for UI pickers. */\nexport const THEME_DESCRIPTIONS = {\n \"ayu-dark\": \"Deep Ayu dark theme for low-light environments.\",\n \"ayu-light\": \"Bright Ayu palette designed for comfortable daytime coding.\",\n \"ayu-mirage\": \"Soft dark Ayu variant with subtle, muted accents.\",\n \"bulma-dark\": \"Dark Bulma theme tuned for low-light reading.\",\n \"bulma-light\": \"Classic Bulma look with a bright, neutral palette.\",\n \"catppuccin-frappe\": \"Balanced dark Catppuccin theme for focused work.\",\n \"catppuccin-latte\": \"Light, soft Catppuccin palette for daytime use.\",\n \"catppuccin-macchiato\": \"Deep, atmospheric Catppuccin variant with rich contrast.\",\n \"catppuccin-mocha\": \"Cozy, high-contrast Catppuccin theme for late-night sessions.\",\n \"dracula\": \"Iconic Dracula dark theme with vibrant accents.\",\n \"everforest-dark-hard\": \"Highest contrast dark Everforest palette with deep forest shadows.\",\n \"everforest-dark-soft\": \"Softer dark Everforest palette with reduced contrast.\",\n \"everforest-dark\": \"Classic Everforest dark palette with warm, natural greens.\",\n \"everforest-light-hard\": \"Bright, crisp Everforest light palette with extra contrast.\",\n \"everforest-light-soft\": \"Soft, low-contrast Everforest light palette for long sessions.\",\n \"everforest-light\": \"Classic Everforest light palette with warm paper tones.\",\n \"github-dark\": \"GitHub dark theme optimized for code-heavy views.\",\n \"github-light\": \"GitHub-inspired light theme suited for documentation and UI heavy pages.\",\n \"gruvbox-dark-hard\": \"Highest contrast dark Gruvbox palette with deep shadows.\",\n \"gruvbox-dark-soft\": \"Softer dark Gruvbox palette with reduced contrast.\",\n \"gruvbox-dark\": \"Classic Gruvbox dark palette with warm, muted tones.\",\n \"gruvbox-light-hard\": \"Bright, crisp Gruvbox light palette with extra contrast.\",\n \"gruvbox-light-soft\": \"Soft, low-contrast Gruvbox light palette for long sessions.\",\n \"gruvbox-light\": \"Classic Gruvbox light palette with warm paper tones.\",\n \"kanagawa-dragon\": \"Darker Kanagawa variant for late-night sessions.\",\n \"kanagawa-lotus\": \"Light Kanagawa palette for daytime use.\",\n \"kanagawa-wave\": \"Heart-warming dark Kanagawa palette inspired by The Great Wave.\",\n \"nord\": \"Arctic, north-bluish color palette inspired by the polar night.\",\n \"one-dark\": \"The classic Atom One Dark palette with vivid syntax accents.\",\n \"one-light\": \"Companion One Light palette for bright, daytime editing.\",\n \"radix-mauve-dark\": \"Neutral purple-gray Radix dark theme for accessible UIs.\",\n \"radix-mauve-light\": \"Neutral purple-gray Radix light theme for accessible UIs.\",\n \"radix-slate-dark\": \"Neutral blue-gray Radix dark theme for accessible UIs.\",\n \"radix-slate-light\": \"Neutral blue-gray Radix light theme for accessible UIs.\",\n \"rose-pine-dawn\": \"Light Rosé Pine variant for daytime use.\",\n \"rose-pine-moon\": \"Deeper variant of Rosé Pine with enhanced contrast.\",\n \"rose-pine\": \"Elegant dark theme with natural pine and soho vibes.\",\n \"solarized-dark\": \"Solarized Dark with a balanced, low-contrast palette.\",\n \"solarized-light\": \"Solarized Light tuned for bright, daylight-friendly UIs.\",\n \"terminal\": \"CRT phosphor green on void with IBM Plex Mono.\",\n \"tokyo-night-dark\": \"Deep midnight blues with neon accents.\",\n \"tokyo-night-light\": \"Clean daylight palette inspired by Tokyo mornings.\",\n \"tokyo-night-storm\": \"Stormy variant with richer contrast and depth.\"\n};\n/** Per-theme icon filenames relative to assets/img/. */\nexport const THEME_ICONS = {\n \"ayu-dark\": \"ayu-dark.png\",\n \"ayu-light\": \"ayu-light.png\",\n \"ayu-mirage\": \"ayu-mirage.png\",\n \"bulma-dark\": \"bulma-logo-dark.png\",\n \"bulma-light\": \"bulma-logo.png\",\n \"catppuccin-frappe\": \"catppuccin-logo-macchiato.png\",\n \"catppuccin-latte\": \"catppuccin-logo-latte.png\",\n \"catppuccin-macchiato\": \"catppuccin-logo-macchiato.png\",\n \"catppuccin-mocha\": \"catppuccin-logo-macchiato.png\",\n \"dracula\": \"dracula-logo.png\",\n \"everforest-dark-hard\": \"everforest-dark-hard.png\",\n \"everforest-dark-soft\": \"everforest-dark-soft.png\",\n \"everforest-dark\": \"everforest-dark.png\",\n \"everforest-light-hard\": \"everforest-light-hard.png\",\n \"everforest-light-soft\": \"everforest-light-soft.png\",\n \"everforest-light\": \"everforest-light.png\",\n \"github-dark\": \"github-logo-dark.png\",\n \"github-light\": \"github-logo-light.png\",\n \"gruvbox-dark-hard\": \"gruvbox-dark-hard.png\",\n \"gruvbox-dark-soft\": \"gruvbox-dark-soft.png\",\n \"gruvbox-dark\": \"gruvbox-dark.png\",\n \"gruvbox-light-hard\": \"gruvbox-light-hard.png\",\n \"gruvbox-light-soft\": \"gruvbox-light-soft.png\",\n \"gruvbox-light\": \"gruvbox-light.png\",\n \"kanagawa-dragon\": \"kanagawa-dragon.png\",\n \"kanagawa-lotus\": \"kanagawa-lotus.png\",\n \"kanagawa-wave\": \"kanagawa-wave.png\",\n \"nord\": \"nord.png\",\n \"one-dark\": \"one-dark.png\",\n \"one-light\": \"one-light.png\",\n \"radix-mauve-dark\": \"radix-slate-dark.png\",\n \"radix-mauve-light\": \"radix-slate-light.png\",\n \"radix-slate-dark\": \"radix-slate-dark.png\",\n \"radix-slate-light\": \"radix-slate-light.png\",\n \"rose-pine-dawn\": \"rose-pine.png\",\n \"rose-pine-moon\": \"rose-pine.png\",\n \"rose-pine\": \"rose-pine.png\",\n \"solarized-dark\": \"solarized-dark.png\",\n \"solarized-light\": \"solarized-light.png\",\n \"terminal\": \"terminal.png\",\n \"tokyo-night-dark\": \"tokyo-night.png\",\n \"tokyo-night-light\": \"tokyo-night.png\",\n \"tokyo-night-storm\": \"tokyo-night.png\"\n};\n/** Per-vendor default icons (filename or light/dark pair). */\nexport const VENDOR_ICONS = {\n \"catppuccin\": {\n \"light\": \"catppuccin-logo-latte.png\",\n \"dark\": \"catppuccin-logo-macchiato.png\"\n },\n \"dracula\": \"dracula-logo.png\",\n \"everforest\": {\n \"light\": \"everforest-light.png\",\n \"dark\": \"everforest-dark.png\"\n },\n \"gruvbox\": {\n \"light\": \"gruvbox-light.png\",\n \"dark\": \"gruvbox-dark.png\"\n },\n \"github\": {\n \"light\": \"github-logo-light.png\",\n \"dark\": \"github-logo-dark.png\"\n },\n \"bulma\": {\n \"light\": \"bulma-logo.png\",\n \"dark\": \"bulma-logo-dark.png\"\n },\n \"nord\": \"nord.png\",\n \"radix\": {\n \"light\": \"radix-slate-light.png\",\n \"dark\": \"radix-slate-dark.png\"\n },\n \"solarized\": {\n \"light\": \"solarized-light.png\",\n \"dark\": \"solarized-dark.png\"\n },\n \"rose-pine\": \"rose-pine.png\",\n \"tokyo-night\": \"tokyo-night.png\",\n \"kanagawa\": {\n \"light\": \"kanagawa-lotus.png\",\n \"dark\": \"kanagawa-wave.png\"\n },\n \"one-dark\": {\n \"light\": \"one-light.png\",\n \"dark\": \"one-dark.png\"\n },\n \"ayu\": {\n \"light\": \"ayu-light.png\",\n \"dark\": \"ayu-dark.png\"\n },\n \"turbo\": \"terminal.png\"\n};\n/** Per-vendor family display metadata. */\nexport const VENDOR_FAMILY_META = {\n \"catppuccin\": {\n \"name\": \"Catppuccin\",\n \"description\": \"Soothing pastel themes\"\n },\n \"dracula\": {\n \"name\": \"Dracula\",\n \"description\": \"Dark vampire aesthetic\"\n },\n \"everforest\": {\n \"name\": \"Everforest\",\n \"description\": \"Green-based, nature-inspired palette designed for eye comfort\"\n },\n \"gruvbox\": {\n \"name\": \"Gruvbox\",\n \"description\": \"Retro groove palette with warm, earthy tones\"\n },\n \"github\": {\n \"name\": \"GitHub\",\n \"description\": \"GitHub-inspired themes\"\n },\n \"bulma\": {\n \"name\": \"Bulma\",\n \"description\": \"Classic Bulma themes\"\n },\n \"nord\": {\n \"name\": \"Nord\",\n \"description\": \"Arctic, north-bluish color palette\"\n },\n \"radix\": {\n \"name\": \"Radix Colors\",\n \"description\": \"Accessibility-focused color system with comprehensive scales\"\n },\n \"solarized\": {\n \"name\": \"Solarized\",\n \"description\": \"Precision-balanced light and dark modes\"\n },\n \"rose-pine\": {\n \"name\": \"Rosé Pine\",\n \"description\": \"All natural pine, faux fur and a bit of soho vibes\"\n },\n \"tokyo-night\": {\n \"name\": \"Tokyo Night\",\n \"description\": \"Neon-infused nightscape with crisp contrast\"\n },\n \"kanagawa\": {\n \"name\": \"Kanagawa\",\n \"description\": \"Japanese-inspired palette drawn from The Great Wave off Kanagawa\"\n },\n \"one-dark\": {\n \"name\": \"One\",\n \"description\": \"The iconic Atom editor palette in dark and light\"\n },\n \"ayu\": {\n \"name\": \"Ayu\",\n \"description\": \"Bright colors designed for comfortable all-day coding\"\n },\n \"turbo\": {\n \"name\": \"Terminal\",\n \"description\": \"CRT phosphor green on void\"\n }\n};\n//# sourceMappingURL=metadata.js.map","// SPDX-License-Identifier: MIT\n/**\n * Consolidated theme metadata derived from tokens.json.\n *\n * All display metadata (names, appearances, vendor groups) is computed from\n * the canonical token data at module evaluation time. Consumers should import\n * from here instead of maintaining their own hardcoded copies.\n *\n * Vendor order and ThemeId come from build-time codegen\n * (`packages/core/src/themes/generated/metadata.ts`).\n */\nimport { flavors, themeIds, packages } from '../tokens/index.js';\nimport { VENDOR_ORDER as GENERATED_VENDOR_ORDER } from './generated/metadata.js';\nexport { THEME_IDS, THEME_DESCRIPTIONS, THEME_ICONS, VENDOR_ICONS, VENDOR_FAMILY_META, } from './generated/metadata.js';\n/** Default theme applied when no preference is stored. */\nexport const DEFAULT_THEME = 'catppuccin-mocha';\n/** All valid theme IDs (re-export for convenience). */\nexport const VALID_THEMES = themeIds;\n/** Set of valid theme IDs for O(1) lookup. */\nexport const VALID_THEME_SET = /*#__PURE__*/ new Set(themeIds);\n/** Full human-readable label for each theme (e.g., \"Catppuccin Mocha\"). */\nexport const THEME_NAMES = /*#__PURE__*/ Object.fromEntries(flavors.map((f) => [f.id, f.label]));\n/** Appearance (light/dark) for each theme. */\nexport const THEME_APPEARANCES = \n/*#__PURE__*/ Object.fromEntries(flavors.map((f) => [f.id, f.appearance]));\n/**\n * Ordered list of vendor IDs controlling display order in dropdowns.\n * Generated from schema/tokens/_vendors.json — do not edit by hand.\n */\nexport const VENDOR_ORDER = GENERATED_VENDOR_ORDER;\n/**\n * Ordered array of vendor groups derived from packages + VENDOR_ORDER.\n * The \"(synced)\" suffix is stripped from display names.\n */\n// Dev-time validation: warn if packages has vendors not listed in VENDOR_ORDER\nconst _packageKeys = Object.keys(packages);\nconst _missingFromOrder = _packageKeys.filter((id) => !VENDOR_ORDER.includes(id));\nif (_missingFromOrder.length > 0) {\n console.warn(`[metadata] VENDOR_ORDER is missing vendor IDs present in packages: ${_missingFromOrder.join(', ')}. ` +\n 'Append them to schema/tokens/_vendors.json and regenerate metadata.');\n}\nexport const VENDOR_GROUPS = /*#__PURE__*/ VENDOR_ORDER.filter((id) => id in packages).map((id) => {\n const pkg = packages[id];\n return {\n id,\n displayName: pkg.name.replace(/\\s*\\(synced\\)\\s*/i, ''),\n themeIds: pkg.flavors.flatMap((f) => (f ? [f.id] : [])),\n };\n});\n/** O(1) flavor lookup by ID, built once at module evaluation time. */\nconst flavorById = /*#__PURE__*/ new Map(flavors.map((f) => [f.id, f]));\n/** Cache for computed short labels. */\nconst shortLabelCache = new Map();\n/**\n * Strip the vendor prefix from a theme label to produce a short label.\n *\n * For single-flavor vendors (e.g., \"Dracula\", \"Nord\") the full label is returned.\n * For multi-flavor vendors the vendor name prefix is stripped:\n * \"Catppuccin Mocha\" -> \"Mocha\"\n * \"Gruvbox Dark Hard\" -> \"Dark Hard\"\n *\n * @param themeId - A valid theme ID\n * @returns The short display label, or the full label if the theme is not found\n */\nexport function getShortLabel(themeId) {\n const cached = shortLabelCache.get(themeId);\n if (cached !== undefined)\n return cached;\n const flavor = flavorById.get(themeId);\n if (!flavor)\n return themeId;\n const vendorPkg = packages[flavor.vendor];\n if (!vendorPkg) {\n shortLabelCache.set(themeId, flavor.label);\n return flavor.label;\n }\n // Single-flavor vendors keep their full label\n if (vendorPkg.flavors.length === 1) {\n shortLabelCache.set(themeId, flavor.label);\n return flavor.label;\n }\n // Strip vendor display name prefix (case-insensitive, NFC-normalized for\n // consistent handling of composed/decomposed Unicode accents).\n const displayName = vendorPkg.name.replace(/\\s*\\(synced\\)\\s*/i, '').normalize('NFC');\n const label = flavor.label;\n let result;\n if (label.normalize('NFC').toLowerCase().startsWith(displayName.toLowerCase())) {\n const stripped = label.slice(displayName.length).trim();\n result = stripped || label;\n }\n else {\n result = label;\n }\n shortLabelCache.set(themeId, result);\n return result;\n}\n/** Pre-computed short labels for all themes. */\nexport const THEME_SHORT_LABELS = \n/*#__PURE__*/ Object.fromEntries(flavors.map((f) => [f.id, getShortLabel(f.id)]));\n//# sourceMappingURL=metadata.js.map","// SPDX-License-Identifier: MIT\n/**\n * Consumer theme curation API.\n *\n * `createThemeCatalog()` provides a single, composable surface for selecting a\n * subset of themes. It composes with the existing `flavors` (tokens) and\n * `VENDOR_GROUPS` (metadata) so consumers no longer need to hand-slice arrays.\n *\n * Filter precedence:\n * all themes -> vendors/appearances -> include -> exclude\n *\n * Invalid IDs supplied to `include`/`exclude` warn in development (never\n * throw), so a typo cannot silently drop or duplicate a theme.\n */\nimport { flavors, themeIds as allThemeIds } from '../tokens/index.js';\nimport { VENDOR_GROUPS } from '../themes/metadata.js';\nconst KNOWN_THEME_IDS = new Set(allThemeIds);\n/**\n * Emit a dev-time warning for unknown IDs. The `typeof` guard is safe even\n * when `process` is an undeclared identifier (browsers/workers without a\n * shim), and keeps the contiguous `process.env.NODE_ENV` token sequence so\n * bundler define-replacement and dead-code elimination still apply.\n */\nfunction warnInvalidIds(source, ids) {\n if (ids.length === 0)\n return;\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production')\n return;\n console.warn(`[catalog] createThemeCatalog: ignoring unknown ${source} theme ID(s): ${ids.join(', ')}. ` +\n 'Valid IDs come from the exported `themeIds`.');\n}\n/**\n * Build a curated {@link ThemeCatalog} from the full theme set.\n *\n * @param options - Vendor/appearance filters plus explicit include/exclude IDs.\n * @returns A catalog exposing `themeIds`, `flavors`, and `vendorGroups`.\n */\nexport function createThemeCatalog(options = {}) {\n const { vendors, appearances, include = [], exclude = [] } = options;\n const selected = new Set();\n for (const flavor of flavors) {\n if (vendors !== undefined && !vendors.includes(flavor.vendor))\n continue;\n if (appearances !== undefined && !appearances.includes(flavor.appearance))\n continue;\n selected.add(flavor.id);\n }\n const invalidInclude = [];\n for (const id of include) {\n if (KNOWN_THEME_IDS.has(id)) {\n selected.add(id);\n }\n else {\n invalidInclude.push(id);\n }\n }\n warnInvalidIds('include', invalidInclude);\n const invalidExclude = [];\n for (const id of exclude) {\n if (KNOWN_THEME_IDS.has(id)) {\n selected.delete(id);\n }\n else {\n invalidExclude.push(id);\n }\n }\n warnInvalidIds('exclude', invalidExclude);\n const selectedFlavors = flavors.filter((flavor) => selected.has(flavor.id));\n const selectedThemeIds = selectedFlavors.map((flavor) => flavor.id);\n const vendorGroups = VENDOR_GROUPS.map((group) => ({\n ...group,\n themeIds: group.themeIds.filter((id) => selected.has(id)),\n })).filter((group) => group.themeIds.length > 0);\n return {\n themeIds: selectedThemeIds,\n flavors: selectedFlavors,\n vendorGroups,\n };\n}\n//# sourceMappingURL=create.js.map","// SPDX-License-Identifier: MIT\n/**\n * Named theme presets built on top of {@link createThemeCatalog}.\n *\n * These provide opinionated defaults so consumers don't rebuild the same\n * \"minimal\" or \"dark-only\" lists in every app. Per-vendor sets are derived\n * from the `packages` keys, so new vendor variants appear automatically on\n * upgrade for opted-in vendors.\n */\nimport { packages } from '../tokens/index.js';\nimport { createThemeCatalog } from './create.js';\n/**\n * The curated \"minimal\" starter set: one light + one dark theme from the two\n * most common vendors.\n */\nconst MINIMAL_THEME_IDS = [\n 'catppuccin-mocha',\n 'catppuccin-latte',\n 'github-light',\n 'github-dark',\n];\nconst perVendorSets = Object.fromEntries(Object.keys(packages).map((vendor) => [vendor, createThemeCatalog({ vendors: [vendor] })]));\nexport const themeSets = {\n ...perVendorSets,\n minimal: createThemeCatalog({ vendors: [], include: MINIMAL_THEME_IDS }),\n dark: createThemeCatalog({ appearances: ['dark'] }),\n light: createThemeCatalog({ appearances: ['light'] }),\n};\n//# sourceMappingURL=sets.js.map","// SPDX-License-Identifier: MIT\n/**\n * Theme appearance (light/dark) resolution for DOM attributes.\n */\n\nimport { THEME_APPEARANCES } from '@lgtm-hq/turbo-themes-core';\n\nexport type ThemeAppearance = 'light' | 'dark';\n\n/**\n * Resolves light/dark appearance for a theme ID.\n *\n * Falls back to `'dark'` when the theme is unknown (e.g. custom themes without\n * an explicit mapping).\n */\nexport function resolveThemeAppearance(\n themeId: string,\n appearances: Readonly<Record<string, ThemeAppearance>> = THEME_APPEARANCES,\n): ThemeAppearance {\n return appearances[themeId] ?? 'dark';\n}\n","// SPDX-License-Identifier: MIT\n// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY\n// Generated from: schema/tokens/themes/*.tokens.json + schema/tokens/_vendors.json\n// Generator: scripts/codegen/generate-metadata.mjs\n// Run: bun run generate:metadata\n\n/** Theme family identifiers (one per vendor). */\nexport type ThemeFamily =\n | 'catppuccin'\n | 'dracula'\n | 'everforest'\n | 'gruvbox'\n | 'github'\n | 'bulma'\n | 'nord'\n | 'radix'\n | 'solarized'\n | 'rose-pine'\n | 'tokyo-night'\n | 'kanagawa'\n | 'one-dark'\n | 'ayu'\n | 'turbo';\n\nexport interface ThemeFamilyMeta {\n name: string;\n description: string;\n}\n\n/** Family display metadata keyed by ThemeFamily. */\nexport const THEME_FAMILIES: Record<ThemeFamily, ThemeFamilyMeta> = {\n \"catppuccin\": {\n \"name\": \"Catppuccin\",\n \"description\": \"Soothing pastel themes\"\n },\n \"dracula\": {\n \"name\": \"Dracula\",\n \"description\": \"Dark vampire aesthetic\"\n },\n \"everforest\": {\n \"name\": \"Everforest\",\n \"description\": \"Green-based, nature-inspired palette designed for eye comfort\"\n },\n \"gruvbox\": {\n \"name\": \"Gruvbox\",\n \"description\": \"Retro groove palette with warm, earthy tones\"\n },\n \"github\": {\n \"name\": \"GitHub\",\n \"description\": \"GitHub-inspired themes\"\n },\n \"bulma\": {\n \"name\": \"Bulma\",\n \"description\": \"Classic Bulma themes\"\n },\n \"nord\": {\n \"name\": \"Nord\",\n \"description\": \"Arctic, north-bluish color palette\"\n },\n \"radix\": {\n \"name\": \"Radix Colors\",\n \"description\": \"Accessibility-focused color system with comprehensive scales\"\n },\n \"solarized\": {\n \"name\": \"Solarized\",\n \"description\": \"Precision-balanced light and dark modes\"\n },\n \"rose-pine\": {\n \"name\": \"Rosé Pine\",\n \"description\": \"All natural pine, faux fur and a bit of soho vibes\"\n },\n \"tokyo-night\": {\n \"name\": \"Tokyo Night\",\n \"description\": \"Neon-infused nightscape with crisp contrast\"\n },\n \"kanagawa\": {\n \"name\": \"Kanagawa\",\n \"description\": \"Japanese-inspired palette drawn from The Great Wave off Kanagawa\"\n },\n \"one-dark\": {\n \"name\": \"One\",\n \"description\": \"The iconic Atom editor palette in dark and light\"\n },\n \"ayu\": {\n \"name\": \"Ayu\",\n \"description\": \"Bright colors designed for comfortable all-day coding\"\n },\n \"turbo\": {\n \"name\": \"Terminal\",\n \"description\": \"CRT phosphor green on void\"\n }\n};\n\n/**\n * Fallback family when a vendor is missing from {@link VENDOR_FAMILY_MAP}.\n * First entry in schema/tokens/_vendors.json (display order).\n */\nexport const DEFAULT_FAMILY: ThemeFamily = 'catppuccin';\n\n/** Vendor to family mapping. */\nexport const VENDOR_FAMILY_MAP: Record<string, ThemeFamily> = {\n \"catppuccin\": \"catppuccin\",\n \"dracula\": \"dracula\",\n \"everforest\": \"everforest\",\n \"gruvbox\": \"gruvbox\",\n \"github\": \"github\",\n \"bulma\": \"bulma\",\n \"nord\": \"nord\",\n \"radix\": \"radix\",\n \"solarized\": \"solarized\",\n \"rose-pine\": \"rose-pine\",\n \"tokyo-night\": \"tokyo-night\",\n \"kanagawa\": \"kanagawa\",\n \"one-dark\": \"one-dark\",\n \"ayu\": \"ayu\",\n \"turbo\": \"turbo\"\n};\n\n/** Icon configuration - string for single icon, object for appearance-specific. */\nexport interface AppearanceIcons {\n light: string;\n dark: string;\n}\n\n/** Vendor icon paths relative to the published package root (assets/img/...). */\nexport const VENDOR_ICON_MAP: Record<string, string | AppearanceIcons> = {\n \"catppuccin\": {\n \"light\": \"assets/img/catppuccin-logo-latte.png\",\n \"dark\": \"assets/img/catppuccin-logo-macchiato.png\"\n },\n \"dracula\": \"assets/img/dracula-logo.png\",\n \"everforest\": {\n \"light\": \"assets/img/everforest-light.png\",\n \"dark\": \"assets/img/everforest-dark.png\"\n },\n \"gruvbox\": {\n \"light\": \"assets/img/gruvbox-light.png\",\n \"dark\": \"assets/img/gruvbox-dark.png\"\n },\n \"github\": {\n \"light\": \"assets/img/github-logo-light.png\",\n \"dark\": \"assets/img/github-logo-dark.png\"\n },\n \"bulma\": {\n \"light\": \"assets/img/bulma-logo.png\",\n \"dark\": \"assets/img/bulma-logo-dark.png\"\n },\n \"nord\": \"assets/img/nord.png\",\n \"radix\": {\n \"light\": \"assets/img/radix-slate-light.png\",\n \"dark\": \"assets/img/radix-slate-dark.png\"\n },\n \"solarized\": {\n \"light\": \"assets/img/solarized-light.png\",\n \"dark\": \"assets/img/solarized-dark.png\"\n },\n \"rose-pine\": \"assets/img/rose-pine.png\",\n \"tokyo-night\": \"assets/img/tokyo-night.png\",\n \"kanagawa\": {\n \"light\": \"assets/img/kanagawa-lotus.png\",\n \"dark\": \"assets/img/kanagawa-wave.png\"\n },\n \"one-dark\": {\n \"light\": \"assets/img/one-light.png\",\n \"dark\": \"assets/img/one-dark.png\"\n },\n \"ayu\": {\n \"light\": \"assets/img/ayu-light.png\",\n \"dark\": \"assets/img/ayu-dark.png\"\n },\n \"turbo\": \"assets/img/terminal.png\"\n};\n\n/** Predefined flavor descriptions keyed by theme id. */\nexport const FLAVOR_DESCRIPTIONS: Record<string, string> = {\n \"ayu-dark\": \"Deep Ayu dark theme for low-light environments.\",\n \"ayu-light\": \"Bright Ayu palette designed for comfortable daytime coding.\",\n \"ayu-mirage\": \"Soft dark Ayu variant with subtle, muted accents.\",\n \"bulma-dark\": \"Dark Bulma theme tuned for low-light reading.\",\n \"bulma-light\": \"Classic Bulma look with a bright, neutral palette.\",\n \"catppuccin-frappe\": \"Balanced dark Catppuccin theme for focused work.\",\n \"catppuccin-latte\": \"Light, soft Catppuccin palette for daytime use.\",\n \"catppuccin-macchiato\": \"Deep, atmospheric Catppuccin variant with rich contrast.\",\n \"catppuccin-mocha\": \"Cozy, high-contrast Catppuccin theme for late-night sessions.\",\n \"dracula\": \"Iconic Dracula dark theme with vibrant accents.\",\n \"everforest-dark-hard\": \"Highest contrast dark Everforest palette with deep forest shadows.\",\n \"everforest-dark-soft\": \"Softer dark Everforest palette with reduced contrast.\",\n \"everforest-dark\": \"Classic Everforest dark palette with warm, natural greens.\",\n \"everforest-light-hard\": \"Bright, crisp Everforest light palette with extra contrast.\",\n \"everforest-light-soft\": \"Soft, low-contrast Everforest light palette for long sessions.\",\n \"everforest-light\": \"Classic Everforest light palette with warm paper tones.\",\n \"github-dark\": \"GitHub dark theme optimized for code-heavy views.\",\n \"github-light\": \"GitHub-inspired light theme suited for documentation and UI heavy pages.\",\n \"gruvbox-dark-hard\": \"Highest contrast dark Gruvbox palette with deep shadows.\",\n \"gruvbox-dark-soft\": \"Softer dark Gruvbox palette with reduced contrast.\",\n \"gruvbox-dark\": \"Classic Gruvbox dark palette with warm, muted tones.\",\n \"gruvbox-light-hard\": \"Bright, crisp Gruvbox light palette with extra contrast.\",\n \"gruvbox-light-soft\": \"Soft, low-contrast Gruvbox light palette for long sessions.\",\n \"gruvbox-light\": \"Classic Gruvbox light palette with warm paper tones.\",\n \"kanagawa-dragon\": \"Darker Kanagawa variant for late-night sessions.\",\n \"kanagawa-lotus\": \"Light Kanagawa palette for daytime use.\",\n \"kanagawa-wave\": \"Heart-warming dark Kanagawa palette inspired by The Great Wave.\",\n \"nord\": \"Arctic, north-bluish color palette inspired by the polar night.\",\n \"one-dark\": \"The classic Atom One Dark palette with vivid syntax accents.\",\n \"one-light\": \"Companion One Light palette for bright, daytime editing.\",\n \"radix-mauve-dark\": \"Neutral purple-gray Radix dark theme for accessible UIs.\",\n \"radix-mauve-light\": \"Neutral purple-gray Radix light theme for accessible UIs.\",\n \"radix-slate-dark\": \"Neutral blue-gray Radix dark theme for accessible UIs.\",\n \"radix-slate-light\": \"Neutral blue-gray Radix light theme for accessible UIs.\",\n \"rose-pine-dawn\": \"Light Rosé Pine variant for daytime use.\",\n \"rose-pine-moon\": \"Deeper variant of Rosé Pine with enhanced contrast.\",\n \"rose-pine\": \"Elegant dark theme with natural pine and soho vibes.\",\n \"solarized-dark\": \"Solarized Dark with a balanced, low-contrast palette.\",\n \"solarized-light\": \"Solarized Light tuned for bright, daylight-friendly UIs.\",\n \"terminal\": \"CRT phosphor green on void with IBM Plex Mono.\",\n \"tokyo-night-dark\": \"Deep midnight blues with neon accents.\",\n \"tokyo-night-light\": \"Clean daylight palette inspired by Tokyo mornings.\",\n \"tokyo-night-storm\": \"Stormy variant with richer contrast and depth.\"\n};\n","// SPDX-License-Identifier: MIT\n/**\n * Constants for theme selector component\n */\n\nimport { DEFAULT_THEME as CORE_DEFAULT_THEME } from '@lgtm-hq/turbo-themes-core';\nimport { THEME_FAMILIES as GENERATED_THEME_FAMILIES } from './generated/theme-maps.js';\n\n// Re-export ThemeFamily for convenience\nexport type { ThemeFamily } from './types.js';\nexport type { ThemeFamilyMeta } from './generated/theme-maps.js';\n\nexport const STORAGE_KEY = 'turbo-theme';\nexport const LEGACY_STORAGE_KEYS = ['bulma-theme-flavor'];\nexport const DEFAULT_THEME = CORE_DEFAULT_THEME;\n\n/** ID of the CSS link element used by the blocking script to prevent FOUC. */\nexport const CSS_LINK_ID = 'turbo-theme-css';\n\n// DOM element IDs and selectors - centralized to avoid magic strings\nexport const DOM_IDS = {\n THEME_FLAVOR_TRIGGER: 'theme-flavor-trigger',\n THEME_FLAVOR_TRIGGER_ICON: 'theme-flavor-trigger-icon',\n THEME_FLAVOR_TRIGGER_LABEL: 'theme-flavor-trigger-label',\n THEME_FLAVOR_MENU: 'theme-flavor-menu',\n THEME_FLAVOR_SELECT: 'theme-flavor-select',\n} as const;\n\nexport const DOM_SELECTORS = {\n DROPDOWN_ITEMS: `#${DOM_IDS.THEME_FLAVOR_MENU} .dropdown-item.theme-item`,\n NAVBAR_DROPDOWN: '.navbar-item.has-dropdown',\n NAV_REPORTS: '[data-testid=\"nav-reports\"]',\n NAVBAR_ITEM: '.navbar-item',\n HIGHLIGHT_PRE: '.highlight > pre',\n THEME_CSS_LINKS: 'link[id^=\"theme-\"][id$=\"-css\"]',\n} as const;\n\n/** Family display metadata — generated from schema/tokens/_vendors.json. */\nexport const THEME_FAMILIES = GENERATED_THEME_FAMILIES;\n","// SPDX-License-Identifier: MIT\n/**\n * Centralized error handling for Turbo Themes.\n *\n * Provides a consistent error logging strategy with standardized message\n * formatting, error levels, and optional context for debugging.\n */\n\n/** Log prefix for all theme-related messages */\nexport const LOG_PREFIX = '[turbo-themes]';\n\n/** Error severity levels */\nexport const ErrorLevel = {\n WARN: 'warn',\n ERROR: 'error',\n} as const;\n\nexport type ErrorLevel = (typeof ErrorLevel)[keyof typeof ErrorLevel];\n\n/** Structured theme error with code, message, level, and optional context */\nexport interface ThemeError {\n code: string;\n message: string;\n level: ErrorLevel;\n context?: Record<string, unknown>;\n}\n\n/**\n * Factory functions for creating structured theme errors.\n * Each function returns a ThemeError with appropriate code, message, and level.\n */\nexport const ThemeErrors = {\n /** Invalid theme ID provided */\n INVALID_THEME_ID: (themeId: string): ThemeError => ({\n code: 'INVALID_THEME_ID',\n message: `Invalid theme ID \"${themeId}\" not saved to storage`,\n level: ErrorLevel.WARN,\n context: { themeId },\n }),\n\n /** No themes available in registry */\n NO_THEMES_AVAILABLE: (): ThemeError => ({\n code: 'NO_THEMES_AVAILABLE',\n message: 'No themes available',\n level: ErrorLevel.ERROR,\n }),\n\n /** Invalid theme icon path */\n INVALID_ICON_PATH: (themeId: string): ThemeError => ({\n code: 'INVALID_ICON_PATH',\n message: `Invalid theme icon path for ${themeId}`,\n level: ErrorLevel.WARN,\n context: { themeId },\n }),\n\n /** Theme initialization failed */\n INIT_FAILED: (error: unknown): ThemeError => ({\n code: 'INIT_FAILED',\n message: 'Theme switcher initialization failed',\n level: ErrorLevel.ERROR,\n context: { error: error instanceof Error ? error.message : String(error) },\n }),\n\n /** Protocol-relative URL rejected for security */\n PROTOCOL_REJECTED: (): ThemeError => ({\n code: 'PROTOCOL_REJECTED',\n message: 'Protocol-relative base URL rejected for security',\n level: ErrorLevel.WARN,\n }),\n\n /** Insecure HTTP URL rejected */\n INSECURE_HTTP_REJECTED: (): ThemeError => ({\n code: 'INSECURE_HTTP_REJECTED',\n message: 'Insecure HTTP base URL rejected',\n level: ErrorLevel.WARN,\n }),\n\n /** Cross-origin URL rejected */\n CROSS_ORIGIN_REJECTED: (origin: string): ThemeError => ({\n code: 'CROSS_ORIGIN_REJECTED',\n message: `Cross-origin base URL rejected: ${origin}`,\n level: ErrorLevel.WARN,\n context: { origin },\n }),\n\n /** Invalid CSS path for theme */\n INVALID_CSS_PATH: (themeId: string): ThemeError => ({\n code: 'INVALID_CSS_PATH',\n message: `Invalid theme CSS path for ${themeId}`,\n level: ErrorLevel.WARN,\n context: { themeId },\n }),\n\n /** CSS failed to load */\n CSS_LOAD_FAILED: (themeId: string, error: unknown): ThemeError => ({\n code: 'CSS_LOAD_FAILED',\n message: `Theme CSS failed to load for ${themeId}`,\n level: ErrorLevel.WARN,\n context: {\n themeId,\n error: error instanceof Error ? error.message : String(error),\n },\n }),\n\n /** Storage unavailable (private browsing or disabled) */\n STORAGE_UNAVAILABLE: (operation: string, error: unknown): ThemeError => ({\n code: 'STORAGE_UNAVAILABLE',\n message: `localStorage ${operation} failed - storage may be unavailable`,\n level: ErrorLevel.WARN,\n context: {\n operation,\n error: error instanceof Error ? error.message : String(error),\n },\n }),\n};\n\n/**\n * Log a theme error to the console with consistent formatting.\n *\n * @param themeError - The structured error to log\n */\nexport function logThemeError(themeError: ThemeError): void {\n const prefixedMessage = `${LOG_PREFIX} ${themeError.message}`;\n\n if (themeError.level === ErrorLevel.ERROR) {\n if (themeError.context) {\n // Safe: prefixedMessage is constructed from controlled internal strings\n // nosemgrep: unsafe-formatstring\n console.error(prefixedMessage, themeError.context);\n } else {\n console.error(prefixedMessage);\n }\n } else {\n if (themeError.context) {\n // Safe: prefixedMessage is constructed from controlled internal strings\n // nosemgrep: unsafe-formatstring\n console.warn(prefixedMessage, themeError.context);\n } else {\n console.warn(prefixedMessage);\n }\n }\n}\n\n/**\n * Convenience function to log a ThemeError.\n *\n * @param error - The ThemeError instance to log\n */\nexport function logError<T extends ThemeError>(error: T): void {\n logThemeError(error);\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Theme CSS loading utilities\n */\n\nimport { resolveThemeAppearance } from './appearance.js';\nimport { CSS_LINK_ID, DOM_SELECTORS } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\n\nexport interface ThemeInfo {\n id: string;\n cssFile: string;\n icon?: string | undefined;\n}\n\n/**\n * Resolves an asset path relative to the site's base URL.\n */\nexport function resolveAssetPath(assetPath: string, baseUrl: string): string {\n // Normalize baseUrl - remove trailing slash if present, then add one\n const normalizedBase = baseUrl.replace(/\\/$/, '');\n const base = normalizedBase ? `${window.location.origin}${normalizedBase}/` : `${window.location.origin}/`;\n return new URL(assetPath, base).pathname;\n}\n\n/**\n * Gets the base URL from the document's data-baseurl attribute.\n * Validates the URL to prevent injection attacks:\n * - Rejects protocol-relative URLs (//example.com)\n * - Rejects non-HTTPS absolute URLs (except localhost)\n * - Only allows same-origin or relative paths\n */\nexport function getBaseUrl(doc: Document): string {\n const baseElement = doc.documentElement;\n const raw = baseElement?.getAttribute('data-baseurl') || '';\n\n // Empty base URL is valid (use site root)\n if (!raw) return '';\n\n // Reject protocol-relative URLs (security risk)\n if (raw.startsWith('//')) {\n logThemeError(ThemeErrors.PROTOCOL_REJECTED());\n return '';\n }\n\n // Reject non-HTTPS absolute URLs (except localhost for development)\n if (raw.startsWith('http://') && !raw.startsWith('http://localhost')) {\n logThemeError(ThemeErrors.INSECURE_HTTP_REJECTED());\n return '';\n }\n\n try {\n // Parse relative to current origin to validate\n const currentOrigin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const u = new URL(raw, currentOrigin);\n\n // Only allow same-origin URLs or relative paths\n if (u.origin !== currentOrigin) {\n logThemeError(ThemeErrors.CROSS_ORIGIN_REJECTED(u.origin));\n return '';\n }\n\n return u.pathname.replace(/\\/$/, '');\n } catch {\n return '';\n }\n}\n\n/**\n * Builds the element ID of a theme's stylesheet link.\n *\n * Single source of truth for the `theme-<id>-css` convention shared by\n * the loader and the lazy-CSS helpers.\n *\n * @param themeId - Theme whose stylesheet link ID to build\n * @returns The stylesheet link element ID\n */\nexport function themeLinkId(themeId: string): string {\n return `theme-${themeId}-css`;\n}\n\n/**\n * Extracts the theme ID from a theme link element's ID.\n * Strips a leading \"theme-\" prefix and trailing \"-css\" suffix.\n */\nfunction extractThemeIdFromLinkId(linkId: string): string {\n return linkId.replace(/^theme-/, '').replace(/-css$/, '');\n}\n\n/**\n * Clears onload/onerror handlers from a link element to prevent memory leaks.\n */\nfunction clearLinkHandlers(link: HTMLLinkElement): void {\n link.onload = null;\n link.onerror = null;\n}\n\n/**\n * Loads a CSS file with a timeout, returning a promise that resolves when loaded.\n */\nexport function loadCSSWithTimeout(\n link: HTMLLinkElement,\n themeId: string,\n timeoutMs = 10000\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n clearLinkHandlers(link);\n reject(new Error(`Theme ${themeId} load timeout`));\n }, timeoutMs);\n\n link.onload = () => {\n clearTimeout(timeoutId);\n clearLinkHandlers(link);\n resolve();\n };\n\n link.onerror = () => {\n clearTimeout(timeoutId);\n clearLinkHandlers(link);\n reject(new Error(`Failed to load theme ${themeId}`));\n };\n });\n}\n\n/**\n * Gets the current theme from document element classes\n */\nexport function getCurrentThemeFromClasses(element: HTMLElement): string | null {\n const classList = Array.from(element.classList);\n for (const className of classList) {\n if (className.startsWith('theme-')) {\n return className.substring(6); // Remove 'theme-' prefix\n }\n }\n return null;\n}\n\n/**\n * Applies theme class and root data attributes to the document element.\n */\nexport function applyThemeClass(doc: Document, themeId: string): void {\n // Remove existing theme classes in a single batch operation\n const themeClasses = Array.from(doc.documentElement.classList).filter((className) =>\n className.startsWith('theme-'),\n );\n if (themeClasses.length > 0) {\n doc.documentElement.classList.remove(...themeClasses);\n }\n\n // Add the new theme class\n doc.documentElement.classList.add(`theme-${themeId}`);\n\n doc.documentElement.setAttribute('data-theme', themeId);\n doc.documentElement.setAttribute('data-appearance', resolveThemeAppearance(themeId));\n}\n\n/**\n * Removes stale theme stylesheet links, keeping the given theme's link\n * and the shared base stylesheet.\n */\nfunction removeStaleThemeLinks(doc: Document, keepThemeId: string): void {\n doc.querySelectorAll(DOM_SELECTORS.THEME_CSS_LINKS).forEach((link) => {\n const linkThemeId = extractThemeIdFromLinkId(link.id);\n if (linkThemeId !== keepThemeId && linkThemeId !== 'base') {\n link.remove();\n }\n });\n}\n\n/**\n * Adopts the blocking script's link element for a theme (prevents\n * duplicate CSS loads).\n *\n * The repoint stays synchronous to preserve the blocking script's\n * FOUC-avoidance behaviour; this only makes its outcome observable by\n * awaiting the repointed link's load/error settlement. On load failure\n * the link is rolled back to its previous identity and href so the\n * document keeps the stylesheet that was already working.\n *\n * @returns true when the theme's CSS is confirmed loaded\n */\nasync function adoptBlockingLink(\n doc: Document,\n blockingLink: HTMLLinkElement,\n theme: ThemeInfo,\n baseUrl: string\n): Promise<boolean> {\n let resolvedHref: string;\n try {\n resolvedHref = resolveAssetPath(theme.cssFile, baseUrl);\n } catch {\n logThemeError(ThemeErrors.INVALID_CSS_PATH(theme.id));\n return false;\n }\n\n const previousHref = blockingLink.getAttribute('href');\n blockingLink.id = themeLinkId(theme.id);\n blockingLink.setAttribute('data-theme-id', theme.id);\n\n // Already pointing at the theme's stylesheet (e.g. the blocking script\n // loaded it before first paint) — no fetch to await.\n if (previousHref === resolvedHref) {\n removeStaleThemeLinks(doc, theme.id);\n return true;\n }\n\n blockingLink.href = resolvedHref;\n try {\n await loadCSSWithTimeout(blockingLink, theme.id);\n } catch (error) {\n // Loading failed — restore the link's prior identity and href so the\n // previously working stylesheet stays in effect.\n blockingLink.id = CSS_LINK_ID;\n blockingLink.removeAttribute('data-theme-id');\n if (previousHref !== null) {\n blockingLink.href = previousHref;\n } else {\n blockingLink.removeAttribute('href');\n }\n logThemeError(ThemeErrors.CSS_LOAD_FAILED(theme.id, error));\n return false;\n }\n\n removeStaleThemeLinks(doc, theme.id);\n return true;\n}\n\n/**\n * Loads theme CSS file if not already loaded.\n *\n * @returns true when the theme's stylesheet is present and confirmed\n * loaded (or was already linked), false when path resolution or the\n * network fetch failed\n */\nexport async function loadThemeCSS(\n doc: Document,\n theme: ThemeInfo,\n baseUrl: string\n): Promise<boolean> {\n const linkId = themeLinkId(theme.id);\n const existingThemeLink = doc.getElementById(linkId) as HTMLLinkElement | null;\n\n if (existingThemeLink) {\n // Link already exists — clean up any other stale theme links\n removeStaleThemeLinks(doc, theme.id);\n return true;\n }\n\n // Adopt the blocking script's link element if present (prevents duplicate CSS loads)\n const blockingLink = doc.getElementById(CSS_LINK_ID) as HTMLLinkElement | null;\n if (blockingLink) {\n return adoptBlockingLink(doc, blockingLink, theme, baseUrl);\n }\n\n const themeLink = doc.createElement('link');\n themeLink.id = linkId;\n themeLink.rel = 'stylesheet';\n themeLink.type = 'text/css';\n themeLink.setAttribute('data-theme-id', theme.id);\n\n try {\n themeLink.href = resolveAssetPath(theme.cssFile, baseUrl);\n } catch {\n logThemeError(ThemeErrors.INVALID_CSS_PATH(theme.id));\n return false;\n }\n\n doc.head.appendChild(themeLink);\n\n try {\n await loadCSSWithTimeout(themeLink, theme.id);\n } catch (error) {\n // Loading failed — remove the new link and keep prior theme intact\n themeLink.remove();\n logThemeError(ThemeErrors.CSS_LOAD_FAILED(theme.id, error));\n return false;\n }\n\n // Only remove old theme links after successful load\n removeStaleThemeLinks(doc, theme.id);\n return true;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Dropdown helper functions\n */\n\n/**\n * Sets the active state (is-active class and aria-checked) on a theme item element.\n */\nexport function setItemActiveState(item: Element, isActive: boolean): void {\n if (isActive) {\n item.classList.add('is-active');\n } else {\n item.classList.remove('is-active');\n }\n item.setAttribute('aria-checked', String(isActive));\n}\n\n/**\n * Sets tabindex attribute on all items in a collection.\n */\nexport function setTabindexBatch(items: HTMLElement[], value: string): void {\n for (const item of items) {\n item.setAttribute('tabindex', value);\n }\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Maps core theme flavors to UI-specific format\n */\n\nimport type { ThemeFlavor as CanonicalThemeFlavor } from '@lgtm-hq/turbo-themes-core';\nimport type { ThemeFamily } from './types.js';\nimport {\n DEFAULT_FAMILY,\n VENDOR_FAMILY_MAP,\n VENDOR_ICON_MAP,\n FLAVOR_DESCRIPTIONS,\n type AppearanceIcons,\n} from './generated/theme-maps.js';\n\nexport type { AppearanceIcons };\nexport { VENDOR_ICON_MAP };\n\nexport interface ThemeColors {\n bg: string;\n surface: string;\n accent: string;\n text: string;\n}\n\nexport interface ThemeFlavor extends Pick<CanonicalThemeFlavor, 'id' | 'appearance' | 'vendor'> {\n id: string;\n name: string;\n description: string;\n cssFile: string;\n icon?: string | undefined;\n family: ThemeFamily;\n colors: ThemeColors;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Gets the theme family from vendor name\n */\nfunction getFamily(vendor: string): ThemeFamily {\n return VENDOR_FAMILY_MAP[vendor] ?? DEFAULT_FAMILY;\n}\n\n/**\n * Gets icon path for a vendor\n */\nfunction getIconForVendor(vendor: string, appearance: 'light' | 'dark'): string | undefined {\n const iconConfig = VENDOR_ICON_MAP[vendor];\n\n if (!iconConfig) {\n return undefined;\n }\n\n if (typeof iconConfig === 'string') {\n return iconConfig;\n }\n\n return iconConfig[appearance];\n}\n\n/**\n * Gets description for a flavor\n */\nfunction getDescriptionForFlavor(id: string, label: string): string {\n return FLAVOR_DESCRIPTIONS[id] ?? `${label} theme`;\n}\n\n/**\n * Extracts preview colors from theme tokens\n */\nfunction extractPreviewColors(tokens: CanonicalThemeFlavor['tokens']): ThemeColors {\n return {\n bg: tokens.background.base,\n surface: tokens.background.surface,\n accent: tokens.brand.primary,\n text: tokens.text.primary,\n };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Maps a canonical theme flavor to UI-specific format\n */\nexport function mapFlavorToUI(flavor: CanonicalThemeFlavor): ThemeFlavor {\n const family = getFamily(flavor.vendor);\n return {\n id: flavor.id,\n name: flavor.label,\n description: getDescriptionForFlavor(flavor.id, flavor.label),\n cssFile: `assets/css/themes/turbo/${flavor.id}.css`,\n icon: getIconForVendor(flavor.vendor, flavor.appearance),\n family,\n vendor: flavor.vendor,\n appearance: flavor.appearance,\n colors: extractPreviewColors(flavor.tokens),\n };\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Theme resolution utilities - centralized theme lookup and validation.\n *\n * Provides cached access to theme data and validation to avoid\n * repeated mapping and set creation across the codebase.\n */\n\nimport { flavors } from '@lgtm-hq/turbo-themes-core';\nimport { mapFlavorToUI, type ThemeFlavor } from './theme-mapper.js';\nimport { DEFAULT_THEME } from './constants.js';\n\n// Cache mapped themes and valid IDs\nlet mappedThemes: ThemeFlavor[] | null = null;\nlet validThemeIds: Set<string> | null = null;\n\n/**\n * Gets all themes mapped to UI format.\n * Results are cached for performance.\n */\nexport function getThemes(): ThemeFlavor[] {\n if (!mappedThemes) {\n mappedThemes = flavors.map(mapFlavorToUI);\n }\n return mappedThemes || [];\n}\n\n/**\n * Gets a Set of all valid theme IDs.\n * Results are cached for performance.\n */\nexport function getValidThemeIds(): Set<string> {\n if (!validThemeIds) {\n validThemeIds = new Set(flavors.map((f) => f.id));\n }\n return validThemeIds;\n}\n\n/**\n * Resolves a theme by ID, falling back to default if not found.\n *\n * @param themeId - The theme ID to resolve\n * @returns The matching theme, default theme, or first available theme\n */\nexport function resolveTheme(themeId: string): ThemeFlavor | undefined {\n const themes = getThemes();\n return (\n themes.find((t) => t.id === themeId) ||\n themes.find((t) => t.id === DEFAULT_THEME) ||\n themes[0]\n );\n}\n\n/**\n * Validates a theme ID for safety and format correctness.\n *\n * Accepts only alphanumeric characters, hyphens, and underscores.\n * Rejects special characters, unicode, and excessively long IDs.\n *\n * @param id - The value to validate as a theme ID\n * @returns True if the ID is valid, false otherwise\n */\nexport function isValidThemeId(id: unknown): boolean {\n if (typeof id !== 'string') return false;\n if (id.length === 0) return false;\n if (id.length > 100) return false;\n return /^[a-zA-Z0-9_-]+$/.test(id);\n}\n\n/**\n * Sanitizes a theme ID by removing unsafe characters.\n *\n * Removes any characters that could cause DOM/CSS/XSS issues.\n * Used as a fallback when displaying potentially untrusted input.\n *\n * @param id - The theme ID to sanitize\n * @returns The sanitized ID containing only safe characters\n */\nexport function sanitizeThemeId(id: string): string {\n return id.replace(/[^a-zA-Z0-9_-]/g, '');\n}\n\n/**\n * Resets the cached themes. Used for testing.\n * @internal\n */\nexport function _resetThemeCache(): void {\n mappedThemes = null;\n validThemeIds = null;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Theme application logic\n */\n\nimport { DOM_IDS, DOM_SELECTORS, THEME_FAMILIES } from './constants.js';\nimport { getBaseUrl, applyThemeClass, loadThemeCSS, resolveAssetPath, getCurrentThemeFromClasses } from './theme-loader.js';\nimport { setItemActiveState } from './dropdown/helpers.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\nimport { resolveTheme } from './theme-resolver.js';\n\n/**\n * Applies a theme to the document.\n *\n * @returns true when the theme's CSS is confirmed loaded, false when the\n * theme could not be resolved or its stylesheet failed to load (the\n * root attributes/class are still applied in the latter case)\n */\nexport async function applyTheme(doc: Document, themeId: string): Promise<boolean> {\n const theme = resolveTheme(themeId);\n if (!theme) {\n logThemeError(ThemeErrors.NO_THEMES_AVAILABLE());\n return false;\n }\n const baseUrl = getBaseUrl(doc);\n\n // Add loading state to trigger button\n const trigger = doc.getElementById(DOM_IDS.THEME_FLAVOR_TRIGGER) as HTMLButtonElement | null;\n if (trigger) {\n trigger.classList.add('is-loading');\n }\n\n try {\n // Apply theme class immediately (before CSS loading)\n applyThemeClass(doc, theme.id);\n\n // Load theme CSS\n const cssLoaded = await loadThemeCSS(doc, theme, baseUrl);\n\n // Update trigger button icon\n const triggerIcon = doc.getElementById(\n DOM_IDS.THEME_FLAVOR_TRIGGER_ICON\n ) as HTMLImageElement | null;\n\n if (triggerIcon && theme.icon) {\n try {\n triggerIcon.src = resolveAssetPath(theme.icon, baseUrl);\n const familyMeta = THEME_FAMILIES[theme.family];\n const familyName = familyMeta?.name ?? theme.family;\n triggerIcon.alt = `${familyName} ${theme.name}`;\n triggerIcon.title = `${familyName} ${theme.name}`;\n } catch {\n logThemeError(ThemeErrors.INVALID_ICON_PATH(theme.id));\n }\n }\n\n // Update trigger button label\n const triggerLabel = doc.getElementById(\n DOM_IDS.THEME_FLAVOR_TRIGGER_LABEL\n ) as HTMLElement | null;\n if (triggerLabel) {\n triggerLabel.textContent = theme.name;\n }\n\n // Update active state in dropdown\n doc.querySelectorAll(DOM_SELECTORS.DROPDOWN_ITEMS).forEach((item) => {\n setItemActiveState(item, item.getAttribute('data-theme-id') === theme.id);\n });\n\n return cssLoaded;\n } finally {\n if (trigger) {\n trigger.classList.remove('is-loading');\n }\n }\n}\n\n/**\n * Gets the current theme from classes or returns default\n */\nexport function getCurrentTheme(doc: Document, defaultTheme: string): string {\n return getCurrentThemeFromClasses(doc.documentElement) || defaultTheme;\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Storage utilities for theme persistence\n */\n\nimport { STORAGE_KEY, LEGACY_STORAGE_KEYS, DEFAULT_THEME } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\n\n// Re-export DEFAULT_THEME for convenience\nexport { DEFAULT_THEME } from './constants.js';\n\n/**\n * Safely get an item from localStorage.\n * Returns null if storage is unavailable (e.g., private browsing mode).\n */\nfunction safeGetItem(windowObj: Window, key: string): string | null {\n try {\n return windowObj.localStorage.getItem(key);\n } catch (error) {\n logThemeError(ThemeErrors.STORAGE_UNAVAILABLE('getItem', error));\n return null;\n }\n}\n\n/**\n * Safely set an item in localStorage.\n * Returns false if storage is unavailable.\n */\nfunction safeSetItem(windowObj: Window, key: string, value: string): boolean {\n try {\n windowObj.localStorage.setItem(key, value);\n return true;\n } catch (error) {\n logThemeError(ThemeErrors.STORAGE_UNAVAILABLE('setItem', error));\n return false;\n }\n}\n\n/**\n * Safely remove an item from localStorage.\n * Silently fails if storage is unavailable.\n */\nfunction safeRemoveItem(windowObj: Window, key: string): void {\n try {\n windowObj.localStorage.removeItem(key);\n } catch (error) {\n logThemeError(ThemeErrors.STORAGE_UNAVAILABLE('removeItem', error));\n }\n}\n\n/**\n * Validates a theme ID against a set of valid IDs.\n * Returns the theme ID if valid, otherwise returns the default theme.\n */\nexport function validateThemeId(themeId: string | null, validIds: Set<string>): string {\n if (themeId && validIds.has(themeId)) {\n return themeId;\n }\n return DEFAULT_THEME;\n}\n\n/**\n * Migrates legacy storage keys to the current format.\n * Safely handles unavailable localStorage (e.g., private browsing).\n */\nexport function migrateLegacyStorage(windowObj: Window): void {\n for (const legacyKey of LEGACY_STORAGE_KEYS) {\n const legacy = safeGetItem(windowObj, legacyKey);\n if (legacy && !safeGetItem(windowObj, STORAGE_KEY)) {\n safeSetItem(windowObj, STORAGE_KEY, legacy);\n safeRemoveItem(windowObj, legacyKey);\n }\n }\n}\n\n/**\n * Gets the saved theme from localStorage, or returns default.\n * Optionally validates against a set of valid theme IDs.\n * Safely handles unavailable localStorage (e.g., private browsing).\n */\nexport function getSavedTheme(windowObj: Window, validIds?: Set<string>): string {\n const stored = safeGetItem(windowObj, STORAGE_KEY);\n if (validIds) {\n return validateThemeId(stored, validIds);\n }\n return stored || DEFAULT_THEME;\n}\n\n/**\n * Saves a theme to localStorage.\n * Optionally validates the theme ID against a set of valid IDs before saving.\n * Safely handles unavailable localStorage (e.g., private browsing).\n *\n * @param windowObj - Window object with localStorage\n * @param themeId - Theme ID to save\n * @param validIds - Optional set of valid theme IDs for validation\n * @returns true if saved successfully, false otherwise\n */\nexport function saveTheme(windowObj: Window, themeId: string, validIds?: Set<string>): boolean {\n if (validIds && !validIds.has(themeId)) {\n logThemeError(ThemeErrors.INVALID_THEME_ID(themeId));\n return false;\n }\n return safeSetItem(windowObj, STORAGE_KEY, themeId);\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Public integration API for driving theming from outside the package.\n *\n * Site pages (e.g. the homepage showcase) use these functions to apply a\n * theme, query the active theme, and subscribe to theme changes without\n * reaching into selector internals. The theme-selector package remains\n * the owner of persistence, the `data-theme`/`data-appearance` root\n * attributes, and dropdown state.\n */\n\nimport { resolveThemeAppearance, type ThemeAppearance } from './appearance.js';\nimport {\n applyTheme as applyThemeToDocument,\n getCurrentTheme as getCurrentThemeFromDocument,\n} from './apply-theme.js';\nimport { DEFAULT_THEME } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\nimport { saveTheme } from './storage.js';\nimport { getValidThemeIds, isValidThemeId } from './theme-resolver.js';\n\n/** Name of the CustomEvent dispatched on the document after a theme change. */\nexport const THEME_CHANGE_EVENT = 'turbo-theme-change';\n\n/** Payload carried by theme-change notifications. */\nexport interface ThemeChangeDetail {\n /** ID of the theme that was applied (e.g. `catppuccin-mocha`). */\n themeId: string;\n /** Light/dark appearance of the applied theme. */\n appearance: ThemeAppearance;\n}\n\n/** Listener invoked with the payload of each theme change. */\nexport type ThemeChangeListener = (detail: ThemeChangeDetail) => void;\n\n/**\n * Outcome of an applyTheme call, reporting each stage independently so\n * consumers can distinguish full success from partial application.\n */\nexport interface ApplyThemeResult {\n /**\n * True when the theme ID was valid and the `data-theme` /\n * `data-appearance` root attributes and theme class were applied.\n */\n applied: boolean;\n /**\n * True when the theme's stylesheet is confirmed loaded (fetched now or\n * already linked). False means the DOM attributes may have changed\n * while the previous theme's CSS is still in effect.\n */\n cssLoaded: boolean;\n /**\n * True when the selection was persisted to localStorage. False when\n * storage is unavailable (e.g. private browsing) or over quota.\n */\n persisted: boolean;\n}\n\n/** Removes a listener previously registered via subscribeToThemeChanges. */\nexport type Unsubscribe = () => void;\n\n/**\n * Dispatches the theme-change CustomEvent on the document.\n *\n * @param documentObj - Document to dispatch the event on\n * @param themeId - ID of the theme that was applied\n */\nfunction emitThemeChange(documentObj: Document, themeId: string): void {\n const detail: ThemeChangeDetail = {\n themeId,\n appearance: resolveThemeAppearance(themeId),\n };\n documentObj.dispatchEvent(new CustomEvent<ThemeChangeDetail>(THEME_CHANGE_EVENT, { detail }));\n}\n\n/**\n * Applies a theme by ID through the theme-selector pipeline.\n *\n * Persists the selection, updates the `data-theme`/`data-appearance`\n * attributes and theme CSS, syncs dropdown state, and notifies\n * subscribers via the theme-change event.\n *\n * Each stage is reported independently in the returned\n * {@link ApplyThemeResult} so consumers can distinguish full success\n * from partial application:\n *\n * - Unknown or malformed theme IDs are rejected: nothing is applied, no\n * event is dispatched, and all result fields are false.\n * - `persisted` is false when localStorage is unavailable or over\n * quota; the theme is still applied visually.\n * - `cssLoaded` is false when the stylesheet fetch fails; the root\n * attributes have changed but the previous theme's CSS remains in\n * effect, so the theme-change event is NOT dispatched.\n *\n * The theme-change event fires only when the theme is visually applied\n * (`applied && cssLoaded`); persistence failure alone does not suppress\n * it.\n *\n * @param themeId - ID of the theme to apply (e.g. `catppuccin-mocha`)\n * @param documentObj - Document to apply the theme to (defaults to global)\n * @param windowObj - Window used for persistence (defaults to global)\n * @returns Per-stage outcome of the application\n */\nexport async function applyTheme(\n themeId: string,\n documentObj: Document = document,\n windowObj: Window = window,\n): Promise<ApplyThemeResult> {\n const validIds = getValidThemeIds();\n if (!isValidThemeId(themeId) || !validIds.has(themeId)) {\n logThemeError(ThemeErrors.INVALID_THEME_ID(themeId));\n return { applied: false, cssLoaded: false, persisted: false };\n }\n\n const persisted = saveTheme(windowObj, themeId, validIds);\n const cssLoaded = await applyThemeToDocument(documentObj, themeId);\n if (cssLoaded) {\n emitThemeChange(documentObj, themeId);\n }\n return { applied: true, cssLoaded, persisted };\n}\n\n/**\n * Gets the ID of the currently active theme.\n *\n * Prefers the `data-theme` root attribute (set by both the blocking\n * script and the theme-selector), falls back to the `theme-*` class,\n * and finally to the default theme.\n *\n * @param documentObj - Document to inspect (defaults to global)\n * @returns The active theme ID\n */\nexport function getCurrentTheme(documentObj: Document = document): string {\n const fromAttribute = documentObj.documentElement.getAttribute('data-theme');\n if (fromAttribute) {\n return fromAttribute;\n }\n return getCurrentThemeFromDocument(documentObj, DEFAULT_THEME);\n}\n\n/**\n * Subscribes to theme-change notifications.\n *\n * The listener fires after each successful theme application — whether\n * triggered through applyTheme or the dropdown UI — with the applied\n * theme ID and its light/dark appearance.\n *\n * @param listener - Callback invoked with each theme-change payload\n * @param documentObj - Document to listen on (defaults to global)\n * @returns Function that removes the listener when called\n */\nexport function subscribeToThemeChanges(\n listener: ThemeChangeListener,\n documentObj: Document = document,\n): Unsubscribe {\n const handler = (event: Event): void => {\n const detail = (event as CustomEvent<ThemeChangeDetail>).detail;\n if (detail) {\n listener(detail);\n }\n };\n documentObj.addEventListener(THEME_CHANGE_EVENT, handler);\n return () => documentObj.removeEventListener(THEME_CHANGE_EVENT, handler);\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Lazy theme-CSS loading helpers for showcase-style pages.\n *\n * Instead of eagerly linking every theme's stylesheet, a page loads only\n * the default/active theme CSS up front and fetches the rest on demand.\n * These helpers provide the load decision, an inject-once on-demand\n * loader built on the package's `loadThemeCSS` pipeline, and a\n * hover-triggered prefetch that hides switch latency for elements\n * marked with the `data-theme-preview` attribute (e.g. marquee cards).\n */\n\nimport { CSS_LINK_ID } from './constants.js';\nimport { ThemeErrors, logThemeError } from './errors.js';\nimport type { Unsubscribe } from './integration.js';\nimport { getBaseUrl, loadThemeCSS, resolveAssetPath, themeLinkId } from './theme-loader.js';\nimport { getValidThemeIds, isValidThemeId, resolveTheme } from './theme-resolver.js';\n\n/** Attribute whose value names the theme to prefetch on hover/focus. */\nexport const PREFETCH_TRIGGER_ATTRIBUTE = 'data-theme-preview';\n\n/**\n * Builds the element ID of a theme's prefetch link.\n *\n * @param themeId - Theme whose prefetch link ID to build\n * @returns The prefetch link element ID\n */\nfunction themePrefetchLinkId(themeId: string): string {\n return `theme-${themeId}-prefetch`;\n}\n\n/**\n * Checks whether a theme ID is well-formed and registered.\n *\n * @param themeId - Theme ID to check\n * @returns True when the ID names a known theme\n */\nfunction isKnownThemeId(themeId: string): boolean {\n return isValidThemeId(themeId) && getValidThemeIds().has(themeId);\n}\n\n/**\n * Checks whether a theme's stylesheet is already present in the document.\n *\n * Recognises both links owned by the selector (`theme-<id>-css`) and the\n * blocking script's FOUC-prevention link when it points at the theme.\n *\n * @param documentObj - Document to inspect\n * @param themeId - Theme whose stylesheet to look for\n * @returns True when the theme's CSS is already linked\n */\nexport function isThemeCSSLoaded(documentObj: Document, themeId: string): boolean {\n if (documentObj.getElementById(themeLinkId(themeId))) {\n return true;\n }\n const blockingLink = documentObj.getElementById(CSS_LINK_ID) as HTMLLinkElement | null;\n if (!blockingLink) {\n return false;\n }\n if (blockingLink.getAttribute('data-theme-id') === themeId) {\n return true;\n }\n const href = blockingLink.getAttribute('href') ?? '';\n return href.endsWith(`/${themeId}.css`);\n}\n\n/**\n * Decides whether a theme's CSS needs an on-demand load.\n *\n * @param documentObj - Document to inspect\n * @param themeId - Theme the page is about to switch to\n * @returns True when the theme is known and its CSS is not yet linked\n */\nexport function shouldLoadThemeCSS(documentObj: Document, themeId: string): boolean {\n return isKnownThemeId(themeId) && !isThemeCSSLoaded(documentObj, themeId);\n}\n\n/**\n * Loads a theme's CSS on demand through the selector's loader.\n *\n * Injects the stylesheet link at most once: repeat calls for a theme\n * whose CSS is already linked are no-ops that resolve to true. Unknown\n * or malformed theme IDs are rejected without touching the document.\n *\n * @param documentObj - Document to load the stylesheet into\n * @param themeId - Theme whose CSS to load\n * @returns True when the CSS is available (loaded now or previously)\n */\nexport async function loadThemeCSSOnDemand(\n documentObj: Document,\n themeId: string,\n): Promise<boolean> {\n if (!isKnownThemeId(themeId)) {\n logThemeError(ThemeErrors.INVALID_THEME_ID(themeId));\n return false;\n }\n if (isThemeCSSLoaded(documentObj, themeId)) {\n return true;\n }\n const theme = resolveTheme(themeId);\n if (!theme) {\n return false;\n }\n // loadThemeCSS reports whether the stylesheet was confirmed loaded,\n // including on the adoption path where the blocking link is repointed.\n return loadThemeCSS(documentObj, theme, getBaseUrl(documentObj));\n}\n\n/**\n * Prefetches a theme's CSS so a later switch hits the browser cache.\n *\n * Injects a `<link rel=\"prefetch\" as=\"style\">` at most once per theme.\n * Skips themes whose stylesheet is already linked, themes already\n * prefetched, and unknown theme IDs.\n *\n * @param documentObj - Document to inject the prefetch link into\n * @param themeId - Theme whose CSS to prefetch\n * @returns True when a prefetch link was injected by this call\n */\nexport function prefetchThemeCSS(documentObj: Document, themeId: string): boolean {\n if (!isKnownThemeId(themeId)) {\n return false;\n }\n if (isThemeCSSLoaded(documentObj, themeId)) {\n return false;\n }\n if (documentObj.getElementById(themePrefetchLinkId(themeId))) {\n return false;\n }\n const theme = resolveTheme(themeId);\n if (!theme) {\n return false;\n }\n\n let href: string;\n try {\n href = resolveAssetPath(theme.cssFile, getBaseUrl(documentObj));\n } catch {\n logThemeError(ThemeErrors.INVALID_CSS_PATH(themeId));\n return false;\n }\n\n const link = documentObj.createElement('link');\n link.id = themePrefetchLinkId(themeId);\n link.rel = 'prefetch';\n link.setAttribute('as', 'style');\n link.href = href;\n link.setAttribute('data-theme-prefetch', themeId);\n documentObj.head.appendChild(link);\n return true;\n}\n\n/**\n * Wires hover/focus-triggered CSS prefetch for marked elements.\n *\n * Listens for `mouseover` and `focusin` on the document and prefetches\n * the theme named by the nearest ancestor carrying the\n * `data-theme-preview` attribute. Delegation means marquee items added\n * after wiring are covered without re-wiring.\n *\n * @param documentObj - Document to listen on (defaults to global)\n * @returns Function that removes the listeners when called\n */\nexport function wireHoverPrefetch(documentObj: Document = document): Unsubscribe {\n const handler = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n const trigger = target.closest(`[${PREFETCH_TRIGGER_ATTRIBUTE}]`);\n if (!trigger) {\n return;\n }\n const themeId = trigger.getAttribute(PREFETCH_TRIGGER_ATTRIBUTE);\n if (!themeId) {\n return;\n }\n prefetchThemeCSS(documentObj, themeId);\n };\n\n documentObj.addEventListener('mouseover', handler);\n documentObj.addEventListener('focusin', handler);\n return () => {\n documentObj.removeEventListener('mouseover', handler);\n documentObj.removeEventListener('focusin', handler);\n };\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Homepage showcase interactions.\n *\n * Spotlight drift, comet-card tilt, text mask, scroll reveals, theme marquee\n * pause, and the interactive preview card. Pure state transitions are exported\n * for unit testing; DOM wiring stays thin and is initialized on\n * DOMContentLoaded.\n *\n * Theming goes exclusively through the theme-selector integration API\n * (ADR-0007): marquee clicks call `applyTheme`, hover prefetch comes from\n * the lazy-CSS helpers, and UI state follows `turbo-theme-change` events\n * plus a `data-theme` attribute observer (covering the header dropdown).\n * Theme metadata is server-rendered as data attributes on the marquee\n * cards (`data-theme-preview`/`data-theme-name`/`data-theme-icon`) instead\n * of an injected global.\n */\n\nimport {\n applyTheme,\n getCurrentTheme,\n subscribeToThemeChanges,\n} from '../../packages/theme-selector/src/integration.js';\nimport { wireHoverPrefetch } from '../../packages/theme-selector/src/lazy-css.js';\n\n/** Fallback icon used when a theme has no dedicated icon entry. */\nexport const DEFAULT_THEME_ICON = 'catppuccin-logo-macchiato.png';\n\n/** Maximum spotlight drift, in pixels, before the direction flips. */\nexport const SPOTLIGHT_LIMIT = 100;\n\n/** Pixels the spotlight drifts per animation frame. */\nexport const SPOTLIGHT_STEP = 0.15;\n\n/** Maximum comet-card tilt, in degrees, on each axis. */\nexport const MAX_TILT_DEGREES = 14;\n\n/** Progress percentage the preview card animates to. */\nexport const PROGRESS_TARGET = 92;\n\n/** Minimal surface needed to evaluate a media query. */\nexport interface MediaQuerySource {\n matchMedia(query: string): { matches: boolean };\n}\n\n/** Theme metadata read from server-rendered data attributes on the page. */\nexport interface ShowcaseMeta {\n baseUrl: string;\n themeFullNames: Partial<Record<string, string>>;\n themeIcons: Partial<Record<string, string>>;\n}\n\n/** Resolved display values for the preview card's theme header. */\nexport interface ThemeDisplay {\n name: string;\n iconSrc: string;\n}\n\n/** Spotlight drift animation state. */\nexport interface SpotlightState {\n offset: number;\n direction: 1 | -1;\n}\n\n/** Target values for the comet-card tilt and glare animation. */\nexport interface TiltTargets {\n rotateX: number;\n rotateY: number;\n glareX: number;\n glareY: number;\n}\n\n/** Pointer-relative bounding box (subset of DOMRect). */\nexport interface PointerRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Tilt targets when the pointer is not over the comet card. */\nexport const RESTING_TILT_TARGETS: TiltTargets = {\n rotateX: 0,\n rotateY: 0,\n glareX: 50,\n glareY: 50,\n};\n\n/** CSS animation-play-state values used by the marquee rows. */\nexport type MarqueePlayState = 'paused' | 'running';\n\n/** Attribute naming the theme a showcase element previews/applies. */\nexport const THEME_TRIGGER_ATTRIBUTE = 'data-theme-preview';\n\n/** Attribute carrying a theme's full display name on a marquee card. */\nexport const THEME_NAME_ATTRIBUTE = 'data-theme-name';\n\n/** Attribute carrying a theme's icon filename on a marquee card. */\nexport const THEME_ICON_ATTRIBUTE = 'data-theme-icon';\n\n/**\n * Check whether the user prefers reduced motion.\n *\n * @param source - Object exposing matchMedia (usually window).\n * @returns True when reduced motion is requested.\n */\nexport function prefersReducedMotion(source: MediaQuerySource): boolean {\n return source.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Advance the spotlight drift by one frame, bouncing at the limits.\n *\n * @param state - Current offset and direction.\n * @param step - Pixels to drift this frame.\n * @param limit - Absolute offset at which the direction flips.\n * @returns The next spotlight state.\n */\nexport function stepSpotlight(\n state: SpotlightState,\n step: number = SPOTLIGHT_STEP,\n limit: number = SPOTLIGHT_LIMIT,\n): SpotlightState {\n const offset = state.offset + state.direction * step;\n let direction = state.direction;\n if (offset > limit) direction = -1;\n if (offset < -limit) direction = 1;\n return { offset, direction };\n}\n\n/**\n * Compute tilt and glare targets for a pointer position over the card.\n *\n * @param clientX - Pointer x coordinate in viewport space.\n * @param clientY - Pointer y coordinate in viewport space.\n * @param rect - Card bounding box.\n * @param maxTilt - Maximum tilt in degrees on each axis.\n * @returns Rotation and glare targets.\n */\nexport function computeTiltTargets(\n clientX: number,\n clientY: number,\n rect: PointerRect,\n maxTilt: number = MAX_TILT_DEGREES,\n): TiltTargets {\n const xPct = (clientX - rect.left) / rect.width - 0.5;\n const yPct = (clientY - rect.top) / rect.height - 0.5;\n return {\n rotateX: -yPct * maxTilt,\n rotateY: xPct * maxTilt,\n glareX: ((clientX - rect.left) / rect.width) * 100,\n glareY: ((clientY - rect.top) / rect.height) * 100,\n };\n}\n\n/**\n * Move a value a fraction of the way toward a target (ease-out step).\n *\n * @param current - Current value.\n * @param target - Target value.\n * @param rate - Fraction of the remaining distance to cover (0..1).\n * @returns The eased value.\n */\nexport function approach(current: number, target: number, rate: number): number {\n return current + (target - current) * rate;\n}\n\n/**\n * Convert a pointer position into percentages within a bounding box.\n *\n * @param clientX - Pointer x coordinate in viewport space.\n * @param clientY - Pointer y coordinate in viewport space.\n * @param rect - Element bounding box.\n * @returns X/Y position as percentages (0..100).\n */\nexport function pointerPercent(\n clientX: number,\n clientY: number,\n rect: PointerRect,\n): { x: number; y: number } {\n return {\n x: ((clientX - rect.left) / rect.width) * 100,\n y: ((clientY - rect.top) / rect.height) * 100,\n };\n}\n\n/**\n * Decide the marquee row's animation-play-state for a hover state.\n *\n * @param isHovering - Whether the pointer is over the row.\n * @returns 'paused' while hovering, 'running' otherwise.\n */\nexport function marqueePlayState(isHovering: boolean): MarqueePlayState {\n return isHovering ? 'paused' : 'running';\n}\n\n/**\n * Activate the tab and panel matching a target and deactivate the rest.\n *\n * @param tabs - Preview tab buttons (data-preview-tab).\n * @param panels - Preview panels (data-preview-panel).\n * @param target - The data-preview-tab value to activate.\n */\nexport function applyTabSelection(\n tabs: readonly HTMLElement[],\n panels: readonly HTMLElement[],\n target: string,\n): void {\n for (const tab of tabs) {\n const isActive = tab.getAttribute('data-preview-tab') === target;\n tab.classList.toggle('active', isActive);\n tab.setAttribute('aria-selected', isActive ? 'true' : 'false');\n tab.tabIndex = isActive ? 0 : -1;\n }\n for (const panel of panels) {\n const isActive = panel.getAttribute('data-preview-panel') === target;\n panel.classList.toggle('is-active', isActive);\n panel.hidden = !isActive;\n }\n}\n\n/**\n * Resolve the tab index a tablist keydown should move focus to.\n *\n * Implements the horizontal ARIA tablist keyboard pattern (APG): Left/Right\n * arrows move with wrap-around, Home/End jump to the edges. Activation is\n * manual — Enter/Space fire the tab's native button click, so only focus\n * movement is handled here.\n *\n * @param key - The KeyboardEvent.key value.\n * @param currentIndex - Index of the tab that received the event.\n * @param count - Total number of tabs.\n * @returns The index to focus, or null when the key is not handled.\n */\nexport function nextTabFocusIndex(\n key: string,\n currentIndex: number,\n count: number,\n): number | null {\n if (count <= 0) return null;\n switch (key) {\n case 'ArrowRight':\n return (currentIndex + 1) % count;\n case 'ArrowLeft':\n return (currentIndex - 1 + count) % count;\n case 'Home':\n return 0;\n case 'End':\n return count - 1;\n default:\n return null;\n }\n}\n\n/**\n * Move roving-tabindex focus to a tab without changing the selection.\n *\n * Per the ARIA tablist pattern, only the focused tab stays in the tab\n * order; selection follows activation (Enter/Space/click), not focus.\n *\n * @param tabs - Preview tab buttons in document order.\n * @param index - Index of the tab to focus.\n */\nexport function focusTab(tabs: readonly HTMLElement[], index: number): void {\n const target = tabs[index];\n if (!target) return;\n for (const [i, tab] of tabs.entries()) {\n tab.tabIndex = i === index ? 0 : -1;\n }\n target.focus();\n}\n\n/**\n * Read showcase theme metadata from server-rendered data attributes.\n *\n * The page renders one marquee card per theme carrying\n * `data-theme-preview`, `data-theme-name`, and `data-theme-icon`; the\n * base URL comes from the root element's `data-baseurl` attribute.\n *\n * @param documentObj - Document to read the metadata from.\n * @returns Metadata for preview-card and marquee updates.\n */\nexport function readShowcaseMeta(documentObj: Document): ShowcaseMeta {\n const meta: ShowcaseMeta = {\n baseUrl: documentObj.documentElement.getAttribute('data-baseurl') ?? '',\n themeFullNames: {},\n themeIcons: {},\n };\n for (const el of documentObj.querySelectorAll(`[${THEME_TRIGGER_ATTRIBUTE}]`)) {\n const themeId = el.getAttribute(THEME_TRIGGER_ATTRIBUTE);\n if (!themeId) continue;\n const fullName = el.getAttribute(THEME_NAME_ATTRIBUTE);\n const icon = el.getAttribute(THEME_ICON_ATTRIBUTE);\n if (fullName) meta.themeFullNames[themeId] = fullName;\n if (icon) meta.themeIcons[themeId] = icon;\n }\n return meta;\n}\n\n/**\n * Mark the trigger matching a theme active and deactivate the rest.\n *\n * @param triggers - Elements carrying the data-theme-preview attribute.\n * @param themeId - The active theme's identifier.\n */\nexport function syncThemeTriggers(triggers: readonly Element[], themeId: string): void {\n for (const trigger of triggers) {\n const isActive = trigger.getAttribute(THEME_TRIGGER_ATTRIBUTE) === themeId;\n trigger.classList.toggle('active', isActive);\n trigger.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n }\n}\n\n/**\n * Resolve the display name and icon URL for a theme from page metadata.\n *\n * @param theme - Theme identifier (e.g. 'catppuccin-mocha').\n * @param meta - Theme metadata read from the page.\n * @returns Display name and fully-qualified icon source.\n */\nexport function resolveThemeDisplay(theme: string, meta: ShowcaseMeta): ThemeDisplay {\n const name = meta.themeFullNames[theme] ?? theme;\n const icon = meta.themeIcons[theme] ?? DEFAULT_THEME_ICON;\n return {\n name,\n iconSrc: `${meta.baseUrl}/assets/img/${icon}`,\n };\n}\n\n/** Elements that render the preview card's progress bar. */\nexport interface ProgressElements {\n fill: HTMLElement;\n value: HTMLElement;\n bar: HTMLElement | null;\n}\n\n/**\n * Render the progress bar at a given percentage.\n *\n * @param elements - Progress bar elements.\n * @param percent - Percentage to render (0..100).\n */\nexport function renderProgress(elements: ProgressElements, percent: number): void {\n elements.fill.style.width = `${percent}%`;\n elements.value.textContent = `${percent}%`;\n elements.bar?.setAttribute('aria-valuenow', String(percent));\n}\n\n/**\n * Animate the progress bar from zero to its target.\n *\n * With reduced motion the target renders immediately; otherwise the target\n * render is deferred via the scheduler so the CSS transition can play.\n *\n * @param elements - Progress bar elements.\n * @param options - Target percentage, reduced-motion flag, and scheduler.\n */\nexport function animateProgress(\n elements: ProgressElements,\n options: {\n target: number;\n reducedMotion: boolean;\n schedule?: (callback: () => void) => void;\n },\n): void {\n const { target, reducedMotion } = options;\n renderProgress(elements, 0);\n if (reducedMotion) {\n renderProgress(elements, target);\n return;\n }\n const schedule =\n options.schedule ??\n ((callback: () => void): void => {\n requestAnimationFrame(() => {\n requestAnimationFrame(callback);\n });\n });\n schedule(() => {\n renderProgress(elements, target);\n });\n}\n\n/** Tears down showcase listeners and cancels animation loops. */\nexport type ShowcaseCleanup = () => void;\n\n/** No-op cleanup used when a feature has nothing to tear down. */\nconst NOOP_CLEANUP: ShowcaseCleanup = () => undefined;\n\n/** Active showcase cleanup; replaced on each `initShowcase` call. */\nlet activeShowcaseCleanup: ShowcaseCleanup | null = null;\n\n/**\n * Start the spotlight drift animation.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that cancels the RAF loop.\n */\nfunction initSpotlight(reducedMotion: boolean): ShowcaseCleanup {\n const root = document.getElementById('showcase-spotlight');\n if (!root || reducedMotion) return NOOP_CLEANUP;\n\n const left = root.querySelector<HTMLElement>('.showcase-spotlight-left');\n const right = root.querySelector<HTMLElement>('.showcase-spotlight-right');\n if (!left || !right) return NOOP_CLEANUP;\n\n let state: SpotlightState = { offset: 0, direction: 1 };\n let cancelled = false;\n let rafId = 0;\n\n const tick = (): void => {\n if (cancelled) return;\n state = stepSpotlight(state);\n left.style.transform = `translateX(${state.offset}px)`;\n right.style.transform = `translateX(${-state.offset}px)`;\n rafId = requestAnimationFrame(tick);\n };\n\n rafId = requestAnimationFrame(tick);\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n };\n}\n\n/**\n * Wire the comet-card tilt and glare animation.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that cancels the RAF loop and removes pointer listeners.\n */\nfunction initCometCard(reducedMotion: boolean): ShowcaseCleanup {\n const card = document.getElementById('showcase-comet-card');\n const glare = document.getElementById('showcase-comet-glare');\n if (!card || reducedMotion) return NOOP_CLEANUP;\n\n let current: TiltTargets = { ...RESTING_TILT_TARGETS };\n let targets: TiltTargets = { ...RESTING_TILT_TARGETS };\n let cancelled = false;\n let rafId = 0;\n\n const onMouseMove = (event: MouseEvent): void => {\n targets = computeTiltTargets(event.clientX, event.clientY, card.getBoundingClientRect());\n };\n\n const onMouseLeave = (): void => {\n targets = { ...RESTING_TILT_TARGETS };\n };\n\n card.addEventListener('mousemove', onMouseMove);\n card.addEventListener('mouseleave', onMouseLeave);\n\n const animate = (): void => {\n if (cancelled) return;\n current = {\n rotateX: approach(current.rotateX, targets.rotateX, 0.12),\n rotateY: approach(current.rotateY, targets.rotateY, 0.12),\n glareX: approach(current.glareX, targets.glareX, 0.15),\n glareY: approach(current.glareY, targets.glareY, 0.15),\n };\n card.style.transform =\n `perspective(900px) rotateX(${current.rotateX}deg) ` +\n `rotateY(${current.rotateY}deg) scale3d(1.02,1.02,1.02)`;\n if (glare) {\n glare.style.background =\n `radial-gradient(circle at ${current.glareX}% ${current.glareY}%, ` +\n 'color-mix(in srgb, var(--turbo-text-primary) 35%, transparent) 0%, transparent 65%)';\n }\n rafId = requestAnimationFrame(animate);\n };\n\n rafId = requestAnimationFrame(animate);\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n card.removeEventListener('mousemove', onMouseMove);\n card.removeEventListener('mouseleave', onMouseLeave);\n };\n}\n\n/**\n * Wire the hover-following text mask.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that removes the hover listeners.\n */\nfunction initTextMask(reducedMotion: boolean): ShowcaseCleanup {\n const wrap = document.getElementById('showcase-text-mask');\n if (!wrap || reducedMotion) return NOOP_CLEANUP;\n\n const onMouseMove = (event: MouseEvent): void => {\n const { x, y } = pointerPercent(event.clientX, event.clientY, wrap.getBoundingClientRect());\n wrap.style.setProperty('--mx', `${x}%`);\n wrap.style.setProperty('--my', `${y}%`);\n wrap.classList.add('is-hovering');\n };\n const onMouseLeave = (): void => {\n wrap.classList.remove('is-hovering');\n wrap.style.setProperty('--mx', '50%');\n wrap.style.setProperty('--my', '50%');\n };\n\n wrap.addEventListener('mousemove', onMouseMove);\n wrap.addEventListener('mouseleave', onMouseLeave);\n return () => {\n wrap.removeEventListener('mousemove', onMouseMove);\n wrap.removeEventListener('mouseleave', onMouseLeave);\n };\n}\n\n/**\n * Reveal elements on scroll, or immediately with reduced motion.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @returns Cleanup that disconnects the reveal observer.\n */\nfunction initScrollReveal(reducedMotion: boolean): ShowcaseCleanup {\n if (!('IntersectionObserver' in window)) return NOOP_CLEANUP;\n const items = document.querySelectorAll<HTMLElement>('[data-showcase-reveal]');\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n entry.target.classList.add('is-visible');\n observer.unobserve(entry.target);\n }\n }\n },\n { threshold: 0.15, rootMargin: '0px 0px -40px 0px' },\n );\n for (const el of items) {\n if (reducedMotion) {\n el.classList.add('is-visible');\n } else {\n observer.observe(el);\n }\n }\n return () => observer.disconnect();\n}\n\n/**\n * Pause marquee rows on hover and resume on leave.\n *\n * @returns Cleanup that removes the hover listeners from every row.\n */\nfunction initMarqueePause(): ShowcaseCleanup {\n const teardowns: ShowcaseCleanup[] = [];\n for (const row of document.querySelectorAll<HTMLElement>('.showcase-marquee-row')) {\n const onEnter = (): void => {\n row.style.animationPlayState = marqueePlayState(true);\n };\n const onLeave = (): void => {\n row.style.animationPlayState = marqueePlayState(false);\n };\n row.addEventListener('mouseenter', onEnter);\n row.addEventListener('mouseleave', onLeave);\n teardowns.push(() => {\n row.removeEventListener('mouseenter', onEnter);\n row.removeEventListener('mouseleave', onLeave);\n });\n }\n return () => {\n for (const teardown of teardowns) {\n teardown();\n }\n };\n}\n\n/**\n * Wire the interactive preview card: tabs, progress bar, buttons, and\n * theme-change updates.\n *\n * @param reducedMotion - Whether the user prefers reduced motion.\n * @param meta - Theme metadata read from the page.\n * @returns Handler that re-renders the card for a newly active theme.\n */\nfunction initPreviewCard(reducedMotion: boolean, meta: ShowcaseMeta): (themeId: string) => void {\n const tabs = Array.from(document.querySelectorAll<HTMLElement>('.showcase-preview-tab'));\n const panels = Array.from(document.querySelectorAll<HTMLElement>('.showcase-preview-panel'));\n const toast = document.getElementById('showcase-preview-toast');\n let toastTimer: ReturnType<typeof setTimeout> | undefined;\n\n const progressFill = document.getElementById('showcase-progress-fill');\n const progressValue = document.getElementById('showcase-progress-value');\n const progressBar = document.getElementById('showcase-progress-bar');\n const progressElements: ProgressElements | null =\n progressFill && progressValue\n ? { fill: progressFill, value: progressValue, bar: progressBar }\n : null;\n\n const showToast = (message: string): void => {\n if (!toast) return;\n toast.textContent = message;\n toast.hidden = false;\n clearTimeout(toastTimer);\n toastTimer = setTimeout(() => {\n toast.hidden = true;\n }, 1600);\n };\n\n const runProgress = (): void => {\n if (!progressElements) return;\n animateProgress(progressElements, { target: PROGRESS_TARGET, reducedMotion });\n };\n\n for (const [index, tab] of tabs.entries()) {\n tab.addEventListener('click', () => {\n const target = tab.getAttribute('data-preview-tab');\n if (!target) return;\n applyTabSelection(tabs, panels, target);\n if (target === 'overview') runProgress();\n });\n tab.addEventListener('keydown', (event: KeyboardEvent) => {\n const focusIndex = nextTabFocusIndex(event.key, index, tabs.length);\n if (focusIndex === null) return;\n event.preventDefault();\n focusTab(tabs, focusIndex);\n });\n }\n\n const codeBtn = document.getElementById('showcase-preview-code');\n if (codeBtn) {\n codeBtn.addEventListener('click', () => {\n const snippet = 'background: var(--turbo-bg-surface);\\ncolor: var(--turbo-text-primary);';\n if (typeof navigator.clipboard?.writeText === 'function') {\n void navigator.clipboard\n .writeText(snippet)\n .then(() => {\n showToast('Copied CSS snippet');\n })\n .catch(() => {\n showToast(snippet);\n });\n } else {\n showToast(snippet);\n }\n });\n }\n\n const primaryBtn = document.getElementById('showcase-preview-primary');\n if (primaryBtn) {\n primaryBtn.addEventListener('click', () => {\n primaryBtn.classList.add('is-pressed');\n showToast('Primary action');\n setTimeout(() => {\n primaryBtn.classList.remove('is-pressed');\n }, 300);\n });\n }\n\n const outlineBtn = document.getElementById('showcase-preview-outline');\n if (outlineBtn) {\n outlineBtn.addEventListener('click', () => {\n outlineBtn.classList.toggle('is-active');\n showToast(outlineBtn.classList.contains('is-active') ? 'Outline active' : 'Outline default');\n });\n }\n\n const renderTheme = (theme: string): void => {\n const display = resolveThemeDisplay(theme, meta);\n const nameEl = document.getElementById('showcase-preview-theme-name');\n const iconEl = document.getElementById('showcase-preview-theme-icon');\n if (nameEl) nameEl.textContent = display.name;\n if (iconEl instanceof HTMLImageElement) iconEl.src = display.iconSrc;\n\n const overviewPanel = document.querySelector('[data-preview-panel=\"overview\"]');\n if (overviewPanel?.classList.contains('is-active')) {\n runProgress();\n }\n };\n\n runProgress();\n return renderTheme;\n}\n\n/**\n * Invoke a callback on every theme change, whatever the channel.\n *\n * Covers changes driven through the integration API (marquee clicks)\n * via `turbo-theme-change` events, and changes applied outside it (the\n * header dropdown) via a `data-theme` attribute observer. Consecutive\n * duplicate notifications are collapsed.\n *\n * @param onTheme - Callback invoked with each newly active theme ID.\n * @returns Cleanup that removes the event listener and disconnects the observer.\n */\nfunction wireThemeObserver(onTheme: (themeId: string) => void): ShowcaseCleanup {\n let lastTheme: string | null = null;\n\n const notify = (themeId: string | null): void => {\n if (!themeId || themeId === lastTheme) return;\n lastTheme = themeId;\n onTheme(themeId);\n };\n\n const unsubscribe = subscribeToThemeChanges((detail) => {\n notify(detail.themeId);\n }, document);\n\n const observer = new MutationObserver(() => {\n notify(document.documentElement.getAttribute('data-theme'));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n return () => {\n unsubscribe();\n observer.disconnect();\n };\n}\n\n/**\n * Wire the marquee theme cards to the theme-selector integration API.\n *\n * Clicks on `[data-theme-preview]` elements apply the named theme through\n * `applyTheme` (which lazily loads its CSS); hovering or focusing a card\n * prefetches the theme's stylesheet via the lazy-CSS helpers.\n *\n * Partial applications are surfaced: when the stylesheet fails to load\n * the selector keeps the previous theme's CSS in effect and suppresses\n * the theme-change event, so the page logs the failure instead of\n * pretending the switch happened.\n *\n * @returns Cleanup that removes click and prefetch listeners.\n */\nfunction initThemeControls(): ShowcaseCleanup {\n const onClick = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const trigger = target.closest(`[${THEME_TRIGGER_ATTRIBUTE}]`);\n const themeId = trigger?.getAttribute(THEME_TRIGGER_ATTRIBUTE);\n if (!themeId) return;\n void applyTheme(themeId).then((result) => {\n if (!result.applied || !result.cssLoaded) {\n console.warn(\n `Theme \"${themeId}\" was not fully applied: ` +\n 'its stylesheet failed to load, keeping the previous theme CSS.',\n );\n }\n });\n };\n\n document.addEventListener('click', onClick);\n const unwirePrefetch = wireHoverPrefetch(document);\n return () => {\n document.removeEventListener('click', onClick);\n unwirePrefetch();\n };\n}\n\n/**\n * Initialize every showcase interaction on the current document.\n *\n * Re-entrant: a second call tears down the previous initialization first\n * so RAF loops and document-level listeners never accumulate.\n *\n * @returns Cleanup that cancels animations and removes listeners.\n */\nexport function initShowcase(): ShowcaseCleanup {\n activeShowcaseCleanup?.();\n\n const reducedMotion = prefersReducedMotion(window);\n const meta = readShowcaseMeta(document);\n const cleanups: ShowcaseCleanup[] = [\n initSpotlight(reducedMotion),\n initCometCard(reducedMotion),\n initThemeControls(),\n initTextMask(reducedMotion),\n initScrollReveal(reducedMotion),\n initMarqueePause(),\n ];\n const renderTheme = initPreviewCard(reducedMotion, meta);\n\n const syncTheme = (themeId: string): void => {\n syncThemeTriggers(\n Array.from(document.querySelectorAll(`[${THEME_TRIGGER_ATTRIBUTE}]`)),\n themeId,\n );\n renderTheme(themeId);\n };\n cleanups.push(wireThemeObserver(syncTheme));\n syncTheme(getCurrentTheme(document));\n\n const cleanup: ShowcaseCleanup = () => {\n for (const teardown of cleanups) {\n teardown();\n }\n if (activeShowcaseCleanup === cleanup) {\n activeShowcaseCleanup = null;\n }\n };\n activeShowcaseCleanup = cleanup;\n return cleanup;\n}\n\n// Auto-initialize on DOMContentLoaded\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n document.addEventListener('DOMContentLoaded', () => {\n initShowcase();\n });\n}\n"],"mappings":"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"}
|