@dataengineeringformachinelearning/viking-ui 4.0.5 → 4.1.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.
@@ -699,14 +699,29 @@ var VIKING_BUTTON_STYLES = `
699
699
  .viking-btn-label {
700
700
  display: inline-flex;
701
701
  align-items: center;
702
+ justify-content: center;
702
703
  gap: var(--viking-space-1);
703
704
  line-height: 1.2;
704
705
  min-width: 0;
705
- justify-content: center;
706
706
  text-align: center;
707
707
  white-space: nowrap;
708
708
  }
709
709
 
710
+ .viking-btn-label ::slotted(*) {
711
+ display: inline-flex;
712
+ align-items: center;
713
+ justify-content: center;
714
+ flex: 0 0 auto;
715
+ line-height: 1;
716
+ }
717
+
718
+ .viking-btn-label ::slotted([data-viking-icon]),
719
+ .viking-btn-label ::slotted(svg),
720
+ .viking-btn-label ::slotted(viking-icon) {
721
+ width: var(--viking-icon-size-md);
722
+ height: var(--viking-icon-size-md);
723
+ }
724
+
710
725
  .viking-btn-spinner {
711
726
  flex: 0 0 auto;
712
727
  width: var(--viking-icon-size-sm, 18px);
@@ -1234,6 +1249,11 @@ var VIKING_MODAL_STYLES = `
1234
1249
  display: contents;
1235
1250
  }
1236
1251
 
1252
+ .viking-modal-backdrop:not([open]) {
1253
+ display: none !important;
1254
+ pointer-events: none;
1255
+ }
1256
+
1237
1257
  .viking-modal-backdrop {
1238
1258
  position: fixed;
1239
1259
  inset: 0;
@@ -1687,8 +1707,9 @@ var VARIANTS = /* @__PURE__ */ new Set([
1687
1707
  ]);
1688
1708
  var SIZES = /* @__PURE__ */ new Set(["sm", "xs"]);
1689
1709
  var VikingButtonWc = class extends HTMLElementBase {
1690
- static tag = "viking-button";
1691
- static legacyTag = "viking-button-wc";
1710
+ /** Reserved for Angular `viking-button` — do not register as a custom element. */
1711
+ static angularTag = "viking-button";
1712
+ static tag = "viking-button-wc";
1692
1713
  static get observedAttributes() {
1693
1714
  return [
1694
1715
  "variant",
@@ -1714,7 +1735,6 @@ var VikingButtonWc = class extends HTMLElementBase {
1714
1735
  }
1715
1736
  connectedCallback() {
1716
1737
  this.render();
1717
- this.syncHostSemantics();
1718
1738
  this.control?.addEventListener("click", this.onClick);
1719
1739
  }
1720
1740
  disconnectedCallback() {
@@ -1723,7 +1743,6 @@ var VikingButtonWc = class extends HTMLElementBase {
1723
1743
  attributeChangedCallback() {
1724
1744
  if (this.isConnected) {
1725
1745
  this.render();
1726
- this.syncHostSemantics();
1727
1746
  }
1728
1747
  }
1729
1748
  onClick = (event) => {
@@ -1757,11 +1776,6 @@ var VikingButtonWc = class extends HTMLElementBase {
1757
1776
  get square() {
1758
1777
  return readBoolAttr(this, "square");
1759
1778
  }
1760
- syncHostSemantics() {
1761
- if (!this.hasAttribute("role")) {
1762
- this.setAttribute("role", this.getAttribute("href") ? "link" : "button");
1763
- }
1764
- }
1765
1779
  render() {
1766
1780
  const href = this.getAttribute("href");
1767
1781
  const isLink = Boolean(href);
@@ -1799,7 +1813,6 @@ var VikingButtonWc = class extends HTMLElementBase {
1799
1813
  };
1800
1814
  var registerVikingButtonWc = () => {
1801
1815
  defineCustomElement(VikingButtonWc.tag, VikingButtonWc);
1802
- defineCustomElementAlias(VikingButtonWc.legacyTag, VikingButtonWc);
1803
1816
  };
1804
1817
 
1805
1818
  // src/web/callout/viking-callout-wc.ts
@@ -2173,8 +2186,9 @@ var registerVikingInputWc = () => {
2173
2186
 
2174
2187
  // src/web/modal/viking-modal-wc.ts
2175
2188
  var VikingModalWc = class extends HTMLElementBase {
2176
- static tag = "viking-modal";
2177
- static legacyTag = "viking-modal-wc";
2189
+ /** Reserved for Angular `viking-modal` — do not register as a custom element. */
2190
+ static angularTag = "viking-modal";
2191
+ static tag = "viking-modal-wc";
2178
2192
  static dialogTag = "viking-dialog";
2179
2193
  static get observedAttributes() {
2180
2194
  return ["open", "title", "dismissible"];
@@ -2299,7 +2313,6 @@ var VikingModalWc = class extends HTMLElementBase {
2299
2313
  };
2300
2314
  var registerVikingModalWc = () => {
2301
2315
  defineCustomElement(VikingModalWc.tag, VikingModalWc);
2302
- defineCustomElementAlias(VikingModalWc.legacyTag, VikingModalWc);
2303
2316
  defineCustomElementAlias(VikingModalWc.dialogTag, VikingModalWc);
2304
2317
  };
2305
2318
 
@@ -2687,6 +2700,530 @@ var registerVikingSearchPaletteWc = () => {
2687
2700
  );
2688
2701
  };
2689
2702
 
2703
+ // src/web/status-card/viking-status-card-wc.ts
2704
+ var TONES3 = /* @__PURE__ */ new Set([
2705
+ "accent",
2706
+ "secondary",
2707
+ "success",
2708
+ "warning",
2709
+ "danger",
2710
+ "info",
2711
+ "muted"
2712
+ ]);
2713
+ var VikingStatusCardWc = class extends HTMLElementBase {
2714
+ static tag = "viking-status-card";
2715
+ static legacyTag = "viking-status-card-wc";
2716
+ static get observedAttributes() {
2717
+ return [
2718
+ "title",
2719
+ "subtitle",
2720
+ "status",
2721
+ "status-tone",
2722
+ "status-dot",
2723
+ "href",
2724
+ "target",
2725
+ "compact",
2726
+ "loading",
2727
+ "interactive",
2728
+ "aria-label"
2729
+ ];
2730
+ }
2731
+ shadow = this.attachShadow({ mode: "open" });
2732
+ connectedCallback() {
2733
+ this.render();
2734
+ }
2735
+ attributeChangedCallback() {
2736
+ if (this.isConnected) {
2737
+ this.render();
2738
+ }
2739
+ }
2740
+ get compact() {
2741
+ const compact = this.getAttribute("compact");
2742
+ return compact !== null && compact !== "false";
2743
+ }
2744
+ get loading() {
2745
+ const loading = this.getAttribute("loading");
2746
+ return loading !== null && loading !== "false";
2747
+ }
2748
+ get interactive() {
2749
+ const interactive = this.getAttribute("interactive");
2750
+ return interactive !== null && interactive !== "false";
2751
+ }
2752
+ get href() {
2753
+ return this.getAttribute("href");
2754
+ }
2755
+ get target() {
2756
+ return this.getAttribute("target");
2757
+ }
2758
+ get statusTone() {
2759
+ const raw = this.getAttribute("status-tone") ?? "muted";
2760
+ return TONES3.has(raw) ? raw : "muted";
2761
+ }
2762
+ get statusDot() {
2763
+ const statusDot = this.getAttribute("status-dot");
2764
+ return statusDot !== null && statusDot !== "false";
2765
+ }
2766
+ get cardTitle() {
2767
+ return this.getAttribute("title") ?? "";
2768
+ }
2769
+ get subtitle() {
2770
+ return this.getAttribute("subtitle") ?? "";
2771
+ }
2772
+ get status() {
2773
+ return this.getAttribute("status") ?? "";
2774
+ }
2775
+ render() {
2776
+ const hasStatus = this.status.length > 0;
2777
+ const title = this.cardTitle;
2778
+ const subtitle = this.subtitle;
2779
+ const compactClass = this.compact ? " status-card--compact" : "";
2780
+ const loadingClass = this.loading ? " status-card--loading" : "";
2781
+ const interactiveClass = this.interactive ? " status-card--interactive" : "";
2782
+ const wrapperClass = `status-card${compactClass}${loadingClass}${interactiveClass}`;
2783
+ const rel = this.target === "_blank" ? ' rel="noopener noreferrer"' : "";
2784
+ const statusDot = this.statusDot ? '<span class="status-card__status-dot" aria-hidden="true"></span>' : "";
2785
+ const statusChip = hasStatus ? `<span class="status-card__status status-card__status-${this.statusTone}" part="status">${statusDot}<span>${escapeHtml(this.status)}</span></span>` : "";
2786
+ const safeHref = this.href ? escapeHtml(this.href) : "";
2787
+ const safeLabel = escapeHtml(this.getAttribute("aria-label") ?? "");
2788
+ const wrapperTag = safeHref ? "a" : "div";
2789
+ const header = `
2790
+ <header class="status-card__header">
2791
+ <div class="status-card__title-wrap">
2792
+ ${title ? `<h3 class="status-card__title" part="title">${escapeHtml(title)}</h3>` : ""}
2793
+ ${subtitle ? `<p class="status-card__subtitle" part="subtitle">${escapeHtml(subtitle)}</p>` : ""}
2794
+ </div>
2795
+ ${hasStatus || statusDot ? `<div class="status-card__status-wrap">${statusChip}</div>` : ""}
2796
+ </header>
2797
+ `;
2798
+ this.shadow.innerHTML = `
2799
+ <style>
2800
+ ${VIKING_STATUS_CARD_STYLES}
2801
+ </style>
2802
+ <${wrapperTag}
2803
+ class="${wrapperClass}"
2804
+ part="card"
2805
+ ${safeHref ? `href="${safeHref}"` : ""}
2806
+ ${this.target ? `target="${escapeHtml(this.target)}"` : ""}
2807
+ ${safeHref ? rel : ""}
2808
+ ${safeLabel ? `aria-label="${safeLabel}"` : ""}
2809
+ >
2810
+ ${header}
2811
+ <section class="status-card__body">
2812
+ <slot></slot>
2813
+ </section>
2814
+ </${wrapperTag}>
2815
+ `;
2816
+ }
2817
+ };
2818
+ var VIKING_STATUS_CARD_STYLES = `
2819
+ :host {
2820
+ display: block;
2821
+ }
2822
+
2823
+ :host([compact]) .status-card,
2824
+ :host .status-card--compact {
2825
+ padding: var(--viking-card-padding-compact);
2826
+ gap: var(--viking-space-2);
2827
+ }
2828
+
2829
+ .status-card {
2830
+ display: grid;
2831
+ gap: var(--viking-space-3);
2832
+ width: 100%;
2833
+ padding: var(--viking-card-padding);
2834
+ border-radius: var(--viking-radius-lg);
2835
+ border: 1px solid var(--viking-border);
2836
+ background: var(--viking-surface);
2837
+ color: var(--viking-text);
2838
+ box-shadow: var(--viking-shadow-sm);
2839
+ box-sizing: border-box;
2840
+ position: relative;
2841
+ transition: var(--viking-transition-interactive);
2842
+ text-decoration: none;
2843
+ overflow: hidden;
2844
+ }
2845
+
2846
+ .status-card::before {
2847
+ content: "";
2848
+ position: absolute;
2849
+ inset: 0 0 auto;
2850
+ height: 1px;
2851
+ background: linear-gradient(
2852
+ 90deg,
2853
+ transparent,
2854
+ color-mix(in srgb, var(--viking-metallic-200) 24%, transparent),
2855
+ transparent
2856
+ );
2857
+ pointer-events: none;
2858
+ }
2859
+
2860
+ .status-card--interactive {
2861
+ cursor: pointer;
2862
+ }
2863
+
2864
+ .status-card--interactive:hover {
2865
+ border-color: var(--viking-accent-strong);
2866
+ box-shadow: var(--viking-shadow-hover);
2867
+ transform: translateY(var(--viking-state-hover-lift));
2868
+ }
2869
+
2870
+ .status-card--loading {
2871
+ pointer-events: none;
2872
+ opacity: var(--viking-state-disabled-opacity);
2873
+ }
2874
+
2875
+ .status-card__header {
2876
+ display: flex;
2877
+ justify-content: space-between;
2878
+ gap: var(--viking-space-3);
2879
+ align-items: flex-start;
2880
+ min-width: 0;
2881
+ }
2882
+
2883
+ .status-card__title-wrap {
2884
+ display: grid;
2885
+ gap: var(--viking-space-1);
2886
+ min-width: 0;
2887
+ }
2888
+
2889
+ .status-card__title {
2890
+ margin: 0;
2891
+ font-size: var(--viking-font-size-xl);
2892
+ font-weight: var(--viking-font-weight-bold);
2893
+ letter-spacing: var(--viking-letter-spacing-tight);
2894
+ line-height: var(--viking-line-height-tight);
2895
+ }
2896
+
2897
+ .status-card__subtitle {
2898
+ margin: 0;
2899
+ max-width: 60ch;
2900
+ color: var(--viking-text-muted);
2901
+ font-size: var(--viking-font-size-base);
2902
+ line-height: var(--viking-line-height-relaxed);
2903
+ }
2904
+
2905
+ .status-card__status-wrap {
2906
+ display: inline-flex;
2907
+ align-items: center;
2908
+ justify-content: flex-end;
2909
+ }
2910
+
2911
+ .status-card__status {
2912
+ display: inline-flex;
2913
+ align-items: center;
2914
+ gap: var(--viking-space-1);
2915
+ max-width: fit-content;
2916
+ padding: calc(var(--viking-space-half) - 1px) var(--viking-space-1);
2917
+ border-radius: var(--viking-radius-pill);
2918
+ border: 1px solid var(--viking-border-subtle);
2919
+ background: color-mix(in srgb, var(--viking-surface) 92%, transparent);
2920
+ color: var(--viking-text-muted);
2921
+ text-transform: capitalize;
2922
+ font-size: var(--viking-font-size-xs);
2923
+ font-weight: var(--viking-font-weight-semibold);
2924
+ letter-spacing: var(--viking-letter-spacing-wide);
2925
+ }
2926
+
2927
+ .status-card__status-dot {
2928
+ width: var(--viking-space-1);
2929
+ height: var(--viking-space-1);
2930
+ border-radius: var(--viking-radius-full);
2931
+ background: currentColor;
2932
+ flex: 0 0 auto;
2933
+ }
2934
+
2935
+ .status-card__status-success {
2936
+ background: color-mix(in srgb, var(--viking-success) 12%, var(--viking-surface));
2937
+ border-color: color-mix(in srgb, var(--viking-success) 40%, transparent);
2938
+ color: var(--viking-success);
2939
+ }
2940
+
2941
+ .status-card__status-warning {
2942
+ background: color-mix(in srgb, var(--viking-warning) 12%, var(--viking-surface));
2943
+ border-color: color-mix(in srgb, var(--viking-warning) 40%, transparent);
2944
+ color: var(--viking-warning);
2945
+ }
2946
+
2947
+ .status-card__status-danger {
2948
+ background: color-mix(in srgb, var(--viking-danger) 12%, var(--viking-surface));
2949
+ border-color: color-mix(in srgb, var(--viking-danger) 45%, transparent);
2950
+ color: var(--viking-danger-text);
2951
+ }
2952
+
2953
+ .status-card__status-accent {
2954
+ background: color-mix(in srgb, var(--viking-accent) 12%, var(--viking-surface));
2955
+ border-color: color-mix(in srgb, var(--viking-accent) 40%, transparent);
2956
+ color: var(--viking-accent);
2957
+ }
2958
+
2959
+ .status-card__status-secondary {
2960
+ background: color-mix(in srgb, var(--viking-accent-secondary) 12%, var(--viking-surface));
2961
+ border-color: color-mix(in srgb, var(--viking-accent-secondary) 40%, transparent);
2962
+ color: var(--viking-accent-secondary);
2963
+ }
2964
+
2965
+ .status-card__status-info {
2966
+ background: color-mix(in srgb, var(--viking-info) 12%, var(--viking-surface));
2967
+ border-color: color-mix(in srgb, var(--viking-info) 40%, transparent);
2968
+ color: var(--viking-info);
2969
+ }
2970
+
2971
+ .status-card__status-muted {
2972
+ background: var(--viking-surface);
2973
+ border-color: var(--viking-border-subtle);
2974
+ color: var(--viking-text-muted);
2975
+ }
2976
+
2977
+ .status-card__body {
2978
+ display: grid;
2979
+ gap: var(--viking-space-3);
2980
+ min-width: 0;
2981
+ }
2982
+ `;
2983
+ var registerVikingStatusCardWc = () => {
2984
+ defineCustomElement(VikingStatusCardWc.tag, VikingStatusCardWc);
2985
+ defineCustomElementAlias(VikingStatusCardWc.legacyTag, VikingStatusCardWc);
2986
+ };
2987
+
2988
+ // src/web/status-pill/viking-status-pill-wc.ts
2989
+ var TONES4 = /* @__PURE__ */ new Set([
2990
+ "accent",
2991
+ "secondary",
2992
+ "success",
2993
+ "warning",
2994
+ "danger",
2995
+ "info",
2996
+ "muted"
2997
+ ]);
2998
+ var VikingStatusPillWc = class extends HTMLElementBase {
2999
+ static tag = "viking-status-pill";
3000
+ static legacyTag = "viking-status-pill-wc";
3001
+ static get observedAttributes() {
3002
+ return ["tone", "icon", "href", "target", "compact", "dot", "removable", "aria-label"];
3003
+ }
3004
+ shadow;
3005
+ constructor() {
3006
+ super();
3007
+ this.shadow = this.attachShadow({ mode: "open" });
3008
+ attachShadowStyles(this.shadow, VIKING_STATUS_PILL_STYLES);
3009
+ }
3010
+ connectedCallback() {
3011
+ this.render();
3012
+ }
3013
+ attributeChangedCallback() {
3014
+ if (this.isConnected) {
3015
+ this.render();
3016
+ }
3017
+ }
3018
+ get tone() {
3019
+ const raw = this.getAttribute("tone") ?? "muted";
3020
+ return TONES4.has(raw) ? raw : "muted";
3021
+ }
3022
+ get compact() {
3023
+ const compact = this.getAttribute("compact");
3024
+ return compact !== null && compact !== "false";
3025
+ }
3026
+ get removable() {
3027
+ const removable = this.getAttribute("removable");
3028
+ return removable !== null && removable !== "false";
3029
+ }
3030
+ get href() {
3031
+ return this.getAttribute("href");
3032
+ }
3033
+ get icon() {
3034
+ return this.getAttribute("icon");
3035
+ }
3036
+ get showDot() {
3037
+ const dot = this.getAttribute("dot");
3038
+ return dot !== null && dot !== "false";
3039
+ }
3040
+ onRemove = () => {
3041
+ this.dispatchEvent(
3042
+ new CustomEvent("viking-pill-removed", {
3043
+ bubbles: true,
3044
+ composed: true
3045
+ })
3046
+ );
3047
+ };
3048
+ render() {
3049
+ const tone = this.tone;
3050
+ const compact = this.compact ? " status-pill--compact" : "";
3051
+ const icon = this.icon ? renderInlineIcon(this.icon, 14, "status-pill__icon") : "";
3052
+ const dot = this.showDot ? `<span class="status-pill__dot" aria-hidden="true"></span>` : "";
3053
+ const label = `<span class="status-pill__label" part="label"><slot></slot></span>`;
3054
+ const ariaLabel = escapeHtml(this.getAttribute("aria-label") ?? "");
3055
+ const href = this.href;
3056
+ const target = this.getAttribute("target");
3057
+ const rel = href && target === "_blank" ? ' rel="noopener noreferrer"' : "";
3058
+ if (href) {
3059
+ this.shadow.innerHTML = `
3060
+ <a
3061
+ class="status-pill status-pill-${tone}${compact}"
3062
+ part="control"
3063
+ href="${escapeHtml(href)}"
3064
+ ${target ? `target="${escapeHtml(target)}"${rel}` : ""}
3065
+ ${ariaLabel ? `aria-label="${ariaLabel}"` : ""}
3066
+ >
3067
+ ${dot}
3068
+ ${icon}
3069
+ ${label}
3070
+ </a>
3071
+ `;
3072
+ return;
3073
+ }
3074
+ this.shadow.innerHTML = `
3075
+ <span
3076
+ class="status-pill status-pill-${tone}${compact}"
3077
+ part="control"
3078
+ ${ariaLabel ? `role="status" aria-label="${ariaLabel}"` : ""}
3079
+ >
3080
+ ${dot}
3081
+ ${icon}
3082
+ ${label}
3083
+ ${this.removable ? '<button type="button" class="status-pill__remove" part="remove" aria-label="Remove"><span class="status-pill__remove-icon" aria-hidden="true">&times;</span></button>' : ""}
3084
+ </span>
3085
+ `;
3086
+ this.shadow.querySelector(".status-pill__remove")?.addEventListener("click", this.onRemove);
3087
+ }
3088
+ };
3089
+ var VIKING_STATUS_PILL_STYLES = `
3090
+ :host {
3091
+ display: inline-flex;
3092
+ }
3093
+
3094
+ .status-pill {
3095
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-surface-alt) 88%, var(--viking-surface));
3096
+ --viking-status-pill-text: var(--viking-text-muted);
3097
+ --viking-status-pill-border: var(--viking-border-subtle);
3098
+ --viking-status-pill-shadow: var(--viking-shadow-xs);
3099
+
3100
+ display: inline-flex;
3101
+ align-items: center;
3102
+ gap: var(--viking-space-half);
3103
+ padding: var(--viking-space-half) var(--viking-space-2);
3104
+ border-radius: var(--viking-radius-pill);
3105
+ border: 1px solid var(--viking-status-pill-border);
3106
+ background: var(--viking-status-pill-bg);
3107
+ color: var(--viking-status-pill-text);
3108
+ font-family: var(--viking-font-family);
3109
+ font-size: var(--viking-font-size-xs);
3110
+ font-weight: var(--viking-font-weight-semibold);
3111
+ letter-spacing: var(--viking-letter-spacing-caps);
3112
+ line-height: var(--viking-line-height-snug);
3113
+ white-space: nowrap;
3114
+ text-transform: uppercase;
3115
+ box-shadow: var(--viking-status-pill-shadow);
3116
+ }
3117
+
3118
+ :host(:hover) .status-pill {
3119
+ text-decoration: none;
3120
+ }
3121
+
3122
+ .status-pill--compact {
3123
+ padding: var(--viking-space-half);
3124
+ font-size: var(--viking-font-size-2xs);
3125
+ }
3126
+
3127
+ .status-pill__label {
3128
+ display: inline-flex;
3129
+ align-items: center;
3130
+ }
3131
+
3132
+ .status-pill__dot {
3133
+ width: var(--viking-space-1);
3134
+ height: var(--viking-space-1);
3135
+ border-radius: var(--viking-radius-full);
3136
+ background: currentColor;
3137
+ flex: 0 0 auto;
3138
+ }
3139
+
3140
+ .status-pill__icon,
3141
+ ::slotted([data-viking-icon]) {
3142
+ width: var(--viking-space-3);
3143
+ height: var(--viking-space-3);
3144
+ color: currentColor;
3145
+ flex-shrink: 0;
3146
+ }
3147
+
3148
+ .status-pill__remove {
3149
+ display: inline-flex;
3150
+ align-items: center;
3151
+ justify-content: center;
3152
+ border: 1px solid transparent;
3153
+ background: transparent;
3154
+ color: currentColor;
3155
+ border-radius: var(--viking-radius-full);
3156
+ width: var(--viking-touch-target-min);
3157
+ height: var(--viking-touch-target-min);
3158
+ margin-right: calc(var(--viking-space-half) * -1);
3159
+ padding: 0;
3160
+ cursor: pointer;
3161
+ }
3162
+
3163
+ .status-pill__remove:hover {
3164
+ background: color-mix(in srgb, currentColor 10%, transparent);
3165
+ }
3166
+
3167
+ .status-pill__remove:focus-visible {
3168
+ outline: var(--viking-ring-width) solid var(--viking-ring);
3169
+ outline-offset: var(--viking-ring-offset);
3170
+ }
3171
+
3172
+ .status-pill-accent {
3173
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-accent) 18%, var(--viking-surface));
3174
+ --viking-status-pill-text: var(--viking-accent);
3175
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-accent) 52%, transparent);
3176
+ }
3177
+
3178
+ .status-pill-secondary {
3179
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-accent-secondary) 16%, var(--viking-surface));
3180
+ --viking-status-pill-text: var(--viking-accent-secondary);
3181
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-accent-secondary) 52%, transparent);
3182
+ }
3183
+
3184
+ .status-pill-success {
3185
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-success) 16%, var(--viking-surface));
3186
+ --viking-status-pill-text: var(--viking-success);
3187
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-success) 55%, transparent);
3188
+ }
3189
+
3190
+ .status-pill-warning {
3191
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-warning) 16%, var(--viking-surface));
3192
+ --viking-status-pill-text: var(--viking-warning);
3193
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-warning) 55%, transparent);
3194
+ }
3195
+
3196
+ .status-pill-danger {
3197
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-danger) 14%, var(--viking-surface));
3198
+ --viking-status-pill-text: var(--viking-danger-text);
3199
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-danger) 50%, transparent);
3200
+ }
3201
+
3202
+ .status-pill-info {
3203
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-info) 14%, var(--viking-surface));
3204
+ --viking-status-pill-text: var(--viking-info);
3205
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-info) 50%, transparent);
3206
+ }
3207
+
3208
+ .status-pill-muted {
3209
+ --viking-status-pill-bg: var(--viking-surface);
3210
+ --viking-status-pill-text: var(--viking-text-muted);
3211
+ --viking-status-pill-border: var(--viking-border-subtle);
3212
+ }
3213
+
3214
+ .status-pill a {
3215
+ color: inherit;
3216
+ }
3217
+
3218
+ a.status-pill {
3219
+ text-decoration: none;
3220
+ }
3221
+ `;
3222
+ var registerVikingStatusPillWc = () => {
3223
+ defineCustomElement(VikingStatusPillWc.tag, VikingStatusPillWc);
3224
+ defineCustomElementAlias(VikingStatusPillWc.legacyTag, VikingStatusPillWc);
3225
+ };
3226
+
2690
3227
  // src/lib/site-drakkar/site-drakkar.config.ts
2691
3228
  var SITE_NAV_LINKS = [
2692
3229
  {
@@ -2902,6 +3439,376 @@ var DEFAULT_SITE_URLS = {
2902
3439
  backend: "https://backend.deml.app"
2903
3440
  };
2904
3441
 
3442
+ // src/web/site-footer/viking-site-footer-wc.ts
3443
+ var VALID_CONTEXTS = /* @__PURE__ */ new Set([
3444
+ "app",
3445
+ "marketing",
3446
+ "backend",
3447
+ "docs"
3448
+ ]);
3449
+ var detectContext = () => {
3450
+ const explicit = document.documentElement.getAttribute("data-deml-context");
3451
+ if (explicit && VALID_CONTEXTS.has(explicit)) {
3452
+ return explicit;
3453
+ }
3454
+ const host = window.location.hostname;
3455
+ if (host.startsWith("backend.")) {
3456
+ return "backend";
3457
+ }
3458
+ if (host.includes("deml.app")) {
3459
+ return "app";
3460
+ }
3461
+ return "marketing";
3462
+ };
3463
+ var readContext = (el) => {
3464
+ const attr = el.getAttribute("context");
3465
+ if (attr && VALID_CONTEXTS.has(attr)) {
3466
+ return attr;
3467
+ }
3468
+ return detectContext();
3469
+ };
3470
+ var readUrls = (el) => {
3471
+ const env = globalThis.__DEML ?? {};
3472
+ return {
3473
+ app: el.getAttribute("app-url") ?? env.app ?? DEFAULT_SITE_URLS.app,
3474
+ marketing: el.getAttribute("marketing-url") ?? env.marketing ?? DEFAULT_SITE_URLS.marketing,
3475
+ backend: el.getAttribute("backend-url") ?? env.backend ?? DEFAULT_SITE_URLS.backend
3476
+ };
3477
+ };
3478
+ var readYear = (el) => {
3479
+ const raw = el.getAttribute("year");
3480
+ const value = raw ? Number(raw) : (/* @__PURE__ */ new Date()).getFullYear();
3481
+ return Number.isFinite(value) ? value : (/* @__PURE__ */ new Date()).getFullYear();
3482
+ };
3483
+ var renderFooterLinks = (context, urls) => {
3484
+ return SITE_FOOTER_COLUMNS.map((column) => {
3485
+ const links = column.links.map((link) => {
3486
+ const href = resolveFooterHref(link, context, urls);
3487
+ return `
3488
+ <li>
3489
+ <a href="${escapeHtml(href)}">${escapeHtml(link.label)}</a>
3490
+ </li>
3491
+ `;
3492
+ }).join("");
3493
+ return `
3494
+ <div class="footer-column">
3495
+ <h3 class="footer-column-title">${escapeHtml(column.title)}</h3>
3496
+ <ul class="footer-list">
3497
+ ${links}
3498
+ </ul>
3499
+ </div>
3500
+ `;
3501
+ }).join("");
3502
+ };
3503
+ var VikingSiteFooterWc = class extends HTMLElement {
3504
+ static tag = "viking-site-footer";
3505
+ static legacyTag = "viking-site-footer-wc";
3506
+ static get observedAttributes() {
3507
+ return ["context", "app-url", "marketing-url", "backend-url", "year"];
3508
+ }
3509
+ connectedCallback() {
3510
+ this.render();
3511
+ }
3512
+ attributeChangedCallback() {
3513
+ if (this.isConnected) {
3514
+ this.render();
3515
+ }
3516
+ }
3517
+ render() {
3518
+ const context = readContext(this);
3519
+ const urls = readUrls(this);
3520
+ const year = readYear(this);
3521
+ const links = renderFooterLinks(context, urls);
3522
+ this.innerHTML = `
3523
+ <footer class="mega-footer">
3524
+ <div class="footer-content">
3525
+ <nav class="footer-directory" aria-label="Footer Directory">
3526
+ ${links}
3527
+ </nav>
3528
+
3529
+ <section class="footer-bottom">
3530
+ <div class="footer-badges-top">
3531
+ <span
3532
+ class="usa-badge"
3533
+ id="usa-badge"
3534
+ role="button"
3535
+ tabindex="0"
3536
+ aria-label="Made in the U.S.A."
3537
+ >
3538
+ <span class="usa-badge-icon" aria-hidden="true">\u{1F1FA}\u{1F1F8}</span>
3539
+ <span>Made in the U.S.A</span>
3540
+ </span>
3541
+ </div>
3542
+
3543
+ <div class="footer-compliance-row">
3544
+ <div class="copyright-info">
3545
+ <span class="copyright-text">
3546
+ Copyright \xA9 ${year} Data Engineering for Machine Learning by
3547
+ <a href="https://joealongi.dev/" target="_blank" rel="noopener noreferrer">Joe Alongi</a>.
3548
+ All rights reserved.
3549
+ </span>
3550
+ </div>
3551
+ </div>
3552
+ </section>
3553
+ </div>
3554
+ </footer>
3555
+ `;
3556
+ }
3557
+ };
3558
+ var registerVikingSiteFooterWc = () => {
3559
+ defineCustomElement(VikingSiteFooterWc.tag, VikingSiteFooterWc);
3560
+ defineCustomElementAlias(VikingSiteFooterWc.legacyTag, VikingSiteFooterWc);
3561
+ };
3562
+
3563
+ // src/web/site-navbar/viking-site-navbar-wc.ts
3564
+ var VALID_CONTEXTS2 = /* @__PURE__ */ new Set([
3565
+ "app",
3566
+ "marketing",
3567
+ "backend",
3568
+ "docs"
3569
+ ]);
3570
+ var detectContext2 = () => {
3571
+ const explicit = document.documentElement.getAttribute("data-deml-context");
3572
+ if (explicit && VALID_CONTEXTS2.has(explicit)) {
3573
+ return explicit;
3574
+ }
3575
+ const host = window.location.hostname;
3576
+ if (host.startsWith("ui.")) {
3577
+ return "docs";
3578
+ }
3579
+ if (host.startsWith("backend.")) {
3580
+ return "backend";
3581
+ }
3582
+ if (host.includes("deml.app")) {
3583
+ return "app";
3584
+ }
3585
+ return "marketing";
3586
+ };
3587
+ var readContext2 = (el) => {
3588
+ const attr = el.getAttribute("context");
3589
+ if (attr && VALID_CONTEXTS2.has(attr)) {
3590
+ return attr;
3591
+ }
3592
+ return detectContext2();
3593
+ };
3594
+ var readBoolAttr2 = (el, name) => {
3595
+ const value = el.getAttribute(name);
3596
+ return value !== null && value !== "false";
3597
+ };
3598
+ var readUrls2 = (el) => {
3599
+ const env = globalThis.__DEML ?? {};
3600
+ return {
3601
+ app: el.getAttribute("app-url") ?? env.app ?? DEFAULT_SITE_URLS.app,
3602
+ marketing: el.getAttribute("marketing-url") ?? env.marketing ?? DEFAULT_SITE_URLS.marketing,
3603
+ backend: el.getAttribute("backend-url") ?? env.backend ?? DEFAULT_SITE_URLS.backend
3604
+ };
3605
+ };
3606
+ var readAuthState = (el) => readBoolAttr2(el, "authenticated");
3607
+ var readShowSearch = (el) => {
3608
+ const explicit = el.getAttribute("show-search");
3609
+ if (explicit === null) {
3610
+ return true;
3611
+ }
3612
+ return readBoolAttr2(el, "show-search");
3613
+ };
3614
+ var readSignInHref = (el, urls) => {
3615
+ const explicit = el.getAttribute("sign-in-href");
3616
+ if (explicit) {
3617
+ return explicit;
3618
+ }
3619
+ const landing = el.getAttribute("return-url") ?? window.location.href;
3620
+ return `${urls.app}/login?returnUrl=${encodeURIComponent(landing)}`;
3621
+ };
3622
+ var VikingSiteNavbarWc = class extends HTMLElement {
3623
+ static tag = "viking-site-navbar";
3624
+ static legacyTag = "viking-site-navbar-wc";
3625
+ static get observedAttributes() {
3626
+ return [
3627
+ "context",
3628
+ "app-url",
3629
+ "marketing-url",
3630
+ "backend-url",
3631
+ "authenticated",
3632
+ "show-search",
3633
+ "sign-in-href",
3634
+ "dashboard-href",
3635
+ "return-url"
3636
+ ];
3637
+ }
3638
+ connectedCallback() {
3639
+ this.render();
3640
+ }
3641
+ attributeChangedCallback() {
3642
+ if (this.isConnected) {
3643
+ this.render();
3644
+ }
3645
+ }
3646
+ renderNavLinks(context, urls, kind = "desktop") {
3647
+ const linkClass = kind === "mobile" ? "mobile-nav-btn" : "nav-btn";
3648
+ return SITE_NAV_LINKS.map((link) => {
3649
+ const href = resolveNavHref(link, context, urls);
3650
+ const isProtected = link.requireAuth;
3651
+ const hidden = isProtected ? " hidden" : "";
3652
+ const authAttr = isProtected ? ' data-require-auth="true"' : "";
3653
+ return `
3654
+ <a
3655
+ href="${escapeHtml(href)}"
3656
+ class="${linkClass}"
3657
+ data-nav-id="${escapeHtml(link.id)}"
3658
+ ${authAttr}
3659
+ ${hidden}
3660
+ >
3661
+ <span data-viking-icon="${escapeHtml(link.icon)}" data-viking-icon-size="16" aria-hidden="true"></span>
3662
+ <span>${escapeHtml(link.label)}</span>
3663
+ </a>
3664
+ `;
3665
+ }).join("");
3666
+ }
3667
+ renderAuthDesktop(authenticated, signInHref, dashboardHref) {
3668
+ const href = authenticated ? dashboardHref : signInHref;
3669
+ return `
3670
+ <div class="desktop-auth">
3671
+ <viking-button-wc
3672
+ variant="primary"
3673
+ class="auth-btn"
3674
+ href="${escapeHtml(href)}"
3675
+ id="auth-btn-desktop"
3676
+ >
3677
+ <span
3678
+ id="auth-icon-desktop"
3679
+ data-viking-icon="${authenticated ? "home" : "arrow-right"}"
3680
+ data-viking-icon-size="16"
3681
+ aria-hidden="true"
3682
+ ></span>
3683
+ <span id="auth-text-desktop">${authenticated ? "Dashboard" : "Sign In"}</span>
3684
+ </viking-button-wc>
3685
+ <viking-button-wc
3686
+ variant="ghost"
3687
+ class="auth-btn auth-signout-btn"
3688
+ id="auth-signout-desktop"
3689
+ ${authenticated ? "" : " hidden"}
3690
+ >
3691
+ Sign Out
3692
+ </viking-button-wc>
3693
+ </div>
3694
+ `;
3695
+ }
3696
+ renderAuthMobile(authenticated, dashboardHref, signInHref) {
3697
+ return `
3698
+ <div class="mobile-divider"></div>
3699
+ <viking-button-wc
3700
+ variant="primary"
3701
+ full-width
3702
+ class="mobile-auth-btn auth-btn"
3703
+ href="${escapeHtml(authenticated ? dashboardHref : signInHref)}"
3704
+ id="auth-btn-mobile"
3705
+ >
3706
+ <span
3707
+ id="auth-icon-mobile"
3708
+ data-viking-icon="${authenticated ? "home" : "arrow-right"}"
3709
+ data-viking-icon-size="16"
3710
+ aria-hidden="true"
3711
+ ></span>
3712
+ <span id="auth-text-mobile">${authenticated ? "Dashboard" : "Sign In"}</span>
3713
+ </viking-button-wc>
3714
+ <viking-button-wc
3715
+ variant="ghost"
3716
+ full-width
3717
+ class="mobile-auth-btn auth-btn auth-signout-btn"
3718
+ id="auth-signout-mobile"
3719
+ ${authenticated ? "" : " hidden"}
3720
+ >
3721
+ Sign Out
3722
+ </viking-button-wc>
3723
+ `;
3724
+ }
3725
+ renderSearchButton(showSearch) {
3726
+ if (!showSearch) {
3727
+ return "";
3728
+ }
3729
+ const shortcut = navigator.platform.match(/Mac|iPhone|iPad/i) ? "\u2318K" : "Ctrl+K";
3730
+ return `
3731
+ <div class="navbar-search" role="search">
3732
+ <viking-button-wc
3733
+ variant="outline"
3734
+ square
3735
+ compact
3736
+ class="navbar-search-trigger"
3737
+ aria-label="Open search (${shortcut})"
3738
+ id="navbar-search-trigger"
3739
+ >
3740
+ <span data-viking-icon="search" data-viking-icon-size="20" aria-hidden="true"></span>
3741
+ </viking-button-wc>
3742
+ </div>
3743
+ `;
3744
+ }
3745
+ render() {
3746
+ const context = readContext2(this);
3747
+ const urls = readUrls2(this);
3748
+ const authenticated = readAuthState(this);
3749
+ const showSearch = readShowSearch(this);
3750
+ const brandHref = resolveBrandHref(context, urls);
3751
+ const signInHref = readSignInHref(this, urls);
3752
+ const dashboardHref = this.getAttribute("dashboard-href") ?? `${urls.app}/dashboard`;
3753
+ const desktopNavLinks = this.renderNavLinks(context, urls, "desktop");
3754
+ const mobileNavLinks = this.renderNavLinks(context, urls, "mobile");
3755
+ const desktopAuth = this.renderAuthDesktop(
3756
+ authenticated,
3757
+ signInHref,
3758
+ dashboardHref
3759
+ );
3760
+ const mobileAuth = this.renderAuthMobile(authenticated, dashboardHref, signInHref);
3761
+ const search = this.renderSearchButton(showSearch);
3762
+ this.innerHTML = `
3763
+ <header class="navbar">
3764
+ <div class="navbar-content">
3765
+ <div class="navbar-left">
3766
+ <a href="${escapeHtml(brandHref)}" class="navbar-brand" aria-label="Go to homepage" id="navbar-brand-link">
3767
+ <span
3768
+ class="brand-icon navbar-logo"
3769
+ data-viking-icon="drakkar"
3770
+ data-viking-icon-color="accent"
3771
+ data-viking-icon-size="28"
3772
+ aria-hidden="true"
3773
+ ></span>
3774
+ </a>
3775
+ </div>
3776
+
3777
+ <nav class="navbar-center desktop-nav" aria-label="Main navigation">
3778
+ ${desktopNavLinks}
3779
+ </nav>
3780
+
3781
+ <div class="navbar-right">
3782
+ ${search}
3783
+ ${desktopAuth}
3784
+ <viking-theme-toggle-wc class="theme-toggle-btn" aria-label="Toggle light and dark theme"></viking-theme-toggle-wc>
3785
+ <viking-button-wc
3786
+ variant="outline"
3787
+ square
3788
+ class="menu-toggle-btn"
3789
+ aria-label="Toggle navigation menu"
3790
+ aria-controls="mobile-menu"
3791
+ aria-expanded="false"
3792
+ id="mobile-menu-btn"
3793
+ >
3794
+ <span data-viking-icon="menu" data-viking-icon-size="24" aria-hidden="true"></span>
3795
+ </viking-button-wc>
3796
+ </div>
3797
+ </div>
3798
+
3799
+ <nav class="mobile-menu" id="mobile-menu" aria-label="Mobile navigation" hidden>
3800
+ ${mobileNavLinks}
3801
+ ${mobileAuth}
3802
+ </nav>
3803
+ </header>
3804
+ `;
3805
+ }
3806
+ };
3807
+ var registerVikingSiteNavbarWc = () => {
3808
+ defineCustomElement(VikingSiteNavbarWc.tag, VikingSiteNavbarWc);
3809
+ defineCustomElementAlias(VikingSiteNavbarWc.legacyTag, VikingSiteNavbarWc);
3810
+ };
3811
+
2905
3812
  // src/lib/site-drakkar/suite-search-items.ts
2906
3813
  var dedupeItems = (items) => {
2907
3814
  const seen = /* @__PURE__ */ new Set();
@@ -3086,15 +3993,15 @@ var buildSuiteSearchItems = (context, urls, options) => {
3086
3993
  };
3087
3994
 
3088
3995
  // src/web/suite-search-palette/viking-suite-search-palette-wc.ts
3089
- var VALID_CONTEXTS = /* @__PURE__ */ new Set([
3996
+ var VALID_CONTEXTS3 = /* @__PURE__ */ new Set([
3090
3997
  "app",
3091
3998
  "marketing",
3092
3999
  "backend",
3093
4000
  "docs"
3094
4001
  ]);
3095
- var detectContext = () => {
4002
+ var detectContext3 = () => {
3096
4003
  const explicit = document.documentElement.getAttribute("data-deml-context");
3097
- if (explicit && VALID_CONTEXTS.has(explicit)) {
4004
+ if (explicit && VALID_CONTEXTS3.has(explicit)) {
3098
4005
  return explicit;
3099
4006
  }
3100
4007
  const host = window.location.hostname;
@@ -3109,7 +4016,7 @@ var detectContext = () => {
3109
4016
  }
3110
4017
  return "marketing";
3111
4018
  };
3112
- var readUrls = (el) => {
4019
+ var readUrls3 = (el) => {
3113
4020
  const env = globalThis.__DEML ?? {};
3114
4021
  return {
3115
4022
  app: el.getAttribute("app-url") ?? env.app ?? DEFAULT_SITE_URLS.app,
@@ -3117,12 +4024,12 @@ var readUrls = (el) => {
3117
4024
  backend: el.getAttribute("backend-url") ?? env.backend ?? DEFAULT_SITE_URLS.backend
3118
4025
  };
3119
4026
  };
3120
- var readContext = (el) => {
4027
+ var readContext3 = (el) => {
3121
4028
  const raw = el.getAttribute("context");
3122
- if (raw && VALID_CONTEXTS.has(raw)) {
4029
+ if (raw && VALID_CONTEXTS3.has(raw)) {
3123
4030
  return raw;
3124
4031
  }
3125
- return detectContext();
4032
+ return detectContext3();
3126
4033
  };
3127
4034
  var VikingSuiteSearchPaletteWc = class extends HTMLElementBase {
3128
4035
  static tag = "viking-suite-command-palette";
@@ -3194,8 +4101,8 @@ var VikingSuiteSearchPaletteWc = class extends HTMLElementBase {
3194
4101
  if (!this.paletteEl || this.itemsLoaded && !force) {
3195
4102
  return;
3196
4103
  }
3197
- const context = readContext(this);
3198
- const urls = readUrls(this);
4104
+ const context = readContext3(this);
4105
+ const urls = readUrls3(this);
3199
4106
  let items = buildSuiteSearchItems(
3200
4107
  context,
3201
4108
  urls,
@@ -3301,22 +4208,29 @@ var VikingThemeToggleWc = class extends HTMLElementBase {
3301
4208
  button = null;
3302
4209
  sunIcon = null;
3303
4210
  moonIcon = null;
4211
+ onStorage = () => {
4212
+ this.syncIcons();
4213
+ };
3304
4214
  constructor() {
3305
4215
  super();
3306
4216
  this.shadow = this.attachShadow({ mode: "open" });
3307
4217
  attachShadowStyles(this.shadow, VIKING_THEME_TOGGLE_STYLES);
3308
4218
  }
3309
4219
  connectedCallback() {
3310
- if (!this.hasAttribute("role")) {
3311
- this.setAttribute("role", "button");
3312
- }
3313
4220
  this.render();
3314
4221
  this.syncIcons();
3315
4222
  this.button?.addEventListener("click", this.onClick);
4223
+ window.addEventListener("storage", this.onStorage);
4224
+ window.addEventListener("viking-theme-change", this.onThemeChange);
3316
4225
  }
3317
4226
  disconnectedCallback() {
3318
4227
  this.button?.removeEventListener("click", this.onClick);
4228
+ window.removeEventListener("storage", this.onStorage);
4229
+ window.removeEventListener("viking-theme-change", this.onThemeChange);
3319
4230
  }
4231
+ onThemeChange = () => {
4232
+ this.syncIcons();
4233
+ };
3320
4234
  onClick = () => {
3321
4235
  const next = readTheme() === "light" ? "dark" : "light";
3322
4236
  applyTheme(next);
@@ -3330,9 +4244,9 @@ var VikingThemeToggleWc = class extends HTMLElementBase {
3330
4244
  );
3331
4245
  };
3332
4246
  syncIcons = () => {
3333
- const isLight = readTheme() === "light";
3334
- this.sunIcon?.classList.toggle("is-visible", isLight);
3335
- this.moonIcon?.classList.toggle("is-visible", !isLight);
4247
+ const isDark = readTheme() === "dark";
4248
+ this.sunIcon?.classList.toggle("is-visible", isDark);
4249
+ this.moonIcon?.classList.toggle("is-visible", !isDark);
3336
4250
  };
3337
4251
  render() {
3338
4252
  const label = this.getAttribute("aria-label") ?? "Toggle light and dark theme";
@@ -3357,7 +4271,7 @@ var registerVikingThemeToggleWc = () => {
3357
4271
  };
3358
4272
 
3359
4273
  // src/web/suite-header/viking-suite-header-wc.ts
3360
- var VALID_CONTEXTS2 = /* @__PURE__ */ new Set([
4274
+ var VALID_CONTEXTS4 = /* @__PURE__ */ new Set([
3361
4275
  "app",
3362
4276
  "marketing",
3363
4277
  "backend",
@@ -3708,9 +4622,9 @@ viking-suite-command-palette {
3708
4622
  }
3709
4623
  }
3710
4624
  `;
3711
- var detectContext2 = () => {
4625
+ var detectContext4 = () => {
3712
4626
  const explicit = document.documentElement.getAttribute("data-deml-context");
3713
- if (explicit && VALID_CONTEXTS2.has(explicit)) {
4627
+ if (explicit && VALID_CONTEXTS4.has(explicit)) {
3714
4628
  return explicit;
3715
4629
  }
3716
4630
  const host = window.location.hostname;
@@ -3725,14 +4639,14 @@ var detectContext2 = () => {
3725
4639
  }
3726
4640
  return "marketing";
3727
4641
  };
3728
- var readContext2 = (el) => {
4642
+ var readContext4 = (el) => {
3729
4643
  const raw = el.getAttribute("context");
3730
- if (raw && VALID_CONTEXTS2.has(raw)) {
4644
+ if (raw && VALID_CONTEXTS4.has(raw)) {
3731
4645
  return raw;
3732
4646
  }
3733
- return detectContext2();
4647
+ return detectContext4();
3734
4648
  };
3735
- var readUrls2 = (el) => {
4649
+ var readUrls4 = (el) => {
3736
4650
  const env = globalThis.__DEML ?? {};
3737
4651
  return {
3738
4652
  app: el.getAttribute("app-url") ?? env.app ?? DEFAULT_SITE_URLS.app,
@@ -3917,8 +4831,8 @@ var VikingSuiteHeaderWc = class extends HTMLElementBase {
3917
4831
  return this.getAttribute("dashboard-href") ?? `${urls.app}/dashboard`;
3918
4832
  }
3919
4833
  render() {
3920
- const context = readContext2(this);
3921
- const urls = readUrls2(this);
4834
+ const context = readContext4(this);
4835
+ const urls = readUrls4(this);
3922
4836
  const authenticated = readBoolAttr(this, "authenticated");
3923
4837
  const navLinks = this.renderNavLinks(context, urls, authenticated);
3924
4838
  const brandHref = resolveBrandHref(context, urls);
@@ -4163,8 +5077,12 @@ var registerVikingElements = () => {
4163
5077
  registerVikingSelectWc();
4164
5078
  registerVikingModalWc();
4165
5079
  registerVikingSearchPaletteWc();
5080
+ registerVikingStatusCardWc();
5081
+ registerVikingStatusPillWc();
4166
5082
  registerVikingSuiteHeaderWc();
4167
5083
  registerVikingSuiteSearchPaletteWc();
5084
+ registerVikingSiteNavbarWc();
5085
+ registerVikingSiteFooterWc();
4168
5086
  registerVikingThemeToggleWc();
4169
5087
  };
4170
5088
  if (typeof globalThis !== "undefined" && typeof document !== "undefined") {
@@ -4184,6 +5102,10 @@ export {
4184
5102
  VikingModalWc,
4185
5103
  VikingSearchPaletteWc,
4186
5104
  VikingSelectWc,
5105
+ VikingSiteFooterWc,
5106
+ VikingSiteNavbarWc,
5107
+ VikingStatusCardWc,
5108
+ VikingStatusPillWc,
4187
5109
  VikingSuiteHeaderWc,
4188
5110
  VikingSuiteSearchPaletteWc,
4189
5111
  VikingThemeToggleWc,
@@ -4197,6 +5119,10 @@ export {
4197
5119
  registerVikingModalWc,
4198
5120
  registerVikingSearchPaletteWc,
4199
5121
  registerVikingSelectWc,
5122
+ registerVikingSiteFooterWc,
5123
+ registerVikingSiteNavbarWc,
5124
+ registerVikingStatusCardWc,
5125
+ registerVikingStatusPillWc,
4200
5126
  registerVikingSuiteHeaderWc,
4201
5127
  registerVikingSuiteSearchPaletteWc,
4202
5128
  registerVikingThemeToggleWc