@ngutil/floating 0.0.63 → 0.0.65
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.
- package/esm2022/floating/floating-ref.mjs +1 -5
- package/esm2022/floating/floating.service.mjs +1 -1
- package/esm2022/floating/traits/animation.mjs +2 -2
- package/esm2022/floating/traits/index.mjs +1 -3
- package/esm2022/floating/traits/modal.mjs +2 -2
- package/esm2022/floating/traits/position.mjs +50 -50
- package/esm2022/layer/container-ref.mjs +2 -1
- package/esm2022/layer/layer.service.mjs +5 -7
- package/fesm2022/ngutil-floating.mjs +57 -161
- package/fesm2022/ngutil-floating.mjs.map +1 -1
- package/floating/floating.service.d.ts +2 -2
- package/floating/traits/index.d.ts +0 -2
- package/floating/traits/modal.d.ts +2 -2
- package/floating/traits/position.d.ts +23 -50
- package/layer/layer.service.d.ts +0 -1
- package/package.json +4 -4
- package/esm2022/floating/traits/dim-contraint.mjs +0 -66
- package/esm2022/floating/traits/position-calc.mjs +0 -39
- package/floating/traits/dim-contraint.d.ts +0 -25
- package/floating/traits/position-calc.d.ts +0 -28
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { AnimationBuilder, style as style$1, animate } from '@angular/animations';
|
|
2
|
-
import { Observable, switchMap, tap, timer, take, map, fromEvent, filter, from, of, race, exhaustMap, distinctUntilChanged, combineLatest, takeUntil, share, ReplaySubject, shareReplay, takeWhile, debounceTime, startWith, EMPTY } from 'rxjs';
|
|
2
|
+
import { Observable, switchMap, tap, timer, take, map, fromEvent, filter, from, of, race, exhaustMap, distinctUntilChanged, combineLatest, takeUntil, isObservable, share, ReplaySubject, shareReplay, takeWhile, debounceTime, startWith, EMPTY } from 'rxjs';
|
|
3
3
|
import { animationObservable, CoverService } from '@ngutil/graphics';
|
|
4
|
-
import { Duration, Ease, alignmentToTransformOrigin, DimensionWatcher,
|
|
4
|
+
import { Duration, Ease, alignmentToTransformOrigin, DimensionWatcher, RectWatcher, floatingPosition, floatingPositionToStyle } from '@ngutil/style';
|
|
5
5
|
import { KeystrokeService, FocusService } from '@ngutil/aria';
|
|
6
6
|
import { coerceElement, isElementInput, Lifecycle, toSorted } from '@ngutil/common';
|
|
7
|
-
import { clamp } from 'lodash';
|
|
8
7
|
import * as i0 from '@angular/core';
|
|
9
8
|
import { ElementRef, Injector, InjectionToken, inject, Directive, Injectable, ComponentFactoryResolver, ViewContainerRef, ApplicationRef, Inject, TemplateRef } from '@angular/core';
|
|
10
9
|
import { DOCUMENT } from '@angular/common';
|
|
@@ -45,7 +44,7 @@ function animationParams(floatingRef, delay, overrides) {
|
|
|
45
44
|
? timer(delay).pipe(switchMap(() => floatingRef.watchTrait("position")))
|
|
46
45
|
: floatingRef.watchTrait("position");
|
|
47
46
|
return src.pipe(take(1), map(position => {
|
|
48
|
-
const origin =
|
|
47
|
+
const origin = alignmentToTransformOrigin(position.content.link);
|
|
49
48
|
return {
|
|
50
49
|
origin,
|
|
51
50
|
...overrides
|
|
@@ -234,68 +233,6 @@ function getFloatingUid(el, attr, dataset) {
|
|
|
234
233
|
return undefined;
|
|
235
234
|
}
|
|
236
235
|
|
|
237
|
-
const DIM_MAP = {
|
|
238
|
-
maxWidth: { computedRef: "max", dimension: "width" },
|
|
239
|
-
maxHeight: { computedRef: "max", dimension: "height" },
|
|
240
|
-
minWidth: { computedRef: "min", dimension: "width" },
|
|
241
|
-
minHeight: { computedRef: "min", dimension: "height" }
|
|
242
|
-
};
|
|
243
|
-
class DimensionConstraintTrait {
|
|
244
|
-
#map;
|
|
245
|
-
constructor(name, value) {
|
|
246
|
-
this.value = value;
|
|
247
|
-
this.name = name;
|
|
248
|
-
this.#map = DIM_MAP[name];
|
|
249
|
-
}
|
|
250
|
-
connect(floatingRef) {
|
|
251
|
-
return new Observable((dst) => {
|
|
252
|
-
if (isElementInput(this.value)) {
|
|
253
|
-
const watcher = floatingRef.container.injector.get(DimensionWatcher);
|
|
254
|
-
const refDim = watcher.watch(this.value, "border-box").pipe(map(value => value[this.#map.dimension]));
|
|
255
|
-
return combineLatest({
|
|
256
|
-
refDim: refDim,
|
|
257
|
-
position: floatingRef.watchTrait("position")
|
|
258
|
-
}).subscribe(({ refDim, position }) => {
|
|
259
|
-
const floating = position.computed?.content;
|
|
260
|
-
if (!floating) {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
dst.next(clamp(refDim, floating.min[this.#map.dimension] || 0, floating.max[this.#map.dimension] || Infinity));
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
return floatingRef.watchTrait("position").subscribe(position => {
|
|
268
|
-
const floating = position.computed?.content;
|
|
269
|
-
if (!floating) {
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
if (isNaN(this.value)) {
|
|
273
|
-
dst.next(floating[this.#map.computedRef][this.#map.dimension]);
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
dst.next(clamp(this.value, floating.min[this.#map.dimension] || 0, floating.max[this.#map.dimension] || Infinity));
|
|
277
|
-
}
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
}).pipe(takeUntil(floatingRef.state.onExecute("disposing")), distinctUntilChanged(), tap(value => {
|
|
281
|
-
const floatingEl = floatingRef.container.nativeElement;
|
|
282
|
-
floatingEl.style[this.name] = `${value}px`;
|
|
283
|
-
}));
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
function maxWidth(value) {
|
|
287
|
-
return new DimensionConstraintTrait("maxWidth", value);
|
|
288
|
-
}
|
|
289
|
-
function maxHeight(value) {
|
|
290
|
-
return new DimensionConstraintTrait("maxHeight", value);
|
|
291
|
-
}
|
|
292
|
-
function minWidth(value) {
|
|
293
|
-
return new DimensionConstraintTrait("minWidth", value);
|
|
294
|
-
}
|
|
295
|
-
function minHeight(value) {
|
|
296
|
-
return new DimensionConstraintTrait("minHeight", value);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
236
|
class FocusTrait {
|
|
300
237
|
constructor(options) {
|
|
301
238
|
this.options = options;
|
|
@@ -340,48 +277,6 @@ function focus(options) {
|
|
|
340
277
|
return new FocusTrait(options);
|
|
341
278
|
}
|
|
342
279
|
|
|
343
|
-
function computePosition({ floating, anchor, placement, options }) {
|
|
344
|
-
if (options.anchor.margin) {
|
|
345
|
-
anchor = rectExpand(anchor, options.anchor.margin);
|
|
346
|
-
}
|
|
347
|
-
const anchorPoint = rectOrigin(anchor, options.anchor.align);
|
|
348
|
-
let contentRect = rectMoveOrigin(floating, options.content.align, anchorPoint);
|
|
349
|
-
if (options.content.margin) {
|
|
350
|
-
contentRect = rectContract(contentRect, options.content.margin);
|
|
351
|
-
}
|
|
352
|
-
if (options.placement.padding) {
|
|
353
|
-
placement = rectContract(placement, options.placement.padding);
|
|
354
|
-
}
|
|
355
|
-
return {
|
|
356
|
-
content: {
|
|
357
|
-
...addTLRB(contentRect, placement),
|
|
358
|
-
align: alignmentNormalize(options.content.align),
|
|
359
|
-
connect: anchorPoint,
|
|
360
|
-
max: { width: placement.width - contentRect.x, height: placement.height - contentRect.y },
|
|
361
|
-
min: { width: 0, height: 0 }
|
|
362
|
-
},
|
|
363
|
-
anchor: {
|
|
364
|
-
...addTLRB(anchor, placement),
|
|
365
|
-
align: alignmentNormalize(options.anchor.align),
|
|
366
|
-
connect: anchorPoint
|
|
367
|
-
},
|
|
368
|
-
placement: addTLRB(placement, placement)
|
|
369
|
-
};
|
|
370
|
-
}
|
|
371
|
-
function addTLRB(rect, container) {
|
|
372
|
-
return {
|
|
373
|
-
...rect,
|
|
374
|
-
top: rect.y,
|
|
375
|
-
left: rect.x,
|
|
376
|
-
right: container.width - (rect.x + rect.width),
|
|
377
|
-
bottom: container.height - (rect.y + rect.height)
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
class FloatingAnchorRef extends ElementRef {
|
|
382
|
-
}
|
|
383
|
-
class FloatingPlacementRef extends ElementRef {
|
|
384
|
-
}
|
|
385
280
|
class PositionTrait {
|
|
386
281
|
constructor(options) {
|
|
387
282
|
this.name = "position";
|
|
@@ -390,10 +285,10 @@ class PositionTrait {
|
|
|
390
285
|
cloned.placement = { ref: "viewport" };
|
|
391
286
|
}
|
|
392
287
|
if (!cloned.anchor) {
|
|
393
|
-
cloned.anchor = { ref: cloned.placement.ref,
|
|
288
|
+
cloned.anchor = { ref: cloned.placement.ref, link: "center middle" };
|
|
394
289
|
}
|
|
395
290
|
if (!cloned.content) {
|
|
396
|
-
cloned.content = {
|
|
291
|
+
cloned.content = { link: "center middle" };
|
|
397
292
|
}
|
|
398
293
|
this.options = cloned;
|
|
399
294
|
}
|
|
@@ -402,16 +297,31 @@ class PositionTrait {
|
|
|
402
297
|
const injector = floatingRef.container.injector;
|
|
403
298
|
const dimWatcher = injector.get(DimensionWatcher);
|
|
404
299
|
const rectWatcher = injector.get(RectWatcher);
|
|
405
|
-
const
|
|
406
|
-
|
|
300
|
+
const dimWatches = {
|
|
301
|
+
content: dimWatcher.watch(floatingRef.container, "border-box"),
|
|
407
302
|
anchor: refWatcher(rectWatcher, this.options.anchor.ref, floatingRef),
|
|
408
303
|
placement: refWatcher(rectWatcher, this.options.placement.ref, floatingRef)
|
|
409
304
|
};
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
305
|
+
const sizeWatches = {
|
|
306
|
+
minWidth: sizeWatcher(dimWatcher, "width", this.options.content.minWidth),
|
|
307
|
+
maxWidth: sizeWatcher(dimWatcher, "width", this.options.content.maxWidth),
|
|
308
|
+
minHeight: sizeWatcher(dimWatcher, "height", this.options.content.minHeight),
|
|
309
|
+
maxHeight: sizeWatcher(dimWatcher, "height", this.options.content.maxHeight)
|
|
310
|
+
};
|
|
311
|
+
const watches = {
|
|
312
|
+
dims: combineLatest(dimWatches),
|
|
313
|
+
size: combineLatest(sizeWatches)
|
|
314
|
+
};
|
|
315
|
+
return (combineLatest(watches)
|
|
316
|
+
// .pipe(distinctUntilChanged(isEqual))
|
|
317
|
+
.subscribe(({ dims, size }) => {
|
|
318
|
+
console.log(size);
|
|
319
|
+
const pos = floatingPosition({ dims, options: this.options });
|
|
320
|
+
const floatingEl = floatingRef.container.nativeElement;
|
|
321
|
+
Object.assign(floatingEl.style, floatingPositionToStyle(pos));
|
|
322
|
+
Object.assign(floatingEl.style, sizesToStyle(pos, size));
|
|
323
|
+
dest.next(pos);
|
|
324
|
+
}));
|
|
415
325
|
}).pipe(takeUntil(floatingRef.state.onExecute("disposing")));
|
|
416
326
|
}
|
|
417
327
|
}
|
|
@@ -426,39 +336,30 @@ function refWatcher(rectWatcher, ref, floatingRef) {
|
|
|
426
336
|
return rectWatcher.watch(ref, "border-box");
|
|
427
337
|
}
|
|
428
338
|
}
|
|
429
|
-
function
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
this.floating = floating;
|
|
436
|
-
this.anchor = anchor;
|
|
437
|
-
this.placement = placement;
|
|
438
|
-
// const frect: Rect = { x: 0, y: 0, ...floating }
|
|
439
|
-
this.computed = computePosition({ floating, anchor, placement, options });
|
|
440
|
-
}
|
|
441
|
-
apply(floatingRef) {
|
|
442
|
-
if (this.computed == null) {
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
const floatingEl = floatingRef.container.nativeElement;
|
|
446
|
-
const computedContent = this.computed.content;
|
|
447
|
-
const style = { top: null, right: null, bottom: null, left: null };
|
|
448
|
-
if (computedContent.align.horizontal === "right") {
|
|
449
|
-
style["right"] = `${computedContent.right}px`;
|
|
450
|
-
}
|
|
451
|
-
else {
|
|
452
|
-
style["left"] = `${computedContent.left}px`;
|
|
453
|
-
}
|
|
454
|
-
if (computedContent.align.vertical === "bottom") {
|
|
455
|
-
style["bottom"] = `${computedContent.bottom}px`;
|
|
456
|
-
}
|
|
457
|
-
else {
|
|
458
|
-
style["top"] = `${computedContent.top}px`;
|
|
459
|
-
}
|
|
460
|
-
Object.assign(floatingEl.style, style);
|
|
339
|
+
function sizeWatcher(dimWatcher, prop, size) {
|
|
340
|
+
if (typeof size === "number") {
|
|
341
|
+
return of(size);
|
|
342
|
+
}
|
|
343
|
+
else if (isElementInput(size)) {
|
|
344
|
+
return dimWatcher.watch(size, "border-box").pipe(map(value => value[prop]));
|
|
461
345
|
}
|
|
346
|
+
else if (isObservable(size)) {
|
|
347
|
+
return size.pipe(switchMap(value => sizeWatcher(dimWatcher, prop, value)));
|
|
348
|
+
}
|
|
349
|
+
return of(NaN);
|
|
350
|
+
}
|
|
351
|
+
function sizesToStyle(pos, sizes) {
|
|
352
|
+
const { minWidth, maxWidth, minHeight, maxHeight } = sizes;
|
|
353
|
+
const { width, height } = pos.placement.area;
|
|
354
|
+
return {
|
|
355
|
+
minWidth: isNaN(minWidth) ? "auto" : `${Math.min(width, minWidth)}px`,
|
|
356
|
+
minHeight: isNaN(minHeight) ? "auto" : `${Math.min(height, minHeight)}px`,
|
|
357
|
+
maxWidth: isNaN(maxWidth) ? `${width}px` : `${Math.min(width, maxWidth)}px`,
|
|
358
|
+
maxHeight: isNaN(maxHeight) ? `${height}px` : `${Math.min(height, maxHeight)}px`
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
function position(options) {
|
|
362
|
+
return new PositionTrait(options);
|
|
462
363
|
}
|
|
463
364
|
|
|
464
365
|
function modal() {
|
|
@@ -466,7 +367,7 @@ function modal() {
|
|
|
466
367
|
position({
|
|
467
368
|
anchor: {
|
|
468
369
|
ref: "viewport",
|
|
469
|
-
|
|
370
|
+
link: "center middle"
|
|
470
371
|
},
|
|
471
372
|
placement: {
|
|
472
373
|
ref: "viewport",
|
|
@@ -614,6 +515,7 @@ function createElement(options) {
|
|
|
614
515
|
div.style.flexDirection = "column";
|
|
615
516
|
div.style.alignItems = "stretch";
|
|
616
517
|
div.style.justifyContent = "stretch";
|
|
518
|
+
div.style.boxSizing = "border-box";
|
|
617
519
|
if (options.classes) {
|
|
618
520
|
div.classList.add(...options.classes);
|
|
619
521
|
}
|
|
@@ -817,12 +719,7 @@ class LayerService {
|
|
|
817
719
|
get root() {
|
|
818
720
|
return this.#container.root;
|
|
819
721
|
}
|
|
820
|
-
constructor() {
|
|
821
|
-
console.log(this.#appRef);
|
|
822
|
-
// console.log(this.#appRef.)
|
|
823
|
-
}
|
|
824
722
|
newComponentPortal(component, options) {
|
|
825
|
-
// console.log(this.getRootViewContainerRef())
|
|
826
723
|
if (!options.injector) {
|
|
827
724
|
options = { ...options, injector: this.#getInjector() };
|
|
828
725
|
}
|
|
@@ -855,6 +752,9 @@ class LayerService {
|
|
|
855
752
|
}
|
|
856
753
|
catch (err) { }
|
|
857
754
|
const root = this.#appRef.components[0];
|
|
755
|
+
if (root == null) {
|
|
756
|
+
throw new Error("Root component not found");
|
|
757
|
+
}
|
|
858
758
|
return root.injector;
|
|
859
759
|
}
|
|
860
760
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -862,7 +762,7 @@ class LayerService {
|
|
|
862
762
|
}
|
|
863
763
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: LayerService, decorators: [{
|
|
864
764
|
type: Injectable
|
|
865
|
-
}]
|
|
765
|
+
}] });
|
|
866
766
|
|
|
867
767
|
const TRAITS = new InjectionToken("TRAITS");
|
|
868
768
|
let UID_COUNTER = 0;
|
|
@@ -909,10 +809,6 @@ class FloatingRef {
|
|
|
909
809
|
container.nativeElement.style.pointerEvents = "none";
|
|
910
810
|
});
|
|
911
811
|
this.state.control(container.state);
|
|
912
|
-
// TODO: remove
|
|
913
|
-
// this.state.status$.subscribe(status => {
|
|
914
|
-
// console.log("floating", status)
|
|
915
|
-
// })
|
|
916
812
|
}
|
|
917
813
|
show() {
|
|
918
814
|
return this.state.run("init", "showing", "shown");
|
|
@@ -1107,5 +1003,5 @@ function provideFloating(options = {}) {
|
|
|
1107
1003
|
* Generated bundle index. Do not edit.
|
|
1108
1004
|
*/
|
|
1109
1005
|
|
|
1110
|
-
export { AlwaysOnTop, AnimationTrait, AttributeTrait, BackdropRef, BackdropTrait, ChildRef, ComponentPortalRef, ContainerRef,
|
|
1006
|
+
export { AlwaysOnTop, AnimationTrait, AttributeTrait, BackdropRef, BackdropTrait, ChildRef, ComponentPortalRef, ContainerRef, DropAnimation, FadeAnimation, FallAnimation, FloatingComponentFactory, FloatingFactory, FloatingRef, FloatingService, FloatingTemplateFactory, FocusTrait, IndividualLayer, LAYER_CONTAINER_ZINDEX_START, LayerContainer, LayerService, PortalRef, PositionTrait, RootLayer, StyleTrait, TRAITS, TemplatePortalRef, attribute, backdrop, closeTrigger, dropAnimation, fadeAnimation, fallAnimation, focus, modal, position, provideFloating, style };
|
|
1111
1007
|
//# sourceMappingURL=ngutil-floating.mjs.map
|