zevairouter 1.0.145 → 1.0.147

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 (338) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +9 -9
  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.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  32. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  38. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  39. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  40. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  41. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  42. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  43. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  44. package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  46. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  47. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
  48. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  49. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  50. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  51. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  60. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  61. package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
  62. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
  63. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  64. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
  65. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  66. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  67. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  68. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  69. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
  70. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  71. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  72. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
  77. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
  78. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  79. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
  80. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  81. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  82. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  87. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  88. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  89. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
  90. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  91. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  92. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  97. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  98. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  99. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
  100. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  101. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  102. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  107. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  108. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  109. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +6 -6
  110. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  111. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  112. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +6 -6
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +4 -4
  117. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +2 -2
  118. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  119. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
  120. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  121. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  122. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  127. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  128. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  129. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
  130. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  131. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  132. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  138. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  139. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  140. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
  141. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  142. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  143. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  148. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  149. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  150. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +6 -6
  151. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  152. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  153. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  154. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +6 -6
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +4 -4
  158. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +2 -2
  159. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  160. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  161. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  162. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  163. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  164. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  168. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  169. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  170. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
  171. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  172. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  173. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  190. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  191. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
  192. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  193. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  194. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  195. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  199. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  200. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  201. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
  202. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  203. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  204. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +4 -4
  209. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
  210. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  211. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
  212. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  213. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  214. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  215. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  219. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  220. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  221. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  222. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
  223. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  224. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  225. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  230. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  231. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  232. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  233. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  234. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  235. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +4 -4
  240. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  241. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  242. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
  243. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  244. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  245. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  246. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  250. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  251. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  252. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
  253. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  254. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  255. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  256. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  260. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  261. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  262. package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
  263. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  264. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  265. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  266. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
  267. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  268. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
  269. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  270. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  271. package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
  272. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  273. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
  274. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  275. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
  276. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  277. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  278. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  279. package/cli/app/.next-cli-build/server/app/landing.rsc +5 -5
  280. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  281. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  282. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
  283. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  284. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  285. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  286. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  287. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  288. package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
  289. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
  290. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  291. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
  292. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  293. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  294. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  295. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  296. package/cli/app/.next-cli-build/server/app-paths-manifest.json +9 -9
  297. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  298. package/cli/app/.next-cli-build/server/chunks/412.js +2 -2
  299. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  300. package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
  301. package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
  302. package/cli/app/.next-cli-build/server/chunks/8242.js +2 -2
  303. package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
  304. package/cli/app/.next-cli-build/server/chunks/9621.js +1 -1
  305. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  306. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  307. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  308. package/cli/app/.next-cli-build/static/chunks/523-176a0660a9383518.js +3 -0
  309. package/cli/app/.next-cli-build/static/chunks/5497-8d0ec2995dc0a392.js +7 -0
  310. package/cli/app/.next-cli-build/static/chunks/{620-b21eb963d0189283.js → 620-375754e53341e85b.js} +1 -1
  311. package/cli/app/.next-cli-build/static/chunks/9126-7d5476f17beddfb0.js +1 -0
  312. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2468e6ba8d1efeec.js +1 -0
  313. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-579bf915396efc69.js +1 -0
  314. package/cli/app/.next-cli-build/static/css/87ffa46afc2273f4.css +1 -0
  315. package/cli/app/CHANGELOG.md +17 -0
  316. package/cli/app/package.json +1 -1
  317. package/cli/package.json +1 -1
  318. package/package.json +1 -1
  319. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +91 -38
  320. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +45 -38
  321. package/src/app/(dashboard)/dashboard/providers/page.js +199 -173
  322. package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +11 -17
  323. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +15 -9
  324. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +188 -120
  325. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +149 -24
  326. package/src/shared/components/Header.js +4 -4
  327. package/src/shared/components/HeaderLanguage.js +2 -1
  328. package/src/shared/components/HeaderMenu.js +2 -1
  329. package/src/shared/components/Toggle.js +28 -12
  330. package/src/shared/components/UsageStats.js +3 -3
  331. package/cli/app/.next-cli-build/static/chunks/523-078802482e95c757.js +0 -3
  332. package/cli/app/.next-cli-build/static/chunks/5497-276ef7bcaaa911b7.js +0 -7
  333. package/cli/app/.next-cli-build/static/chunks/9126-9e1755f122b943cd.js +0 -1
  334. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2cedde97aaf3c729.js +0 -1
  335. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-6050ac2547c62b54.js +0 -1
  336. package/cli/app/.next-cli-build/static/css/b912482d9fc0b2ed.css +0 -1
  337. /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → y-U4C09T7DItXT7CZZV41}/_buildManifest.js +0 -0
  338. /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → y-U4C09T7DItXT7CZZV41}/_ssgManifest.js +0 -0
@@ -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>
@@ -89,6 +89,8 @@ export default function QuotaTable({
89
89
  compact = false,
90
90
  sortMode = "default",
91
91
  showSortLabel = false,
92
+ paginate = true,
93
+ totalCount,
92
94
  }) {
93
95
  const [page, setPage] = useState(1);
94
96
 
@@ -106,7 +108,9 @@ export default function QuotaTable({
106
108
  [normalizedQuotas, sortMode],
107
109
  );
108
110
 
109
- const totalPages = Math.max(1, Math.ceil(sortedQuotas.length / PAGE_SIZE));
111
+ const totalPages = paginate
112
+ ? Math.max(1, Math.ceil(sortedQuotas.length / PAGE_SIZE))
113
+ : 1;
110
114
 
111
115
  useEffect(() => {
112
116
  // eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when sort mode or data changes
@@ -122,12 +126,14 @@ export default function QuotaTable({
122
126
  return null;
123
127
  }
124
128
 
125
- const currentPageRows = sortedQuotas.slice(
126
- (page - 1) * PAGE_SIZE,
127
- page * PAGE_SIZE,
128
- );
129
+ const currentPageRows = paginate
130
+ ? sortedQuotas.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE)
131
+ : sortedQuotas;
129
132
  const pageStart = sortedQuotas.length === 0 ? 0 : (page - 1) * PAGE_SIZE + 1;
130
- const pageEnd = Math.min(page * PAGE_SIZE, sortedQuotas.length);
133
+ const pageEnd = paginate
134
+ ? Math.min(page * PAGE_SIZE, sortedQuotas.length)
135
+ : sortedQuotas.length;
136
+ const displayedTotal = Number.isFinite(totalCount) ? totalCount : sortedQuotas.length;
131
137
 
132
138
  const cellPad = compact ? "py-1 px-1.5" : "py-2 px-3";
133
139
  const nameText = compact ? "text-[11px]" : "text-sm";
@@ -139,7 +145,7 @@ export default function QuotaTable({
139
145
  <div className="space-y-2">
140
146
  <div className="flex items-center justify-between gap-2">
141
147
  <div className="text-[10px] text-text-muted">
142
- {sortedQuotas.length} quota{sortedQuotas.length > 1 ? "s" : ""}
148
+ {displayedTotal} quota{displayedTotal > 1 ? "s" : ""}
143
149
  </div>
144
150
  {showSortLabel && (
145
151
  <div className="rounded-md border border-black/10 bg-black/[0.02] px-2 py-1 text-[10px] text-text-muted dark:border-white/10 dark:bg-white/[0.03]">
@@ -243,7 +249,7 @@ export default function QuotaTable({
243
249
  type="button"
244
250
  onClick={() => setPage((currentPage) => Math.max(1, currentPage - 1))}
245
251
  disabled={page === 1}
246
- className="flex h-6 items-center rounded-md border border-black/10 px-2 text-[10px] text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
252
+ className="flex h-11 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-7 sm:rounded-md sm:px-2 sm:text-[10px]"
247
253
  >
248
254
  Prev
249
255
  </button>
@@ -251,7 +257,7 @@ export default function QuotaTable({
251
257
  type="button"
252
258
  onClick={() => setPage((currentPage) => Math.min(totalPages, currentPage + 1))}
253
259
  disabled={page === totalPages}
254
- className="flex h-6 items-center rounded-md border border-black/10 px-2 text-[10px] text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
260
+ className="flex h-11 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-7 sm:rounded-md sm:px-2 sm:text-[10px]"
255
261
  >
256
262
  Next
257
263
  </button>
@@ -4,7 +4,11 @@ import { useState, useEffect, useCallback, useRef, useMemo } from "react";
4
4
  import ProviderIcon from "@/shared/components/ProviderIcon";
5
5
  import QuotaTable from "./QuotaTable";
6
6
  import Toggle from "@/shared/components/Toggle";
7
- import { parseQuotaData, calculatePercentage } from "./utils";
7
+ import {
8
+ parseQuotaData,
9
+ calculatePercentage,
10
+ getRemainingPercentage,
11
+ } from "./utils";
8
12
  import Card from "@/shared/components/Card";
9
13
  import { EditConnectionModal } from "@/shared/components";
10
14
  import {
@@ -82,6 +86,22 @@ function getProviderDisplayName(provider) {
82
86
  return AI_PROVIDERS[provider]?.name || provider;
83
87
  }
84
88
 
89
+ function getUrgentQuotaRows(quotas, limit = 3) {
90
+ return quotas
91
+ .map((quota, index) => ({ quota, index }))
92
+ .sort((a, b) => {
93
+ const remainingDiff = getRemainingPercentage(a.quota) - getRemainingPercentage(b.quota);
94
+ if (remainingDiff !== 0) return remainingDiff;
95
+
96
+ const resetA = a.quota.resetAt ? new Date(a.quota.resetAt).getTime() : Number.POSITIVE_INFINITY;
97
+ const resetB = b.quota.resetAt ? new Date(b.quota.resetAt).getTime() : Number.POSITIVE_INFINITY;
98
+ if (resetA !== resetB) return resetA - resetB;
99
+ return a.index - b.index;
100
+ })
101
+ .slice(0, limit)
102
+ .map(({ quota }) => quota);
103
+ }
104
+
85
105
  function buildProviderAggregateCard(provider, providerConnections, quotaData, loading, errors) {
86
106
  if (!providerConnections.length) return null;
87
107
  const allQuotas = [];
@@ -363,6 +383,8 @@ export default function ProviderLimits() {
363
383
  const [quotaSortMode, setQuotaSortMode] = useState("default");
364
384
  const [expiringFirst, setExpiringFirst] = useState(false);
365
385
  const [providerMenuOpen, setProviderMenuOpen] = useState(false);
386
+ const [mobileActionsOpen, setMobileActionsOpen] = useState(false);
387
+ const [expandedQuotaCards, setExpandedQuotaCards] = useState({});
366
388
  const [bulkToggling, setBulkToggling] = useState(false);
367
389
  const [serverAggregateData, setServerAggregateData] = useState({});
368
390
  const [serverAggregateLoading, setServerAggregateLoading] = useState({});
@@ -965,13 +987,13 @@ export default function ProviderLimits() {
965
987
  return (
966
988
  <div className="space-y-6">
967
989
  {/* Header Controls */}
968
- <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-end">
969
- <div className="flex flex-wrap items-center gap-1.5">
970
- <div className="relative">
990
+ <div className="flex justify-end">
991
+ <div className="grid w-full grid-cols-[minmax(0,1fr)_minmax(0,1fr)_2.75rem] gap-2 sm:flex sm:w-auto sm:flex-wrap sm:items-center sm:gap-1.5">
992
+ <div className="relative min-w-0">
971
993
  <button
972
994
  type="button"
973
995
  onClick={() => setProviderMenuOpen((prev) => !prev)}
974
- className="flex h-8 items-center justify-between gap-1 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10"
996
+ className="flex h-11 w-full min-w-0 items-center justify-between gap-1 rounded-xl border border-black/10 bg-black/[0.02] px-3 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10 sm:h-8 sm:w-auto sm:rounded-lg sm:px-2"
975
997
  aria-haspopup="menu"
976
998
  aria-expanded={providerMenuOpen}
977
999
  title="Filter quota providers"
@@ -990,7 +1012,7 @@ export default function ProviderLimits() {
990
1012
  fallbackText={providerFilter.slice(0, 2).toUpperCase()}
991
1013
  />
992
1014
  )}
993
- <span className="truncate capitalize hidden lg:inline">
1015
+ <span className="truncate capitalize">
994
1016
  {selectedProviderLabel}
995
1017
  </span>
996
1018
  </span>
@@ -1066,23 +1088,7 @@ export default function ProviderLimits() {
1066
1088
  </>
1067
1089
  )}
1068
1090
  </div>
1069
- <div className="inline-flex h-8 overflow-hidden rounded-lg border border-black/10 bg-black/[0.02] dark:border-white/10 dark:bg-white/[0.03]">
1070
- {QUOTA_DISPLAY_MODE_OPTIONS.map((option) => (
1071
- <button
1072
- key={option.value}
1073
- type="button"
1074
- onClick={() => setDisplayMode(option.value)}
1075
- aria-pressed={displayMode === option.value}
1076
- className={`flex h-full items-center gap-1.5 px-2 text-xs transition-colors ${displayMode === option.value ? "bg-primary text-white" : "text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`}
1077
- title={`Show quota in ${option.label} mode`}
1078
- >
1079
- <span className="material-symbols-outlined text-[14px]">
1080
- {option.icon}
1081
- </span>
1082
- <span className="hidden sm:inline">{option.label}</span>
1083
- </button>
1084
- ))}
1085
- </div>
1091
+
1086
1092
  <select
1087
1093
  value={accountFilter}
1088
1094
  onChange={(event) => {
@@ -1092,7 +1098,7 @@ export default function ProviderLimits() {
1092
1098
  }
1093
1099
  setAccountFilter(nextValue);
1094
1100
  }}
1095
- className="h-8 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10"
1101
+ className="h-11 min-w-0 rounded-xl border border-black/10 bg-black/[0.02] px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10 sm:h-8 sm:rounded-lg sm:px-2"
1096
1102
  aria-label="Filter accounts by status"
1097
1103
  >
1098
1104
  {ACCOUNT_FILTER_OPTIONS.map((option) => (
@@ -1102,97 +1108,119 @@ export default function ProviderLimits() {
1102
1108
  ))}
1103
1109
  </select>
1104
1110
 
1105
- {providerFilter === "codex" && (
1106
- <select
1107
- value={quotaSortMode}
1108
- onChange={(event) => setQuotaSortMode(event.target.value)}
1109
- className="h-8 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10"
1110
- aria-label="Sort Codex quotas by remaining"
1111
- >
1112
- {QUOTA_SORT_OPTIONS.map((option) => (
1113
- <option key={option.value} value={option.value}>
1114
- {option.label}
1115
- </option>
1116
- ))}
1117
- </select>
1118
- )}
1119
-
1120
1111
  <button
1121
1112
  type="button"
1122
- onClick={() => setExpiringFirst((prev) => !prev)}
1123
- aria-pressed={expiringFirst}
1124
- className={`flex h-8 shrink-0 items-center gap-1 rounded-lg border px-2 text-xs transition-colors ${expiringFirst ? "border-amber-500/40 bg-amber-500/10 text-amber-500" : "border-black/10 text-text-primary hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5"}`}
1125
- title="Sort accounts by earliest quota reset time"
1113
+ onClick={refreshAll}
1114
+ disabled={refreshingAll}
1115
+ className="flex size-11 shrink-0 items-center justify-center rounded-xl border border-black/10 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:opacity-50 dark:border-white/10 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
1116
+ title="Refresh all"
1117
+ aria-label="Refresh all quotas"
1126
1118
  >
1127
- <span className="material-symbols-outlined text-[14px]">
1128
- hourglass_top
1119
+ <span
1120
+ className={`material-symbols-outlined text-[18px] sm:text-[14px] ${refreshingAll ? "animate-spin" : ""}`}
1121
+ >
1122
+ refresh
1129
1123
  </span>
1130
- <span className="hidden sm:inline">Expiring first</span>
1131
1124
  </button>
1132
1125
 
1133
- {/* Bulk: disable depleted */}
1126
+ <div className="col-span-2 inline-flex min-h-11 min-w-0 overflow-hidden rounded-xl border border-black/10 bg-black/[0.02] dark:border-white/10 dark:bg-white/[0.03] sm:h-8 sm:min-h-0 sm:rounded-lg">
1127
+ {QUOTA_DISPLAY_MODE_OPTIONS.map((option) => (
1128
+ <button
1129
+ key={option.value}
1130
+ type="button"
1131
+ onClick={() => setDisplayMode(option.value)}
1132
+ aria-pressed={displayMode === option.value}
1133
+ className={`flex min-h-11 flex-1 items-center justify-center gap-1.5 px-3 text-xs font-medium transition-colors sm:min-h-0 sm:flex-none sm:justify-start sm:px-2 sm:font-normal ${displayMode === option.value ? "bg-primary text-white" : "text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`}
1134
+ title={`Show quota in ${option.label} mode`}
1135
+ >
1136
+ <span className="material-symbols-outlined text-[17px] sm:text-[14px]">
1137
+ {option.icon}
1138
+ </span>
1139
+ <span>{option.label}</span>
1140
+ </button>
1141
+ ))}
1142
+ </div>
1134
1143
  <button
1135
1144
  type="button"
1136
- onClick={handleDisableDepleted}
1137
- disabled={bulkToggling}
1138
- className="flex h-8 shrink-0 items-center gap-1 rounded-lg border border-red-500/30 px-2 text-xs text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50"
1139
- title="Disable connections with depleted quota on the current page"
1145
+ onClick={() => setMobileActionsOpen((prev) => !prev)}
1146
+ aria-expanded={mobileActionsOpen}
1147
+ className={`flex size-11 items-center justify-center rounded-xl border text-text-primary transition-colors sm:hidden ${mobileActionsOpen ? "border-primary/30 bg-primary/10 text-primary" : "border-black/10 hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5"}`}
1148
+ aria-label={mobileActionsOpen ? "Hide more actions" : "Show more actions"}
1140
1149
  >
1141
- <span className="material-symbols-outlined text-[14px]">block</span>
1142
- <span className="hidden sm:inline">Turn off Empty</span>
1150
+ <span className="material-symbols-outlined text-[20px]">tune</span>
1143
1151
  </button>
1144
1152
 
1145
- {/* Bulk: enable available */}
1146
- <button
1147
- type="button"
1148
- onClick={handleEnableAvailable}
1149
- disabled={bulkToggling}
1150
- className="flex h-8 shrink-0 items-center gap-1 rounded-lg border border-emerald-500/30 px-2 text-xs text-emerald-500 transition-colors hover:bg-emerald-500/10 disabled:opacity-50"
1151
- title="Enable connections that still have quota on the current page"
1152
- >
1153
- <span className="material-symbols-outlined text-[14px]">
1154
- check_circle
1155
- </span>
1156
- <span className="hidden sm:inline">Turn on Available</span>
1157
- </button>
1153
+ <div className={`${mobileActionsOpen ? "flex" : "hidden"} col-span-3 flex-col gap-2 rounded-2xl border border-black/10 bg-black/[0.02] p-3 dark:border-white/10 dark:bg-white/[0.03] sm:contents`}>
1154
+ {providerFilter === "codex" && (
1155
+ <select
1156
+ value={quotaSortMode}
1157
+ onChange={(event) => setQuotaSortMode(event.target.value)}
1158
+ className="h-11 w-full rounded-xl border border-black/10 bg-surface px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/10 sm:h-8 sm:w-auto sm:rounded-lg sm:bg-black/[0.02] sm:px-2 dark:sm:bg-white/[0.03]"
1159
+ aria-label="Sort Codex quotas by remaining"
1160
+ >
1161
+ {QUOTA_SORT_OPTIONS.map((option) => (
1162
+ <option key={option.value} value={option.value}>
1163
+ {option.label}
1164
+ </option>
1165
+ ))}
1166
+ </select>
1167
+ )}
1158
1168
 
1159
- {/* Auto-refresh toggle */}
1160
- <button
1161
- onClick={() => setAutoRefresh((prev) => !prev)}
1162
- className="flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5"
1163
- title={autoRefresh ? "Disable auto-refresh" : "Enable auto-refresh"}
1164
- >
1165
- <span
1166
- className={`material-symbols-outlined text-[14px] ${
1167
- autoRefresh ? "text-primary" : "text-text-muted"
1168
- }`}
1169
+ <button
1170
+ type="button"
1171
+ onClick={() => setExpiringFirst((prev) => !prev)}
1172
+ aria-pressed={expiringFirst}
1173
+ className={`flex h-11 w-full shrink-0 items-center justify-between gap-2 rounded-xl border px-3 text-xs transition-colors sm:h-8 sm:w-auto sm:justify-start sm:rounded-lg sm:px-2 ${expiringFirst ? "border-amber-500/40 bg-amber-500/10 text-amber-600 dark:text-amber-400" : "border-black/10 bg-surface text-text-primary hover:bg-black/5 dark:border-white/10 dark:bg-transparent dark:hover:bg-white/5"}`}
1174
+ title="Sort accounts by earliest quota reset time"
1169
1175
  >
1170
- {autoRefresh ? "toggle_on" : "toggle_off"}
1171
- </span>
1172
- <span className="hidden text-text-primary sm:inline">
1173
- Auto-refresh
1174
- </span>
1175
- {autoRefresh && (
1176
- <span className="text-[10px] text-text-muted tabular-nums">
1177
- ({countdown}s)
1176
+ <span className="flex items-center gap-2">
1177
+ <span className="material-symbols-outlined text-[18px] sm:text-[14px]">hourglass_top</span>
1178
+ <span>Expiring first</span>
1178
1179
  </span>
1179
- )}
1180
- </button>
1180
+ <span className="material-symbols-outlined text-[18px] sm:hidden">
1181
+ {expiringFirst ? "check_circle" : "circle"}
1182
+ </span>
1183
+ </button>
1181
1184
 
1182
- {/* Refresh all button */}
1183
- <button
1184
- type="button"
1185
- onClick={refreshAll}
1186
- disabled={refreshingAll}
1187
- className="flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5 disabled:opacity-50"
1188
- title="Refresh all"
1189
- >
1190
- <span
1191
- className={`material-symbols-outlined text-[14px] ${refreshingAll ? "animate-spin" : ""}`}
1185
+ <button
1186
+ type="button"
1187
+ onClick={handleDisableDepleted}
1188
+ disabled={bulkToggling}
1189
+ className="flex h-11 w-full shrink-0 items-center gap-2 rounded-xl border border-red-500/30 bg-surface px-3 text-xs text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50 dark:bg-transparent sm:h-8 sm:w-auto sm:rounded-lg sm:px-2"
1190
+ title="Disable connections with depleted quota on the current page"
1192
1191
  >
1193
- refresh
1194
- </span>
1195
- </button>
1192
+ <span className="material-symbols-outlined text-[18px] sm:text-[14px]">block</span>
1193
+ <span>Turn off Empty</span>
1194
+ </button>
1195
+
1196
+ <button
1197
+ type="button"
1198
+ onClick={handleEnableAvailable}
1199
+ disabled={bulkToggling}
1200
+ className="flex h-11 w-full shrink-0 items-center gap-2 rounded-xl border border-emerald-500/30 bg-surface px-3 text-xs text-emerald-600 transition-colors hover:bg-emerald-500/10 disabled:opacity-50 dark:bg-transparent dark:text-emerald-400 sm:h-8 sm:w-auto sm:rounded-lg sm:px-2"
1201
+ title="Enable connections that still have quota on the current page"
1202
+ >
1203
+ <span className="material-symbols-outlined text-[18px] sm:text-[14px]">check_circle</span>
1204
+ <span>Turn on Available</span>
1205
+ </button>
1206
+
1207
+ <button
1208
+ type="button"
1209
+ onClick={() => setAutoRefresh((prev) => !prev)}
1210
+ className="flex h-11 w-full shrink-0 items-center justify-between gap-2 rounded-xl border border-black/10 bg-surface px-3 text-xs transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-transparent dark:hover:bg-white/5 sm:h-8 sm:w-auto sm:justify-start sm:rounded-lg sm:px-2"
1211
+ title={autoRefresh ? "Disable auto-refresh" : "Enable auto-refresh"}
1212
+ >
1213
+ <span className="flex items-center gap-2 text-text-primary">
1214
+ <span className={`material-symbols-outlined text-[18px] sm:text-[14px] ${autoRefresh ? "text-primary" : "text-text-muted"}`}>
1215
+ {autoRefresh ? "toggle_on" : "toggle_off"}
1216
+ </span>
1217
+ <span>Auto-refresh</span>
1218
+ </span>
1219
+ {autoRefresh && (
1220
+ <span className="text-[10px] text-text-muted tabular-nums">({countdown}s)</span>
1221
+ )}
1222
+ </button>
1223
+ </div>
1196
1224
  </div>
1197
1225
  </div>
1198
1226
 
@@ -1210,6 +1238,11 @@ export default function ProviderLimits() {
1210
1238
  const quota = isAggregate ? conn.quota : quotaData[conn.id];
1211
1239
  const isLoading = isAggregate ? conn.isLoading : loading[conn.id];
1212
1240
  const error = isAggregate ? conn.error : errors[conn.id];
1241
+ const quotaRows = quota?.quotas || [];
1242
+ const quotaExpanded = expandedQuotaCards[conn.id] === true;
1243
+ const mobileQuotaRows = quotaExpanded
1244
+ ? quotaRows
1245
+ : getUrgentQuotaRows(quotaRows);
1213
1246
 
1214
1247
  // Use table layout for all providers
1215
1248
  const isInactive = conn.isActive === false;
@@ -1221,7 +1254,7 @@ export default function ProviderLimits() {
1221
1254
  padding="none"
1222
1255
  className={`min-w-0 ${isInactive ? "opacity-60" : ""}`}
1223
1256
  >
1224
- <div className="px-3 py-2 border-b border-black/10 dark:border-white/10">
1257
+ <div className="border-b border-black/10 px-3 py-2 dark:border-white/10">
1225
1258
  <div className="flex items-center justify-between gap-2">
1226
1259
  <div className="flex items-center gap-2 min-w-0">
1227
1260
  <div className="w-8 h-8 shrink-0 rounded-md flex items-center justify-center overflow-hidden">
@@ -1247,7 +1280,7 @@ export default function ProviderLimits() {
1247
1280
  </div>
1248
1281
  </div>
1249
1282
 
1250
- <div className="flex items-center gap-1 shrink-0">
1283
+ <div className="flex shrink-0 items-center gap-0.5 sm:gap-1">
1251
1284
  <button
1252
1285
  type="button"
1253
1286
  onClick={() => (
@@ -1257,7 +1290,7 @@ export default function ProviderLimits() {
1257
1290
  )}
1258
1291
  disabled={isLoading || rowBusy}
1259
1292
  aria-label="Refresh quota"
1260
- className="p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 transition-colors disabled:opacity-50"
1293
+ className="flex size-11 items-center justify-center rounded-xl transition-colors hover:bg-black/5 disabled:opacity-50 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
1261
1294
  title="Refresh quota"
1262
1295
  >
1263
1296
  <span
@@ -1276,7 +1309,7 @@ export default function ProviderLimits() {
1276
1309
  }}
1277
1310
  disabled={rowBusy}
1278
1311
  aria-label="Edit connection"
1279
- className="p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary transition-colors disabled:opacity-50"
1312
+ className="flex size-11 items-center justify-center rounded-xl text-text-muted transition-colors hover:bg-black/5 hover:text-primary disabled:opacity-50 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
1280
1313
  title="Edit connection"
1281
1314
  >
1282
1315
  <span className="material-symbols-outlined text-[18px]">
@@ -1288,7 +1321,7 @@ export default function ProviderLimits() {
1288
1321
  onClick={() => handleDeleteConnection(conn.id)}
1289
1322
  disabled={rowBusy}
1290
1323
  aria-label="Delete connection"
1291
- className="p-1.5 rounded-lg hover:bg-red-500/10 text-red-500 transition-colors disabled:opacity-50"
1324
+ className="flex size-11 items-center justify-center rounded-xl text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50 sm:size-8 sm:rounded-lg"
1292
1325
  title="Delete connection"
1293
1326
  >
1294
1327
  <span
@@ -1298,7 +1331,7 @@ export default function ProviderLimits() {
1298
1331
  </span>
1299
1332
  </button>
1300
1333
  <div
1301
- className="inline-flex items-center pl-0.5"
1334
+ className="inline-flex size-11 items-center justify-center sm:h-8 sm:w-auto sm:pl-0.5"
1302
1335
  title={
1303
1336
  (conn.isActive ?? true)
1304
1337
  ? "Disable connection"
@@ -1307,6 +1340,7 @@ export default function ProviderLimits() {
1307
1340
  >
1308
1341
  <Toggle
1309
1342
  size="sm"
1343
+ touchTarget
1310
1344
  checked={conn.isActive ?? true}
1311
1345
  disabled={rowBusy}
1312
1346
  onChange={(nextActive) =>
@@ -1334,16 +1368,50 @@ export default function ProviderLimits() {
1334
1368
  </span>
1335
1369
  <p className="mt-1.5 text-xs text-text-muted">{error}</p>
1336
1370
  </div>
1337
- ) : (quota?.quotas?.length > 0) ? (
1371
+ ) : quotaRows.length > 0 ? (
1338
1372
  <div className="space-y-2">
1339
- <QuotaTable
1340
- quotas={quota.quotas}
1341
- compact
1342
- sortMode="default"
1343
- showSortLabel={
1344
- conn.provider === "codex" && quotaSortMode !== "default"
1345
- }
1346
- />
1373
+ <div className="sm:hidden">
1374
+ <QuotaTable
1375
+ quotas={mobileQuotaRows}
1376
+ totalCount={quotaRows.length}
1377
+ paginate={false}
1378
+ compact
1379
+ sortMode="default"
1380
+ showSortLabel={
1381
+ conn.provider === "codex" && quotaSortMode !== "default"
1382
+ }
1383
+ />
1384
+ {quotaRows.length > 3 && (
1385
+ <button
1386
+ type="button"
1387
+ onClick={() => setExpandedQuotaCards((current) => ({
1388
+ ...current,
1389
+ [conn.id]: !quotaExpanded,
1390
+ }))}
1391
+ className="mt-2 flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border border-black/10 bg-black/[0.02] text-xs font-medium text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/5"
1392
+ aria-expanded={quotaExpanded}
1393
+ >
1394
+ <span>
1395
+ {quotaExpanded
1396
+ ? "Show less"
1397
+ : `Show ${quotaRows.length - mobileQuotaRows.length} more`}
1398
+ </span>
1399
+ <span className="material-symbols-outlined text-[18px]">
1400
+ {quotaExpanded ? "expand_less" : "expand_more"}
1401
+ </span>
1402
+ </button>
1403
+ )}
1404
+ </div>
1405
+ <div className="hidden sm:block">
1406
+ <QuotaTable
1407
+ quotas={quotaRows}
1408
+ compact
1409
+ sortMode="default"
1410
+ showSortLabel={
1411
+ conn.provider === "codex" && quotaSortMode !== "default"
1412
+ }
1413
+ />
1414
+ </div>
1347
1415
  {quota?.message ? (
1348
1416
  <p className="px-1 text-[10px] text-text-muted">{quota.message}</p>
1349
1417
  ) : null}
@@ -1379,7 +1447,7 @@ export default function ProviderLimits() {
1379
1447
  setCustomPageSizeInput(String(nextPageSize));
1380
1448
  }
1381
1449
  }}
1382
- className="h-8 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10"
1450
+ className="h-11 rounded-xl border border-black/10 bg-black/[0.02] px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10 sm:h-8 sm:rounded-lg sm:px-2"
1383
1451
  aria-label="Accounts per page"
1384
1452
  >
1385
1453
  {ACCOUNT_PAGE_SIZE_OPTIONS.map((option) => (
@@ -1419,7 +1487,7 @@ export default function ProviderLimits() {
1419
1487
  setPageSize(nextPageSize);
1420
1488
  setCustomPageSizeInput(String(nextPageSize));
1421
1489
  }}
1422
- className="h-8 w-20 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10"
1490
+ className="h-11 w-24 rounded-xl border border-black/10 bg-black/[0.02] px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10 sm:h-8 sm:w-20 sm:rounded-lg sm:px-2"
1423
1491
  aria-label="Custom accounts per page"
1424
1492
  placeholder="Custom"
1425
1493
  />
@@ -1432,7 +1500,7 @@ export default function ProviderLimits() {
1432
1500
  disabled={
1433
1501
  pagination.page <= 1 || connectionsLoading || refreshingAll
1434
1502
  }
1435
- className="flex h-8 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
1503
+ className="flex h-11 items-center rounded-xl border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-8 sm:rounded-lg"
1436
1504
  >
1437
1505
  First Page
1438
1506
  </button>
@@ -1444,7 +1512,7 @@ export default function ProviderLimits() {
1444
1512
  disabled={
1445
1513
  pagination.page <= 1 || connectionsLoading || refreshingAll
1446
1514
  }
1447
- className="flex h-8 w-8 items-center justify-center rounded-lg border border-black/10 text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
1515
+ className="flex size-11 items-center justify-center rounded-xl border border-black/10 text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
1448
1516
  aria-label="Previous accounts page"
1449
1517
  >
1450
1518
  <span className="material-symbols-outlined text-[16px]">
@@ -1463,7 +1531,7 @@ export default function ProviderLimits() {
1463
1531
  connectionsLoading ||
1464
1532
  refreshingAll
1465
1533
  }
1466
- className="flex h-8 w-8 items-center justify-center rounded-lg border border-black/10 text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
1534
+ className="flex size-11 items-center justify-center rounded-xl border border-black/10 text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
1467
1535
  aria-label="Next accounts page"
1468
1536
  >
1469
1537
  <span className="material-symbols-outlined text-[16px]">
@@ -1478,7 +1546,7 @@ export default function ProviderLimits() {
1478
1546
  connectionsLoading ||
1479
1547
  refreshingAll
1480
1548
  }
1481
- className="flex h-8 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
1549
+ className="flex h-11 items-center rounded-xl border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-8 sm:rounded-lg"
1482
1550
  >
1483
1551
  Last Page
1484
1552
  </button>