@flywheel-io/vision 2.4.5 → 2.5.1

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.
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { HostBinding, Input, ChangeDetectionStrategy, Component, EventEmitter, Output, NgModule, input, model, computed, ContentChildren, ViewChild, ViewEncapsulation, Directive, forwardRef, HostListener, Optional, Inject, SkipSelf, Injectable, Pipe, ContentChild, signal, effect, inject, ChangeDetectorRef, output, contentChildren, Host, viewChild, ViewChildren, Self } from '@angular/core';
2
+ import { HostBinding, Input, ChangeDetectionStrategy, Component, EventEmitter, Output, NgModule, input, model, computed, ContentChildren, ViewChild, ViewEncapsulation, Directive, forwardRef, HostListener, Optional, Inject, SkipSelf, Injectable, Pipe, ContentChild, signal, effect, inject, ChangeDetectorRef, output, contentChildren, Host, viewChild, ViewChildren, Self, ElementRef, viewChildren } from '@angular/core';
3
3
  import * as i1$1 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
4
+ import { CommonModule, NgClass } from '@angular/common';
5
5
  import * as i1 from '@angular/platform-browser';
6
6
  import * as i8 from '@angular/forms';
7
7
  import { NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';
@@ -9,7 +9,7 @@ import * as i1$2 from '@angular/cdk/dialog';
9
9
  import { Dialog, DEFAULT_DIALOG_CONFIG, DIALOG_SCROLL_STRATEGY, DialogModule } from '@angular/cdk/dialog';
10
10
  import * as i1$3 from '@angular/cdk/overlay';
11
11
  import { OverlayModule, Overlay } from '@angular/cdk/overlay';
12
- import { of, BehaviorSubject, Subscription, min } from 'rxjs';
12
+ import { of, BehaviorSubject, Subscription, min, startWith, tap, switchMap, map } from 'rxjs';
13
13
  import { parseISO, isBefore, isSameDay, isAfter } from 'date-fns';
14
14
  import { isValidPhoneNumber, getExampleNumber, parsePhoneNumberFromString, AsYouType } from 'libphonenumber-js';
15
15
  import { trigger, state, transition, style, animate } from '@angular/animations';
@@ -22,6 +22,7 @@ export { CdkTableModule } from '@angular/cdk/table';
22
22
  import { _DisposeViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY } from '@angular/cdk/collections';
23
23
  import * as i2 from '@angular/cdk/text-field';
24
24
  import { CdkTextareaAutosize, TextFieldModule } from '@angular/cdk/text-field';
25
+ import { toObservable, toSignal } from '@angular/core/rxjs-interop';
25
26
 
26
27
  class FwIconComponent {
27
28
  get style() {
@@ -2167,8 +2168,8 @@ class FwDialogService extends Dialog {
2167
2168
  }
2168
2169
  // Handle ESC key with animation
2169
2170
  dialogRef.overlayRef.keydownEvents().subscribe(event => {
2170
- const isBackdropCloseEnabled = !config.canCloseCheck || config.canCloseCheck();
2171
2171
  if (event.key === 'Escape') {
2172
+ const isBackdropCloseEnabled = !config.canCloseCheck || config.canCloseCheck();
2172
2173
  if (isBackdropCloseEnabled) {
2173
2174
  this.closeWithAnimation(dialogRef);
2174
2175
  }
@@ -4216,7 +4217,7 @@ class FwPopoverComponent {
4216
4217
  };
4217
4218
  this.registerEventListeners = effect(() => {
4218
4219
  const trigger = this.trigger();
4219
- if (!this.trigger) {
4220
+ if (!trigger) {
4220
4221
  return;
4221
4222
  }
4222
4223
  if (this.action === 'mouseenter' && !trigger.onmouseenter) {
@@ -5225,7 +5226,7 @@ class FwPaginatorComponent {
5225
5226
  this.selectorTitle = 'Items per page:';
5226
5227
  this.page = new EventEmitter();
5227
5228
  this.pages = [];
5228
- this.pagesTrackByFn = (index, page) => page.pageIndex;
5229
+ this.pagesTrackByFn = (_, page) => page.pageIndex;
5229
5230
  }
5230
5231
  ngOnChanges(changes) {
5231
5232
  if (changes.pageIndex || changes.maxPagesShown || changes.length || changes.pageSize) {
@@ -5470,7 +5471,7 @@ class FwMultiSelectMenuComponent {
5470
5471
  this.displayedOptions().forEach((item, index) => {
5471
5472
  item.focused = index === this.focusedIndex();
5472
5473
  });
5473
- });
5474
+ }, { allowSignalWrites: true });
5474
5475
  /* eslint-disable @typescript-eslint/naming-convention, @rx-angular/prefer-no-layout-sensitive-apis */
5475
5476
  this.keyboardActionMap = {
5476
5477
  'ArrowDown': () => {
@@ -5554,7 +5555,7 @@ class FwMultiSelectMenuComponent {
5554
5555
  icon: newMenuItem.icon,
5555
5556
  };
5556
5557
  this.options.push(newOption);
5557
- newMenuItem.mouseEnterHandler.set((event, item) => {
5558
+ newMenuItem.mouseEnterHandler.set((_, item) => {
5558
5559
  this.setFocusedIndex(item);
5559
5560
  });
5560
5561
  // add click listener
@@ -7167,39 +7168,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7167
7168
  }]
7168
7169
  }] });
7169
7170
 
7170
- function genMessageId() {
7171
- return String.prototype.padStart(24, Math.floor(Math.random() * Date.now()).toString(16));
7172
- }
7173
- class FwSnackbarService {
7174
- constructor() {
7175
- this.messages$ = new BehaviorSubject([]);
7176
- this.messageQueue = [];
7177
- }
7178
- show(message) {
7179
- if (!message.id) {
7180
- message.id = genMessageId();
7181
- }
7182
- this.messageQueue.push(message);
7183
- this.messages$.next(this.messageQueue);
7184
- }
7185
- dismiss(messageId) {
7186
- this.messageQueue = this.messageQueue.filter((v) => v.id !== messageId);
7187
- this.messages$.next(this.messageQueue);
7188
- }
7189
- dismissAll() {
7190
- this.messageQueue = [];
7191
- this.messages$.next(this.messageQueue);
7192
- }
7193
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
7194
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarService, providedIn: 'root' }); }
7195
- }
7196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarService, decorators: [{
7197
- type: Injectable,
7198
- args: [{
7199
- providedIn: 'root',
7200
- }]
7201
- }] });
7202
-
7203
7171
  class FwSnackbarTimerService {
7204
7172
  constructor() {
7205
7173
  this.now = 0;
@@ -7332,6 +7300,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7332
7300
  args: ['class']
7333
7301
  }] } });
7334
7302
 
7303
+ function genMessageId() {
7304
+ return String.prototype.padStart(24, Math.floor(Math.random() * Date.now()).toString(16));
7305
+ }
7306
+ class FwSnackbarService {
7307
+ constructor() {
7308
+ this.messages$ = new BehaviorSubject([]);
7309
+ this.messageQueue = [];
7310
+ }
7311
+ show(message) {
7312
+ if (!message.id) {
7313
+ message.id = genMessageId();
7314
+ }
7315
+ this.messageQueue.push(message);
7316
+ this.messages$.next(this.messageQueue);
7317
+ }
7318
+ dismiss(messageId) {
7319
+ this.messageQueue = this.messageQueue.filter((v) => v.id !== messageId);
7320
+ this.messages$.next(this.messageQueue);
7321
+ }
7322
+ dismissAll() {
7323
+ this.messageQueue = [];
7324
+ this.messages$.next(this.messageQueue);
7325
+ }
7326
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
7327
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarService, providedIn: 'root' }); }
7328
+ }
7329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarService, decorators: [{
7330
+ type: Injectable,
7331
+ args: [{
7332
+ providedIn: 'root',
7333
+ }]
7334
+ }] });
7335
+
7335
7336
  class FwSnackbarContainerComponent {
7336
7337
  get classes() {
7337
7338
  return 'fw-snackbar-container';
@@ -7396,9 +7397,7 @@ class FwSnackbarModule {
7396
7397
  FwIconButtonModule,
7397
7398
  FwIconModule], exports: [FwSnackbarComponent,
7398
7399
  FwSnackbarContainerComponent] }); }
7399
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarModule, providers: [
7400
- FwSnackbarService,
7401
- ], imports: [CommonModule,
7400
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwSnackbarModule, imports: [CommonModule,
7402
7401
  FwButtonModule,
7403
7402
  FwIconButtonModule,
7404
7403
  FwIconModule] }); }
@@ -7420,9 +7419,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7420
7419
  FwSnackbarComponent,
7421
7420
  FwSnackbarContainerComponent,
7422
7421
  ],
7423
- providers: [
7424
- FwSnackbarService,
7425
- ],
7426
7422
  }]
7427
7423
  }] });
7428
7424
 
@@ -8426,16 +8422,294 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8426
8422
  }]
8427
8423
  }] });
8428
8424
 
8425
+ // the nature of this component is to handle a complex layout issue so disabling this lint rule
8426
+ /* eslint-disable @rx-angular/prefer-no-layout-sensitive-apis */
8427
+ class FwChipListComponent {
8428
+ constructor() {
8429
+ this.changeDetector = inject(ChangeDetectorRef);
8430
+ this.hostElement = inject(ElementRef);
8431
+ this.childChipElementRefs = contentChildren(FwChipComponent, { read: ElementRef });
8432
+ this.moreText = viewChild.required('moreText');
8433
+ this.hiddenElementCount = signal(0);
8434
+ this.hiddenChips = signal([]);
8435
+ this.hiddenLabels = computed(() => {
8436
+ return this.hiddenChips().map(chip => {
8437
+ // this relies on the dom shape of the chip, might be fragile
8438
+ const contentSpan = chip.querySelector('span');
8439
+ return contentSpan.innerText;
8440
+ }).join(', ');
8441
+ });
8442
+ this.childrenChanged = effect(() => {
8443
+ this.childChipElementRefs();
8444
+ this.calcChipOverflow();
8445
+ }, { allowSignalWrites: true });
8446
+ this.resizeObserver = new ResizeObserver(() => {
8447
+ this.calcChipOverflow();
8448
+ });
8449
+ }
8450
+ ngOnInit() {
8451
+ this.resizeObserver.observe(this.hostElement.nativeElement);
8452
+ }
8453
+ calcChipOverflow() {
8454
+ const hostRect = this.hostElement.nativeElement.getBoundingClientRect();
8455
+ const chipElements = this.childChipElementRefs().map(ref => ref.nativeElement);
8456
+ const moreTextElement = this.moreText().nativeElement;
8457
+ chipElements.forEach(chip => chip.classList.remove('hidden'));
8458
+ moreTextElement.classList.remove('hidden');
8459
+ const visibleChips = chipElements.filter(chip => {
8460
+ const chipRect = chip.getBoundingClientRect();
8461
+ return !(chipRect.right > hostRect.right || chipRect.bottom > hostRect.bottom);
8462
+ });
8463
+ const overflowChips = chipElements.toSpliced(0, visibleChips.length);
8464
+ if (overflowChips.length > 0) {
8465
+ const lastVisibleChip = visibleChips[visibleChips.length - 1];
8466
+ const enoughRoomForMoreText = (hostRect.right - lastVisibleChip.getBoundingClientRect().right) > (moreTextElement.offsetWidth);
8467
+ if (!enoughRoomForMoreText) {
8468
+ overflowChips.push(lastVisibleChip);
8469
+ }
8470
+ this.hiddenChips.set(overflowChips);
8471
+ overflowChips.forEach(hiddenChip => {
8472
+ hiddenChip.classList.add('hidden');
8473
+ });
8474
+ }
8475
+ else {
8476
+ this.moreText().nativeElement.classList.add('hidden');
8477
+ }
8478
+ this.changeDetector.detectChanges();
8479
+ }
8480
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwChipListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8481
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: FwChipListComponent, isStandalone: true, selector: "fw-chip-list", queries: [{ propertyName: "childChipElementRefs", predicate: FwChipComponent, read: ElementRef, isSignal: true }], viewQueries: [{ propertyName: "moreText", first: true, predicate: ["moreText"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content></ng-content>\n<fw-tooltip [title]=\"hiddenLabels()\">\n <p #moreText> +{{hiddenChips().length}} more </p>\n</fw-tooltip>\n", styles: [":host{flex-basis:max-content;display:flex;flex-flow:row wrap;gap:8px;align-items:flex-start;justify-content:flex-start;max-height:28px;overflow:hidden}:host p{line-height:24px;cursor:default;margin:0 8px 0 0;text-wrap:nowrap;color:var(--typography-muted)}:host::ng-deep .hidden{display:none}\n"], dependencies: [{ kind: "ngmodule", type: FwChipModule }, { kind: "ngmodule", type: FwTooltipModule }, { kind: "component", type: FwTooltipComponent, selector: "fw-tooltip", inputs: ["title", "color", "position", "maxWidth", "fullWidth", "isOpen", "trigger", "delay"] }] }); }
8482
+ }
8483
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwChipListComponent, decorators: [{
8484
+ type: Component,
8485
+ args: [{ selector: 'fw-chip-list', standalone: true, imports: [
8486
+ FwChipModule,
8487
+ FwTooltipModule,
8488
+ ], template: "<ng-content></ng-content>\n<fw-tooltip [title]=\"hiddenLabels()\">\n <p #moreText> +{{hiddenChips().length}} more </p>\n</fw-tooltip>\n", styles: [":host{flex-basis:max-content;display:flex;flex-flow:row wrap;gap:8px;align-items:flex-start;justify-content:flex-start;max-height:28px;overflow:hidden}:host p{line-height:24px;cursor:default;margin:0 8px 0 0;text-wrap:nowrap;color:var(--typography-muted)}:host::ng-deep .hidden{display:none}\n"] }]
8489
+ }] });
8490
+
8491
+ /**
8492
+ * Component for having a user select multiple values while also allowing arbitrary values to be added
8493
+ * @see [Vision Docs](https://cdn.flywheel.io/docs/vision/master/?path=/docs/form-controls-typeahead--docs)
8494
+ */
8495
+ class FwTypeaheadComponent {
8496
+ constructor() {
8497
+ this.trigger = viewChild(CdkMenuTrigger);
8498
+ this.changeDetector = inject(ChangeDetectorRef);
8499
+ this.loading = model(false);
8500
+ this.disabled = model(false);
8501
+ this.onChange = (_) => { };
8502
+ this.onTouched = () => { };
8503
+ this.value = model([]);
8504
+ this.optionsInput = input([], { alias: 'options' });
8505
+ this.maxOptionsHeight = input('400px');
8506
+ this.minOptionsHeight = input('0px');
8507
+ this.optionsWidth = input('');
8508
+ this.notifyOnValueChanges = effect(() => {
8509
+ this.onChange(this.value());
8510
+ });
8511
+ this.searchValue = model('');
8512
+ this.searchValueChanges$ = toObservable(this.searchValue);
8513
+ this.allowNew = input(true);
8514
+ this.placeholder = input('Enter tags...');
8515
+ this.options$ = this.searchValueChanges$.pipe(startWith(''), tap(() => this.loading.set(true)), switchMap(searchString => {
8516
+ if (typeof this.optionsInput() === 'function') {
8517
+ const fetchingFunction = this.optionsInput();
8518
+ return fetchingFunction(searchString);
8519
+ }
8520
+ const filteredStaticOptions$ = of(this.optionsInput()).pipe(map(options => options.filter(opt => opt.toLowerCase().includes(searchString.toLowerCase()))));
8521
+ return filteredStaticOptions$;
8522
+ }), map(options => {
8523
+ return options.filter(option => {
8524
+ const alreadySelected = this.value().find(val => val.toLowerCase() === option.toLowerCase());
8525
+ return !alreadySelected;
8526
+ });
8527
+ }), tap(() => this.loading.set(false)));
8528
+ this.optionsSignal = toSignal(this.options$);
8529
+ this.displayNewOption = computed(() => {
8530
+ const newValue = this.searchValue();
8531
+ if (!newValue) {
8532
+ return false;
8533
+ }
8534
+ const directMatch = this.optionsSignal()?.includes?.(newValue);
8535
+ const loading = this.loading();
8536
+ const alreadySelected = Boolean(this.value().find(val => val.toLowerCase() === newValue.toLowerCase()));
8537
+ return this.allowNew() && !alreadySelected && (!directMatch || loading);
8538
+ });
8539
+ this.addValue = (newValue) => {
8540
+ this.value.update(prevValue => [
8541
+ ...prevValue || [],
8542
+ newValue,
8543
+ ]);
8544
+ };
8545
+ this.handleOptionClick = (optionValue) => {
8546
+ this.onTouched();
8547
+ this.addValue(optionValue);
8548
+ this.focusInput();
8549
+ this.searchValue.set('');
8550
+ };
8551
+ this.resetFocusOnOptionsChange = effect(() => {
8552
+ if (this.displayedOptions() || this.searchValue()) {
8553
+ this.focusedIndex.set(0);
8554
+ }
8555
+ }, { allowSignalWrites: true });
8556
+ this.displayedOptions = viewChildren(FwMenuItemComponent);
8557
+ this.focusedIndex = signal(0);
8558
+ this.focusedOption = computed(() => {
8559
+ const options = this.displayedOptions();
8560
+ const focused = this.focusedIndex();
8561
+ const onlyOne = options.length === 1;
8562
+ return onlyOne ? this.searchValue() : options[focused]?.value;
8563
+ });
8564
+ this.inputRef = viewChild.required('input');
8565
+ /* eslint-disable @typescript-eslint/naming-convention */
8566
+ this.keyHandlerMap = {
8567
+ 'Enter': () => {
8568
+ this.onTouched();
8569
+ const newValue = this.focusedOption() || this.searchValue();
8570
+ const duplicate = this.value().find(val => val.toLowerCase() === newValue.toLowerCase());
8571
+ if (!newValue || duplicate) {
8572
+ return;
8573
+ }
8574
+ this.addValue(newValue);
8575
+ this.searchValue.set('');
8576
+ },
8577
+ 'ArrowDown': () => {
8578
+ this.moveFocused('down');
8579
+ },
8580
+ 'ArrowUp': () => {
8581
+ this.moveFocused('up');
8582
+ },
8583
+ 'Backspace': () => {
8584
+ const searchIsEmpty = !this.searchValue(); // any falsy value is empty
8585
+ if (searchIsEmpty && this.value()?.length > 0) {
8586
+ this.closeChip(this.value()[this.value().length - 1]);
8587
+ }
8588
+ return !searchIsEmpty;
8589
+ },
8590
+ 'Tab': () => {
8591
+ if (this.trigger().isOpen) {
8592
+ this.trigger().close();
8593
+ }
8594
+ },
8595
+ };
8596
+ }
8597
+ outsideClick() {
8598
+ this.onTouched();
8599
+ this.trigger().close();
8600
+ }
8601
+ setDisabledState(isDisabled) {
8602
+ this.disabled.set(isDisabled);
8603
+ }
8604
+ writeValue(incomingValue) {
8605
+ this.value.set(incomingValue);
8606
+ }
8607
+ registerOnChange(onChangeFn) {
8608
+ this.onChange = onChangeFn;
8609
+ }
8610
+ registerOnTouched(onTouchedFn) {
8611
+ this.onTouched = onTouchedFn;
8612
+ }
8613
+ onClick(event) {
8614
+ event.preventDefault();
8615
+ event.stopPropagation();
8616
+ }
8617
+ handleSearchChange(event) {
8618
+ if (this.trigger().closed) {
8619
+ this.trigger().open();
8620
+ }
8621
+ const value = event.target.value;
8622
+ this.searchValue.set(value);
8623
+ }
8624
+ closeChip(chipValue) {
8625
+ const currentValue = this.value();
8626
+ const newValue = currentValue.filter(val => val !== chipValue);
8627
+ this.value.set(newValue);
8628
+ this.focusInput();
8629
+ this.changeDetector.detectChanges();
8630
+ }
8631
+ focusInput(e = null) {
8632
+ e?.preventDefault();
8633
+ e?.stopPropagation();
8634
+ e?.stopImmediatePropagation();
8635
+ this.inputRef().nativeElement.focus();
8636
+ }
8637
+ /* eslint-enable */
8638
+ handleKey(e) {
8639
+ const handler = this.keyHandlerMap[e.key];
8640
+ handler?.(e);
8641
+ }
8642
+ setFocusByValue(value) {
8643
+ const options = this.displayedOptions();
8644
+ const foundIndex = options.findIndex(opt => opt.value === value);
8645
+ const finalIndex = foundIndex === -1 ? 0 : foundIndex;
8646
+ this.focusedIndex.set(finalIndex);
8647
+ }
8648
+ moveFocused(direction) {
8649
+ const options = this.displayedOptions();
8650
+ const index = this.focusedIndex();
8651
+ const clampIndex = (n) => {
8652
+ if (n < 0) {
8653
+ return options.length - 1;
8654
+ }
8655
+ else if (n >= options.length) {
8656
+ return 0;
8657
+ }
8658
+ return n;
8659
+ };
8660
+ const indexChange = direction === 'up' ? -1 : 1;
8661
+ const newIndex = clampIndex(index + indexChange);
8662
+ this.focusedIndex.set(newIndex);
8663
+ const newlyFocused = this.displayedOptions()[this.focusedIndex()];
8664
+ // eslint-disable-next-line @rx-angular/prefer-no-layout-sensitive-apis
8665
+ newlyFocused.scrollIntoView();
8666
+ }
8667
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTypeaheadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8668
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FwTypeaheadComponent, isStandalone: true, selector: "fw-typeahead", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, optionsInput: { classPropertyName: "optionsInput", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, maxOptionsHeight: { classPropertyName: "maxOptionsHeight", publicName: "maxOptionsHeight", isSignal: true, isRequired: false, transformFunction: null }, minOptionsHeight: { classPropertyName: "minOptionsHeight", publicName: "minOptionsHeight", isSignal: true, isRequired: false, transformFunction: null }, optionsWidth: { classPropertyName: "optionsWidth", publicName: "optionsWidth", isSignal: true, isRequired: false, transformFunction: null }, searchValue: { classPropertyName: "searchValue", publicName: "searchValue", isSignal: true, isRequired: false, transformFunction: null }, allowNew: { classPropertyName: "allowNew", publicName: "allowNew", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loading: "loadingChange", disabled: "disabledChange", value: "valueChange", searchValue: "searchValueChange" }, host: { listeners: { "document:click": "outsideClick()", "click": "onClick($event)" } }, providers: [
8669
+ {
8670
+ provide: NG_VALUE_ACCESSOR,
8671
+ useExisting: forwardRef(() => FwTypeaheadComponent),
8672
+ multi: true,
8673
+ },
8674
+ ], viewQueries: [{ propertyName: "trigger", first: true, predicate: CdkMenuTrigger, descendants: true, isSignal: true }, { propertyName: "displayedOptions", predicate: FwMenuItemComponent, descendants: true, isSignal: true }, { propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n (click)=\"focusInput($event)\"\n class=\"input-container\"\n [ngClass]=\"{ 'disabled': disabled() }\"\n [cdkMenuTriggerFor]=\"menuContent\"\n fwMenuRegister\n #inputContainer>\n <fw-chip-list class=\"chips\">\n @for(val of value(); track val) {\n <fw-chip\n color=\"primary\"\n [showClose]=\"true\"\n [title]=\"val\"\n [selectable]=\"false\"\n (close)=\"closeChip(val)\"\n />\n }\n </fw-chip-list>\n <input\n test-id=\"typeahead-input\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"searchValue()\"\n (keyup)=\"handleSearchChange($event)\"\n (keydown)=\"handleKey($event)\"\n #input\n type=\"text\"\n />\n @if(loading()) {\n <fw-progress-spinner size=\"small\"/>\n }\n</div>\n<ng-template #menuContent>\n <fw-menu-container\n [maxHeight]=\"maxOptionsHeight()\"\n [minHeight]=\"minOptionsHeight()\"\n [width]=\"optionsWidth() || inputContainer.offsetWidth - 2 + 'px'\"\n >\n <fw-menu>\n @if(loading() && !displayNewOption()) {\n <fw-menu-item title=\"Searching...\" [disabled]=\"true\"/>\n } @else if(!loading()) {\n @for (option of optionsSignal(); track option) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(option)\"\n [title]=\"option\"\n [focused]=\"focusedOption() === option\"\n [value]=\"option\"\n />\n }\n @empty {\n @if (!displayNewOption()) {\n <fw-menu-item title=\"No tag suggestions\" [disabled]=\"true\"/>\n }\n }\n }\n @if(displayNewOption()) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(searchValue())\"\n [title]=\"searchValue()\"\n [value]=\"searchValue()\"\n [focused]=\"focusedOption() === searchValue()\">\n <p class=\"new-tag\">New</p>\n </fw-menu-item>\n }\n </fw-menu>\n </fw-menu-container>\n</ng-template>\n", styles: [".new-tag{margin:0;color:var(--typography-light)}:host{display:flex;flex-direction:column;width:100%;line-height:21px}:host.disabled{cursor:not-allowed}:host.disabled fw-icon{cursor:not-allowed!important}:host .chips,:host fw-progress-spinner{margin:-4px 0}:host .input-container{width:100%;box-sizing:border-box;color:var(--typography-light);background:var(--page-light);display:flex;padding:8px;align-items:center;border-radius:6px;border:1px solid var(--separations-input);font-family:Inter,sans-serif}:host .input-container:focus-within{border:1px solid var(--primary-base)}:host .input-container input{min-width:80px;font-size:14px;flex:1 1 80px;color:var(--typography-base);background:var(--page-light);border:none}:host .input-container input:focus{outline:none;border:none}:host .input-container input::placeholder{color:var(--typography-light)}:host .input-container .context{color:var(--typography-light)}:host.errored .input-container,:host.ng-touched.ng-invalid .input-container{border:1px solid var(--red-base)}.disabled{opacity:.4;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FwTextInputModule }, { kind: "ngmodule", type: FwChipModule }, { kind: "component", type: FwChipComponent, selector: "fw-chip", inputs: ["value", "variant", "color", "icon", "title", "description", "showClose", "disabled", "selected", "selectable"], outputs: ["close", "select"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FwMenuModule }, { kind: "component", type: FwMenuComponent, selector: "fw-menu", inputs: ["disabled", "size", "multiSelect", "useCheckbox", "value"], outputs: ["change"] }, { kind: "component", type: FwMenuContainerComponent, selector: "fw-menu-container, fw-menu-filter", inputs: ["width", "maxHeight", "minHeight", "border", "shadow", "showFilter", "filterText", "focusFilterOnMount", "offset", "emptyText", "filterFn", "additionalMenuItems", "keyHandler"], outputs: ["filteredMenuItemChange", "filterChanged"] }, { kind: "component", type: FwMenuItemComponent, selector: "fw-menu-item", inputs: ["value", "size", "title", "description", "icon", "iconColor", "disabled", "showCheckbox", "checkboxColor", "multiSelect", "hidden", "collapsed", "href", "target", "subItemsOpen", "mouseEnterHandler", "focused", "selected"], outputs: ["mouseEnterHandlerChange", "click"] }, { kind: "ngmodule", type: CdkMenuModule }, { kind: "directive", type: i1$4.CdkMenuTrigger, selector: "[cdkMenuTriggerFor]", inputs: ["cdkMenuTriggerFor", "cdkMenuPosition", "cdkMenuTriggerData"], outputs: ["cdkMenuOpened", "cdkMenuClosed"], exportAs: ["cdkMenuTriggerFor"] }, { kind: "directive", type: MenuRegisterDirective, selector: "[fwMenuRegister]" }, { kind: "ngmodule", type: FwProgressModule }, { kind: "component", type: FwProgressSpinnerComponent, selector: "fw-progress-spinner", inputs: ["mode", "size", "color", "showValue", "value"] }, { kind: "component", type: FwChipListComponent, selector: "fw-chip-list" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
8675
+ }
8676
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTypeaheadComponent, decorators: [{
8677
+ type: Component,
8678
+ args: [{ selector: 'fw-typeahead', standalone: true, imports: [
8679
+ FwTextInputModule,
8680
+ FwChipModule,
8681
+ ReactiveFormsModule,
8682
+ FwMenuModule,
8683
+ CdkMenuModule,
8684
+ MenuRegisterDirective,
8685
+ FwProgressModule,
8686
+ FwChipListComponent,
8687
+ NgClass,
8688
+ ], providers: [
8689
+ {
8690
+ provide: NG_VALUE_ACCESSOR,
8691
+ useExisting: forwardRef(() => FwTypeaheadComponent),
8692
+ multi: true,
8693
+ },
8694
+ ], template: "<div\n (click)=\"focusInput($event)\"\n class=\"input-container\"\n [ngClass]=\"{ 'disabled': disabled() }\"\n [cdkMenuTriggerFor]=\"menuContent\"\n fwMenuRegister\n #inputContainer>\n <fw-chip-list class=\"chips\">\n @for(val of value(); track val) {\n <fw-chip\n color=\"primary\"\n [showClose]=\"true\"\n [title]=\"val\"\n [selectable]=\"false\"\n (close)=\"closeChip(val)\"\n />\n }\n </fw-chip-list>\n <input\n test-id=\"typeahead-input\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"searchValue()\"\n (keyup)=\"handleSearchChange($event)\"\n (keydown)=\"handleKey($event)\"\n #input\n type=\"text\"\n />\n @if(loading()) {\n <fw-progress-spinner size=\"small\"/>\n }\n</div>\n<ng-template #menuContent>\n <fw-menu-container\n [maxHeight]=\"maxOptionsHeight()\"\n [minHeight]=\"minOptionsHeight()\"\n [width]=\"optionsWidth() || inputContainer.offsetWidth - 2 + 'px'\"\n >\n <fw-menu>\n @if(loading() && !displayNewOption()) {\n <fw-menu-item title=\"Searching...\" [disabled]=\"true\"/>\n } @else if(!loading()) {\n @for (option of optionsSignal(); track option) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(option)\"\n [title]=\"option\"\n [focused]=\"focusedOption() === option\"\n [value]=\"option\"\n />\n }\n @empty {\n @if (!displayNewOption()) {\n <fw-menu-item title=\"No tag suggestions\" [disabled]=\"true\"/>\n }\n }\n }\n @if(displayNewOption()) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(searchValue())\"\n [title]=\"searchValue()\"\n [value]=\"searchValue()\"\n [focused]=\"focusedOption() === searchValue()\">\n <p class=\"new-tag\">New</p>\n </fw-menu-item>\n }\n </fw-menu>\n </fw-menu-container>\n</ng-template>\n", styles: [".new-tag{margin:0;color:var(--typography-light)}:host{display:flex;flex-direction:column;width:100%;line-height:21px}:host.disabled{cursor:not-allowed}:host.disabled fw-icon{cursor:not-allowed!important}:host .chips,:host fw-progress-spinner{margin:-4px 0}:host .input-container{width:100%;box-sizing:border-box;color:var(--typography-light);background:var(--page-light);display:flex;padding:8px;align-items:center;border-radius:6px;border:1px solid var(--separations-input);font-family:Inter,sans-serif}:host .input-container:focus-within{border:1px solid var(--primary-base)}:host .input-container input{min-width:80px;font-size:14px;flex:1 1 80px;color:var(--typography-base);background:var(--page-light);border:none}:host .input-container input:focus{outline:none;border:none}:host .input-container input::placeholder{color:var(--typography-light)}:host .input-container .context{color:var(--typography-light)}:host.errored .input-container,:host.ng-touched.ng-invalid .input-container{border:1px solid var(--red-base)}.disabled{opacity:.4;pointer-events:none}\n"] }]
8695
+ }], propDecorators: { outsideClick: [{
8696
+ type: HostListener,
8697
+ args: ['document:click']
8698
+ }], onClick: [{
8699
+ type: HostListener,
8700
+ args: ['click', ['$event']]
8701
+ }] } });
8702
+
8429
8703
  class FwWrappedInputComponent {
8430
8704
  constructor() {
8431
8705
  this.class = true;
8432
8706
  }
8433
8707
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwWrappedInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8434
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwWrappedInputComponent, selector: "fw-wrapped-input", inputs: { title: "title", description: "description", helperText: "helperText", errorText: "errorText" }, host: { properties: { "class.fw-wrapped-input": "this.class" } }, ngImport: i0, template: "<label>\n <fw-form-heading *ngIf=\"title\" [title]=\"title\" [description]=\"description\"></fw-form-heading>\n <ng-content select=\"fw-form-heading\"></ng-content>\n</label>\n<div class=\"input-wrapper\">\n <ng-content\n select=\"fw-button-toggle, fw-date-input, fw-text-input, fw-number-input, fw-phone-input, fw-textarea-input, fw-select, fw-multi-select, fw-checkbox\"></ng-content>\n</div>\n<p class=\"vision-p4 helper-text\" *ngIf=\"!!helperText && !errorText\">{{ helperText }}</p>\n<p class=\"vision-p4 error-text\" *ngIf=\"!!errorText\">{{ errorText }}</p>\n", styles: [".fw-wrapped-input{display:flex;flex-direction:column;flex:1}.fw-wrapped-input .input-wrapper{max-width:100%;display:flex;flex-direction:row;flex:1;gap:16px}.fw-wrapped-input .input-wrapper>*{flex:1}.fw-wrapped-input .helper-text,.fw-wrapped-input .error-text{margin-top:4px;color:var(--typography-light);line-height:13px;margin-left:6px;margin-bottom:0;text-align:left}.fw-wrapped-input .error-text{color:var(--red-base)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FwFormHeadingComponent, selector: "fw-form-heading", inputs: ["title", "description", "status"] }], encapsulation: i0.ViewEncapsulation.None }); }
8708
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwWrappedInputComponent, selector: "fw-wrapped-input", inputs: { title: "title", description: "description", helperText: "helperText", errorText: "errorText" }, host: { properties: { "class.fw-wrapped-input": "this.class" } }, ngImport: i0, template: "<label>\n <fw-form-heading *ngIf=\"title\" [title]=\"title\" [description]=\"description\"></fw-form-heading>\n <ng-content select=\"fw-form-heading\"></ng-content>\n</label>\n<div class=\"input-wrapper\">\n <ng-content\n select=\"fw-button-toggle, fw-date-input, fw-text-input, fw-number-input, fw-phone-input, fw-textarea-input, fw-select, fw-multi-select, fw-checkbox, fw-typeahead\"></ng-content>\n</div>\n<p class=\"vision-p4 helper-text\" *ngIf=\"!!helperText && !errorText\">{{ helperText }}</p>\n<p class=\"vision-p4 error-text\" *ngIf=\"!!errorText\">{{ errorText }}</p>\n", styles: [".fw-wrapped-input{display:flex;flex-direction:column;flex:1}.fw-wrapped-input .input-wrapper{max-width:100%;display:flex;flex-direction:row;flex:1;gap:16px}.fw-wrapped-input .input-wrapper>*{flex:1}.fw-wrapped-input .helper-text,.fw-wrapped-input .error-text{margin-top:4px;color:var(--typography-light);line-height:13px;margin-left:6px;margin-bottom:0;text-align:left}.fw-wrapped-input .error-text{color:var(--red-base)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FwFormHeadingComponent, selector: "fw-form-heading", inputs: ["title", "description", "status"] }], encapsulation: i0.ViewEncapsulation.None }); }
8435
8709
  }
8436
8710
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwWrappedInputComponent, decorators: [{
8437
8711
  type: Component,
8438
- args: [{ selector: 'fw-wrapped-input', encapsulation: ViewEncapsulation.None, template: "<label>\n <fw-form-heading *ngIf=\"title\" [title]=\"title\" [description]=\"description\"></fw-form-heading>\n <ng-content select=\"fw-form-heading\"></ng-content>\n</label>\n<div class=\"input-wrapper\">\n <ng-content\n select=\"fw-button-toggle, fw-date-input, fw-text-input, fw-number-input, fw-phone-input, fw-textarea-input, fw-select, fw-multi-select, fw-checkbox\"></ng-content>\n</div>\n<p class=\"vision-p4 helper-text\" *ngIf=\"!!helperText && !errorText\">{{ helperText }}</p>\n<p class=\"vision-p4 error-text\" *ngIf=\"!!errorText\">{{ errorText }}</p>\n", styles: [".fw-wrapped-input{display:flex;flex-direction:column;flex:1}.fw-wrapped-input .input-wrapper{max-width:100%;display:flex;flex-direction:row;flex:1;gap:16px}.fw-wrapped-input .input-wrapper>*{flex:1}.fw-wrapped-input .helper-text,.fw-wrapped-input .error-text{margin-top:4px;color:var(--typography-light);line-height:13px;margin-left:6px;margin-bottom:0;text-align:left}.fw-wrapped-input .error-text{color:var(--red-base)}\n"] }]
8712
+ args: [{ selector: 'fw-wrapped-input', encapsulation: ViewEncapsulation.None, template: "<label>\n <fw-form-heading *ngIf=\"title\" [title]=\"title\" [description]=\"description\"></fw-form-heading>\n <ng-content select=\"fw-form-heading\"></ng-content>\n</label>\n<div class=\"input-wrapper\">\n <ng-content\n select=\"fw-button-toggle, fw-date-input, fw-text-input, fw-number-input, fw-phone-input, fw-textarea-input, fw-select, fw-multi-select, fw-checkbox, fw-typeahead\"></ng-content>\n</div>\n<p class=\"vision-p4 helper-text\" *ngIf=\"!!helperText && !errorText\">{{ helperText }}</p>\n<p class=\"vision-p4 error-text\" *ngIf=\"!!errorText\">{{ errorText }}</p>\n", styles: [".fw-wrapped-input{display:flex;flex-direction:column;flex:1}.fw-wrapped-input .input-wrapper{max-width:100%;display:flex;flex-direction:row;flex:1;gap:16px}.fw-wrapped-input .input-wrapper>*{flex:1}.fw-wrapped-input .helper-text,.fw-wrapped-input .error-text{margin-top:4px;color:var(--typography-light);line-height:13px;margin-left:6px;margin-bottom:0;text-align:left}.fw-wrapped-input .error-text{color:var(--red-base)}\n"] }]
8439
8713
  }], propDecorators: { title: [{
8440
8714
  type: Input
8441
8715
  }], description: [{
@@ -8476,5 +8750,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8476
8750
  * Generated bundle index. Do not edit.
8477
8751
  */
8478
8752
 
8479
- export { DialogWidth, FwAlertComponent, FwAlertModule, FwAppIconComponent, FwAppIconModule, FwAvatarComponent, FwAvatarModule, FwBackButtonComponent, FwBadgeComponent, FwBadgeModule, FwBreadcrumbsComponent, FwBreadcrumbsModule, FwButtonComponent, FwButtonDangerDirective, FwButtonDirective, FwButtonGroupComponent, FwButtonGroupModule, FwButtonModule, FwButtonPrimaryDirective, FwButtonSecondaryDirective, FwButtonSuccessDirective, FwButtonToggleComponent, FwButtonToggleItemComponent, FwButtonToggleModule, FwCardAttributeComponent, FwCardAuthorComponent, FwCardComponent, FwCardContentComponent, FwCardFooterComponent, FwCardHeaderComponent, FwCardModule, FwCell, FwCellDef, FwCheckboxComponent, FwCheckboxModule, FwChipComponent, FwChipModule, FwColumnDef, FwContainedInputComponent, FwContainedInputModule, FwCrumbComponent, FwDateInputComponent, FwDateInputModule, FwDialogActionsComponent, FwDialogComponent, FwDialogConfirmComponent, FwDialogContentComponent, FwDialogHeaderComponent, FwDialogService, FwDialogSimpleComponent, FwDialogsModule, FwFooterCell, FwFooterCellDef, FwFooterRow, FwFooterRowDef, FwFormHeadingComponent, FwFormHeadingModule, FwGridComponent, FwGridItemComponent, FwHeaderCell, FwHeaderCellDef, FwHeaderRow, FwHeaderRowDef, FwIconButtonComponent, FwIconButtonModule, FwIconComponent, FwIconModule, FwLayoutContextComponent, FwLayoutGroupComponent, FwLayoutPanelComponent, FwLayoutSidebarComponent, FwLayoutToolbarComponent, FwLayoutsModule, FwMenuCloseTriggersDirective, FwMenuComponent, FwMenuContainerComponent, FwMenuHeaderComponent, FwMenuItemComponent, FwMenuItemGroupComponent, FwMenuModule, FwMenuSeparatorComponent, FwMenuSubItemComponent, FwMultiSelectMenuComponent, FwNavbarComponent, FwNavbarHeaderComponent, FwNavbarItemComponent, FwNavbarModule, FwNavbarSubItemComponent, FwNoDataRow, FwNumberInputComponent, FwNumberInputModule, FwPaginatorAdvancedComponent, FwPaginatorComponent, FwPaginatorModule, FwPhoneInputComponent, FwPhoneInputModule, FwPopoverComponent, FwPopoverModule, FwPopoverPanelComponent, FwProgressBarComponent, FwProgressModule, FwProgressSpinnerComponent, FwRadioComponent, FwRadioGroupComponent, FwRadioModule, FwRow, FwRowDef, FwSectionHeadingComponent, FwSectionHeadingModule, FwSelectMenuComponent, FwSelectMenuModule, FwSnackbarComponent, FwSnackbarContainerComponent, FwSnackbarModule, FwSnackbarService, FwStepComponent, FwStepDecoratorComponent, FwStepperComponent, FwStepperModule, FwSubsectionHeadingComponent, FwSwitchComponent, FwSwitchModule, FwTabComponent, FwTabPanelComponent, FwTableComponent, FwTableDenseComponent, FwTableModule, FwTabsComponent, FwTabsModule, FwTextAreaInputComponent, FwTextAreaInputModule, FwTextInputComponent, FwTextInputModule, FwTooltipComponent, FwTooltipModule, FwTooltipPanelComponent, FwValidators, FwWrappedInputComponent, FwWrappedInputModule, LayoutWidth, MenuManagerService, MenuRegisterDirective, MinimalTranslationService, TranslationService, allIcons, genMessageId, notBeforeDate, notFutureDate };
8753
+ export { DialogWidth, FwAlertComponent, FwAlertModule, FwAppIconComponent, FwAppIconModule, FwAvatarComponent, FwAvatarModule, FwBackButtonComponent, FwBadgeComponent, FwBadgeModule, FwBreadcrumbsComponent, FwBreadcrumbsModule, FwButtonComponent, FwButtonDangerDirective, FwButtonDirective, FwButtonGroupComponent, FwButtonGroupModule, FwButtonModule, FwButtonPrimaryDirective, FwButtonSecondaryDirective, FwButtonSuccessDirective, FwButtonToggleComponent, FwButtonToggleItemComponent, FwButtonToggleModule, FwCardAttributeComponent, FwCardAuthorComponent, FwCardComponent, FwCardContentComponent, FwCardFooterComponent, FwCardHeaderComponent, FwCardModule, FwCell, FwCellDef, FwCheckboxComponent, FwCheckboxModule, FwChipComponent, FwChipModule, FwColumnDef, FwContainedInputComponent, FwContainedInputModule, FwCrumbComponent, FwDateInputComponent, FwDateInputModule, FwDialogActionsComponent, FwDialogComponent, FwDialogConfirmComponent, FwDialogContentComponent, FwDialogHeaderComponent, FwDialogService, FwDialogSimpleComponent, FwDialogsModule, FwFooterCell, FwFooterCellDef, FwFooterRow, FwFooterRowDef, FwFormHeadingComponent, FwFormHeadingModule, FwGridComponent, FwGridItemComponent, FwHeaderCell, FwHeaderCellDef, FwHeaderRow, FwHeaderRowDef, FwIconButtonComponent, FwIconButtonModule, FwIconComponent, FwIconModule, FwLayoutContextComponent, FwLayoutGroupComponent, FwLayoutPanelComponent, FwLayoutSidebarComponent, FwLayoutToolbarComponent, FwLayoutsModule, FwMenuCloseTriggersDirective, FwMenuComponent, FwMenuContainerComponent, FwMenuHeaderComponent, FwMenuItemComponent, FwMenuItemGroupComponent, FwMenuModule, FwMenuSeparatorComponent, FwMenuSubItemComponent, FwMultiSelectMenuComponent, FwNavbarComponent, FwNavbarHeaderComponent, FwNavbarItemComponent, FwNavbarModule, FwNavbarSubItemComponent, FwNoDataRow, FwNumberInputComponent, FwNumberInputModule, FwPaginatorAdvancedComponent, FwPaginatorComponent, FwPaginatorModule, FwPhoneInputComponent, FwPhoneInputModule, FwPopoverComponent, FwPopoverModule, FwPopoverPanelComponent, FwProgressBarComponent, FwProgressModule, FwProgressSpinnerComponent, FwRadioComponent, FwRadioGroupComponent, FwRadioModule, FwRow, FwRowDef, FwSectionHeadingComponent, FwSectionHeadingModule, FwSelectMenuComponent, FwSelectMenuModule, FwSnackbarComponent, FwSnackbarContainerComponent, FwSnackbarModule, FwSnackbarService, FwStepComponent, FwStepDecoratorComponent, FwStepperComponent, FwStepperModule, FwSubsectionHeadingComponent, FwSwitchComponent, FwSwitchModule, FwTabComponent, FwTabPanelComponent, FwTableComponent, FwTableDenseComponent, FwTableModule, FwTabsComponent, FwTabsModule, FwTextAreaInputComponent, FwTextAreaInputModule, FwTextInputComponent, FwTextInputModule, FwTooltipComponent, FwTooltipModule, FwTooltipPanelComponent, FwTypeaheadComponent, FwValidators, FwWrappedInputComponent, FwWrappedInputModule, LayoutWidth, MenuManagerService, MenuRegisterDirective, MinimalTranslationService, TranslationService, allIcons, genMessageId, notBeforeDate, notFutureDate };
8480
8754
  //# sourceMappingURL=flywheel-io-vision.mjs.map