@dataengineeringformachinelearning/viking-ui 4.0.2 → 4.0.4

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 (37) 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 +211 -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 +2 -1
  8. package/dist/src/web/core/styles.ts +125 -2
  9. package/dist/src/web/search-palette/viking-search-palette-wc.ts +1 -0
  10. package/dist/src/web/suite-header/viking-suite-header-wc.ts +15 -0
  11. package/dist/types/dataengineeringformachinelearning-viking-ui.d.ts +3 -2
  12. package/dist/viking-components.css +425 -31
  13. package/dist/viking-ui-elements.js +180 -42
  14. package/dist/viking-ui.css +1 -1
  15. package/dist/web-components.js +143 -3
  16. package/package.json +7 -1
  17. package/src/index.ts +1 -1
  18. package/src/lib/button/button.scss +23 -0
  19. package/src/lib/card/card.ts +35 -5
  20. package/src/lib/footer/footer.scss +8 -1
  21. package/src/lib/site-drakkar/site-footer.ts +5 -1
  22. package/src/lib/site-drakkar/site-navbar.ts +23 -4
  23. package/src/lib/theme-toggle/theme-toggle.ts +1 -0
  24. package/src/styles/_buttons.scss +92 -7
  25. package/src/styles/_layout-enforcement.scss +66 -3
  26. package/src/styles/components/footer.scss +26 -13
  27. package/src/styles/components/icon-inline.scss +23 -0
  28. package/src/styles/components.scss +276 -9
  29. package/src/styles/static-navbar.scss +110 -36
  30. package/src/styles/surfaces/docs-showcase.scss +64 -1
  31. package/src/styles/surfaces/marketing-landing.scss +247 -6
  32. package/src/styles/surfaces/swagger-ui.scss +92 -1
  33. package/src/styles/viking-ui.scss +2 -0
  34. package/src/web/card/viking-card-wc.ts +2 -1
  35. package/src/web/core/styles.ts +125 -2
  36. package/src/web/search-palette/viking-search-palette-wc.ts +1 -0
  37. 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,7 @@ var VikingCardWc = class extends HTMLElementBase {
1754
1877
  "viking-card-interactive",
1755
1878
  this.hasAttribute("interactive")
1756
1879
  );
1880
+ this.classList.toggle("viking-card-loading", this.hasAttribute("loading"));
1757
1881
  const title = this.getAttribute("title");
1758
1882
  if (title) {
1759
1883
  this.setAttribute("role", "region");
@@ -2234,6 +2358,7 @@ var VikingSearchPaletteWc = class extends HTMLElementBase {
2234
2358
  }
2235
2359
  connectedCallback() {
2236
2360
  this.render();
2361
+ this.removeAttribute("open");
2237
2362
  this.syncOpen();
2238
2363
  this.bindGlobalShortcut();
2239
2364
  this.dialogEl?.addEventListener("close", this.onClose);
@@ -3402,6 +3527,17 @@ var VIKING_SUITE_HEADER_STYLES = `
3402
3527
  text-transform: uppercase;
3403
3528
  }
3404
3529
 
3530
+ .suite-header__auth-icon,
3531
+ .suite-header__menu-icon,
3532
+ .suite-header__action-icon,
3533
+ .suite-header__avatar-icon,
3534
+ .suite-header__chevron {
3535
+ display: inline-flex;
3536
+ align-items: center;
3537
+ justify-content: center;
3538
+ flex-shrink: 0;
3539
+ }
3540
+
3405
3541
  .suite-header__auth-link:hover {
3406
3542
  background: var(--viking-accent-hover);
3407
3543
  color: var(--viking-accent-content);
@@ -3554,6 +3690,10 @@ viking-suite-command-palette {
3554
3690
  .suite-header__menu-button {
3555
3691
  display: none;
3556
3692
  }
3693
+
3694
+ .suite-header[data-menu-open='true'] .suite-header__mobile {
3695
+ display: none;
3696
+ }
3557
3697
  }
3558
3698
  `;
3559
3699
  var detectContext2 = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataengineeringformachinelearning/viking-ui",
3
- "version": "4.0.2",
3
+ "version": "4.0.4",
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";
@@ -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,18 @@ 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:
46
+ var(--viking-shadow-sm),
47
+ inset 0 1px 0
48
+ color-mix(in srgb, var(--viking-white-pure) 6%, transparent);
46
49
  padding: var(--viking-card-padding, var(--viking-space-3));
47
50
  color: var(--viking-text);
48
51
  transition: var(--viking-transition-interactive);
49
52
  position: relative;
53
+ isolation: isolate;
50
54
  overflow: hidden;
51
55
  min-width: 0;
56
+ background-clip: padding-box;
52
57
  }
53
58
  :host(.viking-card-headerless) .viking-card-header,
54
59
  :host(.viking-card-headerless) viking-card-header {
@@ -72,17 +77,44 @@ import { VikingSkeleton } from "../skeleton/skeleton";
72
77
  );
73
78
  pointer-events: none;
74
79
  }
80
+
81
+ :host::after {
82
+ content: "";
83
+ position: absolute;
84
+ inset: 0 auto auto 0;
85
+ right: 0;
86
+ width: 1px;
87
+ height: 28px;
88
+ background: linear-gradient(
89
+ 180deg,
90
+ color-mix(in srgb, var(--viking-metallic-100) 22%, transparent),
91
+ transparent
92
+ );
93
+ pointer-events: none;
94
+ }
95
+
75
96
  :host(.viking-card-interactive) {
76
97
  cursor: pointer;
77
98
  }
99
+
100
+ :host(.viking-card-interactive):focus-visible {
101
+ outline: var(--viking-ring-width) solid var(--viking-ring);
102
+ outline-offset: var(--viking-ring-offset);
103
+ }
78
104
  :host(.viking-card-interactive):hover {
79
105
  border-color: var(--viking-accent-strong);
80
- box-shadow: var(--viking-shadow-hover);
106
+ box-shadow:
107
+ var(--viking-shadow-hover),
108
+ inset 0 1px 0
109
+ color-mix(in srgb, var(--viking-white-pure) 6%, transparent);
81
110
  transform: translateY(var(--viking-state-hover-lift));
82
111
  }
83
112
  :host(.viking-card-interactive):active {
84
113
  transform: translateY(0) scale(var(--viking-state-active-scale));
85
- box-shadow: var(--viking-shadow-md);
114
+ box-shadow:
115
+ inset 0 1px 2px
116
+ color-mix(in srgb, var(--viking-black) 24%, transparent),
117
+ var(--viking-shadow-sm);
86
118
  }
87
119
  :host(.viking-card-interactive):focus-visible {
88
120
  outline: var(--viking-ring-width) solid var(--viking-ring);
@@ -132,7 +164,6 @@ export class VikingCard {
132
164
  gap: var(--viking-space-2);
133
165
  padding-bottom: var(--viking-space-2);
134
166
  margin-bottom: var(--viking-space-2);
135
- border-bottom: 1px solid var(--viking-border-subtle);
136
167
  }
137
168
  /* Support slotted left meta + right actions uniformly */
138
169
  :host ::ng-deep > * {
@@ -162,7 +193,6 @@ export class VikingCardHeader {}
162
193
  gap: var(--viking-space-2);
163
194
  padding-top: var(--viking-space-2);
164
195
  margin-top: var(--viking-space-2);
165
- border-top: 1px solid var(--viking-border-subtle);
166
196
  }
167
197
  `,
168
198
  ],
@@ -127,13 +127,20 @@
127
127
  border-radius: var(--viking-radius-pill);
128
128
  background-color: transparent;
129
129
  border: 1px solid var(--viking-border);
130
- cursor: default;
130
+ cursor: pointer;
131
131
  transition: var(--viking-transition-colors);
132
132
  font-size: var(--viking-font-size);
133
133
  font-weight: 500;
134
134
  color: var(--viking-text-muted);
135
135
  }
136
136
 
137
+ .viking-usa-badge:focus-visible,
138
+ .usa-badge:focus-visible {
139
+ outline: var(--viking-ring-width, 2px) solid
140
+ var(--viking-ring, var(--viking-ring));
141
+ outline-offset: var(--viking-ring-offset, 2px);
142
+ }
143
+
137
144
  .viking-usa-badge:hover,
138
145
  .usa-badge:hover {
139
146
  background-color: color-mix(in srgb, var(--viking-surface) 95%, var(--viking-accent) 5%);
@@ -71,6 +71,10 @@ import {
71
71
  class="usa-badge viking-usa-badge"
72
72
  id="usa-badge"
73
73
  (mouseenter)="usaBadgeHover.emit($event)"
74
+ (focusin)="usaBadgeHover.emit($event)"
75
+ (click)="usaBadgeHover.emit($event)"
76
+ role="button"
77
+ tabindex="0"
74
78
  >
75
79
  <span
76
80
  class="usa-badge-icon viking-usa-badge-icon"
@@ -105,7 +109,7 @@ export class VikingSiteFooter {
105
109
 
106
110
  readonly cookieSettings = output<Event>();
107
111
  readonly bugReport = output<Event>();
108
- readonly usaBadgeHover = output<MouseEvent>();
112
+ readonly usaBadgeHover = output<Event>();
109
113
 
110
114
  protected readonly columns = SITE_FOOTER_COLUMNS;
111
115
 
@@ -100,8 +100,10 @@ import {
100
100
  <div class="navbar-search" role="search">
101
101
  <viking-button
102
102
  variant="outline"
103
+ class="navbar-search-trigger"
103
104
  [square]="true"
104
105
  [compact]="true"
106
+ id="navbar-search-trigger"
105
107
  icon="search"
106
108
  label="Open search (⌘K)"
107
109
  (pressed)="openSearch()"
@@ -114,6 +116,9 @@ import {
114
116
  <viking-button
115
117
  variant="primary"
116
118
  icon="arrow-right"
119
+ class="auth-btn auth-btn-desktop"
120
+ id="auth-btn-desktop"
121
+ [loading]="isBusy()"
117
122
  (pressed)="login.emit()"
118
123
  >
119
124
  Sign In
@@ -122,11 +127,18 @@ import {
122
127
  <viking-button
123
128
  variant="primary"
124
129
  icon="home"
130
+ class="auth-btn auth-btn-desktop"
131
+ id="auth-btn-desktop"
125
132
  [href]="urls().app + '/dashboard'"
126
133
  >
127
134
  Dashboard
128
135
  </viking-button>
129
- <viking-button variant="ghost" (pressed)="logout.emit()"
136
+ <viking-button
137
+ variant="ghost"
138
+ class="auth-btn auth-signout-btn"
139
+ id="auth-signout-desktop"
140
+ [loading]="isBusy()"
141
+ (pressed)="logout.emit()"
130
142
  >Sign Out</viking-button
131
143
  >
132
144
  }
@@ -142,6 +154,7 @@ import {
142
154
  [square]="true"
143
155
  class="menu-toggle-btn"
144
156
  [icon]="mobileMenuOpen() ? 'x' : 'menu'"
157
+ id="mobile-menu-btn"
145
158
  [label]="
146
159
  mobileMenuOpen()
147
160
  ? 'Close navigation menu'
@@ -187,7 +200,9 @@ import {
187
200
  <viking-button
188
201
  variant="primary"
189
202
  icon="arrow-right"
190
- class="mobile-auth-btn"
203
+ class="mobile-auth-btn auth-btn"
204
+ id="auth-btn-mobile"
205
+ [loading]="isBusy()"
191
206
  [fullWidth]="true"
192
207
  (pressed)="login.emit(); closeMobileMenu()"
193
208
  >
@@ -197,7 +212,8 @@ import {
197
212
  <viking-button
198
213
  variant="primary"
199
214
  icon="home"
200
- class="mobile-auth-btn"
215
+ class="mobile-auth-btn auth-btn"
216
+ id="auth-btn-mobile"
201
217
  [fullWidth]="true"
202
218
  [href]="urls().app + '/dashboard'"
203
219
  (pressed)="closeMobileMenu()"
@@ -206,7 +222,9 @@ import {
206
222
  </viking-button>
207
223
  <viking-button
208
224
  variant="ghost"
209
- class="mobile-auth-btn"
225
+ class="mobile-auth-btn auth-btn auth-signout-btn"
226
+ id="auth-signout-mobile"
227
+ [loading]="isBusy()"
210
228
  [fullWidth]="true"
211
229
  (pressed)="logout.emit(); closeMobileMenu()"
212
230
  >
@@ -221,6 +239,7 @@ export class VikingSiteNavbar {
221
239
  readonly context = input<SiteDrakkarContext>("app");
222
240
  readonly urls = input<SiteUrls>(DEFAULT_SITE_URLS);
223
241
  readonly isAuthenticated = input<boolean>(false);
242
+ readonly isBusy = input<boolean>(false);
224
243
  readonly theme = input<"light" | "dark">("dark");
225
244
  readonly showSearch = input<boolean>(false);
226
245
 
@@ -22,6 +22,7 @@ import { VikingIcon } from "../icon/icon";
22
22
  <button
23
23
  type="button"
24
24
  class="theme-toggle-btn"
25
+ id="theme-toggle-btn"
25
26
  aria-label="Toggle light and dark theme"
26
27
  (click)="toggle.emit()"
27
28
  >