@flywheel-io/vision 2.7.0-beta.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/assets/fonts/Flywheel-Vision-Icons.svg +8 -2
  2. package/assets/fonts/Flywheel-Vision-Icons.ttf +0 -0
  3. package/assets/fonts/Flywheel-Vision-Icons.woff +0 -0
  4. package/assets/svg/documents-file-move-arrow-right.svg +4 -0
  5. package/assets/svg/folder-move.svg +4 -0
  6. package/assets/svg/mouse-scroll.svg +4 -0
  7. package/assets/svg/thumbs-down-dislike.svg +4 -0
  8. package/components/avatar-list/avatar-list.component.d.ts +5 -3
  9. package/components/dialog/dialog-confirm.component.d.ts +2 -1
  10. package/components/form-heading/form-heading.component.d.ts +3 -1
  11. package/components/form-heading/form-heading.module.d.ts +2 -1
  12. package/components/icon/icon.types.d.ts +1 -1
  13. package/components/menu/menu-close-triggers.directive.d.ts +1 -1
  14. package/components/tag/tag.component.d.ts +10 -0
  15. package/components/tag/tag.module.d.ts +9 -0
  16. package/components/tooltip/tooltip-panel/tooltip-panel.component.d.ts +6 -6
  17. package/components/tooltip/tooltip.component.d.ts +2 -1
  18. package/components/tooltip/tooltip.directive.d.ts +39 -6
  19. package/components/wrapped-input/wrapped-input.component.d.ts +4 -1
  20. package/esm2022/components/avatar/avatar.component.mjs +7 -3
  21. package/esm2022/components/avatar-list/avatar-list.component.mjs +24 -24
  22. package/esm2022/components/chip-list/chip-list.component.mjs +3 -2
  23. package/esm2022/components/dialog/dialog-confirm.component.mjs +6 -3
  24. package/esm2022/components/form-heading/form-heading.component.mjs +9 -3
  25. package/esm2022/components/form-heading/form-heading.module.mjs +7 -3
  26. package/esm2022/components/icon/icon.types.mjs +44 -41
  27. package/esm2022/components/menu/menu-close-triggers.directive.mjs +15 -9
  28. package/esm2022/components/paginator/paginator-advanced/paginator-advanced.component.mjs +2 -2
  29. package/esm2022/components/select-menu/multi-select-menu/multi-select-menu.component.mjs +6 -1
  30. package/esm2022/components/tag/tag.component.mjs +25 -0
  31. package/esm2022/components/tag/tag.module.mjs +28 -0
  32. package/esm2022/components/tooltip/tooltip-panel/tooltip-panel.component.mjs +12 -21
  33. package/esm2022/components/tooltip/tooltip.component.mjs +4 -3
  34. package/esm2022/components/tooltip/tooltip.directive.mjs +94 -31
  35. package/esm2022/components/typeahead/typeahead.component.mjs +8 -4
  36. package/esm2022/components/wrapped-input/wrapped-input.component.mjs +10 -3
  37. package/fesm2022/flywheel-io-vision.mjs +274 -134
  38. package/fesm2022/flywheel-io-vision.mjs.map +1 -1
  39. package/package.json +1 -1
  40. package/scss/icons/_icon-glyphs.scss +12 -4
  41. package/styles.css +16 -4
  42. package/flywheel-io-vision-2.7.0-beta.0.tgz +0 -0
@@ -3,7 +3,7 @@ import { HostBinding, Input, ChangeDetectionStrategy, Component, EventEmitter, O
3
3
  import * as i1$1 from '@angular/common';
4
4
  import { CommonModule, NgClass } from '@angular/common';
5
5
  import * as i1 from '@angular/platform-browser';
6
- import { BehaviorSubject, distinctUntilChanged, debounce, timer, of, Subscription, min, startWith, tap, switchMap, map } from 'rxjs';
6
+ import { BehaviorSubject, debounce, timer, distinctUntilChanged, of, Subscription, min, startWith, tap, switchMap, map } from 'rxjs';
7
7
  import * as i1$2 from '@angular/cdk/overlay';
8
8
  import { OverlayModule, Overlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
9
9
  import * as i1$5 from '@angular/cdk/table';
@@ -356,8 +356,12 @@ class FwAvatarComponent {
356
356
  return [this.size, this.variant, this.content, 'selected'].filter(Boolean).join(' ');
357
357
  }
358
358
  ;
359
- get borderClass() { return this.bordered; }
360
- get selectedClassApplied() { return this.selected(); }
359
+ get borderClass() {
360
+ return this.bordered;
361
+ }
362
+ get selectedClassApplied() {
363
+ return this.selected();
364
+ }
361
365
  loadImage() {
362
366
  this.isImageBroken = false;
363
367
  }
@@ -928,24 +932,10 @@ class FwTooltipPanelComponent {
928
932
  this.connectedPosition = computed(() => [positionMap$1[this.position()]]);
929
933
  this.color = 'dark';
930
934
  this.maxWidth = 200;
935
+ this.displayCaret = true;
931
936
  this.mouseLeave = new EventEmitter();
932
937
  this.delay = input('short');
933
938
  this.delayMs = computed(() => delayMap$1[this.delay()]);
934
- /*
935
- <ng-template
936
- cdkConnectedOverlay
937
- [cdkConnectedOverlayOrigin]="trigger"
938
- [cdkConnectedOverlayOpen]="isOpen"
939
- [cdkConnectedOverlayPositions]="connectedPosition()"
940
- [cdkConnectedOverlayScrollStrategy]="this.overlayService.scrollStrategies.close()">
941
- */
942
- this.overlayService = inject(Overlay);
943
- this.updateOverlayOnChange = effect(() => {
944
- // this.overlayRef.origin = this.trigger();
945
- // this.overlayRef.positions = this.connectedPosition();
946
- // this.overlayRef.open = this.isOpen();
947
- // this.overlayRef.scrollStrategy = this.overlayService.scrollStrategies.close();
948
- });
949
939
  }
950
940
  get classes() {
951
941
  return ['fw-tooltip-panel', 'fw-tooltip-' + this.position].join(' ');
@@ -954,7 +944,7 @@ class FwTooltipPanelComponent {
954
944
  this.mouseLeave.emit(e);
955
945
  }
956
946
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTooltipPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
957
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.12", type: FwTooltipPanelComponent, selector: "fw-tooltip-panel", inputs: { trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mouseLeave: "mouseLeave" }, host: { listeners: { "mouseleave": "hidePopover($event)" }, properties: { "attr.class": "this.classes" } }, ngImport: i0, template: "<div\n @fadeInFadeOut\n class=\"fw-tooltip-content-wrapper vision-dark-theme\"\n [ngClass]=\"'fw-tooltip-' + position()\"\n [ngStyle]=\"{'maxWidth': maxWidth+'px'}\">\n <ng-content></ng-content>\n <h5 class=\"vision-h5\">{{ title }}</h5>\n <div class=\"fw-tooltip-caret\"></div>\n</div>\n", styles: [":host{position:absolute;height:0;width:0}.fw-tooltip-content-wrapper{position:relative;border-radius:8px;border:1px solid var(--separations-border);min-width:60px;box-sizing:border-box;padding:4px 8px;background-color:var(--card-header);text-align:center;overflow-wrap:break-word;white-space:pre-wrap}.fw-tooltip-content-wrapper h5{margin:0!important;color:var(--typography-muted)}.fw-tooltip-content-wrapper .fw-tooltip-caret{position:absolute;overflow:hidden;width:16px;height:16px}.fw-tooltip-content-wrapper .fw-tooltip-caret:after{display:block;content:\"\";width:10px;height:10px;background:var(--separations-border);border:1px solid var(--separations-border);transform:rotate(45deg);position:relative}.fw-tooltip-content-wrapper.fw-tooltip-none{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-none .fw-tooltip-caret{display:none}.fw-tooltip-content-wrapper.fw-tooltip-above{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret{left:calc(50% - 8px);bottom:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret:after{margin:-8px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-below{margin-top:10px}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret{left:calc(50% - 8px);top:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret:after{top:10px;margin:-4px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-left{margin-right:10px}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret{right:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret:after{top:calc(50% - 5px);left:-8px;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-right{margin-left:10px}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret{left:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret:after{top:calc(50% - 5px);right:-6px;width:10px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], animations: [
947
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FwTooltipPanelComponent, selector: "fw-tooltip-panel", inputs: { trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, displayCaret: { classPropertyName: "displayCaret", publicName: "displayCaret", isSignal: false, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mouseLeave: "mouseLeave" }, host: { listeners: { "mouseleave": "hidePopover($event)" }, properties: { "@fadeInFadeOut": "this.animation", "attr.class": "this.classes" } }, ngImport: i0, template: "<div\n class=\"fw-tooltip-content-wrapper vision-dark-theme\"\n [ngClass]=\"'fw-tooltip-' + position()\"\n [ngStyle]=\"{'maxWidth': maxWidth+'px'}\">\n <ng-content></ng-content>\n <h5 class=\"vision-h5\">{{ title }}</h5>\n @if (displayCaret) {\n <div class=\"fw-tooltip-caret\"></div>\n }\n</div>\n", styles: [":host{position:absolute;height:0;width:0}.fw-tooltip-content-wrapper{position:relative;border-radius:8px;border:1px solid var(--separations-border);min-width:60px;box-sizing:border-box;padding:4px 8px;background-color:var(--card-header);text-align:center;overflow-wrap:break-word;white-space:pre-wrap}.fw-tooltip-content-wrapper h5{margin:0!important;color:var(--typography-muted)}.fw-tooltip-content-wrapper .fw-tooltip-caret{position:absolute;overflow:hidden;width:16px;height:16px}.fw-tooltip-content-wrapper .fw-tooltip-caret:after{display:block;content:\"\";width:10px;height:10px;background:var(--separations-border);border:1px solid var(--separations-border);transform:rotate(45deg);position:relative}.fw-tooltip-content-wrapper.fw-tooltip-none{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-none .fw-tooltip-caret{display:none}.fw-tooltip-content-wrapper.fw-tooltip-above{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret{left:calc(50% - 8px);bottom:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret:after{margin:-8px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-below{margin-top:10px}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret{left:calc(50% - 8px);top:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret:after{top:10px;margin:-4px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-left{margin-right:10px}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret{right:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret:after{top:calc(50% - 5px);left:-8px;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-right{margin-left:10px}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret{left:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret:after{top:calc(50% - 5px);right:-6px;width:10px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], animations: [
958
948
  trigger('fadeInFadeOut', [
959
949
  transition(':enter', [
960
950
  style({ opacity: 0 }),
@@ -978,13 +968,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
978
968
  animate('200ms', style({ opacity: 0 })),
979
969
  ]),
980
970
  ]),
981
- ], template: "<div\n @fadeInFadeOut\n class=\"fw-tooltip-content-wrapper vision-dark-theme\"\n [ngClass]=\"'fw-tooltip-' + position()\"\n [ngStyle]=\"{'maxWidth': maxWidth+'px'}\">\n <ng-content></ng-content>\n <h5 class=\"vision-h5\">{{ title }}</h5>\n <div class=\"fw-tooltip-caret\"></div>\n</div>\n", styles: [":host{position:absolute;height:0;width:0}.fw-tooltip-content-wrapper{position:relative;border-radius:8px;border:1px solid var(--separations-border);min-width:60px;box-sizing:border-box;padding:4px 8px;background-color:var(--card-header);text-align:center;overflow-wrap:break-word;white-space:pre-wrap}.fw-tooltip-content-wrapper h5{margin:0!important;color:var(--typography-muted)}.fw-tooltip-content-wrapper .fw-tooltip-caret{position:absolute;overflow:hidden;width:16px;height:16px}.fw-tooltip-content-wrapper .fw-tooltip-caret:after{display:block;content:\"\";width:10px;height:10px;background:var(--separations-border);border:1px solid var(--separations-border);transform:rotate(45deg);position:relative}.fw-tooltip-content-wrapper.fw-tooltip-none{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-none .fw-tooltip-caret{display:none}.fw-tooltip-content-wrapper.fw-tooltip-above{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret{left:calc(50% - 8px);bottom:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret:after{margin:-8px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-below{margin-top:10px}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret{left:calc(50% - 8px);top:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret:after{top:10px;margin:-4px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-left{margin-right:10px}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret{right:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret:after{top:calc(50% - 5px);left:-8px;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-right{margin-left:10px}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret{left:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret:after{top:calc(50% - 5px);right:-6px;width:10px}\n"] }]
982
- }], propDecorators: { title: [{
971
+ ], template: "<div\n class=\"fw-tooltip-content-wrapper vision-dark-theme\"\n [ngClass]=\"'fw-tooltip-' + position()\"\n [ngStyle]=\"{'maxWidth': maxWidth+'px'}\">\n <ng-content></ng-content>\n <h5 class=\"vision-h5\">{{ title }}</h5>\n @if (displayCaret) {\n <div class=\"fw-tooltip-caret\"></div>\n }\n</div>\n", styles: [":host{position:absolute;height:0;width:0}.fw-tooltip-content-wrapper{position:relative;border-radius:8px;border:1px solid var(--separations-border);min-width:60px;box-sizing:border-box;padding:4px 8px;background-color:var(--card-header);text-align:center;overflow-wrap:break-word;white-space:pre-wrap}.fw-tooltip-content-wrapper h5{margin:0!important;color:var(--typography-muted)}.fw-tooltip-content-wrapper .fw-tooltip-caret{position:absolute;overflow:hidden;width:16px;height:16px}.fw-tooltip-content-wrapper .fw-tooltip-caret:after{display:block;content:\"\";width:10px;height:10px;background:var(--separations-border);border:1px solid var(--separations-border);transform:rotate(45deg);position:relative}.fw-tooltip-content-wrapper.fw-tooltip-none{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-none .fw-tooltip-caret{display:none}.fw-tooltip-content-wrapper.fw-tooltip-above{margin-bottom:10px}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret{left:calc(50% - 8px);bottom:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-above .fw-tooltip-caret:after{margin:-8px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-below{margin-top:10px}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret{left:calc(50% - 8px);top:-10px;height:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-below .fw-tooltip-caret:after{top:10px;margin:-4px auto;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-left{margin-right:10px}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret{right:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-left .fw-tooltip-caret:after{top:calc(50% - 5px);left:-8px;width:10px}.fw-tooltip-content-wrapper.fw-tooltip-right{margin-left:10px}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret{left:-10px;top:max(50% - 10px,3px);width:10px!important}.fw-tooltip-content-wrapper.fw-tooltip-right .fw-tooltip-caret:after{top:calc(50% - 5px);right:-6px;width:10px}\n"] }]
972
+ }], propDecorators: { animation: [{
973
+ type: HostBinding,
974
+ args: ['@fadeInFadeOut']
975
+ }], title: [{
983
976
  type: Input
984
977
  }], color: [{
985
978
  type: Input
986
979
  }], maxWidth: [{
987
980
  type: Input
981
+ }], displayCaret: [{
982
+ type: Input
988
983
  }], mouseLeave: [{
989
984
  type: Output
990
985
  }], classes: [{
@@ -995,13 +990,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
995
990
  args: ['mouseleave', ['$event']]
996
991
  }] } });
997
992
 
998
- const positionMap = {
999
- 'none': { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: 3 },
1000
- 'above': { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: 3 },
1001
- 'below': { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: -3 },
1002
- 'left': { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' },
1003
- 'right': { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' },
1004
- };
1005
993
  const delayMap = {
1006
994
  'none': 0,
1007
995
  'short': 400,
@@ -1010,49 +998,97 @@ const delayMap = {
1010
998
  const delayNameToMs = (name) => {
1011
999
  return delayMap[name];
1012
1000
  };
1001
+ const positionMap = {
1002
+ 'above': { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: 3 },
1003
+ 'below': { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: -3 },
1004
+ 'left': { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' },
1005
+ 'right': { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' },
1006
+ 'none': { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: 3 },
1007
+ };
1008
+ /**
1009
+ * Directive for displaying extra context on hover
1010
+ * @see [Vision Docs](https://cdn.flywheel.io/docs/vision/master/?path=/docs/components-tooltip--docs)
1011
+ */
1013
1012
  class FwTooltipDirective {
1014
1013
  constructor() {
1015
- // External Context
1014
+ /***** External Context *****/
1016
1015
  this.elementRef = inject(ElementRef);
1017
1016
  this.viewContainerRef = inject(ViewContainerRef);
1018
1017
  this.overlayService = inject(Overlay);
1019
- // Internal refs
1018
+ /***** Internal Refs *****/
1020
1019
  this.overlayRef = signal(undefined);
1021
1020
  this.tooltipRef = signal(undefined);
1022
- // Inputs
1023
- this.delayMs = input(400, {
1024
- transform: delayNameToMs,
1025
- alias: 'fwTooltipDelay',
1026
- });
1021
+ /***** Inputs *****/
1027
1022
  // a lot of these ideally wouldn't be models,
1028
1023
  // but it makes it easier to interact with this from derivative directives
1029
- this.title = model('undefined', {
1024
+ // VS Code pulls the input that shares a name with the directive for giving context
1025
+ // so putting the top level comment on this input
1026
+ /**
1027
+ * Directive for displaying extra context on hover
1028
+ * @see [Vision Docs](https://cdn.flywheel.io/docs/vision/master/?path=/docs/components-tooltip--docs)
1029
+ */
1030
+ this.title = model('Placeholder', {
1030
1031
  alias: 'fwTooltip',
1031
1032
  });
1033
+ /**
1034
+ * direction relative to the parent component that the tooltip will attempt to position itself to
1035
+ */
1032
1036
  this.position = model('above', {
1033
1037
  alias: 'fwTooltipPosition',
1034
1038
  });
1039
+ /**
1040
+ * maximum width of the tooltip in pixels
1041
+ */
1035
1042
  this.maxWidth = model(200, {
1036
1043
  alias: 'fwTooltipMaxWidthPx',
1037
1044
  });
1045
+ /**
1046
+ * amount of delay before the tooltip displays
1047
+ *
1048
+ * none (0ms),
1049
+ * short (400ms),
1050
+ * long (700ms)
1051
+ */
1052
+ this.delayMs = input(400, {
1053
+ transform: delayNameToMs,
1054
+ alias: 'fwTooltipDelay',
1055
+ });
1056
+ /**
1057
+ * whether or not the tooltip should have a caret
1058
+ */
1059
+ this.displayCaret = input(true, {
1060
+ alias: 'fwTooltipCaret',
1061
+ });
1038
1062
  this.enabled = model(true, {
1039
- alias: 'fwTooltipEnabled'
1063
+ alias: 'fwTooltipEnabled',
1064
+ });
1065
+ /***** Derived State *****/
1066
+ this.connectedPositions = computed(() => {
1067
+ // falback positions for if it doesn't fit in the specified position
1068
+ // tend towards closer first i.e. 'above' will try 'left' and 'right' before resorting to 'below
1069
+ const positionPreferenceOrderMap = {
1070
+ 'above': ['above', 'right', 'left', 'below'],
1071
+ 'right': ['right', 'below', 'above', 'left'],
1072
+ 'below': ['below', 'left', 'right', 'above'],
1073
+ 'left': ['left', 'above', 'below', 'right'],
1074
+ };
1075
+ const fallbackNamedPositions = positionPreferenceOrderMap[this.position()];
1076
+ const connectedPositions = fallbackNamedPositions.map(name => positionMap[name]);
1077
+ return connectedPositions;
1040
1078
  });
1041
- // derived state
1042
- this.connectedPosition = computed(() => [positionMap[this.position()]]);
1043
1079
  this.positionStrategy = computed(() => {
1044
1080
  const positionBuilder = this.overlayService.position();
1045
1081
  const withOrigin = positionBuilder.flexibleConnectedTo(this.elementRef);
1046
- const completedStrategy = withOrigin.withPositions(this.connectedPosition());
1082
+ const completedStrategy = withOrigin.withPositions(this.connectedPositions());
1047
1083
  return completedStrategy;
1048
1084
  });
1049
1085
  this.overlayConfig = computed(() => ({
1050
1086
  positionStrategy: this.positionStrategy(),
1051
- maxWidth: this.maxWidth(),
1087
+ maxWidth: Number(this.maxWidth()),
1052
1088
  ScrollStrategyOptions: this.overlayService.scrollStrategies.close(),
1053
1089
  disposeOnNavigation: true,
1054
1090
  }));
1055
- // effects and methods
1091
+ /***** Effects and Methods *****/
1056
1092
  this.addMouseEventListeners = effect(() => {
1057
1093
  const nativeElement = this.elementRef.nativeElement;
1058
1094
  nativeElement.addEventListener('mouseenter', () => {
@@ -1062,13 +1098,32 @@ class FwTooltipDirective {
1062
1098
  this.hideTooltip();
1063
1099
  });
1064
1100
  });
1101
+ // updates the tooltip panel's caret position if a fallback position is used
1102
+ this.handlePositionChange = effect(() => {
1103
+ this.positionChangeSub?.unsubscribe();
1104
+ this.positionChangeSub = this.positionStrategy().positionChanges.subscribe(positionChange => {
1105
+ const newPosition = positionChange.connectionPair;
1106
+ const positionNames = Object.keys(positionMap);
1107
+ const newPositionName = positionNames.find(name => {
1108
+ const pos = positionMap[name];
1109
+ return pos.originX === newPosition.originX &&
1110
+ pos.originY === newPosition.originY &&
1111
+ pos.overlayX === newPosition.overlayX &&
1112
+ pos.overlayY === newPosition.overlayY;
1113
+ });
1114
+ if (newPositionName) {
1115
+ this.tooltipRef().setInput('position', newPositionName);
1116
+ this.tooltipRef().changeDetectorRef.detectChanges();
1117
+ }
1118
+ });
1119
+ });
1065
1120
  }
1066
1121
  ngOnInit() {
1067
1122
  this.tooltipPortal = new ComponentPortal(FwTooltipPanelComponent, this.viewContainerRef);
1068
1123
  this.overlayRef.set(this.overlayService.create());
1069
1124
  }
1070
1125
  showTooltip() {
1071
- if (!this.enabled()) {
1126
+ if (!this.enabled() || !this.title()) {
1072
1127
  return;
1073
1128
  }
1074
1129
  const overlayRef = this.overlayRef();
@@ -1081,20 +1136,23 @@ class FwTooltipDirective {
1081
1136
  this.tooltipRef.set(tooltipRef);
1082
1137
  tooltipRef.setInput('title', this.title());
1083
1138
  tooltipRef.setInput('position', this.position());
1139
+ tooltipRef.setInput('maxWidth', this.maxWidth());
1140
+ tooltipRef.setInput('displayCaret', this.displayCaret());
1084
1141
  tooltipRef.changeDetectorRef.detectChanges();
1085
1142
  }, this.delayMs());
1086
1143
  }
1087
1144
  hideTooltip() {
1088
- const animationDelayMs = 200;
1089
- this.closeDelayTimer = window.setTimeout(() => {
1090
- window.clearTimeout(this.openDelayTimer);
1091
- this.openDelayTimer = undefined;
1092
- this.overlayRef().detach();
1093
- this.tooltipRef.set(undefined);
1094
- }, animationDelayMs);
1145
+ window.clearTimeout(this.openDelayTimer);
1146
+ this.openDelayTimer = undefined;
1147
+ this.overlayRef().detach();
1148
+ this.tooltipRef.set(undefined);
1149
+ }
1150
+ ngOnDestroy() {
1151
+ this.positionChangeSub.unsubscribe();
1152
+ this.hideTooltip();
1095
1153
  }
1096
1154
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1097
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.12", type: FwTooltipDirective, isStandalone: true, selector: "[fwTooltip]", inputs: { delayMs: { classPropertyName: "delayMs", publicName: "fwTooltipDelay", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "fwTooltip", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "fwTooltipPosition", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "fwTooltipMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "fwTooltipEnabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { title: "fwTooltipChange", position: "fwTooltipPositionChange", maxWidth: "fwTooltipMaxWidthPxChange", enabled: "fwTooltipEnabledChange" }, ngImport: i0 }); }
1155
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.12", type: FwTooltipDirective, isStandalone: true, selector: "[fwTooltip]", inputs: { title: { classPropertyName: "title", publicName: "fwTooltip", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "fwTooltipPosition", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "fwTooltipMaxWidthPx", isSignal: true, isRequired: false, transformFunction: null }, delayMs: { classPropertyName: "delayMs", publicName: "fwTooltipDelay", isSignal: true, isRequired: false, transformFunction: null }, displayCaret: { classPropertyName: "displayCaret", publicName: "fwTooltipCaret", isSignal: true, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "fwTooltipEnabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { title: "fwTooltipChange", position: "fwTooltipPositionChange", maxWidth: "fwTooltipMaxWidthPxChange", enabled: "fwTooltipEnabledChange" }, ngImport: i0 }); }
1098
1156
  }
1099
1157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTooltipDirective, decorators: [{
1100
1158
  type: Directive,
@@ -1106,7 +1164,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1106
1164
 
1107
1165
  /**
1108
1166
  * component for giving extra context when a user hovers something
1109
- * @see [Vision Docs](https://cdn.flywheel.io/docs/vision/master/?path=/docs/components-tooltip--docs)
1167
+ * @deprecated use the [tooltip directive](https://cdn.flywheel.io/docs/vision/master/?path=/docs/components-tooltip--docs) instead, intend to remove in v3
1168
+ * @see [Vision Docs](https://cdn.flywheel.io/docs/vision/master/?path=/docs/components-wrapped-tooltip--docs)
1110
1169
  */
1111
1170
  class FwTooltipComponent {
1112
1171
  constructor() {
@@ -1131,7 +1190,7 @@ class FwTooltipComponent {
1131
1190
  }
1132
1191
  ;
1133
1192
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1134
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.12", type: FwTooltipComponent, selector: "fw-tooltip", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: false, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: false, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: false, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: false, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.class": "this.classes", "attr.title": "this.attrTitle" } }, ngImport: i0, template: "<div\n [ngClass]=\"['tooltip-trigger',fullWidth?'full-width':'']\"\n [fwTooltip]=\"title\"\n [fwTooltipDelay]=\"delay()\"\n [fwTooltipPosition]=\"position\">\n <ng-content></ng-content>\n</div>\n", styles: [":host.full-width{flex:1;display:flex;width:stretch}:host.full-width button{flex:1}:host .tooltip-trigger{width:fit-content;display:inline-block}:host .tooltip-trigger.full-width{flex:1;display:flex;width:stretch}:host .tooltip-trigger.full-width button{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: FwTooltipDirective, selector: "[fwTooltip]", inputs: ["fwTooltipDelay", "fwTooltip", "fwTooltipPosition", "fwTooltipMaxWidthPx", "fwTooltipEnabled"], outputs: ["fwTooltipChange", "fwTooltipPositionChange", "fwTooltipMaxWidthPxChange", "fwTooltipEnabledChange"] }] }); }
1193
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.12", type: FwTooltipComponent, selector: "fw-tooltip", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: false, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: false, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: false, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: false, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: false, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.class": "this.classes", "attr.title": "this.attrTitle" } }, ngImport: i0, template: "<div\n [ngClass]=\"['tooltip-trigger',fullWidth?'full-width':'']\"\n [fwTooltip]=\"title\"\n [fwTooltipDelay]=\"delay()\"\n [fwTooltipPosition]=\"position\">\n <ng-content></ng-content>\n</div>\n", styles: [":host.full-width{flex:1;display:flex;width:stretch}:host.full-width button{flex:1}:host .tooltip-trigger{width:fit-content;display:inline-block}:host .tooltip-trigger.full-width{flex:1;display:flex;width:stretch}:host .tooltip-trigger.full-width button{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: FwTooltipDirective, selector: "[fwTooltip]", inputs: ["fwTooltip", "fwTooltipPosition", "fwTooltipMaxWidthPx", "fwTooltipDelay", "fwTooltipCaret", "fwTooltipEnabled"], outputs: ["fwTooltipChange", "fwTooltipPositionChange", "fwTooltipMaxWidthPxChange", "fwTooltipEnabledChange"] }] }); }
1135
1194
  }
1136
1195
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTooltipComponent, decorators: [{
1137
1196
  type: Component,
@@ -1207,6 +1266,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1207
1266
  */
1208
1267
  class FwAvatarListComponent {
1209
1268
  constructor() {
1269
+ this.subscriptions = [];
1210
1270
  this.hostElement = inject(ElementRef);
1211
1271
  this.avatars = contentChildren(FwAvatarComponent);
1212
1272
  this.avatarElementRefs = contentChildren(FwAvatarComponent, { read: ElementRef });
@@ -1220,63 +1280,62 @@ class FwAvatarListComponent {
1220
1280
  });
1221
1281
  this.childrenChanged = effect(() => {
1222
1282
  this.avatarElementRefs();
1223
- this.calcChipOverflow();
1283
+ this.calcOverflow();
1224
1284
  }, { allowSignalWrites: true });
1225
1285
  this.hiddenAvatars = signal([]);
1226
1286
  }
1227
1287
  ngOnInit() {
1228
1288
  // wire up resize observer to rxjs and debouce
1229
- const resize$ = new BehaviorSubject(null);
1230
- const recalcOnResize$ = resize$.pipe(distinctUntilChanged(), debounce(() => timer(this.resizeDebounceMs())));
1289
+ const resize$ = new BehaviorSubject([]);
1290
+ const recalcOnResize$ = resize$.pipe(debounce(() => timer(this.resizeDebounceMs())), // debounce otherwise it can run EVERY frame
1291
+ distinctUntilChanged());
1231
1292
  const resizeObserver = new ResizeObserver((resizeEntries) => {
1232
1293
  resize$.next(resizeEntries);
1233
1294
  });
1234
1295
  resizeObserver.observe(this.hostElement.nativeElement, {});
1235
- recalcOnResize$.subscribe(() => this.calcChipOverflow());
1296
+ const sub = recalcOnResize$.subscribe(() => this.calcOverflow());
1297
+ this.subscriptions.push(sub);
1236
1298
  }
1237
- calcChipOverflow() {
1299
+ calcOverflow() {
1238
1300
  const hostRect = this.hostElement.nativeElement.getBoundingClientRect();
1239
1301
  const avatarElements = this.avatarElementRefs().map(ref => ref.nativeElement);
1240
1302
  const moreTextElement = this.moreText().nativeElement;
1241
- avatarElements.forEach(chip => chip.classList.remove('hidden'));
1303
+ avatarElements.forEach(avatar => avatar.classList.remove('hidden'));
1242
1304
  moreTextElement.classList.remove('hidden');
1243
- const visibleChips = avatarElements.filter(chip => {
1244
- const chipRect = chip.getBoundingClientRect();
1245
- return !(chipRect.right > hostRect.right || chipRect.bottom > hostRect.bottom);
1305
+ const visibleAvatars = avatarElements.filter(avatar => {
1306
+ const avatarRect = avatar.getBoundingClientRect();
1307
+ return !(avatarRect.right > hostRect.right || avatarRect.bottom > hostRect.bottom);
1246
1308
  });
1247
- const overflowingAvatars = avatarElements.toSpliced(0, visibleChips.length);
1309
+ const overflowingAvatars = avatarElements.toSpliced(0, visibleAvatars.length);
1248
1310
  if (overflowingAvatars.length > 0) {
1249
- const lastVisibleAvatar = visibleChips[visibleChips.length - 1];
1311
+ const lastVisibleAvatar = visibleAvatars[visibleAvatars.length - 1];
1250
1312
  const enoughRoomForMoreText = (hostRect.right - lastVisibleAvatar.getBoundingClientRect().right) > (moreTextElement.offsetWidth);
1251
1313
  if (!enoughRoomForMoreText) {
1252
1314
  overflowingAvatars.push(lastVisibleAvatar);
1253
1315
  }
1254
- // avatars are less wide than the text so we might need to hide 2 to make room for the text
1255
- // there's probably a fancy recursive solution here but ehhh
1256
- const secondLastVisibleAvatar = visibleChips[visibleChips.length - 2];
1257
- const needEvenMoreSpace = (hostRect.right - secondLastVisibleAvatar.getBoundingClientRect().right) > (moreTextElement.offsetWidth);
1258
- if (!needEvenMoreSpace) {
1259
- overflowingAvatars.push(secondLastVisibleAvatar);
1260
- }
1261
1316
  this.hiddenAvatars.set(overflowingAvatars);
1262
- overflowingAvatars.forEach(hiddenChip => {
1263
- hiddenChip.classList.add('hidden');
1317
+ overflowingAvatars.forEach(overflowAvatar => {
1318
+ overflowAvatar.classList.add('hidden');
1264
1319
  });
1265
1320
  }
1266
1321
  else {
1267
1322
  this.moreText().nativeElement.classList.add('hidden');
1268
1323
  }
1324
+ // eslint-disable-next-line @rx-angular/no-explicit-change-detection-apis
1269
1325
  this.changeDetector.detectChanges();
1270
1326
  }
1327
+ ngOnDestroy() {
1328
+ this.subscriptions.forEach(sub => sub.unsubscribe());
1329
+ }
1271
1330
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwAvatarListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1272
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: FwAvatarListComponent, isStandalone: true, selector: "fw-avatar-list", inputs: { resizeDebounceMs: { classPropertyName: "resizeDebounceMs", publicName: "resizeDebounceMs", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "avatars", predicate: FwAvatarComponent, isSignal: true }, { propertyName: "avatarElementRefs", predicate: FwAvatarComponent, read: ElementRef, isSignal: true }], viewQueries: [{ propertyName: "moreText", first: true, predicate: ["moreText"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content select=\"fw-avatar\"></ng-content>\n<fw-tooltip> <!--TODO: figure out how to get a tooltip-->\n <p #moreText> +{{hiddenAvatars().length}} </p>\n</fw-tooltip>\n", styles: [":host{display:flex;align-items:center;flex-basis:max-content;flex-flow:row nowrap;justify-content:flex-start;max-height:36px;overflow:hidden}:host ::ng-deep fw-avatar:not(:first-child){margin-left:-4px}:host p{line-height:100%;cursor:default;margin:0;padding-left:8px;text-wrap:nowrap;color:var(--typography-muted)}:host::ng-deep .hidden{display:none}\n"], dependencies: [{ kind: "ngmodule", type: FwAvatarModule }, { kind: "ngmodule", type: FwTooltipModule }, { kind: "component", type: FwTooltipComponent, selector: "fw-tooltip", inputs: ["title", "color", "position", "maxWidth", "fullWidth", "isOpen", "trigger", "delay"] }] }); }
1331
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: FwAvatarListComponent, isStandalone: true, selector: "fw-avatar-list", inputs: { resizeDebounceMs: { classPropertyName: "resizeDebounceMs", publicName: "resizeDebounceMs", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "avatars", predicate: FwAvatarComponent, isSignal: true }, { propertyName: "avatarElementRefs", predicate: FwAvatarComponent, read: ElementRef, isSignal: true }], viewQueries: [{ propertyName: "moreText", first: true, predicate: ["moreText"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content select=\"fw-avatar\"></ng-content>\n<fw-tooltip> <!--TODO: figure out how to get a tooltip-->\n <p #moreText> +{{hiddenAvatars().length}} </p>\n</fw-tooltip>\n", styles: [":host{display:flex;align-items:center;flex-basis:max-content;flex-flow:row nowrap;justify-content:flex-start;min-height:36px;max-height:36px;overflow:hidden}:host ::ng-deep fw-avatar:not(:first-child){margin-left:-4px}:host p{line-height:100%;cursor:default;margin:0;text-align:center;padding-left:8px;text-wrap:nowrap;color:var(--typography-muted)}:host::ng-deep .hidden{display:none}\n"], dependencies: [{ kind: "ngmodule", type: FwAvatarModule }, { kind: "ngmodule", type: FwTooltipModule }, { kind: "component", type: FwTooltipComponent, selector: "fw-tooltip", inputs: ["title", "color", "position", "maxWidth", "fullWidth", "isOpen", "trigger", "delay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1273
1332
  }
1274
1333
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwAvatarListComponent, decorators: [{
1275
1334
  type: Component,
1276
1335
  args: [{ selector: 'fw-avatar-list', standalone: true, imports: [
1277
1336
  FwAvatarModule,
1278
1337
  FwTooltipModule,
1279
- ], template: "<ng-content select=\"fw-avatar\"></ng-content>\n<fw-tooltip> <!--TODO: figure out how to get a tooltip-->\n <p #moreText> +{{hiddenAvatars().length}} </p>\n</fw-tooltip>\n", styles: [":host{display:flex;align-items:center;flex-basis:max-content;flex-flow:row nowrap;justify-content:flex-start;max-height:36px;overflow:hidden}:host ::ng-deep fw-avatar:not(:first-child){margin-left:-4px}:host p{line-height:100%;cursor:default;margin:0;padding-left:8px;text-wrap:nowrap;color:var(--typography-muted)}:host::ng-deep .hidden{display:none}\n"] }]
1338
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content select=\"fw-avatar\"></ng-content>\n<fw-tooltip> <!--TODO: figure out how to get a tooltip-->\n <p #moreText> +{{hiddenAvatars().length}} </p>\n</fw-tooltip>\n", styles: [":host{display:flex;align-items:center;flex-basis:max-content;flex-flow:row nowrap;justify-content:flex-start;min-height:36px;max-height:36px;overflow:hidden}:host ::ng-deep fw-avatar:not(:first-child){margin-left:-4px}:host p{line-height:100%;cursor:default;margin:0;text-align:center;padding-left:8px;text-wrap:nowrap;color:var(--typography-muted)}:host::ng-deep .hidden{display:none}\n"] }]
1280
1339
  }] });
1281
1340
 
1282
1341
  class FwBadgeComponent {
@@ -3157,6 +3216,7 @@ class FwDialogConfirmComponent {
3157
3216
  this.confirmButtonIcon = 'done-check';
3158
3217
  this.cancelButtonText = 'Cancel';
3159
3218
  this.contentTitle = 'Are you sure?';
3219
+ this.showConfirmButtonIcon = true;
3160
3220
  this.showClose = false;
3161
3221
  this.width = 'extra-small';
3162
3222
  // eslint-disable-next-line @angular-eslint/no-output-native
@@ -3205,11 +3265,11 @@ class FwDialogConfirmComponent {
3205
3265
  }, 300);
3206
3266
  }
3207
3267
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwDialogConfirmComponent, deps: [{ token: i1$3.DialogRef, optional: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
3208
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwDialogConfirmComponent, selector: "fw-dialog-confirm", inputs: { title: "title", icon: "icon", iconColor: "iconColor", confirmColor: "confirmColor", confirmButtonText: "confirmButtonText", confirmButtonIcon: "confirmButtonIcon", cancelButtonText: "cancelButtonText", contentIcon: "contentIcon", contentTitle: "contentTitle", contentText: "contentText", showClose: "showClose", width: "width", externalClasses: ["class", "externalClasses"] }, outputs: { close: "close", confirm: "confirm" }, host: { properties: { "class": "this.classes" } }, ngImport: i0, template: "<fw-dialog\n [width]=\"width\"\n [title]=\"title\"\n [icon]=\"icon\"\n [iconColor]=\"iconColor\"\n [showClose]=\"showClose\"\n [ngClass]=\"dialogClasses\">\n <fw-dialog-content>\n <div class=\"dialog-content-confirm\">\n <fw-icon class=\"content-icon\" [ngClass]=\"confirmColor\" *ngIf=\"contentIcon\">\n {{ contentIcon }}\n </fw-icon>\n <p class=\"vision-p2 content-title\" *ngIf=\"contentTitle\">\n {{ contentTitle }}\n </p>\n <p class=\"vision-p2 content-text\" *ngIf=\"contentText\">\n {{ contentText }}\n </p>\n </div>\n </fw-dialog-content>\n <fw-dialog-actions>\n <fw-button\n variant=\"outline\"\n *ngIf=\"cancelButtonText\"\n color=\"slate\"\n (click)=\"handleCloseButton()\">\n {{ cancelButtonText }}\n </fw-button>\n <fw-button\n variant=\"solid\"\n *ngIf=\"confirmButtonText\"\n [color]=\"confirmColor\"\n [leftIcon]=\"confirmButtonIcon\"\n (click)=\"confirm.emit()\">\n {{ confirmButtonText }}\n </fw-button>\n </fw-dialog-actions>\n</fw-dialog>\n", styles: ["@keyframes slide-in-from-bottom{0%{opacity:0;transform:translateY(100vh)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{opacity:1;transform:translateY(0)}99%{opacity:0;transform:translateY(100vh)}to{opacity:0;transform:translateY(100vh)}}:host{box-sizing:border-box;animation:slide-in-from-bottom .3s ease-out}:host.dialog-closing{animation:slide-out-to-bottom .3s ease-in forwards}:host .fw-dialog-confirm{position:relative}.dialog-content-confirm{display:flex;flex-direction:column;padding:50px;align-items:center;justify-content:center}.dialog-content-confirm .content-title{margin-bottom:5px;font-weight:500}.dialog-content-confirm .content-text{margin:0;color:var(--typography-muted)}.dialog-content-confirm .content-icon{font-size:50px}.dialog-content-confirm .content-icon.primary{color:var(--primary-base)}.dialog-content-confirm .content-icon.secondary{color:var(--secondary-base)}.dialog-content-confirm .content-icon.slate{color:var(--slate-base)}.dialog-content-confirm .content-icon.success{color:var(--green-base)}.dialog-content-confirm .content-icon.warning{color:var(--orange-base)}.dialog-content-confirm .content-icon.danger{color:var(--red-base)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FwButtonComponent, selector: "fw-button", inputs: ["color", "size", "variant", "type", "disabled", "fullWidth", "leftIcon", "rightIcon"] }, { kind: "component", type: FwIconComponent, selector: "fw-icon", inputs: ["size", "color"] }, { kind: "component", type: FwDialogActionsComponent, selector: "fw-dialog-actions" }, { kind: "component", type: FwDialogComponent, selector: "fw-dialog", inputs: ["width", "title", "icon", "iconColor", "showClose", "class"], outputs: ["close"] }, { kind: "component", type: FwDialogContentComponent, selector: "fw-dialog-content", inputs: ["padded"] }] }); }
3268
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwDialogConfirmComponent, selector: "fw-dialog-confirm", inputs: { title: "title", icon: "icon", iconColor: "iconColor", confirmColor: "confirmColor", confirmButtonText: "confirmButtonText", confirmButtonIcon: "confirmButtonIcon", cancelButtonText: "cancelButtonText", contentIcon: "contentIcon", contentTitle: "contentTitle", contentText: "contentText", showConfirmButtonIcon: "showConfirmButtonIcon", showClose: "showClose", width: "width", externalClasses: ["class", "externalClasses"] }, outputs: { close: "close", confirm: "confirm" }, host: { properties: { "class": "this.classes" } }, ngImport: i0, template: "<fw-dialog\n [width]=\"width\"\n [title]=\"title\"\n [icon]=\"icon\"\n [iconColor]=\"iconColor\"\n [showClose]=\"showClose\"\n [ngClass]=\"dialogClasses\">\n <fw-dialog-content>\n <div class=\"dialog-content-confirm\">\n <fw-icon class=\"content-icon\" [ngClass]=\"confirmColor\" *ngIf=\"contentIcon\">\n {{ contentIcon }}\n </fw-icon>\n <p class=\"vision-p2 content-title\" *ngIf=\"contentTitle\">\n {{ contentTitle }}\n </p>\n <p class=\"vision-p2 content-text\" *ngIf=\"contentText\">\n {{ contentText }}\n </p>\n </div>\n </fw-dialog-content>\n <fw-dialog-actions>\n <fw-button\n variant=\"outline\"\n *ngIf=\"cancelButtonText\"\n color=\"slate\"\n (click)=\"handleCloseButton()\">\n {{ cancelButtonText }}\n </fw-button>\n <fw-button\n variant=\"solid\"\n *ngIf=\"confirmButtonText\"\n [color]=\"confirmColor\"\n [leftIcon]=\"showConfirmButtonIcon ? confirmButtonIcon : null\"\n (click)=\"confirm.emit()\">\n {{ confirmButtonText }}\n </fw-button>\n </fw-dialog-actions>\n</fw-dialog>\n", styles: ["@keyframes slide-in-from-bottom{0%{opacity:0;transform:translateY(100vh)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{opacity:1;transform:translateY(0)}99%{opacity:0;transform:translateY(100vh)}to{opacity:0;transform:translateY(100vh)}}:host{box-sizing:border-box;animation:slide-in-from-bottom .3s ease-out}:host.dialog-closing{animation:slide-out-to-bottom .3s ease-in forwards}:host .fw-dialog-confirm{position:relative}.dialog-content-confirm{display:flex;flex-direction:column;padding:50px;align-items:center;justify-content:center}.dialog-content-confirm .content-title{margin-bottom:5px;font-weight:500}.dialog-content-confirm .content-text{margin:0;color:var(--typography-muted)}.dialog-content-confirm .content-icon{font-size:50px}.dialog-content-confirm .content-icon.primary{color:var(--primary-base)}.dialog-content-confirm .content-icon.secondary{color:var(--secondary-base)}.dialog-content-confirm .content-icon.slate{color:var(--slate-base)}.dialog-content-confirm .content-icon.success{color:var(--green-base)}.dialog-content-confirm .content-icon.warning{color:var(--orange-base)}.dialog-content-confirm .content-icon.danger{color:var(--red-base)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FwButtonComponent, selector: "fw-button", inputs: ["color", "size", "variant", "type", "disabled", "fullWidth", "leftIcon", "rightIcon"] }, { kind: "component", type: FwIconComponent, selector: "fw-icon", inputs: ["size", "color"] }, { kind: "component", type: FwDialogActionsComponent, selector: "fw-dialog-actions" }, { kind: "component", type: FwDialogComponent, selector: "fw-dialog", inputs: ["width", "title", "icon", "iconColor", "showClose", "class"], outputs: ["close"] }, { kind: "component", type: FwDialogContentComponent, selector: "fw-dialog-content", inputs: ["padded"] }] }); }
3209
3269
  }
3210
3270
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwDialogConfirmComponent, decorators: [{
3211
3271
  type: Component,
3212
- args: [{ selector: 'fw-dialog-confirm', template: "<fw-dialog\n [width]=\"width\"\n [title]=\"title\"\n [icon]=\"icon\"\n [iconColor]=\"iconColor\"\n [showClose]=\"showClose\"\n [ngClass]=\"dialogClasses\">\n <fw-dialog-content>\n <div class=\"dialog-content-confirm\">\n <fw-icon class=\"content-icon\" [ngClass]=\"confirmColor\" *ngIf=\"contentIcon\">\n {{ contentIcon }}\n </fw-icon>\n <p class=\"vision-p2 content-title\" *ngIf=\"contentTitle\">\n {{ contentTitle }}\n </p>\n <p class=\"vision-p2 content-text\" *ngIf=\"contentText\">\n {{ contentText }}\n </p>\n </div>\n </fw-dialog-content>\n <fw-dialog-actions>\n <fw-button\n variant=\"outline\"\n *ngIf=\"cancelButtonText\"\n color=\"slate\"\n (click)=\"handleCloseButton()\">\n {{ cancelButtonText }}\n </fw-button>\n <fw-button\n variant=\"solid\"\n *ngIf=\"confirmButtonText\"\n [color]=\"confirmColor\"\n [leftIcon]=\"confirmButtonIcon\"\n (click)=\"confirm.emit()\">\n {{ confirmButtonText }}\n </fw-button>\n </fw-dialog-actions>\n</fw-dialog>\n", styles: ["@keyframes slide-in-from-bottom{0%{opacity:0;transform:translateY(100vh)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{opacity:1;transform:translateY(0)}99%{opacity:0;transform:translateY(100vh)}to{opacity:0;transform:translateY(100vh)}}:host{box-sizing:border-box;animation:slide-in-from-bottom .3s ease-out}:host.dialog-closing{animation:slide-out-to-bottom .3s ease-in forwards}:host .fw-dialog-confirm{position:relative}.dialog-content-confirm{display:flex;flex-direction:column;padding:50px;align-items:center;justify-content:center}.dialog-content-confirm .content-title{margin-bottom:5px;font-weight:500}.dialog-content-confirm .content-text{margin:0;color:var(--typography-muted)}.dialog-content-confirm .content-icon{font-size:50px}.dialog-content-confirm .content-icon.primary{color:var(--primary-base)}.dialog-content-confirm .content-icon.secondary{color:var(--secondary-base)}.dialog-content-confirm .content-icon.slate{color:var(--slate-base)}.dialog-content-confirm .content-icon.success{color:var(--green-base)}.dialog-content-confirm .content-icon.warning{color:var(--orange-base)}.dialog-content-confirm .content-icon.danger{color:var(--red-base)}\n"] }]
3272
+ args: [{ selector: 'fw-dialog-confirm', template: "<fw-dialog\n [width]=\"width\"\n [title]=\"title\"\n [icon]=\"icon\"\n [iconColor]=\"iconColor\"\n [showClose]=\"showClose\"\n [ngClass]=\"dialogClasses\">\n <fw-dialog-content>\n <div class=\"dialog-content-confirm\">\n <fw-icon class=\"content-icon\" [ngClass]=\"confirmColor\" *ngIf=\"contentIcon\">\n {{ contentIcon }}\n </fw-icon>\n <p class=\"vision-p2 content-title\" *ngIf=\"contentTitle\">\n {{ contentTitle }}\n </p>\n <p class=\"vision-p2 content-text\" *ngIf=\"contentText\">\n {{ contentText }}\n </p>\n </div>\n </fw-dialog-content>\n <fw-dialog-actions>\n <fw-button\n variant=\"outline\"\n *ngIf=\"cancelButtonText\"\n color=\"slate\"\n (click)=\"handleCloseButton()\">\n {{ cancelButtonText }}\n </fw-button>\n <fw-button\n variant=\"solid\"\n *ngIf=\"confirmButtonText\"\n [color]=\"confirmColor\"\n [leftIcon]=\"showConfirmButtonIcon ? confirmButtonIcon : null\"\n (click)=\"confirm.emit()\">\n {{ confirmButtonText }}\n </fw-button>\n </fw-dialog-actions>\n</fw-dialog>\n", styles: ["@keyframes slide-in-from-bottom{0%{opacity:0;transform:translateY(100vh)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{opacity:1;transform:translateY(0)}99%{opacity:0;transform:translateY(100vh)}to{opacity:0;transform:translateY(100vh)}}:host{box-sizing:border-box;animation:slide-in-from-bottom .3s ease-out}:host.dialog-closing{animation:slide-out-to-bottom .3s ease-in forwards}:host .fw-dialog-confirm{position:relative}.dialog-content-confirm{display:flex;flex-direction:column;padding:50px;align-items:center;justify-content:center}.dialog-content-confirm .content-title{margin-bottom:5px;font-weight:500}.dialog-content-confirm .content-text{margin:0;color:var(--typography-muted)}.dialog-content-confirm .content-icon{font-size:50px}.dialog-content-confirm .content-icon.primary{color:var(--primary-base)}.dialog-content-confirm .content-icon.secondary{color:var(--secondary-base)}.dialog-content-confirm .content-icon.slate{color:var(--slate-base)}.dialog-content-confirm .content-icon.success{color:var(--green-base)}.dialog-content-confirm .content-icon.warning{color:var(--orange-base)}.dialog-content-confirm .content-icon.danger{color:var(--red-base)}\n"] }]
3213
3273
  }], ctorParameters: () => [{ type: i1$3.DialogRef, decorators: [{
3214
3274
  type: Optional
3215
3275
  }] }, { type: i0.ElementRef }], propDecorators: { title: [{
@@ -3232,6 +3292,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3232
3292
  type: Input
3233
3293
  }], contentText: [{
3234
3294
  type: Input
3295
+ }], showConfirmButtonIcon: [{
3296
+ type: Input
3235
3297
  }], showClose: [{
3236
3298
  type: Input
3237
3299
  }], width: [{
@@ -3544,16 +3606,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3544
3606
  }]
3545
3607
  }] });
3546
3608
 
3609
+ class FwTagComponent {
3610
+ constructor() {
3611
+ this.size = 'small';
3612
+ this.color = 'slate';
3613
+ }
3614
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3615
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwTagComponent, selector: "fw-tag", inputs: { size: "size", color: "color", icon: "icon", title: "title" }, ngImport: i0, template: "<div [ngClass]=\"['tag', 'tag-'+size, 'tag-'+color]\">\n <fw-icon *ngIf=\"icon\" class=\"tag-icon\">{{ icon }}</fw-icon>\n <div class=\"tag-text\" *ngIf=\"title\">\n <span>{{ title }}</span>\n </div>\n</div>\n", styles: [".tag{box-sizing:border-box;border-radius:4px;padding:0 6px 0 4px;display:inline-flex;gap:4px;align-items:center}.tag .tag-text{font-family:Inter,sans-serif;font-size:10px;font-style:normal;font-weight:500;line-height:120%;white-space:wrap}.tag.tag-small{height:16px}.tag.tag-small .tag-icon{align-items:flex-start;font-size:12px;min-width:12px;width:12px}.tag.tag-large{height:24px}.tag.tag-large .tag-icon{align-items:flex-start;font-size:16px;min-width:16px;width:16px}.tag.tag-slate{color:var(--slate-base);background-color:var(--slate-hover)}.tag.tag-slate:hover{background-color:var(--slate-focus)}.tag.tag-primary{color:var(--primary-base);background-color:var(--primary-hover)}.tag.tag-primary:hover{background-color:var(--primary-focus)}.tag.tag-secondary{color:var(--secondary-base);background-color:var(--secondary-hover)}.tag.tag-secondary:hover{background-color:var(--secondary-focus)}.tag.tag-orange{color:var(--orange-base);background-color:var(--orange-hover)}.tag.tag-orange:hover{background-color:var(--orange-focus)}.tag.tag-green{color:var(--green-base);background-color:var(--green-hover)}.tag.tag-green:hover{background-color:var(--green-focus)}.tag.tag-red{color:var(--red-base);background-color:var(--red-hover)}.tag.tag-red:hover{background-color:var(--red-focus)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FwIconComponent, selector: "fw-icon", inputs: ["size", "color"] }] }); }
3616
+ }
3617
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTagComponent, decorators: [{
3618
+ type: Component,
3619
+ args: [{ selector: 'fw-tag', template: "<div [ngClass]=\"['tag', 'tag-'+size, 'tag-'+color]\">\n <fw-icon *ngIf=\"icon\" class=\"tag-icon\">{{ icon }}</fw-icon>\n <div class=\"tag-text\" *ngIf=\"title\">\n <span>{{ title }}</span>\n </div>\n</div>\n", styles: [".tag{box-sizing:border-box;border-radius:4px;padding:0 6px 0 4px;display:inline-flex;gap:4px;align-items:center}.tag .tag-text{font-family:Inter,sans-serif;font-size:10px;font-style:normal;font-weight:500;line-height:120%;white-space:wrap}.tag.tag-small{height:16px}.tag.tag-small .tag-icon{align-items:flex-start;font-size:12px;min-width:12px;width:12px}.tag.tag-large{height:24px}.tag.tag-large .tag-icon{align-items:flex-start;font-size:16px;min-width:16px;width:16px}.tag.tag-slate{color:var(--slate-base);background-color:var(--slate-hover)}.tag.tag-slate:hover{background-color:var(--slate-focus)}.tag.tag-primary{color:var(--primary-base);background-color:var(--primary-hover)}.tag.tag-primary:hover{background-color:var(--primary-focus)}.tag.tag-secondary{color:var(--secondary-base);background-color:var(--secondary-hover)}.tag.tag-secondary:hover{background-color:var(--secondary-focus)}.tag.tag-orange{color:var(--orange-base);background-color:var(--orange-hover)}.tag.tag-orange:hover{background-color:var(--orange-focus)}.tag.tag-green{color:var(--green-base);background-color:var(--green-hover)}.tag.tag-green:hover{background-color:var(--green-focus)}.tag.tag-red{color:var(--red-base);background-color:var(--red-hover)}.tag.tag-red:hover{background-color:var(--red-focus)}\n"] }]
3620
+ }], propDecorators: { size: [{
3621
+ type: Input
3622
+ }], color: [{
3623
+ type: Input
3624
+ }], icon: [{
3625
+ type: Input
3626
+ }], title: [{
3627
+ type: Input
3628
+ }] } });
3629
+
3547
3630
  class FwFormHeadingComponent {
3548
3631
  constructor() {
3549
3632
  this.class = 'fw-form-heading';
3633
+ this.statusColor = 'slate';
3550
3634
  }
3551
3635
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwFormHeadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3552
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwFormHeadingComponent, selector: "fw-form-heading", inputs: { title: "title", description: "description", status: "status" }, host: { properties: { "attr.class": "this.class" } }, ngImport: i0, template: "<div class=\"heading-area\">\n <div>\n <h4 class=\"vision-h4 section-heading\">{{ title }}\n <span *ngIf=\"status\" class=\"status\">{{ status.toUpperCase() }}</span>\n <ng-content select=\"fw-tooltip\"></ng-content>\n <ng-content select=\"fw-icon\"></ng-content>\n <ng-content select=\"fw-chip\"></ng-content>\n </h4>\n <p class=\"vision-p3\" *ngIf=\"description\">{{ description }}</p>\n <ng-content select=\"p\"></ng-content>\n </div>\n</div>\n<div class=\"right-content\">\n <ng-content></ng-content>\n</div>\n", styles: [".fw-form-heading{width:100%;display:flex;justify-content:space-between;align-items:center;gap:8px}.fw-form-heading .heading-area{display:flex;align-items:center;padding-left:4px;margin-bottom:8px}.fw-form-heading .heading-area h4{color:var(--typography-base);margin:0;display:flex;align-items:center;gap:5px}.fw-form-heading .heading-area h4 .status{color:var(--primary-base)}.fw-form-heading .heading-area p{color:var(--typography-muted);margin:0;line-height:140%;display:flex;align-items:center;gap:3px}.fw-form-heading .heading-area p a{color:var(--typography-muted)}.fw-form-heading .heading-area fw-icon.heading-icon{box-sizing:border-box;color:var(--primary-base);width:44px;height:44px;font-size:32px;text-align:center;justify-content:center;padding:6px}.fw-form-heading .right-content{display:flex;gap:8px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
3636
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwFormHeadingComponent, selector: "fw-form-heading", inputs: { title: "title", description: "description", required: "required", status: "status", statusColor: "statusColor" }, host: { properties: { "attr.class": "this.class" } }, ngImport: i0, template: "<div class=\"heading-area\">\n <div>\n <div class=\"section-heading\">\n <h4 class=\"vision-h4\">\n <span>{{ title }}</span>\n <span *ngIf=\"required\" class=\"required\">*</span>\n </h4>\n <fw-tag *ngIf=\"status\" [color]=\"statusColor\" [title]=\"status\"></fw-tag>\n <ng-content select=\"fw-tooltip\"></ng-content>\n <ng-content select=\"fw-icon\"></ng-content>\n <ng-content select=\"fw-chip\"></ng-content>\n </div>\n <p class=\"vision-p3\" *ngIf=\"description\">{{ description }}</p>\n <ng-content select=\"p\"></ng-content>\n </div>\n</div>\n<div class=\"right-content\">\n <ng-content></ng-content>\n</div>\n", styles: [".fw-form-heading{width:100%;display:flex;justify-content:space-between;align-items:center;gap:8px}.fw-form-heading .heading-area{display:flex;align-items:center;padding-left:4px;margin-bottom:8px}.fw-form-heading .heading-area .section-heading{display:flex;align-items:center;gap:5px}.fw-form-heading .heading-area h4{color:var(--typography-base);margin:0}.fw-form-heading .heading-area h4 .required{margin-left:4px;color:var(--red-base)}.fw-form-heading .heading-area p{color:var(--typography-muted);margin:0;line-height:140%;display:flex;align-items:center;gap:3px}.fw-form-heading .heading-area p a{color:var(--typography-muted)}.fw-form-heading .heading-area fw-icon.heading-icon{box-sizing:border-box;color:var(--primary-base);width:44px;height:44px;font-size:32px;text-align:center;justify-content:center;padding:6px}.fw-form-heading .right-content{display:flex;gap:8px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FwTagComponent, selector: "fw-tag", inputs: ["size", "color", "icon", "title"] }], encapsulation: i0.ViewEncapsulation.None }); }
3553
3637
  }
3554
3638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwFormHeadingComponent, decorators: [{
3555
3639
  type: Component,
3556
- args: [{ selector: 'fw-form-heading', encapsulation: ViewEncapsulation.None, template: "<div class=\"heading-area\">\n <div>\n <h4 class=\"vision-h4 section-heading\">{{ title }}\n <span *ngIf=\"status\" class=\"status\">{{ status.toUpperCase() }}</span>\n <ng-content select=\"fw-tooltip\"></ng-content>\n <ng-content select=\"fw-icon\"></ng-content>\n <ng-content select=\"fw-chip\"></ng-content>\n </h4>\n <p class=\"vision-p3\" *ngIf=\"description\">{{ description }}</p>\n <ng-content select=\"p\"></ng-content>\n </div>\n</div>\n<div class=\"right-content\">\n <ng-content></ng-content>\n</div>\n", styles: [".fw-form-heading{width:100%;display:flex;justify-content:space-between;align-items:center;gap:8px}.fw-form-heading .heading-area{display:flex;align-items:center;padding-left:4px;margin-bottom:8px}.fw-form-heading .heading-area h4{color:var(--typography-base);margin:0;display:flex;align-items:center;gap:5px}.fw-form-heading .heading-area h4 .status{color:var(--primary-base)}.fw-form-heading .heading-area p{color:var(--typography-muted);margin:0;line-height:140%;display:flex;align-items:center;gap:3px}.fw-form-heading .heading-area p a{color:var(--typography-muted)}.fw-form-heading .heading-area fw-icon.heading-icon{box-sizing:border-box;color:var(--primary-base);width:44px;height:44px;font-size:32px;text-align:center;justify-content:center;padding:6px}.fw-form-heading .right-content{display:flex;gap:8px}\n"] }]
3640
+ args: [{ selector: 'fw-form-heading', encapsulation: ViewEncapsulation.None, template: "<div class=\"heading-area\">\n <div>\n <div class=\"section-heading\">\n <h4 class=\"vision-h4\">\n <span>{{ title }}</span>\n <span *ngIf=\"required\" class=\"required\">*</span>\n </h4>\n <fw-tag *ngIf=\"status\" [color]=\"statusColor\" [title]=\"status\"></fw-tag>\n <ng-content select=\"fw-tooltip\"></ng-content>\n <ng-content select=\"fw-icon\"></ng-content>\n <ng-content select=\"fw-chip\"></ng-content>\n </div>\n <p class=\"vision-p3\" *ngIf=\"description\">{{ description }}</p>\n <ng-content select=\"p\"></ng-content>\n </div>\n</div>\n<div class=\"right-content\">\n <ng-content></ng-content>\n</div>\n", styles: [".fw-form-heading{width:100%;display:flex;justify-content:space-between;align-items:center;gap:8px}.fw-form-heading .heading-area{display:flex;align-items:center;padding-left:4px;margin-bottom:8px}.fw-form-heading .heading-area .section-heading{display:flex;align-items:center;gap:5px}.fw-form-heading .heading-area h4{color:var(--typography-base);margin:0}.fw-form-heading .heading-area h4 .required{margin-left:4px;color:var(--red-base)}.fw-form-heading .heading-area p{color:var(--typography-muted);margin:0;line-height:140%;display:flex;align-items:center;gap:3px}.fw-form-heading .heading-area p a{color:var(--typography-muted)}.fw-form-heading .heading-area fw-icon.heading-icon{box-sizing:border-box;color:var(--primary-base);width:44px;height:44px;font-size:32px;text-align:center;justify-content:center;padding:6px}.fw-form-heading .right-content{display:flex;gap:8px}\n"] }]
3557
3641
  }], ctorParameters: () => [], propDecorators: { class: [{
3558
3642
  type: HostBinding,
3559
3643
  args: ['attr.class']
@@ -3561,18 +3645,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3561
3645
  type: Input
3562
3646
  }], description: [{
3563
3647
  type: Input
3648
+ }], required: [{
3649
+ type: Input
3564
3650
  }], status: [{
3565
3651
  type: Input
3652
+ }], statusColor: [{
3653
+ type: Input
3566
3654
  }] } });
3567
3655
 
3656
+ class FwTagModule {
3657
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTagModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3658
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: FwTagModule, declarations: [FwTagComponent], imports: [CommonModule,
3659
+ FwIconModule], exports: [FwTagComponent] }); }
3660
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTagModule, imports: [CommonModule,
3661
+ FwIconModule] }); }
3662
+ }
3663
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTagModule, decorators: [{
3664
+ type: NgModule,
3665
+ args: [{
3666
+ imports: [
3667
+ CommonModule,
3668
+ FwIconModule,
3669
+ ],
3670
+ exports: [
3671
+ FwTagComponent,
3672
+ ],
3673
+ declarations: [
3674
+ FwTagComponent,
3675
+ ],
3676
+ }]
3677
+ }] });
3678
+
3568
3679
  class FwFormHeadingModule {
3569
3680
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwFormHeadingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3570
3681
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: FwFormHeadingModule, declarations: [FwFormHeadingComponent], imports: [CommonModule,
3571
3682
  FwButtonModule,
3572
- FwIconModule], exports: [FwFormHeadingComponent] }); }
3683
+ FwIconModule,
3684
+ FwTagModule], exports: [FwFormHeadingComponent] }); }
3573
3685
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwFormHeadingModule, imports: [CommonModule,
3574
3686
  FwButtonModule,
3575
- FwIconModule] }); }
3687
+ FwIconModule,
3688
+ FwTagModule] }); }
3576
3689
  }
3577
3690
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwFormHeadingModule, decorators: [{
3578
3691
  type: NgModule,
@@ -3581,6 +3694,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3581
3694
  CommonModule,
3582
3695
  FwButtonModule,
3583
3696
  FwIconModule,
3697
+ FwTagModule,
3584
3698
  ],
3585
3699
  exports: [
3586
3700
  FwFormHeadingComponent,
@@ -3676,36 +3790,36 @@ const allIcons = [
3676
3790
  'add-new-create',
3677
3791
  'add-row-above',
3678
3792
  'add-row-below',
3679
- 'add-server-databases-endpoint',
3680
3793
  'add-server',
3794
+ 'add-server-databases-endpoint',
3681
3795
  'add-user',
3682
3796
  'ai',
3683
3797
  'apple',
3684
3798
  'apply-copy-duplicate',
3685
3799
  'archive-documents-box-big',
3686
3800
  'arrange-filter-sort',
3801
+ 'arrow',
3687
3802
  'arrow-annotate',
3688
- 'arrow-back-collapse',
3689
3803
  'arrow-back',
3804
+ 'arrow-back-collapse',
3690
3805
  'arrow-down',
3691
- 'arrow-forward-collapse',
3692
3806
  'arrow-forward',
3807
+ 'arrow-forward-collapse',
3693
3808
  'arrow-redo',
3694
- 'arrow-rotate-restore',
3695
3809
  'arrow-rotate',
3810
+ 'arrow-rotate-restore',
3696
3811
  'arrow-undo',
3812
+ 'arrow-up',
3697
3813
  'arrow-up-high-priority',
3698
3814
  'arrow-up-low-priority',
3699
- 'arrow-up',
3700
- 'arrow',
3701
3815
  'barcode-serial',
3702
3816
  'barcode-stack-scan',
3703
3817
  'bell-notification',
3704
3818
  'bezier-curve',
3705
3819
  'blocks-code-test-checkmark',
3706
3820
  'book-lab-flask',
3707
- 'bookmark-plus-add',
3708
3821
  'bookmark',
3822
+ 'bookmark-plus-add',
3709
3823
  'brain',
3710
3824
  'brightness-photo-edit',
3711
3825
  'browser-internet-web-windows',
@@ -3721,22 +3835,22 @@ const allIcons = [
3721
3835
  'chart-trend-square',
3722
3836
  'chat-messages-bubble',
3723
3837
  'check-mark-certificate',
3724
- 'checklist-tasks-chechmark-square',
3725
3838
  'checklist',
3839
+ 'checklist-tasks-chechmark-square',
3726
3840
  'chevron-back',
3727
3841
  'chevron-down',
3728
3842
  'chevron-forward',
3729
3843
  'chevron-input-number',
3730
3844
  'chevron-up',
3731
- 'circle-ellipses',
3732
3845
  'circle',
3846
+ 'circle-ellipses',
3733
3847
  'clap-applause-hands',
3734
3848
  'clip-attachment',
3735
3849
  'clock-history',
3736
3850
  'clock-hour-4',
3737
3851
  'clock-loading',
3738
- 'close-circled',
3739
3852
  'close',
3853
+ 'close-circled',
3740
3854
  'closed-freehand-vector-poly',
3741
3855
  'cloud-network-add',
3742
3856
  'cloud-storage-checkmark',
@@ -3771,21 +3885,22 @@ const allIcons = [
3771
3885
  'document-file-zip',
3772
3886
  'document-status-done-checkmark',
3773
3887
  'document-visible',
3774
- 'documents-file-checkmark',
3775
3888
  'documents-file',
3889
+ 'documents-file-checkmark',
3890
+ 'documents-file-move-arrow-right',
3776
3891
  'documents-files',
3777
- 'done-check-tracked',
3778
3892
  'done-check',
3779
- 'download-status',
3893
+ 'done-check-tracked',
3780
3894
  'download',
3895
+ 'download-status',
3781
3896
  'drag-drop-indicator',
3782
3897
  'draw-rectangle',
3783
3898
  'earth-globe-fail',
3899
+ 'edit',
3784
3900
  'edit-boxed',
3785
3901
  'edit-erase',
3786
- 'edit',
3787
- 'email-mail-checkmark-group',
3788
3902
  'email',
3903
+ 'email-mail-checkmark-group',
3789
3904
  'embed-circle',
3790
3905
  'exchange',
3791
3906
  'expand-pathfinder-dot-square-segmentation',
@@ -3794,13 +3909,13 @@ const allIcons = [
3794
3909
  'file-blank-search',
3795
3910
  'file-download',
3796
3911
  'file-text',
3797
- 'files-library-content',
3798
- 'files-library',
3799
3912
  'files',
3913
+ 'files-library',
3914
+ 'files-library-content',
3915
+ 'filter',
3800
3916
  'filter-sort-add',
3801
3917
  'filter-sort-check-mark',
3802
3918
  'filter-sort-delete',
3803
- 'filter',
3804
3919
  'flag',
3805
3920
  'flip-horizontal',
3806
3921
  'flip-vertical',
@@ -3813,6 +3928,7 @@ const allIcons = [
3813
3928
  'folder-copy-expand-arrow-down',
3814
3929
  'folder-copy-expand-arrow-up',
3815
3930
  'folder-group',
3931
+ 'folder-move',
3816
3932
  'folder-open',
3817
3933
  'folder-share',
3818
3934
  'form-metadata-element',
@@ -3821,15 +3937,15 @@ const allIcons = [
3821
3937
  'full-screen-zoom',
3822
3938
  'git-add-branch',
3823
3939
  'git-branch',
3824
- 'git-merge-draft',
3825
3940
  'git-merge',
3941
+ 'git-merge-draft',
3826
3942
  'git-pull-request-2',
3827
3943
  'github-color-login',
3828
3944
  'gitlab',
3829
3945
  'graduate-hat',
3830
3946
  'grid-dot-square',
3831
- 'grid-layout-9-square',
3832
3947
  'grid-layout',
3948
+ 'grid-layout-9-square',
3833
3949
  'hammer-legal-square',
3834
3950
  'hammer-screwdriver',
3835
3951
  'hand-money-currency',
@@ -3841,8 +3957,8 @@ const allIcons = [
3841
3957
  'image-photo-copy-left-down',
3842
3958
  'image-picture-square',
3843
3959
  'information-circle',
3844
- 'invoice-checkmark-paid',
3845
3960
  'invoice',
3961
+ 'invoice-checkmark-paid',
3846
3962
  'italic',
3847
3963
  'items-group-elements',
3848
3964
  'key',
@@ -3851,22 +3967,21 @@ const allIcons = [
3851
3967
  'label-tag',
3852
3968
  'laptop-health-medical-cross',
3853
3969
  'layers',
3854
- 'layout-grid',
3855
3970
  'layout',
3971
+ 'layout-grid',
3856
3972
  'line',
3857
- 'link-unlink',
3858
3973
  'link',
3974
+ 'link-unlink',
3859
3975
  'linkedin',
3860
3976
  'linux',
3861
- 'list-paragraph-number',
3862
3977
  'list-paragraph',
3978
+ 'list-paragraph-number',
3863
3979
  'list-test-lab-flask',
3864
3980
  'livewire-tool',
3865
3981
  'loading-status-checkmark',
3866
- 'lock-unlock',
3867
3982
  'lock',
3983
+ 'lock-unlock',
3868
3984
  'logout',
3869
- 'lung',
3870
3985
  'lungs',
3871
3986
  'markdown',
3872
3987
  'measure-angle',
@@ -3880,26 +3995,27 @@ const allIcons = [
3880
3995
  'message-chat-question-support',
3881
3996
  'message-checkmark-sent',
3882
3997
  'message-question-checkmark',
3883
- 'microphone-mic-rec-circle',
3884
3998
  'microphone-mic-rec',
3999
+ 'microphone-mic-rec-circle',
3885
4000
  'microphone-mic-recording-circle',
3886
4001
  'minus',
3887
4002
  'modalities',
3888
4003
  'molecule',
4004
+ 'money',
3889
4005
  'money-coin',
3890
4006
  'money-dollar',
3891
- 'money',
3892
4007
  'monitor-computer',
3893
4008
  'mouse-big',
4009
+ 'mouse-scroll',
3894
4010
  'move',
3895
4011
  'music-play-resume',
3896
4012
  'music-stop',
3897
4013
  'mute',
3898
4014
  'network-storage-alert',
4015
+ 'notebook',
3899
4016
  'notebook-add-plus',
3900
4017
  'notebook-open',
3901
4018
  'notebook-pen-edit',
3902
- 'notebook',
3903
4019
  'notes-pen',
3904
4020
  'object-search-zoom-plus',
3905
4021
  'open',
@@ -3917,24 +4033,25 @@ const allIcons = [
3917
4033
  'protective-mask',
3918
4034
  'question-circle',
3919
4035
  'quote',
3920
- 'radiology-scan-circle',
3921
4036
  'radiology-scan',
4037
+ 'radiology-scan-circle',
3922
4038
  'reader-studies',
4039
+ 'rotate',
3923
4040
  'rotate-arrow-manual',
3924
4041
  'rotate-item-left',
3925
4042
  'rotate-item-right',
3926
4043
  'rotate-refresh',
3927
- 'rotate',
3928
- 'ruler-bidirectional',
3929
4044
  'ruler',
4045
+ 'ruler-bidirectional',
3930
4046
  'scanner',
4047
+ 'search',
3931
4048
  'search-loop',
3932
4049
  'search-user-profile-person',
3933
4050
  'search-zoom-minus',
3934
4051
  'search-zoom-plus',
3935
- 'search',
3936
4052
  'section-form-element',
3937
4053
  'send-message-share',
4054
+ 'server',
3938
4055
  'server-checkmark',
3939
4056
  'server-database-endpoint',
3940
4057
  'server-databases-checkmark-user',
@@ -3942,15 +4059,14 @@ const allIcons = [
3942
4059
  'server-databases-download',
3943
4060
  'server-databases-key-protection',
3944
4061
  'server-databases-minimal-download',
3945
- 'server-databases-sync-import',
3946
4062
  'server-databases-sync',
4063
+ 'server-databases-sync-import',
3947
4064
  'server-upload',
3948
- 'server',
3949
4065
  'servers-database',
3950
4066
  'setting-gear',
3951
4067
  'settings-adjust',
3952
- 'settings-gear-square',
3953
4068
  'settings-gear',
4069
+ 'settings-gear-square',
3954
4070
  'settings-select',
3955
4071
  'shapes-objects',
3956
4072
  'share',
@@ -3958,8 +4074,8 @@ const allIcons = [
3958
4074
  'show-visible',
3959
4075
  'smiley-emoji-face',
3960
4076
  'speed-dashboard',
3961
- 'square-fill-outline',
3962
4077
  'square-fill',
4078
+ 'square-fill-outline',
3963
4079
  'square-outline',
3964
4080
  'star',
3965
4081
  'stars-light-sparkle',
@@ -3968,8 +4084,8 @@ const allIcons = [
3968
4084
  'stretch-vertical',
3969
4085
  'substract-group',
3970
4086
  'switch',
3971
- 'target-space-object-select',
3972
4087
  'target',
4088
+ 'target-space-object-select',
3973
4089
  'tasklist-to-do-checkmark',
3974
4090
  'technology-cube-3d',
3975
4091
  'test-lab-flask',
@@ -3981,6 +4097,7 @@ const allIcons = [
3981
4097
  'text-long',
3982
4098
  'text-short-form-element',
3983
4099
  'text-underline',
4100
+ 'thumbs-down-dislike',
3984
4101
  'thumbs-up-like',
3985
4102
  'timer-clock-style',
3986
4103
  'trash-delete',
@@ -3988,6 +4105,7 @@ const allIcons = [
3988
4105
  'undone-uncheck-untracked',
3989
4106
  'unlimited-repeat-subscription-circle',
3990
4107
  'upload',
4108
+ 'user',
3991
4109
  'user-checked',
3992
4110
  'user-delete-cross',
3993
4111
  'user-document',
@@ -3997,12 +4115,11 @@ const allIcons = [
3997
4115
  'user-profile-cards-pool',
3998
4116
  'user-profile-group-discovery',
3999
4117
  'user-setting-gear',
4000
- 'user',
4001
4118
  'video-player-controls',
4002
4119
  'visible-eye-hidden',
4003
4120
  'volume-full',
4004
- 'warning-circle',
4005
4121
  'warning',
4122
+ 'warning-circle',
4006
4123
  'window-finder-resize-arrow-down',
4007
4124
  'window-finder-resize-arrow-up',
4008
4125
  'window-resize-left',
@@ -4725,14 +4842,20 @@ class FwMenuCloseTriggersDirective {
4725
4842
  constructor() {
4726
4843
  this._isOpen = false;
4727
4844
  }
4728
- outsideClick() {
4729
- if (this._isOpen && this.triggers && this.triggers.length > 0) {
4845
+ outsideClick(event) {
4846
+ const target = event.target;
4847
+ // Check is close under fw-menu-container (overlay)
4848
+ const clickedInsideMenu = target.closest('fw-menu-container') !== null;
4849
+ // Check is clicked on trigger
4850
+ const clickedOnTrigger = target.closest('[cdkMenuTriggerFor]') !== null;
4851
+ if (!clickedInsideMenu && !clickedOnTrigger && this._isOpen && this.triggers?.length > 0) {
4852
+ // Close menu if click outside menu and trigger
4730
4853
  this.triggers.forEach(trigger => {
4731
4854
  trigger.close();
4732
4855
  });
4733
4856
  this._isOpen = false;
4734
4857
  }
4735
- if (this.triggers && this.triggers.length > 0) {
4858
+ if (this.triggers?.length > 0) {
4736
4859
  this.triggers.forEach(trigger => {
4737
4860
  if (trigger.isOpen()) {
4738
4861
  this._isOpen = true;
@@ -4741,19 +4864,19 @@ class FwMenuCloseTriggersDirective {
4741
4864
  }
4742
4865
  }
4743
4866
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwMenuCloseTriggersDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4744
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FwMenuCloseTriggersDirective, selector: "[fwMenuCloseTriggers]", host: { listeners: { "document:click": "outsideClick()" } }, queries: [{ propertyName: "triggers", predicate: CdkMenuTrigger, descendants: true }], ngImport: i0 }); }
4867
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FwMenuCloseTriggersDirective, selector: "[fwMenuCloseTriggers]", host: { listeners: { "document:click": "outsideClick($event)" } }, queries: [{ propertyName: "triggers", predicate: CdkMenuTrigger, descendants: true }], ngImport: i0 }); }
4745
4868
  }
4746
4869
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwMenuCloseTriggersDirective, decorators: [{
4747
4870
  type: Directive,
4748
4871
  args: [{
4749
4872
  selector: '[fwMenuCloseTriggers]',
4750
4873
  }]
4751
- }], propDecorators: { outsideClick: [{
4752
- type: HostListener,
4753
- args: ['document:click']
4754
- }], triggers: [{
4874
+ }], propDecorators: { triggers: [{
4755
4875
  type: ContentChildren,
4756
4876
  args: [CdkMenuTrigger, { descendants: true }]
4877
+ }], outsideClick: [{
4878
+ type: HostListener,
4879
+ args: ['document:click', ['$event']]
4757
4880
  }] } });
4758
4881
 
4759
4882
  class FwMenuContainerComponent {
@@ -5824,6 +5947,11 @@ class FwMultiSelectMenuComponent {
5824
5947
  // handles all the display side effects of a value change
5825
5948
  updateValue(incomingValues) {
5826
5949
  if (!incomingValues) {
5950
+ this.selectedValues.clear();
5951
+ this.selectedOptions = [];
5952
+ this._value = [];
5953
+ this.change.emit(this._value);
5954
+ this.postSelectSideEffects();
5827
5955
  return;
5828
5956
  }
5829
5957
  this.selectedValues.clear();
@@ -6370,7 +6498,7 @@ class FwPaginatorAdvancedComponent {
6370
6498
  };
6371
6499
  }
6372
6500
  firstPage() {
6373
- const evt = this.buildPageEvent(1);
6501
+ const evt = this.buildPageEvent(0);
6374
6502
  this.pageIndex = 0;
6375
6503
  this.page.emit(evt);
6376
6504
  }
@@ -8702,6 +8830,7 @@ class FwChipListComponent {
8702
8830
  else {
8703
8831
  this.moreText().nativeElement.classList.add('hidden');
8704
8832
  }
8833
+ // eslint-disable-next-line @rx-angular/no-explicit-change-detection-apis
8705
8834
  this.changeDetector.detectChanges();
8706
8835
  }
8707
8836
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwChipListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -8725,8 +8854,10 @@ class FwTypeaheadComponent {
8725
8854
  this.changeDetector = inject(ChangeDetectorRef);
8726
8855
  this.loading = model(false);
8727
8856
  this.disabled = model(false);
8728
- this.onChange = (_) => { };
8729
- this.onTouched = () => { };
8857
+ this.onChange = (_) => {
8858
+ };
8859
+ this.onTouched = () => {
8860
+ };
8730
8861
  this.value = model([]);
8731
8862
  this.optionsInput = input([], { alias: 'options' });
8732
8863
  this.maxOptionsHeight = input('400px');
@@ -8853,12 +8984,14 @@ class FwTypeaheadComponent {
8853
8984
  const newValue = currentValue.filter(val => val !== chipValue);
8854
8985
  this.value.set(newValue);
8855
8986
  this.focusInput();
8987
+ // eslint-disable-next-line @rx-angular/no-explicit-change-detection-apis
8856
8988
  this.changeDetector.detectChanges();
8857
8989
  }
8858
8990
  focusInput(e = null) {
8859
8991
  e?.preventDefault();
8860
8992
  e?.stopPropagation();
8861
8993
  e?.stopImmediatePropagation();
8994
+ // eslint-disable-next-line @rx-angular/prefer-no-layout-sensitive-apis
8862
8995
  this.inputRef().nativeElement.focus();
8863
8996
  }
8864
8997
  /* eslint-enable */
@@ -8929,22 +9062,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8929
9062
 
8930
9063
  class FwWrappedInputComponent {
8931
9064
  constructor() {
9065
+ this.statusColor = 'slate';
8932
9066
  this.class = true;
8933
9067
  }
8934
9068
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwWrappedInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8935
- 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 }); }
9069
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FwWrappedInputComponent, selector: "fw-wrapped-input", inputs: { title: "title", status: "status", statusColor: "statusColor", description: "description", helperText: "helperText", errorText: "errorText", required: "required" }, host: { properties: { "class.fw-wrapped-input": "this.class" } }, ngImport: i0, template: "<label>\n <fw-form-heading\n *ngIf=\"title\" [title]=\"title\" [description]=\"description\"\n [required]=\"required\" [status]=\"status\" [statusColor]=\"statusColor\">\n </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", "required", "status", "statusColor"] }], encapsulation: i0.ViewEncapsulation.None }); }
8936
9070
  }
8937
9071
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwWrappedInputComponent, decorators: [{
8938
9072
  type: Component,
8939
- 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"] }]
9073
+ args: [{ selector: 'fw-wrapped-input', encapsulation: ViewEncapsulation.None, template: "<label>\n <fw-form-heading\n *ngIf=\"title\" [title]=\"title\" [description]=\"description\"\n [required]=\"required\" [status]=\"status\" [statusColor]=\"statusColor\">\n </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"] }]
8940
9074
  }], propDecorators: { title: [{
8941
9075
  type: Input
9076
+ }], status: [{
9077
+ type: Input
9078
+ }], statusColor: [{
9079
+ type: Input
8942
9080
  }], description: [{
8943
9081
  type: Input
8944
9082
  }], helperText: [{
8945
9083
  type: Input
8946
9084
  }], errorText: [{
8947
9085
  type: Input
9086
+ }], required: [{
9087
+ type: Input
8948
9088
  }], class: [{
8949
9089
  type: HostBinding,
8950
9090
  args: ['class.fw-wrapped-input']