claude-code-workflow 6.2.7 → 6.3.0

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 (208) hide show
  1. package/.claude/CLAUDE.md +16 -1
  2. package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +11 -4
  3. package/.claude/workflows/cli-templates/protocols/write-protocol.md +10 -75
  4. package/.claude/workflows/cli-tools-usage.md +14 -24
  5. package/.codex/AGENTS.md +51 -1
  6. package/.codex/prompts/compact.md +378 -0
  7. package/.gemini/GEMINI.md +57 -20
  8. package/ccw/dist/cli.d.ts.map +1 -1
  9. package/ccw/dist/cli.js +21 -8
  10. package/ccw/dist/cli.js.map +1 -1
  11. package/ccw/dist/commands/cli.d.ts +2 -0
  12. package/ccw/dist/commands/cli.d.ts.map +1 -1
  13. package/ccw/dist/commands/cli.js +129 -8
  14. package/ccw/dist/commands/cli.js.map +1 -1
  15. package/ccw/dist/commands/hook.d.ts.map +1 -1
  16. package/ccw/dist/commands/hook.js +3 -2
  17. package/ccw/dist/commands/hook.js.map +1 -1
  18. package/ccw/dist/config/litellm-api-config-manager.d.ts +180 -0
  19. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -0
  20. package/ccw/dist/config/litellm-api-config-manager.js +770 -0
  21. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -0
  22. package/ccw/dist/config/provider-models.d.ts +73 -0
  23. package/ccw/dist/config/provider-models.d.ts.map +1 -0
  24. package/ccw/dist/config/provider-models.js +172 -0
  25. package/ccw/dist/config/provider-models.js.map +1 -0
  26. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  27. package/ccw/dist/core/cache-manager.js +3 -5
  28. package/ccw/dist/core/cache-manager.js.map +1 -1
  29. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  30. package/ccw/dist/core/dashboard-generator.js +3 -1
  31. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  32. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  33. package/ccw/dist/core/routes/cli-routes.js +169 -0
  34. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  35. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  36. package/ccw/dist/core/routes/codexlens-routes.js +234 -18
  37. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  38. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  39. package/ccw/dist/core/routes/hooks-routes.js +30 -32
  40. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  41. package/ccw/dist/core/routes/litellm-api-routes.d.ts +21 -0
  42. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -0
  43. package/ccw/dist/core/routes/litellm-api-routes.js +780 -0
  44. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -0
  45. package/ccw/dist/core/routes/litellm-routes.d.ts +20 -0
  46. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -0
  47. package/ccw/dist/core/routes/litellm-routes.js +85 -0
  48. package/ccw/dist/core/routes/litellm-routes.js.map +1 -0
  49. package/ccw/dist/core/routes/mcp-routes.js +2 -2
  50. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  51. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  52. package/ccw/dist/core/routes/status-routes.js +39 -0
  53. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  54. package/ccw/dist/core/routes/system-routes.js +1 -1
  55. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  56. package/ccw/dist/core/server.d.ts.map +1 -1
  57. package/ccw/dist/core/server.js +15 -1
  58. package/ccw/dist/core/server.js.map +1 -1
  59. package/ccw/dist/mcp-server/index.js +1 -1
  60. package/ccw/dist/mcp-server/index.js.map +1 -1
  61. package/ccw/dist/tools/claude-cli-tools.d.ts +82 -0
  62. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -0
  63. package/ccw/dist/tools/claude-cli-tools.js +216 -0
  64. package/ccw/dist/tools/claude-cli-tools.js.map +1 -0
  65. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  66. package/ccw/dist/tools/cli-executor.js +76 -14
  67. package/ccw/dist/tools/cli-executor.js.map +1 -1
  68. package/ccw/dist/tools/codex-lens.d.ts +9 -2
  69. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  70. package/ccw/dist/tools/codex-lens.js +114 -9
  71. package/ccw/dist/tools/codex-lens.js.map +1 -1
  72. package/ccw/dist/tools/context-cache-store.d.ts +136 -0
  73. package/ccw/dist/tools/context-cache-store.d.ts.map +1 -0
  74. package/ccw/dist/tools/context-cache-store.js +256 -0
  75. package/ccw/dist/tools/context-cache-store.js.map +1 -0
  76. package/ccw/dist/tools/context-cache.d.ts +56 -0
  77. package/ccw/dist/tools/context-cache.d.ts.map +1 -0
  78. package/ccw/dist/tools/context-cache.js +294 -0
  79. package/ccw/dist/tools/context-cache.js.map +1 -0
  80. package/ccw/dist/tools/core-memory.d.ts.map +1 -1
  81. package/ccw/dist/tools/core-memory.js +33 -19
  82. package/ccw/dist/tools/core-memory.js.map +1 -1
  83. package/ccw/dist/tools/index.d.ts.map +1 -1
  84. package/ccw/dist/tools/index.js +2 -0
  85. package/ccw/dist/tools/index.js.map +1 -1
  86. package/ccw/dist/tools/litellm-client.d.ts +85 -0
  87. package/ccw/dist/tools/litellm-client.d.ts.map +1 -0
  88. package/ccw/dist/tools/litellm-client.js +188 -0
  89. package/ccw/dist/tools/litellm-client.js.map +1 -0
  90. package/ccw/dist/tools/litellm-executor.d.ts +34 -0
  91. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -0
  92. package/ccw/dist/tools/litellm-executor.js +192 -0
  93. package/ccw/dist/tools/litellm-executor.js.map +1 -0
  94. package/ccw/dist/tools/pattern-parser.d.ts +55 -0
  95. package/ccw/dist/tools/pattern-parser.d.ts.map +1 -0
  96. package/ccw/dist/tools/pattern-parser.js +237 -0
  97. package/ccw/dist/tools/pattern-parser.js.map +1 -0
  98. package/ccw/dist/tools/smart-search.d.ts +1 -0
  99. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  100. package/ccw/dist/tools/smart-search.js +117 -41
  101. package/ccw/dist/tools/smart-search.js.map +1 -1
  102. package/ccw/dist/types/litellm-api-config.d.ts +294 -0
  103. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -0
  104. package/ccw/dist/types/litellm-api-config.js +8 -0
  105. package/ccw/dist/types/litellm-api-config.js.map +1 -0
  106. package/ccw/src/cli.ts +258 -244
  107. package/ccw/src/commands/cli.ts +153 -9
  108. package/ccw/src/commands/hook.ts +3 -2
  109. package/ccw/src/config/.litellm-api-config-manager.ts.2025-12-23T11-57-43-727Z.bak +441 -0
  110. package/ccw/src/config/litellm-api-config-manager.ts +1012 -0
  111. package/ccw/src/config/provider-models.ts +222 -0
  112. package/ccw/src/core/cache-manager.ts +292 -294
  113. package/ccw/src/core/dashboard-generator.ts +3 -1
  114. package/ccw/src/core/routes/cli-routes.ts +192 -0
  115. package/ccw/src/core/routes/codexlens-routes.ts +241 -19
  116. package/ccw/src/core/routes/hooks-routes.ts +399 -405
  117. package/ccw/src/core/routes/litellm-api-routes.ts +930 -0
  118. package/ccw/src/core/routes/litellm-routes.ts +107 -0
  119. package/ccw/src/core/routes/mcp-routes.ts +1271 -1271
  120. package/ccw/src/core/routes/status-routes.ts +51 -0
  121. package/ccw/src/core/routes/system-routes.ts +1 -1
  122. package/ccw/src/core/server.ts +15 -1
  123. package/ccw/src/mcp-server/index.ts +1 -1
  124. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +44 -0
  125. package/ccw/src/templates/dashboard-css/31-api-settings.css +2265 -0
  126. package/ccw/src/templates/dashboard-js/components/cli-history.js +15 -8
  127. package/ccw/src/templates/dashboard-js/components/cli-status.js +323 -9
  128. package/ccw/src/templates/dashboard-js/components/navigation.js +329 -313
  129. package/ccw/src/templates/dashboard-js/i18n.js +583 -1
  130. package/ccw/src/templates/dashboard-js/views/api-settings.js +3362 -0
  131. package/ccw/src/templates/dashboard-js/views/cli-manager.js +199 -24
  132. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +1265 -27
  133. package/ccw/src/templates/dashboard.html +840 -831
  134. package/ccw/src/tools/claude-cli-tools.ts +300 -0
  135. package/ccw/src/tools/cli-executor.ts +83 -14
  136. package/ccw/src/tools/codex-lens.ts +146 -9
  137. package/ccw/src/tools/context-cache-store.ts +368 -0
  138. package/ccw/src/tools/context-cache.ts +393 -0
  139. package/ccw/src/tools/core-memory.ts +33 -19
  140. package/ccw/src/tools/index.ts +2 -0
  141. package/ccw/src/tools/litellm-client.ts +246 -0
  142. package/ccw/src/tools/litellm-executor.ts +241 -0
  143. package/ccw/src/tools/pattern-parser.ts +329 -0
  144. package/ccw/src/tools/smart-search.ts +142 -41
  145. package/ccw/src/types/litellm-api-config.ts +402 -0
  146. package/ccw-litellm/README.md +180 -0
  147. package/ccw-litellm/pyproject.toml +35 -0
  148. package/ccw-litellm/src/ccw_litellm/__init__.py +47 -0
  149. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-313.pyc +0 -0
  150. package/ccw-litellm/src/ccw_litellm/__pycache__/cli.cpython-313.pyc +0 -0
  151. package/ccw-litellm/src/ccw_litellm/cli.py +108 -0
  152. package/ccw-litellm/src/ccw_litellm/clients/__init__.py +12 -0
  153. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-313.pyc +0 -0
  154. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  155. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  156. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +251 -0
  157. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +165 -0
  158. package/ccw-litellm/src/ccw_litellm/config/__init__.py +22 -0
  159. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-313.pyc +0 -0
  160. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  161. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  162. package/ccw-litellm/src/ccw_litellm/config/loader.py +316 -0
  163. package/ccw-litellm/src/ccw_litellm/config/models.py +130 -0
  164. package/ccw-litellm/src/ccw_litellm/interfaces/__init__.py +14 -0
  165. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-313.pyc +0 -0
  166. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-313.pyc +0 -0
  167. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-313.pyc +0 -0
  168. package/ccw-litellm/src/ccw_litellm/interfaces/embedder.py +52 -0
  169. package/ccw-litellm/src/ccw_litellm/interfaces/llm.py +45 -0
  170. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  171. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  172. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  173. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  174. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
  175. package/codex-lens/src/codexlens/cli/commands.py +378 -23
  176. package/codex-lens/src/codexlens/cli/embedding_manager.py +660 -56
  177. package/codex-lens/src/codexlens/cli/model_manager.py +31 -18
  178. package/codex-lens/src/codexlens/cli/output.py +12 -1
  179. package/codex-lens/src/codexlens/config.py +93 -0
  180. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  181. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  182. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  183. package/codex-lens/src/codexlens/search/chain_search.py +6 -2
  184. package/codex-lens/src/codexlens/search/hybrid_search.py +44 -21
  185. package/codex-lens/src/codexlens/search/ranking.py +1 -1
  186. package/codex-lens/src/codexlens/semantic/__init__.py +42 -0
  187. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  188. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-313.pyc +0 -0
  189. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  190. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  191. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  192. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  193. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  194. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  195. package/codex-lens/src/codexlens/semantic/base.py +61 -0
  196. package/codex-lens/src/codexlens/semantic/chunker.py +43 -20
  197. package/codex-lens/src/codexlens/semantic/embedder.py +60 -13
  198. package/codex-lens/src/codexlens/semantic/factory.py +98 -0
  199. package/codex-lens/src/codexlens/semantic/gpu_support.py +225 -3
  200. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -0
  201. package/codex-lens/src/codexlens/semantic/rotational_embedder.py +434 -0
  202. package/codex-lens/src/codexlens/semantic/vector_store.py +33 -8
  203. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
  204. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
  205. package/codex-lens/src/codexlens/storage/path_mapper.py +27 -1
  206. package/package.json +15 -5
  207. package/.codex/prompts.zip +0 -0
  208. package/ccw/package.json +0 -65
@@ -0,0 +1,2265 @@
1
+ /* ========================================
2
+ * API Settings Styles - Modern UI
3
+ * ======================================== */
4
+
5
+ /* Main Layout */
6
+ .api-settings-container {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 2rem;
10
+ padding: 1.5rem;
11
+ max-width: 1400px;
12
+ margin: 0 auto;
13
+ }
14
+
15
+ /* Section Containers */
16
+ .api-settings-section {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: 1.25rem;
20
+ animation: fadeIn 0.3s ease-in-out;
21
+ }
22
+
23
+ @keyframes fadeIn {
24
+ from { opacity: 0; transform: translateY(10px); }
25
+ to { opacity: 1; transform: translateY(0); }
26
+ }
27
+
28
+ /* Section Headers */
29
+ .section-header {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: space-between;
33
+ padding-bottom: 0.5rem;
34
+ border-bottom: 1px solid hsl(var(--border));
35
+ }
36
+
37
+ .section-title-group {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 0.75rem;
41
+ }
42
+
43
+ .section-header h3 {
44
+ font-size: 1.125rem;
45
+ font-weight: 600;
46
+ color: hsl(var(--foreground));
47
+ margin: 0;
48
+ letter-spacing: -0.01em;
49
+ }
50
+
51
+ .section-badge {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ padding: 0.125rem 0.625rem;
56
+ font-size: 0.75rem;
57
+ font-weight: 500;
58
+ border-radius: 9999px;
59
+ background: hsl(var(--muted));
60
+ color: hsl(var(--muted-foreground));
61
+ }
62
+
63
+ /* Grid Layout */
64
+ .api-grid {
65
+ display: grid;
66
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
67
+ gap: 1.25rem;
68
+ }
69
+
70
+ /* Cards */
71
+ .api-card {
72
+ position: relative;
73
+ background: hsl(var(--card));
74
+ border: 1px solid hsl(var(--border));
75
+ border-radius: 0.75rem;
76
+ padding: 1.25rem;
77
+ transition: all 0.2s ease;
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: 1rem;
81
+ }
82
+
83
+ .api-card:hover {
84
+ border-color: hsl(var(--primary) / 0.5);
85
+ box-shadow: 0 4px 12px hsl(var(--primary) / 0.05);
86
+ transform: translateY(-2px);
87
+ }
88
+
89
+ .api-card.disabled {
90
+ opacity: 0.75;
91
+ background: hsl(var(--muted) / 0.1);
92
+ border-style: dashed;
93
+ }
94
+
95
+ /* Card Header */
96
+ .card-header {
97
+ display: flex;
98
+ align-items: flex-start;
99
+ justify-content: space-between;
100
+ gap: 1rem;
101
+ }
102
+
103
+ .card-title-group {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 0.75rem;
107
+ min-width: 0;
108
+ }
109
+
110
+ .card-icon {
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: center;
114
+ width: 2.5rem;
115
+ height: 2.5rem;
116
+ border-radius: 0.5rem;
117
+ background: hsl(var(--primary) / 0.1);
118
+ color: hsl(var(--primary));
119
+ flex-shrink: 0;
120
+ }
121
+
122
+ .provider-icon-openai { background: hsl(142 76% 36% / 0.1); color: hsl(142 76% 36%); }
123
+ .provider-icon-anthropic { background: hsl(22 90% 50% / 0.1); color: hsl(22 90% 50%); }
124
+ .provider-icon-google { background: hsl(217 91% 60% / 0.1); color: hsl(217 91% 60%); }
125
+ .provider-icon-azure { background: hsl(199 89% 48% / 0.1); color: hsl(199 89% 48%); }
126
+ .provider-icon-ollama { background: hsl(270 60% 60% / 0.1); color: hsl(270 60% 60%); }
127
+ .provider-icon-custom { background: hsl(var(--muted)); color: hsl(var(--foreground)); }
128
+
129
+ .card-info {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: 0.125rem;
133
+ min-width: 0;
134
+ }
135
+
136
+ .card-title {
137
+ font-size: 0.9375rem;
138
+ font-weight: 600;
139
+ color: hsl(var(--foreground));
140
+ margin: 0;
141
+ white-space: nowrap;
142
+ overflow: hidden;
143
+ text-overflow: ellipsis;
144
+ }
145
+
146
+ .card-subtitle {
147
+ font-size: 0.75rem;
148
+ color: hsl(var(--muted-foreground));
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 0.375rem;
152
+ }
153
+
154
+ /* Card Actions */
155
+ .card-actions {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 0.25rem;
159
+ margin-left: auto;
160
+ }
161
+
162
+ .btn-icon-sm {
163
+ display: inline-flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ width: 1.75rem;
167
+ height: 1.75rem;
168
+ border-radius: 0.375rem;
169
+ color: hsl(var(--muted-foreground));
170
+ transition: all 0.2s;
171
+ background: transparent;
172
+ border: none;
173
+ cursor: pointer;
174
+ }
175
+
176
+ .btn-icon-sm:hover {
177
+ background: hsl(var(--muted));
178
+ color: hsl(var(--foreground));
179
+ }
180
+
181
+ .btn-icon-sm.text-destructive:hover {
182
+ background: hsl(var(--destructive) / 0.1);
183
+ color: hsl(var(--destructive));
184
+ }
185
+
186
+ /* Card Body */
187
+ .card-body {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 0.75rem;
191
+ }
192
+
193
+ .card-meta-grid {
194
+ display: grid;
195
+ grid-template-columns: repeat(2, 1fr);
196
+ gap: 0.75rem;
197
+ }
198
+
199
+ .meta-item {
200
+ display: flex;
201
+ flex-direction: column;
202
+ gap: 0.125rem;
203
+ }
204
+
205
+ .meta-label {
206
+ font-size: 0.6875rem;
207
+ text-transform: uppercase;
208
+ letter-spacing: 0.05em;
209
+ color: hsl(var(--muted-foreground));
210
+ font-weight: 500;
211
+ }
212
+
213
+ .meta-value {
214
+ font-size: 0.8125rem;
215
+ color: hsl(var(--foreground));
216
+ font-family: 'SF Mono', 'Consolas', 'Liberation Mono', monospace;
217
+ white-space: nowrap;
218
+ overflow: hidden;
219
+ text-overflow: ellipsis;
220
+ }
221
+
222
+ /* Card Footer */
223
+ .card-footer {
224
+ margin-top: auto;
225
+ padding-top: 1rem;
226
+ border-top: 1px solid hsl(var(--border) / 0.5);
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: space-between;
230
+ gap: 1rem;
231
+ }
232
+
233
+ /* Badges */
234
+ .badge {
235
+ display: inline-flex;
236
+ align-items: center;
237
+ padding: 0.125rem 0.5rem;
238
+ font-size: 0.75rem;
239
+ font-weight: 500;
240
+ border-radius: 0.25rem;
241
+ line-height: 1.25;
242
+ }
243
+
244
+ .badge-outline {
245
+ border: 1px solid hsl(var(--border));
246
+ color: hsl(var(--muted-foreground));
247
+ }
248
+
249
+ .badge-primary {
250
+ background: hsl(var(--primary) / 0.1);
251
+ color: hsl(var(--primary));
252
+ }
253
+
254
+ .badge-success {
255
+ background: hsl(142 76% 36% / 0.1);
256
+ color: hsl(142 76% 36%);
257
+ }
258
+
259
+ .badge-warning {
260
+ background: hsl(45 93% 47% / 0.1);
261
+ color: hsl(45 93% 47%);
262
+ }
263
+
264
+ /* Provider Type Badge */
265
+ .provider-type-badge {
266
+ display: inline-flex;
267
+ align-items: center;
268
+ padding: 0.25rem 0.625rem;
269
+ font-size: 0.6875rem;
270
+ font-weight: 600;
271
+ text-transform: uppercase;
272
+ background: hsl(var(--primary) / 0.1);
273
+ color: hsl(var(--primary));
274
+ border-radius: 9999px;
275
+ letter-spacing: 0.03em;
276
+ }
277
+
278
+ /* Status Badge */
279
+ .status-badge {
280
+ display: inline-flex;
281
+ align-items: center;
282
+ gap: 0.25rem;
283
+ padding: 0.25rem 0.625rem;
284
+ font-size: 0.6875rem;
285
+ font-weight: 600;
286
+ border-radius: 9999px;
287
+ }
288
+
289
+ .status-badge.status-enabled {
290
+ background: hsl(142 76% 36% / 0.1);
291
+ color: hsl(142 76% 36%);
292
+ }
293
+
294
+ .status-badge.status-disabled {
295
+ background: hsl(var(--muted) / 0.5);
296
+ color: hsl(var(--muted-foreground));
297
+ }
298
+
299
+ /* Toggle Switch */
300
+ .toggle-switch {
301
+ position: relative;
302
+ display: inline-flex;
303
+ align-items: center;
304
+ cursor: pointer;
305
+ }
306
+
307
+ .toggle-switch input {
308
+ position: absolute;
309
+ width: 1px;
310
+ height: 1px;
311
+ padding: 0;
312
+ margin: -1px;
313
+ overflow: hidden;
314
+ clip: rect(0, 0, 0, 0);
315
+ white-space: nowrap;
316
+ border: 0;
317
+ }
318
+
319
+ .toggle-track {
320
+ width: 2.25rem;
321
+ height: 1.25rem;
322
+ background-color: hsl(var(--muted));
323
+ border-radius: 9999px;
324
+ transition: background-color 0.2s;
325
+ position: relative;
326
+ }
327
+
328
+ .toggle-thumb {
329
+ position: absolute;
330
+ top: 2px;
331
+ left: 2px;
332
+ width: 1rem;
333
+ height: 1rem;
334
+ background-color: white;
335
+ border-radius: 50%;
336
+ transition: transform 0.2s;
337
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
338
+ }
339
+
340
+ .toggle-switch input:checked + .toggle-track {
341
+ background-color: hsl(var(--primary));
342
+ }
343
+
344
+ .toggle-switch input:checked + .toggle-track .toggle-thumb {
345
+ transform: translateX(1rem);
346
+ }
347
+
348
+ .toggle-label {
349
+ margin-left: 0.5rem;
350
+ font-size: 0.875rem;
351
+ color: hsl(var(--foreground));
352
+ white-space: nowrap;
353
+ flex-shrink: 0;
354
+ }
355
+
356
+ /* Cache Settings Panel */
357
+ .cache-panel {
358
+ background: hsl(var(--card));
359
+ border: 1px solid hsl(var(--border));
360
+ border-radius: 0.75rem;
361
+ overflow: hidden;
362
+ }
363
+
364
+ .cache-header {
365
+ padding: 1.25rem;
366
+ background: hsl(var(--muted) / 0.3);
367
+ border-bottom: 1px solid hsl(var(--border));
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: space-between;
371
+ flex-wrap: wrap;
372
+ gap: 1rem;
373
+ }
374
+
375
+ .cache-header .section-title-group {
376
+ flex-shrink: 0;
377
+ }
378
+
379
+ .cache-header .toggle-switch {
380
+ flex-shrink: 0;
381
+ }
382
+
383
+ .cache-content {
384
+ padding: 1.5rem;
385
+ display: flex;
386
+ flex-direction: column;
387
+ gap: 1.5rem;
388
+ }
389
+
390
+ .cache-visual {
391
+ display: flex;
392
+ flex-direction: column;
393
+ gap: 0.75rem;
394
+ }
395
+
396
+ .cache-bars {
397
+ height: 1.5rem;
398
+ background: hsl(var(--muted) / 0.5);
399
+ border-radius: 0.5rem;
400
+ overflow: hidden;
401
+ position: relative;
402
+ display: flex;
403
+ }
404
+
405
+ .cache-bar-fill {
406
+ height: 100%;
407
+ background: linear-gradient(90deg, hsl(var(--primary)), hsl(var(--primary) / 0.8));
408
+ min-width: 2px;
409
+ transition: width 0.5s ease;
410
+ }
411
+
412
+ .cache-legend {
413
+ display: flex;
414
+ justify-content: space-between;
415
+ font-size: 0.75rem;
416
+ color: hsl(var(--muted-foreground));
417
+ }
418
+
419
+ .stat-grid {
420
+ display: grid;
421
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
422
+ gap: 1rem;
423
+ }
424
+
425
+ .stat-card {
426
+ background: hsl(var(--background));
427
+ padding: 1rem;
428
+ border-radius: 0.5rem;
429
+ border: 1px solid hsl(var(--border));
430
+ display: flex;
431
+ flex-direction: column;
432
+ gap: 0.25rem;
433
+ }
434
+
435
+ .stat-value {
436
+ font-size: 1.25rem;
437
+ font-weight: 700;
438
+ color: hsl(var(--foreground));
439
+ }
440
+
441
+ .stat-desc {
442
+ font-size: 0.75rem;
443
+ color: hsl(var(--muted-foreground));
444
+ }
445
+
446
+ /* Empty State */
447
+ .empty-state {
448
+ display: flex;
449
+ flex-direction: column;
450
+ align-items: center;
451
+ justify-content: center;
452
+ padding: 4rem 2rem;
453
+ background: hsl(var(--card));
454
+ border: 1px dashed hsl(var(--border));
455
+ border-radius: 0.75rem;
456
+ text-align: center;
457
+ }
458
+
459
+ .empty-icon-wrapper {
460
+ width: 4rem;
461
+ height: 4rem;
462
+ background: hsl(var(--muted) / 0.5);
463
+ border-radius: 50%;
464
+ display: flex;
465
+ align-items: center;
466
+ justify-content: center;
467
+ margin-bottom: 1rem;
468
+ color: hsl(var(--muted-foreground));
469
+ }
470
+
471
+ .empty-state h4 {
472
+ font-size: 1rem;
473
+ font-weight: 600;
474
+ color: hsl(var(--foreground));
475
+ margin: 0 0 0.5rem 0;
476
+ }
477
+
478
+ .empty-state p {
479
+ font-size: 0.875rem;
480
+ color: hsl(var(--muted-foreground));
481
+ max-width: 400px;
482
+ margin: 0;
483
+ }
484
+
485
+ /* Endpoint ID */
486
+ .endpoint-id {
487
+ font-family: 'SF Mono', 'Consolas', 'Liberation Mono', monospace;
488
+ font-size: 0.75rem;
489
+ padding: 0.25rem 0.5rem;
490
+ background: hsl(var(--muted) / 0.5);
491
+ border-radius: 0.25rem;
492
+ color: hsl(var(--primary));
493
+ }
494
+
495
+ /* Usage Hint */
496
+ .usage-hint {
497
+ display: flex;
498
+ align-items: center;
499
+ gap: 0.5rem;
500
+ padding: 0.625rem 0.75rem;
501
+ background: hsl(var(--muted) / 0.3);
502
+ border-radius: 0.375rem;
503
+ font-size: 0.75rem;
504
+ color: hsl(var(--muted-foreground));
505
+ margin-top: 0.375rem;
506
+ }
507
+
508
+ .usage-hint code {
509
+ font-family: 'SF Mono', 'Consolas', 'Liberation Mono', monospace;
510
+ font-size: 0.6875rem;
511
+ color: hsl(var(--foreground));
512
+ background: hsl(var(--muted) / 0.5);
513
+ padding: 0.125rem 0.375rem;
514
+ border-radius: 0.25rem;
515
+ }
516
+
517
+ /* Form Enhancements */
518
+ .api-settings-form {
519
+ display: flex;
520
+ flex-direction: column;
521
+ gap: 1.25rem;
522
+ }
523
+
524
+ .form-group {
525
+ display: flex;
526
+ flex-direction: column;
527
+ gap: 0.5rem;
528
+ }
529
+
530
+ .form-group label {
531
+ font-size: 0.875rem;
532
+ font-weight: 500;
533
+ margin-bottom: 0.25rem;
534
+ display: block;
535
+ color: hsl(var(--foreground));
536
+ }
537
+
538
+ /* Input Styles */
539
+ .cli-input {
540
+ width: 100%;
541
+ padding: 0.625rem 0.875rem;
542
+ font-size: 0.875rem;
543
+ line-height: 1.5;
544
+ color: hsl(var(--foreground));
545
+ background-color: hsl(var(--background));
546
+ border: 1px solid hsl(var(--border));
547
+ border-radius: 0.5rem;
548
+ transition: border-color 0.2s, box-shadow 0.2s;
549
+ }
550
+
551
+ .cli-input:focus {
552
+ outline: none;
553
+ border-color: hsl(var(--primary));
554
+ box-shadow: 0 0 0 3px hsl(var(--primary) / 0.1);
555
+ }
556
+
557
+ .cli-input:disabled {
558
+ opacity: 0.6;
559
+ cursor: not-allowed;
560
+ background-color: hsl(var(--muted) / 0.3);
561
+ }
562
+
563
+ .cli-input::placeholder {
564
+ color: hsl(var(--muted-foreground));
565
+ }
566
+
567
+ /* Select Styles */
568
+ select.cli-input {
569
+ cursor: pointer;
570
+ appearance: none;
571
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
572
+ background-position: right 0.5rem center;
573
+ background-repeat: no-repeat;
574
+ background-size: 1.5em 1.5em;
575
+ padding-right: 2.5rem;
576
+ }
577
+
578
+ /* Checkbox Label */
579
+ .checkbox-label {
580
+ display: flex;
581
+ align-items: center;
582
+ gap: 0.5rem;
583
+ font-size: 0.875rem;
584
+ color: hsl(var(--foreground));
585
+ cursor: pointer;
586
+ }
587
+
588
+ .checkbox-label input[type="checkbox"] {
589
+ width: 1rem;
590
+ height: 1rem;
591
+ border-radius: 0.25rem;
592
+ border: 1px solid hsl(var(--border));
593
+ cursor: pointer;
594
+ accent-color: hsl(var(--primary));
595
+ }
596
+
597
+ /* Form Hint */
598
+ .form-hint {
599
+ font-size: 0.75rem;
600
+ color: hsl(var(--muted-foreground));
601
+ margin-top: 0.25rem;
602
+ }
603
+
604
+ /* Form Fieldset */
605
+ .form-fieldset {
606
+ border: 1px solid hsl(var(--border));
607
+ border-radius: 0.5rem;
608
+ padding: 1rem;
609
+ margin: 0;
610
+ }
611
+
612
+ .form-fieldset legend {
613
+ font-size: 0.875rem;
614
+ font-weight: 500;
615
+ padding: 0 0.5rem;
616
+ color: hsl(var(--foreground));
617
+ }
618
+
619
+ /* Modal Actions */
620
+ .modal-actions {
621
+ display: flex;
622
+ align-items: center;
623
+ justify-content: flex-end;
624
+ gap: 0.75rem;
625
+ margin-top: 1.25rem;
626
+ padding-top: 1.25rem;
627
+ border-top: 1px solid hsl(var(--border));
628
+ }
629
+
630
+ .modal-actions button {
631
+ display: inline-flex;
632
+ align-items: center;
633
+ justify-content: center;
634
+ gap: 0.5rem;
635
+ padding: 0.625rem 1.25rem;
636
+ font-size: 0.875rem;
637
+ font-weight: 500;
638
+ border-radius: 0.5rem;
639
+ cursor: pointer;
640
+ transition: all 0.2s ease;
641
+ min-width: 5rem;
642
+ }
643
+
644
+ .modal-actions .btn-secondary {
645
+ background: transparent;
646
+ border: 1px solid hsl(var(--border));
647
+ color: hsl(var(--muted-foreground));
648
+ }
649
+
650
+ .modal-actions .btn-secondary:hover {
651
+ background: hsl(var(--muted));
652
+ color: hsl(var(--foreground));
653
+ border-color: hsl(var(--muted-foreground) / 0.3);
654
+ }
655
+
656
+ .modal-actions .btn-primary {
657
+ background: hsl(var(--primary));
658
+ border: 1px solid hsl(var(--primary));
659
+ color: hsl(var(--primary-foreground));
660
+ }
661
+
662
+ .modal-actions .btn-primary:hover {
663
+ background: hsl(var(--primary) / 0.9);
664
+ box-shadow: 0 2px 8px hsl(var(--primary) / 0.3);
665
+ }
666
+
667
+ .modal-actions .btn-primary:disabled {
668
+ opacity: 0.5;
669
+ cursor: not-allowed;
670
+ box-shadow: none;
671
+ }
672
+
673
+ .modal-actions .btn-danger {
674
+ background: hsl(var(--destructive));
675
+ border: 1px solid hsl(var(--destructive));
676
+ color: hsl(var(--destructive-foreground));
677
+ }
678
+
679
+ .modal-actions .btn-danger:hover {
680
+ background: hsl(var(--destructive) / 0.9);
681
+ box-shadow: 0 2px 8px hsl(var(--destructive) / 0.3);
682
+ }
683
+
684
+ .modal-actions button i,
685
+ .modal-actions button svg {
686
+ width: 1rem;
687
+ height: 1rem;
688
+ flex-shrink: 0;
689
+ }
690
+
691
+ /* Handle .btn class prefix */
692
+ .modal-actions .btn {
693
+ display: inline-flex;
694
+ align-items: center;
695
+ justify-content: center;
696
+ gap: 0.5rem;
697
+ padding: 0.625rem 1.25rem;
698
+ font-size: 0.875rem;
699
+ font-weight: 500;
700
+ border-radius: 0.5rem;
701
+ cursor: pointer;
702
+ transition: all 0.2s ease;
703
+ min-width: 5rem;
704
+ }
705
+
706
+ .modal-actions .btn.btn-secondary {
707
+ background: transparent;
708
+ border: 1px solid hsl(var(--border));
709
+ color: hsl(var(--muted-foreground));
710
+ }
711
+
712
+ .modal-actions .btn.btn-secondary:hover {
713
+ background: hsl(var(--muted));
714
+ color: hsl(var(--foreground));
715
+ border-color: hsl(var(--muted-foreground) / 0.3);
716
+ }
717
+
718
+ .modal-actions .btn.btn-primary {
719
+ background: hsl(var(--primary));
720
+ border: 1px solid hsl(var(--primary));
721
+ color: hsl(var(--primary-foreground));
722
+ }
723
+
724
+ .modal-actions .btn.btn-primary:hover {
725
+ background: hsl(var(--primary) / 0.9);
726
+ box-shadow: 0 2px 8px hsl(var(--primary) / 0.3);
727
+ }
728
+
729
+ /* Button Icon */
730
+ .btn-icon {
731
+ display: inline-flex;
732
+ align-items: center;
733
+ justify-content: center;
734
+ width: 2.25rem;
735
+ height: 2.25rem;
736
+ padding: 0;
737
+ border: 1px solid hsl(var(--border));
738
+ border-radius: 0.5rem;
739
+ background: hsl(var(--background));
740
+ color: hsl(var(--muted-foreground));
741
+ cursor: pointer;
742
+ transition: all 0.2s;
743
+ }
744
+
745
+ .btn-icon:hover {
746
+ background: hsl(var(--muted));
747
+ color: hsl(var(--foreground));
748
+ }
749
+
750
+ .text-muted {
751
+ color: hsl(var(--muted-foreground));
752
+ font-weight: 400;
753
+ }
754
+
755
+ .input-with-icon {
756
+ position: relative;
757
+ display: flex;
758
+ }
759
+
760
+ .input-with-icon input {
761
+ padding-right: 2.5rem;
762
+ flex: 1;
763
+ }
764
+
765
+ .input-icon-btn {
766
+ position: absolute;
767
+ right: 0.5rem;
768
+ top: 50%;
769
+ transform: translateY(-50%);
770
+ padding: 0.25rem;
771
+ background: transparent;
772
+ border: none;
773
+ color: hsl(var(--muted-foreground));
774
+ cursor: pointer;
775
+ border-radius: 0.25rem;
776
+ }
777
+
778
+ .input-icon-btn:hover {
779
+ color: hsl(var(--foreground));
780
+ background: hsl(var(--muted));
781
+ }
782
+
783
+ /* Modal Footer */
784
+ .modal-footer {
785
+ padding: 1rem 1.5rem;
786
+ background: hsl(var(--muted) / 0.3);
787
+ border-top: 1px solid hsl(var(--border));
788
+ display: flex;
789
+ justify-content: flex-end;
790
+ gap: 0.75rem;
791
+ }
792
+
793
+ /* API Key Input Group */
794
+ .api-key-input-group {
795
+ display: flex;
796
+ gap: 0.5rem;
797
+ }
798
+
799
+ .api-key-input-group input {
800
+ flex: 1;
801
+ }
802
+
803
+ /* Error Message */
804
+ .error-message {
805
+ display: flex;
806
+ align-items: center;
807
+ justify-content: center;
808
+ padding: 2rem;
809
+ font-size: 0.875rem;
810
+ color: hsl(var(--destructive));
811
+ text-align: center;
812
+ }
813
+
814
+ /* Responsive adjustments */
815
+ @media (max-width: 640px) {
816
+ .api-grid {
817
+ grid-template-columns: 1fr;
818
+ }
819
+
820
+ .card-meta-grid {
821
+ grid-template-columns: 1fr;
822
+ }
823
+
824
+ .section-header {
825
+ flex-direction: column;
826
+ align-items: flex-start;
827
+ gap: 0.75rem;
828
+ }
829
+
830
+ .section-header .btn {
831
+ width: 100%;
832
+ }
833
+
834
+ .cache-header {
835
+ flex-direction: column;
836
+ align-items: flex-start;
837
+ gap: 0.75rem;
838
+ }
839
+ }
840
+
841
+ @media (min-width: 768px) {
842
+ .api-settings-container {
843
+ padding: 2rem;
844
+ }
845
+ }
846
+
847
+
848
+ /* ========================================
849
+ * Advanced Settings - Collapsible Panel
850
+ * ======================================== */
851
+
852
+ .advanced-settings-fieldset {
853
+ margin-top: 0.5rem;
854
+ border: 1px solid hsl(var(--border));
855
+ border-radius: 0.5rem;
856
+ padding: 0;
857
+ overflow: hidden;
858
+ }
859
+
860
+ .advanced-settings-legend {
861
+ display: flex;
862
+ align-items: center;
863
+ gap: 0.5rem;
864
+ width: 100%;
865
+ padding: 0.75rem 1rem;
866
+ margin: 0;
867
+ font-size: 0.875rem;
868
+ font-weight: 500;
869
+ color: hsl(var(--muted-foreground));
870
+ background: hsl(var(--muted) / 0.3);
871
+ cursor: pointer;
872
+ transition: all 0.2s;
873
+ border: none;
874
+ }
875
+
876
+ .advanced-settings-legend:hover {
877
+ background: hsl(var(--muted) / 0.5);
878
+ color: hsl(var(--foreground));
879
+ }
880
+
881
+ .advanced-toggle-icon {
882
+ width: 1rem;
883
+ height: 1rem;
884
+ color: hsl(var(--muted-foreground));
885
+ transition: transform 0.2s;
886
+ }
887
+
888
+ .advanced-settings-legend.expanded .advanced-toggle-icon {
889
+ transform: rotate(90deg);
890
+ }
891
+
892
+ .advanced-settings-content {
893
+ padding: 1rem;
894
+ display: flex;
895
+ flex-direction: column;
896
+ gap: 1rem;
897
+ border-top: 1px solid hsl(var(--border));
898
+ }
899
+
900
+ .advanced-settings-content.collapsed {
901
+ display: none;
902
+ }
903
+
904
+ /* Form Row for Side-by-Side Fields */
905
+ .form-row {
906
+ display: flex;
907
+ gap: 1rem;
908
+ }
909
+
910
+ .form-group-half {
911
+ flex: 1;
912
+ min-width: 0;
913
+ }
914
+
915
+ /* Textarea Styling */
916
+ .cli-textarea {
917
+ resize: vertical;
918
+ min-height: 4rem;
919
+ max-height: 12rem;
920
+ font-family: 'SF Mono', 'Consolas', 'Liberation Mono', monospace;
921
+ font-size: 0.8125rem;
922
+ }
923
+
924
+ /* Provider-Specific Fields */
925
+ .provider-specific {
926
+ transition: opacity 0.2s ease, max-height 0.2s ease;
927
+ }
928
+
929
+ /* Responsive Adjustments for Advanced Settings */
930
+ @media (max-width: 480px) {
931
+ .form-row {
932
+ flex-direction: column;
933
+ }
934
+
935
+ .form-group-half {
936
+ width: 100%;
937
+ }
938
+ }
939
+
940
+
941
+ /* ========================================
942
+ * Split Layout - Provider List + Detail
943
+ * ======================================== */
944
+
945
+ /* Main Split Container */
946
+ .api-settings-container.api-settings-split {
947
+ display: flex;
948
+ flex-direction: row;
949
+ height: calc(100vh - 180px);
950
+ min-height: 500px;
951
+ gap: 0;
952
+ padding: 0;
953
+ border: 1px solid hsl(var(--border));
954
+ border-radius: 0.75rem;
955
+ overflow: hidden;
956
+ background: hsl(var(--card));
957
+ }
958
+
959
+ /* Left Sidebar */
960
+ .api-settings-sidebar {
961
+ width: 320px;
962
+ min-width: 280px;
963
+ border-right: 1px solid hsl(var(--border));
964
+ display: flex;
965
+ flex-direction: column;
966
+ background: hsl(var(--background));
967
+ }
968
+
969
+ /* ===========================
970
+ Sidebar Tabs
971
+ =========================== */
972
+
973
+ .sidebar-tabs {
974
+ display: flex;
975
+ gap: 0;
976
+ padding: 0.5rem;
977
+ background: hsl(var(--muted) / 0.3);
978
+ border-bottom: 1px solid hsl(var(--border));
979
+ }
980
+
981
+ .sidebar-tab {
982
+ flex: 1;
983
+ display: flex;
984
+ align-items: center;
985
+ justify-content: center;
986
+ gap: 0.25rem;
987
+ padding: 0.5rem 0.25rem;
988
+ font-size: 0.75rem;
989
+ font-weight: 500;
990
+ color: hsl(var(--muted-foreground));
991
+ background: transparent;
992
+ border: none;
993
+ border-radius: 0.375rem;
994
+ cursor: pointer;
995
+ transition: all 0.2s;
996
+ }
997
+
998
+ .sidebar-tab:hover {
999
+ color: hsl(var(--foreground));
1000
+ background: hsl(var(--muted) / 0.5);
1001
+ }
1002
+
1003
+ .sidebar-tab.active {
1004
+ color: hsl(var(--primary));
1005
+ background: hsl(var(--primary) / 0.1);
1006
+ }
1007
+
1008
+ .sidebar-tab i {
1009
+ width: 14px;
1010
+ height: 14px;
1011
+ }
1012
+
1013
+ /* Sidebar content areas */
1014
+ .sidebar-content {
1015
+ flex: 1;
1016
+ overflow-y: auto;
1017
+ }
1018
+
1019
+ /* Cache panel in sidebar */
1020
+ .cache-sidebar-panel {
1021
+ padding: 1rem;
1022
+ }
1023
+
1024
+ .cache-sidebar-panel h4 {
1025
+ margin: 0 0 1rem 0;
1026
+ font-size: 0.9rem;
1027
+ font-weight: 600;
1028
+ }
1029
+
1030
+ .cache-field {
1031
+ margin-bottom: 1rem;
1032
+ }
1033
+
1034
+ .cache-field label {
1035
+ display: block;
1036
+ font-size: 0.8rem;
1037
+ color: hsl(var(--muted-foreground));
1038
+ margin-bottom: 0.25rem;
1039
+ }
1040
+
1041
+ .cache-field input {
1042
+ width: 100%;
1043
+ }
1044
+
1045
+ /* Endpoints list in sidebar */
1046
+ .endpoints-sidebar-list {
1047
+ padding: 0.5rem;
1048
+ }
1049
+
1050
+ .endpoint-sidebar-item {
1051
+ display: flex;
1052
+ align-items: center;
1053
+ justify-content: space-between;
1054
+ padding: 0.75rem;
1055
+ margin-bottom: 0.5rem;
1056
+ background: hsl(var(--card));
1057
+ border: 1px solid hsl(var(--border));
1058
+ border-radius: 0.5rem;
1059
+ cursor: pointer;
1060
+ transition: all 0.2s;
1061
+ }
1062
+
1063
+ .endpoint-sidebar-item:hover {
1064
+ border-color: hsl(var(--primary) / 0.5);
1065
+ }
1066
+
1067
+ .endpoint-sidebar-item.selected {
1068
+ border-color: hsl(var(--primary));
1069
+ background: hsl(var(--primary) / 0.05);
1070
+ }
1071
+
1072
+ .endpoint-sidebar-info {
1073
+ flex: 1;
1074
+ min-width: 0;
1075
+ }
1076
+
1077
+ .endpoint-sidebar-name {
1078
+ font-weight: 500;
1079
+ font-size: 0.85rem;
1080
+ white-space: nowrap;
1081
+ overflow: hidden;
1082
+ text-overflow: ellipsis;
1083
+ }
1084
+
1085
+ .endpoint-sidebar-model {
1086
+ font-size: 0.75rem;
1087
+ color: hsl(var(--muted-foreground));
1088
+ white-space: nowrap;
1089
+ overflow: hidden;
1090
+ text-overflow: ellipsis;
1091
+ }
1092
+
1093
+ /* Empty state for endpoints */
1094
+ .endpoints-empty-state {
1095
+ text-align: center;
1096
+ padding: 2rem 1rem;
1097
+ color: hsl(var(--muted-foreground));
1098
+ }
1099
+
1100
+ .endpoints-empty-state i {
1101
+ width: 48px;
1102
+ height: 48px;
1103
+ margin-bottom: 1rem;
1104
+ opacity: 0.5;
1105
+ }
1106
+
1107
+ /* Responsive adjustments for tabs */
1108
+ @media (max-width: 768px) {
1109
+ .sidebar-tab {
1110
+ padding: 0.5rem 0.5rem;
1111
+ font-size: 0.7rem;
1112
+ }
1113
+
1114
+ .sidebar-tab i {
1115
+ width: 12px;
1116
+ height: 12px;
1117
+ }
1118
+ }
1119
+
1120
+
1121
+ /* Provider Search */
1122
+ .provider-search {
1123
+ position: relative;
1124
+ padding: 1rem;
1125
+ border-bottom: 1px solid hsl(var(--border));
1126
+ }
1127
+
1128
+ .provider-search input {
1129
+ width: 100%;
1130
+ padding-left: 2.25rem;
1131
+ }
1132
+
1133
+ .provider-search .search-icon {
1134
+ position: absolute;
1135
+ left: 1.5rem;
1136
+ top: 50%;
1137
+ transform: translateY(-50%);
1138
+ width: 1rem;
1139
+ height: 1rem;
1140
+ color: hsl(var(--muted-foreground));
1141
+ pointer-events: none;
1142
+ }
1143
+
1144
+ /* Provider List */
1145
+ .provider-list {
1146
+ flex: 1;
1147
+ overflow-y: auto;
1148
+ padding: 0.5rem;
1149
+ }
1150
+
1151
+ .provider-list-item {
1152
+ display: flex;
1153
+ align-items: center;
1154
+ gap: 0.75rem;
1155
+ padding: 0.75rem;
1156
+ margin-bottom: 0.25rem;
1157
+ border-radius: 0.5rem;
1158
+ cursor: pointer;
1159
+ transition: all 0.15s ease;
1160
+ border: 1px solid transparent;
1161
+ }
1162
+
1163
+ .provider-list-item:hover {
1164
+ background: hsl(var(--muted) / 0.5);
1165
+ }
1166
+
1167
+ .provider-list-item.selected {
1168
+ background: hsl(var(--primary) / 0.1);
1169
+ border-color: hsl(var(--primary) / 0.3);
1170
+ }
1171
+
1172
+ .provider-item-icon {
1173
+ width: 2rem;
1174
+ height: 2rem;
1175
+ border-radius: 0.375rem;
1176
+ display: flex;
1177
+ align-items: center;
1178
+ justify-content: center;
1179
+ flex-shrink: 0;
1180
+ font-size: 0.875rem;
1181
+ font-weight: 600;
1182
+ }
1183
+
1184
+ .provider-item-info {
1185
+ flex: 1;
1186
+ min-width: 0;
1187
+ display: flex;
1188
+ flex-direction: column;
1189
+ gap: 0.125rem;
1190
+ }
1191
+
1192
+ .provider-item-name {
1193
+ font-size: 0.875rem;
1194
+ font-weight: 500;
1195
+ color: hsl(var(--foreground));
1196
+ white-space: nowrap;
1197
+ overflow: hidden;
1198
+ text-overflow: ellipsis;
1199
+ }
1200
+
1201
+ .provider-item-type {
1202
+ font-size: 0.6875rem;
1203
+ color: hsl(var(--muted-foreground));
1204
+ text-transform: uppercase;
1205
+ letter-spacing: 0.03em;
1206
+ }
1207
+
1208
+ .provider-list-footer {
1209
+ padding: 1rem;
1210
+ border-top: 1px solid hsl(var(--border));
1211
+ }
1212
+
1213
+ .btn-full {
1214
+ width: 100%;
1215
+ }
1216
+
1217
+ /* Right Main Panel */
1218
+ .api-settings-main {
1219
+ flex: 1;
1220
+ display: flex;
1221
+ flex-direction: column;
1222
+ overflow: hidden;
1223
+ }
1224
+
1225
+ /* Provider Detail Header */
1226
+ .provider-detail-header {
1227
+ display: flex;
1228
+ align-items: center;
1229
+ justify-content: space-between;
1230
+ padding: 1.25rem 1.5rem;
1231
+ border-bottom: 1px solid hsl(var(--border));
1232
+ background: hsl(var(--muted) / 0.2);
1233
+ }
1234
+
1235
+ .provider-detail-title {
1236
+ display: flex;
1237
+ align-items: center;
1238
+ gap: 0.75rem;
1239
+ }
1240
+
1241
+ .provider-detail-title h2 {
1242
+ font-size: 1.125rem;
1243
+ font-weight: 600;
1244
+ margin: 0;
1245
+ }
1246
+
1247
+ .provider-detail-actions {
1248
+ display: flex;
1249
+ align-items: center;
1250
+ gap: 1rem;
1251
+ }
1252
+
1253
+ /* Provider Detail Content */
1254
+ .provider-detail-content {
1255
+ flex: 1;
1256
+ overflow-y: auto;
1257
+ padding: 1.5rem;
1258
+ display: flex;
1259
+ flex-direction: column;
1260
+ gap: 1.5rem;
1261
+ }
1262
+
1263
+ /* Field Groups */
1264
+ .field-group {
1265
+ display: flex;
1266
+ flex-direction: column;
1267
+ gap: 0.5rem;
1268
+ }
1269
+
1270
+ .field-label {
1271
+ display: flex;
1272
+ align-items: center;
1273
+ justify-content: space-between;
1274
+ font-size: 0.875rem;
1275
+ font-weight: 500;
1276
+ color: hsl(var(--foreground));
1277
+ }
1278
+
1279
+ .field-label-actions {
1280
+ display: flex;
1281
+ gap: 0.5rem;
1282
+ }
1283
+
1284
+ .field-input-group {
1285
+ display: flex;
1286
+ gap: 0.5rem;
1287
+ }
1288
+
1289
+ .field-input-group input {
1290
+ flex: 1;
1291
+ }
1292
+
1293
+ .field-hint {
1294
+ font-size: 0.75rem;
1295
+ color: hsl(var(--muted-foreground));
1296
+ }
1297
+
1298
+ /* Model Section */
1299
+ .model-section {
1300
+ flex: 1;
1301
+ display: flex;
1302
+ flex-direction: column;
1303
+ gap: 1rem;
1304
+ min-height: 200px;
1305
+ }
1306
+
1307
+ .model-section-header {
1308
+ display: flex;
1309
+ align-items: center;
1310
+ justify-content: space-between;
1311
+ }
1312
+
1313
+ .model-tabs {
1314
+ display: flex;
1315
+ gap: 0.25rem;
1316
+ padding: 0.25rem;
1317
+ background: hsl(var(--muted) / 0.5);
1318
+ border-radius: 0.5rem;
1319
+ }
1320
+
1321
+ .model-tab {
1322
+ padding: 0.5rem 1rem;
1323
+ font-size: 0.875rem;
1324
+ font-weight: 500;
1325
+ color: hsl(var(--muted-foreground));
1326
+ background: transparent;
1327
+ border: none;
1328
+ border-radius: 0.375rem;
1329
+ cursor: pointer;
1330
+ transition: all 0.15s;
1331
+ }
1332
+
1333
+ .model-tab:hover {
1334
+ color: hsl(var(--foreground));
1335
+ }
1336
+
1337
+ .model-tab.active {
1338
+ background: hsl(var(--background));
1339
+ color: hsl(var(--foreground));
1340
+ box-shadow: 0 1px 2px hsl(var(--foreground) / 0.05);
1341
+ }
1342
+
1343
+ .model-section-actions {
1344
+ display: flex;
1345
+ gap: 0.5rem;
1346
+ }
1347
+
1348
+ /* Model Tree */
1349
+ .model-tree {
1350
+ flex: 1;
1351
+ border: 1px solid hsl(var(--border));
1352
+ border-radius: 0.5rem;
1353
+ overflow: hidden;
1354
+ }
1355
+
1356
+ .model-tree-empty {
1357
+ display: flex;
1358
+ flex-direction: column;
1359
+ align-items: center;
1360
+ justify-content: center;
1361
+ padding: 3rem;
1362
+ color: hsl(var(--muted-foreground));
1363
+ text-align: center;
1364
+ }
1365
+
1366
+ .model-tree-empty-icon {
1367
+ width: 3rem;
1368
+ height: 3rem;
1369
+ margin-bottom: 1rem;
1370
+ opacity: 0.5;
1371
+ }
1372
+
1373
+ .model-group {
1374
+ border-bottom: 1px solid hsl(var(--border));
1375
+ }
1376
+
1377
+ .model-group:last-child {
1378
+ border-bottom: none;
1379
+ }
1380
+
1381
+ .model-group-header {
1382
+ display: flex;
1383
+ align-items: center;
1384
+ gap: 0.5rem;
1385
+ padding: 0.75rem 1rem;
1386
+ background: hsl(var(--muted) / 0.3);
1387
+ cursor: pointer;
1388
+ transition: background 0.15s;
1389
+ }
1390
+
1391
+ .model-group-header:hover {
1392
+ background: hsl(var(--muted) / 0.5);
1393
+ }
1394
+
1395
+ .model-group-toggle {
1396
+ width: 1rem;
1397
+ height: 1rem;
1398
+ color: hsl(var(--muted-foreground));
1399
+ transition: transform 0.2s;
1400
+ }
1401
+
1402
+ .model-group.expanded .model-group-toggle {
1403
+ transform: rotate(90deg);
1404
+ }
1405
+
1406
+ .model-group-name {
1407
+ flex: 1;
1408
+ font-size: 0.875rem;
1409
+ font-weight: 500;
1410
+ }
1411
+
1412
+ .model-group-count {
1413
+ font-size: 0.75rem;
1414
+ color: hsl(var(--muted-foreground));
1415
+ padding: 0.125rem 0.5rem;
1416
+ background: hsl(var(--muted) / 0.5);
1417
+ border-radius: 9999px;
1418
+ }
1419
+
1420
+ .model-group-children {
1421
+ display: none;
1422
+ }
1423
+
1424
+ .model-group.expanded .model-group-children {
1425
+ display: block;
1426
+ }
1427
+
1428
+ .model-item {
1429
+ display: flex;
1430
+ align-items: center;
1431
+ gap: 0.75rem;
1432
+ padding: 0.625rem 1rem 0.625rem 2.5rem;
1433
+ border-top: 1px solid hsl(var(--border) / 0.5);
1434
+ transition: background 0.15s;
1435
+ }
1436
+
1437
+ .model-item:hover {
1438
+ background: hsl(var(--muted) / 0.2);
1439
+ }
1440
+
1441
+ .model-item-icon {
1442
+ width: 1.5rem;
1443
+ height: 1.5rem;
1444
+ display: flex;
1445
+ align-items: center;
1446
+ justify-content: center;
1447
+ color: hsl(var(--primary));
1448
+ }
1449
+
1450
+ .model-item-name {
1451
+ flex: 1;
1452
+ font-size: 0.875rem;
1453
+ font-family: 'SF Mono', 'Consolas', 'Liberation Mono', monospace;
1454
+ }
1455
+
1456
+ .model-item-badge {
1457
+ font-size: 0.6875rem;
1458
+ padding: 0.125rem 0.375rem;
1459
+ background: hsl(var(--muted) / 0.5);
1460
+ border-radius: 0.25rem;
1461
+ color: hsl(var(--muted-foreground));
1462
+ }
1463
+
1464
+ .model-item-actions {
1465
+ display: flex;
1466
+ gap: 0.25rem;
1467
+ opacity: 0;
1468
+ transition: opacity 0.15s;
1469
+ }
1470
+
1471
+ .model-item:hover .model-item-actions {
1472
+ opacity: 1;
1473
+ }
1474
+
1475
+ /* Empty State for Main Panel */
1476
+ .provider-empty-state {
1477
+ flex: 1;
1478
+ display: flex;
1479
+ flex-direction: column;
1480
+ align-items: center;
1481
+ justify-content: center;
1482
+ padding: 3rem;
1483
+ color: hsl(var(--muted-foreground));
1484
+ text-align: center;
1485
+ }
1486
+
1487
+ .provider-empty-state-icon {
1488
+ width: 4rem;
1489
+ height: 4rem;
1490
+ margin-bottom: 1rem;
1491
+ opacity: 0.3;
1492
+ }
1493
+
1494
+ .provider-empty-state h3 {
1495
+ font-size: 1rem;
1496
+ font-weight: 500;
1497
+ margin: 0 0 0.5rem;
1498
+ color: hsl(var(--foreground));
1499
+ }
1500
+
1501
+ .provider-empty-state p {
1502
+ font-size: 0.875rem;
1503
+ margin: 0;
1504
+ }
1505
+
1506
+ /* Cache FAB Button */
1507
+ .cache-fab {
1508
+ position: fixed;
1509
+ bottom: 2rem;
1510
+ right: 2rem;
1511
+ width: 3.5rem;
1512
+ height: 3.5rem;
1513
+ background: hsl(var(--primary));
1514
+ color: white;
1515
+ border: none;
1516
+ border-radius: 50%;
1517
+ cursor: pointer;
1518
+ box-shadow: 0 4px 12px hsl(var(--primary) / 0.4);
1519
+ transition: all 0.2s;
1520
+ z-index: 50;
1521
+ display: flex;
1522
+ align-items: center;
1523
+ justify-content: center;
1524
+ }
1525
+
1526
+ .cache-fab:hover {
1527
+ transform: scale(1.05);
1528
+ box-shadow: 0 6px 16px hsl(var(--primary) / 0.5);
1529
+ }
1530
+
1531
+ .cache-fab svg {
1532
+ width: 1.5rem;
1533
+ height: 1.5rem;
1534
+ }
1535
+
1536
+ /* Cache Panel Overlay */
1537
+ .cache-panel-overlay {
1538
+ position: fixed;
1539
+ top: 0;
1540
+ left: 0;
1541
+ right: 0;
1542
+ bottom: 0;
1543
+ background: hsl(var(--foreground) / 0.5);
1544
+ z-index: 100;
1545
+ display: none;
1546
+ align-items: flex-end;
1547
+ justify-content: flex-end;
1548
+ padding: 2rem;
1549
+ }
1550
+
1551
+ .cache-panel-overlay.active {
1552
+ display: flex;
1553
+ }
1554
+
1555
+ .cache-panel-content {
1556
+ width: 400px;
1557
+ max-width: 90vw;
1558
+ max-height: 80vh;
1559
+ background: hsl(var(--card));
1560
+ border-radius: 0.75rem;
1561
+ box-shadow: 0 8px 32px hsl(var(--foreground) / 0.2);
1562
+ overflow: hidden;
1563
+ display: flex;
1564
+ flex-direction: column;
1565
+ }
1566
+
1567
+ /* Responsive */
1568
+ @media (max-width: 768px) {
1569
+ .api-settings-container.api-settings-split {
1570
+ flex-direction: column;
1571
+ height: auto;
1572
+ min-height: auto;
1573
+ }
1574
+
1575
+ .api-settings-sidebar {
1576
+ width: 100%;
1577
+ max-height: 300px;
1578
+ border-right: none;
1579
+ border-bottom: 1px solid hsl(var(--border));
1580
+ }
1581
+
1582
+ .api-settings-main {
1583
+ min-height: 400px;
1584
+ }
1585
+
1586
+ .cache-fab {
1587
+ bottom: 1rem;
1588
+ right: 1rem;
1589
+ }
1590
+
1591
+ .cache-panel-overlay {
1592
+ padding: 1rem;
1593
+ }
1594
+
1595
+ .cache-panel-content {
1596
+ width: 100%;
1597
+ }
1598
+ }
1599
+
1600
+ /* ===========================
1601
+ Multi-Key Trigger Button
1602
+ =========================== */
1603
+
1604
+ .multi-key-trigger {
1605
+ margin-top: 1.5rem;
1606
+ padding-top: 1rem;
1607
+ border-top: 1px solid hsl(var(--border));
1608
+ }
1609
+
1610
+ .multi-key-btn {
1611
+ display: inline-flex;
1612
+ align-items: center;
1613
+ gap: 0.5rem;
1614
+ padding: 0.75rem 1.25rem;
1615
+ font-size: 0.9rem;
1616
+ }
1617
+
1618
+ .multi-key-btn i {
1619
+ width: 18px;
1620
+ height: 18px;
1621
+ }
1622
+
1623
+ /* ===========================
1624
+ Multi-Key Management (Modal)
1625
+ =========================== */
1626
+
1627
+ .api-keys-section {
1628
+ margin-top: 1.5rem;
1629
+ padding: 1rem;
1630
+ background: hsl(var(--muted) / 0.3);
1631
+ border-radius: 0.5rem;
1632
+ }
1633
+
1634
+ .api-keys-header {
1635
+ display: flex;
1636
+ justify-content: space-between;
1637
+ align-items: center;
1638
+ margin-bottom: 1rem;
1639
+ }
1640
+
1641
+ .api-keys-header h4 {
1642
+ margin: 0;
1643
+ font-size: 0.9rem;
1644
+ font-weight: 600;
1645
+ }
1646
+
1647
+ .api-key-list {
1648
+ display: flex;
1649
+ flex-direction: column;
1650
+ gap: 0.75rem;
1651
+ }
1652
+
1653
+ .api-key-item {
1654
+ display: grid;
1655
+ grid-template-columns: 1fr 2fr auto auto auto;
1656
+ gap: 0.5rem;
1657
+ align-items: center;
1658
+ padding: 0.75rem;
1659
+ background: hsl(var(--card));
1660
+ border: 1px solid hsl(var(--border));
1661
+ border-radius: 0.5rem;
1662
+ }
1663
+
1664
+ .api-key-item input {
1665
+ font-size: 0.85rem;
1666
+ }
1667
+
1668
+ .api-key-item .key-label {
1669
+ grid-column: 1;
1670
+ }
1671
+
1672
+ .api-key-item .key-value {
1673
+ grid-column: 2;
1674
+ }
1675
+
1676
+ .api-key-item .key-weight {
1677
+ width: 60px;
1678
+ }
1679
+
1680
+ .api-key-item .key-status {
1681
+ display: flex;
1682
+ align-items: center;
1683
+ gap: 0.25rem;
1684
+ }
1685
+
1686
+ .key-status-indicator {
1687
+ width: 8px;
1688
+ height: 8px;
1689
+ border-radius: 50%;
1690
+ }
1691
+
1692
+ .key-status-indicator.healthy {
1693
+ background: hsl(var(--success));
1694
+ }
1695
+
1696
+ .key-status-indicator.unhealthy {
1697
+ background: hsl(var(--destructive));
1698
+ }
1699
+
1700
+ .key-status-indicator.unknown {
1701
+ background: hsl(var(--muted-foreground));
1702
+ }
1703
+
1704
+ .api-key-actions {
1705
+ display: flex;
1706
+ gap: 0.25rem;
1707
+ }
1708
+
1709
+ .api-key-actions button {
1710
+ padding: 0.25rem 0.5rem;
1711
+ font-size: 0.75rem;
1712
+ }
1713
+
1714
+ .add-key-btn {
1715
+ display: flex;
1716
+ align-items: center;
1717
+ gap: 0.25rem;
1718
+ padding: 0.5rem 1rem;
1719
+ font-size: 0.85rem;
1720
+ }
1721
+
1722
+ .no-keys-message {
1723
+ text-align: center;
1724
+ color: hsl(var(--muted-foreground));
1725
+ padding: 1rem;
1726
+ font-size: 0.85rem;
1727
+ }
1728
+
1729
+ /* ===========================
1730
+ Routing Strategy
1731
+ =========================== */
1732
+
1733
+ .routing-section {
1734
+ margin-top: 1rem;
1735
+ padding: 1rem;
1736
+ background: hsl(var(--muted) / 0.2);
1737
+ border-radius: 0.5rem;
1738
+ }
1739
+
1740
+ .routing-section label {
1741
+ display: block;
1742
+ margin-bottom: 0.5rem;
1743
+ font-size: 0.85rem;
1744
+ font-weight: 500;
1745
+ }
1746
+
1747
+ .routing-hint {
1748
+ margin-top: 0.25rem;
1749
+ font-size: 0.75rem;
1750
+ color: hsl(var(--muted-foreground));
1751
+ }
1752
+
1753
+ /* ===========================
1754
+ Health Check Configuration
1755
+ =========================== */
1756
+
1757
+ .health-check-section {
1758
+ margin-top: 1rem;
1759
+ padding: 1rem;
1760
+ background: hsl(var(--muted) / 0.2);
1761
+ border-radius: 0.5rem;
1762
+ }
1763
+
1764
+ .health-check-header {
1765
+ display: flex;
1766
+ justify-content: space-between;
1767
+ align-items: center;
1768
+ margin-bottom: 1rem;
1769
+ }
1770
+
1771
+ .health-check-header h5 {
1772
+ margin: 0;
1773
+ font-size: 0.85rem;
1774
+ font-weight: 600;
1775
+ }
1776
+
1777
+ .health-check-grid {
1778
+ display: grid;
1779
+ grid-template-columns: repeat(3, 1fr);
1780
+ gap: 1rem;
1781
+ }
1782
+
1783
+ .health-check-field label {
1784
+ display: block;
1785
+ font-size: 0.75rem;
1786
+ color: hsl(var(--muted-foreground));
1787
+ margin-bottom: 0.25rem;
1788
+ }
1789
+
1790
+ .health-check-field input {
1791
+ width: 100%;
1792
+ }
1793
+
1794
+ /* ===========================
1795
+ Key Test Button
1796
+ =========================== */
1797
+
1798
+ .test-key-btn {
1799
+ display: inline-flex;
1800
+ align-items: center;
1801
+ gap: 0.25rem;
1802
+ padding: 0.25rem 0.5rem;
1803
+ font-size: 0.75rem;
1804
+ background: hsl(var(--primary) / 0.1);
1805
+ border: 1px solid hsl(var(--primary) / 0.3);
1806
+ border-radius: 0.25rem;
1807
+ color: hsl(var(--primary));
1808
+ cursor: pointer;
1809
+ transition: all 0.2s;
1810
+ }
1811
+
1812
+ .test-key-btn:hover {
1813
+ background: hsl(var(--primary) / 0.2);
1814
+ }
1815
+
1816
+ .test-key-btn:disabled {
1817
+ opacity: 0.5;
1818
+ cursor: not-allowed;
1819
+ }
1820
+
1821
+ .test-key-btn.testing {
1822
+ animation: pulse 1s infinite;
1823
+ }
1824
+
1825
+ .test-result {
1826
+ display: inline-flex;
1827
+ align-items: center;
1828
+ gap: 0.25rem;
1829
+ padding: 0.25rem 0.5rem;
1830
+ font-size: 0.75rem;
1831
+ border-radius: 0.25rem;
1832
+ }
1833
+
1834
+ .test-result.success {
1835
+ background: hsl(var(--success) / 0.1);
1836
+ color: hsl(var(--success));
1837
+ }
1838
+
1839
+ .test-result.error {
1840
+ background: hsl(var(--destructive) / 0.1);
1841
+ color: hsl(var(--destructive));
1842
+ }
1843
+
1844
+ @keyframes pulse {
1845
+ 0%, 100% { opacity: 1; }
1846
+ 50% { opacity: 0.5; }
1847
+ }
1848
+
1849
+ /* ===========================
1850
+ Endpoints List in Sidebar
1851
+ =========================== */
1852
+
1853
+ .endpoints-list {
1854
+ flex: 1;
1855
+ overflow-y: auto;
1856
+ padding: 0.5rem;
1857
+ }
1858
+
1859
+ .endpoints-list .api-card {
1860
+ margin-bottom: 0.75rem;
1861
+ }
1862
+
1863
+ /* ===========================
1864
+ Main Panel Sections
1865
+ =========================== */
1866
+
1867
+ .endpoints-main-panel,
1868
+ .cache-main-panel {
1869
+ padding: 2rem;
1870
+ overflow-y: auto;
1871
+ }
1872
+
1873
+ .panel-header {
1874
+ margin-bottom: 2rem;
1875
+ }
1876
+
1877
+ .panel-header h2 {
1878
+ margin: 0 0 0.5rem 0;
1879
+ font-size: 1.5rem;
1880
+ font-weight: 600;
1881
+ color: hsl(var(--foreground));
1882
+ }
1883
+
1884
+ .panel-subtitle {
1885
+ margin: 0;
1886
+ color: hsl(var(--muted-foreground));
1887
+ font-size: 0.875rem;
1888
+ }
1889
+
1890
+ .endpoints-stats {
1891
+ display: flex;
1892
+ gap: 1rem;
1893
+ margin-bottom: 2rem;
1894
+ }
1895
+
1896
+ .cache-stats-grid {
1897
+ display: grid;
1898
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1899
+ gap: 1rem;
1900
+ margin-bottom: 1.5rem;
1901
+ }
1902
+
1903
+ .stat-card {
1904
+ padding: 1.5rem;
1905
+ background: hsl(var(--card));
1906
+ border: 1px solid hsl(var(--border));
1907
+ border-radius: 0.75rem;
1908
+ display: flex;
1909
+ align-items: center;
1910
+ gap: 1rem;
1911
+ }
1912
+
1913
+ .stat-icon {
1914
+ width: 40px;
1915
+ height: 40px;
1916
+ display: flex;
1917
+ align-items: center;
1918
+ justify-content: center;
1919
+ background: hsl(var(--primary) / 0.1);
1920
+ border-radius: 0.5rem;
1921
+ color: hsl(var(--primary));
1922
+ }
1923
+
1924
+ .stat-icon i {
1925
+ width: 20px;
1926
+ height: 20px;
1927
+ }
1928
+
1929
+ .stat-info {
1930
+ flex: 1;
1931
+ }
1932
+
1933
+ .stat-value {
1934
+ font-size: 1.75rem;
1935
+ font-weight: 700;
1936
+ color: hsl(var(--foreground));
1937
+ margin-bottom: 0.25rem;
1938
+ }
1939
+
1940
+ .stat-label {
1941
+ font-size: 0.75rem;
1942
+ color: hsl(var(--muted-foreground));
1943
+ text-transform: uppercase;
1944
+ letter-spacing: 0.05em;
1945
+ }
1946
+
1947
+ .settings-section {
1948
+ margin-bottom: 2rem;
1949
+ padding: 1.5rem;
1950
+ background: hsl(var(--card));
1951
+ border: 1px solid hsl(var(--border));
1952
+ border-radius: 0.75rem;
1953
+ }
1954
+
1955
+ .settings-section h3 {
1956
+ margin: 0 0 1rem 0;
1957
+ font-size: 1.125rem;
1958
+ font-weight: 600;
1959
+ color: hsl(var(--foreground));
1960
+ }
1961
+
1962
+ .storage-bar-container {
1963
+ margin-top: 1rem;
1964
+ }
1965
+
1966
+ .storage-bar {
1967
+ width: 100%;
1968
+ height: 8px;
1969
+ background: hsl(var(--muted));
1970
+ border-radius: 4px;
1971
+ overflow: hidden;
1972
+ margin-bottom: 0.5rem;
1973
+ }
1974
+
1975
+ .storage-bar-fill {
1976
+ height: 100%;
1977
+ background: hsl(var(--primary));
1978
+ transition: width 0.3s ease;
1979
+ }
1980
+
1981
+ .storage-label {
1982
+ font-size: 0.75rem;
1983
+ color: hsl(var(--muted-foreground));
1984
+ text-align: center;
1985
+ }
1986
+
1987
+ .cache-sidebar-info {
1988
+ flex: 1;
1989
+ display: flex;
1990
+ align-items: center;
1991
+ justify-content: center;
1992
+ }
1993
+
1994
+ .cache-sidebar-info p {
1995
+ margin: 0;
1996
+ text-align: center;
1997
+ line-height: 1.5;
1998
+ }
1999
+
2000
+ /* ===========================
2001
+ Responsive Adjustments
2002
+ =========================== */
2003
+
2004
+ @media (max-width: 768px) {
2005
+ .api-key-item {
2006
+ grid-template-columns: 1fr;
2007
+ gap: 0.5rem;
2008
+ }
2009
+
2010
+ .api-key-item .key-label,
2011
+ .api-key-item .key-value {
2012
+ grid-column: 1;
2013
+ }
2014
+
2015
+ .health-check-grid {
2016
+ grid-template-columns: 1fr;
2017
+ }
2018
+ }
2019
+
2020
+ /* ===========================
2021
+ Model Settings Modal - Endpoint Preview
2022
+ =========================== */
2023
+
2024
+ .endpoint-preview-section {
2025
+ background: hsl(var(--muted) / 0.3);
2026
+ border: 1px solid hsl(var(--border));
2027
+ border-radius: 0.5rem;
2028
+ padding: 1rem;
2029
+ margin-bottom: 0.5rem;
2030
+ }
2031
+
2032
+ .endpoint-preview-section h4 {
2033
+ display: flex;
2034
+ align-items: center;
2035
+ gap: 0.5rem;
2036
+ margin: 0 0 0.75rem 0;
2037
+ font-size: 0.875rem;
2038
+ font-weight: 600;
2039
+ color: hsl(var(--foreground));
2040
+ }
2041
+
2042
+ .endpoint-preview-section h4 i {
2043
+ width: 16px;
2044
+ height: 16px;
2045
+ color: hsl(var(--primary));
2046
+ }
2047
+
2048
+ .endpoint-preview-box {
2049
+ display: flex;
2050
+ align-items: center;
2051
+ gap: 0.5rem;
2052
+ padding: 0.625rem 0.75rem;
2053
+ background: hsl(var(--background));
2054
+ border: 1px solid hsl(var(--border));
2055
+ border-radius: 0.375rem;
2056
+ margin-bottom: 1rem;
2057
+ }
2058
+
2059
+ .endpoint-preview-box code {
2060
+ flex: 1;
2061
+ font-family: 'SF Mono', 'Consolas', 'Liberation Mono', monospace;
2062
+ font-size: 0.8125rem;
2063
+ color: hsl(var(--primary));
2064
+ word-break: break-all;
2065
+ }
2066
+
2067
+ .endpoint-preview-box .btn-icon-sm {
2068
+ flex-shrink: 0;
2069
+ }
2070
+
2071
+ /* Form Section within Modal */
2072
+ .form-section {
2073
+ margin-bottom: 1.25rem;
2074
+ }
2075
+
2076
+ .form-section h4 {
2077
+ margin: 0 0 0.75rem 0;
2078
+ font-size: 0.8125rem;
2079
+ font-weight: 600;
2080
+ color: hsl(var(--muted-foreground));
2081
+ text-transform: uppercase;
2082
+ letter-spacing: 0.05em;
2083
+ }
2084
+
2085
+ .form-section:last-of-type {
2086
+ margin-bottom: 0;
2087
+ }
2088
+
2089
+ /* Capabilities Checkboxes */
2090
+ .capabilities-checkboxes {
2091
+ display: flex;
2092
+ flex-wrap: wrap;
2093
+ gap: 0.75rem 1.5rem;
2094
+ }
2095
+
2096
+ .capabilities-checkboxes .checkbox-label {
2097
+ font-size: 0.875rem;
2098
+ }
2099
+
2100
+ /* ========== Embedding Pool Section ========== */
2101
+ .embedding-pool-main-panel {
2102
+ padding: 1.5rem;
2103
+ }
2104
+
2105
+ .embedding-pool-main-panel .panel-header {
2106
+ margin-bottom: 1.5rem;
2107
+ padding-bottom: 1rem;
2108
+ border-bottom: 1px solid hsl(var(--border));
2109
+ }
2110
+
2111
+ .embedding-pool-main-panel .panel-header h2 {
2112
+ display: flex;
2113
+ align-items: center;
2114
+ gap: 0.5rem;
2115
+ margin: 0 0 0.5rem 0;
2116
+ font-size: 1.5rem;
2117
+ font-weight: 600;
2118
+ color: hsl(var(--foreground));
2119
+ }
2120
+
2121
+ .embedding-pool-main-panel .panel-header h2 svg {
2122
+ width: 1.5rem;
2123
+ height: 1.5rem;
2124
+ color: hsl(var(--primary));
2125
+ }
2126
+
2127
+ .embedding-pool-main-panel .settings-section {
2128
+ margin-bottom: 1.5rem;
2129
+ padding: 1.25rem;
2130
+ background: hsl(var(--card));
2131
+ border: 1px solid hsl(var(--border));
2132
+ border-radius: 0.75rem;
2133
+ }
2134
+
2135
+ .embedding-pool-main-panel .settings-section .section-header {
2136
+ display: flex;
2137
+ align-items: center;
2138
+ justify-content: space-between;
2139
+ margin-bottom: 0;
2140
+ }
2141
+
2142
+ .embedding-pool-main-panel .settings-section .section-header h3 {
2143
+ margin: 0;
2144
+ font-size: 1rem;
2145
+ font-weight: 500;
2146
+ }
2147
+
2148
+ .embedding-pool-main-panel .form-group {
2149
+ margin-bottom: 1.25rem;
2150
+ }
2151
+
2152
+ .embedding-pool-main-panel .form-group:last-child {
2153
+ margin-bottom: 0;
2154
+ }
2155
+
2156
+ .embedding-pool-main-panel .form-group label {
2157
+ display: block;
2158
+ margin-bottom: 0.5rem;
2159
+ font-size: 0.875rem;
2160
+ font-weight: 500;
2161
+ color: hsl(var(--foreground));
2162
+ }
2163
+
2164
+ .embedding-pool-main-panel .form-actions {
2165
+ display: flex;
2166
+ justify-content: flex-end;
2167
+ gap: 0.75rem;
2168
+ margin-top: 1.5rem;
2169
+ padding-top: 1rem;
2170
+ border-top: 1px solid hsl(var(--border));
2171
+ }
2172
+
2173
+ /* Discovered Providers List */
2174
+ .discovered-providers-list {
2175
+ margin-top: 1rem;
2176
+ border: 1px solid hsl(var(--border));
2177
+ border-radius: 0.5rem;
2178
+ overflow: hidden;
2179
+ }
2180
+
2181
+ .discovered-providers-header {
2182
+ display: flex;
2183
+ align-items: center;
2184
+ justify-content: space-between;
2185
+ padding: 0.75rem 1rem;
2186
+ background: hsl(var(--muted) / 0.5);
2187
+ border-bottom: 1px solid hsl(var(--border));
2188
+ }
2189
+
2190
+ .discovered-providers-header h4 {
2191
+ margin: 0;
2192
+ font-size: 0.875rem;
2193
+ font-weight: 600;
2194
+ }
2195
+
2196
+ .discovered-providers-header .provider-count {
2197
+ font-size: 0.75rem;
2198
+ color: hsl(var(--muted-foreground));
2199
+ }
2200
+
2201
+ .discovered-provider-item {
2202
+ display: flex;
2203
+ align-items: center;
2204
+ justify-content: space-between;
2205
+ padding: 0.75rem 1rem;
2206
+ border-bottom: 1px solid hsl(var(--border));
2207
+ }
2208
+
2209
+ .discovered-provider-item:last-child {
2210
+ border-bottom: none;
2211
+ }
2212
+
2213
+ .discovered-provider-item.excluded {
2214
+ opacity: 0.5;
2215
+ background: hsl(var(--muted) / 0.3);
2216
+ }
2217
+
2218
+ .discovered-provider-info {
2219
+ display: flex;
2220
+ align-items: center;
2221
+ gap: 0.75rem;
2222
+ }
2223
+
2224
+ .discovered-provider-info .provider-icon {
2225
+ width: 1.25rem;
2226
+ height: 1.25rem;
2227
+ color: hsl(var(--primary));
2228
+ }
2229
+
2230
+ .discovered-provider-info .provider-icon.excluded {
2231
+ color: hsl(var(--muted-foreground));
2232
+ }
2233
+
2234
+ .discovered-provider-name {
2235
+ font-size: 0.875rem;
2236
+ font-weight: 500;
2237
+ }
2238
+
2239
+ .discovered-provider-keys {
2240
+ font-size: 0.75rem;
2241
+ color: hsl(var(--muted-foreground));
2242
+ }
2243
+
2244
+ .discovered-provider-actions .btn-sm {
2245
+ padding: 0.25rem 0.75rem;
2246
+ font-size: 0.75rem;
2247
+ }
2248
+
2249
+ /* Info Message */
2250
+ .info-message {
2251
+ display: flex;
2252
+ align-items: center;
2253
+ gap: 0.5rem;
2254
+ padding: 0.75rem 1rem;
2255
+ background: hsl(var(--muted) / 0.3);
2256
+ border-radius: 0.5rem;
2257
+ font-size: 0.875rem;
2258
+ color: hsl(var(--muted-foreground));
2259
+ }
2260
+
2261
+ .info-message svg {
2262
+ width: 1rem;
2263
+ height: 1rem;
2264
+ flex-shrink: 0;
2265
+ }