@firedrill-tools/stripe 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +433 -0
  3. package/firedrill/agent.target.json +17 -0
  4. package/firedrill/api-unavailable.scenario.json +11 -0
  5. package/firedrill/baseline.scenario.json +5 -0
  6. package/firedrill/conformance.suite.json +17 -0
  7. package/firedrill/rate-limited.scenario.json +11 -0
  8. package/firedrill/refund-committed-lost.scenario.json +11 -0
  9. package/firedrill/stripe-api-unavailable.drill.json +463 -0
  10. package/firedrill/stripe-denied.drill.json +74 -0
  11. package/firedrill/stripe-large-pages.drill.json +153 -0
  12. package/firedrill/stripe-live-mode.drill.json +136 -0
  13. package/firedrill/stripe-mcp-aliases.drill.json +406 -0
  14. package/firedrill/stripe-no-permissions.drill.json +1143 -0
  15. package/firedrill/stripe-rate-limited.drill.json +616 -0
  16. package/firedrill/stripe-refund-committed-lost.drill.json +139 -0
  17. package/firedrill/stripe-rest-flow.drill.json +1401 -0
  18. package/firedrill/stripe-restricted-key.drill.json +171 -0
  19. package/firedrill/tools/stripe/app/assets/ATTRIBUTION.md +36 -0
  20. package/firedrill/tools/stripe/app/assets/fonts/OFL.txt +93 -0
  21. package/firedrill/tools/stripe/app/assets/stripe-s.svg +1 -0
  22. package/firedrill/tools/stripe/app/assets/stripe.svg +1 -0
  23. package/firedrill/tools/stripe/app/site/app.js +456 -0
  24. package/firedrill/tools/stripe/app/site/assets/fonts/inter-latin.woff2 +0 -0
  25. package/firedrill/tools/stripe/app/site/assets/stripe-s.svg +1 -0
  26. package/firedrill/tools/stripe/app/site/assets/stripe.svg +1 -0
  27. package/firedrill/tools/stripe/app/site/icons.js +90 -0
  28. package/firedrill/tools/stripe/app/site/index.html +137 -0
  29. package/firedrill/tools/stripe/app/site/pages-billing.js +902 -0
  30. package/firedrill/tools/stripe/app/site/pages-catalog.js +314 -0
  31. package/firedrill/tools/stripe/app/site/pages-customers.js +416 -0
  32. package/firedrill/tools/stripe/app/site/pages-home.js +373 -0
  33. package/firedrill/tools/stripe/app/site/pages-payments.js +502 -0
  34. package/firedrill/tools/stripe/app/site/store.js +99 -0
  35. package/firedrill/tools/stripe/app/site/styles.css +2512 -0
  36. package/firedrill/tools/stripe/app/site/ui.js +767 -0
  37. package/firedrill/tools/stripe/app/site/widgets.js +707 -0
  38. package/firedrill/tools/stripe/behavior.mjs +148 -0
  39. package/firedrill/tools/stripe/lib/cards.mjs +53 -0
  40. package/firedrill/tools/stripe/lib/form.mjs +204 -0
  41. package/firedrill/tools/stripe/lib/ids.mjs +85 -0
  42. package/firedrill/tools/stripe/lib/money.mjs +35 -0
  43. package/firedrill/tools/stripe/lib/objects.mjs +229 -0
  44. package/firedrill/tools/stripe/lib/periods.mjs +41 -0
  45. package/firedrill/tools/stripe/lib/size.mjs +55 -0
  46. package/firedrill/tools/stripe/lib/state.mjs +230 -0
  47. package/firedrill/tools/stripe/lib/validate.mjs +184 -0
  48. package/firedrill/tools/stripe/lib/wire.mjs +98 -0
  49. package/firedrill/tools/stripe/ops/billing.mjs +914 -0
  50. package/firedrill/tools/stripe/ops/catalog.mjs +203 -0
  51. package/firedrill/tools/stripe/ops/customers.mjs +241 -0
  52. package/firedrill/tools/stripe/ops/dashboard.mjs +29 -0
  53. package/firedrill/tools/stripe/ops/payments.mjs +608 -0
  54. package/firedrill/tools/stripe/stripe.tool.json +28833 -0
  55. package/firedrill/world.json +8527 -0
  56. package/firedrill.json +5 -0
  57. package/package.json +64 -0
  58. package/starter.json +7999 -0
  59. package/test/conformance.mjs +1133 -0
@@ -0,0 +1,2512 @@
1
+ @font-face {
2
+ font-family: "Inter";
3
+ font-style: normal;
4
+ font-weight: 400 700;
5
+ font-display: swap;
6
+ src: url("./assets/fonts/inter-latin.woff2") format("woff2");
7
+ }
8
+
9
+ :root {
10
+ color-scheme: light;
11
+ --text: #30313d;
12
+ --text-2: #687385;
13
+ --text-3: #87909f;
14
+ --text-heading: #30313d;
15
+ --border: #ebeef1;
16
+ --border-strong: #d5dbe1;
17
+ --bg: #ffffff;
18
+ --bg-2: #f6f8fa;
19
+ --bg-hover: #f5f6f8;
20
+ --bg-active: #eef0f3;
21
+ --brand: #635bff;
22
+ --brand-hover: #5851ec;
23
+ --brand-active: #4f47d8;
24
+ --brand-text: #533afd;
25
+ --brand-soft: #f0f0ff;
26
+ --link: #533afd;
27
+ --danger: #df1b41;
28
+ --danger-hover: #c8163a;
29
+ --danger-text: #b3093c;
30
+ --danger-soft: #ffe7f2;
31
+ --success-text: #006908;
32
+ --success-soft: #d7f7c2;
33
+ --warning-text: #c84801;
34
+ --warning-soft: #fcedb9;
35
+ --info-text: #0055bc;
36
+ --info-soft: #cff5f6;
37
+ --neutral-text: #545969;
38
+ --neutral-soft: #ebeef1;
39
+ --sandbox: #fc8c1d;
40
+ --sandbox-soft: #fff4e6;
41
+ --shadow-1: 0 0 0 1px rgba(0, 0, 0, 0.08), 0 2px 5px rgba(0, 0, 0, 0.06), 0 1px 1.5px rgba(0, 0, 0, 0.05);
42
+ --shadow-2: 0 0 0 1px rgba(0, 0, 0, 0.06), 0 8px 24px rgba(0, 0, 0, 0.14), 0 2px 6px rgba(0, 0, 0, 0.08);
43
+ --shadow-3: 0 0 0 1px rgba(0, 0, 0, 0.05), 0 16px 48px rgba(0, 0, 0, 0.2), 0 4px 12px rgba(0, 0, 0, 0.1);
44
+ --focus: 0 0 0 1px #ffffff, 0 0 0 3px rgba(99, 91, 255, 0.55);
45
+ --radius: 6px;
46
+ --radius-lg: 8px;
47
+ --sidebar-width: 232px;
48
+ --topbar-height: 60px;
49
+ --font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif;
50
+ --mono: ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
51
+ }
52
+
53
+ * {
54
+ box-sizing: border-box;
55
+ }
56
+ html,
57
+ body {
58
+ margin: 0;
59
+ height: 100%;
60
+ }
61
+ body {
62
+ font: 14px/20px var(--font);
63
+ font-feature-settings: "cv11", "ss01";
64
+ color: var(--text);
65
+ background: var(--bg);
66
+ -webkit-font-smoothing: antialiased;
67
+ overflow: hidden;
68
+ }
69
+ h1,
70
+ h2,
71
+ h3,
72
+ h4,
73
+ p,
74
+ ul,
75
+ ol,
76
+ figure {
77
+ margin: 0;
78
+ }
79
+ ul,
80
+ ol {
81
+ padding: 0;
82
+ list-style: none;
83
+ }
84
+ a {
85
+ color: inherit;
86
+ text-decoration: none;
87
+ }
88
+ button {
89
+ font: inherit;
90
+ color: inherit;
91
+ }
92
+ code,
93
+ kbd {
94
+ font-family: var(--mono);
95
+ }
96
+ .visually-hidden {
97
+ position: absolute !important;
98
+ width: 1px;
99
+ height: 1px;
100
+ overflow: hidden;
101
+ clip: rect(0 0 0 0);
102
+ white-space: nowrap;
103
+ }
104
+ .skip-link {
105
+ position: absolute;
106
+ left: -999px;
107
+ top: 8px;
108
+ z-index: 100;
109
+ padding: 8px 12px;
110
+ background: var(--bg);
111
+ border-radius: var(--radius);
112
+ box-shadow: var(--shadow-2);
113
+ }
114
+ .skip-link:focus {
115
+ left: 8px;
116
+ }
117
+ :focus-visible {
118
+ outline: none;
119
+ box-shadow: var(--focus);
120
+ }
121
+ [hidden] {
122
+ display: none !important;
123
+ }
124
+ .icon {
125
+ width: 16px;
126
+ height: 16px;
127
+ flex: none;
128
+ display: inline-block;
129
+ vertical-align: middle;
130
+ }
131
+ .spin {
132
+ animation: spin 0.9s linear infinite;
133
+ }
134
+ @keyframes spin {
135
+ to {
136
+ transform: rotate(360deg);
137
+ }
138
+ }
139
+
140
+ /* ------------------------------------------------------------------------------------------ */
141
+ /* Sandbox frame */
142
+ /* ------------------------------------------------------------------------------------------ */
143
+
144
+ body {
145
+ display: flex;
146
+ flex-direction: column;
147
+ }
148
+ .sandbox-banner {
149
+ flex: none;
150
+ display: flex;
151
+ align-items: center;
152
+ gap: 12px;
153
+ min-height: 36px;
154
+ padding: 6px 16px;
155
+ background: var(--sandbox-soft);
156
+ border-bottom: 1px solid #fbd7a8;
157
+ color: #7a3a00;
158
+ font-size: 13px;
159
+ line-height: 18px;
160
+ }
161
+ .sandbox-pill {
162
+ display: inline-flex;
163
+ align-items: center;
164
+ gap: 5px;
165
+ height: 22px;
166
+ padding: 0 8px;
167
+ border-radius: 999px;
168
+ background: var(--sandbox);
169
+ color: #ffffff;
170
+ font-size: 12px;
171
+ font-weight: 600;
172
+ flex: none;
173
+ }
174
+ .sandbox-pill .icon {
175
+ width: 12px;
176
+ height: 12px;
177
+ }
178
+ .sandbox-text {
179
+ flex: 1;
180
+ min-width: 0;
181
+ overflow: hidden;
182
+ text-overflow: ellipsis;
183
+ white-space: nowrap;
184
+ }
185
+ .sandbox-action {
186
+ flex: none;
187
+ height: 26px;
188
+ padding: 0 10px;
189
+ border: 1px solid #f5b56a;
190
+ border-radius: var(--radius);
191
+ background: #ffffff;
192
+ color: #7a3a00;
193
+ font-size: 12px;
194
+ font-weight: 600;
195
+ cursor: pointer;
196
+ }
197
+ .sandbox-action:hover {
198
+ background: #fff9f1;
199
+ border-color: var(--sandbox);
200
+ }
201
+
202
+ /* ------------------------------------------------------------------------------------------ */
203
+ /* App shell */
204
+ /* ------------------------------------------------------------------------------------------ */
205
+
206
+ .app {
207
+ display: flex;
208
+ flex: 1;
209
+ min-height: 0;
210
+ }
211
+ .sidebar {
212
+ width: var(--sidebar-width);
213
+ flex: none;
214
+ display: flex;
215
+ flex-direction: column;
216
+ padding: 12px 12px 12px;
217
+ border-right: 1px solid var(--border);
218
+ background: var(--bg);
219
+ overflow: visible;
220
+ }
221
+ .account-switcher {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 8px;
225
+ width: 100%;
226
+ padding: 6px 8px;
227
+ border: 0;
228
+ border-radius: var(--radius);
229
+ background: transparent;
230
+ cursor: pointer;
231
+ text-align: left;
232
+ margin-bottom: 8px;
233
+ }
234
+ .account-switcher:hover {
235
+ background: var(--bg-hover);
236
+ }
237
+ .account-avatar {
238
+ width: 24px;
239
+ height: 24px;
240
+ border-radius: 6px;
241
+ background: linear-gradient(135deg, #7a73ff, #635bff);
242
+ color: #ffffff;
243
+ font-size: 11px;
244
+ font-weight: 700;
245
+ display: inline-flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ flex: none;
249
+ }
250
+ .account-name {
251
+ flex: 1;
252
+ font-weight: 600;
253
+ white-space: nowrap;
254
+ overflow: hidden;
255
+ text-overflow: ellipsis;
256
+ }
257
+ .account-chevron {
258
+ color: var(--text-2);
259
+ }
260
+ .sidenav {
261
+ flex: 1;
262
+ min-height: 0;
263
+ overflow-y: auto;
264
+ overflow-x: hidden;
265
+ margin-right: -4px;
266
+ padding-right: 4px;
267
+ }
268
+ .sidenav-section {
269
+ margin-top: 16px;
270
+ }
271
+ .sidenav-heading {
272
+ display: flex;
273
+ align-items: center;
274
+ padding: 4px 8px;
275
+ font-size: 12px;
276
+ line-height: 16px;
277
+ font-weight: 500;
278
+ color: var(--text-2);
279
+ }
280
+ .sidenav-item {
281
+ display: flex;
282
+ align-items: center;
283
+ gap: 10px;
284
+ width: 100%;
285
+ padding: 6px 8px;
286
+ border: 0;
287
+ border-radius: var(--radius);
288
+ background: transparent;
289
+ color: var(--text);
290
+ font-weight: 500;
291
+ cursor: pointer;
292
+ text-align: left;
293
+ }
294
+ .sidenav-item:hover {
295
+ background: var(--bg-hover);
296
+ }
297
+ .sidenav-item[aria-current="page"] {
298
+ color: var(--brand-text);
299
+ }
300
+ .sidenav-item[aria-current="page"] .sidenav-icon {
301
+ color: var(--brand-text);
302
+ }
303
+ .sidenav-icon {
304
+ color: var(--text-2);
305
+ }
306
+ .sidenav-caret {
307
+ margin-left: auto;
308
+ color: var(--text-3);
309
+ transition: transform 0.15s;
310
+ }
311
+ .sidenav-toggle[aria-expanded="true"] .sidenav-caret {
312
+ transform: rotate(90deg);
313
+ }
314
+ .sidenav-sublist {
315
+ margin: 2px 0 4px;
316
+ }
317
+ .sidenav-subitem {
318
+ padding-left: 34px;
319
+ font-weight: 400;
320
+ color: var(--text-2);
321
+ }
322
+ .sidenav-subitem[aria-current="page"] {
323
+ font-weight: 500;
324
+ }
325
+ .sidebar-bottom {
326
+ padding-top: 8px;
327
+ border-top: 1px solid var(--border);
328
+ }
329
+ .sidebar-scrim {
330
+ position: fixed;
331
+ inset: 0;
332
+ background: rgba(48, 49, 61, 0.4);
333
+ z-index: 39;
334
+ }
335
+
336
+ .frame {
337
+ flex: 1;
338
+ min-width: 0;
339
+ display: flex;
340
+ flex-direction: column;
341
+ }
342
+ .topbar {
343
+ height: var(--topbar-height);
344
+ flex: none;
345
+ display: flex;
346
+ align-items: center;
347
+ gap: 12px;
348
+ padding: 0 24px 0 20px;
349
+ border-bottom: 1px solid var(--border);
350
+ }
351
+ .topbar .topbar-menu {
352
+ display: none;
353
+ }
354
+ .search {
355
+ position: relative;
356
+ display: flex;
357
+ align-items: center;
358
+ width: 100%;
359
+ height: 32px;
360
+ padding: 0 10px;
361
+ gap: 8px;
362
+ margin-bottom: 4px;
363
+ border-radius: var(--radius);
364
+ background: var(--bg-2);
365
+ box-shadow: 0 0 0 1px var(--border);
366
+ transition: box-shadow 0.15s;
367
+ }
368
+ .search:focus-within {
369
+ background: var(--bg);
370
+ box-shadow: 0 0 0 1px var(--brand), 0 0 0 4px rgba(99, 91, 255, 0.18);
371
+ }
372
+ .search-icon {
373
+ color: var(--text-2);
374
+ }
375
+ .search input {
376
+ flex: 1;
377
+ min-width: 0;
378
+ border: 0;
379
+ background: transparent;
380
+ font: inherit;
381
+ color: var(--text);
382
+ outline: none;
383
+ }
384
+ .search input::placeholder {
385
+ color: var(--text-3);
386
+ }
387
+ .search-kbd {
388
+ padding: 0 6px;
389
+ border-radius: 4px;
390
+ background: var(--bg);
391
+ box-shadow: 0 0 0 1px var(--border-strong);
392
+ color: var(--text-2);
393
+ font-size: 12px;
394
+ line-height: 18px;
395
+ }
396
+ .search-results {
397
+ position: absolute;
398
+ top: calc(100% + 6px);
399
+ left: 0;
400
+ right: auto;
401
+ width: 420px;
402
+ max-width: calc(100vw - 32px);
403
+ max-height: 60vh;
404
+ overflow-y: auto;
405
+ background: var(--bg);
406
+ border-radius: var(--radius-lg);
407
+ box-shadow: var(--shadow-2);
408
+ z-index: 45;
409
+ padding: 6px;
410
+ }
411
+ .search-group {
412
+ padding: 8px 10px 4px;
413
+ font-size: 12px;
414
+ font-weight: 500;
415
+ color: var(--text-2);
416
+ }
417
+ .search-hit {
418
+ display: flex;
419
+ align-items: center;
420
+ gap: 10px;
421
+ width: 100%;
422
+ padding: 6px 10px;
423
+ border: 0;
424
+ border-radius: var(--radius);
425
+ background: transparent;
426
+ cursor: pointer;
427
+ text-align: left;
428
+ }
429
+ .search-hit:hover,
430
+ .search-hit[aria-selected="true"] {
431
+ background: var(--bg-hover);
432
+ }
433
+ .search-hit .icon {
434
+ color: var(--text-2);
435
+ }
436
+ .search-hit-main {
437
+ flex: 1;
438
+ min-width: 0;
439
+ overflow: hidden;
440
+ text-overflow: ellipsis;
441
+ white-space: nowrap;
442
+ }
443
+ .search-hit-sub {
444
+ color: var(--text-2);
445
+ font-size: 12px;
446
+ }
447
+ .search-note {
448
+ padding: 8px 10px;
449
+ color: var(--text-2);
450
+ font-size: 12px;
451
+ }
452
+ .topbar-end {
453
+ margin-left: auto;
454
+ display: flex;
455
+ align-items: center;
456
+ gap: 4px;
457
+ }
458
+ .topbar-dev {
459
+ color: var(--text-2);
460
+ }
461
+ .topbar-icon {
462
+ color: var(--text-2);
463
+ }
464
+ .topbar-create {
465
+ margin-left: 8px;
466
+ width: 28px;
467
+ height: 28px;
468
+ display: inline-flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ padding: 0;
472
+ border: 0;
473
+ border-radius: 50%;
474
+ background: var(--brand);
475
+ color: #ffffff;
476
+ cursor: pointer;
477
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12);
478
+ }
479
+ .topbar-create:hover {
480
+ background: var(--brand-hover);
481
+ }
482
+ .topbar-create[aria-expanded="true"] {
483
+ background: var(--brand-active);
484
+ }
485
+ .shortcut-pin {
486
+ margin-left: auto;
487
+ color: var(--text-3);
488
+ opacity: 0;
489
+ }
490
+ .sidenav-item:hover .shortcut-pin,
491
+ .shortcut-pin.is-pinned {
492
+ opacity: 1;
493
+ }
494
+ .shortcut-pin.is-pinned {
495
+ color: var(--brand-text);
496
+ }
497
+ .sidenav-subitem[data-not-simulated] {
498
+ color: var(--text-2);
499
+ }
500
+ .progress {
501
+ height: 2px;
502
+ flex: none;
503
+ background: transparent;
504
+ position: relative;
505
+ overflow: hidden;
506
+ }
507
+ html[data-busy] .progress::after {
508
+ content: "";
509
+ position: absolute;
510
+ inset: 0;
511
+ width: 40%;
512
+ background: var(--brand);
513
+ animation: progress 1s ease-in-out infinite;
514
+ }
515
+ @keyframes progress {
516
+ from {
517
+ transform: translateX(-100%);
518
+ }
519
+ to {
520
+ transform: translateX(260%);
521
+ }
522
+ }
523
+ .page {
524
+ flex: 1;
525
+ min-height: 0;
526
+ overflow-y: auto;
527
+ padding: 24px 40px 48px;
528
+ outline: none;
529
+ }
530
+ .page-inner {
531
+ max-width: 1200px;
532
+ margin: 0 auto;
533
+ }
534
+ .page-loading,
535
+ .list-loading {
536
+ display: flex;
537
+ align-items: center;
538
+ gap: 8px;
539
+ padding: 48px 0;
540
+ color: var(--text-2);
541
+ justify-content: center;
542
+ }
543
+
544
+ /* ------------------------------------------------------------------------------------------ */
545
+ /* Buttons */
546
+ /* ------------------------------------------------------------------------------------------ */
547
+
548
+ .btn {
549
+ display: inline-flex;
550
+ align-items: center;
551
+ justify-content: center;
552
+ gap: 6px;
553
+ height: 28px;
554
+ padding: 0 8px;
555
+ border: 0;
556
+ border-radius: var(--radius);
557
+ font-weight: 500;
558
+ line-height: 20px;
559
+ white-space: nowrap;
560
+ cursor: pointer;
561
+ transition: background-color 0.12s, box-shadow 0.12s, color 0.12s;
562
+ text-decoration: none;
563
+ }
564
+ .btn:disabled {
565
+ opacity: 0.5;
566
+ cursor: default;
567
+ }
568
+ .btn-lg {
569
+ height: 36px;
570
+ padding: 0 14px;
571
+ }
572
+ .btn-sm {
573
+ height: 24px;
574
+ padding: 0 6px;
575
+ font-size: 13px;
576
+ }
577
+ .btn-xs {
578
+ height: 20px;
579
+ width: 20px;
580
+ padding: 0;
581
+ }
582
+ .btn-primary {
583
+ background: var(--brand);
584
+ color: #ffffff;
585
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05), 0 1px 1px rgba(0, 0, 0, 0.1);
586
+ }
587
+ .btn-primary:hover:not(:disabled) {
588
+ background: var(--brand-hover);
589
+ }
590
+ .btn-primary:active:not(:disabled) {
591
+ background: var(--brand-active);
592
+ }
593
+ .btn-secondary {
594
+ background: var(--bg);
595
+ color: var(--text);
596
+ box-shadow: var(--shadow-1);
597
+ }
598
+ .btn-secondary:hover:not(:disabled) {
599
+ background: var(--bg-hover);
600
+ }
601
+ .btn-secondary:active:not(:disabled) {
602
+ background: var(--bg-active);
603
+ }
604
+ .btn-danger {
605
+ background: var(--danger);
606
+ color: #ffffff;
607
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05), 0 1px 1px rgba(0, 0, 0, 0.1);
608
+ }
609
+ .btn-danger:hover:not(:disabled) {
610
+ background: var(--danger-hover);
611
+ }
612
+ .btn-ghost {
613
+ background: transparent;
614
+ color: var(--text);
615
+ }
616
+ .btn-ghost:hover:not(:disabled) {
617
+ background: var(--bg-hover);
618
+ }
619
+ .btn-link {
620
+ background: transparent;
621
+ color: var(--link);
622
+ padding: 0;
623
+ height: auto;
624
+ }
625
+ .btn-link:hover:not(:disabled) {
626
+ color: var(--brand-hover);
627
+ text-decoration: underline;
628
+ }
629
+ .btn-icon-only {
630
+ width: 28px;
631
+ padding: 0;
632
+ color: var(--text-2);
633
+ }
634
+ .btn-icon-only:hover:not(:disabled) {
635
+ color: var(--text);
636
+ }
637
+ .btn-icon-only.btn-lg {
638
+ width: 36px;
639
+ }
640
+ .btn .btn-icon {
641
+ color: inherit;
642
+ }
643
+ .btn-secondary .btn-icon,
644
+ .btn-ghost .btn-icon {
645
+ color: var(--text-2);
646
+ }
647
+ .btn-secondary.is-busy,
648
+ .btn-primary.is-busy {
649
+ position: relative;
650
+ color: transparent;
651
+ }
652
+ .btn.is-busy::after {
653
+ content: "";
654
+ position: absolute;
655
+ width: 14px;
656
+ height: 14px;
657
+ border-radius: 50%;
658
+ border: 2px solid rgba(255, 255, 255, 0.5);
659
+ border-top-color: #ffffff;
660
+ animation: spin 0.8s linear infinite;
661
+ }
662
+ .btn-secondary.is-busy::after {
663
+ border-color: rgba(48, 49, 61, 0.25);
664
+ border-top-color: var(--text);
665
+ }
666
+ .btn-group {
667
+ display: inline-flex;
668
+ gap: 8px;
669
+ align-items: center;
670
+ }
671
+ .link {
672
+ color: var(--link);
673
+ font-weight: 500;
674
+ cursor: pointer;
675
+ }
676
+ .link:hover {
677
+ color: var(--brand-hover);
678
+ text-decoration: underline;
679
+ }
680
+ .link-quiet {
681
+ color: inherit;
682
+ font-weight: inherit;
683
+ }
684
+ .link-quiet:hover {
685
+ color: var(--link);
686
+ text-decoration: none;
687
+ }
688
+
689
+ /* ------------------------------------------------------------------------------------------ */
690
+ /* Page headers, sections, key-value grids */
691
+ /* ------------------------------------------------------------------------------------------ */
692
+
693
+ .page-header {
694
+ display: flex;
695
+ align-items: flex-start;
696
+ justify-content: space-between;
697
+ gap: 16px;
698
+ margin-bottom: 20px;
699
+ }
700
+ .page-title {
701
+ font-size: 24px;
702
+ line-height: 32px;
703
+ font-weight: 700;
704
+ letter-spacing: -0.01em;
705
+ color: var(--text-heading);
706
+ }
707
+ .page-subtitle {
708
+ color: var(--text-2);
709
+ margin-top: 2px;
710
+ }
711
+ .page-actions {
712
+ display: flex;
713
+ align-items: center;
714
+ gap: 8px;
715
+ flex-wrap: wrap;
716
+ justify-content: flex-end;
717
+ }
718
+ .breadcrumbs {
719
+ display: flex;
720
+ align-items: center;
721
+ gap: 4px;
722
+ margin-bottom: 8px;
723
+ font-size: 13px;
724
+ color: var(--text-2);
725
+ }
726
+ .breadcrumbs a {
727
+ color: var(--text-2);
728
+ font-weight: 500;
729
+ }
730
+ .breadcrumbs a:hover {
731
+ color: var(--link);
732
+ }
733
+ .breadcrumbs .icon {
734
+ width: 12px;
735
+ height: 12px;
736
+ color: var(--text-3);
737
+ }
738
+ .object-kind {
739
+ font-size: 12px;
740
+ line-height: 16px;
741
+ font-weight: 600;
742
+ letter-spacing: 0.06em;
743
+ text-transform: uppercase;
744
+ color: var(--text-2);
745
+ margin-bottom: 4px;
746
+ }
747
+ .detail-title {
748
+ display: flex;
749
+ align-items: center;
750
+ gap: 12px;
751
+ flex-wrap: wrap;
752
+ }
753
+ .detail-title .page-title {
754
+ font-size: 28px;
755
+ line-height: 36px;
756
+ }
757
+ .detail-title .money-currency {
758
+ font-size: 18px;
759
+ }
760
+ .meta-bar {
761
+ display: flex;
762
+ flex-wrap: wrap;
763
+ gap: 0;
764
+ margin: 20px 0 8px;
765
+ border-top: 1px solid var(--border);
766
+ border-bottom: 1px solid var(--border);
767
+ }
768
+ .meta-item {
769
+ display: flex;
770
+ flex-direction: column;
771
+ gap: 2px;
772
+ padding: 12px 24px 12px 0;
773
+ margin-right: 24px;
774
+ border-right: 1px solid var(--border);
775
+ min-width: 140px;
776
+ }
777
+ .meta-item:last-child {
778
+ border-right: 0;
779
+ }
780
+ .meta-label {
781
+ font-size: 12px;
782
+ line-height: 16px;
783
+ font-weight: 500;
784
+ color: var(--text-2);
785
+ }
786
+ .meta-value {
787
+ display: flex;
788
+ align-items: center;
789
+ gap: 6px;
790
+ }
791
+ .section {
792
+ margin-top: 32px;
793
+ }
794
+ .section-header {
795
+ display: flex;
796
+ align-items: center;
797
+ justify-content: space-between;
798
+ gap: 12px;
799
+ padding-bottom: 8px;
800
+ border-bottom: 1px solid var(--border);
801
+ margin-bottom: 12px;
802
+ }
803
+ .section-title {
804
+ font-size: 16px;
805
+ line-height: 24px;
806
+ font-weight: 700;
807
+ }
808
+ .section-count {
809
+ color: var(--text-2);
810
+ font-weight: 400;
811
+ margin-left: 6px;
812
+ }
813
+ .section-actions {
814
+ display: flex;
815
+ gap: 8px;
816
+ }
817
+ .kv {
818
+ display: grid;
819
+ grid-template-columns: minmax(160px, 220px) 1fr;
820
+ row-gap: 8px;
821
+ column-gap: 24px;
822
+ }
823
+ .kv-label {
824
+ color: var(--text-2);
825
+ }
826
+ .kv-value {
827
+ min-width: 0;
828
+ overflow-wrap: anywhere;
829
+ }
830
+ .kv-value.muted,
831
+ .muted {
832
+ color: var(--text-2);
833
+ }
834
+ .kv-cols {
835
+ display: grid;
836
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
837
+ gap: 32px;
838
+ }
839
+ .cards {
840
+ display: grid;
841
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
842
+ gap: 16px;
843
+ }
844
+ .card {
845
+ padding: 16px;
846
+ border-radius: var(--radius-lg);
847
+ box-shadow: var(--shadow-1);
848
+ background: var(--bg);
849
+ }
850
+ .card-label {
851
+ color: var(--text-2);
852
+ font-size: 13px;
853
+ font-weight: 500;
854
+ display: flex;
855
+ align-items: center;
856
+ gap: 6px;
857
+ }
858
+ .card-value {
859
+ font-size: 24px;
860
+ line-height: 32px;
861
+ font-weight: 600;
862
+ margin-top: 4px;
863
+ font-variant-numeric: tabular-nums;
864
+ }
865
+ .card-note {
866
+ color: var(--text-2);
867
+ font-size: 12px;
868
+ margin-top: 4px;
869
+ }
870
+ .stat-big {
871
+ font-size: 28px;
872
+ line-height: 36px;
873
+ font-weight: 600;
874
+ }
875
+ .empty {
876
+ padding: 40px 24px;
877
+ text-align: center;
878
+ color: var(--text-2);
879
+ border: 1px dashed var(--border-strong);
880
+ border-radius: var(--radius-lg);
881
+ }
882
+ .empty-title {
883
+ color: var(--text);
884
+ font-weight: 600;
885
+ margin-bottom: 4px;
886
+ }
887
+ .empty .btn {
888
+ margin-top: 12px;
889
+ }
890
+ .alert {
891
+ display: flex;
892
+ gap: 10px;
893
+ align-items: flex-start;
894
+ padding: 12px 14px;
895
+ border-radius: var(--radius-lg);
896
+ margin-bottom: 16px;
897
+ background: var(--neutral-soft);
898
+ color: var(--text);
899
+ }
900
+ .alert .icon {
901
+ margin-top: 2px;
902
+ flex: none;
903
+ }
904
+ .alert-title {
905
+ font-weight: 600;
906
+ }
907
+ .alert-text {
908
+ color: inherit;
909
+ }
910
+ .alert-danger {
911
+ background: var(--danger-soft);
912
+ color: var(--danger-text);
913
+ }
914
+ .alert-warning {
915
+ background: var(--warning-soft);
916
+ color: var(--warning-text);
917
+ }
918
+ .alert-info {
919
+ background: var(--info-soft);
920
+ color: var(--info-text);
921
+ }
922
+ .alert-success {
923
+ background: var(--success-soft);
924
+ color: var(--success-text);
925
+ }
926
+ .alert .btn-group {
927
+ margin-left: auto;
928
+ }
929
+ .denied-panel {
930
+ padding: 32px 24px;
931
+ text-align: center;
932
+ border-radius: var(--radius-lg);
933
+ background: var(--bg-2);
934
+ color: var(--text-2);
935
+ }
936
+ .denied-panel .icon {
937
+ width: 24px;
938
+ height: 24px;
939
+ color: var(--text-3);
940
+ margin-bottom: 8px;
941
+ }
942
+ .denied-title {
943
+ color: var(--text);
944
+ font-weight: 600;
945
+ margin-bottom: 4px;
946
+ }
947
+
948
+ /* ------------------------------------------------------------------------------------------ */
949
+ /* Status tabs, filter chips */
950
+ /* ------------------------------------------------------------------------------------------ */
951
+
952
+ .stat-tabs {
953
+ display: flex;
954
+ gap: 8px;
955
+ border-radius: var(--radius-lg);
956
+ margin-bottom: 16px;
957
+ overflow-x: auto;
958
+ background: var(--bg);
959
+ }
960
+ .stat-tab {
961
+ flex: 1 1 0;
962
+ min-width: 120px;
963
+ padding: 8px 12px;
964
+ border: 0;
965
+ border-radius: var(--radius-lg);
966
+ box-shadow: var(--shadow-1);
967
+ background: var(--bg);
968
+ text-align: left;
969
+ cursor: pointer;
970
+ position: relative;
971
+ }
972
+
973
+ .stat-tab:hover {
974
+ background: var(--bg-hover);
975
+ }
976
+ .stat-tab-label {
977
+ display: block;
978
+ font-size: 13px;
979
+ color: var(--text-2);
980
+ font-weight: 500;
981
+ }
982
+ .stat-tab-count {
983
+ display: block;
984
+ font-size: 18px;
985
+ line-height: 24px;
986
+ font-weight: 600;
987
+ margin-top: 2px;
988
+ font-variant-numeric: tabular-nums;
989
+ }
990
+ .stat-tab[aria-selected="true"] .stat-tab-label,
991
+ .stat-tab[aria-selected="true"] .stat-tab-count {
992
+ color: var(--brand-text);
993
+ }
994
+ .stat-tab[aria-selected="true"] {
995
+ box-shadow: inset 0 0 0 2px var(--brand);
996
+ border-radius: var(--radius-lg);
997
+ border-right-color: transparent;
998
+ }
999
+ .tabs {
1000
+ display: flex;
1001
+ gap: 4px;
1002
+ border-bottom: 1px solid var(--border);
1003
+ margin-bottom: 16px;
1004
+ }
1005
+ .tab {
1006
+ padding: 8px 10px 10px;
1007
+ border: 0;
1008
+ background: transparent;
1009
+ color: var(--text-2);
1010
+ font-weight: 500;
1011
+ cursor: pointer;
1012
+ position: relative;
1013
+ border-radius: var(--radius) var(--radius) 0 0;
1014
+ }
1015
+ .tab:hover {
1016
+ color: var(--text);
1017
+ background: var(--bg-hover);
1018
+ }
1019
+ .tab[aria-selected="true"] {
1020
+ color: var(--brand-text);
1021
+ }
1022
+ .tab[aria-selected="true"]::after {
1023
+ content: "";
1024
+ position: absolute;
1025
+ left: 0;
1026
+ right: 0;
1027
+ bottom: -1px;
1028
+ height: 2px;
1029
+ background: var(--brand);
1030
+ }
1031
+ .filters {
1032
+ display: flex;
1033
+ flex-wrap: wrap;
1034
+ align-items: center;
1035
+ gap: 8px;
1036
+ margin-bottom: 12px;
1037
+ }
1038
+ .chip {
1039
+ display: inline-flex;
1040
+ align-items: center;
1041
+ gap: 4px;
1042
+ height: 24px;
1043
+ padding: 0 8px 0 4px;
1044
+ border-radius: 999px;
1045
+ border: 1px dashed var(--border-strong);
1046
+ background: var(--bg);
1047
+ color: var(--text-2);
1048
+ font-size: 12px;
1049
+ font-weight: 600;
1050
+ cursor: pointer;
1051
+ }
1052
+ .chip:hover {
1053
+ background: var(--bg-hover);
1054
+ color: var(--text);
1055
+ }
1056
+ .chip.is-active {
1057
+ border-style: solid;
1058
+ color: var(--text);
1059
+ }
1060
+ .chip-glyph {
1061
+ width: 14px;
1062
+ height: 14px;
1063
+ color: var(--text-3);
1064
+ }
1065
+ .chip.is-active .chip-glyph:hover {
1066
+ color: var(--text);
1067
+ }
1068
+ .chip-sep {
1069
+ width: 1px;
1070
+ height: 12px;
1071
+ background: var(--border-strong);
1072
+ margin: 0 2px;
1073
+ }
1074
+ .chip-value {
1075
+ color: var(--brand-text);
1076
+ }
1077
+ .chip-caret {
1078
+ width: 12px;
1079
+ height: 12px;
1080
+ color: var(--brand-text);
1081
+ }
1082
+ .list-tools {
1083
+ display: flex;
1084
+ align-items: center;
1085
+ gap: 8px;
1086
+ margin-left: auto;
1087
+ }
1088
+ .not-simulated {
1089
+ display: flex;
1090
+ gap: 12px;
1091
+ align-items: flex-start;
1092
+ }
1093
+ .not-simulated-icon {
1094
+ width: 20px;
1095
+ height: 20px;
1096
+ color: var(--sandbox);
1097
+ margin-top: 2px;
1098
+ }
1099
+ .not-simulated .modal-text {
1100
+ font-weight: 600;
1101
+ margin-bottom: 4px;
1102
+ }
1103
+ .chip-input {
1104
+ display: inline-flex;
1105
+ align-items: center;
1106
+ gap: 6px;
1107
+ height: 28px;
1108
+ padding: 0 8px 0 10px;
1109
+ border-radius: 999px;
1110
+ border: 1px solid var(--border-strong);
1111
+ background: var(--bg);
1112
+ }
1113
+ .chip-input input {
1114
+ border: 0;
1115
+ background: transparent;
1116
+ font: inherit;
1117
+ width: 200px;
1118
+ outline: none;
1119
+ }
1120
+ .chip-input .icon {
1121
+ color: var(--text-2);
1122
+ }
1123
+ .filters-note {
1124
+ color: var(--text-3);
1125
+ font-size: 12px;
1126
+ width: 100%;
1127
+ order: 10;
1128
+ }
1129
+
1130
+ /* ------------------------------------------------------------------------------------------ */
1131
+ /* Tables */
1132
+ /* ------------------------------------------------------------------------------------------ */
1133
+
1134
+ .table-wrap {
1135
+ overflow-x: auto;
1136
+ }
1137
+ .table {
1138
+ width: 100%;
1139
+ border-collapse: collapse;
1140
+ table-layout: auto;
1141
+ }
1142
+ .table th {
1143
+ padding: 6px 8px;
1144
+ text-align: left;
1145
+ font-size: 12px;
1146
+ line-height: 16px;
1147
+ font-weight: 500;
1148
+ color: var(--text-2);
1149
+ border-bottom: 1px solid var(--border);
1150
+ white-space: nowrap;
1151
+ }
1152
+ .table td {
1153
+ padding: 8px 8px;
1154
+ border-bottom: 1px solid var(--border);
1155
+ vertical-align: middle;
1156
+ height: 41px;
1157
+ }
1158
+ .table tbody tr {
1159
+ cursor: pointer;
1160
+ }
1161
+ .table tbody tr:hover,
1162
+ .table tbody tr:focus-within,
1163
+ .table tbody tr.is-selected {
1164
+ background: var(--bg-hover);
1165
+ }
1166
+ .table tbody tr.static {
1167
+ cursor: default;
1168
+ }
1169
+ .table tbody tr.static:hover {
1170
+ background: transparent;
1171
+ }
1172
+ .table .num,
1173
+ .table th.num {
1174
+ text-align: right;
1175
+ }
1176
+ .table .nowrap {
1177
+ white-space: nowrap;
1178
+ }
1179
+ .table .truncate {
1180
+ max-width: 320px;
1181
+ overflow: hidden;
1182
+ text-overflow: ellipsis;
1183
+ white-space: nowrap;
1184
+ }
1185
+ .table .muted {
1186
+ color: var(--text-2);
1187
+ }
1188
+ .table .actions {
1189
+ width: 36px;
1190
+ text-align: right;
1191
+ }
1192
+ .table .row-link {
1193
+ color: inherit;
1194
+ }
1195
+ .table .row-link:hover {
1196
+ color: var(--link);
1197
+ }
1198
+ .table td .link {
1199
+ font-weight: 400;
1200
+ }
1201
+ .money {
1202
+ display: inline-flex;
1203
+ align-items: baseline;
1204
+ gap: 4px;
1205
+ font-variant-numeric: tabular-nums;
1206
+ }
1207
+ .money-value {
1208
+ font-weight: 500;
1209
+ }
1210
+ .money-currency {
1211
+ color: var(--text-2);
1212
+ font-size: 12px;
1213
+ font-weight: 500;
1214
+ }
1215
+ .amount-status {
1216
+ display: inline-flex;
1217
+ align-items: center;
1218
+ gap: 8px;
1219
+ }
1220
+ .pager {
1221
+ display: flex;
1222
+ align-items: center;
1223
+ justify-content: space-between;
1224
+ gap: 12px;
1225
+ padding-top: 12px;
1226
+ }
1227
+ .pager-count {
1228
+ color: var(--text-2);
1229
+ }
1230
+ .pager .btn-group {
1231
+ gap: 6px;
1232
+ }
1233
+ .table-note {
1234
+ padding: 8px;
1235
+ color: var(--text-2);
1236
+ font-size: 12px;
1237
+ }
1238
+
1239
+ /* ------------------------------------------------------------------------------------------ */
1240
+ /* Badges, chips, avatars */
1241
+ /* ------------------------------------------------------------------------------------------ */
1242
+
1243
+ .badge {
1244
+ display: inline-flex;
1245
+ align-items: center;
1246
+ gap: 4px;
1247
+ height: 20px;
1248
+ padding: 0 6px;
1249
+ border-radius: 4px;
1250
+ font-size: 12px;
1251
+ line-height: 16px;
1252
+ font-weight: 500;
1253
+ white-space: nowrap;
1254
+ }
1255
+ .badge-icon {
1256
+ width: 12px;
1257
+ height: 12px;
1258
+ }
1259
+ .badge-green {
1260
+ background: var(--success-soft);
1261
+ color: var(--success-text);
1262
+ }
1263
+ .badge-red {
1264
+ background: var(--danger-soft);
1265
+ color: var(--danger-text);
1266
+ }
1267
+ .badge-yellow {
1268
+ background: var(--warning-soft);
1269
+ color: var(--warning-text);
1270
+ }
1271
+ .badge-blue {
1272
+ background: var(--info-soft);
1273
+ color: var(--info-text);
1274
+ }
1275
+ .badge-gray {
1276
+ background: var(--neutral-soft);
1277
+ color: var(--neutral-text);
1278
+ }
1279
+ .badge-purple {
1280
+ background: var(--brand-soft);
1281
+ color: var(--brand-text);
1282
+ }
1283
+ .card-chip {
1284
+ display: inline-flex;
1285
+ align-items: center;
1286
+ gap: 6px;
1287
+ white-space: nowrap;
1288
+ }
1289
+ .card-brand {
1290
+ display: inline-flex;
1291
+ align-items: center;
1292
+ height: 18px;
1293
+ padding: 0 6px;
1294
+ border-radius: 3px;
1295
+ font-size: 11px;
1296
+ font-weight: 600;
1297
+ color: var(--text);
1298
+ background: var(--bg-2);
1299
+ box-shadow: 0 0 0 1px var(--border-strong);
1300
+ }
1301
+ .card-brand-icon {
1302
+ color: var(--text-2);
1303
+ }
1304
+ .card-expiry {
1305
+ color: var(--text-2);
1306
+ }
1307
+ .id-chip {
1308
+ display: inline-flex;
1309
+ align-items: center;
1310
+ gap: 4px;
1311
+ max-width: 100%;
1312
+ }
1313
+ .id-code {
1314
+ font-size: 12px;
1315
+ padding: 1px 6px;
1316
+ border-radius: 4px;
1317
+ background: var(--bg-2);
1318
+ box-shadow: 0 0 0 1px var(--border);
1319
+ overflow: hidden;
1320
+ text-overflow: ellipsis;
1321
+ white-space: nowrap;
1322
+ }
1323
+ .id-copy {
1324
+ color: var(--text-3);
1325
+ }
1326
+ .avatar {
1327
+ display: inline-flex;
1328
+ align-items: center;
1329
+ justify-content: center;
1330
+ width: 32px;
1331
+ height: 32px;
1332
+ border-radius: 50%;
1333
+ background: var(--neutral-soft);
1334
+ color: var(--neutral-text);
1335
+ font-size: 12px;
1336
+ font-weight: 600;
1337
+ flex: none;
1338
+ }
1339
+ .avatar.lg {
1340
+ width: 48px;
1341
+ height: 48px;
1342
+ font-size: 16px;
1343
+ }
1344
+ .avatar.sm {
1345
+ width: 24px;
1346
+ height: 24px;
1347
+ font-size: 10px;
1348
+ }
1349
+ .avatar[data-tone="1"] {
1350
+ background: #e0e7ff;
1351
+ color: #3730a3;
1352
+ }
1353
+ .avatar[data-tone="2"] {
1354
+ background: #d7f7c2;
1355
+ color: #006908;
1356
+ }
1357
+ .avatar[data-tone="3"] {
1358
+ background: #fcedb9;
1359
+ color: #a82c00;
1360
+ }
1361
+ .avatar[data-tone="4"] {
1362
+ background: #cff5f6;
1363
+ color: #0055bc;
1364
+ }
1365
+ .avatar[data-tone="5"] {
1366
+ background: #ffe7f2;
1367
+ color: #b3093c;
1368
+ }
1369
+ .customer-cell {
1370
+ display: inline-flex;
1371
+ align-items: center;
1372
+ gap: 8px;
1373
+ min-width: 0;
1374
+ }
1375
+ .customer-cell-text {
1376
+ display: flex;
1377
+ flex-direction: column;
1378
+ min-width: 0;
1379
+ }
1380
+ .customer-cell-sub {
1381
+ color: var(--text-2);
1382
+ font-size: 12px;
1383
+ overflow: hidden;
1384
+ text-overflow: ellipsis;
1385
+ white-space: nowrap;
1386
+ }
1387
+
1388
+ /* ------------------------------------------------------------------------------------------ */
1389
+ /* Timeline */
1390
+ /* ------------------------------------------------------------------------------------------ */
1391
+
1392
+ .timeline {
1393
+ position: relative;
1394
+ padding-left: 24px;
1395
+ }
1396
+ .timeline::before {
1397
+ content: "";
1398
+ position: absolute;
1399
+ left: 7px;
1400
+ top: 8px;
1401
+ bottom: 8px;
1402
+ width: 2px;
1403
+ background: var(--border);
1404
+ }
1405
+ .timeline-item {
1406
+ position: relative;
1407
+ padding: 4px 0 16px;
1408
+ }
1409
+ .timeline-item:last-child {
1410
+ padding-bottom: 0;
1411
+ }
1412
+ .timeline-dot {
1413
+ position: absolute;
1414
+ left: -24px;
1415
+ top: 6px;
1416
+ width: 16px;
1417
+ height: 16px;
1418
+ border-radius: 50%;
1419
+ background: var(--bg);
1420
+ display: flex;
1421
+ align-items: center;
1422
+ justify-content: center;
1423
+ color: var(--text-3);
1424
+ }
1425
+ .timeline-dot .icon {
1426
+ width: 16px;
1427
+ height: 16px;
1428
+ }
1429
+ .timeline-dot.green {
1430
+ color: #1ea672;
1431
+ }
1432
+ .timeline-dot.red {
1433
+ color: var(--danger);
1434
+ }
1435
+ .timeline-dot.yellow {
1436
+ color: #e39b00;
1437
+ }
1438
+ .timeline-dot.blue {
1439
+ color: var(--brand);
1440
+ }
1441
+ .timeline-title {
1442
+ font-weight: 500;
1443
+ }
1444
+ .timeline-time {
1445
+ color: var(--text-2);
1446
+ font-size: 12px;
1447
+ }
1448
+ .timeline-text {
1449
+ color: var(--text-2);
1450
+ margin-top: 2px;
1451
+ }
1452
+
1453
+ /* ------------------------------------------------------------------------------------------ */
1454
+ /* Menus */
1455
+ /* ------------------------------------------------------------------------------------------ */
1456
+
1457
+ .menu {
1458
+ position: fixed;
1459
+ z-index: 70;
1460
+ min-width: 220px;
1461
+ max-width: 340px;
1462
+ padding: 6px;
1463
+ background: var(--bg);
1464
+ border-radius: var(--radius-lg);
1465
+ box-shadow: var(--shadow-2);
1466
+ }
1467
+ .menu-header {
1468
+ padding: 6px 10px;
1469
+ font-size: 12px;
1470
+ font-weight: 500;
1471
+ color: var(--text-2);
1472
+ }
1473
+ .menu-item {
1474
+ display: flex;
1475
+ align-items: center;
1476
+ gap: 10px;
1477
+ width: 100%;
1478
+ padding: 6px 10px;
1479
+ border: 0;
1480
+ border-radius: var(--radius);
1481
+ background: transparent;
1482
+ cursor: pointer;
1483
+ text-align: left;
1484
+ color: var(--text);
1485
+ }
1486
+ .menu-item:hover:not(:disabled),
1487
+ .menu-item:focus-visible {
1488
+ background: var(--bg-hover);
1489
+ box-shadow: none;
1490
+ }
1491
+ .menu-item:disabled {
1492
+ color: var(--text-3);
1493
+ cursor: default;
1494
+ }
1495
+ .menu-item.danger {
1496
+ color: var(--danger-text);
1497
+ }
1498
+ .menu-icon {
1499
+ color: var(--text-2);
1500
+ }
1501
+ .menu-item.danger .menu-icon {
1502
+ color: var(--danger-text);
1503
+ }
1504
+ .menu-labels {
1505
+ display: flex;
1506
+ flex-direction: column;
1507
+ flex: 1;
1508
+ min-width: 0;
1509
+ }
1510
+ .menu-description {
1511
+ font-size: 12px;
1512
+ color: var(--text-2);
1513
+ }
1514
+ .menu-kbd {
1515
+ font-size: 11px;
1516
+ color: var(--text-3);
1517
+ }
1518
+ .menu-divider {
1519
+ height: 1px;
1520
+ margin: 6px 4px;
1521
+ background: var(--border);
1522
+ }
1523
+ .menu-rich {
1524
+ padding: 4px 6px;
1525
+ }
1526
+ .menu-rich .kv {
1527
+ grid-template-columns: 110px 1fr;
1528
+ row-gap: 4px;
1529
+ }
1530
+
1531
+ /* ------------------------------------------------------------------------------------------ */
1532
+ /* Modals and forms */
1533
+ /* ------------------------------------------------------------------------------------------ */
1534
+
1535
+ .modal {
1536
+ width: min(600px, calc(100vw - 32px));
1537
+ max-height: calc(100vh - 48px);
1538
+ padding: 0;
1539
+ border: 0;
1540
+ border-radius: 12px;
1541
+ box-shadow: var(--shadow-3);
1542
+ color: var(--text);
1543
+ overflow: visible;
1544
+ }
1545
+ .modal.modal-sm {
1546
+ width: min(460px, calc(100vw - 32px));
1547
+ }
1548
+ .modal.modal-lg {
1549
+ width: min(760px, calc(100vw - 32px));
1550
+ }
1551
+ .modal::backdrop {
1552
+ background: rgba(48, 49, 61, 0.45);
1553
+ }
1554
+ .modal-form {
1555
+ display: flex;
1556
+ flex-direction: column;
1557
+ max-height: calc(100vh - 48px);
1558
+ }
1559
+ .modal-header {
1560
+ display: flex;
1561
+ align-items: center;
1562
+ justify-content: space-between;
1563
+ gap: 12px;
1564
+ padding: 16px 20px;
1565
+ border-bottom: 1px solid var(--border);
1566
+ }
1567
+ .modal-title {
1568
+ font-size: 18px;
1569
+ line-height: 24px;
1570
+ font-weight: 700;
1571
+ }
1572
+ .modal-body {
1573
+ padding: 20px;
1574
+ overflow-y: auto;
1575
+ display: flex;
1576
+ flex-direction: column;
1577
+ gap: 16px;
1578
+ }
1579
+ .modal-lede,
1580
+ .modal-text {
1581
+ color: var(--text-2);
1582
+ }
1583
+ .modal-text {
1584
+ color: var(--text);
1585
+ }
1586
+ .modal-footer {
1587
+ display: flex;
1588
+ justify-content: flex-end;
1589
+ gap: 8px;
1590
+ padding: 12px 20px;
1591
+ border-top: 1px solid var(--border);
1592
+ }
1593
+ .form-error {
1594
+ padding: 10px 12px;
1595
+ border-radius: var(--radius);
1596
+ background: var(--danger-soft);
1597
+ color: var(--danger-text);
1598
+ }
1599
+ .field {
1600
+ display: flex;
1601
+ flex-direction: column;
1602
+ gap: 6px;
1603
+ }
1604
+ .field-inline {
1605
+ flex-direction: row;
1606
+ align-items: center;
1607
+ gap: 12px;
1608
+ }
1609
+ .field-label {
1610
+ font-weight: 500;
1611
+ display: flex;
1612
+ align-items: center;
1613
+ gap: 8px;
1614
+ }
1615
+ .field-optional {
1616
+ font-weight: 400;
1617
+ color: var(--text-3);
1618
+ font-size: 12px;
1619
+ }
1620
+ .field-hint {
1621
+ color: var(--text-2);
1622
+ font-size: 12px;
1623
+ }
1624
+ .field-error {
1625
+ color: var(--danger-text);
1626
+ font-size: 12px;
1627
+ }
1628
+ .field-row {
1629
+ display: grid;
1630
+ grid-template-columns: 1fr 1fr;
1631
+ gap: 12px;
1632
+ }
1633
+ .input {
1634
+ width: 100%;
1635
+ height: 36px;
1636
+ padding: 0 12px;
1637
+ border: 0;
1638
+ border-radius: var(--radius);
1639
+ background: var(--bg);
1640
+ box-shadow: 0 0 0 1px var(--border-strong), 0 1px 2px rgba(0, 0, 0, 0.04);
1641
+ font: inherit;
1642
+ color: var(--text);
1643
+ transition: box-shadow 0.12s;
1644
+ }
1645
+ .input:focus {
1646
+ outline: none;
1647
+ box-shadow: 0 0 0 1px var(--brand), 0 0 0 4px rgba(99, 91, 255, 0.18);
1648
+ }
1649
+ .input.is-invalid {
1650
+ box-shadow: 0 0 0 1px var(--danger);
1651
+ }
1652
+ .input::placeholder {
1653
+ color: var(--text-3);
1654
+ }
1655
+ .input:disabled {
1656
+ background: var(--bg-2);
1657
+ color: var(--text-3);
1658
+ }
1659
+ .textarea {
1660
+ height: auto;
1661
+ padding: 8px 12px;
1662
+ resize: vertical;
1663
+ min-height: 72px;
1664
+ }
1665
+ .select {
1666
+ appearance: none;
1667
+ padding-right: 32px;
1668
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23687385' d='M3.47 5.97a.75.75 0 0 1 1.06 0L8 9.44l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06Z'/%3E%3C/svg%3E");
1669
+ background-repeat: no-repeat;
1670
+ background-position: right 10px center;
1671
+ background-size: 16px;
1672
+ }
1673
+ .amount-input {
1674
+ display: flex;
1675
+ align-items: stretch;
1676
+ }
1677
+ .amount-input .input:first-child {
1678
+ border-radius: var(--radius) 0 0 var(--radius);
1679
+ flex: 1;
1680
+ }
1681
+ .amount-input .select {
1682
+ width: 96px;
1683
+ border-radius: 0 var(--radius) var(--radius) 0;
1684
+ margin-left: -1px;
1685
+ }
1686
+ .amount-input .input:focus {
1687
+ position: relative;
1688
+ z-index: 1;
1689
+ }
1690
+ .check-field,
1691
+ .radio-field {
1692
+ display: flex;
1693
+ gap: 10px;
1694
+ align-items: flex-start;
1695
+ cursor: pointer;
1696
+ }
1697
+ .checkbox,
1698
+ .radio {
1699
+ width: 16px;
1700
+ height: 16px;
1701
+ margin: 2px 0 0;
1702
+ accent-color: var(--brand);
1703
+ flex: none;
1704
+ }
1705
+ .check-label,
1706
+ .radio-label {
1707
+ font-weight: 500;
1708
+ }
1709
+ .check-hint,
1710
+ .radio-description {
1711
+ display: block;
1712
+ color: var(--text-2);
1713
+ font-size: 12px;
1714
+ font-weight: 400;
1715
+ }
1716
+ .radio-group {
1717
+ display: flex;
1718
+ flex-direction: column;
1719
+ gap: 10px;
1720
+ }
1721
+ .radio-labels {
1722
+ display: flex;
1723
+ flex-direction: column;
1724
+ }
1725
+ .form-section-title {
1726
+ font-weight: 600;
1727
+ padding-top: 4px;
1728
+ }
1729
+ .combobox {
1730
+ position: relative;
1731
+ }
1732
+ .combobox-list {
1733
+ position: absolute;
1734
+ top: calc(100% + 4px);
1735
+ left: 0;
1736
+ right: 0;
1737
+ max-height: 240px;
1738
+ overflow-y: auto;
1739
+ padding: 6px;
1740
+ background: var(--bg);
1741
+ border-radius: var(--radius-lg);
1742
+ box-shadow: var(--shadow-2);
1743
+ z-index: 80;
1744
+ }
1745
+ .combobox-option {
1746
+ display: flex;
1747
+ align-items: center;
1748
+ gap: 8px;
1749
+ width: 100%;
1750
+ padding: 6px 10px;
1751
+ border: 0;
1752
+ border-radius: var(--radius);
1753
+ background: transparent;
1754
+ cursor: pointer;
1755
+ text-align: left;
1756
+ }
1757
+ .combobox-option:hover,
1758
+ .combobox-option[aria-selected="true"] {
1759
+ background: var(--bg-hover);
1760
+ }
1761
+ .combobox-option-sub {
1762
+ color: var(--text-2);
1763
+ font-size: 12px;
1764
+ margin-left: auto;
1765
+ }
1766
+ .combobox-empty {
1767
+ padding: 8px 10px;
1768
+ color: var(--text-2);
1769
+ font-size: 12px;
1770
+ }
1771
+ .line-items {
1772
+ border: 1px solid var(--border);
1773
+ border-radius: var(--radius-lg);
1774
+ overflow: hidden;
1775
+ }
1776
+ .line-items .table td,
1777
+ .line-items .table th {
1778
+ padding-left: 12px;
1779
+ padding-right: 12px;
1780
+ }
1781
+ .line-items .table tbody tr {
1782
+ cursor: default;
1783
+ }
1784
+ .line-items .table tbody tr:hover {
1785
+ background: transparent;
1786
+ }
1787
+ .totals {
1788
+ margin-left: auto;
1789
+ width: min(360px, 100%);
1790
+ display: grid;
1791
+ grid-template-columns: 1fr auto;
1792
+ row-gap: 6px;
1793
+ padding: 12px 8px;
1794
+ }
1795
+ .totals .total-label {
1796
+ color: var(--text-2);
1797
+ text-align: right;
1798
+ padding-right: 24px;
1799
+ }
1800
+ .totals .total-strong {
1801
+ font-weight: 600;
1802
+ color: var(--text);
1803
+ }
1804
+ .totals .money {
1805
+ justify-content: flex-end;
1806
+ }
1807
+ .editor {
1808
+ display: grid;
1809
+ grid-template-columns: minmax(0, 1fr) 340px;
1810
+ gap: 32px;
1811
+ align-items: start;
1812
+ }
1813
+ .editor-form {
1814
+ display: flex;
1815
+ flex-direction: column;
1816
+ gap: 16px;
1817
+ }
1818
+ .editor-summary {
1819
+ position: sticky;
1820
+ top: 0;
1821
+ padding: 16px;
1822
+ border-radius: var(--radius-lg);
1823
+ background: var(--bg-2);
1824
+ }
1825
+ .editor-summary .kv {
1826
+ grid-template-columns: 1fr auto;
1827
+ }
1828
+ .editor-summary-title {
1829
+ font-weight: 600;
1830
+ margin-bottom: 12px;
1831
+ }
1832
+ .sticky-footer {
1833
+ display: flex;
1834
+ justify-content: flex-end;
1835
+ gap: 8px;
1836
+ padding-top: 16px;
1837
+ border-top: 1px solid var(--border);
1838
+ margin-top: 8px;
1839
+ }
1840
+ .inline-list {
1841
+ display: flex;
1842
+ flex-direction: column;
1843
+ gap: 8px;
1844
+ }
1845
+ .item-row {
1846
+ display: grid;
1847
+ grid-template-columns: minmax(0, 1fr) 96px 32px;
1848
+ gap: 8px;
1849
+ align-items: center;
1850
+ }
1851
+ .pm-option {
1852
+ display: flex;
1853
+ align-items: center;
1854
+ gap: 10px;
1855
+ padding: 10px 12px;
1856
+ border-radius: var(--radius);
1857
+ box-shadow: 0 0 0 1px var(--border);
1858
+ cursor: pointer;
1859
+ }
1860
+ .pm-option:hover {
1861
+ background: var(--bg-hover);
1862
+ }
1863
+ .pm-option input {
1864
+ accent-color: var(--brand);
1865
+ }
1866
+ .pm-option-note {
1867
+ margin-left: auto;
1868
+ color: var(--text-2);
1869
+ font-size: 12px;
1870
+ }
1871
+ .pm-list {
1872
+ display: flex;
1873
+ flex-direction: column;
1874
+ gap: 8px;
1875
+ }
1876
+ .pm-row {
1877
+ display: flex;
1878
+ align-items: center;
1879
+ gap: 12px;
1880
+ padding: 10px 0;
1881
+ border-bottom: 1px solid var(--border);
1882
+ }
1883
+ .pm-row:last-child {
1884
+ border-bottom: 0;
1885
+ }
1886
+ .pm-row .btn-group {
1887
+ margin-left: auto;
1888
+ }
1889
+ .pm-default {
1890
+ margin-left: 4px;
1891
+ }
1892
+
1893
+ /* ------------------------------------------------------------------------------------------ */
1894
+ /* Home */
1895
+ /* ------------------------------------------------------------------------------------------ */
1896
+
1897
+ .home-grid {
1898
+ display: grid;
1899
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1900
+ gap: 16px;
1901
+ margin-bottom: 24px;
1902
+ }
1903
+ .home-card-title {
1904
+ display: flex;
1905
+ align-items: center;
1906
+ justify-content: space-between;
1907
+ font-weight: 600;
1908
+ }
1909
+ .home-card-title .muted {
1910
+ font-weight: 400;
1911
+ font-size: 12px;
1912
+ }
1913
+ .chart {
1914
+ width: 100%;
1915
+ height: 120px;
1916
+ margin-top: 12px;
1917
+ display: block;
1918
+ }
1919
+ .chart-area {
1920
+ fill: rgba(99, 91, 255, 0.08);
1921
+ }
1922
+ .chart-stroke {
1923
+ fill: none;
1924
+ stroke: var(--brand);
1925
+ stroke-width: 2;
1926
+ stroke-linejoin: round;
1927
+ stroke-linecap: round;
1928
+ }
1929
+ .chart-dot {
1930
+ fill: #ffffff;
1931
+ stroke: var(--brand);
1932
+ stroke-width: 2;
1933
+ }
1934
+ .chart-axis {
1935
+ display: flex;
1936
+ justify-content: space-between;
1937
+ color: var(--text-3);
1938
+ font-size: 11px;
1939
+ margin-top: 4px;
1940
+ }
1941
+ .chart-line {
1942
+ stroke: var(--border-strong);
1943
+ stroke-width: 1;
1944
+ stroke-dasharray: 3 4;
1945
+ }
1946
+ .overview-row {
1947
+ display: grid;
1948
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1949
+ gap: 16px;
1950
+ }
1951
+ @media (max-width: 1100px) {
1952
+ .overview-row {
1953
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1954
+ }
1955
+ }
1956
+ .overview-row .chart {
1957
+ height: 88px;
1958
+ }
1959
+ .stat-row {
1960
+ display: flex;
1961
+ align-items: baseline;
1962
+ gap: 8px;
1963
+ }
1964
+ .stat-delta {
1965
+ color: var(--text-2);
1966
+ font-size: 12px;
1967
+ }
1968
+ .balance-row {
1969
+ display: grid;
1970
+ grid-template-columns: 1fr auto;
1971
+ gap: 8px;
1972
+ padding: 8px 0;
1973
+ border-bottom: 1px solid var(--border);
1974
+ }
1975
+ .balance-row:last-child {
1976
+ border-bottom: 0;
1977
+ }
1978
+ .quick-actions {
1979
+ display: flex;
1980
+ gap: 8px;
1981
+ flex-wrap: wrap;
1982
+ }
1983
+
1984
+ /* ------------------------------------------------------------------------------------------ */
1985
+ /* Toast */
1986
+ /* ------------------------------------------------------------------------------------------ */
1987
+
1988
+ .toast {
1989
+ position: fixed;
1990
+ left: 50%;
1991
+ bottom: 24px;
1992
+ transform: translateX(-50%);
1993
+ z-index: 90;
1994
+ display: inline-flex;
1995
+ align-items: center;
1996
+ gap: 10px;
1997
+ max-width: min(560px, calc(100vw - 32px));
1998
+ padding: 10px 16px;
1999
+ border-radius: var(--radius-lg);
2000
+ background: #30313d;
2001
+ color: #ffffff;
2002
+ box-shadow: var(--shadow-2);
2003
+ }
2004
+ .toast-icon {
2005
+ color: #7ce3a5;
2006
+ }
2007
+ .toast[data-error="true"] .toast-icon {
2008
+ color: #ff8ea8;
2009
+ }
2010
+ .toast-action {
2011
+ color: #b6b1ff;
2012
+ }
2013
+
2014
+ /* ------------------------------------------------------------------------------------------ */
2015
+ /* Developers page */
2016
+ /* ------------------------------------------------------------------------------------------ */
2017
+
2018
+ .code-block {
2019
+ padding: 12px 14px;
2020
+ border-radius: var(--radius-lg);
2021
+ background: #0a2540;
2022
+ color: #cfe3ff;
2023
+ font-family: var(--mono);
2024
+ font-size: 12px;
2025
+ line-height: 18px;
2026
+ white-space: pre;
2027
+ overflow-x: auto;
2028
+ }
2029
+ .route-list code {
2030
+ font-size: 12px;
2031
+ }
2032
+ .method {
2033
+ display: inline-block;
2034
+ width: 56px;
2035
+ font-weight: 600;
2036
+ color: var(--text-2);
2037
+ font-size: 12px;
2038
+ }
2039
+ .method-post {
2040
+ color: var(--success-text);
2041
+ }
2042
+ .method-get {
2043
+ color: var(--info-text);
2044
+ }
2045
+ .method-delete {
2046
+ color: var(--danger-text);
2047
+ }
2048
+
2049
+ /* ------------------------------------------------------------------------------------------ */
2050
+ /* Responsive */
2051
+ /* ------------------------------------------------------------------------------------------ */
2052
+
2053
+ @media (max-width: 1024px) {
2054
+ .page {
2055
+ padding: 20px 24px 40px;
2056
+ }
2057
+ .editor {
2058
+ grid-template-columns: 1fr;
2059
+ }
2060
+ .editor-summary {
2061
+ position: static;
2062
+ }
2063
+ }
2064
+ @media (max-width: 900px) {
2065
+ .sidebar {
2066
+ position: fixed;
2067
+ top: 0;
2068
+ bottom: 0;
2069
+ left: 0;
2070
+ z-index: 40;
2071
+ transform: translateX(-100%);
2072
+ transition: transform 0.2s ease;
2073
+ box-shadow: none;
2074
+ }
2075
+ .app.nav-open .sidebar {
2076
+ transform: translateX(0);
2077
+ box-shadow: var(--shadow-3);
2078
+ }
2079
+ .topbar .topbar-menu {
2080
+ display: inline-flex;
2081
+ }
2082
+ .topbar {
2083
+ padding: 0 12px;
2084
+ gap: 8px;
2085
+ }
2086
+ .topbar-dev,
2087
+ #topbar-help,
2088
+ #topbar-settings {
2089
+ display: none;
2090
+ }
2091
+ .topbar-create {
2092
+ margin-left: 0;
2093
+ }
2094
+ }
2095
+ @media (max-width: 640px) {
2096
+ .page {
2097
+ padding: 16px 16px 40px;
2098
+ }
2099
+ .page-title {
2100
+ font-size: 20px;
2101
+ line-height: 28px;
2102
+ }
2103
+ .page-header {
2104
+ flex-direction: column;
2105
+ align-items: stretch;
2106
+ }
2107
+ .page-actions {
2108
+ justify-content: flex-start;
2109
+ }
2110
+ .detail-title .page-title {
2111
+ font-size: 24px;
2112
+ line-height: 32px;
2113
+ }
2114
+ .meta-item {
2115
+ border-right: 0;
2116
+ min-width: 45%;
2117
+ padding-right: 12px;
2118
+ margin-right: 0;
2119
+ }
2120
+ .kv {
2121
+ grid-template-columns: 1fr;
2122
+ row-gap: 2px;
2123
+ }
2124
+ .kv-label {
2125
+ font-size: 12px;
2126
+ margin-top: 6px;
2127
+ }
2128
+ .stat-tab {
2129
+ min-width: 96px;
2130
+ padding: 10px 12px;
2131
+ }
2132
+ .filters-note {
2133
+ margin-left: 0;
2134
+ width: 100%;
2135
+ }
2136
+ .table-wrap.stack .table thead {
2137
+ display: none;
2138
+ }
2139
+ .table-wrap.stack .table,
2140
+ .table-wrap.stack .table tbody,
2141
+ .table-wrap.stack .table tr,
2142
+ .table-wrap.stack .table td {
2143
+ display: block;
2144
+ width: 100%;
2145
+ }
2146
+ .table-wrap.stack .table tr {
2147
+ padding: 10px 0;
2148
+ border-bottom: 1px solid var(--border);
2149
+ }
2150
+ .table-wrap.stack .table td {
2151
+ border: 0;
2152
+ height: auto;
2153
+ padding: 2px 4px;
2154
+ display: flex;
2155
+ gap: 8px;
2156
+ align-items: center;
2157
+ }
2158
+ .table-wrap.stack .table td[data-label]::before {
2159
+ content: attr(data-label);
2160
+ flex: 0 0 110px;
2161
+ color: var(--text-2);
2162
+ font-size: 12px;
2163
+ }
2164
+ .table-wrap.stack .table td.actions {
2165
+ display: none;
2166
+ }
2167
+ .table-wrap.stack .table td.num {
2168
+ text-align: left;
2169
+ }
2170
+ .table-wrap.stack .table .truncate {
2171
+ max-width: 100%;
2172
+ white-space: normal;
2173
+ }
2174
+ .field-row {
2175
+ grid-template-columns: 1fr;
2176
+ }
2177
+ .modal {
2178
+ width: calc(100vw - 16px);
2179
+ max-height: calc(100vh - 16px);
2180
+ }
2181
+ .modal-form {
2182
+ max-height: calc(100vh - 16px);
2183
+ }
2184
+ .item-row {
2185
+ grid-template-columns: minmax(0, 1fr) 72px 32px;
2186
+ }
2187
+ .overview-row {
2188
+ grid-template-columns: 1fr;
2189
+ }
2190
+ }
2191
+
2192
+ /* ------------------------------------------------------------------------------------------ */
2193
+ /* Home overview controls, detail layout with right rail */
2194
+ /* ------------------------------------------------------------------------------------------ */
2195
+
2196
+ .overview-controls {
2197
+ display: flex;
2198
+ flex-wrap: wrap;
2199
+ align-items: center;
2200
+ gap: 8px;
2201
+ margin-bottom: 16px;
2202
+ }
2203
+ .overview-controls .muted {
2204
+ font-size: 12px;
2205
+ }
2206
+ .card-footer {
2207
+ gap: 12px;
2208
+ display: flex;
2209
+ justify-content: space-between;
2210
+ align-items: center;
2211
+ margin: 12px -16px -16px;
2212
+ padding: 10px 16px;
2213
+ border-top: 1px solid var(--border);
2214
+ font-size: 12px;
2215
+ color: var(--text-2);
2216
+ }
2217
+ .card-footer .link {
2218
+ font-weight: 500;
2219
+ }
2220
+ .today-grid {
2221
+ display: grid;
2222
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
2223
+ gap: 16px;
2224
+ margin-bottom: 32px;
2225
+ }
2226
+ .today-side {
2227
+ display: grid;
2228
+ gap: 16px;
2229
+ align-content: start;
2230
+ }
2231
+ .today-main .chart {
2232
+ height: 160px;
2233
+ }
2234
+ .today-stats {
2235
+ display: flex;
2236
+ gap: 40px;
2237
+ flex-wrap: wrap;
2238
+ }
2239
+ .today-stat-label {
2240
+ font-size: 13px;
2241
+ color: var(--text-2);
2242
+ font-weight: 500;
2243
+ }
2244
+ .today-stat-value {
2245
+ font-size: 20px;
2246
+ line-height: 28px;
2247
+ font-weight: 600;
2248
+ font-variant-numeric: tabular-nums;
2249
+ }
2250
+ .today-stat-value.muted {
2251
+ font-size: 16px;
2252
+ font-weight: 500;
2253
+ }
2254
+ .detail-layout {
2255
+ display: grid;
2256
+ grid-template-columns: minmax(0, 1fr) 300px;
2257
+ gap: 40px;
2258
+ align-items: start;
2259
+ }
2260
+ .detail-rail .section-title {
2261
+ font-size: 16px;
2262
+ }
2263
+ .kv-stacked {
2264
+ grid-template-columns: 1fr !important;
2265
+ row-gap: 2px;
2266
+ }
2267
+ .kv-stacked .kv-label {
2268
+ font-size: 12px;
2269
+ margin-top: 10px;
2270
+ }
2271
+ .kv-stacked .kv-label:first-child {
2272
+ margin-top: 0;
2273
+ }
2274
+ @media (max-width: 1100px) {
2275
+ .detail-layout,
2276
+ .today-grid {
2277
+ grid-template-columns: 1fr;
2278
+ }
2279
+ }
2280
+ @media (max-width: 900px) {
2281
+ #topbar-apps {
2282
+ display: none;
2283
+ }
2284
+ .sandbox-text {
2285
+ display: none;
2286
+ }
2287
+ .sandbox-banner {
2288
+ justify-content: space-between;
2289
+ }
2290
+ }
2291
+ @media (max-width: 640px) {
2292
+ .list-tools {
2293
+ margin-left: 0;
2294
+ width: 100%;
2295
+ }
2296
+ }
2297
+ .btn-reset {
2298
+ display: inline-flex;
2299
+ align-items: center;
2300
+ justify-content: center;
2301
+ padding: 2px;
2302
+ border: 0;
2303
+ border-radius: 4px;
2304
+ background: transparent;
2305
+ cursor: pointer;
2306
+ }
2307
+ .btn-reset:hover {
2308
+ background: var(--bg-active);
2309
+ }
2310
+ .today-main .chart-dot {
2311
+ display: none;
2312
+ }
2313
+ .kv-stacked .kv-value {
2314
+ margin: 0;
2315
+ }
2316
+ .chip-input input,
2317
+ .chip-input input:focus {
2318
+ height: 24px;
2319
+ padding: 0;
2320
+ border: 0;
2321
+ box-shadow: none;
2322
+ background: transparent;
2323
+ }
2324
+ @media (max-width: 640px) {
2325
+ .sandbox-account {
2326
+ display: none;
2327
+ }
2328
+ .sandbox-banner {
2329
+ padding: 6px 12px;
2330
+ }
2331
+ }
2332
+
2333
+ /* ------------------------------------------------------------------------------------------ */
2334
+ /* Not-simulated overview widgets and segment cards */
2335
+ /* ------------------------------------------------------------------------------------------ */
2336
+ .card-not-simulated {
2337
+ border: 0;
2338
+ display: flex;
2339
+ flex-direction: column;
2340
+ align-items: stretch;
2341
+ text-align: left;
2342
+ font: inherit;
2343
+ color: inherit;
2344
+ cursor: pointer;
2345
+ min-height: 120px;
2346
+ }
2347
+ .card-not-simulated:hover {
2348
+ background: var(--bg-hover);
2349
+ }
2350
+ .card-placeholder {
2351
+ flex: 1;
2352
+ display: flex;
2353
+ align-items: center;
2354
+ justify-content: center;
2355
+ gap: 8px;
2356
+ color: var(--text-3, var(--text-2));
2357
+ font-size: 13px;
2358
+ border: 1px dashed var(--border);
2359
+ border-radius: var(--radius-lg);
2360
+ margin-top: 12px;
2361
+ padding: 16px;
2362
+ }
2363
+ .stat-tab.is-not-simulated .stat-tab-count {
2364
+ color: var(--text-3, var(--text-2));
2365
+ }
2366
+ .overview-row .stat-big {
2367
+ font-size: 20px;
2368
+ line-height: 28px;
2369
+ }
2370
+
2371
+ /* --- Sidebar collapse control and collapsed rail (UI fidelity pass 3) --- */
2372
+ .topbar-spacer {
2373
+ flex: 1;
2374
+ }
2375
+ .topbar .topbar-search {
2376
+ display: none;
2377
+ }
2378
+ .sidebar-bottom {
2379
+ display: flex;
2380
+ flex-direction: column;
2381
+ gap: 2px;
2382
+ flex: none;
2383
+ }
2384
+ .sidebar-collapse {
2385
+ display: flex;
2386
+ align-items: center;
2387
+ gap: 10px;
2388
+ width: 100%;
2389
+ padding: 6px 8px;
2390
+ border: 0;
2391
+ border-radius: var(--radius);
2392
+ background: transparent;
2393
+ color: var(--text-2);
2394
+ font: inherit;
2395
+ cursor: pointer;
2396
+ text-align: left;
2397
+ }
2398
+ .sidebar-collapse:hover {
2399
+ background: var(--bg-hover);
2400
+ color: var(--text);
2401
+ }
2402
+ .sidebar-collapse .sidenav-icon {
2403
+ flex: none;
2404
+ }
2405
+
2406
+ @media (min-width: 901px) {
2407
+ .app.sidebar-collapsed {
2408
+ --sidebar-width: 60px;
2409
+ }
2410
+ .app.sidebar-collapsed .sidebar {
2411
+ padding-left: 8px;
2412
+ padding-right: 8px;
2413
+ overflow: visible;
2414
+ }
2415
+ .app.sidebar-collapsed .account-name,
2416
+ .app.sidebar-collapsed .account-chevron,
2417
+ .app.sidebar-collapsed .sidenav-caret,
2418
+ .app.sidebar-collapsed .sidenav-heading,
2419
+ .app.sidebar-collapsed .shortcut-pin,
2420
+ .app.sidebar-collapsed .sidenav-sublist,
2421
+ .app.sidebar-collapsed .search-kbd,
2422
+ .app.sidebar-collapsed .search input,
2423
+ .app.sidebar-collapsed .sidebar-collapse-label,
2424
+ .app.sidebar-collapsed .sidenav-item > span:not(.sidenav-icon):not(.sidenav-caret) {
2425
+ display: none;
2426
+ }
2427
+ .app.sidebar-collapsed .account-switcher,
2428
+ .app.sidebar-collapsed .sidenav-item,
2429
+ .app.sidebar-collapsed .sidebar-collapse,
2430
+ .app.sidebar-collapsed .search {
2431
+ justify-content: center;
2432
+ padding-left: 0;
2433
+ padding-right: 0;
2434
+ gap: 0;
2435
+ }
2436
+ .app.sidebar-collapsed .search {
2437
+ cursor: pointer;
2438
+ }
2439
+ .app.sidebar-collapsed .search-results {
2440
+ left: 0;
2441
+ width: 420px;
2442
+ }
2443
+ .app.sidebar-collapsed .sidenav-section {
2444
+ margin-top: 10px;
2445
+ padding-top: 10px;
2446
+ border-top: 1px solid var(--border);
2447
+ }
2448
+ }
2449
+
2450
+ /* --- Table row selection (UI fidelity pass 3) --- */
2451
+ .table th.col-select,
2452
+ .table td.col-select {
2453
+ width: 36px;
2454
+ padding-right: 0;
2455
+ vertical-align: middle;
2456
+ }
2457
+ .table .col-select input[type="checkbox"] {
2458
+ width: 14px;
2459
+ height: 14px;
2460
+ margin: 0;
2461
+ accent-color: var(--brand);
2462
+ cursor: pointer;
2463
+ }
2464
+ .table.has-select tbody tr:hover td.col-select,
2465
+ .table.has-select thead td.col-select {
2466
+ background: inherit;
2467
+ }
2468
+ .bulk-bar {
2469
+ position: fixed;
2470
+ bottom: 20px;
2471
+ left: calc(50% + var(--sidebar-width) / 2);
2472
+ transform: translateX(-50%);
2473
+ display: flex;
2474
+ align-items: center;
2475
+ gap: 8px;
2476
+ width: max-content;
2477
+ max-width: calc(100vw - 32px);
2478
+ padding: 8px 12px;
2479
+ border-radius: var(--radius-lg);
2480
+ background: var(--bg);
2481
+ box-shadow: var(--shadow-2);
2482
+ z-index: 30;
2483
+ }
2484
+ .bulk-count {
2485
+ font-weight: 600;
2486
+ padding-right: 4px;
2487
+ }
2488
+ @media (max-width: 640px) {
2489
+ .table.stack th.col-select {
2490
+ display: none;
2491
+ }
2492
+ .table.stack td.col-select {
2493
+ width: auto;
2494
+ }
2495
+ .bulk-bar {
2496
+ flex-wrap: wrap;
2497
+ left: 16px;
2498
+ right: 16px;
2499
+ transform: none;
2500
+ width: auto;
2501
+ justify-content: center;
2502
+ }
2503
+ }
2504
+
2505
+ @media (max-width: 900px) {
2506
+ .topbar .topbar-search {
2507
+ display: inline-flex;
2508
+ }
2509
+ .sidebar-collapse {
2510
+ display: none;
2511
+ }
2512
+ }