@cardano-slips/flow 0.1.0 → 0.3.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.
Files changed (113) hide show
  1. package/README.md +53 -9
  2. package/dist/address.d.ts +12 -0
  3. package/dist/address.d.ts.map +1 -1
  4. package/dist/address.js +43 -0
  5. package/dist/address.js.map +1 -1
  6. package/dist/balance-error.d.ts +48 -0
  7. package/dist/balance-error.d.ts.map +1 -0
  8. package/dist/balance-error.js +45 -0
  9. package/dist/balance-error.js.map +1 -0
  10. package/dist/balance.d.ts +54 -0
  11. package/dist/balance.d.ts.map +1 -0
  12. package/dist/balance.js +175 -0
  13. package/dist/balance.js.map +1 -0
  14. package/dist/card.css +492 -0
  15. package/dist/card.d.ts +41 -0
  16. package/dist/card.d.ts.map +1 -0
  17. package/dist/card.js +69 -0
  18. package/dist/card.js.map +1 -0
  19. package/dist/cip30.d.ts +10 -0
  20. package/dist/cip30.d.ts.map +1 -1
  21. package/dist/cip30.js +16 -0
  22. package/dist/cip30.js.map +1 -1
  23. package/dist/complete-error.d.ts +57 -0
  24. package/dist/complete-error.d.ts.map +1 -0
  25. package/dist/complete-error.js +52 -0
  26. package/dist/complete-error.js.map +1 -0
  27. package/dist/complete.d.ts +77 -0
  28. package/dist/complete.d.ts.map +1 -0
  29. package/dist/complete.js +182 -0
  30. package/dist/complete.js.map +1 -0
  31. package/dist/derived.d.ts +8 -0
  32. package/dist/derived.d.ts.map +1 -0
  33. package/dist/derived.js +2 -0
  34. package/dist/derived.js.map +1 -0
  35. package/dist/effects-panel.d.ts +37 -0
  36. package/dist/effects-panel.d.ts.map +1 -0
  37. package/dist/effects-panel.js +64 -0
  38. package/dist/effects-panel.js.map +1 -0
  39. package/dist/effects.css +629 -0
  40. package/dist/exchange.d.ts +54 -0
  41. package/dist/exchange.d.ts.map +1 -0
  42. package/dist/exchange.js +136 -0
  43. package/dist/exchange.js.map +1 -0
  44. package/dist/explain.d.ts +39 -0
  45. package/dist/explain.d.ts.map +1 -0
  46. package/dist/explain.js +172 -0
  47. package/dist/explain.js.map +1 -0
  48. package/dist/index.d.ts +34 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +19 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/ledger.d.ts +74 -0
  53. package/dist/ledger.d.ts.map +1 -0
  54. package/dist/ledger.js +402 -0
  55. package/dist/ledger.js.map +1 -0
  56. package/dist/outcome-panel.d.ts +63 -0
  57. package/dist/outcome-panel.d.ts.map +1 -0
  58. package/dist/outcome-panel.js +40 -0
  59. package/dist/outcome-panel.js.map +1 -0
  60. package/dist/parameter-form.d.ts +26 -0
  61. package/dist/parameter-form.d.ts.map +1 -0
  62. package/dist/parameter-form.js +42 -0
  63. package/dist/parameter-form.js.map +1 -0
  64. package/dist/resolve.d.ts +11 -0
  65. package/dist/resolve.d.ts.map +1 -0
  66. package/dist/resolve.js +21 -0
  67. package/dist/resolve.js.map +1 -0
  68. package/dist/sign-error.d.ts +62 -0
  69. package/dist/sign-error.d.ts.map +1 -0
  70. package/dist/sign-error.js +42 -0
  71. package/dist/sign-error.js.map +1 -0
  72. package/dist/sign.d.ts +38 -0
  73. package/dist/sign.d.ts.map +1 -0
  74. package/dist/sign.js +79 -0
  75. package/dist/sign.js.map +1 -0
  76. package/dist/slip-card.d.ts +55 -0
  77. package/dist/slip-card.d.ts.map +1 -0
  78. package/dist/slip-card.js +89 -0
  79. package/dist/slip-card.js.map +1 -0
  80. package/dist/tokens.css +97 -123
  81. package/dist/utxo.d.ts +16 -0
  82. package/dist/utxo.d.ts.map +1 -0
  83. package/dist/utxo.js +51 -0
  84. package/dist/utxo.js.map +1 -0
  85. package/dist/witness.d.ts +23 -0
  86. package/dist/witness.d.ts.map +1 -0
  87. package/dist/witness.js +101 -0
  88. package/dist/witness.js.map +1 -0
  89. package/package.json +13 -6
  90. package/src/address.ts +53 -0
  91. package/src/balance-error.ts +77 -0
  92. package/src/balance.ts +285 -0
  93. package/src/card.css +492 -0
  94. package/src/card.ts +86 -0
  95. package/src/cip30.ts +19 -0
  96. package/src/complete-error.ts +95 -0
  97. package/src/complete.ts +307 -0
  98. package/src/derived.ts +8 -0
  99. package/src/effects-panel.tsx +386 -0
  100. package/src/effects.css +629 -0
  101. package/src/exchange.ts +212 -0
  102. package/src/explain.ts +211 -0
  103. package/src/index.ts +64 -3
  104. package/src/ledger.ts +503 -0
  105. package/src/outcome-panel.tsx +263 -0
  106. package/src/parameter-form.tsx +138 -0
  107. package/src/resolve.ts +40 -0
  108. package/src/sign-error.ts +89 -0
  109. package/src/sign.ts +118 -0
  110. package/src/slip-card.tsx +244 -0
  111. package/src/tokens.css +97 -123
  112. package/src/utxo.ts +70 -0
  113. package/src/witness.ts +132 -0
@@ -0,0 +1,629 @@
1
+ /*
2
+ * The effects panel and the mismatch block, drawn from `4 · Anatomy` to
3
+ * `6 · Preview states` on the design sheet. This is chrome, not the card:
4
+ * `13 · Chrome rules` fixes it wherever the page is hosted, because a
5
+ * publisher who can restyle the surface that judges them undermines the
6
+ * verdict. Every value is a token from `tokens.css`.
7
+ */
8
+
9
+ .slip-panel {
10
+ box-sizing: border-box;
11
+ container-type: inline-size;
12
+
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: var(--space-20);
16
+
17
+ width: 100%;
18
+ max-width: 520px;
19
+ margin: 0;
20
+ padding: var(--space-24);
21
+
22
+ background: var(--vault);
23
+ border: 1px solid var(--vault-border);
24
+ border-radius: var(--radius-card);
25
+ color: var(--vault-ink);
26
+
27
+ /* `5 · Entering the preview`: the surface rises from the button edge, and the title never moves. */
28
+ animation: slip-panel-wipe 220ms ease-out;
29
+ }
30
+
31
+ .slip-panel[data-blocked] {
32
+ border-color: var(--vault-bad-line);
33
+ }
34
+
35
+ .slip-panel *,
36
+ .slip-panel *::before,
37
+ .slip-panel *::after {
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ .slip-panel__claim {
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: var(--space-8);
45
+ }
46
+
47
+ .slip-panel__kicker {
48
+ margin: 0;
49
+ color: var(--vault-muted);
50
+ font: var(--type-kicker);
51
+ letter-spacing: var(--type-kicker-tracking);
52
+ text-transform: uppercase;
53
+ }
54
+
55
+ .slip-panel__kicker[data-tone="bad"] {
56
+ color: var(--vault-bad);
57
+ }
58
+
59
+ .slip-panel__kicker[data-tone="warn"] {
60
+ color: var(--vault-warn);
61
+ }
62
+
63
+ .slip-panel__title {
64
+ margin: 0;
65
+ color: var(--vault-ink);
66
+ font: var(--type-preview-title);
67
+ text-wrap: pretty;
68
+ }
69
+
70
+ .slip-panel__lead {
71
+ margin: 0;
72
+ color: var(--vault-muted);
73
+ font: var(--type-row);
74
+ }
75
+
76
+ /* A host, unmarked. The verified tick belongs to the identity chip, which is not drawn here. */
77
+ .slip-panel__origin {
78
+ align-self: flex-start;
79
+ display: inline-flex;
80
+ align-items: center;
81
+ height: 24px;
82
+ padding: 0 var(--space-8);
83
+ border: 1px solid var(--vault-border);
84
+ border-radius: var(--radius-chip);
85
+ background: var(--vault-surface);
86
+ color: var(--vault-ink);
87
+ font: var(--type-technical);
88
+ }
89
+
90
+ .slip-panel__headline {
91
+ display: flex;
92
+ gap: 28px;
93
+ align-items: flex-start;
94
+ }
95
+
96
+ .slip-panel__figure {
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: var(--space-4);
100
+ min-width: 0;
101
+ }
102
+
103
+ .slip-panel__figure-amount {
104
+ color: var(--vault-ink);
105
+ font: var(--type-headline);
106
+ overflow-wrap: anywhere;
107
+ }
108
+
109
+ .slip-panel__figure-amount[data-tone="gained"] {
110
+ color: var(--vault-pos);
111
+ }
112
+
113
+ .slip-panel__figure-amount[data-tone="held"] {
114
+ color: var(--vault-warn);
115
+ }
116
+
117
+ .slip-panel__figure-amount[data-tone="stated"] {
118
+ color: var(--vault-muted);
119
+ }
120
+
121
+ .slip-panel__rule {
122
+ width: 1px;
123
+ align-self: stretch;
124
+ background: var(--vault-border);
125
+ }
126
+
127
+ .slip-panel__note {
128
+ margin: 0;
129
+ color: var(--vault-muted);
130
+ font: var(--type-note);
131
+ }
132
+
133
+ /* The ledger: one row per effect, amounts in a single right-hand column. */
134
+ .slip-panel__ledger {
135
+ display: flex;
136
+ flex-direction: column;
137
+ padding: 0 var(--space-16);
138
+ border: 1px solid var(--vault-border);
139
+ border-radius: var(--radius-control);
140
+ }
141
+
142
+ .slip-panel__row {
143
+ display: grid;
144
+ grid-template-columns: minmax(0, 1fr) auto;
145
+ gap: var(--space-8) var(--space-16);
146
+ align-items: baseline;
147
+ padding: 14px 0;
148
+ }
149
+
150
+ .slip-panel__row + .slip-panel__row {
151
+ border-top: 1px solid var(--vault-border);
152
+ }
153
+
154
+ .slip-panel__row-name {
155
+ display: flex;
156
+ flex-direction: column;
157
+ gap: 2px;
158
+ min-width: 0;
159
+ }
160
+
161
+ .slip-panel__row-label {
162
+ display: flex;
163
+ flex-wrap: wrap;
164
+ align-items: center;
165
+ gap: var(--space-8);
166
+ }
167
+
168
+ .slip-panel__label {
169
+ color: var(--vault-muted);
170
+ font: var(--type-row);
171
+ }
172
+
173
+ .slip-panel__row[data-mark] .slip-panel__label {
174
+ color: var(--vault-ink);
175
+ }
176
+
177
+ .slip-panel__detail {
178
+ margin: 0;
179
+ color: var(--vault-muted);
180
+ font: var(--type-technical);
181
+ overflow-wrap: anywhere;
182
+ }
183
+
184
+ .slip-panel__amounts {
185
+ display: flex;
186
+ flex-direction: column;
187
+ align-items: flex-end;
188
+ gap: var(--space-4);
189
+ }
190
+
191
+ .slip-panel__amount {
192
+ color: var(--vault-ink);
193
+ font: var(--type-amount);
194
+ white-space: nowrap;
195
+ }
196
+
197
+ .slip-panel__amount[data-tone="gained"] {
198
+ color: var(--vault-pos);
199
+ }
200
+
201
+ .slip-panel__amount[data-tone="fee"],
202
+ .slip-panel__amount[data-tone="held"] {
203
+ color: var(--vault-warn);
204
+ }
205
+
206
+ .slip-panel__amount[data-tone="stated"] {
207
+ color: var(--vault-muted);
208
+ }
209
+
210
+ /* The one row that is not in the claim is the only thing the block colours. */
211
+ .slip-panel__row[data-mark] .slip-panel__amount {
212
+ color: var(--vault-bad);
213
+ }
214
+
215
+ .slip-panel__identifier {
216
+ color: var(--vault-ink);
217
+ font: var(--type-technical);
218
+ white-space: nowrap;
219
+ }
220
+
221
+ .slip-panel__row > .slip-panel__note {
222
+ grid-column: 1 / -1;
223
+ padding-left: 10px;
224
+ border-left: 2px solid var(--vault-warn-line);
225
+ }
226
+
227
+ .slip-panel__chip {
228
+ display: inline-flex;
229
+ align-items: center;
230
+ height: 20px;
231
+ padding: 0 var(--space-8);
232
+ border-radius: var(--radius-chip);
233
+ font: var(--type-chip);
234
+ letter-spacing: 0.02em;
235
+ text-transform: uppercase;
236
+ }
237
+
238
+ .slip-panel__chip[data-chip="refundable"] {
239
+ border: 1px solid var(--vault-warn-line);
240
+ background: var(--vault-warn-tint);
241
+ color: var(--vault-warn);
242
+ }
243
+
244
+ .slip-panel__chip[data-chip="as-stated"] {
245
+ background: var(--vault-surface);
246
+ color: var(--vault-muted);
247
+ }
248
+
249
+ .slip-panel__chip[data-chip="mark"] {
250
+ background: var(--vault-bad-chip);
251
+ color: var(--vault-bad);
252
+ }
253
+
254
+ /* `h · Long ledger`: groups, each with its own header. */
255
+ .slip-panel__groups {
256
+ display: flex;
257
+ flex-direction: column;
258
+ gap: var(--space-12);
259
+ }
260
+
261
+ .slip-panel__group {
262
+ display: flex;
263
+ flex-direction: column;
264
+ gap: 6px;
265
+ }
266
+
267
+ .slip-panel__group-name {
268
+ margin: 0;
269
+ color: var(--vault-muted);
270
+ font: var(--type-kicker);
271
+ letter-spacing: 0.1em;
272
+ text-transform: uppercase;
273
+ }
274
+
275
+ .slip-panel__group > .slip-panel__group-name {
276
+ cursor: default;
277
+ }
278
+
279
+ .slip-panel__group > summary.slip-panel__group-name {
280
+ cursor: pointer;
281
+ }
282
+
283
+ .slip-panel__expiry {
284
+ display: flex;
285
+ justify-content: space-between;
286
+ align-items: center;
287
+ gap: var(--space-16);
288
+ }
289
+
290
+ .slip-panel__clock {
291
+ color: var(--vault-muted);
292
+ font: var(--type-countdown);
293
+ }
294
+
295
+ /* `f · Expiring`: the countdown takes the headline's place and the warning colour. */
296
+ .slip-panel__expiring {
297
+ display: flex;
298
+ flex-direction: column;
299
+ gap: 10px;
300
+ padding: 14px var(--space-16);
301
+ border: 1px solid var(--vault-warn-line);
302
+ border-radius: var(--radius-control);
303
+ background: var(--vault-warn-tint);
304
+ }
305
+
306
+ .slip-panel__expiring-head {
307
+ display: flex;
308
+ justify-content: space-between;
309
+ align-items: baseline;
310
+ gap: var(--space-16);
311
+ color: var(--vault-warn);
312
+ font: var(--type-note);
313
+ }
314
+
315
+ .slip-panel__expiring-clock {
316
+ color: var(--vault-warn);
317
+ font: var(--type-numeral);
318
+ }
319
+
320
+ .slip-panel__bar {
321
+ height: 4px;
322
+ overflow: hidden;
323
+ border-radius: 2px;
324
+ background: var(--vault-border);
325
+ }
326
+
327
+ .slip-panel__bar-fill {
328
+ display: block;
329
+ height: 4px;
330
+ border-radius: 2px;
331
+ background: var(--vault-warn);
332
+ transition: width 1s linear;
333
+ }
334
+
335
+ /* `g · Expired`: the same action at half strength, so the rebuild is the only live thing. */
336
+ .slip-panel__stale {
337
+ opacity: 0.45;
338
+ }
339
+
340
+ .slip-panel__verdict {
341
+ display: flex;
342
+ gap: var(--space-8);
343
+ align-items: flex-start;
344
+ margin: 0;
345
+ padding-top: var(--space-16);
346
+ border-top: 1px solid var(--vault-border);
347
+ color: var(--vault-muted);
348
+ font: var(--type-note);
349
+ }
350
+
351
+ .slip-panel__tick {
352
+ color: var(--vault-pos);
353
+ }
354
+
355
+ .slip-panel__buttons {
356
+ display: flex;
357
+ gap: 10px;
358
+ align-items: center;
359
+ }
360
+
361
+ .slip-panel__button {
362
+ height: 48px;
363
+ padding: 0 var(--space-24);
364
+ border: 1px solid var(--vault-border);
365
+ border-radius: var(--radius-control);
366
+ background: transparent;
367
+ color: var(--vault-ink);
368
+ font: var(--type-button);
369
+ letter-spacing: var(--type-button-tracking);
370
+ white-space: nowrap;
371
+ cursor: pointer;
372
+ transition:
373
+ background-color 180ms ease-out,
374
+ border-color 180ms ease-out,
375
+ color 180ms ease-out;
376
+ }
377
+
378
+ .slip-panel__button:focus-visible,
379
+ .slip-panel__raw-toggle:focus-visible,
380
+ .slip-panel__group > summary:focus-visible {
381
+ outline: 2px solid var(--accent-on-slate);
382
+ outline-offset: 2px;
383
+ }
384
+
385
+ .slip-panel__button[data-kind="cancel"] {
386
+ flex: 0 0 auto;
387
+ border-color: var(--vault-bad);
388
+ color: var(--vault-bad);
389
+ }
390
+
391
+ .slip-panel__button[data-kind="primary"] {
392
+ flex: 1;
393
+ min-width: 0;
394
+ border-color: var(--accent-on-slate);
395
+ color: var(--accent-on-slate);
396
+ }
397
+
398
+ .slip-panel__button[data-kind="close"] {
399
+ width: 100%;
400
+ }
401
+
402
+ .slip-panel__button[data-kind="close"]:hover,
403
+ .slip-panel__button[data-kind="quiet"]:hover {
404
+ background: var(--vault-surface);
405
+ }
406
+
407
+ .slip-panel__button[data-kind="quiet"] {
408
+ height: 36px;
409
+ padding: 0 var(--space-12);
410
+ border: none;
411
+ color: var(--vault-muted);
412
+ font: var(--type-label);
413
+ }
414
+
415
+ /* `e · Mismatch`: the claim and the transaction side by side, and the way out below. */
416
+ .slip-panel__compare {
417
+ display: grid;
418
+ grid-template-columns: 1fr 1fr;
419
+ gap: var(--space-12);
420
+ }
421
+
422
+ .slip-panel__side {
423
+ display: flex;
424
+ flex-direction: column;
425
+ gap: var(--space-8);
426
+ min-width: 0;
427
+ padding: var(--space-16);
428
+ border: 1px solid var(--vault-border);
429
+ border-radius: var(--radius-control);
430
+ }
431
+
432
+ .slip-panel__side[data-tone="bad"] {
433
+ border-color: var(--vault-bad-line);
434
+ background: var(--vault-bad-tint);
435
+ }
436
+
437
+ .slip-panel__claimed {
438
+ margin: 0;
439
+ color: var(--vault-ink);
440
+ font: var(--type-row);
441
+ }
442
+
443
+ .slip-panel__evidence {
444
+ display: flex;
445
+ flex-direction: column;
446
+ gap: var(--space-4);
447
+ }
448
+
449
+ .slip-panel__evidence-figure {
450
+ margin: 0;
451
+ color: var(--vault-ink);
452
+ font: var(--type-preview-title);
453
+ overflow-wrap: anywhere;
454
+ }
455
+
456
+ .slip-panel__exits {
457
+ display: flex;
458
+ flex-direction: column;
459
+ gap: 10px;
460
+ padding-top: var(--space-16);
461
+ border-top: 1px solid var(--vault-border);
462
+ }
463
+
464
+ .slip-panel__quiet {
465
+ display: flex;
466
+ justify-content: space-between;
467
+ align-items: center;
468
+ gap: var(--space-12);
469
+ }
470
+
471
+ /* `6 · Raw detail`: collapsed, below the decision. */
472
+ .slip-panel__raw {
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: var(--space-12);
476
+ padding-top: 14px;
477
+ border-top: 1px solid var(--vault-border);
478
+ }
479
+
480
+ .slip-panel__raw-toggle {
481
+ display: flex;
482
+ align-items: center;
483
+ gap: var(--space-8);
484
+ align-self: flex-start;
485
+ padding: 0;
486
+ border: none;
487
+ background: transparent;
488
+ color: var(--vault-muted);
489
+ font: var(--type-label);
490
+ cursor: pointer;
491
+ }
492
+
493
+ .slip-panel__raw-lines {
494
+ margin: 0;
495
+ padding: var(--space-16);
496
+ border-radius: var(--radius-control);
497
+ background: var(--vault-surface);
498
+ color: var(--vault-muted);
499
+ font: var(--type-technical);
500
+ white-space: pre-wrap;
501
+ overflow-wrap: anywhere;
502
+ }
503
+
504
+ /* `10 · Signing and outcomes`: the controls give way to the wallet, the steps, or the node's reason. */
505
+ .slip-panel__wallet {
506
+ display: flex;
507
+ gap: var(--space-12);
508
+ align-items: center;
509
+ padding: 14px 16px;
510
+ border: 1px solid var(--vault-border);
511
+ border-radius: var(--radius-control);
512
+ }
513
+
514
+ .slip-panel__wallet-words {
515
+ display: flex;
516
+ flex-direction: column;
517
+ gap: 2px;
518
+ font: var(--type-row);
519
+ color: var(--vault-ink);
520
+ }
521
+
522
+ .slip-panel__spin {
523
+ width: 16px;
524
+ height: 16px;
525
+ flex: none;
526
+ border-radius: 50%;
527
+ border: 2px solid var(--vault-border);
528
+ border-top-color: var(--vault-muted);
529
+ animation: slip-panel-spin 900ms linear infinite;
530
+ }
531
+
532
+ .slip-panel__steps {
533
+ display: flex;
534
+ flex-direction: column;
535
+ gap: var(--space-8);
536
+ margin: 0;
537
+ padding: 0;
538
+ list-style: none;
539
+ }
540
+
541
+ .slip-panel__step {
542
+ display: flex;
543
+ gap: var(--space-12);
544
+ align-items: center;
545
+ font: var(--type-row);
546
+ color: var(--vault-ink);
547
+ }
548
+
549
+ .slip-panel__reason {
550
+ margin: 0;
551
+ padding: 16px;
552
+ border: 1px solid var(--vault-border);
553
+ border-radius: var(--radius-control);
554
+ font: var(--type-technical);
555
+ color: var(--vault-muted);
556
+ white-space: pre-wrap;
557
+ overflow-wrap: anywhere;
558
+ }
559
+
560
+ .slip-panel__transaction {
561
+ display: flex;
562
+ flex-direction: column;
563
+ gap: var(--space-4);
564
+ padding: 12px 16px;
565
+ border: 1px solid var(--vault-border);
566
+ border-radius: var(--radius-control);
567
+ }
568
+
569
+ .slip-panel__transaction-id {
570
+ font: var(--type-technical);
571
+ color: var(--vault-ink);
572
+ overflow-wrap: anywhere;
573
+ }
574
+
575
+ @keyframes slip-panel-spin {
576
+ to {
577
+ transform: rotate(360deg);
578
+ }
579
+ }
580
+
581
+ @keyframes slip-panel-wipe {
582
+ from {
583
+ clip-path: inset(100% 0 0 0 round var(--radius-card));
584
+ }
585
+ to {
586
+ clip-path: inset(0 0 0 0 round var(--radius-card));
587
+ }
588
+ }
589
+
590
+ @keyframes slip-panel-fade {
591
+ from {
592
+ opacity: 0;
593
+ }
594
+ to {
595
+ opacity: 1;
596
+ }
597
+ }
598
+
599
+ /* The sheet swaps the wipe for a short cross-fade rather than dropping motion altogether. */
600
+ @media (prefers-reduced-motion: reduce) {
601
+ .slip-panel {
602
+ animation: slip-panel-fade 120ms ease-out;
603
+ }
604
+
605
+ .slip-panel__bar-fill {
606
+ transition: none;
607
+ }
608
+
609
+ /* Still, but not hidden: the words beside it already say something is happening. */
610
+ .slip-panel__spin {
611
+ animation: none;
612
+ border-top-color: var(--vault-border);
613
+ }
614
+ }
615
+
616
+ @container (max-width: 440px) {
617
+ .slip-panel__compare {
618
+ grid-template-columns: 1fr;
619
+ }
620
+
621
+ .slip-panel__headline {
622
+ flex-direction: column;
623
+ gap: var(--space-12);
624
+ }
625
+
626
+ .slip-panel__rule {
627
+ display: none;
628
+ }
629
+ }