@tokagent/tokagentos 2.0.24 → 2.0.29

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.
@@ -1,41 +1,89 @@
1
- /* Dashboard — dark theme aligned with the tokagentos parent palette.
1
+ /* Tokamak Billing Dashboard — Aave/Uniswap-class dark utility.
2
2
  *
3
- * Single-file CSS, hand-authored. Tokens repointed to the parent app's
4
- * locked dark lime palette (apps/app/src/brand-purple.css). When the
5
- * dashboard is loaded inside the parent shell, the iframe carries
6
- * `?embed=1` in its src and the pre-paint script in index.html sets
7
- * `<html data-embed="1">` that flag drives the embed-only layout
8
- * (hidden topbar, session-strip relocation, edge-to-edge padding).
3
+ * Surface stack:
4
+ * bg-0 #0a0a0f page background
5
+ * bg-1 #141420 card surface
6
+ * bg-2 #0d0d15 input/recessed surface (sits inside cards)
7
+ * bg-3 #1c1c2a borders / dividers
9
8
  *
10
- * Standalone access (no parent shell) still works at
11
- * http://localhost:31337/v1/billing/dashboard the topbar stays visible
12
- * because the data-embed flag is absent. */
9
+ * Brand accent: #c4f547 (lime) reserved for primary CTAs, balance numbers,
10
+ * active states, status dots. Never use as bulk fill.
11
+ *
12
+ * Typography:
13
+ * Inter → body, labels, UI chrome
14
+ * JetBrains Mono → numbers, addresses, tx hashes (tabular-nums always on)
15
+ *
16
+ * Embed mode (`html[data-embed="1"]`): standalone topbar hides; the wallet/
17
+ * chain/logout chips are relocated by app.js into a slim `.session-strip`
18
+ * inside #view-app. Every load-bearing #id selector is preserved.
19
+ */
13
20
 
14
21
  * { box-sizing: border-box; }
22
+
15
23
  :root {
16
- /* Names preserved from the previous palette so component selectors
17
- * elsewhere in this file keep working with value-only swaps. */
18
- --bg-0: #0a0a0f; /* parent --bg / --tk-background */
19
- --bg-1: rgba(255, 255, 255, 0.05); /* parent --card (translucent over --bg) */
20
- --bg-2: #111118; /* parent --bg-elevated / --tk-background-secondary */
21
- --line: rgba(255, 255, 255, 0.10); /* parent --border */
22
- --line-strong: rgba(255, 255, 255, 0.16);
23
- --text: #ffffff; /* parent --text */
24
- --muted: #9ca3af; /* parent --muted */
24
+ /* === Surfaces === */
25
+ --bg-0: #0a0a0f;
26
+ --bg-1: #141420;
27
+ --bg-2: #0d0d15;
28
+ --bg-3: #1c1c2a;
29
+ --bg-hover: #1a1a28;
30
+
31
+ /* === Borders === */
32
+ --border: #1c1c2a;
33
+ --border-strong: #2a2a3a;
34
+ --border-soft: rgba(255, 255, 255, 0.06);
35
+
36
+ /* === Text === */
37
+ --text: #ffffff;
38
+ --text-soft: #d4d4dc;
39
+ --muted: #9ca3af;
25
40
  --muted-strong: #6b7280;
26
- --accent: #c4f547; /* parent --accent / --tk-accent (lime) */
41
+ --muted-faint: #4a4a55;
42
+
43
+ /* === Brand accent === */
44
+ --accent: #c4f547;
27
45
  --accent-hover: #d5f972;
28
- --accent-foreground: #0a0a0f; /* dark text on lime fills */
29
- --accent-subtle: rgba(196, 245, 71, 0.12);
30
- --accent-2: #c4f547; /* legacy alias — no secondary accent in parent */
31
- --ok: #6be48e; /* parent --status-success */
32
- --warn: #ffd641; /* parent --status-warning */
33
- --err: #ff494a; /* parent --status-danger */
34
- --radius: 1.25rem; /* matches rounded-2xl */
35
- --radius-sm: 0.5rem;
46
+ --accent-foreground: #0a0a0f;
47
+ --accent-glow: rgba(196, 245, 71, 0.18);
48
+ --accent-subtle: rgba(196, 245, 71, 0.08);
49
+
50
+ /* === Legacy aliases (kept so postMessage theme pushes from the host
51
+ still hit something) === */
52
+ --bg-1-legacy: rgba(255, 255, 255, 0.05);
53
+ --line: var(--border);
54
+ --line-strong: var(--border-strong);
55
+ --accent-2: var(--accent);
56
+
57
+ /* === Status === */
58
+ --ok: #6be48e;
59
+ --ok-soft: rgba(107, 228, 142, 0.12);
60
+ --warn: #ffd641;
61
+ --warn-soft: rgba(255, 214, 65, 0.14);
62
+ --err: #ff494a;
63
+ --err-soft: rgba(255, 73, 74, 0.12);
64
+
65
+ /* === Radii === */
66
+ --radius-card: 14px;
67
+ --radius-md: 10px;
68
+ --radius-sm: 8px;
36
69
  --radius-pill: 999px;
37
- --mono: "Courier New", Courier, monospace;
38
- --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Inter", sans-serif;
70
+
71
+ /* === Typography === */
72
+ --font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
73
+ --mono: "JetBrains Mono", "IBM Plex Mono", "Menlo", "Courier New", monospace;
74
+
75
+ /* === Spacing scale === */
76
+ --space-1: 4px;
77
+ --space-2: 8px;
78
+ --space-3: 12px;
79
+ --space-4: 16px;
80
+ --space-5: 20px;
81
+ --space-6: 24px;
82
+ --space-8: 32px;
83
+
84
+ /* === Shadows === */
85
+ --shadow-card: 0 1px 0 rgba(255, 255, 255, 0.02) inset, 0 8px 24px -12px rgba(0, 0, 0, 0.4);
86
+ --shadow-hero: 0 1px 0 rgba(255, 255, 255, 0.03) inset, 0 20px 48px -24px rgba(0, 0, 0, 0.6);
39
87
  }
40
88
 
41
89
  html, body {
@@ -47,111 +95,180 @@ html, body {
47
95
  font-size: 14px;
48
96
  line-height: 1.5;
49
97
  min-height: 100vh;
98
+ -webkit-font-smoothing: antialiased;
99
+ -moz-osx-font-smoothing: grayscale;
100
+ font-feature-settings: "cv02", "cv03", "cv04", "cv11";
101
+ }
102
+
103
+ body {
104
+ background:
105
+ radial-gradient(1200px 600px at 100% -200px, rgba(196, 245, 71, 0.04), transparent 60%),
106
+ radial-gradient(900px 500px at -10% 100%, rgba(196, 245, 71, 0.025), transparent 60%),
107
+ var(--bg-0);
50
108
  }
51
109
 
52
110
  code, pre, kbd, .mono {
53
111
  font-family: var(--mono);
112
+ font-feature-settings: "tnum";
54
113
  }
55
114
 
56
- /* ---------- Top bar ---------- */
115
+ a { color: var(--accent); text-decoration: none; }
116
+ a:hover { color: var(--accent-hover); }
117
+
118
+ ::selection { background: var(--accent-glow); color: var(--text); }
119
+
120
+ /* ============================================================
121
+ TOPBAR
122
+ ============================================================ */
57
123
  .topbar {
58
124
  display: flex;
59
125
  align-items: center;
60
126
  justify-content: space-between;
61
- padding: 10px 24px;
62
- min-height: 2.375rem;
63
- border-bottom: 1px solid var(--line);
64
- background: rgba(10, 10, 15, 0.88);
65
- backdrop-filter: blur(16px);
66
- -webkit-backdrop-filter: blur(16px);
127
+ padding: 14px 24px;
128
+ min-height: 56px;
129
+ border-bottom: 1px solid var(--border);
130
+ background: rgba(10, 10, 15, 0.72);
131
+ backdrop-filter: blur(20px) saturate(140%);
132
+ -webkit-backdrop-filter: blur(20px) saturate(140%);
67
133
  position: sticky;
68
134
  top: 0;
69
- z-index: 10;
135
+ z-index: 50;
70
136
  }
71
137
  .brand {
72
138
  display: flex;
73
139
  align-items: center;
74
- gap: 8px;
75
- font-size: 14px;
140
+ gap: 10px;
76
141
  }
77
- .brand strong { font-weight: 700; }
78
- .brand em { color: var(--muted); font-style: normal; margin-left: 6px; }
79
142
  .brand-mark {
80
- display: inline-block;
81
- width: 22px; height: 22px;
82
- text-align: center;
83
- line-height: 22px;
84
- background: var(--accent);
85
- color: var(--accent-foreground);
86
- border-radius: 50%;
87
- font-weight: 800;
143
+ display: inline-flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ width: 26px; height: 26px;
147
+ flex-shrink: 0;
148
+ }
149
+ .brand-mark svg {
150
+ display: block;
151
+ width: 100%;
152
+ height: 100%;
153
+ }
154
+ .brand-text {
155
+ display: flex;
156
+ align-items: baseline;
157
+ gap: 6px;
158
+ line-height: 1;
159
+ }
160
+ .brand-text strong {
161
+ font-size: 15px;
162
+ font-weight: 700;
163
+ letter-spacing: -0.01em;
164
+ }
165
+ .brand-text .brand-sub {
166
+ color: var(--muted);
167
+ font-size: 13px;
168
+ font-weight: 500;
169
+ }
170
+
171
+ .topbar-right {
172
+ display: flex;
173
+ align-items: center;
174
+ gap: 8px;
88
175
  }
89
- .topbar-right { display: flex; align-items: center; gap: 10px; }
90
176
 
91
177
  /* When embedded, hide the dashboard's own sticky topbar — the parent app
92
178
  * supplies its breadcrumb + nav header above the iframe. `app.js` moves
93
- * `.topbar-right` into a `.session-strip` inside `<main>` on boot. */
179
+ * `.topbar-right` into a `.session-strip` inside <main> on boot. */
94
180
  html[data-embed="1"] .topbar { display: none; }
95
- html[data-embed="1"] main { padding-top: 16px; }
181
+ html[data-embed="1"] main { padding-top: 20px; }
96
182
 
97
- /* Session strip — slim, non-sticky, right-aligned chip row inside <main>
98
- * that hosts the relocated wallet / chain / logout controls when embedded.
99
- * The strip is created by app.js, then `.topbar-right` is moved into it
100
- * (preserves every load-bearing #id selector). */
101
183
  .session-strip {
102
184
  display: flex;
103
185
  align-items: center;
104
186
  justify-content: flex-end;
105
187
  flex-wrap: wrap;
106
- gap: 10px;
107
- margin: 0 0 16px 0;
188
+ gap: 8px;
189
+ margin: 0 0 var(--space-5) 0;
108
190
  }
109
191
  .session-strip .topbar-right {
110
192
  display: flex;
111
193
  align-items: center;
112
- gap: 10px;
194
+ gap: 8px;
113
195
  }
114
196
 
197
+ /* ============================================================
198
+ PILLS
199
+ ============================================================ */
115
200
  .pill {
116
201
  display: inline-flex;
117
202
  align-items: center;
118
- gap: 6px;
119
- background: var(--bg-2);
120
- border: 1px solid var(--line);
121
- padding: 4px 10px;
203
+ gap: 8px;
204
+ background: var(--bg-1);
205
+ border: 1px solid var(--border);
206
+ padding: 6px 12px;
122
207
  border-radius: var(--radius-pill);
123
208
  font-size: 12px;
124
209
  color: var(--muted);
210
+ font-weight: 500;
211
+ height: 30px;
125
212
  }
126
- .pill code { color: var(--text); }
213
+ .pill code,
214
+ .pill .pill-mono {
215
+ color: var(--text);
216
+ font-family: var(--mono);
217
+ font-size: 12px;
218
+ letter-spacing: -0.01em;
219
+ }
220
+ .pill-wallet {
221
+ background: var(--bg-1);
222
+ border-color: var(--border-strong);
223
+ }
224
+ .pill-wallet code,
225
+ .pill-wallet .pill-mono {
226
+ color: var(--text);
227
+ font-weight: 500;
228
+ }
229
+
127
230
  .dot {
128
231
  width: 8px; height: 8px;
129
- background: var(--muted);
232
+ background: var(--muted-faint);
130
233
  border-radius: 50%;
131
234
  display: inline-block;
235
+ flex: 0 0 8px;
236
+ }
237
+ .dot-ok {
238
+ background: var(--ok);
239
+ box-shadow: 0 0 0 3px rgba(107, 228, 142, 0.18);
132
240
  }
133
- .dot-ok { background: var(--ok); box-shadow: 0 0 6px rgba(107, 228, 142, 0.7); }
134
241
 
135
- .pill-ok { border-color: rgba(107, 228, 142, 0.4); color: var(--ok); }
136
- .pill-ok code { color: var(--ok); }
242
+ .pill-ok { border-color: rgba(107, 228, 142, 0.35); color: var(--ok); }
243
+ .pill-ok code, .pill-ok .pill-mono { color: var(--ok); }
244
+ .pill-ok .dot { background: var(--ok); box-shadow: 0 0 0 3px rgba(107, 228, 142, 0.18); }
137
245
  .pill-warn { border-color: rgba(255, 214, 65, 0.45); color: var(--warn); }
138
- .pill-warn code { color: var(--warn); }
139
- .btn-small { padding: 4px 10px; font-size: 12px; }
246
+ .pill-warn code, .pill-warn .pill-mono { color: var(--warn); }
247
+ .pill-warn .dot { background: var(--warn); box-shadow: 0 0 0 3px rgba(255, 214, 65, 0.18); }
140
248
 
141
- /* ---------- Buttons ---------- */
249
+ /* ============================================================
250
+ BUTTONS
251
+ ============================================================ */
142
252
  .btn {
143
253
  appearance: none;
144
254
  border: 1px solid transparent;
145
255
  border-radius: var(--radius-sm);
146
- padding: 8px 14px;
256
+ padding: 9px 16px;
147
257
  font-size: 13px;
148
258
  font-weight: 600;
149
259
  cursor: pointer;
150
- transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
260
+ transition: background 140ms ease, border-color 140ms ease, color 140ms ease, transform 80ms ease;
151
261
  font-family: inherit;
262
+ letter-spacing: -0.005em;
263
+ white-space: nowrap;
264
+ line-height: 1.2;
152
265
  }
153
- .btn:disabled { cursor: not-allowed; opacity: 0.5; }
154
- /* Primary: flat lime fill, dark text. No gradients in the parent system. */
266
+ .btn:active:not(:disabled) { transform: translateY(1px); }
267
+ .btn:disabled { cursor: not-allowed; opacity: 0.45; }
268
+ .btn-block { width: 100%; }
269
+ .btn-small { padding: 6px 10px; font-size: 12px; }
270
+ .btn-cta { padding: 14px 18px; font-size: 14px; border-radius: var(--radius-md); }
271
+
155
272
  .btn-primary {
156
273
  background: var(--accent);
157
274
  color: var(--accent-foreground);
@@ -161,223 +278,777 @@ html[data-embed="1"] main { padding-top: 16px; }
161
278
  background: var(--accent-hover);
162
279
  border-color: var(--accent-hover);
163
280
  }
281
+ .btn-primary:disabled {
282
+ background: var(--bg-3);
283
+ color: var(--muted);
284
+ border-color: var(--border-strong);
285
+ opacity: 1;
286
+ }
287
+
164
288
  .btn-ghost {
165
289
  background: transparent;
166
290
  color: var(--muted);
167
- border-color: var(--line);
291
+ border-color: var(--border-strong);
168
292
  }
169
293
  .btn-ghost:not(:disabled):hover {
170
- background: var(--bg-2);
294
+ background: var(--bg-hover);
171
295
  color: var(--text);
172
- border-color: var(--line-strong);
296
+ border-color: var(--border-strong);
173
297
  }
298
+
174
299
  .btn-danger {
175
300
  background: transparent;
176
301
  color: var(--err);
177
- border-color: rgba(255, 73, 74, 0.4);
302
+ border-color: rgba(255, 73, 74, 0.35);
303
+ }
304
+ .btn-danger:not(:disabled):hover {
305
+ background: var(--err-soft);
306
+ border-color: rgba(255, 73, 74, 0.55);
307
+ }
308
+
309
+ .link-btn {
310
+ background: transparent;
311
+ border: 0;
312
+ color: var(--accent);
313
+ font-family: inherit;
314
+ font-size: 11px;
315
+ font-weight: 600;
316
+ text-transform: uppercase;
317
+ letter-spacing: 0.06em;
318
+ padding: 2px 6px;
319
+ cursor: pointer;
320
+ border-radius: 4px;
321
+ transition: background 120ms ease;
178
322
  }
179
- .btn-danger:not(:disabled):hover { background: rgba(255, 73, 74, 0.08); }
323
+ .link-btn:hover { background: var(--accent-subtle); }
180
324
 
181
- /* ---------- Layout ---------- */
325
+ /* ============================================================
326
+ LAYOUT
327
+ ============================================================ */
182
328
  main {
183
- max-width: 1100px;
329
+ max-width: 1180px;
184
330
  margin: 0 auto;
185
- padding: 24px 24px 64px 24px;
331
+ padding: 28px 24px 80px 24px;
332
+ }
333
+ .view {
334
+ animation: fade .18s ease-out;
335
+ display: flex;
336
+ flex-direction: column;
337
+ gap: var(--space-5);
338
+ }
339
+ @keyframes fade {
340
+ from { opacity: 0; transform: translateY(6px); }
341
+ to { opacity: 1; transform: none; }
186
342
  }
187
- .view { animation: fade .15s ease-out; }
188
- @keyframes fade { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
189
343
 
190
- /* ---------- Login ---------- */
191
- .view-login { display: flex; justify-content: center; padding-top: 64px; }
192
- /* The .view-login `display: flex` above wins over [hidden]'s UA default of
193
- * `display: none`, so without this override the login section (and its
194
- * "Sign in" button) stays visible after showAppView() flips view-login.hidden
195
- * to true. Same pattern as .tab-pane[hidden] below. */
344
+ /* ============================================================
345
+ LOGIN
346
+ ============================================================ */
347
+ .view-login {
348
+ display: flex;
349
+ justify-content: center;
350
+ padding-top: 56px;
351
+ }
196
352
  .view-login[hidden] { display: none; }
353
+
197
354
  .login-card {
198
- max-width: 480px;
355
+ max-width: 460px;
199
356
  width: 100%;
200
357
  background: var(--bg-1);
201
- border: 1px solid var(--line);
202
- border-radius: var(--radius);
358
+ border: 1px solid var(--border);
359
+ border-radius: var(--radius-card);
203
360
  padding: 32px;
204
- backdrop-filter: blur(12px);
205
- -webkit-backdrop-filter: blur(12px);
361
+ box-shadow: var(--shadow-card);
362
+ }
363
+ .login-eyebrow {
364
+ font-size: 11px;
365
+ text-transform: uppercase;
366
+ letter-spacing: 0.1em;
367
+ color: var(--muted);
368
+ font-weight: 600;
369
+ margin-bottom: 8px;
370
+ }
371
+ .login-card h1 {
372
+ margin: 0 0 8px 0;
373
+ font-size: 24px;
374
+ font-weight: 700;
375
+ letter-spacing: -0.02em;
376
+ }
377
+ .login-card .muted { color: var(--muted); margin: 0 0 24px 0; font-size: 13px; }
378
+
379
+ .login-steps {
380
+ list-style: none;
381
+ padding: 0;
382
+ margin: 0 0 24px 0;
383
+ display: flex;
384
+ flex-direction: column;
385
+ gap: 10px;
386
+ }
387
+ .login-steps li {
388
+ display: flex;
389
+ align-items: center;
390
+ gap: 12px;
391
+ font-size: 13px;
392
+ color: var(--text-soft);
393
+ }
394
+ .login-steps .step-num {
395
+ display: inline-flex;
396
+ align-items: center;
397
+ justify-content: center;
398
+ width: 22px; height: 22px;
399
+ border-radius: 50%;
400
+ background: var(--bg-2);
401
+ border: 1px solid var(--border-strong);
402
+ font-family: var(--mono);
403
+ font-size: 11px;
404
+ font-weight: 600;
405
+ color: var(--accent);
406
+ flex: 0 0 22px;
206
407
  }
207
- .login-card h1 { margin-top: 0; font-size: 22px; }
208
- .login-card .muted { color: var(--muted); }
209
- .login-steps ol { padding-left: 20px; color: var(--muted); }
210
- .login-actions { margin-top: 16px; display: flex; gap: 10px; }
408
+
409
+ .login-actions { display: flex; flex-direction: column; gap: 10px; }
410
+
211
411
  .login-help { margin-top: 18px; }
212
- .login-help summary { cursor: pointer; color: var(--muted); }
412
+ .login-help summary {
413
+ cursor: pointer;
414
+ color: var(--muted);
415
+ font-size: 13px;
416
+ list-style: none;
417
+ }
418
+ .login-help summary::-webkit-details-marker { display: none; }
419
+ .login-help summary::before {
420
+ content: "▸";
421
+ display: inline-block;
422
+ margin-right: 6px;
423
+ transition: transform 120ms ease;
424
+ }
425
+ .login-help[open] summary::before { transform: rotate(90deg); }
426
+
213
427
  .small { font-size: 12px; }
428
+ .xsmall { font-size: 11px; line-height: 1.5; }
214
429
 
215
430
  .status-line {
216
- margin-top: 8px;
431
+ margin-top: 10px;
217
432
  min-height: 1.2em;
218
- font-size: 13px;
433
+ font-size: 12px;
219
434
  color: var(--muted);
435
+ font-family: var(--mono);
436
+ letter-spacing: -0.005em;
437
+ word-break: break-word;
220
438
  }
221
439
  .status-line.err { color: var(--err); }
222
440
  .status-line.ok { color: var(--ok); }
441
+ .status-line a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
223
442
 
224
- /* ---------- Cards ---------- */
225
- .card {
226
- background: var(--bg-1);
227
- border: 1px solid var(--line);
228
- border-radius: var(--radius);
229
- padding: 20px;
230
- backdrop-filter: blur(12px);
231
- -webkit-backdrop-filter: blur(12px);
443
+ /* ============================================================
444
+ HERO (balance)
445
+ ============================================================ */
446
+ .hero {
447
+ background: linear-gradient(180deg, rgba(196, 245, 71, 0.04) 0%, transparent 50%), var(--bg-1);
448
+ border: 1px solid var(--border);
449
+ border-radius: var(--radius-card);
450
+ padding: 28px 32px;
451
+ display: grid;
452
+ grid-template-columns: 1fr auto;
453
+ gap: 32px;
454
+ align-items: center;
455
+ box-shadow: var(--shadow-hero);
456
+ position: relative;
457
+ overflow: hidden;
458
+ }
459
+ .hero::after {
460
+ content: "";
461
+ position: absolute;
462
+ top: 0; right: 0;
463
+ width: 240px; height: 240px;
464
+ background: radial-gradient(circle at top right, var(--accent-glow), transparent 70%);
465
+ pointer-events: none;
466
+ opacity: 0.6;
467
+ }
468
+ .hero-main { position: relative; z-index: 1; min-width: 0; }
469
+ .hero-eyebrow {
470
+ font-size: 11px;
471
+ text-transform: uppercase;
472
+ letter-spacing: 0.1em;
473
+ color: var(--muted);
474
+ font-weight: 600;
475
+ margin-bottom: 14px;
232
476
  }
233
- .card > header {
477
+ .hero-balance {
234
478
  display: flex;
235
479
  align-items: baseline;
236
- justify-content: space-between;
237
- flex-wrap: wrap;
238
- gap: 8px;
480
+ gap: 12px;
239
481
  margin-bottom: 12px;
482
+ flex-wrap: wrap;
240
483
  }
241
- .card > header h2 {
242
- margin: 0;
243
- font-size: 12px;
244
- color: var(--muted);
484
+ .hero-num {
485
+ font-family: var(--mono);
486
+ font-size: 56px;
245
487
  font-weight: 600;
488
+ color: var(--text);
489
+ letter-spacing: -0.03em;
490
+ line-height: 1;
491
+ font-feature-settings: "tnum";
492
+ word-break: break-all;
493
+ }
494
+ .hero-unit {
495
+ font-family: var(--mono);
496
+ font-size: 18px;
497
+ color: var(--muted);
498
+ font-weight: 500;
499
+ }
500
+ .hero-meta {
501
+ display: flex;
502
+ align-items: center;
503
+ gap: 10px;
504
+ flex-wrap: wrap;
505
+ font-size: 13px;
506
+ color: var(--muted);
507
+ }
508
+ .hero-meta .hero-usd { color: var(--text-soft); font-family: var(--mono); font-feature-settings: "tnum"; }
509
+ .hero-meta span:not(.hero-sep):not(.hero-usd) { font-family: var(--mono); font-feature-settings: "tnum"; }
510
+ .hero-sep { color: var(--muted-faint); }
511
+
512
+ .hero-side {
513
+ display: grid;
514
+ grid-template-columns: repeat(2, minmax(120px, 1fr));
515
+ gap: 16px 24px;
516
+ position: relative;
517
+ z-index: 1;
518
+ }
519
+ .hero-stat { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
520
+ .stat-label {
521
+ font-size: 10px;
246
522
  text-transform: uppercase;
247
- letter-spacing: 0.04em;
523
+ letter-spacing: 0.08em;
524
+ color: var(--muted);
525
+ font-weight: 600;
526
+ }
527
+ .stat-num {
528
+ font-family: var(--mono);
529
+ font-size: 15px;
530
+ color: var(--text);
531
+ font-weight: 500;
532
+ font-feature-settings: "tnum";
533
+ letter-spacing: -0.01em;
248
534
  }
249
- .card-sub { font-size: 12px; color: var(--muted); }
250
- .section-card { margin-top: 20px; }
251
535
 
252
- .grid { display: grid; gap: 16px; }
253
- .grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
254
- .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: 12px; }
255
- .grid-soft { gap: 12px; }
256
- @media (max-width: 800px) {
257
- .grid-3 { grid-template-columns: 1fr; }
258
- .grid-2 { grid-template-columns: 1fr; }
536
+ @media (max-width: 760px) {
537
+ .hero {
538
+ grid-template-columns: 1fr;
539
+ gap: 24px;
540
+ padding: 24px;
541
+ }
542
+ .hero-num { font-size: 40px; }
543
+ .hero-side { grid-template-columns: repeat(2, 1fr); }
259
544
  }
260
545
 
261
- .big-num {
262
- font-size: 28px;
263
- font-weight: 700;
264
- margin: 6px 0 4px 0;
546
+ /* ============================================================
547
+ KPI STRIP
548
+ ============================================================ */
549
+ .kpi-strip {
550
+ display: grid;
551
+ grid-template-columns: repeat(4, 1fr);
552
+ gap: 1px;
553
+ background: var(--border);
554
+ border: 1px solid var(--border);
555
+ border-radius: var(--radius-card);
556
+ overflow: hidden;
557
+ }
558
+ .kpi {
559
+ background: var(--bg-1);
560
+ padding: 16px 20px;
561
+ display: flex;
562
+ flex-direction: column;
563
+ gap: 4px;
564
+ }
565
+ .kpi-label {
566
+ font-size: 11px;
567
+ text-transform: uppercase;
568
+ letter-spacing: 0.08em;
569
+ color: var(--muted);
570
+ font-weight: 600;
571
+ }
572
+ .kpi-val {
265
573
  font-family: var(--mono);
574
+ font-size: 22px;
575
+ font-weight: 600;
266
576
  color: var(--text);
577
+ font-feature-settings: "tnum";
578
+ letter-spacing: -0.02em;
579
+ display: flex;
580
+ align-items: baseline;
581
+ gap: 4px;
267
582
  }
268
- .big-num em {
269
- font-style: normal;
270
- font-size: 13px;
271
- font-weight: 500;
583
+ .kpi-val.ok { color: var(--ok); }
584
+ .kpi-val.err { color: var(--err); }
585
+ .kpi-val.muted { color: var(--muted); }
586
+ .kpi-unit {
587
+ font-size: 12px;
272
588
  color: var(--muted);
273
- margin-left: 6px;
274
- font-family: var(--font-sans);
589
+ font-weight: 500;
275
590
  }
276
- .muted { color: var(--muted); }
277
591
 
278
- .metric h3 {
279
- margin: 0 0 4px 0;
280
- color: var(--muted);
281
- font-size: 12px;
592
+ @media (max-width: 760px) {
593
+ .kpi-strip { grid-template-columns: repeat(2, 1fr); }
594
+ }
595
+
596
+ /* ============================================================
597
+ CARDS
598
+ ============================================================ */
599
+ .card {
600
+ background: var(--bg-1);
601
+ border: 1px solid var(--border);
602
+ border-radius: var(--radius-card);
603
+ padding: 24px;
604
+ box-shadow: var(--shadow-card);
605
+ }
606
+ .section-card { padding: 24px; }
607
+
608
+ .card-header {
609
+ display: flex;
610
+ align-items: flex-start;
611
+ justify-content: space-between;
612
+ flex-wrap: wrap;
613
+ gap: 12px;
614
+ margin-bottom: 20px;
615
+ }
616
+ .card-header-stack {
617
+ flex-direction: column;
618
+ align-items: flex-start;
619
+ gap: 16px;
620
+ }
621
+ .card-eyebrow {
622
+ font-size: 10px;
282
623
  text-transform: uppercase;
283
- letter-spacing: 0.04em;
624
+ letter-spacing: 0.1em;
625
+ color: var(--muted);
284
626
  font-weight: 600;
627
+ margin-bottom: 4px;
285
628
  }
286
- .metric h4 {
629
+ .card-title {
287
630
  margin: 0;
631
+ font-size: 16px;
632
+ font-weight: 600;
633
+ color: var(--text);
634
+ letter-spacing: -0.01em;
635
+ }
636
+ .card-tag {
637
+ font-size: 11px;
288
638
  color: var(--muted);
289
- font-size: 12px;
290
- font-weight: 500;
639
+ font-family: var(--mono);
640
+ background: var(--bg-2);
641
+ border: 1px solid var(--border-strong);
642
+ padding: 4px 10px;
643
+ border-radius: var(--radius-pill);
644
+ white-space: nowrap;
291
645
  }
292
- .metric-mini p { margin: 2px 0 0 0; font-family: var(--mono); }
646
+ .card-tag code {
647
+ font-size: 11px;
648
+ background: transparent;
649
+ padding: 0;
650
+ color: var(--text-soft);
651
+ }
652
+
653
+ .muted { color: var(--muted); }
293
654
 
294
- /* ---------- Top up ---------- */
295
- .topup-row {
655
+ /* Card grid (top up + swap) */
656
+ .grid-cards {
296
657
  display: grid;
297
- grid-template-columns: 2fr 1fr;
298
- gap: 24px;
299
- align-items: end;
658
+ grid-template-columns: repeat(2, 1fr);
659
+ gap: var(--space-5);
300
660
  }
301
- @media (max-width: 800px) { .topup-row { grid-template-columns: 1fr; } }
302
- .topup-amount label {
303
- display: block;
304
- color: var(--muted);
305
- font-size: 12px;
306
- margin-bottom: 6px;
661
+ @media (max-width: 880px) {
662
+ .grid-cards { grid-template-columns: 1fr; }
663
+ }
664
+
665
+ /* ============================================================
666
+ FORM PRIMITIVES
667
+ ============================================================ */
668
+ .form-row {
669
+ display: flex;
670
+ flex-direction: column;
671
+ gap: 8px;
672
+ margin-bottom: 12px;
673
+ }
674
+ .field-label {
675
+ font-size: 11px;
307
676
  text-transform: uppercase;
308
- letter-spacing: 0.04em;
677
+ letter-spacing: 0.08em;
678
+ color: var(--muted);
679
+ font-weight: 600;
680
+ }
681
+ .field-label-row {
682
+ display: flex;
683
+ align-items: center;
684
+ justify-content: space-between;
685
+ gap: 8px;
686
+ }
687
+ .field-meta {
688
+ font-size: 11px;
689
+ color: var(--muted);
690
+ font-family: var(--mono);
691
+ display: inline-flex;
692
+ align-items: center;
693
+ gap: 4px;
309
694
  }
310
- .topup-input {
695
+ .field-meta span { color: var(--text-soft); }
696
+
697
+ .amount-input {
311
698
  display: flex;
312
699
  align-items: center;
313
700
  background: var(--bg-2);
314
- border: 1px solid var(--line);
315
- border-radius: var(--radius-sm);
316
- padding: 0 12px;
317
- transition: border-color 120ms ease;
701
+ border: 1px solid var(--border-strong);
702
+ border-radius: var(--radius-md);
703
+ padding: 4px 16px;
704
+ transition: border-color 140ms ease, background 140ms ease;
705
+ min-height: 56px;
706
+ }
707
+ .amount-input:focus-within {
708
+ border-color: var(--accent);
709
+ background: var(--bg-2);
710
+ box-shadow: 0 0 0 3px var(--accent-subtle);
318
711
  }
319
- .topup-input:focus-within { border-color: var(--accent); }
320
- .topup-input input {
712
+ .amount-input input {
321
713
  background: transparent;
322
714
  border: 0;
323
715
  color: var(--text);
324
- font-size: 18px;
716
+ font-size: 24px;
717
+ font-family: var(--mono);
718
+ font-weight: 500;
719
+ font-feature-settings: "tnum";
325
720
  flex: 1;
326
- padding: 10px 0;
721
+ padding: 12px 0;
327
722
  outline: none;
723
+ min-width: 0;
724
+ letter-spacing: -0.02em;
725
+ }
726
+ .amount-input input::placeholder { color: var(--muted-faint); }
727
+ .amount-input .amount-unit {
728
+ color: var(--muted);
729
+ font-size: 13px;
730
+ font-weight: 500;
328
731
  font-family: var(--mono);
732
+ padding-left: 12px;
733
+ border-left: 1px solid var(--border-strong);
734
+ }
735
+ .amount-input-with-token { padding-right: 6px; }
736
+
737
+ /* Preset chips */
738
+ .preset-row {
739
+ display: flex;
740
+ flex-wrap: wrap;
741
+ gap: 6px;
742
+ margin-bottom: 16px;
329
743
  }
330
- .topup-input .suffix { color: var(--muted); font-size: 13px; }
331
- .topup-presets { display: flex; gap: 6px; margin-top: 8px; }
332
- .topup-presets button {
744
+ .chip {
333
745
  background: transparent;
334
746
  color: var(--muted);
335
- border: 1px solid var(--line);
747
+ border: 1px solid var(--border-strong);
336
748
  border-radius: var(--radius-pill);
337
- padding: 4px 12px;
749
+ padding: 5px 12px;
338
750
  font-size: 12px;
751
+ font-weight: 500;
339
752
  cursor: pointer;
340
753
  font-family: inherit;
341
754
  transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
342
755
  }
343
- .topup-presets button:hover {
756
+ .chip:hover {
757
+ background: var(--bg-hover);
758
+ color: var(--text);
759
+ border-color: var(--border-strong);
760
+ }
761
+ .chip.is-active,
762
+ .chip.is-active:hover {
763
+ background: var(--accent-subtle);
764
+ color: var(--accent);
765
+ border-color: rgba(196, 245, 71, 0.35);
766
+ }
767
+
768
+ /* Estimate lines (Top up + Swap) */
769
+ .estimate-line {
770
+ display: flex;
771
+ align-items: center;
772
+ justify-content: space-between;
773
+ padding: 10px 14px;
344
774
  background: var(--bg-2);
775
+ border: 1px solid var(--border);
776
+ border-radius: var(--radius-md);
777
+ margin-bottom: 8px;
778
+ font-size: 13px;
779
+ }
780
+ .estimate-line.subtle {
781
+ background: transparent;
782
+ border: 0;
783
+ padding: 2px 14px;
784
+ }
785
+ .estimate-line.compact { padding: 4px 0; }
786
+ .est-label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; }
787
+ .est-val {
788
+ font-family: var(--mono);
345
789
  color: var(--text);
346
- border-color: var(--line-strong);
790
+ font-feature-settings: "tnum";
791
+ font-weight: 500;
347
792
  }
348
- .topup-action { display: flex; flex-direction: column; align-items: stretch; gap: 8px; }
793
+ .estimate-line.subtle .est-val { color: var(--muted); }
349
794
 
350
- /* ---------- Tabs (parent header-nav pattern: ghost + underline) ---------- */
351
- .card-tabs { gap: 12px; }
352
- .tabs { display: flex; gap: 4px; flex-wrap: wrap; }
353
- .tab {
795
+ /* CTA spacing inside cards */
796
+ .card .btn-cta { margin-top: 14px; }
797
+
798
+ /* ============================================================
799
+ SWAP CARD specifics
800
+ ============================================================ */
801
+ .token-select {
802
+ display: inline-flex;
803
+ align-items: center;
804
+ gap: 8px;
805
+ background: var(--bg-1);
806
+ border: 1px solid var(--border-strong);
807
+ border-radius: var(--radius-pill);
808
+ padding: 6px 12px 6px 6px;
809
+ cursor: pointer;
810
+ user-select: none;
354
811
  position: relative;
812
+ font-weight: 600;
813
+ font-size: 13px;
814
+ color: var(--text);
815
+ transition: background 120ms ease, border-color 120ms ease;
816
+ flex: 0 0 auto;
817
+ outline: none;
818
+ }
819
+ .token-select:hover { background: var(--bg-hover); }
820
+ .token-select:focus-visible { border-color: var(--accent); }
821
+ .token-icon {
822
+ width: 22px;
823
+ height: 22px;
824
+ border-radius: 50%;
825
+ background: var(--bg-3);
826
+ flex: 0 0 22px;
827
+ display: block;
828
+ }
829
+ .token-select .caret { color: var(--muted); flex: 0 0 10px; }
830
+
831
+ .token-menu {
832
+ position: absolute;
833
+ top: calc(100% + 6px);
834
+ right: 0;
835
+ min-width: 180px;
836
+ background: var(--bg-1);
837
+ border: 1px solid var(--border-strong);
838
+ border-radius: var(--radius-md);
839
+ padding: 6px;
840
+ z-index: 30;
841
+ display: flex;
842
+ flex-direction: column;
843
+ gap: 2px;
844
+ box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.7);
845
+ }
846
+ .token-menu[hidden] { display: none; }
847
+ .token-option {
848
+ display: flex;
849
+ align-items: center;
850
+ gap: 10px;
851
+ padding: 8px 10px;
852
+ border-radius: var(--radius-sm);
355
853
  background: transparent;
356
854
  border: 0;
855
+ cursor: pointer;
856
+ font-family: inherit;
857
+ color: var(--text);
858
+ font-size: 13px;
859
+ font-weight: 500;
860
+ text-align: left;
861
+ }
862
+ .token-option:hover { background: var(--bg-hover); }
863
+ .token-option .token-option-sub {
864
+ margin-left: auto;
865
+ font-family: var(--mono);
866
+ font-size: 11px;
867
+ color: var(--muted);
868
+ }
869
+
870
+ .swap-arrow {
871
+ display: flex;
872
+ align-items: center;
873
+ justify-content: center;
874
+ width: 32px; height: 32px;
875
+ border-radius: 8px;
876
+ background: var(--bg-2);
877
+ border: 1px solid var(--border-strong);
878
+ color: var(--muted);
879
+ margin: -6px auto 6px auto;
880
+ position: relative;
881
+ z-index: 1;
882
+ }
883
+
884
+ .receive-box {
885
+ display: flex;
886
+ align-items: baseline;
887
+ gap: 8px;
888
+ padding: 14px 16px;
889
+ background: var(--bg-2);
890
+ border: 1px solid var(--border-strong);
891
+ border-radius: var(--radius-md);
892
+ min-height: 56px;
893
+ }
894
+ .receive-num {
895
+ font-family: var(--mono);
896
+ font-size: 24px;
897
+ font-weight: 500;
898
+ color: var(--text);
899
+ font-feature-settings: "tnum";
900
+ letter-spacing: -0.02em;
901
+ flex: 1;
902
+ word-break: break-all;
903
+ }
904
+ .receive-unit {
905
+ font-size: 13px;
906
+ color: var(--muted);
907
+ font-weight: 500;
908
+ font-family: var(--mono);
909
+ }
910
+
911
+ .route-section {
912
+ margin-top: 16px;
913
+ margin-bottom: 16px;
914
+ }
915
+ .route-label {
916
+ font-size: 11px;
917
+ text-transform: uppercase;
918
+ letter-spacing: 0.08em;
357
919
  color: var(--muted);
920
+ font-weight: 600;
921
+ margin-bottom: 8px;
922
+ }
923
+ .route-chain {
924
+ display: flex;
925
+ align-items: center;
926
+ flex-wrap: wrap;
927
+ gap: 6px;
358
928
  padding: 8px 12px;
929
+ background: var(--bg-2);
930
+ border: 1px solid var(--border);
931
+ border-radius: var(--radius-md);
932
+ }
933
+ .route-step {
934
+ display: inline-flex;
935
+ align-items: center;
936
+ padding: 4px 10px;
937
+ background: var(--bg-1);
938
+ border: 1px solid var(--border-strong);
939
+ border-radius: var(--radius-pill);
940
+ font-family: var(--mono);
941
+ font-size: 11px;
942
+ font-weight: 600;
943
+ color: var(--text-soft);
944
+ letter-spacing: 0.02em;
945
+ }
946
+ .route-step.route-step-end {
947
+ background: var(--accent-subtle);
948
+ color: var(--accent);
949
+ border-color: rgba(196, 245, 71, 0.3);
950
+ }
951
+ .route-arrow {
952
+ color: var(--muted-faint);
359
953
  font-size: 12px;
954
+ font-family: var(--mono);
955
+ }
956
+
957
+ .slippage-row {
958
+ display: flex;
959
+ align-items: center;
960
+ justify-content: space-between;
961
+ margin-bottom: 8px;
962
+ gap: 12px;
963
+ }
964
+ .slippage-buttons { display: flex; gap: 6px; }
965
+
966
+ /* ============================================================
967
+ USAGE TABS
968
+ ============================================================ */
969
+ .tabs {
970
+ display: flex;
971
+ gap: 0;
972
+ flex-wrap: wrap;
973
+ border-bottom: 1px solid var(--border);
974
+ width: 100%;
975
+ margin-top: 4px;
976
+ }
977
+ .tab {
978
+ position: relative;
979
+ background: transparent;
980
+ border: 0;
981
+ color: var(--muted);
982
+ padding: 10px 14px;
983
+ font-size: 13px;
360
984
  cursor: pointer;
361
985
  font-family: inherit;
362
- font-weight: 600;
986
+ font-weight: 500;
363
987
  transition: color 120ms ease;
988
+ border-bottom: 2px solid transparent;
989
+ margin-bottom: -1px;
364
990
  }
365
991
  .tab:hover { color: var(--text); }
366
- .tab.active { color: var(--accent); }
367
- .tab.active::after {
368
- content: "";
369
- position: absolute;
370
- left: 12px;
371
- right: 12px;
372
- bottom: -2px;
373
- height: 3px;
374
- background: var(--accent);
375
- border-radius: 2px;
992
+ .tab.is-active,
993
+ .tab.active {
994
+ color: var(--text);
995
+ border-bottom-color: var(--accent);
996
+ font-weight: 600;
376
997
  }
377
- .tab-pane { padding-top: 12px; }
998
+ .tab-pane { padding-top: 20px; }
378
999
  .tab-pane[hidden] { display: none; }
379
1000
 
380
- /* ---------- Tables ---------- */
1001
+ /* ============================================================
1002
+ METRIC GRID (Overview pane)
1003
+ ============================================================ */
1004
+ .metric-grid {
1005
+ display: grid;
1006
+ grid-template-columns: repeat(3, 1fr);
1007
+ gap: 1px;
1008
+ background: var(--border);
1009
+ border: 1px solid var(--border);
1010
+ border-radius: var(--radius-md);
1011
+ overflow: hidden;
1012
+ }
1013
+ .metric {
1014
+ background: var(--bg-1);
1015
+ padding: 16px 18px;
1016
+ display: flex;
1017
+ flex-direction: column;
1018
+ gap: 6px;
1019
+ }
1020
+ .metric.metric-soft .metric-val { color: var(--text-soft); font-size: 18px; }
1021
+ .metric-label {
1022
+ font-size: 11px;
1023
+ text-transform: uppercase;
1024
+ letter-spacing: 0.08em;
1025
+ color: var(--muted);
1026
+ font-weight: 600;
1027
+ }
1028
+ .metric-val {
1029
+ font-family: var(--mono);
1030
+ font-size: 22px;
1031
+ font-weight: 600;
1032
+ color: var(--text);
1033
+ font-feature-settings: "tnum";
1034
+ letter-spacing: -0.02em;
1035
+ display: flex;
1036
+ align-items: baseline;
1037
+ gap: 6px;
1038
+ }
1039
+ .metric-unit {
1040
+ font-size: 12px;
1041
+ color: var(--muted);
1042
+ font-weight: 500;
1043
+ }
1044
+ @media (max-width: 760px) {
1045
+ .metric-grid { grid-template-columns: repeat(2, 1fr); }
1046
+ .metric-grid .metric:last-child:nth-child(odd) { grid-column: 1 / -1; }
1047
+ }
1048
+
1049
+ /* ============================================================
1050
+ TABLES
1051
+ ============================================================ */
381
1052
  .data-table {
382
1053
  width: 100%;
383
1054
  border-collapse: collapse;
@@ -385,45 +1056,65 @@ main {
385
1056
  font-size: 13px;
386
1057
  }
387
1058
  .data-table th, .data-table td {
388
- padding: 10px 8px;
1059
+ padding: 12px 10px;
389
1060
  text-align: left;
390
- border-bottom: 1px solid var(--line);
1061
+ border-bottom: 1px solid var(--border);
391
1062
  font-family: var(--mono);
1063
+ font-feature-settings: "tnum";
392
1064
  }
1065
+ .data-table tbody tr:last-child td { border-bottom: 0; }
393
1066
  .data-table th {
394
1067
  font-family: var(--font-sans);
395
1068
  font-weight: 600;
396
1069
  color: var(--muted);
397
1070
  font-size: 11px;
398
1071
  text-transform: uppercase;
399
- letter-spacing: 0.04em;
400
- border-bottom-color: var(--line-strong);
1072
+ letter-spacing: 0.08em;
1073
+ border-bottom-color: var(--border-strong);
1074
+ padding: 10px;
401
1075
  }
402
1076
  .data-table .num { text-align: right; }
403
- .data-table tbody tr:hover { background: var(--accent-subtle); }
1077
+ .data-table tbody tr {
1078
+ transition: background 100ms ease;
1079
+ }
1080
+ .data-table tbody tr:hover { background: var(--bg-2); }
404
1081
  .data-table .empty {
405
1082
  text-align: center;
406
1083
  color: var(--muted);
407
- padding: 24px;
1084
+ padding: 32px;
1085
+ font-family: var(--font-sans);
1086
+ }
1087
+ .data-table code {
1088
+ font-size: 12px;
1089
+ color: var(--text-soft);
1090
+ background: var(--bg-2);
1091
+ padding: 2px 6px;
1092
+ border-radius: 4px;
1093
+ border: 1px solid var(--border);
408
1094
  }
409
1095
 
410
1096
  .outcome-pill {
411
1097
  display: inline-block;
412
- padding: 2px 8px;
1098
+ padding: 3px 9px;
413
1099
  border-radius: var(--radius-pill);
414
- font-size: 11px;
1100
+ font-size: 10px;
415
1101
  font-weight: 600;
1102
+ font-family: var(--font-sans);
1103
+ text-transform: uppercase;
1104
+ letter-spacing: 0.06em;
416
1105
  }
417
- .outcome-success { background: rgba(107, 228, 142, 0.15); color: var(--ok); }
418
- .outcome-failed { background: rgba(255, 73, 74, 0.15); color: var(--err); }
419
- .outcome-other { background: rgba(255, 214, 65, 0.15); color: var(--warn); }
1106
+ .outcome-success { background: var(--ok-soft); color: var(--ok); }
1107
+ .outcome-failed { background: var(--err-soft); color: var(--err); }
1108
+ .outcome-other { background: var(--warn-soft); color: var(--warn); }
420
1109
 
421
- /* ---------- Charts ---------- */
1110
+ /* ============================================================
1111
+ CHARTS
1112
+ ============================================================ */
422
1113
  .chart-frame {
423
1114
  background: var(--bg-2);
424
- border: 1px solid var(--line);
425
- border-radius: var(--radius-sm);
426
- padding: 12px;
1115
+ border: 1px solid var(--border);
1116
+ border-radius: var(--radius-md);
1117
+ padding: 16px;
427
1118
  overflow: hidden;
428
1119
  }
429
1120
  .chart-frame canvas {
@@ -432,40 +1123,52 @@ main {
432
1123
  display: block;
433
1124
  }
434
1125
 
435
- /* ---------- Pager ---------- */
1126
+ /* ============================================================
1127
+ PAGER
1128
+ ============================================================ */
436
1129
  .pager {
437
1130
  display: flex;
438
1131
  justify-content: space-between;
439
1132
  align-items: center;
440
- margin-top: 12px;
1133
+ margin-top: 16px;
441
1134
  gap: 12px;
442
1135
  }
443
1136
 
444
- /* ---------- Key form ---------- */
1137
+ /* ============================================================
1138
+ KEY FORM
1139
+ ============================================================ */
445
1140
  .key-create {
446
1141
  display: flex;
447
1142
  gap: 8px;
448
- margin-top: 8px;
1143
+ margin-top: 4px;
449
1144
  }
450
1145
  .key-create input {
451
1146
  flex: 1;
452
1147
  background: var(--bg-2);
453
- border: 1px solid var(--line);
1148
+ border: 1px solid var(--border-strong);
454
1149
  color: var(--text);
455
1150
  border-radius: var(--radius-sm);
456
- padding: 9px 12px;
1151
+ padding: 10px 14px;
457
1152
  font-family: inherit;
458
1153
  font-size: 13px;
459
1154
  outline: none;
460
1155
  transition: border-color 120ms ease;
461
1156
  }
462
- .key-create input:focus { border-color: var(--accent); }
1157
+ .key-create input::placeholder { color: var(--muted-faint); }
1158
+ .key-create input:focus {
1159
+ border-color: var(--accent);
1160
+ box-shadow: 0 0 0 3px var(--accent-subtle);
1161
+ }
463
1162
 
464
- /* ---------- Modal ---------- */
1163
+ /* ============================================================
1164
+ MODAL
1165
+ ============================================================ */
465
1166
  .modal {
466
1167
  position: fixed;
467
1168
  inset: 0;
468
1169
  background: rgba(10, 10, 15, 0.78);
1170
+ backdrop-filter: blur(8px);
1171
+ -webkit-backdrop-filter: blur(8px);
469
1172
  display: flex;
470
1173
  justify-content: center;
471
1174
  align-items: center;
@@ -475,34 +1178,65 @@ main {
475
1178
  .modal[hidden] { display: none; }
476
1179
  .modal-body {
477
1180
  background: var(--bg-1);
478
- border: 1px solid var(--line);
479
- border-radius: var(--radius);
480
- padding: 28px;
1181
+ border: 1px solid var(--border-strong);
1182
+ border-radius: var(--radius-card);
1183
+ padding: 32px;
481
1184
  max-width: 560px;
482
1185
  width: 100%;
483
- backdrop-filter: blur(16px);
484
- -webkit-backdrop-filter: blur(16px);
1186
+ box-shadow: 0 24px 60px -16px rgba(0, 0, 0, 0.8);
1187
+ }
1188
+ .modal-eyebrow {
1189
+ font-size: 11px;
1190
+ text-transform: uppercase;
1191
+ letter-spacing: 0.1em;
1192
+ color: var(--accent);
1193
+ font-weight: 600;
1194
+ margin-bottom: 6px;
485
1195
  }
486
- .modal-body h2 { margin: 0 0 6px 0; font-size: 18px; }
1196
+ .modal-body h2 { margin: 0 0 8px 0; font-size: 18px; font-weight: 700; letter-spacing: -0.01em; }
487
1197
  .key-value {
488
1198
  background: var(--bg-2);
489
- border: 1px solid var(--line);
490
- border-radius: var(--radius-sm);
491
- padding: 12px;
1199
+ border: 1px solid var(--border-strong);
1200
+ border-radius: var(--radius-md);
1201
+ padding: 14px;
492
1202
  word-break: break-all;
493
1203
  font-family: var(--mono);
494
1204
  font-size: 13px;
495
- margin: 14px 0;
1205
+ margin: 16px 0;
1206
+ color: var(--accent);
496
1207
  }
497
1208
  .modal-actions { display: flex; gap: 10px; }
498
1209
 
1210
+ /* ============================================================
1211
+ FOOTER
1212
+ ============================================================ */
499
1213
  footer {
500
1214
  text-align: center;
501
- padding: 20px;
502
- border-top: 1px solid var(--line);
503
- margin-top: 40px;
1215
+ padding: 24px;
1216
+ border-top: 1px solid var(--border);
1217
+ margin-top: 48px;
504
1218
  }
505
- footer a { color: var(--muted); }
506
- /* Footer is parent-supplied chrome territory when embedded — hide it
507
- * inside the iframe so we don't double up on attribution / source links. */
1219
+ footer a { color: var(--muted); text-decoration: underline; text-underline-offset: 2px; }
1220
+ footer a:hover { color: var(--text); }
508
1221
  html[data-embed="1"] footer { display: none; }
1222
+
1223
+ /* ============================================================
1224
+ RESPONSIVE — narrow phone (<=520px)
1225
+ ============================================================ */
1226
+ @media (max-width: 520px) {
1227
+ main { padding: 20px 14px 60px 14px; }
1228
+ .topbar { padding: 12px 14px; }
1229
+ .card { padding: 18px; }
1230
+ .hero { padding: 20px; }
1231
+ .hero-num { font-size: 36px; }
1232
+ .grid-cards { gap: 14px; }
1233
+ .card-header { flex-direction: column; align-items: flex-start; }
1234
+ .key-create { flex-direction: column; }
1235
+ .key-create .btn { width: 100%; }
1236
+ .topbar-right { gap: 6px; }
1237
+ .pill { padding: 5px 10px; font-size: 11px; height: 28px; }
1238
+ .brand-text .brand-sub { display: none; }
1239
+ .data-table { font-size: 12px; }
1240
+ .data-table th, .data-table td { padding: 8px 6px; }
1241
+ .modal-body { padding: 22px; }
1242
+ }