robo-automation-test-kit 1.0.0__py3-none-any.whl

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 (26) hide show
  1. robo_automation_test_kit/__init__.py +8 -0
  2. robo_automation_test_kit/hookspec.py +36 -0
  3. robo_automation_test_kit/plugin.py +867 -0
  4. robo_automation_test_kit/templates/email_report/email_template.html +0 -0
  5. robo_automation_test_kit/templates/html_report/components/category-chart.html +148 -0
  6. robo_automation_test_kit/templates/html_report/components/center-chart.html +97 -0
  7. robo_automation_test_kit/templates/html_report/components/phase-chart.html +148 -0
  8. robo_automation_test_kit/templates/html_report/components/results-table.html +240 -0
  9. robo_automation_test_kit/templates/html_report/components/status-center-chart.html +148 -0
  10. robo_automation_test_kit/templates/html_report/components/summary-chart.html +94 -0
  11. robo_automation_test_kit/templates/html_report/html_template.html +62 -0
  12. robo_automation_test_kit/templates/html_report/scripts/css/material-icons.css +20 -0
  13. robo_automation_test_kit/templates/html_report/scripts/css/report.css +714 -0
  14. robo_automation_test_kit/templates/html_report/scripts/css/robo-fonts.css +24 -0
  15. robo_automation_test_kit/templates/html_report/scripts/js/chart.js +14 -0
  16. robo_automation_test_kit/templates/html_report/scripts/js/report.js +319 -0
  17. robo_automation_test_kit/utils/RoboHelper.py +420 -0
  18. robo_automation_test_kit/utils/__init__.py +19 -0
  19. robo_automation_test_kit/utils/reports/EmailReportUtils.py +0 -0
  20. robo_automation_test_kit/utils/reports/HtmlReportUtils.py +154 -0
  21. robo_automation_test_kit/utils/reports/__init__.py +3 -0
  22. robo_automation_test_kit-1.0.0.dist-info/METADATA +132 -0
  23. robo_automation_test_kit-1.0.0.dist-info/RECORD +26 -0
  24. robo_automation_test_kit-1.0.0.dist-info/WHEEL +4 -0
  25. robo_automation_test_kit-1.0.0.dist-info/entry_points.txt +3 -0
  26. robo_automation_test_kit-1.0.0.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,714 @@
1
+ /* Status color coding for results table */
2
+ .status-passed {
3
+ color: var(--success) !important;
4
+ font-weight: 600;
5
+ }
6
+ .status-failed {
7
+ color: var(--error) !important;
8
+ font-weight: 600;
9
+ }
10
+ .status-skipped {
11
+ color: var(--warning) !important;
12
+ font-weight: 600;
13
+ }
14
+ /* Material Theme Colors */
15
+ :root {
16
+ --primary: #1976d2;
17
+ --primary-light: #63a4ff;
18
+ --primary-dark: #004ba0;
19
+ --secondary: #388e3c;
20
+ --secondary-light: #6abf69;
21
+ --secondary-dark: #00600f;
22
+ --error: #d32f2f;
23
+ --warning: #fbc02d;
24
+ --info: #0288d1;
25
+ --success: #388e3c;
26
+ --background: #ffffff;
27
+ --surface: #ffffff;
28
+ --text-primary: #212121;
29
+ --text-secondary: #757575;
30
+ --divider: #e0e0e0;
31
+ }
32
+
33
+ body {
34
+ background: var(--background);
35
+ color: var(--text-primary);
36
+ font-family: 'Roboto', Arial, sans-serif;
37
+ margin: 0;
38
+ padding: 0;
39
+ }
40
+
41
+ .dashboard-container {
42
+ background: var(--surface);
43
+ border-radius: 12px;
44
+ box-shadow: 0 2px 8px rgba(33, 150, 243, 0.08);
45
+ padding: 24px;
46
+ margin: 16px auto;
47
+ max-width: 98vw;
48
+ }
49
+
50
+ .dashboard-title {
51
+ color: var(--primary-dark);
52
+ font-size: 2.2em;
53
+ font-weight: 700;
54
+ margin-bottom: 18px;
55
+ letter-spacing: 1px;
56
+ }
57
+
58
+ .chart-container {
59
+ background: var(--surface);
60
+ border-radius: 10px;
61
+ box-shadow: 0 1px 4px rgba(33, 150, 243, 0.07);
62
+ padding: 12px 8px 8px 8px;
63
+ margin-bottom: 18px;
64
+ }
65
+
66
+ .execution-summary {
67
+ margin-bottom: 16px;
68
+ font-size: 1.1em;
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 8px;
72
+ flex-wrap: nowrap;
73
+ width: 100%;
74
+ background: var(--surface);
75
+ border-radius: 8px;
76
+ box-shadow: 0 1px 4px rgba(33, 150, 243, 0.07);
77
+ padding: 8px 12px;
78
+ }
79
+ .execution-label {
80
+ margin-right: 8px;
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 6px;
84
+ white-space: nowrap;
85
+ color: var(--primary-dark);
86
+ font-weight: 500;
87
+ }
88
+ .execution-count {
89
+ font-weight: bold;
90
+ font-size: 1.15em;
91
+ }
92
+ .filter-input {
93
+ height: 28px;
94
+ font-size: 1em;
95
+ padding: 2px 8px;
96
+ border-radius: 4px;
97
+ border: 1px solid var(--divider);
98
+ margin-left: 8px;
99
+ min-width: 180px;
100
+ flex-shrink: 0;
101
+ background: var(--surface);
102
+ color: var(--text-primary);
103
+ transition: border-color 0.2s;
104
+ }
105
+ .filter-input:focus {
106
+ border-color: var(--primary);
107
+ outline: none;
108
+ }
109
+
110
+ /* Table styles */
111
+ .results-table {
112
+ width: 100%;
113
+ border-collapse: collapse;
114
+ background: var(--surface);
115
+ border-radius: 8px;
116
+ box-shadow: 0 1px 4px rgba(33, 150, 243, 0.07);
117
+ overflow: hidden;
118
+ }
119
+ .results-table th {
120
+ background: var(--primary-light);
121
+ color: var(--surface);
122
+ font-weight: 600;
123
+ padding: 10px 6px;
124
+ border-bottom: 2px solid var(--primary);
125
+ }
126
+ .results-table td {
127
+ padding: 8px 6px;
128
+ border-bottom: 1px solid var(--divider);
129
+ color: var(--text-primary);
130
+ }
131
+ .results-table tr:nth-child(even) {
132
+ background: var(--background);
133
+ }
134
+ .results-table tr:hover {
135
+ background: var(--primary-light);
136
+ color: var(--surface);
137
+ }
138
+ .status-filter:checked + label {
139
+ color: var(--success);
140
+ font-weight: 600;
141
+ }
142
+ .status-filter + label {
143
+ color: var(--text-secondary);
144
+ font-weight: 500;
145
+ margin-right: 10px;
146
+ cursor: pointer;
147
+ transition: color 0.2s;
148
+ }
149
+ .status-filter:checked + label.passed {
150
+ color: var(--success);
151
+ }
152
+ .status-filter:checked + label.failed {
153
+ color: var(--error);
154
+ }
155
+ .status-filter:checked + label.skipped {
156
+ color: var(--warning);
157
+ }
158
+
159
+ /* Chart legend colors */
160
+ .legend-passed {
161
+ color: var(--success);
162
+ }
163
+ .legend-failed {
164
+ color: var(--error);
165
+ }
166
+ .legend-skipped {
167
+ color: var(--warning);
168
+ }
169
+
170
+ /* Footer styling */
171
+ .report-footer {
172
+ color: var(--text-secondary);
173
+ font-style: italic;
174
+ font-size: 0.95em;
175
+ margin-top: 16px;
176
+ text-align: center;
177
+ background: var(--background);
178
+ padding: 16px 24px;
179
+ }
180
+
181
+ /* Align env-table header and cell background with results-table header */
182
+ .env-table th,
183
+ .env-table td {
184
+ background: #dff9fb;
185
+ }
186
+
187
+ /* Filter and status checkboxes for results table */
188
+ #statusFilterContainer {
189
+ margin-bottom: 10px;
190
+ }
191
+
192
+ .status-filter-label {
193
+ margin-right: 12px;
194
+ font-size: 1em;
195
+ font-weight: 500;
196
+ cursor: pointer;
197
+ }
198
+
199
+ #resultsTableFilter {
200
+ padding: 6px 12px;
201
+ width: 300px;
202
+ font-size: 1em;
203
+ border: 1px solid #bbb;
204
+ border-radius: 4px;
205
+ margin-left: 8px;
206
+ }
207
+
208
+ /* Material style for Test Results header */
209
+ .results-title.material {
210
+ font-size: 1.5rem;
211
+ font-weight: 400;
212
+ color: #1976d2;
213
+ background: none;
214
+ box-shadow: none;
215
+ border-radius: 0;
216
+ padding: 0 0 8px 0;
217
+ margin: 32px 0 8px auto;
218
+ letter-spacing: normal;
219
+ text-align: left;
220
+ text-transform: none;
221
+ display: block;
222
+ width: 100%;
223
+ }
224
+
225
+ /* Layout and title classes externalized from html_template.html */
226
+ .report-title {
227
+ font-size: 2em;
228
+ font-weight: bold;
229
+ color: #1976d2;
230
+ display: inline-block;
231
+ }
232
+
233
+ .dashboard-header {
234
+ width: 100%;
235
+ text-align: center;
236
+ margin-bottom: 18px;
237
+ }
238
+
239
+ .env-table-wrapper {
240
+ display: flex;
241
+ flex-direction: row;
242
+ align-items: flex-end;
243
+ gap: 32px;
244
+ margin-bottom: 24px;
245
+ }
246
+
247
+ .env-table-align {
248
+ flex: none;
249
+ align-self: flex-end;
250
+ }
251
+
252
+ .charts-row {
253
+ display: flex;
254
+ flex-direction: row;
255
+ gap: 32px;
256
+ align-items: flex-end;
257
+ margin: 24px 0 24px 0;
258
+ justify-content: center;
259
+ }
260
+
261
+ .chart-container {
262
+ flex: 1 1 360px;
263
+ min-width: 288px;
264
+ max-width: 379px;
265
+ display: flex;
266
+ flex-direction: column;
267
+ align-items: center;
268
+ }
269
+
270
+ /* Status color classes for table rows */
271
+ .status-passed {
272
+ color: #27ae60;
273
+ font-weight: bold;
274
+ }
275
+
276
+ .status-failed {
277
+ color: #e74c3c;
278
+ font-weight: bold;
279
+ }
280
+
281
+ .status-skipped {
282
+ color: #f1c40f;
283
+ font-weight: bold;
284
+ }
285
+
286
+ .status-rerun {
287
+ color: #00b894;
288
+ font-weight: bold;
289
+ }
290
+
291
+ /* Sortable table header with right-aligned SVG sort icon */
292
+ .results-table th.sortable {
293
+ position: relative;
294
+ cursor: pointer;
295
+ padding-right: 32px;
296
+ }
297
+
298
+ .results-table th.sortable::after {
299
+ content: '';
300
+ position: absolute;
301
+ right: 12px;
302
+ top: 50%;
303
+ transform: translateY(-50%);
304
+ width: 16px;
305
+ height: 16px;
306
+ background-repeat: no-repeat;
307
+ background-size: 16px 16px;
308
+ opacity: 0.6;
309
+ transition: opacity 0.2s;
310
+ background-image: url('data:image/svg+xml;utf8,<svg fill="%23222f3e" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 11l-4-5h8z"/></svg>');
311
+ /* Default: down arrow */
312
+ }
313
+
314
+ .results-table th.sortable.sorted-asc::after {
315
+ background-image: url('data:image/svg+xml;utf8,<svg fill="%231976d2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 11l-4-5h8z"/></svg>');
316
+ /* Up arrow - pointing upward */
317
+ opacity: 1;
318
+ }
319
+
320
+ .results-table th.sortable.sorted-desc::after {
321
+ background-image: url('data:image/svg+xml;utf8,<svg fill="%231976d2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 5l4 5H4z"/></svg>');
322
+ /* Down arrow - pointing downward */
323
+ opacity: 1;
324
+ }
325
+
326
+ .results-table th.sortable:hover::after {
327
+ opacity: 1;
328
+ }
329
+
330
+ /* Externalized styles for pytest HTML report */
331
+ .results-table tbody tr:hover td {
332
+ background: #d1eaff !important;
333
+ cursor: pointer;
334
+ }
335
+
336
+ .results-table {
337
+ width: 100%;
338
+ border-collapse: collapse;
339
+ margin-bottom: 18px;
340
+ border: 2px solid #1976d2;
341
+ border-radius: 6px;
342
+ overflow: hidden;
343
+ box-shadow: 0 2px 8px rgba(25, 118, 210, 0.08);
344
+ }
345
+
346
+ .results-table th,
347
+ .results-table td {
348
+ border-bottom: 1px solid #e1e1e1;
349
+ border-right: 1px solid #e1e1e1;
350
+ padding: 8px 14px;
351
+ text-align: left;
352
+ font-size: 1em;
353
+ }
354
+
355
+ .results-table th:last-child,
356
+ .results-table td:last-child {
357
+ border-right: none;
358
+ }
359
+
360
+ .results-table tr:last-child td {
361
+ border-bottom: none;
362
+ }
363
+
364
+ .results-table th {
365
+ background: #dff9fb;
366
+ color: #222f3e;
367
+ font-weight: 600;
368
+ }
369
+
370
+ .results-table tr:nth-child(even) td {
371
+ background: #f8f9fa;
372
+ }
373
+
374
+ .results-table tr td.status-PASSED {
375
+ color: #27ae60;
376
+ font-weight: bold;
377
+ }
378
+
379
+ .results-table tr td.status-RERUN {
380
+ color: #00b894;
381
+ font-weight: bold;
382
+ }
383
+
384
+ .results-table td.error-log {
385
+ color: #e74c3c;
386
+ font-size: 0.98em;
387
+ }
388
+
389
+ :root {
390
+ --md-blue: #2196F3;
391
+ --md-dark-blue: #1976D2;
392
+ --md-grey: #F5F5F5;
393
+ --md-blue-200: #90CAF9;
394
+ --md-blue-100: #BBDEFB;
395
+ }
396
+
397
+ .env-table {
398
+ border-collapse: separate;
399
+ border-spacing: 0;
400
+ overflow: hidden;
401
+ width: 100%;
402
+ min-width: 420px;
403
+ background: #bbdefb;
404
+ margin: 0;
405
+ box-shadow: 0 2px 8px rgba(33, 150, 243, 0.10);
406
+ border: 1px solid #90CAF9;
407
+ }
408
+
409
+ .env-table td {
410
+ background: #bbdefb;
411
+ color: #222f3e;
412
+ padding: 10px 16px;
413
+ border-bottom: 2px solid #fff;
414
+ border-right: 2px solid #fff;
415
+ font-size: 1.08em;
416
+ }
417
+
418
+ .env-table tr td:last-child {
419
+ border-right: none;
420
+ }
421
+
422
+ .env-table tr:last-child td {
423
+ border-bottom: none;
424
+ }
425
+
426
+ .env-table tr td:first-child {
427
+ font-weight: 500;
428
+ }
429
+
430
+ .env-table tbody tr:hover td {
431
+ background: #d1eaff !important;
432
+ cursor: pointer;
433
+ }
434
+
435
+ .error-modal {
436
+ display: none;
437
+ position: fixed;
438
+ z-index: 1000;
439
+ left: 0;
440
+ top: 0;
441
+ width: 100vw;
442
+ height: 100vh;
443
+ overflow: auto;
444
+ background-color: rgba(0, 0, 0, 0.3);
445
+ }
446
+
447
+ .error-modal-content {
448
+ background: #fff;
449
+ margin: 40px auto;
450
+ border-radius: 12px;
451
+ width: 700px;
452
+ max-width: 98vw;
453
+ box-shadow: 0 2px 16px #b2bec3;
454
+ position: relative;
455
+ overflow: hidden;
456
+ padding: 0;
457
+ transition: width 0.2s, height 0.2s, margin 0.2s, border-radius 0.2s;
458
+ }
459
+
460
+ .error-modal-content.fullscreen {
461
+ position: fixed !important;
462
+ top: 20px !important;
463
+ left: 20px !important;
464
+ right: 20px !important;
465
+ bottom: 20px !important;
466
+ width: auto !important;
467
+ height: auto !important;
468
+ max-width: none !important;
469
+ max-height: none !important;
470
+ margin: 0 !important;
471
+ border-radius: 16px !important;
472
+ border: 3px solid #3498db !important;
473
+ box-sizing: border-box !important;
474
+ background: #fff !important;
475
+ overflow: auto;
476
+ z-index: 9999;
477
+ }
478
+
479
+ .error-modal-header {
480
+ background: #e3f0fc;
481
+ border-bottom: 2px solid #3498db;
482
+ padding: 18px 32px 12px 32px;
483
+ color: #1565c0;
484
+ font-size: 1.3em;
485
+ font-weight: bold;
486
+ letter-spacing: 0.5px;
487
+ display: flex;
488
+ align-items: center;
489
+ justify-content: space-between;
490
+ }
491
+
492
+ .error-modal-title {
493
+ font-size: 1.25em;
494
+ font-weight: bold;
495
+ color: #1565c0;
496
+ font-family: 'Segoe UI', Arial, sans-serif;
497
+ margin: 0;
498
+ }
499
+
500
+ .error-modal-controls {
501
+ display: flex;
502
+ align-items: center;
503
+ gap: 10px;
504
+ }
505
+
506
+ .error-modal-btn {
507
+ font-size: 20px;
508
+ color: #1976d2;
509
+ background: none;
510
+ border: none;
511
+ cursor: pointer;
512
+ padding: 4px;
513
+ border-radius: 50%;
514
+ display: inline-flex;
515
+ align-items: center;
516
+ justify-content: center;
517
+ height: 32px;
518
+ width: 32px;
519
+ box-sizing: border-box;
520
+ transition: color 0.2s, background 0.2s;
521
+ }
522
+
523
+ .modal-header-icon.error-modal-btn:hover {
524
+ background: #ffebee !important;
525
+ color: #c62828 !important;
526
+ }
527
+
528
+ #errorModalBody {
529
+ padding: 24px 32px 32px 32px;
530
+ font-size: 1em;
531
+ color: #222f3e;
532
+ background: #fff;
533
+ min-height: 60px;
534
+ text-align: left;
535
+ }
536
+
537
+ .error-message {
538
+ background: #fff;
539
+ border-radius: 8px;
540
+ padding: 24px 32px;
541
+ margin: 0 auto;
542
+ display: inline-block;
543
+ min-width: 60%;
544
+ max-width: 100%;
545
+ font-family: 'Fira Mono', 'Consolas', 'Menlo', 'Monaco', monospace;
546
+ font-size: 1em;
547
+ color: #c0392b;
548
+ white-space: pre-wrap;
549
+ }
550
+
551
+ .results-table tr.selected td {
552
+ background: #d1eaff !important;
553
+ }
554
+
555
+ .report-title {
556
+ font-size: 2em;
557
+ font-weight: bold;
558
+ color: #1976d2;
559
+ display: inline-block;
560
+ }
561
+
562
+ .dashboard-header {
563
+ width: 100%;
564
+ text-align: center;
565
+ margin-bottom: 18px;
566
+ }
567
+
568
+ .env-table-wrapper {
569
+ display: flex;
570
+ flex-direction: row;
571
+ align-items: flex-end;
572
+ gap: 32px;
573
+ margin-bottom: 24px;
574
+ }
575
+
576
+ .env-table-align {
577
+ flex: none;
578
+ align-self: flex-end;
579
+ }
580
+
581
+ .charts-row {
582
+ display: flex;
583
+ flex-direction: row;
584
+ gap: 32px;
585
+ align-items: flex-end;
586
+ margin: 24px 0 24px 0;
587
+ justify-content: center;
588
+ }
589
+
590
+ .chart-container {
591
+ flex: 1 1 360px;
592
+ min-width: 288px;
593
+ max-width: 379px;
594
+ display: flex;
595
+ flex-direction: column;
596
+ align-items: center;
597
+ }
598
+
599
+ /* Status color classes for table rows */
600
+ .status-passed {
601
+ color: #27ae60;
602
+ font-weight: bold;
603
+ }
604
+
605
+ .status-failed {
606
+ color: #e74c3c;
607
+ font-weight: bold;
608
+ }
609
+
610
+ .status-skipped {
611
+ color: #f1c40f;
612
+ font-weight: bold;
613
+ }
614
+
615
+ .status-rerun {
616
+ color: #00b894;
617
+ font-weight: bold;
618
+ }
619
+
620
+ .modal-header-icon {
621
+ cursor: pointer;
622
+ vertical-align: middle;
623
+ font-size: 1.5em;
624
+ color: #1976d2;
625
+ background: none;
626
+ border: none;
627
+ outline: none;
628
+ margin-left: 8px;
629
+ margin-right: 0;
630
+ padding: 4px;
631
+ transition: background 0.2s, color 0.2s;
632
+ display: inline-flex;
633
+ align-items: center;
634
+ justify-content: center;
635
+ border-radius: 50%;
636
+ width: 32px;
637
+ height: 32px;
638
+ }
639
+
640
+ .modal-header-icon:hover {
641
+ background: #e3f2fd !important;
642
+ color: #0d47a1 !important;
643
+ }
644
+
645
+ .modal-header-icon:active {
646
+ background: #bbdefb !important;
647
+ }
648
+
649
+ /* Specific styling for Material Icons (expand/minimize) in modal header */
650
+ span.modal-header-icon.material-icons {
651
+ font-size: 20px;
652
+ user-select: none;
653
+ width: 32px;
654
+ height: 32px;
655
+ display: inline-flex;
656
+ align-items: center;
657
+ justify-content: center;
658
+ cursor: pointer;
659
+ border-radius: 50%;
660
+ padding: 4px;
661
+ transition: background 0.2s, color 0.2s;
662
+ color: #1976d2;
663
+ background: none;
664
+ }
665
+
666
+ span.modal-header-icon.material-icons:hover {
667
+ background: #e3f2fd !important;
668
+ color: #0d47a1 !important;
669
+ }
670
+
671
+ span.modal-header-icon.material-icons:active {
672
+ background: #bbdefb !important;
673
+ }
674
+
675
+ /* Maximize icon - green hover */
676
+ #expandIcon:hover {
677
+ background: #e8f5e9 !important;
678
+ color: #2e7d32 !important;
679
+ }
680
+
681
+ #expandIcon:active {
682
+ background: #c8e6c9 !important;
683
+ }
684
+
685
+ /* Minimize icon - orange hover */
686
+ #minimizeIcon:hover {
687
+ background: #fff3e0 !important;
688
+ color: #e65100 !important;
689
+ }
690
+
691
+ #minimizeIcon:active {
692
+ background: #ffe0b2 !important;
693
+ }
694
+
695
+ /* Filter and status checkboxes for results table */
696
+ #statusFilterContainer {
697
+ margin-bottom: 10px;
698
+ }
699
+
700
+ .status-filter-label {
701
+ margin-right: 12px;
702
+ font-size: 1em;
703
+ font-weight: 500;
704
+ cursor: pointer;
705
+ }
706
+
707
+ #resultsTableFilter {
708
+ padding: 6px 12px;
709
+ width: 300px;
710
+ font-size: 1em;
711
+ border: 1px solid #bbb;
712
+ border-radius: 4px;
713
+ margin-left: 8px;
714
+ }
@@ -0,0 +1,24 @@
1
+ @font-face {
2
+ font-family: 'Roboto';
3
+ font-style: normal;
4
+ font-weight: 400;
5
+ font-stretch: normal;
6
+ font-display: swap;
7
+ src: url(https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiA8.ttf) format('truetype');
8
+ }
9
+ @font-face {
10
+ font-family: 'Roboto';
11
+ font-style: normal;
12
+ font-weight: 500;
13
+ font-stretch: normal;
14
+ font-display: swap;
15
+ src: url(https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiA8.ttf) format('truetype');
16
+ }
17
+ @font-face {
18
+ font-family: 'Roboto';
19
+ font-style: normal;
20
+ font-weight: 700;
21
+ font-stretch: normal;
22
+ font-display: swap;
23
+ src: url(https://fonts.gstatic.com/s/roboto/v50/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiA8.ttf) format('truetype');
24
+ }