zevairouter 1.0.145 → 1.0.146

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 (321) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +4 -4
  4. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  5. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  32. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  38. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  39. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  40. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  41. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  42. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  43. package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
  44. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  46. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
  47. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  48. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  49. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  50. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  60. package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
  61. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
  62. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  63. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
  64. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  65. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  66. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  67. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  68. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
  69. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  70. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  71. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  72. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
  77. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  78. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
  79. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  80. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  81. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  82. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  87. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  88. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
  89. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  90. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  91. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  92. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  97. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  98. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
  99. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  100. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  101. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  102. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  107. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  108. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +6 -6
  109. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  110. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  111. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  112. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +6 -6
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +4 -4
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +2 -2
  117. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  118. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
  119. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  120. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  121. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  122. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  127. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  128. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
  129. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  130. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  131. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  132. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  138. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  139. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
  140. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  141. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  142. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  143. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  148. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  149. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +6 -6
  150. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  151. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  152. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  153. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  154. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +6 -6
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +4 -4
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +2 -2
  158. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  159. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  160. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  161. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  162. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  163. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  164. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  168. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  169. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
  170. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  171. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  172. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  173. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  189. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  190. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
  191. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  192. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  193. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  194. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  195. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  199. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  200. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
  201. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  202. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  203. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  204. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  205. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +4 -4
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
  209. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  210. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
  211. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  212. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  213. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  214. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  215. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  219. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  220. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  221. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
  222. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  223. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  224. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  225. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  230. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  231. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  232. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  233. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  234. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  235. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  236. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +4 -4
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  240. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  241. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
  242. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  243. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  244. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  245. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  246. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  250. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  251. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
  252. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  253. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  254. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  255. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  256. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  260. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  261. package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
  262. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  263. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  264. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  265. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
  266. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  267. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
  268. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  269. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  270. package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
  271. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  272. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
  273. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  274. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
  275. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  276. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  277. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  278. package/cli/app/.next-cli-build/server/app/landing.rsc +5 -5
  279. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  280. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  281. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
  282. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  283. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  284. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  285. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  286. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  287. package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
  288. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
  289. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  290. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
  291. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  292. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  293. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  294. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  295. package/cli/app/.next-cli-build/server/app-paths-manifest.json +4 -4
  296. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  297. package/cli/app/.next-cli-build/server/chunks/412.js +1 -1
  298. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  299. package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
  300. package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
  301. package/cli/app/.next-cli-build/server/chunks/9621.js +1 -1
  302. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  303. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  304. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  305. package/cli/app/.next-cli-build/static/chunks/5497-7f6609cd427c6525.js +7 -0
  306. package/cli/app/.next-cli-build/static/chunks/{620-b21eb963d0189283.js → 620-cc65df39cb93df1c.js} +1 -1
  307. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-847b19cd29966941.js +1 -0
  308. package/cli/app/.next-cli-build/static/css/1472cd17dfd55a13.css +1 -0
  309. package/cli/app/CHANGELOG.md +7 -0
  310. package/cli/app/package.json +1 -1
  311. package/cli/package.json +1 -1
  312. package/package.json +1 -1
  313. package/src/app/(dashboard)/dashboard/providers/page.js +71 -145
  314. package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +11 -17
  315. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +22 -22
  316. package/src/shared/components/UsageStats.js +3 -3
  317. package/cli/app/.next-cli-build/static/chunks/5497-276ef7bcaaa911b7.js +0 -7
  318. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2cedde97aaf3c729.js +0 -1
  319. package/cli/app/.next-cli-build/static/css/b912482d9fc0b2ed.css +0 -1
  320. /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → DeFI037NxtdV4EpLD2ihz}/_buildManifest.js +0 -0
  321. /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → DeFI037NxtdV4EpLD2ihz}/_ssgManifest.js +0 -0
@@ -29,28 +29,26 @@ import { useHeaderSearchStore } from "@/store/headerSearchStore";
29
29
  import ModelAvailabilityBadge from "./components/ModelAvailabilityBadge";
30
30
 
31
31
  function getStatusDisplay(connected, error, errorCode) {
32
- const parts = [];
33
32
  if (connected > 0) {
34
- parts.push(
35
- <Badge key="connected" variant="success" size="sm" dot>
36
- {connected} Connected
37
- </Badge>,
33
+ return (
34
+ <span className="inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-success">
35
+ <span aria-hidden="true" className="size-1.5 shrink-0 rounded-full bg-success" />
36
+ {connected} connected
37
+ </span>
38
38
  );
39
39
  }
40
40
  if (error > 0) {
41
41
  const errText = errorCode
42
42
  ? `${error} Error (${errorCode})`
43
43
  : `${error} Error`;
44
- parts.push(
45
- <Badge key="error" variant="error" size="sm" dot>
44
+ return (
45
+ <span className="inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-error">
46
+ <span aria-hidden="true" className="size-1.5 shrink-0 rounded-full bg-error" />
46
47
  {errText}
47
- </Badge>,
48
+ </span>
48
49
  );
49
50
  }
50
- if (parts.length === 0) {
51
- return <span className="text-text-muted">No connections</span>;
52
- }
53
- return parts;
51
+ return <span className="text-[11px] text-text-muted">No connections</span>;
54
52
  }
55
53
 
56
54
  function getConnectionErrorTag(connection) {
@@ -380,41 +378,35 @@ export default function ProvidersPage() {
380
378
  anthropicCompatibleProviders.length > 0;
381
379
 
382
380
  return (
383
- <div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0 lg:gap-7">
381
+ <div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0">
384
382
  {totalConnections > 0 && (
385
- <div className="overflow-hidden rounded-2xl border border-primary/15 bg-surface/85 shadow-[0_20px_45px_-38px_rgba(229,106,74,0.8)] backdrop-blur-sm">
386
- <div className="grid grid-cols-2 divide-x divide-y divide-border-subtle sm:grid-cols-4 sm:divide-y-0">
387
- <div className="col-span-2 flex items-center gap-3 px-4 py-3.5 sm:col-span-1">
388
- <span className="flex size-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary ring-1 ring-primary/15">
389
- <span aria-hidden="true" className="material-symbols-outlined" style={{ fontSize: 20 }}>dns</span>
383
+ <div className="overflow-hidden rounded-xl border border-border bg-surface/80 shadow-sm">
384
+ <div className="grid grid-cols-3 divide-x divide-y divide-border-subtle sm:grid-cols-4 sm:divide-y-0">
385
+ <div className="col-span-3 flex items-center gap-3 px-4 py-3 sm:col-span-1">
386
+ <span className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-primary/[0.08] text-primary">
387
+ <span aria-hidden="true" className="material-symbols-outlined" style={{ fontSize: 18 }}>dns</span>
390
388
  </span>
391
389
  <div>
392
- <p className="text-[10px] font-bold uppercase tracking-[0.12em] text-text-muted">Connection health</p>
393
- <p className="mt-0.5 text-sm font-semibold text-text-main">{activePercent}% active</p>
390
+ <p className="text-[11px] font-medium text-text-muted">Connection health</p>
391
+ <p className="mt-0.5 text-sm font-semibold tabular-nums text-text-main">{activePercent}% active</p>
394
392
  </div>
395
393
  </div>
396
- <div className="px-4 py-3.5">
397
- <p className="text-[10px] font-bold uppercase tracking-[0.1em] text-text-muted">Connections</p>
398
- <p className="mt-1 text-xl font-bold tracking-tight text-text-main">{totalConnections}</p>
394
+ <div className="px-4 py-3">
395
+ <p className="text-[11px] font-medium text-text-muted">Connections</p>
396
+ <p className="mt-0.5 text-lg font-semibold tabular-nums text-text-main">{totalConnections}</p>
399
397
  </div>
400
- <div className="px-4 py-3.5">
401
- <p className="text-[10px] font-bold uppercase tracking-[0.1em] text-text-muted">Active</p>
402
- <div className="mt-1 flex items-baseline gap-2">
403
- <p className="text-xl font-bold tracking-tight text-success">{activeConnections}</p>
398
+ <div className="px-4 py-3">
399
+ <p className="text-[11px] font-medium text-text-muted">Active</p>
400
+ <div className="mt-0.5 flex items-baseline gap-2">
401
+ <p className="text-lg font-semibold tabular-nums text-success">{activeConnections}</p>
404
402
  {pausedConnections > 0 && <span className="text-[10px] text-text-muted">{pausedConnections} paused</span>}
405
403
  </div>
406
404
  </div>
407
- <div className="px-4 py-3.5">
408
- <p className="text-[10px] font-bold uppercase tracking-[0.1em] text-text-muted">Providers</p>
409
- <p className="mt-1 text-xl font-bold tracking-tight text-info">{connectedProviderCount}</p>
405
+ <div className="px-4 py-3">
406
+ <p className="text-[11px] font-medium text-text-muted">Providers</p>
407
+ <p className="mt-0.5 text-lg font-semibold tabular-nums text-info">{connectedProviderCount}</p>
410
408
  </div>
411
409
  </div>
412
- {totalConnections >= 100 && (
413
- <div className="flex items-center gap-2 border-t border-border-subtle bg-surface-2/35 px-4 py-2 text-[11px] text-text-muted">
414
- <span aria-hidden="true" className="material-symbols-outlined text-[15px] text-primary">filter_alt</span>
415
- Open a provider to search and filter its paginated connections.
416
- </div>
417
- )}
418
410
  </div>
419
411
  )}
420
412
  {loadError && (
@@ -453,7 +445,7 @@ export default function ProvidersPage() {
453
445
  variant="secondary"
454
446
  icon="add"
455
447
  onClick={() => setShowAddCompatibleModal(true)}
456
- className="w-full !bg-white !text-black hover:!bg-gray-100 sm:w-auto"
448
+ className="w-full sm:w-auto"
457
449
  >
458
450
  Add OpenAI Compatible
459
451
  </Button>
@@ -469,7 +461,7 @@ export default function ProvidersPage() {
469
461
  </div>
470
462
  </div>
471
463
  ) : (
472
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
464
+ <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
473
465
  {[...compatibleProviders, ...anthropicCompatibleProviders].map(
474
466
  (info) => (
475
467
  <ApiKeyProviderCard
@@ -477,7 +469,6 @@ export default function ProvidersPage() {
477
469
  providerId={info.id}
478
470
  provider={info}
479
471
  stats={getProviderStats(info.id, "apikey")}
480
- authType="compatible"
481
472
  onToggle={(active) =>
482
473
  handleToggleProvider(info.id, "apikey", active)
483
474
  }
@@ -518,14 +509,13 @@ export default function ProvidersPage() {
518
509
  </button>
519
510
  </div>
520
511
  </ProviderSectionHeader>
521
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
512
+ <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
522
513
  {oauthEntries.map(([key, info]) => (
523
514
  <ProviderCard
524
515
  key={key}
525
516
  providerId={key}
526
517
  provider={info}
527
518
  stats={getProviderStats(key, "oauth")}
528
- authType="oauth"
529
519
  onToggle={(active) => handleToggleProvider(key, "oauth", active)}
530
520
  />
531
521
  ))}
@@ -560,7 +550,7 @@ export default function ProvidersPage() {
560
550
  {testingMode === "free" ? "Testing..." : "Test All"}
561
551
  </button>
562
552
  </ProviderSectionHeader>
563
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
553
+ <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
564
554
  {freeEntries.map(([key, info]) => {
565
555
  const hasApiKeyMode = Array.isArray(info?.authModes) && info.authModes.includes("apikey");
566
556
  const statAuthTypes = hasApiKeyMode ? ["oauth", "apikey"] : "oauth";
@@ -570,7 +560,6 @@ export default function ProvidersPage() {
570
560
  providerId={key}
571
561
  provider={info}
572
562
  stats={getProviderStats(key, statAuthTypes)}
573
- authType="free"
574
563
  onToggle={(active) => handleToggleProvider(key, hasApiKeyMode ? "apikey" : "oauth", active)}
575
564
  />
576
565
  );
@@ -581,7 +570,6 @@ export default function ProvidersPage() {
581
570
  providerId={key}
582
571
  provider={info}
583
572
  stats={getProviderStats(key, "apikey")}
584
- authType="apikey"
585
573
  onToggle={(active) => handleToggleProvider(key, "apikey", active)}
586
574
  />
587
575
  ))}
@@ -616,14 +604,13 @@ export default function ProvidersPage() {
616
604
  {testingMode === "apikey" ? "Testing..." : "Test All"}
617
605
  </button>
618
606
  </ProviderSectionHeader>
619
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
607
+ <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
620
608
  {visibleApikeyEntries.map(([key, info]) => (
621
609
  <ApiKeyProviderCard
622
610
  key={key}
623
611
  providerId={key}
624
612
  provider={info}
625
613
  stats={getProviderStats(key, "apikey")}
626
- authType="apikey"
627
614
  onToggle={(active) => handleToggleProvider(key, "apikey", active)}
628
615
  />
629
616
  ))}
@@ -657,7 +644,6 @@ export default function ProvidersPage() {
657
644
  providerId={key}
658
645
  provider={info}
659
646
  stats={getProviderStats(key, "apikey")}
660
- authType="apikey"
661
647
  onToggle={(active) => handleToggleProvider(key, "apikey", active)}
662
648
  />
663
649
  ))}
@@ -715,13 +701,13 @@ export default function ProvidersPage() {
715
701
  function ProviderSectionHeader({ icon, title, description, children }) {
716
702
  return (
717
703
  <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
718
- <div className="flex min-w-0 items-center gap-3">
719
- <span aria-hidden="true" className="material-symbols-outlined flex size-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-[20px] text-primary ring-1 ring-primary/15">
704
+ <div className="flex min-w-0 items-center gap-2.5">
705
+ <span aria-hidden="true" className="material-symbols-outlined flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary/[0.08] text-[17px] text-primary">
720
706
  {icon}
721
707
  </span>
722
708
  <div className="min-w-0">
723
- <h2 className="text-lg font-semibold leading-tight sm:text-xl">{title}</h2>
724
- <p className="mt-0.5 text-xs text-text-muted">{description}</p>
709
+ <h2 className="text-lg font-semibold leading-tight">{title}</h2>
710
+ <p className="mt-0.5 text-[11px] text-text-muted sm:text-xs">{description}</p>
725
711
  </div>
726
712
  </div>
727
713
  {children}
@@ -736,39 +722,20 @@ ProviderSectionHeader.propTypes = {
736
722
  children: PropTypes.node,
737
723
  };
738
724
 
739
- function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
725
+ function ProviderCard({ providerId, provider, stats, onToggle }) {
740
726
  const { connected, error, errorCode, allDisabled } = stats;
741
727
  const isNoAuth = !!provider.noAuth;
742
- const isReady = !allDisabled && (connected > 0 || isNoAuth);
743
-
744
- const dotColors = {
745
- free: "bg-green-500",
746
- oauth: "bg-blue-500",
747
- apikey: "bg-amber-500",
748
- compatible: "bg-orange-500",
749
- };
750
- const dotLabels = {
751
- free: "Free",
752
- oauth: "OAuth",
753
- apikey: "API Key",
754
- compatible: "Compatible",
755
- };
756
728
 
757
729
  return (
758
730
  <Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
759
731
  <Card
760
732
  padding="none"
761
- className={`relative h-[82px] min-h-[82px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] sm:h-[94px] sm:min-h-[94px] ${
762
- isReady
763
- ? "border-success/25 bg-linear-to-br from-success/[0.045] to-transparent"
764
- : "group-hover:border-primary/25"
765
- } ${allDisabled ? "opacity-55" : ""}`}
733
+ className={`relative h-[76px] min-h-[76px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] group-hover:border-primary/30 group-hover:shadow-[0_10px_26px_-22px_rgba(229,106,74,0.55)] sm:h-[78px] sm:min-h-[78px] ${allDisabled ? "opacity-55" : ""}`}
766
734
  >
767
- {isReady && <span className="absolute inset-y-3 left-0 w-0.5 rounded-r-full bg-success" />}
768
- <div className="flex h-full min-w-0 items-center justify-between gap-3 p-3.5">
769
- <div className="flex min-w-0 items-center gap-3">
735
+ <div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
736
+ <div className="flex min-w-0 items-center gap-2.5">
770
737
  <div
771
- className="flex size-10 shrink-0 items-center justify-center rounded-xl ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
738
+ className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
772
739
  style={{
773
740
  backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
774
741
  }}
@@ -776,8 +743,8 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
776
743
  <ProviderIcon
777
744
  src={`/providers/${provider.id}.png`}
778
745
  alt=""
779
- size={30}
780
- className="max-h-[32px] max-w-[32px] rounded-lg object-contain"
746
+ size={28}
747
+ className="max-h-7 max-w-7 rounded-md object-contain"
781
748
  fallbackText={
782
749
  provider.textIcon || provider.id.slice(0, 2).toUpperCase()
783
750
  }
@@ -786,26 +753,19 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
786
753
  </div>
787
754
  <div className="min-w-0">
788
755
  <h3 className="truncate text-sm font-semibold text-text-main">{provider.name}</h3>
789
- <div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap text-xs">
790
- <span className="inline-flex items-center gap-1 text-[10px] font-medium text-text-muted">
791
- <span aria-hidden="true" className={`size-1.5 rounded-full ${dotColors[authType] || "bg-text-muted"}`} />
792
- {dotLabels[authType] || "Provider"}
793
- </span>
756
+ <div className="mt-1 flex min-w-0 items-center overflow-hidden whitespace-nowrap">
794
757
  {allDisabled ? (
795
- <Badge variant="default" size="sm">
796
- <span className="flex items-center gap-1">
797
- <span className="material-symbols-outlined text-[12px]">
798
- pause_circle
799
- </span>
800
- Disabled
801
- </span>
802
- </Badge>
758
+ <span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
759
+ <span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
760
+ Disabled
761
+ </span>
803
762
  ) : isNoAuth ? (
804
- <Badge variant="success" size="sm" dot>Ready</Badge>
763
+ <span className="inline-flex items-center gap-1.5 text-[11px] font-medium text-success">
764
+ <span aria-hidden="true" className="size-1.5 rounded-full bg-success" />
765
+ Ready
766
+ </span>
805
767
  ) : (
806
- <>
807
- {getStatusDisplay(connected, error, errorCode)}
808
- </>
768
+ getStatusDisplay(connected, error, errorCode)
809
769
  )}
810
770
  </div>
811
771
  </div>
@@ -828,7 +788,7 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
828
788
  />
829
789
  </div>
830
790
  )}
831
- <span aria-hidden="true" className="material-symbols-outlined text-[18px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
791
+ <span aria-hidden="true" className="material-symbols-outlined text-[17px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
832
792
  chevron_right
833
793
  </span>
834
794
  </div>
@@ -854,7 +814,6 @@ ProviderCard.propTypes = {
854
814
  total: PropTypes.number,
855
815
  allDisabled: PropTypes.bool,
856
816
  }).isRequired,
857
- authType: PropTypes.string,
858
817
  onToggle: PropTypes.func,
859
818
  };
860
819
 
@@ -862,29 +821,14 @@ function ApiKeyProviderCard({
862
821
  providerId,
863
822
  provider,
864
823
  stats,
865
- authType,
866
824
  onToggle,
867
825
  }) {
868
826
  const { connected, error, errorCode, allDisabled } = stats;
869
- const isReady = !allDisabled && connected > 0;
870
827
  const isCompatible = providerId.startsWith(OPENAI_COMPATIBLE_PREFIX);
871
828
  const isAnthropicCompatible = providerId.startsWith(
872
829
  ANTHROPIC_COMPATIBLE_PREFIX,
873
830
  );
874
831
 
875
- const dotColors = {
876
- free: "bg-green-500",
877
- oauth: "bg-blue-500",
878
- apikey: "bg-amber-500",
879
- compatible: "bg-orange-500",
880
- };
881
- const dotLabels = {
882
- free: "Free",
883
- oauth: "OAuth",
884
- apikey: "API Key",
885
- compatible: "Compatible",
886
- };
887
-
888
832
  const getIconPath = () => {
889
833
  if (provider.id === "featherless") return null;
890
834
  if (isCompatible)
@@ -899,17 +843,12 @@ function ApiKeyProviderCard({
899
843
  <Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
900
844
  <Card
901
845
  padding="none"
902
- className={`relative h-[82px] min-h-[82px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] sm:h-[94px] sm:min-h-[94px] ${
903
- isReady
904
- ? "border-success/25 bg-linear-to-br from-success/[0.045] to-transparent"
905
- : "group-hover:border-primary/25"
906
- } ${allDisabled ? "opacity-55" : ""}`}
846
+ className={`relative h-[76px] min-h-[76px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] group-hover:border-primary/30 group-hover:shadow-[0_10px_26px_-22px_rgba(229,106,74,0.55)] sm:h-[78px] sm:min-h-[78px] ${allDisabled ? "opacity-55" : ""}`}
907
847
  >
908
- {isReady && <span className="absolute inset-y-3 left-0 w-0.5 rounded-r-full bg-success" />}
909
- <div className="flex h-full min-w-0 items-center justify-between gap-3 p-3.5">
910
- <div className="flex min-w-0 items-center gap-3">
848
+ <div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
849
+ <div className="flex min-w-0 items-center gap-2.5">
911
850
  <div
912
- className="flex size-10 shrink-0 items-center justify-center rounded-xl ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
851
+ className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
913
852
  style={{
914
853
  backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
915
854
  }}
@@ -917,8 +856,8 @@ function ApiKeyProviderCard({
917
856
  <ProviderIcon
918
857
  src={getIconPath()}
919
858
  alt=""
920
- size={30}
921
- className="max-h-[32px] max-w-[32px] rounded-lg object-contain"
859
+ size={28}
860
+ className="max-h-7 max-w-7 rounded-md object-contain"
922
861
  fallbackText={
923
862
  provider.textIcon || provider.id.slice(0, 2).toUpperCase()
924
863
  }
@@ -927,34 +866,22 @@ function ApiKeyProviderCard({
927
866
  </div>
928
867
  <div className="min-w-0">
929
868
  <h3 className="truncate text-sm font-semibold text-text-main">{provider.name}</h3>
930
- <div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap text-xs">
931
- <span className="inline-flex items-center gap-1 text-[10px] font-medium text-text-muted">
932
- <span aria-hidden="true" className={`size-1.5 rounded-full ${dotColors[authType] || "bg-text-muted"}`} />
933
- {dotLabels[authType] || "Provider"}
934
- </span>
869
+ <div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap">
935
870
  {allDisabled ? (
936
- <Badge variant="default" size="sm">
937
- <span className="flex items-center gap-1">
938
- <span className="material-symbols-outlined text-[12px]">
939
- pause_circle
940
- </span>
941
- Disabled
942
- </span>
943
- </Badge>
871
+ <span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
872
+ <span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
873
+ Disabled
874
+ </span>
944
875
  ) : (
945
876
  <>
946
877
  {getStatusDisplay(connected, error, errorCode)}
947
878
  {isCompatible && (
948
- <Badge variant="default" size="sm">
949
- {provider.apiType === "responses"
950
- ? "Responses"
951
- : "Chat"}
952
- </Badge>
879
+ <span className="text-[10px] text-text-subtle">
880
+ · {provider.apiType === "responses" ? "Responses" : "Chat"}
881
+ </span>
953
882
  )}
954
883
  {isAnthropicCompatible && (
955
- <Badge variant="default" size="sm">
956
- Messages
957
- </Badge>
884
+ <span className="text-[10px] text-text-subtle">· Messages</span>
958
885
  )}
959
886
  </>
960
887
  )}
@@ -979,7 +906,7 @@ function ApiKeyProviderCard({
979
906
  />
980
907
  </div>
981
908
  )}
982
- <span aria-hidden="true" className="material-symbols-outlined text-[18px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
909
+ <span aria-hidden="true" className="material-symbols-outlined text-[17px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
983
910
  chevron_right
984
911
  </span>
985
912
  </div>
@@ -1006,7 +933,6 @@ ApiKeyProviderCard.propTypes = {
1006
933
  total: PropTypes.number,
1007
934
  allDisabled: PropTypes.bool,
1008
935
  }).isRequired,
1009
- authType: PropTypes.string,
1010
936
  onToggle: PropTypes.func,
1011
937
  };
1012
938
 
@@ -18,8 +18,7 @@ export default function OverviewCards({ stats }) {
18
18
  value: fmt(stats.totalRequests),
19
19
  icon: "send",
20
20
  valueClass: "text-text-main",
21
- iconClass: "bg-primary/10 text-primary ring-primary/15",
22
- accentClass: "from-primary via-primary/70 to-transparent",
21
+ iconClass: "bg-primary/[0.08] text-primary",
23
22
  detail: "All routed calls",
24
23
  },
25
24
  {
@@ -27,8 +26,7 @@ export default function OverviewCards({ stats }) {
27
26
  value: fmt(stats.totalPromptTokens),
28
27
  icon: "input",
29
28
  valueClass: "text-primary",
30
- iconClass: "bg-primary/10 text-primary ring-primary/15",
31
- accentClass: "from-primary via-primary/70 to-transparent",
29
+ iconClass: "bg-primary/[0.08] text-primary",
32
30
  detail: "Prompt and context",
33
31
  },
34
32
  {
@@ -36,17 +34,15 @@ export default function OverviewCards({ stats }) {
36
34
  value: fmt(cached),
37
35
  icon: "database",
38
36
  valueClass: "text-info",
39
- iconClass: "bg-info/10 text-info ring-info/15",
40
- accentClass: "from-info via-info/70 to-transparent",
41
- detail: cached > 0 ? `${hitRate.toFixed(1)}% of input · cache rate` : "No cache hits yet",
37
+ iconClass: "bg-info/[0.08] text-info",
38
+ detail: cached > 0 ? `${hitRate.toFixed(1)}% cache rate` : "No cache hits yet",
42
39
  },
43
40
  {
44
41
  label: "Output Tokens",
45
42
  value: fmt(stats.totalCompletionTokens),
46
43
  icon: "output",
47
44
  valueClass: "text-success",
48
- iconClass: "bg-success/10 text-success ring-success/15",
49
- accentClass: "from-success via-success/70 to-transparent",
45
+ iconClass: "bg-success/[0.08] text-success",
50
46
  detail: "Generated responses",
51
47
  },
52
48
  {
@@ -54,8 +50,7 @@ export default function OverviewCards({ stats }) {
54
50
  value: `~${fmtCost(stats.totalCost)}`,
55
51
  icon: "payments",
56
52
  valueClass: "text-warning",
57
- iconClass: "bg-warning/10 text-warning ring-warning/15",
58
- accentClass: "from-warning via-warning/70 to-transparent",
53
+ iconClass: "bg-warning/[0.08] text-warning",
59
54
  detail: "Estimated, not billing",
60
55
  className: "col-span-2 sm:col-span-1",
61
56
  },
@@ -67,21 +62,20 @@ export default function OverviewCards({ stats }) {
67
62
  <Card
68
63
  key={metric.label}
69
64
  padding="none"
70
- className={`group relative flex min-h-[118px] min-w-0 flex-col overflow-hidden p-3.5 transition-[border-color,box-shadow,transform] duration-200 hover:border-primary/20 sm:min-h-[130px] sm:p-4 ${metric.className || ""}`}
65
+ className={`relative flex min-h-[104px] min-w-0 flex-col overflow-hidden p-3.5 sm:min-h-[112px] sm:p-4 ${metric.className || ""}`}
71
66
  >
72
- <span className={`absolute inset-x-0 top-0 h-0.5 bg-linear-to-r ${metric.accentClass}`} aria-hidden="true" />
73
67
  <div className="flex items-start justify-between gap-2">
74
- <span className="pt-0.5 text-[11px] font-bold uppercase tracking-[0.09em] text-text-muted">
68
+ <span className="pt-0.5 text-xs font-semibold text-text-muted">
75
69
  {metric.label}
76
70
  </span>
77
- <span className={`material-symbols-outlined flex size-7 shrink-0 items-center justify-center rounded-lg text-[16px] ring-1 transition-transform duration-300 group-hover:scale-105 ${metric.iconClass}`}>
71
+ <span className={`material-symbols-outlined flex size-7 shrink-0 items-center justify-center rounded-md text-[16px] ${metric.iconClass}`}>
78
72
  {metric.icon}
79
73
  </span>
80
74
  </div>
81
- <span className={`mt-1.5 truncate text-[22px] font-bold tracking-[-0.02em] sm:text-2xl xl:text-[25px] ${metric.valueClass}`}>
75
+ <span className={`mt-1 truncate text-[22px] font-semibold tracking-[-0.02em] sm:text-2xl ${metric.valueClass}`}>
82
76
  {metric.value}
83
77
  </span>
84
- <span className="mt-auto min-h-[30px] text-[11px] leading-[1.35] text-text-muted">{metric.detail}</span>
78
+ <span className="mt-auto text-[11px] leading-[1.3] text-text-muted">{metric.detail}</span>
85
79
  </Card>
86
80
  ))}
87
81
  </div>
@@ -15,7 +15,7 @@ import { AI_PROVIDERS } from "@/shared/constants/providers";
15
15
  // Force-stop FE animation if a provider stays active longer than this
16
16
  const FE_ACTIVE_TIMEOUT_MS = 60000;
17
17
  const FE_ACTIVE_TICK_MS = 1000;
18
- const FIT_OPTS = { padding: 0.2, duration: 200 };
18
+ const FIT_OPTS = { padding: 0.14, duration: 200 };
19
19
 
20
20
  function getProviderConfig(providerId) {
21
21
  return AI_PROVIDERS[providerId] || { color: "#6b7280", name: providerId };
@@ -32,11 +32,11 @@ function ProviderNode({ data }) {
32
32
  const [imgError, setImgError] = useState(false);
33
33
  return (
34
34
  <div
35
- className="flex items-center gap-2.5 px-4 py-2.5 rounded-lg border-2 transition-all duration-300 bg-bg"
35
+ className="flex items-center gap-2 rounded-lg border bg-surface px-3 py-2 transition-all duration-300"
36
36
  style={{
37
37
  borderColor: active ? color : "var(--color-border)",
38
- boxShadow: active ? `0 0 16px ${color}40` : "none",
39
- minWidth: "150px",
38
+ boxShadow: active ? `0 0 12px ${color}30` : "none",
39
+ minWidth: "140px",
40
40
  }}
41
41
  >
42
42
  <Handle type="target" position={Position.Top} id="top" className="!bg-transparent !border-0 !w-0 !h-0" />
@@ -46,19 +46,19 @@ function ProviderNode({ data }) {
46
46
 
47
47
  {/* Provider icon */}
48
48
  <div
49
- className="w-8 h-8 rounded-md flex items-center justify-center shrink-0"
49
+ className="flex size-7 shrink-0 items-center justify-center rounded-md"
50
50
  style={{ backgroundColor: `${color}15` }}
51
51
  >
52
52
  {!imgError ? (
53
- <img src={imageUrl} alt={label} className="w-6 h-6 rounded-sm object-contain" onError={() => setImgError(true)} />
53
+ <img src={imageUrl} alt={label} className="size-5 rounded-sm object-contain" onError={() => setImgError(true)} />
54
54
  ) : (
55
- <span className="text-sm font-bold" style={{ color }}>{textIcon}</span>
55
+ <span className="text-xs font-bold" style={{ color }}>{textIcon}</span>
56
56
  )}
57
57
  </div>
58
58
 
59
59
  {/* Provider name */}
60
60
  <span
61
- className="text-base font-medium truncate"
61
+ className="truncate text-sm font-medium"
62
62
  style={{ color: active ? color : "var(--color-text)" }}
63
63
  >
64
64
  {label}
@@ -82,16 +82,16 @@ ProviderNode.propTypes = {
82
82
  // Center ZevaiRouter node
83
83
  function RouterNode({ data }) {
84
84
  return (
85
- <div className="flex items-center justify-center px-5 py-3 rounded-xl border-2 border-primary bg-primary/5 shadow-md min-w-[130px]">
85
+ <div className="flex min-w-[118px] items-center justify-center rounded-lg border border-primary bg-primary/[0.06] px-4 py-2.5 shadow-sm">
86
86
  <Handle type="source" position={Position.Top} id="top" className="!bg-transparent !border-0 !w-0 !h-0" />
87
87
  <Handle type="source" position={Position.Bottom} id="bottom" className="!bg-transparent !border-0 !w-0 !h-0" />
88
88
  <Handle type="source" position={Position.Left} id="left" className="!bg-transparent !border-0 !w-0 !h-0" />
89
89
  <Handle type="source" position={Position.Right} id="right" className="!bg-transparent !border-0 !w-0 !h-0" />
90
90
 
91
- <img src="/favicon.svg" alt="ZevaiRouter" className="w-6 h-6 mr-2" />
92
- <span className="text-sm font-bold text-primary">ZevaiRouter</span>
91
+ <img src="/favicon.svg" alt="ZevaiRouter" className="mr-2 size-5" />
92
+ <span className="text-xs font-semibold text-primary">ZevaiRouter</span>
93
93
  {data.activeCount > 0 && (
94
- <span className="ml-2 px-1.5 py-0.5 rounded-full bg-primary text-white text-xs font-bold">
94
+ <span className="ml-2 rounded-full bg-primary px-1.5 py-0.5 text-[10px] font-semibold text-white">
95
95
  {data.activeCount}
96
96
  </span>
97
97
  )}
@@ -107,18 +107,18 @@ const nodeTypes = { provider: ProviderNode, router: RouterNode };
107
107
 
108
108
  // Place N nodes evenly along an ellipse around the router center.
109
109
  function buildLayout(providers, activeSet, lastSet, errorSet) {
110
- const nodeW = 180;
111
- const nodeH = 30;
112
- const routerW = 120;
113
- const routerH = 44;
114
- const nodeGap = 24;
110
+ const nodeW = 160;
111
+ const nodeH = 44;
112
+ const routerW = 118;
113
+ const routerH = 40;
114
+ const nodeGap = 20;
115
115
 
116
116
  const count = providers.length;
117
117
 
118
118
  // Compute rx so arc spacing between nodes >= nodeW + nodeGap
119
119
  const minRx = ((nodeW + nodeGap) * count) / (2 * Math.PI);
120
- const rx = Math.max(320, minRx);
121
- const ry = Math.max(200, rx * 0.55); // ellipse ratio ~0.55
120
+ const rx = Math.max(270, minRx);
121
+ const ry = Math.max(150, rx * 0.52);
122
122
  if (count === 0) {
123
123
  return {
124
124
  nodes: [{ id: "router", type: "router", position: { x: 0, y: 0 }, data: { activeCount: 0 }, draggable: false }],
@@ -283,13 +283,13 @@ export default function ProviderTopology({ providers = [], activeRequests = [],
283
283
  }, [nodes.length]);
284
284
 
285
285
  return (
286
- <div ref={containerRef} className="flex h-[360px] w-full min-w-0 flex-col overflow-hidden rounded-[14px] border border-border-subtle bg-surface/94 shadow-[0_14px_34px_-26px_rgba(15,23,42,0.28)] sm:h-[480px]">
286
+ <div ref={containerRef} className="flex h-[340px] w-full min-w-0 flex-col overflow-hidden rounded-[14px] border border-border-subtle bg-surface/94 shadow-[0_14px_34px_-26px_rgba(15,23,42,0.28)] sm:h-[440px]">
287
287
  <div className="flex shrink-0 items-center justify-between border-b border-border-subtle bg-surface/75 px-4 py-3.5">
288
288
  <div className="flex items-center gap-2">
289
289
  <span className="material-symbols-outlined text-[17px] text-primary">route</span>
290
- <span className="text-xs font-bold uppercase tracking-[0.08em] text-text-muted">Routing Map</span>
290
+ <span className="text-xs font-semibold text-text-main">Routing map</span>
291
291
  </div>
292
- <span className="rounded-full bg-primary/[0.08] px-2 py-1 text-[10px] font-semibold text-primary ring-1 ring-primary/15">
292
+ <span className="text-[11px] font-medium text-text-muted">
293
293
  {providers.length} {providers.length === 1 ? "provider" : "providers"}
294
294
  </span>
295
295
  </div>