md2x 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,875 @@
1
+ <template>
2
+ <div>
3
+ <div id="modal" :class="modalClass">
4
+ <div>
5
+ <h3>Quick Tip</h3>
6
+ <p>
7
+ Press the black button to print. <br />
8
+ Red means ready, green means printing and temporarily disabled.
9
+ </p>
10
+ <button id="okay-button" @click="handleOkayClick">Okay</button>
11
+ </div>
12
+ </div>
13
+
14
+ <div class="printer">
15
+ <div>
16
+ <p>Zee Printer</p>
17
+ <button id="print-button" @click="handlePrintClick">
18
+ <div id="print-icon" :class="printIconClass">
19
+ <div><div></div></div>
20
+ <div></div>
21
+ </div>
22
+ <div id="print-indicator" :class="printIndicatorClass"></div>
23
+ </button>
24
+ </div>
25
+ <div></div>
26
+ <div>
27
+ <div id="receipts-wrapper" ref="receiptsWrapperRef">
28
+ <div id="receipt-wrapper" ref="receiptWrapperRef">
29
+ <div id="receipt-container" :class="{ print: hasPrinted }">
30
+ <div class="receipt">
31
+ <div class="receipt-header">
32
+ <div>
33
+ <p>Payment Successful</p>
34
+ <p>
35
+ <span>11 May 2024</span>
36
+ <span>08:30 PM</span>
37
+ </p>
38
+ </div>
39
+ <div></div>
40
+ </div>
41
+ <div class="receipt-body">
42
+ <div>
43
+ <div>
44
+ <p>1x Jollof Rice & Turkey</p>
45
+ <p><span>₦</span>3,500.00</p>
46
+ </div>
47
+ <div>
48
+ <p>1x Zobo Drink</p>
49
+ <p><span>₦</span>800.00</p>
50
+ </div>
51
+ <div>
52
+ <p>1x Small Chops Pack</p>
53
+ <p><span>₦</span>2,500.00</p>
54
+ </div>
55
+ </div>
56
+ <div>
57
+ <div>
58
+ <p>Subtotal</p>
59
+ <p><span>₦</span>6,800.00</p>
60
+ </div>
61
+ <div>
62
+ <p>VAT (9%)</p>
63
+ <p><span>₦</span>612.00</p>
64
+ </div>
65
+ <div>
66
+ <p>Service Fee</p>
67
+ <p><span>₦</span>2,500.00</p>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ <div class="receipt-footer">
72
+ <div>
73
+ <p>TOTAL</p>
74
+ <p><span>₦</span>7,450.00</p>
75
+ </div>
76
+ <div>
77
+ <div class="emoji">
78
+ <div>
79
+ <span>
80
+ <span><span></span></span>
81
+ <span><span></span></span>
82
+ </span>
83
+ <span><span></span></span>
84
+ </div>
85
+ </div>
86
+ <span>THANK YOU</span>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ <div class="cutout">
91
+ <div><div></div></div>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </template>
100
+
101
+ <script setup>
102
+ import { ref, computed, onMounted } from 'vue'
103
+
104
+ const modalClass = ref('fade-in-animation')
105
+ const isPrinting = ref(false)
106
+ const hasPrinted = ref(false)
107
+ const indicatorState = ref('inactive')
108
+
109
+ const receiptsWrapperRef = ref(null)
110
+ const receiptWrapperRef = ref(null)
111
+
112
+ const printerSound = new Audio('./printer.mp3')
113
+ printerSound.currentTime = 0
114
+
115
+ const printIndicatorClass = computed(() => `${indicatorState.value}-background`)
116
+ const printIconClass = computed(() => `${indicatorState.value}-icon`)
117
+
118
+ const setPrintIndicator = (state) => {
119
+ indicatorState.value = state
120
+ }
121
+
122
+ const handleOkayClick = () => {
123
+ modalClass.value = 'fade-out-animation'
124
+ }
125
+
126
+ const handlePrintClick = () => {
127
+ if (isPrinting.value) return
128
+
129
+ isPrinting.value = true
130
+
131
+ let newReceipt = null
132
+
133
+ printerSound.play()
134
+
135
+ setPrintIndicator('active')
136
+
137
+ if (hasPrinted.value) {
138
+ newReceipt = receiptWrapperRef.value.cloneNode(true)
139
+ receiptsWrapperRef.value.appendChild(newReceipt)
140
+ } else {
141
+ hasPrinted.value = true
142
+ }
143
+
144
+ setTimeout(() => {
145
+ isPrinting.value = false
146
+ printerSound.pause()
147
+ printerSound.currentTime = 0
148
+
149
+ if (newReceipt) {
150
+ newReceipt.classList.add('fade-out')
151
+
152
+ setTimeout(() => {
153
+ newReceipt.remove()
154
+ }, 5000)
155
+ }
156
+
157
+ setPrintIndicator('inactive')
158
+ }, 6500)
159
+ }
160
+
161
+ onMounted(() => {
162
+ setPrintIndicator('inactive')
163
+ })
164
+ </script>
165
+
166
+ <style>
167
+ @import url("https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Pacifico&display=swap");
168
+
169
+ :root {
170
+ --color-white: #fff;
171
+ --color-black: #000;
172
+ --color-red: #ff4444;
173
+ --color-brown: #f0ad22;
174
+ --color-green: #4dd278;
175
+ --color-lemon: #1bd218;
176
+ --color-gold-1: #fbe300;
177
+ --color-gold-2: #eccd00;
178
+ --color-gold-3: #b29300;
179
+ --color-gray-1: #f6f6f6;
180
+ --color-gray-2: #efefef;
181
+ --color-gray-3: #eaeaea;
182
+ --color-gray-4: #e8e8e8;
183
+ --color-gray-5: #e9e9e9;
184
+ --color-gray-6: #e6e2e3;
185
+ --color-gray-7: #d7d7d7;
186
+ --color-gray-8: #cccccc;
187
+ --color-gray-9: #c5c5c5;
188
+ --color-gray-10: #bcbcbc;
189
+ --color-gray-11: #a1a1a1;
190
+ --color-gray-12: #8d8e92;
191
+ --color-gray-13: #e1e1e14d;
192
+ --color-gray-14: #787878cc;
193
+ --color-gray-15: #666669;
194
+ --color-gray-16: #3838384d;
195
+ --color-gray-17: #0000001a;
196
+ --color-gray-18: #000000cc;
197
+ --color-gray-20: #1a1a1a;
198
+ }
199
+
200
+ * {
201
+ margin: 0;
202
+ padding: 0;
203
+ box-sizing: border-box;
204
+ }
205
+
206
+ html,
207
+ body {
208
+ height: 100%;
209
+ }
210
+
211
+ html {
212
+ font-size: max(calc(16 * min(100vw / 600, 100vh / 842)), 0rem);
213
+ }
214
+
215
+ body {
216
+ height: 100%;
217
+ display: flex;
218
+ overflow: hidden;
219
+ position: relative;
220
+ align-items: center;
221
+ justify-content: center;
222
+ background-color: var(--color-gray-5);
223
+ }
224
+
225
+ body::-webkit-scrollbar {
226
+ display: none;
227
+ }
228
+
229
+ p {
230
+ margin-bottom: 0 !important;
231
+ }
232
+
233
+ #modal {
234
+ top: 0;
235
+ left: 0;
236
+ width: 100%;
237
+ height: 100%;
238
+ z-index: 100;
239
+ padding: 20px;
240
+ display: flex;
241
+ position: fixed;
242
+ visibility: hidden;
243
+ align-items: center;
244
+ flex-direction: column;
245
+ justify-content: center;
246
+ backdrop-filter: blur(5px);
247
+ -webkit-backdrop-filter: blur(5px);
248
+ background-color: var(--color-gray-16);
249
+ }
250
+
251
+ #modal > div {
252
+ gap: 25px;
253
+ display: flex;
254
+ position: relative;
255
+ align-items: center;
256
+ border-radius: 10px;
257
+ flex-direction: column;
258
+ justify-content: center;
259
+ font-family: "Geist Mono";
260
+ }
261
+
262
+ #modal > div > h3 {
263
+ font-size: 24px;
264
+ line-height: 20px;
265
+ color: var(--color-black);
266
+ }
267
+
268
+ #modal > div > p {
269
+ font-size: 16px;
270
+ line-height: 30px;
271
+ text-align: center;
272
+ color: var(--color-black);
273
+ }
274
+
275
+ #okay-button {
276
+ border: none;
277
+ cursor: pointer;
278
+ font-size: 16px;
279
+ font-weight: 600;
280
+ margin-top: 5px;
281
+ padding: 15px 30px;
282
+ border-radius: 5px;
283
+ transition: 0.3s ease;
284
+ color: var(--color-white);
285
+ background-color: var(--color-black);
286
+ }
287
+
288
+ #okay-button:hover {
289
+ background-color: #000000cc;
290
+ }
291
+
292
+ .fade-in-animation {
293
+ animation: fade-in 1s ease 1s forwards;
294
+ }
295
+
296
+ .fade-out-animation {
297
+ animation: fade-out 1s ease forwards;
298
+ }
299
+
300
+ .printer {
301
+ display: flex;
302
+ height: 44.25rem;
303
+ width: 32.1875rem;
304
+ position: relative;
305
+ align-items: center;
306
+ flex-direction: column;
307
+ }
308
+
309
+ .printer::after {
310
+ content: "";
311
+ z-index: -2;
312
+ top: -0.625rem;
313
+ left: 0.625rem;
314
+ height: 11.25rem;
315
+ width: 33.4375rem;
316
+ position: absolute;
317
+ filter: blur(1.5rem);
318
+ border-radius: 3.75rem;
319
+ background: var(--color-gray-7);
320
+ background: linear-gradient(
321
+ 180deg,
322
+ var(--color-gray-7) 0%,
323
+ var(--color-gray-14) 70%
324
+ );
325
+ }
326
+
327
+ .printer > div:first-child {
328
+ z-index: 20;
329
+ width: 100%;
330
+ display: flex;
331
+ align-items: end;
332
+ height: 7.4375rem;
333
+ position: relative;
334
+ border-radius: 1.0625rem;
335
+ justify-content: space-between;
336
+ background: var(--color-gray-7);
337
+ padding: 0.625rem 0.7rem 0.7rem 1rem;
338
+ background-color: var(--color-gray-7);
339
+ box-shadow: 0rem 0.125rem 0.03125rem var(--color-gray-11);
340
+ background: linear-gradient(
341
+ 180deg,
342
+ var(--color-gray-7) 0%,
343
+ var(--color-gray-1) 25%,
344
+ var(--color-gray-7) 45%
345
+ );
346
+ }
347
+
348
+ .printer > div:first-child > p {
349
+ font-size: 1.25rem;
350
+ font-family: "Pacifico";
351
+ margin-bottom: -0.09375rem;
352
+ color: var(--color-gray-3);
353
+ text-shadow: -0.07rem -0.07rem 0.1875rem var(--color-gray-13),
354
+ 0.07rem 0.07rem 0.1875rem var(--color-gray-16);
355
+ }
356
+
357
+ #print-button {
358
+ outline: 0;
359
+ border: none;
360
+ display: flex;
361
+ gap: 0.125rem;
362
+ cursor: pointer;
363
+ height: 1.625rem;
364
+ overflow: hidden;
365
+ font-weight: 500;
366
+ position: relative;
367
+ align-items: center;
368
+ justify-content: center;
369
+ border-radius: 1.5625rem;
370
+ padding: 0 0.5625rem 0 0.5625rem;
371
+ border: 0.07rem solid var(--color-gray-4);
372
+ background: linear-gradient(145deg, var(--color-gray-20), var(--color-black));
373
+ box-shadow: 0.375rem 0.375rem 0.75rem var(--color-gray-9),
374
+ -0.375rem -0.375rem 0.75rem var(--color-white);
375
+ }
376
+
377
+ #print-icon {
378
+ display: flex;
379
+ height: 0.875rem;
380
+ width: 0.9375rem;
381
+ position: relative;
382
+ align-items: center;
383
+ justify-content: center;
384
+ }
385
+
386
+ #print-icon::before {
387
+ left: 50%;
388
+ z-index: 3;
389
+ content: "";
390
+ top: -0.15625rem;
391
+ width: 0.15625rem;
392
+ height: 1.3125rem;
393
+ position: absolute;
394
+ border-radius: 0.03125rem;
395
+ animation: grow 0.5s ease forwards;
396
+ transform: rotate(45deg) translateX(-50%);
397
+ }
398
+
399
+ #print-icon > div:first-child {
400
+ height: 100%;
401
+ width: 0.625rem;
402
+ position: absolute;
403
+ border-radius: 0.03125rem;
404
+ transition: background-color 0.5s ease, border 0.5s ease;
405
+ }
406
+
407
+ #print-icon > div:first-child div {
408
+ bottom: 0;
409
+ z-index: 2;
410
+ width: 100%;
411
+ display: flex;
412
+ height: 0.25rem;
413
+ position: absolute;
414
+ justify-content: center;
415
+ background-color: var(--color-black);
416
+ }
417
+
418
+ #print-icon > div:first-child div::before {
419
+ width: 70%;
420
+ z-index: 2;
421
+ content: "";
422
+ height: 0.07rem;
423
+ position: absolute;
424
+ bottom: 0.09375rem;
425
+ border-radius: 0.3125rem;
426
+ transition: background-color 0.5s ease, border 0.5s ease;
427
+ }
428
+
429
+ #print-icon > div:last-child {
430
+ width: 100%;
431
+ position: absolute;
432
+ height: 0.40625rem;
433
+ border-radius: 0.07rem;
434
+ transition: background-color 0.5s ease, border 0.5s ease;
435
+ }
436
+
437
+ #print-icon > div:last-child::after {
438
+ content: "";
439
+ top: 0.09375rem;
440
+ width: 0.1875rem;
441
+ right: 0.15625rem;
442
+ position: absolute;
443
+ height: 0.09375rem;
444
+ border-radius: 0.07rem;
445
+ background-color: var(--color-black);
446
+ }
447
+
448
+ .active-icon#print-icon::before {
449
+ display: block;
450
+ }
451
+
452
+ .active-icon#print-icon > div:first-child {
453
+ border: 0.07rem var(--color-lemon) solid;
454
+ }
455
+
456
+ .active-icon#print-icon > div:first-child div::before,
457
+ .active-icon#print-icon > div:last-child {
458
+ background-color: var(--color-lemon);
459
+ }
460
+
461
+ .active-icon#print-icon::before {
462
+ animation: grow 0.5s ease forwards;
463
+ background: linear-gradient(
464
+ 90deg,
465
+ var(--color-black) 50%,
466
+ var(--color-lemon) 50%
467
+ );
468
+ }
469
+
470
+ .inactive-icon#print-icon::before {
471
+ animation: shrink 0.5s ease forwards;
472
+ background: linear-gradient(
473
+ 90deg,
474
+ var(--color-black) 50%,
475
+ var(--color-red) 50%
476
+ );
477
+ }
478
+
479
+ .inactive-icon#print-icon > div:first-child {
480
+ border: 0.07rem var(--color-red) solid;
481
+ }
482
+
483
+ .inactive-icon#print-icon > div:first-child div::before,
484
+ .inactive-icon#print-icon > div:last-child {
485
+ background-color: var(--color-red);
486
+ }
487
+
488
+ #print-indicator {
489
+ width: 0.5rem;
490
+ height: 0.5rem;
491
+ display: block;
492
+ border-radius: 50%;
493
+ margin-left: 0.3125rem;
494
+ animation: blink 1s infinite;
495
+ transition: background-color 0.5s ease, border 0.5s ease;
496
+ }
497
+
498
+ .active-background {
499
+ background: var(--color-lemon);
500
+ }
501
+
502
+ .inactive-background {
503
+ background: var(--color-red);
504
+ }
505
+
506
+ .printer > div:nth-child(2) {
507
+ z-index: -1;
508
+ display: flex;
509
+ height: 1.5rem;
510
+ width: 32.125rem;
511
+ position: relative;
512
+ margin-top: -0.8125rem;
513
+ justify-content: center;
514
+ background-color: var(--color-gray-10);
515
+ clip-path: polygon(0 0, 100% 0, 99.6% 100%, 0.4% 100%);
516
+ }
517
+
518
+ .printer > div:last-child {
519
+ display: flex;
520
+ height: 0.75rem;
521
+ width: 31.875rem;
522
+ position: relative;
523
+ margin-top: -0.07rem;
524
+ justify-content: center;
525
+ border-radius: 0 0 0.75rem 0.75rem;
526
+ background-color: var(--color-gray-10);
527
+ }
528
+
529
+ .printer > div:last-child > div {
530
+ width: 30.125rem;
531
+ height: 0.6875rem;
532
+ position: absolute;
533
+ bottom: 0.34375rem;
534
+ background: var(--color-black);
535
+ box-shadow: 0rem 0rem 0.3125rem 0.25rem var(--color-gray-8);
536
+ border-radius: 0.375rem 0.375rem 0.625rem 0.625rem / 0.375rem 0.375rem
537
+ 0.9375rem 0.9375rem;
538
+ }
539
+
540
+ #receipt-wrapper {
541
+ width: 100%;
542
+ display: flex;
543
+ top: 0.25rem;
544
+ overflow: hidden;
545
+ position: absolute;
546
+ justify-content: center;
547
+ padding-bottom: 1.25rem;
548
+ transition: opacity 5s linear;
549
+ }
550
+
551
+ .fade-out {
552
+ opacity: 0;
553
+ }
554
+
555
+ #receipt-container {
556
+ width: 91%;
557
+ transform: translateY(-100%);
558
+ }
559
+
560
+ .print {
561
+ animation: print 6.5s linear forwards;
562
+ }
563
+
564
+ .receipt {
565
+ width: 100%;
566
+ font-size: 1rem;
567
+ font-weight: 450;
568
+ position: relative;
569
+ padding: 0.9375rem 0 0;
570
+ margin-bottom: 1.875rem;
571
+ font-family: "Geist Mono";
572
+ background-color: var(--color-white);
573
+ filter: drop-shadow(0 0.25rem 0.3125rem var(--color-gray-17));
574
+ }
575
+
576
+ .receipt-header {
577
+ display: flex;
578
+ align-items: center;
579
+ padding: 1.375rem 1.375rem;
580
+ justify-content: space-between;
581
+ border-bottom: 0.07rem solid var(--color-gray-2);
582
+ }
583
+
584
+ .receipt-header > div:first-child {
585
+ display: flex;
586
+ gap: 0.4375rem;
587
+ flex-direction: column;
588
+ }
589
+
590
+ .receipt-header > div:first-child > p:first-child {
591
+ font-weight: 530;
592
+ font-size: 1.1875rem;
593
+ letter-spacing: -0.009375rem;
594
+ }
595
+
596
+ .receipt-header > div:first-child > p:last-child {
597
+ gap: 1.125rem;
598
+ display: flex;
599
+ color: var(--color-gray-12);
600
+ }
601
+
602
+ .receipt-header > div:last-child {
603
+ width: 3.25rem;
604
+ height: 3.25rem;
605
+ border-radius: 50%;
606
+ background-color: var(--color-green);
607
+ clip-path: polygon(
608
+ 0 0,
609
+ 0 100%,
610
+ 50% 100%,
611
+ 38.38% 80.76%,
612
+ 15.3% 55.76%,
613
+ 26% 44.23%,
614
+ 38.38% 56.5%,
615
+ 71.07% 21.15%,
616
+ 82.61% 32.69%,
617
+ 38.38% 80.76%,
618
+ 50% 100%,
619
+ 3.4375rem 100%,
620
+ 100% 0
621
+ );
622
+ }
623
+
624
+ .receipt-body > div {
625
+ gap: 1.125rem;
626
+ display: flex;
627
+ flex-direction: column;
628
+ padding: 1.375rem 1.375rem;
629
+ color: var(--color-gray-15);
630
+ justify-content: space-between;
631
+ border-bottom: 0.07rem solid var(--color-gray-2);
632
+ }
633
+
634
+ .receipt-footer {
635
+ gap: 3.75rem;
636
+ display: flex;
637
+ flex-direction: column;
638
+ justify-content: space-between;
639
+ padding: 1.375rem 1.375rem 0.9375rem;
640
+ }
641
+
642
+ .receipt-body > div > div,
643
+ .receipt-footer > div {
644
+ display: flex;
645
+ align-items: center;
646
+ justify-content: space-between;
647
+ }
648
+
649
+ .receipt-body > div > div > p:last-child > span,
650
+ .receipt-footer > div > p:last-child > span {
651
+ font-weight: 400;
652
+ }
653
+
654
+ .receipt-footer > div:last-child {
655
+ margin: auto;
656
+ display: flex;
657
+ gap: 0.625rem;
658
+ align-items: center;
659
+ font-size: 1.125rem;
660
+ }
661
+
662
+ .receipt-footer > div > p:last-child {
663
+ font-weight: 600;
664
+ font-size: 1.1875rem;
665
+ }
666
+
667
+ .emoji {
668
+ width: 1.8125rem;
669
+ height: 2.03125rem;
670
+ position: relative;
671
+ }
672
+
673
+ .emoji::after {
674
+ bottom: 0;
675
+ left: 50%;
676
+ width: 80%;
677
+ content: "";
678
+ height: 0.125rem;
679
+ position: absolute;
680
+ border-radius: 50%;
681
+ filter: blur(0.01875rem);
682
+ transform: translateX(-50%);
683
+ background-color: var(--color-gray-6);
684
+ }
685
+
686
+ .emoji > div {
687
+ width: 100%;
688
+ display: block;
689
+ overflow: hidden;
690
+ height: 1.8125rem;
691
+ position: relative;
692
+ border-radius: 50%;
693
+ clip-path: circle();
694
+ background-color: var(--color-gold-2);
695
+ border: 0.07rem var(--color-gold-3) solid;
696
+ }
697
+
698
+ .emoji > div::before {
699
+ content: "";
700
+ width: 100%;
701
+ height: 100%;
702
+ bottom: 0.125rem;
703
+ position: absolute;
704
+ border-radius: 50%;
705
+ background-color: var(--color-gold-1);
706
+ }
707
+
708
+ .emoji > div > span:first-child {
709
+ top: 40%;
710
+ left: 50%;
711
+ width: 100%;
712
+ display: flex;
713
+ height: 0.25rem;
714
+ position: absolute;
715
+ padding: 0 0.1875rem;
716
+ transform: translateX(-50%);
717
+ justify-content: space-between;
718
+ }
719
+
720
+ .emoji > div > span:first-child > span {
721
+ height: 0.25rem;
722
+ width: 0.21875rem;
723
+ position: relative;
724
+ }
725
+
726
+ .emoji > div > span:first-child > span::after {
727
+ left: 50%;
728
+ content: "";
729
+ height: 0.125rem;
730
+ width: 0.21875rem;
731
+ position: absolute;
732
+ bottom: -0.1875rem;
733
+ border-radius: 50%;
734
+ filter: blur(0.03125rem);
735
+ transform: translateX(-50%);
736
+ background-color: var(--color-brown);
737
+ }
738
+
739
+ .emoji > div > span:first-child > span > span {
740
+ width: 100%;
741
+ height: 100%;
742
+ display: block;
743
+ border-radius: 50%;
744
+ border: 0.07rem var(--color-gold-3) solid;
745
+ clip-path: polygon(0 50%, 100% 50%, 100% 100%, 0% 100%);
746
+ }
747
+
748
+ .emoji > div > span:last-child {
749
+ left: 50%;
750
+ width: 0.8125rem;
751
+ height: 0.8125rem;
752
+ bottom: 0.40625rem;
753
+ position: absolute;
754
+ transform: translateX(-50%);
755
+ }
756
+
757
+ .emoji > div > span:last-child::after {
758
+ left: 50%;
759
+ content: "";
760
+ width: 0.5rem;
761
+ top: -0.375rem;
762
+ height: 0.125rem;
763
+ position: absolute;
764
+ border-radius: 50%;
765
+ filter: blur(0.07rem);
766
+ transform: translateX(-50%);
767
+ background-color: var(--color-white);
768
+ }
769
+
770
+ .emoji > div > span:last-child > span {
771
+ left: 50%;
772
+ width: 95%;
773
+ height: 100%;
774
+ border-radius: 50%;
775
+ position: absolute;
776
+ transform: translateX(-50%);
777
+ border: 0.07rem var(--color-gold-3) solid;
778
+ clip-path: polygon(0 85%, 100% 85%, 100% 100%, 0% 100%);
779
+ }
780
+
781
+ .cutout {
782
+ position: relative;
783
+ }
784
+
785
+ .cutout > div {
786
+ width: 100%;
787
+ position: relative;
788
+ margin-top: -0.07rem;
789
+ filter: drop-shadow(0 0.75rem 0.3125rem var(--color-gray-17));
790
+ }
791
+
792
+ .cutout > div > div {
793
+ width: 100%;
794
+ height: 2.5rem;
795
+ overflow-x: hidden;
796
+ transform: translateY(-1.875rem);
797
+ background-color: var(--color-white);
798
+ mask-image: radial-gradient(
799
+ circle at 1.03125rem 2.1875rem,
800
+ transparent 0.875rem,
801
+ var(--color-black) 0.875rem
802
+ );
803
+ mask-repeat: repeat-x;
804
+ mask-position: -0.78125rem 0;
805
+ mask-size: 2.0625rem 2.1875rem;
806
+ -webkit-mask-image: radial-gradient(
807
+ circle at 1.03125rem 2.1875rem,
808
+ transparent 0.875rem,
809
+ var(--color-black) 0.875rem
810
+ );
811
+ -webkit-mask-repeat: repeat-x;
812
+ -webkit-mask-position: -0.78125rem 0;
813
+ -webkit-mask-size: 2.0625rem 2.1875rem;
814
+ }
815
+
816
+ @keyframes fade-in {
817
+ from {
818
+ opacity: 0;
819
+ visibility: hidden;
820
+ }
821
+ to {
822
+ opacity: 1;
823
+ visibility: visible;
824
+ }
825
+ }
826
+
827
+ @keyframes fade-out {
828
+ from {
829
+ opacity: 1;
830
+ visibility: visible;
831
+ }
832
+ to {
833
+ opacity: 0;
834
+ visibility: hidden;
835
+ }
836
+ }
837
+
838
+ @keyframes blink {
839
+ 0%,
840
+ 50% {
841
+ opacity: 1;
842
+ }
843
+ 51%,
844
+ 100% {
845
+ opacity: 0.4;
846
+ }
847
+ }
848
+
849
+ @keyframes print {
850
+ 0% {
851
+ transform: translateY(-100%);
852
+ }
853
+ 100% {
854
+ transform: translateY(0);
855
+ }
856
+ }
857
+
858
+ @keyframes shrink {
859
+ 0% {
860
+ clip-path: polygon(0 100%, 100% 100%, 100% 0, 0 0);
861
+ }
862
+ 100% {
863
+ clip-path: polygon(0 100%, 100% 100%, 100% 100%, 0 100%);
864
+ }
865
+ }
866
+
867
+ @keyframes grow {
868
+ 0% {
869
+ clip-path: polygon(0 100%, 100% 100%, 100% 100%, 0 100%);
870
+ }
871
+ 100% {
872
+ clip-path: polygon(0 100%, 100% 100%, 100% 0, 0 0);
873
+ }
874
+ }
875
+ </style>