apilive 1.1.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.
@@ -0,0 +1,554 @@
1
+ /* apilive
2
+ System fonts only; the page loads nothing from the network. */
3
+
4
+ /* ---------------------------------------------------------------- tokens */
5
+
6
+ :root {
7
+ --font: -apple-system, BlinkMacSystemFont, "Segoe UI Variable Text", "Segoe UI", system-ui, Roboto, "Helvetica Neue", Arial, sans-serif;
8
+ --mono: ui-monospace, "SF Mono", "Cascadia Mono", "Cascadia Code", "JetBrains Mono", Menlo, Consolas, monospace;
9
+
10
+ --bg: #ffffff;
11
+ --bg-subtle: #fafafa;
12
+ --surface: #ffffff;
13
+ --surface-2: #f5f5f5;
14
+ --surface-3: #ececec;
15
+ --hover: rgba(0, 0, 0, 0.035);
16
+ --border: #e8e8e8;
17
+ --border-strong: #d4d4d4;
18
+ --text: #171717;
19
+ --text-2: #5c5c5c;
20
+ --text-3: #8f8f8f;
21
+ --focus: #2563eb;
22
+ --primary: #171717;
23
+ --primary-hover: #383838;
24
+ --primary-text: #ffffff;
25
+ --link: #2563eb;
26
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
27
+ --shadow-lg: 0 12px 32px -8px rgba(0, 0, 0, 0.16), 0 2px 6px rgba(0, 0, 0, 0.05);
28
+ --backdrop: rgba(0, 0, 0, 0.32);
29
+
30
+ --green: #16a34a;
31
+ --red: #dc2626;
32
+ --amber: #ca8a04;
33
+ --orange: #ea580c;
34
+ --gray: #8f8f8f;
35
+ --blue: #2563eb;
36
+ --green-bg: #f0fdf4;
37
+ --red-bg: #fef2f2;
38
+ --amber-bg: #fefce8;
39
+ --orange-bg: #fff7ed;
40
+ --gray-bg: #f5f5f5;
41
+ --blue-bg: #eff6ff;
42
+
43
+ --radius: 8px;
44
+ --radius-sm: 6px;
45
+ --header-h: 56px;
46
+ }
47
+
48
+ @media (prefers-color-scheme: dark) {
49
+ :root:not([data-theme="light"]) {
50
+ --bg: #0a0a0a;
51
+ --bg-subtle: #0f0f0f;
52
+ --surface: #111111;
53
+ --surface-2: #181818;
54
+ --surface-3: #222222;
55
+ --hover: rgba(255, 255, 255, 0.04);
56
+ --border: #262626;
57
+ --border-strong: #333333;
58
+ --text: #ededed;
59
+ --text-2: #a1a1a1;
60
+ --text-3: #6e6e6e;
61
+ --focus: #3b82f6;
62
+ --primary: #ededed;
63
+ --primary-hover: #ffffff;
64
+ --primary-text: #0a0a0a;
65
+ --link: #60a5fa;
66
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
67
+ --shadow-lg: 0 16px 40px -8px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.04);
68
+ --backdrop: rgba(0, 0, 0, 0.6);
69
+ --green: #22c55e;
70
+ --red: #ef4444;
71
+ --amber: #eab308;
72
+ --orange: #f97316;
73
+ --gray: #7a7a7a;
74
+ --blue: #3b82f6;
75
+ --green-bg: rgba(34, 197, 94, 0.1);
76
+ --red-bg: rgba(239, 68, 68, 0.1);
77
+ --amber-bg: rgba(234, 179, 8, 0.1);
78
+ --orange-bg: rgba(249, 115, 22, 0.1);
79
+ --gray-bg: rgba(255, 255, 255, 0.05);
80
+ --blue-bg: rgba(59, 130, 246, 0.1);
81
+ }
82
+ }
83
+ :root[data-theme="dark"] {
84
+ --bg: #0a0a0a;
85
+ --bg-subtle: #0f0f0f;
86
+ --surface: #111111;
87
+ --surface-2: #181818;
88
+ --surface-3: #222222;
89
+ --hover: rgba(255, 255, 255, 0.04);
90
+ --border: #262626;
91
+ --border-strong: #333333;
92
+ --text: #ededed;
93
+ --text-2: #a1a1a1;
94
+ --text-3: #6e6e6e;
95
+ --focus: #3b82f6;
96
+ --primary: #ededed;
97
+ --primary-hover: #ffffff;
98
+ --primary-text: #0a0a0a;
99
+ --link: #60a5fa;
100
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
101
+ --shadow-lg: 0 16px 40px -8px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.04);
102
+ --backdrop: rgba(0, 0, 0, 0.6);
103
+ --green: #22c55e;
104
+ --red: #ef4444;
105
+ --amber: #eab308;
106
+ --orange: #f97316;
107
+ --gray: #7a7a7a;
108
+ --blue: #3b82f6;
109
+ --green-bg: rgba(34, 197, 94, 0.1);
110
+ --red-bg: rgba(239, 68, 68, 0.1);
111
+ --amber-bg: rgba(234, 179, 8, 0.1);
112
+ --orange-bg: rgba(249, 115, 22, 0.1);
113
+ --gray-bg: rgba(255, 255, 255, 0.05);
114
+ --blue-bg: rgba(59, 130, 246, 0.1);
115
+ }
116
+
117
+ /* ---------------------------------------------------------------- base */
118
+
119
+ *, *::before, *::after { box-sizing: border-box; }
120
+ html { -webkit-text-size-adjust: 100%; scroll-padding-top: calc(var(--header-h) + 16px); }
121
+ body {
122
+ margin: 0; min-height: 100vh; display: flex; flex-direction: column;
123
+ background: var(--bg); color: var(--text);
124
+ font: 14px/1.5 var(--font); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
125
+ }
126
+ h1, h2, h3, h4 { margin: 0; font-weight: 600; letter-spacing: -0.011em; }
127
+ p { margin: 0; }
128
+ a { color: inherit; }
129
+ button, input, select, textarea { font: inherit; color: inherit; }
130
+ button { cursor: pointer; background: none; border: 0; padding: 0; }
131
+ button:disabled { cursor: not-allowed; }
132
+ code, kbd, pre { font-family: var(--mono); }
133
+ :focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
134
+ [hidden] { display: none !important; }
135
+ ::selection { background: color-mix(in srgb, var(--focus) 25%, transparent); }
136
+ .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
137
+ .skip-link { position: absolute; left: 8px; top: -40px; z-index: 100; padding: 8px 12px; border-radius: var(--radius-sm); background: var(--primary); color: var(--primary-text); text-decoration: none; }
138
+ .skip-link:focus { top: 8px; }
139
+ .container { width: 100%; max-width: 1120px; margin: 0 auto; padding: 0 24px; }
140
+
141
+ .icon { display: inline-flex; width: 16px; height: 16px; flex: none; }
142
+ .icon svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
143
+ .icon-sm { width: 14px; height: 14px; }
144
+
145
+ .kbd {
146
+ display: inline-grid; place-items: center; min-width: 18px; height: 18px; padding: 0 4px;
147
+ border: 1px solid var(--border); border-bottom-width: 2px; border-radius: 4px;
148
+ background: var(--surface); color: var(--text-3); font-size: 10.5px; font-weight: 500; line-height: 1;
149
+ }
150
+ .kbd-inverse { background: transparent; color: inherit; opacity: 0.6; border-color: currentColor; border-bottom-width: 1px; }
151
+
152
+ /* ---------------------------------------------------------------- header */
153
+
154
+ .header { position: sticky; top: 0; z-index: 30; height: var(--header-h); background: color-mix(in srgb, var(--bg) 85%, transparent); backdrop-filter: saturate(180%) blur(12px); -webkit-backdrop-filter: saturate(180%) blur(12px); border-bottom: 1px solid var(--border); }
155
+ .header-inner { height: 100%; display: flex; align-items: center; gap: 28px; }
156
+ .logo { display: inline-flex; align-items: center; gap: 9px; text-decoration: none; }
157
+ .logo-mark { width: 22px; height: 22px; }
158
+ .logo-mark rect { fill: var(--text); }
159
+ .logo-mark path { fill: none; stroke: var(--bg); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
160
+ .logo-text { font-weight: 650; font-size: 15px; letter-spacing: -0.02em; }
161
+ .nav { display: flex; gap: 2px; }
162
+ .nav a { padding: 6px 10px; border-radius: var(--radius-sm); color: var(--text-2); text-decoration: none; font-size: 13.5px; transition: color .12s, background .12s; }
163
+ .nav a:hover { color: var(--text); background: var(--hover); }
164
+ .nav a[aria-current="page"] { color: var(--text); font-weight: 500; }
165
+ .header-right { margin-left: auto; display: flex; align-items: center; gap: 6px; }
166
+
167
+ .chip { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 9px; border-radius: 999px; border: 1px solid var(--border); font-size: 12px; color: var(--text-2); white-space: nowrap; }
168
+ .chip .icon { width: 12px; height: 12px; }
169
+ .chip-local { color: var(--text-2); }
170
+ .chip-demo { color: var(--amber); border-color: color-mix(in srgb, var(--amber) 35%, transparent); background: var(--amber-bg); }
171
+ .chip-update { color: var(--blue); border-color: color-mix(in srgb, var(--blue) 35%, transparent); background: var(--blue-bg); font-weight: 500; }
172
+ .chip-update:hover { border-color: var(--blue); }
173
+ .chip-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
174
+
175
+ .btn-icon { display: inline-grid; place-items: center; width: 32px; height: 32px; border-radius: var(--radius-sm); color: var(--text-2); text-decoration: none; transition: color .12s, background .12s; }
176
+ .btn-icon:hover { color: var(--text); background: var(--hover); }
177
+ .only-dark { display: none !important; }
178
+ @media (prefers-color-scheme: dark) {
179
+ :root:not([data-theme="light"]) .only-dark { display: inline-flex !important; }
180
+ :root:not([data-theme="light"]) .only-light { display: none !important; }
181
+ }
182
+ :root[data-theme="dark"] .only-dark { display: inline-flex !important; }
183
+ :root[data-theme="dark"] .only-light { display: none !important; }
184
+
185
+ /* ---------------------------------------------------------------- buttons */
186
+
187
+ .btn {
188
+ display: inline-flex; align-items: center; justify-content: center; gap: 7px;
189
+ height: 34px; padding: 0 13px; border-radius: var(--radius-sm); border: 1px solid transparent;
190
+ font-size: 13.5px; font-weight: 500; line-height: 1; white-space: nowrap; text-decoration: none;
191
+ transition: background .12s, border-color .12s, color .12s, box-shadow .12s;
192
+ }
193
+ .btn .icon { width: 15px; height: 15px; }
194
+ .btn-primary { background: var(--primary); color: var(--primary-text); }
195
+ .btn-primary:hover:not(:disabled) { background: var(--primary-hover); }
196
+ .btn-secondary { background: var(--surface); border-color: var(--border); color: var(--text); box-shadow: var(--shadow-sm); }
197
+ .btn-secondary:hover:not(:disabled) { background: var(--surface-2); border-color: var(--border-strong); }
198
+ .btn-ghost { color: var(--text-2); }
199
+ .btn-ghost:hover:not(:disabled) { color: var(--text); background: var(--hover); }
200
+ .btn-danger { color: var(--red); }
201
+ .btn-danger:hover:not(:disabled) { background: var(--red-bg); }
202
+ .btn:disabled { opacity: 0.45; }
203
+ .btn-sm { height: 30px; padding: 0 10px; font-size: 13px; }
204
+
205
+ /* ---------------------------------------------------------------- page */
206
+
207
+ .main { flex: 1; padding-top: 36px; padding-bottom: 64px; }
208
+ .page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }
209
+ .page-head h1 { font-size: 24px; letter-spacing: -0.022em; }
210
+ .page-desc { margin-top: 4px; color: var(--text-2); }
211
+ .page-actions { display: flex; gap: 8px; }
212
+
213
+ .banner {
214
+ display: flex; align-items: center; gap: 12px; margin-bottom: 16px; padding: 12px 12px 12px 14px;
215
+ border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-subtle);
216
+ }
217
+ .banner-icon { color: var(--text-2); }
218
+ .banner-text { flex: 1; min-width: 0; display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
219
+ .banner-text strong { font-weight: 500; }
220
+ .banner-text span { color: var(--text-2); font-size: 13px; }
221
+
222
+ /* ---------------------------------------------------------------- card + toolbar */
223
+
224
+ .card { border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow-sm); overflow: hidden; }
225
+ .toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 12px; border-bottom: 1px solid var(--border); flex-wrap: wrap; }
226
+ .toolbar-right { display: flex; align-items: center; gap: 8px; }
227
+
228
+ .tabs { display: flex; gap: 2px; }
229
+ .tabs button { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 10px; border-radius: var(--radius-sm); color: var(--text-2); font-size: 13px; transition: background .12s, color .12s; }
230
+ .tabs button:hover { color: var(--text); background: var(--hover); }
231
+ .tabs button[aria-selected="true"] { color: var(--text); background: var(--surface-2); font-weight: 500; box-shadow: inset 0 0 0 1px var(--border); }
232
+ .tabs .count { color: var(--text-3); font-size: 12px; font-variant-numeric: tabular-nums; }
233
+
234
+ .search { position: relative; display: flex; align-items: center; }
235
+ .search > .icon { position: absolute; left: 9px; width: 14px; height: 14px; color: var(--text-3); pointer-events: none; }
236
+ .search .kbd { position: absolute; right: 7px; pointer-events: none; }
237
+ .search input {
238
+ width: 220px; height: 30px; padding: 0 30px 0 30px; border-radius: var(--radius-sm);
239
+ border: 1px solid var(--border); background: var(--surface); font-size: 13px; outline: 0; transition: border-color .12s, box-shadow .12s;
240
+ }
241
+ .search input::placeholder { color: var(--text-3); }
242
+ .search input:focus { border-color: var(--focus); box-shadow: 0 0 0 3px color-mix(in srgb, var(--focus) 18%, transparent); }
243
+ .search input:focus + .kbd, .search input:not(:placeholder-shown) + .kbd { display: none; }
244
+ .search input::-webkit-search-cancel-button { display: none; }
245
+
246
+ /* ---------------------------------------------------------------- table */
247
+
248
+ .table-scroll { overflow-x: auto; }
249
+ .table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
250
+ .table th {
251
+ height: 36px; padding: 0 12px; text-align: left; white-space: nowrap;
252
+ font-size: 12px; font-weight: 500; color: var(--text-3); background: var(--bg-subtle); border-bottom: 1px solid var(--border);
253
+ }
254
+ .table td { height: 52px; padding: 0 12px; border-bottom: 1px solid var(--border); white-space: nowrap; vertical-align: middle; }
255
+ .table tbody tr:last-child td { border-bottom: 0; }
256
+ .table tbody tr { cursor: pointer; transition: background .1s; }
257
+ .table tbody tr:hover { background: var(--hover); }
258
+ .table tbody tr:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
259
+ .table tbody tr.is-active { background: var(--surface-2); }
260
+ .table .num { text-align: right; font-variant-numeric: tabular-nums; }
261
+ .table th:first-child, .table td:first-child { padding-left: 16px; }
262
+ .table th:last-child, .table td:last-child { padding-right: 8px; }
263
+ .col-actions { width: 44px; }
264
+
265
+ .cell-provider { display: flex; align-items: center; gap: 10px; }
266
+ .mono-mark {
267
+ display: inline-grid; place-items: center; width: 24px; height: 24px; flex: none;
268
+ border-radius: 6px; border: 1px solid var(--border); background: var(--surface-2);
269
+ color: var(--text-2); font-size: 10.5px; font-weight: 600; letter-spacing: -0.02em;
270
+ }
271
+ .mono-mark.lg { width: 36px; height: 36px; border-radius: 8px; font-size: 13px; }
272
+ .provider-name { font-weight: 500; }
273
+ .tag { display: inline-flex; align-items: center; height: 18px; padding: 0 6px; border-radius: 4px; font-size: 11px; font-weight: 500; color: var(--amber); background: var(--amber-bg); }
274
+ .key-text { font-family: var(--mono); font-size: 12.5px; color: var(--text-2); }
275
+ .source-text { color: var(--text-3); font-size: 12.5px; max-width: 220px; overflow: hidden; text-overflow: ellipsis; display: block; }
276
+ .muted { color: var(--text-3); }
277
+ .warn-text { color: var(--amber); }
278
+
279
+ .status { display: inline-flex; align-items: center; gap: 7px; font-size: 13px; }
280
+ .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--c); flex: none; }
281
+ .status[data-s="live"] { --c: var(--green); }
282
+ .status[data-s="invalid"] { --c: var(--red); }
283
+ .status[data-s="no_credit"] { --c: var(--orange); }
284
+ .status[data-s="limited"] { --c: var(--amber); }
285
+ .status[data-s="error"] { --c: var(--gray); }
286
+ .status[data-s="pending"] .status-dot { background: transparent; box-shadow: inset 0 0 0 1.5px var(--text-3); }
287
+ .status[data-s="pending"] { color: var(--text-3); }
288
+ .status[data-s="checking"] { color: var(--text-2); }
289
+ .spinner { width: 12px; height: 12px; border-radius: 50%; border: 1.5px solid var(--border-strong); border-top-color: var(--text); animation: spin .7s linear infinite; flex: none; }
290
+ @keyframes spin { to { transform: rotate(360deg); } }
291
+ .skeleton { display: inline-block; width: 44px; height: 8px; border-radius: 4px; background: var(--surface-3); animation: pulse 1.2s ease-in-out infinite; }
292
+ @keyframes pulse { 50% { opacity: .45; } }
293
+
294
+ .row-menu-btn { width: 28px; height: 28px; }
295
+ .table tbody tr:not(:hover):not(:focus-within) .row-menu-btn { color: var(--text-3); }
296
+
297
+ .card-foot { display: flex; justify-content: space-between; gap: 12px; padding: 10px 16px; border-top: 1px solid var(--border); background: var(--bg-subtle); color: var(--text-3); font-size: 12.5px; flex-wrap: wrap; }
298
+ .card-foot b { color: var(--text-2); font-weight: 500; font-variant-numeric: tabular-nums; }
299
+ .foot-stats { display: flex; gap: 14px; flex-wrap: wrap; }
300
+
301
+ .empty { padding: 56px 24px; text-align: center; }
302
+ .empty-icon { display: inline-grid; place-items: center; width: 44px; height: 44px; margin-bottom: 14px; border-radius: 10px; border: 1px solid var(--border); background: var(--bg-subtle); color: var(--text-2); }
303
+ .empty-icon .icon { width: 20px; height: 20px; }
304
+ .empty h2 { font-size: 15px; }
305
+ .empty p { margin: 6px auto 18px; max-width: 400px; color: var(--text-2); }
306
+ .empty code { font-size: 12.5px; padding: 1px 5px; border-radius: 4px; background: var(--surface-2); }
307
+ .empty-actions { display: inline-flex; gap: 8px; }
308
+ .no-match { padding: 32px; text-align: center; color: var(--text-3); }
309
+
310
+ /* ---------------------------------------------------------------- providers */
311
+
312
+ .providers { margin-top: 48px; }
313
+ .section-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 14px; flex-wrap: wrap; }
314
+ .section-head h2 { font-size: 15px; }
315
+ .section-head p { color: var(--text-3); font-size: 12.5px; }
316
+ .provider-list { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); border-top: 1px solid var(--border); }
317
+ .provider-list li { border-bottom: 1px solid var(--border); }
318
+ .provider-list a { display: flex; align-items: center; gap: 10px; padding: 10px 8px 10px 0; text-decoration: none; }
319
+ .provider-list a:hover .pl-name { text-decoration: underline; text-underline-offset: 3px; }
320
+ .pl-text { min-width: 0; display: flex; flex-direction: column; }
321
+ .pl-name { font-size: 13.5px; }
322
+ .pl-env { font-family: var(--mono); font-size: 11.5px; color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
323
+
324
+ /* ---------------------------------------------------------------- dialogs */
325
+
326
+ .dialog {
327
+ width: min(560px, calc(100vw - 32px)); max-height: calc(100vh - 64px); padding: 0; margin: auto;
328
+ border: 1px solid var(--border); border-radius: 12px; background: var(--surface); color: var(--text);
329
+ box-shadow: var(--shadow-lg);
330
+ }
331
+ .dialog-sm { width: min(440px, calc(100vw - 32px)); }
332
+ .dialog[open] { display: flex; flex-direction: column; animation: dialog-in .16s ease-out; }
333
+ .dialog::backdrop { background: var(--backdrop); animation: fade-in .16s ease-out; }
334
+ @keyframes dialog-in { from { opacity: 0; transform: translateY(6px) scale(.985); } }
335
+ @keyframes fade-in { from { opacity: 0; } }
336
+ .dialog-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 20px 20px 0; }
337
+ .dialog-head h2 { font-size: 16px; }
338
+ .dialog-head p { margin-top: 4px; color: var(--text-2); font-size: 13.5px; }
339
+ .dialog-head code { font-size: 12.5px; }
340
+ .dialog-head .btn-icon { margin: -6px -8px 0 0; }
341
+ .dialog-body { padding: 16px 20px; overflow: auto; }
342
+ .dialog-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 20px; border-top: 1px solid var(--border); background: var(--bg-subtle); border-radius: 0 0 12px 12px; }
343
+ .dialog-foot-end { justify-content: flex-end; }
344
+ .dialog-actions { display: flex; gap: 8px; flex: none; }
345
+ .dialog-note { display: flex; align-items: center; gap: 6px; color: var(--text-3); font-size: 12px; }
346
+
347
+ .textarea {
348
+ display: block; width: 100%; min-height: 128px; max-height: 280px; resize: vertical; padding: 10px 12px;
349
+ border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--bg-subtle);
350
+ font: 12.5px/1.6 var(--mono); outline: 0; transition: border-color .12s, box-shadow .12s;
351
+ }
352
+ .textarea::placeholder { color: var(--text-3); }
353
+ .textarea:focus { border-color: var(--focus); box-shadow: 0 0 0 3px color-mix(in srgb, var(--focus) 18%, transparent); background: var(--surface); }
354
+ .field-inline { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 12px; }
355
+ .field-inline label { color: var(--text-2); font-size: 13px; }
356
+ .select { position: relative; display: inline-flex; align-items: center; }
357
+ .select select {
358
+ appearance: none; -webkit-appearance: none; height: 32px; min-width: 200px; padding: 0 30px 0 10px;
359
+ border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface); box-shadow: var(--shadow-sm);
360
+ font-size: 13px; cursor: pointer;
361
+ }
362
+ .select select:focus { outline: 2px solid var(--focus); outline-offset: 1px; }
363
+ .select .icon { position: absolute; right: 9px; color: var(--text-3); pointer-events: none; }
364
+
365
+ .preview { margin-top: 14px; border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; }
366
+ .preview:empty { display: none; }
367
+ .preview-row { display: flex; align-items: center; gap: 10px; padding: 7px 10px; border-bottom: 1px solid var(--border); font-size: 13px; }
368
+ .preview-row:last-child { border-bottom: 0; }
369
+ .preview-row .mono-mark { width: 20px; height: 20px; font-size: 9.5px; border-radius: 5px; }
370
+ .preview-row .key-text { margin-left: auto; font-size: 12px; }
371
+ .preview-more { padding: 7px 10px; color: var(--text-3); font-size: 12.5px; background: var(--bg-subtle); }
372
+ .preview-empty { padding: 10px; color: var(--text-3); font-size: 13px; }
373
+
374
+ .checklist { list-style: none; margin: 0 0 16px; padding: 0; display: grid; gap: 12px; }
375
+ .checklist li { display: flex; gap: 10px; color: var(--text-2); font-size: 13.5px; }
376
+ .checklist li .icon { margin-top: 2px; color: var(--text); }
377
+ .checklist strong { color: var(--text); font-weight: 500; }
378
+ .checkbox { display: flex; align-items: flex-start; gap: 10px; padding: 12px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--bg-subtle); font-size: 13.5px; cursor: pointer; }
379
+ .checkbox input { width: 16px; height: 16px; margin: 1px 0 0; accent-color: var(--text); flex: none; }
380
+ .checkbox a { color: var(--link); text-decoration: none; }
381
+ .checkbox a:hover { text-decoration: underline; }
382
+
383
+ .command {
384
+ display: flex; align-items: center; gap: 10px; width: 100%; margin: 10px 0 12px; padding: 10px 12px;
385
+ border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--bg-subtle);
386
+ font: 13px var(--mono); text-align: left;
387
+ }
388
+ .command:hover { border-color: var(--border-strong); }
389
+ .command-prompt { color: var(--text-3); }
390
+ .command .icon { margin-left: auto; color: var(--text-3); }
391
+ .muted-text { color: var(--text-2); font-size: 13.5px; }
392
+ .small { font-size: 12.5px; color: var(--text-3); }
393
+
394
+ /* ---------------------------------------------------------------- sheet */
395
+
396
+ .sheet-backdrop { position: fixed; inset: 0; z-index: 40; background: var(--backdrop); animation: fade-in .16s ease-out; }
397
+ .sheet {
398
+ position: fixed; top: 0; right: 0; bottom: 0; z-index: 41; width: min(480px, 100vw);
399
+ display: flex; flex-direction: column; background: var(--surface); border-left: 1px solid var(--border); box-shadow: var(--shadow-lg);
400
+ animation: sheet-in .2s cubic-bezier(.2, .8, .2, 1);
401
+ }
402
+ @keyframes sheet-in { from { transform: translateX(24px); opacity: 0; } }
403
+ .sheet-head { display: flex; align-items: center; gap: 12px; padding: 18px 20px; border-bottom: 1px solid var(--border); }
404
+ .sheet-title { flex: 1; min-width: 0; }
405
+ .sheet-title h2 { font-size: 16px; }
406
+ .sheet-title .key-text { display: block; margin-top: 2px; }
407
+ .sheet-body { flex: 1; overflow: auto; padding: 20px; display: grid; gap: 22px; align-content: start; }
408
+ .sheet-foot { display: flex; align-items: center; gap: 8px; padding: 14px 20px; border-top: 1px solid var(--border); background: var(--bg-subtle); }
409
+ .sheet-foot .spacer { flex: 1; }
410
+ .sheet h3 { font-size: 12px; font-weight: 500; color: var(--text-3); margin-bottom: 8px; }
411
+
412
+ .alert { display: flex; gap: 10px; padding: 12px 14px; border-radius: var(--radius-sm); border: 1px solid color-mix(in srgb, var(--c) 30%, transparent); background: var(--bg-c); font-size: 13.5px; }
413
+ .alert > .icon { color: var(--c); margin-top: 2px; }
414
+ .alert strong { display: block; font-weight: 500; }
415
+ .alert p { color: var(--text-2); margin-top: 2px; }
416
+ .alert code { display: block; margin-top: 8px; padding: 8px 10px; border-radius: 5px; background: var(--surface); border: 1px solid var(--border); font-size: 12px; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text); }
417
+ .alert[data-s="invalid"] { --c: var(--red); --bg-c: var(--red-bg); }
418
+ .alert[data-s="no_credit"] { --c: var(--orange); --bg-c: var(--orange-bg); }
419
+ .alert[data-s="limited"] { --c: var(--amber); --bg-c: var(--amber-bg); }
420
+ .alert[data-s="error"] { --c: var(--gray); --bg-c: var(--gray-bg); }
421
+ .alert[data-s="pending"] { --c: var(--text-3); --bg-c: var(--gray-bg); }
422
+
423
+ .props { margin: 0; border: 1px solid var(--border); border-radius: var(--radius-sm); }
424
+ .props > div { display: grid; grid-template-columns: 128px minmax(0, 1fr); gap: 12px; padding: 9px 12px; border-bottom: 1px solid var(--border); font-size: 13px; }
425
+ .props > div:last-child { border-bottom: 0; }
426
+ .props dt { color: var(--text-3); }
427
+ .props dd { margin: 0; overflow-wrap: anywhere; }
428
+ .props a { color: var(--link); text-decoration: none; display: inline-flex; align-items: center; gap: 4px; }
429
+ .props a:hover { text-decoration: underline; }
430
+ .props .select select { min-width: 0; width: 100%; height: 30px; }
431
+
432
+ .models-tools { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
433
+ .models-tools h3 { margin: 0; }
434
+ .models-tools .search input { width: 180px; }
435
+ .model-list { list-style: none; margin: 0; padding: 0; max-height: 320px; overflow: auto; border: 1px solid var(--border); border-radius: var(--radius-sm); }
436
+ .model-list li { border-bottom: 1px solid var(--border); }
437
+ .model-list li:last-child { border-bottom: 0; }
438
+ .model-list button { display: flex; align-items: center; width: 100%; padding: 7px 10px; font: 12.5px var(--mono); text-align: left; color: var(--text); }
439
+ .model-list button:hover { background: var(--hover); }
440
+ .model-list button .icon { margin-left: auto; color: var(--text-3); opacity: 0; }
441
+ .model-list button:hover .icon, .model-list button:focus-visible .icon { opacity: 1; }
442
+ .model-list .none { padding: 10px; color: var(--text-3); font-size: 13px; }
443
+
444
+ /* ---------------------------------------------------------------- menu + toast */
445
+
446
+ .menu { position: fixed; z-index: 60; min-width: 200px; padding: 4px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow-lg); animation: fade-in .1s ease-out; }
447
+ .menu button, .menu a { display: flex; align-items: center; gap: 9px; width: 100%; padding: 7px 9px; border-radius: 5px; font-size: 13px; text-align: left; text-decoration: none; color: var(--text); }
448
+ .menu button:hover, .menu a:hover, .menu button:focus-visible, .menu a:focus-visible { background: var(--surface-2); outline: 0; }
449
+ .menu .icon { color: var(--text-3); width: 15px; height: 15px; }
450
+ .menu .danger { color: var(--red); }
451
+ .menu .danger .icon { color: var(--red); }
452
+ .menu hr { margin: 4px -4px; border: 0; border-top: 1px solid var(--border); }
453
+ .menu .menu-note { padding: 6px 9px 4px; color: var(--text-3); font-size: 11.5px; }
454
+
455
+ .toasts { position: fixed; right: 20px; bottom: 20px; z-index: 70; display: grid; gap: 8px; justify-items: end; }
456
+ .toast { display: flex; align-items: center; gap: 9px; max-width: 360px; padding: 10px 14px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow-lg); font-size: 13.5px; animation: toast-in .2s ease-out; }
457
+ .toast .icon { color: var(--green); }
458
+ .toast.is-error .icon { color: var(--red); }
459
+ .toast.is-leaving { opacity: 0; transform: translateY(4px); transition: opacity .2s, transform .2s; }
460
+ @keyframes toast-in { from { opacity: 0; transform: translateY(8px); } }
461
+
462
+ /* ---------------------------------------------------------------- docs */
463
+
464
+ .docs { display: grid; grid-template-columns: 200px minmax(0, 1fr) 180px; gap: 40px; align-items: start; }
465
+ .docs-nav, .docs-toc { position: sticky; top: calc(var(--header-h) + 28px); }
466
+ .docs-nav h4 { margin: 18px 0 6px; padding-left: 10px; font-size: 12px; font-weight: 500; color: var(--text-3); }
467
+ .docs-nav h4:first-child { margin-top: 0; }
468
+ .docs-nav a { display: block; padding: 5px 10px; border-radius: var(--radius-sm); color: var(--text-2); text-decoration: none; font-size: 13.5px; }
469
+ .docs-nav a:hover { color: var(--text); background: var(--hover); }
470
+ .docs-nav a[aria-current="page"] { color: var(--text); background: var(--surface-2); font-weight: 500; }
471
+ .docs-toc h4 { margin-bottom: 8px; font-size: 12px; font-weight: 500; color: var(--text-3); }
472
+ .docs-toc a { display: block; padding: 3px 0; color: var(--text-3); text-decoration: none; font-size: 12.5px; line-height: 1.4; }
473
+ .docs-toc a:hover { color: var(--text); }
474
+ .docs-toc a.lvl-3 { padding-left: 10px; }
475
+ .docs-article { min-width: 0; }
476
+
477
+ .prose { max-width: 720px; font-size: 14.5px; line-height: 1.7; color: var(--text); outline: 0; }
478
+ .prose > * + * { margin-top: 14px; }
479
+ .prose h1 { font-size: 28px; letter-spacing: -0.025em; line-height: 1.2; margin-bottom: 20px; }
480
+ .prose h2 { font-size: 19px; margin-top: 38px; padding-top: 4px; letter-spacing: -0.015em; }
481
+ .prose h3 { font-size: 15.5px; margin-top: 26px; }
482
+ .prose h4 { font-size: 14.5px; margin-top: 20px; }
483
+ .prose p, .prose li { color: var(--text-2); }
484
+ .prose strong { color: var(--text); font-weight: 600; }
485
+ .prose a { color: var(--link); text-decoration: none; }
486
+ .prose a:hover { text-decoration: underline; }
487
+ .prose ul, .prose ol { padding-left: 22px; margin-bottom: 0; }
488
+ .prose li + li { margin-top: 6px; }
489
+ .prose code { font-size: 12.5px; padding: 2px 5px; border-radius: 4px; background: var(--surface-2); border: 1px solid var(--border); color: var(--text); }
490
+ .prose pre { margin: 16px 0 0; padding: 14px 16px; overflow-x: auto; border-radius: var(--radius); border: 1px solid var(--border); background: var(--bg-subtle); }
491
+ .prose pre code { padding: 0; border: 0; background: none; font-size: 12.5px; line-height: 1.65; }
492
+ .prose hr { border: 0; border-top: 1px solid var(--border); margin: 32px 0; }
493
+ .prose blockquote { margin: 16px 0 0; padding: 10px 16px; border-left: 3px solid var(--border-strong); background: var(--bg-subtle); border-radius: 0 var(--radius-sm) var(--radius-sm) 0; }
494
+ .prose blockquote p { margin: 0; }
495
+ .prose .table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius); }
496
+ .prose table { width: 100%; border-collapse: collapse; font-size: 13.5px; line-height: 1.5; }
497
+ .prose th { text-align: left; padding: 9px 12px; font-weight: 500; color: var(--text-3); font-size: 12.5px; background: var(--bg-subtle); border-bottom: 1px solid var(--border); }
498
+ .prose td { padding: 9px 12px; border-bottom: 1px solid var(--border); color: var(--text-2); vertical-align: top; }
499
+ .prose tr:last-child td { border-bottom: 0; }
500
+ .prose .license { white-space: pre-wrap; font-size: 12.5px; }
501
+ .doc-loading { color: var(--text-3); }
502
+
503
+ /* ---------------------------------------------------------------- footer */
504
+
505
+ .footer { border-top: 1px solid var(--border); }
506
+ .footer-inner { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-top: 20px; padding-bottom: 24px; flex-wrap: wrap; color: var(--text-3); font-size: 12.5px; }
507
+ .footer-left { display: flex; gap: 14px; flex-wrap: wrap; }
508
+ .footer-links { display: flex; gap: 16px; flex-wrap: wrap; }
509
+ .footer-links a { color: var(--text-2); text-decoration: none; }
510
+ .footer-links a:hover { color: var(--text); }
511
+
512
+ /* ---------------------------------------------------------------- responsive */
513
+
514
+ @media (max-width: 1020px) {
515
+ .docs { grid-template-columns: 180px minmax(0, 1fr); }
516
+ .docs-toc { display: none; }
517
+ .col-source { display: none; }
518
+ }
519
+ @media (max-width: 760px) {
520
+ .container { padding: 0 16px; }
521
+ .header-inner { gap: 14px; }
522
+ .chip-local span:last-child, .hide-sm { display: none; }
523
+ .main { padding-top: 24px; }
524
+ .page-head { align-items: stretch; }
525
+ .page-actions { width: 100%; }
526
+ .page-actions .btn { flex: 1; }
527
+ .page-actions .kbd { display: none; }
528
+ .toolbar-right { width: 100%; }
529
+ .search { flex: 1; }
530
+ .search input { width: 100%; }
531
+ .col-models, .col-latency { display: none; }
532
+ .docs { grid-template-columns: 1fr; gap: 20px; }
533
+ .docs-nav { position: static; display: flex; gap: 4px; overflow-x: auto; padding-bottom: 4px; border-bottom: 1px solid var(--border); }
534
+ .docs-nav h4 { display: none; }
535
+ .docs-nav a { white-space: nowrap; }
536
+ .dialog-foot { flex-direction: column; align-items: stretch; }
537
+ .dialog-actions .btn { flex: 1; }
538
+ .field-inline { flex-direction: column; align-items: stretch; }
539
+ .select select { width: 100%; }
540
+ .footer-inner { flex-direction: column; align-items: flex-start; }
541
+ }
542
+ @media (max-width: 520px) {
543
+ .nav a[data-nav="changelog"] { display: none; }
544
+ .header-right .btn-icon[href], .chip-demo, .chip-local { display: none; }
545
+ .provider-list { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 12px; }
546
+ .col-credit { display: none; }
547
+ .key-text.in-table { display: none; }
548
+ .table th:nth-child(2) { display: none; }
549
+ .table td:nth-child(2) { display: none; }
550
+ }
551
+
552
+ @media (prefers-reduced-motion: reduce) {
553
+ *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
554
+ }