@dataengineeringformachinelearning/viking-ui 4.0.1 → 4.0.3

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/README.md +7 -5
  2. package/dist/README.md +7 -5
  3. package/dist/deml-components.css +23 -0
  4. package/dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs +182 -23
  5. package/dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs.map +1 -1
  6. package/dist/package.json +7 -1
  7. package/dist/src/web/card/viking-card-wc.ts +5 -1
  8. package/dist/src/web/core/styles.ts +125 -2
  9. package/dist/src/web/suite-header/viking-suite-header-wc.ts +15 -0
  10. package/dist/types/dataengineeringformachinelearning-viking-ui.d.ts +2 -1
  11. package/dist/viking-components.css +425 -31
  12. package/dist/viking-ui-elements.js +180 -42
  13. package/dist/viking-ui.css +1 -1
  14. package/dist/web-components.js +145 -3
  15. package/package.json +7 -1
  16. package/src/index.ts +1 -1
  17. package/src/lib/auth-panel/auth-panel.ts +9 -9
  18. package/src/lib/button/button.scss +23 -0
  19. package/src/lib/card/card.ts +33 -5
  20. package/src/lib/site-drakkar/site-navbar.ts +14 -4
  21. package/src/styles/_buttons.scss +92 -7
  22. package/src/styles/_layout-enforcement.scss +66 -3
  23. package/src/styles/components/icon-inline.scss +23 -0
  24. package/src/styles/components.scss +276 -9
  25. package/src/styles/static-navbar.scss +43 -4
  26. package/src/styles/surfaces/backend.scss +22 -10
  27. package/src/styles/surfaces/docs-shell.scss +40 -15
  28. package/src/styles/surfaces/docs-showcase.scss +132 -30
  29. package/src/styles/surfaces/marketing-landing.scss +311 -45
  30. package/src/styles/surfaces/swagger-ui.scss +9 -8
  31. package/src/styles/viking-ui.scss +12 -12
  32. package/src/web/card/viking-card-wc.ts +5 -1
  33. package/src/web/core/styles.ts +125 -2
  34. package/src/web/suite-header/viking-suite-header-wc.ts +15 -0
@@ -375,7 +375,7 @@ var VIKING_BUTTON_STYLES = `
375
375
  gap: var(--viking-space-1);
376
376
  min-height: var(--viking-control-height);
377
377
  padding: 0 var(--viking-control-padding-x);
378
- border-radius: var(--viking-radius);
378
+ border-radius: var(--viking-radius-lg);
379
379
  border: 1px solid transparent;
380
380
  cursor: pointer;
381
381
  text-decoration: none;
@@ -384,9 +384,29 @@ var VIKING_BUTTON_STYLES = `
384
384
  min-width: var(--viking-btn-min-width, 120px);
385
385
  white-space: nowrap;
386
386
  position: relative;
387
+ background-clip: padding-box;
388
+ isolation: isolate;
387
389
  user-select: none;
388
390
  -webkit-tap-highlight-color: transparent;
389
391
  box-sizing: border-box;
392
+ overflow: hidden;
393
+ box-shadow: var(--viking-shadow-sm);
394
+ }
395
+
396
+ .viking-btn::before {
397
+ content: "";
398
+ position: absolute;
399
+ inset: 1px 1px auto;
400
+ height: 1px;
401
+ background: linear-gradient(
402
+ 90deg,
403
+ transparent,
404
+ color-mix(in srgb, var(--viking-metallic-100) 45%, transparent),
405
+ transparent
406
+ );
407
+ pointer-events: none;
408
+ opacity: 0.82;
409
+ transition: var(--viking-transition-interactive);
390
410
  }
391
411
 
392
412
  .viking-btn:focus-visible {
@@ -403,6 +423,36 @@ var VIKING_BUTTON_STYLES = `
403
423
  box-shadow: none !important;
404
424
  }
405
425
 
426
+ .viking-btn[aria-busy='true']::before,
427
+ .viking-btn[aria-busy='true'] .viking-btn-label {
428
+ opacity: 0.85;
429
+ transform: translateY(1px);
430
+ }
431
+
432
+ .viking-btn[aria-busy='true'] .viking-btn-spinner {
433
+ opacity: 0.85;
434
+ }
435
+
436
+ .viking-btn::after {
437
+ content: "";
438
+ position: absolute;
439
+ inset: auto 0 0 0;
440
+ height: 1px;
441
+ background: linear-gradient(
442
+ 90deg,
443
+ transparent,
444
+ color-mix(
445
+ in srgb,
446
+ var(--viking-metallic-100) 18%,
447
+ transparent
448
+ ),
449
+ transparent
450
+ );
451
+ pointer-events: none;
452
+ opacity: 0.45;
453
+ transition: var(--viking-transition-interactive);
454
+ }
455
+
406
456
  .viking-btn-sm {
407
457
  min-height: var(--viking-control-height-sm);
408
458
  padding: 0 var(--viking-space-2);
@@ -467,6 +517,20 @@ var VIKING_BUTTON_STYLES = `
467
517
  height: var(--viking-icon-size-md, 20px);
468
518
  }
469
519
 
520
+ ::slotted(viking-icon),
521
+ ::slotted(.viking-icon),
522
+ ::slotted([data-viking-icon]) {
523
+ display: inline-flex;
524
+ align-items: center;
525
+ justify-content: center;
526
+ width: var(--viking-icon-size-md);
527
+ height: var(--viking-icon-size-md);
528
+ line-height: 1;
529
+ flex-shrink: 0;
530
+ pointer-events: none;
531
+ flex: 0 0 auto;
532
+ }
533
+
470
534
  .viking-btn-outline {
471
535
  background: var(--viking-surface);
472
536
  color: var(--viking-text);
@@ -481,6 +545,14 @@ var VIKING_BUTTON_STYLES = `
481
545
  transform: translateY(var(--viking-state-hover-lift));
482
546
  }
483
547
 
548
+ .viking-btn-outline:active:not(:disabled):not([aria-busy='true']) {
549
+ transform: translateY(0) scale(var(--viking-state-active-scale));
550
+ box-shadow: inset 0 1px 2px
551
+ color-mix(in srgb, var(--viking-black) 28%, transparent),
552
+ var(--viking-shadow-sm);
553
+ border-color: var(--viking-border-strong);
554
+ }
555
+
484
556
  .viking-btn-primary {
485
557
  background: var(--viking-accent);
486
558
  color: var(--viking-accent-content);
@@ -495,6 +567,14 @@ var VIKING_BUTTON_STYLES = `
495
567
  transform: translateY(var(--viking-state-hover-lift));
496
568
  }
497
569
 
570
+ .viking-btn-primary:active:not(:disabled):not([aria-busy='true']) {
571
+ transform: translateY(0) scale(var(--viking-state-active-scale));
572
+ box-shadow: inset 0 1px 2px
573
+ color-mix(in srgb, var(--viking-black) 28%, transparent),
574
+ var(--viking-shadow-sm);
575
+ border-color: color-mix(in srgb, var(--viking-accent) 82%, var(--viking-black));
576
+ }
577
+
498
578
  .viking-btn-secondary {
499
579
  background: var(--viking-accent-secondary);
500
580
  color: var(--viking-accent-secondary-content);
@@ -509,6 +589,14 @@ var VIKING_BUTTON_STYLES = `
509
589
  transform: translateY(var(--viking-state-hover-lift));
510
590
  }
511
591
 
592
+ .viking-btn-secondary:active:not(:disabled):not([aria-busy='true']) {
593
+ transform: translateY(0) scale(var(--viking-state-active-scale));
594
+ box-shadow: inset 0 1px 2px
595
+ color-mix(in srgb, var(--viking-black) 28%, transparent),
596
+ var(--viking-shadow-sm);
597
+ border-color: color-mix(in srgb, var(--viking-accent-secondary) 82%, var(--viking-black));
598
+ }
599
+
512
600
  .viking-btn-filled {
513
601
  background: var(--viking-surface-alt);
514
602
  color: var(--viking-text);
@@ -523,6 +611,13 @@ var VIKING_BUTTON_STYLES = `
523
611
  transform: translateY(var(--viking-state-hover-lift));
524
612
  }
525
613
 
614
+ .viking-btn-filled:active:not(:disabled):not([aria-busy='true']) {
615
+ transform: translateY(0) scale(var(--viking-state-active-scale));
616
+ box-shadow: var(--viking-shadow-sm);
617
+ border-color: color-mix(in srgb, var(--viking-accent) 20%, var(--viking-border));
618
+ background: color-mix(in srgb, var(--viking-surface-alt) 84%, var(--viking-accent));
619
+ }
620
+
526
621
  .viking-btn-danger {
527
622
  background: var(--viking-danger);
528
623
  color: var(--viking-on-danger);
@@ -532,10 +627,20 @@ var VIKING_BUTTON_STYLES = `
532
627
 
533
628
  .viking-btn-danger:hover:not(:disabled):not([aria-busy='true']) {
534
629
  background: color-mix(in srgb, var(--viking-danger) 88%, var(--viking-white));
630
+ border-color: color-mix(in srgb, var(--viking-danger) 92%, var(--viking-white));
535
631
  box-shadow: var(--viking-shadow-hover);
536
632
  transform: translateY(var(--viking-state-hover-lift));
537
633
  }
538
634
 
635
+ .viking-btn-danger:active:not(:disabled):not([aria-busy='true']) {
636
+ transform: translateY(0) scale(var(--viking-state-active-scale));
637
+ border-color: color-mix(in srgb, var(--viking-danger) 72%, var(--viking-black));
638
+ background: color-mix(in srgb, var(--viking-danger) 84%, var(--viking-black));
639
+ box-shadow: inset 0 1px 2px
640
+ color-mix(in srgb, var(--viking-black) 28%, transparent),
641
+ var(--viking-shadow-sm);
642
+ }
643
+
539
644
  .viking-btn-ghost {
540
645
  background: transparent;
541
646
  color: var(--viking-text);
@@ -549,6 +654,12 @@ var VIKING_BUTTON_STYLES = `
549
654
  color: var(--viking-accent-strong);
550
655
  }
551
656
 
657
+ .viking-btn-ghost:active:not(:disabled):not([aria-busy='true']) {
658
+ transform: translateY(0) scale(var(--viking-state-active-scale));
659
+ background: var(--viking-accent-soft);
660
+ color: var(--viking-accent-strong);
661
+ }
662
+
552
663
  .viking-btn-subtle {
553
664
  background: transparent;
554
665
  color: var(--viking-text-muted);
@@ -563,6 +674,13 @@ var VIKING_BUTTON_STYLES = `
563
674
  border-color: var(--viking-border-strong);
564
675
  }
565
676
 
677
+ .viking-btn-subtle:active:not(:disabled):not([aria-busy='true']) {
678
+ transform: translateY(0) scale(var(--viking-state-active-scale));
679
+ border-color: var(--viking-border);
680
+ background: color-mix(in srgb, var(--viking-accent-soft) 70%, var(--viking-surface));
681
+ box-shadow: inset 0 1px 2px color-mix(in srgb, var(--viking-black) 24%, transparent);
682
+ }
683
+
566
684
  .viking-btn:active:not(:disabled):not([aria-busy='true']) {
567
685
  transform: translateY(0) scale(var(--viking-state-active-scale));
568
686
  }
@@ -570,7 +688,12 @@ var VIKING_BUTTON_STYLES = `
570
688
  .viking-btn-label {
571
689
  display: inline-flex;
572
690
  align-items: center;
573
- line-height: inherit;
691
+ gap: var(--viking-space-1);
692
+ line-height: 1.2;
693
+ min-width: 0;
694
+ justify-content: center;
695
+ text-align: center;
696
+ white-space: nowrap;
574
697
  }
575
698
 
576
699
  .viking-btn-spinner {
@@ -1737,7 +1860,7 @@ var VikingCardWc = class extends HTMLElementBase {
1737
1860
  static tag = "viking-card";
1738
1861
  static legacyTag = "viking-card-wc";
1739
1862
  static get observedAttributes() {
1740
- return ["compact", "interactive", "title"];
1863
+ return ["compact", "interactive", "title", "loading"];
1741
1864
  }
1742
1865
  connectedCallback() {
1743
1866
  this.syncClasses();
@@ -1754,6 +1877,10 @@ var VikingCardWc = class extends HTMLElementBase {
1754
1877
  "viking-card-interactive",
1755
1878
  this.hasAttribute("interactive")
1756
1879
  );
1880
+ this.classList.toggle(
1881
+ "viking-card-loading",
1882
+ this.hasAttribute("loading")
1883
+ );
1757
1884
  const title = this.getAttribute("title");
1758
1885
  if (title) {
1759
1886
  this.setAttribute("role", "region");
@@ -3402,6 +3529,17 @@ var VIKING_SUITE_HEADER_STYLES = `
3402
3529
  text-transform: uppercase;
3403
3530
  }
3404
3531
 
3532
+ .suite-header__auth-icon,
3533
+ .suite-header__menu-icon,
3534
+ .suite-header__action-icon,
3535
+ .suite-header__avatar-icon,
3536
+ .suite-header__chevron {
3537
+ display: inline-flex;
3538
+ align-items: center;
3539
+ justify-content: center;
3540
+ flex-shrink: 0;
3541
+ }
3542
+
3405
3543
  .suite-header__auth-link:hover {
3406
3544
  background: var(--viking-accent-hover);
3407
3545
  color: var(--viking-accent-content);
@@ -3554,6 +3692,10 @@ viking-suite-command-palette {
3554
3692
  .suite-header__menu-button {
3555
3693
  display: none;
3556
3694
  }
3695
+
3696
+ .suite-header[data-menu-open='true'] .suite-header__mobile {
3697
+ display: none;
3698
+ }
3557
3699
  }
3558
3700
  `;
3559
3701
  var detectContext2 = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataengineeringformachinelearning/viking-ui",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "Universal Viking-UI design system for Astro, Angular, and Django.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -24,7 +24,13 @@
24
24
  "import": "./dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs",
25
25
  "default": "./dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs"
26
26
  },
27
+ "./angular": {
28
+ "types": "./dist/types/dataengineeringformachinelearning-viking-ui.d.ts",
29
+ "import": "./dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs",
30
+ "default": "./dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs"
31
+ },
27
32
  "./dist/index.js": "./dist/fesm2022/dataengineeringformachinelearning-viking-ui.mjs",
33
+ "./dist/index.d.ts": "./dist/types/dataengineeringformachinelearning-viking-ui.d.ts",
28
34
  "./dist/viking-ui.css": "./dist/viking-ui.css",
29
35
  "./dist/viking-ui-elements.js": "./dist/viking-ui-elements.js",
30
36
  "./dist/web-components.js": "./dist/web-components.js",
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export * from "./web/index";
1
+ export * from "./public-api";
@@ -78,16 +78,16 @@ import { VikingSeparator } from "../separator/separator";
78
78
  :host {
79
79
  display: block;
80
80
  width: 100%;
81
- max-width: 480px;
81
+ max-width: 520px;
82
82
  margin-inline: auto;
83
83
  font-family: var(--viking-font-family);
84
84
  }
85
85
  .viking-auth-panel {
86
86
  display: flex;
87
87
  flex-direction: column;
88
- gap: var(--viking-space-3);
88
+ gap: var(--viking-space-4);
89
89
  width: 100%;
90
- padding: var(--viking-space-3);
90
+ padding: var(--viking-card-padding);
91
91
  background: var(--viking-surface);
92
92
  border: 1px solid var(--viking-border);
93
93
  border-radius: var(--viking-radius-lg);
@@ -111,8 +111,8 @@ import { VikingSeparator } from "../separator/separator";
111
111
  .viking-auth-header {
112
112
  display: flex;
113
113
  flex-direction: column;
114
- gap: var(--viking-space-1);
115
- margin-bottom: var(--viking-space-1);
114
+ gap: var(--viking-space-2);
115
+ margin-bottom: var(--viking-space-2);
116
116
  }
117
117
  .viking-auth-tag-row {
118
118
  display: flex;
@@ -158,13 +158,13 @@ import { VikingSeparator } from "../separator/separator";
158
158
  .viking-auth-body {
159
159
  display: flex;
160
160
  flex-direction: column;
161
- gap: var(--viking-space-2);
161
+ gap: var(--viking-space-3);
162
162
  width: 100%;
163
163
  }
164
164
  :host ::ng-deep .viking-auth-stack {
165
165
  display: flex;
166
166
  flex-direction: column;
167
- gap: var(--viking-space-2);
167
+ gap: var(--viking-space-3);
168
168
  width: 100%;
169
169
  }
170
170
  :host ::ng-deep .viking-auth-stack viking-callout {
@@ -174,13 +174,13 @@ import { VikingSeparator } from "../separator/separator";
174
174
  :host ::ng-deep .login-form {
175
175
  display: flex;
176
176
  flex-direction: column;
177
- gap: var(--viking-space-2);
177
+ gap: var(--viking-space-3);
178
178
  width: 100%;
179
179
  }
180
180
  .viking-auth-social {
181
181
  display: flex;
182
182
  flex-direction: column;
183
- gap: var(--viking-space-2);
183
+ gap: var(--viking-space-3);
184
184
  width: 100%;
185
185
  }
186
186
  .viking-auth-footer {
@@ -2,6 +2,7 @@
2
2
 
3
3
  :host {
4
4
  display: inline-flex;
5
+ align-items: center;
5
6
  }
6
7
 
7
8
  :host(.viking-full) {
@@ -18,6 +19,20 @@
18
19
 
19
20
  .viking-btn {
20
21
  @include btn.viking-btn-base;
22
+ line-height: 1;
23
+ }
24
+
25
+ .viking-btn viking-icon,
26
+ .viking-btn .viking-icon,
27
+ .viking-btn [data-viking-icon] {
28
+ flex-shrink: 0;
29
+ display: inline-flex;
30
+ align-items: center;
31
+ justify-content: center;
32
+ width: var(--viking-icon-size-md);
33
+ height: var(--viking-icon-size-md);
34
+ line-height: 1;
35
+ pointer-events: none;
21
36
  }
22
37
 
23
38
  .viking-sm {
@@ -79,7 +94,15 @@
79
94
  .viking-btn-label {
80
95
  display: inline-flex;
81
96
  align-items: center;
97
+ gap: var(--viking-space-1);
82
98
  line-height: inherit;
99
+ min-width: 0;
100
+ justify-content: center;
101
+ white-space: nowrap;
102
+ }
103
+
104
+ .viking-btn kbd {
105
+ margin-top: 0;
83
106
  }
84
107
 
85
108
  .viking-btn-kbd {
@@ -42,13 +42,19 @@ import { VikingSkeleton } from "../skeleton/skeleton";
42
42
  background: var(--viking-surface-recipe, var(--viking-surface));
43
43
  border: 1px solid var(--viking-border);
44
44
  border-radius: var(--viking-radius-lg);
45
- box-shadow: var(--viking-shadow-sm);
45
+ box-shadow: var(--viking-shadow-sm), inset 0 1px 0 color-mix(
46
+ in srgb,
47
+ var(--viking-white-pure) 6%,
48
+ transparent
49
+ );
46
50
  padding: var(--viking-card-padding, var(--viking-space-3));
47
51
  color: var(--viking-text);
48
52
  transition: var(--viking-transition-interactive);
49
53
  position: relative;
54
+ isolation: isolate;
50
55
  overflow: hidden;
51
56
  min-width: 0;
57
+ background-clip: padding-box;
52
58
  }
53
59
  :host(.viking-card-headerless) .viking-card-header,
54
60
  :host(.viking-card-headerless) viking-card-header {
@@ -72,17 +78,41 @@ import { VikingSkeleton } from "../skeleton/skeleton";
72
78
  );
73
79
  pointer-events: none;
74
80
  }
81
+
82
+ :host::after {
83
+ content: "";
84
+ position: absolute;
85
+ inset: 0 auto auto 0;
86
+ right: 0;
87
+ width: 1px;
88
+ height: 28px;
89
+ background: linear-gradient(
90
+ 180deg,
91
+ color-mix(in srgb, var(--viking-metallic-100) 22%, transparent),
92
+ transparent
93
+ );
94
+ pointer-events: none;
95
+ }
96
+
75
97
  :host(.viking-card-interactive) {
76
98
  cursor: pointer;
77
99
  }
100
+
101
+ :host(.viking-card-interactive):focus-visible {
102
+ outline: var(--viking-ring-width) solid var(--viking-ring);
103
+ outline-offset: var(--viking-ring-offset);
104
+ }
78
105
  :host(.viking-card-interactive):hover {
79
106
  border-color: var(--viking-accent-strong);
80
- box-shadow: var(--viking-shadow-hover);
107
+ box-shadow: var(--viking-shadow-hover),
108
+ inset 0 1px 0 color-mix(in srgb, var(--viking-white-pure) 6%, transparent);
81
109
  transform: translateY(var(--viking-state-hover-lift));
82
110
  }
83
111
  :host(.viking-card-interactive):active {
84
112
  transform: translateY(0) scale(var(--viking-state-active-scale));
85
- box-shadow: var(--viking-shadow-md);
113
+ box-shadow: inset 0 1px 2px
114
+ color-mix(in srgb, var(--viking-black) 24%, transparent),
115
+ var(--viking-shadow-sm);
86
116
  }
87
117
  :host(.viking-card-interactive):focus-visible {
88
118
  outline: var(--viking-ring-width) solid var(--viking-ring);
@@ -132,7 +162,6 @@ export class VikingCard {
132
162
  gap: var(--viking-space-2);
133
163
  padding-bottom: var(--viking-space-2);
134
164
  margin-bottom: var(--viking-space-2);
135
- border-bottom: 1px solid var(--viking-border-subtle);
136
165
  }
137
166
  /* Support slotted left meta + right actions uniformly */
138
167
  :host ::ng-deep > * {
@@ -162,7 +191,6 @@ export class VikingCardHeader {}
162
191
  gap: var(--viking-space-2);
163
192
  padding-top: var(--viking-space-2);
164
193
  margin-top: var(--viking-space-2);
165
- border-top: 1px solid var(--viking-border-subtle);
166
194
  }
167
195
  `,
168
196
  ],
@@ -114,6 +114,8 @@ import {
114
114
  <viking-button
115
115
  variant="primary"
116
116
  icon="arrow-right"
117
+ class="auth-btn"
118
+ [loading]="isBusy()"
117
119
  (pressed)="login.emit()"
118
120
  >
119
121
  Sign In
@@ -122,11 +124,16 @@ import {
122
124
  <viking-button
123
125
  variant="primary"
124
126
  icon="home"
127
+ class="auth-btn"
125
128
  [href]="urls().app + '/dashboard'"
126
129
  >
127
130
  Dashboard
128
131
  </viking-button>
129
- <viking-button variant="ghost" (pressed)="logout.emit()"
132
+ <viking-button
133
+ variant="ghost"
134
+ class="auth-btn auth-signout-btn"
135
+ [loading]="isBusy()"
136
+ (pressed)="logout.emit()"
130
137
  >Sign Out</viking-button
131
138
  >
132
139
  }
@@ -187,7 +194,8 @@ import {
187
194
  <viking-button
188
195
  variant="primary"
189
196
  icon="arrow-right"
190
- class="mobile-auth-btn"
197
+ class="mobile-auth-btn auth-btn"
198
+ [loading]="isBusy()"
191
199
  [fullWidth]="true"
192
200
  (pressed)="login.emit(); closeMobileMenu()"
193
201
  >
@@ -197,7 +205,7 @@ import {
197
205
  <viking-button
198
206
  variant="primary"
199
207
  icon="home"
200
- class="mobile-auth-btn"
208
+ class="mobile-auth-btn auth-btn"
201
209
  [fullWidth]="true"
202
210
  [href]="urls().app + '/dashboard'"
203
211
  (pressed)="closeMobileMenu()"
@@ -206,7 +214,8 @@ import {
206
214
  </viking-button>
207
215
  <viking-button
208
216
  variant="ghost"
209
- class="mobile-auth-btn"
217
+ class="mobile-auth-btn auth-btn auth-signout-btn"
218
+ [loading]="isBusy()"
210
219
  [fullWidth]="true"
211
220
  (pressed)="logout.emit(); closeMobileMenu()"
212
221
  >
@@ -221,6 +230,7 @@ export class VikingSiteNavbar {
221
230
  readonly context = input<SiteDrakkarContext>("app");
222
231
  readonly urls = input<SiteUrls>(DEFAULT_SITE_URLS);
223
232
  readonly isAuthenticated = input<boolean>(false);
233
+ readonly isBusy = input<boolean>(false);
224
234
  readonly theme = input<"light" | "dark">("dark");
225
235
  readonly showSearch = input<boolean>(false);
226
236