levix-bot 2.1.1 → 2.2.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.
@@ -1,73 +1,112 @@
1
- /* Levix dashboard — one stylesheet, no build step, no CDN.
2
- Dark by default (the logo lives on navy); the toggle in the header stores a
3
- choice in localStorage and stamps data-theme on <html>. */
1
+ /* Levix control room
2
+ One dependency-free stylesheet for the dashboard, sign-in, setup and QR pages.
3
+ The interface stays useful offline and keeps the dark/light preference local. */
4
4
 
5
5
  :root {
6
- --blue: #0066f5;
7
- --blue-bright: #3d8bff;
8
- --cyan: #00d4ff;
9
- --grad: linear-gradient(135deg, var(--blue) 0%, var(--blue-bright) 55%, var(--cyan) 100%);
10
-
11
- --bg: #04070e;
12
- --bg-soft: #070c17;
13
- --panel: #0a101e;
14
- --panel-hover: #111a2e;
15
- --line: #1c2a48;
16
- --line-soft: #16213a;
17
-
18
- --text: #eaf1ff;
19
- --muted: #8ea3c9;
20
- --faint: #5f739a;
21
-
22
- --ok: #22c55e;
23
- --warn: #f59e0b;
24
- --danger: #ef4444;
6
+ color-scheme: dark;
7
+
8
+ --blue: #176bfa;
9
+ --blue-deep: #0b50d0;
10
+ --blue-bright: #5a94ff;
11
+ --cyan: #21cef3;
12
+ --cyan-soft: #8be8fb;
13
+ --grad: linear-gradient(
14
+ 120deg,
15
+ var(--blue) 0%,
16
+ #087ff2 58%,
17
+ var(--cyan) 115%
18
+ );
19
+
20
+ --bg: #07101f;
21
+ --bg-soft: #0a1629;
22
+ --panel: #0d1a30;
23
+ --panel-raised: #11213b;
24
+ --panel-hover: #142845;
25
+ --line: #223657;
26
+ --line-soft: #192b48;
27
+
28
+ --text: #f2f6ff;
29
+ --muted: #a4b5cf;
30
+ --faint: #7086a8;
31
+
32
+ --ok: #3bd68b;
33
+ --warn: #f2b84b;
34
+ --danger: #ff6b78;
25
35
  --info: var(--blue-bright);
26
36
 
27
- --radius: 14px;
28
- --radius-sm: 9px;
29
- --shadow: 0 14px 36px rgba(0, 0, 0, 0.24);
30
- --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
37
+ --radius: 18px;
38
+ --radius-sm: 11px;
39
+ --radius-xs: 8px;
40
+ --shadow: 0 22px 70px rgba(0, 5, 18, 0.3);
41
+ --shadow-soft: 0 12px 34px rgba(0, 5, 18, 0.16);
42
+ --mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
43
+ --body:
44
+ Aptos, "Segoe UI Variable Text", "Segoe UI", "Noto Sans Arabic", Tahoma,
45
+ sans-serif;
46
+ --display:
47
+ ui-rounded, "SF Pro Rounded", "Segoe UI Variable Display", "Avenir Next",
48
+ var(--body);
31
49
  }
32
50
 
33
51
  :root[data-theme="light"] {
34
52
  color-scheme: light;
35
- --bg: #f5f7fc;
36
- --bg-soft: #ffffff;
53
+
54
+ --bg: #f3f7fd;
55
+ --bg-soft: #eef4fc;
37
56
  --panel: #ffffff;
38
- --panel-hover: #eef3ff;
39
- --line: #dbe3f2;
40
- --line-soft: #e8eefb;
57
+ --panel-raised: #ffffff;
58
+ --panel-hover: #edf4ff;
59
+ --line: #cfdced;
60
+ --line-soft: #e3ebf6;
41
61
 
42
- --text: #0d1730;
43
- --muted: #566484;
44
- --faint: #8492ad;
45
- --shadow: 0 10px 28px rgba(16, 34, 74, 0.07);
62
+ --text: #10203a;
63
+ --muted: #576b89;
64
+ --faint: #5e7391;
65
+ --blue-bright: #155fdc;
66
+ --shadow: 0 22px 65px rgba(38, 71, 117, 0.13);
67
+ --shadow-soft: 0 10px 30px rgba(38, 71, 117, 0.09);
46
68
  }
47
69
 
48
70
  * {
71
+ box-sizing: border-box;
49
72
  margin: 0;
50
73
  padding: 0;
51
- box-sizing: border-box;
52
74
  }
53
75
 
54
76
  html,
55
77
  body {
56
- height: 100%;
78
+ min-height: 100%;
57
79
  }
58
80
 
59
81
  html {
60
- color-scheme: dark;
82
+ background: var(--bg);
83
+ scroll-behavior: smooth;
61
84
  }
62
85
 
63
86
  body {
64
87
  background: var(--bg);
65
88
  color: var(--text);
66
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans Arabic",
67
- Tahoma, sans-serif;
89
+ font-family: var(--body);
68
90
  font-size: 15px;
69
91
  line-height: 1.55;
70
92
  -webkit-font-smoothing: antialiased;
93
+ text-rendering: optimizeLegibility;
94
+ }
95
+
96
+ button,
97
+ input,
98
+ select,
99
+ textarea {
100
+ font: inherit;
101
+ }
102
+
103
+ button,
104
+ a,
105
+ input,
106
+ select,
107
+ textarea,
108
+ summary {
109
+ -webkit-tap-highlight-color: transparent;
71
110
  }
72
111
 
73
112
  ::selection {
@@ -85,168 +124,410 @@ a {
85
124
  text-decoration: none;
86
125
  }
87
126
 
127
+ svg {
128
+ display: block;
129
+ }
130
+
88
131
  code,
89
132
  kbd {
90
- font-family: var(--mono);
91
- font-size: 0.86em;
92
- background: var(--line-soft);
133
+ padding: 2px 7px;
93
134
  border: 1px solid var(--line);
94
- border-radius: 6px;
95
- padding: 1px 6px;
135
+ border-radius: 7px;
136
+ background: color-mix(in srgb, var(--blue) 8%, var(--bg-soft));
137
+ color: color-mix(in srgb, var(--text) 92%, var(--cyan));
138
+ font-family: var(--mono);
139
+ font-size: 0.84em;
140
+ }
141
+
142
+ .sr-only {
143
+ position: absolute !important;
144
+ width: 1px !important;
145
+ height: 1px !important;
146
+ padding: 0 !important;
147
+ margin: -1px !important;
148
+ overflow: hidden !important;
149
+ clip: rect(0, 0, 0, 0) !important;
150
+ white-space: nowrap !important;
151
+ border: 0 !important;
152
+ }
153
+
154
+ /* --- dashboard shell --------------------------------------------------- */
155
+
156
+ .dashboard-page {
157
+ min-width: 320px;
158
+ background:
159
+ radial-gradient(
160
+ circle at 78% 0%,
161
+ color-mix(in srgb, var(--blue) 9%, transparent),
162
+ transparent 32rem
163
+ ),
164
+ var(--bg);
96
165
  }
97
166
 
98
- /* --- shell ------------------------------------------------------------- */
167
+ .dashboard-page::before {
168
+ position: fixed;
169
+ inset: 0;
170
+ z-index: 0;
171
+ pointer-events: none;
172
+ content: "";
173
+ opacity: 0.26;
174
+ background-image: radial-gradient(
175
+ circle,
176
+ color-mix(in srgb, var(--faint) 24%, transparent) 0.75px,
177
+ transparent 0.85px
178
+ );
179
+ background-size: 22px 22px;
180
+ mask-image: linear-gradient(to bottom, black, transparent 72%);
181
+ }
99
182
 
100
183
  .shell {
184
+ position: relative;
185
+ z-index: 1;
101
186
  display: grid;
102
- grid-template-columns: 248px 1fr;
187
+ grid-template-columns: 268px minmax(0, 1fr);
103
188
  min-height: 100vh;
104
189
  }
105
190
 
106
191
  .sidebar {
107
- background: var(--bg-soft);
108
- border-right: 1px solid var(--line);
109
- display: flex;
110
- flex-direction: column;
111
192
  position: sticky;
112
193
  top: 0;
194
+ display: flex;
195
+ flex-direction: column;
113
196
  height: 100vh;
114
197
  overflow-y: auto;
198
+ border-right: 1px solid #203555;
199
+ background:
200
+ radial-gradient(
201
+ circle at 15% 6%,
202
+ rgba(25, 118, 255, 0.2),
203
+ transparent 17rem
204
+ ),
205
+ linear-gradient(180deg, #08152b 0%, #071226 100%);
206
+ color: #f4f7ff;
207
+ scrollbar-width: thin;
208
+ scrollbar-color: #294362 transparent;
115
209
  }
116
210
 
117
211
  .brand {
212
+ position: relative;
118
213
  display: flex;
119
214
  align-items: center;
120
- gap: 11px;
121
- margin: 0 10px;
122
- padding: 20px 8px 17px;
123
- border-bottom: 1px solid var(--line-soft);
215
+ gap: 12px;
216
+ min-height: 86px;
217
+ margin: 0 14px;
218
+ padding: 18px 10px;
219
+ border-bottom: 1px solid rgba(151, 180, 220, 0.16);
220
+ color: #f4f7ff;
124
221
  }
125
222
 
126
223
  .brand img {
127
- width: 40px;
128
- height: 40px;
224
+ width: 43px;
225
+ height: 43px;
226
+ flex: none;
227
+ filter: drop-shadow(0 8px 16px rgba(0, 102, 245, 0.24));
228
+ }
229
+
230
+ .brand-copy {
231
+ min-width: 0;
129
232
  }
130
233
 
131
234
  .brand-name {
235
+ font-family: var(--display);
132
236
  font-size: 1.15rem;
133
- font-weight: 700;
134
- letter-spacing: -0.01em;
237
+ font-weight: 760;
238
+ letter-spacing: -0.035em;
239
+ line-height: 1.1;
135
240
  }
136
241
 
137
242
  .brand-tag {
138
- font-size: 0.72rem;
139
- color: var(--faint);
243
+ margin-top: 4px;
244
+ color: #7891b4;
245
+ font-size: 0.64rem;
246
+ font-weight: 700;
247
+ letter-spacing: 0.12em;
248
+ line-height: 1;
140
249
  text-transform: uppercase;
141
- letter-spacing: 0.09em;
142
250
  }
143
251
 
144
- .brand-lockup {
145
- display: inline-flex;
146
- align-items: center;
147
- justify-content: center;
148
- gap: 11px;
149
- color: var(--text);
252
+ .brand-pulse {
253
+ display: flex;
254
+ align-items: flex-end;
255
+ gap: 2px;
256
+ height: 15px;
257
+ margin-left: auto;
150
258
  }
151
259
 
152
- .brand-lockup img {
153
- width: 46px;
154
- height: 46px;
260
+ .brand-pulse i {
261
+ display: block;
262
+ width: 2px;
263
+ height: 5px;
264
+ border-radius: 999px;
265
+ background: var(--cyan);
266
+ box-shadow: 0 0 10px rgba(33, 206, 243, 0.65);
267
+ animation: pulse-bars 1.5s ease-in-out infinite;
155
268
  }
156
269
 
157
- .brand-lockup strong {
158
- font-size: 1.65rem;
159
- font-weight: 750;
160
- letter-spacing: -0.04em;
270
+ .brand-pulse i:nth-child(2) {
271
+ height: 12px;
272
+ animation-delay: 0.18s;
273
+ }
274
+
275
+ .brand-pulse i:nth-child(3) {
276
+ height: 8px;
277
+ animation-delay: 0.36s;
278
+ }
279
+
280
+ @keyframes pulse-bars {
281
+ 0%,
282
+ 100% {
283
+ opacity: 0.4;
284
+ transform: scaleY(0.65);
285
+ }
286
+ 50% {
287
+ opacity: 1;
288
+ transform: scaleY(1);
289
+ }
161
290
  }
162
291
 
163
292
  .nav {
164
- padding: 6px 10px;
165
293
  display: flex;
294
+ flex: 1;
166
295
  flex-direction: column;
167
- gap: 2px;
296
+ gap: 3px;
297
+ padding: 12px 13px;
168
298
  }
169
299
 
170
300
  .nav-label {
171
- font-size: 0.68rem;
301
+ padding: 18px 11px 7px;
302
+ color: #607a9f;
303
+ font-size: 0.64rem;
304
+ font-weight: 720;
305
+ letter-spacing: 0.14em;
172
306
  text-transform: uppercase;
173
- letter-spacing: 0.1em;
174
- color: var(--faint);
175
- padding: 14px 10px 6px;
176
307
  }
177
308
 
178
309
  .nav a {
310
+ position: relative;
179
311
  display: flex;
180
312
  align-items: center;
181
- gap: 10px;
182
- padding: 9px 11px;
183
- border-radius: var(--radius-sm);
184
- color: var(--muted);
185
- font-size: 0.92rem;
186
- font-weight: 500;
187
- transition: background 0.15s, color 0.15s;
313
+ gap: 11px;
314
+ min-height: 43px;
315
+ padding: 10px 12px;
316
+ overflow: hidden;
317
+ border: 1px solid transparent;
318
+ border-radius: 12px 12px 12px 5px;
319
+ color: #91a6c5;
320
+ font-size: 0.9rem;
321
+ font-weight: 570;
322
+ transition:
323
+ color 160ms ease,
324
+ background 160ms ease,
325
+ border-color 160ms ease,
326
+ transform 160ms ease;
327
+ }
328
+
329
+ .nav a::after {
330
+ position: absolute;
331
+ right: 11px;
332
+ width: 5px;
333
+ height: 5px;
334
+ border-radius: 50%;
335
+ background: var(--cyan);
336
+ box-shadow:
337
+ 0 0 0 4px rgba(33, 206, 243, 0.1),
338
+ 0 0 14px rgba(33, 206, 243, 0.6);
339
+ content: "";
340
+ opacity: 0;
341
+ transform: scale(0.3);
342
+ transition:
343
+ opacity 160ms ease,
344
+ transform 160ms ease;
188
345
  }
189
346
 
190
347
  .nav a:hover {
191
- background: var(--panel-hover);
192
- color: var(--text);
348
+ border-color: rgba(112, 154, 211, 0.15);
349
+ background: rgba(111, 155, 216, 0.08);
350
+ color: #e9f1ff;
351
+ transform: translateX(2px);
193
352
  }
194
353
 
195
354
  .nav a.active {
196
- background: var(--panel-hover);
197
- color: var(--text);
198
- box-shadow: inset 2px 0 0 var(--blue-bright);
355
+ border-color: rgba(83, 142, 232, 0.24);
356
+ background: linear-gradient(
357
+ 105deg,
358
+ rgba(23, 107, 250, 0.2),
359
+ rgba(33, 206, 243, 0.06)
360
+ );
361
+ color: #ffffff;
362
+ box-shadow: inset 3px 0 0 var(--cyan);
363
+ }
364
+
365
+ .nav a.active::after {
366
+ opacity: 1;
367
+ transform: scale(1);
199
368
  }
200
369
 
201
370
  .nav svg {
202
- width: 17px;
203
- height: 17px;
371
+ width: 18px;
372
+ height: 18px;
204
373
  flex: none;
205
- opacity: 0.85;
374
+ opacity: 0.84;
375
+ }
376
+
377
+ .nav a.active svg {
378
+ color: var(--cyan-soft);
379
+ opacity: 1;
206
380
  }
207
381
 
208
382
  .sidebar-foot {
209
383
  margin-top: auto;
210
- padding: 16px 18px;
211
- border-top: 1px solid var(--line);
212
- font-size: 0.76rem;
213
- color: var(--faint);
384
+ padding: 15px 17px 18px;
385
+ border-top: 1px solid rgba(151, 180, 220, 0.14);
386
+ }
387
+
388
+ .local-note {
389
+ display: flex;
390
+ align-items: center;
391
+ gap: 10px;
392
+ margin-bottom: 14px;
393
+ padding: 10px 11px;
394
+ border: 1px solid rgba(122, 161, 213, 0.14);
395
+ border-radius: 12px 12px 12px 5px;
396
+ background: rgba(9, 31, 61, 0.74);
397
+ color: #7189ac;
398
+ font-size: 0.69rem;
399
+ line-height: 1.35;
400
+ }
401
+
402
+ .local-note strong {
403
+ display: block;
404
+ color: #bfd0e8;
405
+ font-size: 0.73rem;
406
+ font-weight: 680;
407
+ }
408
+
409
+ .local-note-icon {
410
+ position: relative;
411
+ width: 21px;
412
+ height: 21px;
413
+ flex: none;
414
+ border: 1px solid rgba(59, 214, 139, 0.38);
415
+ border-radius: 50%;
416
+ }
417
+
418
+ .local-note-icon::after {
419
+ position: absolute;
420
+ inset: 6px;
421
+ border-radius: 50%;
422
+ background: var(--ok);
423
+ box-shadow: 0 0 10px rgba(59, 214, 139, 0.65);
424
+ content: "";
425
+ }
426
+
427
+ .sidebar-credit {
428
+ display: grid;
429
+ gap: 3px;
430
+ color: #5f789d;
431
+ font-size: 0.8rem;
432
+ }
433
+
434
+ .sidebar-credit.c1 {
435
+ display: flex;
436
+ align-items: center;
437
+ gap: 5px;
438
+ }
439
+
440
+ .sidebar-credit a {
441
+ width: fit-content;
442
+ color: #006aff;
443
+ transition: color 150ms ease;
444
+ }
445
+
446
+ .sidebar-credit a:hover {
447
+ color: #ffffff;
448
+ }
449
+
450
+ .sidebar-backdrop {
451
+ display: none;
452
+ position: fixed;
453
+ inset: 0;
454
+ z-index: 50;
455
+ border: 0;
456
+ background: rgba(2, 8, 19, 0.72);
457
+ backdrop-filter: blur(4px);
214
458
  }
215
459
 
216
460
  .main {
217
461
  display: flex;
218
- flex-direction: column;
219
462
  min-width: 0;
463
+ flex-direction: column;
220
464
  }
221
465
 
222
466
  .topbar {
223
- display: flex;
224
- align-items: center;
225
- gap: 12px;
226
- padding: 14px 26px;
227
- border-bottom: 1px solid var(--line);
228
- background: color-mix(in srgb, var(--bg) 85%, transparent);
229
- backdrop-filter: blur(8px);
230
467
  position: sticky;
231
468
  top: 0;
232
469
  z-index: 20;
470
+ display: flex;
471
+ align-items: center;
472
+ min-height: 74px;
473
+ gap: 13px;
474
+ padding: 12px clamp(18px, 2.4vw, 34px);
475
+ border-bottom: 1px solid color-mix(in srgb, var(--line) 76%, transparent);
476
+ background: color-mix(in srgb, var(--bg) 82%, transparent);
477
+ box-shadow: 0 7px 24px rgba(0, 6, 18, 0.06);
478
+ backdrop-filter: blur(18px) saturate(130%);
479
+ }
480
+
481
+ .page-heading {
482
+ display: grid;
483
+ gap: 1px;
484
+ }
485
+
486
+ .page-heading > span {
487
+ color: var(--faint);
488
+ font-size: 0.61rem;
489
+ font-weight: 720;
490
+ letter-spacing: 0.13em;
491
+ line-height: 1;
492
+ text-transform: uppercase;
233
493
  }
234
494
 
235
495
  .topbar h1 {
496
+ font-family: var(--display);
236
497
  font-size: 1.08rem;
237
- font-weight: 650;
238
- letter-spacing: -0.01em;
498
+ font-weight: 730;
499
+ letter-spacing: -0.025em;
500
+ line-height: 1.25;
239
501
  }
240
502
 
241
- .topbar .spacer {
503
+ .topbar > .spacer,
504
+ .card-head .spacer {
242
505
  flex: 1;
243
506
  }
244
507
 
508
+ .topbar-actions,
509
+ .icon-cluster {
510
+ display: flex;
511
+ align-items: center;
512
+ }
513
+
514
+ .topbar-actions {
515
+ gap: 11px;
516
+ }
517
+
518
+ .icon-cluster {
519
+ gap: 5px;
520
+ padding: 3px;
521
+ border: 1px solid var(--line-soft);
522
+ border-radius: 13px;
523
+ background: color-mix(in srgb, var(--panel) 64%, transparent);
524
+ }
525
+
245
526
  .content {
246
- padding: 30px;
247
- max-width: 1240px;
248
527
  width: 100%;
528
+ max-width: 1400px;
249
529
  margin: 0 auto;
530
+ padding: clamp(24px, 3.4vw, 48px);
250
531
  }
251
532
 
252
533
  .view {
@@ -255,584 +536,1662 @@ kbd {
255
536
 
256
537
  .view.active {
257
538
  display: block;
258
- animation: fade 0.18s ease;
539
+ animation: view-in 260ms cubic-bezier(0.22, 0.8, 0.32, 1);
259
540
  }
260
541
 
261
- @keyframes fade {
542
+ @keyframes view-in {
262
543
  from {
263
544
  opacity: 0;
264
- transform: translateY(4px);
545
+ transform: translateY(7px);
546
+ }
547
+ to {
548
+ opacity: 1;
549
+ transform: translateY(0);
265
550
  }
266
551
  }
267
552
 
268
- /* --- pieces ------------------------------------------------------------ */
553
+ /* --- overview hero ----------------------------------------------------- */
269
554
 
270
- .pill {
271
- display: inline-flex;
272
- align-items: center;
273
- gap: 7px;
274
- padding: 5px 12px;
275
- border-radius: 999px;
276
- font-size: 0.8rem;
277
- font-weight: 600;
278
- border: 1px solid var(--line);
279
- background: var(--panel);
280
- color: var(--muted);
555
+ .overview-hero {
556
+ position: relative;
557
+ display: grid;
558
+ grid-template-columns: minmax(0, 1.18fr) minmax(300px, 0.82fr);
559
+ min-height: 355px;
560
+ margin-bottom: clamp(34px, 5vw, 56px);
561
+ overflow: hidden;
562
+ border: 1px solid #1e3e6c;
563
+ border-radius: 28px 28px 28px 10px;
564
+ background:
565
+ linear-gradient(
566
+ 105deg,
567
+ rgba(4, 20, 48, 0.98) 0 52%,
568
+ rgba(6, 35, 73, 0.94) 100%
569
+ ),
570
+ #07172f;
571
+ box-shadow: 0 28px 80px rgba(0, 20, 57, 0.26);
572
+ color: #f7faff;
573
+ isolation: isolate;
574
+ }
575
+
576
+ .overview-hero::before {
577
+ position: absolute;
578
+ inset: 0;
579
+ z-index: -1;
580
+ background-image:
581
+ linear-gradient(rgba(113, 161, 226, 0.07) 1px, transparent 1px),
582
+ linear-gradient(90deg, rgba(113, 161, 226, 0.07) 1px, transparent 1px);
583
+ background-size: 42px 42px;
584
+ content: "";
585
+ mask-image: linear-gradient(90deg, transparent 8%, black 70%, transparent);
281
586
  }
282
587
 
283
- .pill .dot {
284
- width: 7px;
285
- height: 7px;
286
- border-radius: 50%;
287
- background: var(--faint);
588
+ .overview-hero::after {
589
+ position: absolute;
590
+ right: 32%;
591
+ bottom: -88px;
592
+ z-index: -1;
593
+ width: 190px;
594
+ height: 190px;
595
+ border: 1px solid rgba(49, 182, 255, 0.18);
596
+ border-radius: 50% 50% 50% 14px;
597
+ content: "";
598
+ transform: rotate(16deg);
288
599
  }
289
600
 
290
- .pill.on {
291
- color: var(--ok);
292
- border-color: color-mix(in srgb, var(--ok) 40%, transparent);
601
+ .hero-copy {
602
+ display: flex;
603
+ justify-content: center;
604
+ flex-direction: column;
605
+ padding: clamp(34px, 5vw, 66px);
293
606
  }
294
- .pill.on .dot {
295
- background: var(--ok);
296
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 22%, transparent);
607
+
608
+ .eyebrow {
609
+ display: inline-block;
610
+ width: fit-content;
611
+ margin-bottom: 8px;
612
+ color: var(--blue-bright);
613
+ font-size: 0.66rem;
614
+ font-weight: 760;
615
+ letter-spacing: 0.14em;
616
+ line-height: 1.2;
617
+ text-transform: uppercase;
297
618
  }
298
- .pill.off {
299
- color: var(--danger);
300
- border-color: color-mix(in srgb, var(--danger) 40%, transparent);
619
+
620
+ .hero-copy .eyebrow {
621
+ color: var(--cyan-soft);
301
622
  }
302
- .pill.off .dot {
303
- background: var(--danger);
623
+
624
+ .hero-copy h2 {
625
+ max-width: 680px;
626
+ font-family: var(--display);
627
+ font-size: clamp(2.25rem, 4.1vw, 4.2rem);
628
+ font-weight: 710;
629
+ letter-spacing: -0.062em;
630
+ line-height: 0.98;
304
631
  }
305
- /* Connecting / waiting for a scan / reconnecting: neither linked nor dead. */
306
- .pill.warn {
307
- color: var(--warn);
308
- border-color: color-mix(in srgb, var(--warn) 40%, transparent);
632
+
633
+ .hero-copy h2 em {
634
+ color: var(--cyan-soft);
635
+ font-style: normal;
636
+ font-weight: 560;
309
637
  }
310
- .pill.warn .dot {
311
- background: var(--warn);
312
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--warn) 22%, transparent);
638
+
639
+ .hero-copy > p {
640
+ max-width: 590px;
641
+ margin-top: 20px;
642
+ color: #a9bdd9;
643
+ font-size: clamp(0.94rem, 1.3vw, 1.04rem);
644
+ line-height: 1.7;
313
645
  }
314
646
 
315
- .btn {
316
- display: inline-flex;
647
+ .hero-actions {
648
+ display: flex;
317
649
  align-items: center;
318
- justify-content: center;
319
- gap: 7px;
320
- padding: 8px 15px;
321
- border: 1px solid var(--line);
322
- border-radius: var(--radius-sm);
323
- background: var(--panel);
324
- color: var(--text);
325
- font: inherit;
326
- font-size: 0.88rem;
327
- font-weight: 550;
328
- cursor: pointer;
329
- transition: background 0.15s, border-color 0.15s, opacity 0.15s;
650
+ flex-wrap: wrap;
651
+ gap: 18px;
652
+ margin-top: 27px;
330
653
  }
331
654
 
332
- .btn:hover {
333
- background: var(--panel-hover);
334
- border-color: var(--blue-bright);
655
+ .hero-actions .btn {
656
+ border-color: rgba(255, 255, 255, 0.13);
335
657
  }
336
658
 
337
- .btn:disabled {
338
- opacity: 0.5;
339
- cursor: not-allowed;
659
+ .hero-actions .btn svg,
660
+ .auth-submit svg {
661
+ width: 18px;
662
+ height: 18px;
663
+ fill: none;
664
+ stroke: currentColor;
665
+ stroke-linecap: round;
666
+ stroke-linejoin: round;
667
+ stroke-width: 1.8;
668
+ transition: transform 160ms ease;
340
669
  }
341
670
 
342
- .btn-primary {
343
- background: var(--grad);
344
- border-color: transparent;
345
- color: #fff;
671
+ .hero-actions .btn:hover svg,
672
+ .auth-submit:hover svg {
673
+ transform: translateX(3px);
346
674
  }
347
675
 
348
- .btn-primary:hover {
349
- filter: brightness(1.08);
350
- border-color: transparent;
676
+ .text-link {
677
+ color: #bad0ed;
678
+ font-size: 0.87rem;
679
+ font-weight: 650;
680
+ transition: color 160ms ease;
351
681
  }
352
682
 
353
- .btn-danger {
354
- color: var(--danger);
355
- border-color: color-mix(in srgb, var(--danger) 45%, transparent);
683
+ .text-link:hover {
684
+ color: #ffffff;
356
685
  }
357
686
 
358
- .btn-danger:hover {
359
- background: color-mix(in srgb, var(--danger) 12%, transparent);
360
- border-color: var(--danger);
687
+ .signal-stage {
688
+ position: relative;
689
+ min-height: 330px;
361
690
  }
362
691
 
363
- .btn-sm {
364
- padding: 5px 11px;
365
- font-size: 0.8rem;
692
+ .signal-core {
693
+ position: absolute;
694
+ top: 50%;
695
+ left: 50%;
696
+ z-index: 2;
697
+ display: grid;
698
+ width: clamp(118px, 11vw, 160px);
699
+ aspect-ratio: 1;
700
+ place-items: center;
701
+ border: 1px solid rgba(148, 207, 255, 0.26);
702
+ border-radius: 50% 50% 50% 22%;
703
+ background: rgba(8, 30, 66, 0.7);
704
+ box-shadow:
705
+ inset 0 0 0 12px rgba(78, 148, 244, 0.05),
706
+ 0 0 70px rgba(0, 139, 255, 0.22);
707
+ transform: translate(-50%, -58%) rotate(-5deg);
708
+ backdrop-filter: blur(10px);
709
+ }
710
+
711
+ .signal-core img {
712
+ width: 60%;
713
+ height: 60%;
714
+ transform: rotate(5deg);
715
+ filter: drop-shadow(0 12px 20px rgba(0, 90, 255, 0.3));
716
+ }
717
+
718
+ .signal-orbit {
719
+ position: absolute;
720
+ top: 50%;
721
+ left: 50%;
722
+ border: 1px solid rgba(101, 185, 255, 0.22);
723
+ border-radius: 50%;
724
+ transform: translate(-50%, -58%);
366
725
  }
367
726
 
368
- .btn-icon {
369
- padding: 8px;
370
- width: 34px;
727
+ .orbit-one {
728
+ width: clamp(210px, 19vw, 290px);
729
+ aspect-ratio: 1;
730
+ border-top-color: var(--cyan);
731
+ border-right-color: rgba(101, 185, 255, 0.08);
732
+ animation: orbit 15s linear infinite;
371
733
  }
372
734
 
373
- .card {
374
- background: var(--panel);
375
- border: 1px solid var(--line);
376
- border-radius: var(--radius);
377
- padding: 18px;
378
- box-shadow: none;
735
+ .orbit-two {
736
+ width: clamp(280px, 27vw, 400px);
737
+ aspect-ratio: 1;
738
+ border-style: dashed;
739
+ border-left-color: rgba(33, 206, 243, 0.54);
740
+ animation: orbit-reverse 24s linear infinite;
379
741
  }
380
742
 
381
- .card + .card {
382
- margin-top: 16px;
743
+ @keyframes orbit {
744
+ from {
745
+ transform: translate(-50%, -58%) rotate(0deg);
746
+ }
747
+ to {
748
+ transform: translate(-50%, -58%) rotate(360deg);
749
+ }
383
750
  }
384
751
 
385
- .card-head {
386
- display: flex;
387
- align-items: center;
388
- gap: 10px;
389
- margin-bottom: 14px;
752
+ @keyframes orbit-reverse {
753
+ from {
754
+ transform: translate(-50%, -58%) rotate(360deg);
755
+ }
756
+ to {
757
+ transform: translate(-50%, -58%) rotate(0deg);
758
+ }
390
759
  }
391
760
 
392
- .card-head h2 {
393
- font-size: 0.98rem;
394
- font-weight: 650;
761
+ .signal-node {
762
+ position: absolute;
763
+ z-index: 3;
764
+ width: 9px;
765
+ height: 9px;
766
+ border: 2px solid #0b2247;
767
+ border-radius: 50%;
768
+ background: var(--cyan);
769
+ box-shadow:
770
+ 0 0 0 6px rgba(33, 206, 243, 0.08),
771
+ 0 0 22px rgba(33, 206, 243, 0.7);
395
772
  }
396
773
 
397
- .card-head .spacer {
398
- flex: 1;
774
+ .node-one {
775
+ top: 21%;
776
+ left: 30%;
777
+ }
778
+ .node-two {
779
+ top: 46%;
780
+ right: 18%;
781
+ }
782
+ .node-three {
783
+ bottom: 23%;
784
+ left: 27%;
399
785
  }
400
786
 
401
- .hint {
402
- color: var(--muted);
403
- font-size: 0.84rem;
787
+ .signal-label {
788
+ position: absolute;
789
+ right: clamp(18px, 3vw, 44px);
790
+ bottom: 26px;
791
+ z-index: 4;
792
+ display: grid;
793
+ gap: 1px;
794
+ padding-left: 12px;
795
+ border-left: 2px solid var(--cyan);
796
+ color: #7596bd;
797
+ font-size: 0.63rem;
798
+ letter-spacing: 0.08em;
799
+ text-align: left;
800
+ text-transform: uppercase;
801
+ }
802
+
803
+ .signal-label strong {
804
+ color: #c8d8eb;
805
+ font-size: 0.68rem;
806
+ font-weight: 650;
807
+ letter-spacing: 0.04em;
404
808
  }
405
809
 
810
+ /* --- shared pieces ----------------------------------------------------- */
811
+
406
812
  .section-head {
407
- margin-bottom: 18px;
408
- padding-inline-start: 13px;
409
- border-inline-start: 2px solid var(--blue-bright);
813
+ max-width: 770px;
814
+ margin-bottom: 23px;
410
815
  }
411
816
 
412
817
  .section-head h2 {
413
- font-size: 1.35rem;
414
- font-weight: 700;
415
- letter-spacing: -0.02em;
818
+ font-family: var(--display);
819
+ font-size: clamp(1.7rem, 2.6vw, 2.35rem);
820
+ font-weight: 720;
821
+ letter-spacing: -0.045em;
822
+ line-height: 1.1;
416
823
  }
417
824
 
418
825
  .section-head p {
826
+ max-width: 680px;
827
+ margin-top: 8px;
419
828
  color: var(--muted);
420
- font-size: 0.9rem;
421
- margin-top: 3px;
829
+ font-size: 0.93rem;
422
830
  }
423
831
 
424
- .stats {
425
- display: grid;
426
- grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
427
- gap: 14px;
428
- margin-bottom: 18px;
429
- }
430
-
431
- .stat {
432
- background: var(--panel);
433
- border: 1px solid var(--line);
434
- border-radius: var(--radius);
435
- padding: 15px 16px;
832
+ .section-head-split {
833
+ display: flex;
834
+ align-items: flex-end;
835
+ justify-content: space-between;
836
+ gap: 24px;
837
+ max-width: none;
436
838
  }
437
839
 
438
- .stat .label {
439
- font-size: 0.72rem;
440
- text-transform: uppercase;
441
- letter-spacing: 0.09em;
840
+ .section-note {
841
+ flex: none;
842
+ padding-bottom: 3px;
442
843
  color: var(--faint);
844
+ font-size: 0.74rem;
443
845
  }
444
846
 
445
- .stat .value {
446
- font-size: 1.7rem;
447
- font-weight: 700;
448
- letter-spacing: -0.02em;
449
- margin-top: 3px;
847
+ .pill {
848
+ display: inline-flex;
849
+ align-items: center;
850
+ min-height: 31px;
851
+ gap: 8px;
852
+ padding: 5px 12px;
853
+ border: 1px solid var(--line);
854
+ border-radius: 999px;
855
+ background: color-mix(in srgb, var(--panel) 76%, transparent);
856
+ color: var(--muted);
857
+ font-size: 0.76rem;
858
+ font-weight: 680;
859
+ white-space: nowrap;
450
860
  }
451
861
 
452
- .grid-2 {
453
- display: grid;
454
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
455
- gap: 16px;
862
+ .pill .dot {
863
+ width: 7px;
864
+ height: 7px;
865
+ flex: none;
866
+ border-radius: 50%;
867
+ background: var(--faint);
456
868
  }
457
869
 
458
- /* --- forms ------------------------------------------------------------- */
459
-
460
- label.field {
461
- display: block;
462
- margin-bottom: 14px;
870
+ .pill.on {
871
+ border-color: color-mix(in srgb, var(--ok) 35%, transparent);
872
+ background: color-mix(in srgb, var(--ok) 8%, var(--panel));
873
+ color: var(--ok);
463
874
  }
464
875
 
465
- label.field > span {
466
- display: block;
467
- font-size: 0.84rem;
468
- font-weight: 550;
469
- margin-bottom: 5px;
876
+ .pill.on .dot {
877
+ background: var(--ok);
878
+ box-shadow:
879
+ 0 0 0 4px color-mix(in srgb, var(--ok) 15%, transparent),
880
+ 0 0 12px color-mix(in srgb, var(--ok) 55%, transparent);
470
881
  }
471
882
 
472
- input[type="text"],
473
- input[type="password"],
474
- input[type="number"],
475
- select,
476
- textarea {
477
- width: 100%;
478
- padding: 9px 11px;
479
- background: var(--bg-soft);
480
- border: 1px solid var(--line);
481
- border-radius: var(--radius-sm);
482
- color: var(--text);
483
- font: inherit;
484
- font-size: 0.9rem;
485
- transition: border-color 0.15s;
883
+ .pill.off {
884
+ border-color: color-mix(in srgb, var(--danger) 35%, transparent);
885
+ background: color-mix(in srgb, var(--danger) 7%, var(--panel));
886
+ color: var(--danger);
486
887
  }
487
888
 
488
- input:focus,
489
- select:focus,
490
- textarea:focus {
491
- outline: none;
492
- border-color: var(--blue-bright);
493
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--blue-bright) 14%, transparent);
889
+ .pill.off .dot {
890
+ background: var(--danger);
494
891
  }
495
892
 
496
- textarea {
497
- min-height: 220px;
498
- font-family: var(--mono);
499
- font-size: 0.85rem;
500
- line-height: 1.6;
501
- resize: vertical;
893
+ .pill.warn {
894
+ border-color: color-mix(in srgb, var(--warn) 35%, transparent);
895
+ background: color-mix(in srgb, var(--warn) 7%, var(--panel));
896
+ color: var(--warn);
502
897
  }
503
898
 
504
- select {
505
- cursor: pointer;
899
+ .pill.warn .dot {
900
+ background: var(--warn);
901
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--warn) 14%, transparent);
506
902
  }
507
903
 
508
- .switch {
904
+ .btn {
509
905
  display: inline-flex;
510
906
  align-items: center;
511
- gap: 9px;
907
+ justify-content: center;
908
+ min-height: 39px;
909
+ gap: 8px;
910
+ padding: 8px 15px;
911
+ border: 1px solid var(--line);
912
+ border-radius: 11px 11px 11px 5px;
913
+ background: var(--panel-raised);
914
+ color: var(--text);
915
+ font-size: 0.86rem;
916
+ font-weight: 650;
917
+ line-height: 1;
512
918
  cursor: pointer;
513
- user-select: none;
919
+ box-shadow: 0 1px 0 color-mix(in srgb, #ffffff 5%, transparent) inset;
920
+ transition:
921
+ transform 150ms ease,
922
+ background 150ms ease,
923
+ border-color 150ms ease,
924
+ box-shadow 150ms ease,
925
+ opacity 150ms ease;
514
926
  }
515
927
 
516
- .switch input {
517
- position: absolute;
518
- opacity: 0;
519
- width: 0;
520
- height: 0;
928
+ .btn:hover {
929
+ border-color: color-mix(in srgb, var(--blue-bright) 62%, var(--line));
930
+ background: var(--panel-hover);
931
+ transform: translateY(-1px);
521
932
  }
522
933
 
523
- .switch .track {
524
- width: 38px;
525
- height: 21px;
526
- border-radius: 999px;
527
- background: var(--line);
528
- position: relative;
529
- transition: background 0.18s;
530
- flex: none;
934
+ .btn:active {
935
+ transform: translateY(0);
531
936
  }
532
937
 
533
- .switch .track::after {
534
- content: "";
535
- position: absolute;
536
- top: 3px;
537
- left: 3px;
538
- width: 15px;
539
- height: 15px;
540
- border-radius: 50%;
541
- background: #fff;
542
- transition: transform 0.18s;
938
+ .btn:disabled {
939
+ opacity: 0.45;
940
+ cursor: not-allowed;
941
+ transform: none;
543
942
  }
544
943
 
545
- .switch input:checked + .track {
546
- background: var(--blue-bright);
944
+ .btn-primary {
945
+ border-color: color-mix(in srgb, var(--cyan) 25%, var(--blue));
946
+ background: var(--grad);
947
+ color: #ffffff;
948
+ box-shadow:
949
+ 0 9px 24px rgba(11, 95, 230, 0.2),
950
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
547
951
  }
548
952
 
549
- .switch input:checked + .track::after {
550
- transform: translateX(17px);
953
+ .btn-primary:hover {
954
+ border-color: color-mix(in srgb, var(--cyan) 50%, var(--blue));
955
+ background: linear-gradient(120deg, #2878ff, #0c8cf3 62%, #23d4f7 120%);
956
+ box-shadow:
957
+ 0 12px 28px rgba(11, 95, 230, 0.29),
958
+ inset 0 1px 0 rgba(255, 255, 255, 0.24);
551
959
  }
552
960
 
553
- .inline {
554
- display: flex;
555
- gap: 9px;
556
- align-items: center;
557
- flex-wrap: wrap;
961
+ .btn-danger {
962
+ border-color: color-mix(in srgb, var(--danger) 35%, var(--line));
963
+ background: color-mix(in srgb, var(--danger) 5%, var(--panel-raised));
964
+ color: var(--danger);
558
965
  }
559
966
 
560
- .source {
561
- font-size: 0.68rem;
562
- text-transform: uppercase;
563
- letter-spacing: 0.07em;
564
- padding: 2px 7px;
565
- border-radius: 999px;
566
- border: 1px solid var(--line);
567
- color: var(--faint);
967
+ .btn-danger:hover {
968
+ border-color: color-mix(in srgb, var(--danger) 70%, var(--line));
969
+ background: color-mix(in srgb, var(--danger) 11%, var(--panel));
568
970
  }
569
971
 
570
- .source.dashboard {
571
- color: var(--blue-bright);
572
- border-color: color-mix(in srgb, var(--blue-bright) 40%, transparent);
972
+ .btn-sm {
973
+ min-height: 32px;
974
+ padding: 6px 11px;
975
+ font-size: 0.77rem;
573
976
  }
574
977
 
575
- /* --- tables ------------------------------------------------------------ */
576
-
577
- .table-wrap {
578
- overflow-x: auto;
579
- border: 1px solid var(--line);
580
- border-radius: var(--radius);
978
+ .btn-icon {
979
+ width: 35px;
980
+ min-height: 35px;
981
+ padding: 8px;
982
+ border-color: transparent;
983
+ border-radius: 9px;
984
+ background: transparent;
581
985
  }
582
986
 
583
- table {
584
- width: 100%;
585
- border-collapse: collapse;
586
- font-size: 0.875rem;
987
+ .btn-icon svg,
988
+ .logout-btn svg,
989
+ .qr-back svg {
990
+ width: 17px;
991
+ height: 17px;
992
+ fill: none;
993
+ stroke: currentColor;
994
+ stroke-linecap: round;
995
+ stroke-linejoin: round;
996
+ stroke-width: 1.8;
587
997
  }
588
998
 
589
- th,
590
- td {
591
- text-align: left;
592
- padding: 10px 13px;
593
- border-bottom: 1px solid var(--line-soft);
594
- white-space: nowrap;
999
+ .theme-toggle .moon-icon {
1000
+ display: none;
595
1001
  }
596
1002
 
597
- th {
598
- background: var(--bg-soft);
599
- color: var(--muted);
600
- font-weight: 600;
601
- font-size: 0.76rem;
602
- text-transform: uppercase;
603
- letter-spacing: 0.07em;
604
- position: sticky;
605
- top: 0;
1003
+ :root[data-theme="light"] .theme-toggle .sun-icon {
1004
+ display: none;
606
1005
  }
607
1006
 
608
- tbody tr:last-child td {
609
- border-bottom: none;
1007
+ :root[data-theme="light"] .theme-toggle .moon-icon {
1008
+ display: block;
610
1009
  }
611
1010
 
612
- tbody tr:hover {
613
- background: var(--panel-hover);
1011
+ #refresh-btn:active svg {
1012
+ transform: rotate(35deg);
614
1013
  }
615
1014
 
616
- td.wrap {
617
- white-space: normal;
618
- min-width: 220px;
1015
+ .menu-btn {
1016
+ display: none;
619
1017
  }
620
1018
 
621
- .tag {
622
- display: inline-block;
623
- padding: 2px 8px;
624
- border-radius: 999px;
625
- font-size: 0.74rem;
626
- font-weight: 600;
627
- border: 1px solid var(--line);
1019
+ .logout-btn {
1020
+ border-color: var(--line-soft);
1021
+ background: transparent;
628
1022
  color: var(--muted);
629
1023
  }
630
1024
 
631
- .tag.ok {
632
- color: var(--ok);
633
- border-color: color-mix(in srgb, var(--ok) 40%, transparent);
634
- }
635
- .tag.warn {
636
- color: var(--warn);
637
- border-color: color-mix(in srgb, var(--warn) 40%, transparent);
638
- }
639
- .tag.danger {
640
- color: var(--danger);
641
- border-color: color-mix(in srgb, var(--danger) 40%, transparent);
642
- }
643
- .tag.info {
644
- color: var(--blue-bright);
645
- border-color: color-mix(in srgb, var(--blue-bright) 40%, transparent);
1025
+ .logout-btn:hover {
1026
+ color: var(--text);
646
1027
  }
647
1028
 
648
- .empty {
649
- padding: 34px;
650
- text-align: center;
651
- color: var(--faint);
652
- font-size: 0.9rem;
1029
+ .card {
1030
+ position: relative;
1031
+ padding: clamp(19px, 2.1vw, 26px);
1032
+ border: 1px solid var(--line);
1033
+ border-radius: var(--radius) var(--radius) var(--radius) 7px;
1034
+ background: color-mix(in srgb, var(--panel) 95%, transparent);
1035
+ box-shadow: var(--shadow-soft);
653
1036
  }
654
1037
 
655
- .loading {
656
- padding: 26px;
657
- text-align: center;
658
- color: var(--faint);
659
- font-size: 0.88rem;
1038
+ .card + .card,
1039
+ #settings-list .card:first-child {
1040
+ margin-top: 18px;
660
1041
  }
661
1042
 
662
- /* --- commands ---------------------------------------------------------- */
663
-
664
- .toolbar {
1043
+ .card-head {
665
1044
  display: flex;
666
- gap: 10px;
667
1045
  align-items: center;
668
- flex-wrap: wrap;
669
- margin-bottom: 14px;
670
- }
671
-
672
- .toolbar input[type="text"] {
673
- max-width: 260px;
1046
+ gap: 12px;
1047
+ margin-bottom: 18px;
674
1048
  }
675
1049
 
676
- .toolbar select {
677
- width: auto;
1050
+ .card-head .eyebrow {
1051
+ margin-bottom: 4px;
678
1052
  }
679
1053
 
680
- .cmd-name {
681
- font-family: var(--mono);
682
- font-weight: 600;
1054
+ .card-head h2 {
1055
+ font-family: var(--display);
1056
+ font-size: 1.02rem;
1057
+ font-weight: 700;
1058
+ letter-spacing: -0.022em;
683
1059
  }
684
1060
 
685
- .alias-input {
686
- min-width: 190px;
687
- font-family: var(--mono);
1061
+ .hint {
1062
+ color: var(--muted);
688
1063
  font-size: 0.82rem;
689
1064
  }
690
1065
 
691
- .locked {
692
- color: var(--faint);
693
- font-size: 0.78rem;
694
- display: inline-flex;
1066
+ .inline {
1067
+ display: flex;
695
1068
  align-items: center;
696
- gap: 5px;
1069
+ flex-wrap: wrap;
1070
+ gap: 10px;
697
1071
  }
698
1072
 
699
- /* --- groups ------------------------------------------------------------ */
1073
+ .form-actions,
1074
+ .action-cluster {
1075
+ margin-top: 15px;
1076
+ }
700
1077
 
701
- .group-card summary {
702
- cursor: pointer;
1078
+ .callout {
703
1079
  display: flex;
1080
+ align-items: flex-start;
1081
+ gap: 10px;
1082
+ margin-top: 17px;
1083
+ padding: 12px 14px;
1084
+ border: 1px solid color-mix(in srgb, var(--blue) 18%, var(--line-soft));
1085
+ border-radius: 12px 12px 12px 5px;
1086
+ background: color-mix(in srgb, var(--blue) 5%, var(--bg-soft));
1087
+ color: var(--muted);
1088
+ font-size: 0.8rem;
1089
+ }
1090
+
1091
+ .callout-icon {
1092
+ display: grid;
1093
+ width: 20px;
1094
+ height: 20px;
1095
+ flex: none;
1096
+ place-items: center;
1097
+ border: 1px solid color-mix(in srgb, var(--blue-bright) 48%, transparent);
1098
+ border-radius: 50%;
1099
+ color: var(--blue-bright);
1100
+ font-family: var(--mono);
1101
+ font-size: 0.67rem;
1102
+ font-weight: 700;
1103
+ }
1104
+
1105
+ .session-card::before {
1106
+ position: absolute;
1107
+ top: -1px;
1108
+ left: 24px;
1109
+ width: 84px;
1110
+ height: 2px;
1111
+ border-radius: 0 0 4px 4px;
1112
+ background: linear-gradient(90deg, var(--blue), var(--cyan));
1113
+ content: "";
1114
+ }
1115
+
1116
+ .session-detail {
1117
+ color: var(--text);
1118
+ font-size: 0.93rem;
1119
+ }
1120
+
1121
+ .compact-card {
1122
+ max-width: 900px;
1123
+ }
1124
+
1125
+ .prefix-control input {
1126
+ max-width: 84px;
1127
+ text-align: center;
1128
+ font-family: var(--mono);
1129
+ font-weight: 720;
1130
+ }
1131
+
1132
+ /* --- stats and runtime ------------------------------------------------- */
1133
+
1134
+ .stats {
1135
+ display: grid;
1136
+ grid-template-columns: repeat(6, minmax(0, 1fr));
1137
+ gap: 12px;
1138
+ margin-bottom: 18px;
1139
+ }
1140
+
1141
+ .stat {
1142
+ position: relative;
1143
+ min-height: 155px;
1144
+ padding: 16px;
1145
+ overflow: hidden;
1146
+ border: 1px solid var(--line);
1147
+ border-radius: 16px 16px 16px 6px;
1148
+ background: var(--panel);
1149
+ box-shadow: 0 8px 28px rgba(0, 7, 20, 0.09);
1150
+ transition:
1151
+ transform 170ms ease,
1152
+ border-color 170ms ease,
1153
+ box-shadow 170ms ease;
1154
+ }
1155
+
1156
+ .stat::after {
1157
+ position: absolute;
1158
+ right: -26px;
1159
+ bottom: -34px;
1160
+ width: 82px;
1161
+ height: 82px;
1162
+ border: 1px solid color-mix(in srgb, var(--blue) 16%, transparent);
1163
+ border-radius: 50% 50% 50% 16px;
1164
+ content: "";
1165
+ transform: rotate(25deg);
1166
+ }
1167
+
1168
+ .stat:hover {
1169
+ border-color: color-mix(in srgb, var(--blue-bright) 42%, var(--line));
1170
+ box-shadow: 0 14px 34px rgba(0, 40, 100, 0.12);
1171
+ transform: translateY(-2px);
1172
+ }
1173
+
1174
+ .stat-top {
1175
+ display: flex;
1176
+ align-items: center;
1177
+ gap: 8px;
1178
+ }
1179
+
1180
+ .stat-icon {
1181
+ display: grid;
1182
+ width: 28px;
1183
+ height: 28px;
1184
+ place-items: center;
1185
+ border: 1px solid color-mix(in srgb, var(--blue-bright) 30%, var(--line));
1186
+ border-radius: 9px 9px 9px 4px;
1187
+ background: color-mix(in srgb, var(--blue) 8%, var(--bg-soft));
1188
+ color: var(--blue-bright);
1189
+ }
1190
+
1191
+ .stat-icon svg {
1192
+ width: 15px;
1193
+ height: 15px;
1194
+ fill: none;
1195
+ stroke: currentColor;
1196
+ stroke-linecap: round;
1197
+ stroke-linejoin: round;
1198
+ stroke-width: 1.7;
1199
+ }
1200
+
1201
+ .stat .label {
1202
+ color: var(--muted);
1203
+ font-size: 0.72rem;
1204
+ font-weight: 650;
1205
+ }
1206
+
1207
+ .stat .value {
1208
+ margin-top: 14px;
1209
+ font-family: var(--display);
1210
+ font-size: clamp(1.9rem, 2.4vw, 2.45rem);
1211
+ font-variant-numeric: tabular-nums;
1212
+ font-weight: 720;
1213
+ letter-spacing: -0.06em;
1214
+ line-height: 1;
1215
+ }
1216
+
1217
+ .stat-foot {
1218
+ display: flex;
1219
+ align-items: center;
1220
+ gap: 6px;
1221
+ margin-top: 12px;
1222
+ color: var(--faint);
1223
+ font-size: 0.63rem;
1224
+ font-weight: 650;
1225
+ letter-spacing: 0.07em;
1226
+ text-transform: uppercase;
1227
+ }
1228
+
1229
+ .stat-foot i {
1230
+ display: block;
1231
+ width: 18px;
1232
+ height: 1px;
1233
+ background: color-mix(in srgb, var(--cyan) 60%, var(--line));
1234
+ }
1235
+
1236
+ .runtime-card {
1237
+ overflow: hidden;
1238
+ }
1239
+
1240
+ .runtime-card::after {
1241
+ position: absolute;
1242
+ top: 0;
1243
+ right: 0;
1244
+ width: 190px;
1245
+ height: 100%;
1246
+ pointer-events: none;
1247
+ background: radial-gradient(
1248
+ circle at 100% 0,
1249
+ color-mix(in srgb, var(--blue) 10%, transparent),
1250
+ transparent 70%
1251
+ );
1252
+ content: "";
1253
+ }
1254
+
1255
+ .grid-2 {
1256
+ display: grid;
1257
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1258
+ gap: 1px;
1259
+ overflow: hidden;
1260
+ border: 1px solid var(--line-soft);
1261
+ border-radius: 13px 13px 13px 5px;
1262
+ background: var(--line-soft);
1263
+ }
1264
+
1265
+ .runtime-item {
1266
+ min-width: 0;
1267
+ padding: 14px 16px;
1268
+ background: var(--bg-soft);
1269
+ }
1270
+
1271
+ .runtime-label {
1272
+ color: var(--faint);
1273
+ font-size: 0.64rem;
1274
+ font-weight: 720;
1275
+ letter-spacing: 0.1em;
1276
+ text-transform: uppercase;
1277
+ }
1278
+
1279
+ .runtime-value {
1280
+ margin-top: 4px;
1281
+ overflow: hidden;
1282
+ color: var(--text);
1283
+ font-family: var(--mono);
1284
+ font-size: 0.84rem;
1285
+ font-weight: 650;
1286
+ text-overflow: ellipsis;
1287
+ white-space: nowrap;
1288
+ }
1289
+
1290
+ /* --- forms ------------------------------------------------------------- */
1291
+
1292
+ label.field {
1293
+ display: block;
1294
+ margin-bottom: 15px;
1295
+ }
1296
+
1297
+ label.field > span,
1298
+ .setting-label {
1299
+ display: block;
1300
+ margin-bottom: 6px;
1301
+ color: var(--text);
1302
+ font-size: 0.8rem;
1303
+ font-weight: 650;
1304
+ }
1305
+
1306
+ label.field > small {
1307
+ display: block;
1308
+ margin-top: 6px;
1309
+ color: var(--faint);
1310
+ font-size: 0.72rem;
1311
+ }
1312
+
1313
+ input[type="text"],
1314
+ input[type="password"],
1315
+ input[type="number"],
1316
+ select,
1317
+ textarea {
1318
+ width: 100%;
1319
+ min-height: 42px;
1320
+ padding: 9px 12px;
1321
+ border: 1px solid var(--line);
1322
+ border-radius: var(--radius-sm) var(--radius-sm) var(--radius-sm) 5px;
1323
+ background: var(--bg-soft);
1324
+ color: var(--text);
1325
+ font-size: 0.87rem;
1326
+ transition:
1327
+ border-color 150ms ease,
1328
+ box-shadow 150ms ease,
1329
+ background 150ms ease;
1330
+ }
1331
+
1332
+ input::placeholder,
1333
+ textarea::placeholder {
1334
+ color: color-mix(in srgb, var(--faint) 75%, transparent);
1335
+ }
1336
+
1337
+ input:hover,
1338
+ select:hover,
1339
+ textarea:hover {
1340
+ border-color: color-mix(in srgb, var(--blue-bright) 34%, var(--line));
1341
+ }
1342
+
1343
+ input:focus,
1344
+ select:focus,
1345
+ textarea:focus {
1346
+ outline: none;
1347
+ border-color: var(--blue-bright);
1348
+ background: color-mix(in srgb, var(--blue) 3%, var(--bg-soft));
1349
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--blue) 13%, transparent);
1350
+ }
1351
+
1352
+ textarea {
1353
+ min-height: 230px;
1354
+ resize: vertical;
1355
+ font-family: var(--mono);
1356
+ font-size: 0.82rem;
1357
+ line-height: 1.65;
1358
+ }
1359
+
1360
+ select {
1361
+ cursor: pointer;
1362
+ }
1363
+
1364
+ .switch {
1365
+ position: relative;
1366
+ display: inline-flex;
1367
+ align-items: center;
1368
+ gap: 9px;
1369
+ cursor: pointer;
1370
+ user-select: none;
1371
+ }
1372
+
1373
+ .switch input {
1374
+ position: absolute;
1375
+ width: 1px;
1376
+ height: 1px;
1377
+ opacity: 0;
1378
+ }
1379
+
1380
+ .switch .track {
1381
+ position: relative;
1382
+ width: 41px;
1383
+ height: 23px;
1384
+ flex: none;
1385
+ border: 1px solid var(--line);
1386
+ border-radius: 999px;
1387
+ background: var(--bg-soft);
1388
+ transition:
1389
+ background 180ms ease,
1390
+ border-color 180ms ease;
1391
+ }
1392
+
1393
+ .switch .track::after {
1394
+ position: absolute;
1395
+ top: 3px;
1396
+ left: 3px;
1397
+ width: 15px;
1398
+ height: 15px;
1399
+ border-radius: 50%;
1400
+ background: var(--muted);
1401
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
1402
+ content: "";
1403
+ transition:
1404
+ transform 180ms ease,
1405
+ background 180ms ease;
1406
+ }
1407
+
1408
+ .switch input:checked + .track {
1409
+ border-color: var(--blue);
1410
+ background: var(--blue);
1411
+ }
1412
+
1413
+ .switch input:checked + .track::after {
1414
+ background: #ffffff;
1415
+ transform: translateX(18px);
1416
+ }
1417
+
1418
+ .switch input:focus-visible + .track {
1419
+ outline: 2px solid var(--cyan);
1420
+ outline-offset: 3px;
1421
+ }
1422
+
1423
+ .search-field {
1424
+ position: relative;
1425
+ display: block;
1426
+ width: min(280px, 100%);
1427
+ }
1428
+
1429
+ .search-field svg {
1430
+ position: absolute;
1431
+ top: 50%;
1432
+ left: 12px;
1433
+ z-index: 2;
1434
+ width: 16px;
1435
+ height: 16px;
1436
+ fill: none;
1437
+ stroke: var(--faint);
1438
+ stroke-linecap: round;
1439
+ stroke-width: 1.7;
1440
+ transform: translateY(-50%);
1441
+ }
1442
+
1443
+ .search-field input[type="text"] {
1444
+ max-width: none;
1445
+ padding-left: 36px;
1446
+ }
1447
+
1448
+ .password-grid {
1449
+ display: grid;
1450
+ grid-template-columns: minmax(190px, 1fr) minmax(190px, 1fr) auto;
1451
+ align-items: end;
1452
+ gap: 12px;
1453
+ max-width: 850px;
1454
+ }
1455
+
1456
+ .password-grid .field {
1457
+ margin-bottom: 0;
1458
+ }
1459
+
1460
+ .security-card > .hint {
1461
+ max-width: 820px;
1462
+ margin-top: 14px;
1463
+ }
1464
+
1465
+ .memory-editor {
1466
+ margin-top: 18px;
1467
+ padding-top: 18px;
1468
+ border-top: 1px solid var(--line-soft);
1469
+ }
1470
+
1471
+ /* --- tables ------------------------------------------------------------ */
1472
+
1473
+ .toolbar {
1474
+ display: flex;
1475
+ align-items: center;
1476
+ flex-wrap: wrap;
1477
+ gap: 10px;
1478
+ margin-bottom: 16px;
1479
+ }
1480
+
1481
+ .toolbar > .spacer {
1482
+ flex: 1;
1483
+ }
1484
+
1485
+ .toolbar select {
1486
+ width: auto;
1487
+ min-width: 142px;
1488
+ }
1489
+
1490
+ .data-tabs {
1491
+ width: fit-content;
1492
+ max-width: 100%;
1493
+ padding: 4px;
1494
+ border: 1px solid var(--line-soft);
1495
+ border-radius: 13px;
1496
+ background: var(--bg-soft);
1497
+ }
1498
+
1499
+ .data-tabs .btn {
1500
+ border-color: transparent;
1501
+ border-radius: 9px;
1502
+ background: transparent;
1503
+ box-shadow: none;
1504
+ }
1505
+
1506
+ .data-tabs .btn-primary {
1507
+ background: var(--panel-raised);
1508
+ color: var(--text);
1509
+ box-shadow: 0 5px 14px rgba(0, 5, 20, 0.12);
1510
+ }
1511
+
1512
+ .table-wrap {
1513
+ overflow-x: auto;
1514
+ border: 1px solid var(--line);
1515
+ border-radius: 14px 14px 14px 5px;
1516
+ scrollbar-width: thin;
1517
+ scrollbar-color: var(--line) transparent;
1518
+ }
1519
+
1520
+ table {
1521
+ width: 100%;
1522
+ border-collapse: collapse;
1523
+ font-size: 0.84rem;
1524
+ }
1525
+
1526
+ th,
1527
+ td {
1528
+ padding: 12px 14px;
1529
+ border-bottom: 1px solid var(--line-soft);
1530
+ text-align: left;
1531
+ vertical-align: middle;
1532
+ white-space: nowrap;
1533
+ }
1534
+
1535
+ th {
1536
+ position: sticky;
1537
+ top: 0;
1538
+ z-index: 2;
1539
+ background: var(--bg-soft);
1540
+ color: var(--faint);
1541
+ font-size: 0.65rem;
1542
+ font-weight: 740;
1543
+ letter-spacing: 0.09em;
1544
+ text-transform: uppercase;
1545
+ }
1546
+
1547
+ tbody tr {
1548
+ transition: background 140ms ease;
1549
+ }
1550
+
1551
+ tbody tr:last-child td {
1552
+ border-bottom: 0;
1553
+ }
1554
+
1555
+ tbody tr:hover {
1556
+ background: color-mix(in srgb, var(--blue) 4%, var(--panel));
1557
+ }
1558
+
1559
+ td.wrap {
1560
+ min-width: 220px;
1561
+ white-space: normal;
1562
+ }
1563
+
1564
+ .schedule-state {
1565
+ display: grid;
1566
+ min-width: 150px;
1567
+ gap: 6px;
1568
+ white-space: normal;
1569
+ }
1570
+
1571
+ .schedule-detail,
1572
+ .schedule-error {
1573
+ color: var(--faint);
1574
+ font-size: 0.72rem;
1575
+ line-height: 1.45;
1576
+ }
1577
+
1578
+ .schedule-error {
1579
+ max-width: 260px;
1580
+ color: var(--danger);
1581
+ overflow-wrap: anywhere;
1582
+ }
1583
+
1584
+ .table-actions {
1585
+ display: flex;
1586
+ align-items: center;
1587
+ gap: 8px;
1588
+ }
1589
+
1590
+ .tag,
1591
+ .source {
1592
+ display: inline-flex;
1593
+ align-items: center;
1594
+ width: fit-content;
1595
+ min-height: 23px;
1596
+ padding: 3px 8px;
1597
+ border: 1px solid var(--line);
1598
+ border-radius: 999px;
1599
+ color: var(--muted);
1600
+ font-size: 0.66rem;
1601
+ font-weight: 700;
1602
+ letter-spacing: 0.03em;
1603
+ line-height: 1;
1604
+ text-transform: uppercase;
1605
+ }
1606
+
1607
+ .tag.ok {
1608
+ border-color: color-mix(in srgb, var(--ok) 36%, transparent);
1609
+ background: color-mix(in srgb, var(--ok) 6%, transparent);
1610
+ color: var(--ok);
1611
+ }
1612
+
1613
+ .tag.warn {
1614
+ border-color: color-mix(in srgb, var(--warn) 36%, transparent);
1615
+ background: color-mix(in srgb, var(--warn) 6%, transparent);
1616
+ color: var(--warn);
1617
+ }
1618
+
1619
+ .tag.danger {
1620
+ border-color: color-mix(in srgb, var(--danger) 36%, transparent);
1621
+ background: color-mix(in srgb, var(--danger) 6%, transparent);
1622
+ color: var(--danger);
1623
+ }
1624
+
1625
+ .tag.info,
1626
+ .source.dashboard {
1627
+ border-color: color-mix(in srgb, var(--blue-bright) 38%, transparent);
1628
+ background: color-mix(in srgb, var(--blue) 6%, transparent);
1629
+ color: var(--blue-bright);
1630
+ }
1631
+
1632
+ .empty,
1633
+ .loading {
1634
+ padding: 38px 24px;
1635
+ color: var(--faint);
1636
+ font-size: 0.83rem;
1637
+ text-align: center;
1638
+ }
1639
+
1640
+ .loading::before {
1641
+ display: inline-block;
1642
+ width: 7px;
1643
+ height: 7px;
1644
+ margin-right: 9px;
1645
+ border-radius: 50%;
1646
+ background: var(--cyan);
1647
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--cyan) 10%, transparent);
1648
+ content: "";
1649
+ animation: loading-pulse 1s ease-in-out infinite;
1650
+ }
1651
+
1652
+ @keyframes loading-pulse {
1653
+ 50% {
1654
+ opacity: 0.35;
1655
+ transform: scale(0.7);
1656
+ }
1657
+ }
1658
+
1659
+ /* --- commands, groups and settings ------------------------------------ */
1660
+
1661
+ .cmd-name {
1662
+ font-family: var(--mono);
1663
+ font-weight: 700;
1664
+ }
1665
+
1666
+ .alias-input {
1667
+ min-width: 190px;
1668
+ font-family: var(--mono);
1669
+ font-size: 0.78rem;
1670
+ }
1671
+
1672
+ .locked {
1673
+ display: inline-flex;
1674
+ align-items: center;
1675
+ gap: 5px;
1676
+ color: var(--faint);
1677
+ font-size: 0.75rem;
1678
+ }
1679
+
1680
+ .group-card {
1681
+ box-shadow: none;
1682
+ }
1683
+
1684
+ .group-card + .group-card {
1685
+ margin-top: 12px;
1686
+ }
1687
+
1688
+ .group-card summary {
1689
+ display: flex;
1690
+ align-items: center;
1691
+ gap: 10px;
1692
+ min-height: 28px;
1693
+ color: var(--text);
1694
+ font-weight: 650;
1695
+ cursor: pointer;
1696
+ list-style: none;
1697
+ }
1698
+
1699
+ .group-card summary::-webkit-details-marker {
1700
+ display: none;
1701
+ }
1702
+
1703
+ .group-card summary .chev {
1704
+ margin-left: auto;
1705
+ color: var(--faint);
1706
+ font-size: 1.2rem;
1707
+ transition: transform 160ms ease;
1708
+ }
1709
+
1710
+ .group-card[open] {
1711
+ border-color: color-mix(in srgb, var(--blue-bright) 30%, var(--line));
1712
+ box-shadow: var(--shadow-soft);
1713
+ }
1714
+
1715
+ .group-card[open] summary .chev {
1716
+ transform: rotate(90deg);
1717
+ }
1718
+
1719
+ .group-body {
1720
+ display: grid;
1721
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1722
+ gap: 22px;
1723
+ margin-top: 20px;
1724
+ padding-top: 20px;
1725
+ border-top: 1px solid var(--line-soft);
1726
+ }
1727
+
1728
+ .group-body h3 {
1729
+ margin-bottom: 10px;
1730
+ color: var(--faint);
1731
+ font-size: 0.65rem;
1732
+ font-weight: 740;
1733
+ letter-spacing: 0.12em;
1734
+ text-transform: uppercase;
1735
+ }
1736
+
1737
+ .role-control #role-number {
1738
+ max-width: 230px;
1739
+ }
1740
+
1741
+ .role-control #role-kind {
1742
+ max-width: 150px;
1743
+ }
1744
+
1745
+ .setting-item {
1746
+ padding: 17px 0;
1747
+ border-bottom: 1px solid var(--line-soft);
1748
+ }
1749
+
1750
+ .setting-item:first-child {
1751
+ padding-top: 0;
1752
+ }
1753
+
1754
+ .setting-item:last-child {
1755
+ padding-bottom: 0;
1756
+ border-bottom: 0;
1757
+ }
1758
+
1759
+ .setting-label-row {
1760
+ margin-bottom: 7px;
1761
+ }
1762
+
1763
+ .setting-label-row .setting-label {
1764
+ margin-bottom: 0;
1765
+ }
1766
+
1767
+ .setting-item > .inline:not(.setting-label-row) {
1768
+ max-width: 720px;
1769
+ }
1770
+
1771
+ .setting-item > .inline:not(.setting-label-row) > input,
1772
+ .setting-item > .inline:not(.setting-label-row) > select {
1773
+ flex: 1 1 300px;
1774
+ }
1775
+
1776
+ .setting-hint {
1777
+ max-width: 780px;
1778
+ margin-top: 7px;
1779
+ }
1780
+
1781
+ /* --- QR --------------------------------------------------------------- */
1782
+
1783
+ .qr-box {
1784
+ display: flex;
1785
+ align-items: center;
1786
+ flex-direction: column;
1787
+ gap: 16px;
1788
+ padding: 20px;
1789
+ text-align: center;
1790
+ }
1791
+
1792
+ .qr-frame {
1793
+ display: flex;
1794
+ align-items: center;
1795
+ justify-content: center;
1796
+ min-width: 270px;
1797
+ min-height: 270px;
1798
+ padding: 10px;
1799
+ border: 8px solid #ffffff;
1800
+ border-radius: 18px 18px 18px 7px;
1801
+ background: #ffffff;
1802
+ line-height: 0;
1803
+ box-shadow: 0 15px 38px rgba(0, 7, 24, 0.2);
1804
+ }
1805
+
1806
+ .qr-frame canvas,
1807
+ .qr-frame img {
1808
+ display: block;
1809
+ max-width: 100%;
1810
+ }
1811
+
1812
+ .steps {
1813
+ max-width: 420px;
1814
+ margin: 0 auto;
1815
+ color: var(--muted);
1816
+ font-size: 0.83rem;
1817
+ text-align: left;
1818
+ }
1819
+
1820
+ .steps li {
1821
+ margin: 8px 0 8px 21px;
1822
+ padding-left: 4px;
1823
+ }
1824
+
1825
+ .steps li::marker {
1826
+ color: var(--blue-bright);
1827
+ font-family: var(--mono);
1828
+ font-weight: 700;
1829
+ }
1830
+
1831
+ .steps li span {
1832
+ color: var(--text);
1833
+ font-weight: 650;
1834
+ }
1835
+
1836
+ /* --- toasts ------------------------------------------------------------ */
1837
+
1838
+ .toasts {
1839
+ position: fixed;
1840
+ right: 22px;
1841
+ bottom: 22px;
1842
+ z-index: 100;
1843
+ display: flex;
1844
+ align-items: flex-end;
1845
+ flex-direction: column;
1846
+ gap: 10px;
1847
+ }
1848
+
1849
+ .toast {
1850
+ max-width: 360px;
1851
+ padding: 12px 15px;
1852
+ border: 1px solid var(--line);
1853
+ border-left: 3px solid var(--blue-bright);
1854
+ border-radius: 12px 12px 12px 5px;
1855
+ background: var(--panel-raised);
1856
+ color: var(--text);
1857
+ font-size: 0.83rem;
1858
+ box-shadow: var(--shadow);
1859
+ animation: toast-in 220ms cubic-bezier(0.2, 0.8, 0.3, 1);
1860
+ }
1861
+
1862
+ .toast.ok {
1863
+ border-left-color: var(--ok);
1864
+ }
1865
+ .toast.error {
1866
+ border-left-color: var(--danger);
1867
+ }
1868
+
1869
+ @keyframes toast-in {
1870
+ from {
1871
+ opacity: 0;
1872
+ transform: translateX(16px) scale(0.98);
1873
+ }
1874
+ to {
1875
+ opacity: 1;
1876
+ transform: translateX(0) scale(1);
1877
+ }
1878
+ }
1879
+
1880
+ /* --- gateway: login, setup and QR ------------------------------------- */
1881
+
1882
+ .gateway-page {
1883
+ min-width: 320px;
1884
+ min-height: 100vh;
1885
+ background: #07101f;
1886
+ color: #f2f6ff;
1887
+ }
1888
+
1889
+ .gateway-shell {
1890
+ display: grid;
1891
+ grid-template-columns: minmax(350px, 0.82fr) minmax(480px, 1.18fr);
1892
+ min-height: 100vh;
1893
+ }
1894
+
1895
+ .gateway-story {
1896
+ position: relative;
1897
+ display: flex;
1898
+ flex-direction: column;
1899
+ min-height: 100%;
1900
+ padding: clamp(32px, 5vw, 72px);
1901
+ overflow: hidden;
1902
+ border-right: 1px solid #203a60;
1903
+ background:
1904
+ linear-gradient(145deg, rgba(10, 33, 72, 0.96), rgba(5, 20, 44, 0.98)),
1905
+ #07162f;
1906
+ isolation: isolate;
1907
+ }
1908
+
1909
+ .gateway-story::before {
1910
+ position: absolute;
1911
+ inset: 0;
1912
+ z-index: -2;
1913
+ background-image:
1914
+ linear-gradient(rgba(94, 155, 232, 0.075) 1px, transparent 1px),
1915
+ linear-gradient(90deg, rgba(94, 155, 232, 0.075) 1px, transparent 1px);
1916
+ background-size: 48px 48px;
1917
+ content: "";
1918
+ mask-image: linear-gradient(140deg, black, transparent 78%);
1919
+ }
1920
+
1921
+ .gateway-story::after {
1922
+ position: absolute;
1923
+ right: -220px;
1924
+ bottom: -240px;
1925
+ z-index: -1;
1926
+ width: 520px;
1927
+ height: 520px;
1928
+ border: 1px solid rgba(60, 179, 255, 0.18);
1929
+ border-radius: 50% 50% 50% 20%;
1930
+ content: "";
1931
+ transform: rotate(17deg);
1932
+ }
1933
+
1934
+ .brand-lockup {
1935
+ display: inline-flex;
704
1936
  align-items: center;
705
- gap: 10px;
706
- list-style: none;
707
- font-weight: 600;
1937
+ width: fit-content;
1938
+ gap: 12px;
1939
+ color: #f5f8ff;
708
1940
  }
709
1941
 
710
- .group-card summary::-webkit-details-marker {
711
- display: none;
1942
+ .brand-lockup img {
1943
+ width: 49px;
1944
+ height: 49px;
1945
+ filter: drop-shadow(0 10px 20px rgba(0, 102, 245, 0.3));
712
1946
  }
713
1947
 
714
- .group-card summary .chev {
715
- margin-left: auto;
716
- color: var(--faint);
717
- transition: transform 0.15s;
1948
+ .brand-lockup > span {
1949
+ display: grid;
718
1950
  }
719
1951
 
720
- .group-card[open] summary .chev {
721
- transform: rotate(90deg);
1952
+ .brand-lockup strong {
1953
+ font-family: var(--display);
1954
+ font-size: 1.42rem;
1955
+ font-weight: 760;
1956
+ letter-spacing: -0.045em;
1957
+ line-height: 1.1;
722
1958
  }
723
1959
 
724
- .group-body {
725
- margin-top: 16px;
726
- padding-top: 16px;
727
- border-top: 1px solid var(--line);
1960
+ .brand-lockup small {
1961
+ margin-top: 3px;
1962
+ color: #7690b7;
1963
+ font-size: 0.61rem;
1964
+ font-weight: 700;
1965
+ letter-spacing: 0.11em;
1966
+ text-transform: uppercase;
1967
+ }
1968
+
1969
+ .gateway-copy {
1970
+ position: relative;
1971
+ z-index: 2;
1972
+ max-width: 560px;
1973
+ margin: auto 0;
1974
+ padding: clamp(56px, 11vh, 110px) 0;
1975
+ }
1976
+
1977
+ .gateway-copy .eyebrow {
1978
+ color: var(--cyan-soft);
1979
+ }
1980
+
1981
+ .gateway-copy h2 {
1982
+ font-family: var(--display);
1983
+ font-size: clamp(2.25rem, 4.2vw, 4.35rem);
1984
+ font-weight: 690;
1985
+ letter-spacing: -0.06em;
1986
+ line-height: 0.98;
1987
+ }
1988
+
1989
+ .gateway-copy p {
1990
+ max-width: 480px;
1991
+ margin-top: 22px;
1992
+ color: #9db2cf;
1993
+ font-size: 0.98rem;
1994
+ line-height: 1.75;
1995
+ }
1996
+
1997
+ .gateway-mark {
1998
+ position: absolute;
1999
+ right: clamp(-72px, -4vw, -28px);
2000
+ bottom: clamp(88px, 14vh, 150px);
2001
+ z-index: 0;
728
2002
  display: grid;
729
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
730
- gap: 18px;
2003
+ width: clamp(190px, 20vw, 300px);
2004
+ aspect-ratio: 1;
2005
+ place-items: center;
2006
+ opacity: 0.34;
731
2007
  }
732
2008
 
733
- .group-body h3 {
734
- font-size: 0.8rem;
735
- text-transform: uppercase;
736
- letter-spacing: 0.08em;
737
- color: var(--faint);
738
- margin-bottom: 9px;
2009
+ .gateway-mark img {
2010
+ width: 46%;
2011
+ filter: saturate(1.1) drop-shadow(0 15px 30px rgba(0, 119, 255, 0.28));
739
2012
  }
740
2013
 
741
- /* --- QR ---------------------------------------------------------------- */
2014
+ .gateway-ring {
2015
+ position: absolute;
2016
+ inset: 2px;
2017
+ border: 1px dashed rgba(72, 192, 255, 0.44);
2018
+ border-radius: 50%;
2019
+ animation: orbit 28s linear infinite;
2020
+ }
742
2021
 
743
- .qr-box {
744
- display: flex;
745
- flex-direction: column;
746
- align-items: center;
747
- gap: 14px;
748
- padding: 22px;
749
- text-align: center;
2022
+ .gateway-ring::after {
2023
+ position: absolute;
2024
+ top: 11%;
2025
+ left: 14%;
2026
+ width: 9px;
2027
+ height: 9px;
2028
+ border-radius: 50%;
2029
+ background: var(--cyan);
2030
+ box-shadow: 0 0 15px rgba(33, 206, 243, 0.8);
2031
+ content: "";
750
2032
  }
751
2033
 
752
- .qr-frame {
753
- background: #fff;
754
- padding: 14px;
755
- border-radius: var(--radius);
756
- line-height: 0;
757
- min-width: 268px;
758
- min-height: 268px;
2034
+ .gateway-trust {
2035
+ position: relative;
2036
+ z-index: 2;
759
2037
  display: flex;
760
2038
  align-items: center;
761
- justify-content: center;
2039
+ gap: 9px;
2040
+ color: #7892b8;
2041
+ font-size: 0.7rem;
2042
+ font-weight: 650;
2043
+ letter-spacing: 0.06em;
2044
+ text-transform: uppercase;
762
2045
  }
763
2046
 
764
- .qr-frame canvas,
765
- .qr-frame img {
766
- display: block;
2047
+ .gateway-trust > span {
2048
+ width: 7px;
2049
+ height: 7px;
2050
+ border-radius: 50%;
2051
+ background: var(--ok);
2052
+ box-shadow:
2053
+ 0 0 0 5px rgba(59, 214, 139, 0.09),
2054
+ 0 0 13px rgba(59, 214, 139, 0.44);
767
2055
  }
768
2056
 
769
- .steps {
770
- color: var(--muted);
771
- font-size: 0.88rem;
2057
+ .gateway-panel {
2058
+ display: grid;
2059
+ min-width: 0;
2060
+ place-items: center;
2061
+ padding: clamp(26px, 5vw, 72px);
2062
+ background:
2063
+ radial-gradient(
2064
+ circle at 95% 4%,
2065
+ rgba(23, 107, 250, 0.1),
2066
+ transparent 24rem
2067
+ ),
2068
+ #091222;
2069
+ }
2070
+
2071
+ .gateway-panel-inner {
2072
+ width: min(100%, 480px);
2073
+ }
2074
+
2075
+ .auth-card {
2076
+ padding: clamp(25px, 4vw, 38px);
2077
+ border-color: #243857;
2078
+ background: #0d1a30;
2079
+ box-shadow: 0 28px 80px rgba(0, 4, 14, 0.34);
772
2080
  text-align: left;
773
- max-width: 380px;
774
- margin: 0 auto;
775
2081
  }
776
2082
 
777
- .steps li {
778
- margin: 5px 0 5px 18px;
2083
+ .auth-head {
2084
+ margin-bottom: 27px;
779
2085
  }
780
2086
 
781
- /* --- toasts ------------------------------------------------------------ */
2087
+ .auth-head .eyebrow,
2088
+ .qr-card-head .eyebrow {
2089
+ color: #70a3ff;
2090
+ }
782
2091
 
783
- .toasts {
784
- position: fixed;
785
- right: 20px;
786
- bottom: 20px;
787
- display: flex;
788
- flex-direction: column;
789
- gap: 9px;
790
- z-index: 100;
2092
+ .auth-card h1,
2093
+ .qr-card h1 {
2094
+ font-family: var(--display);
2095
+ font-size: clamp(1.8rem, 3vw, 2.3rem);
2096
+ font-weight: 720;
2097
+ letter-spacing: -0.05em;
2098
+ line-height: 1.08;
791
2099
  }
792
2100
 
793
- .toast {
794
- background: var(--panel);
795
- border: 1px solid var(--line);
796
- border-left: 3px solid var(--blue-bright);
797
- border-radius: var(--radius-sm);
798
- padding: 11px 15px;
799
- font-size: 0.88rem;
800
- box-shadow: var(--shadow);
801
- max-width: 340px;
802
- animation: slide 0.2s ease;
2101
+ .auth-card .sub {
2102
+ margin-top: 8px;
2103
+ color: #94a8c4;
2104
+ font-size: 0.86rem;
803
2105
  }
804
2106
 
805
- .toast.ok {
806
- border-left-color: var(--ok);
2107
+ .auth-card label.field > span {
2108
+ color: #dce6f6;
807
2109
  }
808
- .toast.error {
809
- border-left-color: var(--danger);
2110
+
2111
+ .auth-card input {
2112
+ border-color: #263d61;
2113
+ background: #091529;
2114
+ color: #f2f6ff;
810
2115
  }
811
2116
 
812
- @keyframes slide {
813
- from {
814
- opacity: 0;
815
- transform: translateX(14px);
816
- }
2117
+ .auth-submit {
2118
+ width: 100%;
2119
+ min-height: 46px;
2120
+ margin-top: 4px;
2121
+ justify-content: space-between;
2122
+ padding-inline: 17px;
2123
+ }
2124
+
2125
+ .error {
2126
+ margin-top: 14px;
2127
+ padding: 11px 13px;
2128
+ border: 1px solid color-mix(in srgb, var(--danger) 42%, transparent);
2129
+ border-radius: 11px 11px 11px 5px;
2130
+ background: color-mix(in srgb, var(--danger) 10%, transparent);
2131
+ color: #ff9ca5;
2132
+ font-size: 0.8rem;
2133
+ text-align: left;
817
2134
  }
818
2135
 
819
- /* --- responsive -------------------------------------------------------- */
2136
+ .foot {
2137
+ margin-top: 20px;
2138
+ color: #627795;
2139
+ font-size: 0.7rem;
2140
+ text-align: center;
2141
+ }
820
2142
 
821
- .menu-btn {
822
- display: none;
2143
+ .qr-panel-inner {
2144
+ width: min(100%, 560px);
823
2145
  }
824
2146
 
825
- .sidebar-backdrop {
826
- display: none;
827
- position: fixed;
828
- inset: 0;
829
- z-index: 50;
830
- border: 0;
831
- background: rgba(2, 5, 12, 0.64);
832
- backdrop-filter: blur(2px);
2147
+ .qr-card-head {
2148
+ align-items: flex-start;
2149
+ }
2150
+
2151
+ .qr-card .qr-box {
2152
+ padding: 8px 0 20px;
2153
+ }
2154
+
2155
+ .qr-card .qr-frame {
2156
+ min-width: 286px;
2157
+ min-height: 286px;
2158
+ }
2159
+
2160
+ .compact-callout {
2161
+ max-width: 430px;
2162
+ margin-top: 2px;
2163
+ text-align: left;
2164
+ }
2165
+
2166
+ .qr-back {
2167
+ width: 100%;
833
2168
  }
834
2169
 
835
- @media (max-width: 900px) {
2170
+ .qr-success {
2171
+ padding: 58px 28px;
2172
+ color: #10203a;
2173
+ font-family: var(--display);
2174
+ font-weight: 700;
2175
+ line-height: 1.2;
2176
+ }
2177
+
2178
+ /* --- responsive -------------------------------------------------------- */
2179
+
2180
+ @media (max-width: 1220px) {
2181
+ .stats {
2182
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2183
+ }
2184
+
2185
+ .stat {
2186
+ min-height: 142px;
2187
+ }
2188
+
2189
+ .overview-hero {
2190
+ grid-template-columns: minmax(0, 1.25fr) minmax(260px, 0.75fr);
2191
+ }
2192
+ }
2193
+
2194
+ @media (max-width: 980px) {
836
2195
  .shell {
837
2196
  grid-template-columns: 1fr;
838
2197
  }
@@ -840,14 +2199,14 @@ td.wrap {
840
2199
  .sidebar {
841
2200
  position: fixed;
842
2201
  inset: 0 auto 0 0;
843
- width: 248px;
844
2202
  z-index: 60;
845
- transform: translateX(-100%);
846
- transition: transform 0.2s;
2203
+ width: 268px;
2204
+ transform: translateX(-102%);
2205
+ transition: transform 220ms cubic-bezier(0.22, 0.8, 0.32, 1);
847
2206
  }
848
2207
 
849
2208
  .sidebar.open {
850
- transform: none;
2209
+ transform: translateX(0);
851
2210
  }
852
2211
 
853
2212
  .sidebar-backdrop.open {
@@ -858,33 +2217,322 @@ td.wrap {
858
2217
  display: inline-flex;
859
2218
  }
860
2219
 
861
- .content {
862
- padding: 18px 14px;
2220
+ .overview-hero {
2221
+ grid-template-columns: minmax(0, 1.1fr) minmax(230px, 0.9fr);
2222
+ }
2223
+
2224
+ .hero-copy {
2225
+ padding: 38px;
863
2226
  }
864
2227
 
2228
+ .gateway-shell {
2229
+ grid-template-columns: minmax(290px, 0.72fr) minmax(440px, 1.28fr);
2230
+ }
2231
+
2232
+ .gateway-story {
2233
+ padding: 34px;
2234
+ }
2235
+
2236
+ .gateway-copy h2 {
2237
+ font-size: clamp(2.1rem, 4.5vw, 3.2rem);
2238
+ }
2239
+
2240
+ .gateway-mark {
2241
+ opacity: 0.22;
2242
+ }
2243
+ }
2244
+
2245
+ @media (max-width: 760px) {
865
2246
  .topbar {
866
- padding: 12px 14px;
2247
+ min-height: 65px;
2248
+ padding: 10px 14px;
2249
+ }
2250
+
2251
+ .content {
2252
+ padding: 22px 14px 34px;
2253
+ }
2254
+
2255
+ .page-heading > span {
2256
+ display: none;
2257
+ }
2258
+
2259
+ .overview-hero {
2260
+ display: block;
2261
+ min-height: 0;
2262
+ border-radius: 22px 22px 22px 8px;
2263
+ }
2264
+
2265
+ .hero-copy {
2266
+ position: relative;
2267
+ z-index: 5;
2268
+ padding: 34px 25px 38px;
2269
+ }
2270
+
2271
+ .hero-copy h2 {
2272
+ font-size: clamp(2.15rem, 10vw, 3.25rem);
2273
+ }
2274
+
2275
+ .hero-copy > p {
2276
+ max-width: 520px;
2277
+ }
2278
+
2279
+ .signal-stage {
2280
+ position: absolute;
2281
+ inset: 0 0 0 38%;
2282
+ min-height: 100%;
2283
+ opacity: 0.34;
2284
+ }
2285
+
2286
+ .signal-core {
2287
+ width: 126px;
2288
+ }
2289
+
2290
+ .signal-label {
2291
+ display: none;
2292
+ }
2293
+
2294
+ .section-head-split {
2295
+ align-items: flex-start;
2296
+ flex-direction: column;
2297
+ gap: 5px;
2298
+ }
2299
+
2300
+ .section-note {
2301
+ padding-bottom: 0;
2302
+ }
2303
+
2304
+ .password-grid {
2305
+ grid-template-columns: 1fr;
2306
+ align-items: stretch;
2307
+ }
2308
+
2309
+ .gateway-shell {
2310
+ display: block;
2311
+ }
2312
+
2313
+ .gateway-story {
2314
+ min-height: 255px;
2315
+ padding: 25px;
2316
+ border-right: 0;
2317
+ border-bottom: 1px solid #203a60;
2318
+ }
2319
+
2320
+ .gateway-copy {
2321
+ margin: 48px 0 0;
2322
+ padding: 0 0 18px;
2323
+ }
2324
+
2325
+ .gateway-copy h2 {
2326
+ max-width: 520px;
2327
+ font-size: clamp(2rem, 8vw, 3rem);
2328
+ }
2329
+
2330
+ .gateway-copy p {
2331
+ max-width: 560px;
2332
+ margin-top: 13px;
2333
+ }
2334
+
2335
+ .gateway-mark {
2336
+ right: -35px;
2337
+ bottom: -62px;
2338
+ width: 220px;
2339
+ }
2340
+
2341
+ .gateway-trust {
2342
+ display: none;
2343
+ }
2344
+
2345
+ .gateway-panel {
2346
+ min-height: calc(100vh - 255px);
2347
+ padding: 30px 18px;
867
2348
  }
868
2349
  }
869
2350
 
870
- @media (max-width: 600px) {
2351
+ @media (max-width: 560px) {
871
2352
  .topbar {
872
2353
  gap: 8px;
873
2354
  }
874
2355
 
875
- .topbar h1 {
2356
+ .page-heading {
2357
+ display: none;
2358
+ }
2359
+
2360
+ .topbar > .spacer {
2361
+ display: none;
2362
+ }
2363
+
2364
+ .topbar-actions {
2365
+ width: auto;
2366
+ min-width: 0;
2367
+ flex: 1;
2368
+ justify-content: flex-end;
2369
+ gap: 7px;
2370
+ }
2371
+
2372
+ .topbar-actions .pill {
2373
+ margin-right: auto;
2374
+ }
2375
+
2376
+ .logout-btn span {
876
2377
  display: none;
877
2378
  }
878
2379
 
879
- .topbar .pill {
880
- padding-inline: 9px;
2380
+ .logout-btn {
2381
+ width: 35px;
2382
+ min-height: 35px;
2383
+ padding: 8px;
2384
+ border-color: var(--line-soft);
2385
+ border-radius: 9px;
881
2386
  }
882
2387
 
883
2388
  .stats {
884
2389
  grid-template-columns: repeat(2, minmax(0, 1fr));
885
2390
  }
886
2391
 
887
- .grid-2 {
2392
+ .stat {
2393
+ min-height: 138px;
2394
+ padding: 14px;
2395
+ }
2396
+
2397
+ .stat-icon {
2398
+ width: 25px;
2399
+ height: 25px;
2400
+ }
2401
+
2402
+ .card {
2403
+ padding: 18px;
2404
+ }
2405
+
2406
+ .section-head h2 {
2407
+ font-size: 1.65rem;
2408
+ }
2409
+
2410
+ .hero-copy {
2411
+ padding: 31px 21px 34px;
2412
+ }
2413
+
2414
+ .hero-actions {
2415
+ align-items: flex-start;
2416
+ flex-direction: column;
2417
+ gap: 14px;
2418
+ }
2419
+
2420
+ .signal-stage {
2421
+ left: 25%;
2422
+ }
2423
+
2424
+ .action-cluster .btn {
2425
+ flex: 1 1 calc(50% - 6px);
2426
+ }
2427
+
2428
+ .toolbar .search-field,
2429
+ .toolbar select {
2430
+ width: 100%;
2431
+ }
2432
+
2433
+ .toolbar > .spacer {
2434
+ display: none;
2435
+ }
2436
+
2437
+ .data-tabs {
2438
+ width: 100%;
2439
+ flex-wrap: nowrap;
2440
+ overflow-x: auto;
2441
+ }
2442
+
2443
+ .data-tabs .btn {
2444
+ flex: none;
2445
+ }
2446
+
2447
+ .role-control #role-number,
2448
+ .role-control #role-kind {
2449
+ max-width: none;
2450
+ }
2451
+
2452
+ .role-control > input,
2453
+ .role-control > select,
2454
+ .role-control > button {
2455
+ width: 100%;
2456
+ }
2457
+
2458
+ .toasts {
2459
+ right: 12px;
2460
+ bottom: 12px;
2461
+ left: 12px;
2462
+ }
2463
+
2464
+ .toast {
2465
+ width: 100%;
2466
+ max-width: none;
2467
+ }
2468
+
2469
+ .gateway-story {
2470
+ min-height: 225px;
2471
+ }
2472
+
2473
+ .gateway-copy {
2474
+ margin-top: 38px;
2475
+ }
2476
+
2477
+ .gateway-copy p {
2478
+ display: none;
2479
+ }
2480
+
2481
+ .gateway-panel {
2482
+ min-height: calc(100vh - 225px);
2483
+ padding: 22px 12px;
2484
+ }
2485
+
2486
+ .auth-card {
2487
+ padding: 23px 19px;
2488
+ }
2489
+
2490
+ .qr-card-head {
2491
+ align-items: flex-start;
2492
+ flex-direction: column;
2493
+ }
2494
+
2495
+ .qr-card .qr-frame,
2496
+ .qr-frame {
2497
+ min-width: min(270px, 100%);
2498
+ min-height: 270px;
2499
+ }
2500
+ }
2501
+
2502
+ @media (max-width: 390px) {
2503
+ .topbar-actions .pill {
2504
+ max-width: 102px;
2505
+ overflow: hidden;
2506
+ text-overflow: ellipsis;
2507
+ }
2508
+
2509
+ .stat {
2510
+ min-height: 128px;
2511
+ }
2512
+
2513
+ .prefix-control > * {
2514
+ width: 100%;
2515
+ max-width: none;
2516
+ }
2517
+
2518
+ .prefix-control input {
2519
+ max-width: none;
2520
+ }
2521
+ }
2522
+
2523
+ @media (max-width: 340px) {
2524
+ .stats {
888
2525
  grid-template-columns: 1fr;
889
2526
  }
890
2527
  }
2528
+
2529
+ @media (prefers-reduced-motion: reduce) {
2530
+ *,
2531
+ *::before,
2532
+ *::after {
2533
+ scroll-behavior: auto !important;
2534
+ animation-duration: 0.001ms !important;
2535
+ animation-iteration-count: 1 !important;
2536
+ transition-duration: 0.001ms !important;
2537
+ }
2538
+ }