datajunction-ui 0.0.17 → 0.0.19

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 (34) hide show
  1. package/package.json +1 -1
  2. package/src/app/components/NotificationBell.tsx +223 -0
  3. package/src/app/components/UserMenu.tsx +100 -0
  4. package/src/app/components/__tests__/NotificationBell.test.tsx +302 -0
  5. package/src/app/components/__tests__/UserMenu.test.tsx +241 -0
  6. package/src/app/icons/NotificationIcon.jsx +27 -0
  7. package/src/app/icons/SettingsIcon.jsx +28 -0
  8. package/src/app/index.tsx +12 -0
  9. package/src/app/pages/NamespacePage/NodeModeSelect.jsx +27 -0
  10. package/src/app/pages/NamespacePage/NodeTypeSelect.jsx +1 -1
  11. package/src/app/pages/NamespacePage/__tests__/index.test.jsx +1 -0
  12. package/src/app/pages/NamespacePage/index.jsx +33 -2
  13. package/src/app/pages/NotificationsPage/Loadable.jsx +6 -0
  14. package/src/app/pages/NotificationsPage/__tests__/index.test.jsx +287 -0
  15. package/src/app/pages/NotificationsPage/index.jsx +136 -0
  16. package/src/app/pages/Root/__tests__/index.test.jsx +18 -53
  17. package/src/app/pages/Root/index.tsx +23 -19
  18. package/src/app/pages/SettingsPage/CreateServiceAccountModal.jsx +152 -0
  19. package/src/app/pages/SettingsPage/Loadable.jsx +16 -0
  20. package/src/app/pages/SettingsPage/NotificationSubscriptionsSection.jsx +189 -0
  21. package/src/app/pages/SettingsPage/ProfileSection.jsx +41 -0
  22. package/src/app/pages/SettingsPage/ServiceAccountsSection.jsx +95 -0
  23. package/src/app/pages/SettingsPage/__tests__/CreateServiceAccountModal.test.jsx +318 -0
  24. package/src/app/pages/SettingsPage/__tests__/NotificationSubscriptionsSection.test.jsx +233 -0
  25. package/src/app/pages/SettingsPage/__tests__/ProfileSection.test.jsx +65 -0
  26. package/src/app/pages/SettingsPage/__tests__/ServiceAccountsSection.test.jsx +150 -0
  27. package/src/app/pages/SettingsPage/__tests__/index.test.jsx +184 -0
  28. package/src/app/pages/SettingsPage/index.jsx +148 -0
  29. package/src/app/services/DJService.js +86 -1
  30. package/src/app/utils/__tests__/date.test.js +198 -0
  31. package/src/app/utils/date.js +65 -0
  32. package/src/styles/index.css +1 -1
  33. package/src/styles/nav-bar.css +274 -0
  34. package/src/styles/settings.css +787 -0
@@ -0,0 +1,787 @@
1
+ /* Settings Page Styles */
2
+
3
+ .settings-page {
4
+ min-height: calc(100vh - 80px);
5
+ background-color: #f8f9fa;
6
+ padding: 1.5rem 2rem;
7
+ }
8
+
9
+ .settings-container {
10
+ max-width: 1000px;
11
+ margin: 0 auto;
12
+ }
13
+
14
+ .settings-title {
15
+ font-family: 'Raleway', system-ui;
16
+ font-size: 1.75rem;
17
+ font-weight: 600;
18
+ color: #333;
19
+ margin-bottom: 2rem;
20
+ }
21
+
22
+ .settings-section {
23
+ margin-bottom: 2rem;
24
+ }
25
+
26
+ .settings-section-title {
27
+ font-family: 'Jost', sans-serif;
28
+ font-size: 0.8125rem;
29
+ font-weight: 600;
30
+ text-transform: uppercase;
31
+ letter-spacing: 0.08em;
32
+ color: #555;
33
+ margin-bottom: 1rem;
34
+ padding-bottom: 0.5rem;
35
+ border-bottom: 1px solid #e0e0e0;
36
+ }
37
+
38
+ .settings-card {
39
+ background: white;
40
+ border-radius: 8px;
41
+ padding: 0.4rem 1rem;
42
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
43
+ }
44
+
45
+ /* Profile Section */
46
+ .profile-info {
47
+ display: flex;
48
+ align-items: flex-start;
49
+ gap: 1.5rem;
50
+ margin: 1.5rem 0;
51
+ }
52
+
53
+ .profile-avatar {
54
+ width: 64px;
55
+ height: 64px;
56
+ border-radius: 50%;
57
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
58
+ color: white;
59
+ font-size: 1.25rem;
60
+ font-weight: 600;
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ flex-shrink: 0;
65
+ }
66
+
67
+ .profile-details {
68
+ flex: 1;
69
+ }
70
+
71
+ .profile-field {
72
+ margin-bottom: 1rem;
73
+ }
74
+
75
+ .profile-field:last-child {
76
+ margin-bottom: 0;
77
+ }
78
+
79
+ .profile-field label {
80
+ display: block;
81
+ font-family: 'Jost', sans-serif;
82
+ font-size: 0.75rem;
83
+ font-weight: 600;
84
+ color: #888;
85
+ text-transform: uppercase;
86
+ letter-spacing: 0.08em;
87
+ margin-bottom: 0.25rem;
88
+ }
89
+
90
+ .profile-field span {
91
+ font-size: 1rem;
92
+ color: #333;
93
+ }
94
+
95
+ /* Subscriptions List */
96
+ .subscriptions-list {
97
+ display: flex;
98
+ flex-direction: column;
99
+ }
100
+
101
+ .subscription-item {
102
+ padding: 1rem 0;
103
+ border-bottom: 1px solid #eee;
104
+ }
105
+
106
+ .subscription-item:last-child {
107
+ border-bottom: none;
108
+ }
109
+
110
+ .subscription-header {
111
+ display: flex;
112
+ justify-content: space-between;
113
+ align-items: center;
114
+ margin-bottom: 0.75rem;
115
+ }
116
+
117
+ .subscription-entity {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 0.5rem;
121
+ }
122
+
123
+ .subscription-entity a {
124
+ color: #333;
125
+ font-weight: 500;
126
+ text-decoration: none;
127
+ }
128
+
129
+ .subscription-entity a:hover {
130
+ color: #667eea;
131
+ }
132
+
133
+ .entity-type-badge {
134
+ font-size: 10px;
135
+ padding: 2px 6px;
136
+ background: #e8e8e8;
137
+ color: #666;
138
+ border-radius: 3px;
139
+ text-transform: uppercase;
140
+ }
141
+
142
+ .subscription-actions {
143
+ display: flex;
144
+ gap: 0.5rem;
145
+ }
146
+
147
+ .subscription-activity-types {
148
+ display: flex;
149
+ align-items: flex-start;
150
+ gap: 0.75rem;
151
+ }
152
+
153
+ .activity-types-label {
154
+ font-family: 'Jost', sans-serif;
155
+ font-size: 0.75rem;
156
+ font-weight: 600;
157
+ text-transform: uppercase;
158
+ letter-spacing: 0.08em;
159
+ color: #888;
160
+ min-width: 100px;
161
+ }
162
+
163
+ .activity-types-badges {
164
+ display: flex;
165
+ flex-wrap: wrap;
166
+ gap: 0.35rem;
167
+ }
168
+
169
+ .activity-badge {
170
+ font-size: 11px;
171
+ padding: 2px 8px;
172
+ background: transparent;
173
+ border: 1px solid #ccc;
174
+ color: #666;
175
+ border-radius: 3px;
176
+ }
177
+
178
+ /* Color-coded activity types */
179
+ .activity-badge-create {
180
+ border-color: #28a745;
181
+ color: #28a745;
182
+ }
183
+
184
+ .activity-badge-update {
185
+ border-color: #0088fe;
186
+ color: #0088fe;
187
+ }
188
+
189
+ .activity-badge-delete {
190
+ border-color: #dc3545;
191
+ color: #dc3545;
192
+ }
193
+
194
+ .activity-badge-status_change {
195
+ border-color: #fd7e14;
196
+ color: #fd7e14;
197
+ }
198
+
199
+ .activity-badge-refresh {
200
+ border-color: #6f42c1;
201
+ color: #6f42c1;
202
+ }
203
+
204
+ .activity-badge-tag {
205
+ border-color: #6c757d;
206
+ color: #6c757d;
207
+ }
208
+
209
+ .activity-types-checkboxes {
210
+ display: flex;
211
+ flex-wrap: wrap;
212
+ gap: 0.75rem;
213
+ }
214
+
215
+ .checkbox-label {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 0.35rem;
219
+ font-size: 0.85rem;
220
+ color: #444;
221
+ cursor: pointer;
222
+ }
223
+
224
+ .checkbox-label input[type='checkbox'] {
225
+ cursor: pointer;
226
+ }
227
+
228
+ /* Buttons */
229
+ /* Icon buttons */
230
+ .btn-icon {
231
+ width: 28px;
232
+ height: 28px;
233
+ padding: 0;
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: center;
237
+ border-radius: 4px;
238
+ cursor: pointer;
239
+ background: transparent;
240
+ border: none;
241
+ }
242
+
243
+ .btn-icon svg {
244
+ width: 18px;
245
+ height: 18px;
246
+ }
247
+
248
+ .btn-edit {
249
+ color: #aaa;
250
+ transition: color 0.15s ease, background-color 0.15s ease;
251
+ }
252
+
253
+ .btn-edit:hover {
254
+ color: #28a745;
255
+ background-color: #e8f5e9;
256
+ }
257
+
258
+ .btn-save {
259
+ padding: 0.35rem 0.75rem;
260
+ font-size: 0.8rem;
261
+ color: white;
262
+ background: #28a745;
263
+ border: 1px solid #28a745;
264
+ border-radius: 4px;
265
+ cursor: pointer;
266
+ transition: all 0.15s ease;
267
+ }
268
+
269
+ .btn-save:hover {
270
+ background: #218838;
271
+ border-color: #218838;
272
+ }
273
+
274
+ .btn-save:disabled {
275
+ opacity: 0.6;
276
+ cursor: not-allowed;
277
+ }
278
+
279
+ .btn-cancel {
280
+ padding: 0.35rem 0.75rem;
281
+ font-size: 0.8rem;
282
+ color: #666;
283
+ background: transparent;
284
+ border: 1px solid #ccc;
285
+ border-radius: 4px;
286
+ cursor: pointer;
287
+ transition: all 0.15s ease;
288
+ }
289
+
290
+ .btn-cancel:hover {
291
+ background: #f5f5f5;
292
+ }
293
+
294
+ .btn-cancel:disabled {
295
+ opacity: 0.6;
296
+ cursor: not-allowed;
297
+ }
298
+
299
+ .btn-unsubscribe {
300
+ color: #aaa;
301
+ font-size: 25px;
302
+ font-weight: 400;
303
+ line-height: 1;
304
+ transition: color 0.15s ease, background-color 0.15s ease;
305
+ }
306
+
307
+ .btn-unsubscribe:hover {
308
+ color: #dc3545;
309
+ background-color: #ffeaea;
310
+ }
311
+
312
+ .text-muted {
313
+ color: #999;
314
+ font-style: italic;
315
+ }
316
+
317
+ /* Status badges */
318
+ .status-badge {
319
+ font-size: 9px;
320
+ padding: 2px 5px;
321
+ border-radius: 3px;
322
+ font-weight: 600;
323
+ text-transform: uppercase;
324
+ }
325
+
326
+ .status-invalid {
327
+ background-color: #ffeaea;
328
+ color: #dc3545;
329
+ }
330
+
331
+ /* Empty State */
332
+ .empty-state {
333
+ color: #888;
334
+ font-size: 0.95rem;
335
+ text-align: center;
336
+ padding: 1rem 0;
337
+ }
338
+
339
+ /* Service Accounts Section */
340
+ .section-description {
341
+ color: #666;
342
+ font-size: 0.9rem;
343
+ margin-bottom: 1.5rem;
344
+ line-height: 1.5;
345
+ }
346
+
347
+ .credentials-banner {
348
+ background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%);
349
+ border: 1px solid #4caf50;
350
+ border-radius: 8px;
351
+ padding: 1rem;
352
+ margin-bottom: 1.5rem;
353
+ }
354
+
355
+ .credentials-header {
356
+ display: flex;
357
+ justify-content: space-between;
358
+ align-items: center;
359
+ margin-bottom: 0.5rem;
360
+ }
361
+
362
+ .credentials-header strong {
363
+ color: #2e7d32;
364
+ }
365
+
366
+ .btn-dismiss {
367
+ background: none;
368
+ border: none;
369
+ font-size: 1.25rem;
370
+ color: #666;
371
+ cursor: pointer;
372
+ padding: 0 0.25rem;
373
+ }
374
+
375
+ .btn-dismiss:hover {
376
+ color: #333;
377
+ }
378
+
379
+ .credentials-warning {
380
+ color: #c62828;
381
+ font-size: 0.85rem;
382
+ font-weight: 500;
383
+ margin-bottom: 1rem;
384
+ }
385
+
386
+ .credentials-grid {
387
+ display: grid;
388
+ gap: 0.75rem;
389
+ }
390
+
391
+ .credential-item {
392
+ display: flex;
393
+ flex-direction: column;
394
+ gap: 0.25rem;
395
+ }
396
+
397
+ .credential-item label {
398
+ font-size: 0.75rem;
399
+ color: #666;
400
+ text-transform: uppercase;
401
+ letter-spacing: 0.5px;
402
+ }
403
+
404
+ .credential-item code {
405
+ background: #fff;
406
+ padding: 0.5rem;
407
+ border-radius: 4px;
408
+ font-family: 'Source Code Pro', monospace;
409
+ font-size: 0.85rem;
410
+ word-break: break-all;
411
+ }
412
+
413
+ .credential-value {
414
+ display: flex;
415
+ align-items: center;
416
+ gap: 0.5rem;
417
+ }
418
+
419
+ .credential-value code {
420
+ flex: 1;
421
+ }
422
+
423
+ .btn-copy {
424
+ background: #fff;
425
+ border: 1px solid #ddd;
426
+ border-radius: 4px;
427
+ padding: 0.25rem 0.5rem;
428
+ cursor: pointer;
429
+ font-size: 0.9rem;
430
+ }
431
+
432
+ .btn-copy:hover {
433
+ background: #f5f5f5;
434
+ }
435
+
436
+ .create-service-account-form {
437
+ display: flex;
438
+ gap: 0.75rem;
439
+ margin-bottom: 1.5rem;
440
+ }
441
+
442
+ .create-service-account-form input {
443
+ flex: 1;
444
+ padding: 0.5rem 0.75rem;
445
+ border: 1px solid #ddd;
446
+ border-radius: 4px;
447
+ font-size: 0.9rem;
448
+ font-family: 'Jost', sans-serif;
449
+ }
450
+
451
+ .create-service-account-form input:focus {
452
+ outline: none;
453
+ border-color: #4caf50;
454
+ }
455
+
456
+ .btn-create {
457
+ background: #4caf50;
458
+ color: white;
459
+ border: none;
460
+ border-radius: 4px;
461
+ padding: 0.5rem 1rem;
462
+ font-size: 0.9rem;
463
+ font-family: 'Jost', sans-serif;
464
+ cursor: pointer;
465
+ white-space: nowrap;
466
+ }
467
+
468
+ .btn-create:hover:not(:disabled) {
469
+ background: #43a047;
470
+ }
471
+
472
+ .btn-create:disabled {
473
+ background: #ccc;
474
+ cursor: not-allowed;
475
+ }
476
+
477
+ .service-accounts-list h4 {
478
+ font-size: 0.9rem;
479
+ color: #666;
480
+ margin-bottom: 0.75rem;
481
+ font-weight: 500;
482
+ }
483
+
484
+ .service-accounts-table {
485
+ width: 100%;
486
+ border-collapse: collapse;
487
+ font-size: 0.9rem;
488
+ }
489
+
490
+ .service-accounts-table th {
491
+ text-align: left;
492
+ padding: 0.5rem;
493
+ border-bottom: 2px solid #eee;
494
+ color: #666;
495
+ font-weight: 500;
496
+ font-size: 0.8rem;
497
+ text-transform: uppercase;
498
+ letter-spacing: 0.5px;
499
+ }
500
+
501
+ .service-accounts-table td {
502
+ padding: 0.75rem 0.5rem;
503
+ border-bottom: 1px solid #eee;
504
+ }
505
+
506
+ .service-accounts-table .client-id {
507
+ background: #f5f5f5;
508
+ padding: 0.25rem 0.5rem;
509
+ border-radius: 3px;
510
+ font-size: 0.8rem;
511
+ }
512
+
513
+ .service-accounts-table .created-date {
514
+ color: #888;
515
+ font-size: 0.85rem;
516
+ }
517
+
518
+ .service-accounts-table .actions-cell {
519
+ width: 40px;
520
+ text-align: right;
521
+ }
522
+
523
+ .btn-delete-account {
524
+ background: none;
525
+ border: 1px solid transparent;
526
+ color: #999;
527
+ cursor: pointer;
528
+ font-size: 1.25rem;
529
+ padding: 0.25rem 0.5rem;
530
+ border-radius: 4px;
531
+ line-height: 1;
532
+ opacity: 0;
533
+ transition: all 0.15s ease;
534
+ }
535
+
536
+ .service-accounts-table tr:hover .btn-delete-account {
537
+ opacity: 1;
538
+ }
539
+
540
+ .btn-delete-account:hover {
541
+ color: #dc3545;
542
+ background: rgba(220, 53, 69, 0.1);
543
+ border-color: rgba(220, 53, 69, 0.2);
544
+ }
545
+
546
+ .section-title-row {
547
+ display: flex;
548
+ justify-content: space-between;
549
+ align-items: center;
550
+ margin-bottom: 0.75rem;
551
+ padding-bottom: 0.5rem;
552
+ border-bottom: 1px solid #e0e0e0;
553
+ }
554
+
555
+ .section-title-row .settings-section-title {
556
+ margin-bottom: 0;
557
+ padding-bottom: 0;
558
+ border-bottom: none;
559
+ }
560
+
561
+ .section-title-row .btn-create {
562
+ padding: 0.375rem 0.75rem;
563
+ font-size: 0.85rem;
564
+ }
565
+
566
+ /* Modal Styles */
567
+ .modal-overlay {
568
+ position: fixed;
569
+ top: 0;
570
+ left: 0;
571
+ right: 0;
572
+ bottom: 0;
573
+ background: rgba(0, 0, 0, 0.5);
574
+ display: flex;
575
+ align-items: center;
576
+ justify-content: center;
577
+ z-index: 1000;
578
+ animation: fadeIn 0.15s ease-out;
579
+ }
580
+
581
+ @keyframes fadeIn {
582
+ from {
583
+ opacity: 0;
584
+ }
585
+ to {
586
+ opacity: 1;
587
+ }
588
+ }
589
+
590
+ .modal-content {
591
+ background: white;
592
+ border-radius: 8px;
593
+ width: 100%;
594
+ max-width: 480px;
595
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15);
596
+ animation: slideIn 0.15s ease-out;
597
+ }
598
+
599
+ @keyframes slideIn {
600
+ from {
601
+ transform: translateY(-20px);
602
+ opacity: 0;
603
+ }
604
+ to {
605
+ transform: translateY(0);
606
+ opacity: 1;
607
+ }
608
+ }
609
+
610
+ .modal-header {
611
+ display: flex;
612
+ justify-content: space-between;
613
+ align-items: center;
614
+ padding: 1rem 1.25rem;
615
+ border-bottom: 1px solid #eee;
616
+ }
617
+
618
+ .modal-header h3 {
619
+ margin: 0;
620
+ font-size: 1.1rem;
621
+ font-weight: 600;
622
+ font-family: 'Jost', sans-serif;
623
+ color: #333;
624
+ }
625
+
626
+ .btn-close-modal {
627
+ background: none;
628
+ border: none;
629
+ font-size: 1.5rem;
630
+ color: #999;
631
+ cursor: pointer;
632
+ padding: 0;
633
+ line-height: 1;
634
+ width: 28px;
635
+ height: 28px;
636
+ display: flex;
637
+ align-items: center;
638
+ justify-content: center;
639
+ border-radius: 4px;
640
+ }
641
+
642
+ .btn-close-modal:hover {
643
+ background: #f5f5f5;
644
+ color: #333;
645
+ }
646
+
647
+ .modal-body {
648
+ padding: 1.25rem;
649
+ }
650
+
651
+ .form-group {
652
+ margin-bottom: 0;
653
+ }
654
+
655
+ .form-group label {
656
+ display: block;
657
+ font-size: 0.85rem;
658
+ font-weight: 500;
659
+ color: #333;
660
+ margin-bottom: 0.5rem;
661
+ }
662
+
663
+ .form-group input {
664
+ width: 100%;
665
+ padding: 0.625rem 0.75rem;
666
+ border: 1px solid #ddd;
667
+ border-radius: 4px;
668
+ font-size: 0.9rem;
669
+ font-family: 'Jost', sans-serif;
670
+ box-sizing: border-box;
671
+ }
672
+
673
+ .form-group input:focus {
674
+ outline: none;
675
+ border-color: #4caf50;
676
+ box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.1);
677
+ }
678
+
679
+ .form-hint {
680
+ display: block;
681
+ font-size: 0.8rem;
682
+ color: #888;
683
+ margin-top: 0.375rem;
684
+ }
685
+
686
+ .modal-actions {
687
+ display: flex;
688
+ justify-content: flex-end;
689
+ gap: 0.75rem;
690
+ padding: 1rem 1.25rem;
691
+ border-top: 1px solid #eee;
692
+ background: #fafafa;
693
+ border-radius: 0 0 8px 8px;
694
+ }
695
+
696
+ .btn-secondary {
697
+ background: white;
698
+ color: #666;
699
+ border: 1px solid #ddd;
700
+ border-radius: 4px;
701
+ padding: 0.5rem 1rem;
702
+ font-size: 0.9rem;
703
+ font-family: 'Jost', sans-serif;
704
+ cursor: pointer;
705
+ }
706
+
707
+ .btn-secondary:hover:not(:disabled) {
708
+ background: #f5f5f5;
709
+ border-color: #ccc;
710
+ }
711
+
712
+ .btn-primary {
713
+ background: #4caf50;
714
+ color: white;
715
+ border: none;
716
+ border-radius: 4px;
717
+ padding: 0.5rem 1rem;
718
+ font-size: 0.9rem;
719
+ font-family: 'Jost', sans-serif;
720
+ cursor: pointer;
721
+ }
722
+
723
+ .btn-primary:hover:not(:disabled) {
724
+ background: #43a047;
725
+ }
726
+
727
+ .btn-primary:disabled,
728
+ .btn-secondary:disabled {
729
+ opacity: 0.6;
730
+ cursor: not-allowed;
731
+ }
732
+
733
+ /* Credentials in Modal */
734
+ .credentials-success {
735
+ display: flex;
736
+ align-items: center;
737
+ gap: 0.5rem;
738
+ margin-bottom: 0.75rem;
739
+ }
740
+
741
+ .credentials-success .success-icon {
742
+ width: 24px;
743
+ height: 24px;
744
+ background: #4caf50;
745
+ color: white;
746
+ border-radius: 50%;
747
+ display: flex;
748
+ align-items: center;
749
+ justify-content: center;
750
+ font-size: 14px;
751
+ font-weight: bold;
752
+ }
753
+
754
+ .credentials-success h4 {
755
+ margin: 0;
756
+ font-size: 1rem;
757
+ color: #2e7d32;
758
+ }
759
+
760
+ .modal-body .credentials-warning {
761
+ background: #fff3e0;
762
+ border: 1px solid #ffb74d;
763
+ border-radius: 4px;
764
+ padding: 0.75rem;
765
+ margin-bottom: 1rem;
766
+ font-size: 0.85rem;
767
+ color: #e65100;
768
+ }
769
+
770
+ .modal-body .credentials-grid {
771
+ background: #f9f9f9;
772
+ border-radius: 4px;
773
+ padding: 1rem;
774
+ }
775
+
776
+ .modal-body .credential-item {
777
+ margin-bottom: 0.75rem;
778
+ }
779
+
780
+ .modal-body .credential-item:last-child {
781
+ margin-bottom: 0;
782
+ }
783
+
784
+ .modal-body .credential-item code {
785
+ background: white;
786
+ border: 1px solid #eee;
787
+ }