@lastbrain/ai-ui-react 1.0.68 → 1.0.70

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 (76) hide show
  1. package/dist/components/AiChipLabel.d.ts +8 -3
  2. package/dist/components/AiChipLabel.d.ts.map +1 -1
  3. package/dist/components/AiChipLabel.js +23 -70
  4. package/dist/components/AiContextButton.d.ts +10 -2
  5. package/dist/components/AiContextButton.d.ts.map +1 -1
  6. package/dist/components/AiContextButton.js +73 -291
  7. package/dist/components/AiImageButton.d.ts +5 -1
  8. package/dist/components/AiImageButton.d.ts.map +1 -1
  9. package/dist/components/AiImageButton.js +6 -142
  10. package/dist/components/AiInput.d.ts +5 -3
  11. package/dist/components/AiInput.d.ts.map +1 -1
  12. package/dist/components/AiInput.js +13 -25
  13. package/dist/components/AiPromptPanel.d.ts.map +1 -1
  14. package/dist/components/AiPromptPanel.js +64 -212
  15. package/dist/components/AiSelect.d.ts +5 -3
  16. package/dist/components/AiSelect.d.ts.map +1 -1
  17. package/dist/components/AiSelect.js +21 -30
  18. package/dist/components/AiStatusButton.d.ts +4 -1
  19. package/dist/components/AiStatusButton.d.ts.map +1 -1
  20. package/dist/components/AiStatusButton.js +211 -676
  21. package/dist/components/AiTextarea.d.ts +4 -2
  22. package/dist/components/AiTextarea.d.ts.map +1 -1
  23. package/dist/components/AiTextarea.js +14 -26
  24. package/dist/components/LBApiKeySelector.d.ts.map +1 -1
  25. package/dist/components/LBApiKeySelector.js +5 -166
  26. package/dist/components/LBConnectButton.d.ts +4 -7
  27. package/dist/components/LBConnectButton.d.ts.map +1 -1
  28. package/dist/components/LBConnectButton.js +17 -86
  29. package/dist/components/LBSigninModal.d.ts +1 -1
  30. package/dist/components/LBSigninModal.d.ts.map +1 -1
  31. package/dist/components/LBSigninModal.js +42 -320
  32. package/dist/context/LBAuthProvider.d.ts +35 -3
  33. package/dist/context/LBAuthProvider.d.ts.map +1 -1
  34. package/dist/context/LBAuthProvider.js +2 -0
  35. package/dist/examples/AiUiPremiumShowcase.d.ts +2 -0
  36. package/dist/examples/AiUiPremiumShowcase.d.ts.map +1 -0
  37. package/dist/examples/AiUiPremiumShowcase.js +15 -0
  38. package/dist/hooks/useAiModels.d.ts.map +1 -1
  39. package/dist/hooks/useModelManagement.d.ts.map +1 -1
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +2 -0
  43. package/dist/styles/inline.d.ts +1 -0
  44. package/dist/styles/inline.d.ts.map +1 -1
  45. package/dist/styles/inline.js +25 -129
  46. package/dist/styles.css +1268 -369
  47. package/dist/types.d.ts +3 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/utils/errorHandler.d.ts +2 -2
  50. package/dist/utils/errorHandler.d.ts.map +1 -1
  51. package/dist/utils/errorHandler.js +8 -1
  52. package/dist/utils/modelManagement.d.ts +13 -10
  53. package/dist/utils/modelManagement.d.ts.map +1 -1
  54. package/dist/utils/modelManagement.js +19 -2
  55. package/package.json +2 -2
  56. package/src/components/AiChipLabel.tsx +68 -101
  57. package/src/components/AiContextButton.tsx +142 -413
  58. package/src/components/AiImageButton.tsx +29 -190
  59. package/src/components/AiInput.tsx +49 -74
  60. package/src/components/AiPromptPanel.tsx +81 -260
  61. package/src/components/AiSelect.tsx +61 -69
  62. package/src/components/AiStatusButton.tsx +496 -1327
  63. package/src/components/AiTextarea.tsx +50 -63
  64. package/src/components/LBApiKeySelector.tsx +93 -271
  65. package/src/components/LBConnectButton.tsx +39 -336
  66. package/src/components/LBSigninModal.tsx +141 -472
  67. package/src/context/LBAuthProvider.tsx +45 -6
  68. package/src/examples/AiUiPremiumShowcase.tsx +94 -0
  69. package/src/hooks/useAiModels.ts +2 -1
  70. package/src/hooks/useModelManagement.ts +2 -1
  71. package/src/index.ts +3 -0
  72. package/src/styles/inline.ts +27 -148
  73. package/src/styles.css +1268 -369
  74. package/src/types.ts +3 -0
  75. package/src/utils/errorHandler.ts +16 -3
  76. package/src/utils/modelManagement.ts +53 -15
package/src/styles.css CHANGED
@@ -1,563 +1,1462 @@
1
- /**
2
- * @lastbrain/ai-ui-react - Styles CSS
3
- * Framework-agnostic styles for AI UI components
4
- */
5
-
6
- /* ========== Variables ========== */
7
1
  :root {
8
- --ai-primary: #3b82f6;
9
- --ai-primary-hover: #2563eb;
10
- --ai-success: #10b981;
11
- --ai-warning: #f59e0b;
12
- --ai-danger: #ef4444;
13
- --ai-border: #e5e7eb;
14
- --ai-text: #1f2937;
15
- --ai-text-secondary: #6b7280;
2
+ --ai-radius-sm: 12px;
3
+ --ai-radius-md: 16px;
4
+ --ai-radius-lg: 20px;
5
+ --ai-radius-full: 999px;
6
+ --ai-radius-current: var(--ai-radius-full);
7
+
8
+ --ai-size-sm-h: 40px;
9
+ --ai-size-md-h: 46px;
10
+ --ai-size-lg-h: 54px;
11
+ --ai-size-sm-font: 13px;
12
+ --ai-size-md-font: 14px;
13
+ --ai-size-lg-font: 16px;
14
+
16
15
  --ai-bg: #ffffff;
17
- --ai-bg-hover: #f9fafb;
18
- --ai-radius: 8px;
19
- --ai-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
20
- --ai-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
16
+ --ai-bg2: #ffffff;
17
+ --ai-bg3: #f8fafc;
18
+ --ai-glass: #ffffff;
19
+ --ai-glass-strong: #ffffff;
20
+ --ai-overlay: rgba(2, 6, 23, 0.48);
21
+ --ai-foreground: #0f172a;
22
+ --ai-muted: #64748b;
23
+ --ai-secondary: #475569;
24
+ --ai-tertiary: #94a3b8;
25
+
26
+ --ai-border: rgba(15, 23, 42, 0.14);
27
+ --ai-border-primary: rgba(37, 99, 235, 0.35);
28
+
29
+ --ai-primary: #2563eb;
30
+ --ai-primary-2: #7c3aed;
31
+ --ai-danger: #ef4444;
32
+
33
+ --ai-glow-rgb: 37, 99, 235;
34
+ --ai-red-rgb: 255, 80, 80;
35
+ --ai-blue-rgb: 90, 130, 255;
36
+ --ai-ring: rgba(37, 99, 235, 0.24);
37
+
38
+ --ai-shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.07);
39
+ --ai-shadow: 0 4px 12px rgba(15, 23, 42, 0.1);
40
+ --ai-shadow-lg: 0 12px 26px rgba(15, 23, 42, 0.15);
41
+ --ai-transition: 180ms cubic-bezier(0.2, 0.8, 0.2, 1);
42
+
43
+ --ai-bg-secondary: var(--ai-bg2);
44
+ --ai-bg-tertiary: var(--ai-bg3);
45
+ --ai-text-secondary: var(--ai-secondary);
46
+ --ai-text-tertiary: var(--ai-tertiary);
21
47
  }
22
48
 
23
- /* ========== Status Button ========== */
24
- .ai-status-button-wrapper {
25
- position: relative;
26
- display: inline-block;
49
+ [data-theme="dark"],
50
+ .dark,
51
+ :root[data-theme="dark"] {
52
+ --ai-bg: #101317;
53
+ --ai-bg2: #151a20;
54
+ --ai-bg3: #1c222b;
55
+ --ai-glass: #151a20;
56
+ --ai-glass-strong: #151a20;
57
+ --ai-overlay: rgba(0, 0, 0, 0.58);
58
+ --ai-foreground: #e2e8f0;
59
+ --ai-muted: #9aa7bd;
60
+ --ai-secondary: #c1ccdc;
61
+ --ai-tertiary: #7f8ea6;
62
+
63
+ --ai-border: rgba(148, 163, 184, 0.22);
64
+ --ai-border-primary: rgba(96, 165, 250, 0.45);
65
+
66
+ --ai-primary: #60a5fa;
67
+ --ai-primary-2: #a78bfa;
68
+ --ai-danger: #f87171;
69
+
70
+ --ai-glow-rgb: 99, 122, 255;
71
+ --ai-red-rgb: 255, 82, 82;
72
+ --ai-blue-rgb: 104, 126, 255;
73
+ --ai-ring: rgba(96, 165, 250, 0.32);
74
+
75
+ --ai-shadow-sm: 0 8px 20px rgba(2, 6, 23, 0.42);
76
+ --ai-shadow: 0 14px 34px rgba(2, 6, 23, 0.52);
77
+ --ai-shadow-lg: 0 22px 54px rgba(2, 6, 23, 0.62);
27
78
  }
28
79
 
29
- .ai-status-button {
30
- display: inline-flex;
31
- align-items: center;
32
- justify-content: center;
33
- width: 40px;
34
- height: 40px;
35
- border: 1px solid var(--ai-border);
36
- border-radius: var(--ai-radius);
37
- background: var(--ai-bg);
38
- color: var(--ai-text);
39
- cursor: pointer;
40
- transition: all 0.2s;
80
+ /* Radius + size props */
81
+ .ai-radius-sm {
82
+ --ai-radius-current: var(--ai-radius-sm);
41
83
  }
42
84
 
43
- .ai-status-button:hover {
44
- background: var(--ai-bg-hover);
45
- box-shadow: var(--ai-shadow);
85
+ .ai-radius-none {
86
+ --ai-radius-current: 0px;
46
87
  }
47
88
 
48
- .ai-status-button:disabled {
49
- opacity: 0.5;
50
- cursor: not-allowed;
89
+ .ai-radius-md {
90
+ --ai-radius-current: var(--ai-radius-md);
51
91
  }
52
92
 
53
- .ai-status-button--loading {
54
- cursor: wait;
93
+ .ai-radius-lg {
94
+ --ai-radius-current: var(--ai-radius-lg);
55
95
  }
56
96
 
57
- .ai-status-button--success {
58
- color: var(--ai-success);
97
+ .ai-radius-full {
98
+ --ai-radius-current: var(--ai-radius-full);
59
99
  }
60
100
 
61
- .ai-status-button--error {
62
- color: var(--ai-danger);
101
+ .ai-size-sm {
102
+ --ai-control-h: var(--ai-size-sm-h);
103
+ --ai-control-font: var(--ai-size-sm-font);
104
+ --ai-control-pad-x: 12px;
105
+ --ai-action-size: 28px;
63
106
  }
64
107
 
65
- .ai-spinner {
66
- animation: spin 1s linear infinite;
108
+ .ai-size-md {
109
+ --ai-control-h: var(--ai-size-md-h);
110
+ --ai-control-font: var(--ai-size-md-font);
111
+ --ai-control-pad-x: 14px;
112
+ --ai-action-size: 32px;
67
113
  }
68
114
 
69
- @keyframes spin {
70
- from {
71
- transform: rotate(0deg);
72
- }
73
- to {
74
- transform: rotate(360deg);
75
- }
115
+ .ai-size-lg {
116
+ --ai-control-h: var(--ai-size-lg-h);
117
+ --ai-control-font: var(--ai-size-lg-font);
118
+ --ai-control-pad-x: 16px;
119
+ --ai-action-size: 36px;
120
+ }
121
+
122
+ /* Base surface */
123
+ .ai-surface {
124
+ border: 1px solid var(--ai-border);
125
+ border-radius: var(--ai-radius-current, var(--ai-radius-md));
126
+ color: var(--ai-foreground);
127
+ background:
128
+ linear-gradient(180deg, var(--ai-bg2), var(--ai-bg2)),
129
+ radial-gradient(
130
+ 100% 130% at 0% 0%,
131
+ rgba(var(--ai-glow-rgb), 0.05),
132
+ transparent 70%
133
+ );
134
+ backdrop-filter: blur(12px);
135
+ -webkit-backdrop-filter: blur(12px);
136
+ box-shadow: var(--ai-shadow-sm);
137
+ transition:
138
+ border-color var(--ai-transition),
139
+ box-shadow var(--ai-transition),
140
+ transform var(--ai-transition),
141
+ background var(--ai-transition);
142
+ }
143
+
144
+ /* Glow wrapper */
145
+ .ai-glow {
146
+ position: relative;
147
+ isolation: isolate;
148
+ overflow: visible;
149
+ border-radius: inherit;
76
150
  }
77
151
 
78
- /* ========== Tooltip ========== */
79
- .ai-tooltip {
152
+ .ai-glow::before,
153
+ .ai-glow::after {
154
+ content: "";
80
155
  position: absolute;
81
- top: calc(100% + 8px);
156
+ top: -8px;
157
+ bottom: -8px;
158
+ width: 52%;
159
+ opacity: 0.18;
160
+ filter: blur(20px);
161
+ pointer-events: none;
162
+ z-index: 0;
163
+ }
164
+
165
+ .ai-glow::before {
166
+ left: 0;
167
+ background: radial-gradient(
168
+ ellipse at 0% 50%,
169
+ rgba(var(--ai-red-rgb), 0.34) 0%,
170
+ rgba(var(--ai-red-rgb), 0.12) 38%,
171
+ rgba(var(--ai-red-rgb), 0) 74%
172
+ );
173
+ }
174
+
175
+ .ai-glow::after {
82
176
  right: 0;
83
- z-index: 1000;
84
- min-width: 200px;
85
- padding: 16px;
86
- background: #ffffff;
87
- border: 1px solid #e5e7eb;
88
- border-radius: var(--ai-radius);
89
- box-shadow:
90
- 0 20px 25px -5px rgb(0 0 0 / 0.1),
91
- 0 8px 10px -6px rgb(0 0 0 / 0.1);
92
- font-size: 12px;
93
- animation: fadeIn 0.2s;
94
- color: #1f2937;
177
+ background: radial-gradient(
178
+ ellipse at 100% 50%,
179
+ rgba(var(--ai-blue-rgb), 0.34) 0%,
180
+ rgba(var(--ai-blue-rgb), 0.12) 38%,
181
+ rgba(var(--ai-blue-rgb), 0) 74%
182
+ );
95
183
  }
96
184
 
97
- .ai-tooltip--status {
98
- min-width: 320px;
99
- max-width: 400px;
185
+ /* Control shell */
186
+ .ai-control-group {
187
+ position: relative;
188
+ width: 100%;
100
189
  }
101
190
 
102
- .ai-tooltip__header {
103
- font-weight: 600;
104
- font-size: 16px;
105
- padding-bottom: 12px;
106
- margin-bottom: 12px;
107
- border-bottom: 1px solid #e5e7eb;
108
- color: #111827;
191
+ .ai-shell {
192
+ position: relative;
193
+ z-index: 1;
194
+ display: flex;
195
+ align-items: center;
196
+ gap: 10px;
197
+ min-height: var(--ai-control-h, var(--ai-size-md-h));
198
+ padding: 0 12px;
199
+ border-radius: var(--ai-radius-current, var(--ai-radius-full));
200
+ border: 1px solid var(--ai-border);
201
+ background:
202
+ linear-gradient(180deg, var(--ai-glass-strong), var(--ai-glass-strong)),
203
+ radial-gradient(
204
+ 100% 160% at 0% 0%,
205
+ rgba(var(--ai-glow-rgb), 0.06),
206
+ transparent 70%
207
+ );
208
+ backdrop-filter: blur(12px);
209
+ -webkit-backdrop-filter: blur(12px);
210
+ box-shadow:
211
+ var(--ai-shadow-sm),
212
+ inset 0 1px 0 color-mix(in srgb, var(--ai-foreground) 4%, transparent);
213
+ transition:
214
+ border-color var(--ai-transition),
215
+ box-shadow var(--ai-transition),
216
+ transform var(--ai-transition);
109
217
  }
110
218
 
111
- .ai-tooltip__section {
112
- padding: 12px 0;
113
- border-top: 1px solid #f3f4f6;
219
+ .ai-shell::before {
220
+ content: "";
221
+ position: absolute;
222
+ inset: -1px;
223
+ border-radius: inherit;
224
+ padding: 1px;
225
+ background: linear-gradient(
226
+ 90deg,
227
+ rgba(var(--ai-red-rgb), 0.24),
228
+ color-mix(in srgb, var(--ai-foreground) 10%, transparent),
229
+ rgba(var(--ai-blue-rgb), 0.24)
230
+ );
231
+ -webkit-mask:
232
+ linear-gradient(#000 0 0) content-box,
233
+ linear-gradient(#000 0 0);
234
+ -webkit-mask-composite: xor;
235
+ mask-composite: exclude;
236
+ pointer-events: none;
237
+ opacity: 0.84;
238
+ }
239
+
240
+ .ai-shell:hover {
241
+ border-color: color-mix(in srgb, var(--ai-primary) 42%, var(--ai-border));
242
+ box-shadow:
243
+ var(--ai-shadow),
244
+ 0 0 0 1px rgba(var(--ai-glow-rgb), 0.16),
245
+ 0 0 12px rgba(var(--ai-glow-rgb), 0.14);
114
246
  }
115
247
 
116
- .ai-tooltip__section:first-child {
117
- border-top: none;
118
- padding-top: 0;
248
+ .ai-shell:focus-within {
249
+ border-color: color-mix(in srgb, var(--ai-primary) 70%, var(--ai-border));
250
+ box-shadow:
251
+ var(--ai-shadow),
252
+ 0 0 0 3px var(--ai-ring),
253
+ 0 0 14px rgba(var(--ai-glow-rgb), 0.16);
119
254
  }
120
255
 
121
- .ai-tooltip__subtitle {
122
- font-weight: 600;
123
- margin-bottom: 8px;
124
- font-size: 12px;
125
- color: #111827;
126
- text-transform: uppercase;
127
- letter-spacing: 0.05em;
256
+ .ai-shell--textarea {
257
+ align-items: stretch;
258
+ padding: 10px 12px;
259
+ min-height: 126px;
128
260
  }
129
261
 
130
- .ai-tooltip__row {
131
- display: flex;
132
- justify-content: space-between;
133
- gap: 16px;
134
- margin-bottom: 6px;
135
- align-items: center;
262
+ .ai-control {
263
+ width: 100%;
264
+ border: 0;
265
+ outline: none;
266
+ background: transparent;
267
+ color: var(--ai-foreground);
268
+ font-size: var(--ai-control-font, var(--ai-size-md-font));
269
+ line-height: 1.45;
270
+ font-family: inherit;
136
271
  }
137
272
 
138
- .ai-tooltip__label {
139
- color: #6b7280;
140
- font-size: 12px;
273
+ .ai-control::placeholder,
274
+ .ai-field::placeholder {
275
+ color: color-mix(in srgb, var(--ai-muted) 86%, transparent);
141
276
  }
142
277
 
143
- .ai-tooltip__value {
144
- font-family:
145
- ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
146
- "Courier New", monospace;
147
- font-size: 12px;
148
- color: #111827;
149
- font-weight: 500;
278
+ .ai-control-input,
279
+ .ai-field {
280
+ flex: 1 1 auto;
281
+ height: calc(var(--ai-control-h, var(--ai-size-md-h)) - 6px);
282
+ min-height: 34px;
283
+ padding: 0 var(--ai-control-pad-x, 14px) 0 2px;
284
+ margin: 0;
285
+ line-height: 1;
150
286
  }
151
287
 
152
- .ai-tooltip__value--bold {
153
- font-weight: 700;
154
- color: #111827;
288
+ .ai-control-input--with-action {
289
+ padding-right: 2px;
155
290
  }
156
291
 
157
- .ai-tooltip__value--capitalize {
158
- text-transform: capitalize;
292
+ .ai-control-select {
293
+ appearance: none;
294
+ -webkit-appearance: none;
295
+ -moz-appearance: none;
296
+ cursor: pointer;
297
+ padding-right: calc(var(--ai-action-size, 32px) + 34px);
159
298
  }
160
299
 
161
- .ai-tooltip__value--success {
162
- color: #10b981;
163
- font-weight: 600;
300
+ .ai-control-select-chevron {
301
+ position: absolute;
302
+ right: calc(var(--ai-action-size, 32px) + 14px);
303
+ top: 50%;
304
+ transform: translateY(-50%);
305
+ color: color-mix(in srgb, var(--ai-muted) 86%, transparent);
306
+ pointer-events: none;
164
307
  }
165
308
 
166
- .ai-tooltip__value--warning {
167
- color: #f59e0b;
168
- font-weight: 600;
309
+ .ai-control-textarea {
310
+ min-height: 96px;
311
+ resize: none;
312
+ overflow: hidden;
313
+ padding: 6px 2px 8px;
169
314
  }
170
315
 
171
- .ai-tooltip__actions {
172
- display: flex;
173
- gap: 8px;
174
- justify-content: space-between;
175
- padding-top: 12px;
176
- margin-top: 8px;
177
- border-top: 1px solid #f3f4f6;
316
+ .ai-control[aria-invalid="true"],
317
+ .ai-control.ai-control--error {
318
+ color: var(--ai-danger);
178
319
  }
179
320
 
180
- .ai-tooltip__link {
181
- flex: 1;
182
- text-align: center;
183
- padding: 6px 12px;
184
- color: #3b82f6;
185
- text-decoration: none;
186
- border-radius: 6px;
187
- transition: all 0.2s;
188
- font-size: 11px;
189
- font-weight: 500;
190
- background: #eff6ff;
191
- border: 1px solid #dbeafe;
321
+ .ai-control:disabled,
322
+ .ai-control.ai-control--disabled,
323
+ .ai-shell.ai-control--disabled {
324
+ opacity: 0.58;
325
+ cursor: not-allowed;
326
+ box-shadow: none;
327
+ }
328
+
329
+ .ai-control-action,
330
+ .ai-spark {
331
+ flex: 0 0 auto;
332
+ width: var(--ai-action-size, 32px);
333
+ height: var(--ai-action-size, 32px);
334
+ border-radius: var(--ai-radius-full);
335
+ border: 1px solid color-mix(in srgb, var(--ai-primary) 30%, var(--ai-border));
336
+ background: var(--ai-bg);
337
+ color: var(--ai-primary);
338
+ display: inline-flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ cursor: pointer;
342
+ transition: all var(--ai-transition);
192
343
  }
193
344
 
194
- .ai-tooltip__link:hover {
195
- background: #dbeafe;
196
- border-color: #3b82f6;
345
+ .ai-control-action:hover,
346
+ .ai-spark:hover {
197
347
  transform: translateY(-1px);
348
+ border-color: color-mix(in srgb, var(--ai-primary) 70%, var(--ai-border));
349
+ box-shadow:
350
+ 0 0 14px rgba(var(--ai-red-rgb), 0.14),
351
+ 0 0 20px rgba(var(--ai-blue-rgb), 0.22);
198
352
  }
199
353
 
200
- @keyframes fadeIn {
201
- from {
202
- opacity: 0;
203
- transform: translateY(-4px);
204
- }
205
- to {
206
- opacity: 1;
207
- transform: translateY(0);
208
- }
354
+ .ai-control-action:disabled,
355
+ .ai-spark:disabled {
356
+ opacity: 0.48;
357
+ cursor: not-allowed;
358
+ transform: none;
359
+ box-shadow: none;
209
360
  }
210
361
 
211
- /* ========== Input ========== */
212
- .ai-input {
213
- width: 100%;
214
- padding: 10px 12px;
362
+ .ai-shell--textarea .ai-control-action,
363
+ .ai-shell--textarea .ai-spark {
364
+ position: absolute;
365
+ right: 12px;
366
+ bottom: 12px;
367
+ }
368
+
369
+ /* Generic buttons */
370
+ .ai-btn {
371
+ --ai-control-h: var(--ai-size-md-h);
372
+ --ai-control-font: var(--ai-size-md-font);
373
+ --ai-radius-current: var(--ai-radius-full);
374
+
375
+ display: inline-flex;
376
+ align-items: center;
377
+ justify-content: center;
378
+ gap: 8px;
379
+ min-height: var(--ai-control-h);
380
+ padding: 0 16px;
381
+ border-radius: var(--ai-radius-current);
215
382
  border: 1px solid var(--ai-border);
216
- border-radius: var(--ai-radius);
217
- font-size: 14px;
218
- color: var(--ai-text);
219
- background: var(--ai-bg);
220
- transition: all 0.2s;
383
+ background:
384
+ linear-gradient(180deg, var(--ai-glass-strong), var(--ai-glass-strong)),
385
+ radial-gradient(
386
+ 75% 140% at 100% 0%,
387
+ rgba(var(--ai-glow-rgb), 0.05),
388
+ transparent 72%
389
+ );
390
+ color: var(--ai-foreground);
391
+ font-size: var(--ai-control-font);
392
+ font-weight: 700;
393
+ box-shadow: var(--ai-shadow-sm);
394
+ transition:
395
+ transform var(--ai-transition),
396
+ border-color var(--ai-transition),
397
+ box-shadow var(--ai-transition),
398
+ background var(--ai-transition);
399
+ cursor: pointer;
221
400
  }
222
401
 
223
- .ai-input:hover {
224
- border-color: var(--ai-primary);
402
+ .ai-btn:hover {
403
+ transform: translateY(-1px);
404
+ border-color: color-mix(in srgb, var(--ai-primary) 45%, var(--ai-border));
405
+ box-shadow:
406
+ var(--ai-shadow),
407
+ 0 0 12px rgba(var(--ai-glow-rgb), 0.14);
225
408
  }
226
409
 
227
- .ai-input:focus {
228
- outline: none;
229
- border-color: var(--ai-primary);
230
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
410
+ .ai-btn:active {
411
+ transform: translateY(0);
231
412
  }
232
413
 
233
- .ai-input:disabled {
234
- opacity: 0.5;
414
+ .ai-btn:disabled {
415
+ opacity: 0.56;
235
416
  cursor: not-allowed;
236
- background: var(--ai-bg-hover);
417
+ transform: none;
418
+ box-shadow: none;
237
419
  }
238
420
 
239
- .ai-input--error {
240
- border-color: var(--ai-danger);
421
+ .ai-btn--primary,
422
+ .ai-btn--auth {
423
+ color: var(--ai-primary);
424
+ border-color: color-mix(in srgb, var(--ai-primary) 44%, var(--ai-border));
425
+ background:
426
+ linear-gradient(180deg, var(--ai-glass-strong), var(--ai-glass-strong)),
427
+ radial-gradient(
428
+ 100% 130% at 100% 0%,
429
+ rgba(var(--ai-glow-rgb), 0.1),
430
+ transparent 72%
431
+ );
432
+ }
433
+
434
+ .ai-btn--primary:hover,
435
+ .ai-btn--auth:hover {
436
+ border-color: color-mix(in srgb, var(--ai-primary) 70%, var(--ai-border));
437
+ box-shadow:
438
+ var(--ai-shadow),
439
+ 0 0 12px rgba(var(--ai-glow-rgb), 0.2);
241
440
  }
242
441
 
243
- .ai-input--error:focus {
244
- box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
442
+ .ai-btn--ghost {
443
+ background: var(--ai-glass-strong);
245
444
  }
246
445
 
247
- /* ========== Textarea ========== */
248
- .ai-textarea {
249
- width: 100%;
250
- min-height: 100px;
251
- padding: 10px 12px;
252
- border: 1px solid var(--ai-border);
253
- border-radius: var(--ai-radius);
254
- font-size: 14px;
255
- font-family: inherit;
256
- color: var(--ai-text);
257
- background: var(--ai-bg);
258
- resize: vertical;
259
- transition: all 0.2s;
446
+ .ai-btn--light {
447
+ border-color: transparent;
448
+ background: transparent;
449
+ box-shadow: none;
450
+ color: var(--ai-primary);
451
+ min-height: 32px;
452
+ padding: 0 8px;
260
453
  }
261
454
 
262
- .ai-textarea:hover {
263
- border-color: var(--ai-primary);
455
+ .ai-btn--light:hover {
456
+ border-color: transparent;
457
+ background: color-mix(in srgb, var(--ai-primary) 10%, transparent);
458
+ box-shadow: none;
459
+ transform: none;
264
460
  }
265
461
 
266
- .ai-textarea:focus {
267
- outline: none;
268
- border-color: var(--ai-primary);
269
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
462
+ .ai-btn--danger {
463
+ color: #fee2e2;
464
+ border-color: rgba(239, 68, 68, 0.35);
465
+ background: linear-gradient(
466
+ 180deg,
467
+ rgba(127, 29, 29, 0.3),
468
+ rgba(69, 10, 10, 0.45)
469
+ );
270
470
  }
271
471
 
272
- .ai-textarea:disabled {
273
- opacity: 0.5;
274
- cursor: not-allowed;
275
- background: var(--ai-bg-hover);
472
+ .ai-btn--compact {
473
+ min-height: 34px;
474
+ padding: 0 12px;
475
+ border-radius: 12px;
476
+ font-size: 12px;
276
477
  }
277
478
 
278
- /* ========== Button ========== */
279
- .ai-button {
479
+ .ai-icon-btn,
480
+ [data-ai-close-button],
481
+ [data-ai-action-button] {
482
+ border: 1px solid color-mix(in srgb, var(--ai-primary) 34%, var(--ai-border));
483
+ border-radius: 12px;
484
+ min-width: 34px;
485
+ height: 34px;
280
486
  display: inline-flex;
281
487
  align-items: center;
282
488
  justify-content: center;
283
- gap: 8px;
284
- padding: 10px 16px;
285
- border: none;
286
- border-radius: var(--ai-radius);
287
- font-size: 14px;
288
- font-weight: 500;
289
- color: white;
290
- background: var(--ai-primary);
489
+ background: color-mix(in srgb, var(--ai-bg2) 86%, transparent);
490
+ color: var(--ai-primary);
491
+ transition: all var(--ai-transition);
291
492
  cursor: pointer;
292
- transition: all 0.2s;
493
+ box-shadow: var(--ai-shadow-sm);
293
494
  }
294
495
 
295
- .ai-button:hover {
296
- background: var(--ai-primary-hover);
496
+ .ai-icon-btn:hover,
497
+ [data-ai-close-button]:hover,
498
+ [data-ai-action-button]:hover {
499
+ border-color: color-mix(in srgb, var(--ai-primary) 72%, var(--ai-border));
500
+ box-shadow: 0 0 18px rgba(var(--ai-glow-rgb), 0.2);
297
501
  transform: translateY(-1px);
298
- box-shadow: var(--ai-shadow);
299
502
  }
300
503
 
301
- .ai-button:active {
302
- transform: translateY(0);
504
+ .ai-icon-btn--danger,
505
+ .ai-status-action-btn--danger {
506
+ color: var(--ai-danger);
507
+ border-color: rgba(239, 68, 68, 0.35);
303
508
  }
304
509
 
305
- .ai-button:disabled {
306
- opacity: 0.5;
307
- cursor: not-allowed;
308
- transform: none;
510
+ .ai-icon-btn--danger:hover,
511
+ .ai-status-action-btn--danger:hover {
512
+ border-color: rgba(239, 68, 68, 0.62);
513
+ box-shadow: 0 0 16px rgba(239, 68, 68, 0.2);
309
514
  }
310
515
 
311
- .ai-button--secondary {
312
- background: var(--ai-bg);
313
- color: var(--ai-text);
516
+ /* Chips */
517
+ .ai-chip-input {
518
+ display: flex;
519
+ flex-wrap: wrap;
520
+ gap: 8px;
521
+ }
522
+
523
+ .ai-chip {
524
+ display: inline-flex;
525
+ align-items: center;
526
+ gap: 6px;
527
+ padding: 6px 10px;
528
+ border-radius: var(--ai-radius-current, var(--ai-radius-full));
314
529
  border: 1px solid var(--ai-border);
530
+ color: var(--ai-foreground);
531
+ background: color-mix(in srgb, var(--ai-bg2) 80%, transparent);
532
+ font-size: 12px;
533
+ font-weight: 600;
534
+ transition: all var(--ai-transition);
315
535
  }
316
536
 
317
- .ai-button--secondary:hover {
318
- background: var(--ai-bg-hover);
537
+ .ai-chip:hover {
538
+ border-color: color-mix(in srgb, var(--ai-primary) 40%, var(--ai-border));
539
+ box-shadow: 0 0 12px rgba(var(--ai-glow-rgb), 0.14);
319
540
  }
320
541
 
321
- .ai-button--danger {
322
- background: var(--ai-danger);
542
+ .ai-chip--with-close {
543
+ padding-right: 6px;
323
544
  }
324
545
 
325
- .ai-button--success {
326
- background: var(--ai-success);
546
+ .ai-chip--selected {
547
+ color: white;
548
+ border-color: transparent;
549
+ background: linear-gradient(135deg, var(--ai-primary), var(--ai-primary-2));
327
550
  }
328
551
 
329
- .ai-button--sm {
330
- padding: 6px 12px;
331
- font-size: 12px;
552
+ .ai-chip--success {
553
+ color: #10b981;
554
+ border-color: rgba(16, 185, 129, 0.35);
555
+ background: rgba(16, 185, 129, 0.12);
332
556
  }
333
557
 
334
- .ai-button--lg {
335
- padding: 14px 20px;
336
- font-size: 16px;
558
+ .ai-chip--danger {
559
+ color: var(--ai-danger);
560
+ border-color: rgba(239, 68, 68, 0.35);
561
+ background: rgba(239, 68, 68, 0.12);
337
562
  }
338
563
 
339
- /* ========== Select ========== */
340
- .ai-select {
341
- width: 100%;
342
- padding: 10px 12px;
564
+ .ai-chip-remover {
565
+ width: 18px;
566
+ height: 18px;
567
+ border: 0;
568
+ border-radius: 999px;
569
+ background: color-mix(in srgb, var(--ai-bg) 82%, transparent);
570
+ color: inherit;
571
+ display: inline-flex;
572
+ align-items: center;
573
+ justify-content: center;
574
+ cursor: pointer;
575
+ }
576
+
577
+ .ai-chip-remover:hover {
578
+ background: color-mix(in srgb, var(--ai-bg) 68%, var(--ai-border));
579
+ }
580
+
581
+ /* Popover / tooltip */
582
+ .ai-popover,
583
+ .ai-tooltip,
584
+ [data-ai-settings-content] {
343
585
  border: 1px solid var(--ai-border);
344
- border-radius: var(--ai-radius);
586
+ border-radius: var(--ai-radius-lg);
587
+ color: var(--ai-foreground);
588
+ background: var(--ai-bg2);
589
+ box-shadow: var(--ai-shadow-lg);
590
+ }
591
+
592
+ .ai-popover-body {
593
+ padding: 14px;
594
+ }
595
+
596
+ .ai-popover-header {
345
597
  font-size: 14px;
346
- color: var(--ai-text);
347
- background: var(--ai-bg);
598
+ font-weight: 700;
599
+ color: var(--ai-foreground);
600
+ margin-bottom: 10px;
601
+ }
602
+
603
+ .ai-popover-section {
604
+ padding: 12px 0;
605
+ border-top: 1px solid color-mix(in srgb, var(--ai-border) 72%, transparent);
606
+ }
607
+
608
+ .ai-popover-section:first-child,
609
+ .ai-popover-section--first {
610
+ border-top: none;
611
+ padding-top: 0;
612
+ }
613
+
614
+ .ai-popover-row {
615
+ display: flex;
616
+ align-items: center;
617
+ justify-content: space-between;
618
+ gap: 12px;
619
+ margin-bottom: 7px;
620
+ }
621
+
622
+ .ai-popover-label {
623
+ color: var(--ai-muted);
624
+ font-size: 12px;
625
+ }
626
+
627
+ .ai-popover-value {
628
+ color: var(--ai-foreground);
629
+ font-size: 12px;
630
+ font-weight: 600;
631
+ }
632
+
633
+ .ai-status-tooltip {
634
+ width: min(370px, calc(100vw - 16px));
635
+ z-index: 2147483647;
636
+ }
637
+
638
+ .ai-status-actions {
639
+ display: flex;
640
+ align-items: center;
641
+ justify-content: space-between;
642
+ gap: 8px;
643
+ flex-wrap: wrap;
644
+ margin-top: 10px;
645
+ padding-top: 12px;
646
+ border-top: 1px solid color-mix(in srgb, var(--ai-border) 72%, transparent);
647
+ }
648
+
649
+ .ai-status-action-btn {
650
+ border: 1px solid color-mix(in srgb, var(--ai-primary) 34%, var(--ai-border));
651
+ border-radius: 12px;
652
+ width: 34px;
653
+ height: 34px;
654
+ display: inline-flex;
655
+ align-items: center;
656
+ justify-content: center;
657
+ background: color-mix(in srgb, var(--ai-bg2) 88%, transparent);
658
+ color: var(--ai-primary);
348
659
  cursor: pointer;
349
- transition: all 0.2s;
660
+ transition: all var(--ai-transition);
350
661
  }
351
662
 
352
- .ai-select:hover {
353
- border-color: var(--ai-primary);
663
+ .ai-status-action-btn:hover {
664
+ border-color: color-mix(in srgb, var(--ai-primary) 72%, var(--ai-border));
665
+ box-shadow: 0 0 14px rgba(var(--ai-glow-rgb), 0.18);
666
+ transform: translateY(-1px);
354
667
  }
355
668
 
356
- .ai-select:focus {
357
- outline: none;
358
- border-color: var(--ai-primary);
359
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
669
+ .ai-status-trigger {
670
+ position: relative;
671
+ border: 1px solid var(--ai-border);
672
+ border-radius: var(--ai-radius-current, var(--ai-radius-full));
673
+ background: var(--ai-glass-strong);
674
+ color: var(--ai-primary);
675
+ width: 36px;
676
+ height: 36px;
677
+ display: inline-flex;
678
+ align-items: center;
679
+ justify-content: center;
680
+ box-shadow: var(--ai-shadow-sm);
681
+ transition: all var(--ai-transition);
360
682
  }
361
683
 
362
- .ai-select:disabled {
363
- opacity: 0.5;
364
- cursor: not-allowed;
365
- background: var(--ai-bg-hover);
684
+ .ai-status-trigger.ai-size-sm {
685
+ width: 32px;
686
+ height: 32px;
366
687
  }
367
688
 
368
- /* ========== Modal ========== */
369
- .ai-modal-overlay {
689
+ .ai-status-trigger.ai-size-lg {
690
+ width: 42px;
691
+ height: 42px;
692
+ }
693
+
694
+ .ai-status-trigger:hover {
695
+ border-color: color-mix(in srgb, var(--ai-primary) 68%, var(--ai-border));
696
+ box-shadow:
697
+ var(--ai-shadow),
698
+ 0 0 18px rgba(var(--ai-glow-rgb), 0.2);
699
+ }
700
+
701
+ .ai-status-trigger--warning {
702
+ color: #f59e0b;
703
+ border-color: rgba(245, 158, 11, 0.42);
704
+ }
705
+
706
+ .ai-status-trigger--danger {
707
+ color: var(--ai-danger);
708
+ border-color: rgba(239, 68, 68, 0.42);
709
+ }
710
+
711
+ .ai-status-trigger--success {
712
+ color: #10b981;
713
+ border-color: rgba(16, 185, 129, 0.42);
714
+ }
715
+
716
+ .ai-status-loading-dot {
717
+ position: absolute;
718
+ top: -2px;
719
+ right: -2px;
720
+ width: 12px;
721
+ height: 12px;
722
+ border-radius: 999px;
723
+ border: 1px solid color-mix(in srgb, var(--ai-primary) 60%, var(--ai-border));
724
+ background: var(--ai-glass-strong);
725
+ display: inline-flex;
726
+ align-items: center;
727
+ justify-content: center;
728
+ pointer-events: none;
729
+ }
730
+
731
+ /* Signin */
732
+ .ai-signin-overlay,
733
+ [data-ai-settings-panel] {
370
734
  position: fixed;
371
735
  inset: 0;
372
- z-index: 9998;
373
- background: rgba(0, 0, 0, 0.5);
736
+ z-index: 2147483645;
374
737
  display: flex;
375
738
  align-items: center;
376
739
  justify-content: center;
377
740
  padding: 16px;
378
- animation: fadeIn 0.2s;
741
+ background: var(--ai-overlay);
742
+ backdrop-filter: blur(10px);
379
743
  }
380
744
 
381
- .ai-modal {
745
+ .ai-signin-panel,
746
+ .ai-result-modal,
747
+ [data-ai-settings-content] {
382
748
  position: relative;
383
- z-index: 9999;
384
749
  width: 100%;
385
- max-width: 500px;
386
- max-height: 90vh;
387
- overflow-y: auto;
388
- background: var(--ai-bg);
389
- border-radius: var(--ai-radius);
750
+ max-width: 460px;
751
+ border-radius: var(--ai-radius-lg);
752
+ border: 1px solid var(--ai-border);
753
+ overflow: hidden;
754
+ color: var(--ai-foreground);
755
+ }
756
+
757
+ .ai-signin-panel {
758
+ background:
759
+ linear-gradient(180deg, var(--ai-bg2), var(--ai-bg2)),
760
+ radial-gradient(
761
+ 100% 100% at 100% 0%,
762
+ rgba(var(--ai-glow-rgb), 0.07),
763
+ transparent 78%
764
+ );
390
765
  box-shadow: var(--ai-shadow-lg);
391
- animation: slideUp 0.3s;
392
766
  }
393
767
 
394
- .ai-modal__header {
768
+ .ai-signin-header {
769
+ padding: 26px 26px 16px;
770
+ text-align: center;
771
+ }
772
+
773
+ .ai-signin-title {
774
+ margin: 0;
775
+ font-size: 24px;
776
+ line-height: 1.2;
777
+ letter-spacing: -0.02em;
778
+ }
779
+
780
+ .ai-signin-subtitle {
781
+ margin-top: 6px;
782
+ color: var(--ai-muted);
783
+ font-size: 14px;
784
+ }
785
+
786
+ .ai-signin-content {
787
+ padding: 12px 26px 24px;
788
+ }
789
+
790
+ .ai-signin-close {
791
+ position: absolute;
792
+ top: 12px;
793
+ right: 12px;
794
+ }
795
+
796
+ .ai-signin-actions {
797
+ display: grid;
798
+ gap: 10px;
799
+ margin-top: 8px;
800
+ }
801
+
802
+ .ai-signin-error {
803
+ margin-top: 10px;
804
+ margin-bottom: 2px;
805
+ display: flex;
806
+ gap: 8px;
807
+ align-items: flex-start;
808
+ padding: 10px;
809
+ border-radius: 12px;
810
+ border: 1px solid rgba(239, 68, 68, 0.35);
811
+ background: rgba(239, 68, 68, 0.1);
812
+ color: var(--ai-danger);
813
+ font-size: 12px;
814
+ }
815
+
816
+ .ai-input-row {
817
+ display: flex;
818
+ flex-direction: column;
819
+ gap: 8px;
820
+ margin-bottom: 14px;
821
+ }
822
+
823
+ .ai-input-label {
824
+ font-size: 12px;
825
+ color: var(--ai-muted);
826
+ font-weight: 600;
827
+ }
828
+
829
+ .ai-icon-badge {
830
+ width: 46px;
831
+ height: 46px;
832
+ border-radius: 999px;
833
+ border: 1px solid var(--ai-border-primary);
834
+ color: var(--ai-primary);
835
+ background: color-mix(in srgb, var(--ai-bg2) 85%, transparent);
836
+ display: inline-flex;
837
+ align-items: center;
838
+ justify-content: center;
839
+ }
840
+
841
+ /* Result modal */
842
+ .ai-overlay-panel {
843
+ z-index: 10000;
844
+ }
845
+
846
+ .ai-result-modal {
847
+ max-width: min(760px, calc(100vw - 24px));
848
+ background:
849
+ linear-gradient(180deg, var(--ai-bg2), var(--ai-bg2)),
850
+ radial-gradient(
851
+ 120% 120% at 100% 0%,
852
+ rgba(var(--ai-glow-rgb), 0.07),
853
+ transparent 78%
854
+ );
855
+ box-shadow: var(--ai-shadow-lg);
856
+ }
857
+
858
+ .ai-result-header {
395
859
  display: flex;
396
860
  align-items: center;
397
861
  justify-content: space-between;
398
- padding: 16px 20px;
399
- border-bottom: 1px solid var(--ai-border);
862
+ gap: 10px;
863
+ padding: 14px;
864
+ border-bottom: 1px solid color-mix(in srgb, var(--ai-border) 74%, transparent);
865
+ }
866
+
867
+ .ai-result-title {
868
+ margin: 0;
869
+ font-size: 16px;
870
+ font-weight: 700;
871
+ }
872
+
873
+ .ai-result-body {
874
+ padding: 14px;
875
+ max-height: min(72vh, 680px);
876
+ overflow: auto;
877
+ }
878
+
879
+ .ai-result-block {
880
+ margin-bottom: 14px;
881
+ }
882
+
883
+ .ai-result-subtitle {
884
+ margin: 0 0 8px;
885
+ font-size: 13px;
886
+ color: var(--ai-muted);
887
+ text-transform: uppercase;
888
+ letter-spacing: 0.02em;
889
+ }
890
+
891
+ .ai-result-code,
892
+ .ai-result-content {
893
+ margin: 0;
894
+ padding: 12px;
895
+ border-radius: 14px;
896
+ border: 1px solid var(--ai-border);
897
+ background: color-mix(in srgb, var(--ai-bg2) 86%, transparent);
898
+ white-space: pre-wrap;
899
+ line-height: 1.5;
900
+ color: var(--ai-foreground);
901
+ }
902
+
903
+ .ai-result-meta {
904
+ font-size: 12px;
905
+ color: var(--ai-muted);
906
+ padding-top: 10px;
907
+ border-top: 1px solid color-mix(in srgb, var(--ai-border) 72%, transparent);
908
+ }
909
+
910
+ /* Image card */
911
+ .ai-image-card {
912
+ width: min(380px, calc(100vw - 28px));
913
+ padding: 14px;
914
+ }
915
+
916
+ [data-ai-image-button].ai-image-btn {
917
+ position: relative;
918
+ overflow: hidden;
919
+ gap: 10px;
920
+ border-color: color-mix(in srgb, var(--ai-primary) 38%, var(--ai-border));
921
+ background:
922
+ linear-gradient(180deg, var(--ai-glass-strong), var(--ai-glass)),
923
+ radial-gradient(
924
+ 120% 130% at 0% 0%,
925
+ rgba(var(--ai-glow-rgb), 0.18),
926
+ transparent 62%
927
+ );
928
+ }
929
+
930
+ .ai-context-btn {
931
+ position: relative;
932
+ overflow: hidden;
933
+ min-width: 132px;
934
+ border-color: color-mix(in srgb, var(--ai-primary) 40%, var(--ai-border));
935
+ background:
936
+ linear-gradient(180deg, var(--ai-glass-strong), var(--ai-glass)),
937
+ radial-gradient(
938
+ 100% 130% at 100% 0%,
939
+ rgba(var(--ai-glow-rgb), 0.18),
940
+ transparent 66%
941
+ );
942
+ }
943
+
944
+ .ai-context-btn::before {
945
+ content: "";
946
+ position: absolute;
947
+ inset: -1px;
948
+ border-radius: inherit;
949
+ padding: 1px;
950
+ background: linear-gradient(
951
+ 110deg,
952
+ rgba(var(--ai-red-rgb), 0.28),
953
+ color-mix(in srgb, var(--ai-foreground) 12%, transparent),
954
+ rgba(var(--ai-blue-rgb), 0.34)
955
+ );
956
+ -webkit-mask:
957
+ linear-gradient(#000 0 0) content-box,
958
+ linear-gradient(#000 0 0);
959
+ -webkit-mask-composite: xor;
960
+ mask-composite: exclude;
961
+ pointer-events: none;
962
+ }
963
+
964
+ .ai-context-btn:hover {
965
+ border-color: color-mix(in srgb, var(--ai-primary) 78%, var(--ai-border));
966
+ box-shadow:
967
+ var(--ai-shadow),
968
+ 0 0 18px rgba(var(--ai-glow-rgb), 0.2);
969
+ }
970
+
971
+ .ai-usage-circle-track {
972
+ stroke: color-mix(in srgb, var(--ai-muted) 42%, transparent);
973
+ }
974
+
975
+ .ai-usage-circle-value--low {
976
+ stroke: #60a5fa;
977
+ fill: transparent;
978
+ filter: drop-shadow(0 0 2px rgba(96, 165, 250, 0.35));
979
+ }
980
+
981
+ .ai-usage-circle-value--warn {
982
+ stroke: #f59e0b;
983
+ fill: transparent;
984
+ filter: drop-shadow(0 0 2px rgba(245, 158, 11, 0.35));
400
985
  }
401
986
 
402
- .ai-modal__title {
403
- font-size: 18px;
987
+ .ai-usage-circle-value--high {
988
+ stroke: rgba(239, 68, 68, 0.88);
989
+ fill: transparent;
990
+ filter: drop-shadow(0 0 2px rgba(239, 68, 68, 0.35));
991
+ }
992
+
993
+ .ai-usage-circle-text--low {
994
+ fill: #60a5fa;
995
+ }
996
+
997
+ .ai-usage-circle-text--warn {
998
+ fill: #f59e0b;
999
+ }
1000
+
1001
+ .ai-usage-circle-text--high {
1002
+ fill: rgba(239, 68, 68, 0.88);
1003
+ }
1004
+
1005
+ .ai-model-mgmt-list {
1006
+ display: flex;
1007
+ flex-direction: column;
1008
+ gap: 16px;
1009
+ padding: 24px;
1010
+ }
1011
+
1012
+ .ai-inline-btn {
1013
+ display: inline-flex;
1014
+ align-items: center;
1015
+ gap: 6px;
1016
+ min-height: 30px;
1017
+ padding: 0 12px;
1018
+ border-radius: 10px;
1019
+ border: 1px solid color-mix(in srgb, var(--ai-primary) 30%, var(--ai-border));
1020
+ background: var(--ai-bg);
1021
+ color: var(--ai-primary);
1022
+ font-size: 12px;
404
1023
  font-weight: 600;
405
- color: var(--ai-text);
1024
+ cursor: pointer;
1025
+ transition: all var(--ai-transition);
1026
+ }
1027
+
1028
+ .ai-inline-btn:hover {
1029
+ border-color: color-mix(in srgb, var(--ai-primary) 72%, var(--ai-border));
1030
+ box-shadow:
1031
+ var(--ai-shadow-sm),
1032
+ 0 0 14px rgba(var(--ai-blue-rgb), 0.18);
1033
+ transform: translateY(-1px);
406
1034
  }
407
1035
 
408
- .ai-modal__close {
1036
+ .ai-model-item {
409
1037
  display: flex;
410
1038
  align-items: center;
411
- justify-content: center;
412
- width: 32px;
413
- height: 32px;
414
- border: none;
415
- border-radius: 4px;
416
- background: transparent;
417
- color: var(--ai-text-secondary);
1039
+ justify-content: space-between;
1040
+ gap: 12px;
1041
+ padding: 14px 16px;
1042
+ border-radius: 12px;
1043
+ border: 1px solid var(--ai-border);
1044
+ background:
1045
+ linear-gradient(180deg, var(--ai-bg2), var(--ai-bg2)),
1046
+ radial-gradient(
1047
+ 120% 120% at 100% 0%,
1048
+ rgba(var(--ai-glow-rgb), 0.05),
1049
+ transparent 76%
1050
+ );
1051
+ transition: all var(--ai-transition);
418
1052
  cursor: pointer;
419
- transition: all 0.2s;
420
1053
  }
421
1054
 
422
- .ai-modal__close:hover {
423
- background: var(--ai-bg-hover);
424
- color: var(--ai-text);
1055
+ .ai-model-item:hover {
1056
+ transform: translateY(-1px);
1057
+ border-color: color-mix(in srgb, var(--ai-primary) 45%, var(--ai-border));
1058
+ box-shadow:
1059
+ var(--ai-shadow-sm),
1060
+ -10px 0 14px rgba(var(--ai-red-rgb), 0.12),
1061
+ 10px 0 12px rgba(var(--ai-blue-rgb), 0.14);
425
1062
  }
426
1063
 
427
- .ai-modal__body {
428
- padding: 20px;
1064
+ .ai-model-item--disabled {
1065
+ opacity: 0.56;
1066
+ cursor: not-allowed;
1067
+ transform: none !important;
1068
+ box-shadow: none !important;
429
1069
  }
430
1070
 
431
- .ai-modal__footer {
1071
+ .ai-key-modal-panel {
1072
+ max-width: 520px;
1073
+ }
1074
+
1075
+ .ai-key-radio {
1076
+ accent-color: var(--ai-primary);
1077
+ }
1078
+
1079
+ .ai-model-item--active {
1080
+ border-color: color-mix(in srgb, #10b981 55%, var(--ai-border));
1081
+ box-shadow: inset 0 0 0 1px rgba(16, 185, 129, 0.15);
1082
+ }
1083
+
1084
+ .ai-model-item-main {
1085
+ display: flex;
1086
+ align-items: center;
1087
+ gap: 12px;
1088
+ flex: 1;
1089
+ min-width: 0;
1090
+ }
1091
+
1092
+ .ai-model-item-dot {
1093
+ width: 8px;
1094
+ height: 8px;
1095
+ border-radius: 999px;
1096
+ background: var(--ai-tertiary);
1097
+ flex-shrink: 0;
1098
+ }
1099
+
1100
+ .ai-model-item-dot--active {
1101
+ background: #10b981;
1102
+ box-shadow: 0 0 10px rgba(16, 185, 129, 0.55);
1103
+ }
1104
+
1105
+ .ai-model-item-title {
432
1106
  display: flex;
1107
+ align-items: center;
433
1108
  gap: 8px;
434
- justify-content: flex-end;
435
- padding: 16px 20px;
436
- border-top: 1px solid var(--ai-border);
1109
+ margin-bottom: 4px;
1110
+ color: var(--ai-foreground);
1111
+ font-size: 14px;
1112
+ font-weight: 700;
437
1113
  }
438
1114
 
439
- @keyframes slideUp {
440
- from {
441
- opacity: 0;
442
- transform: translateY(20px);
443
- }
444
- to {
445
- opacity: 1;
446
- transform: translateY(0);
447
- }
1115
+ .ai-model-item-meta {
1116
+ display: flex;
1117
+ align-items: center;
1118
+ gap: 10px;
1119
+ color: var(--ai-muted);
1120
+ font-size: 12px;
448
1121
  }
449
1122
 
450
- /* ========== Chip Label ========== */
451
- .ai-chip {
1123
+ .ai-pill {
452
1124
  display: inline-flex;
453
1125
  align-items: center;
454
- gap: 6px;
455
- padding: 4px 12px;
456
- border-radius: 9999px;
457
- font-size: 12px;
458
- font-weight: 500;
459
- background: var(--ai-bg-hover);
460
- color: var(--ai-text);
1126
+ justify-content: center;
1127
+ border-radius: 999px;
1128
+ border: 1px solid var(--ai-border);
1129
+ padding: 2px 8px;
1130
+ font-size: 10px;
1131
+ font-weight: 700;
1132
+ text-transform: uppercase;
1133
+ letter-spacing: 0.05em;
1134
+ }
1135
+
1136
+ .ai-pill--pro {
1137
+ color: white;
1138
+ border-color: transparent;
1139
+ background: linear-gradient(135deg, var(--ai-primary), var(--ai-primary-2));
1140
+ }
1141
+
1142
+ .ai-pill--cost {
1143
+ color: var(--ai-secondary);
1144
+ background: color-mix(in srgb, var(--ai-bg2) 82%, transparent);
1145
+ }
1146
+
1147
+ .ai-toggle {
1148
+ position: relative;
1149
+ display: inline-flex;
1150
+ width: 50px;
1151
+ height: 28px;
1152
+ border-radius: 999px;
1153
+ border: 1px solid var(--ai-border);
1154
+ background: var(--ai-bg);
1155
+ transition: all var(--ai-transition);
461
1156
  }
462
1157
 
463
- .ai-chip--primary {
464
- background: rgba(59, 130, 246, 0.1);
1158
+ .ai-toggle::after {
1159
+ content: "";
1160
+ position: absolute;
1161
+ top: 2px;
1162
+ left: 2px;
1163
+ width: 22px;
1164
+ height: 22px;
1165
+ border-radius: 999px;
1166
+ background: color-mix(in srgb, var(--ai-bg) 94%, white 6%);
1167
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.22);
1168
+ transition: all var(--ai-transition);
1169
+ }
1170
+
1171
+ .ai-toggle--active {
1172
+ border-color: rgba(16, 185, 129, 0.5);
1173
+ background: rgba(16, 185, 129, 0.28);
1174
+ }
1175
+
1176
+ .ai-toggle--active::after {
1177
+ left: 24px;
1178
+ }
1179
+
1180
+ [data-ai-image-button].ai-image-btn::before {
1181
+ content: "";
1182
+ position: absolute;
1183
+ inset: -1px;
1184
+ border-radius: inherit;
1185
+ padding: 1px;
1186
+ background: linear-gradient(
1187
+ 120deg,
1188
+ rgba(var(--ai-red-rgb), 0.26),
1189
+ color-mix(in srgb, var(--ai-foreground) 10%, transparent),
1190
+ rgba(var(--ai-blue-rgb), 0.3)
1191
+ );
1192
+ -webkit-mask:
1193
+ linear-gradient(#000 0 0) content-box,
1194
+ linear-gradient(#000 0 0);
1195
+ -webkit-mask-composite: xor;
1196
+ mask-composite: exclude;
1197
+ pointer-events: none;
1198
+ }
1199
+
1200
+ .ai-image-btn__badge {
1201
+ display: inline-flex;
1202
+ align-items: center;
1203
+ justify-content: center;
1204
+ min-width: 22px;
1205
+ height: 22px;
1206
+ padding: 0 7px;
1207
+ border-radius: 999px;
1208
+ border: 1px solid color-mix(in srgb, var(--ai-primary) 55%, var(--ai-border));
1209
+ background: color-mix(in srgb, var(--ai-primary) 20%, transparent);
465
1210
  color: var(--ai-primary);
1211
+ font-size: 10px;
1212
+ font-weight: 700;
1213
+ letter-spacing: 0.04em;
1214
+ text-transform: uppercase;
466
1215
  }
467
1216
 
468
- .ai-chip--success {
469
- background: rgba(16, 185, 129, 0.1);
470
- color: var(--ai-success);
1217
+ .ai-image-frame {
1218
+ border-radius: 14px;
1219
+ overflow: hidden;
1220
+ border: 1px solid var(--ai-border);
1221
+ background: color-mix(in srgb, var(--ai-bg2) 86%, transparent);
1222
+ margin-bottom: 10px;
471
1223
  }
472
1224
 
473
- .ai-chip--warning {
474
- background: rgba(245, 158, 11, 0.1);
475
- color: var(--ai-warning);
1225
+ .ai-image-preview {
1226
+ width: 100%;
1227
+ display: block;
1228
+ object-fit: cover;
476
1229
  }
477
1230
 
478
- .ai-chip--danger {
479
- background: rgba(239, 68, 68, 0.1);
480
- color: var(--ai-danger);
1231
+ .ai-image-meta {
1232
+ margin-top: 10px;
1233
+ font-size: 12px;
1234
+ color: var(--ai-muted);
1235
+ }
1236
+
1237
+ /* Settings legacy selectors */
1238
+ [data-ai-settings-wrapper] {
1239
+ position: relative;
1240
+ display: inline-block;
1241
+ }
1242
+
1243
+ [data-ai-settings-button],
1244
+ [data-ai-model-select] {
1245
+ border: 1px solid var(--ai-border);
1246
+ border-radius: 12px;
1247
+ background: color-mix(in srgb, var(--ai-bg2) 85%, transparent);
1248
+ color: var(--ai-foreground);
1249
+ min-height: 38px;
1250
+ padding: 0 12px;
1251
+ }
1252
+
1253
+ [data-ai-settings-overlay] {
1254
+ position: absolute;
1255
+ inset: 0;
1256
+ }
1257
+
1258
+ [data-ai-settings-content] {
1259
+ max-width: 460px;
1260
+ width: calc(100vw - 26px);
1261
+ padding: 14px;
1262
+ background: var(--ai-bg2);
1263
+ }
1264
+
1265
+ [data-ai-settings-header] {
1266
+ display: flex;
1267
+ align-items: center;
1268
+ justify-content: space-between;
1269
+ gap: 10px;
1270
+ margin-bottom: 10px;
1271
+ }
1272
+
1273
+ [data-ai-settings-body] {
1274
+ display: grid;
1275
+ gap: 12px;
1276
+ }
1277
+
1278
+ [data-ai-status-section],
1279
+ .ai-status-section {
1280
+ border: 1px solid var(--ai-border);
1281
+ border-radius: 12px;
1282
+ padding: 10px;
1283
+ background: color-mix(in srgb, var(--ai-bg2) 82%, transparent);
1284
+ }
1285
+
1286
+ [data-ai-status-item],
1287
+ .ai-status-item {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ justify-content: space-between;
1291
+ gap: 8px;
1292
+ margin-bottom: 6px;
1293
+ font-size: 13px;
1294
+ }
1295
+
1296
+ [data-ai-status-item]:last-child,
1297
+ .ai-status-item:last-child {
1298
+ margin-bottom: 0;
1299
+ }
1300
+
1301
+ [data-ai-actions-section],
1302
+ .ai-actions-section {
1303
+ display: flex;
1304
+ flex-wrap: wrap;
1305
+ gap: 8px;
1306
+ }
1307
+
1308
+ [data-ai-no-key-section],
1309
+ .ai-no-key-section {
1310
+ border: 1px dashed var(--ai-border);
1311
+ border-radius: 12px;
1312
+ padding: 10px;
1313
+ color: var(--ai-muted);
481
1314
  }
482
1315
 
483
- .ai-chip__close {
1316
+ /* Utility */
1317
+ .ai-center {
484
1318
  display: flex;
485
1319
  align-items: center;
486
1320
  justify-content: center;
487
- width: 16px;
488
- height: 16px;
489
- border: none;
490
- border-radius: 50%;
491
- background: transparent;
492
- color: currentColor;
493
- cursor: pointer;
494
- transition: background 0.2s;
495
1321
  }
496
1322
 
497
- .ai-chip__close:hover {
498
- background: rgba(0, 0, 0, 0.1);
1323
+ .ai-row {
1324
+ display: flex;
1325
+ align-items: center;
1326
+ gap: 8px;
499
1327
  }
500
1328
 
501
- /* ========== Loading States ========== */
502
- .ai-loading {
503
- display: inline-flex;
1329
+ .ai-between {
1330
+ display: flex;
504
1331
  align-items: center;
1332
+ justify-content: space-between;
505
1333
  gap: 8px;
506
1334
  }
507
1335
 
508
- .ai-loading__spinner {
509
- width: 16px;
510
- height: 16px;
511
- border: 2px solid var(--ai-border);
512
- border-top-color: var(--ai-primary);
513
- border-radius: 50%;
514
- animation: spin 1s linear infinite;
1336
+ .ai-truncate {
1337
+ overflow: hidden;
1338
+ text-overflow: ellipsis;
1339
+ white-space: nowrap;
515
1340
  }
516
1341
 
517
- .ai-loading__text {
518
- font-size: 14px;
519
- color: var(--ai-text-secondary);
1342
+ .ai-muted,
1343
+ .ai-text-secondary {
1344
+ color: var(--ai-muted);
520
1345
  }
521
1346
 
522
- /* ========== Form Group ========== */
523
- .ai-form-group {
524
- margin-bottom: 16px;
1347
+ .ai-text-tertiary {
1348
+ color: var(--ai-tertiary);
525
1349
  }
526
1350
 
527
- .ai-form-label {
528
- display: block;
529
- margin-bottom: 6px;
530
- font-size: 14px;
531
- font-weight: 500;
532
- color: var(--ai-text);
1351
+ .ai-primary {
1352
+ color: var(--ai-primary);
533
1353
  }
534
1354
 
535
- .ai-form-label--required::after {
536
- content: " *";
537
- color: var(--ai-danger);
1355
+ .ai-bg-secondary {
1356
+ background: var(--ai-bg-secondary);
538
1357
  }
539
1358
 
540
- .ai-form-hint {
541
- display: block;
542
- margin-top: 4px;
543
- font-size: 12px;
544
- color: var(--ai-text-secondary);
1359
+ .ai-bg-tertiary {
1360
+ background: var(--ai-bg-tertiary);
545
1361
  }
546
1362
 
547
- .ai-form-error {
548
- display: block;
549
- margin-top: 4px;
550
- font-size: 12px;
551
- color: var(--ai-danger);
1363
+ .ai-border-primary {
1364
+ border-color: var(--ai-border-primary);
552
1365
  }
553
1366
 
554
- /* ========== Dark Mode Support ========== */
555
- @media (prefers-color-scheme: dark) {
556
- :root {
557
- --ai-border: #374151;
558
- --ai-text: #f9fafb;
559
- --ai-text-secondary: #9ca3af;
560
- --ai-bg: #1f2937;
561
- --ai-bg-hover: #374151;
1367
+ .ai-text-microtracking {
1368
+ letter-spacing: 0.01em;
1369
+ }
1370
+
1371
+ .ai-inline-icon {
1372
+ color: var(--ai-muted);
1373
+ }
1374
+
1375
+ .ai-kv-skeleton {
1376
+ height: 14px;
1377
+ border-radius: 6px;
1378
+ background: color-mix(in srgb, var(--ai-primary) 14%, var(--ai-bg2));
1379
+ animation: ai-pulse 1.4s ease-in-out infinite;
1380
+ }
1381
+
1382
+ .ai-spinner,
1383
+ .ai-spin {
1384
+ animation: ai-spin 1s linear infinite;
1385
+ }
1386
+
1387
+ .ai-tooltip,
1388
+ .ai-popover {
1389
+ animation: ai-fade-in var(--ai-transition);
1390
+ }
1391
+
1392
+ /* Light mode: no gray haze, softer neutral shadow, stronger colored glow */
1393
+ :root:not([data-theme="dark"]):not(.dark) .ai-shell,
1394
+ :root:not([data-theme="dark"]):not(.dark) .ai-btn,
1395
+ :root:not([data-theme="dark"]):not(.dark) .ai-context-btn,
1396
+ :root:not([data-theme="dark"]):not(.dark) .ai-model-item,
1397
+ :root:not([data-theme="dark"]):not(.dark) .ai-popover,
1398
+ :root:not([data-theme="dark"]):not(.dark) .ai-tooltip,
1399
+ :root:not([data-theme="dark"]):not(.dark) [data-ai-settings-content] {
1400
+ background:
1401
+ linear-gradient(180deg, #ffffff, #ffffff),
1402
+ radial-gradient(
1403
+ 110% 130% at 100% 0%,
1404
+ rgba(var(--ai-blue-rgb), 0.08),
1405
+ transparent 72%
1406
+ );
1407
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.07);
1408
+ }
1409
+
1410
+ :root:not([data-theme="dark"]):not(.dark) .ai-shell:hover,
1411
+ :root:not([data-theme="dark"]):not(.dark) .ai-btn:hover,
1412
+ :root:not([data-theme="dark"]):not(.dark) .ai-context-btn:hover,
1413
+ :root:not([data-theme="dark"]):not(.dark) .ai-model-item:hover {
1414
+ box-shadow:
1415
+ 0 3px 10px rgba(15, 23, 42, 0.1),
1416
+ 0 0 12px rgba(var(--ai-glow-rgb), 0.12);
1417
+ }
1418
+
1419
+ @keyframes ai-pulse {
1420
+ 0%,
1421
+ 100% {
1422
+ opacity: 0.5;
1423
+ }
1424
+ 50% {
1425
+ opacity: 1;
1426
+ }
1427
+ }
1428
+
1429
+ @keyframes ai-spin {
1430
+ from {
1431
+ transform: rotate(0deg);
1432
+ }
1433
+ to {
1434
+ transform: rotate(360deg);
1435
+ }
1436
+ }
1437
+
1438
+ @keyframes ai-fade-in {
1439
+ from {
1440
+ opacity: 0;
1441
+ transform: translateY(-6px);
1442
+ }
1443
+ to {
1444
+ opacity: 1;
1445
+ transform: translateY(0);
1446
+ }
1447
+ }
1448
+
1449
+ @media (max-width: 768px) {
1450
+ .ai-glow::before,
1451
+ .ai-glow::after {
1452
+ width: 140px;
1453
+ height: 90px;
1454
+ opacity: 0.2;
1455
+ }
1456
+
1457
+ .ai-signin-panel,
1458
+ .ai-result-modal,
1459
+ [data-ai-settings-content] {
1460
+ max-width: calc(100vw - 20px);
562
1461
  }
563
1462
  }