@ngutil/floating 0.0.62 → 0.0.64

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.
@@ -6,7 +6,7 @@ import { KeystrokeService, FocusService } from '@ngutil/aria';
6
6
  import { coerceElement, isElementInput, Lifecycle, toSorted } from '@ngutil/common';
7
7
  import { clamp } from 'lodash';
8
8
  import * as i0 from '@angular/core';
9
- import { ElementRef, Injector, ComponentFactoryResolver, ViewContainerRef, InjectionToken, inject, Directive, Inject, Optional, Injectable, TemplateRef, NgModule } from '@angular/core';
9
+ import { ElementRef, Injector, InjectionToken, inject, Directive, Injectable, ComponentFactoryResolver, ViewContainerRef, ApplicationRef, Inject, TemplateRef } from '@angular/core';
10
10
  import { DOCUMENT } from '@angular/common';
11
11
  import { DomPortalOutlet, ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
12
12
 
@@ -521,11 +521,26 @@ function attribute(attrs) {
521
521
 
522
522
  var AlwaysOnTop;
523
523
  (function (AlwaysOnTop) {
524
+ /**
525
+ * Display as open order
526
+ */
524
527
  AlwaysOnTop[AlwaysOnTop["None"] = 0] = "None";
525
- AlwaysOnTop[AlwaysOnTop["Normal"] = 1] = "Normal";
528
+ /**
529
+ * Modals
530
+ */
526
531
  AlwaysOnTop[AlwaysOnTop["Modal"] = 2] = "Modal";
527
- AlwaysOnTop[AlwaysOnTop["Toast"] = 3] = "Toast";
528
- AlwaysOnTop[AlwaysOnTop["UAC"] = 100] = "UAC";
532
+ /**
533
+ * User access control
534
+ */
535
+ AlwaysOnTop[AlwaysOnTop["UAC"] = 3] = "UAC";
536
+ /**
537
+ * Toast...
538
+ */
539
+ AlwaysOnTop[AlwaysOnTop["Toast"] = 4] = "Toast";
540
+ /**
541
+ * Like select drop down, tooltip, stb...
542
+ */
543
+ AlwaysOnTop[AlwaysOnTop["Control"] = 5] = "Control";
529
544
  })(AlwaysOnTop || (AlwaysOnTop = {}));
530
545
  // TODO: disposing, disposed
531
546
  class ChildRef extends ElementRef {
@@ -557,12 +572,6 @@ class ChildRef extends ElementRef {
557
572
  this.state.destroy();
558
573
  delete this.state;
559
574
  });
560
- // this.state.current$.subscribe(state => {
561
- // console.log(this, state)
562
- // })
563
- // this.state.status$.subscribe(status => {
564
- // console.log(this.nativeElement, status)
565
- // })
566
575
  }
567
576
  dispose() {
568
577
  if (this.state == null) {
@@ -642,99 +651,22 @@ class BackdropRef extends ChildRef {
642
651
  }
643
652
  }
644
653
 
645
- class PortalRef extends ContainerRef {
646
- constructor(options) {
647
- super(options);
648
- this.injectorName = "PortalRef";
649
- this.outlet = new DomPortalOutlet(this.nativeElement, undefined, undefined, this.injector);
650
- this.state.on("disposed", () => {
651
- this.outlet.dispose();
652
- delete this.outlet;
653
- });
654
- }
655
- getProviders() {
656
- return [...super.getProviders(), { provide: PortalRef, useValue: this }];
657
- }
658
- }
659
- class ComponentPortalRef extends PortalRef {
660
- constructor(component, options) {
661
- super(options);
662
- this.component = component;
663
- this.injectorName = "ComponentPortalRef";
664
- const resolver = this.injector.get(ComponentFactoryResolver);
665
- const vcr = this.injector.get(ViewContainerRef);
666
- this.portal = new ComponentPortal(component, options.viewContainerRef || vcr, this.injector, resolver);
667
- this.outlet.attach(this.portal);
668
- this.state.on("disposed", () => {
669
- this.portal.isAttached && this.portal.detach();
670
- delete this.portal;
671
- });
672
- }
673
- getProviders() {
674
- return [...super.getProviders(), { provide: ComponentPortalRef, useValue: this }];
675
- }
676
- }
677
- class TemplatePortalRef extends PortalRef {
678
- constructor(template, options) {
679
- super(options);
680
- this.template = template;
681
- this.injectorName = "TemplatePortalRef";
682
- this.portal = new TemplatePortal(template, options.viewContainerRef, options.context);
683
- this.outlet.attach(this.portal);
684
- this.state.on("disposed", () => {
685
- this.portal.isAttached && this.portal.detach();
686
- delete this.portal;
687
- });
688
- }
689
- getProviders() {
690
- return [...super.getProviders(), { provide: TemplatePortalRef, useValue: this }];
691
- }
654
+ class ExternalRef extends ChildRef {
692
655
  }
693
656
 
694
- const LAYER_ZINDEX_START = new InjectionToken("LAYER_ZINDEX_START");
695
- // TODO: ELEVATION_STEP config with injection
696
- // TODO: ELEVATION_START config with injection
697
- class LayerService {
698
- #cover = inject(CoverService);
699
- #injector = inject(Injector);
700
- #children = [];
701
- #zIndexStart;
702
- constructor(zIndexStart) {
703
- if (zIndexStart != null) {
704
- this.#zIndexStart = zIndexStart;
705
- }
706
- else {
707
- this.#zIndexStart = 10000;
708
- }
709
- }
710
- newComponentPortal(component, options) {
711
- if (!options.injector) {
712
- options = { ...options, injector: this.#injector };
713
- }
714
- return this.append(new ComponentPortalRef(component, options));
715
- }
716
- newTemplatePortal(tpl, options) {
717
- if (!options.injector) {
718
- options = { ...options, injector: this.#injector };
719
- }
720
- return this.append(new TemplatePortalRef(tpl, options));
721
- }
722
- newContainer(options) {
723
- if (!options.injector) {
724
- options = { ...options, injector: this.#injector };
725
- }
726
- return this.append(new ContainerRef(options));
727
- }
728
- newBackdrop(under, options) {
729
- const coverRef = this.#cover.create(this.root, options);
730
- return this.append(new BackdropRef(coverRef, under, options));
657
+ const LAYER_CONTAINER_ZINDEX_START = new InjectionToken("LAYER_CONTAINER_ZINDEX_START");
658
+ class LayerContainer {
659
+ constructor() {
660
+ this.#children = [];
661
+ this.zIndexStart = inject(LAYER_CONTAINER_ZINDEX_START);
731
662
  }
663
+ #children;
732
664
  append(ref) {
733
665
  if (!this.#children.includes(ref)) {
734
666
  this.#children.push(ref);
735
667
  this.#update();
736
668
  this.root.appendChild(ref.nativeElement);
737
- ref.state.on("disposed", () => this.#remove(ref));
669
+ ref.state.on("disposing", () => this.#remove(ref));
738
670
  }
739
671
  return ref;
740
672
  }
@@ -747,7 +679,7 @@ class LayerService {
747
679
  }
748
680
  #update() {
749
681
  const children = toSorted(this.#children, sortChildren2);
750
- let zIndex = this.#zIndexStart;
682
+ let zIndex = this.zIndexStart;
751
683
  for (const child of children) {
752
684
  child.zIndex = zIndex;
753
685
  zIndex += 1;
@@ -761,42 +693,36 @@ class LayerService {
761
693
  }
762
694
  }
763
695
  }
764
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerService, deps: [{ token: LAYER_ZINDEX_START, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
765
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: LayerService, ngImport: i0 }); }
696
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerContainer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
697
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: LayerContainer, ngImport: i0 }); }
766
698
  }
767
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerService, decorators: [{
699
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerContainer, decorators: [{
768
700
  type: Directive
769
- }], ctorParameters: () => [{ type: undefined, decorators: [{
770
- type: Inject,
771
- args: [LAYER_ZINDEX_START]
772
- }, {
773
- type: Optional
774
- }] }] });
775
- class RootLayer extends LayerService {
776
- #doc = inject(DOCUMENT);
777
- get root() {
778
- return this.#doc.body;
701
+ }] });
702
+ class RootLayer extends LayerContainer {
703
+ constructor() {
704
+ super(...arguments);
705
+ this.root = inject(DOCUMENT).body;
779
706
  }
780
707
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RootLayer, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
781
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RootLayer, providedIn: "root" }); }
708
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RootLayer }); }
782
709
  }
783
710
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RootLayer, decorators: [{
784
- type: Injectable,
785
- args: [{ providedIn: "root" }]
711
+ type: Injectable
786
712
  }] });
787
- class IndividualLayer extends LayerService {
788
- #el = inject(ElementRef);
789
- get root() {
790
- return this.#el.nativeElement;
713
+ class IndividualLayer extends LayerContainer {
714
+ constructor() {
715
+ super(...arguments);
716
+ this.root = inject(ElementRef).nativeElement;
791
717
  }
792
718
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: IndividualLayer, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
793
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: IndividualLayer, isStandalone: true, providers: [{ provide: LayerService, useExisting: IndividualLayer }], usesInheritance: true, ngImport: i0 }); }
719
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: IndividualLayer, isStandalone: true, providers: [{ provide: LayerContainer, useExisting: IndividualLayer }], usesInheritance: true, ngImport: i0 }); }
794
720
  }
795
721
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: IndividualLayer, decorators: [{
796
722
  type: Directive,
797
723
  args: [{
798
724
  standalone: true,
799
- providers: [{ provide: LayerService, useExisting: IndividualLayer }]
725
+ providers: [{ provide: LayerContainer, useExisting: IndividualLayer }]
800
726
  }]
801
727
  }] });
802
728
  function sortChildren2(a, b) {
@@ -832,6 +758,110 @@ function getAlwaysOnTop(child) {
832
758
  }
833
759
  }
834
760
 
761
+ class PortalRef extends ContainerRef {
762
+ constructor(options) {
763
+ super(options);
764
+ this.injectorName = "PortalRef";
765
+ this.outlet = new DomPortalOutlet(this.nativeElement, undefined, undefined, this.injector);
766
+ this.state.on("disposed", () => {
767
+ this.outlet.dispose();
768
+ delete this.outlet;
769
+ });
770
+ }
771
+ getProviders() {
772
+ return [...super.getProviders(), { provide: PortalRef, useValue: this }];
773
+ }
774
+ }
775
+ class ComponentPortalRef extends PortalRef {
776
+ constructor(component, options) {
777
+ super(options);
778
+ this.component = component;
779
+ this.injectorName = "ComponentPortalRef";
780
+ const resolver = this.injector.get(ComponentFactoryResolver);
781
+ const vcr = this.injector.get(ViewContainerRef);
782
+ this.portal = new ComponentPortal(component, options.viewContainerRef || vcr, this.injector, resolver);
783
+ this.outlet.attach(this.portal);
784
+ this.state.on("disposed", () => {
785
+ this.portal.isAttached && this.portal.detach();
786
+ delete this.portal;
787
+ });
788
+ }
789
+ getProviders() {
790
+ return [...super.getProviders(), { provide: ComponentPortalRef, useValue: this }];
791
+ }
792
+ }
793
+ class TemplatePortalRef extends PortalRef {
794
+ constructor(template, options) {
795
+ super(options);
796
+ this.template = template;
797
+ this.injectorName = "TemplatePortalRef";
798
+ this.portal = new TemplatePortal(template, options.viewContainerRef, options.context);
799
+ this.outlet.attach(this.portal);
800
+ this.state.on("disposed", () => {
801
+ this.portal.isAttached && this.portal.detach();
802
+ delete this.portal;
803
+ });
804
+ }
805
+ getProviders() {
806
+ return [...super.getProviders(), { provide: TemplatePortalRef, useValue: this }];
807
+ }
808
+ }
809
+
810
+ // TODO: ELEVATION_STEP config with injection
811
+ // TODO: ELEVATION_START config with injection
812
+ class LayerService {
813
+ #container = inject(LayerContainer);
814
+ #cover = inject(CoverService);
815
+ #injector = inject(Injector);
816
+ #appRef = inject(ApplicationRef);
817
+ get root() {
818
+ return this.#container.root;
819
+ }
820
+ newComponentPortal(component, options) {
821
+ if (!options.injector) {
822
+ options = { ...options, injector: this.#getInjector() };
823
+ }
824
+ return this.#container.append(new ComponentPortalRef(component, options));
825
+ }
826
+ newTemplatePortal(tpl, options) {
827
+ if (!options.injector) {
828
+ options = { ...options, injector: this.#getInjector() };
829
+ }
830
+ return this.#container.append(new TemplatePortalRef(tpl, options));
831
+ }
832
+ newContainer(options) {
833
+ if (!options.injector) {
834
+ options = { ...options, injector: this.#getInjector() };
835
+ }
836
+ return this.#container.append(new ContainerRef(options));
837
+ }
838
+ newBackdrop(under, options) {
839
+ const coverRef = this.#cover.create(this.root, options);
840
+ return this.#container.append(new BackdropRef(coverRef, under, options));
841
+ }
842
+ addExternal(element, alwaysOnTop = AlwaysOnTop.None) {
843
+ return this.#container.append(new ExternalRef(coerceElement(element), alwaysOnTop));
844
+ }
845
+ #getInjector() {
846
+ try {
847
+ this.#injector.get(ViewContainerRef);
848
+ return this.#injector;
849
+ // eslint-disable-next-line no-empty
850
+ }
851
+ catch (err) { }
852
+ const root = this.#appRef.components[0];
853
+ if (root == null) {
854
+ throw new Error("Root component not found");
855
+ }
856
+ return root.injector;
857
+ }
858
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
859
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerService }); }
860
+ }
861
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerService, decorators: [{
862
+ type: Injectable
863
+ }] });
864
+
835
865
  const TRAITS = new InjectionToken("TRAITS");
836
866
  let UID_COUNTER = 0;
837
867
  class FloatingRef {
@@ -877,10 +907,6 @@ class FloatingRef {
877
907
  container.nativeElement.style.pointerEvents = "none";
878
908
  });
879
909
  this.state.control(container.state);
880
- // TODO: remove
881
- // this.state.status$.subscribe(status => {
882
- // console.log("floating", status)
883
- // })
884
910
  }
885
911
  show() {
886
912
  return this.state.run("init", "showing", "shown");
@@ -1058,21 +1084,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImpor
1058
1084
  type: Injectable
1059
1085
  }] });
1060
1086
 
1061
- class NuFloating {
1062
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: NuFloating, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1063
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.6", ngImport: i0, type: NuFloating }); }
1064
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: NuFloating, providers: [FloatingService, { provide: LayerService, useClass: RootLayer }] }); }
1087
+ const DEFAULTS = {
1088
+ zIndexStart: 10000
1089
+ };
1090
+ function provideFloating(options = {}) {
1091
+ const opts = { ...DEFAULTS, ...options };
1092
+ return [
1093
+ { provide: LAYER_CONTAINER_ZINDEX_START, useValue: opts.zIndexStart },
1094
+ { provide: LayerContainer, useClass: RootLayer },
1095
+ LayerService,
1096
+ FloatingService
1097
+ ];
1065
1098
  }
1066
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: NuFloating, decorators: [{
1067
- type: NgModule,
1068
- args: [{
1069
- providers: [FloatingService, { provide: LayerService, useClass: RootLayer }]
1070
- }]
1071
- }] });
1072
1099
 
1073
1100
  /**
1074
1101
  * Generated bundle index. Do not edit.
1075
1102
  */
1076
1103
 
1077
- export { AlwaysOnTop, AnimationTrait, AttributeTrait, BackdropRef, BackdropTrait, ChildRef, ComponentPortalRef, ContainerRef, DimensionConstraintTrait, DropAnimation, FadeAnimation, FallAnimation, FloatingAnchorRef, FloatingComponentFactory, FloatingFactory, FloatingPlacementRef, FloatingPosition, FloatingRef, FloatingService, FloatingTemplateFactory, FocusTrait, IndividualLayer, LAYER_ZINDEX_START, LayerService, NuFloating, PortalRef, PositionTrait, RootLayer, StyleTrait, TRAITS, TemplatePortalRef, attribute, backdrop, closeTrigger, computePosition, dropAnimation, fadeAnimation, fallAnimation, focus, maxHeight, maxWidth, minHeight, minWidth, modal, position, style };
1104
+ export { AlwaysOnTop, AnimationTrait, AttributeTrait, BackdropRef, BackdropTrait, ChildRef, ComponentPortalRef, ContainerRef, DimensionConstraintTrait, DropAnimation, FadeAnimation, FallAnimation, FloatingAnchorRef, FloatingComponentFactory, FloatingFactory, FloatingPlacementRef, FloatingPosition, FloatingRef, FloatingService, FloatingTemplateFactory, FocusTrait, IndividualLayer, LAYER_CONTAINER_ZINDEX_START, LayerContainer, LayerService, PortalRef, PositionTrait, RootLayer, StyleTrait, TRAITS, TemplatePortalRef, attribute, backdrop, closeTrigger, computePosition, dropAnimation, fadeAnimation, fallAnimation, focus, maxHeight, maxWidth, minHeight, minWidth, modal, position, provideFloating, style };
1078
1105
  //# sourceMappingURL=ngutil-floating.mjs.map