@dataengineeringformachinelearning/viking-ui 1.0.1 → 1.0.2

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.
@@ -66,7 +66,14 @@ const VIKING_ICON_PATHS = {
66
66
  shield: '<path d="M12 3 4.5 6v5c0 5 3 8.5 7.5 10 4.5-1.5 7.5-5 7.5-10V6L12 3z"/>',
67
67
  'bar-chart': '<path d="M4 4v16h16M8 16v-5M12 16V8M16 16v-3"/>',
68
68
  phone: '<path d="M5 4h4l1.5 4L8 10a12 12 0 0 0 6 6l2-2.5L20 15v4a2 2 0 0 1-2 2A16 16 0 0 1 3 6a2 2 0 0 1 2-2z"/>',
69
+ google: '<path d="M12 11.2v2.4h6.6c-.3 1.5-1.8 4.4-6.6 4.4-4 0-7.2-3.3-7.2-7.3S8 3.4 12 3.4c2.3 0 3.9 1 4.8 1.8l3.2-3.1C17.5.8 14.9 0 12 0 5.4 0 0 5.4 0 12s5.4 12 12 12c6.9 0 11.5-4.8 11.5-11.6 0-.8-.1-1.4-.2-1.9H12z"/>',
70
+ apple: '<path d="M16.365 12.14c.02 2.53 2.21 3.38 2.23 3.39-.02.07-.35 1.21-1.16 2.4-.7 1.02-1.43 2.03-2.58 2.05-1.13.02-1.49-.67-2.78-.67-1.29 0-1.69.65-2.75.69-1.11.04-1.95-1.12-2.66-2.13-1.44-2.08-2.54-5.87-1.07-8.43.73-1.27 2.04-2.08 3.46-2.1 1.08-.02 2.1.72 2.78.72.67 0 2.14-.89 3.61-.76.61.03 2.33.25 3.44 1.88-.09.06-2.05 1.2-2.03 3.55M13.75 3.64c.59-.71 1-1.7.89-2.68-.86.03-1.9.57-2.52 1.28-.55.63-1.03 1.65-.9 2.62.95.07 1.92-.49 2.53-1.22"/>',
69
71
  };
72
+ /** Icons rendered with fill instead of stroke (brand marks). */
73
+ const VIKING_FILLED_ICON_NAMES = [
74
+ 'google',
75
+ 'apple',
76
+ ];
70
77
  const VIKING_ICON_NAMES = Object.keys(VIKING_ICON_PATHS);
71
78
 
72
79
  /** Registers a component as a ControlValueAccessor. */
@@ -193,7 +200,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
193
200
  }], propDecorators: { collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], dragging: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragging", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], resizeStart: [{ type: i0.Output, args: ["resizeStart"] }] } });
194
201
 
195
202
  /**
196
- * viking-icon — inline SVG icon (https://fluxui.dev/components/icon).
203
+ * viking-icon — inline SVG icon.
197
204
  * Zero-dependency 24x24 stroke icons from the internal registry.
198
205
  */
199
206
  class VikingIcon {
@@ -204,6 +211,8 @@ class VikingIcon {
204
211
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
205
212
  spin = input(false, /* @ts-ignore */
206
213
  ...(ngDevMode ? [{ debugName: "spin" }] : /* istanbul ignore next */ []));
214
+ filled = computed(() => VIKING_FILLED_ICON_NAMES.includes(this.name()), /* @ts-ignore */
215
+ ...(ngDevMode ? [{ debugName: "filled" }] : /* istanbul ignore next */ []));
207
216
  paths = computed(() =>
208
217
  // Registry content is a static, trusted constant defined inside this package.
209
218
  this.sanitizer.bypassSecurityTrustHtml(VIKING_ICON_PATHS[this.name()] ?? ''), /* @ts-ignore */
@@ -213,9 +222,9 @@ class VikingIcon {
213
222
  <svg
214
223
  xmlns="http://www.w3.org/2000/svg"
215
224
  viewBox="0 0 24 24"
216
- fill="none"
217
- stroke="currentColor"
218
- stroke-width="1.8"
225
+ [attr.fill]="filled() ? 'currentColor' : 'none'"
226
+ [attr.stroke]="filled() ? 'none' : 'currentColor'"
227
+ [attr.stroke-width]="filled() ? null : '1.8'"
219
228
  stroke-linecap="round"
220
229
  stroke-linejoin="round"
221
230
  [style.width.px]="size()"
@@ -233,9 +242,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
233
242
  <svg
234
243
  xmlns="http://www.w3.org/2000/svg"
235
244
  viewBox="0 0 24 24"
236
- fill="none"
237
- stroke="currentColor"
238
- stroke-width="1.8"
245
+ [attr.fill]="filled() ? 'currentColor' : 'none'"
246
+ [attr.stroke]="filled() ? 'none' : 'currentColor'"
247
+ [attr.stroke-width]="filled() ? null : '1.8'"
239
248
  stroke-linecap="round"
240
249
  stroke-linejoin="round"
241
250
  [style.width.px]="size()"
@@ -253,7 +262,7 @@ const fluxUid = (prefix) => {
253
262
  };
254
263
 
255
264
  /**
256
- * viking-accordion — collapsible content panels (https://fluxui.dev/components/accordion).
265
+ * viking-accordion — collapsible content panels.
257
266
  * Set exclusive to allow only one open item at a time.
258
267
  */
259
268
  class VikingAccordion {
@@ -328,9 +337,308 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
328
337
  `, styles: [":host{display:block}.viking-accordion-trigger{display:flex;align-items:center;justify-content:space-between;gap:var(--viking-space-2);width:100%;border:none;background:transparent;color:var(--viking-text);font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);font-weight:700;padding:var(--viking-space-2);cursor:pointer;text-align:left;transition:var(--viking-transition)}.viking-accordion-trigger:hover{background:var(--viking-accent-soft)}.viking-accordion-trigger:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:-3px}.viking-accordion-panel{padding:0 var(--viking-space-2) var(--viking-space-2);color:var(--viking-text-muted);font-family:var(--viking-font-family);font-size:var(--viking-font-size);line-height:1.6}\n"] }]
329
338
  }], propDecorators: { heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: true }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }] } });
330
339
 
340
+ /**
341
+ * viking-button — composable button.
342
+ * Variants: outline (default), primary, filled, danger, ghost, subtle.
343
+ */
344
+ class VikingButton {
345
+ variant = input('outline', /* @ts-ignore */
346
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
347
+ size = input('base', /* @ts-ignore */
348
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
349
+ type = input('button', /* @ts-ignore */
350
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
351
+ icon = input(null, /* @ts-ignore */
352
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
353
+ iconTrailing = input(null, /* @ts-ignore */
354
+ ...(ngDevMode ? [{ debugName: "iconTrailing" }] : /* istanbul ignore next */ []));
355
+ disabled = input(false, /* @ts-ignore */
356
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
357
+ loading = input(false, /* @ts-ignore */
358
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
359
+ square = input(false, /* @ts-ignore */
360
+ ...(ngDevMode ? [{ debugName: "square" }] : /* istanbul ignore next */ []));
361
+ /** Stretch button to 100% of container width. */
362
+ fullWidth = input(false, /* @ts-ignore */
363
+ ...(ngDevMode ? [{ debugName: "fullWidth" }] : /* istanbul ignore next */ []));
364
+ href = input(null, /* @ts-ignore */
365
+ ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
366
+ target = input(null, /* @ts-ignore */
367
+ ...(ngDevMode ? [{ debugName: "target" }] : /* istanbul ignore next */ []));
368
+ kbd = input(null, /* @ts-ignore */
369
+ ...(ngDevMode ? [{ debugName: "kbd" }] : /* istanbul ignore next */ []));
370
+ /** Accessible name; required for icon-only (square) buttons. */
371
+ label = input('', /* @ts-ignore */
372
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
373
+ pressed = output();
374
+ iconSize = computed(() => (this.size() === 'base' ? 22 : 18), /* @ts-ignore */
375
+ ...(ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []));
376
+ classes = computed(() => ({
377
+ [`viking-${this.variant()}`]: true,
378
+ [`viking-${this.size()}`]: this.size() !== 'base',
379
+ 'viking-square': this.square(),
380
+ }), /* @ts-ignore */
381
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
382
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
383
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: VikingButton, isStandalone: true, selector: "viking-button", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconTrailing: { classPropertyName: "iconTrailing", publicName: "iconTrailing", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, square: { classPropertyName: "square", publicName: "square", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", 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 }, kbd: { classPropertyName: "kbd", publicName: "kbd", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pressed: "pressed" }, host: { properties: { "style.pointer-events": "disabled() ? 'none' : null", "class.viking-full": "fullWidth()" } }, ngImport: i0, template: `
384
+ @if (href()) {
385
+ <a
386
+ class="viking-btn"
387
+ [class]="classes()"
388
+ [href]="href()"
389
+ [attr.target]="target()"
390
+ [attr.aria-label]="label() || null"
391
+ [attr.rel]="target() === '_blank' ? 'noopener noreferrer' : null"
392
+ >
393
+ <ng-container *ngTemplateOutlet="content"></ng-container>
394
+ </a>
395
+ } @else {
396
+ <button
397
+ class="viking-btn"
398
+ [class]="classes()"
399
+ [type]="type()"
400
+ [disabled]="disabled() || loading()"
401
+ [attr.aria-label]="label() || null"
402
+ [attr.aria-busy]="loading() ? 'true' : null"
403
+ (click)="pressed.emit($event)"
404
+ >
405
+ <ng-container *ngTemplateOutlet="content"></ng-container>
406
+ </button>
407
+ }
408
+
409
+ <ng-template #content>
410
+ @if (loading()) {
411
+ <viking-icon name="loader" [size]="iconSize()" [spin]="true" />
412
+ } @else if (icon()) {
413
+ <viking-icon [name]="icon()!" [size]="iconSize()" />
414
+ }
415
+ <span class="viking-btn-label"><ng-content /></span>
416
+ @if (iconTrailing()) {
417
+ <viking-icon [name]="iconTrailing()!" [size]="iconSize()" />
418
+ }
419
+ @if (kbd()) {
420
+ <kbd class="viking-btn-kbd">{{ kbd() }}</kbd>
421
+ }
422
+ </ng-template>
423
+ `, isInline: true, styles: [":host{display:inline-flex}:host(.viking-full){display:flex}:host(.viking-full) .viking-btn{width:100%}.viking-btn{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);font-weight:700;letter-spacing:.01em;display:inline-flex;align-items:center;justify-content:center;gap:var(--viking-space-1);min-height:var(--viking-control-height);padding:0 var(--viking-control-padding-x);border-radius:var(--viking-radius);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:var(--viking-transition);width:auto;min-width:var(--viking-btn-min-width, 120px);white-space:nowrap}:host(.viking-full) .viking-btn{min-width:0}.viking-btn:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-btn:disabled{opacity:.55;cursor:not-allowed}.viking-sm{min-height:var(--viking-control-height-sm);padding:0 var(--viking-space-2)}.viking-xs{min-height:var(--viking-control-height-xs);padding:0 var(--viking-space-1)}.viking-square{width:var(--viking-control-height);padding:0}.viking-square.viking-sm{width:var(--viking-control-height-sm)}.viking-square.viking-xs{width:var(--viking-control-height-xs)}.viking-square .viking-btn-label{display:none}.viking-outline{background:var(--viking-surface);color:var(--viking-text);border-color:var(--viking-border-strong);box-shadow:var(--viking-shadow-sm)}.viking-outline:hover:not(:disabled){background:var(--viking-surface-alt);border-color:var(--viking-accent-strong)}.viking-primary{background:var(--viking-accent);color:var(--viking-accent-content);border-color:var(--viking-accent);box-shadow:var(--viking-shadow-sm)}.viking-primary:hover:not(:disabled){background:var(--viking-accent-strong);border-color:var(--viking-accent-strong);border-bottom-color:var(--hover-color, #fdca40)}.viking-filled{background:var(--viking-surface-alt);color:var(--viking-text);border-color:var(--viking-border)}.viking-filled:hover:not(:disabled){border-color:var(--viking-accent-strong)}.viking-danger{background:var(--viking-danger);color:var(--viking-on-danger, #31393c);border-color:var(--viking-danger)}.viking-danger:hover:not(:disabled){opacity:.9}.viking-ghost{background:transparent;color:var(--viking-text)}.viking-ghost:hover:not(:disabled){background:var(--viking-accent-soft)}.viking-subtle{background:transparent;color:var(--viking-text-muted);border-color:var(--viking-border)}.viking-subtle:hover:not(:disabled){color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-strong)}.viking-btn-kbd{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);color:var(--viking-text-muted);background:var(--viking-surface-alt);border:1px solid var(--viking-border);border-radius:calc(var(--viking-radius) / 2);padding:0 var(--viking-space-1);line-height:1.4}\n"], dependencies: [{ kind: "component", type: VikingIcon, selector: "viking-icon", inputs: ["name", "size", "spin"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
424
+ }
425
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingButton, decorators: [{
426
+ type: Component,
427
+ args: [{ selector: 'viking-button', imports: [VikingIcon, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, host: {
428
+ '[style.pointer-events]': "disabled() ? 'none' : null",
429
+ '[class.viking-full]': 'fullWidth()',
430
+ }, template: `
431
+ @if (href()) {
432
+ <a
433
+ class="viking-btn"
434
+ [class]="classes()"
435
+ [href]="href()"
436
+ [attr.target]="target()"
437
+ [attr.aria-label]="label() || null"
438
+ [attr.rel]="target() === '_blank' ? 'noopener noreferrer' : null"
439
+ >
440
+ <ng-container *ngTemplateOutlet="content"></ng-container>
441
+ </a>
442
+ } @else {
443
+ <button
444
+ class="viking-btn"
445
+ [class]="classes()"
446
+ [type]="type()"
447
+ [disabled]="disabled() || loading()"
448
+ [attr.aria-label]="label() || null"
449
+ [attr.aria-busy]="loading() ? 'true' : null"
450
+ (click)="pressed.emit($event)"
451
+ >
452
+ <ng-container *ngTemplateOutlet="content"></ng-container>
453
+ </button>
454
+ }
455
+
456
+ <ng-template #content>
457
+ @if (loading()) {
458
+ <viking-icon name="loader" [size]="iconSize()" [spin]="true" />
459
+ } @else if (icon()) {
460
+ <viking-icon [name]="icon()!" [size]="iconSize()" />
461
+ }
462
+ <span class="viking-btn-label"><ng-content /></span>
463
+ @if (iconTrailing()) {
464
+ <viking-icon [name]="iconTrailing()!" [size]="iconSize()" />
465
+ }
466
+ @if (kbd()) {
467
+ <kbd class="viking-btn-kbd">{{ kbd() }}</kbd>
468
+ }
469
+ </ng-template>
470
+ `, styles: [":host{display:inline-flex}:host(.viking-full){display:flex}:host(.viking-full) .viking-btn{width:100%}.viking-btn{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);font-weight:700;letter-spacing:.01em;display:inline-flex;align-items:center;justify-content:center;gap:var(--viking-space-1);min-height:var(--viking-control-height);padding:0 var(--viking-control-padding-x);border-radius:var(--viking-radius);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:var(--viking-transition);width:auto;min-width:var(--viking-btn-min-width, 120px);white-space:nowrap}:host(.viking-full) .viking-btn{min-width:0}.viking-btn:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-btn:disabled{opacity:.55;cursor:not-allowed}.viking-sm{min-height:var(--viking-control-height-sm);padding:0 var(--viking-space-2)}.viking-xs{min-height:var(--viking-control-height-xs);padding:0 var(--viking-space-1)}.viking-square{width:var(--viking-control-height);padding:0}.viking-square.viking-sm{width:var(--viking-control-height-sm)}.viking-square.viking-xs{width:var(--viking-control-height-xs)}.viking-square .viking-btn-label{display:none}.viking-outline{background:var(--viking-surface);color:var(--viking-text);border-color:var(--viking-border-strong);box-shadow:var(--viking-shadow-sm)}.viking-outline:hover:not(:disabled){background:var(--viking-surface-alt);border-color:var(--viking-accent-strong)}.viking-primary{background:var(--viking-accent);color:var(--viking-accent-content);border-color:var(--viking-accent);box-shadow:var(--viking-shadow-sm)}.viking-primary:hover:not(:disabled){background:var(--viking-accent-strong);border-color:var(--viking-accent-strong);border-bottom-color:var(--hover-color, #fdca40)}.viking-filled{background:var(--viking-surface-alt);color:var(--viking-text);border-color:var(--viking-border)}.viking-filled:hover:not(:disabled){border-color:var(--viking-accent-strong)}.viking-danger{background:var(--viking-danger);color:var(--viking-on-danger, #31393c);border-color:var(--viking-danger)}.viking-danger:hover:not(:disabled){opacity:.9}.viking-ghost{background:transparent;color:var(--viking-text)}.viking-ghost:hover:not(:disabled){background:var(--viking-accent-soft)}.viking-subtle{background:transparent;color:var(--viking-text-muted);border-color:var(--viking-border)}.viking-subtle:hover:not(:disabled){color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-strong)}.viking-btn-kbd{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);color:var(--viking-text-muted);background:var(--viking-surface-alt);border:1px solid var(--viking-border);border-radius:calc(var(--viking-radius) / 2);padding:0 var(--viking-space-1);line-height:1.4}\n"] }]
471
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconTrailing: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTrailing", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], square: [{ type: i0.Input, args: [{ isSignal: true, alias: "square", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], kbd: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbd", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], pressed: [{ type: i0.Output, args: ["pressed"] }] } });
472
+
473
+ /**
474
+ * viking-separator — horizontal/vertical rule with optional label
475
+ *.
476
+ */
477
+ class VikingSeparator {
478
+ orientation = input('horizontal', /* @ts-ignore */
479
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
480
+ text = input('', /* @ts-ignore */
481
+ ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
482
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingSeparator, deps: [], target: i0.ɵɵFactoryTarget.Component });
483
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: VikingSeparator, isStandalone: true, selector: "viking-separator", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "separator" }, properties: { "attr.aria-orientation": "orientation()", "class.viking-vertical": "orientation() === 'vertical'" } }, ngImport: i0, template: `
484
+ @if (text() && orientation() === 'horizontal') {
485
+ <span class="viking-separator-line" aria-hidden="true"></span>
486
+ <span class="viking-separator-text">{{ text() }}</span>
487
+ <span class="viking-separator-line" aria-hidden="true"></span>
488
+ } @else {
489
+ <span class="viking-separator-line" aria-hidden="true"></span>
490
+ }
491
+ `, isInline: true, styles: [":host{display:flex;align-items:center;gap:var(--viking-space-2);width:100%}:host(.viking-vertical){width:auto;align-self:stretch}.viking-separator-line{flex:1;border-top:1px solid var(--viking-border)}:host(.viking-vertical) .viking-separator-line{flex:none;border-top:none;border-left:1px solid var(--viking-border);height:100%;min-height:var(--viking-space-3)}.viking-separator-text{font-family:var(--viking-font-family);font-size:var(--viking-font-size);color:var(--viking-text-muted);white-space:nowrap}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
492
+ }
493
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingSeparator, decorators: [{
494
+ type: Component,
495
+ args: [{ selector: 'viking-separator', changeDetection: ChangeDetectionStrategy.OnPush, host: {
496
+ role: 'separator',
497
+ '[attr.aria-orientation]': 'orientation()',
498
+ '[class.viking-vertical]': "orientation() === 'vertical'",
499
+ }, template: `
500
+ @if (text() && orientation() === 'horizontal') {
501
+ <span class="viking-separator-line" aria-hidden="true"></span>
502
+ <span class="viking-separator-text">{{ text() }}</span>
503
+ <span class="viking-separator-line" aria-hidden="true"></span>
504
+ } @else {
505
+ <span class="viking-separator-line" aria-hidden="true"></span>
506
+ }
507
+ `, styles: [":host{display:flex;align-items:center;gap:var(--viking-space-2);width:100%}:host(.viking-vertical){width:auto;align-self:stretch}.viking-separator-line{flex:1;border-top:1px solid var(--viking-border)}:host(.viking-vertical) .viking-separator-line{flex:none;border-top:none;border-left:1px solid var(--viking-border);height:100%;min-height:var(--viking-space-3)}.viking-separator-text{font-family:var(--viking-font-family);font-size:var(--viking-font-size);color:var(--viking-text-muted);white-space:nowrap}\n"] }]
508
+ }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }] } });
509
+
510
+ /**
511
+ * viking-auth-panel — access portal / sign-in layout template.
512
+ * Full-width stacked actions, Google + Apple OAuth row, WCAG-friendly structure.
513
+ */
514
+ class VikingAuthPanel {
515
+ tag = input('Access Portal', /* @ts-ignore */
516
+ ...(ngDevMode ? [{ debugName: "tag" }] : /* istanbul ignore next */ []));
517
+ title = input.required(/* @ts-ignore */
518
+ ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
519
+ subtitle = input('Secure entry to the DEML (DATA ENGINEERING FOR MACHINE LEARNING).', /* @ts-ignore */
520
+ ...(ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []));
521
+ showSocial = input(true, /* @ts-ignore */
522
+ ...(ngDevMode ? [{ debugName: "showSocial" }] : /* istanbul ignore next */ []));
523
+ socialLoading = input(false, /* @ts-ignore */
524
+ ...(ngDevMode ? [{ debugName: "socialLoading" }] : /* istanbul ignore next */ []));
525
+ googleSignIn = output();
526
+ appleSignIn = output();
527
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingAuthPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
528
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: VikingAuthPanel, isStandalone: true, selector: "viking-auth-panel", inputs: { tag: { classPropertyName: "tag", publicName: "tag", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, showSocial: { classPropertyName: "showSocial", publicName: "showSocial", isSignal: true, isRequired: false, transformFunction: null }, socialLoading: { classPropertyName: "socialLoading", publicName: "socialLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { googleSignIn: "googleSignIn", appleSignIn: "appleSignIn" }, host: { classAttribute: "viking-auth-panel-host" }, ngImport: i0, template: `
529
+ <section class="viking-auth-panel" aria-labelledby="viking-auth-title">
530
+ <header class="viking-auth-header">
531
+ @if (tag()) {
532
+ <div class="viking-auth-tag-row">
533
+ <span class="viking-auth-tag">{{ tag() }}</span>
534
+ </div>
535
+ }
536
+ <h1 id="viking-auth-title" class="viking-auth-title">{{ title() }}</h1>
537
+ @if (subtitle()) {
538
+ <p class="viking-auth-subtitle">{{ subtitle() }}</p>
539
+ }
540
+ </header>
541
+
542
+ <div class="viking-auth-body">
543
+ <ng-content />
544
+ </div>
545
+
546
+ <ng-content select="[vikingAuthLinks]" />
547
+
548
+ @if (showSocial()) {
549
+ <viking-separator text="or" />
550
+ <div class="viking-auth-social" role="group" aria-label="Social sign-in">
551
+ <viking-button
552
+ variant="outline"
553
+ type="button"
554
+ icon="google"
555
+ [fullWidth]="true"
556
+ [loading]="socialLoading()"
557
+ [disabled]="socialLoading()"
558
+ (pressed)="googleSignIn.emit()"
559
+ >
560
+ Sign In with Google
561
+ </viking-button>
562
+ <viking-button
563
+ variant="outline"
564
+ type="button"
565
+ icon="apple"
566
+ [fullWidth]="true"
567
+ [loading]="socialLoading()"
568
+ [disabled]="socialLoading()"
569
+ (pressed)="appleSignIn.emit()"
570
+ >
571
+ Sign In with Apple
572
+ </viking-button>
573
+ </div>
574
+ }
575
+
576
+ <footer class="viking-auth-footer">
577
+ <ng-content select="[vikingAuthFooter]" />
578
+ </footer>
579
+ </section>
580
+ `, isInline: true, styles: [":host{display:block;width:100%;max-width:480px;margin-inline:auto;font-family:var(--viking-font-family)}.viking-auth-panel{display:flex;flex-direction:column;gap:var(--viking-space-2);width:100%}.viking-auth-header{display:flex;flex-direction:column;gap:var(--viking-space-1);margin-bottom:var(--viking-space-1)}.viking-auth-tag-row{display:flex;align-items:center}.viking-auth-tag{display:inline-flex;align-items:center;gap:var(--viking-space-1);font-size:var(--viking-font-size-ui);font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--viking-text-muted);padding:var(--viking-space-1) var(--viking-space-2);border:1px solid var(--viking-border);border-radius:var(--viking-radius-pill);background:var(--viking-surface);box-shadow:var(--viking-shadow-sm)}.viking-auth-tag:before{content:\"\";width:8px;height:8px;border-radius:50%;background:var(--viking-accent);flex-shrink:0}.viking-auth-title{margin:0;font-size:clamp(1.5rem,4vw,2rem);font-weight:700;letter-spacing:var(--header-letter-spacing, -.02em);color:var(--viking-text);line-height:1.2}.viking-auth-subtitle{margin:0;font-size:var(--viking-font-size);line-height:1.6;color:var(--viking-text-muted)}.viking-auth-body{display:flex;flex-direction:column;gap:var(--viking-space-2);width:100%}.viking-auth-social{display:flex;flex-direction:column;gap:var(--viking-space-1);width:100%}.viking-auth-footer{display:flex;flex-direction:column;gap:var(--viking-space-1);width:100%;padding-top:var(--viking-space-1);border-top:1px solid var(--viking-border)}:host ::ng-deep [vikingAuthLinks].viking-auth-links,:host ::ng-deep .viking-auth-links{display:flex;flex-direction:column;gap:var(--viking-space-1);width:100%}:host ::ng-deep viking-field{width:100%}\n"], dependencies: [{ kind: "component", type: VikingButton, selector: "viking-button", inputs: ["variant", "size", "type", "icon", "iconTrailing", "disabled", "loading", "square", "fullWidth", "href", "target", "kbd", "label"], outputs: ["pressed"] }, { kind: "component", type: VikingSeparator, selector: "viking-separator", inputs: ["orientation", "text"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
581
+ }
582
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingAuthPanel, decorators: [{
583
+ type: Component,
584
+ args: [{ selector: 'viking-auth-panel', imports: [VikingButton, VikingSeparator], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'viking-auth-panel-host' }, template: `
585
+ <section class="viking-auth-panel" aria-labelledby="viking-auth-title">
586
+ <header class="viking-auth-header">
587
+ @if (tag()) {
588
+ <div class="viking-auth-tag-row">
589
+ <span class="viking-auth-tag">{{ tag() }}</span>
590
+ </div>
591
+ }
592
+ <h1 id="viking-auth-title" class="viking-auth-title">{{ title() }}</h1>
593
+ @if (subtitle()) {
594
+ <p class="viking-auth-subtitle">{{ subtitle() }}</p>
595
+ }
596
+ </header>
597
+
598
+ <div class="viking-auth-body">
599
+ <ng-content />
600
+ </div>
601
+
602
+ <ng-content select="[vikingAuthLinks]" />
603
+
604
+ @if (showSocial()) {
605
+ <viking-separator text="or" />
606
+ <div class="viking-auth-social" role="group" aria-label="Social sign-in">
607
+ <viking-button
608
+ variant="outline"
609
+ type="button"
610
+ icon="google"
611
+ [fullWidth]="true"
612
+ [loading]="socialLoading()"
613
+ [disabled]="socialLoading()"
614
+ (pressed)="googleSignIn.emit()"
615
+ >
616
+ Sign In with Google
617
+ </viking-button>
618
+ <viking-button
619
+ variant="outline"
620
+ type="button"
621
+ icon="apple"
622
+ [fullWidth]="true"
623
+ [loading]="socialLoading()"
624
+ [disabled]="socialLoading()"
625
+ (pressed)="appleSignIn.emit()"
626
+ >
627
+ Sign In with Apple
628
+ </viking-button>
629
+ </div>
630
+ }
631
+
632
+ <footer class="viking-auth-footer">
633
+ <ng-content select="[vikingAuthFooter]" />
634
+ </footer>
635
+ </section>
636
+ `, styles: [":host{display:block;width:100%;max-width:480px;margin-inline:auto;font-family:var(--viking-font-family)}.viking-auth-panel{display:flex;flex-direction:column;gap:var(--viking-space-2);width:100%}.viking-auth-header{display:flex;flex-direction:column;gap:var(--viking-space-1);margin-bottom:var(--viking-space-1)}.viking-auth-tag-row{display:flex;align-items:center}.viking-auth-tag{display:inline-flex;align-items:center;gap:var(--viking-space-1);font-size:var(--viking-font-size-ui);font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--viking-text-muted);padding:var(--viking-space-1) var(--viking-space-2);border:1px solid var(--viking-border);border-radius:var(--viking-radius-pill);background:var(--viking-surface);box-shadow:var(--viking-shadow-sm)}.viking-auth-tag:before{content:\"\";width:8px;height:8px;border-radius:50%;background:var(--viking-accent);flex-shrink:0}.viking-auth-title{margin:0;font-size:clamp(1.5rem,4vw,2rem);font-weight:700;letter-spacing:var(--header-letter-spacing, -.02em);color:var(--viking-text);line-height:1.2}.viking-auth-subtitle{margin:0;font-size:var(--viking-font-size);line-height:1.6;color:var(--viking-text-muted)}.viking-auth-body{display:flex;flex-direction:column;gap:var(--viking-space-2);width:100%}.viking-auth-social{display:flex;flex-direction:column;gap:var(--viking-space-1);width:100%}.viking-auth-footer{display:flex;flex-direction:column;gap:var(--viking-space-1);width:100%;padding-top:var(--viking-space-1);border-top:1px solid var(--viking-border)}:host ::ng-deep [vikingAuthLinks].viking-auth-links,:host ::ng-deep .viking-auth-links{display:flex;flex-direction:column;gap:var(--viking-space-1);width:100%}:host ::ng-deep viking-field{width:100%}\n"] }]
637
+ }], propDecorators: { tag: [{ type: i0.Input, args: [{ isSignal: true, alias: "tag", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], showSocial: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSocial", required: false }] }], socialLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "socialLoading", required: false }] }], googleSignIn: [{ type: i0.Output, args: ["googleSignIn"] }], appleSignIn: [{ type: i0.Output, args: ["appleSignIn"] }] } });
638
+
331
639
  /**
332
640
  * viking-autocomplete — text input with filtered suggestions
333
- * (https://fluxui.dev/components/autocomplete). ControlValueAccessor-compatible.
641
+ *. ControlValueAccessor-compatible.
334
642
  */
335
643
  class VikingAutocomplete extends VikingControl {
336
644
  host = inject(ElementRef);
@@ -488,7 +796,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
488
796
 
489
797
  /**
490
798
  * viking-avatar — image or initials avatar with optional status indicator
491
- * (https://fluxui.dev/components/avatar).
799
+ *.
492
800
  */
493
801
  class VikingAvatar {
494
802
  src = input(null, /* @ts-ignore */
@@ -552,7 +860,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
552
860
  }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], square: [{ type: i0.Input, args: [{ isSignal: true, alias: "square", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }] } });
553
861
 
554
862
  /**
555
- * viking-badge — status pill (https://fluxui.dev/components/badge).
863
+ * viking-badge — status pill.
556
864
  * Tones map to THEME.md semantic colors only.
557
865
  */
558
866
  class VikingBadge {
@@ -624,7 +932,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
624
932
  }], propDecorators: { height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
625
933
 
626
934
  /**
627
- * viking-brand — logo + wordmark lockup (https://fluxui.dev/components/brand).
935
+ * viking-brand — logo + wordmark lockup.
628
936
  * Project a custom logo (img/svg) or fall back to a monogram tile.
629
937
  */
630
938
  class VikingBrand {
@@ -657,7 +965,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
657
965
  }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], logoSrc: [{ type: i0.Input, args: [{ isSignal: true, alias: "logoSrc", required: false }] }] } });
658
966
 
659
967
  /**
660
- * viking-breadcrumbs — hierarchy navigation (https://fluxui.dev/components/breadcrumbs).
968
+ * viking-breadcrumbs — hierarchy navigation.
661
969
  */
662
970
  class VikingBreadcrumbs {
663
971
  items = input.required(/* @ts-ignore */
@@ -704,136 +1012,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
704
1012
  `, styles: [".viking-breadcrumbs{display:flex;align-items:center;flex-wrap:wrap;gap:var(--viking-space-1);margin:0;padding:0;list-style:none;font-family:var(--viking-font-family);font-size:var(--viking-font-size)}.viking-breadcrumb{display:inline-flex;align-items:center;gap:var(--viking-space-1);color:var(--viking-text-muted)}.viking-breadcrumb a{color:var(--viking-text-muted);text-decoration:none;border-bottom:1px solid transparent;transition:var(--viking-transition)}.viking-breadcrumb a:hover,.viking-breadcrumb a:focus-visible{color:var(--viking-accent);border-bottom-color:var(--viking-accent)}.viking-breadcrumb a:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset);border-radius:3px}.viking-breadcrumb span[aria-current=page]{color:var(--viking-text);font-weight:600}\n"] }]
705
1013
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }] } });
706
1014
 
707
- /**
708
- * viking-button — composable button (https://fluxui.dev/components/button).
709
- * Variants: outline (default), primary, filled, danger, ghost, subtle.
710
- */
711
- class VikingButton {
712
- variant = input('outline', /* @ts-ignore */
713
- ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
714
- size = input('base', /* @ts-ignore */
715
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
716
- type = input('button', /* @ts-ignore */
717
- ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
718
- icon = input(null, /* @ts-ignore */
719
- ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
720
- iconTrailing = input(null, /* @ts-ignore */
721
- ...(ngDevMode ? [{ debugName: "iconTrailing" }] : /* istanbul ignore next */ []));
722
- disabled = input(false, /* @ts-ignore */
723
- ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
724
- loading = input(false, /* @ts-ignore */
725
- ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
726
- square = input(false, /* @ts-ignore */
727
- ...(ngDevMode ? [{ debugName: "square" }] : /* istanbul ignore next */ []));
728
- href = input(null, /* @ts-ignore */
729
- ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
730
- target = input(null, /* @ts-ignore */
731
- ...(ngDevMode ? [{ debugName: "target" }] : /* istanbul ignore next */ []));
732
- kbd = input(null, /* @ts-ignore */
733
- ...(ngDevMode ? [{ debugName: "kbd" }] : /* istanbul ignore next */ []));
734
- /** Accessible name; required for icon-only (square) buttons. */
735
- label = input('', /* @ts-ignore */
736
- ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
737
- pressed = output();
738
- iconSize = computed(() => (this.size() === 'base' ? 22 : 18), /* @ts-ignore */
739
- ...(ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []));
740
- classes = computed(() => ({
741
- [`viking-${this.variant()}`]: true,
742
- [`viking-${this.size()}`]: this.size() !== 'base',
743
- 'viking-square': this.square(),
744
- }), /* @ts-ignore */
745
- ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
746
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
747
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: VikingButton, isStandalone: true, selector: "viking-button", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconTrailing: { classPropertyName: "iconTrailing", publicName: "iconTrailing", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, square: { classPropertyName: "square", publicName: "square", 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 }, kbd: { classPropertyName: "kbd", publicName: "kbd", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pressed: "pressed" }, host: { properties: { "style.pointer-events": "disabled() ? 'none' : null" } }, ngImport: i0, template: `
748
- @if (href()) {
749
- <a
750
- class="viking-btn"
751
- [class]="classes()"
752
- [href]="href()"
753
- [attr.target]="target()"
754
- [attr.aria-label]="label() || null"
755
- [attr.rel]="target() === '_blank' ? 'noopener noreferrer' : null"
756
- >
757
- <ng-container *ngTemplateOutlet="content"></ng-container>
758
- </a>
759
- } @else {
760
- <button
761
- class="viking-btn"
762
- [class]="classes()"
763
- [type]="type()"
764
- [disabled]="disabled() || loading()"
765
- [attr.aria-label]="label() || null"
766
- [attr.aria-busy]="loading() ? 'true' : null"
767
- (click)="pressed.emit($event)"
768
- >
769
- <ng-container *ngTemplateOutlet="content"></ng-container>
770
- </button>
771
- }
772
-
773
- <ng-template #content>
774
- @if (loading()) {
775
- <viking-icon name="loader" [size]="iconSize()" [spin]="true" />
776
- } @else if (icon()) {
777
- <viking-icon [name]="icon()!" [size]="iconSize()" />
778
- }
779
- <span class="viking-btn-label"><ng-content /></span>
780
- @if (iconTrailing()) {
781
- <viking-icon [name]="iconTrailing()!" [size]="iconSize()" />
782
- }
783
- @if (kbd()) {
784
- <kbd class="viking-btn-kbd">{{ kbd() }}</kbd>
785
- }
786
- </ng-template>
787
- `, isInline: true, styles: [":host{display:inline-flex}:host(.viking-full){display:flex}:host(.viking-full) .viking-btn{width:100%}.viking-btn{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);font-weight:700;letter-spacing:.01em;display:inline-flex;align-items:center;justify-content:center;gap:var(--viking-space-1);min-height:var(--viking-control-height);padding:0 var(--viking-control-padding-x);border-radius:var(--viking-radius);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:var(--viking-transition);width:auto;min-width:var(--viking-btn-min-width, 120px);white-space:nowrap}:host(.viking-full) .viking-btn{min-width:0}.viking-btn:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-btn:disabled{opacity:.55;cursor:not-allowed}.viking-sm{min-height:var(--viking-control-height-sm);padding:0 var(--viking-space-2)}.viking-xs{min-height:var(--viking-control-height-xs);padding:0 var(--viking-space-1)}.viking-square{width:var(--viking-control-height);padding:0}.viking-square.viking-sm{width:var(--viking-control-height-sm)}.viking-square.viking-xs{width:var(--viking-control-height-xs)}.viking-square .viking-btn-label{display:none}.viking-outline{background:var(--viking-surface);color:var(--viking-text);border-color:var(--viking-border-strong);box-shadow:var(--viking-shadow-sm)}.viking-outline:hover:not(:disabled){background:var(--viking-surface-alt);border-color:var(--viking-accent-strong)}.viking-primary{background:var(--viking-accent);color:var(--viking-accent-content);border-color:var(--viking-accent);box-shadow:var(--viking-shadow-sm)}.viking-primary:hover:not(:disabled){background:var(--viking-accent-strong);border-color:var(--viking-accent-strong);border-bottom-color:var(--hover-color, #fdca40)}.viking-filled{background:var(--viking-surface-alt);color:var(--viking-text);border-color:var(--viking-border)}.viking-filled:hover:not(:disabled){border-color:var(--viking-accent-strong)}.viking-danger{background:var(--viking-danger);color:var(--viking-on-danger, #31393c);border-color:var(--viking-danger)}.viking-danger:hover:not(:disabled){opacity:.9}.viking-ghost{background:transparent;color:var(--viking-text)}.viking-ghost:hover:not(:disabled){background:var(--viking-accent-soft)}.viking-subtle{background:transparent;color:var(--viking-text-muted);border-color:var(--viking-border)}.viking-subtle:hover:not(:disabled){color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-strong)}.viking-btn-kbd{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);color:var(--viking-text-muted);background:var(--viking-surface-alt);border:1px solid var(--viking-border);border-radius:calc(var(--viking-radius) / 2);padding:0 var(--viking-space-1);line-height:1.4}\n"], dependencies: [{ kind: "component", type: VikingIcon, selector: "viking-icon", inputs: ["name", "size", "spin"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
788
- }
789
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingButton, decorators: [{
790
- type: Component,
791
- args: [{ selector: 'viking-button', imports: [VikingIcon, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, host: { '[style.pointer-events]': "disabled() ? 'none' : null" }, template: `
792
- @if (href()) {
793
- <a
794
- class="viking-btn"
795
- [class]="classes()"
796
- [href]="href()"
797
- [attr.target]="target()"
798
- [attr.aria-label]="label() || null"
799
- [attr.rel]="target() === '_blank' ? 'noopener noreferrer' : null"
800
- >
801
- <ng-container *ngTemplateOutlet="content"></ng-container>
802
- </a>
803
- } @else {
804
- <button
805
- class="viking-btn"
806
- [class]="classes()"
807
- [type]="type()"
808
- [disabled]="disabled() || loading()"
809
- [attr.aria-label]="label() || null"
810
- [attr.aria-busy]="loading() ? 'true' : null"
811
- (click)="pressed.emit($event)"
812
- >
813
- <ng-container *ngTemplateOutlet="content"></ng-container>
814
- </button>
815
- }
816
-
817
- <ng-template #content>
818
- @if (loading()) {
819
- <viking-icon name="loader" [size]="iconSize()" [spin]="true" />
820
- } @else if (icon()) {
821
- <viking-icon [name]="icon()!" [size]="iconSize()" />
822
- }
823
- <span class="viking-btn-label"><ng-content /></span>
824
- @if (iconTrailing()) {
825
- <viking-icon [name]="iconTrailing()!" [size]="iconSize()" />
826
- }
827
- @if (kbd()) {
828
- <kbd class="viking-btn-kbd">{{ kbd() }}</kbd>
829
- }
830
- </ng-template>
831
- `, styles: [":host{display:inline-flex}:host(.viking-full){display:flex}:host(.viking-full) .viking-btn{width:100%}.viking-btn{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);font-weight:700;letter-spacing:.01em;display:inline-flex;align-items:center;justify-content:center;gap:var(--viking-space-1);min-height:var(--viking-control-height);padding:0 var(--viking-control-padding-x);border-radius:var(--viking-radius);border:1px solid transparent;cursor:pointer;text-decoration:none;transition:var(--viking-transition);width:auto;min-width:var(--viking-btn-min-width, 120px);white-space:nowrap}:host(.viking-full) .viking-btn{min-width:0}.viking-btn:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-btn:disabled{opacity:.55;cursor:not-allowed}.viking-sm{min-height:var(--viking-control-height-sm);padding:0 var(--viking-space-2)}.viking-xs{min-height:var(--viking-control-height-xs);padding:0 var(--viking-space-1)}.viking-square{width:var(--viking-control-height);padding:0}.viking-square.viking-sm{width:var(--viking-control-height-sm)}.viking-square.viking-xs{width:var(--viking-control-height-xs)}.viking-square .viking-btn-label{display:none}.viking-outline{background:var(--viking-surface);color:var(--viking-text);border-color:var(--viking-border-strong);box-shadow:var(--viking-shadow-sm)}.viking-outline:hover:not(:disabled){background:var(--viking-surface-alt);border-color:var(--viking-accent-strong)}.viking-primary{background:var(--viking-accent);color:var(--viking-accent-content);border-color:var(--viking-accent);box-shadow:var(--viking-shadow-sm)}.viking-primary:hover:not(:disabled){background:var(--viking-accent-strong);border-color:var(--viking-accent-strong);border-bottom-color:var(--hover-color, #fdca40)}.viking-filled{background:var(--viking-surface-alt);color:var(--viking-text);border-color:var(--viking-border)}.viking-filled:hover:not(:disabled){border-color:var(--viking-accent-strong)}.viking-danger{background:var(--viking-danger);color:var(--viking-on-danger, #31393c);border-color:var(--viking-danger)}.viking-danger:hover:not(:disabled){opacity:.9}.viking-ghost{background:transparent;color:var(--viking-text)}.viking-ghost:hover:not(:disabled){background:var(--viking-accent-soft)}.viking-subtle{background:transparent;color:var(--viking-text-muted);border-color:var(--viking-border)}.viking-subtle:hover:not(:disabled){color:var(--viking-text);background:var(--viking-accent-soft);border-color:var(--viking-border-strong)}.viking-btn-kbd{font-family:var(--viking-font-family);font-size:var(--viking-font-size-ui);color:var(--viking-text-muted);background:var(--viking-surface-alt);border:1px solid var(--viking-border);border-radius:calc(var(--viking-radius) / 2);padding:0 var(--viking-space-1);line-height:1.4}\n"] }]
832
- }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconTrailing: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTrailing", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], square: [{ type: i0.Input, args: [{ isSignal: true, alias: "square", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], kbd: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbd", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], pressed: [{ type: i0.Output, args: ["pressed"] }] } });
833
-
834
1015
  /**
835
1016
  * viking-button-group — fuses buttons with shared borders
836
- * (https://fluxui.dev/components/button#button-groups).
1017
+ *.
837
1018
  */
838
1019
  class VikingButtonGroup {
839
1020
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingButtonGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -861,7 +1042,7 @@ const MONTHS = [
861
1042
  const WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
862
1043
  const toIso = (date) => `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
863
1044
  /**
864
- * viking-calendar — month-grid date selection (https://fluxui.dev/components/calendar).
1045
+ * viking-calendar — month-grid date selection.
865
1046
  * Value is an ISO date string (YYYY-MM-DD). ControlValueAccessor-compatible.
866
1047
  */
867
1048
  class VikingCalendar extends VikingControl {
@@ -997,7 +1178,7 @@ const TONE_ICONS$1 = {
997
1178
  muted: 'info',
998
1179
  };
999
1180
  /**
1000
- * viking-callout — highlighted message block (https://fluxui.dev/components/callout).
1181
+ * viking-callout — highlighted message block.
1001
1182
  */
1002
1183
  class VikingCallout {
1003
1184
  tone = input('accent', /* @ts-ignore */
@@ -1056,7 +1237,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
1056
1237
  }], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
1057
1238
 
1058
1239
  /**
1059
- * viking-card — surface container (https://fluxui.dev/components/card).
1240
+ * viking-card — surface container.
1060
1241
  * Compose with viking-card-header / viking-card-footer for structured layouts.
1061
1242
  */
1062
1243
  class VikingCard {
@@ -1098,7 +1279,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
1098
1279
  args: [{ selector: 'viking-carousel-slide', changeDetection: ChangeDetectionStrategy.OnPush, host: { role: 'group', 'aria-roledescription': 'slide' }, template: `<ng-content />`, styles: [":host{flex:0 0 100%;scroll-snap-align:start;display:block;box-sizing:border-box}\n"] }]
1099
1280
  }] });
1100
1281
  /**
1101
- * viking-carousel — scroll-snap slideshow (https://fluxui.dev/components/carousel).
1282
+ * viking-carousel — scroll-snap slideshow.
1102
1283
  */
1103
1284
  class VikingCarousel {
1104
1285
  viewport = viewChild.required('viewport');
@@ -1292,6 +1473,7 @@ const buildSmoothPath = (points) => {
1292
1473
  * viking-chart — zero-dependency native SVG charts styled after Viking UI.
1293
1474
  */
1294
1475
  class VikingChart {
1476
+ chartId = `vc-${Math.random().toString(36).slice(2, 9)}`;
1295
1477
  kind = input('line', /* @ts-ignore */
1296
1478
  ...(ngDevMode ? [{ debugName: "kind" }] : /* istanbul ignore next */ []));
1297
1479
  series = input([{ name: 'Series', data: [] }], /* @ts-ignore */
@@ -1324,6 +1506,8 @@ class VikingChart {
1324
1506
  ...(ngDevMode ? [{ debugName: "tickCount" }] : /* istanbul ignore next */ []));
1325
1507
  showLegend = input(undefined, /* @ts-ignore */
1326
1508
  ...(ngDevMode ? [{ debugName: "showLegend" }] : /* istanbul ignore next */ []));
1509
+ summary = input('', /* @ts-ignore */
1510
+ ...(ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []));
1327
1511
  width = WIDTH;
1328
1512
  isSparkline = computed(() => this.kind() === 'sparkline', /* @ts-ignore */
1329
1513
  ...(ngDevMode ? [{ debugName: "isSparkline" }] : /* istanbul ignore next */ []));
@@ -1666,19 +1850,28 @@ class VikingChart {
1666
1850
  }, /* @ts-ignore */
1667
1851
  ...(ngDevMode ? [{ debugName: "donutSlices" }] : /* istanbul ignore next */ []));
1668
1852
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
1669
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: VikingChart, isStandalone: true, selector: "viking-chart", inputs: { kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, series: { classPropertyName: "series", publicName: "series", isSignal: true, isRequired: false, transformFunction: null }, categories: { classPropertyName: "categories", publicName: "categories", isSignal: true, isRequired: false, transformFunction: null }, segments: { classPropertyName: "segments", publicName: "segments", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, showArea: { classPropertyName: "showArea", publicName: "showArea", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, curve: { classPropertyName: "curve", publicName: "curve", isSignal: true, isRequired: false, transformFunction: null }, showPoints: { classPropertyName: "showPoints", publicName: "showPoints", isSignal: true, isRequired: false, transformFunction: null }, pointRadius: { classPropertyName: "pointRadius", publicName: "pointRadius", isSignal: true, isRequired: false, transformFunction: null }, barWidth: { classPropertyName: "barWidth", publicName: "barWidth", isSignal: true, isRequired: false, transformFunction: null }, barRadius: { classPropertyName: "barRadius", publicName: "barRadius", isSignal: true, isRequired: false, transformFunction: null }, gutter: { classPropertyName: "gutter", publicName: "gutter", isSignal: true, isRequired: false, transformFunction: null }, tickCount: { classPropertyName: "tickCount", publicName: "tickCount", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.viking-chart-fill-host": "fill()", "class.viking-chart-sparkline-host": "kind() === 'sparkline'" } }, ngImport: i0, template: `
1853
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: VikingChart, isStandalone: true, selector: "viking-chart", inputs: { kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, series: { classPropertyName: "series", publicName: "series", isSignal: true, isRequired: false, transformFunction: null }, categories: { classPropertyName: "categories", publicName: "categories", isSignal: true, isRequired: false, transformFunction: null }, segments: { classPropertyName: "segments", publicName: "segments", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, showArea: { classPropertyName: "showArea", publicName: "showArea", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, curve: { classPropertyName: "curve", publicName: "curve", isSignal: true, isRequired: false, transformFunction: null }, showPoints: { classPropertyName: "showPoints", publicName: "showPoints", isSignal: true, isRequired: false, transformFunction: null }, pointRadius: { classPropertyName: "pointRadius", publicName: "pointRadius", isSignal: true, isRequired: false, transformFunction: null }, barWidth: { classPropertyName: "barWidth", publicName: "barWidth", isSignal: true, isRequired: false, transformFunction: null }, barRadius: { classPropertyName: "barRadius", publicName: "barRadius", isSignal: true, isRequired: false, transformFunction: null }, gutter: { classPropertyName: "gutter", publicName: "gutter", isSignal: true, isRequired: false, transformFunction: null }, tickCount: { classPropertyName: "tickCount", publicName: "tickCount", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, summary: { classPropertyName: "summary", publicName: "summary", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.viking-chart-fill-host": "fill()", "class.viking-chart-sparkline-host": "kind() === 'sparkline'" } }, ngImport: i0, template: `
1670
1854
  <figure
1671
1855
  class="viking-chart"
1672
1856
  [class.viking-chart-fill]="fill()"
1673
1857
  [class.viking-chart-compact]="compact() && !fill()"
1674
1858
  [class.viking-chart-sparkline]="isSparkline()"
1675
1859
  [class.viking-chart-has-legend]="legendVisible()"
1860
+ [attr.aria-labelledby]="label() ? 'viking-chart-label-' + chartId : null"
1861
+ [attr.aria-describedby]="summary() ? 'viking-chart-summary-' + chartId : null"
1676
1862
  >
1863
+ @if (label()) {
1864
+ <figcaption class="sr-only" [id]="'viking-chart-label-' + chartId">{{ label() }}</figcaption>
1865
+ }
1866
+ @if (summary()) {
1867
+ <p class="sr-only" [id]="'viking-chart-summary-' + chartId">{{ summary() }}</p>
1868
+ }
1677
1869
  <svg
1678
1870
  [attr.viewBox]="'0 0 ' + width + ' ' + height()"
1679
1871
  preserveAspectRatio="xMidYMid meet"
1680
1872
  role="img"
1681
1873
  [attr.aria-label]="label() || 'Chart'"
1874
+ aria-hidden="true"
1682
1875
  >
1683
1876
  @if (kind() === 'donut') {
1684
1877
  @for (slice of donutSlices(); track slice.label) {
@@ -1836,7 +2029,7 @@ class VikingChart {
1836
2029
  </figcaption>
1837
2030
  }
1838
2031
  </figure>
1839
- `, isInline: true, styles: [":host{display:block;width:100%}:host(.viking-chart-fill-host){display:flex;flex-direction:column;flex:1 1 auto;min-height:240px;height:100%}:host(.viking-chart-sparkline-host){display:inline-block;width:auto;max-width:100%}:host(.viking-chart-wide){display:block;width:100%}.viking-chart{margin:0;font-family:var(--viking-font-family);overflow:hidden;width:100%;max-width:100%}.viking-chart:not(.viking-chart-fill):not(.viking-chart-sparkline){aspect-ratio:3 / 1}.viking-chart-fill{flex:1 1 auto;display:flex;flex-direction:column;min-height:240px;height:100%}.viking-chart-sparkline{width:5rem;aspect-ratio:3 / 1}:host(.viking-chart-wide) .viking-chart-sparkline{width:100%;aspect-ratio:auto;height:3rem}svg{display:block;width:100%;height:100%;min-height:120px;background:transparent;overflow:visible}.viking-chart-fill svg{flex:1 1 auto;min-height:200px;max-height:none}.viking-chart-sparkline svg{min-height:0;border:none}.viking-chart-compact svg{max-height:220px}.viking-chart-grid{stroke:color-mix(in srgb,var(--viking-border) 55%,transparent);stroke-width:1}.viking-chart-axis-line,.viking-chart-tick{stroke:color-mix(in srgb,var(--viking-border) 85%,transparent);stroke-width:1}.viking-chart-axis-y,.viking-chart-axis-x{fill:var(--viking-text-muted);font-size:var(--viking-chart-axis-size, 12px);font-family:var(--viking-font-family)}.viking-chart-line{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}.viking-chart-area{opacity:.28;stroke:none}.viking-chart-point{stroke:var(--viking-surface);stroke-width:2;vector-effect:non-scaling-stroke}.viking-chart-bar{opacity:.95}.viking-chart-donut-slice{stroke:var(--viking-surface);stroke-width:2}.viking-chart-donut-hole{fill:var(--viking-surface)}.viking-chart-donut-total{fill:var(--viking-text);font-size:14px;font-weight:700;font-family:var(--viking-font-family)}.viking-chart-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--viking-space-2);margin-top:var(--viking-space-2);font-size:calc(var(--viking-font-size) * .9);color:var(--viking-text-muted)}.viking-chart-legend-item{display:inline-flex;align-items:center;gap:calc(var(--viking-space-1) / 1.5);line-height:1.2}.viking-chart-swatch{width:10px;height:10px;border-radius:999px;display:inline-block;flex-shrink:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2032
+ `, isInline: true, styles: [":host{display:block;width:100%}:host(.viking-chart-fill-host){display:flex;flex-direction:column;flex:1 1 auto;min-height:240px;height:100%}:host(.viking-chart-sparkline-host){display:inline-block;width:auto;max-width:100%}:host(.viking-chart-wide){display:block;width:100%}.viking-chart{margin:0;font-family:var(--viking-font-family);overflow:hidden;width:100%;max-width:100%;container-type:inline-size}.viking-chart:not(.viking-chart-fill):not(.viking-chart-sparkline){aspect-ratio:3 / 1}.viking-chart-fill{flex:1 1 auto;display:flex;flex-direction:column;min-height:240px;height:100%}.viking-chart-sparkline{width:5rem;aspect-ratio:3 / 1}:host(.viking-chart-wide) .viking-chart-sparkline{width:100%;aspect-ratio:auto;height:3rem}svg{display:block;width:100%;height:100%;min-height:120px;background:transparent;overflow:visible}.viking-chart-fill svg{flex:1 1 auto;min-height:200px;max-height:none}.viking-chart-sparkline svg{min-height:0;border:none}.viking-chart-compact svg{max-height:220px}.viking-chart-grid{stroke:color-mix(in srgb,var(--viking-border) 55%,transparent);stroke-width:1}.viking-chart-axis-line,.viking-chart-tick{stroke:color-mix(in srgb,var(--viking-border) 85%,transparent);stroke-width:1}.viking-chart-axis-y,.viking-chart-axis-x{fill:var(--viking-text-muted);font-size:max(11px,var(--viking-chart-axis-size, 12px));font-family:var(--viking-font-family)}.viking-chart-line{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}.viking-chart-area{opacity:.28;stroke:none}.viking-chart-point{stroke:var(--viking-surface);stroke-width:2;vector-effect:non-scaling-stroke}.viking-chart-bar{opacity:.95}.viking-chart-donut-slice{stroke:var(--viking-surface);stroke-width:2}.viking-chart-donut-hole{fill:var(--viking-surface)}.viking-chart-donut-total{fill:var(--viking-text);font-size:max(12px,min(16px,3.5cqw));font-weight:700;font-family:var(--viking-font-family)}.viking-chart-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--viking-space-2);margin-top:var(--viking-space-2);font-size:calc(var(--viking-font-size) * .9);color:var(--viking-text-muted)}.viking-chart-legend-item{display:inline-flex;align-items:center;gap:calc(var(--viking-space-1) / 1.5);line-height:1.2}.viking-chart-swatch{width:10px;height:10px;border-radius:999px;display:inline-block;flex-shrink:0}.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1840
2033
  }
1841
2034
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingChart, decorators: [{
1842
2035
  type: Component,
@@ -1850,12 +2043,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
1850
2043
  [class.viking-chart-compact]="compact() && !fill()"
1851
2044
  [class.viking-chart-sparkline]="isSparkline()"
1852
2045
  [class.viking-chart-has-legend]="legendVisible()"
2046
+ [attr.aria-labelledby]="label() ? 'viking-chart-label-' + chartId : null"
2047
+ [attr.aria-describedby]="summary() ? 'viking-chart-summary-' + chartId : null"
1853
2048
  >
2049
+ @if (label()) {
2050
+ <figcaption class="sr-only" [id]="'viking-chart-label-' + chartId">{{ label() }}</figcaption>
2051
+ }
2052
+ @if (summary()) {
2053
+ <p class="sr-only" [id]="'viking-chart-summary-' + chartId">{{ summary() }}</p>
2054
+ }
1854
2055
  <svg
1855
2056
  [attr.viewBox]="'0 0 ' + width + ' ' + height()"
1856
2057
  preserveAspectRatio="xMidYMid meet"
1857
2058
  role="img"
1858
2059
  [attr.aria-label]="label() || 'Chart'"
2060
+ aria-hidden="true"
1859
2061
  >
1860
2062
  @if (kind() === 'donut') {
1861
2063
  @for (slice of donutSlices(); track slice.label) {
@@ -2013,11 +2215,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2013
2215
  </figcaption>
2014
2216
  }
2015
2217
  </figure>
2016
- `, styles: [":host{display:block;width:100%}:host(.viking-chart-fill-host){display:flex;flex-direction:column;flex:1 1 auto;min-height:240px;height:100%}:host(.viking-chart-sparkline-host){display:inline-block;width:auto;max-width:100%}:host(.viking-chart-wide){display:block;width:100%}.viking-chart{margin:0;font-family:var(--viking-font-family);overflow:hidden;width:100%;max-width:100%}.viking-chart:not(.viking-chart-fill):not(.viking-chart-sparkline){aspect-ratio:3 / 1}.viking-chart-fill{flex:1 1 auto;display:flex;flex-direction:column;min-height:240px;height:100%}.viking-chart-sparkline{width:5rem;aspect-ratio:3 / 1}:host(.viking-chart-wide) .viking-chart-sparkline{width:100%;aspect-ratio:auto;height:3rem}svg{display:block;width:100%;height:100%;min-height:120px;background:transparent;overflow:visible}.viking-chart-fill svg{flex:1 1 auto;min-height:200px;max-height:none}.viking-chart-sparkline svg{min-height:0;border:none}.viking-chart-compact svg{max-height:220px}.viking-chart-grid{stroke:color-mix(in srgb,var(--viking-border) 55%,transparent);stroke-width:1}.viking-chart-axis-line,.viking-chart-tick{stroke:color-mix(in srgb,var(--viking-border) 85%,transparent);stroke-width:1}.viking-chart-axis-y,.viking-chart-axis-x{fill:var(--viking-text-muted);font-size:var(--viking-chart-axis-size, 12px);font-family:var(--viking-font-family)}.viking-chart-line{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}.viking-chart-area{opacity:.28;stroke:none}.viking-chart-point{stroke:var(--viking-surface);stroke-width:2;vector-effect:non-scaling-stroke}.viking-chart-bar{opacity:.95}.viking-chart-donut-slice{stroke:var(--viking-surface);stroke-width:2}.viking-chart-donut-hole{fill:var(--viking-surface)}.viking-chart-donut-total{fill:var(--viking-text);font-size:14px;font-weight:700;font-family:var(--viking-font-family)}.viking-chart-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--viking-space-2);margin-top:var(--viking-space-2);font-size:calc(var(--viking-font-size) * .9);color:var(--viking-text-muted)}.viking-chart-legend-item{display:inline-flex;align-items:center;gap:calc(var(--viking-space-1) / 1.5);line-height:1.2}.viking-chart-swatch{width:10px;height:10px;border-radius:999px;display:inline-block;flex-shrink:0}\n"] }]
2017
- }], propDecorators: { kind: [{ type: i0.Input, args: [{ isSignal: true, alias: "kind", required: false }] }], series: [{ type: i0.Input, args: [{ isSignal: true, alias: "series", required: false }] }], categories: [{ type: i0.Input, args: [{ isSignal: true, alias: "categories", required: false }] }], segments: [{ type: i0.Input, args: [{ isSignal: true, alias: "segments", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], showArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArea", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], curve: [{ type: i0.Input, args: [{ isSignal: true, alias: "curve", required: false }] }], showPoints: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPoints", required: false }] }], pointRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "pointRadius", required: false }] }], barWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "barWidth", required: false }] }], barRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "barRadius", required: false }] }], gutter: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutter", required: false }] }], tickCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "tickCount", required: false }] }], showLegend: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLegend", required: false }] }] } });
2218
+ `, styles: [":host{display:block;width:100%}:host(.viking-chart-fill-host){display:flex;flex-direction:column;flex:1 1 auto;min-height:240px;height:100%}:host(.viking-chart-sparkline-host){display:inline-block;width:auto;max-width:100%}:host(.viking-chart-wide){display:block;width:100%}.viking-chart{margin:0;font-family:var(--viking-font-family);overflow:hidden;width:100%;max-width:100%;container-type:inline-size}.viking-chart:not(.viking-chart-fill):not(.viking-chart-sparkline){aspect-ratio:3 / 1}.viking-chart-fill{flex:1 1 auto;display:flex;flex-direction:column;min-height:240px;height:100%}.viking-chart-sparkline{width:5rem;aspect-ratio:3 / 1}:host(.viking-chart-wide) .viking-chart-sparkline{width:100%;aspect-ratio:auto;height:3rem}svg{display:block;width:100%;height:100%;min-height:120px;background:transparent;overflow:visible}.viking-chart-fill svg{flex:1 1 auto;min-height:200px;max-height:none}.viking-chart-sparkline svg{min-height:0;border:none}.viking-chart-compact svg{max-height:220px}.viking-chart-grid{stroke:color-mix(in srgb,var(--viking-border) 55%,transparent);stroke-width:1}.viking-chart-axis-line,.viking-chart-tick{stroke:color-mix(in srgb,var(--viking-border) 85%,transparent);stroke-width:1}.viking-chart-axis-y,.viking-chart-axis-x{fill:var(--viking-text-muted);font-size:max(11px,var(--viking-chart-axis-size, 12px));font-family:var(--viking-font-family)}.viking-chart-line{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}.viking-chart-area{opacity:.28;stroke:none}.viking-chart-point{stroke:var(--viking-surface);stroke-width:2;vector-effect:non-scaling-stroke}.viking-chart-bar{opacity:.95}.viking-chart-donut-slice{stroke:var(--viking-surface);stroke-width:2}.viking-chart-donut-hole{fill:var(--viking-surface)}.viking-chart-donut-total{fill:var(--viking-text);font-size:max(12px,min(16px,3.5cqw));font-weight:700;font-family:var(--viking-font-family)}.viking-chart-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--viking-space-2);margin-top:var(--viking-space-2);font-size:calc(var(--viking-font-size) * .9);color:var(--viking-text-muted)}.viking-chart-legend-item{display:inline-flex;align-items:center;gap:calc(var(--viking-space-1) / 1.5);line-height:1.2}.viking-chart-swatch{width:10px;height:10px;border-radius:999px;display:inline-block;flex-shrink:0}.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}\n"] }]
2219
+ }], propDecorators: { kind: [{ type: i0.Input, args: [{ isSignal: true, alias: "kind", required: false }] }], series: [{ type: i0.Input, args: [{ isSignal: true, alias: "series", required: false }] }], categories: [{ type: i0.Input, args: [{ isSignal: true, alias: "categories", required: false }] }], segments: [{ type: i0.Input, args: [{ isSignal: true, alias: "segments", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], showArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArea", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], curve: [{ type: i0.Input, args: [{ isSignal: true, alias: "curve", required: false }] }], showPoints: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPoints", required: false }] }], pointRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "pointRadius", required: false }] }], barWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "barWidth", required: false }] }], barRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "barRadius", required: false }] }], gutter: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutter", required: false }] }], tickCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "tickCount", required: false }] }], showLegend: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLegend", required: false }] }], summary: [{ type: i0.Input, args: [{ isSignal: true, alias: "summary", required: false }] }] } });
2018
2220
 
2019
2221
  /**
2020
- * viking-checkbox — custom checkbox (https://fluxui.dev/components/checkbox).
2222
+ * viking-checkbox — custom checkbox.
2021
2223
  * ControlValueAccessor-compatible.
2022
2224
  */
2023
2225
  class VikingCheckbox extends VikingControl {
@@ -2095,7 +2297,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2095
2297
 
2096
2298
  /**
2097
2299
  * viking-color-picker — swatch presets + custom color input
2098
- * (https://fluxui.dev/components/color-picker). ControlValueAccessor-compatible.
2300
+ *. ControlValueAccessor-compatible.
2099
2301
  * Default presets are the THEME.md palette.
2100
2302
  */
2101
2303
  class VikingColorPicker extends VikingControl {
@@ -2186,7 +2388,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2186
2388
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }] } });
2187
2389
 
2188
2390
  /**
2189
- * viking-command — command palette (https://fluxui.dev/components/command).
2391
+ * viking-command — command palette.
2190
2392
  * Toggle with the `open` model; emits `executed` when an item is chosen.
2191
2393
  */
2192
2394
  class VikingCommand {
@@ -2356,7 +2558,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2356
2558
 
2357
2559
  /**
2358
2560
  * viking-composer — message composer with attachments and send action
2359
- * (https://fluxui.dev/components/composer).
2561
+ *.
2360
2562
  */
2361
2563
  class VikingComposer {
2362
2564
  value = model('', /* @ts-ignore */
@@ -2471,7 +2673,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2471
2673
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], allowAttachments: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowAttachments", required: false }] }], sent: [{ type: i0.Output, args: ["sent"] }], attach: [{ type: i0.Output, args: ["attach"] }] } });
2472
2674
 
2473
2675
  /**
2474
- * viking-context — right-click context menu (https://fluxui.dev/components/context).
2676
+ * viking-context — right-click context menu.
2475
2677
  * Wrap the target content and project menu content with the `vikingMenu` attribute
2476
2678
  * (typically viking-menu-item elements).
2477
2679
  */
@@ -2527,7 +2729,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2527
2729
  }] });
2528
2730
 
2529
2731
  /**
2530
- * viking-date-picker — input + calendar popover (https://fluxui.dev/components/date-picker).
2732
+ * viking-date-picker — input + calendar popover.
2531
2733
  * Value is an ISO date string (YYYY-MM-DD). ControlValueAccessor-compatible.
2532
2734
  */
2533
2735
  class VikingDatePicker extends VikingControl {
@@ -2610,7 +2812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2610
2812
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
2611
2813
 
2612
2814
  /**
2613
- * viking-dropdown — expandable menu (https://fluxui.dev/components/dropdown).
2815
+ * viking-dropdown — expandable menu.
2614
2816
  * Project the trigger with `vikingTrigger`; fill the menu with viking-menu-item.
2615
2817
  */
2616
2818
  class VikingDropdown {
@@ -2732,7 +2934,7 @@ const ACTIONS = [
2732
2934
  { icon: 'list-ordered', command: 'insertOrderedList', label: 'Numbered list' },
2733
2935
  ];
2734
2936
  /**
2735
- * viking-editor — lightweight rich text editor (https://fluxui.dev/components/editor).
2937
+ * viking-editor — lightweight rich text editor.
2736
2938
  * Zero-dependency contenteditable with a formatting toolbar.
2737
2939
  * Value is HTML. ControlValueAccessor-compatible.
2738
2940
  */
@@ -2876,7 +3078,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2876
3078
 
2877
3079
  /**
2878
3080
  * viking-field — label / description / error wrapper for any control
2879
- * (https://fluxui.dev/components/field).
3081
+ *.
2880
3082
  * The projected control is associated with the label by wrapping.
2881
3083
  */
2882
3084
  class VikingField {
@@ -2970,7 +3172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2970
3172
  }] });
2971
3173
 
2972
3174
  /**
2973
- * viking-file-upload — drag & drop file zone (https://fluxui.dev/components/file-upload).
3175
+ * viking-file-upload — drag & drop file zone.
2974
3176
  */
2975
3177
  class VikingFileUpload {
2976
3178
  heading = input('Drop files here or click to browse', /* @ts-ignore */
@@ -3196,7 +3398,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
3196
3398
 
3197
3399
  /**
3198
3400
  * viking-input — text input with icons, kbd hint and clearable state
3199
- * (https://fluxui.dev/components/input). ControlValueAccessor-compatible.
3401
+ *. ControlValueAccessor-compatible.
3200
3402
  */
3201
3403
  class VikingInput extends VikingControl {
3202
3404
  value = model('', /* @ts-ignore */
@@ -3297,7 +3499,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
3297
3499
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconTrailing: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTrailing", required: false }] }], kbd: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbd", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], cleared: [{ type: i0.Output, args: ["cleared"] }] } });
3298
3500
 
3299
3501
  /**
3300
- * viking-kanban — drag & drop board (https://fluxui.dev/components/kanban).
3502
+ * viking-kanban — drag & drop board.
3301
3503
  * Native HTML5 drag and drop; emits `moved` and updates the `columns` model.
3302
3504
  */
3303
3505
  class VikingKanban {
@@ -3552,7 +3754,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
3552
3754
 
3553
3755
  /**
3554
3756
  * viking-modal — dialog built on the native <dialog> element
3555
- * (https://fluxui.dev/components/modal). Toggle via the `open` model.
3757
+ *. Toggle via the `open` model.
3556
3758
  */
3557
3759
  class VikingModal {
3558
3760
  dialogRef = viewChild.required('dialog');
@@ -3803,7 +4005,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
3803
4005
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }] } });
3804
4006
 
3805
4007
  /**
3806
- * viking-navbar — horizontal navigation container (https://fluxui.dev/components/navbar).
4008
+ * viking-navbar — horizontal navigation container.
3807
4009
  * Compose with viking-navbar-item and any other inline content.
3808
4010
  */
3809
4011
  class VikingNavbar {
@@ -3875,7 +4077,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
3875
4077
  }], propDecorators: { href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], current: [{ type: i0.Input, args: [{ isSignal: true, alias: "current", required: false }] }] } });
3876
4078
 
3877
4079
  /**
3878
- * viking-otp-input — one-time-passcode input (https://fluxui.dev/components/otp-input).
4080
+ * viking-otp-input — one-time-passcode input.
3879
4081
  * Auto-advances between cells and supports paste. ControlValueAccessor-compatible.
3880
4082
  */
3881
4083
  class VikingOtpInput extends VikingControl {
@@ -4001,7 +4203,7 @@ class VikingPageHeader {
4001
4203
  [class.hud-header]="layout() === 'hud'"
4002
4204
  >
4003
4205
  <div class="viking-page-header-main title-group topbar-left">
4004
- <ng-content select="[fluxPageHeaderBack]" />
4206
+ <ng-content select="[vikingPageHeaderBack]" />
4005
4207
  @if (tag()) {
4006
4208
  <div class="section-tag-row">
4007
4209
  <span class="section-tag viking-page-header-tag">{{ tag() }}</span>
@@ -4011,10 +4213,10 @@ class VikingPageHeader {
4011
4213
  @if (subtitle()) {
4012
4214
  <p class="viking-page-header-subtitle hud-subtitle page-description">{{ subtitle() }}</p>
4013
4215
  }
4014
- <ng-content select="[fluxPageHeaderExtra]" />
4216
+ <ng-content select="[vikingPageHeaderExtra]" />
4015
4217
  </div>
4016
4218
  <div class="viking-page-header-actions topbar-right">
4017
- <ng-content select="[fluxPageHeaderActions]" />
4219
+ <ng-content select="[vikingPageHeaderActions]" />
4018
4220
  </div>
4019
4221
  </header>
4020
4222
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -4034,7 +4236,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4034
4236
  [class.hud-header]="layout() === 'hud'"
4035
4237
  >
4036
4238
  <div class="viking-page-header-main title-group topbar-left">
4037
- <ng-content select="[fluxPageHeaderBack]" />
4239
+ <ng-content select="[vikingPageHeaderBack]" />
4038
4240
  @if (tag()) {
4039
4241
  <div class="section-tag-row">
4040
4242
  <span class="section-tag viking-page-header-tag">{{ tag() }}</span>
@@ -4044,10 +4246,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4044
4246
  @if (subtitle()) {
4045
4247
  <p class="viking-page-header-subtitle hud-subtitle page-description">{{ subtitle() }}</p>
4046
4248
  }
4047
- <ng-content select="[fluxPageHeaderExtra]" />
4249
+ <ng-content select="[vikingPageHeaderExtra]" />
4048
4250
  </div>
4049
4251
  <div class="viking-page-header-actions topbar-right">
4050
- <ng-content select="[fluxPageHeaderActions]" />
4252
+ <ng-content select="[vikingPageHeaderActions]" />
4051
4253
  </div>
4052
4254
  </header>
4053
4255
  `,
@@ -4055,7 +4257,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4055
4257
  }], propDecorators: { tag: [{ type: i0.Input, args: [{ isSignal: true, alias: "tag", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }] } });
4056
4258
 
4057
4259
  /**
4058
- * viking-pagination — page navigation (https://fluxui.dev/components/pagination).
4260
+ * viking-pagination — page navigation.
4059
4261
  */
4060
4262
  class VikingPagination {
4061
4263
  page = model(1, /* @ts-ignore */
@@ -4170,7 +4372,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4170
4372
  }], propDecorators: { page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }, { type: i0.Output, args: ["pageChange"] }], totalPages: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalPages", required: true }] }] } });
4171
4373
 
4172
4374
  /**
4173
- * viking-pillbox — multi-value tag input (https://fluxui.dev/components/pillbox).
4375
+ * viking-pillbox — multi-value tag input.
4174
4376
  * Type and press Enter (or comma) to add pills. ControlValueAccessor-compatible.
4175
4377
  */
4176
4378
  class VikingPillbox extends VikingControl {
@@ -4278,7 +4480,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4278
4480
  }], propDecorators: { values: [{ type: i0.Input, args: [{ isSignal: true, alias: "values", required: false }] }, { type: i0.Output, args: ["valuesChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
4279
4481
 
4280
4482
  /**
4281
- * viking-popover — anchored floating panel (https://fluxui.dev/components/popover).
4483
+ * viking-popover — anchored floating panel.
4282
4484
  * Project the trigger with the `vikingTrigger` attribute; everything else becomes
4283
4485
  * the panel content. Closes on Escape or outside interaction.
4284
4486
  */
@@ -4339,7 +4541,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4339
4541
  }], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }] } });
4340
4542
 
4341
4543
  /**
4342
- * viking-profile — user identity block (https://fluxui.dev/components/profile).
4544
+ * viking-profile — user identity block.
4343
4545
  * Project actions (e.g. viking-button) as content.
4344
4546
  */
4345
4547
  class VikingProfile {
@@ -4379,7 +4581,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4379
4581
 
4380
4582
  /**
4381
4583
  * viking-progress — determinate/indeterminate progress bar
4382
- * (https://fluxui.dev/components/progress).
4584
+ *.
4383
4585
  */
4384
4586
  class VikingProgress {
4385
4587
  value = input(0, /* @ts-ignore */
@@ -4449,7 +4651,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4449
4651
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }] } });
4450
4652
 
4451
4653
  /**
4452
- * viking-radio-group — radio group (https://fluxui.dev/components/radio).
4654
+ * viking-radio-group — radio group.
4453
4655
  * ControlValueAccessor-compatible; options-driven for symmetry with viking-select.
4454
4656
  */
4455
4657
  class VikingRadioGroup extends VikingControl {
@@ -4707,7 +4909,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4707
4909
  }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }, { type: i0.Output, args: ["queryChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], paletteKeydown: [{ type: i0.Output, args: ["paletteKeydown"] }], queryInput: [{ type: i0.ViewChild, args: ['queryInput', { isSignal: true }] }] } });
4708
4910
 
4709
4911
  /**
4710
- * viking-select — custom listbox select (https://fluxui.dev/components/select).
4912
+ * viking-select — custom listbox select.
4711
4913
  * ControlValueAccessor-compatible with full keyboard support.
4712
4914
  */
4713
4915
  class VikingSelect extends VikingControl {
@@ -4864,43 +5066,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
4864
5066
  `, styles: [":host{position:relative;display:block}.viking-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:var(--viking-space-1);width:100%;min-height:var(--viking-control-height);padding:0 var(--viking-space-2);background:var(--viking-surface);border:1px solid var(--viking-border-strong);border-radius:var(--viking-radius);box-shadow:var(--viking-shadow-sm);color:var(--viking-text);font-family:var(--viking-font-family);font-size:var(--viking-font-size);cursor:pointer;transition:var(--viking-transition);text-align:left}.viking-select-trigger:hover:not(:disabled){border-color:var(--viking-accent-strong)}.viking-select-trigger:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:var(--viking-ring-offset)}.viking-select-trigger:disabled{opacity:.55;cursor:not-allowed}.viking-select-placeholder{color:var(--viking-text-muted)}.viking-select-panel{position:absolute;top:calc(100% + var(--viking-space-1));left:0;right:0;display:flex;flex-direction:column;gap:2px;margin:0;padding:var(--viking-space-1);background:var(--viking-surface);border:1px solid var(--viking-border-strong);border-radius:var(--viking-radius);box-shadow:var(--viking-shadow-md);z-index:var(--viking-z-overlay);max-height:315px;overflow:auto}.viking-select-option{display:flex;align-items:center;justify-content:space-between;gap:var(--viking-space-1);padding:var(--viking-space-1);border:none;background:transparent;text-align:left;width:100%;border-radius:calc(var(--viking-radius) / 1.5);font-family:var(--viking-font-family);font-size:var(--viking-font-size);color:var(--viking-text);cursor:pointer}.viking-select-option:disabled{opacity:.55;cursor:not-allowed}.viking-select-option:focus-visible{outline:var(--viking-ring-width) solid var(--viking-ring);outline-offset:-2px}.viking-active{background:var(--viking-accent-soft)}.viking-selected{font-weight:600;color:var(--viking-accent)}\n"] }]
4865
5067
  }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
4866
5068
 
4867
- /**
4868
- * viking-separator — horizontal/vertical rule with optional label
4869
- * (https://fluxui.dev/components/separator).
4870
- */
4871
- class VikingSeparator {
4872
- orientation = input('horizontal', /* @ts-ignore */
4873
- ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
4874
- text = input('', /* @ts-ignore */
4875
- ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
4876
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingSeparator, deps: [], target: i0.ɵɵFactoryTarget.Component });
4877
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: VikingSeparator, isStandalone: true, selector: "viking-separator", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "separator" }, properties: { "attr.aria-orientation": "orientation()", "class.viking-vertical": "orientation() === 'vertical'" } }, ngImport: i0, template: `
4878
- @if (text() && orientation() === 'horizontal') {
4879
- <span class="viking-separator-line" aria-hidden="true"></span>
4880
- <span class="viking-separator-text">{{ text() }}</span>
4881
- <span class="viking-separator-line" aria-hidden="true"></span>
4882
- } @else {
4883
- <span class="viking-separator-line" aria-hidden="true"></span>
4884
- }
4885
- `, isInline: true, styles: [":host{display:flex;align-items:center;gap:var(--viking-space-2);width:100%}:host(.viking-vertical){width:auto;align-self:stretch}.viking-separator-line{flex:1;border-top:1px solid var(--viking-border)}:host(.viking-vertical) .viking-separator-line{flex:none;border-top:none;border-left:1px solid var(--viking-border);height:100%;min-height:var(--viking-space-3)}.viking-separator-text{font-family:var(--viking-font-family);font-size:var(--viking-font-size);color:var(--viking-text-muted);white-space:nowrap}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4886
- }
4887
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: VikingSeparator, decorators: [{
4888
- type: Component,
4889
- args: [{ selector: 'viking-separator', changeDetection: ChangeDetectionStrategy.OnPush, host: {
4890
- role: 'separator',
4891
- '[attr.aria-orientation]': 'orientation()',
4892
- '[class.viking-vertical]': "orientation() === 'vertical'",
4893
- }, template: `
4894
- @if (text() && orientation() === 'horizontal') {
4895
- <span class="viking-separator-line" aria-hidden="true"></span>
4896
- <span class="viking-separator-text">{{ text() }}</span>
4897
- <span class="viking-separator-line" aria-hidden="true"></span>
4898
- } @else {
4899
- <span class="viking-separator-line" aria-hidden="true"></span>
4900
- }
4901
- `, styles: [":host{display:flex;align-items:center;gap:var(--viking-space-2);width:100%}:host(.viking-vertical){width:auto;align-self:stretch}.viking-separator-line{flex:1;border-top:1px solid var(--viking-border)}:host(.viking-vertical) .viking-separator-line{flex:none;border-top:none;border-left:1px solid var(--viking-border);height:100%;min-height:var(--viking-space-3)}.viking-separator-text{font-family:var(--viking-font-family);font-size:var(--viking-font-size);color:var(--viking-text-muted);white-space:nowrap}\n"] }]
4902
- }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }] } });
4903
-
4904
5069
  /**
4905
5070
  * viking-scroll-area — constrained scroll region with clinical scrollbar styling.
4906
5071
  */
@@ -5024,7 +5189,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5024
5189
  }], ctorParameters: () => [], propDecorators: { 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 }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], dialogRef: [{ type: i0.ViewChild, args: ['dialog', { isSignal: true }] }] } });
5025
5190
 
5026
5191
  /**
5027
- * viking-skeleton — loading placeholder (https://fluxui.dev/components/skeleton).
5192
+ * viking-skeleton — loading placeholder.
5028
5193
  */
5029
5194
  class VikingSkeleton {
5030
5195
  shape = input('line', /* @ts-ignore */
@@ -5093,7 +5258,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5093
5258
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
5094
5259
 
5095
5260
  /**
5096
- * viking-slider — range slider (https://fluxui.dev/components/slider).
5261
+ * viking-slider — range slider.
5097
5262
  * ControlValueAccessor-compatible.
5098
5263
  */
5099
5264
  class VikingSlider extends VikingControl {
@@ -5178,7 +5343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5178
5343
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
5179
5344
 
5180
5345
  /**
5181
- * viking-switch — toggle switch (https://fluxui.dev/components/switch).
5346
+ * viking-switch — toggle switch.
5182
5347
  * ControlValueAccessor-compatible.
5183
5348
  */
5184
5349
  class VikingSwitch extends VikingControl {
@@ -5364,7 +5529,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5364
5529
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }] } });
5365
5530
 
5366
5531
  /**
5367
- * viking-textarea — auto-growing textarea (https://fluxui.dev/components/textarea).
5532
+ * viking-textarea — auto-growing textarea.
5368
5533
  * ControlValueAccessor-compatible.
5369
5534
  */
5370
5535
  class VikingTextarea extends VikingControl {
@@ -5510,7 +5675,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5510
5675
  }], propDecorators: { pressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "pressed", required: false }] }, { type: i0.Output, args: ["pressedChange"] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], toggled: [{ type: i0.Output, args: ["toggled"] }] } });
5511
5676
 
5512
5677
  /**
5513
- * viking-time-picker — dropdown time selection (https://fluxui.dev/components/time-picker).
5678
+ * viking-time-picker — dropdown time selection.
5514
5679
  * Value is a 24h HH:MM string. ControlValueAccessor-compatible.
5515
5680
  */
5516
5681
  class VikingTimePicker extends VikingControl {
@@ -5629,7 +5794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5629
5794
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], stepMinutes: [{ type: i0.Input, args: [{ isSignal: true, alias: "stepMinutes", required: false }] }] } });
5630
5795
 
5631
5796
  /**
5632
- * viking-timeline — vertical event feed (https://fluxui.dev/components/timeline).
5797
+ * viking-timeline — vertical event feed.
5633
5798
  * Compose with viking-timeline-item.
5634
5799
  */
5635
5800
  class VikingTimeline {
@@ -5706,7 +5871,7 @@ const TONE_ICONS = {
5706
5871
  muted: 'info',
5707
5872
  };
5708
5873
  /**
5709
- * VikingToastService — imperative toast API (https://fluxui.dev/components/toast).
5874
+ * VikingToastService — imperative toast API.
5710
5875
  * Render a single <viking-toaster> outlet near the app root.
5711
5876
  */
5712
5877
  class VikingToastService {
@@ -5814,7 +5979,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5814
5979
  }], propDecorators: { status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }] } });
5815
5980
 
5816
5981
  /**
5817
- * fluxTooltip — attribute directive tooltip (https://fluxui.dev/components/tooltip).
5982
+ * fluxTooltip — attribute directive tooltip.
5818
5983
  * Shows on hover and keyboard focus; positions itself relative to the host.
5819
5984
  */
5820
5985
  class VikingTooltip {
@@ -5891,7 +6056,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5891
6056
  }], propDecorators: { fluxTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "fluxTooltip", required: true }] }], tooltipPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipPosition", required: false }] }], tooltipKbd: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipKbd", required: false }] }] } });
5892
6057
 
5893
6058
  /**
5894
- * viking-heading — consistent heading sizes (https://fluxui.dev/components/heading).
6059
+ * viking-heading — consistent heading sizes.
5895
6060
  */
5896
6061
  class VikingHeading {
5897
6062
  size = input('base', /* @ts-ignore */
@@ -5915,7 +6080,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5915
6080
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }] } });
5916
6081
 
5917
6082
  /**
5918
- * viking-text — body text with semantic variants (https://fluxui.dev/components/text).
6083
+ * viking-text — body text with semantic variants.
5919
6084
  */
5920
6085
  class VikingText {
5921
6086
  variant = input('default', /* @ts-ignore */
@@ -5945,5 +6110,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
5945
6110
  * Generated bundle index. Do not edit.
5946
6111
  */
5947
6112
 
5948
- export { VIKING_ICON_NAMES, VIKING_ICON_PATHS, VIKING_TABS, VIKING_TOGGLE_GROUP, VikingAccordion, VikingAccordionItem, VikingAppHeader, VikingAppSidebar, VikingAutocomplete, VikingAvatar, VikingBadge, VikingBar, VikingBrand, VikingBreadcrumbs, VikingButton, VikingButtonGroup, VikingCalendar, VikingCallout, VikingCard, VikingCardFooter, VikingCardHeader, VikingCarousel, VikingCarouselSlide, VikingChart, VikingCheckbox, VikingColorPicker, VikingCommand, VikingComposer, VikingContext, VikingControl, VikingDatePicker, VikingDropdown, VikingEditor, VikingFab, VikingField, VikingFileUpload, VikingFooter, VikingGaugeArc, VikingHeading, VikingHudPanel, VikingIcon, VikingInput, VikingKanban, VikingKbd, VikingLabel, VikingMenuItem, VikingMenubar, VikingMenubarItem, VikingMetricCard, VikingMetricRow, VikingModal, VikingNativeSelect, VikingNavbar, VikingNavbarItem, VikingNavigationMenu, VikingOtpInput, VikingPageHeader, VikingPagination, VikingPillbox, VikingPopover, VikingProfile, VikingProgress, VikingRadioGroup, VikingRingGauge, VikingScrollArea, VikingSearchPalette, VikingSelect, VikingSeparator, VikingSheet, VikingSkeleton, VikingSlider, VikingSpinner, VikingSwitch, VikingTab, VikingTabPanel, VikingTable, VikingTabs, VikingText, VikingTextarea, VikingTimePicker, VikingTimeline, VikingTimelineItem, VikingToastService, VikingToaster, VikingToggle, VikingToggleGroup, VikingTooltip, VikingUptimeBar, provideVikingCva };
6113
+ export { VIKING_ICON_NAMES, VIKING_ICON_PATHS, VIKING_TABS, VIKING_TOGGLE_GROUP, VikingAccordion, VikingAccordionItem, VikingAppHeader, VikingAppSidebar, VikingAuthPanel, VikingAutocomplete, VikingAvatar, VikingBadge, VikingBar, VikingBrand, VikingBreadcrumbs, VikingButton, VikingButtonGroup, VikingCalendar, VikingCallout, VikingCard, VikingCardFooter, VikingCardHeader, VikingCarousel, VikingCarouselSlide, VikingChart, VikingCheckbox, VikingColorPicker, VikingCommand, VikingComposer, VikingContext, VikingControl, VikingDatePicker, VikingDropdown, VikingEditor, VikingFab, VikingField, VikingFileUpload, VikingFooter, VikingGaugeArc, VikingHeading, VikingHudPanel, VikingIcon, VikingInput, VikingKanban, VikingKbd, VikingLabel, VikingMenuItem, VikingMenubar, VikingMenubarItem, VikingMetricCard, VikingMetricRow, VikingModal, VikingNativeSelect, VikingNavbar, VikingNavbarItem, VikingNavigationMenu, VikingOtpInput, VikingPageHeader, VikingPagination, VikingPillbox, VikingPopover, VikingProfile, VikingProgress, VikingRadioGroup, VikingRingGauge, VikingScrollArea, VikingSearchPalette, VikingSelect, VikingSeparator, VikingSheet, VikingSkeleton, VikingSlider, VikingSpinner, VikingSwitch, VikingTab, VikingTabPanel, VikingTable, VikingTabs, VikingText, VikingTextarea, VikingTimePicker, VikingTimeline, VikingTimelineItem, VikingToastService, VikingToaster, VikingToggle, VikingToggleGroup, VikingTooltip, VikingUptimeBar, provideVikingCva };
5949
6114
  //# sourceMappingURL=dataengineeringformachinelearning-viking-ui.mjs.map