free-coding-models 0.5.1 → 0.5.4

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.
Files changed (122) hide show
  1. package/README.md +31 -5
  2. package/changelog/v0.5.4.md +24 -0
  3. package/package.json +5 -2
  4. package/sources.js +2 -0
  5. package/src/tui/key-handler.js +1 -1
  6. package/web/assets/providers/aistudio/aistudio-text.svg +1 -0
  7. package/web/assets/providers/aistudio/aistudio.svg +1 -0
  8. package/web/assets/providers/cerebras/cerebras-brand-color.svg +1 -0
  9. package/web/assets/providers/cerebras/cerebras-brand.svg +1 -0
  10. package/web/assets/providers/cerebras/cerebras-color.svg +1 -0
  11. package/web/assets/providers/cerebras/cerebras-text.svg +1 -0
  12. package/web/assets/providers/cerebras/cerebras.svg +1 -0
  13. package/web/assets/providers/cloudflare/cloudflare-color.svg +1 -0
  14. package/web/assets/providers/cloudflare/cloudflare-text.svg +1 -0
  15. package/web/assets/providers/cloudflare/cloudflare.svg +1 -0
  16. package/web/assets/providers/gemini/gemini-color.svg +1 -0
  17. package/web/assets/providers/gemini/gemini-text.svg +1 -0
  18. package/web/assets/providers/gemini/gemini.svg +1 -0
  19. package/web/assets/providers/github/github-text.svg +1 -0
  20. package/web/assets/providers/github/github.svg +1 -0
  21. package/web/assets/providers/groq/groq-text.svg +1 -0
  22. package/web/assets/providers/groq/groq.svg +1 -0
  23. package/web/assets/providers/mistral/mistral-color.svg +1 -0
  24. package/web/assets/providers/mistral/mistral-text.svg +1 -0
  25. package/web/assets/providers/mistral/mistral.svg +1 -0
  26. package/web/assets/providers/nvidia/nvidia-color.svg +1 -0
  27. package/web/assets/providers/nvidia/nvidia-text.svg +1 -0
  28. package/web/assets/providers/nvidia/nvidia.svg +1 -0
  29. package/web/assets/providers/opencode/opencode-text.svg +1 -0
  30. package/web/assets/providers/opencode/opencode.svg +1 -0
  31. package/web/assets/providers/openrouter/openrouter (1).svg +1 -0
  32. package/web/assets/providers/openrouter/openrouter-text.svg +1 -0
  33. package/web/assets/providers/openrouter/openrouter.svg +1 -0
  34. package/web/assets/providers/ovhcloud/ovhcloud.svg +12 -0
  35. package/web/assets/providers/qwen/qwen-color.svg +1 -0
  36. package/web/assets/providers/qwen/qwen-text.svg +1 -0
  37. package/web/assets/providers/qwen/qwen.svg +1 -0
  38. package/web/assets/providers/sambanova/sambanova-color.svg +1 -0
  39. package/web/assets/providers/sambanova/sambanova-text.svg +1 -0
  40. package/web/assets/providers/sambanova/sambanova.svg +1 -0
  41. package/web/assets/providers/scalewaylogo/ScalewayLogo.svg +13 -0
  42. package/web/assets/providers/zai/zai-text.svg +1 -0
  43. package/web/assets/providers/zai/zai.svg +1 -0
  44. package/web/dist/assets/index-BoWmUveV.js +39 -0
  45. package/web/dist/assets/index-BrpHevg4.css +1 -0
  46. package/web/dist/favicon.ico +0 -0
  47. package/web/dist/favicons/apple-touch-icon.png +0 -0
  48. package/web/dist/favicons/browserconfig.xml +12 -0
  49. package/web/dist/favicons/favicon-16x16.png +0 -0
  50. package/web/dist/favicons/favicon-192x192.png +0 -0
  51. package/web/dist/favicons/favicon-32x32.png +0 -0
  52. package/web/dist/favicons/favicon-48x48.png +0 -0
  53. package/web/dist/favicons/favicon-512x512.png +0 -0
  54. package/web/dist/favicons/favicon-96x96.png +0 -0
  55. package/web/dist/favicons/favicon.ico +0 -0
  56. package/web/dist/favicons/mstile-150x150.png +0 -0
  57. package/web/dist/favicons/mstile-310x150.png +0 -0
  58. package/web/dist/favicons/mstile-310x310.png +0 -0
  59. package/web/dist/favicons/mstile-512x512.png +0 -0
  60. package/web/dist/favicons/mstile-70x70.png +0 -0
  61. package/web/dist/favicons/site.webmanifest +25 -0
  62. package/web/dist/index.html +42 -3
  63. package/web/index.html +40 -1
  64. package/web/public/favicon.ico +0 -0
  65. package/web/public/favicons/apple-touch-icon.png +0 -0
  66. package/web/public/favicons/browserconfig.xml +12 -0
  67. package/web/public/favicons/favicon-16x16.png +0 -0
  68. package/web/public/favicons/favicon-192x192.png +0 -0
  69. package/web/public/favicons/favicon-32x32.png +0 -0
  70. package/web/public/favicons/favicon-48x48.png +0 -0
  71. package/web/public/favicons/favicon-512x512.png +0 -0
  72. package/web/public/favicons/favicon-96x96.png +0 -0
  73. package/web/public/favicons/favicon.ico +0 -0
  74. package/web/public/favicons/mstile-150x150.png +0 -0
  75. package/web/public/favicons/mstile-310x150.png +0 -0
  76. package/web/public/favicons/mstile-310x310.png +0 -0
  77. package/web/public/favicons/mstile-512x512.png +0 -0
  78. package/web/public/favicons/mstile-70x70.png +0 -0
  79. package/web/public/favicons/site.webmanifest +25 -0
  80. package/web/server.js +71 -1
  81. package/web/src/App.jsx +209 -89
  82. package/web/src/components/analytics/AnalyticsView.jsx +30 -2
  83. package/web/src/components/analytics/AnalyticsView.module.css +4 -0
  84. package/web/src/components/atoms/AILatencyCell.module.css +9 -1
  85. package/web/src/components/atoms/HealthCell.jsx +113 -28
  86. package/web/src/components/atoms/HealthCell.module.css +43 -2
  87. package/web/src/components/atoms/LastPingCell.module.css +10 -0
  88. package/web/src/components/atoms/NoKeyIcon.jsx +65 -0
  89. package/web/src/components/atoms/NoKeyIcon.module.css +30 -0
  90. package/web/src/components/atoms/ProviderLogo.jsx +188 -0
  91. package/web/src/components/atoms/ProviderLogo.module.css +103 -0
  92. package/web/src/components/atoms/Sparkline.jsx +21 -2
  93. package/web/src/components/atoms/StabilityCell.module.css +5 -0
  94. package/web/src/components/atoms/StatusDot.module.css +7 -0
  95. package/web/src/components/atoms/TPSCell.module.css +7 -1
  96. package/web/src/components/atoms/TierBadge.module.css +11 -0
  97. package/web/src/components/atoms/Toast.module.css +6 -0
  98. package/web/src/components/atoms/VerdictBadge.module.css +12 -0
  99. package/web/src/components/dashboard/DetailPanel.jsx +63 -2
  100. package/web/src/components/dashboard/DetailPanel.module.css +130 -0
  101. package/web/src/components/dashboard/FilterBar.jsx +146 -53
  102. package/web/src/components/dashboard/FilterBar.module.css +138 -58
  103. package/web/src/components/dashboard/ModelTable.jsx +235 -30
  104. package/web/src/components/dashboard/ModelTable.module.css +205 -16
  105. package/web/src/components/layout/Header.jsx +140 -12
  106. package/web/src/components/layout/Header.module.css +191 -27
  107. package/web/src/components/palette/CommandPalette.jsx +146 -0
  108. package/web/src/components/palette/CommandPalette.module.css +121 -0
  109. package/web/src/global.css +52 -15
  110. package/web/src/hooks/useColumnSizing.js +211 -0
  111. package/web/src/hooks/useFavorites.js +150 -0
  112. package/web/src/hooks/useFilter.js +157 -24
  113. package/web/src/hooks/useTheme.js +72 -16
  114. package/web/src/hooks/useUrlState.js +93 -0
  115. package/web/dist/assets/index-ByGf4Kq-.js +0 -14
  116. package/web/dist/assets/index-Ds7wmHBv.css +0 -1
  117. package/web/src/components/dashboard/StatsBar.jsx +0 -42
  118. package/web/src/components/dashboard/StatsBar.module.css +0 -28
  119. package/web/src/components/layout/Sidebar.jsx +0 -50
  120. package/web/src/components/layout/Sidebar.module.css +0 -86
  121. package/web/src/components/map/MapView.jsx +0 -17
  122. package/web/src/components/map/MapView.module.css +0 -25
@@ -0,0 +1 @@
1
+ ._header_gqz59_11{z-index:100;height:var(--header-h,60px);background:var(--color-bg-card);-webkit-backdrop-filter:blur(20px)saturate(1.5);border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;gap:16px;width:100%;padding:0 20px;display:flex;position:sticky;top:0}._left_gqz59_28{flex-shrink:0;align-items:center;gap:14px;display:flex}._center_gqz59_35{flex:1;min-width:0;max-width:480px}._right_gqz59_41{flex-shrink:0;align-items:center;gap:8px;display:flex}._logo_gqz59_49{align-items:center;gap:6px;display:flex}._logoIcon_gqz59_50{color:var(--color-brand);font-family:var(--font-mono);align-items:center;font-size:20px;font-weight:900;display:flex}._logoText_gqz59_58{color:var(--color-text);align-items:center;font-size:14px;font-weight:700;display:flex}._logoTextHighlight_gqz59_64{color:var(--color-brand)}._version_gqz59_65{font-size:10px;font-weight:500;font-family:var(--font-mono);color:var(--color-text-dim);background:var(--color-accent-dim);border:1px solid var(--color-border);border-radius:999px;padding:2px 6px}._nav_gqz59_72{border-left:1px solid var(--color-border);align-items:center;gap:2px;height:36px;margin-left:8px;padding-left:12px;display:flex}._navBtn_gqz59_82{height:30px;font-size:12px;font-weight:600;font-family:var(--font-sans);color:var(--color-text-muted);cursor:pointer;white-space:nowrap;background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:5px;padding:0 10px;transition:background .15s,color .15s,border-color .15s;display:inline-flex}._navBtn_gqz59_82:hover{background:var(--color-bg-hover);color:var(--color-text)}._navBtnActive_gqz59_103{background:var(--color-accent-dim);color:var(--color-accent);border-color:var(--color-border);font-weight:700}._navBtnActive_gqz59_103:hover{background:var(--color-accent-dim);color:var(--color-accent)}._comingBadge_gqz59_116{font-size:9px;font-weight:700;font-family:var(--font-mono);color:var(--color-text-dim);background:var(--color-surface);border:1px solid var(--color-border);text-transform:uppercase;letter-spacing:.3px;border-radius:3px;margin-left:2px;padding:1px 4px;line-height:1}._menuWrap_gqz59_132{position:relative}._menuTrigger_gqz59_133{justify-content:center;width:30px;padding:0}._menuPopover_gqz59_138{background:var(--color-bg-elevated);border:1px solid var(--color-border);z-index:200;border-radius:8px;flex-direction:column;gap:1px;min-width:200px;padding:4px;display:flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 8px 24px #00000052}._menuItem_gqz59_153{width:100%;color:var(--color-text);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:5px;align-items:center;gap:8px;padding:7px 10px;font-size:12px;font-weight:500;transition:background .1s;display:flex}._menuItem_gqz59_153:hover{background:var(--color-bg-hover)}._menuItem_gqz59_153>span:first-of-type{flex:1}._searchBar_gqz59_173{background:var(--color-surface);border:1px solid var(--color-border);border-radius:8px;align-items:center;gap:8px;height:34px;padding:0 12px;transition:border-color .15s,box-shadow .15s;display:flex}._searchBar_gqz59_173:focus-within{border-color:var(--color-accent);box-shadow:0 0 0 3px var(--color-accent-glow)}._searchIcon_gqz59_183{flex-shrink:0;font-size:14px}._searchInput_gqz59_184{color:var(--color-text);font-size:13px;font-family:var(--font-sans);background:0 0;border:none;outline:none;flex:1;min-width:0}._searchInput_gqz59_184::placeholder{color:var(--color-text-dim)}._iconBtn_gqz59_192{border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;padding:6px 8px;font-size:16px;transition:all .15s;display:inline-flex}._iconBtn_gqz59_192:hover{background:var(--color-bg-hover);border-color:var(--color-border-hover)}._cmdkBtn_gqz59_202{border:1px solid var(--color-border);background:var(--color-surface);height:30px;color:var(--color-text);cursor:pointer;font-size:12px;font-weight:600;font-family:var(--font-mono);border-radius:6px;align-items:center;gap:6px;padding:0 10px;transition:all .15s;display:inline-flex}._cmdkBtn_gqz59_202:hover{border-color:var(--color-accent);background:var(--color-bg-hover)}._cmdkLabel_gqz59_215{letter-spacing:.5px;font-size:11px}._benchmarkBtn_gqz59_218{border:1px solid var(--color-border);background:var(--color-surface);height:30px;color:var(--color-text);cursor:pointer;font-size:12px;font-weight:700;font-family:var(--font-mono);border-radius:6px;align-items:center;gap:6px;padding:0 12px;transition:all .15s;display:inline-flex}._benchmarkBtn_gqz59_218:hover{color:#0f8;background:#00ff8814;border-color:#0f8}._benchmarkActive_gqz59_228{cursor:not-allowed;color:#0f8!important;background:#00ff881f!important;border-color:#0f8!important}._benchmarkRunning_gqz59_233{align-items:center;gap:6px;display:inline-flex}@keyframes _spin_gqz59_235{to{transform:rotate(360deg)}}._spinner_gqz59_235{border:2px solid #00ff884d;border-top-color:#0f8;border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.8s linear infinite _spin_gqz59_235;display:inline-block}[data-theme=light] ._benchmarkBtn_gqz59_218:hover{color:#008f4d;background:#008f4d0f;border-color:#008f4d}[data-theme=light] ._benchmarkActive_gqz59_228{color:#008f4d!important;background:#008f4d1a!important;border-color:#008f4d!important}[data-theme=light] ._spinner_gqz59_235{border-color:#008f4d #0000001a #0000001a}@media (width<=1024px){._navBtn_gqz59_82>span:not(._comingBadge_gqz59_116){display:none}._navBtn_gqz59_82{padding:0 8px}._center_gqz59_35{max-width:320px}}@media (width<=768px){._center_gqz59_35,._logoText_gqz59_58,._cmdkLabel_gqz59_215,._benchmarkBtn_gqz59_218>span:not(._benchmarkRunning_gqz59_233){display:none}}@media (width<=560px){._version_gqz59_65{display:none}._navBtn_gqz59_82{padding:0 6px}}._footer_1uw54_1{z-index:1;border-top:1px solid var(--color-border);color:var(--color-text-dim);justify-content:space-between;align-items:center;padding:16px 24px;font-size:12px;display:flex;position:relative}._left_1uw54_8 a,._right_1uw54_8 a{color:var(--color-text-dim);text-decoration:none}._left_1uw54_8 a:hover,._right_1uw54_8 a:hover{color:var(--color-accent)}._right_1uw54_8{gap:16px;display:flex}._filters_15z8z_9{z-index:99;background:var(--color-bg-card);border-bottom:1px solid var(--color-border);-webkit-backdrop-filter:blur(20px)saturate(1.5);flex-wrap:wrap;align-items:center;gap:14px;padding:10px 20px;display:flex;position:sticky;top:60px}._group_15z8z_19{align-items:center;gap:6px;display:flex}._filterLabel_15z8z_21{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;font-size:10px;font-weight:700}._chipRow_15z8z_28{gap:3px;display:flex}._chip_15z8z_28{font-size:11px;font-weight:600;font-family:var(--font-mono);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text-muted);cursor:pointer;white-space:nowrap;border-radius:5px;padding:4px 8px;transition:all .15s}._chip_15z8z_28:hover{background:var(--color-bg-hover);color:var(--color-text)}._chipActive_15z8z_37{font-weight:700;background:var(--color-accent)!important;color:var(--color-bg)!important;border-color:var(--color-accent)!important}._select_15z8z_43,._providerSelect_15z8z_43{background:var(--color-surface);color:var(--color-text);border:1px solid var(--color-border);font-size:11px;font-family:var(--font-sans);cursor:pointer;border-radius:5px;outline:none;min-width:130px;padding:4px 8px}._select_15z8z_43:focus,._providerSelect_15z8z_43:focus{border-color:var(--color-accent)}._spacer_15z8z_53{flex:1}._resetBtn_15z8z_55{font-size:11px;font-weight:700;font-family:var(--font-mono);border:1px solid var(--color-border-hover);background:var(--color-accent-dim);color:var(--color-text);cursor:pointer;border-radius:5px;align-items:center;gap:5px;padding:4px 9px;transition:all .15s;display:inline-flex}._resetBtn_15z8z_55:hover{background:var(--color-accent);color:var(--color-bg)}._resetBadge_15z8z_68{background:var(--color-bg);min-width:16px;height:16px;color:var(--color-accent);border-radius:999px;justify-content:center;align-items:center;padding:0 4px;font-size:9px;font-weight:800;display:inline-flex}._customFilterChip_15z8z_79{font-size:11px;font-weight:600;font-family:var(--font-mono);border:1px solid var(--color-accent);background:var(--color-accent-dim);color:var(--color-accent);border-radius:5px;align-items:center;gap:6px;max-width:240px;padding:3px 4px 3px 8px;display:inline-flex}._customFilterIcon_15z8z_89{flex-shrink:0;display:inline-flex}._customFilterLabel_15z8z_90{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._customFilterClear_15z8z_95{width:18px;height:18px;color:var(--color-accent);cursor:pointer;background:0 0;border:none;border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}._customFilterClear_15z8z_95:hover{background:var(--color-accent);color:var(--color-bg)}._pingRow_15z8z_108{gap:3px;display:flex}._pingBtn_15z8z_109{font-size:11px;font-weight:600;font-family:var(--font-mono);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text-muted);cursor:pointer;white-space:nowrap;border-radius:5px;padding:4px 8px;transition:all .15s}._pingBtn_15z8z_109:hover{background:var(--color-bg-hover);color:var(--color-text);border-color:var(--color-text-muted)}._pingBtnActive_15z8z_117{font-weight:700;background:var(--color-bg-hover)!important;color:var(--ping-active-color,var(--color-accent))!important;border-color:var(--ping-active-color,var(--color-accent))!important}._nextPing_15z8z_125{font-size:11px;font-family:var(--font-mono);border:1px solid var(--color-border);background:var(--color-surface);border-radius:5px;align-items:center;gap:6px;padding:4px 8px;display:flex}._nextPingLabel_15z8z_133{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px;font-size:10px;font-weight:500}._nextPingTime_15z8z_137{color:var(--color-text);text-align:right;font-variant-numeric:tabular-nums;min-width:32px;font-size:13px;font-weight:700}._pingingDot_15z8z_143{background:#f46;border-radius:50%;flex-shrink:0;width:7px;height:7px;animation:.6s ease-in-out infinite _pulseDot_15z8z_1}@keyframes _pulseDot_15z8z_1{0%,to{box-shadow:0 0 0 0 var(--color-accent-glow)}50%{box-shadow:0 0 0 6px #0000}}._live_15z8z_154{color:var(--color-accent);text-transform:uppercase;letter-spacing:1px;align-items:center;gap:5px;font-size:10px;font-weight:700;display:flex}._liveDot_15z8z_159{background:var(--color-accent);border-radius:50%;width:7px;height:7px;animation:2s ease-in-out infinite _pulseDot_15z8z_1}._benchmarkBar_15z8z_165{background:#b400ff1f;border:1px solid #b400ff66;border-radius:6px;flex-shrink:0;align-items:center;gap:10px;width:100%;margin-bottom:4px;padding:6px 12px;display:flex}._benchmarkLabel_15z8z_175{color:#b400ff;font-size:11px;font-weight:700;font-family:var(--font-mono);white-space:nowrap;align-items:center;gap:5px;display:flex}._benchmarkSpinner_15z8z_181{font-size:12px;line-height:1;animation:.8s linear infinite _spinSp_15z8z_1;display:inline-block}._benchmarkCount_15z8z_186{opacity:.8;font-size:10px}._benchmarkTrack_15z8z_187{background:#ffffff1a;border-radius:3px;flex:1;width:120px;height:5px;overflow:hidden}._benchmarkFill_15z8z_193{background:linear-gradient(90deg,#b400ff,#f0f);border-radius:3px;height:100%;transition:width .5s}._benchmarkPct_15z8z_199{color:#b400ff;font-size:11px;font-weight:700;font-family:var(--font-mono);text-align:right;min-width:32px}@keyframes _spinSp_15z8z_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._mood_f9he5_1{text-align:center;width:20px;font-size:14px;display:inline-block}._badge_zw4n6_1{text-align:center;border-radius:4px;min-width:32px;padding:2px 8px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;display:inline-block}._tier_splus_zw4n6_11{color:gold;background:#ffd70026;border:1px solid #ffd7004d}._tier_s_zw4n6_11{color:#ff8c00;background:#ff8c001f;border:1px solid #ff8c0040}._tier_aplus_zw4n6_13{color:#00c8ff;background:#00c8ff1a;border:1px solid #00c8ff33}._tier_a_zw4n6_13{color:#3ddc84;background:#3ddc841a;border:1px solid #3ddc8433}._tier_aminus_zw4n6_15{color:#7ecf7e;background:#7ecf7e1a;border:1px solid #7ecf7e33}._tier_bplus_zw4n6_16{color:#a8a8c8;background:#a8a8c81a;border:1px solid #a8a8c826}._tier_b_zw4n6_16{color:#808098;background:#8080981a;border:1px solid #80809826}._tier_c_zw4n6_18{color:#606078;background:#6060781a;border:1px solid #60607826}[data-theme=light] ._tier_splus_zw4n6_11{color:#7a5e00;border-color:#b0880066}[data-theme=light] ._tier_s_zw4n6_11{color:#a14a00;border-color:#c45a0066}[data-theme=light] ._tier_aplus_zw4n6_13{color:#005d8a;border-color:#0073a866}[data-theme=light] ._tier_a_zw4n6_13{color:#1f7a3e;border-color:#1f7a3e66}[data-theme=light] ._tier_aminus_zw4n6_15{color:#2f7a2f;border-color:#2f7a2f66}[data-theme=light] ._tier_bplus_zw4n6_16{color:#4a4a72;border-color:#5a5a8a66}[data-theme=light] ._tier_b_zw4n6_16{color:#556;border-color:#5566}[data-theme=light] ._tier_c_zw4n6_18{color:#5a5a6a;border-color:#6a6a7a66}._dot_1u2qu_1{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:6px;display:inline-block}._up_1u2qu_9{background:#0f8;box-shadow:0 0 6px #0f86}._down_1u2qu_10,._timeout_1u2qu_11{background:#f44}._pending_1u2qu_12{background:#555570;animation:1.5s ease-in-out infinite _pulse_1u2qu_1}@keyframes _pulse_1u2qu_1{0%,to{box-shadow:0 0 #76b90040}50%{box-shadow:0 0 0 6px #0000}}[data-theme=light] ._up_1u2qu_9{background:#008f4d;box-shadow:0 0 4px #008f4d59}[data-theme=light] ._down_1u2qu_10,[data-theme=light] ._timeout_1u2qu_11{background:#c8143a}[data-theme=light] ._pending_1u2qu_12{background:#889}._cell_ptyq8_1{font-family:var(--font-mono);align-items:center;gap:4px;min-width:54px;font-size:12px;font-weight:600;display:inline-flex}._fast_ptyq8_11{color:#0f8}._medium_ptyq8_12{color:#fa0}._slow_ptyq8_13{color:#f44}._none_ptyq8_14{color:var(--color-text-dim)}@keyframes _pingPulse_ptyq8_1{0%,to{opacity:1}50%{opacity:.3}}@keyframes _pingRing_ptyq8_1{0%{opacity:1;transform:rotate(0)scale(1)}70%{opacity:.6;transform:rotate(180deg)scale(.6)}to{opacity:1;transform:rotate(360deg)scale(1)}}._spinner_ptyq8_26{border:1.5px solid #00ff8840;border-top-color:#0f8;border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.8s linear infinite _pingRing_ptyq8_1;display:inline-block}[data-theme=light] ._fast_ptyq8_11{color:#008f4d}[data-theme=light] ._medium_ptyq8_12{color:#b86b00}[data-theme=light] ._slow_ptyq8_13{color:#c8143a}[data-theme=light] ._spinner_ptyq8_26{border-color:#008f4d #0000001f #0000001f}._wrapper_1t2v0_7{vertical-align:middle;flex-shrink:0;justify-content:center;align-items:center;line-height:0;display:inline-flex;position:relative}._key_1t2v0_17{color:#fa0;z-index:1;filter:drop-shadow(0 0 1px #ffaa0059);position:relative}._slash_1t2v0_24{pointer-events:none;z-index:2;margin:auto;position:absolute;inset:0}._cell_odwix_7{font-family:var(--font-mono);letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:5px;font-size:11px;font-weight:600;display:inline-flex;overflow:hidden}._up_odwix_19{color:#0f8}._warning_odwix_20{color:#fa0}._error_odwix_21{color:#f44}._errorBold_odwix_22{color:#f44;font-weight:800}._dim_odwix_23{color:var(--color-text-dim)}._noKey_odwix_30{color:#fa0;letter-spacing:.4px;background:#ffaa002e;border:1px solid #ffaa0073;border-radius:4px;padding:1px 7px;font-size:12px;font-weight:700}._noKeyText_odwix_40{letter-spacing:.4px;font-weight:700}[data-theme=light] ._noKey_odwix_30{color:#b86b00;background:#ffaa0040;border-color:#ffaa008c}[data-theme=light] ._up_odwix_19{color:#008f4d}[data-theme=light] ._warning_odwix_20{color:#b86b00}[data-theme=light] ._error_odwix_21,[data-theme=light] ._errorBold_odwix_22{color:#c02323}[data-theme=light] ._dim_odwix_23{color:#888}._cell_18ls4_1{align-items:center;gap:6px;display:flex}._bar_18ls4_2{background:var(--color-surface);border-radius:3px;width:48px;height:6px;overflow:hidden}._fill_18ls4_3{border-radius:3px;height:100%;transition:width .25s cubic-bezier(.16,1,.3,1)}._high_18ls4_4{background:linear-gradient(90deg,#0f8,#76b900)}._mid_18ls4_5{background:linear-gradient(90deg,#fa0,#ff8c00)}._low_18ls4_6{background:linear-gradient(90deg,#f44,#c00)}._value_18ls4_7{font-family:JetBrains Mono,monospace;font-size:12px;font-weight:600}._none_18ls4_8{color:var(--color-text-dim)}[data-theme=light] ._high_18ls4_4{background:linear-gradient(90deg,#008f4d,#4a7a00)}[data-theme=light] ._mid_18ls4_5{background:linear-gradient(90deg,#b86b00,#c45a00)}[data-theme=light] ._low_18ls4_6{background:linear-gradient(90deg,#c8143a,#900)}._badge_5z8g9_5{white-space:nowrap;border-radius:999px;align-items:center;gap:3px;padding:2px 7px;font-size:11px;font-weight:700;display:inline-flex}._emoji_5z8g9_16{font-size:12px;line-height:1}._text_5z8g9_17{line-height:1}._perfect_5z8g9_20{color:#0f8;background:#00ff881f}._normal_5z8g9_21{color:#76b900;background:#76b9001f}._slow_5z8g9_22{color:#fa0;background:#ffaa001f}._spiky_5z8g9_23{color:#f60;background:#ff66001f}._veryslow_5z8g9_24{color:#f44;background:#ff44441f}._overloaded_5z8g9_25{color:#f22;background:#ff22221f}._unstable_5z8g9_26{color:#c00;background:#cc00001f}._notactive_5z8g9_27{color:#555570;background:#5555701f}._pending_5z8g9_28{color:#444460;background:#4444601a}[data-theme=light] ._perfect_5z8g9_20{color:#008f4d;background:#008f4d1a}[data-theme=light] ._normal_5z8g9_21{color:#4a7a00;background:#4a7a001a}[data-theme=light] ._slow_5z8g9_22{color:#b86b00;background:#b86b001a}[data-theme=light] ._spiky_5z8g9_23{color:#c45000;background:#c450001a}[data-theme=light] ._veryslow_5z8g9_24{color:#c8143a;background:#c8143a1a}[data-theme=light] ._overloaded_5z8g9_25{color:#b8101f;background:#b8101f1a}[data-theme=light] ._unstable_5z8g9_26{color:#900;background:#9900001a}[data-theme=light] ._notactive_5z8g9_27{color:#5a5a72}[data-theme=light] ._pending_5z8g9_28{color:#5a5a8a}._cell_c8a3q_1{font-family:var(--font-mono);border-radius:4px;align-items:center;gap:4px;min-width:70px;padding:1px 3px;font-size:12px;font-weight:600;transition:background .2s;display:inline-flex}._fast_c8a3q_14{color:#0f8}._medium_c8a3q_15{color:#fa0}._slow_c8a3q_16{color:#f44}._dim_c8a3q_17{color:var(--color-text-dim)}._running_c8a3q_18{color:#b400ff;font-weight:700}._badge_c8a3q_19{color:#06b6d4;font-size:10px}._runningCell_c8a3q_22{background:#b400ff1f}@keyframes _benchSpin_c8a3q_1{to{transform:rotate(360deg)}}@keyframes _benchPulse_c8a3q_1{0%,to{box-shadow:0 0 #b400ff66}50%{box-shadow:0 0 0 4px #b400ff00}}._benchmarkSpinner_c8a3q_34{border:2px solid #b400ff4d;border-top-color:#b400ff;border-radius:50%;flex-shrink:0;width:12px;height:12px;animation:.6s linear infinite _benchSpin_c8a3q_1;display:inline-block}[data-theme=light] ._fast_c8a3q_14{color:#008f4d}[data-theme=light] ._medium_c8a3q_15{color:#b86b00}[data-theme=light] ._slow_c8a3q_16{color:#c8143a}[data-theme=light] ._badge_c8a3q_19{color:#0e7490}[data-theme=light] ._runningCell_c8a3q_22{background:#7d00b414}._cell_1bcec_1{font-family:var(--font-mono);border-radius:4px;align-items:center;gap:4px;min-width:40px;padding:1px 3px;font-size:12px;font-weight:600;transition:background .2s;display:inline-flex}._fast_1bcec_14{color:#0f8}._slow_1bcec_15{color:#f44}._dim_1bcec_16{color:var(--color-text-dim)}._running_1bcec_17{color:#b400ff;font-weight:700}._badge_1bcec_18{color:#06b6d4;font-size:10px}._runningCell_1bcec_21{background:#b400ff1f}@keyframes _miniSpin_1bcec_29{to{transform:rotate(360deg)}}._miniSpinner_1bcec_29{border:1.5px solid #b400ff4d;border-top-color:#b400ff;border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.6s linear infinite _miniSpin_1bcec_29;display:inline-block}[data-theme=light] ._fast_1bcec_14{color:#008f4d}[data-theme=light] ._slow_1bcec_15{color:#c8143a}[data-theme=light] ._badge_1bcec_18{color:#0e7490}[data-theme=light] ._runningCell_1bcec_21{background:#7d00b414}._row_2hylr_13{max-width:100%;max-height:var(--pl-max-h,22px);color:var(--color-text);vertical-align:middle;align-items:center;gap:6px;line-height:1;display:inline-flex;overflow:hidden}._icon_2hylr_27{height:var(--pl-icon-h,16px);flex-shrink:0;justify-content:center;align-items:center;width:auto;display:inline-flex}._icon_2hylr_27 svg{width:auto;height:100%;display:block}._textLogo_2hylr_44{height:var(--pl-text-h,12px);flex-shrink:0;justify-content:center;align-items:center;width:auto;display:inline-flex}._textLogo_2hylr_44 svg{width:auto;height:100%;display:block}._iconLegacyWordmark_2hylr_63{height:var(--pl-icon-h,14px);width:auto;color:var(--color-text);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}._iconLegacyWordmark_2hylr_63 svg{width:auto;height:100%;display:block}.scalewayLogo{color:#521094;transition:color .2s var(--ease-out,ease)}[data-theme=dark] .scalewayLogo{color:#a78bfa}._fallback_2hylr_96{color:var(--color-text);white-space:nowrap;letter-spacing:.2px;font-size:11px;font-weight:500}._container_jqpk4_8{background:var(--color-bg-card);border-top:0;border-bottom:1px solid var(--color-border);border-left:0;border-right:0;border-radius:0;flex-direction:column;flex:1;min-height:0;margin:0;display:flex;overflow:auto}._table_jqpk4_23{border-collapse:collapse;border:0;width:100%;min-width:1200px;font-size:12px}._th_jqpk4_32{text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);background:var(--color-bg-elevated);border-bottom:1px solid var(--color-border-hover);border-right:1px solid var(--color-border);white-space:nowrap;-webkit-user-select:none;user-select:none;z-index:10;text-align:center;padding:9px 8px;font-size:10px;font-weight:700;position:sticky;top:0}._th_jqpk4_32:last-child{border-right:0}._th_jqpk4_32:hover{color:var(--color-accent);background:var(--color-bg-active)}._thInner_jqpk4_59{justify-content:space-between;align-items:center;gap:4px;width:100%;min-width:0;display:flex}._thLabel_jqpk4_67{text-overflow:ellipsis;white-space:nowrap;flex:1;align-items:center;gap:4px;min-width:0;display:inline-flex;overflow:hidden}._resizeHandle_jqpk4_81{cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;width:6px;height:22px;margin-left:2px;display:inline-flex;position:relative}._resizeHandle_jqpk4_81:after{content:"";width:2px;height:14px;transition:background .12s var(--ease-out,ease);background:0 0;border-radius:1px;display:block}._resizeHandle_jqpk4_81:hover:after,._resizeHandleActive_jqpk4_106:after{background:var(--color-accent)}._resizeHandleActive_jqpk4_106{cursor:col-resize}._th_jqpk4_32:has(._resizeHandleActive_jqpk4_106){background:var(--color-bg-active);color:var(--color-accent)}.col-resizing{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}._resizeToolbar_jqpk4_125{background:var(--color-bg-elevated);border-bottom:1px solid var(--color-border);color:var(--color-text-muted);z-index:11;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;font-size:11px;display:flex;position:sticky;top:0}._resizeToolbarHint_jqpk4_139{letter-spacing:.2px;align-items:center;gap:4px;display:inline-flex}._resizeToolbarHint_jqpk4_139 strong{color:var(--color-text);font-weight:700;font-family:var(--font-mono)}._resizeResetButton_jqpk4_150{appearance:none;border:1px solid var(--color-border-hover);color:var(--color-text-muted);cursor:pointer;transition:background .12s var(--ease-out,ease), color .12s var(--ease-out,ease), border-color .12s var(--ease-out,ease);white-space:nowrap;background:0 0;border-radius:4px;padding:3px 10px;font-size:11px;font-weight:600}._resizeResetButton_jqpk4_150:hover{background:var(--color-bg-active);color:var(--color-accent);border-color:var(--color-accent)}._resizeResetButton_jqpk4_150:focus-visible{outline:2px solid var(--color-accent);outline-offset:1px}._th_jqpk4_32:nth-child(6),._th_jqpk4_32:nth-child(7),._th_jqpk4_32:nth-child(11){text-align:left}._sortIcon_jqpk4_179{opacity:.3;margin-left:3px;font-size:9px}._sortIconActive_jqpk4_180{color:var(--color-accent);margin-left:3px;font-size:10px;font-weight:800}._td_jqpk4_183{border-bottom:1px solid var(--color-border);border-right:1px solid var(--color-border);white-space:nowrap;padding:7px 8px}._td_jqpk4_183:last-child{border-right:0}._td_jqpk4_183:nth-child(6),._td_jqpk4_183:nth-child(7),._td_jqpk4_183:nth-child(11){text-align:left}._table_jqpk4_23 tbody tr{cursor:pointer;transition:background .1s}._table_jqpk4_23 tbody tr:hover{background:var(--color-bg-hover)}._rank1_jqpk4_202 td:first-child{border-left:3px solid gold}._rank2_jqpk4_203 td:first-child{border-left:3px solid silver}._rank3_jqpk4_204 td:first-child{border-left:3px solid #cd7f32}._rankNum_jqpk4_207{font-family:var(--font-mono);color:var(--color-text-dim);text-align:center;font-size:11px;display:block}._swe_jqpk4_215{font-family:var(--font-mono);font-weight:600}._sweHigh_jqpk4_216{color:gold}._sweMid_jqpk4_217{color:#3ddc84}._sweLow_jqpk4_218{color:var(--color-text-dim)}._ctx_jqpk4_220{font-family:var(--font-mono);font-size:11px}._ping_jqpk4_222{font-family:var(--font-mono);font-weight:600}._pingFast_jqpk4_223{color:#0f8}._pingMedium_jqpk4_224{color:#fa0}._pingSlow_jqpk4_225{color:#f44}._pingNone_jqpk4_226{color:var(--color-text-dim)}[data-theme=light] ._sweHigh_jqpk4_216{color:#7a5e00}[data-theme=light] ._sweMid_jqpk4_217{color:#1f7a3e}[data-theme=light] ._pingFast_jqpk4_223{color:#008f4d}[data-theme=light] ._pingMedium_jqpk4_224{color:#b86b00}[data-theme=light] ._pingSlow_jqpk4_225{color:#c8143a}._uptime_jqpk4_235{font-family:var(--font-mono);font-size:11px}._modelCell_jqpk4_238{align-items:center;gap:6px;display:flex;overflow:hidden}._modelMeta_jqpk4_239{flex:1;min-width:0}._modelHeader_jqpk4_240{align-items:center;gap:5px;display:flex}._modelName_jqpk4_241{white-space:nowrap;text-overflow:ellipsis;font-size:12px;font-weight:600;overflow:hidden}._modelId_jqpk4_242{font-family:var(--font-mono);color:var(--color-text-dim);white-space:nowrap;text-overflow:ellipsis;font-size:9px;overflow:hidden}@keyframes _benchRowPulse_jqpk4_1{0%,to{background:#b400ff0a}50%{background:#b400ff1a}}._benchRow_jqpk4_253{animation:1.2s ease-in-out infinite _benchRowPulse_jqpk4_1}[data-theme=light] ._container_jqpk4_8,[data-theme=light] ._table_jqpk4_23{border-color:#cfcfcf}[data-theme=light] ._th_jqpk4_32,[data-theme=light] ._td_jqpk4_183{border-color:#d8d8d8}._empty_jqpk4_271{text-align:center;color:var(--color-text-muted);padding:60px 0}._favBtn_jqpk4_274{width:24px;height:24px;color:var(--color-text-dim);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;transition:color .12s,background .12s,transform .12s;display:inline-flex}._favBtn_jqpk4_274:hover{color:gold;background:#ffd7001a;transform:scale(1.1)}._favBtnActive_jqpk4_289{color:gold}._favBtnActive_jqpk4_289:hover{color:#ffae00;background:#ffae0024}[data-theme=light] ._favBtn_jqpk4_274{color:#999}[data-theme=light] ._favBtn_jqpk4_274:hover{color:#b08800;background:#b088001a}[data-theme=light] ._favBtnActive_jqpk4_289{color:#b08800}._aiLatencyWrap_jqpk4_301{cursor:pointer;border-radius:4px;justify-content:center;align-items:center;gap:4px;padding:2px 4px;transition:background .1s;display:inline-flex;position:relative}._aiLatencyWrap_jqpk4_301:hover{background:#b400ff14}._aiLatencyWrap_jqpk4_301._aiLatencyRunning_jqpk4_312{cursor:progress}._aiLatencyWrap_jqpk4_301._aiLatencyRunning_jqpk4_312:hover{background:0 0}._aiLatencyPlay_jqpk4_314{opacity:0;color:#b400ff;transition:opacity .1s}._aiLatencyWrap_jqpk4_301:hover ._aiLatencyPlay_jqpk4_314{opacity:1}._aiLatencyRunning_jqpk4_312 ._aiLatencyPlay_jqpk4_314{display:none}._incompatible_jqpk4_323 td{color:var(--color-text-muted)!important;background:#ff00000f!important}._incompatible_jqpk4_323:hover td{background:#ff00001a!important}[data-theme=light] ._incompatible_jqpk4_323 td{color:#888!important;background:#c8143a0f!important}._panel_14usx_1{z-index:300;background:var(--color-bg-elevated);border-left:1px solid var(--color-border);width:min(420px,90vw);box-shadow:var(--shadow-lg);transition:transform var(--transition-medium);position:fixed;top:0;bottom:0;right:0;overflow-y:auto;transform:translate(100%)}._header_14usx_16{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:20px 24px;display:flex}._title_14usx_24{margin:0;font-size:16px;font-weight:700}._closeBtn_14usx_30{color:var(--color-text-muted);cursor:pointer;background:0 0;border:none;font-size:22px;line-height:1}._closeBtn_14usx_30:hover{color:var(--color-text)}._body_14usx_43{padding:24px}._stat_14usx_47{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:10px 0;display:flex}._statLabel_14usx_55{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px;font-size:12px;font-weight:600}._statValue_14usx_63,._ping_14usx_68{font-family:var(--font-mono);font-weight:600}._pingFast_14usx_73{color:#0f8}._pingMedium_14usx_74{color:#fa0}._pingSlow_14usx_75{color:#f44}._pingNone_14usx_76{color:var(--color-text-dim)}[data-theme=light] ._pingFast_14usx_73{color:#008f4d}[data-theme=light] ._pingMedium_14usx_74{color:#b86b00}[data-theme=light] ._pingSlow_14usx_75{color:#c8143a}._chart_14usx_82{background:var(--color-surface);border-radius:var(--radius-md);border:1px solid var(--color-border);margin:20px 0;padding:16px}._chartTitle_14usx_90{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.8px;margin-bottom:12px;font-size:11px;font-weight:700}._chartEmpty_14usx_99{color:var(--color-text-dim);text-align:center;padding:20px}._actions_14usx_106{background:var(--color-surface);border-radius:var(--radius-md);border:1px solid var(--color-border);flex-direction:column;gap:10px;margin:16px 0;padding:12px;display:flex}._favBlock_14usx_117{flex-direction:column;gap:8px;display:flex}._favBtn_14usx_123{background:var(--color-bg-card);color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;text-align:left;border-radius:6px;align-items:center;gap:8px;padding:8px 12px;font-size:12px;font-weight:600;transition:all .15s;display:inline-flex}._favBtn_14usx_123:hover{color:gold;background:#ffd70014;border-color:gold}._favBtnActive_14usx_143{color:gold;background:#ffd7001f;border-color:gold}._favBtnActive_14usx_143:hover{background:#ffd70029}[data-theme=light] ._favBtn_14usx_123{color:#555}[data-theme=light] ._favBtn_14usx_123:hover{color:#b08800;background:#b088000f;border-color:#b08800}[data-theme=light] ._favBtnActive_14usx_143{color:#b08800;background:#b088001a;border-color:#b08800}._reorderRow_14usx_155{align-items:center;gap:6px;padding:0 4px;display:flex}._reorderBtn_14usx_161{font-size:10px;font-weight:600;font-family:var(--font-mono);background:var(--color-bg-card);color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;border-radius:4px;align-items:center;gap:3px;padding:4px 8px;transition:all .12s;display:inline-flex}._reorderBtn_14usx_161:hover:not(:disabled){background:var(--color-bg-hover);color:var(--color-text);border-color:var(--color-text-muted)}._reorderBtn_14usx_161:disabled{opacity:.4;cursor:not-allowed}._rankBadge_14usx_185{font-size:10px;font-family:var(--font-mono);color:gold;background:#ffd7001f;border:1px solid #ffd7004d;border-radius:999px;margin-left:auto;padding:2px 6px;font-weight:700}[data-theme=light] ._rankBadge_14usx_185{color:#b08800;background:#b088001f;border-color:#b088004d}._benchBtn_14usx_202{font-size:12px;font-weight:700;font-family:var(--font-mono);color:#b400ff;cursor:pointer;background:#b400ff1f;border:1px solid #b400ff66;border-radius:6px;justify-content:center;align-items:center;gap:6px;padding:8px 12px;transition:all .15s;display:inline-flex}._benchBtn_14usx_202:hover{background:#b400ff33;border-color:#b400ffb3}[data-theme=light] ._benchBtn_14usx_202{color:#6a00a0;background:#8c00c80f;border-color:#8c00c84d}[data-theme=light] ._benchBtn_14usx_202:hover{background:#8c00c81f}._overlay_1e3f5_1{z-index:1000;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#0009;justify-content:center;align-items:center;animation:.2s ease-out _fadeIn_1e3f5_1;display:flex;position:fixed;inset:0}._overlay_1e3f5_1[hidden]{display:none}@keyframes _fadeIn_1e3f5_1{0%{opacity:0}to{opacity:1}}._modal_1e3f5_18{background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:var(--radius-xl);width:min(500px,90vw);max-height:80vh;box-shadow:var(--shadow-lg);animation:_modalSlideIn_1e3f5_1 .3s var(--ease-out);overflow-y:auto}@keyframes _modalSlideIn_1e3f5_1{0%{opacity:0;transform:translateY(20px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}._modalHeader_1e3f5_33{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:20px 24px;display:flex}._modalTitle_1e3f5_40{margin:0;font-size:18px;font-weight:700}._modalClose_1e3f5_45{color:var(--color-text-muted);cursor:pointer;background:0 0;border:none;padding:0;font-size:24px;line-height:1}._modalClose_1e3f5_45:hover{color:var(--color-text)}._modalBody_1e3f5_57{padding:24px}._options_1e3f5_60{flex-direction:column;gap:10px;display:flex}._option_1e3f5_60{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);cursor:pointer;transition:all var(--transition-fast);text-align:left;font-family:var(--font-sans);color:var(--color-text);align-items:center;gap:14px;width:100%;padding:14px 18px;display:flex}._option_1e3f5_60:hover{border-color:var(--color-accent);background:var(--color-accent-dim)}._optionIcon_1e3f5_84{flex-shrink:0;font-size:24px}._optionLabel_1e3f5_89{font-size:14px;font-weight:600;display:block}._optionDesc_1e3f5_94{color:var(--color-text-muted);margin-top:2px;font-size:11px;display:block}._page_1oolq_1{padding:24px}._pageHeader_1oolq_5{margin-bottom:24px}._pageTitle_1oolq_9{margin:0 0 6px;font-size:24px;font-weight:800}._pageSubtitle_1oolq_15{color:var(--color-text-muted);margin:0;font-size:13px;line-height:1.5}._pageSubtitle_1oolq_15 code{font-family:var(--font-mono);background:var(--color-surface);border-radius:4px;padding:2px 6px;font-size:12px}._loading_1oolq_30{text-align:center;color:var(--color-text-muted);padding:60px 0}._toolbar_1oolq_36{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:20px;display:flex}._toolbarSearch_1oolq_44{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1;align-items:center;gap:8px;min-width:200px;height:36px;padding:0 12px;display:flex}._toolbarSearch_1oolq_44 svg{color:var(--color-text-dim);flex-shrink:0}._toolbarSearch_1oolq_44 input{color:var(--color-text);font-size:13px;font-family:var(--font-sans);background:0 0;border:none;outline:none;flex:1}._toolbarSearch_1oolq_44 input::placeholder{color:var(--color-text-dim)}._toolbarActions_1oolq_76{gap:8px;display:flex}._toolbarBtn_1oolq_81{border:1px solid var(--color-border);border-radius:var(--radius-sm);cursor:pointer;background:var(--color-surface);color:var(--color-text);transition:all var(--transition-fast);font-size:13px;font-weight:500;font-family:var(--font-sans);align-items:center;gap:6px;padding:6px 14px;display:inline-flex}._toolbarBtn_1oolq_81:hover{background:var(--color-bg-hover);border-color:var(--color-border-hover)}._providers_1oolq_102{flex-direction:column;gap:12px;display:flex}._card_1oolq_108{background:var(--color-bg-card);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--color-border);border-radius:var(--radius-lg);transition:border-color var(--transition-fast);overflow:hidden}._card_1oolq_108:hover{border-color:var(--color-border-hover)}._cardHeader_1oolq_121{cursor:pointer;transition:background var(--transition-fast);align-items:center;gap:12px;padding:16px 20px;display:flex}._cardHeader_1oolq_121:hover{background:var(--color-bg-hover)}._cardIcon_1oolq_134{border-radius:var(--radius-sm);background:var(--color-accent-dim);flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;font-size:18px;display:flex}._cardInfo_1oolq_146{flex:1;min-width:0}._cardName_1oolq_151{font-size:14px;font-weight:700}._cardMeta_1oolq_156{color:var(--color-text-muted);margin-top:2px;font-size:11px}._cardStatus_1oolq_162{border-radius:999px;flex-shrink:0;padding:3px 10px;font-size:11px;font-weight:700}._statusConfigured_1oolq_170{background:var(--color-success-dim);color:var(--color-success)}._statusMissing_1oolq_175{background:var(--color-warning-dim);color:var(--color-warning)}._toggleIcon_1oolq_180{color:var(--color-text-dim);transition:transform var(--transition-fast);flex-shrink:0;font-size:18px}._toggleIconExpanded_1oolq_187{transform:rotate(180deg)}._cardBody_1oolq_191{max-height:0;transition:max-height var(--transition-medium);border-top:0 solid #0000;overflow:hidden}._cardExpanded_1oolq_198 ._cardBody_1oolq_191{border-top:1px solid var(--color-border);max-height:500px}._cardContent_1oolq_203{padding:16px 20px}._keyGroup_1oolq_207{margin-bottom:12px}._keyLabel_1oolq_211{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;font-size:11px;font-weight:600;display:block}._keyDisplay_1oolq_221{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-sm);align-items:center;gap:8px;margin-bottom:8px;padding:8px 12px;display:flex}._keyDisplayValue_1oolq_232{font-family:var(--font-mono);color:var(--color-text-muted);word-break:break-all;flex:1;font-size:13px}._keyDisplayActions_1oolq_240{flex-shrink:0;gap:4px;display:flex}._actionBtn_1oolq_246{border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);cursor:pointer;transition:all var(--transition-fast);justify-content:center;align-items:center;padding:4px 8px;font-size:12px;display:inline-flex}._actionBtn_1oolq_246:hover{background:var(--color-bg-hover)}._actionBtnDanger_1oolq_264{background:var(--color-danger-dim);color:var(--color-danger);border-color:#f443}._actionBtnDanger_1oolq_264:hover{background:#f443}._keyInputRow_1oolq_274{align-items:center;gap:8px;display:flex}._keyInput_1oolq_274{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:13px;font-family:var(--font-mono);color:var(--color-text);transition:border-color var(--transition-fast);outline:none;flex:1;padding:8px 12px}._keyInput_1oolq_274:focus{border-color:var(--color-accent)}._keyInput_1oolq_274::placeholder{color:var(--color-text-dim)}._saveBtn_1oolq_301{border-radius:var(--radius-sm);background:var(--color-success-dim);color:var(--color-success);cursor:pointer;font-size:13px;font-weight:600;font-family:var(--font-sans);transition:all var(--transition-fast);border:1px solid #0f83;align-items:center;gap:6px;padding:8px 14px;display:inline-flex}._saveBtn_1oolq_301:hover{background:#00ff8826}._enabledRow_1oolq_321{border-top:1px solid var(--color-border);justify-content:space-between;align-items:center;margin-top:12px;padding-top:12px;display:flex}._enabledLabel_1oolq_330{color:var(--color-text-muted);font-size:12px;font-weight:500}._toggleSwitch_1oolq_336{cursor:pointer;width:44px;height:24px;position:relative}._toggleSwitch_1oolq_336 input{display:none}._toggleSlider_1oolq_347{background:var(--color-surface);border:1px solid var(--color-border);transition:all var(--transition-fast);border-radius:12px;position:absolute;inset:0}._toggleSlider_1oolq_347:after{content:"";background:var(--color-text-dim);width:16px;height:16px;transition:all var(--transition-fast);border-radius:50%;position:absolute;top:3px;left:3px}._toggleSwitch_1oolq_336 input:checked+._toggleSlider_1oolq_347{background:var(--color-accent-dim);border-color:var(--color-accent)}._toggleSwitch_1oolq_336 input:checked+._toggleSlider_1oolq_347:after{background:var(--color-accent);transform:translate(20px)}._page_1n8f8_1{padding:24px}._pageHeader_1n8f8_5{margin-bottom:24px}._pageTitle_1n8f8_9{margin:0 0 6px;font-size:24px;font-weight:800}._pageSubtitle_1n8f8_15{color:var(--color-text-muted);margin:0;font-size:13px}._grid_1n8f8_21{grid-template-columns:repeat(2,1fr);gap:16px;display:grid}._card_1n8f8_27{background:var(--color-bg-card);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:20px;overflow:hidden}._cardWide_1n8f8_36{grid-column:span 2}._cardTitle_1n8f8_40{margin:0 0 16px;font-size:14px;font-weight:700}._empty_1n8f8_49{color:var(--color-text-dim);text-align:center;padding:20px 0}._healthItem_1n8f8_55{border-bottom:1px solid var(--color-border);align-items:center;gap:12px;padding:8px 0;display:flex}._healthItem_1n8f8_55:last-child{border-bottom:none}._healthName_1n8f8_67{flex-shrink:0;width:120px;font-size:12px;font-weight:600}._healthBar_1n8f8_74{background:var(--color-surface);border-radius:4px;flex:1;height:8px;overflow:hidden}._healthFill_1n8f8_82{background:linear-gradient(90deg, var(--color-accent), var(--color-success));height:100%;transition:width var(--transition-medium);border-radius:4px}._healthPct_1n8f8_89{text-align:right;width:40px;font-family:var(--font-mono);font-size:12px;font-weight:600}._pctFast_1n8f8_97{color:#0f8}._pctMedium_1n8f8_98{color:#fa0}._pctSlow_1n8f8_99{color:#f44}[data-theme=light] ._pctFast_1n8f8_97{color:#008f4d}[data-theme=light] ._pctMedium_1n8f8_98{color:#b86b00}[data-theme=light] ._pctSlow_1n8f8_99{color:#c8143a}._leaderItem_1n8f8_105{border-bottom:1px solid var(--color-border);align-items:center;gap:10px;padding:8px 0;display:flex}._leaderItem_1n8f8_105:last-child{border-bottom:none}._leaderRank_1n8f8_117{background:var(--color-surface);width:28px;height:28px;color:var(--color-text-dim);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:flex}._rank1_1n8f8_131{color:gold;background:#ffd70026}._rank2_1n8f8_132{color:silver;background:#c0c0c026}._rank3_1n8f8_133{color:#cd7f32;background:#cd7f3226}._leaderName_1n8f8_135{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;font-weight:600;overflow:hidden}._leaderLatency_1n8f8_145{font-family:var(--font-mono);color:var(--color-success);flex-shrink:0;font-size:12px;font-weight:600}._tierItem_1n8f8_153{align-items:center;gap:10px;padding:6px 0;display:flex}._tierBadge_1n8f8_160{flex-shrink:0;width:40px}._tierBar_1n8f8_165{background:var(--color-surface);border-radius:5px;flex:1;height:10px;overflow:hidden}._tierFill_1n8f8_173{height:100%;transition:width var(--transition-medium);border-radius:5px}._tierCount_1n8f8_179{text-align:right;width:30px;font-family:var(--font-mono);color:var(--color-text-muted);font-size:12px}@media (width<=1024px){._grid_1n8f8_21{grid-template-columns:1fr}._cardWide_1n8f8_36{grid-column:span 1}}._backdrop_162pr_6{-webkit-backdrop-filter:blur(4px);z-index:500;background:#0000008c;justify-content:center;align-items:flex-start;padding-top:12vh;display:flex;position:fixed;inset:0}._modal_162pr_19{background:var(--color-bg-elevated);border:1px solid var(--color-border-hover);border-radius:14px;flex-direction:column;width:min(560px,92vw);max-height:70vh;display:flex;overflow:hidden;box-shadow:0 24px 64px #00000080}._searchRow_162pr_31{border-bottom:1px solid var(--color-border);align-items:center;gap:10px;padding:14px 16px;display:flex}._searchIcon_162pr_38{color:var(--color-text-dim);flex-shrink:0}._input_162pr_39{color:var(--color-text);font-size:15px;font-family:var(--font-sans);background:0 0;border:none;outline:none;flex:1}._input_162pr_39::placeholder{color:var(--color-text-dim)}._kbd_162pr_49{font-size:10px;font-family:var(--font-mono);color:var(--color-text-dim);background:var(--color-surface);border:1px solid var(--color-border);border-radius:4px;align-items:center;gap:2px;padding:2px 6px;display:inline-flex}._list_162pr_62{flex:1;margin:0;padding:6px;list-style:none;overflow-y:auto}._item_162pr_70{cursor:pointer;color:var(--color-text);-webkit-user-select:none;user-select:none;border-radius:7px;align-items:center;gap:10px;padding:9px 12px;font-size:13px;transition:background 80ms;display:flex}._itemActive_162pr_82{background:var(--color-accent-dim)}._itemDisabled_162pr_83{cursor:not-allowed;opacity:.5}._itemDisabled_162pr_83:hover{background:0 0}._itemIcon_162pr_88{color:var(--color-text-muted);flex-shrink:0}._itemLabel_162pr_89{flex:1}._itemEnter_162pr_90{color:var(--color-text-dim);font-size:11px;font-family:var(--font-mono)}._empty_162pr_96{text-align:center;color:var(--color-text-dim);padding:20px;font-size:13px}._footer_162pr_103{border-top:1px solid var(--color-border);color:var(--color-text-dim);background:var(--color-bg-card);gap:16px;padding:8px 16px;font-size:11px;display:flex}._footer_162pr_103 kbd{font-family:var(--font-mono);background:var(--color-surface);border:1px solid var(--color-border);border-radius:3px;margin-right:3px;padding:1px 5px;font-size:10px;display:inline-block}._container_18l8h_1{z-index:10000;pointer-events:none;flex-direction:column;gap:8px;display:flex;position:fixed;top:20px;right:20px}._toast_73ezc_1{pointer-events:auto;border-radius:var(--radius-md,10px);background:var(--color-bg-elevated);border:1px solid var(--color-border);box-shadow:var(--shadow-lg);align-items:center;gap:10px;min-width:280px;max-width:420px;padding:12px 18px;font-size:13px;font-weight:500;animation:.3s cubic-bezier(.16,1,.3,1) _slideIn_73ezc_1;display:flex}._success_73ezc_17{border-left:4px solid #0f8}._error_73ezc_18{border-left:4px solid #f44}._warning_73ezc_19{border-left:4px solid #fa0}._info_73ezc_20{border-left:4px solid #06b6d4}[data-theme=light] ._success_73ezc_17{border-left-color:#008f4d}[data-theme=light] ._error_73ezc_18{border-left-color:#c8143a}[data-theme=light] ._warning_73ezc_19{border-left-color:#b86b00}[data-theme=light] ._info_73ezc_20{border-left-color:#0e7490}._icon_73ezc_27{flex-shrink:0;font-size:18px}._message_73ezc_28{flex:1}._close_73ezc_29{color:var(--color-text-dim);cursor:pointer;background:0 0;border:none;padding:0;font-size:16px;line-height:1}._exiting_73ezc_38{animation:.3s cubic-bezier(.16,1,.3,1) forwards _slideOut_73ezc_1}@keyframes _slideIn_73ezc_1{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes _slideOut_73ezc_1{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(100%)}}:root{--color-brand:#76b900;--color-bg:#000;--color-bg-elevated:#0a0a0a;--color-bg-card:#0a0a0a;--color-bg-hover:#161616;--color-bg-active:#222;--color-surface:#111;--color-border:#262626;--color-border-hover:#404040;--color-text:#fff;--color-text-muted:#888;--color-text-dim:#444;--color-accent:#fff;--color-accent-hover:#eaeaea;--color-accent-glow:#ffffff1a;--color-accent-dim:#ffffff0d;--color-danger:#f44;--color-danger-dim:#ff44441a;--color-warning:#fa0;--color-warning-dim:#ffaa001a;--color-success:#0f8;--color-success-dim:#00ff881a;--color-info:#06b6d4;--color-info-dim:#06b6d41a;--tier-splus:gold;--tier-s:#ff8c00;--tier-aplus:#00c8ff;--tier-a:#3ddc84;--tier-aminus:#7ecf7e;--tier-bplus:#a8a8c8;--tier-b:#808098;--tier-c:#606078;--verdict-perfect:#0f8;--verdict-normal:#76b900;--verdict-slow:#fa0;--verdict-spiky:#f60;--verdict-veryslow:#f44;--verdict-overloaded:#f22;--verdict-unstable:#c00;--verdict-notactive:#555570;--verdict-pending:#444460;--font-sans:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono:"JetBrains Mono", "Fira Code", "Cascadia Code", monospace;--header-h:60px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:8px;--shadow-sm:none;--shadow-md:none;--shadow-lg:none;--shadow-glow:none;--ease-out:cubic-bezier(.16, 1, .3, 1);--transition-fast:.15s var(--ease-out);--transition-medium:.25s var(--ease-out);--transition-slow:.4s var(--ease-out)}[data-theme=light]{--color-bg:#fff;--color-bg-elevated:#fff;--color-bg-card:#fff;--color-bg-hover:#fafafa;--color-bg-active:#f0f0f0;--color-surface:#fafafa;--color-border:#eaeaea;--color-border-hover:#d5d5d5;--color-text:#000;--color-text-muted:#666;--color-text-dim:#999;--color-accent:#000;--color-accent-hover:#333;--color-accent-glow:#0000000d;--color-accent-dim:#00000005;--color-success:#008f4d;--color-warning:#b86b00;--color-danger:#c8143a;--color-info:#0e7490;--color-danger-dim:#c8143a14;--color-warning-dim:#b86b0014;--color-success-dim:#008f4d14;--color-info-dim:#0e749014;--tier-splus:#b08800;--tier-s:#c45a00;--tier-aplus:#0073a8;--tier-a:#1f7a3e;--tier-aminus:#2f7a2f;--tier-bplus:#5a5a8a;--tier-b:#556;--tier-c:#6a6a7a;--verdict-perfect:#008f4d;--verdict-normal:#4a7a00;--verdict-slow:#b86b00;--verdict-spiky:#c45000;--verdict-veryslow:#c8143a;--verdict-overloaded:#b8101f;--verdict-unstable:#900;--verdict-notactive:#6a6a7a;--verdict-pending:#6a6a8a;--shadow-sm:none;--shadow-md:none;--shadow-lg:none}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px}body{font-family:var(--font-sans);background:var(--color-bg);color:var(--color-text);flex-direction:column;min-height:100vh;display:flex;position:relative;overflow-x:hidden}a{color:var(--color-accent);text-decoration:none}a:hover{color:var(--color-accent-hover)}code{font-family:var(--font-mono);background:var(--color-surface);border-radius:4px;padding:2px 6px;font-size:12px}.bg-grid,.bg-glow{display:none}[data-theme=light] .bg-glow{opacity:.12}[data-theme=light] .bg-grid{background-image:linear-gradient(#0000000a 1px,#0000 1px),linear-gradient(90deg,#0000000a 1px,#0000 1px)}.app-shell{z-index:1;flex-direction:column;flex:1;width:100%;min-height:100vh;display:flex;position:relative}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-bg)}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-dim)}::-webkit-scrollbar-corner{background:var(--color-bg)}.app-content{z-index:1;min-height:calc(100vh - var(--header-h));flex-direction:column;flex:1;display:flex;position:relative}.view{flex-direction:column;flex:1;min-height:0;display:flex}
Binary file
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <browserconfig>
3
+ <msapplication>
4
+ <tile>
5
+ <square70x70logo src="/favicons/mstile-70x70.png"/>
6
+ <square150x150logo src="/favicons/mstile-150x150.png"/>
7
+ <wide310x150logo src="/favicons/mstile-310x150.png"/>
8
+ <square310x310logo src="/favicons/mstile-310x310.png"/>
9
+ <TileColor>#0a0a0a</TileColor>
10
+ </tile>
11
+ </msapplication>
12
+ </browserconfig>
Binary file
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "free-coding-models — Live Dashboard",
3
+ "short_name": "FCM",
4
+ "description": "Find the fastest free coding LLM model in seconds.",
5
+ "start_url": "/",
6
+ "scope": "/",
7
+ "display": "standalone",
8
+ "orientation": "any",
9
+ "background_color": "#0a0a0a",
10
+ "theme_color": "#0a0a0a",
11
+ "icons": [
12
+ {
13
+ "src": "/favicons/favicon-192x192.png",
14
+ "sizes": "192x192",
15
+ "type": "image/png",
16
+ "purpose": "any maskable"
17
+ },
18
+ {
19
+ "src": "/favicons/favicon-512x512.png",
20
+ "sizes": "512x512",
21
+ "type": "image/png",
22
+ "purpose": "any maskable"
23
+ }
24
+ ]
25
+ }
@@ -5,14 +5,53 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>free-coding-models — Live Dashboard</title>
7
7
  <meta name="description" content="Find the fastest free coding LLM model in seconds. Live dashboard monitoring 230+ models across 24 providers.">
8
+
9
+ <!-- 📖 Favicon set, all generated from the project root /icon.png -->
10
+ <!-- ── Modern browsers (SVG-free, but each surface gets its own size) ── -->
11
+ <link rel="icon" type="image/x-icon" href="/favicon.ico">
12
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png">
13
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png">
14
+ <link rel="icon" type="image/png" sizes="48x48" href="/favicons/favicon-48x48.png">
15
+ <link rel="icon" type="image/png" sizes="96x96" href="/favicons/favicon-96x96.png">
16
+ <link rel="icon" type="image/png" sizes="192x192" href="/favicons/favicon-192x192.png">
17
+ <link rel="icon" type="image/png" sizes="512x512" href="/favicons/favicon-512x512.png">
18
+
19
+ <!-- ── Apple iOS home screen ── -->
20
+ <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png">
21
+
22
+ <!-- ── PWA / Android Chrome / installable ── -->
23
+ <link rel="manifest" href="/favicons/site.webmanifest">
24
+ <meta name="theme-color" content="#0a0a0a" media="(prefers-color-scheme: dark)">
25
+ <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
26
+ <meta name="apple-mobile-web-app-title" content="FCM">
27
+ <meta name="apple-mobile-web-app-capable" content="yes">
28
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
29
+ <meta name="application-name" content="FCM">
30
+ <meta name="mobile-web-app-capable" content="yes">
31
+ <meta name="format-detection" content="telephone=no">
32
+
33
+ <!-- ── Microsoft Windows tiles ── -->
34
+ <meta name="msapplication-TileColor" content="#0a0a0a">
35
+ <meta name="msapplication-TileImage" content="/favicons/mstile-150x150.png">
36
+ <meta name="msapplication-config" content="/favicons/browserconfig.xml">
37
+
38
+ <!-- ── Open Graph / social previews ── -->
39
+ <meta property="og:title" content="free-coding-models — Live Dashboard">
40
+ <meta property="og:description" content="Find the fastest free coding LLM model in seconds.">
41
+ <meta property="og:type" content="website">
42
+ <meta property="og:image" content="/favicons/favicon-512x512.png">
43
+ <meta name="twitter:card" content="summary">
44
+ <meta name="twitter:title" content="free-coding-models — Live Dashboard">
45
+ <meta name="twitter:description" content="Find the fastest free coding LLM model in seconds.">
46
+ <meta name="twitter:image" content="/favicons/favicon-512x512.png">
47
+
8
48
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
49
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
50
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-ByGf4Kq-.js"></script>
12
- <link rel="stylesheet" crossorigin href="/assets/index-Ds7wmHBv.css">
51
+ <script type="module" crossorigin src="/assets/index-BoWmUveV.js"></script>
52
+ <link rel="stylesheet" crossorigin href="/assets/index-BrpHevg4.css">
13
53
  </head>
14
54
  <body>
15
55
  <div id="root"></div>
16
56
  </body>
17
57
  </html>
18
-
package/web/index.html CHANGED
@@ -5,6 +5,46 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>free-coding-models — Live Dashboard</title>
7
7
  <meta name="description" content="Find the fastest free coding LLM model in seconds. Live dashboard monitoring 230+ models across 24 providers.">
8
+
9
+ <!-- 📖 Favicon set, all generated from the project root /icon.png -->
10
+ <!-- ── Modern browsers (SVG-free, but each surface gets its own size) ── -->
11
+ <link rel="icon" type="image/x-icon" href="/favicon.ico">
12
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png">
13
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png">
14
+ <link rel="icon" type="image/png" sizes="48x48" href="/favicons/favicon-48x48.png">
15
+ <link rel="icon" type="image/png" sizes="96x96" href="/favicons/favicon-96x96.png">
16
+ <link rel="icon" type="image/png" sizes="192x192" href="/favicons/favicon-192x192.png">
17
+ <link rel="icon" type="image/png" sizes="512x512" href="/favicons/favicon-512x512.png">
18
+
19
+ <!-- ── Apple iOS home screen ── -->
20
+ <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png">
21
+
22
+ <!-- ── PWA / Android Chrome / installable ── -->
23
+ <link rel="manifest" href="/favicons/site.webmanifest">
24
+ <meta name="theme-color" content="#0a0a0a" media="(prefers-color-scheme: dark)">
25
+ <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
26
+ <meta name="apple-mobile-web-app-title" content="FCM">
27
+ <meta name="apple-mobile-web-app-capable" content="yes">
28
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
29
+ <meta name="application-name" content="FCM">
30
+ <meta name="mobile-web-app-capable" content="yes">
31
+ <meta name="format-detection" content="telephone=no">
32
+
33
+ <!-- ── Microsoft Windows tiles ── -->
34
+ <meta name="msapplication-TileColor" content="#0a0a0a">
35
+ <meta name="msapplication-TileImage" content="/favicons/mstile-150x150.png">
36
+ <meta name="msapplication-config" content="/favicons/browserconfig.xml">
37
+
38
+ <!-- ── Open Graph / social previews ── -->
39
+ <meta property="og:title" content="free-coding-models — Live Dashboard">
40
+ <meta property="og:description" content="Find the fastest free coding LLM model in seconds.">
41
+ <meta property="og:type" content="website">
42
+ <meta property="og:image" content="/favicons/favicon-512x512.png">
43
+ <meta name="twitter:card" content="summary">
44
+ <meta name="twitter:title" content="free-coding-models — Live Dashboard">
45
+ <meta name="twitter:description" content="Find the fastest free coding LLM model in seconds.">
46
+ <meta name="twitter:image" content="/favicons/favicon-512x512.png">
47
+
8
48
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
49
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
50
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
@@ -14,4 +54,3 @@
14
54
  <script type="module" src="/src/main.jsx"></script>
15
55
  </body>
16
56
  </html>
17
-
Binary file
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <browserconfig>
3
+ <msapplication>
4
+ <tile>
5
+ <square70x70logo src="/favicons/mstile-70x70.png"/>
6
+ <square150x150logo src="/favicons/mstile-150x150.png"/>
7
+ <wide310x150logo src="/favicons/mstile-310x150.png"/>
8
+ <square310x310logo src="/favicons/mstile-310x310.png"/>
9
+ <TileColor>#0a0a0a</TileColor>
10
+ </tile>
11
+ </msapplication>
12
+ </browserconfig>
Binary file
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "free-coding-models — Live Dashboard",
3
+ "short_name": "FCM",
4
+ "description": "Find the fastest free coding LLM model in seconds.",
5
+ "start_url": "/",
6
+ "scope": "/",
7
+ "display": "standalone",
8
+ "orientation": "any",
9
+ "background_color": "#0a0a0a",
10
+ "theme_color": "#0a0a0a",
11
+ "icons": [
12
+ {
13
+ "src": "/favicons/favicon-192x192.png",
14
+ "sizes": "192x192",
15
+ "type": "image/png",
16
+ "purpose": "any maskable"
17
+ },
18
+ {
19
+ "src": "/favicons/favicon-512x512.png",
20
+ "sizes": "512x512",
21
+ "type": "image/png",
22
+ "purpose": "any maskable"
23
+ }
24
+ ]
25
+ }
package/web/server.js CHANGED
@@ -30,6 +30,7 @@ import { Server } from 'socket.io'
30
30
 
31
31
  import { sources, MODELS } from '../sources.js'
32
32
  import { loadConfig, getApiKey, saveConfig, isProviderEnabled } from '../src/core/config.js'
33
+ import { ensureFavoritesConfig } from '../src/core/favorites.js'
33
34
  import { ping } from '../src/core/ping.js'
34
35
  import {
35
36
  getAvg, getVerdict, getUptime, getP95, getJitter,
@@ -350,6 +351,8 @@ const MIME_TYPES = {
350
351
  '.svg': 'image/svg+xml',
351
352
  '.png': 'image/png',
352
353
  '.ico': 'image/x-icon',
354
+ '.webmanifest': 'application/manifest+json',
355
+ '.xml': 'application/xml; charset=utf-8',
353
356
  }
354
357
 
355
358
  function serveFile(res, filename, contentType) {
@@ -366,6 +369,15 @@ function serveFile(res, filename, contentType) {
366
369
  function serveDistFile(res, pathname) {
367
370
  const filePath = join(__dirname, 'dist', pathname === '/' ? 'index.html' : pathname)
368
371
  if (!existsSync(filePath)) {
372
+ // 📖 SPA fallback: GETs to non-asset paths return index.html so the React
373
+ // 📖 router can take over. Static assets (favicons, /assets/*, anything
374
+ // 📖 with a known extension) must 404 — never serve HTML for a missing PNG.
375
+ const hasExt = extname(pathname) !== ''
376
+ if (hasExt || pathname.startsWith('/assets/') || pathname.startsWith('/favicons/')) {
377
+ res.writeHead(404)
378
+ res.end('Not Found')
379
+ return
380
+ }
369
381
  serveFile(res, 'dist/index.html', 'text/html; charset=utf-8')
370
382
  return
371
383
  }
@@ -617,6 +629,50 @@ async function handleRequest(req, res) {
617
629
  return
618
630
  }
619
631
 
632
+ // ── M1: /api/favorites — single source of truth for favorites, shared
633
+ // ── with the TUI through ~/.free-coding-models.json. Read on load,
634
+ // ── write on toggle/reorder/pinnedAndSticky changes.
635
+ case '/api/favorites': {
636
+ ensureFavoritesConfig(config)
637
+ if (req.method === 'GET') {
638
+ sendJson(res, 200, {
639
+ favorites: config.favorites,
640
+ pinnedAndSticky: Boolean(config.settings?.favoritesPinnedAndSticky),
641
+ })
642
+ return
643
+ }
644
+ if (req.method !== 'POST') {
645
+ res.writeHead(405)
646
+ res.end('Method Not Allowed')
647
+ return
648
+ }
649
+ const body = await readJsonBody(req)
650
+ noteUserActivity()
651
+
652
+ if (Array.isArray(body.favorites)) {
653
+ // 📖 Validate each entry is a non-empty string. Anything else is dropped
654
+ // 📖 silently so a partial / malformed payload never breaks the config.
655
+ const cleaned = body.favorites.filter((entry) => typeof entry === 'string' && entry.trim().length > 0)
656
+ config.favorites = Array.from(new Set(cleaned))
657
+ }
658
+ if (typeof body.pinnedAndSticky === 'boolean') {
659
+ if (!config.settings || typeof config.settings !== 'object') config.settings = {}
660
+ config.settings.favoritesPinnedAndSticky = body.pinnedAndSticky
661
+ }
662
+
663
+ const saveResult = saveConfig(config, { replaceFavorites: true })
664
+ if (!saveResult.success) {
665
+ sendJson(res, 500, { success: false, error: saveResult.error || 'Failed to persist favorites' })
666
+ return
667
+ }
668
+ sendJson(res, 200, {
669
+ success: true,
670
+ favorites: config.favorites,
671
+ pinnedAndSticky: Boolean(config.settings?.favoritesPinnedAndSticky),
672
+ })
673
+ return
674
+ }
675
+
620
676
  case '/api/benchmark': {
621
677
  if (req.method !== 'POST') {
622
678
  res.writeHead(405)
@@ -698,7 +754,21 @@ async function handleRequest(req, res) {
698
754
  }
699
755
 
700
756
  default:
701
- if (url.pathname.startsWith('/assets/') || url.pathname.endsWith('.js') || url.pathname.endsWith('.css')) {
757
+ // 📖 Serve Vite's /assets/* bundle, and our static favicon set that
758
+ // 📖 Vite copies verbatim from web/public/ into web/dist/. The legacy
759
+ // 📖 /favicon.ico lives at web/public/favicon.ico (root of public/).
760
+ if (
761
+ url.pathname.startsWith('/assets/')
762
+ || url.pathname.startsWith('/favicons/')
763
+ || url.pathname === '/favicon.ico'
764
+ || url.pathname.endsWith('.js')
765
+ || url.pathname.endsWith('.css')
766
+ || url.pathname.endsWith('.png')
767
+ || url.pathname.endsWith('.svg')
768
+ || url.pathname.endsWith('.webmanifest')
769
+ || url.pathname.endsWith('.xml')
770
+ || url.pathname.endsWith('.ico')
771
+ ) {
702
772
  serveDistFile(res, url.pathname)
703
773
  return
704
774
  }