@ethlete/core 5.0.0-next.14 → 5.0.0-next.16
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/CHANGELOG.md +12 -0
- package/fesm2022/ethlete-core.mjs +385 -49
- package/fesm2022/ethlete-core.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ethlete-core.d.ts +1399 -1259
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, ElementRef, Directive, assertInInjectionContext, DestroyRef, TemplateRef, QueryList, NgZone, signal, isSignal, untracked, DOCUMENT, linkedSignal, isDevMode, computed, afterNextRender, effect, Injector, booleanAttribute, numberAttribute,
|
|
2
|
+
import { InjectionToken, inject, ElementRef, Directive, assertInInjectionContext, DestroyRef, TemplateRef, QueryList, NgZone, signal, isSignal, untracked, DOCUMENT, linkedSignal, isDevMode, computed, afterNextRender, effect, EnvironmentInjector, runInInjectionContext, Injector, booleanAttribute, numberAttribute, RendererStyleFlags2, PLATFORM_ID, ApplicationRef, RendererFactory2, createComponent, model, ViewContainerRef, input, output, inputBinding, outputBinding, Pipe, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed, toSignal, toObservable, outputFromObservable } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { Subject, BehaviorSubject, debounceTime, combineLatest, map, merge, fromEvent, filter, tap, switchMap, startWith, of, timer, takeUntil, pairwise, distinctUntilChanged, take, Observable, concatMap, EMPTY, concat, defer, exhaustMap, share } from 'rxjs';
|
|
5
5
|
import { FormGroup, FormArray, FormControl } from '@angular/forms';
|
|
@@ -13,6 +13,30 @@ import { ComponentPortal } from '@angular/cdk/portal';
|
|
|
13
13
|
import { autoUpdate, computePosition, offset, flip, size, shift, limitShift, arrow, hide } from '@floating-ui/dom';
|
|
14
14
|
import { Title, Meta, DomSanitizer } from '@angular/platform-browser';
|
|
15
15
|
|
|
16
|
+
const ANIMATION_DEBUG_STORAGE_KEY = 'et-overlay-debug';
|
|
17
|
+
let cachedEnabled = null;
|
|
18
|
+
/**
|
|
19
|
+
* Debug logging for overlay and animation lifecycle internals.
|
|
20
|
+
* Enable via `localStorage.setItem('et-overlay-debug', 'true')` and reload.
|
|
21
|
+
*/
|
|
22
|
+
const isAnimationDebugEnabled = () => {
|
|
23
|
+
if (cachedEnabled === null) {
|
|
24
|
+
try {
|
|
25
|
+
cachedEnabled = globalThis.localStorage?.getItem(ANIMATION_DEBUG_STORAGE_KEY) === 'true';
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
cachedEnabled = false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return cachedEnabled;
|
|
32
|
+
};
|
|
33
|
+
const animationDebugLog = (scope, ...args) => {
|
|
34
|
+
if (!isAnimationDebugEnabled())
|
|
35
|
+
return;
|
|
36
|
+
const timestamp = (globalThis.performance?.now() ?? 0).toFixed(1);
|
|
37
|
+
console.log(`\x1B[36m[et-overlay-debug ${timestamp}ms | ${scope}]\x1B[m`, ...args);
|
|
38
|
+
};
|
|
39
|
+
|
|
16
40
|
const ANIMATABLE_TOKEN = new InjectionToken('ANIMATABLE_DIRECTIVE_TOKEN');
|
|
17
41
|
class AnimatableDirective {
|
|
18
42
|
constructor() {
|
|
@@ -31,7 +55,7 @@ class AnimatableDirective {
|
|
|
31
55
|
this.isAnimating$ = this.totalActiveAnimationCount$.pipe(map((count) => count > 0));
|
|
32
56
|
let didEmitStart = false;
|
|
33
57
|
const el = this.elementRef.nativeElement;
|
|
34
|
-
merge(merge(fromEvent(el, 'animationstart'), fromEvent(el, '
|
|
58
|
+
merge(merge(fromEvent(el, 'animationstart'), fromEvent(el, 'transitionrun')).pipe(filter((e) => e.target === el && !e.pseudoElement), map(() => 'start')), merge(fromEvent(el, 'animationend'), fromEvent(el, 'transitionend')).pipe(filter((e) => e.target === el && !e.pseudoElement), map(() => 'end')), merge(fromEvent(el, 'animationcancel'), fromEvent(el, 'transitioncancel')).pipe(filter((e) => e.target === el && !e.pseudoElement), map(() => 'cancel')))
|
|
35
59
|
.pipe(tap((eventType) => {
|
|
36
60
|
switch (eventType) {
|
|
37
61
|
case 'start': {
|
|
@@ -40,6 +64,7 @@ class AnimatableDirective {
|
|
|
40
64
|
if (startingNewBatch) {
|
|
41
65
|
this.activeBatchTransitionId = this.pendingTransitionIds.shift();
|
|
42
66
|
}
|
|
67
|
+
animationDebugLog(`animatable ${el.tagName.toLowerCase()}`, `start (count ${this.activeAnimationCount}, batch "${this.activeBatchTransitionId}", pending [${this.pendingTransitionIds.join(', ')}])`);
|
|
43
68
|
if (!didEmitStart) {
|
|
44
69
|
didEmitStart = true;
|
|
45
70
|
this.animationStartSubject$.next();
|
|
@@ -50,6 +75,7 @@ class AnimatableDirective {
|
|
|
50
75
|
case 'cancel': {
|
|
51
76
|
if (this.activeAnimationCount > 0) {
|
|
52
77
|
this.updateActiveAnimationCount(-1);
|
|
78
|
+
animationDebugLog(`animatable ${el.tagName.toLowerCase()}`, `${eventType} (count ${this.activeAnimationCount}, batch "${this.activeBatchTransitionId}")`);
|
|
53
79
|
if (this.activeAnimationCount === 0 && didEmitStart) {
|
|
54
80
|
didEmitStart = false;
|
|
55
81
|
this.animationEndSubject$.next({
|
|
@@ -60,6 +86,7 @@ class AnimatableDirective {
|
|
|
60
86
|
}
|
|
61
87
|
}
|
|
62
88
|
else {
|
|
89
|
+
animationDebugLog(`animatable ${el.tagName.toLowerCase()}`, `${eventType} ignored — count already 0 (start ${didEmitStart ? '' : 'not '}emitted)`);
|
|
63
90
|
console.warn(`${el.tagName} received animation end/cancel event but activeAnimationCount is already 0. Start was ${didEmitStart ? '' : 'not '}emitted.`);
|
|
64
91
|
}
|
|
65
92
|
break;
|
|
@@ -1101,10 +1128,14 @@ const deferredSignal = (valueFn) => {
|
|
|
1101
1128
|
return valueSignal;
|
|
1102
1129
|
};
|
|
1103
1130
|
const memoizeSignal = (factory) => {
|
|
1104
|
-
|
|
1131
|
+
const cache = new WeakMap();
|
|
1105
1132
|
return () => {
|
|
1106
|
-
|
|
1107
|
-
|
|
1133
|
+
const envInjector = inject(EnvironmentInjector);
|
|
1134
|
+
let cached = cache.get(envInjector);
|
|
1135
|
+
if (!cached) {
|
|
1136
|
+
cached = runInInjectionContext(envInjector, factory);
|
|
1137
|
+
cache.set(envInjector, cached);
|
|
1138
|
+
}
|
|
1108
1139
|
return cached;
|
|
1109
1140
|
};
|
|
1110
1141
|
};
|
|
@@ -2326,21 +2357,29 @@ const injectIsRouterInitialized = memoizeSignal(() => {
|
|
|
2326
2357
|
*/
|
|
2327
2358
|
const injectUrl = memoizeSignal(() => {
|
|
2328
2359
|
const event = injectRouterEvent();
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2360
|
+
const router = inject(Router);
|
|
2361
|
+
// Captured once for reads that happen before the router has committed any
|
|
2362
|
+
// navigation (SSR / initial load), where `router.url` isn't reliable yet.
|
|
2363
|
+
const initialRoute = createInitialRoute();
|
|
2364
|
+
return computed(() => {
|
|
2365
|
+
// We depend on `event` and `currentNavigation` only to get re-evaluated
|
|
2366
|
+
// around each navigation, but we read the *committed* url straight from the
|
|
2367
|
+
// router. The router commits `currentUrlTree` before it activates components,
|
|
2368
|
+
// so `router.url` is already correct inside a child component's constructor —
|
|
2369
|
+
// unlike the NavigationEnd event, which only reaches this signal *after*
|
|
2370
|
+
// activation.
|
|
2371
|
+
event();
|
|
2372
|
+
const currentNavigation = router.currentNavigation();
|
|
2373
|
+
// Before the very first navigation the router url isn't populated yet (e.g.
|
|
2374
|
+
// SSR / a deep link read before the initial navigation runs), so fall back
|
|
2375
|
+
// to the browser location captured at startup. `navigated` flips only at
|
|
2376
|
+
// NavigationEnd, so we also check for an in-flight navigation to stay correct
|
|
2377
|
+
// during the initial navigation's component construction.
|
|
2378
|
+
if (router.navigated || currentNavigation !== null) {
|
|
2379
|
+
return router.url;
|
|
2380
|
+
}
|
|
2381
|
+
return initialRoute;
|
|
2382
|
+
});
|
|
2344
2383
|
});
|
|
2345
2384
|
/**
|
|
2346
2385
|
* Inject the current route
|
|
@@ -2375,19 +2414,15 @@ const createRouterState = (router) => {
|
|
|
2375
2414
|
const injectRouterState = memoizeSignal(() => {
|
|
2376
2415
|
const event = injectRouterEvent();
|
|
2377
2416
|
const router = inject(Router);
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
}
|
|
2388
|
-
});
|
|
2389
|
-
});
|
|
2390
|
-
return computed(() => routerState(), { equal });
|
|
2417
|
+
// We only depend on `event` to get re-evaluated on every router event, but we
|
|
2418
|
+
// read the *committed* snapshot straight from the router. The router commits
|
|
2419
|
+
// `routerState` before it activates components (and emits ActivationStart
|
|
2420
|
+
// before NavigationEnd), so this is already correct inside a child component's
|
|
2421
|
+
// constructor — unlike an effect, which only flushes after construction.
|
|
2422
|
+
return computed(() => {
|
|
2423
|
+
event();
|
|
2424
|
+
return createRouterState(router);
|
|
2425
|
+
}, { equal });
|
|
2391
2426
|
});
|
|
2392
2427
|
/** Inject a signal containing the current route fragment (the part after the # inside the url if present) */
|
|
2393
2428
|
const injectFragment = (config) => {
|
|
@@ -2912,6 +2947,72 @@ const createSessionMemory = ({ key, parse, serialize }) => {
|
|
|
2912
2947
|
};
|
|
2913
2948
|
};
|
|
2914
2949
|
|
|
2950
|
+
const getClientXY = (event) => {
|
|
2951
|
+
if (event.type[0] === 't') {
|
|
2952
|
+
const touch = event.targetTouches[0] ?? event.changedTouches[0];
|
|
2953
|
+
return touch ? { clientX: touch.clientX, clientY: touch.clientY } : { clientX: 0, clientY: 0 };
|
|
2954
|
+
}
|
|
2955
|
+
return { clientX: event.clientX, clientY: event.clientY };
|
|
2956
|
+
};
|
|
2957
|
+
const createSwipeTracker = (startEvent) => {
|
|
2958
|
+
const { clientX: originClientX, clientY: originClientY } = getClientXY(startEvent);
|
|
2959
|
+
const startTime = Date.now();
|
|
2960
|
+
let movementX = 0;
|
|
2961
|
+
let movementY = 0;
|
|
2962
|
+
let isSwiping = false;
|
|
2963
|
+
let isScrolling = false;
|
|
2964
|
+
const update = (event) => {
|
|
2965
|
+
const { clientX, clientY } = getClientXY(event);
|
|
2966
|
+
movementX = clientX - originClientX;
|
|
2967
|
+
movementY = clientY - originClientY;
|
|
2968
|
+
const positiveMovementX = Math.abs(movementX);
|
|
2969
|
+
const positiveMovementY = Math.abs(movementY);
|
|
2970
|
+
if (!isSwiping && !isScrolling) {
|
|
2971
|
+
if (positiveMovementY > positiveMovementX) {
|
|
2972
|
+
isScrolling = true;
|
|
2973
|
+
}
|
|
2974
|
+
else {
|
|
2975
|
+
isSwiping = true;
|
|
2976
|
+
}
|
|
2977
|
+
}
|
|
2978
|
+
return {
|
|
2979
|
+
originClientX,
|
|
2980
|
+
originClientY,
|
|
2981
|
+
timestamp: startTime,
|
|
2982
|
+
movementX,
|
|
2983
|
+
movementY,
|
|
2984
|
+
positiveMovementX,
|
|
2985
|
+
positiveMovementY,
|
|
2986
|
+
isScrolling,
|
|
2987
|
+
isSwiping,
|
|
2988
|
+
};
|
|
2989
|
+
};
|
|
2990
|
+
const end = () => {
|
|
2991
|
+
const swipeTime = Math.max(1, Date.now() - startTime);
|
|
2992
|
+
const positiveMovementX = Math.abs(movementX);
|
|
2993
|
+
const positiveMovementY = Math.abs(movementY);
|
|
2994
|
+
const pixelPerSecondX = (movementX / swipeTime) * 1000;
|
|
2995
|
+
const pixelPerSecondY = (movementY / swipeTime) * 1000;
|
|
2996
|
+
return {
|
|
2997
|
+
movementX,
|
|
2998
|
+
movementY,
|
|
2999
|
+
positiveMovementX,
|
|
3000
|
+
positiveMovementY,
|
|
3001
|
+
pixelPerSecondX,
|
|
3002
|
+
pixelPerSecondY,
|
|
3003
|
+
positivePixelPerSecondX: Math.abs(pixelPerSecondX),
|
|
3004
|
+
positivePixelPerSecondY: Math.abs(pixelPerSecondY),
|
|
3005
|
+
originClientX,
|
|
3006
|
+
originClientY,
|
|
3007
|
+
};
|
|
3008
|
+
};
|
|
3009
|
+
const cancel = () => {
|
|
3010
|
+
movementX = 0;
|
|
3011
|
+
movementY = 0;
|
|
3012
|
+
};
|
|
3013
|
+
return { update, end, cancel };
|
|
3014
|
+
};
|
|
3015
|
+
|
|
2915
3016
|
const [, injectAngularRootElement] = createRootProvider(() => {
|
|
2916
3017
|
const appRef = inject(ApplicationRef);
|
|
2917
3018
|
const rootElement = signal(null, ...(ngDevMode ? [{ debugName: "rootElement" }] : /* istanbul ignore next */ []));
|
|
@@ -3318,6 +3419,7 @@ class AnimatedLifecycleDirective {
|
|
|
3318
3419
|
if (currentState === 'entering')
|
|
3319
3420
|
return;
|
|
3320
3421
|
if ((currentState === 'init' && !this.isConstructed) || this.skipNextEnter()) {
|
|
3422
|
+
this.debugLog('enter: instant (not constructed or skipNextEnter)', { currentState });
|
|
3321
3423
|
this.updateState('entered');
|
|
3322
3424
|
this.skipNextEnter.set(false);
|
|
3323
3425
|
this.addClass(ANIMATION_CLASSES.enterDone);
|
|
@@ -3333,6 +3435,10 @@ class AnimatedLifecycleDirective {
|
|
|
3333
3435
|
this.animatable.setTransitionId(transitionId);
|
|
3334
3436
|
const skipAnimation = this.forcedAtFrameId !== null && this.forcedAtFrameId === this.currentFrameId;
|
|
3335
3437
|
this.forcedAtFrameId = null;
|
|
3438
|
+
this.debugLog(`enter: ${skipAnimation ? 'skip (forced this frame)' : isInterrupting ? 'interrupting leave' : 'normal'}`, {
|
|
3439
|
+
currentState,
|
|
3440
|
+
transitionId,
|
|
3441
|
+
});
|
|
3336
3442
|
if (skipAnimation) {
|
|
3337
3443
|
this.removeClasses(ANIMATION_CLASSES.leaveFrom, ANIMATION_CLASSES.leaveActive, ANIMATION_CLASSES.leaveTo, ANIMATION_CLASSES.leaveInterrupt);
|
|
3338
3444
|
this.updateState('entered');
|
|
@@ -3383,6 +3489,7 @@ class AnimatedLifecycleDirective {
|
|
|
3383
3489
|
if (currentState === 'leaving')
|
|
3384
3490
|
return;
|
|
3385
3491
|
if (currentState === 'init') {
|
|
3492
|
+
this.debugLog('leave: instant (state is init, enter never ran)');
|
|
3386
3493
|
this.updateState('left');
|
|
3387
3494
|
this.addClass(ANIMATION_CLASSES.leaveDone);
|
|
3388
3495
|
this.forcedAtFrameId = null;
|
|
@@ -3397,6 +3504,10 @@ class AnimatedLifecycleDirective {
|
|
|
3397
3504
|
this.animatable.setTransitionId(transitionId);
|
|
3398
3505
|
const skipAnimation = this.forcedAtFrameId !== null && this.forcedAtFrameId === this.currentFrameId;
|
|
3399
3506
|
this.forcedAtFrameId = null;
|
|
3507
|
+
this.debugLog(`leave: ${skipAnimation ? 'skip (forced this frame)' : isInterrupting ? 'interrupting enter' : 'normal'}`, {
|
|
3508
|
+
currentState,
|
|
3509
|
+
transitionId,
|
|
3510
|
+
});
|
|
3400
3511
|
if (skipAnimation) {
|
|
3401
3512
|
this.removeClasses(ANIMATION_CLASSES.enterFrom, ANIMATION_CLASSES.enterActive, ANIMATION_CLASSES.enterTo, ANIMATION_CLASSES.enterInterrupt);
|
|
3402
3513
|
this.updateState('left');
|
|
@@ -3477,21 +3588,33 @@ class AnimatedLifecycleDirective {
|
|
|
3477
3588
|
addClasses.forEach((cls) => this.addClass(cls));
|
|
3478
3589
|
fromNextFrame()
|
|
3479
3590
|
.pipe(switchMap(() => this.animatable.isAnimating$), take(1), switchMap((isAnimating) => {
|
|
3591
|
+
if (isAnimating) {
|
|
3592
|
+
return of(true);
|
|
3593
|
+
}
|
|
3594
|
+
this.debugLog(`${transitionId}: interrupt found no running transition, re-checking next frame`);
|
|
3595
|
+
return fromNextFrame().pipe(switchMap(() => this.animatable.isAnimating$), take(1));
|
|
3596
|
+
}), take(1), switchMap((isAnimating) => {
|
|
3480
3597
|
if (!isAnimating && this.state$.value === expectedState) {
|
|
3598
|
+
this.debugLog(`${transitionId}: interrupt completes INSTANTLY (no transition running after class swap)`);
|
|
3481
3599
|
return of({ cancelled: false, transitionId });
|
|
3482
3600
|
}
|
|
3601
|
+
this.debugLog(`${transitionId}: interrupt waiting for animation end`, { isAnimating });
|
|
3483
3602
|
return this.animatable.animationEnd$.pipe(switchMap((e) => {
|
|
3484
3603
|
if (e.transitionId === transitionId) {
|
|
3485
3604
|
return of(e);
|
|
3486
3605
|
}
|
|
3487
3606
|
return this.animatable.isAnimating$.pipe(take(1), switchMap((stillAnimating) => {
|
|
3488
3607
|
if (!stillAnimating && this.state$.value === expectedState) {
|
|
3608
|
+
this.debugLog(`${transitionId}: interrupt completes via foreign animation end (batch id was "${e.transitionId}")`, { stillAnimating });
|
|
3489
3609
|
return of({ cancelled: false, transitionId });
|
|
3490
3610
|
}
|
|
3491
3611
|
return of(null);
|
|
3492
3612
|
}));
|
|
3493
3613
|
}), filter((e) => e !== null && e.transitionId === transitionId));
|
|
3494
|
-
}), filter((e) => this.state$.value === expectedState && !e.cancelled), tap(() =>
|
|
3614
|
+
}), filter((e) => this.state$.value === expectedState && !e.cancelled), tap(() => {
|
|
3615
|
+
this.debugLog(`${transitionId}: interrupt complete`);
|
|
3616
|
+
onComplete();
|
|
3617
|
+
}), take(1), takeUntil(cancelSignal), takeUntilDestroyed(this.destroyRef))
|
|
3495
3618
|
.subscribe();
|
|
3496
3619
|
}
|
|
3497
3620
|
addClass(className) {
|
|
@@ -3504,8 +3627,19 @@ class AnimatedLifecycleDirective {
|
|
|
3504
3627
|
this.renderer.removeClass(this.element, ...classNames);
|
|
3505
3628
|
}
|
|
3506
3629
|
updateState(newState) {
|
|
3630
|
+
this.debugLog(`state: ${this.state$.value} → ${newState}`);
|
|
3507
3631
|
this.state$.next(newState);
|
|
3508
3632
|
}
|
|
3633
|
+
debugLog(message, data) {
|
|
3634
|
+
const el = this.element;
|
|
3635
|
+
const scope = `lifecycle ${el.tagName.toLowerCase()}${el.classList.contains('et-overlay') ? '.et-overlay' : ''}`;
|
|
3636
|
+
if (data) {
|
|
3637
|
+
animationDebugLog(scope, message, data);
|
|
3638
|
+
}
|
|
3639
|
+
else {
|
|
3640
|
+
animationDebugLog(scope, message);
|
|
3641
|
+
}
|
|
3642
|
+
}
|
|
3509
3643
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: AnimatedLifecycleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3510
3644
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.13", type: AnimatedLifecycleDirective, isStandalone: true, selector: "[etAnimatedLifecycle]", inputs: { skipNextEnter: { classPropertyName: "skipNextEnter", publicName: "skipNextEnter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { stateChange: "stateChange", skipNextEnter: "skipNextEnterChange" }, host: { classAttribute: "et-force-invisible" }, providers: [
|
|
3511
3645
|
{
|
|
@@ -4049,15 +4183,21 @@ class ScrollObserverDirective {
|
|
|
4049
4183
|
constructor() {
|
|
4050
4184
|
this.elementRef = inject(ElementRef);
|
|
4051
4185
|
this.enabled = model(true, ...(ngDevMode ? [{ debugName: "enabled" }] : /* istanbul ignore next */ []));
|
|
4186
|
+
this.enabledValue = computed(() => {
|
|
4187
|
+
const enabled = this.enabled();
|
|
4188
|
+
if (isSignal(enabled))
|
|
4189
|
+
return enabled();
|
|
4190
|
+
return enabled;
|
|
4191
|
+
}, ...(ngDevMode ? [{ debugName: "enabledValue" }] : /* istanbul ignore next */ []));
|
|
4052
4192
|
this._startEl = signal(null, ...(ngDevMode ? [{ debugName: "_startEl" }] : /* istanbul ignore next */ []));
|
|
4053
4193
|
this._endEl = signal(null, ...(ngDevMode ? [{ debugName: "_endEl" }] : /* istanbul ignore next */ []));
|
|
4054
4194
|
this._startIntersection = signalElementIntersection(this._startEl, {
|
|
4055
4195
|
root: this.elementRef,
|
|
4056
|
-
enabled: this.
|
|
4196
|
+
enabled: this.enabledValue,
|
|
4057
4197
|
});
|
|
4058
4198
|
this._endIntersection = signalElementIntersection(this._endEl, {
|
|
4059
4199
|
root: this.elementRef,
|
|
4060
|
-
enabled: this.
|
|
4200
|
+
enabled: this.enabledValue,
|
|
4061
4201
|
});
|
|
4062
4202
|
this.isAtStart = computed(() => this._startIntersection()[0]?.isIntersecting ?? false, ...(ngDevMode ? [{ debugName: "isAtStart" }] : /* istanbul ignore next */ []));
|
|
4063
4203
|
this.isAtEnd = computed(() => this._endIntersection()[0]?.isIntersecting ?? false, ...(ngDevMode ? [{ debugName: "isAtEnd" }] : /* istanbul ignore next */ []));
|
|
@@ -4284,8 +4424,50 @@ const applyCenteredPosition = (hostElement, paneElement, renderer, _config) => {
|
|
|
4284
4424
|
position: 'relative',
|
|
4285
4425
|
});
|
|
4286
4426
|
};
|
|
4427
|
+
const applyGlobalPosition = (hostElement, paneElement, renderer, config) => {
|
|
4428
|
+
renderer.setStyle(hostElement, {
|
|
4429
|
+
display: 'grid',
|
|
4430
|
+
// an explicit full-size cell keeps the grid area definite so percentage
|
|
4431
|
+
// based pane sizes (e.g. max-height: calc(100% - 72px)) can resolve
|
|
4432
|
+
gridTemplateRows: '100%',
|
|
4433
|
+
gridTemplateColumns: '100%',
|
|
4434
|
+
placeItems: `${config.vertical ?? 'center'} ${config.horizontal ?? 'center'}`,
|
|
4435
|
+
padding: config.padding ?? '0',
|
|
4436
|
+
});
|
|
4437
|
+
renderer.setStyle(paneElement, {
|
|
4438
|
+
position: 'relative',
|
|
4439
|
+
});
|
|
4440
|
+
};
|
|
4441
|
+
/**
|
|
4442
|
+
* Clears every inline style any position strategy kind may have set and
|
|
4443
|
+
* restores the base element styles, so a different strategy can be applied afterwards.
|
|
4444
|
+
*/
|
|
4445
|
+
const resetPositioningStyles = (config, hostElement, paneElement, renderer) => {
|
|
4446
|
+
renderer.setStyle(hostElement, {
|
|
4447
|
+
gridTemplateRows: null,
|
|
4448
|
+
gridTemplateColumns: null,
|
|
4449
|
+
placeItems: null,
|
|
4450
|
+
padding: null,
|
|
4451
|
+
overflow: null,
|
|
4452
|
+
});
|
|
4453
|
+
renderer.setStyle(paneElement, {
|
|
4454
|
+
position: null,
|
|
4455
|
+
top: null,
|
|
4456
|
+
left: null,
|
|
4457
|
+
width: null,
|
|
4458
|
+
transform: null,
|
|
4459
|
+
visibility: null,
|
|
4460
|
+
});
|
|
4461
|
+
renderer.setCssProperties(paneElement, {
|
|
4462
|
+
'--et-overlay-max-width': null,
|
|
4463
|
+
'--et-overlay-max-height': null,
|
|
4464
|
+
'--et-overlay-anchored-x': null,
|
|
4465
|
+
'--et-overlay-anchored-y': null,
|
|
4466
|
+
});
|
|
4467
|
+
renderer.removeAttribute(paneElement, 'data-overlay-placement');
|
|
4468
|
+
setBaseElementStyles(config, hostElement, paneElement, renderer);
|
|
4469
|
+
};
|
|
4287
4470
|
const createAnchoredPositionCleanup = (strategy, paneElement, overlayRef, renderer) => {
|
|
4288
|
-
const arrowElement = paneElement.querySelector('[et-floating-arrow]');
|
|
4289
4471
|
renderer.setStyle(paneElement, {
|
|
4290
4472
|
position: 'absolute',
|
|
4291
4473
|
top: '0',
|
|
@@ -4293,6 +4475,7 @@ const createAnchoredPositionCleanup = (strategy, paneElement, overlayRef, render
|
|
|
4293
4475
|
width: strategy.mirrorWidth ? `${strategy.referenceElement.offsetWidth}px` : 'max-content',
|
|
4294
4476
|
});
|
|
4295
4477
|
const cleanup = autoUpdate(strategy.referenceElement, paneElement, () => {
|
|
4478
|
+
const arrowElement = paneElement.querySelector('[et-floating-arrow]');
|
|
4296
4479
|
const middleware = [];
|
|
4297
4480
|
middleware.push(offset(strategy.offset ?? 8));
|
|
4298
4481
|
middleware.push(flip({
|
|
@@ -4336,6 +4519,11 @@ const createAnchoredPositionCleanup = (strategy, paneElement, overlayRef, render
|
|
|
4336
4519
|
transform: `translate3d(${x}px, ${y}px, 0)`,
|
|
4337
4520
|
width: strategy.mirrorWidth ? `${strategy.referenceElement.offsetWidth}px` : null,
|
|
4338
4521
|
});
|
|
4522
|
+
// exposed so animations can compose their transforms with the anchored position
|
|
4523
|
+
renderer.setCssProperties(paneElement, {
|
|
4524
|
+
'--et-overlay-anchored-x': `${x}px`,
|
|
4525
|
+
'--et-overlay-anchored-y': `${y}px`,
|
|
4526
|
+
});
|
|
4339
4527
|
renderer.setAttribute(paneElement, 'data-overlay-placement', placement);
|
|
4340
4528
|
if (arrowElement && middlewareData.arrow) {
|
|
4341
4529
|
renderer.setCssProperty(arrowElement, '--et-floating-arrow-translate', `translate3d(${middlewareData.arrow.x ?? 0}px, ${middlewareData.arrow.y ?? 0}px, 0)`);
|
|
@@ -4367,6 +4555,10 @@ const setupPositioning = (config, hostElement, paneElement, overlayRef, renderer
|
|
|
4367
4555
|
});
|
|
4368
4556
|
return createAnchoredPositionCleanup(strategy, paneElement, overlayRef, renderer);
|
|
4369
4557
|
}
|
|
4558
|
+
if (strategy.kind === 'global') {
|
|
4559
|
+
applyGlobalPosition(hostElement, paneElement, renderer, strategy);
|
|
4560
|
+
return () => undefined;
|
|
4561
|
+
}
|
|
4370
4562
|
applyCenteredPosition(hostElement, paneElement, renderer, strategy);
|
|
4371
4563
|
return () => undefined;
|
|
4372
4564
|
};
|
|
@@ -4374,6 +4566,7 @@ const setupPositioning = (config, hostElement, paneElement, overlayRef, renderer
|
|
|
4374
4566
|
const createOverlayRuntimeRef = (id, config, elements, requestClose) => {
|
|
4375
4567
|
const _state = signal('mounting', ...(ngDevMode ? [{ debugName: "_state" }] : /* istanbul ignore next */ []));
|
|
4376
4568
|
const _componentInstance = signal(null, ...(ngDevMode ? [{ debugName: "_componentInstance" }] : /* istanbul ignore next */ []));
|
|
4569
|
+
let positionUpdater = null;
|
|
4377
4570
|
const beforeOpenedSubject = new Subject();
|
|
4378
4571
|
const afterOpenedSubject = new Subject();
|
|
4379
4572
|
const beforeClosedSubject = new Subject();
|
|
@@ -4407,6 +4600,16 @@ const createOverlayRuntimeRef = (id, config, elements, requestClose) => {
|
|
|
4407
4600
|
attachComponentRef(componentRef) {
|
|
4408
4601
|
_componentInstance.set(componentRef.instance);
|
|
4409
4602
|
},
|
|
4603
|
+
/** @internal */
|
|
4604
|
+
attachPositionUpdater(updater) {
|
|
4605
|
+
positionUpdater = updater;
|
|
4606
|
+
},
|
|
4607
|
+
updatePositionStrategy(strategy) {
|
|
4608
|
+
if (_state() === 'closing' || _state() === 'closed') {
|
|
4609
|
+
return;
|
|
4610
|
+
}
|
|
4611
|
+
positionUpdater?.(strategy);
|
|
4612
|
+
},
|
|
4410
4613
|
markOpened() {
|
|
4411
4614
|
if (_state() !== 'mounting') {
|
|
4412
4615
|
return;
|
|
@@ -4445,10 +4648,18 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4445
4648
|
const openEntriesState = signal([], ...(ngDevMode ? [{ debugName: "openEntriesState" }] : /* istanbul ignore next */ []));
|
|
4446
4649
|
const openEntries = computed(() => openEntriesState(), ...(ngDevMode ? [{ debugName: "openEntries" }] : /* istanbul ignore next */ []));
|
|
4447
4650
|
let rootElement = null;
|
|
4651
|
+
// Synchronous teardown for each currently-mounted overlay, run when the runtime's injector is
|
|
4652
|
+
// destroyed (app teardown). Registered on mount, removed once the overlay is destroyed normally.
|
|
4653
|
+
const mountedTeardowns = new Set();
|
|
4448
4654
|
const getRootElement = () => {
|
|
4449
4655
|
if (rootElement) {
|
|
4450
4656
|
return rootElement;
|
|
4451
4657
|
}
|
|
4658
|
+
// A previous Angular app (e.g. the one that existed before a Storybook HMR update or story
|
|
4659
|
+
// switch) may have left its runtime root orphaned in <body> if it was torn down mid-animation.
|
|
4660
|
+
// Such a node keeps a backdrop/pane on screen and blocks pointer events, so clear any stragglers
|
|
4661
|
+
// before creating ours.
|
|
4662
|
+
document.querySelectorAll('.et-overlay-runtime-root').forEach((el) => el.remove());
|
|
4452
4663
|
rootElement = renderer.createElement('div');
|
|
4453
4664
|
renderer.addClass(rootElement, 'et-overlay-runtime-root');
|
|
4454
4665
|
renderer.setStyle(rootElement, {
|
|
@@ -4491,7 +4702,6 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4491
4702
|
const previousFocusedElement = isHTMLElement(document.activeElement) ? document.activeElement : null;
|
|
4492
4703
|
const autoFocus = config.autoFocus ?? 'first-tabbable';
|
|
4493
4704
|
renderer.addClass(hostElement, 'et-overlay-runtime-entry');
|
|
4494
|
-
renderer.addClass(paneElement, 'et-overlay-runtime-pane');
|
|
4495
4705
|
setBaseElementStyles(config, hostElement, paneElement, renderer);
|
|
4496
4706
|
renderer.setAttributes(hostElement, {
|
|
4497
4707
|
'data-overlay-id': config.id,
|
|
@@ -4503,7 +4713,6 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4503
4713
|
'aria-label': config.ariaLabel ?? null,
|
|
4504
4714
|
});
|
|
4505
4715
|
renderer.addClass(hostElement, ...(config.hostClass ?? []));
|
|
4506
|
-
renderer.addClass(paneElement, ...(config.paneClass ?? []));
|
|
4507
4716
|
if (backdropElement) {
|
|
4508
4717
|
renderer.addClass(backdropElement, 'et-overlay-runtime-backdrop');
|
|
4509
4718
|
setBackdropStyles(backdropElement, renderer);
|
|
@@ -4519,6 +4728,10 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4519
4728
|
backdropElement,
|
|
4520
4729
|
paneElement,
|
|
4521
4730
|
}, (result, source) => beginClose({ result, source }));
|
|
4731
|
+
animationDebugLog(`runtime ${config.id}`, 'mount');
|
|
4732
|
+
// matches the previous overlay behavior: escape/outside-pointer closes are
|
|
4733
|
+
// ignored until the enter transition has started plus one frame
|
|
4734
|
+
let interactiveCloseReady = false;
|
|
4522
4735
|
const cleanupFns = [];
|
|
4523
4736
|
const parentInjector = config.injector ?? config.viewContainerRef?.injector ?? environmentInjector;
|
|
4524
4737
|
const elementInjector = Injector.create({
|
|
@@ -4529,15 +4742,31 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4529
4742
|
environmentInjector,
|
|
4530
4743
|
elementInjector,
|
|
4531
4744
|
hostElement: paneElement,
|
|
4532
|
-
bindings:
|
|
4745
|
+
bindings: [
|
|
4746
|
+
...Object.entries(config.inputBindings ?? {}).map(([key, value]) => inputBinding(key, () => value)),
|
|
4747
|
+
...Object.entries(config.outputBindings ?? {}).map(([key, listener]) => outputBinding(key, listener)),
|
|
4748
|
+
],
|
|
4533
4749
|
});
|
|
4750
|
+
// pane classes are applied after component creation — Angular replaces the host
|
|
4751
|
+
// element's class attribute with the component's static host class on creation
|
|
4752
|
+
renderer.addClass(paneElement, 'et-overlay-runtime-pane', ...(config.paneClass ?? []));
|
|
4534
4753
|
appRef.attachView(componentRef.hostView);
|
|
4535
4754
|
overlayRef.attachComponentRef(componentRef);
|
|
4536
4755
|
overlayRef.beforeOpenedSubject.next();
|
|
4537
4756
|
overlayRef.beforeOpenedSubject.complete();
|
|
4538
4757
|
openEntriesState.update((entries) => [...entries, overlayRef]);
|
|
4539
|
-
|
|
4758
|
+
let positionCleanup = setupPositioning(config, hostElement, paneElement, overlayRef, renderer);
|
|
4759
|
+
cleanupFns.push(() => positionCleanup());
|
|
4760
|
+
let currentPositionStrategy = config.positionStrategy;
|
|
4761
|
+
const getOriginElement = () => currentPositionStrategy?.kind === 'anchored' ? currentPositionStrategy.referenceElement : null;
|
|
4762
|
+
overlayRef.attachPositionUpdater((strategy) => {
|
|
4763
|
+
currentPositionStrategy = strategy;
|
|
4764
|
+
positionCleanup();
|
|
4765
|
+
resetPositioningStyles(config, hostElement, paneElement, renderer);
|
|
4766
|
+
positionCleanup = setupPositioning({ ...config, positionStrategy: strategy }, hostElement, paneElement, overlayRef, renderer);
|
|
4767
|
+
});
|
|
4540
4768
|
const destroyMountedOverlay = (closeEvent) => {
|
|
4769
|
+
animationDebugLog(`runtime ${config.id}`, `destroy (source "${closeEvent.source}")`);
|
|
4541
4770
|
cleanupFns.forEach((cleanup) => cleanup());
|
|
4542
4771
|
appRef.detachView(componentRef.hostView);
|
|
4543
4772
|
componentRef.destroy();
|
|
@@ -4552,16 +4781,27 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4552
4781
|
}
|
|
4553
4782
|
overlayRef.finishClose(closeEvent);
|
|
4554
4783
|
};
|
|
4784
|
+
// Allows the runtime to synchronously destroy this overlay on app teardown, bypassing the
|
|
4785
|
+
// async leave animation (whose completion callback would never fire once the app is gone).
|
|
4786
|
+
const forceTeardown = () => destroyMountedOverlay({ result: undefined, source: 'api' });
|
|
4787
|
+
mountedTeardowns.add(forceTeardown);
|
|
4788
|
+
cleanupFns.push(() => mountedTeardowns.delete(forceTeardown));
|
|
4555
4789
|
const beginClose = (closeEvent) => {
|
|
4556
4790
|
if (!overlayRef.beginClose(closeEvent)) {
|
|
4557
4791
|
return;
|
|
4558
4792
|
}
|
|
4559
4793
|
const lifecycle = getAnimatedLifecycle(componentRef);
|
|
4794
|
+
animationDebugLog(`runtime ${config.id}`, `close requested (source "${closeEvent.source}", lifecycle state "${lifecycle?.state$.value ?? 'none'}", delegate ${config.animationDelegate?.leave ? 'yes' : 'no'})`);
|
|
4560
4795
|
if (!lifecycle) {
|
|
4561
4796
|
destroyMountedOverlay(closeEvent);
|
|
4562
4797
|
return;
|
|
4563
4798
|
}
|
|
4564
|
-
|
|
4799
|
+
if (config.animationDelegate?.leave) {
|
|
4800
|
+
config.animationDelegate.leave({ lifecycle, elements: overlayRef.elements, closeEvent });
|
|
4801
|
+
}
|
|
4802
|
+
else {
|
|
4803
|
+
lifecycle.leave();
|
|
4804
|
+
}
|
|
4565
4805
|
lifecycle.state$
|
|
4566
4806
|
.pipe(filter((state) => state === 'left'), take(1))
|
|
4567
4807
|
.subscribe(() => {
|
|
@@ -4574,6 +4814,10 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4574
4814
|
if (event.key !== 'Escape' || !isTopMost(overlayRef)) {
|
|
4575
4815
|
return;
|
|
4576
4816
|
}
|
|
4817
|
+
if (!interactiveCloseReady) {
|
|
4818
|
+
animationDebugLog(`runtime ${config.id}`, 'escape ignored (enter transition has not started yet)');
|
|
4819
|
+
return;
|
|
4820
|
+
}
|
|
4577
4821
|
event.preventDefault();
|
|
4578
4822
|
overlayRef.close(undefined, 'escape');
|
|
4579
4823
|
};
|
|
@@ -4590,7 +4834,21 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4590
4834
|
if (!isHTMLElement(target) || paneElement.contains(target)) {
|
|
4591
4835
|
return;
|
|
4592
4836
|
}
|
|
4837
|
+
if (!interactiveCloseReady) {
|
|
4838
|
+
animationDebugLog(`runtime ${config.id}`, 'outside pointer ignored (enter transition has not started yet)');
|
|
4839
|
+
return;
|
|
4840
|
+
}
|
|
4593
4841
|
overlayRef.close(undefined, 'outside-pointer');
|
|
4842
|
+
const originElement = getOriginElement();
|
|
4843
|
+
if (originElement && originElement.contains(target)) {
|
|
4844
|
+
const swallowReopenClick = (clickEvent) => {
|
|
4845
|
+
if (isHTMLElement(clickEvent.target) && originElement.contains(clickEvent.target)) {
|
|
4846
|
+
clickEvent.stopImmediatePropagation();
|
|
4847
|
+
clickEvent.preventDefault();
|
|
4848
|
+
}
|
|
4849
|
+
};
|
|
4850
|
+
document.addEventListener('click', swallowReopenClick, { capture: true, once: true });
|
|
4851
|
+
}
|
|
4594
4852
|
};
|
|
4595
4853
|
document.addEventListener('pointerdown', onPointerDown, true);
|
|
4596
4854
|
cleanupFns.push(() => document.removeEventListener('pointerdown', onPointerDown, true));
|
|
@@ -4598,15 +4856,31 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4598
4856
|
cleanupFns.push(setupFocusTrap(paneElement, overlayRef, config.modal !== false, isTopMost, document));
|
|
4599
4857
|
nextFrame(() => {
|
|
4600
4858
|
if (overlayRef.state() !== 'mounting') {
|
|
4859
|
+
animationDebugLog(`runtime ${config.id}`, `enter skipped (state "${overlayRef.state()}" before enter frame)`);
|
|
4601
4860
|
return;
|
|
4602
4861
|
}
|
|
4603
4862
|
const lifecycle = getAnimatedLifecycle(componentRef);
|
|
4604
4863
|
if (!lifecycle) {
|
|
4864
|
+
interactiveCloseReady = true;
|
|
4605
4865
|
applyInitialFocus(paneElement, autoFocus, document);
|
|
4606
4866
|
overlayRef.markOpened();
|
|
4607
4867
|
return;
|
|
4608
4868
|
}
|
|
4609
|
-
|
|
4869
|
+
animationDebugLog(`runtime ${config.id}`, `enter (delegate ${config.animationDelegate?.enter ? 'yes' : 'no'}, lifecycle state "${lifecycle.state$.value}")`);
|
|
4870
|
+
const readySubscription = lifecycle.state$
|
|
4871
|
+
.pipe(filter((state) => state === 'entering' || state === 'entered'), take(1))
|
|
4872
|
+
.subscribe(() => {
|
|
4873
|
+
nextFrame(() => {
|
|
4874
|
+
interactiveCloseReady = true;
|
|
4875
|
+
});
|
|
4876
|
+
});
|
|
4877
|
+
cleanupFns.push(() => readySubscription.unsubscribe());
|
|
4878
|
+
if (config.animationDelegate?.enter) {
|
|
4879
|
+
config.animationDelegate.enter({ lifecycle, elements: overlayRef.elements });
|
|
4880
|
+
}
|
|
4881
|
+
else {
|
|
4882
|
+
lifecycle.enter();
|
|
4883
|
+
}
|
|
4610
4884
|
lifecycle.state$
|
|
4611
4885
|
.pipe(filter((state) => state === 'entered'), take(1))
|
|
4612
4886
|
.subscribe(() => {
|
|
@@ -4617,7 +4891,7 @@ const [provideOverlayRuntime, injectOverlayRuntime] = createRootProvider(() => {
|
|
|
4617
4891
|
return overlayRef;
|
|
4618
4892
|
};
|
|
4619
4893
|
destroyRef.onDestroy(() => {
|
|
4620
|
-
|
|
4894
|
+
[...mountedTeardowns].forEach((teardown) => teardown());
|
|
4621
4895
|
maybeDestroyRootElement();
|
|
4622
4896
|
});
|
|
4623
4897
|
return {
|
|
@@ -6418,13 +6692,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
|
|
|
6418
6692
|
|
|
6419
6693
|
class ColorInteractiveStylesComponent {
|
|
6420
6694
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ColorInteractiveStylesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6421
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: ColorInteractiveStylesComponent, isStandalone: true, selector: "et-color-interactive-styles", ngImport: i0, template: '', isInline: true, styles: [":where(.et-color-interactive:hover:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:hover) :where(.et-color-interactive){--et-theme-color-primary-rgb: var(--et-color-primary-hover, var(--et-color-primary));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var(--et-color-on-primary-hover, var(--et-color-on-primary));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:focus-visible){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:active:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:active) :where(.et-color-interactive){--et-theme-color-primary-rgb: var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive--has-focus:has(:focus-visible)){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive[disabled]),:where(.et-color-interactive[aria-disabled=true]){--et-theme-color-primary-rgb: var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-disabled, var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) ) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-disabled, var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
6695
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: ColorInteractiveStylesComponent, isStandalone: true, selector: "et-color-interactive-styles", ngImport: i0, template: '', isInline: true, styles: [":where(.et-color-interactive){--et-theme-color-primary-rgb: var(--et-color-primary);--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var(--et-color-on-primary);--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var(--et-color-primary-ink, var(--et-color-primary));--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:hover:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:hover) :where(.et-color-interactive){--et-theme-color-primary-rgb: var(--et-color-primary-hover, var(--et-color-primary));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var(--et-color-on-primary-hover, var(--et-color-on-primary));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:focus-visible){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:active:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:active) :where(.et-color-interactive){--et-theme-color-primary-rgb: var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive--has-focus:has(:focus-visible)){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive[disabled]),:where(.et-color-interactive[aria-disabled=true]){--et-theme-color-primary-rgb: var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-disabled, var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) ) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-disabled, var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
6422
6696
|
}
|
|
6423
6697
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ColorInteractiveStylesComponent, decorators: [{
|
|
6424
6698
|
type: Component,
|
|
6425
|
-
args: [{ selector: 'et-color-interactive-styles', template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":where(.et-color-interactive:hover:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:hover) :where(.et-color-interactive){--et-theme-color-primary-rgb: var(--et-color-primary-hover, var(--et-color-primary));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var(--et-color-on-primary-hover, var(--et-color-on-primary));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:focus-visible){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:active:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:active) :where(.et-color-interactive){--et-theme-color-primary-rgb: var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive--has-focus:has(:focus-visible)){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive[disabled]),:where(.et-color-interactive[aria-disabled=true]){--et-theme-color-primary-rgb: var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-disabled, var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) ) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-disabled, var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}\n"] }]
|
|
6699
|
+
args: [{ selector: 'et-color-interactive-styles', template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":where(.et-color-interactive){--et-theme-color-primary-rgb: var(--et-color-primary);--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var(--et-color-on-primary);--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var(--et-color-primary-ink, var(--et-color-primary));--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:hover:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:hover) :where(.et-color-interactive){--et-theme-color-primary-rgb: var(--et-color-primary-hover, var(--et-color-primary));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var(--et-color-on-primary-hover, var(--et-color-on-primary));--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:focus-visible){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive:active:not(:has(.et-color-interactive-exclude:hover))),:where(.et-color-interactive-container:active) :where(.et-color-interactive){--et-theme-color-primary-rgb: var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive--has-focus:has(:focus-visible)){--et-theme-color-primary-rgb: var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)));--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary)) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var(--et-color-primary-ink, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}:where(.et-color-interactive[disabled]),:where(.et-color-interactive[aria-disabled=true]){--et-theme-color-primary-rgb: var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) );--et-theme-color-primary-solid: rgb(var(--et-theme-color-primary-rgb));--et-theme-color-on-primary-rgb: var( --et-color-on-primary-disabled, var( --et-color-on-primary-active, var(--et-color-on-primary-focus, var(--et-color-on-primary-hover, var(--et-color-on-primary))) ) );--et-theme-color-on-primary-solid: rgb(var(--et-theme-color-on-primary-rgb));--et-theme-color-ink-rgb: var( --et-color-primary-ink-disabled, var( --et-color-primary-ink-active, var( --et-color-primary-ink-focus, var( --et-color-primary-ink-hover, var( --et-color-primary-ink, var( --et-color-primary-disabled, var( --et-color-primary-active, var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary))) ) ) ) ) ) ) );--et-theme-color-ink-solid: rgb(var(--et-theme-color-ink-rgb))}\n"] }]
|
|
6426
6700
|
}] });
|
|
6427
6701
|
|
|
6702
|
+
/**
|
|
6703
|
+
* Cascades hover/active-driven color DOWN to descendants explicitly marked with
|
|
6704
|
+
* `ColorInteractiveDirective` — this element does not color itself. Use it when a wrapper should
|
|
6705
|
+
* expand a nested control's hit/visual area (e.g. clicking a checkbox's label should light up the
|
|
6706
|
+
* checkbox itself), never to give a wrapper its own interactive coloring — that's
|
|
6707
|
+
* `ColorInteractiveDirective`.
|
|
6708
|
+
*
|
|
6709
|
+
* Does nothing unless at least one descendant carries `ColorInteractiveDirective` — check for
|
|
6710
|
+
* that before adding this. It was mistakenly added to a component with no such descendant once
|
|
6711
|
+
* already, where it did nothing but was confusing to read.
|
|
6712
|
+
*/
|
|
6428
6713
|
class ColorInteractiveContainerDirective {
|
|
6429
6714
|
constructor() {
|
|
6430
6715
|
this.styleManager = injectStyleManager();
|
|
@@ -6443,6 +6728,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
|
|
|
6443
6728
|
}]
|
|
6444
6729
|
}], ctorParameters: () => [] });
|
|
6445
6730
|
|
|
6731
|
+
/**
|
|
6732
|
+
* Marks a descendant as NOT counting toward an ancestor's `ColorInteractiveDirective`
|
|
6733
|
+
* `:hover`/`:active` reaction (via the `:has()` guard in color-interactive-styles.component.css).
|
|
6734
|
+
* Use it for content that's incidentally inside an interactive ancestor but isn't part of what
|
|
6735
|
+
* makes that ancestor interactive — e.g. a hint/error block sitting inside a form field's frame.
|
|
6736
|
+
*
|
|
6737
|
+
* This only suppresses the ancestor's OWN reaction to hovering/pressing the excluded element — it
|
|
6738
|
+
* has no effect on custom-property inheritance into descendants past the excluded element. If
|
|
6739
|
+
* what you actually need is "stop my own cosmetic styling from reacting to a parent's unrelated
|
|
6740
|
+
* interaction," this is the wrong tool; that's the class of bug `ColorInteractiveHasFocusDirective`
|
|
6741
|
+
* used to have (see its own comment).
|
|
6742
|
+
*/
|
|
6446
6743
|
class ColorInteractiveExcludeDirective {
|
|
6447
6744
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ColorInteractiveExcludeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
6448
6745
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: ColorInteractiveExcludeDirective, isStandalone: true, selector: "[etColorInteractiveExclude]", host: { classAttribute: "et-color-interactive-exclude" }, ngImport: i0 }); }
|
|
@@ -6457,24 +6754,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
|
|
|
6457
6754
|
}]
|
|
6458
6755
|
}] });
|
|
6459
6756
|
|
|
6757
|
+
/**
|
|
6758
|
+
* Tints `--et-theme-color-primary-*` etc. only when a descendant genuinely has `:focus-visible`
|
|
6759
|
+
* (`:has(:focus-visible)`) — never on mouse `:hover`/`:active`. Use this for a wrapper (like a
|
|
6760
|
+
* form field's frame) that should show the theme color while its control is focused, but must
|
|
6761
|
+
* NOT react to incidental mouse interaction with unrelated nested widgets (a toolbar button, a
|
|
6762
|
+
* rendered link) that happen to live inside the same wrapper.
|
|
6763
|
+
*
|
|
6764
|
+
* Deliberately does NOT also carry `ColorInteractiveDirective`'s `et-color-interactive` class:
|
|
6765
|
+
* that class's plain `:hover`/`:active` rules locally override the same (inheriting)
|
|
6766
|
+
* `--et-theme-color-primary-rgb`, so anything bubbling up from ANYWHERE in the subtree would
|
|
6767
|
+
* leak the transient hover/press color into every descendant reading it for unrelated cosmetics —
|
|
6768
|
+
* exactly the bug this directive's only consumer (form-field) shipped once, before the two
|
|
6769
|
+
* behaviors were split apart. If you need the plain hover/active reaction too, add
|
|
6770
|
+
* `ColorInteractiveDirective` explicitly and make sure you actually want both.
|
|
6771
|
+
*/
|
|
6460
6772
|
class ColorInteractiveHasFocusDirective {
|
|
6461
6773
|
constructor() {
|
|
6462
6774
|
this.styleManager = injectStyleManager();
|
|
6463
6775
|
this.styleManager.mount(ColorInteractiveStylesComponent);
|
|
6464
6776
|
}
|
|
6465
6777
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ColorInteractiveHasFocusDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
6466
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: ColorInteractiveHasFocusDirective, isStandalone: true, selector: "[etColorInteractiveHasFocus]", host: { classAttribute: "et-color-interactive
|
|
6778
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: ColorInteractiveHasFocusDirective, isStandalone: true, selector: "[etColorInteractiveHasFocus]", host: { classAttribute: "et-color-interactive--has-focus" }, ngImport: i0 }); }
|
|
6467
6779
|
}
|
|
6468
6780
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: ColorInteractiveHasFocusDirective, decorators: [{
|
|
6469
6781
|
type: Directive,
|
|
6470
6782
|
args: [{
|
|
6471
6783
|
selector: '[etColorInteractiveHasFocus]',
|
|
6472
6784
|
host: {
|
|
6473
|
-
class: 'et-color-interactive
|
|
6785
|
+
class: 'et-color-interactive--has-focus',
|
|
6474
6786
|
},
|
|
6475
6787
|
}]
|
|
6476
6788
|
}], ctorParameters: () => [] });
|
|
6477
6789
|
|
|
6790
|
+
/**
|
|
6791
|
+
* Makes an element react to ITS OWN `:hover`/`:active`/`:focus-visible`/`[disabled]` by tinting
|
|
6792
|
+
* `--et-theme-color-primary-*`/`-on-primary-*`/`-ink-*` with the current color theme. Use this on
|
|
6793
|
+
* a single, self-contained interactive element — a button, a checkbox, a segmented button.
|
|
6794
|
+
*
|
|
6795
|
+
* Do NOT apply this to a wrapper that also contains OTHER, independently-interactive elements
|
|
6796
|
+
* (e.g. a toolbar with its own buttons, or a form-field's control slot). These are ordinary
|
|
6797
|
+
* inheriting CSS custom properties, so a descendant reading them for its own cosmetics (a caret
|
|
6798
|
+
* color, a link color) gets swept along whenever ANYTHING inside the wrapper is hovered or
|
|
6799
|
+
* clicked — not just when the wrapper itself is the thing being interacted with. That exact bug
|
|
6800
|
+
* shipped once already; see ColorInteractiveContainerDirective/ColorInteractiveHasFocusDirective
|
|
6801
|
+
* for the shapes that avoid it.
|
|
6802
|
+
*/
|
|
6478
6803
|
class ColorInteractiveDirective {
|
|
6479
6804
|
constructor() {
|
|
6480
6805
|
this.styleManager = injectStyleManager();
|
|
@@ -6933,6 +7258,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
|
|
|
6933
7258
|
args: [{ selector: 'et-surface-interactive-styles', template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":where(.et-surface-interactive){--et-surface-interaction-rgb: var(--et-surface-interaction);--et-surface-interaction-solid: rgb(var(--et-surface-interaction-rgb))}:where(.et-surface-interactive:hover){--et-surface-interaction-rgb: var(--et-surface-interaction-hover, var(--et-surface-interaction));--et-surface-interaction-solid: rgb(var(--et-surface-interaction-rgb))}:where(.et-surface-interactive:focus-visible){--et-surface-interaction-rgb: var( --et-surface-interaction-focus, var(--et-surface-interaction-hover, var(--et-surface-interaction)) );--et-surface-interaction-solid: rgb(var(--et-surface-interaction-rgb))}:where(.et-surface-interactive:active){--et-surface-interaction-rgb: var( --et-surface-interaction-active, var(--et-surface-interaction-focus, var(--et-surface-interaction-hover, var(--et-surface-interaction))) );--et-surface-interaction-solid: rgb(var(--et-surface-interaction-rgb))}:where(.et-surface-interactive[disabled]),:where(.et-surface-interactive[aria-disabled=true]){--et-surface-interaction-rgb: var( --et-surface-interaction-disabled, var( --et-surface-interaction-active, var(--et-surface-interaction-focus, var(--et-surface-interaction-hover, var(--et-surface-interaction))) ) );--et-surface-interaction-solid: rgb(var(--et-surface-interaction-rgb))}\n"] }]
|
|
6934
7259
|
}] });
|
|
6935
7260
|
|
|
7261
|
+
/**
|
|
7262
|
+
* Same shape as `ColorInteractiveDirective` — reacts to its own `:hover`/`:focus-visible`/
|
|
7263
|
+
* `:active`/`[disabled]` — but drives `--et-surface-interaction-*`, a neutral/muted tint, instead
|
|
7264
|
+
* of the ambient color theme. Use it for chrome-level interaction feedback that shouldn't borrow
|
|
7265
|
+
* the page's brand color (a tab trigger's hover state, a toggle button that should look neutral
|
|
7266
|
+
* until it's actually active — see `ButtonDirective`'s `mutedUntilPressed`).
|
|
7267
|
+
*
|
|
7268
|
+
* Has no container/exclude/has-focus variants: it has no descendant-cascading CSS at all, so
|
|
7269
|
+
* applying it to a wrapper with independently-interactive children is safe by construction —
|
|
7270
|
+
* unlike `ColorInteractiveDirective`, there's no bubbling-leak failure mode to worry about here.
|
|
7271
|
+
*/
|
|
6936
7272
|
class SurfaceInteractiveDirective {
|
|
6937
7273
|
constructor() {
|
|
6938
7274
|
this.styleManager = injectStyleManager();
|
|
@@ -6955,5 +7291,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
|
|
|
6955
7291
|
* Generated bundle index. Do not edit.
|
|
6956
7292
|
*/
|
|
6957
7293
|
|
|
6958
|
-
export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, AT_LEAST_ONE_REQUIRED, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AnimatedOverlayDirective, BOUNDARY_ELEMENT_TOKEN, BREAKPOINT_INSTANCE_TOKEN, BREAKPOINT_ORDER, COLOR_PROVIDER, ClickOutsideDirective, ColorInteractiveContainerDirective, ColorInteractiveDirective, ColorInteractiveExcludeDirective, ColorInteractiveHasFocusDirective, DEFAULT_MULTI_INSTANCE_RELS, DEFAULT_MULTI_INSTANCE_TAGS, DEFAULT_VIEWPORT_CONFIG, DISABLE_LOGGER_PARAM, DragHandleDirective, ET_DISABLE_SCROLL_TOP, ET_DISABLE_SCROLL_TOP_AS_RETURN_ROUTE, ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE, ET_PROPERTY_REMOVED, FOCUSABLE_SELECTOR, FOCUS_VISIBLE_TRACKER_TOKEN, HtmlToMarkdownPipe, IS_ARRAY_NOT_EMPTY, IS_EMAIL, InferMimeTypePipe, IsArrayNotEmpty, IsEmail, jsonLd as JsonLD, KeyPressManager, MUST_MATCH, MarkdownToHtmlPipe, MustMatch, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, PropsDirective, ProvideColorDirective, ProvideSurfaceDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeHandlesComponent, RuntimeError, SEO_DIRECTIVE_TOKEN, SURFACE_PROVIDER, SURFACE_TYPE, ScrollObserverDirective, ScrollObserverEndDirective, ScrollObserverStartDirective, SeoDirective, StructuredDataComponent, SurfaceInteractiveDirective, ToArrayPipe, TypedQueryList, ValidateAtLeastOneRequired, Validators, applyAlternateBinding, applyAlternateLanguagesBindings, applyArticleBindings, applyAuthorBinding, applyCanonicalBinding, applyCenteredPosition, applyDescriptionBinding, applyHeadBinding, applyHeadTitleBinding, applyHostListener, applyHostListeners, applyInitialFocus, applyKeywordsBinding, applyLinkBinding, applyMetaBinding, applyNextBinding, applyOgBinding, applyOpenGraphBindings, applyPrevBinding, applyResourceHintsBindings, applyRobotsBinding, applySocialMediaBindings, applyStructuredDataBinding, applyTwitterCardBindings, areScrollStatesEqual, bindProps, boolBreakpointTransform, booleanBreakpointAttribute, boundingClientRectToElementRect, breakpointTransformBase, buildElementSignal, buildSignalEffects, canUseSessionMemory, clamp, clone, cloneFormGroup, computedTillFalsy, computedTillTruthy, controlValueSignal, controlValueSignalWithPrevious, createAnchoredPositionCleanup, createArrayPropertyBinding, createAutoSessionMemoryKey, createBulkPropertyBinding, createCanAnimateSignal, createComponentId, createCssColorThemeName, createCssSurfaceName, createDependencyStash, createDestroy, createDocumentElementSignal, createElementDictionary, createElementDimensions, createEmptyElementSignal, createFlipAnimation, createFlipAnimationGroup, createHostProps, createIsRenderedSignal, createLogger, createOverlayRuntimeRef, createPropHandlers, createPropertyBinding, createProps, createProvider, createRootProvider, createRootThemeCss, createRxHostListener, createSessionMemory, createSetup, createStaticProvider, createStaticRootProvider, createSwatchCss, createTailwindColorThemes, createTailwindCssVar, createTailwindRgbVar, createThemeStyle, createUserConsentProvider, deferredSignal, deleteCookie, easeElastic, easeIn, easeInOut, easeLinear, easeOut, easeOutBack, easeOutBackStrong, elementCanScroll, equal, firstElementSignal, focusElement, forceReflow, formatRuntimeError, fromNextFrame, getCookie, getDomain, getElementScrollCoordinates, getFocusableElements, getFormGroupValue, getGroupMatchPoints, getGroupMatchScore, getHeadingElement, getKnockoutMatchScore, getMatchScoreSubLine, getObjectProperty, getScrollContainerTarget, getScrollItemTarget, getScrollSnapTarget, hasCookie, htmlToMarkdown, inferMimeType, injectAngularRootElement, injectBoundaryElement, injectBreakpointInput, injectBreakpointIsMatched, injectBreakpointObserver, injectCanHover, injectColorThemes, injectColorThemesPrefix, injectCurrentBreakpoint, injectDeviceInputType, injectDisplayOrientation, injectErrorTheme, injectFocusVisibleTracker, injectFragment, injectHasPrecisionInput, injectHasTouchInput, injectHostElement, injectIs2Xl, injectIsLandscape, injectIsLg, injectIsMd, injectIsPortrait, injectIsRouterInitialized, injectIsSm, injectIsXl, injectIsXs, injectLinkStore, injectLinkStoreConfig, injectLocale, injectMediaQueryIsMatched, injectMetaConfig, injectMetaStore, injectObserveBreakpoint, injectObserveMediaQuery, injectOverlayRuntime, injectPathParam, injectPathParamChanges, injectPathParams, injectQueryParam, injectQueryParamChanges, injectQueryParams, injectRenderer, injectRoute, injectRouteData, injectRouteDataItem, injectRouteTitle, injectRouterEvent, injectRouterState, injectScrollbarDimensions, injectStructuredDataConfig, injectStructuredDataStore, injectStyleManager, injectSuccessTheme, injectSurfaceContextTracker, injectSurfaceThemes, injectSurfaceThemesPrefix, injectTemplateRef, injectTitleConfig, injectTitleStore, injectUrl, injectViewportConfig, injectViewportDimensions, injectViewportSize, injectWarningTheme, isArray, isElementSignal, isElementVisible, isFocusable, isGroupMatch, isHTMLElement, isKnockoutMatch, isObject, markdownToHtml, maybeSignalValue, memoizeSignal, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, numberBreakpointAttribute, numberBreakpointTransform, previousSignalValue, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorThemes, provideColorThemesWithTailwind4, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideViewportConfig, resolveSurfaceByElevation, round, routerDisableScrollTop, scrollToElement, setBackdropStyles, setBaseElementStyles, setCookie, setInputSignal, setupFocusTrap, setupPositioning, setupScrollRestoration, signalAnimatedNumber, signalAttributes, signalClasses, signalElementChildren, signalElementDimensions, signalElementIntersection, signalElementLastScrollDirection, signalElementMutations, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostElementDimensions, signalHostElementIntersection, signalHostElementLastScrollDirection, signalHostElementMutations, signalHostElementScrollState, signalHostStyles, signalIsRendered, signalStyles, switchQueryListChanges, syncSignal, templateComputed, toArray, toArrayTrackByFn, toStringBinding, transformOrReturn, typedBreakpointTransform, unbindProps, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideColorThemesPrefix, ɵProvideSurfaceThemes, ɵProvideSurfaceThemesPrefix };
|
|
7294
|
+
export { ANIMATABLE_TOKEN, ANIMATED_IF_TOKEN, ANIMATED_LIFECYCLE_TOKEN, ANIMATION_DEBUG_STORAGE_KEY, AT_LEAST_ONE_REQUIRED, AnimatableDirective, AnimatedIfDirective, AnimatedLifecycleDirective, AnimatedOverlayDirective, BOUNDARY_ELEMENT_TOKEN, BREAKPOINT_INSTANCE_TOKEN, BREAKPOINT_ORDER, COLOR_PROVIDER, ClickOutsideDirective, ColorInteractiveContainerDirective, ColorInteractiveDirective, ColorInteractiveExcludeDirective, ColorInteractiveHasFocusDirective, DEFAULT_MULTI_INSTANCE_RELS, DEFAULT_MULTI_INSTANCE_TAGS, DEFAULT_VIEWPORT_CONFIG, DISABLE_LOGGER_PARAM, DragHandleDirective, ET_DISABLE_SCROLL_TOP, ET_DISABLE_SCROLL_TOP_AS_RETURN_ROUTE, ET_DISABLE_SCROLL_TOP_ON_PATH_PARAM_CHANGE, ET_PROPERTY_REMOVED, FOCUSABLE_SELECTOR, FOCUS_VISIBLE_TRACKER_TOKEN, HtmlToMarkdownPipe, IS_ARRAY_NOT_EMPTY, IS_EMAIL, InferMimeTypePipe, IsArrayNotEmpty, IsEmail, jsonLd as JsonLD, KeyPressManager, MUST_MATCH, MarkdownToHtmlPipe, MustMatch, NormalizeGameResultTypePipe, NormalizeMatchParticipantsPipe, NormalizeMatchScorePipe, NormalizeMatchStatePipe, NormalizeMatchTypePipe, PropsDirective, ProvideColorDirective, ProvideSurfaceDirective, RUNTIME_ERROR_NO_DATA, RepeatDirective, ResizeHandlesComponent, RuntimeError, SEO_DIRECTIVE_TOKEN, SURFACE_PROVIDER, SURFACE_TYPE, ScrollObserverDirective, ScrollObserverEndDirective, ScrollObserverStartDirective, SeoDirective, StructuredDataComponent, SurfaceInteractiveDirective, ToArrayPipe, TypedQueryList, ValidateAtLeastOneRequired, Validators, animationDebugLog, applyAlternateBinding, applyAlternateLanguagesBindings, applyArticleBindings, applyAuthorBinding, applyCanonicalBinding, applyCenteredPosition, applyDescriptionBinding, applyGlobalPosition, applyHeadBinding, applyHeadTitleBinding, applyHostListener, applyHostListeners, applyInitialFocus, applyKeywordsBinding, applyLinkBinding, applyMetaBinding, applyNextBinding, applyOgBinding, applyOpenGraphBindings, applyPrevBinding, applyResourceHintsBindings, applyRobotsBinding, applySocialMediaBindings, applyStructuredDataBinding, applyTwitterCardBindings, areScrollStatesEqual, bindProps, boolBreakpointTransform, booleanBreakpointAttribute, boundingClientRectToElementRect, breakpointTransformBase, buildElementSignal, buildSignalEffects, canUseSessionMemory, clamp, clone, cloneFormGroup, computedTillFalsy, computedTillTruthy, controlValueSignal, controlValueSignalWithPrevious, createAnchoredPositionCleanup, createArrayPropertyBinding, createAutoSessionMemoryKey, createBulkPropertyBinding, createCanAnimateSignal, createComponentId, createCssColorThemeName, createCssSurfaceName, createDependencyStash, createDestroy, createDocumentElementSignal, createElementDictionary, createElementDimensions, createEmptyElementSignal, createFlipAnimation, createFlipAnimationGroup, createHostProps, createIsRenderedSignal, createLogger, createOverlayRuntimeRef, createPropHandlers, createPropertyBinding, createProps, createProvider, createRootProvider, createRootThemeCss, createRxHostListener, createSessionMemory, createSetup, createStaticProvider, createStaticRootProvider, createSwatchCss, createSwipeTracker, createTailwindColorThemes, createTailwindCssVar, createTailwindRgbVar, createThemeStyle, createUserConsentProvider, deferredSignal, deleteCookie, easeElastic, easeIn, easeInOut, easeLinear, easeOut, easeOutBack, easeOutBackStrong, elementCanScroll, equal, firstElementSignal, focusElement, forceReflow, formatRuntimeError, fromNextFrame, getCookie, getDomain, getElementScrollCoordinates, getFocusableElements, getFormGroupValue, getGroupMatchPoints, getGroupMatchScore, getHeadingElement, getKnockoutMatchScore, getMatchScoreSubLine, getObjectProperty, getScrollContainerTarget, getScrollItemTarget, getScrollSnapTarget, hasCookie, htmlToMarkdown, inferMimeType, injectAngularRootElement, injectBoundaryElement, injectBreakpointInput, injectBreakpointIsMatched, injectBreakpointObserver, injectCanHover, injectColorThemes, injectColorThemesPrefix, injectCurrentBreakpoint, injectDeviceInputType, injectDisplayOrientation, injectErrorTheme, injectFocusVisibleTracker, injectFragment, injectHasPrecisionInput, injectHasTouchInput, injectHostElement, injectIs2Xl, injectIsLandscape, injectIsLg, injectIsMd, injectIsPortrait, injectIsRouterInitialized, injectIsSm, injectIsXl, injectIsXs, injectLinkStore, injectLinkStoreConfig, injectLocale, injectMediaQueryIsMatched, injectMetaConfig, injectMetaStore, injectObserveBreakpoint, injectObserveMediaQuery, injectOverlayRuntime, injectPathParam, injectPathParamChanges, injectPathParams, injectQueryParam, injectQueryParamChanges, injectQueryParams, injectRenderer, injectRoute, injectRouteData, injectRouteDataItem, injectRouteTitle, injectRouterEvent, injectRouterState, injectScrollbarDimensions, injectStructuredDataConfig, injectStructuredDataStore, injectStyleManager, injectSuccessTheme, injectSurfaceContextTracker, injectSurfaceThemes, injectSurfaceThemesPrefix, injectTemplateRef, injectTitleConfig, injectTitleStore, injectUrl, injectViewportConfig, injectViewportDimensions, injectViewportSize, injectWarningTheme, isAnimationDebugEnabled, isArray, isElementSignal, isElementVisible, isFocusable, isGroupMatch, isHTMLElement, isKnockoutMatch, isObject, markdownToHtml, maybeSignalValue, memoizeSignal, nextFrame, normalizeGameResultType, normalizeMatchParticipant, normalizeMatchParticipants, normalizeMatchScore, normalizeMatchState, normalizeMatchType, numberBreakpointAttribute, numberBreakpointTransform, previousSignalValue, provideBoundaryElement, provideBreakpointInstance, provideBreakpointObserver, provideColorThemes, provideColorThemesWithTailwind4, provideFocusVisibleTracker, provideLinkStore, provideLinkStoreConfig, provideLocale, provideMetaConfig, provideMetaStore, provideOverlayRuntime, provideRenderer, provideStructuredDataConfig, provideStructuredDataStore, provideStyleManager, provideSurfaceContextTracker, provideSurfaceThemesWithTailwind4, provideTitleConfig, provideTitleStore, provideViewportConfig, resetPositioningStyles, resolveSurfaceByElevation, round, routerDisableScrollTop, scrollToElement, setBackdropStyles, setBaseElementStyles, setCookie, setInputSignal, setupFocusTrap, setupPositioning, setupScrollRestoration, signalAnimatedNumber, signalAttributes, signalClasses, signalElementChildren, signalElementDimensions, signalElementIntersection, signalElementLastScrollDirection, signalElementMutations, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostElementDimensions, signalHostElementIntersection, signalHostElementLastScrollDirection, signalHostElementMutations, signalHostElementScrollState, signalHostStyles, signalIsRendered, signalStyles, switchQueryListChanges, syncSignal, templateComputed, toArray, toArrayTrackByFn, toStringBinding, transformOrReturn, typedBreakpointTransform, unbindProps, useCursorDragScroll, writeScrollbarSizeToCssVariables, writeViewportSizeToCssVariables, ɵProvideColorThemes, ɵProvideColorThemesPrefix, ɵProvideSurfaceThemes, ɵProvideSurfaceThemesPrefix };
|
|
6959
7295
|
//# sourceMappingURL=ethlete-core.mjs.map
|