@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.
@@ -364,7 +364,7 @@ const attachShadowStyles = (shadow, css) => {
364
364
  shadow.append(style);
365
365
  };
366
366
  /** Reads a boolean attribute presence/value. */
367
- const readBoolAttr = (el, name) => el.hasAttribute(name) && el.getAttribute(name) !== "false";
367
+ const readBoolAttr$1 = (el, name) => el.hasAttribute(name) && el.getAttribute(name) !== "false";
368
368
  /** Safely sets form value when ElementInternals is fully supported (e.g. not in jsdom). */
369
369
  const setFormValue = (internals, value) => {
370
370
  if (internals && typeof internals.setFormValue === "function") {
@@ -1124,14 +1124,29 @@ const VIKING_BUTTON_STYLES = `
1124
1124
  .viking-btn-label {
1125
1125
  display: inline-flex;
1126
1126
  align-items: center;
1127
+ justify-content: center;
1127
1128
  gap: var(--viking-space-1);
1128
1129
  line-height: 1.2;
1129
1130
  min-width: 0;
1130
- justify-content: center;
1131
1131
  text-align: center;
1132
1132
  white-space: nowrap;
1133
1133
  }
1134
1134
 
1135
+ .viking-btn-label ::slotted(*) {
1136
+ display: inline-flex;
1137
+ align-items: center;
1138
+ justify-content: center;
1139
+ flex: 0 0 auto;
1140
+ line-height: 1;
1141
+ }
1142
+
1143
+ .viking-btn-label ::slotted([data-viking-icon]),
1144
+ .viking-btn-label ::slotted(svg),
1145
+ .viking-btn-label ::slotted(viking-icon) {
1146
+ width: var(--viking-icon-size-md);
1147
+ height: var(--viking-icon-size-md);
1148
+ }
1149
+
1135
1150
  .viking-btn-spinner {
1136
1151
  flex: 0 0 auto;
1137
1152
  width: var(--viking-icon-size-sm, 18px);
@@ -1659,6 +1674,11 @@ const VIKING_MODAL_STYLES = `
1659
1674
  display: contents;
1660
1675
  }
1661
1676
 
1677
+ .viking-modal-backdrop:not([open]) {
1678
+ display: none !important;
1679
+ pointer-events: none;
1680
+ }
1681
+
1662
1682
  .viking-modal-backdrop {
1663
1683
  position: fixed;
1664
1684
  inset: 0;
@@ -2026,7 +2046,7 @@ const VIKING_SEARCH_PALETTE_STYLES = `
2026
2046
  }
2027
2047
  `;
2028
2048
 
2029
- const TONES$1 = new Set([
2049
+ const TONES$3 = new Set([
2030
2050
  "accent",
2031
2051
  "secondary",
2032
2052
  "success",
@@ -2070,7 +2090,7 @@ class VikingBadgeWc extends HTMLElementBase {
2070
2090
  }
2071
2091
  get tone() {
2072
2092
  const value = (this.getAttribute("tone") ?? "");
2073
- return TONES$1.has(value) ? value : null;
2093
+ return TONES$3.has(value) ? value : null;
2074
2094
  }
2075
2095
  get size() {
2076
2096
  return this.getAttribute("size") === "sm" ? "sm" : null;
@@ -2126,14 +2146,15 @@ const VARIANTS = new Set([
2126
2146
  const SIZES = new Set(["sm", "xs"]);
2127
2147
  /**
2128
2148
  * Framework-agnostic Viking button Web Component.
2129
- * Tag: `viking-button` (legacy alias: `viking-button-wc`)
2149
+ * Tag: `viking-button-wc` (Angular reserves `viking-button` for its wrapper component)
2130
2150
  *
2131
2151
  * @example
2132
- * <viking-button variant="primary">Launch</viking-button>
2152
+ * <viking-button-wc variant="primary">Launch</viking-button-wc>
2133
2153
  */
2134
2154
  class VikingButtonWc extends HTMLElementBase {
2135
- static tag = "viking-button";
2136
- static legacyTag = "viking-button-wc";
2155
+ /** Reserved for Angular `viking-button` — do not register as a custom element. */
2156
+ static angularTag = "viking-button";
2157
+ static tag = "viking-button-wc";
2137
2158
  static get observedAttributes() {
2138
2159
  return [
2139
2160
  "variant",
@@ -2159,7 +2180,6 @@ class VikingButtonWc extends HTMLElementBase {
2159
2180
  }
2160
2181
  connectedCallback() {
2161
2182
  this.render();
2162
- this.syncHostSemantics();
2163
2183
  this.control?.addEventListener("click", this.onClick);
2164
2184
  }
2165
2185
  disconnectedCallback() {
@@ -2168,7 +2188,6 @@ class VikingButtonWc extends HTMLElementBase {
2168
2188
  attributeChangedCallback() {
2169
2189
  if (this.isConnected) {
2170
2190
  this.render();
2171
- this.syncHostSemantics();
2172
2191
  }
2173
2192
  }
2174
2193
  onClick = (event) => {
@@ -2192,18 +2211,13 @@ class VikingButtonWc extends HTMLElementBase {
2192
2211
  return value && SIZES.has(value) ? value : null;
2193
2212
  }
2194
2213
  get disabled() {
2195
- return readBoolAttr(this, "disabled");
2214
+ return readBoolAttr$1(this, "disabled");
2196
2215
  }
2197
2216
  get loading() {
2198
- return readBoolAttr(this, "loading");
2217
+ return readBoolAttr$1(this, "loading");
2199
2218
  }
2200
2219
  get square() {
2201
- return readBoolAttr(this, "square");
2202
- }
2203
- syncHostSemantics() {
2204
- if (!this.hasAttribute("role")) {
2205
- this.setAttribute("role", this.getAttribute("href") ? "link" : "button");
2206
- }
2220
+ return readBoolAttr$1(this, "square");
2207
2221
  }
2208
2222
  render() {
2209
2223
  const href = this.getAttribute("href");
@@ -2244,10 +2258,9 @@ class VikingButtonWc extends HTMLElementBase {
2244
2258
  }
2245
2259
  const registerVikingButtonWc = () => {
2246
2260
  defineCustomElement(VikingButtonWc.tag, VikingButtonWc);
2247
- defineCustomElementAlias(VikingButtonWc.legacyTag, VikingButtonWc);
2248
2261
  };
2249
2262
 
2250
- const TONES = new Set([
2263
+ const TONES$2 = new Set([
2251
2264
  "accent",
2252
2265
  "secondary",
2253
2266
  "success",
@@ -2290,7 +2303,7 @@ class VikingCalloutWc extends HTMLElementBase {
2290
2303
  }
2291
2304
  get tone() {
2292
2305
  const value = (this.getAttribute("tone") ?? "info");
2293
- return TONES.has(value) ? value : "info";
2306
+ return TONES$2.has(value) ? value : "info";
2294
2307
  }
2295
2308
  get dismissible() {
2296
2309
  return (this.hasAttribute("dismissible") &&
@@ -2458,7 +2471,7 @@ class VikingFieldWc extends HTMLElementBase {
2458
2471
  control.removeAttribute("error");
2459
2472
  }
2460
2473
  }
2461
- if (readBoolAttr(this, "required")) {
2474
+ if (readBoolAttr$1(this, "required")) {
2462
2475
  control.setAttribute("required", "");
2463
2476
  }
2464
2477
  };
@@ -2466,7 +2479,7 @@ class VikingFieldWc extends HTMLElementBase {
2466
2479
  const label = this.getAttribute("label") ?? "";
2467
2480
  const description = this.getAttribute("description") ?? "";
2468
2481
  const error = this.getAttribute("error") ?? "";
2469
- const required = readBoolAttr(this, "required");
2482
+ const required = readBoolAttr$1(this, "required");
2470
2483
  this.shadow.innerHTML = `
2471
2484
  <div class="viking-field" part="field" role="group" aria-labelledby="${this.labelId}">
2472
2485
  ${label
@@ -2566,16 +2579,16 @@ class VikingInputWc extends HTMLElementBase {
2566
2579
  this.syncFormValue();
2567
2580
  }
2568
2581
  get disabled() {
2569
- return readBoolAttr(this, "disabled");
2582
+ return readBoolAttr$1(this, "disabled");
2570
2583
  }
2571
2584
  get loading() {
2572
- return readBoolAttr(this, "loading");
2585
+ return readBoolAttr$1(this, "loading");
2573
2586
  }
2574
2587
  get clearable() {
2575
- return readBoolAttr(this, "clearable");
2588
+ return readBoolAttr$1(this, "clearable");
2576
2589
  }
2577
2590
  get bare() {
2578
- return readBoolAttr(this, "bare");
2591
+ return readBoolAttr$1(this, "bare");
2579
2592
  }
2580
2593
  onInput = () => {
2581
2594
  const next = this.input?.value ?? "";
@@ -2615,8 +2628,8 @@ class VikingInputWc extends HTMLElementBase {
2615
2628
  const maxLength = escapeHtml(this.getAttribute("maxlength") ?? "");
2616
2629
  const pattern = escapeHtml(this.getAttribute("pattern") ?? "");
2617
2630
  const error = this.getAttribute("error") ?? "";
2618
- const required = readBoolAttr(this, "required");
2619
- const readonly = readBoolAttr(this, "readonly");
2631
+ const required = readBoolAttr$1(this, "required");
2632
+ const readonly = readBoolAttr$1(this, "readonly");
2620
2633
  const showClear = this.clearable && value.length > 0 && !this.loading && !this.bare;
2621
2634
  const nativeAttrs = `
2622
2635
  ${this.disabled || this.loading ? "disabled" : ""}
@@ -2674,7 +2687,7 @@ const registerVikingInputWc = () => {
2674
2687
 
2675
2688
  /**
2676
2689
  * Framework-agnostic modal Web Component using native `<dialog>` semantics.
2677
- * Tag: `viking-modal` (legacy aliases: `viking-modal-wc`, `viking-dialog`)
2690
+ * Tag: `viking-modal-wc` (Angular reserves `viking-modal`; alias: `viking-dialog`)
2678
2691
  *
2679
2692
  * @attr open - When present, shows the modal
2680
2693
  * @attr title - Dialog title for aria-label / heading
@@ -2689,14 +2702,15 @@ const registerVikingInputWc = () => {
2689
2702
  * @event viking-close - Fired when the dialog closes
2690
2703
  *
2691
2704
  * @example
2692
- * <viking-modal title="Confirm deploy">
2705
+ * <viking-modal-wc title="Confirm deploy">
2693
2706
  * <p>Push v2.0.0 to production?</p>
2694
- * <viking-button slot="actions" variant="primary">Deploy</viking-button>
2695
- * </viking-modal>
2707
+ * <viking-button-wc slot="actions" variant="primary">Deploy</viking-button-wc>
2708
+ * </viking-modal-wc>
2696
2709
  */
2697
2710
  class VikingModalWc extends HTMLElementBase {
2698
- static tag = "viking-modal";
2699
- static legacyTag = "viking-modal-wc";
2711
+ /** Reserved for Angular `viking-modal` — do not register as a custom element. */
2712
+ static angularTag = "viking-modal";
2713
+ static tag = "viking-modal-wc";
2700
2714
  static dialogTag = "viking-dialog";
2701
2715
  static get observedAttributes() {
2702
2716
  return ["open", "title", "dismissible"];
@@ -2820,7 +2834,6 @@ class VikingModalWc extends HTMLElementBase {
2820
2834
  }
2821
2835
  const registerVikingModalWc = () => {
2822
2836
  defineCustomElement(VikingModalWc.tag, VikingModalWc);
2823
- defineCustomElementAlias(VikingModalWc.legacyTag, VikingModalWc);
2824
2837
  defineCustomElementAlias(VikingModalWc.dialogTag, VikingModalWc);
2825
2838
  };
2826
2839
 
@@ -3034,7 +3047,7 @@ class VikingSearchPaletteWc extends HTMLElementBase {
3034
3047
  }
3035
3048
  };
3036
3049
  bindGlobalShortcut() {
3037
- if (!readBoolAttr(this, "global-shortcut")) {
3050
+ if (!readBoolAttr$1(this, "global-shortcut")) {
3038
3051
  return;
3039
3052
  }
3040
3053
  this.globalKeyHandler = (event) => {
@@ -3223,10 +3236,571 @@ class VikingSearchPaletteWc extends HTMLElementBase {
3223
3236
  });
3224
3237
  }
3225
3238
  }
3226
- const registerVikingSearchPaletteWc = () => {
3227
- defineCustomElement(VikingSearchPaletteWc.tag, VikingSearchPaletteWc);
3228
- defineCustomElementAlias(VikingSearchPaletteWc.searchTag, VikingSearchPaletteWc);
3229
- defineCustomElementAlias(VikingSearchPaletteWc.legacyTag, VikingSearchPaletteWc);
3239
+ const registerVikingSearchPaletteWc = () => {
3240
+ defineCustomElement(VikingSearchPaletteWc.tag, VikingSearchPaletteWc);
3241
+ defineCustomElementAlias(VikingSearchPaletteWc.searchTag, VikingSearchPaletteWc);
3242
+ defineCustomElementAlias(VikingSearchPaletteWc.legacyTag, VikingSearchPaletteWc);
3243
+ };
3244
+
3245
+ const TONES$1 = new Set([
3246
+ "accent",
3247
+ "secondary",
3248
+ "success",
3249
+ "warning",
3250
+ "danger",
3251
+ "info",
3252
+ "muted",
3253
+ ]);
3254
+ /**
3255
+ * Framework-agnostic status page card with title/subtitle, optional status chip,
3256
+ * and optional action slot.
3257
+ * Tag: `viking-status-card` (legacy alias: `viking-status-card-wc`)
3258
+ *
3259
+ * @attr title - Card heading
3260
+ * @attr subtitle - Supporting body text
3261
+ * @attr status - Optional status chip label
3262
+ * @attr status-tone - accent | secondary | success | warning | danger | info | muted
3263
+ * @attr status-clickable - Wrap status in anchor style token (visual-only)
3264
+ * @attr href - Optional outbound/intra-app card link
3265
+ * @attr compact - Reduce padding and spacing
3266
+ * @attr loading - Reserved loading state class
3267
+ */
3268
+ class VikingStatusCardWc extends HTMLElementBase {
3269
+ static tag = "viking-status-card";
3270
+ static legacyTag = "viking-status-card-wc";
3271
+ static get observedAttributes() {
3272
+ return [
3273
+ "title",
3274
+ "subtitle",
3275
+ "status",
3276
+ "status-tone",
3277
+ "status-dot",
3278
+ "href",
3279
+ "target",
3280
+ "compact",
3281
+ "loading",
3282
+ "interactive",
3283
+ "aria-label",
3284
+ ];
3285
+ }
3286
+ shadow = this.attachShadow({ mode: "open" });
3287
+ connectedCallback() {
3288
+ this.render();
3289
+ }
3290
+ attributeChangedCallback() {
3291
+ if (this.isConnected) {
3292
+ this.render();
3293
+ }
3294
+ }
3295
+ get compact() {
3296
+ const compact = this.getAttribute("compact");
3297
+ return compact !== null && compact !== "false";
3298
+ }
3299
+ get loading() {
3300
+ const loading = this.getAttribute("loading");
3301
+ return loading !== null && loading !== "false";
3302
+ }
3303
+ get interactive() {
3304
+ const interactive = this.getAttribute("interactive");
3305
+ return interactive !== null && interactive !== "false";
3306
+ }
3307
+ get href() {
3308
+ return this.getAttribute("href");
3309
+ }
3310
+ get target() {
3311
+ return this.getAttribute("target");
3312
+ }
3313
+ get statusTone() {
3314
+ const raw = (this.getAttribute("status-tone") ?? "muted");
3315
+ return TONES$1.has(raw) ? raw : "muted";
3316
+ }
3317
+ get statusDot() {
3318
+ const statusDot = this.getAttribute("status-dot");
3319
+ return statusDot !== null && statusDot !== "false";
3320
+ }
3321
+ get cardTitle() {
3322
+ return this.getAttribute("title") ?? "";
3323
+ }
3324
+ get subtitle() {
3325
+ return this.getAttribute("subtitle") ?? "";
3326
+ }
3327
+ get status() {
3328
+ return this.getAttribute("status") ?? "";
3329
+ }
3330
+ render() {
3331
+ const hasStatus = this.status.length > 0;
3332
+ const title = this.cardTitle;
3333
+ const subtitle = this.subtitle;
3334
+ const compactClass = this.compact ? " status-card--compact" : "";
3335
+ const loadingClass = this.loading ? " status-card--loading" : "";
3336
+ const interactiveClass = this.interactive ? " status-card--interactive" : "";
3337
+ const wrapperClass = `status-card${compactClass}${loadingClass}${interactiveClass}`;
3338
+ const rel = this.target === "_blank" ? ' rel="noopener noreferrer"' : "";
3339
+ const statusDot = this.statusDot
3340
+ ? '<span class="status-card__status-dot" aria-hidden="true"></span>'
3341
+ : "";
3342
+ const statusChip = hasStatus
3343
+ ? `<span class="status-card__status status-card__status-${this.statusTone}" part="status">${statusDot}<span>${escapeHtml(this.status)}</span></span>`
3344
+ : "";
3345
+ const safeHref = this.href ? escapeHtml(this.href) : "";
3346
+ const safeLabel = escapeHtml(this.getAttribute("aria-label") ?? "");
3347
+ const wrapperTag = safeHref ? "a" : "div";
3348
+ const header = `
3349
+ <header class="status-card__header">
3350
+ <div class="status-card__title-wrap">
3351
+ ${title
3352
+ ? `<h3 class="status-card__title" part="title">${escapeHtml(title)}</h3>`
3353
+ : ""}
3354
+ ${subtitle
3355
+ ? `<p class="status-card__subtitle" part="subtitle">${escapeHtml(subtitle)}</p>`
3356
+ : ""}
3357
+ </div>
3358
+ ${hasStatus || statusDot
3359
+ ? `<div class="status-card__status-wrap">${statusChip}</div>`
3360
+ : ""}
3361
+ </header>
3362
+ `;
3363
+ this.shadow.innerHTML = `
3364
+ <style>
3365
+ ${VIKING_STATUS_CARD_STYLES}
3366
+ </style>
3367
+ <${wrapperTag}
3368
+ class="${wrapperClass}"
3369
+ part="card"
3370
+ ${safeHref ? `href="${safeHref}"` : ""}
3371
+ ${this.target ? `target="${escapeHtml(this.target)}"` : ""}
3372
+ ${safeHref ? rel : ""}
3373
+ ${safeLabel ? `aria-label="${safeLabel}"` : ""}
3374
+ >
3375
+ ${header}
3376
+ <section class="status-card__body">
3377
+ <slot></slot>
3378
+ </section>
3379
+ </${wrapperTag}>
3380
+ `;
3381
+ }
3382
+ }
3383
+ const VIKING_STATUS_CARD_STYLES = `
3384
+ :host {
3385
+ display: block;
3386
+ }
3387
+
3388
+ :host([compact]) .status-card,
3389
+ :host .status-card--compact {
3390
+ padding: var(--viking-card-padding-compact);
3391
+ gap: var(--viking-space-2);
3392
+ }
3393
+
3394
+ .status-card {
3395
+ display: grid;
3396
+ gap: var(--viking-space-3);
3397
+ width: 100%;
3398
+ padding: var(--viking-card-padding);
3399
+ border-radius: var(--viking-radius-lg);
3400
+ border: 1px solid var(--viking-border);
3401
+ background: var(--viking-surface);
3402
+ color: var(--viking-text);
3403
+ box-shadow: var(--viking-shadow-sm);
3404
+ box-sizing: border-box;
3405
+ position: relative;
3406
+ transition: var(--viking-transition-interactive);
3407
+ text-decoration: none;
3408
+ overflow: hidden;
3409
+ }
3410
+
3411
+ .status-card::before {
3412
+ content: "";
3413
+ position: absolute;
3414
+ inset: 0 0 auto;
3415
+ height: 1px;
3416
+ background: linear-gradient(
3417
+ 90deg,
3418
+ transparent,
3419
+ color-mix(in srgb, var(--viking-metallic-200) 24%, transparent),
3420
+ transparent
3421
+ );
3422
+ pointer-events: none;
3423
+ }
3424
+
3425
+ .status-card--interactive {
3426
+ cursor: pointer;
3427
+ }
3428
+
3429
+ .status-card--interactive:hover {
3430
+ border-color: var(--viking-accent-strong);
3431
+ box-shadow: var(--viking-shadow-hover);
3432
+ transform: translateY(var(--viking-state-hover-lift));
3433
+ }
3434
+
3435
+ .status-card--loading {
3436
+ pointer-events: none;
3437
+ opacity: var(--viking-state-disabled-opacity);
3438
+ }
3439
+
3440
+ .status-card__header {
3441
+ display: flex;
3442
+ justify-content: space-between;
3443
+ gap: var(--viking-space-3);
3444
+ align-items: flex-start;
3445
+ min-width: 0;
3446
+ }
3447
+
3448
+ .status-card__title-wrap {
3449
+ display: grid;
3450
+ gap: var(--viking-space-1);
3451
+ min-width: 0;
3452
+ }
3453
+
3454
+ .status-card__title {
3455
+ margin: 0;
3456
+ font-size: var(--viking-font-size-xl);
3457
+ font-weight: var(--viking-font-weight-bold);
3458
+ letter-spacing: var(--viking-letter-spacing-tight);
3459
+ line-height: var(--viking-line-height-tight);
3460
+ }
3461
+
3462
+ .status-card__subtitle {
3463
+ margin: 0;
3464
+ max-width: 60ch;
3465
+ color: var(--viking-text-muted);
3466
+ font-size: var(--viking-font-size-base);
3467
+ line-height: var(--viking-line-height-relaxed);
3468
+ }
3469
+
3470
+ .status-card__status-wrap {
3471
+ display: inline-flex;
3472
+ align-items: center;
3473
+ justify-content: flex-end;
3474
+ }
3475
+
3476
+ .status-card__status {
3477
+ display: inline-flex;
3478
+ align-items: center;
3479
+ gap: var(--viking-space-1);
3480
+ max-width: fit-content;
3481
+ padding: calc(var(--viking-space-half) - 1px) var(--viking-space-1);
3482
+ border-radius: var(--viking-radius-pill);
3483
+ border: 1px solid var(--viking-border-subtle);
3484
+ background: color-mix(in srgb, var(--viking-surface) 92%, transparent);
3485
+ color: var(--viking-text-muted);
3486
+ text-transform: capitalize;
3487
+ font-size: var(--viking-font-size-xs);
3488
+ font-weight: var(--viking-font-weight-semibold);
3489
+ letter-spacing: var(--viking-letter-spacing-wide);
3490
+ }
3491
+
3492
+ .status-card__status-dot {
3493
+ width: var(--viking-space-1);
3494
+ height: var(--viking-space-1);
3495
+ border-radius: var(--viking-radius-full);
3496
+ background: currentColor;
3497
+ flex: 0 0 auto;
3498
+ }
3499
+
3500
+ .status-card__status-success {
3501
+ background: color-mix(in srgb, var(--viking-success) 12%, var(--viking-surface));
3502
+ border-color: color-mix(in srgb, var(--viking-success) 40%, transparent);
3503
+ color: var(--viking-success);
3504
+ }
3505
+
3506
+ .status-card__status-warning {
3507
+ background: color-mix(in srgb, var(--viking-warning) 12%, var(--viking-surface));
3508
+ border-color: color-mix(in srgb, var(--viking-warning) 40%, transparent);
3509
+ color: var(--viking-warning);
3510
+ }
3511
+
3512
+ .status-card__status-danger {
3513
+ background: color-mix(in srgb, var(--viking-danger) 12%, var(--viking-surface));
3514
+ border-color: color-mix(in srgb, var(--viking-danger) 45%, transparent);
3515
+ color: var(--viking-danger-text);
3516
+ }
3517
+
3518
+ .status-card__status-accent {
3519
+ background: color-mix(in srgb, var(--viking-accent) 12%, var(--viking-surface));
3520
+ border-color: color-mix(in srgb, var(--viking-accent) 40%, transparent);
3521
+ color: var(--viking-accent);
3522
+ }
3523
+
3524
+ .status-card__status-secondary {
3525
+ background: color-mix(in srgb, var(--viking-accent-secondary) 12%, var(--viking-surface));
3526
+ border-color: color-mix(in srgb, var(--viking-accent-secondary) 40%, transparent);
3527
+ color: var(--viking-accent-secondary);
3528
+ }
3529
+
3530
+ .status-card__status-info {
3531
+ background: color-mix(in srgb, var(--viking-info) 12%, var(--viking-surface));
3532
+ border-color: color-mix(in srgb, var(--viking-info) 40%, transparent);
3533
+ color: var(--viking-info);
3534
+ }
3535
+
3536
+ .status-card__status-muted {
3537
+ background: var(--viking-surface);
3538
+ border-color: var(--viking-border-subtle);
3539
+ color: var(--viking-text-muted);
3540
+ }
3541
+
3542
+ .status-card__body {
3543
+ display: grid;
3544
+ gap: var(--viking-space-3);
3545
+ min-width: 0;
3546
+ }
3547
+ `;
3548
+ const registerVikingStatusCardWc = () => {
3549
+ defineCustomElement(VikingStatusCardWc.tag, VikingStatusCardWc);
3550
+ defineCustomElementAlias(VikingStatusCardWc.legacyTag, VikingStatusCardWc);
3551
+ };
3552
+
3553
+ const TONES = new Set([
3554
+ "accent",
3555
+ "secondary",
3556
+ "success",
3557
+ "warning",
3558
+ "danger",
3559
+ "info",
3560
+ "muted",
3561
+ ]);
3562
+ /**
3563
+ * Framework-agnostic Viking status pill.
3564
+ * Tag: `viking-status-pill` (legacy alias: `viking-status-pill-wc`)
3565
+ *
3566
+ * @attr tone - accent | secondary | success | warning | danger | info | muted
3567
+ * @attr icon - Optional icon name for leading glyph
3568
+ * @attr href - Optional navigation target
3569
+ * @attr compact - Reduced pill footprint
3570
+ * @attr dot - Shows a status dot
3571
+ * @attr removable - Renders a close control; emits `viking-pill-removed`
3572
+ */
3573
+ class VikingStatusPillWc extends HTMLElementBase {
3574
+ static tag = "viking-status-pill";
3575
+ static legacyTag = "viking-status-pill-wc";
3576
+ static get observedAttributes() {
3577
+ return ["tone", "icon", "href", "target", "compact", "dot", "removable", "aria-label"];
3578
+ }
3579
+ shadow;
3580
+ constructor() {
3581
+ super();
3582
+ this.shadow = this.attachShadow({ mode: "open" });
3583
+ attachShadowStyles(this.shadow, VIKING_STATUS_PILL_STYLES);
3584
+ }
3585
+ connectedCallback() {
3586
+ this.render();
3587
+ }
3588
+ attributeChangedCallback() {
3589
+ if (this.isConnected) {
3590
+ this.render();
3591
+ }
3592
+ }
3593
+ get tone() {
3594
+ const raw = (this.getAttribute("tone") ?? "muted");
3595
+ return TONES.has(raw) ? raw : "muted";
3596
+ }
3597
+ get compact() {
3598
+ const compact = this.getAttribute("compact");
3599
+ return compact !== null && compact !== "false";
3600
+ }
3601
+ get removable() {
3602
+ const removable = this.getAttribute("removable");
3603
+ return removable !== null && removable !== "false";
3604
+ }
3605
+ get href() {
3606
+ return this.getAttribute("href");
3607
+ }
3608
+ get icon() {
3609
+ return this.getAttribute("icon");
3610
+ }
3611
+ get showDot() {
3612
+ const dot = this.getAttribute("dot");
3613
+ return dot !== null && dot !== "false";
3614
+ }
3615
+ onRemove = () => {
3616
+ this.dispatchEvent(new CustomEvent("viking-pill-removed", {
3617
+ bubbles: true,
3618
+ composed: true,
3619
+ }));
3620
+ };
3621
+ render() {
3622
+ const tone = this.tone;
3623
+ const compact = this.compact ? " status-pill--compact" : "";
3624
+ const icon = this.icon ? renderInlineIcon(this.icon, 14, "status-pill__icon") : "";
3625
+ const dot = this.showDot
3626
+ ? `<span class="status-pill__dot" aria-hidden="true"></span>`
3627
+ : "";
3628
+ const label = `<span class="status-pill__label" part="label"><slot></slot></span>`;
3629
+ const ariaLabel = escapeHtml(this.getAttribute("aria-label") ?? "");
3630
+ const href = this.href;
3631
+ const target = this.getAttribute("target");
3632
+ const rel = href && target === "_blank" ? ' rel="noopener noreferrer"' : "";
3633
+ if (href) {
3634
+ this.shadow.innerHTML = `
3635
+ <a
3636
+ class="status-pill status-pill-${tone}${compact}"
3637
+ part="control"
3638
+ href="${escapeHtml(href)}"
3639
+ ${target ? `target="${escapeHtml(target)}"${rel}` : ""}
3640
+ ${ariaLabel ? `aria-label="${ariaLabel}"` : ""}
3641
+ >
3642
+ ${dot}
3643
+ ${icon}
3644
+ ${label}
3645
+ </a>
3646
+ `;
3647
+ return;
3648
+ }
3649
+ this.shadow.innerHTML = `
3650
+ <span
3651
+ class="status-pill status-pill-${tone}${compact}"
3652
+ part="control"
3653
+ ${ariaLabel ? `role="status" aria-label="${ariaLabel}"` : ""}
3654
+ >
3655
+ ${dot}
3656
+ ${icon}
3657
+ ${label}
3658
+ ${this.removable
3659
+ ? '<button type="button" class="status-pill__remove" part="remove" aria-label="Remove"><span class="status-pill__remove-icon" aria-hidden="true">&times;</span></button>'
3660
+ : ""}
3661
+ </span>
3662
+ `;
3663
+ this.shadow
3664
+ .querySelector(".status-pill__remove")
3665
+ ?.addEventListener("click", this.onRemove);
3666
+ }
3667
+ }
3668
+ const VIKING_STATUS_PILL_STYLES = `
3669
+ :host {
3670
+ display: inline-flex;
3671
+ }
3672
+
3673
+ .status-pill {
3674
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-surface-alt) 88%, var(--viking-surface));
3675
+ --viking-status-pill-text: var(--viking-text-muted);
3676
+ --viking-status-pill-border: var(--viking-border-subtle);
3677
+ --viking-status-pill-shadow: var(--viking-shadow-xs);
3678
+
3679
+ display: inline-flex;
3680
+ align-items: center;
3681
+ gap: var(--viking-space-half);
3682
+ padding: var(--viking-space-half) var(--viking-space-2);
3683
+ border-radius: var(--viking-radius-pill);
3684
+ border: 1px solid var(--viking-status-pill-border);
3685
+ background: var(--viking-status-pill-bg);
3686
+ color: var(--viking-status-pill-text);
3687
+ font-family: var(--viking-font-family);
3688
+ font-size: var(--viking-font-size-xs);
3689
+ font-weight: var(--viking-font-weight-semibold);
3690
+ letter-spacing: var(--viking-letter-spacing-caps);
3691
+ line-height: var(--viking-line-height-snug);
3692
+ white-space: nowrap;
3693
+ text-transform: uppercase;
3694
+ box-shadow: var(--viking-status-pill-shadow);
3695
+ }
3696
+
3697
+ :host(:hover) .status-pill {
3698
+ text-decoration: none;
3699
+ }
3700
+
3701
+ .status-pill--compact {
3702
+ padding: var(--viking-space-half);
3703
+ font-size: var(--viking-font-size-2xs);
3704
+ }
3705
+
3706
+ .status-pill__label {
3707
+ display: inline-flex;
3708
+ align-items: center;
3709
+ }
3710
+
3711
+ .status-pill__dot {
3712
+ width: var(--viking-space-1);
3713
+ height: var(--viking-space-1);
3714
+ border-radius: var(--viking-radius-full);
3715
+ background: currentColor;
3716
+ flex: 0 0 auto;
3717
+ }
3718
+
3719
+ .status-pill__icon,
3720
+ ::slotted([data-viking-icon]) {
3721
+ width: var(--viking-space-3);
3722
+ height: var(--viking-space-3);
3723
+ color: currentColor;
3724
+ flex-shrink: 0;
3725
+ }
3726
+
3727
+ .status-pill__remove {
3728
+ display: inline-flex;
3729
+ align-items: center;
3730
+ justify-content: center;
3731
+ border: 1px solid transparent;
3732
+ background: transparent;
3733
+ color: currentColor;
3734
+ border-radius: var(--viking-radius-full);
3735
+ width: var(--viking-touch-target-min);
3736
+ height: var(--viking-touch-target-min);
3737
+ margin-right: calc(var(--viking-space-half) * -1);
3738
+ padding: 0;
3739
+ cursor: pointer;
3740
+ }
3741
+
3742
+ .status-pill__remove:hover {
3743
+ background: color-mix(in srgb, currentColor 10%, transparent);
3744
+ }
3745
+
3746
+ .status-pill__remove:focus-visible {
3747
+ outline: var(--viking-ring-width) solid var(--viking-ring);
3748
+ outline-offset: var(--viking-ring-offset);
3749
+ }
3750
+
3751
+ .status-pill-accent {
3752
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-accent) 18%, var(--viking-surface));
3753
+ --viking-status-pill-text: var(--viking-accent);
3754
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-accent) 52%, transparent);
3755
+ }
3756
+
3757
+ .status-pill-secondary {
3758
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-accent-secondary) 16%, var(--viking-surface));
3759
+ --viking-status-pill-text: var(--viking-accent-secondary);
3760
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-accent-secondary) 52%, transparent);
3761
+ }
3762
+
3763
+ .status-pill-success {
3764
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-success) 16%, var(--viking-surface));
3765
+ --viking-status-pill-text: var(--viking-success);
3766
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-success) 55%, transparent);
3767
+ }
3768
+
3769
+ .status-pill-warning {
3770
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-warning) 16%, var(--viking-surface));
3771
+ --viking-status-pill-text: var(--viking-warning);
3772
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-warning) 55%, transparent);
3773
+ }
3774
+
3775
+ .status-pill-danger {
3776
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-danger) 14%, var(--viking-surface));
3777
+ --viking-status-pill-text: var(--viking-danger-text);
3778
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-danger) 50%, transparent);
3779
+ }
3780
+
3781
+ .status-pill-info {
3782
+ --viking-status-pill-bg: color-mix(in srgb, var(--viking-info) 14%, var(--viking-surface));
3783
+ --viking-status-pill-text: var(--viking-info);
3784
+ --viking-status-pill-border: color-mix(in srgb, var(--viking-info) 50%, transparent);
3785
+ }
3786
+
3787
+ .status-pill-muted {
3788
+ --viking-status-pill-bg: var(--viking-surface);
3789
+ --viking-status-pill-text: var(--viking-text-muted);
3790
+ --viking-status-pill-border: var(--viking-border-subtle);
3791
+ }
3792
+
3793
+ .status-pill a {
3794
+ color: inherit;
3795
+ }
3796
+
3797
+ a.status-pill {
3798
+ text-decoration: none;
3799
+ }
3800
+ `;
3801
+ const registerVikingStatusPillWc = () => {
3802
+ defineCustomElement(VikingStatusPillWc.tag, VikingStatusPillWc);
3803
+ defineCustomElementAlias(VikingStatusPillWc.legacyTag, VikingStatusPillWc);
3230
3804
  };
3231
3805
 
3232
3806
  /** Primary navbar links (desktop + mobile). Shown on every surface. */
@@ -3446,6 +4020,381 @@ const DEFAULT_SITE_URLS = {
3446
4020
  backend: "https://backend.deml.app",
3447
4021
  };
3448
4022
 
4023
+ const VALID_CONTEXTS$3 = new Set([
4024
+ "app",
4025
+ "marketing",
4026
+ "backend",
4027
+ "docs",
4028
+ ]);
4029
+ const detectContext$3 = () => {
4030
+ const explicit = document.documentElement.getAttribute("data-deml-context");
4031
+ if (explicit && VALID_CONTEXTS$3.has(explicit)) {
4032
+ return explicit;
4033
+ }
4034
+ const host = window.location.hostname;
4035
+ if (host.startsWith("backend.")) {
4036
+ return "backend";
4037
+ }
4038
+ if (host.includes("deml.app")) {
4039
+ return "app";
4040
+ }
4041
+ return "marketing";
4042
+ };
4043
+ const readContext$3 = (el) => {
4044
+ const attr = el.getAttribute("context");
4045
+ if (attr && VALID_CONTEXTS$3.has(attr)) {
4046
+ return attr;
4047
+ }
4048
+ return detectContext$3();
4049
+ };
4050
+ const readUrls$3 = (el) => {
4051
+ const env = globalThis.__DEML ?? {};
4052
+ return {
4053
+ app: el.getAttribute("app-url") ?? env.app ?? DEFAULT_SITE_URLS.app,
4054
+ marketing: el.getAttribute("marketing-url") ?? env.marketing ?? DEFAULT_SITE_URLS.marketing,
4055
+ backend: el.getAttribute("backend-url") ?? env.backend ?? DEFAULT_SITE_URLS.backend,
4056
+ };
4057
+ };
4058
+ const readYear = (el) => {
4059
+ const raw = el.getAttribute("year");
4060
+ const value = raw ? Number(raw) : new Date().getFullYear();
4061
+ return Number.isFinite(value) ? value : new Date().getFullYear();
4062
+ };
4063
+ const renderFooterLinks = (context, urls) => {
4064
+ return SITE_FOOTER_COLUMNS.map((column) => {
4065
+ const links = column.links
4066
+ .map((link) => {
4067
+ const href = resolveFooterHref(link, context, urls);
4068
+ return `
4069
+ <li>
4070
+ <a href="${escapeHtml(href)}">${escapeHtml(link.label)}</a>
4071
+ </li>
4072
+ `;
4073
+ })
4074
+ .join("");
4075
+ return `
4076
+ <div class="footer-column">
4077
+ <h3 class="footer-column-title">${escapeHtml(column.title)}</h3>
4078
+ <ul class="footer-list">
4079
+ ${links}
4080
+ </ul>
4081
+ </div>
4082
+ `;
4083
+ }).join("");
4084
+ };
4085
+ /**
4086
+ * viking-site-footer-wc — unified static Drakkar footer for non-Angular surfaces.
4087
+ */
4088
+ class VikingSiteFooterWc extends HTMLElement {
4089
+ static tag = "viking-site-footer";
4090
+ static legacyTag = "viking-site-footer-wc";
4091
+ static get observedAttributes() {
4092
+ return ["context", "app-url", "marketing-url", "backend-url", "year"];
4093
+ }
4094
+ connectedCallback() {
4095
+ this.render();
4096
+ }
4097
+ attributeChangedCallback() {
4098
+ if (this.isConnected) {
4099
+ this.render();
4100
+ }
4101
+ }
4102
+ render() {
4103
+ const context = readContext$3(this);
4104
+ const urls = readUrls$3(this);
4105
+ const year = readYear(this);
4106
+ const links = renderFooterLinks(context, urls);
4107
+ this.innerHTML = `
4108
+ <footer class="mega-footer">
4109
+ <div class="footer-content">
4110
+ <nav class="footer-directory" aria-label="Footer Directory">
4111
+ ${links}
4112
+ </nav>
4113
+
4114
+ <section class="footer-bottom">
4115
+ <div class="footer-badges-top">
4116
+ <span
4117
+ class="usa-badge"
4118
+ id="usa-badge"
4119
+ role="button"
4120
+ tabindex="0"
4121
+ aria-label="Made in the U.S.A."
4122
+ >
4123
+ <span class="usa-badge-icon" aria-hidden="true">🇺🇸</span>
4124
+ <span>Made in the U.S.A</span>
4125
+ </span>
4126
+ </div>
4127
+
4128
+ <div class="footer-compliance-row">
4129
+ <div class="copyright-info">
4130
+ <span class="copyright-text">
4131
+ Copyright © ${year} Data Engineering for Machine Learning by
4132
+ <a href="https://joealongi.dev/" target="_blank" rel="noopener noreferrer">Joe Alongi</a>.
4133
+ All rights reserved.
4134
+ </span>
4135
+ </div>
4136
+ </div>
4137
+ </section>
4138
+ </div>
4139
+ </footer>
4140
+ `;
4141
+ }
4142
+ }
4143
+ const registerVikingSiteFooterWc = () => {
4144
+ defineCustomElement(VikingSiteFooterWc.tag, VikingSiteFooterWc);
4145
+ defineCustomElementAlias(VikingSiteFooterWc.legacyTag, VikingSiteFooterWc);
4146
+ };
4147
+
4148
+ const VALID_CONTEXTS$2 = new Set([
4149
+ "app",
4150
+ "marketing",
4151
+ "backend",
4152
+ "docs",
4153
+ ]);
4154
+ const detectContext$2 = () => {
4155
+ const explicit = document.documentElement.getAttribute("data-deml-context");
4156
+ if (explicit && VALID_CONTEXTS$2.has(explicit)) {
4157
+ return explicit;
4158
+ }
4159
+ const host = window.location.hostname;
4160
+ if (host.startsWith("ui.")) {
4161
+ return "docs";
4162
+ }
4163
+ if (host.startsWith("backend.")) {
4164
+ return "backend";
4165
+ }
4166
+ if (host.includes("deml.app")) {
4167
+ return "app";
4168
+ }
4169
+ return "marketing";
4170
+ };
4171
+ const readContext$2 = (el) => {
4172
+ const attr = el.getAttribute("context");
4173
+ if (attr && VALID_CONTEXTS$2.has(attr)) {
4174
+ return attr;
4175
+ }
4176
+ return detectContext$2();
4177
+ };
4178
+ const readBoolAttr = (el, name) => {
4179
+ const value = el.getAttribute(name);
4180
+ return value !== null && value !== "false";
4181
+ };
4182
+ const readUrls$2 = (el) => {
4183
+ const env = globalThis.__DEML ?? {};
4184
+ return {
4185
+ app: el.getAttribute("app-url") ?? env.app ?? DEFAULT_SITE_URLS.app,
4186
+ marketing: el.getAttribute("marketing-url") ?? env.marketing ?? DEFAULT_SITE_URLS.marketing,
4187
+ backend: el.getAttribute("backend-url") ?? env.backend ?? DEFAULT_SITE_URLS.backend,
4188
+ };
4189
+ };
4190
+ const readAuthState = (el) => readBoolAttr(el, "authenticated");
4191
+ const readShowSearch = (el) => {
4192
+ const explicit = el.getAttribute("show-search");
4193
+ if (explicit === null) {
4194
+ return true;
4195
+ }
4196
+ return readBoolAttr(el, "show-search");
4197
+ };
4198
+ const readSignInHref = (el, urls) => {
4199
+ const explicit = el.getAttribute("sign-in-href");
4200
+ if (explicit) {
4201
+ return explicit;
4202
+ }
4203
+ const landing = el.getAttribute("return-url") ?? window.location.href;
4204
+ return `${urls.app}/login?returnUrl=${encodeURIComponent(landing)}`;
4205
+ };
4206
+ /**
4207
+ * viking-site-navbar-wc — unified static Drakkar navbar for non-Angular surfaces.
4208
+ * Styling is supplied by viking-ui global CSS.
4209
+ */
4210
+ class VikingSiteNavbarWc extends HTMLElement {
4211
+ static tag = "viking-site-navbar";
4212
+ static legacyTag = "viking-site-navbar-wc";
4213
+ static get observedAttributes() {
4214
+ return [
4215
+ "context",
4216
+ "app-url",
4217
+ "marketing-url",
4218
+ "backend-url",
4219
+ "authenticated",
4220
+ "show-search",
4221
+ "sign-in-href",
4222
+ "dashboard-href",
4223
+ "return-url",
4224
+ ];
4225
+ }
4226
+ connectedCallback() {
4227
+ this.render();
4228
+ }
4229
+ attributeChangedCallback() {
4230
+ if (this.isConnected) {
4231
+ this.render();
4232
+ }
4233
+ }
4234
+ renderNavLinks(context, urls, kind = "desktop") {
4235
+ const linkClass = kind === "mobile" ? "mobile-nav-btn" : "nav-btn";
4236
+ return SITE_NAV_LINKS.map((link) => {
4237
+ const href = resolveNavHref(link, context, urls);
4238
+ const isProtected = link.requireAuth;
4239
+ const hidden = isProtected ? " hidden" : "";
4240
+ const authAttr = isProtected ? ' data-require-auth="true"' : "";
4241
+ return `
4242
+ <a
4243
+ href="${escapeHtml(href)}"
4244
+ class="${linkClass}"
4245
+ data-nav-id="${escapeHtml(link.id)}"
4246
+ ${authAttr}
4247
+ ${hidden}
4248
+ >
4249
+ <span data-viking-icon="${escapeHtml(link.icon)}" data-viking-icon-size="16" aria-hidden="true"></span>
4250
+ <span>${escapeHtml(link.label)}</span>
4251
+ </a>
4252
+ `;
4253
+ }).join("");
4254
+ }
4255
+ renderAuthDesktop(authenticated, signInHref, dashboardHref) {
4256
+ const href = authenticated ? dashboardHref : signInHref;
4257
+ return `
4258
+ <div class="desktop-auth">
4259
+ <viking-button-wc
4260
+ variant="primary"
4261
+ class="auth-btn"
4262
+ href="${escapeHtml(href)}"
4263
+ id="auth-btn-desktop"
4264
+ >
4265
+ <span
4266
+ id="auth-icon-desktop"
4267
+ data-viking-icon="${authenticated ? "home" : "arrow-right"}"
4268
+ data-viking-icon-size="16"
4269
+ aria-hidden="true"
4270
+ ></span>
4271
+ <span id="auth-text-desktop">${authenticated ? "Dashboard" : "Sign In"}</span>
4272
+ </viking-button-wc>
4273
+ <viking-button-wc
4274
+ variant="ghost"
4275
+ class="auth-btn auth-signout-btn"
4276
+ id="auth-signout-desktop"
4277
+ ${authenticated ? "" : " hidden"}
4278
+ >
4279
+ Sign Out
4280
+ </viking-button-wc>
4281
+ </div>
4282
+ `;
4283
+ }
4284
+ renderAuthMobile(authenticated, dashboardHref, signInHref) {
4285
+ return `
4286
+ <div class="mobile-divider"></div>
4287
+ <viking-button-wc
4288
+ variant="primary"
4289
+ full-width
4290
+ class="mobile-auth-btn auth-btn"
4291
+ href="${escapeHtml(authenticated ? dashboardHref : signInHref)}"
4292
+ id="auth-btn-mobile"
4293
+ >
4294
+ <span
4295
+ id="auth-icon-mobile"
4296
+ data-viking-icon="${authenticated ? "home" : "arrow-right"}"
4297
+ data-viking-icon-size="16"
4298
+ aria-hidden="true"
4299
+ ></span>
4300
+ <span id="auth-text-mobile">${authenticated ? "Dashboard" : "Sign In"}</span>
4301
+ </viking-button-wc>
4302
+ <viking-button-wc
4303
+ variant="ghost"
4304
+ full-width
4305
+ class="mobile-auth-btn auth-btn auth-signout-btn"
4306
+ id="auth-signout-mobile"
4307
+ ${authenticated ? "" : " hidden"}
4308
+ >
4309
+ Sign Out
4310
+ </viking-button-wc>
4311
+ `;
4312
+ }
4313
+ renderSearchButton(showSearch) {
4314
+ if (!showSearch) {
4315
+ return "";
4316
+ }
4317
+ const shortcut = navigator.platform.match(/Mac|iPhone|iPad/i)
4318
+ ? "⌘K"
4319
+ : "Ctrl+K";
4320
+ return `
4321
+ <div class="navbar-search" role="search">
4322
+ <viking-button-wc
4323
+ variant="outline"
4324
+ square
4325
+ compact
4326
+ class="navbar-search-trigger"
4327
+ aria-label="Open search (${shortcut})"
4328
+ id="navbar-search-trigger"
4329
+ >
4330
+ <span data-viking-icon="search" data-viking-icon-size="20" aria-hidden="true"></span>
4331
+ </viking-button-wc>
4332
+ </div>
4333
+ `;
4334
+ }
4335
+ render() {
4336
+ const context = readContext$2(this);
4337
+ const urls = readUrls$2(this);
4338
+ const authenticated = readAuthState(this);
4339
+ const showSearch = readShowSearch(this);
4340
+ const brandHref = resolveBrandHref(context, urls);
4341
+ const signInHref = readSignInHref(this, urls);
4342
+ const dashboardHref = this.getAttribute("dashboard-href") ?? `${urls.app}/dashboard`;
4343
+ const desktopNavLinks = this.renderNavLinks(context, urls, "desktop");
4344
+ const mobileNavLinks = this.renderNavLinks(context, urls, "mobile");
4345
+ const desktopAuth = this.renderAuthDesktop(authenticated, signInHref, dashboardHref);
4346
+ const mobileAuth = this.renderAuthMobile(authenticated, dashboardHref, signInHref);
4347
+ const search = this.renderSearchButton(showSearch);
4348
+ this.innerHTML = `
4349
+ <header class="navbar">
4350
+ <div class="navbar-content">
4351
+ <div class="navbar-left">
4352
+ <a href="${escapeHtml(brandHref)}" class="navbar-brand" aria-label="Go to homepage" id="navbar-brand-link">
4353
+ <span
4354
+ class="brand-icon navbar-logo"
4355
+ data-viking-icon="drakkar"
4356
+ data-viking-icon-color="accent"
4357
+ data-viking-icon-size="28"
4358
+ aria-hidden="true"
4359
+ ></span>
4360
+ </a>
4361
+ </div>
4362
+
4363
+ <nav class="navbar-center desktop-nav" aria-label="Main navigation">
4364
+ ${desktopNavLinks}
4365
+ </nav>
4366
+
4367
+ <div class="navbar-right">
4368
+ ${search}
4369
+ ${desktopAuth}
4370
+ <viking-theme-toggle-wc class="theme-toggle-btn" aria-label="Toggle light and dark theme"></viking-theme-toggle-wc>
4371
+ <viking-button-wc
4372
+ variant="outline"
4373
+ square
4374
+ class="menu-toggle-btn"
4375
+ aria-label="Toggle navigation menu"
4376
+ aria-controls="mobile-menu"
4377
+ aria-expanded="false"
4378
+ id="mobile-menu-btn"
4379
+ >
4380
+ <span data-viking-icon="menu" data-viking-icon-size="24" aria-hidden="true"></span>
4381
+ </viking-button-wc>
4382
+ </div>
4383
+ </div>
4384
+
4385
+ <nav class="mobile-menu" id="mobile-menu" aria-label="Mobile navigation" hidden>
4386
+ ${mobileNavLinks}
4387
+ ${mobileAuth}
4388
+ </nav>
4389
+ </header>
4390
+ `;
4391
+ }
4392
+ }
4393
+ const registerVikingSiteNavbarWc = () => {
4394
+ defineCustomElement(VikingSiteNavbarWc.tag, VikingSiteNavbarWc);
4395
+ defineCustomElementAlias(VikingSiteNavbarWc.legacyTag, VikingSiteNavbarWc);
4396
+ };
4397
+
3449
4398
  const dedupeItems = (items) => {
3450
4399
  const seen = new Set();
3451
4400
  return items.filter((item) => {
@@ -3721,7 +4670,7 @@ class VikingSuiteSearchPaletteWc extends HTMLElementBase {
3721
4670
  return;
3722
4671
  }
3723
4672
  if (name === "global-shortcut" && this.paletteEl) {
3724
- if (readBoolAttr(this, "global-shortcut") ||
4673
+ if (readBoolAttr$1(this, "global-shortcut") ||
3725
4674
  !this.hasAttribute("global-shortcut")) {
3726
4675
  this.paletteEl.setAttribute("global-shortcut", "");
3727
4676
  }
@@ -3755,7 +4704,7 @@ class VikingSuiteSearchPaletteWc extends HTMLElementBase {
3755
4704
  const placeholder = this.getAttribute("placeholder") ??
3756
4705
  "Search documentation, dashboard, settings…";
3757
4706
  this.paletteEl.setAttribute("placeholder", placeholder);
3758
- if (readBoolAttr(this, "global-shortcut") ||
4707
+ if (readBoolAttr$1(this, "global-shortcut") ||
3759
4708
  !this.hasAttribute("global-shortcut")) {
3760
4709
  this.paletteEl.setAttribute("global-shortcut", "");
3761
4710
  }
@@ -3867,22 +4816,29 @@ class VikingThemeToggleWc extends HTMLElementBase {
3867
4816
  button = null;
3868
4817
  sunIcon = null;
3869
4818
  moonIcon = null;
4819
+ onStorage = () => {
4820
+ this.syncIcons();
4821
+ };
3870
4822
  constructor() {
3871
4823
  super();
3872
4824
  this.shadow = this.attachShadow({ mode: "open" });
3873
4825
  attachShadowStyles(this.shadow, VIKING_THEME_TOGGLE_STYLES);
3874
4826
  }
3875
4827
  connectedCallback() {
3876
- if (!this.hasAttribute("role")) {
3877
- this.setAttribute("role", "button");
3878
- }
3879
4828
  this.render();
3880
4829
  this.syncIcons();
3881
4830
  this.button?.addEventListener("click", this.onClick);
4831
+ window.addEventListener("storage", this.onStorage);
4832
+ window.addEventListener("viking-theme-change", this.onThemeChange);
3882
4833
  }
3883
4834
  disconnectedCallback() {
3884
4835
  this.button?.removeEventListener("click", this.onClick);
4836
+ window.removeEventListener("storage", this.onStorage);
4837
+ window.removeEventListener("viking-theme-change", this.onThemeChange);
3885
4838
  }
4839
+ onThemeChange = () => {
4840
+ this.syncIcons();
4841
+ };
3886
4842
  onClick = () => {
3887
4843
  const next = readTheme() === "light" ? "dark" : "light";
3888
4844
  applyTheme(next);
@@ -3894,9 +4850,10 @@ class VikingThemeToggleWc extends HTMLElementBase {
3894
4850
  }));
3895
4851
  };
3896
4852
  syncIcons = () => {
3897
- const isLight = readTheme() === "light";
3898
- this.sunIcon?.classList.toggle("is-visible", isLight);
3899
- this.moonIcon?.classList.toggle("is-visible", !isLight);
4853
+ // Match Angular viking-theme-toggle: sun in dark mode (switch to light).
4854
+ const isDark = readTheme() === "dark";
4855
+ this.sunIcon?.classList.toggle("is-visible", isDark);
4856
+ this.moonIcon?.classList.toggle("is-visible", !isDark);
3900
4857
  };
3901
4858
  render() {
3902
4859
  const label = this.getAttribute("aria-label") ?? "Toggle light and dark theme";
@@ -4494,7 +5451,7 @@ class VikingSuiteHeaderWc extends HTMLElementBase {
4494
5451
  render() {
4495
5452
  const context = readContext(this);
4496
5453
  const urls = readUrls(this);
4497
- const authenticated = readBoolAttr(this, "authenticated");
5454
+ const authenticated = readBoolAttr$1(this, "authenticated");
4498
5455
  const navLinks = this.renderNavLinks(context, urls, authenticated);
4499
5456
  const brandHref = resolveBrandHref(context, urls);
4500
5457
  const shortcut = `${modKeyLabel()}K`;
@@ -4766,8 +5723,12 @@ const registerVikingElements = () => {
4766
5723
  registerVikingSelectWc();
4767
5724
  registerVikingModalWc();
4768
5725
  registerVikingSearchPaletteWc();
5726
+ registerVikingStatusCardWc();
5727
+ registerVikingStatusPillWc();
4769
5728
  registerVikingSuiteHeaderWc();
4770
5729
  registerVikingSuiteSearchPaletteWc();
5730
+ registerVikingSiteNavbarWc();
5731
+ registerVikingSiteFooterWc();
4771
5732
  registerVikingThemeToggleWc();
4772
5733
  };
4773
5734
  // Auto-register when loaded as a script bundle (Astro, Django, static HTML).
@@ -5083,7 +6044,7 @@ class VikingButton {
5083
6044
  } @else if (icon()) {
5084
6045
  <viking-icon [name]="icon()!" [size]="iconSize()" />
5085
6046
  }
5086
- <span class="viking-btn-label"><ng-content /></span>
6047
+ <ng-content />
5087
6048
  @if (!loading() && iconTrailing()) {
5088
6049
  <viking-icon [name]="iconTrailing()!" [size]="iconSize()" />
5089
6050
  }
@@ -5119,7 +6080,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
5119
6080
  } @else if (icon()) {
5120
6081
  <viking-icon [name]="icon()!" [size]="iconSize()" />
5121
6082
  }
5122
- <span class="viking-btn-label"><ng-content /></span>
6083
+ <ng-content />
5123
6084
  @if (!loading() && iconTrailing()) {
5124
6085
  <viking-icon [name]="iconTrailing()!" [size]="iconSize()" />
5125
6086
  }
@@ -5214,6 +6175,22 @@ class VikingSiteNavbar {
5214
6175
  closeMobileMenu() {
5215
6176
  this.mobileMenuOpen.set(false);
5216
6177
  }
6178
+ closeMobileMenuOnOutsideClick(event) {
6179
+ if (!this.mobileMenuOpen())
6180
+ return;
6181
+ const target = event.target;
6182
+ if (!(target instanceof Node))
6183
+ return;
6184
+ const path = typeof event.composedPath === 'function' ? event.composedPath() : [target];
6185
+ const menu = document.getElementById('mobile-menu');
6186
+ const toggle = document.getElementById('mobile-menu-btn');
6187
+ const clickedInside = path.some((node) => node instanceof Node &&
6188
+ ((menu && (node === menu || menu.contains(node))) ||
6189
+ (toggle && (node === toggle || toggle.contains(node)))));
6190
+ if (!clickedInside) {
6191
+ this.closeMobileMenu();
6192
+ }
6193
+ }
5217
6194
  openSearch() {
5218
6195
  this.closeMobileMenu();
5219
6196
  this.searchOpen.emit();
@@ -5230,7 +6207,7 @@ class VikingSiteNavbar {
5230
6207
  this.closeMobileMenu();
5231
6208
  }
5232
6209
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: VikingSiteNavbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
5233
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: VikingSiteNavbar, isStandalone: true, selector: "viking-site-navbar", inputs: { context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, urls: { classPropertyName: "urls", publicName: "urls", isSignal: true, isRequired: false, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: false, transformFunction: null }, isBusy: { classPropertyName: "isBusy", publicName: "isBusy", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { login: "login", logout: "logout", themeToggle: "themeToggle", searchOpen: "searchOpen" }, host: { listeners: { "window:resize": "closeMobileMenuOnDesktop()", "document:keydown.escape": "closeMobileMenuOnEscape()" } }, ngImport: i0, template: `
6210
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: VikingSiteNavbar, isStandalone: true, selector: "viking-site-navbar", inputs: { context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, urls: { classPropertyName: "urls", publicName: "urls", isSignal: true, isRequired: false, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: false, transformFunction: null }, isBusy: { classPropertyName: "isBusy", publicName: "isBusy", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { login: "login", logout: "logout", themeToggle: "themeToggle", searchOpen: "searchOpen" }, host: { listeners: { "document:click": "closeMobileMenuOnOutsideClick($event)", "window:resize": "closeMobileMenuOnDesktop()", "document:keydown.escape": "closeMobileMenuOnEscape()" } }, ngImport: i0, template: `
5234
6211
  <header class="navbar">
5235
6212
  <div class="navbar-content">
5236
6213
  <div class="navbar-left">
@@ -5639,7 +6616,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
5639
6616
  </nav>
5640
6617
  </header>
5641
6618
  ` }]
5642
- }], propDecorators: { context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }], urls: [{ type: i0.Input, args: [{ isSignal: true, alias: "urls", required: false }] }], isAuthenticated: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAuthenticated", required: false }] }], isBusy: [{ type: i0.Input, args: [{ isSignal: true, alias: "isBusy", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], showSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSearch", required: false }] }], login: [{ type: i0.Output, args: ["login"] }], logout: [{ type: i0.Output, args: ["logout"] }], themeToggle: [{ type: i0.Output, args: ["themeToggle"] }], searchOpen: [{ type: i0.Output, args: ["searchOpen"] }], closeMobileMenuOnDesktop: [{
6619
+ }], propDecorators: { context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }], urls: [{ type: i0.Input, args: [{ isSignal: true, alias: "urls", required: false }] }], isAuthenticated: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAuthenticated", required: false }] }], isBusy: [{ type: i0.Input, args: [{ isSignal: true, alias: "isBusy", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], showSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSearch", required: false }] }], login: [{ type: i0.Output, args: ["login"] }], logout: [{ type: i0.Output, args: ["logout"] }], themeToggle: [{ type: i0.Output, args: ["themeToggle"] }], searchOpen: [{ type: i0.Output, args: ["searchOpen"] }], closeMobileMenuOnOutsideClick: [{
6620
+ type: HostListener,
6621
+ args: ['document:click', ['$event']]
6622
+ }], closeMobileMenuOnDesktop: [{
5643
6623
  type: HostListener,
5644
6624
  args: ["window:resize"]
5645
6625
  }], closeMobileMenuOnEscape: [{
@@ -8636,6 +9616,12 @@ class VikingModal {
8636
9616
  }
8637
9617
  });
8638
9618
  }
9619
+ ngOnDestroy() {
9620
+ const dialog = this.dialogRef()?.nativeElement;
9621
+ if (dialog?.open) {
9622
+ dialog.close();
9623
+ }
9624
+ }
8639
9625
  onBackdropClick = (event) => {
8640
9626
  if (this.dismissible() && event.target === this.dialogRef().nativeElement) {
8641
9627
  this.open.set(false);
@@ -8674,7 +9660,7 @@ class VikingModal {
8674
9660
  </footer>
8675
9661
  </div>
8676
9662
  </dialog>
8677
- `, isInline: true, styles: [".viking-modal{padding:0;border:1px solid var(--viking-border-strong);border-radius:var(--viking-radius-lg);background:var(--viking-surface);color:var(--viking-text);box-shadow:var(--viking-shadow-lg);width:min(522px,calc(100vw - var(--viking-space-4)));animation:viking-modal-in var(--viking-duration) var(--viking-ease-default);overflow:hidden}.viking-modal::backdrop{background:var(--viking-overlay-backdrop);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:viking-backdrop-in var(--viking-duration-fast) var(--viking-ease-default)}.viking-modal-surface{display:flex;flex-direction:column;padding:var(--viking-space-3);gap:var(--viking-space-2);font-family:var(--viking-font-family);position:relative}.viking-modal-surface:before{content:\"\";position:absolute;inset:0 0 auto;height:1px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--viking-metallic-200) 22%,transparent),transparent);pointer-events:none}.viking-modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--viking-space-2);padding-bottom:var(--viking-space-1);border-bottom:1px solid var(--viking-border-subtle)}.viking-modal-heading{margin:0;font-size:var(--viking-font-size-md);font-weight:var(--viking-font-weight-bold);letter-spacing:var(--viking-letter-spacing-tight);color:var(--viking-text);line-height:var(--viking-line-height-tight)}.viking-modal-close{display:inline-flex;align-items:center;justify-content:center;width:var(--viking-control-height-sm);height:var(--viking-control-height-sm);border:1px solid transparent;background:transparent;color:var(--viking-text-muted);cursor:pointer;padding:0;border-radius:var(--viking-radius);transition:var(--viking-transition-interactive);flex-shrink:0}.viking-modal-close:hover{color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-subtle)}.viking-modal-close:active{transform:scale(var(--viking-state-active-scale))}.viking-modal-close:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-modal-body{font-size:var(--viking-font-size);line-height:var(--viking-line-height-relaxed);color:var(--viking-text-muted);animation:viking-fade-in var(--viking-duration) var(--viking-ease-default)}.viking-modal-footer{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);padding-top:var(--viking-space-2);border-top:1px solid var(--viking-border-subtle)}.viking-modal-footer:empty{display:none}:host ::ng-deep .viking-modal-footer [vikingModalActions]{display:flex;flex-wrap:nowrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);width:100%}@media(prefers-reduced-motion:reduce){.viking-modal{animation:none}.viking-modal::backdrop{animation:none}.viking-modal-body{animation:none}}\n"], dependencies: [{ kind: "component", type: VikingIcon, selector: "viking-icon", inputs: ["name", "size", "sizePreset", "variant", "color", "backdrop", "backdropTone", "spin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9663
+ `, isInline: true, styles: [".viking-modal{padding:0;border:1px solid var(--viking-border-strong);border-radius:var(--viking-radius-lg);background:var(--viking-surface);color:var(--viking-text);box-shadow:var(--viking-shadow-lg);width:min(522px,calc(100vw - var(--viking-space-4)));animation:viking-modal-in var(--viking-duration) var(--viking-ease-default);overflow:hidden}.viking-modal:not([open]){display:none!important;pointer-events:none}.viking-modal::backdrop{background:var(--viking-overlay-backdrop);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:viking-backdrop-in var(--viking-duration-fast) var(--viking-ease-default)}.viking-modal-surface{display:flex;flex-direction:column;padding:var(--viking-space-3);gap:var(--viking-space-2);font-family:var(--viking-font-family);position:relative}.viking-modal-surface:before{content:\"\";position:absolute;inset:0 0 auto;height:1px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--viking-metallic-200) 22%,transparent),transparent);pointer-events:none}.viking-modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--viking-space-2);padding-bottom:var(--viking-space-1);border-bottom:1px solid var(--viking-border-subtle)}.viking-modal-heading{margin:0;font-size:var(--viking-font-size-md);font-weight:var(--viking-font-weight-bold);letter-spacing:var(--viking-letter-spacing-tight);color:var(--viking-text);line-height:var(--viking-line-height-tight)}.viking-modal-close{display:inline-flex;align-items:center;justify-content:center;width:var(--viking-control-height-sm);height:var(--viking-control-height-sm);border:1px solid transparent;background:transparent;color:var(--viking-text-muted);cursor:pointer;padding:0;border-radius:var(--viking-radius);transition:var(--viking-transition-interactive);flex-shrink:0}.viking-modal-close:hover{color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-subtle)}.viking-modal-close:active{transform:scale(var(--viking-state-active-scale))}.viking-modal-close:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-modal-body{font-size:var(--viking-font-size);line-height:var(--viking-line-height-relaxed);color:var(--viking-text-muted);animation:viking-fade-in var(--viking-duration) var(--viking-ease-default)}.viking-modal-footer{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);padding-top:var(--viking-space-2);border-top:1px solid var(--viking-border-subtle)}.viking-modal-footer:empty{display:none}:host ::ng-deep .viking-modal-footer [vikingModalActions]{display:flex;flex-wrap:nowrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);width:100%}@media(prefers-reduced-motion:reduce){.viking-modal{animation:none}.viking-modal::backdrop{animation:none}.viking-modal-body{animation:none}}\n"], dependencies: [{ kind: "component", type: VikingIcon, selector: "viking-icon", inputs: ["name", "size", "sizePreset", "variant", "color", "backdrop", "backdropTone", "spin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8678
9664
  }
8679
9665
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: VikingModal, decorators: [{
8680
9666
  type: Component,
@@ -8710,7 +9696,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
8710
9696
  </footer>
8711
9697
  </div>
8712
9698
  </dialog>
8713
- `, styles: [".viking-modal{padding:0;border:1px solid var(--viking-border-strong);border-radius:var(--viking-radius-lg);background:var(--viking-surface);color:var(--viking-text);box-shadow:var(--viking-shadow-lg);width:min(522px,calc(100vw - var(--viking-space-4)));animation:viking-modal-in var(--viking-duration) var(--viking-ease-default);overflow:hidden}.viking-modal::backdrop{background:var(--viking-overlay-backdrop);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:viking-backdrop-in var(--viking-duration-fast) var(--viking-ease-default)}.viking-modal-surface{display:flex;flex-direction:column;padding:var(--viking-space-3);gap:var(--viking-space-2);font-family:var(--viking-font-family);position:relative}.viking-modal-surface:before{content:\"\";position:absolute;inset:0 0 auto;height:1px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--viking-metallic-200) 22%,transparent),transparent);pointer-events:none}.viking-modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--viking-space-2);padding-bottom:var(--viking-space-1);border-bottom:1px solid var(--viking-border-subtle)}.viking-modal-heading{margin:0;font-size:var(--viking-font-size-md);font-weight:var(--viking-font-weight-bold);letter-spacing:var(--viking-letter-spacing-tight);color:var(--viking-text);line-height:var(--viking-line-height-tight)}.viking-modal-close{display:inline-flex;align-items:center;justify-content:center;width:var(--viking-control-height-sm);height:var(--viking-control-height-sm);border:1px solid transparent;background:transparent;color:var(--viking-text-muted);cursor:pointer;padding:0;border-radius:var(--viking-radius);transition:var(--viking-transition-interactive);flex-shrink:0}.viking-modal-close:hover{color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-subtle)}.viking-modal-close:active{transform:scale(var(--viking-state-active-scale))}.viking-modal-close:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-modal-body{font-size:var(--viking-font-size);line-height:var(--viking-line-height-relaxed);color:var(--viking-text-muted);animation:viking-fade-in var(--viking-duration) var(--viking-ease-default)}.viking-modal-footer{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);padding-top:var(--viking-space-2);border-top:1px solid var(--viking-border-subtle)}.viking-modal-footer:empty{display:none}:host ::ng-deep .viking-modal-footer [vikingModalActions]{display:flex;flex-wrap:nowrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);width:100%}@media(prefers-reduced-motion:reduce){.viking-modal{animation:none}.viking-modal::backdrop{animation:none}.viking-modal-body{animation:none}}\n"] }]
9699
+ `, styles: [".viking-modal{padding:0;border:1px solid var(--viking-border-strong);border-radius:var(--viking-radius-lg);background:var(--viking-surface);color:var(--viking-text);box-shadow:var(--viking-shadow-lg);width:min(522px,calc(100vw - var(--viking-space-4)));animation:viking-modal-in var(--viking-duration) var(--viking-ease-default);overflow:hidden}.viking-modal:not([open]){display:none!important;pointer-events:none}.viking-modal::backdrop{background:var(--viking-overlay-backdrop);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:viking-backdrop-in var(--viking-duration-fast) var(--viking-ease-default)}.viking-modal-surface{display:flex;flex-direction:column;padding:var(--viking-space-3);gap:var(--viking-space-2);font-family:var(--viking-font-family);position:relative}.viking-modal-surface:before{content:\"\";position:absolute;inset:0 0 auto;height:1px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--viking-metallic-200) 22%,transparent),transparent);pointer-events:none}.viking-modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--viking-space-2);padding-bottom:var(--viking-space-1);border-bottom:1px solid var(--viking-border-subtle)}.viking-modal-heading{margin:0;font-size:var(--viking-font-size-md);font-weight:var(--viking-font-weight-bold);letter-spacing:var(--viking-letter-spacing-tight);color:var(--viking-text);line-height:var(--viking-line-height-tight)}.viking-modal-close{display:inline-flex;align-items:center;justify-content:center;width:var(--viking-control-height-sm);height:var(--viking-control-height-sm);border:1px solid transparent;background:transparent;color:var(--viking-text-muted);cursor:pointer;padding:0;border-radius:var(--viking-radius);transition:var(--viking-transition-interactive);flex-shrink:0}.viking-modal-close:hover{color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-subtle)}.viking-modal-close:active{transform:scale(var(--viking-state-active-scale))}.viking-modal-close:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-modal-body{font-size:var(--viking-font-size);line-height:var(--viking-line-height-relaxed);color:var(--viking-text-muted);animation:viking-fade-in var(--viking-duration) var(--viking-ease-default)}.viking-modal-footer{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);padding-top:var(--viking-space-2);border-top:1px solid var(--viking-border-subtle)}.viking-modal-footer:empty{display:none}:host ::ng-deep .viking-modal-footer [vikingModalActions]{display:flex;flex-wrap:nowrap;justify-content:flex-end;align-items:center;gap:var(--viking-space-2);width:100%}@media(prefers-reduced-motion:reduce){.viking-modal{animation:none}.viking-modal::backdrop{animation:none}.viking-modal-body{animation:none}}\n"] }]
8714
9700
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { dialogRef: [{ type: i0.ViewChild, args: ["dialog", { isSignal: true }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }] } });
8715
9701
 
8716
9702
  /**
@@ -12693,6 +13679,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
12693
13679
  }, template: `<ng-content />`, styles: [":host(.viking-sidebar-nav){padding:var(--viking-space-1) var(--viking-space-1) var(--viking-space-1);display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:6px}@media(min-width:901px){:host(.viking-sidebar-nav){padding:var(--viking-space-2) 0;flex-direction:column;flex-wrap:nowrap;gap:var(--viking-space-1)}}:host(.viking-sidebar-nav-link){display:contents}:host(.viking-sidebar-nav-link) a{display:flex;align-items:center;gap:var(--viking-space-1);padding:10px 14px;color:var(--text-color);text-decoration:none;font-weight:var(--viking-font-weight-semibold);font-size:var(--viking-font-size-base);transition:color var(--viking-duration) var(--viking-ease-default),background-color var(--viking-duration) var(--viking-ease-default),border-color var(--viking-duration) var(--viking-ease-default);border-left:3px solid transparent;border-bottom:3px solid transparent;border-radius:var(--viking-radius);flex:0 0 auto;min-height:44px;white-space:nowrap;cursor:pointer;background:transparent;font-family:var(--viking-font-family);box-sizing:border-box;width:auto}:host(.viking-sidebar-nav-link) a:hover{background-color:var(--sidebar-hover-bg);color:var(--text-color)}:host(.viking-sidebar-nav-link) a:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}:host(.viking-sidebar-nav-link) a.viking-sidebar-nav-link-active{background:var(--sidebar-active-bg);border-left-color:transparent;border-bottom-color:var(--sidebar-active-border);color:var(--sidebar-active-border)}@media(min-width:901px){:host(.viking-sidebar-nav-link) a{width:100%;padding:var(--viking-space-1) var(--viking-space-2);border-bottom:none;border-left:3px solid transparent;border-radius:0;min-height:0}:host(.viking-sidebar-nav-link) a.viking-sidebar-nav-link-active{border-left-color:var(--sidebar-active-border);border-bottom-color:transparent}}:host(.viking-sidebar-nav-tree){display:flex;flex-direction:column;flex:1 1 100%;width:100%;margin:4px 0 0;padding-top:var(--viking-space-1);border-top:1px solid var(--sidebar-border)}@media(min-width:901px){:host(.viking-sidebar-nav-tree){flex:none;width:auto;margin:var(--viking-space-1) 0;padding-top:0;border-top:none}}:host(.viking-sidebar-nav-tree-header){display:flex;align-items:center;justify-content:space-between;padding:var(--viking-space-1) var(--viking-space-2) var(--viking-space-1) 56px;color:var(--text-muted);font-size:var(--viking-font-size-base);font-weight:var(--viking-font-weight-bold);text-transform:uppercase;letter-spacing:var(--viking-letter-spacing-wide);cursor:pointer;transition:color var(--viking-duration) var(--viking-ease-default);font-family:var(--viking-font-family);border:none;background:transparent;width:100%;text-align:left}:host(.viking-sidebar-nav-tree-header):hover{color:var(--text-color)}:host(.viking-sidebar-nav-tree-header):focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}:host(.viking-sidebar-nav-tree-children){display:flex;flex-direction:column;padding:0;margin:0;border:none}:host(.viking-sidebar-nav-tree-item){display:flex;align-items:center;gap:var(--viking-space-1);padding:var(--viking-space-1) var(--viking-space-2) var(--viking-space-1) 56px;color:var(--text-muted);font-size:var(--viking-font-size-base);font-weight:var(--viking-font-weight-medium);cursor:pointer;transition:color var(--viking-duration) var(--viking-ease-default),background-color var(--viking-duration) var(--viking-ease-default),border-color var(--viking-duration) var(--viking-ease-default);border-left:3px solid transparent;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:transparent;font-family:var(--viking-font-family);border-top:none;border-right:none;border-bottom:none;width:100%;text-align:left;box-sizing:border-box}:host(.viking-sidebar-nav-tree-item):hover{background-color:var(--sidebar-hover-bg);color:var(--text-color)}:host(.viking-sidebar-nav-tree-item):focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}:host(.viking-sidebar-nav-tree-item).viking-sidebar-nav-tree-item-active{background:var(--sidebar-active-bg);border-left-color:var(--sidebar-active-border);color:var(--sidebar-active-border);font-weight:var(--viking-font-weight-semibold)}:host(.viking-sidebar-nav-tree-item).viking-sidebar-nav-tree-item-empty{font-style:italic;color:var(--text-muted);cursor:default}:host(.viking-sidebar-nav-tree-item).viking-sidebar-nav-tree-item-empty:hover{background-color:transparent;color:var(--text-muted)}:host(.viking-sidebar-nav-tree-item).viking-sidebar-nav-tree-item-accent{color:var(--status-accent);font-weight:var(--viking-font-weight-semibold);border-left:3px solid transparent}:host(.viking-sidebar-nav-tree-item).viking-sidebar-nav-tree-item-accent:hover{background-color:var(--sidebar-hover-bg);color:var(--status-accent)}.viking-sidebar-nav-tree-arrow{font-size:20px;width:20px;height:20px;line-height:20px;color:var(--text-muted)}.viking-sidebar-nav-tree-icon{font-size:var(--viking-icon-size-md, var(--base-font-size));width:var(--viking-icon-size-md, var(--base-font-size));height:var(--viking-icon-size-md, var(--base-font-size));line-height:var(--viking-icon-size-md, var(--base-font-size))}\n"] }]
12694
13680
  }], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], activated: [{ type: i0.Output, args: ["activated"] }] } });
12695
13681
 
13682
+ registerVikingElements();
13683
+ /**
13684
+ * viking-status-card — wrapper around the web component.
13685
+ */
13686
+ class VikingStatusCard {
13687
+ title = input("", /* @ts-ignore */
13688
+ ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
13689
+ subtitle = input("", /* @ts-ignore */
13690
+ ...(ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []));
13691
+ status = input("", /* @ts-ignore */
13692
+ ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
13693
+ statusTone = input("muted", /* @ts-ignore */
13694
+ ...(ngDevMode ? [{ debugName: "statusTone" }] : /* istanbul ignore next */ []));
13695
+ statusDot = input(false, /* @ts-ignore */
13696
+ ...(ngDevMode ? [{ debugName: "statusDot" }] : /* istanbul ignore next */ []));
13697
+ href = input("", /* @ts-ignore */
13698
+ ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
13699
+ target = input("", /* @ts-ignore */
13700
+ ...(ngDevMode ? [{ debugName: "target" }] : /* istanbul ignore next */ []));
13701
+ compact = input(false, /* @ts-ignore */
13702
+ ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
13703
+ loading = input(false, /* @ts-ignore */
13704
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
13705
+ interactive = input(false, /* @ts-ignore */
13706
+ ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
13707
+ ariaLabel = input("", /* @ts-ignore */
13708
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
13709
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: VikingStatusCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
13710
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: VikingStatusCard, isStandalone: true, selector: "viking-status-card", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, statusTone: { classPropertyName: "statusTone", publicName: "statusTone", isSignal: true, isRequired: false, transformFunction: null }, statusDot: { classPropertyName: "statusDot", publicName: "statusDot", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
13711
+ <viking-status-card-wc
13712
+ [attr.title]="title()"
13713
+ [attr.subtitle]="subtitle()"
13714
+ [attr.status]="status()"
13715
+ [attr.status-tone]="statusTone()"
13716
+ [attr.status-dot]="statusDot() || null"
13717
+ [attr.href]="href()"
13718
+ [attr.target]="target()"
13719
+ [attr.compact]="compact() || null"
13720
+ [attr.loading]="loading() || null"
13721
+ [attr.interactive]="interactive() || null"
13722
+ [attr.aria-label]="ariaLabel()"
13723
+ >
13724
+ <ng-content />
13725
+ </viking-status-card-wc>
13726
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
13727
+ }
13728
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: VikingStatusCard, decorators: [{
13729
+ type: Component,
13730
+ args: [{
13731
+ selector: "viking-status-card",
13732
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
13733
+ changeDetection: ChangeDetectionStrategy.OnPush,
13734
+ template: `
13735
+ <viking-status-card-wc
13736
+ [attr.title]="title()"
13737
+ [attr.subtitle]="subtitle()"
13738
+ [attr.status]="status()"
13739
+ [attr.status-tone]="statusTone()"
13740
+ [attr.status-dot]="statusDot() || null"
13741
+ [attr.href]="href()"
13742
+ [attr.target]="target()"
13743
+ [attr.compact]="compact() || null"
13744
+ [attr.loading]="loading() || null"
13745
+ [attr.interactive]="interactive() || null"
13746
+ [attr.aria-label]="ariaLabel()"
13747
+ >
13748
+ <ng-content />
13749
+ </viking-status-card-wc>
13750
+ `,
13751
+ }]
13752
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], statusTone: [{ type: i0.Input, args: [{ isSignal: true, alias: "statusTone", required: false }] }], statusDot: [{ type: i0.Input, args: [{ isSignal: true, alias: "statusDot", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
13753
+
12696
13754
  /**
12697
13755
  * viking-status-metric-row — icon + title/subtitle + value row for status cards.
12698
13756
  */
@@ -12749,6 +13807,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
12749
13807
  `, styles: [":host{display:flex;align-items:center;justify-content:space-between;gap:var(--viking-space-2);padding:var(--viking-space-2);border:1px solid var(--viking-border);border-radius:var(--viking-radius-lg);background:var(--viking-surface)}.stat-info{display:flex;align-items:center;gap:var(--viking-space-2);min-width:0}.stat-title{display:block;font-size:var(--viking-font-size-sm);font-weight:var(--viking-font-weight-semibold);color:var(--viking-text)}.stat-subtitle{display:block;font-size:var(--viking-font-size-sm);color:var(--viking-text-muted)}.stat-value{font-size:calc(var(--viking-font-size) * 1.25);font-weight:700;color:var(--viking-text)}\n"] }]
12750
13808
  }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: true }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
12751
13809
 
13810
+ registerVikingElements();
13811
+ /**
13812
+ * viking-status-pill — status badge for status cards and operational states.
13813
+ */
13814
+ class VikingStatusPill {
13815
+ tone = input("muted", /* @ts-ignore */
13816
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
13817
+ icon = input("", /* @ts-ignore */
13818
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
13819
+ dot = input(false, /* @ts-ignore */
13820
+ ...(ngDevMode ? [{ debugName: "dot" }] : /* istanbul ignore next */ []));
13821
+ compact = input(false, /* @ts-ignore */
13822
+ ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
13823
+ removable = input(false, /* @ts-ignore */
13824
+ ...(ngDevMode ? [{ debugName: "removable" }] : /* istanbul ignore next */ []));
13825
+ href = input("", /* @ts-ignore */
13826
+ ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
13827
+ target = input("", /* @ts-ignore */
13828
+ ...(ngDevMode ? [{ debugName: "target" }] : /* istanbul ignore next */ []));
13829
+ ariaLabel = input("", /* @ts-ignore */
13830
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
13831
+ removed = output();
13832
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: VikingStatusPill, deps: [], target: i0.ɵɵFactoryTarget.Component });
13833
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: VikingStatusPill, isStandalone: true, selector: "viking-status-pill", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, dot: { classPropertyName: "dot", publicName: "dot", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, removable: { classPropertyName: "removable", publicName: "removable", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, ngImport: i0, template: `
13834
+ <viking-status-pill-wc
13835
+ [attr.tone]="tone()"
13836
+ [attr.icon]="icon()"
13837
+ [attr.dot]="dot() || null"
13838
+ [attr.compact]="compact() || null"
13839
+ [attr.removable]="removable() || null"
13840
+ [attr.href]="href()"
13841
+ [attr.target]="target()"
13842
+ [attr.aria-label]="ariaLabel()"
13843
+ (viking-pill-removed)="removed.emit()"
13844
+ >
13845
+ <ng-content />
13846
+ </viking-status-pill-wc>
13847
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
13848
+ }
13849
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: VikingStatusPill, decorators: [{
13850
+ type: Component,
13851
+ args: [{
13852
+ selector: "viking-status-pill",
13853
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
13854
+ changeDetection: ChangeDetectionStrategy.OnPush,
13855
+ template: `
13856
+ <viking-status-pill-wc
13857
+ [attr.tone]="tone()"
13858
+ [attr.icon]="icon()"
13859
+ [attr.dot]="dot() || null"
13860
+ [attr.compact]="compact() || null"
13861
+ [attr.removable]="removable() || null"
13862
+ [attr.href]="href()"
13863
+ [attr.target]="target()"
13864
+ [attr.aria-label]="ariaLabel()"
13865
+ (viking-pill-removed)="removed.emit()"
13866
+ >
13867
+ <ng-content />
13868
+ </viking-status-pill-wc>
13869
+ `,
13870
+ }]
13871
+ }], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], dot: [{ type: i0.Input, args: [{ isSignal: true, alias: "dot", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], removable: [{ type: i0.Input, args: [{ isSignal: true, alias: "removable", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
13872
+
12752
13873
  /**
12753
13874
  * viking-slider — range slider.
12754
13875
  * ControlValueAccessor-compatible.
@@ -13971,5 +15092,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
13971
15092
  * Generated bundle index. Do not edit.
13972
15093
  */
13973
15094
 
13974
- export { BUG_REPORT_QUERY, COOKIE_SETTINGS_QUERY, DEFAULT_SITE_URLS, MATERIAL_ICON_ALIASES$1 as MATERIAL_ICON_ALIASES, SITE_FOOTER_COLUMNS, SITE_NAV_LINKS, VIKING_BRAND_ICON_FILLED_PATHS$1 as VIKING_BRAND_ICON_FILLED_PATHS, VIKING_BRAND_ICON_NAMES$1 as VIKING_BRAND_ICON_NAMES, VIKING_BRAND_ICON_NAMES_LIST$1 as VIKING_BRAND_ICON_NAMES_LIST, VIKING_BRAND_ICON_PATHS$1 as VIKING_BRAND_ICON_PATHS, VIKING_DRAKKAR_ICON_FILLED_PATHS$1 as VIKING_DRAKKAR_ICON_FILLED_PATHS, VIKING_DRAKKAR_ICON_NAMES_LIST$1 as VIKING_DRAKKAR_ICON_NAMES_LIST, VIKING_DRAKKAR_ICON_PATHS$1 as VIKING_DRAKKAR_ICON_PATHS, VIKING_FILLED_ICON_NAMES$1 as VIKING_FILLED_ICON_NAMES, VIKING_ICON_FILLED_PATHS$1 as VIKING_ICON_FILLED_PATHS, VIKING_ICON_NAMES$1 as VIKING_ICON_NAMES, VIKING_ICON_PATHS$1 as VIKING_ICON_PATHS, VIKING_ICON_SIZE_PRESETS$1 as VIKING_ICON_SIZE_PRESETS, VIKING_INTEGRATION_BRAND_COLORS$1 as VIKING_INTEGRATION_BRAND_COLORS, VIKING_INTEGRATION_BRAND_NAMES$1 as VIKING_INTEGRATION_BRAND_NAMES, VIKING_INTEGRATION_BRAND_SVGS$1 as VIKING_INTEGRATION_BRAND_SVGS, VIKING_INTEGRATION_ICON_NAMES_LIST$1 as VIKING_INTEGRATION_ICON_NAMES_LIST, VIKING_INTEGRATION_ICON_PATHS$1 as VIKING_INTEGRATION_ICON_PATHS, VIKING_LUCIDE_ICON_NAMES$1 as VIKING_LUCIDE_ICON_NAMES, VIKING_SERIES_DEFAULT, VIKING_SERIES_PRESETS, VIKING_TABS, VIKING_TOGGLE_GROUP, VikingAccordion, VikingAccordionItem, VikingAppHeader, VikingAppSidebar, VikingAuthPanel, VikingAutocomplete, VikingAvatar, VikingBadge, VikingBadgeWc, VikingBar, VikingBrand, VikingBreadcrumbs, VikingButton, VikingButtonGroup, VikingButtonWc, VikingCalendar, VikingCallout, VikingCalloutWc, VikingCard, VikingCardFooter, VikingCardHeader, VikingCardTitle, VikingCardWc, VikingCarousel, VikingCarouselSlide, VikingChart, VikingChartCardHeader, VikingChartEmptyState, VikingChartPanel, VikingCheckbox, VikingColorPicker, VikingCommand, VikingComposer, VikingConfirmDialog, VikingContext, VikingControl, VikingDatePicker, VikingDialogService, VikingDropdown, VikingEditor, VikingEmptyState, VikingFab, VikingField, VikingFieldWc, VikingFileUpload, VikingFooter, VikingFormPanel, VikingFormSection, VikingGaugeArc, VikingHeading, VikingHudPanel, VikingIcon, VikingIconBadge, VikingIcon as VikingIconComponent, VikingIconHeading, VikingIconText, VikingInput, VikingInputWc, VikingKanban, VikingKbd, VikingLabel, VikingLoadingOverlay, VikingMenuItem, VikingMenubar, VikingMenubarItem, VikingMetricCard, VikingMetricRow, VikingModal, VikingModalWc, VikingNativeSelect, VikingNavbar, VikingNavbarItem, VikingNavigationMenu, VikingOtpInput, VikingPageBackLink, VikingPageHeader, VikingPagination, VikingPillbox, VikingPopover, VikingProfile, VikingProgress, VikingRadioGroup, VikingRingGauge, VikingScrollArea, VikingSearchPalette, VikingSearchPaletteWc, VikingSelect, VikingSelectWc, VikingSeparator, VikingSheet, VikingSidebarNav, VikingSidebarNavLink, VikingSidebarNavTree, VikingSidebarNavTreeChildren, VikingSidebarNavTreeHeader, VikingSidebarNavTreeItem, VikingSiteFooter, VikingSiteNavbar, VikingSkeleton, VikingSlider, VikingSpinner, VikingStatusMetricRow, VikingSuiteHeaderWc, VikingSuiteSearchPalette, VikingSuiteSearchPaletteWc, VikingSwitch, VikingTab, VikingTabPanel, VikingTable, VikingTabs, VikingText, VikingTextarea, VikingThemeToggle, VikingThemeToggleWc, VikingTimePicker, VikingTimeline, VikingTimelineItem, VikingToastService, VikingToaster, VikingToggle, VikingToggleGroup, VikingTooltip, VikingUptimeBar, VikingVerificationCodeField, VikingWhitepaperCta, VikingWizard, bugReportHref, buildSuiteSearchItems, clampChartWindow, cookieSettingsHref, fullChartWindow, isAppRouterPath, isIntegrationBrandIcon$1 as isIntegrationBrandIcon, panChartWindow, provideVikingCva, registerVikingBadgeWc, registerVikingButtonWc, registerVikingCalloutWc, registerVikingCardWc, registerVikingElements, registerVikingFieldWc, registerVikingInputWc, registerVikingModalWc, registerVikingSearchPaletteWc, registerVikingSelectWc, registerVikingSuiteHeaderWc, registerVikingSuiteSearchPaletteWc, registerVikingThemeToggleWc, resolveBrandHref, resolveFooterHref, resolveNavHref, resolveVikingIcon$1 as resolveVikingIcon, resolveVikingIconColor$1 as resolveVikingIconColor, resolveVikingIconSize$1 as resolveVikingIconSize, sliceChartData, vikingIconViewBox$1 as vikingIconViewBox, visibleNavLinks, zoomChartWindow };
15095
+ export { BUG_REPORT_QUERY, COOKIE_SETTINGS_QUERY, DEFAULT_SITE_URLS, MATERIAL_ICON_ALIASES$1 as MATERIAL_ICON_ALIASES, SITE_FOOTER_COLUMNS, SITE_NAV_LINKS, VIKING_BRAND_ICON_FILLED_PATHS$1 as VIKING_BRAND_ICON_FILLED_PATHS, VIKING_BRAND_ICON_NAMES$1 as VIKING_BRAND_ICON_NAMES, VIKING_BRAND_ICON_NAMES_LIST$1 as VIKING_BRAND_ICON_NAMES_LIST, VIKING_BRAND_ICON_PATHS$1 as VIKING_BRAND_ICON_PATHS, VIKING_DRAKKAR_ICON_FILLED_PATHS$1 as VIKING_DRAKKAR_ICON_FILLED_PATHS, VIKING_DRAKKAR_ICON_NAMES_LIST$1 as VIKING_DRAKKAR_ICON_NAMES_LIST, VIKING_DRAKKAR_ICON_PATHS$1 as VIKING_DRAKKAR_ICON_PATHS, VIKING_FILLED_ICON_NAMES$1 as VIKING_FILLED_ICON_NAMES, VIKING_ICON_FILLED_PATHS$1 as VIKING_ICON_FILLED_PATHS, VIKING_ICON_NAMES$1 as VIKING_ICON_NAMES, VIKING_ICON_PATHS$1 as VIKING_ICON_PATHS, VIKING_ICON_SIZE_PRESETS$1 as VIKING_ICON_SIZE_PRESETS, VIKING_INTEGRATION_BRAND_COLORS$1 as VIKING_INTEGRATION_BRAND_COLORS, VIKING_INTEGRATION_BRAND_NAMES$1 as VIKING_INTEGRATION_BRAND_NAMES, VIKING_INTEGRATION_BRAND_SVGS$1 as VIKING_INTEGRATION_BRAND_SVGS, VIKING_INTEGRATION_ICON_NAMES_LIST$1 as VIKING_INTEGRATION_ICON_NAMES_LIST, VIKING_INTEGRATION_ICON_PATHS$1 as VIKING_INTEGRATION_ICON_PATHS, VIKING_LUCIDE_ICON_NAMES$1 as VIKING_LUCIDE_ICON_NAMES, VIKING_SERIES_DEFAULT, VIKING_SERIES_PRESETS, VIKING_TABS, VIKING_TOGGLE_GROUP, VikingAccordion, VikingAccordionItem, VikingAppHeader, VikingAppSidebar, VikingAuthPanel, VikingAutocomplete, VikingAvatar, VikingBadge, VikingBadgeWc, VikingBar, VikingBrand, VikingBreadcrumbs, VikingButton, VikingButtonGroup, VikingButtonWc, VikingCalendar, VikingCallout, VikingCalloutWc, VikingCard, VikingCardFooter, VikingCardHeader, VikingCardTitle, VikingCardWc, VikingCarousel, VikingCarouselSlide, VikingChart, VikingChartCardHeader, VikingChartEmptyState, VikingChartPanel, VikingCheckbox, VikingColorPicker, VikingCommand, VikingComposer, VikingConfirmDialog, VikingContext, VikingControl, VikingDatePicker, VikingDialogService, VikingDropdown, VikingEditor, VikingEmptyState, VikingFab, VikingField, VikingFieldWc, VikingFileUpload, VikingFooter, VikingFormPanel, VikingFormSection, VikingGaugeArc, VikingHeading, VikingHudPanel, VikingIcon, VikingIconBadge, VikingIcon as VikingIconComponent, VikingIconHeading, VikingIconText, VikingInput, VikingInputWc, VikingKanban, VikingKbd, VikingLabel, VikingLoadingOverlay, VikingMenuItem, VikingMenubar, VikingMenubarItem, VikingMetricCard, VikingMetricRow, VikingModal, VikingModalWc, VikingNativeSelect, VikingNavbar, VikingNavbarItem, VikingNavigationMenu, VikingOtpInput, VikingPageBackLink, VikingPageHeader, VikingPagination, VikingPillbox, VikingPopover, VikingProfile, VikingProgress, VikingRadioGroup, VikingRingGauge, VikingScrollArea, VikingSearchPalette, VikingSearchPaletteWc, VikingSelect, VikingSelectWc, VikingSeparator, VikingSheet, VikingSidebarNav, VikingSidebarNavLink, VikingSidebarNavTree, VikingSidebarNavTreeChildren, VikingSidebarNavTreeHeader, VikingSidebarNavTreeItem, VikingSiteFooter, VikingSiteNavbar, VikingSkeleton, VikingSlider, VikingSpinner, VikingStatusCard, VikingStatusCardWc, VikingStatusMetricRow, VikingStatusPill, VikingStatusPillWc, VikingSuiteHeaderWc, VikingSuiteSearchPalette, VikingSuiteSearchPaletteWc, VikingSwitch, VikingTab, VikingTabPanel, VikingTable, VikingTabs, VikingText, VikingTextarea, VikingThemeToggle, VikingThemeToggleWc, VikingTimePicker, VikingTimeline, VikingTimelineItem, VikingToastService, VikingToaster, VikingToggle, VikingToggleGroup, VikingTooltip, VikingUptimeBar, VikingVerificationCodeField, VikingWhitepaperCta, VikingWizard, bugReportHref, buildSuiteSearchItems, clampChartWindow, cookieSettingsHref, fullChartWindow, isAppRouterPath, isIntegrationBrandIcon$1 as isIntegrationBrandIcon, panChartWindow, provideVikingCva, registerVikingBadgeWc, registerVikingButtonWc, registerVikingCalloutWc, registerVikingCardWc, registerVikingElements, registerVikingFieldWc, registerVikingInputWc, registerVikingModalWc, registerVikingSearchPaletteWc, registerVikingSelectWc, registerVikingStatusCardWc, registerVikingStatusPillWc, registerVikingSuiteHeaderWc, registerVikingSuiteSearchPaletteWc, registerVikingThemeToggleWc, resolveBrandHref, resolveFooterHref, resolveNavHref, resolveVikingIcon$1 as resolveVikingIcon, resolveVikingIconColor$1 as resolveVikingIconColor, resolveVikingIconSize$1 as resolveVikingIconSize, sliceChartData, vikingIconViewBox$1 as vikingIconViewBox, visibleNavLinks, zoomChartWindow };
13975
15096
  //# sourceMappingURL=dataengineeringformachinelearning-viking-ui.mjs.map